v1IJ!~o1o1o1A v1v1v1A@v1p1p1A0)v1p1p1Ap9v1p1p1Ip1p1p1"JKLMNOPp1p1p1Qp1p1p1Rp1p1p1|STUVWXYZ[\]p1p1p1Aptv1p1p1yp1p1p1zp1p1p1-{p1p1p1|p1p1p1}p1p1p1A@~v1p1p1A0v1p1p1Av1p1p1$p1p1p1 p1p1p1p1p1p1p1p1p1p1p1p1 Sp1p1p1Av1p1p1p1p1p1p1p1p1<p1p1p1p1p1p1p1p1p1p1p1p1A@v1q1q1A0v1q1q1A`v1q1q1q1q1q1q1q1q1q1q1q1q1q1q1Apv1q1q1 q1q1q1 q1q1q1- q1q1q1 q1q1q1 q1q1q1A@v1q1q1A0v1q1q1Ap)v1q1q19q1q1q1A:;q1q1q1<q1q1q1=q1q1q1">?@ABCDEFq1q1q1ApGv1q1q1IJKLMNq1q1q1Oq1q1q1Pq1q1q1Qq1q1q1Rq1q1q1APSv1q1q1A0Yv1q1q1Apiv1q1q1yq1q1q1Bz{q1q1q1|q1q1q1}q1q1q1aU~q1q1q1Apv1q1q1q1q1q1q1q1q1#q1q1q1q1q1q1q1q1q1A0v1q1q1A0v1q1q1A0v1q1q1iq1q1q1A@v1r1r1A0v1r1r1Av1r1r1r1r1r1r1r1r1r1r1r1(r1r1r1r1r1r1\r1r1r1Apv1r1r1 r1r1r1% r1r1r1 r1r1r1 r1r1r1r1r1r1AP v1s1s1A0v1r1s1AP)v1r1s1AP9v1r1s1IJKLMNOPQRSr1r1r16r1r1r1 r1r1r1A0v1r1s1Av1r1s1Er1r1r1jPr1r1r1Hr1r1r1)<     r1r1r1q; !r1r1r1$'()*+,-./0r1r1r1*12r1r1r1A03v1r1s1A9v1r1s1gIJKLMNOPQRSr1r1r1sddefghijklmnr1r1r18`r1r1r1@r1r1r1i8r1r1r1 r1r1r1A0v1r1s1or1r1r1Apv1s1s1Apv1r1s1'Zr1r1r1*r1r1r1tr1r1r1 r1r1r1,     r1r1r1Apv1s1s1U !"#s1s1s10s1s1s1;1s1s1s1 2s1s1s1-3456789:;<=s1s1s1A@v1s1s1TMIJKLMNOPQRSs1s1s1>^s1s1s1$_s1s1s1`s1s1s1as1s1s1p:bcdefghijkls1s1s1Aprv1s1s1yz{|}s1s1s1~s1s1s1$s1s1s1s1s1s1>s1s1s1Av1s1s1|s1s1s1s1s1s1@s1s1s1s1s1s1s1s1s1s1s1s1Apv1s1s1s1s1s1s1s1s1Ys1s1s1<s1s1s1s1s1s1A@v1s1s1A0v1s1s1Apv1s1s1Ms1s1s1^ s1s1s1s1s1s1s1s1s1rs1s1s1Ap v1s1s1s1s1s1s1s1s1:s1s1s1s1s1s1s1s1s1A@v1t1t1A0)v1t1t1Ap9v1t1t1It1t1t1JKLMNt1t1t1Ot1t1t1Pt1t1t1|=QRSTUVWXYZ[t1t1t1Apbv1t1t1it1t1t1jt1t1t1-kt1t1t1lt1t1t1mt1t1t1A@nv1t1t1A0yv1t1t1Av1t1t1?t1t1t1  !t1t1t1"t1t1t1*#t1t1t1#$t1t1t1LX%&'(*+,-./0t1t1t1Ap?v1t1t1ut1t1t1'vt1t1t1wt1t1t1xt1t1t1t1t1t1A0@v1v1v1v1v1v1...aladams!arad.blc<dptrNesdi]iiopslhasmadwdinstall...driver installb{ƿ`"t2 zۻ4 !A o[o^-SA`0 6#/m__oZQkCͩ#݂.[հyr39|} PXfy̹G~+`B}0w2➐cϟ?{(|=~ t8zEm |c +cxŹB{wEwmS@+J)cNQY}5Ymmm[#Y×Y1z嶯[qUn|UdK9Y1Dh= l,zl" M:4l:@l65ZՕkG=q]dۃ,{vq ~(~{X8>(@V RxQOJP; *@X#ident "@(#) space.c 26.1 95/08/10 " /* * Copyright (C) 1993-1995 The Santa Cruz Operation, Inc. * All Rights Reserved. * The information in this file is provided for the exclusive use of * the licensees of The Santa Cruz Operation, Inc. Such users have the * right to use, modify, and incorporate this code into other products * for purposes authorized by the license agreement provided they include * this notice and the associated copyright notice with any such product. * The information in this file is provided "AS IS" without warranty. */ #include "sys/ci/cilock.h" int wdcmdtime = 60; /* # secs in which all cmds must complete */ int wdrsttime = 60; /* # secs in which ctlr reset must complete */ int wdprmtime = 60; /* # secs in which SET_PARM must complete */ int wdchktime = 60; /* # secs before trying a 'dead' disk again */ /* * Table of machines which require special initialisation during WD1010 * presence checking. Typically these are special IBM systems. */ struct modelinfo { unsigned char Vendor, /* Vendor type (see sys/vendor.h) */ Model, /* Model number (from INT 15 data) */ SubModel, /* SubModel no. " " " */ Pad; /* pad to 32bit boundary */ }; struct modelinfo wd_model_info[]={ { 0x5, 0xF8, 0x19}, /* IBM Models 35sx, 40sx and L40sx */ { 0x5, 0xF8, 0x23}, /* " " " */ { 0x5, 0xF8, 0x24}, /* IBM Model 40 SLC */ { 0x5, 0xF8, 0xB0}, /* IBM Model 76i/77i */ { 0x5, 0xF8, 0x60} /* IBM Thinkpad 720c */ }; int wd_model_info_size = sizeof(wd_model_info) / sizeof(struct modelinfo); /* Probe definitions */ #define wd1010_UNKNOWN 0 #define wd10100_0 115712 /* wd10100_0 */ #define wd10100_1 115713 /* wd10100_1 */ #define wd10101_0 115714 /* wd10101_0 */ #define wd10101_1 115715 /* wd10101_1 */ /* probe device table */ unsigned wdProbe[][2] = { {wd10100_0, wd10100_1}, {wd10101_0, wd10101_1}, {wd1010_UNKNOWN, wd1010_UNKNOWN} }; /* * Device configuration information - these are the values used to auto * configure the interrupt handlers when a WD1010 style controller is * detected */ int wdvect[2] = { 14, /* Controller 0 */ 15 /* Controller 1 */ }; int wdipl[2] = { 5, /* Controller 0 */ 5 /* Controller 1 */ }; /* * Lock structures used to provide multi-threaded support */ LOCKVAR(wdc_lock0, wdjnk0); /* Controller 0 lock */ LOCKVAR(wdc_lock1, wdjnk1); /* Controller 1 lock */ LOCKVAR(wdt_lock0, wdjnk2); /* iobuf lock 0 */ LOCKVAR(wdt_lock1, wdjnk3); LOCKVAR(wdt_lock2, wdjnk4); LOCKVAR(wdt_lock3, wdjnk5); struct lockb *wdctlrlocks[] = { &wdc_lock0, &wdc_lock1 }; struct lockb *wdtablocks[] = { &wdt_lock0, &wdt_lock1, &wdt_lock2, &wdt_lock3 }; /* * Presence check routine used by hd_config() - replaces old wd0pres mehcanism */ extern int wdpres(); wdpresent() { return( wdpres(0) ); } /* * For ATAPI systems which have an ATAPI drive and an IDE on the same controller * the following tunable allows/disallows load balancing. If set, the ATAPI * device will get equal opportunity for its requests to be dispatched. If * reset, the IDE device will be treated with preference. This behaviour is * most noticeable when the system is under heavy disk load and the CD is then * accessed. */ int wd_balanced_load = 1; /* Allow load-balancing (default 1) */ FILE_FORMAT: version=1 wd10100_0: INDEX=wd10100_0 PATH=node0,node1 node0=D_SUBSYS,Hard disk,0,D_HARDDSK_SUBSYS,,NULL node1=D_UNIT,Controller 0 Drive 0, 0, 0, D_RANDOM_ACCESS D_NODE, NULL D_USER_MSG =Hard disk ,0,0,,NULL D_BLOCK_NODE = 0 D_CHAR_NODE = 0 wd10100_1: INDEX=wd10100_1 PATH=node0,node1 node0=D_SUBSYS,Hard disk,0,D_HARDDSK_SUBSYS,,NULL node1=D_UNIT,Controller 0 Drive 1, 0, 1, D_RANDOM_ACCESS D_NODE, NULL D_USER_MSG =Hard disk ,0,0,,NULL D_BLOCK_NODE = 64 D_CHAR_NODE = 64 wd10101_0: INDEX=wd10101_0 PATH=node0,node1 node0=D_SUBSYS,Hard disk,0,D_HARDDSK_SUBSYS,,NULL node1=D_UNIT,Controller 1 Drive 0, 0, 2, D_RANDOM_ACCESS D_NODE, NULL D_USER_MSG =Hard disk ,0,0,,NULL D_BLOCK_NODE = 128 D_CHAR_NODE = 128 wd10101_1: INDEX=wd10101_1 PATH=node0,node1 node0=D_SUBSYS,Hard disk,0,D_HARDDSK_SUBSYS,,NULL node1=D_UNIT,Controller 1 Drive 1, 0, 3, D_RANDOM_ACCESS D_NODE, NULL D_USER_MSG =Hard disk ,0,0,,NULL D_BLOCK_NODE = 192 D_CHAR_NODE = 192 wd Y 1 0 0 0 0 0 0 0 wd Y 1 0 0 0 0 0 0 0 wd IRocrwi iRbcCHh wd 53 53 1 2 -1 $(մI9,e$UPm5ڈ.ȶѤP嗶E\]]A^Kug'$w]bv 9L1K(6""#*ui@rYJ+'{k$mB?kvH!Q !w۠$  /WN?vvGӴA 0}>nNjGOtwݏnFY?SB[D;;.~zX,>&~J9&$B? l.&Z!N6}-wHzdv XzJ{8&Eݸ Ȳ 8M\m~ܵ.Gn=C{>KNy~Z_D޿i;0[ ]æoa3}gJ8f@26$K00^@M%mm%"qo r$ճj'>fA.li"It=;}}vsix:.m }Z}CX^U!k;F4q5ș=i`<7e6A ]0"8fdտ,{U[m2lɆ·x5R^""ѦӅ2?y]H5A= eLGhRCK $ Vybc% A5 ? =ZGwq N? cj MQ1da͆7Wxs&&8s[j9 Po4d[Z{¯S 3􈁘RC;Oh^ 9"xz`Рz3T쑂$Fa|h|ضN$؉HКH쀅"NI`Gc,5mWie g?%^xC̨&3BO@SMkn$SnK%+$ ǨKv( X=S&Z6jm!l@y`’R_,A+^l7&>,[.r$#H3vjD񨶇Lf0"s (7LYOpY 8Ѫ 8+h! ۚSK-ܰc6s9Bp0q% r)8xr3Sk߁+U-f ]u:>3͙SԢsUygU?.Ęs n$Ꝉw@6xkXz>P0QgM:EDr;IoF(\6h\BA ԫd[Q鹬[$yF9H([= !c:eK_9V"-}!wߐ#ӎrQ " 眂bΨcz%XwSH^UtS?.aMc7-&\ *3ə2GϨ^&>J kX=a(ʧ>Ky),˸fuPm‘^v|8R=m9$b.QYΤ[7^\tR"vRͬΗ"m?wsEFFs#9TPN6x kSc@_pL@B\l3Řٟ}1z@ aYx.d >EtPZbTOURR"8%^;HK\C[~[#K}G"BawLF}L&`By1 $8z զ)+V*hW1^ 9͞Lzh$UIz4$zXByU@.%Ma*wBgtU6B=jeKgyFov4I{IFh]ʲ`WB9eg4RfgmH/R]_PpP^0Idկa byh,r!2&Cc  [,u$'n9{f# a|W)‰W69p7߀?xgDy昰bХxeu~OxZ]8d^ZZB(f-9ؽA٦2SMj?%.V`eQɟ&B$w- 7]Vt>N+n8xCLI<,0dRC s믃IO(vNXW 2kԂV+)]YG?`_e87YJdo/(ڊ?{# .!DsWqU~$D3:Z>DPSQ,f-*}3j^^n ;gA{Գ]}V`l,j3荖 5IIidIE:YbBERbڶܑ-8lWBW, #ANx&'uNקdGz";Eqk3Qf+%v!DЀ$`FlGz8SuPa zT]ˋbyOk݈ĹJ" Bp|xG,It:ZppWy9B2H|1իʄ;`D Ţ/@O(e^kkm*Wrx1|9`Jb $T_*|P| <?:BWd󝌐<ꄅ`@{YJMfzea6f1@KkH8UR#okmZnUP|G|; |l<y36r+Uf'_KYdVdiS$j'H5RS&pi1@j?Hy*`Z3C!GrsؠPn꠺LvM{@CA:ex_(Fw4կ4>9C(h B/94 \ ν(?s_}U_Zimɨ`2 8i$T6tAD {mSz g4޶#^F-ZQX `eTFS+ g)#fur-[>l6jڿBw .¦ƥZTF0AXVթ%$3BC[.-8t4zK균S _Sy &fAmmg:$I&{ʺ)bߋի잾mB{<\u{/|}|v^/?k A4ԫZ\*ƨŘ<\D;~ [m[8"ݎfO&#g0b: $j0&)XjgcIxzLʞKgan_IS...alad!k˵akfSÞM1k%~,aΙl.CSMG ʀdO\J!M3|M@C~mAaZ/7!s#ehrd@ c&AR ]ІoI]qXqAY2[j4FMkP .6C>qzB$:C9s) &Y>tUJ,mzn:]3=#88.b>igג Pa„M E>bV~(j0Ti\PW6d ~l:{Bi|7?U66XlsxQk%F͌)Gr{髸{ZnG7XZ?] IRڮb@ `ӼF`$F3Po0Ff7dT:ohW.$έ^)ח-oMD"FwiqaPM 0za+hw=( y^LI@Xԫm!L'jͶ0ަc#EKSS l7v4`m=S73P[OFO6dٌGM*#f-8⤩MY\$CVV&o_͊,w)t@] S4 9v,1W(AAd}8[RNpFf )Svcf KFv9Ό4~P&'] ofvfp>R#P!ȏ5w֫z u 2V|/2ī׸gۍW1/&UMV˨gCd^0AРҋ?g +t|P'ƶ90<\6P ?)MñI66Дϵ&Fמ4B4ƗǠ Cf|N/:P(&JHGWAi Kt4x(o$KRz2,JaLeh/ßTKm8\6}CZjPk)Yڠ44n *в͋+ w_jBJ p\olqNHomLy(eM<+/ Z%jbV* G>\YY a b>rQ\z%.UXk3bX9N7t ^wnpˀ u&78CuIv#g"L ǁ6l|/cDI>D3 %ӫQ BloEF]klg3_ N|#v^Zx֥bgtI;ڿسE< ܞ=IZ&Wy*eʛ3[~(rX-h}a(#-h@,4I=?k!Y 3vL'rP\=[螡mEy?xEŬ[@GL#RJ*{uXIe.UNQW.=~F^! ޡaEe-0 awP(λkm*Ђ(M]ת9JYTxqQŞvomg ϑ1[;O`kzjα8잡>6Wf=k*0FY,8AL9(AƅzIy}09_C} Ϧ /6E[^ckE}|2z@Mxv $GKM/5hX?:N1荕)  V PUس*z' 'V`t4#Acqh_?}owa ܊aC;`8M!h8O@fNF6HY'?tW M䱹SK <{ଗ?Sp XT aS) RWQGEmpFF` * ՃR>4_(:e=~}N~ ^lg<6wIv'ߔA>-l>tT69}R9S{McQ^Ӌ^D,O'^ヰ,uM[Yl4K x1I\,BLдb> {gdއ; X~(,n(ޠMT;TWuQP7<~ߌכ1zfE oryv[sOXY.U26sygaS.+jmh(>2!z M&ؒehrTo-rNEcTwi?tN^hݎzpAc SjX!$c48ȑ:HNg^>+X᪶Ur[ͱm/&b= :Mn{Ri9Dʇ şBHpخ2`i?3 D}Al^j,2-FG[㮗:aR^°S 03"ЂDꯧlZIC47@5'm`^e^&2aTUezVsP:$"`~JFF~mܭvĨ'T9.ynh23$1-H6V bK'3k2Β$Lj+Ub&:$S .81CLoa3S?OfA+&|yt.q|St1\Y@!{_E{EXC'^RmI@1\@o2SuKsSK yv"#۪E-#Z z_OzY떶JYސXΝd贇#70:dSxy7}B#Ÿ ǃ[j{>޳-IzqoIRǞTsxMya<8}n4eiG*u0 ׷V9 aY WNЁL[AoJPP-*DS[<(:l0e&by&ߤ{17N3ƒOϕAQ,Kiۍm;4 4rYwHb‚zzd64!-Lz5hUoS{ēG&1t)M4bŭ<ˌjk$v $qZkש=~TǕG-[ #:qɲv;,oU<2wdCĚ$$M6z&݆4uo2&yM,z ׈++0i\O[/S?1l)XgFWǝhB5D"=%༛D?fTCBB5b= 8#;je<O[nTv6p'@l#K14&i$[8|P?;|YZN Mv-lpEnOTY =jYw.JzcP>AEW?[."ËIVϙ1{ĂZz@>Z`M׾2}`$.%N}>3Ir Vrd!Vג űfWsaP &-ȓُb`nl֠zĻ{ }_Y-ӱv6UKէSu;<<,[mV<>ps7;$-~u}ah?q-sD${e=#2sڜ|ŵw-`:7=yefBmokoWȞ y:+b/S$]H#̵фgU .^M yNd{_o. ڸ7fv h]O@2+ [,P[!B Zi(Ӻnf+1zr=Ya`΂U?XS)PL> ?kp@_$^­3+Ul k>S4F8%AyȳolMWis-is6;(9JȩL:i\LFQtaHʇ+ByWzAn\]awk1^&x{WA鴋WIN+><|`rؼf;;#*Pw<3՟x 2~t\GS1axB'}8L-oW.a & N|R֒UOpnaAM&,p!%GO0>Dfэ 8n$3Z a>R{6i=R_;0x_FsĎ L0Ly &!X:\ Lp9}IS5 8Fy3; ˠ6ǎh2m5#D٥tr 's4!tAU !S=U7+dI}*wL@FE$%=n&t=0N>@s%)>1#eO.9j hZc tpYgZY/ݛi,w6r% (ׅҬ?EZ P`[^tv"2&ũO P0 p;j͡K0'1;6/@eMiwش<92ọk /~Ó霊}rZ`*C$]9,?:h'K`Rl:xTuߥkŭm#ʹV``ReG [!'KV7Vlhuճ[[]8DJ|+[Z+b$SXIxMpBM^׹`@\P ^g1,zŶ<}aÚ>G9PnZ= `[,=첮hnGʊ}ah [gPXznt%aӗT}2ni7*wNzR퇋[J~/Nt{.Jv}QaМs>q旦 [ֹKp|E\]Izy90uJ[gRQyS kk9tX{G5WT+z%u&|eǣ/ 9Is"J u/A+},;Gs\Y*Ȋto-kȂG& X#R ^v77}^SAyhJ`u}ڹ(| Sj'vw^j]p0!GQah{5/_Fz]dN~OW 쳸)lޥDvM=d4t֞%5O.?/nt]u;t>#Y?U, =>J?j}k,{FV8ͷ[V1k5;zQ=R\3{?[ Լ)\%$m7ri$RTgcK3UZk6HBסLڽ곐 v|+Y+Y- –lǴ!=1/z:(8W_kvGɠB~7jޤ r6k-΢/E Ki钢* 76}JvGO i⬴(WtCpSQ۠ER( ) nl9)i'^]m\G}-=WZ}u 'E QpkQդ\B];,s0Lߤ˖Cg ҳO}UQPTiWVWz6IۧKiC:\u{rhh% w%.ĿǍx,o~W\޳vJN6j푅o+'ҏ&uUgO4T^/뻆=ko/duI\ڞ}ݒr~ .q[[UmJqsG%ESu^_ݗ]U(F\=w Z@o{<!nJ/+Iu"p3(H,!*!rqHD`j9Ӂ):t=]6D?=rV0!^kgnToQV&SiԿFtV+-@2(Us%|%*YLg~_+F=r.ڮr( [KЛ]"MOM G5LhFtKu /@ޏx"mKgWb_➶./MZJ皢V8GR1”V֨@YL£-e,/Ng'Mi.j;HT۠?k&au7o! 7ߗb^bm-b qPAE[+أVKdh 硞A4)}5 V, V % 'G+u}- )A[Bezdvvvl2:^(N O>-LHݢ/ǡK I~jU;~&.nN^]=}症[HXI.o>G_wnvGIf6_=iq9q-|vԓg_cS54j8ۜ,YW,{l]M|EqVɪ9r.|-bfNfz- (9l=1GG+50Y͋+,ٛFՏvQ芫U]M/YR)hq盳YѾQ}Tgm\f~{F:X[T飴(6xժ+h,VWl+GU٭_2!5}SV쫤%W(++I.5{r-+V2f,D3*RE\7+/nժɥ3mv_ӶKs<`f)u:ɦT:F7x^D>:6:5|eܴ,:0'%켋 m=Qr,=,ظvUޕe%u3/E믫vMQa F8&iQLQR/bѩ`Xksh]n,$ cT`Z1)26:2D{ҧCnItw1VE%o8)GmJ;:TG#(1iGEn=J=Ao EB@.FJFn9pJA@]-+{2(z5gCwǂEx?}6a.Uڔ#@Q?!vRV=QC0Tz` X% ҝ{t؁; =a g~ ΍ ;R5[:?%t-`[q@6HKyuGb>X T`6iE=V`[ {[wI HpW3[ȄrW3Y3 `g iF#D?[sy;4uz)ډA%(J>E|l3S۩ߝ!lNuS̿rAQ# ]G v8BrrQt[0 NO> G|pc|!I^83xAI=?l@ ?{;p\0Gav!gp?v}?N理p淮=]mC{Ђ ~GÝQ! J8SaOƿ,8S0Fv:)нn_x><)O7¼4!vH~.BNcכ<l<mx)0WAAU }[>>^؃*'f30f|1cp;c6hG^A#8n_7C?vAya *#WG!Lkp 112 3XsQs=8n0س>{[q?q,3v{7ŝ) }1gz^,Wb7ŎMb겏8.ЃWA0}xwÖ\`Q14q!@#7aj^GƎ4xЏ$@kdž8Pv ;lqn8`;P80B>AY€llY%< ٘>,n_~>G0#ސxҼK+̄#bXYsv h8a:`=@ϫϼ:?F+,?*VrD?܎=Gxv ȝ$OE^XGi"z*rm(9bЎ({V@;"ȯ P1m*hᲧ^nPHf:`$[O;,#=Go!B[p3A\?.w.w3 f-:S`hgG.ϐQ"ج~m>uO9(fh4 ~ ` @0p= <P;{pv7|هs:=w><xLDa8 l 0@:PPـ@;@y=0`lv@?xQmo4jCE!]O8)p#Q>ĀPJr;1S3igɧ=A:+Χ:+x9O ]@t ;!h.O@|4Zf@{o>@u~@~+@|C?#?PqW.+y= O7:#:S U8Gf_{ Ƅp[П4'o Pt~>[x{T.Zz %A-*u}?Va?qP{`l"^ǐXF+ Y. oܐ\+`~i<;Vep'|%Iqu'}1&#Rt-Rt~At;jC*OЩ}?C#0/ê2waň/M%,5cN!9wwRک1Q=]o0(!)x:͋.:y;4Lms/h4 2C|FHqϐ}r) JDOAmYiz* ۚλRc|$7<JߡQξC=1!+?C|$6Я$: pzwrhu>9Cо|ک!T[Xm vKۓ=!|ZHZC!1jfUXFS}R҃7r`2宔W-X_'rB7l h3~ڹ[҇$:uLKiuJ/!Gyڒ7Bo+o+hƭg>D7BJ*K{u rUϰZͻe1bك6eT֩Ww LzFѳ&YƩΓQ. )WmQZ:t˻gW}x V?m^MS)'ؙrX[ dW%}Ly=\FY\!ur.틆GL'ؽYs}įjՏسfOYW`^w'VӳZMi_j9oq+l5ՃԓwLӖ辎gqa' Y .4-˫.Vj\jw^'ե㥚1=[1>{ݹdg̺)qCCWs\[Gngmtӄ?uqqu`)m1{;z9q~^%ثGH}RCǿC b&R>߁W'UUf DN'ZQHҍ$t Z:v:F-H垄m(\eh$UOG}n'IlD,e Sם,K/ 1Cy*AOöO`?Ș4QDQGH}.go.d훚KȡuL4, Y"%Ł$y2{֗"kӟBnJ jJ2 !NEt Ji\7Zmܫ&YNY;VU1jų%t˲*X`2b? =0]^{ 2].֪k\m*y-ՒLj4f{`ydۢ)ͶLk&B4ɓ Zr bp2Nc2~2./?nɖS?L?ܖ{RyG'-?_;> uScgfL+U[[StvKOȑ"n_{Swn_}hJrn%]&Cۏ([[%ܲZJē|`!~"l[%]N`$Omkq%'>rĪxracVi-Lq%Pj@]Gq Ug}UֵRzMҗtB͌tQʭ-:W`n0H-uLEvBݒ6ڿ(屈{MznPx/.^]淴e.#08}nRTzF86:;]HdMi"ͥ?i$JУ졥9\2Vb:Sl|]4<5.ssVh#L'W xKH <>0&twn<wGRϤ_xٌ$YnIfIY7,s"P/M-y=#9H+[?u,!KVQ<U|} 4 >IY[y2%`3 sdH.tjlvi1!)+6IoD/t>V-z;M*@ZZKyE@V)+49IJI\5NQ2ML@L}RӁUӄG¿]a:Y,.UԵonQp-x q~}%B۸`ŨIZ͇;%#>-EZ-C~7FvFbu_,]⹘UJզL?[Y2h,(W'XP5rIk?rgb8Y{kRrMO,9ҷez>Ft-_ܬ^8ɑm@O!d3 }&r&,oT6Jj˙ dΰ:(qIo‘"[\>PrSM5t#;tx𲁃3JobԸϲ[Qq6e43{p[D8ܳKF҂?ݍ7ݿu 8`u8-צ^[k'GMn,|ԖBE;. 2&he+'z4C%[XK2Ft2'3dK~eTRy1I9<+LڑK^WXLWzXVcB0^$0ڄ#capy}7VZ\Cu!2+`:B-u&7#.O8`ͱ =FKvg0_nLMC[n]ɥ^z}l'd(KHV'ti^a5$kb:zc::g?{c/*yh[FGq>[zC8?U+ٓK6t<*%υ,f}<<]AɸU3'!j5Ņ WW"FLɮUۊyfP_88J4 IJG̀n A0lGGVG2Gׯ_T4k"{̳8QT:QI  iUɏ>1I<<̦ʌȉ3Kf"5%_lU׍E]k2q/ 7UŮMW^ 0c᫫V-N3m- Ugt1| f1oU}63YS&pm}TQU+o_kaMWsC*l:jRUNgW? ~xJܷn3Qf ,sJ^PM{T߾jGi lTf_VNm6A 9ENwޓZ;uu lyc! .E4z칅_xPزMDߵV+84^%Phg{ hd ݱΉysoퟎt^ W:uzu:ʼ.N,ZYigv "uJ - FxzɉseXMz#v"oZ3Qܙ{u4_W$ʿ:3d߿ЧPsE @l,5.ew6$#TO-TEBb(x?]WdE!MjY-zt<<O-:NzP|§?z֓Elqu~W:#jNz0bqZӇ)}C`->5Gov[x,L}); $HBoѧҗԧ!S@'@`kzr'}!>Y|ҡ@eKDi[(匶x--&k ]\|- rKyTThKk.V%L4j?n OVM SD.+ƀ+֭P3~@͟g Ŭ= jR188_t5eՇmҟC1=trcOc kZsx"!?F'԰5@z|֪4BCܴBdCh+_Śd;߰72{TiGU৏ $j|{ǠOV>ZlX xPORaKj3(OG6T~iQi ˧ ShtI}@ֵW@\*3FF)41*&TGM,ЗfW(xJV:Xt'_o =%֥bwTot+ ` Igv圉Ͻ㫭Gρ]vP5ݮK6lu-?u pz,5#W ZNNڕRp.tRʆ!ϠCn~ʰ*oXeI5#}U8]bw F]Ҵ 4ƪIn% !ޜ ha0rJ9UGmu\H1r,e/*LkwxUɼA%+bEʘF:b$> i "L4=i;`/^@'V EgZ{*^%ͪ>技0*oRy|$6<AqM1>^2KY YΚ0[0_X58yx{JB qh^XK!ܕ#ॾP 59dz`WfV^b;~KiX1[Ĥ0Zx%V-tahÉmlm]Ӌg4'?T#CȽb[lt 1VW{H4شyDəҴ'Ð"uNg Rχ}XY@.22n;k $G?0&L [c}ZW~Naߑ*;{)"HCo ;%a wvCq暅L$=8sT|tJKvMR-lؔ?sq;V{$sly@Gdߒ PCQK{"#CIGU+}a߃/^QvBo AIo?[k-S ӯho.r}*Wg1'Pd?ĺܴG[@Ai}MCcӤǤ+\gws(:X7[+M-{_3& WR,c.4<H*wI"dvoN!}B-QϽ>9-c=]1 ԕ C{pa?$hEꙪ扊aۃ!}$<y&>`Q?Ze..n|&Kc;/76NĩR^@; ZMyB{%hǔO9T:M)1&~I%,[+q9% wl6. q5ߡE TrtW鱊K(x՗BOAy'42SN_DwIoŒzr)ЪG\kK}a-Sjx)\{i›r3_GBC*ը|6ESk0M~ \vN/)|AK3Ino%] [4-R+Qy&%g$t1}/V,<믈Ij1T CɼKo|/D^-p}޼b-a6m&3ߌ Dk]=`PǕív]bЋR='[=key Id1449Uϕg0bhքYj2ܹK ZUY>Q*Ik|2vp?o0mWqd}FmX *<*>lxhx%zX]<(b@ZDwL ,yRX"*,cؕ?@W Ő) *Ccor]jQE2խϮrb *g!۶6 k$k&6vzŢkrYx ?]ut*`-P}y*rhoƒ[W/ *Փ χWL[9m\~M^ĝ`" O#,dX׻=H2[q?9V~K|KBd;/ˎM8;m<Iٹɪ7ҟS:YKjio6le|H9BsB7ظ(ZA6A&j';? &?@Xe(PP|=A;waȾ !oۙIPgޯ oQYiYp2^7!Ӗrqӷ: Mf-38Saڌ|YaA]V%i|hB12n($o݃CRhqCۚAG50}MԋoB^鶔N&4>>4, Z.{6QS\2T|zTy10/wd2YxOkl)AHi%LWA7NH6ָث77{?W)(12FcJ4TglbtE{]Ex` ɵ~)*PS.#K=Ր:Sf"/K'NgSaX~ fq ./Տ4Aws6]KDh(뺉@S=3MAރd4DB_p|XZC[GJCHelc{65[L/Ȇ5aM-E3h-v6_f= Q,R5sɏ?G~CϦ?=sp~t(CGcͷZb8fh[;yc3u F)3%z˱jx_A>^|)0}H^E{>4hu:8u|or¸aapi`]屷I-Zp!ԌSX U'f=VLmo8yt؝hgcVjź")EckudC̹B HT0 啽ՠ24<3IE[RQw1z!%(CCpsh~s>v^<3dv74W*AnU ]ܐeiW[N}kGAIz.̞qzU)B b;rX~t*}ɥMEu! "0͌77؈GXea<t}`۠k;=XMDGy` د :‡TCyS*ZeFX ZQO[yRV/(e˷lX%]IK).ٜWXB&ȃX'?P}ʐBjXhCqXpI[eIM{KuaQ&0i[f809eZ T 2תo}*՞>ݐ?r h2%~r}[=v/oxk/]ʜsy&r}>y&t d7ix(qZsW[uwq;^f >Y>Bb&sZ%k=p%xSL1n %v Xn T> )/ aw xL|hnOZ ¾n9'_"ÖA"G{->Y7JpP1R'FbDyIlH&[.~xj&"c#gO8*xF T̹a?,NTa_Tx!iy 7J ~1F}/ qGd΢+[%Mڼ"Ɨ ;$յI.2,/Yjרjsb| +FMPh%FU,U1#-ik"0hmV9BAmVPu".u$OA3MoeSok=,OǨ)蓎4M(PrKcSmΒU'ټn{aoiI~n,w;r+uw[v-YJ݅)9Iw{*Rmͯ$;n~xSY2^/*K[?n-١U*D&E})'bÿ=CRuC1؍-q wTw|8tޢTx$hS欼wKޯtp+lnȦDŽ:G)4g.X]`ay"v1E u&o腁zM" RG_QqP$ X`҂*W?|2nV-poO%9[NOj۰:*Q0*< T:^!N].9#;S zw|9ٛxRv pF*_ٵ~Vxn|[Qɲpش`̞eV5ܔG2_]G!^,sjmѪH+d<7./e*"ӹz6QX7Ȯ3Z}īsoI^@ B1w(4ф1;ypZG,&mϯTHoյxmp>{;X`bvMi1K`<r+!M۴'ȩmM5.%͡4o3L?OoGxzmU]8}OlZgho9 Lsy}]ߟ?0٢bblkl߶2NUScr/shꮚ?eo(o1 7h~^.E='9ю/G5M guw^ 5u)"weɊl͐͐F C!9okp{Hn-sg~ҹ3EÀYXASe,2Zreq(+`-L"bWZB?zæ;!B.Cg8^%rX ys?ϠAg4mGo$ǦܨމrĴB%M6(˯EP\ta dЦ8n!{{bˍbUcph1o "t{Jhz_a;r@If(C~ U Gr '$7^ka-k|jw"#0 @p:ga.ϑQ׼|)a~5 줴lxMx̅Tv?%R]Hh:)P[R?;NvBVxвYmb [1Cc^_`abcdefghijklmnopqrs3uT~fŠ64Ye*vFrngkGػ,ض8}4,GgD>*3r,ȺQfy@xiqLX帨{'^$cas;hʠgFDԝ`#vcA+_4{Ri YݴQJ?F}622ilw1%[|i~sm`q%Z:oEo+ůDؤ^N/IU3Go:Al_9rJ įLqWWI*BRip{&7QΩɀ*=nqQT>jClM"&(<@gsHtP/H֓KOr !:0\/ 6Ƈ=r.d}HAipxj?nKzy,kϵ k4zohvޓqOԡ42$8? ݚ&x}-1)6!]mM "mM38p$8 ?­4*SxMrw; ؆""{?7(#՟9ͤ}%R/! 45CV܌xٹ ~4mSW==s_.'m0M|ÄUq.K:π2Ƨ8JF>|mrrªثQ;騕z&Tzhk=&`zm1{*p![\o͎;GL/K}]j{V } ,đKG4S۽?- cA%<'V_1v ؃ ~Ԡ^-S=i#jl$*@M^,xBR% 7m.NUO|]'1U*aBCUJyRjyR^'*{׍oa%)Pnw JŶ%d%3/:s9+Eo_ߤV'MEVJimN<c9+ @#? „CQ[ ]-Ռ%;!vq)d^j.XԑJn(; nͲͣr>C;yD β0 スp')whM)3lܬJ FsTx4ҡvF>6a9'OD8&8} -FxᱻUe`%فK(o}bu'X+xZ)_MPhI|dd濮R꬀Ud~>آcXM݉+="zO|nVŐzU,g4}s+[.z  -ֺ[5뿵t@~d#ǀDY|А2%8` Ρ!hG[/O"~|gR#qksR-g[ o)qw?=/2W24ﻢJ[?ٙ.`*SU*[&j(Sf)!j*&6ij]kMe@-]۶5vhO>|mAs`z}bn>#7SKCO!3]x=W]荩K+0R`W `q?e}bmZp>iwcӷ^`uߒkOf%?nYq&_6 y e8?CQ`7~f{Q^xv;> ^tl|w;3O".=Y`8%CBIqOb71@wt-P|q)TD.^ =S'^x*Np8i.389~bGk^ɚyQ&[~[ ȶSCR@(&4i_ίaikvc6;%B۽lB]y>>k6d!aKsv^BM^5ԡD -Ng5 s{5tķ7wFyҐ4-$Gf0jNĜ2he3gzrSǷL)մװy>+ر 8ݳsCci\H:(~*6<=ZMgp"}e ?Jwe3tFZut[e;5$W&4$.O|H^_䃼#5Tr#!1 XmXɼt"K87i~ ti;Ox:HƎUm%[Hm 8|bѢe:ػ oBjR89/hn:X 1uHE`Gd`ޠ?éٵz\MI)iRǀ5^ͮ<_Ȣ 5! m&Wgf4:>PY7q=Eg!M$H ?n>VY2oxybj υg],HfBk`n1x@dxxgøl8G ᭊ򒞁^η?o&@ o/ًT* Yȳd׫/snzٮSeɠi%yvCrfaͫt/Y8夬xrr3eF}/d3|P? m7\Cxj'YX$ i~qfW`UF k8-uf: <6lmXPDE4E N=` 8sE1< HvEv3X`ϰR"I7xhQȦeHrUwrĠ>8@Tc@gN֗9wWr$~@]A?2&4 Attzi0&JzM1-. 8AX<,R BC+jAceҝ:{;ce 5pm O% Ou. Tfjl3{" 8yv릯l6C&֚k;?l"I۬IQ쌣U֨w_.غ"A$U6~l8Yf0"0HgK ziȇCn&'m *}t/B"'a<+?B0e+ԑJPFbZ4{'[p-e)8@n;sphA>&mZ;(qT8#n]LNjJ7>NR?Pm# OL/b)q&u$F~V  if3yGκ4 Fe3lA+B?ViMrPdBHsf/׾g{X"c" $.a\]rbv0c jM(ϫDI-u~,dz :{5(jЇw$oG/6wA@LArF\l#9 U7|EvӖF2H\UzZd5(VN.xn)@sη^<'Ay`Ÿx XPؤn2R8\`S|aa! gJ(? 'f3lnxf~x}ǂ06̶r;6;~"ͲG#5z) vְo%':{uüۧsY*WW\:n e3~,wsHMzOd'C`Ny2"B9)G K)= ;)l5i |o͚ *YdIPXs v%7[ @UzjB@5n_݄A +`gJIf f/z]VB9,Hmm歾W8Gkкk 5wOr=ʅ+zWh32l$AU)$PZd_ Өd 8&JSkVAŦGڽHf,>̵7f3P@uji`iz_kw?Sl?vϼB6H"~)epॣv[G rDGpW,RoW_抲^ 5%Mtض}<^Z1z( X$5H*C7-@!2 -X t2$BjA~6V.^Yj i5bh O<>ͩYZ66ݰ 8 +\yMx=cK%+ff8]bRj_-=1[ o#n+orE&W^g S쏃1:+bO[ne\T7 Aюn[fOA41IZڡs u^3]4OSL 7OX~^*ܝU՜p^B ҈ XͷH%CmÂ/z"߄`C߀PAޅZ(M,_]r~Ą[\hMe=W'O^.˲'jm;!'&H-d=[AGe>܌ ^ڧnJ&rS)kQ%n?Lá,X4*?b M"z v,?^}9l_N ;ϺӑMgïpבoQ7Hp֟em'Ŝ}NpaӎgT 6FԬ1G$n`GL'Dh J5}k(B݋T=/`mdy 8P&ȸW!Fk]EYށW# )ԆA/0|!许`0XwPq5X)1G}(,_(l)-rwj8OA#_S"XFDbR{RJҰĈӌS(LL0 K v| egHE~'gFelk4<Dpk.j,3Ve/,C^ڿ.k#QVTq=%|{Pe!.05vecK1%ݘp68 %vVE#d|S4~]e*{Pc à29|a~z!`Sj 1E+a`&ٵo\\u{1FݗsW͛h6.ߕ 'vٛTQMFMeƩq`pt&;5p­X^/ 0==z?e'9/mQ7A߀94w ڡ+0DAмr?7#X,86? C)`f&Ap4gqgw^M*myy򉸠.)(j(E3\i5y9L6b n cWXK3ChJ=j(\읡(}x,xL?93_p84`j:;GiW=uAdׇ N^@"q/WժSy?5^uNWx%.ai CdL rLb[ݱ|˒S.L /ƒgi?#jλ? F~g d=6 s)`nRG*+<&^5m'$JMA?/B0 C/m {>=λ`3iz6BϹ8]k/7[F,3@ߘ3W;n\]:84 l΄1EsAp(fSL(O$c.m_UHǶ'r5˔:y #Ԟu;[4L#lz3.qضG +IRXB bx̩.C!Ëa]o>cePgABR25=c0$'1:a 5+$8=R8ڀc }(qHj4?Cևxp*\z}J]qSPZ*ĨTy\/Qs5Tr]ES{#Yʊ\%KIO8wKQN5KL&}j*USSt4u!Y K&zK5EUpg5qx➍Yz}n+KOir.* I,udj`O .{<a㇃U̸td ^Ôw#Y*OڨRv꺚u rY\Nfj~k5 H~ SV\:;υHEKFrNntb[%Oϵ,aq7p +SuS8vcpZ_aԣK)zDXw: Z7pr,Ip֔3@jYM.uU=_~9|jqʣAH׷˵#dcX 9pjZ2 uhtrŅ4BqhӦh4kIUKp׷KHqfzJ5msSb>i˗usnhkkRSӫg)Q lZ QwE4#B 3?'ήU-@+ԣO*C[ S]O27l%XTfCO=U֛K@hɅ8h?t\xu:ZF]khg1ar1 Vh$c(`"l#؅ Ԝwma#pERuHM%fO&LIA؄%wmu=eĩ)$މR^hpႎ%SGGR1t&05a0D%#<辵NlqiY,A[#EF,7xB:-l)).gf}}۠jB[I-[yh%v }c\r6y<:AOYz[SJ-5RX;&ՠPuV݂6jP׫rإj hdԗǟ 7 E{_CBGUge*>I{>1UJkg[喩-u%VԂяc ze'ʤZRq5DƎ%[?:4GJ˿ r\ݫ%O-هZyqlcخcmn,GNRhy޺u")=U`(FSEF1gi1vkv3nغ g{-{܅=6}=X?P359P{e߮2`=eeV߆jJ떴eF,/2HLcK> P|xi8a1?h(zN41"-M)FL? eIniKa\-SAHOItL?(mOIppؚ 1*%ֈbMh`|t;S8: 2d9b y$:$̈́=`jM' CzVRR0KqƸq^ĺ[M5IF])~~K{6*nۭDC!?Yja_¬~ *ucaC?BK:ڌjѵ&@Ʃc_fLC/{C5새&g_ {0p߈Q}Hd>8pG zF'.H>+dkrw.a^ G:~c-_pCL>8Zy?0}?`Cm E UY,~*Q?dژMU6+>KƵb\/z^Z%qrRPOVٕxn/T~ʷ8`:z.kt~`։c>`yJrIisZjJV:\-;Yָq笸;B P.SuN3j5/J#RR#!3V&ɜ4h\ }NWb"4m:Vt5Q^:nvLvލ}z; 7IcQu+z*:j`~@^bfNq&|WEKZoDGjH#pM&GC?H@i?!L~?C"B)Ls{8Q88#O?]%e]y< I:r'XkZ@aP@FlRn *デu+: r;>nYZPOA= y6cP L86rȣH>/|4 ߠdP!>,SS"}ra0_~@>j@?` 9`pzhM30ZWmK> ,Wp@؀6DHeg̋bNЧ'8h!NԠl!N'eZp,e_Lʏhؐ<4  HlOk/ǶX>!\h*>%py{:;OLu'@;\vH'_'EO"N*?J8K€=qVH  T@:kq>3P۠Pȋg:ᡏxɠcص'>o졎ic*?,?To 6G! =r >IdtW(d|5̀;@= tP@?f|vDwh ! 3F0H|  (?ٛ!pp!ǩf|S39<3}3LϵJ }hzl|ݜ:7ِ*?QGH;@?Dyt2@W?;}ā휼klוA?YP~nV@@+f7;6 ڞA>* 9؞' d:{TjON{$?ĎG ҂j vǭ16 Aڂ~ nPO4 7\+z?[==ڠ4 ?ȁQb .=*+z=]b b'H[Hy(;Ȟ '^s=qɺ@:M'f}>_:ǯF#מA<A=JtȣuTw('nx@<^HĜ% :w yT@.1']xEoE E >(Ių@+ OGNwA7&&)z,i9Y$QhA-@A"I$ $D&g32{="QiZ-kZWmWҨTMWMjڪ*3&j]Ͽކޮަ^DܖI6AGH,K,:A0- %ңM-y (an|ЏӚ ~0C{t}ҬN߆?X#C!C{ 8 @|#~1bGrqΆw5d܀@;"ij167[~M>H#@{@  xkw\Pga8 8 @\Z{p -cTzޘTe ~`kqp>v0e3U0--}:zuVܐ gz0mG~܀~ċ#9r 0pnL2H6w =&h/ǨN+#@|"@@1<7C NZԀÎyd_ pWGӅ*=G*Ts#mX[x@1~rVBeKطlAQ~dƦBt9UGʪZ[!, z,-:ru5MPtR42ԭH:Yl7wT}5RNx#w@= `qC΀@v9.qh| :yVsʶx#@l@uqY"!V/V0Z;/Aԫv@nyphSsTV4 -@} Ҵ55:|uJw7m8߀w3˵gnDA7BAgӆ@{ 3@}`hŐq6Q^F*8`wˉ>)⋎|-ч 6:,/x ؆tUGh2;4PXZ' ֫?j,174t0Y߷,۾ >{V}zқ nWB\lB?Y r~9B<CT9p&^Q pG( 90`?e``;a L(#  C΀ahaHĆ9ao6#7[m@{l*68 D3؄#a#[l" j2Ў#ڄzig~3@?@ C#ńy #igw6AP`>0D#B8*9 B9.لzЏn@vRIJ@ք}Ւן[lse{ w}@ C̀fm٭t^>g>$_s!߀pV1xPGj ~gj@:Ank^ | s@zNvx YXլ;k[)oDjwӮ:0;WT׀=xu|@݀2n<ơt3TQAǷR*ޤfA2nVꅟ;#?#?T#jŶuk6̈́^rQ_Y?-o֫>7Ziu'iW8h5P׀*:]y{glUoJGVw`6`=8j٪?}=n7^yM 8h8v#ހ8Mպ-sګ޼-}Â#܀^~C녽]}pG؄}H 8G:׎Yz^ҍ:x X `:pw>Hx.:M|^r:7Y@ 8 P XF 0lt:pjۀ{PΦoW p3@3`8  dB|^tt~$7ޒCˤ7ćHo !8Hy !¤8d$8m!Ť8ćHgzCHiCHit!Hs ZCHt)!Ѥ5 䆵!Ht  C !e!i!HlTNRCHu!$;4j!RCۤ;H:CH{H{v !RC$;Hw!R-!<$H|HjC$>CH}tH}HC?!i!R:C^2>~)}G)Op[?Xn1Je:v69,g,e\I*݌5pQ@..2y[ˌpUx|ÌveN2~Ι KCq-?y2x#.)gXQǽ/\ZNb g>v2~;c:ҟCܦ3ž2~>n]3?xf||j2:~$c\[>2v~͓)㪌,MsdarwLz·J2*~νc71+6~7 g2墘W\w F\]IS& >=ermyחB={LˡyD^ qy])'a%׌3 "7U౗GjeLsW2;hˤ-3&:N3?c.$iwqJ:d^s_G*#.Tȼxw?vc.4cuܢ~%4fL~uޛSI5.u~ʓ3G]gP:?B&=<1w9bL|9Lgw ׺_(~x뼍7LźS2cToxd{܅$Ιc,Qy l{rϓ;*gO!w럾v],o9Y &?ùc)|cUʪB'Ĕz2,~Lxn_/Yi:I!x*S|i1h%i vIA/{TN2ch%ϓ+v<:[1W*f&;wUs==yN2c۴$/brztd^ye?_>.zS^ye)K\ד^t$URE 22clc>EAcv&U}=PV16Na{~ɏy)6Ѻ duP߷Yli:s^^zeLNc^4*)Ul۶z\>< 8mi/2{1C<\C$32&O<2yCe!̝U H!DEN-uel2JcN{>-Rf߉U>rC^(z[8ӓe u-֚os',u(lPnPw(wR 2^23eH @v=}n;eK)%vtBSYܡe!{ o[{`B{cZWGHÍrGݹw(rkhie1X,Šg% ;,]S;r=YHYPrP[sv%YN: am2 JǑuOH!A]4_Ĥ9Va.X؆$b0N2Fе m{V; 1_hV6mCdX D"M͔^@ YaGY?zLimD61XÔLW b)Hn߳bYK d#g=KV0;(/+ 1l/׻,_Gl=~%,F 4H`x/1] ̱3u49c$g_|WZ&q>.JʖTrVmq"ZG_@aT؀)#+jVeLc*4XBfLٜ vz_݀>)8-nb NAy\ +٪OfaW6zWb)Uɖc' % xIeOy9d0 #*d5;%phQbIhoa(VxܡT6;t5pf/9IVz&$9+n-AH/,J_=.i^3mkABݷ{qvUKrk R3S'ie_|VְvKJ==OAj^,j?…Mg:$^)ѥ`fPROIkozM_qz.G]'DHܚQQLb09 nt[+wɒQ7%kh 7;LTsڷCIҩZ*jv\^W15K 7m!|C Ef dh߷yXVT3U }mG [*^ \fXWMmx͹ UD計 ^X7Im5#;3x敄 .VKoЙ|-ZDd|[BN4˥tVvUqLˇJN dSV{ f -B_h4ػ~-#)Je`- RX6V` '%F*z/"@-'b #ȳeݾd˷⺩,d&qJ䬳 Sӊj"E.ޖxi@biC7~̤@ ... postinstall preinstallalad.namebtlddrivers# # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; ATA Fixed Disk and ATAPI CD-ROM Driver /wd/driver/wd /wd/driver/wd # # @(#) postinstall 26.1 95/07/12 # # Return codes : ${OK=0} ${FAIL=1} ${STOP=10} ${HALT=11} # Trap signals, exit and return meaningful code settrap() { trap 'exit $STOP' 1 2 3 15 } # Ignore signals unsettrap() { trap '' 1 2 3 15 } mscsi=/etc/conf/cf.d/mscsi tmp=/tmp/postbtld.$$ patch_mscsi() { unsettrap sed -e '/^auto/s/auto/alad/' $mscsi > $tmp mv $tmp $mscsi settrap return $OK } # patch scsihas file tmp1=/tmp/postbtld1.$$ scsihas=/etc/default/scsihas patch_scsihas() { unsettrap rm -f $tmp grep 'alad' $scsihas > $tmp test -s "$tmp" && return $OK echo "alad\t\t\"Adaptec AIC-7870 Chipset\"" > $tmp cat $scsihas $tmp > $tmp1 mv $tmp1 $scsihas rm $tmp settrap return $OK } #main patch_scsihas patch_mscsi # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; Adaptec AIC-7870 chipset Host Adapter Driver /alad/driver/alad /alad/driver/alad ...driverinstallexec /etc/btldinstall $2 ...ams...Space.oSpace.cMasterBootloadSystemDriver.o[w5m-QtH]ѡ s;q= s# @`.MPIr~`i7CT2$S:t"y7SV&?Q|\8!T~eN1 TNm$&mBe|8z!OTV>lc B=fG ݡq>G]YKvSh/*yS NX!)$藮BiXp!7~s_]s4 8#ident "@(#) space.c 26.1 95/07/19 " static char SCCSid[] = "@(#)Product: PCscsi 2.3.0 Date: 06/20/95"; /*-- Copyright (c) 1993-1994 Advanced Micro Devices, Inc. - All Rights Reserved. This software is unpublished and contains the trade secrets and confidential proprietary information. Unless otherwise provided in the Software Agreement associated herewith, it is licensed in confidence "AS IS" and is not to be reproduced in whole or part by any means except for backup. Use, duplication, or disclosure by the Government is subject to the restrictions in paragraph (b) (3) (B) of the Rights in Technical Data and Computer Software clause in DFAR 52.227-7013 (a) (Oct 1988). DESCRIPTION: space.c file REVISION HISTORY: DATE VERSION INITIAL COMMENT -------- ------- ------- ---------------------------------------- 12/06/94 2.0.0 MS First release of space.c, was empty before (1.0.1). --*/ AMDPciMechanismFlag = 0; /* To make driver to assume PCI mechanism #1 */ /* change value here from 0 to 1, to make it to */ /* assume PCI mechanism #2 change value here */ /* from 0 to 2 and rebuild the kernel. */ /* By default (0) driver will try resolve */ /* mechanism type by itself. */ /* Default behavior could also be changed in the*/ /* boot time by using boot substring ams./PCI1 */ /* or ams./PCI2 */ AMDDisableSGFlag = 0; /* To disable S/G processing by default change */ /* value here from 0 to 1 and rebuild kernel. */ /* Could be also disabled in the boot time by */ /* using boot time substring "ams./SG-" */ AMDEnableTQFlag = 0; /* To enable tag queueing by default change */ /* value here from 0 to 1 and rebuild kernel. */ /* Could be also disabled in the boot time by */ /* using boot time substring "ams./TQ" */ AMDDisableParityFlag = 0; /* To disable parity handling by default change */ /* value here from 0 to 1 and rebuild kernel. */ /* Could be also disabled in the boot time by */ /* using boot time substring "ams./PAR-" */ AMDDisableSyncTransfer = 0; /* To disable sync negotiation by default change*/ /* value here from 0 to 1 and rebuild kernel. */ /* Could be also disabled in the boot time by */ /* using boot time substring "ams./S-" */ ams I iHGh ams 0 0 1 2 -1 files Driver.o Space.o ams Y 1 5 0 0 0 0 0 0 $@z{6~I$[eJ 0S7`\Z%-$\Rmgca48бd:sl eW]ƴ7Jeɱw($}~=ֲjۑ~InI*dY%$Ȑ>Qt.'{DcܿN_|$~jOa|XM^LuOO{ĝ-ܘPU|m (VU8 (H@^ICê<>6LJZxy0۞y{o=⯝s3.z-di& \\s"Zæh<Ԓ~o>g10W\_[-h.Hhm6;8dY"X3CdO}:E@}D S"YXD k'<gb/pKG$VثZ<Ն,]@FH M|YY.~hb?֐m@u@0-!.y:Ww>|#`+s49@g_[qfQ{|d$>LJETxbO(3&8`|N"f㱚JFrgwI^Hv|j3ZNFV S8$NAڲhx Z,Oǧյ%"ÝcKzRe[o=aПXT.J.]vCE'j ,uy deeoO°Ә)BWU3ij0m<SxLYdPƑ.r[\k@5mCXA.b֫@C4Lk$Wy+=[bmeTm޴Q-9m T4x{S!G14eML*юJ`1e4a/6n_Y#_Xt"]1 qc3E`E>-= 2%ԧ@jMWcaE:hnRNႢkh‚J k %~\QR's~gEPG0a/G%4t %)pauw`wqd00]H';fy q"Cq {o{UA8b!66ѣVۥF!N\7@wglY4/x)1n'@o0M[S?uhAk?ЛРt,rPy2ւ:?X<8&+:GGAѹ65_STx0n%]l[qF .fR蕄?<&ݠq6 ?.[fʨ~l:^,ü\>uXZ'ZD9f2Z#y͉o0*XpS lyqECr|7/K}'s$b}¡$m8kd-Z"/^\n'Er?VڑwXbi&cO2z:Q\al#䐔DvtGm!5";u(lxh1ag~1G<{6"8 Ҍ.RIwI=ڶX\Vxwx{`eE1ʋ60> O;Ly߀\6鱬}.@ƪ#l#j(Us0)>ك\[[#KmGe#Μs0Ғ8oa/:E9tS&SBkC7T:YL6kqG Dv8ȡjn09}n]vBƶa@%jE)0kPZw7=鿄]:w5$z!Co ~=9uϙr7pBm|l/eZESNũ,LT٥&Ev攢qDo .{9=`}BKF~!w*n<>JUn,\E!c[_l߁Ѫ֕;5AJ(lf@1glmGci!䴘r`EͅLÙIB!8b-.G,u*cK+Ͳp KŤ6aK{Y>ɺQ#MNfgju^t:"?b/Urvfsxٜ6mͦyE.yHq'(_Kϐpq.Zd@3ߟjF?n< @АJӁK}]*n.}ע 8 9`3{͎0ǻSߠ[];DԮ=D%Ob hYT4#v>|N}N J/pL4,u5j ] uwU-NFU,}$RK`(=†}GXlsZ"? S9"s1%6x#cs'X&}gTQq# uAwK;Wʎԅ H@<,& {Jq+aAL-9&,C[/DmEP7#֥Mr1Vu^qyxK[!#)zW&p%!xe)XyXaD(0H^Rel8rt"Q({1/Px9|y;Eeh z>boD&vI)H9{@ ?wZo}|@hO2-.l3Gڃ3>+xj/sHXPvQ8b LvI:N7 6Ci (8ä ]OE; HR3嶜 lNX8;jb/ =q3AvNB 7)]Ò?H"\"wysz9nr 1"+F_@)A!\)Ξ^d'ֽ]avpW%7щaB.Fͮ',}[0݅{@EZXdl}El7t;!MP64E gtd&Vm 11˨YBoG *갳ȹ̻17<#CHtČnNF^m2T5K JJ>S='_Y'2ʟ&J V]7еRC/Wa?,JIpd,)'Kҙi_+J[9쿈>L |+QND eo*-*.5GW6L>?vU4%&|}]  6P_aD#mR$kH]W+UXUhi hE!OI?Ӛ egt{{Kʵ\@ a5Z,׭mZHx³9\?~Ƙ^vO{,yds;ł%ҵi}x9Vɶmw2Nf0QXǖn4^I-m9u LLobj&_6yҀu"Gzz+.%H"mEpDހ#[V>^zz"҆N J9r6ؙ0VfV-+\@pQ!5P}*;\̾+1kjNMd,E9|̟uj,1?m@N) 3F? 6  \gh!ഞ75=1=qR Ӎ̾๫5365&%!,Ş8zH-<:)>v( (3+lYtp:mЏê8{M R˸+^/zkEmX"JO(-5,ѝc Xl/''EtiѪ6F1΍;>ԑM\s?J4uՆ+.3Y`E;ߩBaDtānt@JdQD1iD7PA^a^Y.dWm"-D0ZR-rsך.K".LϤ8d'+E5)"p@=/DQ){:WU.zίmju޲)1aZw7¶_Z>LuȰ_Rw.kxLT UЩn,hQNhUWx9um@lsS=զ]pyu¿<^yu¼ W[+hP4\(BΩhĶ옅tpJNL&K"y=ynxe "L v7Vp1js(B )m$Y3P⎑y0\Rod LTȴb:*+E@=PKL;2!89vbjIT+.|;JQ&ynh!Yx4?4As>ӎvGf&imAƭ.w迒%]@`W_~ѤZNUZPX]m7i 10mKqKg:*T)^&d4nYLϤCo9VӃ6"Owp(} C;;o1:,nM}iiPD7Qp@Ctr>(3NQx1|V7A!I_Mwˁqnw&`y:YP"#Z`yr.| O3/ ̮ C";7Y,}rqmTXQߦjNv߻Ts94#'nm@bZ޲e$Uwiʙ 4 5$ [kn$NQ]hX+lQ`r%*FR𫰯XiP"B5V^_ΚiӱA={Pfv>#Jgy"חvcކ#8;)cKҨ6?mc ?mljCv=ʼ~=U3h-B4)@dOWSBZ۾.;") \$QCBޣ똄G5 X!P6sBEV-.t4_ccb7%Mڦ$E{mXcm1xPU/I6r(<{Y::[\s?]Z)im݌~2Ū98CezU/R(q/Ϳkh.n!/63KK뜚cy"Z7n0n wOOnjqVFNاvr_H^0IK "m9NR/aNX]$|Z}1 MOO^ucr݂ *|zt7xd6@ ogBFĢ%N3B_xnݞ^Rb_e:g%M!`fD)X&MDGFm)feUKӆJfTwsѷI2 u:W]wVɿxĘ"Q&K>ɏEqca7_q>;fi}xJ B|}aS=:YPOa|.J=@lP՟mڎ* 9~,'wӣۖ 8,w},v׆/dugE]k}1PR*@jA5מIm/,NӍH~tL'*:Z^੕n2a鴅}]X(CEp pO|`'h(7g"NroL$ i!/7"EȮ zy3X*7 k))A3:6-C _ܧDDP9CEt=g0."CHӐ!bxǷ-mJp%Bhhb(8#Sa9J0|F6Toopbze={_-f)s/oU}ѫ|}%FJة%NVa'rEd%C>a Co3!![О5n#Cm/D7G:E4p:`6;4MLD`/81mPb1rÍ<%N . :Lv dqGNLŽ`v^sH;%*aB"k!tS.:M]VעN蓱I{?05_)-\ղ#FS׷ sJCAx@9V2W?0 RkJ:c oN4b@&yJah}$Ga0XԵK3&nb=B}g -9O2YK+R#%**KI=.԰9Bq-0s.wnysWd vDf";oi  } M"ͯ0G w/Dyܰ:a@6Y]hܑISv/6=~O ,N Oo5jXTH+ESΝSbUR7EՖۄnז>+Q,}j^ؖ:yZY`Ly5<yCsZ۪I7$VR׹l٣"eW4y Ne^(ۆ!I>RY(~AaT>Ԝ6FP}?Z6Y be*M?b=&f=2=ډYk'"9a Xh>26A_ED𢄯@d4e)36n4fTrU$q-~*дJ)r2{C9i})(:j&.ƚV:;W+745Q{9G25cE [gEbϽ%Do$u.H/8XZΝB^ t۟EtVڱX-.ukyyDyf=k7 GZp7]n>o;tW8"_tyO?u3<#gʝϭHA5wa $%㭖rap{+]٧P}uM,[]d=>yM: :c(_ܜoBT0!;r8MKoFHFaw\+ x y:E~)SO*YiHK6(zEWϰX#F:6PW?e}8+k1O6/c_ v͠*{78^Bz~?94`72' HwbYlܭn?{k׶u9=2M{4eQJ3H#ءnKM$TÎZ kVPEi8(Et?páq]uu/R]d/zda j M1emKBNԣ$-4_1@JpO0N4#~wa|_%N,0jE?d_ }iaZd]zy g9N*Ϲr߂î^)_@oy} K&`rփP\1wp{هfRP,4u*86U.rB:h4bmKҔ-.~^9x=)̮fÃm`΋OTPAXJL}*T$6.E\N!ϹEC[* WDCJ&(?䵾Z4#VBEB؁% RȚRLݡVuN᳹MYS #mTy}PCA 9#n16,oE#أ|MnE"ecځڹfRI/!-EM 6뮎_sж™P\8TDT<6{xBvB;q R~~ƕĥ.t:űéDQU`IQC/pJe2xJG~oc6^y}PHYE+g[cI*ͣ,K7{FU`v"HD{䧾OK抍$7 BIш‡/! 9\|Oʭ2O\.E4o쩈_嶋)Osñܱ^ B^Y'U슁tZVmY/F 6h]Z+ {9-vAZ#/A`z:1=`TE0#ڵ\?N`u&eq:O/zy6ubnJ+723Jtyl[_ C` Sah rɖosD;{fcW$\uu~~/(l(PPG)Jց/{m8ں:䔱X#?ߥGR)4e D#H,J*,J ``` Y֮@dlS52?6*Sl͵4j(R|?{;%$I'04ecdl6#1<ԇG|3_ ">tj)ԌMd(Smu8|*.x?ݺD AgC$gP1{jfO(ny9L{BX.,?ia;˗ӄ./Q!,B[sӃwr"'XTܰ~ufW8+=4^yP8p/(QiEF7iE V1.Q 6:葖 .FHPv\MA|!xR𓮻X9O*4䉹_{`E>▪ 9"YUrJO~e^mݵ:x~jn< d/ɁaS`w)~ީ9\]:KXMccX;8WeL]yB] @oӏ}GEzi{80V谳0+}ԱucDEK~u p!ۺzf EwbwB(iwq"ZH6u{ BPL!JFK:t_N*_1QTpJ'P0nu7S0/<Ƿkr/yh“ċtZ:Ċ]JZZӉGS(jM2uhU!q؛ɠenIR`vvڶ..`|l9W.WQ`,]MB~"^@CgD=,O,_6r/6SH)˅8(LqL,' GܧbwoPp:'2?]<RPy{`)s!g-y,n?dCK2wkk Oa97um̹wj ,8L= 6^i`٢ Y.H=ĐoIʾWRâ 8y| s"Us%_9WeOwSj?a"Ͽ>yRsWw0vK;d (KL } aCXkB|a%rFYr jU.#,%ܲ}iT_%glc"ijl{]+!nZ9Rěȃ P۩4_6>~FzidMwck5VqV+QaF{^K˟{c  n mխ֋.s!uJsNQ>ڊ vtVͻ)T ^s'cΠ}po;D;?^ gQk#j}ڹ̽=/~w*^w"[\WRNoda)?X_Wb.\yH迦:'qpQ_|76r WL$=2E 5?]-mmX@\^F ]zM\q]Uww(l^ސ:+˳駡|/" 4iavn;qfwyuλ}>J4`1{Z .y]k{'rtc`.:nnyD3_6 ߾P%"9j_E/G;~udaY)ֿ5=+CĿݦ={A?P +E3oO=?Fq0*.|a/]//g#J_Kӓ%/!^`٭+GhN$7iF2p-QB.(?j r_ꎉzY(_Կ"חSn_T(D[EdLsFV/a'1Buԍ#/tΩR152[zu~IOcSɲ~}Ɣ ''X(*VUQƚc&cKҕ8cuM_9șuYѳm%.'#FN1ҶhIU܄dn>3+/eo/u 8p xpAΤ8r<t ;(w?G o`C7f|os^} ]= P(&^<`` ۀ@~PM<0 ,>x?V^ 9 t ivaH0JXqףNh6R*@o0`B Ť= 5Äŀ@tZCZ?'m wOlyJCBqP2ِw w4 tFAـ=B+7\'p < N:SedqӇ||MpXFp}m#z 00 (c: C Øp1s,Z|swa>@&>N~:S_Tw cÿ  ޻NTGOXa 00cs 24@,txzmx?n!D39@~0Hs?،:j} !G`ʼn@x< 8C y70&` dIǾ( `L v%žI-þ8p>`w$\FÕdUh 0 #'0a>w @;a; LtʫQd2&pLˤe9g޲15 wHwB|: i::=@m V\@w`?(80#`2] p< v[vT'COw̋ŀ̜n274s#R(hG2w)0Հ$TȥͰݰOûA?' v;iE;ԧ{ѻ q N:; ?^`;=OzH6 O,' إ;S$0D깫.XO  ȄPN&'ܐ{VdΔ %=hwE 0J9'(tWD%;ڀ8yrA(Od#~XWUE<}nA)VӤ!:vI|Ux{eNYėC]QrƞXl,tWp"/Ĺv.p|TNb\ysn\_ 0?0f luA4ؘG [v"F}q!: } cvEc;cOh">#@ڈɆ>dt'Tk} }ʙ:?:Ԁ `4,#6ip 8^l|ȵ-@kΔ7ɛ<"ۈpPÍ~G 8ـt;Z~OAc:a;ӧ"@jgNO~xO{0PIu;p3Y~ <39:|uo L7P :  6 >8p|0cr23`=П?%  B{`v ա;~pȃWϢ?ݳ^8ig@u ;,;s8~gzA8\9g7s4:rΌ'@kDvA>xA>0,Nᛨ o8'gƿFxa >t>X0Y >t~$+|\pӀ$^v| nB}X ݆韞&?DAN{nw {G6tG6tG6Lj?nh?s#Q.a'-\ \-(΅vJ\'^{w7a>xNHaڸ ' 90Nlv'XviO/JvaR# 噞g͙ͻa|0WL4Fl~XL|N`3Nnxs? ˀSiiη郮ρwЧ<}Q|pi?tu,uP~IyA`Zo- ܠNT;b-7wt:4;D+ $[I Rr=IBy ׉ Fx qTtpU;!ޘ Y\Yj7L|v{Hy.my=p/f0@018 `lku>^`;P@w`;@x@?〫EJ F_"] o_FI8#x:uB7(SZY|¬_0HMo)쪚K@D8GZ+$}j9F61dh)(({$dcUEXt=d|F""GD]>MdxDȊG$br#v*P.vejC$|\ =dഌ),UVp|$x1(tk>zUQƼF%V_tH%V2|ؑҾG_ZUk [vDպQ?*1핯j̭#ih!}T0ZG: Eu_,3@ϮX֑R|Eh*bH3kEcF"+ϲRh@4KEt$S8g{F::Hբ y"G-5YJ*.}d~@+#v(dzF Œ9J5DU,ErHJ1o-W1t#;TxҭnQ#}, #6k] H- zIu$JUwR:Z;|Y|Wa#"]]'녬mӖZ۷N7UOdشүT?DA#J|#VKc>p9"9Fܻc9FGFf1ds \qYTul):V%Zj/NW/B#)_\ܒ;:F:Eئl[QVҳۈ"%}U>G:_~H@dC)ٸvi-㪌StkVr,Ԥ%#:L۷eNIճeZJ6ە2Bk+ٸfŝm--5J Z֮[3ܳn`eVӸg%JʸT 6s\66 +S%̵^ٳT6kHS[5 hֵ .ʶ1d64f3mk*.ŝ[:GSX:&Y99(5,g2oLJ, Z"gRQM6Ufʕn ‘*ʳRIvzbFaG [uUrڶe|iavs79LY4BH<ӓRc9fB5-L`ճAAIPɷzk[Nl?CzRDzU2,}dݚ)IUDN<4,DHJ3r2͖ԩ6ִQzt)RJ܋eITPΒܪIXpWAh+nr$!ŒyZ'ˬ\ԗd,E|f423PORUumir5#Č\+(iG3MLK3kX°tVi j;*Y6U̩8 +a2W||fE&3l'R8+C\< Tjo?Pͳ9,V%j=]ܭڰ7iHʬRqEmgFJս!ur#Tbh=Ƒhm#*JtmtnMp2e,"P#~muafH u.G5L6+3=Hش$s]&Yӗԓ,H2u q)5eliITܵbɵr(i*#*MgyBۧyN):0,Mۖ^jle{Rh4W% \ըvNUn@rbI ˞uh_H=QcC19J(XM3,`Z7R;~M\͹hjjGфg!Zy?:gh]vBV SU{{g^y }\Qq\F%]FCFW,#FJݯTdT3[Kgy9WJ(s{)a ^p<...postinstallpreinstallcopyrightams.namebtld drivers: # AMDHA PCscsi postinstall # change auto Sdsk, Stp and Srom lines in mscsi to be the name of the adapter # that is supporting the root disk. adapter=`sed -n /tmp/scsihas$$ mv /tmp/scsihas$$ /etc/default/scsihas cat >> /etc/default/scsihas << ! ams "AMD PCscsi 2.3.0" ! fi # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; echo "Copyright (c) 1993-1994 Advanced Micro Devices Corp." AMD PCscsi 2.3.0 /ams/driver/ams /ams/driver/ams !..."driver(install".!..#arad#."..$Space.c%Master&System'Space.o/* * Copyright (C) 1993-1995 The Santa Cruz Operation, Inc. * All Rights Reserved. * The information in this file is provided for the exclusive use of * the licensees of The Santa Cruz Operation, Inc. Such users have the * right to use, modify, and incorporate this code into other products * for purposes authorized by the license agreement provided they include * this notice and the associated copyright notice with any such product. * The information in this file is provided "AS IS" without warranty. * * * Copyright 1994 Adaptec, Inc., All Rights Reserved. * * This software contains the valuable trade secrets of Adaptec. The * software is protected under copyright laws as an unpublished work of * Adaptec. Notice is for informational purposes only and does not * imply publication. The user of this software may make copies of * the software for use with parts manufactured by Adaptec or under * license from Adaptec and for no other use. * *********************************************************************/ #include "sys/types.h" #include "sys/iobuf.h" #include "sys/buf.h" #include "sys/dio.h" #include "sys/disk.h" #include "sys/param.h" #include "sys/scsi.h" #include "sys/elog.h" #include "sys/open.h" #include "sys/devreg.h" #include "sys/adaptec.h" #include "sys/arad.h" #include "config.h" #ifndef SCSI_NARAD #define SCSI_NARAD 2 #endif #if SCSI_NARAD == 0 #undef SCSI_NARAD #define SCSI_NARAD 1 #endif int arad_num_adapters = SCSI_NARAD; #ifdef SCSI_NSTP int arad_num_tapes = SCSI_NSTP; #else int arad_num_tapes = 0; #endif #ifdef SCSI_NSROM int arad_num_cdroms = SCSI_NSROM; #else int arad_num_cdroms = 0; #endif #ifdef SCSI_NSDSK extern int Sdsk_num_disks; extern int Sdsk_num_rb; int arad_numscbs = SCSI_NSDSK * (SDSKOUT + 1); #else int arad_numscbs = 0; #endif int arad_weight = ARAD_0_IPL; int arad_processor = DRIVER_CPU_DEFAULT; unsigned char arad_installed[SCSI_NARAD*2]; /* marked if installed */ /* * new variable - real boards, not busses masquerading * as such - will delete when repercussions of changing * semantics have been investigated. */ unsigned char arad_cards_inst[SCSI_NARAD]; /* marked if installed */ struct dkcntlrtab aradctlrinfo[SCSI_NARAD*2]; /* info. for disk setup */ SHAREG_EX arad_reg[SCSI_NARAD*2]; /* un-registered adapter */ /* CONFIGURABLE PARAMETERS * * How to set the following configuration paramters: * If you compile the way it is now, all the configuration parameters * is set to the default by the arrow manager (through running EISA * configuration utility). If you want to change the default, the * first number indicates whether the default should be changed. * If set to 0, the parameter will be set to the default. If set * to 1, the second number will be used to override the default. */ /* Host Adapter SCSI ID * Set the SCSI ID for the Host Adapter. * For example, if you have an AHA-2740 as host adapter #0 and * an AHA-2740T as host adapter #1 and #2 with the following * modified configuration: * host adapter number SCSI ID * 0 5 * 1 default * 2 4 * you need to define the "arad_hba_id" as: * arad_hba_id[SCSI_NARAD*2] = {1,5, * 0,0,1,4}; */ aha_change arad_hba_id[SCSI_NARAD*2]; /* SCB Handling mode * To use the internal method (valid setting for both the Rev. C or * Rev. E of the AIC-7770) or optima method (valid for Rev. E of the * AIC-7770). The internal method will only handle a maximum of * 4 SCBs and the optima method will handle a maximum of 255 SCBs. * The default is internal mode for Rev. C and optima mode for * Rev. E. * **NOTE** If you are using an AHA-2740T (dual channels), you * MUST use the same mode on both channels. * The supported values are: * OPTIMA_MODE Use optima method * INTERNAL_MODE Use internal method * For example, if you have an AHA-2740T with Rev. E as host adapter * #0 and #1, an AHA-2740 with Rev. C as host adapter #2 , an * AHA-2740T with Rev.E as host adapter #3 and #4, and want * to use the following configuration: * host adapter number mode * 0 OPTIMA_MODE * 1 OPTIMA_MODE * 2 INTERNAL_MODE * 3 INTERNAL_MODE * 4 INTERNAL_MODE * you need to define the "arad_handle" as: * arad_handle[SCSI_NARAD*2] = {0,0,0,0, * 0,0, * 1,INTERNAL_MODE,1,INTERNAL_MODE}; */ aha_change arad_handle[SCSI_NARAD*2]; /* Bus Release Timing after Preemption * This specifies the number of EISA BCLKs the host adapter * will continue transferring data before releaseing the bus * after being preempted. The range is 2 to 60 decimal */ aha_change arad_bus_release[SCSI_NARAD*2]; /* Parity Option * This specifies whether the host adapter will check parity * on incoming SCSI data. (parity will always generate on * outbound SCSI data) * The supported values are: * PARITY_ENABLE parity checking is enabled. * PARITY_DISABLE parity checking is disbled. */ aha_change arad_parity[SCSI_NARAD*2]; /* Time Selection * This specifies the length of time in milliseconds the host * adapter will wait for a target to respond to selection before * aborting the selection precedure. The supported values are : * SEL_256 256 milliseconds * SEL_128 128 milliseconds * SEL_64 64 milliseconds * SEL_32 32 milliseconds */ aha_change arad_sel_timeout[SCSI_NARAD*2]; /* Allow Disconnection * This is a 16-bit field where each bit corresponds to a target ID * (bit 0 for target ID 0, and so forth). If bit is set to 1, * disconnection is allowed for the corresponding target ID. * Default value is allow disconnection. * **NOTE** If Disconnection is not allowed, tag-queueing must be * turned off. Turning on Tag-queuing must also allow * Disconnection!. */ aha_change arad_disconnect[SCSI_NARAD*2]; /* SCSI Option is a 16 byte arrays to specify negotiation options. * If 8-bit data channel, only the first 8 bytes are examined. * Byte 0 for target 0, and so forth. Each byte must contains * SYNC_MODE, SYNC_RATE, and WIDE_MODE. * Synchronous Negotiation : * If SYNC_ENABLE, the host adapter will attempt to negotiate for * synchronous SCSI data transfer. If SYNC_DISALBE, the host adapter * will not initiate synchronous negotiation; however, it will * respond to negotiation initiated by the target. * The SYNC_RATE will be used whether the negotiation * is initiated by the host adapter or by the target. * The supported values for SYNC_MODE: * SYNC_ENABLE host initiates the negotiation * SYNC_DISABLE target initiates the negotiation * The supported values for SYNC_RATE are : * SYNC_10_0 10.0 MHz * SYNC_8_0 8.0 MHz * SYNC_6_7 6.7 MHz * SYNC_5_7 5.7 MHz * SYNC_5_0 5.0 MHz * SYNC_4_4 4.4 MHz * SYNC_4_0 4.0 MHz * SYNC_3_6 3.6 MHz * Wide Mode : * If set to 1, the host adapter will attempt to negotiate for * 16 bit SCSI data transfers. If set to 0, it will not initiate * wide negotiation; however, it will respond to negotiation * initiated by the target. * The supported values for WIDE_MODE are : * WIDE_ENABLE negotiate for 16 bit SCSI data transfer * WIDE_DISABLE will not initiate wide negotiation * **NOTE** changing scsi option value will cause a SCSI bus reset */ aha_change arad_scsi_opt[SCSI_NARAD*2][16]; /* Ignore underrun * If set to 1, ignore underrun as an error. If set to 0, report * underrun as an error. Default is 1, ignore underrun as an error. */ aha_change arad_underrun[SCSI_NARAD*2][16]; arad I iHh arad 0 0 1 2 -1 arad Y 1 5 0 0 0 0 0 0 bcȣ{`PD oz1Jm۽ݣn7vd3QAe wrNnZq{(_ bd^eX}qw7gJ?c9M%:gxBt2'`{_}|Pl~9 Cd4p}W Nxsi8#] 9tZi*N+J i!D"[O o|s},w}{Q7}+;'?~B~x ?}lJzԲ\ ˝bNSr$ױnNR,cc4ΦȺcC004leI59S9@. $tmp mv $tmp $mscsi settrap return $OK } # patch scsihas file tmp1=/tmp/postbtld1.$$ scsihas=/etc/default/scsihas patch_scsihas() { unsettrap rm -f $tmp grep 'arad' $scsihas > $tmp test -s "$tmp" && return $OK echo "arad\t\t\"Adaptec AIC-7770 Chipset\"" > $tmp cat $scsihas $tmp > $tmp1 mv $tmp1 $scsihas rm $tmp settrap return $OK } #main patch_scsihas patch_mscsi # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; Adaptec AIC-7770 chipset Host Adapter Driver /arad/driver/arad /arad/driver/arad ..../driver6install/....0blc0./..1Space.o2Space.c3Master4System5Driver.oKbw얕 PA 8!Ɗ">F g> ! ovtlK[曏gj|f.+܍6mH|0V00_פ>eCM<OT9O4ƝXf">_Q/S2ZenOW+׷%m{2]lq@^kVp9z.W3-͟X>`$J,7A{n @s3Ȕ1FD%chv–*L:ҥޛ[%Da FZ$fL oBBΙPAji>Cą76x΀p#ident "@(#)space.c 26.2 95/10/30 " /* ** blc/space.c ** ** Copyrighted as an unpublished work. ** (c) Copyright 1995, BusLogic Inc. ** All rights reserved. ** ** Version 2.07 */ #include "sys/devreg.h" #include "config.h" int blc_inittime_hard_reset = 0; /* 1 = do hard reset at boot-time */ int blc_mbox_max = 32; /* # of mbox's per controller */ int blc_ccb_max = 32; /* # of ccb's per controller */ int blc_do_tag = 0; /* 1 = do tag command queueing */ int blc_timeout = 1; /* 1 = do timeout handling */ int blc_timeout_period = 15; /* number of secs to wait for I/O */ /* request before timing out */ int blc_retry_max = 2; /* number of times to retry */ /* request before resetting */ /* controller */ int blc_reset_delay = 3; /* number of secs to wait after */ /* hard reset is performed */ int blc_fmr_extra_cntlr = 0; /* former extra controller existence */ int blc_processor = DRIVER_CPU_DEFAULT; int blc_ipl = BLC_0_IPL; unsigned short blc_deviceID = 0x1040; unsigned short blc_vendorID = 0x104b; blc I iHG blc 0 0 1 4 -1 blc Y 1 5 0 0 0 0 0 0 ,rI `Yl- ([W d, [ Pk-V+' ӥI8QuW;UPmENf  QRe7n[oy;[{ݫmbUWh!ڠ/Y('sH!dAz+)ФhGw{:IҪcYx Q*i ƐLQ_Y;|O?HZ)߹N SPEo'kr匕" Tð÷m$EgR4jM_vi{m1m줓mO^7[N+M'>M"rթ)ams sxF6 w<8?Tܧ~+a0OjBiw撐H_Nu~RmXp-/ˆۯ!# pM')λJz, >j4zaJ*S|)-+.uĦg`UL,0^m2RK:HlV*yMl•-T4`>4K/`\#a1{VaH|$1Kṷh2ɫBSa~"{|!gF$M {yf^?5lT;cCOѾ { b 2xAZ#b0[/pfSo9EZ|,Z^*Q^'Ș"))Fy0ShH7)a=2/k-$mpLZgx:ˠ`Oeo/?ƋTޖNv#^hb.svee%kemlVtSn l,myiQIBː64YY ȉ2]CtyހBդcZY\VK1AKFV h)X :hofwKƢëΆNX8Rer9szLMĞ ;o wS؁tpuF P-)=` ((7Wl"8Mzz P F#7!6@Ȓi԰ U,c2ۮߠHGkfPCR\l +%ݶLQYZӆH7ԁĠ?Ή8 #ErI+v< D4m=;xWza)tLnz_hW4lpQ7ymx0m }ReI+yK;ur1-<-BF0n׿UT%1KA}Dƭ6Zv.~\~2me{Hn}$I~T\OFN-C-IcgVGFQ\qX!?r| &d,&i}'k0|JNQ.C.gSBWˇi.?a cdv#]. cT27i|\{M ߨބ3-xY5Jd~s{Hn{\mLe'cݤJytt:}#=1o1.ga2MqTO%ͪ$%qmM9 $ZY&dzgYŷz ;pDK^3 {v=vwWh$,2#"{YOa`|2K]i.x_mg@qGfKL -~۬Ѣx 5*1"ZAzD{EVW78Ji/hk QՆv Q!,7K,LV!`ChMfkxad*f3,>I!՞='/-nГV}XxvVM\ p@F,y&@_cgBt }aG׍y@kp#=IJ4l t_V.R+p!Ila͊Y"s G6" ,T6\q\?3cM(&N|V*q:At 7.<&}56U3 )&xq[~^ѲCpIuz.ފ$/t'q۷p B6o64DiA3tC޶ar9l rr.<5~v#mW@Puip޶XOH"gIn-'V `>3;MڵT]+Cu%٥-rya{Q4F7pcO,ȶJO h!mR[Żpy!2i2[ ]\1UڞdKaqA IFчE|C}R\qA a]_- Ŵ!pD&FɥpxS\[n,tn(pqdIaibSaPlSA ^)~dWR~m$k7p /ƒ͇L<I?pؔ)Gӱ&~4Y{Vyš}w]b:rdkBJ^+?ѯ5q[OV4I-C+ڰqMR;ńx: L `wt?᛼)ne*m;.۹7 l_`e: c;! Zc̗*kּ |i-ہk}*4tXWޯ"#J. ⛿W2M7_Km⇈Y4È+_[0+\|6ـ g'C1*pM9/[-L(L 'mD0_pMhϚu~aCzwm g,${Q؇S ynXObFrg"p\xKϓ0k[>1m \!%?IOygۿ}g9C*DJXĦ.Fe?*BXIq=ۈ_.nSǛ rqP=G-D"=7akb.Mjp`1Y fOa~Ypwvt\{/=o&k&#'l9C)X%5T]nTҐ^(zZZQrF8wu;vwTnI܌ %~,<7!V'zHԕR7? r@|`8^gAjW% +i5Ikфy8I. 36ب{]BPW]$3=_ vp ه)+~QCKV"ˍ~7䞪uWQdYa'TJЧף^jxɒ%ᷛUS#U<:>ۇ44jÕ&~UQȌ?.S- h$.8|ppճЮ{(eyC}N/#$O7_a?"/ΏM' Q: @A8blͺ$er-zT:%d z2PѓLA>ᢵ)h7؜Aݪ }_j*Յ&ı>k&P}K*ZWӼW}н68)}erqW'oh,[E[1Vʷ`*Jz/\X_ɡ_)`71jX}9g7wCv{k1kuAx\.?Ne7!ŝ-d¯Z׎ƾ$n8KF `SoÛ$aCe\AnM'";$ŴMy(݋۱$׀Ff\Vgg!etC5H,b"5Exd."(R*:v5`;-UK k쁾UQ-?u ;cdHؽ֖O(,o+=w\=؍*;jzm-*.@4Р:-2蜝CZjo\J7?DY(uu\̔Z APt]I!{'fΠw.:GYf\^)4j ;o ^XպzM Ua^ 7 -1O[e]=iٿ}Gb.ѝ3G ImLzAyU^n1F{p$ B^nݻ7żgg Je"ENuGυE'O)^#O;h// θ*i.1Lk"4/*r -?#ԴiMKV' %ϨJԪ4?G@#M '@,D'I3Y"[[7tanķRۢ5AL򱓮W%g QS@B/UKZ_?1>>4p5ɘ ԬA{[aY#WmQu^,׎W7z?³`q^ `L>2$NGNJhB4M@z .|&|DvpWN^?E!e#)KkBk%=k1nӸ? iqX *Uu}mXVC>w7iN=tzzWSU@ OuZ.A2LC=@}@wu$H4yfϑNOTHl6x  l[v]i-5ZgF;3@V@|u{@x;&Nmqܜ1wg'q_/9!G9߬pwzヱ80o9?pdz -x#?o87xRl9tdFz#2Hay$e9?  8` l̶&1G8>C@"ə*Z]- Y O 8 ̣̣99> | v jvr|cO9>^@֓b̀=y N ICY]1 ck(j > "pII/'Gw8+ؘ@)gOt'NMf;Y94hCqJFVT9iS ・T$78?*keMO}ӓ8:`@k@؋{p,jg˖4o"Ӗ is,YšЀ= ѝ8;9?pRFM}4;:,0ΏÍr:pz84{fՐp|C8>9ggݝ).j5.b}4U.h\Km.ij''uK&|38?\F"ldLN&bY-Q_r~adM^yɲ($cZ@hF-FQTl2F>I}#Q_'L`ك S&}2i'\ɱ@ Iq2j*&dy8:`Հ:ם=N&kɚ};04yC-I2iZ<ѱ=MB3e9R]w4l?3FQ9eLrbrb'GeLϰʚKە4b83c3cƱɖ6_eBeB wyc=Cpco9:ٳ8&P l f 6m6f/6lfq lCN3[ EpWN՜4}e;> G.k5wBp{K4湞.mtoN1̹Nvxw;G5eO0io,kZ wvsV`كYNg2k̚h&G̟ld}uwGQw9߄~D2>]ު&z3r DM9!SfFh;:?t8?)%ԊҜI֜y86'#868?@Ghpp@» u IՆ Gvq꧌h+rt2v|1{t8NLHʑd*XH"3o!&d8BG!׹-!Q.r-{Ubub*B XFbG;72>(}d*K$S? >MH#p>&*Fe܄?H>MIrCo>rByHl=J R | jdYCH`# r+ ^T:0G; zbCEЅF0 d^ ; ]WzxbAV 3] p1ׯaY PcqW['Ums AvHC]}XƃUgN6....7postinstall8preinstall9blc.name:btld;drivers: # # postinstall for BusLogic 'blc' driver # # Copyrighted as an unpublished work. # (c) Copyright 1994, BusLogic Inc. # All rights reserved. # PATH=/bin:/etc:/usr/bin export PATH YES=0 NO=1 IOPORT_CHANGED=0 MKDEV_HD=/usr/lib/mkdev/hd MKDEV_SCSI=/usr/lib/mkdev/.scsi MKDEV_ORIG=/usr/lib/mkdev/Orig ## getyn() ## Prompt user with string parameter and return non-zero ## for 'no'. getyn() { while echo "$*" do read a rest case $a in [Yy]) return $YES ;; [Nn]) return $NO ;; *) echo " Please answer 'y' or 'n'. " ;; esac done } ## replace_ioport() ## Get replacement I/O port address do the actual replacement replace_ioport() { cd /etc/conf/sdevice.d while true do echo " The BusLogic SCSI host adapter can be set for the following I/O port addresses: 1. 0x330 (default) 4. 0x234 2. 0x334 5. 0x130 3. 0x230 6. 0x134 Please enter your selection: \c" read a if [ "$a" != "" ] && [ $a -ge 1 ] && [ $a -le 6 ] then case $a in 1) ioport="330" ;; 2) ioport="334" ;; 3) ioport="230" ;; 4) ioport="234" ;; 5) ioport="130" ;; 6) ioport="134" ;; esac sed "s/330/$ioport/" blc > /tmp/_blc ioport=`expr $ioport + 3` sed "s/333/$ioport/" /tmp/_blc > blc chmod 644 blc chgrp sys blc IOPORT_CHANGED=1 return fi echo " Invalid selection." done } setup_wide_support() { if [ ! -d $MKDEV_ORIG ] then mkdir $MKDEV_ORIG cp $MKDEV_HD $MKDEV_SCSI $MKDEV_ORIG fi if [ -f $MKDEV_SCSI ] then echo "/Select s/0-7/0-15/ /Select s/0-7/0-63/ /\[0-7\]) s/\[0-7\])/[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|6[0-3])/ /ID numbers is s/0-7/0-15/ /LUN numbers is s/0-7/0-63/ w q " | ed $MKDEV_SCSI > /dev/null 2>&1 fi if [ -f $MKDEV_HD ] then echo "/are 0-7 s/are 0-7/are 0-15/ /are 0-7 s/are 0-7/are 0-63/ /hd \[0-7\] s/0-7/0-15/ s/0-7/0-63/ /S\[0-7\]) LUN s/S\[0-7\]) LUN/S[0-9]|S1[0-9]|S2[0-9]|S3[0-9]|S4[0-9]|S5[0-9]|S6[0-3]) LUN/ /S\[0-7\]) ID s/S\[0-7\]) ID/S[0-9]|S1[0-5]) ID/ w q " | ed $MKDEV_HD > /dev/null 2>&1 fi } ## Main ## Remove "btk" entry from /etc/default/scsihas and append ## "blc" entry. grep -v "^btk" /etc/default/scsihas > /tmp/_blc grep -v "^blc" /tmp/_blc > /etc/default/scsihas echo "blc \"BusLogic SCSI Host Adapter\"" >> /etc/default/scsihas chmod 644 /etc/default/scsihas chgrp sys /etc/default/scsihas clear echo ## If user wishes, replace the "ad" and/or "auto" entries ## in /etc/conf/cf.d/mscsi with "blc". for dvr in ad auto do cd /etc/conf/cf.d if [ ! -z "`grep \^$dvr mscsi`" ] then getyn " Would you like to replace the '$dvr' entries in mscsi with BusLogic driver 'blc'? (y/n): \c" if [ $? -eq $YES ] then sed "s/^$dvr/blc/" mscsi > /tmp/_blc mv /tmp/_blc mscsi chmod 644 mscsi chgrp sys mscsi if [ $dvr != "auto" ] then getyn " Would you like to use the BusLogic driver with the same I/O port addresses settings as '$dvr'? (y/n): \c" if [ $? -eq $YES ] then cd /etc/conf/sdevice.d sed "s/^$dvr/blc/" $dvr > blc chmod 644 blc chgrp sys blc IOPORT_CHANGED=1 else getyn " The BusLogic driver defaults to I/O port address 0x330. Do you want to change the I/O port address? (y/n): \c" if [ $? -eq $YES ] then replace_ioport fi fi echo " Disabling '$dvr' driver. " sed "s/Y/N/" $dvr > /tmp/_blc mv /tmp/_blc $dvr chmod 644 $dvr chgrp sys $dvr fi fi fi done ## Replace "btk" entries in mscsi with "blc" cd /etc/conf/cf.d if [ ! -z "`grep \^btk mscsi`" ] then sed "s/^btk/blc/" mscsi > /tmp/_blc mv /tmp/_blc mscsi chmod 644 mscsi chgrp sys mscsi fi ## Disable "btk" driver. Update new driver with 'btk' ## settings if user wishes. cd /etc/conf/sdevice.d if [ -r btk ] then echo " The current 'btk' driver will be replaced with the new BusLogic 'blc' driver." getyn " Do you want to set up the new BusLogic 'blc' driver with the same settings as the 'btk' driver? (y/n): \c" if [ $? -eq $YES ] then cp btk blc sed "1,$s/btk/blc/g" blc > /dev/null 2>&1 IOPORT_CHANGED=1 fi sed "s/Y/N/" btk > /tmp/_blc mv /tmp/_blc btk chmod 644 btk chgrp sys btk fi if [ $IOPORT_CHANGED -eq 0 ] then if [ -f /tmp/blc.sdevice ] then getyn " A previous installation of BusLogic driver, 'blc', has been detected. Do you want to preserve the host adapter configuration information? (y/n): \c" if [ $? -eq $YES ] then cp /tmp/blc.sdevice /etc/conf/sdevice.d/blc fi else getyn " The BusLogic driver defaults to I/O port address 0x330. Do you want to change the I/O port address? (y/n): \c" if [ $? -eq $YES ] then replace_ioport fi fi fi clear echo " BusLogic BT-75xC amd BT-95xC Wide SCSI Host Adapters are capable of supporting up to 15 devices with up to 64 LUNs. To support the extended devices, the following files need to be modified: $MKDEV_HD $MKDEV_SCSI The original files will be backed up in the following directory: $MKDEV_ORIG " getyn " If you have a BT-75xC or BT-95xC and wish to provide support for extended devices, type 'y'; otherwise, type 'n'. (y/n): \c" if [ $? -eq $YES ] then setup_wide_support fi clear echo " You will need to rebuild the kernel for the changes to take effect." if [ -x /etc/conf/bin/idbuild ] then getyn " Do you want to rebuild the kernel now? (y/n): \c" if [ $? -eq $YES ] then /etc/conf/bin/idbuild else echo " To rebuild the kernel in the future, enter: /etc/conf/cf.d/link_unix " fi fi echo " ----------------------------------------------------- Please make necessary I/O port address changes on the host adapter to correspond to the driver setting. Consult the BusLogic Installation Guide for details. ----------------------------------------------------- " rm -f /tmp/_blc exit 0 : # # preinstall for BusLogic 'blc' driver # # Copyrighted as an unpublished work. # (c) Copyright 1994, BusLogic Inc. # All rights reserved. # # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; ## Save previous sdevice file if it exists if [ -f /etc/conf/sdevice.d/blc ] then cp /etc/conf/sdevice.d/blc /tmp/blc.sdevice fi BusLogic Host Adapter Driver /blc/driver/blc /blc/driver/blc <...=driverDinstallJnew=.<..>dptr>.=..?Space.o@Space.cAMasterBSystemCDriver.oMb #)>>4[|XD7.kd,wx woë%v6!tKN[Xm`_y$$>uUzHU֟"Q7aŧ$9=6(Vq 7;(O0{8ngsߍvSoUj*~gLUCđ*,ҩ4K+/!e̖["j{Į/5THAylq #ident "@(#) space.c 26.1 95/06/15 " /* * Copyright (C) 1990-1995 The Santa Cruz Operation, Inc. * All Rights Reserved. * The information in this file is provided for the exclusive use of * the licensees of The Santa Cruz Operation, Inc. Such users have the * right to use, modify, and incorporate this code into other products * for purposes authorized by the license agreement provided they include * this notice and the associated copyright notice with any such product. * The information in this file is provided "AS IS" without warranty. */ #include "sys/types.h" #include "sys/iobuf.h" #include "sys/buf.h" #include "sys/dio.h" #include "sys/disk.h" #include "sys/fs/s5param.h" #include "sys/scsi.h" #include "sys/elog.h" #include "sys/open.h" #include "sys/devreg.h" #include "config.h" #ifndef SCSI_NDPTR #define SCSI_NDPTR 2 #endif #if SCSI_NDPTR == 0 #undef SCSI_NDPTR #define SCSI_NDPTR 1 #endif int dptr_NAdapters = SCSI_NDPTR; int dptr_DiskConfig = 0; /* 0 = Auto-Determine. */ /* 1 = Always use SmartROM parms */ /* for non-Emulated drives. */ /* 2 = Always use Emulation and */ /* cyls x 64 x 64 parms. */ int dptr_Weight = DPTR_0_IPL; int dptr_Processor = DRIVER_CPU_DEFAULT; int dptr_UseLocks = 0; int dptr_FlushSecondsToWait = 60; dptr I iHh dptr 0 0 1 2 -1 dptr Y 1 5 0 11 0 0 0 0 %0~m';y,[- F@”J1zaa$=Slg*HJZ{mE#v<KCX.*`Hl-O;4i>]~Pݗugd{>5nuܵ Yau}P$ohh; 6\4ׇzJd;.Xi q`Y#"xg_KJ fqsy,7 #Goj_~0/&{: =qwt֛-.BD+SRjH!Hi&),\9p3.*IIG';m6$N>K-?#J y]Y'V(2.PZ3UOIߑ uQqMS:d{J]*@?آnA%Ohb;LЩ˫6kx[]-VYO⻹A<.B e0_'V Uԟݾ=s|?#Y:5p3.^!n@DZ37ㆨ1L4'C܏U@}/.6¢=릤搫 =WI@X+;,z#0!=B O:Zï.X_^J!šEA#jCphFMGNQnz}1P/g'+~ECikI?h_r1>i?f9@׭ybܴ{hBfl/FBnFb\ ja}⽭ 㙱vN\l`+uW;\z{l "ק,JzuVnX(N~X^)TQ'm˭ַ C%2⒵6dDϩsӬ:O0>"@ Um)s /f/vA=IHEubI90C@rnD:&iXB^YlZO3da!DL,LU:̎rOS7n L誱܃>g|B2B˱XY%7'o·LiQ,v3Xm#; BnpȕJTLRE-]BTY| O#Ub֧sq[Z:**5TTQ3b~+{HdPdk3Q˒)b7mrR.k팇4doJ77wRw UkBh9l?DU= xMf ,T+WQqjs7gwgo~Ѕ:=+SG7@25I4RBgd^fF5Mefo?%yT}>FK,=$ՕMI˰NtDU1L3Z9yu6c(VՁ?*`马hOdp(lE'vEjP5e4f^@oO mI=Tُ/Q0u<k/=MLLU^<*lv;]S|#Qzق B02|yaF$ 6CZBUHGX\2'h dу22'~X {}' 8&k˼4 mXዟO#Y 4vRZXZ`·.4W|3)Nw.>XUnw}c"5,yE2 -Sdmt8 lZz鑍z0X31qc ]MQ|y۰b ިx /!=ݣS qQf{u9.Ud[oΌ(ȶ\U5 5~g&Tز=E)MO ӳOԻCH΋L K@X;5c$tEMO | e?ɗMIlTwQu3)1\>Noq4cdAN>]~>>{@ P*׎Mԍ S=PuFBY9X'I(#A#ONFCIGqA٦=<L4Z>hЭR-Ziqq;Dh|Z#XX7;7\'ipUW*NgJ\3:ʌ ƗNsgºp솈k:#'[uo ^;ou43?@[s J2zktj"rSȃOPAtj2aMy^@%ApPr,av7+Ru%'9zx"ΌzlB~,$ĉƍf2zC*6ԓ$lYwQO"/xEꏑ|>["~^Q헖C9dRpg9ꗆѡR$+HTמoJ sT`՜sqi lR,<:(bv?<{:>4eaK,f+ {9s=^fp@Zs$Y roc-^PB`O=%'GO5pQ@;ץr ɇ|utp;^Rv޸KWS#ߢp^m3d8_ɢ`W/ \6GZF9ڔwg~.LfsvHϲIγM;Fgjz1 u!쯛@t!\ô>.zadD .atq LbT#u 5ϰQC^eSSo 0|w|SQcZs.n&QIc0m墅FI; 4 :{f-$٘fw%;(8 \uixȽUz-)ފz tբ=dzvq~;Lm ZÕyMPz)|Ap8C' *!ynۍ|u\D**1*؅ކgƐ@帢X a%B4v2.3Y ``Fb&d%? hPڤQCT@8! ⲑTP|tJ9=0Dn5"4 T5/V2]&AI<\ TvWl>>_An twk^& wH Š!iQ23u>pxs0}ZOmT8s\x0fjAQV3.巴4gTWѫGTZzoႌCsHdأ.qR(YR4J3gA,T!*DQOn$`㈜(hJj+Lpم'8W _>Yp͒mh hX,]ZqiěD-gI?nx]=&ǚ3#K(|]`tIVB|+➸E{r2 :$$gHO,cB1^o 9?`!.GOA@zf1Dn>AM|~x[ |t5d~6g+#,rOYyם0JL5!߿\&#gXU {:f4\HRM>ùD6ha\pzAϗP1- p! ww2O [\pܥ8nXy5Hx%z5 umʕ~oz 8%|Ow3k=՝gwaeAlO΅,Do9w8SddmȬpXeںMMem#Z╵`dw Y\Qrр HI8 fjF 5zfPX xr{K1ŜbgZ{T-3 .naK$Cn|\HժL[3Խ(]L CwT .+5.u=s:n{EN0O&10uП{!M.?YN}#XWOM˽w/9h81|4A&7*4d3Y)Kw6aZI #Nu$GHWV~в |dV`<[lM1ϮgmZ\tfdil=AB'gC#o"<ԍJ>ן邡Hvom{upZ |X$\$1AY< xNoꁒ5ٵ5~~~\Q`E ѓ7FI'0e x`<Sx!G.-,%zTԝnQ'I#WTG]֖߶V/fwP~Ϣ~Y^p4vj!y$|sUP jDODO[L:4V 0g+>?ܮ+Z='╣Y)FOr)UqCvzҢJԗ|f*5M"ت"kt w#~0{L>QW/Ph XGCzYZQ`(j?-!Pm(n-MxaH+o.ʬrtԮj{%@7e1޳SD)LJ6˞$> 29)-XpS=pE~}& "Gˍj7AL̩%+Vqܦ<)=bǰZ?E!@#ec1v *KI]Uw7ᚈX kڙ(? N?gubi@R_(d=OP@i b~;~D?ln6ʊm!ܢRCc y "k2Bo{0W I=/i @=K\=˥QխSYDz[NCx",SR;Qv>yq]܅ j*ڣϟOݜΚR ?8Vȝ[==~u½'wi/y2DՂ̩lJY2[Y3֠F-A}Ԣ522\7[X&+4,InbB d+>%ZX,O`pv3_,9Ȑ Kϐڠ$j!܄=Jkb38ćõ肇ཧM?F㏆Ӕe )wi*}0:C j|;/OoשP=Gc(Y^;)frͱ̩ۖ`{fyLbZr]K:2 E5B{D^S%;e$|ܫ?BL"J=H7O܏Gcy.l`Kv]Dsu܅)| Qg<jqmx 犂~?"qO*}#5'(SpJ%ļP1kJ wV܎Vg*y2ew \A:юXjcI]v8s G$h\i;GmTGj6aѼmzxmU|[6 u[E{d0-4Z)A4 <?klD#ƊZngonn8|qxȺOZvLB}c<1@j nF2P=_&-B\~HN-f`46Qfe6^ zPPp>pNx+@QR9vV١hf NӳZL%s܈۵"Tg1ݏݞqv9xGU2 '{XfDSO>i~/`z8D ZȪքZ!"S\SV#q>q,(μmaJb`C$Z|Jڕ$aJ.I=NZϰGEU.}~>n ?4, 7Tpn$J\KG+-IprՃov" TJG Тn&X"ƌQ=Ciq)%Нw)'׌~6 |oRH4ogHby, >&ڴ*@O'r߳ǵv^]/ вźL֋*bo]SvkTf3糟I8xxT`hX-GulxP/Ookj&p8l+}vTXBe! T5Ak-P`{d>85ϭ+ԄKR<?0[tӝ UJA#!CPpd̀QF0 Ak@d }1-D1\~ݖ* ,R$w:OXk֧߆v|uaS? Dd:FݟPgWLriw3kr,TlNDZj6mΤcT/a?m}vv`۫{-/KJ< Y+ A؃s-t@zR3H2`쬇ːOFVݗDfYُ~G?RW7xqų krFR^ E2ֹᷚ9x-0eFEqNq@,1yNW[T$ ;V9HMk*1sO?c>[Y-\X'J!}/@ >2YMg~D/dϨ?Ico7HuJٵN5"EX)~TO Pi Ob9QwlFW!QR I b=x̄ށS#+\/@Hnۚ CtȆ\ށ jS6B!?-EwEdZ[Eg@hwng357DcGORLvf;5cޘV08$ʌx-5N`ԋNCĵAi w1+E1(!jR)`bq -KSNƢhmLTwG7:n{ IϰG (+ҳj=~!m\hw(W9+lχ.2Ȳ/^ yc(Ӧx5.8!TO\zxX2%IvB?Np9[r;0=!  itsذ'W~<_\QD'mqJןuXL]0Kn7 q"';#Pp,6 )gh,ٔjf1erO%M}3HCHA&b:^CN9P4ÌpǴ3෎1%;w|uT,~t!6ciB0vHL)d7pqInjض.0(`#х:N{څe:+w"D(Zx>\/"Z"̵OA#bQ/np][uJaD4/6fSi ҃9dZij뾔H~NET3mʗ/ʓ`oNEm톗H04_UA VE-) /3*!BAyGE;h= >y+ϼհ=T5ll;o /\._Ӝ)E݇dEcYaqd^[{U޲/ 7*ߐ$6Weʍ []~/X@2t1Q©'xѷjhX̴sJiRsPvXz>mO5\j}>ڣT{D~CE/j͸g5nK!5Yl<}f%X&Eߪ I瓚z:Z}D Ĩ=8+m3DΌn/ *fbx~ WzbG+b;KU}fHNCzY,2 \b';JFXe?ge{k)#o^>a _lΛٟl2/aznde$;{k(NAy*OLCܻ·YcJ98 gqi SX#U]XS:\{( pN JWQoqʴVⅳ"7ǀ ^H|2~ p-zEi<^ {׻VPUTUW**"(+0*ҡgmUhƚjk򩩮ƹ\SP̫\f*LLE-KMML??f[w|~G;A]rG,kxO#,j&xcG3^-{D7:z?,ڔ\{Κ;=ZvS\r:rBy"kDbU1Ø:)01'nT-󓘻xL(}o϶&rs ynJOA[k͚IK!.yq7#C!_Z~r*NIMo]ÿ濾~[CJ(dD_g^lV5xO;\@{U,d]GY$^(1/*t [&"?v.b"r"3)k̖K#=d]FD/7Sс٤tv'X~^4|nfL-^xemmG:{_sakxhB2{;FL#i8"#]|\n%soU_j=WIoHຍ:哳^|ljI&N˺>H䥭KVC[1 3 _wo%fyCzb!Nڙ\IAb2X_]?(]_5)I'S)QAkc%/˰_ s.Y(,^b_e[/JQ,b]ݗrɸo\P|ŔM~nwݽQv1e(zIWr/?.[%_gt ޯzՖy5yjܼ,>!iGSbL]&yxQآvd]k#ywNP"P[`]kiXIoP2a-v|H׹>rlKV4xbܬ f?i(WIXKRctqRܒ*5-GGQdK9TdX©lm~>8F_ޮ.EFo^Rp/mT^޷ste~rh1nmq:}$/?jt]5)qU}1QqQ{؛_R?nv-N8d _6V[fVX1sr(o{cƼvL4wr7~E=S~Ns]UHS9ϔ3.Nr)9 NBFr?NB✈'!IGYK%Ș?•22DzI9\ǮDǦ'ڜ"Y_CR/. =b(L;Rf3*yI[Y,ů1v>Gq7,D>bs9o4HJf=i_j2RG͔ddNdz_Wc#,dlCO\*)r*D>T~MZ)֌P\QnHt#s̺p;ؕF"?VcS~Z6,|Ǚhpp;7 "ڮPւL^ ]gMxLʤ|zjDq:'P pK>)=s WM"G=-TA)G$zqkTW.1Fͅ{.-J>wR[/Xaaքk%Di<]1rէ0D ash9M\MbM [YQ$:PY:XEƊ3 GG]CH$Jt#j,hk9VOx;5 5i@ed_Gv"p3-,#]ENu$pR̴)WH1h׬/[_ķmSm(']w<8)AZ?v˺O&~b'+R>z6_ݚwo>n O=f=j?գU">_^""Qyf$l=f/5ůs˧akߐ tgl8VOZFoRp^TsRku_Ul=^> yie|*N~gc?JU/zܰ!sX^D\FTأ ا&Tx tV9{yOE^ ?YakXZ#Cu%I̘t"QmN\wD>bxŊƼ5q#IO%e/2gCDMYzT[uJ}>]J*bpg*ݤ~t>>K%`}@/tOw+`r\6[Vtݓeuz)Un2xP*'>ZMtɻ̞$]c'iK)E%^Ղ8fW :tҵkFNJWh]յvUڶJ(ihNbU]6vvݽrqFNжvjKp޵N+5y\l1ʕOPE$ UT[7T=S)e02"h_Uxg}+It-8VwɺKg(Og4%n+7hLJ5HĪI;Iƭ 1V=w8vW^޴dY8_7hd7j^v6P3AUTFT$y2(r1R* +nJi=NkIүf!敭[W>)ULUM⦦zTU?RR\{K>|_t{")ٗ4KsJV *ef_vU*}y}/-ҹIĚ"*,O#NI*M,D3Q@Hl +K$Zќe /YQAzPNElRn%kw)Tw6lQUNʿ_"ԐޠX"\ʺt] 9HIJ֗W 8rGlJ5jNhJJISVxWFԭ] az *:W hQmrG?[J\"zRB;:4fɹ꿊ޅ`4W8&F 8-8KXvZѲlաʂAMj[e:ea`j~YNȝ4z$u'ĬٔL垸,t~ҵJ= %ʭ  Q\Z)Z.LB4hrv):$1W3-S1hS+%̞AR-TaNWRn0ʐs  S `G^A-]iH84bAϦ\AMzvQx&(QЎ] 80GF#B? O2 OxWhñ:Y{Z&v/n31GQF(=HfoGaE3(YPXAR B>?@R B`-EUa6{G(2Aj3Ax㞌<+b>?hq<}9ph{߈pL-@[wGƚ!Q/@u>q8X[}0XGW~܀샏#=nJ Nrߏ T dt.{pMn'gۉq87y}7G Mr@5@:=z)ʏ<R#τmB=(G` ϗt9=d *^P:?/u<]b=qm0N7Sg &tAt?\-n亞< ]؂I[8sv5 kUݎ3-v:4Ѭ  q 0|6wn`}qH:d|ϵ x]Ws[~z2̈́{Џ ԋUƆ| PBUnA򽾜5?}8?x~4wP TQ~:߳/ǹ/v4w΀_xτ笿;}91[bˤnpB0wB`/ÀfA|OB\X| m{'OQ\ bdZ-ϐuɭtA3?p C"&.aY][|0PGhȬ -U0UVi`r#Ggpw>)`FR0gl1N sX3q`an/p8t~ ۘK kgB>>7 hpPD>L:33gg333 3^Lk&vWj,9as6?ÞG nP|T҆Z-%!>h g(vV݀bx. _^;uS?C,87$ lI<$8z `9dq8b R8/qGgeL70 @p| @ʝ)OlL DbǀX x/8ǼpGŝ[>ƒ!mf,5GŞA |`<|mG ~Y8Q9a,[u@3 j0H-c!y8~v7@ˉ;}Ɲ30ƛ`Nq|LqX{c䅿[0t`Cl ؼxnj< <393ǝ3Z_?#@?AשGf8gfMnd̉Q;6#L2|@1G @Grq {G|@7AT-Dow?2"~6D7ȜD9 : >  aΆzFH?p3#Y3[qɜgg.Lj=nLKL?&}`P=arA qׄl?SO4a 3f$lt٭5r +i&sgl6,ĞlO[6z=vɳli6p_}Y[M&am(sV)AS(vϺ|?+(vyAǒyCܩEGX4}{凉;ebwkx ao(_a \$<ӈţimi}i E .Vԭ:ivWfN"l?aii?S0ӆ8tp9\Y[8rqrkÄl#؀ ۮ>8}[gU*R|H4s{5=<$ xÜ7i03ÉD3΅^yny+Ly7|)OYyuL3G GZ4QeN:„PGН3:gȡ:g͡:?˝3˝ ˝3܄~f\yJΙΙrG5tGLF ^!eC?QGFl B>x#`V؄~-| *Hv_0)Dz݆~GEn:`t ڔzҝ3?EG Lh4b鎏 YS #ژ>0y6L;`o{0:`~P[v`V``.l>0x/ׄzy;g?q7sgÀS[7`N9E?<l=[}G*ܪXj9pֆ{Ϯ"@jNeRn5&^AT$M<8^ؐvJlA^r=[7U8vzG,^t :r+gNLϘWԀUQ-QQ Yd~[{&Gё̏W[GbU]fhg`~Q"ڴ5ASpGH?A)q#z!HPb?!Ղ@Ŭch\ ( d@=fڀ >X@w;@tm@y <`40p߀UX 2pːT?X:@Ft p ` /t:pX^b%о*V472#8UQ .ZHK1RȤ!@B\[%0P\ -J M G/5n: zEK҈TuF$ר髾AC8HwhY w,}V ΋CB?<C _H.< 2In\Au^\J>u#&5rmBB\QJ8,o k6yŘLuc"C/CZ 3fHvYh5ﮋ Hl YZWч""0jK4d66EcUA-XJ7%pʿd7BQ ؐC!PBC$4p$5Xm K  p{bCv^3EȽ!A?pX䅲(~Ps0n( މ Brr]z:ACJHtP$!Y  uʺu2ɳj:L7Nthd"V>Hl!B(r1}*wM ?M 8H\yTdCAEƵtbeNZw!mXNFZh(Lm3L‹-z56M8ƕ.+/[Dh}/":ydsѯJ5o>MtHm#`!8зiYT&M:.*"؄Ќc *O:L|T 3DžXۆo)\f4sӪℭ-+:k^ՇAl4A=Bk:d݊}'[2,o:鮍'j' J#[T'阄DM$`4\rv$P[2.2jc>v]hhҙaORviW[(iJXJx-L-ԝ` 4TM„ K8ҁJ,[P@3hʤy(tXIUCMݩ@SU.p޴ zn(2^BΗc#f#nl{fZP1o Ud٫F Υj2j 5T *ULƪ)ljt)i U]:FH{fӵ .l'C7\T$`h([螵t 2rɛW|qHP/lrL11-7Wu ov~FbX jV6J jN+ 9\hT₷QЭE#FpV24-hĝ;ŌP]:ea%:Z]y4?LWt0]4 X![Tv˗$eU&{^H/dgQ7NɫBף^2y<#(InC0*6 YW*gttp7L3{[Z^>YDC9B $P$lHA^"_ʘ= oZL*B-Zv:FNqyU\"%SWO9SA@Y@b@?G ܪF) *TeyUI4,#tֱe UUdgPNPuaRkx-SDOj5̝%*'GӐ+ѥ"7IRw#91Ft .oM#Wz:t 0,D)7Di D.<..EpostinstallFpreinstallGdptr.nameHbtldIdrivers# # @(#) postinstall 26.1 95/07/12 # # Return codes : ${OK=0} ${FAIL=1} ${STOP=10} ${HALT=11} # Trap signals, exit and return meaningful code settrap() { trap 'exit $STOP' 1 2 3 15 } # Ignore signals unsettrap() { trap '' 1 2 3 15 } mscsi=/etc/conf/cf.d/mscsi tmp=/tmp/postbtld.$$ patch_mscsi() { unsettrap sed -e '/^auto/s/auto/dptr/' $mscsi > $tmp mv $tmp $mscsi settrap return $OK } # patch scsihas file tmp1=/tmp/postbtld1.$$ scsihas=/etc/default/scsihas patch_scsihas() { unsettrap rm -f $tmp grep 'dptr' $scsihas > $tmp test -s "$tmp" && return $OK echo "dptr\t\t\"DPT Raid Chipset\"" > $tmp cat $scsihas $tmp > $tmp1 mv $tmp1 $scsihas rm $tmp settrap return $OK } #main patch_scsihas patch_mscsi # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; DPT RAID SCSI Host Adapter Driver /dptr/driver/dptr /dptr/driver/dptr J.<..KetcK.J..LcopyrightsL.K..Mahs5echo "Copyright (c) 1990-1995 Distributed Processing Technology" echo "Corporation, All Rights Reserved" N...OdriverWinstallO.N..PesdiP.O..QSpace.oRDevice.datSSpace.cTMasterUSystemVDriver.oRw(Y abq,Ux)xl^9 U [pD:Ay!T,pO?I-? 0zJJ&(|1"!E'qA>߅ IŤ ci]iPv66(O^??SѦ4[x?x8S Z~=wПw]NwG4 qr 䢳[8_dP<<ᎲWAinGeQIXP"eP-ɤ%:{,ŌvJ_$h'V_d+MJli)\(V(Hc|US mIXFriT vxCexf'; ƒ 3CT})w^'~Ǖ] '?<,ٿ9mNOYrguΙoJ#\6UNf6@K0Nsvupj~8E- w4>H[j#BߍΘʑP\Oh7"ӟkְcgTs˕Ɵ1q`3y|k~fR9 dp[@H;6b!ݚ}|JslN;`6:8Zb1)g1惞 $tSb  ;M%u[BQ_O"UWlolNřCM .,dM=˜B _(_IOy̾춆rϳ=| .[ki]4mTOC Ah0ټ; z XSyɮ&e>E+(wlzSPE vF oko[r0z52UZ ɰd"fmMv7v^UhOPF՚Ҡ&=px/O4moxWsKmA.Jφǯ$a&[XFkaOF [Ύ,n xO@?q13K9-e1%'o{3TFF>}4A5xLM'}DD(׌N'o>o'v;lN ![Pw NY0243 bu26$|;hka&u?o%^_;L]N &%i٫sKf|gMm@vOH[c Z\s<l;S& .|z1kYW{ac h]m)>}Y+͖ d2N͒ciO~X0diw&Pc?hg?{CZs#ܔ1G4R"A"$)y|ƿ:ٶ| lx)/| (r:46gqPtFAF ᣁtZU뱜9v'\'v?d!'֗#o;rr/B?qwaZjKyf>Q}eVt(J(|ڀ<NۘX oh5LP-E'!4|rcwit]-?'Vh)%8Վ>uV\;_Ԃ51H 0=H"&1{^(i\׽-}XV4J#\6 V\]Vku^՗7V^r!yq_VݘN-Qr4jeXhc˖kJZpStVpA_5 Glf88@_4<+H|qUM~ p&gNzF~}h76LWMjmoZ<=2-~8v K~| fvVsu-?Ӹ[.WNƟ>>F,<)FߏhpNP->HcWhO\uV|0,O[Vb#OGo`x019|9?<Uď-kh0tOZ^'Ѵ_W/v [EȠcۆPF dkޢ=a:WU]&U[2B=XFCDNt2aNʟC([zt/M&98GQi{}ȋ;>07dQA{ЊyXmtyF<>4jBxQBOm b%_cW~絼KCݬG& o~!ү5x`~YtZ;31 2{|&n:gFF{Yp0<=f T& @ddflrh{NE@[#kr@ԯHwiv'Gs\H HylHzkWKOoa5p#SB%n`0ЯJTlW"6_pM]/r\hun\kT>vKXc1|.vCnz1|d{?[S?A@9˭>vA"FM֊QٺnHؿ&֢O{'mĵ֟W7h{Z=3z4xj;xj"Z_^yܴT=;lFa:կ@b:׼|"v0js5[#?=}#T͝]~_˜yÖNh> racg OƉu/ ~ 䴬WBh׼~K8Q}ޏ;:n6 NkA #L?AUy|P֭{ O<7V!2lJ_ȁ)JaNz=P4A (+ FGzc-@]UG*/O>x7Gw~t{/ޯگo w0 `V9>-97[U*tʗ47JӉ:U(Q jѺ~'':Ψ_8wT8U.ҺqJ+$uT)yG9ϰJ>`>БXHܻq# $q'[ pq QNTɜ99;@@JHԜQ ¾i#ƾRꑏB=Y☥o rlRcا ا7Β8/bhM(Z%bXM$ JۖI[d$ؒЖ[Z)df~xwff[Z9m97ӱ ( ?fwxؔJHfD)~ܖG?@G"v#^TIⓠ~LRv?x86E0``9 3'N[NYcsG;2Уh3"z@#pH؛;6pN'2$w$9 `>Dŧ@qi΢-0 {^@ӔЁ@OߋNbӢ;NQF%z10s%#ב?$Q;'P8+&KR5'f%5.?GH@S%6DO wwN;;rcr͝ЉV9:/&} 90LII'Ԑ34>> :W`HjdZFYt2+sBDțR:݉8xN %d9dUx=sdddG{B#['rdubH찉mp8' z|!`G'7uN A;L& aRO@TRH#В>HTNTʏNܓ—>W1yN/ 2I,^dM-dG$}f6=(_ N?2a$ ҏ"zbȞЁ#tr:= c ϑ>=+y' eӝǦQ Eȝ9 u=>F=R'O܂vfOʐL Mr0-K?-J{āW>AaӔvO~@6t/HR)G-R#"| sģ tS"S%%Do@oр4y$ ' 8D rbrrw/LI>G!:W;Rv (L^1ĥC})ʑ9鈟v@$1%䏺&Db;<B^ˑ<^'"}#g$'Yw= H?Pȏ#][A"uP{e x\a^TU|41O"> j/ Xbam% ~1PȏUUmz0obڏQ>.t=dU֕U XboBrJߨ.CA"d(>bt<=|69VFxDGT$<ͭȈмlDGjquzPuLGa8?}LE t (+<%S`!{U}i4u4!с|1 iCUp3K>Ú_!胡_3sr/Q~FL^UC#DUHBΰ  ÅR<>yۺR9K<)5 @;FI?/7-#=C*.4LJ  !'+&%326$:8 GD40 h0d"4!'Ќ 050TH PW^q g0dp``Џ@@` !\`phpЎ@H(*,@GNP_ Lg@mrPhx h\p t*dp G` `  'P,4Ѝj<hC dK$T[2bkps y`t`p 0x P__iobopen__lstat32readmalloc_iob_cleanup_end_svid3_cfsetispeed__ctypestrcataccess_environvsprintf_svid3_tcsetattrfflushatoiatolperrorfreememset_ctypeabort_etext_svid3_cfgetispeedatexitrewind__stat32kill__thr_errnofreopen_svid3_cfsetospeed_edatasignal_runtime_env_init_features_vectorsystemisatty_svid3_tcgetattrttynamecloseexitfopenstrcmp_svid3_cfgetospeederrnofilenostrcpy__statlstat32__fstat32fcntl_lib_versionfgetsfprintfstrlen_runtime_r_select__fpstartfscanf_GLOBAL_OFFSET_TABLE_memcpyputcstrncpysprintfcallocsetvbuf__ctype2fcloseprintf_DYNAMICstrncmpioctlgetenv_on_everest_libc_select_cerror/usr/lib/libc.so.1$CȄ$̄ЄԄ:؄*܄-  '21"D @%67? H$(),+0;4G8<@,D5HELPT/X0\A`Bdhl>pItx |&= 3(L5%Ą%Ȅh%̄h%Єh%Ԅh%؄h %܄h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h% h%h%h%h%h% h%$hp%(h`%,hP%0h@%4h0%8h %<h%@h%Dh%Hh%Lh%Ph%Th%Xh %\h(%`h0%dh8p%hh@`%lhHP%phP@%thX0%xh` %|hh%hp%hx%h%h%h%h%h%h%h%hp%h`%hPjjUЌt hЌbETqRU RPR PTjÐUURD]ÐUUR4]ÐUU MRQ ]Ð;UU MRQ]Ð;UU MRQ]Ð;UUM RQEP ]Ðt&UU MRQ]Ð;UU MRQ]Ð;UU MRQ]Ð;UU MRQ]Ð;UWg'| P}!_];hjth`jh %!jRAj Q'j $:$t9MjjjN$jjjC$jjj8$hPj,3a;;UWVSE uu3Ft63P3DPRo tLQPB D GuʋRo[^_]Ít&UWVE }uu3P3DPRGo tLQPRo^_]ÃUWE V3SËRm QAotu ; t utE[^_]Ðg";u`~\Pi"Rk"EHPV Qentj PaEHPVR;nO {}kt 50u30u(E u@50u30%tV Q&a׋EGΈ  ;tPnUPW3VSRJl Qmtu[^_]Ðqu;UWVERkQmttvqtqEu8t 9t1u1|7~3tGЉE<1ufEu^PkRmttqu ^_]Ë0|53t GډE ;EE;UEu j.]Ãt&UEu jj]Ðt&UqPtREXh<}h0}EPEPhH}MQ ];UWVSjjRk 3 ;~j P^F;|G|ދ Qk[^_]UU MRQPBk tU RQPk]ÐUPWVS3q;}tjjhP}? 3 ;~eEtjjhl}U jVWT <vjjh}-jVW/F;|MGqM;[jjh} t $[^_];t&U(WVES +‹U +‹UE‰EܺxD<u(jjh}n)E E[^_]ÐUE؍<DE@$t jjh~"E 벐]Ct33}u VEKQWPCPShT~Rfjjhh~EE,VEܺDtdEܺ3pD% 3EVEPEWPQhph~Rjjh~SEE,EܺD%tup;ppE}u {UWV3S3q;3ۋ ;jSVjjh~jQƍ +‹Ӎ +ъ<v7jSVnjjh PjY~WSVx C;}fFq;};[^_]ÁU$WEVSluE;ESU MRQhj!j+] +ڋPh j!j+jjh hjj$h(Zjjh8Ljj VBu jjh@+%3`];}f<tI3ttpRhL6-3 pQhP6 hT6C;|j jh` ];}4<tDPhld6hxR6C;|h Ry`j jhCj jh5h Q_j jh4];}6<tD@tPh5h5C;|jjh ];}Dt'<t3PhĀ|5hЀj5C;|jjh܀l ];}p3E܅u <tE܅t<t ;3t"3pRh4;h4C;|h Q _jjhjjhh P=^jjhjjh@];<uh ^4;D|@$t}E, JHfJfHD|@$PEEPHU;rEPHEMQD|@$PEPEP3;;D|@(tPh83hD3hP3C;[^_];UVjOjjQjOjjAjjjjOjj+jjRb3EP3PQ_ tPRR33ҊÊU ;~‹Q_hPY [^_]ÃUWVShR+Z33҃] ÊU;>3P3EPQ5_ tPRlR33ҊÊU;~‹Qn_hP%Y [^_]ÃUEUEEE EEPjR( ȃu ];EtU@EUEE EEPjR ȃu EU];U|3WVSMMEċEjhpREucEdjjhpq~jjhqpK;jjhpqRjjhqDMPjQ EĉUqEPPR t~EEE؃EE䍅EЍEԍE܍E̍EȋEȾ8tFuE̿+%E3H~1UE +Ƅ/MQ+[^_]ÐUE +ƄE܋ϋu +M3Ɋ ĎD M3x ƈLM3 ƈLM3 ƈLM3 ƈLE؊EE苀dEM%PPQ uNtFuU+΋ +ыM3Ɋ D &;jjhpqjjhqHUBEȉUŨHHEȋEԉŰUЃHHEԋEUЋUHM؉EEHM؋M܃HM܋MH;ЉM&;jjhpqVjjhqH#TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~MQ7EU@MāEUMXt&U@WVShth\u+jjhpqjjhqj3EPEPEPEPEPEPEPEPEPhxW,؃t-jhEP uEuEtFuWu+jjhpq,jjhqjr[^_];t&UqWVSuUhhh ,u&h EuD3[^_]Ãq,REtEEEpXSVEMPEQPh,,Rith`U QPERh\hTh@PMEQPk(LEN;UxWVShd}hh EظЦEئEEĦE̦3ɉEMȦMUERMQWPESVhP EEUjĥVp jhԂSX Et^hEERUQPERhhh؂PvEP(UȉuUEBU1EUBEUEEMEAUM,щEEUUM,,,MEUE܃]SE[^_]Ã;U3ҋ$WEEVS;G hG(t,3M ;~#O (;u_$FU ;|Gu7G +‹W +‹W<|GEEࡘ33G +ŠO +Ίx<tt3U;t3uG +É<GF +Š%;qMAM;4,UBEU;w[^_];UPWVS] fu#f#3~ ;tF;|[^_]Ã;UqWVSl fJqfH` JHfJfHhhEE,3ɸ(MMEURhP t|<#tڍ3P3;5l=:u5mFuu3EG ,;E}K= t\uEPkE[^_];3uE=FGT0;|E0 3G;d;3;5`=:uQ5aF3E,GE;}$ =:tE=FGT0;|E0J;3=<\u2EPhP tPؿG;UtUPR HMQPcU&UMBUUEMEUUqWESf fMuhjqEuhjEPE PR^ thPjhE qHQuhbjjhuh8PmjjW t;u /WhWhW$ hTh0h$ uh4jtjPjhdjh R4Kjjhh QuJqu jhqjh8q<t jW}PSV qtj[_]ÐUj 3]ÐUj2!]ÐUEP7;]Uj!]ÐUj!]ÐUjU MRQF ]ÐUr<tZffffffƀƀƀǀ,3]U$ t%=]Ð3UWVrS$%=u [^_]Ðtj9thxjR8 j@HP@PP2f@fthxjQ8 <thxj@hPz8 R,P,@,t2f@f}'@uhxP,Rj; @,t hxjQ 8   rHhxjP7 rthxjrR7 rt"hxjrQ-YPn7 rt&hxjjrP-P97 P,R3USrrƀ PСr[]Ur슀y%]ÐUE]ÐUE@]ÐUrf@f3%]ÐUW}Vu S]f|1Nj;}$f|f|Ƌ ;} Ë;|[^_]ÐסrҍRщUf92u f9ZfEf0fXr$E@*fMf@fEfM@DEf3EfEff32ۡ׋EE֋EM%~;u΋EU%t?jjP RIwEf=uf}f}R,P,fF ;yEf=t UfP: fUfPv@Ev~IEf f f=FvEDvU;~$fHvf9Dv~MDv@v@밐HvU;~*f&f f= f&f=~Hvϐ3fqf=t rPh;hj$$$Ux,$P0$ROP5&EP@PE ~ $U $rRfP £jjjW-$rf#rPyx$rP(rrfffrrfffrrfffE~ $U$rRfP£Eu&rf@f=u Er@EU$fPjjR Q1$B3$  r@r@u2rf@f}$r@ur@t r@tR P jjPR$B$@$@ $@@r@urf@fj Q<$x8EЁ}tҋU4jPHX~1GKjP_$B $@ $$R P$ttjjPR!$B$@t)rtfrQ $QrEEEE$fqE裄r3[^_]Ð3%$" rtr3%$" t^rPrRvu $rQrPGu $$ururt 3%$" r@|urt 3%$ " $@$@$UWVr@t^_]ÐTrt/@`uދ@0uՋ@HűuV@uL@uC@Pu-@tu @Xt(@Tt@`u @0t @<hf3`UTr]ÐUVrATITJtJ<JP$R0PXf@^]ÐUW}EVu S =U+ 5M+E|,E|%PURVW:u؅tS=u 3[^_]Å~iCDEVj EU Qw t8Vt1uE] ʍC؋fH Iu]uE@E;|$f@ fCxUWVE3S@EEU@EE@;։EExD@EEDEEEMQ莽t$SqUfq3ۅ|7t RQtE t P2C;~ɋEPREQtEt RMQ[^_]ÐFE;%3UUR]ÐUWV}ǀt,%=t8%=t*`u"u$P,RWg^_]Ðt$H,QV=f f=~t$π@,PW륐UE UPR Q]" ]ÐUrfrftnPhTlP腺 3]UPW=rUhxjXr tUYr+P|$H,Qrtn_3]UE Ut J(3]Ð!J(U$3ҋ U ]3ÐU$3ҋ U ]3UWU Jсutu _]Ð:񐐐U8WVSGbEuhrbEEturEEKEthrUR螸W薸D0=~frWPkP_M/xEG/GQWuFtr@t&u"[^_]ÐE]CPUÃ㐐MQW^RƃϐUWVS] }ut9=ht-$uG<EfG;X}̅tH<u u E U@E;uM;t2EUPRPPWEfEf@ !H(  P(rƀ ffP: f@<ffffP$P,Rˇ[^_]hxhj $  r @r@t%hxPr@>E;r@t$@$t7$uxhxjrR$ P$t&hxjrQV$ hxjrP0 rt*hxjURrQP )3E;~ hxjrP|R FM;|$@t4$t $ hxjrP 3]U;} FC;|E;}  F;|UEډE3[^_]Ð$t%= t؋E+E;}؍EUPESPRWE~3ۋM;~U= CM;|$@@EE$t^$t3 $p<$@Z;~$M@Z;}$@ZHrt8E1rt$U@Z;} $pZu+M;r@t $te$u&hxjrP$ $@Z;~$U@Z;|3ruQ3yrt=$M@Z;}-hxjEPrRPT /3M;~#hxjrP+ FU;|݅3M;}}%J,;t.hxP,R%Pӡ P,%=~ur@t `PfFM;y}u]NE+K| NKyEUPRWmEUME 3YUWUV3;S|zU E;uvU  ;tiuK;~}ӋM +֋ ;uK;};u;E] 0؋E+;}M;uG;|[^_]ÐFE;o琐UW} VSu:ׁ}tʋ|M | MX,F%V~ ÉFG;}qMׁE}tʋ|M M #u$%~ ÉG;|[^_]ÐUPWV} Suׁ}tʋxM x MX,F%~V ÉFG;}txtGׁE}tʋxMM #u$% ÉG;|[^_]ÐU WVS @DEJ;7$EU%=u:EU%=uEU t3EhxU%PE%P+UM P,EUfERD Mq;}3] Q(@DF;|[^_]Ðr@tEU%=~u` EUPUERD Mq;}3]P肨@DF;|Сr@t r@tj j ffU W} VES@;| [^_]Ð U@O;xE @ x@xE|uf9tPfEf9|fEf9}2 @D4;s= u;r;u$fE-UEEOU;}GJUWVS uU @;F;|ߍFU ;~@U;}ff9SB;|uQr@t<hxPr@t+EЋEEE;~fU;}fUCEU;|uF@E[[^_]ÐUWMy@t#Q<fAQ:fGy@u_]ÐUWVSEu x;|MQ[^_]Ð}3M;~+}E@P P EPU~vff@vffDvffFvffHv]ÐUEfG frtIrt:jrPEjrREfG fjCEwPf |܃}/jj CEwRPzf|jj jrHPQ輞 POfjjr$P蘞P+UfrP[^_]ÐU x]ÐUUu ]Ð xh|EM QR賧 x ؐUWVSujT\IPBIGDGDtdtPjHGt6PIGGuEtGt WRHODQHWHfq3[^_]ÐGUpG fGfGffwfE fGfEfGfEfG $@ ‹Uu)$@ ;|U ;и3GGGG%!W( G(!O(% G(!W(% G(!W(% G(G O(3fG$fG$fG8FfG&G0 fGjjEP>jjEP>rr r TTEEEPEPEPEPj83E[]ÐjEPrQ= =tӸѐUPjEPrR= =u 3E]Ð󐐐UPWVS$@4EDFq qq % q ‹q q ‹$t:3ۅ~4MY$q;|Y$q;E [^_]C;|UWVEuS>fFfE;t^3FFEFFF$;|F&;fF&FHffF;~V赪ffHf;EfFV薪 ;t5EFFt V F ۈF ^tV袯[^_]3UWVuSNjV< U RVR؃LjF[^_]ÐU8W}EVStEEfG$f9|fG&f9G&@GEE }*M+;~U E7M ދE++ÉE1E+‹ЋE ;}U EuE N+J+‰EfG8fG@3EGE؋G EGEE?GDEȋEEȋUȋ EȋEȋ ;$@8$@8 $@8$R8$@8 $@|tR$@| $@|$R|$@| #EPEȋ EQP&: ;u1EfXfpEfXfp$@ $R E؋UfpEJfpMEIME }E+J+‰E~b3G_GE܊GGfGfEfGEE~f7W舧MEIɉMEfGEfE܈G_G G EЅtEjUR+‹MQPWGt W;tE܅tWN[^_]3UPW}VSG@t WGE$p 2@E̡@EGW‰EG Eԡ$@WPGtG t?MЍ |2E;}+GU‰E؅|EȋU;} f fPG(u !H(G(t  P(Gt @GG G G GU;։E|;} ;|]E̋U;~EċEЋM+ȋUGM‰EEȋU;~EEԋU@wM+ȋG EGDE$M@$E @PE @ PE @DE@t UfP: f@>Euf>tff} EEEuf>t EU;~E EEEEEf&f=EtLx|3ɋ׋tJ;}})}MG;׋tB;~E;}}€t}M;|׋tJ;}%=u&=u Àt3EDvUB; DE}EU;Xf&f=~jUԋEU t!UE‹UPEP Q UԋEU t!MEUPEP R f>t Ef8u Ef:EUԋM;~ UԋEfEUԋM;} UԋEfU܋E‹ R:;}UС UfP:EЋ MR<;~UС fPEfMAEM܋MEEMMEEċUMUUUU;}  R P G $G [^_3]ÐU$WVSE@tUM+E}EE+ȋE;~ȋEU;$| E;~EfE;}EfECUME;ىU|EP P E܋U@<ЋE܉UU@:ЋE܉U@@E܅[^_]ÐUWVSEO~C@;u S1OEt+P1EtQp1EP谁[^_]ÐUE UtB^]ÐBU W}VSwEE W%EE %_EKW ڊ@ ueG u^GuW@uK @ u?$R D;(H;$@4t*$@4H<uG G WV[^_]GUfP>G fP;u @;t%SV@PP[f0SfP$@ E = t8@ p;~ @ fp@p;} @fp M @DRD U@,;t"hxH,QRgU P,$t&hxjrRc$ MQXr$@,P.0x u($/Ð4x@xLxXxdxpx|xiiopDskSromStpxxxxxxxxxxy yy$y0y.v-^h#i#0#4   liorkpCKEYPAD/dev/iiop/dev/iiop1/dev/iiop2/dev/iiop3/dev/iiop4/dev/iiop5/dev/iiop6PHYSICALLOGICAL RAID 0 RAID 1 RAID 0/1RAID 5 RAID 4 DISK TAPE PRINTER CPU WORM CD-ROM SCANNER OPTICAL CHANGER COMM SPARE NO DEV ONLINE FAILED ONLINE FAILED FAILED FAILED RESYNC UNINIT This utility will allow you to view the disk system configuration. Disk drive location, status, capacityinformation, and other useful information is displayed.The ESC or KILL keys will exit the utility.Press any key to see the configuration maps.ENDA scsi map will be displayed showing the scsi drivespresent in your system. To configure a drive intoUNIX requires linking the drive information into the UNIX kernel.The ESC or KILL keys will abort the configuration.Press any key to continue.ENDCould not obtain PDM information from first IIOP.Did not read all PDM entries for an IIOP.Ioctl failure with IIOP driver.Could not obtain LDM information from the IIOP.Invalid mdevice information - no 'hd' device.ENDPress any key to exit.Press any key to continue.Press any key to return to the main menu.ENDrm -f %sview.tailclearPress any key to continue.Press any key to continue.Press any key to continue.Press 'q' to exit or any other key to continue.No device is PRESENT at scsi target id; press any key to continue.Device already has a filesystem; press any key to continue.%s %s %d %d %d %dDevice selected; press any key to continue.%s %s %d %d %d %dDevice selected; press any key to continue.Enter the 'SCSI target id' to select a device; any other key to continue. Enter the 'SCSI target id' to select a device; any other key to continue. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Controller %d BUS %d Firmware Rev %dSCSISCSI target id INFO Type %s %s Mb cap %4ld LOGICALINFO MB cap %4ld Id %4ld Status %s UNIX INFO File System %2ds0 NONE /etc/conf/cf.d/mdevicer%s %s %s %s %ld %ld %ld %ld %ldhdrm -f /tmp/view.ns0 ; grep -v '#' /usr/lib/mkdev/perms/NS0LIST > /tmp/view.ns0/tmp/view.ns0rread_ns0list: could not open /tmp/view.ns0:%s %s %ld %ld %ld%s %s %d %d %d%s"iiopDsk"rm -f view.tail ; grep -v '*' /etc/conf/cf.d/mscsi > view.tailview.tailr%s %s %ld %ld %ld %ldiiopDsk%s %s %d %d %d %d%s"iiopDsk"/etc/default/filesysrTo view the system configuration enter: view To view the system configuration enter: view wCould not open the output file. /dev/imsOpen of /dev/ims failed, terminating! IMS_IOCTL_IS_K2 status = %d IMS_IOCTL_IS_K2 errno = %d /dev/nullwRedirection of stderr to /dev/null failed. Sorry, minimum screen requires %ld lines and %ld collumns SCSI Configuration Utilityƌ֌&6FVfvƍ֍&6FVfvƎ֎&6FVfvƏ֏&6FV P  ܊Ԋ SCO.interp.hash.dynsym.dynstr.rel.bss.rel.plt.init.plt.text.data.data1.got.dynamic.bss.note.symtab.strtab.shstrtab.comment@(#)SCO OpenServer AHS 5.2.0/OS_drivers 5.2.0 04/01/96 H PP   Ԋ ( ܊ 1 7 <``B\p\H4x4 OTx]((Gb(xD8ELF444 (4444<&2h(3/usr/lib/libc.so.1CE59/&@ =.C 03< +#%:8B>17*"$AD?(  -'!2,6;4),  |h#,! (\ 16L=̌BI<NU@ ^܌|dL<l,s~( xlh(L, ,,l  l#̋1h;<B O*W e ns}|܋0hT Д 2|\ < \2h?pFd S__iobopenstrrchr__lstat32read_iob_cleanup_endsetsidtimestrcatforkselect_environctimememmoveperror_r_syscallmemsetsys_nerr_etextstrcasecmpatexit__stat32chdir_edata_runtime_env_init_features_vectorsystemstd_syslogsyscall_getrlimitcloseexitsysi86errnoftime__statlstat32__fstat32memcmp_lib_versionfprintf_libc_syscall_runtimebcmp_r_select__fpstart_GLOBAL_OFFSET_TABLE_geteuidstrncasecmpsleepsys_errlistopenlogstrncatbzerobcopyprintf_DYNAMICdupsigset_features_vectorcloselog_on_everest_sys_gettimeofdaygettimeofdayrindex_libc_select_cerror/usr/lib/libc.so.1/usr/lib/libsocket.so.1(,04/8"<@'DH&L1P*TX9\`d h l<p!t;x5|3 6 > (@%D5 %$%(h%,h%0h%4h%8h %<h(%@h0%Dh8p%Hh@`%LhHP%PhP@%ThX0%Xh` %\hh%`hp%dhx%hh%lh%ph%th%xh%|h%h%hp%h`%hP%h@%h0%h %h%h%h%h%h%h%h%h %h(jj\t h\ET@RU RPO PjÐUU MRQ|]Ð;UU MRQl]Ð;UU MRQ\]Ð;UU MRQL]Ð;UWVS>thhL;j EtE RhhLjjE HQ u&PE PRhد Qoh}hjJVf}hj#;ft jjjf}hj;ft j3~;t WG;|hh,hh<jrjj!E Ps <;WhHRhhhj1hhV. tutM<s3@thth8h@j EPEPhPhhhj Fhhj 6h<hjf hhȲjJ 3۹<f>ËEÙEڅt&jExPh;hh<j]xPhhhhAhhhhhh0G;3Ph 3PhXjrhhijjV u =VW[^_]ÐUEPj{E]ÐUUM RQEPh ]ÐUUMRQE PX ]ÐU tU MRQ@]ÐEP?E t UUPEU3fUP3뺃UE UPR]d u($ÐU3WV}U r:u GtC33ҊF:tN33Ҋ%+^_];3;UWVS}tUu] 33ҊC:t,K33Ҋ%+[^_]ÃFtOu3;ࡤ uZXR$Rø2ÐUU MRjQ ]Ã/etc/shutdown -y -g0 1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899Unknown error8H`lԴ  ,DP\pȵܵ 8H`p|ж,<Xxȷ  8Pd|и  0Hh̹  4H\pȺ(Ppػ $@`Լ,L|Ľܽ$@Tpо  8L`tĿؿ(<Pdx,@Th|DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@(#)rindex.c 6.1 Lachman System V STREAMS TCP source@(#)strcasecmp.c 6.2 Lachman System V STREAMS TCP source  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~imsd: Must be su!Usage: %s "device name" imsd: Error on open of %s = %d //imsd: cannot forkimsd: cannot fork twice/dev/console/dev/nullimsd: read error, status = %d imsd: read error, errno = %d imsd: Retrying read. NOTICE: %s %s %s The IMS has initiated a USER REQUESTED shutdown of the system. The IMS has initiated a USER REQUESTED shutdown of the system. The IMS has initiated a shutdown of the system because of HIGH SYSTEM TEMPERATURE! The IMS has initiated a shutdown of the system because of HIGH SYSTEM TEMPERATURE! The IMS has initiated a shutdown of the system because of a POWER SUPPLY PROBLEM! The IMS has initiated a shutdow of the system because of a POWER SUPPLY PROBLEM! The IMS has initiated a shutdown of the system! The IMS has initiated a shutdown of the system!: -f" " Shutdown command = %s imsd: Read completed with invalid function code = %d. Read completed with invalid function code = %d. imsd: Invalid type returned from IMS driver, IGNORED! nvalid type returned from IMS driver, IGNORED!Unknown errorOperation not permittedNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo child processesResource temporarily unavailableNot enough spacePermission deniedBad addressBlock device requiredDevice busyFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesInappropriate I/O control operationText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument out of domainResult too large or too smallNo message of desired typeIdentifier removedChannel number out of rangeLevel 2 not synchronizedLevel 3 haltedLevel 3 resetLink number out of rangeProtocol driver not attachedNo CSI structure availableLevel 2 haltedDeadlock situation detected/avoidedNo record locks availableUnknown error: 47Unknown error: 48Unknown error: 49Bad exchange descriptorBad request descriptorMessage tables fullAnode table overflowBad request codeInvalid slotFile locking deadlockBad font file formatUnknown error: 58Unknown error: 59Not a stream deviceNo data availableTimer expiredOut of stream resourcesMachine is not on the networkPackage not installedObject is remoteLink has been severedAdvertise errorSrmount errorCommunication error on sendProtocol errorUnknown error: 72Unknown error: 73Multihop attemptedInode is remote Cross mount point Not a data messageFilename too longValue too large for defined data typeName not unique on networkFile descriptor in bad stateRemote address changedCan not access a needed shared libraryAccessing a corrupted shared library.lib section in a.out corruptedAttempting to link in more shared libraries than system limitCan not exec a shared library directlyIllegal byte sequenceFunction not implementedOperation would blockOperation now in progressOperation already in progressSocket operation on non-socketDestination address requiredMessage too longProtocol wrong type for socketProtocol not supportedSocket type not supportedOperation not supported on socketProtocol family not supportedAddress family not supported by protocol familyAddress already in useCannot assign requested addressNetwork is downNetwork is unreachableNetwork dropped connection on resetSoftware caused connection abortConnection reset by peerUnknown error: 109Socket is already connectedSocket is not connectedCannot send after socket shutdownToo many references: cannot spliceConnection timed outConnection refusedHost is downNo route to hostProtocol not availableUnknown error: 119Unknown error: 120Unknown error: 121Unknown error: 122Unknown error: 123Unknown error: 124Unknown error: 125Unknown error: 126Unknown error: 127Unknown error: 128Unknown error: 129Unknown error: 130Unknown error: 131Unknown error: 132Unknown error: 133Unknown error: 134Structure needs cleaningUnknown error: 136Not a name fileNot availableIs a name fileRemote I/O errorReserved for future useUnknown error: 142Unknown error: 143Unknown error: 144Directory not emptyUnknown error: 146Unknown error: 147Unknown error: 148Unknown error: 149Too many symbolic links in pathStale NFS file handleRestartable system callNo sleeping in stream head of pipe/FIFORbr‹ҋ"2BRbrŒҌ"2BRbr[n0  0 SCO.interp.hash.dynsym.dynstr.rel.plt.init.plt.text.data.data1.got.dynamic.bss.note.symtab.strtab.shstrtab.comment@(#)SCO OpenServer AHS 5.2.0/OS_drivers 5.2.0 04/01/96 ( 00P  0(88 .<< p3 <9 ?tF2K2hT((3Y(3oD3y38ELF4T4 (4444dd`|/usr/lib/libc.so.1    \  $l+|2?L,UZh` f s*{ |܄̄ open_cleanup_end_environ_etextatexit_edata_runtime_env_init_features_vectorexitfopenerrno_lib_versionfprintf_runtime__fpstart_GLOBAL_OFFSET_TABLE_fclose_DYNAMICioctl_on_everest/usr/lib/libc.so.1    5%%h%h%h%h%h %h(% h0%h8p%h@`%hHPjjQ\t h\^ETRU RPN PPjÐUWVSjh4u jh̖h!u jhܖhЖ؅u jEPWvuEt3EPhV lPjW upRhS VSjb [^_]ÁUE WEEEEPjURb u=_]ÃEM;t/dev/iiop/etc/logical_boot.idw/etc/rev.idw%d %d Rbr„҄  P SCO.interp.hash.dynsym.dynstr.rel.plt.init.plt.text.data.data1.got.dynamic.bss.note.symtab.strtab.shstrtab.comment@(#)SCO OpenServer AHS 5.2.0/OS_drivers 5.2.0 04/01/96  `   P(88.<<39?@F4K`T||Y|oy8d._..esyse.d..fiiop.hgims.hhtrimpic.hitriccs.hjtriebs.hkims_mrp.hlimsd.h#ifdef __STDC__ #pragma comment(exestr, "@(#) iiop.h 26.1 95/07/19 ") #else #ident "@(#) iiop.h 26.1 95/07/19 " #endif /* ** ident @(#) @(#) iiop.h 1.16 1 10/12/94 10:58:49 ** ** sccs_id[] = {"@(#) 1.16 iiop.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: iiop.h ** ** PURPOSE: Intelligent SCSI subsystem interface declarations. ** ** DEPENDENCIES: ** o IIOP hardware. ** ** ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990-1992 ** All rights reserved. ** ** *************************************************************************** */ /* *************************************************************************** ** Defines *************************************************************************** */ /* ** IIOP UNIX Driver Revisions */ #define IIOP_3_2_2_RELEASE 1 /* Using ipl 5, pre-SCO release. */ #define IIOP_FULLY_FUNCTIONAL 2 /* Release 2 includes 3rd PIC configuration. */ #define IIOP_RAID1_REV 3 /* Release 3 includes mirroring. */ #define IIOP_EIOP_REV 4 /* Release 4 supports logical devices. */ #define IIOP_EIOP_R1_REV 5 /* Release 4 supports logical devices and Software RAID 1. */ #define IIOP_FW_REV_15 15 /* Firmware release 15. */ #define IIOP_FW_EIOP_REV 100 /* Extended IIOP functionality. */ #define IIOP_LOGICAL_DEVICE 0x80/* EIOP logical device. */ #define IIOP_MAX_DEVICES 6 /* (K2_CHANGED)Max. IIOP hardware devices supported. */ #define IIOP_MAX_TARGETS 15 /* Max. nbr target drives on a bus. */ #define IIOP_MAX_DEEP_TARGETS 15 /* Max. nbr deep targets on a bus. */ #define IIOP_MAX_NONDEEP_TARGETS 7 /* Max. nbr narrow targets on a bus. */ #define IIOP_IORP_BUFFERS 105 /* Number of buffers in 3 kernal pages. */ #define IIOP_SUBMIT_INTR 1 /* Writing any value will generate an interrupt. */ #define IIOP_WATCHDOG_TIMEOUT HZ*30 /* 30 second timeout value. */ #define IIOP_SCSI_CMD_LEN 12 /* Max. SCSI command in bytes. */ #define IIOP_SCSI_SENSE_LEN 26 /* Max. SCSI sense status in bytes. */ /* ** Physical drive SCSI commands. */ #define SCSI_EXT_READ_CMD 0x28/* SCSI extended read command. */ #define SCSI_EXT_WRITE_CMD 0x2a/* SCSI extended write command. */ /* ** Geometry polling definitions. */ #define SCSI_ERROR_CODE 12 /* Byte index into request sense status. */ #define SCSI_PON_RESET 0x29/* SCSI power-on reset error status. */ #define IIOP_MAX_BLOCKS 0xfb0400/* Max. allowable blocks. */ #define IIOP_MAX_CYLINDERS 1024/* Max. ST506 cylinders. */ #define IIOP_MAX_SECTORS 64 /* Max. ST506 sectors. */ #define IIOP_MAX_HEADS 255 /* Max. ST506 heads. */ /* ** IORP.ioscsibus values. */ #define IIOP_K2_MAX_BUSSES 4 /* Max. supported busses. */ #define IIOP_MAX_BUSSES 4 /* (K2_CHANGED)Max. supported busses in Model 30/40. */ #define IIOP_SCSI_BUS_1 0 /* IIOP sub-bus structure. */ #define IIOP_SCSI_BUS_2 1 /* IIOP sub-bus structure. */ /* ** IORP.iortype values. */ #define IIOP_SCSI_CMD 0 /* SCSI command, no data transfered. */ #define IIOP_SCSI_READ 1 /* SCSI data from device. */ #define IIOP_SCSI_WRITE 2 /* SCSI data to device. */ #define IIOP_SCSI_RESET 3 /* Individual device reset. */ #define IIOP_RETRY_NONMEDIA 0x40/* IIOP retry of non-media errors. */ #define IIOP_RETRY_MEDIA 0x80/* IIOP retry of media errors. */ #define IIOP_RETRY_REV 13 /* Rev 13 and latter support iiop retries. */ #define IIOP_SCSI_MEMM 6 /* Memory to memory move operation */ /* ** LIORP.iortype values. */ #define ISS_LIORTYPE 7 /* Logical device required type. */ /* ** LIORP.iortyp2 values. */ #define LIO_FORMAT 0 /* Format logical device; zero data. */ #define LIO_READ 1 /* Read from logical device. */ #define LIO_WRITE 2 /* Write to logical device. */ #define LIO_WRITEV 3 /* Write-verify to logical device. */ #define LIO_VERIFYC 4 /* Verify checkword on logical device. */ #define LIO_VERIFYD 5 /* Verify-data logical device. */ #define LIO_SHUTDOWN 6 /* Shutdown system and flush cache. */ #define LIO_ONLINE 7 /* Put physical devices online. */ /* ** IORP.iopri values. */ #define IIOP_LOW_PRIORITY 0x0 /* Lowest priority request to IIOP. */ #define IIOP_HI_PRIORITY 0x1 /* Highest priority request to IIOP. */ #define IIOP_LOW_ELEVATOR 0x2 /* Low priority with elevator algorithm. */ #define IIOP_HI_ELEVATOR 0x3 /* Highest priority with elevator algorithm. */ /* ** LIORP.iopri values. */ #define LIO_LOW_PRIORITY 0 /* Low priority request. */ #define LIO_HI_PRIORITY 1 /* High priority request. */ #define LIO_OPTIMIZED 2 /* Optimized request. */ /* ** IORP.ioisstat values. */ #define IIOP_IORP_OK 0 /* Request terminated without error. */ #define IIOP_SCSI_ERROR 1 /* Reference IORP.ioscsistat. */ #define IIOP_SCSI_MSG 2 /* Reference IORP.ioscsimsg. */ #define IIOP_ID_ERROR 3 /* Target identifier error. */ #define IIOP_PURGED 4 /* Purged request due to a lock request. */ #define IIOP_BUS_ERROR 5 /* Invalid SCSI bus reference. */ #define IIOP_CMD_LENGTH 6 /* Invalid SCSI command size. */ #define IIOP_SG_ERROR 7 /* Scatter/gather setup error. */ #define IIOP_RTYPE_ERROR 8 /* IORP request type error. */ #define IIOP_NO_DEVICE 9 /* Device is not available. */ #define IIOP_LIMIT_TIMED_OUT 10 /* Request time limit expired. */ /* ** LIORP.lioisst values. */ #define LIO_OK 0 /* Normal request termination. */ #define LIO_BAD_SG_CNT 100 /* Invalid scatter/gather count. */ #define LIO_BAD_RTYPE 101 /* Invalid liortype. */ #define LIO_NO_DEVICE 102 /* Device not available. */ #define LIO_BAD_ADDRESS 103 /* Invalid starting block address. */ #define LIO_BAD_LENGTH 104 /* Invalid transfer length. */ #define LIO_BAD_PRIORITY 105 /* Invalid priority. */ #define LIO_BAD_ID 106 /* Invalid SCSI id. */ #define LIO_BAD_LOGICAL_ID 107 /* Invalid logical id. */ #define LIO_IRRECOVERABLE 150 /* Irrecoverable error. */ /* ** IORP.ioscsistat values. */ #define IIOP_SCSI_OK 0x0 /* SCSI success status. */ #define IIOP_SCSI_CHK 0x2 /* Reference IORP.iosensbuf->.... */ #define IIOP_SCSI_BUSY 0x8 /* SCSI device was busy. */ #define IIOP_SCSI_CONFLICT 0x18/* Reservation conflict. */ #define IIOP_SCSI_VOID 0xff/* Ignore this status. */ /* ** IORP.ioscsimsg values. */ #define IIOP_MSG_COMPLETE 0x0 /* Command message was completed. */ #define IIOP_MSG_REJECT 0x7 /* Command message was rejected. */ #define IIOP_MSG_PARITY 0x9 /* Command message parity error. */ #define IIOP_MSG_VOID 0xff/* Ignore this status. */ /* ** IIOPHDR.issstat values. */ #define IIOP_UNINITIALIZED 0 /* IIOP is not ready to use. */ #define IIOP_READY 1 /* IIOP is ready for use. */ #define IIOP_CRASHED 2 /* IIOP has crashed. */ /* ** IIOPHDR.issgopt values. */ #define IIOP_READ_REQ_PREF 0x1 /* Read request preference. */ /* ** LISSHDR.status bit values. */ #define LISS_LOGICAL 1 /* Logical devices are present. */ #define LISS_CKSUM 2 /* Checksum error in NVRAM. */ #define LISS_CONFIG 4 /* Configuration error. */ #define LISS_CORRUPT 8 /* Logical device(s) corrupt. */ #define LISS_R1_SYNC 16 /* RAID 1 sync map corruption. */ /* ** LIOPDM.device_status values. */ #define PDM_SPARE 1 /* Device is available for HOT SPARING. */ #define PDM_NO_DEVICE 2 /* Device is not present, vacant id. */ #define PDM_GOOD_LOGICAL 3 /* Logical device. */ #define PDM_BAD_LOGICAL 4 /* Inoperative logical device. */ #define PDM_GOOD_PHYSICAL 5 /* Operable physical device. */ #define PDM_BAD_PHYSICAL 6 /* Inoperable physical device. */ #define PDM_CORRUPT_LOGICAL 7 /* Corrupted logical device. */ #define PDM_UNKNOWN_LOGICAL 8 /* Logical device not in current map. */ #define PDM_SYNC_R1 9 /* Logical device is being resynced. */ #define PDM_ULOG 10 /* Uninitialized Raid 4 or 5 device. */ /* ** LIOPDM.device_type values. */ #define PDM_DISK 0 /* Direct access device, hard disk drive. */ #define PDM_TAPE 1 /* Sequential access device. */ #define PDM_PRINTER 2 /* Printer device. */ #define PDM_PROCESSOR 3 /* Processor device. */ #define PDM_WORM 4 /* Write-Once-Read-Many device. */ #define PDM_CDROM 5 /* CD-ROM device. */ #define PDM_SCANNER 6 /* Scanner device. */ #define PDM_OPTICAL 7 /* Rewritable optical device. */ #define PDM_CHANGER 8 /* Medium changer device. */ #define PDM_COMM 9 /* Communication device. */ /* ** LIOPDM.device_usage values. */ #define PDM_PHYSICAL 0 /* Physical device; vs logical device. */ #define PDM_STANDARD 1 /* NonRaided device. */ #define PDM_RAID0 2 /* RAID 0, striped device. */ #define PDM_RAID1 3 /* RAID 1, mirrored device. */ #define PDM_RAID01 4 /* RAID 0/1, striped and mirrored device. */ #define PDM_RAID5 5 /* RAID 5 device. */ #define PDM_RAID4 6 /* RAID 4 device. */ /* ** LIOLDM.device_status values. */ #define LDM_UNASSIGNED 0 /* Unassigned. */ #define LDM_ONLINE 1 /* ONLINE. */ #define LDM_OFFLINE 2 /* OFFLINE. */ /* ** LIOLDM.device_usage values. */ #define LDM_STANDARD 0 /* Logical nonRaided device. */ #define LDM_RAID0 1 /* RAID 0, striped device. */ #define LDM_RAID1 2 /* RAID 1, mirrored device. */ #define LDM_RAID01 3 /* RAID 0/1, striped and mirrored device. */ #define LDM_RAID5 4 /* RAID 5 device. */ /* ** EISA IIOP definitions. */ #define IIOP_MFG_PROD 0x00304952 /* Tricord EISA manufacturer code. */ #define IIOP_MFG_MASK 0x00f0ffff /* Tricord manufacturer mask. */ #define ISS_MFG_PROD 0x00003800 /* (K2_ADDED) ISS ID Reg value */ #define ISS_MFG_MASK 0xffff00ff /* (K2_ADDED) ISS ID Reg mask */ #define ISS_BRD_MASK 0x70 /* (K2_ADDED) ISS board mask */ /* ** IIOP_DEVICE table entry values. */ #define IIOP_EISA_SLOT_SHIFT 12 /* Number of bits to shift right. */ #define IIOP_EISA_SLOT_9 0x9000 /* First EISA slot number. */ #define IIOP_EISA_SLOT_13 0xf000 /* (K2_CHANGED)Last EISA slot number. */ #define IIOP_EISA_SLOT_INCR 0x1000 /* EISA slot number increment. */ #define IIOP_EISA_VECT_9 23 /* Vector associated with the first EISA slot number. */ #define IIOP_SINGLE_BD_VECTOR 5 /* Pre-SCO released 3rd PIC changes. */ #define IIOP_MAX_INTR 24 /* Maximum number of interrupts. */ #define IIOP_INTR_PRI 5 /* Interrupt priority. */ #define IIOP_X_ID_REG 0x0c80 /* ID register address. */ #define IIOP_X_CNTRL_REG 0x0c84 /* Control register address. */ #define IIOP_X_STATUS_REG 0x0c88 /* Status register address. */ #define IIOP_X_DP_RAM 0xfe010000 /* Dual Port RAM physical address. */ #define IIOP_DP_RAM_INCR 0x8000 /* Incremental Dual Port RAM addr. */ /* ** IIOP IOCTL command parameter values. */ #define IIOP_IOCTL_READ_STAT 0x1 /* Retrieve IIOP driver statistics. */ #define IIOP_IOCTL_READ_HDR 0x2 /* Retrieve IIOP driver header d.s. */ #define IIOP_MRP_REQUEST 0x10 /* Setup a MRP request to change EIOP logical device mapping. */ #define IIOP_IOCTL_RD_PDM 0x11 /* Read PDM entry(ies). */ #define IIOP_IOCTL_RD_LDM 0x12 /* Read LDM entry(ies). */ /* ** Special Mode Sense, Sense Code Error */ #define SCSI_DRIVE_FAILURE 0x80 /* Ciprico hot drive removal request. */ /* *************************************************************************** ** Macros *************************************************************************** */ #define IIOP_HA_NUM(ha, is_K2) ((is_K2>0)?(ha&0x7):(ha&0x1)) /* (Everest changed) */ #define IIOP_RETRYABLE(rtype) (rtype & (IIOP_RETRY_NONMEDIA|IIOP_RETRY_MEDIA)) /* ** RAID requires access to iiop queue for mirrored write requests. ** ** WARNING: ** AT NO TIME MAY QCB->qcbin be used as the 2nd parameter!!!! */ #define IIOP_QCB_NEXT_IORP(qcb, new) \ { \ new = (qcb)->qcbin + 1; \ if ((new) >= (qcb)->qcblba) \ new = (qcb)->qcbfba; \ } /* ** Convert a physical address within the IIOP dual-port RAM to a virtual ** kernel address. ** ** vbase - virtual base to use ** base - physical dual-port RAM base address ** addr - physical address to convert */ #define PHYSTOVIRT(vbase,base,addr) ((u_int) ((u_int) addr - (u_int) base) \ + (u_int) vbase) #define IIOP_QCB_FULL(qcb, new) ((qcb)->qcbout == new) /* ** Remove physical requests from the head of the queue. */ #define IIOP_DEQUEUE_REQ(iiop, req) \ { \ req = (iiop)->queued_reqs; \ (iiop)->queued_reqs = (req)->req_forw; \ (req)->req_forw = (REQ_IO *) NULL; \ \ if ((iiop)->queued_reqs == (REQ_IO *) NULL) \ (iiop)->queued_reqs_tail = (REQ_IO *) NULL; \ (iiop)->physical_stats.queued_reqs--; \ } /* ** Remove logical requests from the head of the queue. */ #define IIOP_DEQUEUE_LREQ(iiop, req) \ { \ req = (iiop)->queued_lreqs; \ (iiop)->queued_lreqs = (req)->req_forw; \ (req)->req_forw = (REQ_IO *) NULL; \ \ if ((iiop)->queued_lreqs == (REQ_IO *) NULL) \ (iiop)->queued_lreqs_tail = (REQ_IO *) NULL;\ (iiop)->logical_stats.queued_reqs--; \ } /* ** Queue a physical request waiting for an IORP d.s. */ #define IIOP_QUEUE_REQ(tiiop, req) \ { \ if ((req)->req_forw != (REQ_IO *) NULL) \ cmn_err(CE_PANIC, "iiop: req_forw NOT NULL.");\ if ((tiiop)->queued_reqs == (REQ_IO *) NULL) \ (tiiop)->queued_reqs = req; \ else \ (tiiop)->queued_reqs_tail->req_forw = req; \ \ (tiiop)->queued_reqs_tail = req; \ (tiiop)->physical_stats.queued_reqs++; \ } /* ** Queue a logical request waiting for a LIORP d.s. */ #define IIOP_QUEUE_LREQ(tiiop, req) \ { \ if ((req)->req_forw != (REQ_IO *) NULL) \ cmn_err(CE_PANIC, "iiop: req_forw NOT NULL.");\ if ((tiiop)->queued_lreqs == (REQ_IO *) NULL) \ (tiiop)->queued_lreqs = req; \ else \ (tiiop)->queued_lreqs_tail->req_forw = req; \ \ (tiiop)->queued_lreqs_tail = req; \ (tiiop)->logical_stats.queued_reqs++; \ } /* *************************************************************************** ** Typedefs *************************************************************************** */ typedef int (*FNCT_PTR)(); /* Generic function ptr. */ /* ** The scatter/gather definition. This structure is filled by ** the driver making the I/O request. */ typedef struct { unchar *sgaddr; /* Physical buffer address. */ ulong sgbytes; /* Byte count. */ } SGDESC; /* ** Structure used for memory to memory move operations. ** Repeated for each block of addresses moved. ** Supported on non-EIIOP at ISS firmware rev. 109 or greater. */ typedef struct { ulong psglen; /* 0C0000000 + byte count 24-bits */ unchar *psgsrc; /* Source address */ unchar *psgdes; /* Destination address */ } MMDESC; /* ** Structure inserted at the tail end of MMDESC. */ typedef struct { ulong psgterm[2]; } MMEND; /* ** IIOP request packet. The fields are either writable by the ** IIOP or the driver. The fields designated by (IIOP) are written ** by the IIOP firmware. */ typedef struct iorp { ulong iothread; /* (IIOP) thread ptr. */ struct iorp *next_free; /* (DRV) Next free IORP. */ unchar ioscsibus; /* (DRV) SCSI-1 or SCSI-2 bus. */ unchar ioid; /* (DRV) SCSI target number, 0-7. */ unchar iortype; /* (DRV) I/O operation. */ unchar iocmdlen; /* (DRV) Bytes in command. */ ulong iotimeout; /* (DRV) Millisecond timeout. */ unchar iocmd[IIOP_SCSI_CMD_LEN]; /* (DRV) A drive's SCSI command. */ ulong ioxferbcreq; /* (DRV) Data transfer byte count. */ SGDESC *iosgdesc; /* (DRV) Scatter/gather descriptors. */ ushort iosgcount; /* (DRV) Number of scatter/gather descriptors. */ unchar iosensbuf[IIOP_SCSI_SENSE_LEN]; /* (DRV) A drive's SCSI status. */ unchar iopri; /* (DRV) Request priority. */ unchar ioisstat; /* (IIOP) IIOP iorp status. */ unchar ioscsistat; /* (IIOP) SCSI return status byte. */ unchar ioscsimsg; /* (IIOP) SCSI message byte. */ ulong iobcxferred; /* (IIOP) Number of bytes transfered. */ REQ_IO *ioreq; /* (DRV) Driver I/O request address. */ struct iorp *prior_active; /* (DRV) Back link in active list. */ struct iorp *next_active; /* (DRV) Next active IORP. */ paddr_t sg_phys_addr; /* (DRV) sgdescriptor physical address. */ paddr_t virtual_addr; /* (DRV) Virtual address of IORP. */ paddr_t phys_addr; /* (DRV) Physical address of IORP. */ ulong ioissx[3]; /* (IIOP) IIOP FIRMWARE specific values. */ /* ** Driver unique structure. */ ulong in_dual_port; /* (DRV) Boolean (False=0,True= not 0). */ SGDESC sgdescriptor; /* (DRV) Default doesn't require scatter/gather. */ } IORP; /* ** IIOP request packet. The fields are either writable by the ** IIOP or the driver. The fields designated by (IIOP) are written ** by the IIOP firmware. */ typedef struct liorp { ulong liothread; /* (IIOP) thread ptr. */ struct liorp *next_free; /* (DRV) Free list ptr. */ unchar liounused; /* (DRV) Unused. */ unchar lioid; /* (DRV) Logical device id. */ unchar liortype; /* (DRV) Logical operation designation. */ unchar liortyp2; /* (DRV) Logical operation. */ ulong liosda; /* (DRV) Starting disk address. */ ulong liolen; /* (DRV) Nbr blocks to transfer. */ SGDESC *liosgdsc; /* (DRV) Address scatter/gather list. */ ushort liosgcnt; /* (DRV) Scatter/gather descriptor count. */ unchar liopri; /* (DRV) Request priority. */ unchar lioisst; /* (IIOP) Request status. */ unchar liophyst; /* (IIOP) IOISSTAT from iorp. */ unchar lioscsis; /* (IIOP) IOSCSISTAT from iorp. */ unchar liosensk; /* (IIOP) IOSENSKEY from iorp. */ unchar lioasc; /* (IIOP) IOASC from iorp. */ unchar lioascq; /* (IIOP) IOASCQ from iorp. */ unchar liobus; /* (IIOP) SCSI bus. */ unchar liosid; /* (IIOP) SCSI id. */ unchar liounused2; /* (IIOP) Unused. */ /* ** Driver unique structure. */ SGDESC sgdescriptor; /* (DRV) SCO UNIX doesn't use scatter/gather. */ struct liorp *next; /* (DRV) Free/active list pointer. */ struct liorp *prior; /* (DRV) Free/active list pointer. */ REQ_IO *ioreq; /* (DRV) Driver I/O request address. */ paddr_t sg_phys_addr; /* (DRV) sgdescriptor physical address. */ paddr_t phys_addr; /* (DRV) Physical address of LIORP. */ paddr_t virtual_addr; /* (DRV) Virtual address of LIORP. */ ulong in_dual_port; /* (DRV) Boolean (False=0,True= not 0). */ } LIORP; typedef struct { IORP **qcbfba; /* IIOP queue's lower address. */ IORP **qcblba; /* IIOP queue's upper address. */ IORP **qcbin; /* IIOP next iorp to use. */ IORP **qcbout; /* IIOP iorp to be executed. */ } QCB; /* ** The IIOP header data structure. This structure is read by the ** unix IIOP driver to interact with the IIOP firmware. The structure is ** built by the IIOP firmware and resides in IIOP dual port memory. ** ** NOTE: All the address values are physical addresses. */ typedef struct { ulong issdplen; /* Dual-port RAM size in bytes. */ ulong issrev; /* IIOP firmware revision. */ ulong isscbdep; /* Max. IORP queue depth. */ ulong issscsin; /* Number of SCSI buses. */ ulong isssgn; /* Max. scatter/gather descriptors allowed per iorp. */ ulong issstat; /* IIOP status. */ QCB *isssqcb; /* IIOP submission queue control block. */ QCB *isscqcb; /* IIOP completion queue control block. */ unchar *issscb; /* IIOP statistics. */ unchar *issccb; /* IIOP crash data. */ unchar *isssint; /* IIOP submission IRQ address. */ unchar *isscint; /* IIOP completion IRQ address. */ unchar issinitid; /* IIOP initiator ID. */ unchar issunused; /* Fill byte to a word boundary. */ ushort issfreel; /* Length of driver free area. */ paddr_t issfree; /* IIOP pointer to IIOP driver free area. */ ulong issbios; /* IIOP pointer to BIOS comm. area. */ ulong issmaxrj; /* Maximum requests to join. */ ulong issmaxsj; /* Maximum sectors to join. */ ulong issgopt; /* Global option flags. */ } IIOPHDR; /* ** The logical Physical Device Map d.s. as defined in the ISS EXTERNAL ** FIRMWARE design specification. */ typedef struct pdm { unchar device_status; /* Physical device status. */ unchar device_type; /* Physical device type. */ unchar device_usage; /* Physical device usage. */ unchar scsi_type; /* SCSI bus width. */ ulong block_size; /* Block in bytes. */ ulong capacity; /* Device capacity. */ ulong wr_hi_mark; /* High water mark for writes. */ ulong r1_hi_mark; /* Remirror high water mark. */ unchar bus; /* SCSI channel. */ unchar id; /* SCSI id. */ unchar logical_id; /* Logical id. */ unchar unused1; /* unused. */ unchar vendor[8]; /* Vendor id. */ unchar product[16]; /* Product id. */ unchar revision[4]; /* Product revision. */ unchar serial_nbr[12]; /* Product serial number. */ ulong r0_pdm_offset; /* RAID 0 offset from PDM table of next PDM entry in stripe. */ ulong r1_pdm_offset; /* RAID 1 offset from PDM table of next PDM entry in mirror. */ } LIOPDM; /* ** Logical Device Map d.s. as defined in the ISS EXTERNAL ** FIRMWARE design specification. */ typedef struct { unchar device_status; /* Logical device status. */ unchar device_usage; /* Logical device usage. */ unchar logical_id; /* Logical device id. */ unchar r0_drives; /* Nbr RAID 0 devices. */ ulong block_size; /* Block in bytes. */ ulong capacity; /* Logical device capacity. */ ulong stripe_factor; /* Nbr blocks in a stripe on a single drive. */ ulong pdm_offset; /* First drive in RAID 0/RAID 1/RAID 0/1 offset from PDM table. */ } LIOLDM; /* ** The Logical ISS header data structure. This structure is read by the ** unix IIOP driver to interact with the IIOP firmware. The structure is ** built by the IIOP firmware and resides in IIOP dual port memory. ** ** NOTE: All the address values are physical addresses. */ typedef struct { paddr_t cache; /* (DRV) Start of cache in system memory. */ ulong cache_length; /* (DRV) Length of cache memory. */ ulong sector_size; /* (DRV) Logical device blocking factor. */ LIOPDM *pdm; /* Physical Device Map pointer. */ unchar pdm_size; /* Size of a PDM entry. */ unchar pdm_entries; /* Nbr of PDM entries. */ unchar busses; /* Nbr of SCSI busses. */ unchar bus_devices; /* Nbr of SCSI devices per SCSI bus. */ ulong status; /* Logical subsystem status. */ LIOLDM *ldm; /* Logical Device Map pointer. */ unchar ldm_size; /* Size of a LDM entry. */ unchar ldm_entries; /* Nbr of LDM entries. */ ushort x86_id; /* Microprocessor chip id. */ unchar ctest3_status[8]; /* CTEST3 for bus 0-3. */ ulong clock; /* Millisecond clock. */ QCB *submision_mrp; /* Submission QCB for Maintenance Req. Pckts. */ QCB *completion_mrp; /* Completion QCB for MRP. */ unchar *interrupt_mrp; /* Submission interrupt for MRP requests. */ QCB *error_log; /* Error log queue control block. */ unchar *free_memory; /* Dual-ported memory available for IMS. */ ulong free_mem_length; /* Amount of dual-port memory free. */ } LISSHDR; /* ** New Extended IIOP hardware header. */ typedef struct { IIOPHDR physical; /* IIOP, physical, specific information. */ LISSHDR logical; /* Logical interface information. */ } ISSHDR; /* ** IIOP control and status register definitions. */ typedef union { struct { unchar reset:1; /* 0=Reset IOP. */ unchar intr:1; /* 1=Force IOP interrupt. */ unchar diag:1; /* 1=Force diagnostic parity test. */ unchar parity:1; /* 1=System parity checking. */ unchar unused:2; /* Unused bits. */ unchar iiop_bd:1; /* 0=IIOP1, 1=IIOP2. */ unchar reserved:1; /* Unused bits. */ } bits; char all; /* All data bits. */ } IIOP_CONTROL_REG; typedef union { struct { unchar reserved:3; /* Unused bits. */ unchar irq:1; /* 0=Interrupt Request Present. */ unchar unused:1; /* Unused bits. */ unchar busy:1; /* 0=Busy LED on. */ unchar error_led:1; /* 0=Error LED on. */ unchar parity:1; /* 0=Parity error. */ } bits; char all; /* All data bits. */ } IIOP_STATUS_REG; /* ** IIOP driver statistics per device. */ typedef struct { ulong interrupts; /* Completion interrupt count. */ ulong finished_reqs; /* Completed I/O requests. */ ulong start_reqs; /* Initiated I/O requests. */ ulong queued_reqs; /* Waiting I/O requests. */ ulong queue_depth; /* Outstanding I/O requests. */ ulong max_queue_depth; /* Greatest amount of I/O requests. */ } IIOP_DEVICE_STATS; /* ** Physical/Logical device mapping information from controller ** dual-port memory. */ typedef struct { unchar status; /* Device status from boot. */ unchar type; /* Device type within SCSI domain. */ unchar usage; /* Physical or RAID type. */ unchar logical_id; /* usage is: RAID 0, 1, 0/1, logical. */ ulong phys_blk_size; /* Physical device block size in bytes. */ ulong phys_cap; /* Nbr blocks in physical device. */ } IIOP_DRIVE_INFO; /* ** Logical device information. */ typedef struct { unchar pseudo_bus; /* First device's bus in logical device. */ unchar pseudo_id; /* First device's id in logical device. */ unchar device_status; /* Logical device status. */ unchar device_usage; /* Logical device usage. */ ulong block_size; /* Block in bytes. */ ulong stripe_factor; /* Nbr blocks in a stripe on a single drive. */ ulong capacity; /* Logical device capacity. */ ulong nbr_drives; /* Number of logical drives found. */ } IIOP_LOGICAL_INFO; /* ** IIOP device table entry. */ typedef struct { int flag; /* Current state of device. */ int ivector; /* Interrupt vector. */ int pages; /* The number of memory mapped pages. */ int eiop; /* EIOP hardware/firmware. */ /*kec replace SHAREG *sco_registration; */ /* Register the adapter card with SCO. */ SHAREG_EX *sco_registration;/* Register the adapter card with SCO. */ /*end kec replace*/ IIOP_CONTROL_REG *control; /* Address of the control register. */ paddr_t dp_ram; /* Physical address of dual port ram. */ struct lockb *iorp_lock; /* IORP lock */ struct lockb *liorp_lock; /* LIORP lock */ struct lockb *submitq_lock; /* Submission queue lock */ struct lockb *cmpltq_lock; /* Completion queue lock */ struct lockb *rq_lock; /* Generic request queue lock */ struct lockb *errorq_lock; /* Error queue lock */ ISSHDR *hdr; /* Virtual address of dual port ram. */ QCB *v_isssqcb; /* Virtual address of dual port ram. */ QCB *v_isscqcb; /* Virtual address of dual port ram. */ int *v_isscint; /* Virtual address of dual port ram. */ int *v_isssint; /* Virtual address of dual port ram. */ int retry_rev; IORP *free_iorps; /* Current pool of available IORPs. */ IORP *free_iorps_tail; /* Tail ptr of available IORPs. */ LIORP *free_liorps; /* Current pool of available LIORPs. */ LIORP *free_liorps_tail; /* Tail ptr of available LIORPs. */ REQ_IO *queued_reqs; /* Physical request waiting for IORP. */ REQ_IO *queued_reqs_tail; /* Tail of queue waiting for IORP. */ REQ_IO *queued_lreqs; /* Logical request waiting for LIORP. */ REQ_IO *queued_lreqs_tail; /* Tail of queue waiting for LIORP. */ IORP *active_phys_hd; /* Head of active IORPs. */ IORP *active_phys_tail; /* Tail of active IORPs. */ LIORP *active_liorp_hd; /* Head of active LIORPs. */ LIORP *active_liorp_tail; /* Tail of active LIORPs. */ IIOP_DEVICE_STATS physical_stats; /* Device specific diagnostic statistics. */ IIOP_DEVICE_STATS logical_stats; /* Device specific diagnostic statistics. */ ushort bus_activity[IIOP_K2_MAX_BUSSES]; /* Current activity in this IIOP ctlr. */ IIOP_DRIVE_INFO drive_info[IIOP_K2_MAX_BUSSES][IIOP_MAX_TARGETS]; /* Drive info. from dual-port memory. */ IIOP_LOGICAL_INFO logical_info[IIOP_K2_MAX_BUSSES*IIOP_MAX_TARGETS]; /* Logical device info. from dual-port memory. */ } IIOP_DEVICE; /* ** IIOP command table entry. */ typedef struct { ulong timeout_clicks; /* Timeout in milliseconds. */ ulong xfer_bytes; /* # bytes to transfer. */ short xfer_dir; /* Direction of the data transfer. */ } IIOP_CMD; /* ** SCSI disk Mode Select command table. The table is used ** to issue an appropriate Mode Select command to a specific ** manufacturer disk drive to enable readahead/cache operations as ** well as enable the internal SCSI disk bad block algorithm. */ typedef struct { char *drive_id; /* Vendor id from Inquiry cmd. */ ulong id_len; /* strlen(vendor id). */ char *command; /* Mode Select parameters. */ ulong cmd_size; /* Command length in bytes. */ } IIOP_MS_TABLE; /* ** IOCTL special interface d.s. */ /* ** Parameters used to read LDM data from dual-ported memory. */ typedef struct { ulong logical_id; /* Logical device id. */ ulong ldm_count; /* Number of LDMs to return */ ulong actual_count; /* Number of LDMs returned */ LIOLDM *ldm; /* Pointer to user's first LDM. */ } IIOP_RD_LDM; /* ** Parameters used to read PDM data from dual-ported memory. */ typedef struct { ulong pdm_index; /* Index into PDM table. */ ulong pdm_count; /* Number of PDMs to return */ ulong actual_count; /* Number of PDMs returned */ LIOPDM *pdm; /* Pointer to user's first PDM. */ } IIOP_RD_PDM; #ifdef __STDC__ #pragma comment(exestr, "@(#) ims.h 26.1 95/07/19 ") #else #ident "@(#) ims.h 26.1 95/07/19 " #endif /* ** ident @(#) ims.h 1.27 1 10/10/94 13:08:00 ** ** sccs_id[] = {"@(#) 1.27 ims.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: ims.h ** ** PURPOSE: Intelligent Maintenance Subsystem Interface Declarations. ** ** DEPENDENCIES: ** ** o IMS hardware. ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1992 ** All rights reserved. ** *************************************************************************** */ /* *************************************************************************** ** Defines *************************************************************************** */ /* ** Remote console flags equates - configurable ims_remote_console */ #define KIN 1 #define KOUT 2 #define UIN 4 #define UOUT 8 #define EST_TIME 300 /* Estimated time required to shutdown system. */ #define DEL_TIME 1 /* Delay time after O/S is down before reset. */ #define LINE_FEED 0xa #define CARRIAGE_RET 0xd #define COMBO_STATUS_PORT 0x64 /* Mombo-combo chip status port. */ #define COMBO_STATUS_FULL 0x1 /* Keystrokes present on combo */ #define NUM_SYS_SLOTS 7 /* System slots in K2 */ #define IMS_WCCB_INDEX NUM_SYS_SLOTS /*Index into the watchdog counter control table for the IMS counter */ #define IMS_BASESLOTNUM 9 /* Base slot # */ /* ** IMS maximum log message size - Everything beyond will be truncated. */ #define IMS_MAX_LOG_MSG 1024 /* Max. log message size in chars.*/ /* ** IMS UNIX Driver Revisions */ #define IMS_DRIVER_REVISION "1.0" /* ** - Product id portion of eisa id from EISA Bridge Subsystem EISA id ** - If product id is 01 or 02 then we are running on a model 30/40. ** - If product id is 08 then K2 */ #define IMS_3040_PRODUCT_ID_01 1 #define IMS_3040_PRODUCT_ID_02 2 #define IMS_K2_PRODUCT_ID 8 #define IMS_MAX_DEVICES 1 /* Max. IMS hardware devices supported. */ #define IMS_SUBMIT_INTR 1 /* Writing any value will generate an interrupt. */ #define IMS_WATCHDOG_TIMEOUT HZ*30 /* 30 second timeout value. */ /* ** imshdr->status */ #define IMS_UNINITIALIZED 0 /* IMS is not ready to use. */ #define IMS_READY 1 /* IMS is ready for use. */ #define IMS_CRASHED 2 /* IMS has crashed. */ /* ** Interrupt vector, relative to the global "ivect" table for IMS ** */ #ifdef TEST #define IMS_INTERRUPT_VECTOR 20 /* IIOP used for IMS testing. */ #else #define IMS_INTERRUPT_VECTOR 16 /* Somehow this equates to IRQ0 of PIC 3*/ #endif #define IMS_INTR_PRI 5 #ifdef TEST #define IMS_DUAL_PORT_ADDR 0xfe018000 /* Dual port memory address */ #else #define IMS_DUAL_PORT_ADDR 0xfdf00000 /* Dual port memory address */ #endif #define IMS_MAX_INTR 24 /* Maximum number of interrupts. 3 pics */ /* ** Allocation of dual port mrp's. */ #define IMS_DP_PHYSICAL 1 /* Physical d.s. in dual-port. */ /* ** IMS IOCTL command parameter values. */ #define IMS_IOCTL_READ_STAT 0x1 /* Retrieve IMS driver statistics. */ #define IMS_IOCTL_READ_HDR 0x2 /* Retrieve IMS driver header d.s. */ #define IMS_IOCTL_IS_K2 0x3 /* Are we running on a K2 machine */ #define IMS_IOCTL_IS_IMS 0x4 /* Is the IMS present in the system */ #define IMS_IOCTL_MRP_HDR_REQ 0x5 /* Setup a MRP_HDR request */ #define IMS_IOCTL_LOG_MSG 0x6 /* Log message */ #define IMS_IOCTL_READ 0x7/* Post a read for log messages, misc. */ /* ** Usage values associated with returned data of IMS_IOCTL_READ */ #define IMS_LOG_MSG 1/* Returned data is log message. */ /* ** tbd kec for test purposes */ #define IMS_IOCTL_DEV 0x8a #define IMS_IOCTL_MPIC 0x8c #define IMS_IOCTL_RC 0x8d #define IMS_IOCTL_NMI 0x8f /* ** mrp->status values. */ #define IMS_MRP_HDR_OK 0 /* Request terminated without error. */ #define IMS_SG_ERROR 7 /* Scatter/gather setup error. */ #define IMS_RTYPE_ERROR 8 /* MRP_HDR request type error. */ #define IMS_NO_DEVICE 9 /* Device is not available. */ #define IMS_LIMIT_TIMED_OUT 10 /* Request time limit expired. */ /* ** MPIC input interrupt pin definitions */ #define SYS_ATTN 7 #define SYS_POWER_FAIL 8 #define SYS_TIMEOUT 9 #define SYS_ERROR 10 #define SYS_EISA_PERR 11 #define SYS_IMS_ATTN 12 #define SYS_INT 13 #define SYS_NMI 14 #define LOC_RESET_CPU 15 /* Local MPIC spurious interrupt */ #define SPURIOUS 16 /* *************************************************************************** ** Macros *************************************************************************** */ /* ** ** WARNING: AT NO TIME MAY QCB->qcbin be used as the 2nd parameter!!!! */ #define IMS_QCB_NEXT_MRP_HDR(qcb, new) \ { \ new = (qcb)->qcbin + 1; \ if ((new) >= (qcb)->qcblba) \ new = (qcb)->qcbfba; \ } /* ** ** WARNING: AT NO TIME MAY QCB->qcbin be used as the 2nd parameter!!!! */ #define IMS_QCB_NEXT_CHAR_ADDR(qcb, new) \ { \ new = (CHAR_QCB *)((qcb)->qcbin + 1); \ if ((new) >= (CHAR_QCB *)((qcb)->qcblba)) \ new = (CHAR_QCB *)((qcb)->qcbfba); \ } /* ** Convert a physical address within the IMS dual-port RAM to a virtual ** kernel address. ** ** vbase - virtual base to use ** base - physical dual-port RAM base address ** addr - physical address to convert */ #define PHYSTOVIRT(vbase,base,addr) ((u_int) ((u_int) addr - (u_int) base) \ + (u_int) vbase) /* ** Convert a virtual address within the IMS dual-port RAM to a physical ** kernel address. ** ** vbase - virtual base to use ** base - physical dual-port RAM base address ** addr - virtual address to convert */ #define VIRTTOPHYS(vbase,base,addr) ((u_int) ((u_int) addr - (u_int) vbase) \ + (u_int) base) #define IMS_QCB_FULL(qcb, new) ((void *)((qcb)->qcbout) == (void *) new) /* ** Remove physical requests from the head of the queue. */ #define IMS_DEQUEUE_REQ(ims, req) \ { \ req = (ims)->queued_reqs; \ (ims)->queued_reqs = (req)->req_forw; \ (req)->req_forw = (APPL_REQ *) NULL; \ \ if ((ims)->queued_reqs == (APPL_REQ *) NULL) \ (ims)->queued_reqs_tail = (APPL_REQ *) NULL;\ (ims)->stats.queued_reqs--; \ } /* ** Queue a physical request waiting for an MRP_HDR d.s. */ #define IMS_QUEUE_REQ(tims, req) \ { \ if ((req)->req_forw != (APPL_REQ *) NULL) \ cmn_err(CE_PANIC, "ims: req_forw NOT NULL.");\ if ((tims)->queued_reqs == (APPL_REQ *) NULL) \ (tims)->queued_reqs = req; \ else \ (tims)->queued_reqs_tail->req_forw = req; \ \ (tims)->queued_reqs_tail = req; \ (tims)->stats.queued_reqs++; \ } /* ** Convert millisecond value to a clock tick count for the ** purpose of calling kernel timeout() routine. */ #define MS_TO_TICKS(ms) \ ((((u_int)ms) +((1000/(u_int)Hz)-1)) / (1000/(u_int)Hz)) /* *************************************************************************** ** Typedefs *************************************************************************** */ typedef int (*FNCT_PTR)(); /* Generic function ptr. */ /* ** Used to configure re-direction table on I/O MPIC */ typedef struct { unchar on_or_off; /* Usage - If 0 dont modify re-direction table entry for this Input interrupt pin. If 1 - then modify the I/O MPIC re-direction table entry to receive interrupt*/ unchar reg_select; /* I/O register select value (bits 7:0) for this re-direction table entry. */ ushort vector; /* Interrupt vector associated with this input interrupt pin on the I/O MPIC */ ulong routine; /* Interrupt routine to process this interrupt.*/ } CONFIG_MPIC; /* ** "Interrupt Descriptor Table" entry format. ** This is used to update the idt table for mpic interrupts. ** See ims_init_idt. */ typedef struct idt_entry { ushort proc_low; /* Lower 16 bits of interrupt procedure address. */ ushort seg_select; /* Segment selector for destination code segment. */ ushort control; /* Privilege level, seg. present and interrupt gate*/ ushort proc_high; /* Upper 16 bits of interrupt procedure address. */ } IDT_ENTRY; typedef struct log_ctrl { unchar *ip; /* Circular log buffer insert pointer */ unchar *rp; /* Circular log buffer remove pointer */ ulong m_count; /* Circular log buffer msg. count. */ } LOG_CTRL; typedef struct { MRP_HDR **qcbfba; /* IMS queue's lower address. */ MRP_HDR **qcblba; /* IMS queue's upper address. */ MRP_HDR **qcbin; /* IMS next mrp to use. */ MRP_HDR **qcbout; /* IMS mrp to be executed. */ } QCB; /* ** WARNING: This error log crap has to be packed. */ #pragma pack(1) /***************************************************************************** ** ** IMS error log structure ** *****************************************************************************/ #define IMS_MAX_ERRLOG_SIZE 256 typedef struct { char tm_sec; /* Seconds after the minute. */ char tm_min; /* Minutes after the hour. */ char tm_hour; /* Hours after midnight. */ char tm_mday; /* Day of the month. */ char tm_mon; /* Month of the year. */ char tm_year; /* Years since 1900. */ char tm_wday; /* Days since Sunday. */ } IMS_TM_T; /* ** Severity levels for the error messages. */ #define SEV_OFFSET 10 #define SEV_INFORMATIONAL (0x0 + SEV_OFFSET) #define SEV_WARNING (0x1 + SEV_OFFSET) #define SEV_SERIOUS (0x2 + SEV_OFFSET) #define SEV_FATAL (0x3 + SEV_OFFSET) typedef struct { IMS_TM_T timestamp; unchar feature_id; unchar module_id; ushort line_num; /* Line number. */ ushort error_code; unchar severity; /* Alarm severity. */ unchar hex_display; /* Module hex display. */ ulong seq_num; /* Sequence number. */ } IMS_EXCEPTION_T; typedef struct ims_errlog_t { struct ims_errlog_hdr { unchar dirty_flag; #define IMS_ERRLOG_FLAG_FREE 0 #define IMS_ERRLOG_FLAG_USED 1 unchar data_type; #define IMS_ERRLOG_DATA_RAW 0 ushort data_offset; ushort data_length; ushort text_offset; ushort errlog_size; ulong reserved2; IMS_EXCEPTION_T exception; } errlog_hdr; char data[IMS_MAX_ERRLOG_SIZE - sizeof(struct ims_errlog_hdr)]; } IMS_ERRLOG; #pragma pack() /* ** Error log QCB structure */ typedef struct { IMS_ERRLOG **qcbfba; /* IMS queue's lower address. */ IMS_ERRLOG **qcblba; /* IMS queue's upper address. */ IMS_ERRLOG **qcbin; /* IMS next mrp to use. */ IMS_ERRLOG **qcbout; /* IMS mrp to be executed. */ } ERR_LOG_QCB; /* ** Queueing structure for remote console raw character input and ** output. */ typedef struct { char *qcbfba; /* IMS char. input queue's lower address. */ char *qcblba; /* IMS char. input queue's upper address. */ char *qcbin; /* IMS char. input next mrp to use. */ char *qcbout; /* IMS char. input mrp to be executed. */ } CHAR_QCB; /****************************************************************************** ** ** Structure: Watchdog Counter Control Block (WCCB) ** ** Purpose: The WCCB provides a method of monitoring "I'm Alive" counters ** associated with each system bus module. The WCCB is pointed at ** by imshdr.ims_wccb. Each system bus slot ** has a COUNTER pointer. The COUNTER pointer is either ** null or points to an 8-byte structure containing a 32-bit counter ** and a maximum timeout period. If the counter is not incremented ** at least once within the max timout period, the IMS generates ** an ALERT condition. If the COUNTER pointer is null, the IMS ** watchdog task does not monitor the associated system module. ** ** It is the responsibility of the IMS to initialize the address ** imshdr.ims_wccb. It is the responsibility of the UNIX IMS ** host device driver to initialize each system bus slot COUNTER ** pointer or leave it NULL if no processor resides in that ** system bus slot. It is the responsibility of the IMS firmware ** to initialize the system bus slot COUNTER pointer associated ** with the IMS device. ** ******************************************************************************/ typedef struct wccb_t { paddr_t cntptrs[NUM_SYS_SLOTS+1]; /* The +1 provides a counter for the IMS that the HDD can monitor*/ } WCCB; typedef struct wd_ia_t { ulong wccb_cnt; /* 32-bit "I'm alive" counter */ ulong wccb_max_ud; /* Max counter update period (milli-sec) */ } WCNTB; /* ** The IMS header data structure. This structure is read by the ** unix IMS driver to interact with the IMS firmware. The structure is ** built by the IMS firmware and resides in IMS dual port memory. ** ** NOTE: All the address values are physical addresses. */ typedef struct imshdr { ulong ims_dplen; /* Dual-port RAM size in bytes. */ ulong ims_fw_rev; /* IMS firmware revision. */ ulong ims_cb_dep; /* Max. MRP_HDR queue depth. */ ulong ims_sg_max; /* Max. scatter/gather descriptors. */ ulong ims_status; /* IMS status. */ QCB *ims_s_qcb; /* IMS submimsion queue control block. */ QCB *ims_c_qcb; /* IMS completion queue control block. */ unchar *ims_scb; /* IMS statistics. */ unchar *ims_ccb; /* IMS crash data. */ paddr_t ims_phys_wccb; /* Physical address of wdog control blk. */ unchar *ims_s_int; /* IMS submimsion IRQ address. */ unchar *ims_c_int; /* IMS completion IRQ address. */ ulong ims_free_len; /* IMS length of free memory area */ paddr_t ims_free_addr; /* IMS pointer to IMS free memory area. */ unchar *ims_bios_comm_p; /* IMS pointer to BIOS comm. area. */ char ims_dstvalid; /* imsbiosdst ptr valid for next 100 mills */ char ims_rsv1[3]; /* Reserved. */ unchar *ims_bios_dst_p; /* BIOS device status table. physical addr */ CHAR_QCB *ims_rc_inp; /* Remote console data. IMS to OS queue. */ CHAR_QCB *ims_rc_out; /* Remote console data. OS to IMS queue. */ ERR_LOG_QCB *ims_error_log; /* IMS error log address */ char ims_mms_errlog_sync;/* MMS error log synchronization. */ char ims_rsv2[3]; /* Reserved */ } IMSHDR; /* ** IMS driver statistics per device. */ typedef struct { ulong interrupts; /* Completion interrupt count. */ ulong finished_reqs; /* Completed I/O requests. */ ulong start_reqs; /* Initiated I/O requests. */ ulong queued_reqs; /* Waiting I/O requests. */ ulong queue_depth; /* Outstanding I/O requests. */ ulong max_queue_depth; /* Greatest amount of I/O requests. */ ulong rc_out_chars_lost; /* Remote output chars lost occurrences. */ ulong rc_inp_chars_lost; /* Remote input chars lost occurrences. */ ulong sbe_ucount[4][2]; /* Single bit errors, upper 64. Indexed by memory bank (0-3), jnum position (0,1) */ ulong sbe_lcount[4][2]; /* Single bit errors, lower 64. Indexed by memory bank (0-3), jnum position (0,1) */ ulong dbe_ucount[4][2]; /* Double bit errors, upper 64. Indexed by memory bank (0-3), jnum position (0,1) */ ulong dbe_lcount[4][2]; /* Double bit errors, lower 64. Indexed by memory bank (0-3), jnum position (0,1) */ ulong mbe_ucount[4][2]; /* Multi bit errors, upper 64. Indexed by memory bank (0-3), jnum position (0,1) */ ulong mbe_lcount[4][2]; /* Multi bit errors, lower 64. Indexed by memory bank (0-3), jnum position (0,1) */ } IMS_DEVICE_STATS; /* ** IMS device table entry. */ typedef struct ims_device { int flag; /* Current state of device. */ int ivector; /* Interrupt vector. */ int pages; /* The number of memory mapped pages. */ paddr_t dp_ram; /* Physical address of dual port ram. */ IMSHDR *hdr; /* Virtual address of dual port ram. */ MRP_HDR *free_mrps; /* Current pool of available MRP_HDRs. */ MRP_HDR *free_mrps_tail; /* Tail ptr of available MRP_HDRs. */ MRP_HDR *active_mrp_hd; /* Head of active MRP_HDRs. */ MRP_HDR *active_mrp_tail; /* Tail of active MRP_HDRs. */ MRP_HDR *queued_mrp_hd; /* Head of queued MRP_HDRs. */ MRP_HDR *queued_mrp_tail; /* Tail of queued MRP_HDRs. */ IMS_DEVICE_STATS stats; /* Device specific diagnostic statistics. */ WCCB *virt_wccb; /* Virtual address of watchdog counter control block */ WCNTB *wd_ia; /* Virtual addr of CPU "I am alive" counters*/ struct cblock *rc_input; /* Queued remote console input . */ MRP_HDR *completed_mrps;/* Completed daemon requests. */ } IMS_DEVICE; #define TC_CTLOCK(tp) (clockbtty(&(tp)->t_cilock)) #ifdef __STDC__ #pragma comment(exestr, "@(#) trimpic.h 26.1 95/06/26 ") #else #ident "@(#) trimpic.h 26.1 95/06/26 " #endif /* ** ident @(#) @(#) trimpic.h 1.8 1 5/16/95 14:41:30 ** ** sccs_id[] = {"@(#) 1.8 trimpic.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: trimpic.h ** ** PURPOSE: Tricord K2 MPIC equate file ** ** DEPENDENCIES: ** ** o None. ** ** ** Rev 1.2 5/13/92 EDA Initial Version ** ** ---- 5/14/92 MWC Converted for SCO use ** ** ---- 7/20/92 MWC Changed MPIC addresses ** Added structure definition for ** local mpics. ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990, 1991, 1992 ** All rights reserved. ** ** *************************************************************************** */ /* *************************************************************************** ** Defines *************************************************************************** */ /* ** ****************************************************************************** ** **--- IO & LOCAL MPIC EQUATES ** ***************************************************************************** ** */ #define CCS_MPIC_BASE 0x0fee00000 /* Memory Mapped CCS Local MPIC */ #define EBS_MPIC_BASE 0x0fec00000 /* Memory Mapped EBS IO MPIC */ #define CCS_IOMPIC_BASE 0x0fec20000 /* Memory Mapped CCS IO MPIC */ #define MPIC_IORS 0x000 /* MPIC IO Register select (r/w) */ #define MPIC_IOWR 0x010 /* MPIC IO Window Register (r/w) */ #define MPIC_ID 0x020 /* MPIC ID Register (r/w) */ #define MPIC_VERSION 0x030 /* Version Register (ro) */ #define MPIC_PRIVATE0 0x040 /* Private Register 0 (r/w) */ #define MPIC_PRIVATE1 0x050 /* Private Register 1 (r/w) */ #define MPIC_PRIVATE2 0x060 /* Private Register 2 (r/w) */ #define MPIC_PRIVATE3 0x070 /* Private Register 3 (r/w) */ #define MPIC_TPR 0x080 /* Task Priority Register (r/w) */ #define MPIC_APR 0x090 /* Arbitration Priority Register(ro) */ #define MPIC_PPR 0x0a0 /* Processor Priority Register (ro) */ #define MPIC_EOI_REG 0x0b0 /* EOI Register (r/w) */ #define MPIC_REMOTE_REG 0x0c0 /* Remote Register (ro) */ #define MPIC_LOG_DES_REG 0x0d0 /* Logical Destination Register (r/w) */ #define MPIC_DES_FMT_REG 0x0e0 /* Destination Format Register (r/w) */ #define MPIC_SP_VEC_REG 0x0f0 /* Spurious Vector Register (r/w) */ #define MPIC_ISR0 0x100 /* ISR (31:0) (ro) */ #define MPIC_ISR1 0x110 /* ISR (63:32) (ro) */ #define MPIC_ISR2 0x120 /* ISR (95:64) (ro) */ #define MPIC_ISR3 0x130 /* ISR (127:96) (ro) */ #define MPIC_ISR4 0x140 /* ISR (159:128) (ro) */ #define MPIC_ISR5 0x150 /* ISR (191:160) (ro) */ #define MPIC_ISR6 0x160 /* ISR (223:192) (ro) */ #define MPIC_ISR7 0x170 /* ISR (255:244) (ro) */ #define MPIC_TMR0 0x180 /* TMR (31:0) (ro) */ #define MPIC_TMR1 0x190 /* TMR (63:32) (ro) */ #define MPIC_TMR2 0x1a0 /* TMR (95:64) (ro) */ #define MPIC_TMR3 0x1b0 /* TMR (127:96) (ro) */ #define MPIC_TMR4 0x1c0 /* TMR (159:128) (ro) */ #define MPIC_TMR5 0x1d0 /* TMR (191:160) (ro) */ #define MPIC_TMR6 0x1e0 /* TMR (223:192) (ro) */ #define MPIC_TMR7 0x1f0 /* TMR (255:244) (ro) */ #define MPIC_IRR0 0x200 /* IRR (31:0) (ro) */ #define MPIC_IRR1 0x210 /* IRR (63:32) (ro) */ #define MPIC_IRR2 0x220 /* IRR (95:64) (ro) */ #define MPIC_IRR3 0x230 /* IRR (127:96) (ro) */ #define MPIC_IRR4 0x240 /* IRR (159:128) (ro) */ #define MPIC_IRR5 0x250 /* IRR (191:160) (ro) */ #define MPIC_IRR6 0x260 /* IRR (223:192) (ro) */ #define MPIC_IRR7 0x270 /* IRR (255:244) (ro) */ #define MPIC_ICR0 0x300 /* Interr. Cmd Register (31:0) (r/w) */ #define MPIC_ICR1 0x310 /* Interr. Cmd Register (63:32) (r/w) */ #define MPIC_LVT_TIME0 0x320 /* Local Vec. Tbl [timer 0] (r/w) */ #define MPIC_LVT_TIME1 0x330 /* Local Vec. Tbl [timer 1] (r/w) */ #define MPIC_LVT_TIME2 0x340 /* Local Vec. Tbl [timer 2] (r/w) */ #define MPIC_LVT_LI0 0x350 /* Local Vec. Tbl [local int 0] (r/w) */ #define MPIC_LVT_LI1 0x360 /* Local Vec. Tbl [local int 1] (r/w) */ #define MPIC_LVT_PE 0x370 /* Local Vec. Tbl [prty err] (r/w) */ #define MPIC_ICNTR0 0x380 /* Initial Count Register 0 (r/w) */ #define MPIC_CCNTR0 0x390 /* Current Count Register 0 (ro) */ #define MPIC_ICNTR1 0x3a0 /* Initial Count Register 1 (r/w) */ #define MPIC_CCNTR1 0x3b0 /* Current Count Register 1 (ro) */ #define MPIC_ICNTR2 0x3c0 /* Initial Count Register 2 (r/w) */ #define MPIC_CCNTR2 0x3d0 /* Current Count Register 2 (ro) */ #define MPIC_DCR 0x3e0 /* Divider Config. Register (r/w) */ /* ****************************************************************************** ** **--- MPIC SPURIOUS INTERRUPT VECTOR REGISTER MASKS AND MISC. EQUATES ** ***************************************************************************** ** ** D[31:18] - Reserved ** D[17] - MRU Enable ** 0:MRU disabled ** 1:MRU enabled ** D[16] - MRU Supported ** 0:MRU not supported ** 1:MRU supported ** D[15] - UNIT ENABLED ** 0:Unit disabled ** 1:Unit enabled ** D[7:0] - Spurious Vector ** */ #define MPIC_MRU_EN_MSK 0x00020000 /* MRU Enable Mask */ #define MPIC_MRU_SUP_MSK 0x00010000 /* MRU Supported Mask */ #define MPIC_UNIT_EN_MSK 0x00000100 /* UNIT ENABLED Mask */ #define MPIC_SPUR_VEC_MSK 0x000000ff /* Spurious Vector Mask */ #define CCS_SPURIOUS_INT 0x0000000f /* IRQ7 Spurious Vector */ /* ****************************************************************************** ** **--- MPIC LOCAL VECTOR TABLE MASKS AND MISC. EQUATES ** ***************************************************************************** ** ** D[31:20] - Reserved ** D[19:18] - Timer Base (Timer 0,1,2 Only) ** D[17] - Timer Mode (Timer 0,1,2 Only) ** D[16] - Mask ** D[15] - Trigger Mode (Local 0/1 Only) ** D[14] - Remote IRR (Local 0/1 Only) ** D[12] - Delivery Status ** D[10:8] - Delivery Mode (Local 0/1 Only) ** D[7:0] - Vector ** */ #define MPIC_TMR_BASE_MSK 0x000c0000 /* Timer Base Mask */ #define MPIC_TMR_MODE_MSK 0x00020000 /* Timer Mode Mask */ #define MPIC_MASK_MSK 0x00010000 /* Mask Mask */ #define MPIC_TRIG_MSK 0x00008000 /* Trigger Mode Mask */ #define MPIC_RMT_MSK 0x00004000 /* Remote IRR Mask */ #define MPIC_DS_MSK 0x00001000 /* Delivery Status Mask */ #define MPIC_DM_MSK 0x00000700 /* Delivery Mode Mask */ #define MPIC_VEC_MSK 0x000000ff /* Vector Mask */ /***************************************************************************** ** **--- IO MPIC EQUATES (indirect I/O access) ** ***************************************************************************** ** */ #define IOMPIC_MPIC_ID 0x00 /* MPIC ID Register (r/w) */ #define IOMPIC_VERSION 0x01 /* Version Register (ro) */ #define IOMPIC_RDRCTN_TAB 0x10 /* Start of Redirection Table (r/w) */ /* Redirect. Table has 120 entries */ #define EBS_MPIC_IOID 0x01000000 /***************************************************************************** ** **--- IO MPIC VERSION REGISTER MASKS AND MISC. EQUATES ** ***************************************************************************** ** ** D[31:42] - Reserved ** D[23:16] - Max Redirection Table ( # of MPIC int. input pins -1) ** D[15:8] - Reserved ** D[7:0] - Version ** */ #define IOMPIC_MAXREDIR_MSK 0x00ff0000 /* # of MPIC interrupt input pins-1*/ #define IOMPIC_VERSION_MSK 0x000000ff /* MPIC version */ /* ****************************************************************************** ** **--- IO MPIC REDIRECTION TABLE ENTRY MASKS AND MISC. EQUATES ** ***************************************************************************** ** */ #define IOMPIC_RT_MASK_MSK 0x10000 /* Mask Mask */ #define IOMPIC_RT_TRIG_MSK 0x08000 /* Trigger Moded Mask */ #define IOMPIC_RT_RMT_MSK 0x04000 /* Remote IRR Mask */ #define IOMPIC_RT_DS_MSK 0x01000 /* Delivery Status Mask */ #define IOMPIC_RT_DESM_MSK 0x00800 /* Destination Mode Mask */ #define IOMPIC_RT_DM_MSK 0x00700 /* Delivery Mode Mask */ #define IOMPIC_RT_VEC_MSK 0x000ff /* Vector Mask */ #define IOMPIC_EXTINT 0x00700 /* Deliv. Mode - ExtINT */ #define IOMPIC_DEBUG 0x00600 /* Deliv. Mode - Debug */ #define IOMPIC_RESET 0x00500 /* Deliv. Mode - Reset */ #define MPIC_ASSERT 0xc000 #define MPIC_DEASSERT 0x8000 #define IOMPIC_INIT_REASSERT 0x00088500H #define IOMPIC_NMI 0x00400 /* Deliv. Mode - NMI */ #define IOMPIC_LOW_PRI 0x00100 /* Deliv. Mode - Lowest Priority */ #define IOMPIC_FIXED 0x00000 /* Deliv. Mode - Fixed */ #define IOMPIC_NO_MASK 0x00000 /* Dont mask interrupt. */ #define IOMPIC_TO_ALL 0xffffffff /* Logical Destination to all cpus */ /* * --- Interrupt Command Register Field Specifications */ #define MPIC_EXTINT 0x00700 /* Deliv. Mode - ExtINT */ #define MPIC_DEBUG 0x00600 /* Deliv. Mode - Debug */ #define MPIC_RESET 0x00500 /* Deliv. Mode - Reset */ #define MPIC_NMI 0x00400 /* Deliv. Mode - NMI */ #define MPIC_LOW_PRI 0x00100 /* Deliv. Mode - Lowest Priority */ #define MPIC_FIXED 0x00000 /* Deliv. Mode - Fixed */ #define MPIC_PHYSICAL 0x00000 /* Physical Destination mode */ #define MPIC_LOGICAL 0x00800 /* Logical Destination mode */ #define MPIC_DELIVERY_STATUS 0x01000 /* Delivery Status Mask */ #define MPIC_IDLE 0x00000 /* Interrupt Idle */ #define MPIC_INTERRUPT_PENDING 0x01000 /* Interrupt pending */ #define MPIC_LEVEL 0x08000 /* Level Interrupt */ #define MPIC_EDGE 0x00000 /* Edge interrupt */ #define MPIC_INVALID 0x00000 /* Invalid remote read status */ #define MPIC_IN_PROGRESS 0x10000 /* In progress remote read */ #define MPIC_VALID 0x20000 /* Valid remote read */ #define MPIC_DEST_FIELD 0x00000 /* Use Dest Field */ #define MPIC_SELF 0x40000 /* Destination self */ #define MPIC_ALL_SELF 0x80000 /* All including self */ #define MPIC_ALL_EX_SELF 0xc0000 /* All excluding self */ #define MPIC_TIMER_PERIODIC 0x20000 /* Periodic timer output */ /* *************************************************************************** ** Macros *************************************************************************** */ /* *************************************************************************** ** Structures *************************************************************************** */ /* * --- I/O MPIC access structure definition */ struct io_mpic { ulong select; /* Register select */ ulong filler[3]; /* Fill words */ ulong window; /* Window register */ }; /* * --- Local MPIC access structure definition */ struct local_mpic { ulong f0[4]; /* Fill words */ ulong f1[4]; /* Fill words */ ulong id; /* MPIC ID Register (r/w) */ ulong f2[3]; /* Fill words */ ulong version; /* Version Register (ro) */ ulong f3[3]; /* Fill words */ ulong private0; /* Private Register 0 (r/w) */ ulong f4[3]; /* Fill words */ ulong private1; /* Private Register 1 (r/w) */ ulong f5[3]; /* Fill words */ ulong private2; /* Private Register 2 (r/w) */ ulong f6[3]; /* Fill words */ ulong private3; /* Private Register 3 (r/w) */ ulong f7[3]; /* Fill words */ ulong tpr; /* Task Priority Register (r/w) */ ulong f8[3]; /* Fill words */ ulong apr; /* Arbitration Priority Register(ro) */ ulong f9[3]; /* Fill words */ ulong ppr; /* Processor Priority Register (ro) */ ulong f10[3]; /* Fill words */ ulong eoi_reg; /* EOI Register (r/w) */ ulong f11[3]; /* Fill words */ ulong remote_reg; /* Remote Register (ro) */ ulong f12[3]; /* Fill words */ ulong log_des_reg; /* Logical Destination Register (r/w) */ ulong f13[3]; /* Fill words */ ulong des_fmt_reg; /* Destination Format Register (r/w) */ ulong f14[3]; /* Fill words */ ulong sp_vec_reg; /* Spurious Vector Register (r/w) */ ulong f15[3]; /* Fill words */ ulong isr0; /* ISR (31:0) (ro) */ ulong f16[3]; /* Fill words */ ulong isr1; /* ISR (63:32) (ro) */ ulong f17[3]; /* Fill words */ ulong isr2; /* ISR (95:64) (ro) */ ulong f18[3]; /* Fill words */ ulong isr3; /* ISR (127:96) (ro) */ ulong f19[3]; /* Fill words */ ulong isr4; /* ISR (159:128) (ro) */ ulong f20[3]; /* Fill words */ ulong isr5; /* ISR (191:160) (ro) */ ulong f21[3]; /* Fill words */ ulong isr6; /* ISR (223:192) (ro) */ ulong f22[3]; /* Fill words */ ulong isr7; /* ISR (255:244) (ro) */ ulong f23[3]; /* Fill words */ ulong tmr0; /* TMR (31:0) (ro) */ ulong f24[3]; /* Fill words */ ulong tmr1; /* TMR (63:32) (ro) */ ulong f25[3]; /* Fill words */ ulong tmr2; /* TMR (95:64) (ro) */ ulong f26[3]; /* Fill words */ ulong tmr3; /* TMR (127:96) (ro) */ ulong f27[3]; /* Fill words */ ulong tmr4; /* TMR (159:128) (ro) */ ulong f28[3]; /* Fill words */ ulong tmr5; /* TMR (191:160) (ro) */ ulong f29[3]; /* Fill words */ ulong tmr6; /* TMR (223:192) (ro) */ ulong f30[3]; /* Fill words */ ulong tmr7; /* TMR (255:244) (ro) */ ulong f31[3]; /* Fill words */ ulong irr0; /* IRR (31:0) (ro) */ ulong f32[3]; /* Fill words */ ulong irr1; /* IRR (63:32) (ro) */ ulong f33[3]; /* Fill words */ ulong irr2; /* IRR (95:64) (ro) */ ulong f34[3]; /* Fill words */ ulong irr3; /* IRR (127:96) (ro) */ ulong f35[3]; /* Fill words */ ulong irr4; /* IRR (159:128) (ro) */ ulong f36[3]; /* Fill words */ ulong irr5; /* IRR (191:160) (ro) */ ulong f37[3]; /* Fill words */ ulong irr6; /* IRR (223:192) (ro) */ ulong f38[3]; /* Fill words */ ulong irr7; /* IRR (255:244) (ro) */ ulong f39[35]; /* Fill words */ ulong icr0; /* Interr. Cmd Register (31:0) (r/w) */ ulong f40[3]; /* Fill words */ ulong icr1; /* Interr. Cmd Register (63:32) (r/w) */ ulong f41[3]; /* Fill words */ ulong lvt_time0; /* Local Vec. Tbl [timer 0] (r/w) */ ulong f42[3]; /* Fill words */ ulong lvt_time1; /* Local Vec. Tbl [timer 1] (r/w) */ ulong f43[3]; /* Fill words */ ulong lvt_time2; /* Local Vec. Tbl [timer 2] (r/w) */ ulong f44[3]; /* Fill words */ ulong lvt_li0; /* Local Vec. Tbl [local int 0] (r/w) */ ulong f45[3]; /* Fill words */ ulong lvt_li1; /* Local Vec. Tbl [local int 1] (r/w) */ ulong f46[3]; /* Fill words */ ulong lvt_pe; /* Local Vec. Tbl [prty err] (r/w) */ ulong f47[3]; /* Fill words */ ulong icntr0; /* Initial Count Register 0 (r/w) */ ulong f48[3]; /* Fill words */ ulong ccntr0; /* Current Count Register 0 (ro) */ ulong f49[3]; /* Fill words */ ulong icntr1; /* Initial Count Register 1 (r/w) */ ulong f50[3]; /* Fill words */ ulong ccntr1; /* Current Count Register 1 (ro) */ ulong f51[3]; /* Fill words */ ulong icntr2; /* Initial Count Register 2 (r/w) */ ulong f52[3]; /* Fill words */ ulong ccntr2; /* Current Count Register 2 (ro) */ ulong f53[3]; /* Fill words */ ulong dcr; /* Divider Config. Register (r/w) */ }; struct returned_io_mpic { ulong id; ulong version; ulong rdr0_low; ulong rdr0_high; ulong rdr1_low; ulong rdr1_high; ulong rdr2_low; ulong rdr2_high; ulong rdr3_low; ulong rdr3_high; ulong rdr4_low; ulong rdr4_high; ulong rdr5_low; ulong rdr5_high; ulong rdr6_low; ulong rdr6_high; ulong rdr7_low; ulong rdr7_high; ulong rdr8_low; ulong rdr8_high; ulong rdr9_low; ulong rdr9_high; ulong rdr10_low; ulong rdr10_high; ulong rdr11_low; ulong rdr11_high; ulong rdr12_low; ulong rdr12_high; ulong rdr13_low; ulong rdr13_high; ulong rdr14_low; ulong rdr14_high; ulong rdr15_low; ulong rdr15_high; }; #ifdef __STDC__ #pragma comment(exestr, "@(#) triccs.h 26.2 95/07/03 ") #else #ident "@(#) triccs.h 26.2 95/07/03 " #endif /* ** ident @(#) triccs.h 1.1 1 11/14/94 10:27:21 ** ** sccs_id[] = {"@(#) 1.1 triccs.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: triccs.h ** ** PURPOSE: Tricord K2 CCS equate file ** ** DEPENDENCIES: ** ** o None. ** ** ** REVISION HISTORY: ** FPR/CRN Date Author Description ** ** Rev 1.6 5/13/92 EDA Initial Version ** ** ---- 5/14/92 MWC Converted for SCO use ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990, 1991, 1992 ** All rights reserved. ** ** *************************************************************************** */ /* * --- CCS I/O register map definitions */ #define CCS_ADDR_LOCAL 0xcf0 /* Local I/O address */ #define CCS_DATA_LOCAL 0xcf2 /* Local I/O data */ #define CCS_SLOT 0xcf4 /* Slot Id */ #define CCS_EISA_ID 0xc80 /* CCS EISA Identifier */ #define CCS_FCR 0xc84 /* feature control register */ #define CCS_CFG_REG 0xc86 /* Configuration Register */ #define CCS_HEX_DSP 0xc87 /* Diagnostic display */ #define CCS_ATTR_PAGE 0xc8a /* Attribute RAM paging address */ #define CCS_ATTR_DATA 0xc8d /* Attribute RAM data register */ #define CCS_EN_PC_REG 0xc8e /* Sys Bus Parity Chk Enable Reg */ #define CCS_SENSE 0xc8f /* Sys Bus Parity Chk Sense Reg */ #define CCS_SR 0xc90 /* Module Status Register */ #define CCS_PE_SOURCE 0xc92 /* Sys Bus Parity Err Source Reg */ #define CCS_PE_STATUS 0xc93 /* Sys Bus Parity Err Byte Src. */ /* * --- LOCAL IO EQUATES */ #define CCS_MR1_UART 0x00 /* Mode Register */ #define CCS_MR2_UART 0x00 /* Mode Register */ #define CCS_SR_UART 0x04 /* Status Register */ #define CCS_CLKSR_UART 0x04 /* Clock Select Register */ #define CCS_CSR_UART 0x08 /* Command Register */ #define CCS_RHR_UART 0x0c /* Receive Holding Register */ #define CCS_THR_UART 0x0c /* Transmit Holding Register */ #define CCS_ACR_UART 0x10 /* Auxiliary Control Register */ #define CCS_IMR_UART 0x14 /* Interrupt Mask Register */ #define CCS_CTU_UART 0x18 /* Counter/Timer Upper */ #define CCS_CTUR_UART 0x18 /* Counter/Timer Upper Register */ #define CCS_CTL_UART 0x1c /* Counter/Timer Lower */ #define CCS_CTLR_UART 0x1c /* Counter/Timer Lower Register */ /************************************************************************** * --- CCS MASKS AND MISC EQUATES ************************************************************************** */ /* * --- Feature Control register multiple CPU extenstions */ /* * D[15] - Reset CPU1 * D[14] - Select cache organization * D[13] - Error check enable * D[12] - Select cache locks * D[11] - Reset CPU3 * D[10] - Reset CPU2 * D[9] - Level 2 cache enable * D[8] - Enable read for ownership */ /* * --- Feature Control register I/O 0c84h (CCS_FCR) */ /* * D[15:8] - Reserved * D[7] - CPU Reset * D[6] - Serial port DTR * D[5] - Assert SYS_ATTN * D[4] - Reserved * D[3] - Assert SYS_IMS_ATTN * D[2] - Over-ride Config. RAM * D[1] - Over-ride Config. RAM * D[0] - Enable Cache and Config. RAM */ #define CCS_CR_RESET_MSK1 0x8000 /* CPU 1 Reset */ #define CCS_CR_RESET_MSK2 0x0400 /* CPU 2 Reset (future)*/ #define CCS_CR_RESET_MSK3 0x0800 /* CPU 3 Reset (future)*/ #define CCS_CR_RESET_MSK 0x0080 /* CPU Reset */ #define CCS_CR_DTR_MSK 0x0040 /* Serial port DTR */ #define CCS_CR_SYS_ATN_MSK 0x0020 /* Assert SYS_ATTN */ #define CCS_CR_SYS_IMS_ATN_MSK 0x0008 /* Assert SYS_IMS_ATTN */ #define CCS_CR_CRAM_ORIDE1_MSK 0x0004 /* Over-ride Config. RAM */ #define CCS_CR_CRAM_ORIDE2_MSK 0x0002 /* Over-ride Config. RAM */ #define CCS_CR_CACHE_EN_MSK 0x0001 /* Enable Cache and Config. RAM */ #define CCS_CR_RESET 1 /* CPU Reset */ #define CCS_CR_SYS_ATN 1 /* Assert SYS_ATTN */ #define CCS_CR_SYS_IMS_ATN 1 /* Assert SYS_IMS_ATTN */ #define CCS_CR_OR_NORMAL 00 /* Normal operation */ /* cache not over-ridden, cache */ /* enabled, write back */ #define CCS_CR_OR_CDWT 01 /* Cache disabled, Write Through */ #define CCS_CR_OR_CEWT 10 /* Cache enabled, Write Through */ #define CCS_CR_OR_CETM 11 /* Cache enabled test mode */ #define CCS_CR_ENC_ENCRAM 1 /* Enable Cache and Config. RAM */ #define CCS_SLAVE_START_FCR CCS_CR_OR_NORMAL | CCS_CR_ENC_ENCRAM /************************************************************************** * --- Configuration register ************************************************************************** */ /* * D[7] - cpu-cache module reset one-shot * D[6] - master/slave * D[5] - Self test enable * D[4] - System bus enable * D[3] - BIOS H/DIAG L ROM decoding * D[2] - ROM enable, * D[1] - strong/weak write orders * D[0] - cache line size (32 or 64 bytes) */ #define CCS_CF_ONE_SHOT_MSK 0x80 /* cpu-cache module reset one-shot*/ #define CCS_CF_MSTR_SLAVE_MSK 0x40 /* master/slave */ #define CCS_CF_SELF_TEST_MSK 0x20 /* Self test enable */ #define CCS_CF_SYS_BUS_MSK 0x10 /* System bus enable */ #define CCS_CF_LROM_DECODE_MSK 0x08 /* BIOS H/DIAG L ROM decoding*/ #define CCS_CF_LROM_ENABLE_MSK 0x04 /* ROM enable,*/ #define CCS_CF_STRNG_WEAK_MSK 0x02 /* strong/weak write orders */ #define CCS_CF_LNSIZE_MSK 0x01 /* cache line size (32 or 64 bytes) */ #define CCS_CF_ONE_SHOT 1 /* cpu-cache module reset one-shot */ #define CCS_CF_MASTER 1 /* master/slave */ #define CCS_CF_SLAVE 0 /* master/slave */ #define CCS_CF_SELF_TEST_ENABLE 1 /* Self test enable*/ #define CCS_CF_SYS_BUS_ENABLE 1 /* System bus enable */ #define CCS_CF_LROM_DECODE_BIOS 1 /* BIOS ROM decoding */ #define CCS_CF_LROM_DECODE_DIAG 0 /* DIAG ROM decoding */ #define CCS_CF_LROM_ENABLE 1 /* ROM enable, */ #define CCS_CF_STRONG_ORDER 1 /* strong write orders*/ #define CCS_CF_WEAK_ORDER 0 /* weak write orders*/ #define CCS_CF_LNSIZE_64 0 /* cache line size 64 bytes*/ #define CCS_CF_LNSIZE_32 1 /* cache line size 32 bytes */ /* * --- HEX DISPLAY * * D[7] - AMBER LED * D[6:0] - GREEN LEDs */ #define CCS_AMBER_LED_MSK 0x80 /* CCS AMBER LED Mask */ #define CCS_GREEN_LED6_MSK 0x40 /* CCS Green LED #6 mask */ #define CCS_GREEN_LED5_MSK 0x20 /* CCS Green LED #5 mask */ #define CCS_GREEN_LED4_MSK 0x10 /* CCS Green LED #4 mask */ #define CCS_GREEN_LED3_MSK 0x08 /* CCS Green LED #3 mask */ #define CCS_GREEN_LED2_MSK 0x04 /* CCS Green LED #2 mask */ #define CCS_GREEN_LED1_MSK 0x02 /* CCS Green LED #1 mask */ #define CCS_GREEN_LED0_MSK 0x01 /* CCS Green LED #0 mask */ /* * --- Attribute RAM data register (rw, byte ) * * D[7:5] - reserved * D[4] - 64/32 Bit Slave * D[3] - Main memory H/EISA L * D[2] - Write Back H/Write Though L * D[1] - Memory Read only L * D[0] - Memory cachability L * */ #define CCS_BUS_SIZE_MSK 0x10 /* Bus Size 64Bits H/32Bits L */ #define CCS_MEM_EISA_MSK 0x08 /* Main memory H/EISA L */ #define CCS_WB_WT_MSK 0x04 /* Write Back H/Write Though L */ #define CCS_MEM_RO_MSK 0x02 /* Memory Read only L*/ #define CCS_SELECT_64BIT 1 /* Select 64 Bit Wide Bus */ #define CCS_SELECT_32BIT 0 /* Select 32 Bit Wide Bus*/ #define CCS_SELECT_MEMORY 1 /* Select Main memory */ #define CCS_SELECT_EISA 0 /* Select EISA memory*/ #define CCS_SELECT_WB 1 /* Write Back */ #define CCS_SELECT_WT 0 /* Write Though */ #define CCS_SELECT_MEM_RO 0 /* Memory Read only */ #define CCS_SELECT_MEM_RW 1 /* Memory Read/Write */ #define CCS_SELECT_MEM_CACHE 0 /* Memory cachable */ #define CCS_SELECT_MEM_NOT_CACH 1 /* Memory NOT cachable */ #define CCS_ATTR_RAM_SZ 0xffff /* size of CCS attribute RAM */ /* * --- Sys Bus Parity Checker Enable Reg. (rw, byte ) * * * D[7] - Enable Parity Check for byte 7 * D[6] - Enable Parity Check for byte 6 * D[5] - Enable Parity Check for byte 5 * D[4] - Enable Parity Check for byte 4 * D[3] - Enable Parity Check for byte 3 * D[2] - Enable Parity Check for byte 2 * D[1] - Enable Parity Check for byte 1 * D[0] - Enable Parity Check for byte 0 */ #define CCS_BEN7_MSK 0x80 /* Enable Parity Check for byte 7*/ #define CCS_BEN6_MSK 0x40 /* Enable Parity Check for byte 6*/ #define CCS_BEN5_MSK 0x20 /* Enable Parity Check for byte 5*/ #define CCS_BEN4_MSK 0x10 /* Enable Parity Check for byte 4*/ #define CCS_BEN3_MSK 0x08 /* Enable Parity Check for byte 3*/ #define CCS_BEN2_MSK 0x04 /* Enable Parity Check for byte 2*/ #define CCS_BEN1_MSK 0x02 /* Enable Parity Check for byte 1*/ #define CCS_BEN0_MSK 0x01 /* Enable Parity Check for byte 0*/ #define CCS_BEN_ALL_MSK 0xff /* Enable Parity Check for all bytes*/ #define CCS_EN_PC 0 /* Enable Parity Checker */ /* * --- Sys Bus Parity Checker Sense Reg. (rw, byte ) * * D[7] - Parity Sense for byte 7 * D[6] - Parity Sense for byte 6 * D[5] - Parity Sense for byte 5 * D[4] - Parity Sense for byte 4 * D[3] - Parity Sense for byte 3 * D[2] - Parity Sense for byte 2 * D[1] - Parity Sense for byte 1 * D[0] - Parity Sense for byte 0 */ #define CCS_SEN7_MSK 0x80 /* Parity Sense for byte 7 */ #define CCS_SEN6_MSK 0x40 /* Parity Sense for byte 6 */ #define CCS_SEN5_MSK 0x20 /* Parity Sense for byte 5 */ #define CCS_SEN4_MSK 0x10 /* Parity Sense for byte 4 */ #define CCS_SEN3_MSK 0x08 /* Parity Sense for byte 3 */ #define CCS_SEN2_MSK 0x04 /* Parity Sense for byte 2 */ #define CCS_SEN1_MSK 0x02 /* Parity Sense for byte 1*/ #define CCS_SEN0_MSK 0x01 /* Parity Sense for byte 0 */ #define CCS_SEN_ALL_MSK 0x0ff /* Parity Sense for all bytes */ #define CCS_SENSE_EVEN 0 /* Generate even parity (default) */ #define CCS_SENSE_ODD 1 /* Generate odd parity */ /* * --- Module Status Register (ro, word ) * * * D[15] - Cache self test pass/fail * D[14] - System bus address width (40 or 32 bits) * D[13:12] - cacheline size (256, 128, 64 or 32 bytes) * D[11:8] - module diagnostic switches * D[7] - Master/Slave * D[6] - Is it me? * D[5] - IMS present * D[4] - Flush/Sync/Init status * D[3] - Parity Error * D[2] - Module fault LED (formerly reserved) * D[1] - cpu shutdown cycle occurred (formerly reserved) * D[0] - module detected error Interrupt pending to IMS */ #define CCS_SR_CACHE_ST_MSK 0x08000 /* Cache self test pass/fail */ #define CCS_SR_BUS_WIDTH_MSK 0x04000 /* System bus address width */ /* (40 or 32 bits) */ #define CCS_SR_LNSIZE_MSK 0x03000 /* cacheline size */ /* (256, 128, 64 or 32 bytes) */ #define CCS_SR_SWITCH_MSK 0x00f00 /* module diagnostic switches */ #define CCS_SR_MSTR_SLV_MSK 0x00080 /* Master/Slave */ #define CCS_SR_IS_IT_ME_MSK 0x00040 /* Is it me? */ #define CCS_SR_IMS_PRESENT_MSK 0x00020 /* IMS present */ #define CCS_SR_FSIS_MSK 0x00010 /* Flush/Sync/Init status */ #define CCS_SR_PE_MSK 0x00008 /* Parity Error */ #define CCS_SR_RED_LED_MSK 0x00004 /* Module fault LED */ #define CCS_SR_SHUTDOWN_MSK 0x00002 /* cpu shutdown cycle occurred */ /* * DP54C CCS Module Extended status ports (zC95,zC94,zC93,zC92) * * zC92 - CPU0 * zC93 - CPU1 * zC94 - CPU2 * zC95 - CPU3 * * D[7:6] - Cache Memory Installed * 00 - 512 kb cache * 01 - 1 Mb cache * 10 - 2 Mb cache * 11 - 4 Mb cache * D[5] - Cache Self-Test Active * D[4] - Cache Self-Test Failed * D[3] - CPU Shutdown Occured * D[2] - Reserved * D[1] - CPU parity error * D[0] - Internal Error */ #define CCS_SR_ST_ACTIVE_DP54 0x00020 /* Self-Test Active */ #define CCS_SR_ST_FAILED_DP54 0x00010 /* Self-Test Failed */ #define CCS_SR_SHUTDOWN_MSKDP54 0x00008 /* cpu shutdown cycle occurred */ /* for DP54C CCS */ #define CCS_SR_PE_MSKDP54 0x00002 /* Parity Error for DP54C CCS */ #define CCS_SR_INTERNL_DP54 0x00001 /* Internel Error */ #define CCS_SR_IMSATTN_MSK 0x00001 /* error Interrupt pending to IMS */ #define CCS_SR_CACHE_ST_PASS 1 /* Cache self test pass */ #define CCS_SR_CACHE_ST_FAIL 0 /* Cache self test pass */ #define CCS_SR_BUS_WIDTH_40 1 /* System bus address width 40 bits */ #define CCS_SR_BUS_WIDTH_32 0 /* System bus address width 32 bits */ #define CCS_SR_LNSIZE_32 0 /* cacheline size 32 bytes */ #define CCS_SR_LNSIZE_64 1 /* cacheline size 64 bytes */ #define CCS_SR_LNSIZE_128 2 /* cacheline size 128 bytes */ #define CCS_SR_LNSIZE_256 3 /* cacheline size 256 bytes */ #define CCS_SR_MASTER 1 /* master/slave */ #define CCS_SR_SLAVE 0 /* master/slave */ #define CCS_SR_IT_IS_ME 1 /* Yes its is! */ #define CCS_SR_IMS_PRESENT 1 /* IMS is installed */ #define CCS_SR_SYNC_FLUSH 1 /* Flush or Sync in progress */ #define CCS_SR_RED_LED_ON 1 /* Module fault LED */ #define CCS_SR_SHUTDOWN 1 /* cpu shutdown cycle occurred */ #define CCS_SR_IMSATTN 1 /* error Interrupt pending to IMS */ /* * --- Sys Bus Parity Error Source Reg.(ro, byte ) * * * D[7:4] - Slave id on parity error * * D[3] - parity error on slave write (formerly reserved) * This bit when a one indicates that the module has * detected a parity error on data written to the module * * D[2] - parity error on cpu read (formerly reserved) This * bit when a one indicates that the module has detected * a parity error on a cpu read. * * D[1] - local cache read parity error (formerly bit 2= * local parity error) This bit when a one indicates * that a local cache parity error on a cache read has * been detected * * D[0] - local cache copy back parity error This bit when * a one indicates that a local cache parity error on * a copy back has been detected */ #define CCS_PE_SLV_ID_MSK 0xf0 /* Slave id on parity error */ #define CCS_PE_SLV_WRT_MSK 0x08 /* parity error on slave write */ #define CCS_PE_CPU_READ_MSK 0x04 /* parity error on cpu read */ #define CCS_PE_LOC_CREAD_MSK 0x02 /* local cache read parity error */ #define CCS_PE_LOC_CPY_BACK_MSK 0x01 /* local cache copy back parity error */ #define CCS_PE_SLV_WRT 1 /* parity error on slave write */ #define CCS_PE_CPU_READ 1 /* parity error on cpu read */ #define CCS_PE_LOC_CREAD 1 /* local cache read parity error */ #define CCS_PE_LOC_CPY_BACK 1 /* local cache copy back parity error */ /* * --- Parity Error Byte source Reg. (ro, byte 0zc93) * * * Bits [7] - Parity byte 7 error. * Bits [6] - Parity byte 6 error. * Bits [5] - Parity byte 5 error. * Bits [4] - Parity byte 4 error. * Bits [3] - Parity byte 3 error. * Bits [2] - Parity byte 2 error. * Bits [1] - Parity byte 1 error. * Bits [0] - Parity byte 0 error. */ #define CCS_PE_BYTE7_MSK 0x80 /* Parity byte 7 error. */ #define CCS_PE_BYTE6_MSK 0x40 /* Parity byte 6 error. */ #define CCS_PE_BYTE5_MSK 0x20 /* Parity byte 5 error. */ #define CCS_PE_BYTE4_MSK 0x10 /* Parity byte 4 error. */ #define CCS_PE_BYTE3_MSK 0x08 /* Parity byte 3 error. */ #define CCS_PE_BYTE2_MSK 0x04 /* Parity byte 2 error. */ #define CCS_PE_BYTE1_MSK 0x02 /* Parity byte 1 error. */ #define CCS_PE_BYTE0_MSK 0x01 /* Parity byte 0 error. */ /* * --- CCS HEX Display POST Codes */ #define CCS_PC_NULL 0x00 /*Null (contents of display at reset) */ #define CCS_PC_READY 0x70 /* Module "Ready" (used by hs proto */ #define CCS_PC_LAMP_TEST 0x7f /* Lamp Test Post code */ #define CCS_PC_HEART_BEAT 0x40 /* CCS Module Heart Beat Code Mask */ /* * --- CCS HEX Display ERROR Codes */ #ifdef __STDC__ #pragma comment(exestr, "@(#) triebs.h 26.1 95/06/26 ") #else #ident "@(#) triebs.h 26.1 95/06/26 " #endif /* ** ident @(#) @(#) triebs.h 1.3 1 11/4/94 07:09:44 ** ** sccs_id[] = {"@(#) 1.3 triebs.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: triebs.h ** ** PURPOSE: Tricord K2 EISA Bridge subsystem equate file ** ** DEPENDENCIES: ** ** o None. ** ** ** Rev 1.6 5/13/92 EDA Initial Version ** ** ---- 5/14/92 MWC Converted for SCO use ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990, 1991, 1992 ** All rights reserved. ** ** *************************************************************************** */ /* ***************************************************************************** ** ** --- EBS MEMEORY MAP EQUATES ** ***************************************************************************** */ #define EBS_CONV_MEM 0x00000000 /* Start of conventional mem. */ #define EBS_DISPLAY_MEM 0x000a0000 /* Start of 128k Video Display mem. */ #define EBS_OPTION_MEM 0x000c0000 /* Start of 128k Option ROMs */ #define EBS_BIOS_ROM 0x000e0000 /* Start of 128k BIOS ROM */ #define EBS_HIGH_MEM 0x00100000 /* Start of high dram */ #define EBS_DIAG_ROM 0xffe00000 /* Start of EBS resident DIAG ROM */ #define EBS_BIOS_REMAP 0xfff00000 /* Remap of 0e0000-0fffff BIOS RO */ /**************************************************************************** ** ** --- EBS IO REGISTERS ** ***************************************************************************** ** */ #define EBS_HEX_DISPA 0x0080 /* EBS Hex Display Reg Alias (wo, byte) */ #define EBS_SBCR1 0x0c00 /* EBS Cntrl Reg1 ( rw, byte) */ #define EBS_30_40_LEDS 0x0c01 /* Model 30/40 LED Cntrl Reg Emu (ro, byte) */ #define EBS_TCR 0x0c02 /* Trans. Ctrl Reg (rw, byte) */ #define EBS_SBCR2 0x0c03 /* EBS Cntrl Reg2 (rw, byte) */ #define EBS_ECOID 0x0c04 /* EBS ECO ID Reg. (ro, byte) */ #define EBS_SR 0x0c05 /* EBS Error Status Reg (rw, byte) */ #define EBS_PE_SR 0x0c06 /* Parity Error Status Reg. (ro, byte) */ #define EBS_SBTO_SR 0x0c07 /* System Bus Time Out Stat. Reg (ro, byte) */ #define EBS_HEX_DSP 0x0c08 /* EBS Hex Display Register (rw, byte) */ #define EBS_ATTR_DATA 0x0c09 /* Attribute RAM data register (rw, byte) */ #define EBS_ATTR_PAGE 0x0c0a /* Attribute RAM paging address (rw, word) */ #define EBS_IRQ5_SEL 0x0c0c /* IRQ5 Select Register (rw, word) */ #define EBS_MPIC_POLARITY 0x0c0e /* EISA to MPIC Polarity Reg. (rw, byte) */ #define EBS_MPIC_SEL 0x0c0f /* EISA to MPIC Select (rw, byte) */ #define EBS_NVM_ADDR_LSB 0x0c10 /* EISA NVM Address Reg. (LSB) (rw, byte) */ #define EBS_NVM_ADDR_MSB 0x0c11 /* EISA NVM Address Reg. (MSB) */ /* (rw, byte) (bits 7-5, not used) */ #define EBS_NVM_DATA 0x0c12 /* EISA NVM Data Register (rw, byte) */ #define EBS_EISA_ID 0x0c80 /* EBS EISA Identifier (ro, dword)*/ /* ** - Product id portion of eisa id from EISA Bridge Subsystem EISA id ** - If product id is 02 then we are running on a model 30/40. ** - If product id is 08 then K2 */ #define IMS_3040_PRODUCT_ID 2 #define IMS_K2_PRODUCT_ID 8 #define EBS_PIC_CR1 0x0cc0 /* 3rd PIC command register #1 (rw, byte) */ #define EBS_PIC_CR2 0x0cc1 /* 3rd PIC command register #1 (rw, byte) */ /* ** Edge / level control registers */ #define EBS_PIC1_ELCR_PORT 0x4d0 #define EBS_PIC2_ELCR_PORT 0x4d1 #define EBS_NMI_STATUS_PORT 0x0061 #define EBS_NMI_ESTATUS_PORT 0x0461 /* ***************************************************************************** ** ** --- EBS MASKS AND MISC. EQUATES ** ***************************************************************************** */ /* ** ** ---EBS Cntrl Reg1 ** ** Bit Description Bit="0" Bit="1" Default Normal ** ** D[7] Cache line size (EBS only) 32 bytes 64 bytes 0 1 ** D[6] Reserved 0 0 ** D[5] System Bus Timeout Enable disabled enabled 0 1 ** D[4] Concurrent Mode Enable disabled enabled 0 1 ** D[3:2] CPU_MISS Mode <1:0> 0,0 Normal 0,0 0,0 ** 0,1 Reserved ** 1,0 Reserved ** 1,1 Reserved ** D[1:0] System Bus Arb Mode <1:0> 0,0 Normal 0,0 0,0 ** 0,1 Reserved ** 1,0 Reserved ** 1,1 Reserved ** */ #define EBS_CACHE_LN_SZ_MSK 0x80 /* Cache line size (EBS only) */ #define EBS_SYS_BUS_TO_MSK 0x20 /* System Bus Timeout Enable */ #define EBS_CONC_MODE_MSK 0x10 /* Concurrent Mode Enable */ #define EBS_MISS_MODE_MSK 0x0C /* CPU_MISS Mode <1:0> */ #define EBS_ARB_MODE_MSK 0x03 /* System Bus Arb Mode <1:0> */ /* ** ** ---Trans. Ctrl Reg ** ** Bit Description Bit="0" Bit="1" Default Normal ** ** D[7:5] Mstr Rd Prefetch Md <1:0> ** 0,0,0 Never ftch ln 0,0,0 1,0,1 ** - 0,0,1 LB & CGE4/ No PF ** 0,1,0 LB & CGE4/ PF @ 3wds ** 0,1,1 LB & CGE4/ PF @ 6wds ** 1,0,0 LB & (CGE4+PB)/PF @ 3wds ** 1,0,1 LB & (CGE4+PB)/PF @ 6wds ** 1,1,0 LB/ PF @ 3wds ** 1,1,1 LB/ PF @ 6wds ** D[4] Mstr Wrt Ln Enable disabled enabled 0 1 ** D[3] LIOWAIT no delay delay 0 0 ** D[2] Posted Write Enable disabled enabled 0 1 ** D[1:0] Slv Posted Wr Depth <1:0> 0,0 0,0 0,0 ** 0,1 ** 1,0 ** 1,1 ** */ #define EBS_MSTR_RD_PFM_MSK 0xE0 /* Mstr Rd Prefetch Md <1:0> */ #define EBS_MSTR_WLE_MSK 0x10 /* Mstr Wrt Ln Enable */ #define EBS_LIOWAIT_MSK 0x08 /* LIOWAIT */ #define EBS_POST_WE_MSK 0x04 /* Posted Write Enable */ #define EBS_SLV_PWD_MSK 0x03 /* Slv Posted Wr Depth <1:0> */ /* ** ** ---EBS Cntrl Reg2 ** ** Bit Description Bit="0" Bit="1" Default Normal ** ** D[7:4] Reserved (always read as zeros) ** D[3] EBS to System I/O Enable protect enabled 0 0 ** D[2] Diag FLASH ROM Disable enabled disabled 0 0/1 ** D[1] BIOS FLASH ROM Disable enabled disabled 0 0/1 ** D[0] EBS Parity Check Enable disabled enabled 0 1 ** */ #define EBS_ETS_IO_EN_MSK 0x08 /* EBS to System I/O Enable */ #define EBS_DFRD_MSK 0x04 /* Diag FLASH ROM Disable */ #define EBS_BFRD_MSK 0x02 /* BIOS FLASH ROM Disable */ #define EBS_EPCE_MSK 0x01 /* EBS Parity Check Enable */ /* ** ** ---EBS ECO ID Reg. ** ** D[7:4] Lower nibble of EISA Product ID (bits 11:8) ** D[3:0] Lower nibble of EISA Rev ID (bits 3:0) ** */ #define EBS_EISA_PID_MSK 0xF0 /* Lower nibble of EISA Product ID (bits 11:8) */ #define EBS_EISA_RID_MSK 0x0F /* Lower nibble of EISA Rev ID (bits 3:0) */ /* ** ** ---EBS Error Status Reg ** ** Bit Description ** ** D[7] SYS_IMS_ATTN generated by EBS ** D[6] EBS Master to System Bus Address Phase Timeout ** D[5] EBS Master to System Bus Data Phase Timeout ** D[4] Data FIFO overrun (EISA to Sysbus) ** D[3] Data FIFO overrun (Sysbus to EISA) ** D[2] Data FIFO error (Sysbus to EISA) ** D[1] Address FIFO overrun (EISA to Sysbus) ** D[0] Address FIFO overrun (Sysbus to EISA) ** */ #define EBS_IMS_ATTN_MSK 0x80 /* EBS driving SYS_IMS_ATTN */ #define EBS_APTO_MSK 0x40 /* EBS Master to System Bus Address Phase Timeout */ #define EBS_DPTO_MSK 0x20 /* EBS Master to System Bus Data Phase Timeout */ #define EBS_DFIFO_OR_ETS_MSK 0x10 /* Data FIFO overrun (EISA to Sysbus) */ #define EBS_DFIFO_OR_STE_MSK 0x08 /* Data FIFO overrun (Sysbus to EISA) */ #define EBS_DFIFO_ERROR_MSK 0x04 /* Data FIFO error (Sysbus to EISA) */ #define EBS_AFIFO_OR_ETS_MSK 0x02 /* Address FIFO overrun (EISA to Sysbus) */ #define EBS_AFIFO_OR_STE_MSK 0x01 /* Address FIFO overrun (Sysbus to EISA) */ /* ** ---Parity Error Status Reg. ** ** Bit Description ** ** D[7:5] Master ID Number 000=IMS (or no error) ** (valid only when one or more of bits 3:0 are set) ** 001=Slot J9 ** (first error captured only) ** 010=SlotJ10 ** 011=SlotJ11 ** 100=SlotJ12 ** 101=SlotJ13 ** 110=SlotJ14 ** 111=SlotJ15 ** D[4] EISA Master Read/EISA Slave write ** (valid only when one or more of bits 3:0 are set) ** D[3] Parity Error on data received from system bus, ** byte 7 (bits 63:56) or 3 (bits 31:24) ** D[2] Parity Error on data received from system bus, ** byte 6 (bits 55:48) or 2 (bits 23:16) ** D[1] Parity Error on data received from system bus, ** byte 5 (bits 47:40) or 1 (bits 15:8) ** D[0] Parity Error on data received from system bus, ** byte 4 (bits 39:32) or 0 (bits 7:0) ** */ #define EBS_PE_MID_MSK 0xE0 /* Master ID Number */ #define EBS_MSTR_SLV_MSK 0x10 /* EISA Master Read/EISA Slave write */ #define EBS_PE_BYTE7_OR_3_MSK 0x08 /* PE on data rec from sys bus, byte 7 or 3 */ #define EBS_PE_BYTE6_OR_2_MSK 0x04 /* PE on data rec from sys bus, byte 6 or 2 */ #define EBS_PE_BYTE5_OR_1_MSK 0x02 /* PE on data rec from sys bus, byte 5 or 1 */ #define EBS_PE_BYTE4_OR_0_MSK 0x01 /* PE on data rec from sys bus, byte 4 or 0 */ /* ** --- HEX DISPLAY ** ** D[7] - AMBER LED ** D[6:0] - GREE"#$%&N LEDs */ #define EBS_AMBER_LED_MSK 0x80 /* EBS AMBER LED Mask */ #define EBS_GREEN_LED6_MSK 0x40 /* EBS Green LED #6 mask */ #define EBS_GREEN_LED5_MSK 0x20 /* EBS Green LED #5 mask */ #define EBS_GREEN_LED4_MSK 0x10 /* EBS Green LED #4 mask */ #define EBS_GREEN_LED3_MSK 0x08 /* EBS Green LED #3 mask */ #define EBS_GREEN_LED2_MSK 0x04 /* EBS Green LED #2 mask */ #define EBS_GREEN_LED1_MSK 0x02 /* EBS Green LED #1 mask */ #define EBS_GREEN_LED0_MSK 0x01 /* EBS Green LED #0 mask */ /* ** ** ---IRQ5 Select Register ** ** Bit Description Bit="0" Bit="1" D N ** ** D[15] Slct SYS_ATTN_15 as input to IRQ5 ignored selected 0 0 ** D[14] Slct SYS_ATTN_14 as input to IRQ5 ignored selected 0 0 ** D[13] Slct SYS_ATTN_13 as input to IRQ5 ignored selected 0 0 ** D[12] Slct SYS_ATTN_12 as input to IRQ5 ignored selected 0 0 ** D[11] Slct SYS_ATTN_11 as input to IRQ5 ignored selected 0 0 ** D[10] Slct SYS_ATTN_10 as input to IRQ5 ignored selected 0 0 ** D[9] Slct SYS_ATTN_9 as input to IRQ5 ignored selected 0 0 ** D[8] Slct SYS_ATTN_IMS as inpt to IRQ5 ignored selected 0 0 ** D[7:3] Reserved (always read as zeros) 0 0 ** D[2] Slct EISA IRQ5 as input to IRQ5 ignored selected 0 0 ** D[1] Slct Third PIC as input to IRQ5 ignored selected 0 1 ** D[0] Slct IRQ5 active polarity act LOW act HIGH 0 1 ** */ #define EBS_SYS_ATTN_15_MSK 0x8000 /* Slct SYS_ATTN_15 as input to IRQ5 */ #define EBS_SYS_ATTN_14_MSK 0x4000 /* Slct SYS_ATTN_14 as input to IRQ5 */ #define EBS_SYS_ATTN_13_MSK 0x2000 /* Slct SYS_ATTN_13 as input to IRQ5 */ #define EBS_SYS_ATTN_12_MSK 0x1000 /* Slct SYS_ATTN_12 as input to IRQ5 */ #define EBS_SYS_ATTN_11_MSK 0x0800 /* Slct SYS_ATTN_11 as input to IRQ5 */ #define EBS_SYS_ATTN_10_MSK 0x0400 /* Slct SYS_ATTN_10 as input to IRQ5 */ #define EBS_SYS_ATTN_9_MSK 0x0200 /* Slct SYS_ATTN_9 as input to IRQ5 */ #define EBS_SYS_ATTN_IMS_MSK 0x0100 /* Slct SYS_ATTN_IMS as inpt to IRQ5 */ #define EBS_IRQ5_MSK 0x0004 /* Slct EISA IRQ5 as input to IRQ5 */ #define EBS_3RD_PIC_MSK 0x0002 /* Slct Third PIC as input to IRQ5 */ #define EBS_IRQ5_PLRTY_MSK 0x0001 /* Slct IRQ5 active polarity */ /* ***************************************************************************** ** 82351 LOCAL I/O EISA SUPPORT PERIPHERAL (LIO.E) ***************************************************************************** */ #define EBS_LIOE_CADDR 0x022 /* LIOE Configuration Index Register */ #define EBS_LIOE_CDATA 0x023 /* LIOE Configuration Data Register */ /* ** ** --- LIOE Configuration Registers (Accessed via EBS_LIOE_CADDR and ** EBS_LIOE_CDATA */ #define EBS_LIOE_IDREG 0x21 /* I.D. Register */ #define EBS_LIOE_PERA 0xc0 /* Peripheral Enable Register A */ #define EBS_LIOE_PERB 0xc1 /* Peripheral Enable Register B */ #define EBS_LIOE_PCR 0xc2 /* Parallel Configuration Register */ #define EBS_LIOE_SCRA 0xc3 /* Serial Configuration Register A */ #define EBS_LIOE_FDCCR 0xc4 /* Floppy Disk Controller Config. Reg */ #define EBS_LIOE_SCRB 0xc5 /* Serial Configuration Register B */ #define EBS_LIOE_COM3LA 0xc6 /* COM3 Prog. Chip Select Low Address */ #define EBS_LIOE_COM3HA 0xc7 /* COM3 Prog. Chip Select High Address */ #define EBS_LIOE_COM4LA 0xc8 /* COM4 Prog. Chip Select Low Address */ #define EBS_LIOE_COM4HA 0xc9 /* COM4 Prog. Chip Select High Address */ #define EBS_LIOE_PCSMR0 0xd0 /* Prog. Chip Select Mask Reg. 0 */ #define EBS_LIOE_PCSMR1 0xd1 /* 1 */ #define EBS_LIOE_PCSMR2 0xd2 /* 2 */ #define EBS_LIOE_PCSMR3 0xd3 /* 3 */ #define EBS_LIOE_PCSLA0 0xd4 /* Prog. Chip Select Low Addr. 0 */ #define EBS_LIOE_PCSLA1 0xd5 /* 1 */ #define EBS_LIOE_PCSLA2 0xd6 /* 2 */ #define EBS_LIOE_PCSLA3 0xd7 /* 3 */ #define EBS_LIOE_PCSHA0 0xd8 /* Prog. Chip Select High Addr. 0 */ #define EBS_LIOE_PCSHA1 0xd9 /* 1 */ #define EBS_LIOE_PCSHA2 0xda /* 2 */ #define EBS_LIOE_PCSHA3 0xdb /* 3 */ #define EBS_LIOE_CRPLRA 0xdc /* Config. RAM Page Location Reg. A */ #define EBS_LIOE_CRPLRB 0xdd /* Config. RAM Page Location Reg. B */ #define EBS_LIOE_CRCR 0xde /* Configuration RAM Command Reg. */ #define EBS_LIOE_EISAID0 0xe8 /* EISA ID Register 0 */ #define EBS_LIOE_EISAID1 0xe9 /* 1 */ #define EBS_LIOE_EISAID2 0xea /* 2 */ #define EBS_LIOE_EISAID3 0xeb /* 3 */ #define EBS_LIOE_EN 0x2 /* Ident LIO.E for programming */ #ifdef __STDC__ #pragma comment(exestr, "@(#) ims_mrp.h 26.1 95/07/19 ") #else #ident "@(#) ims_mrp.h 26.1 95/07/19 " #endif /* ** ident @(#) ims_mrp.h 1.21 1 5/24/95 11:28:15 ** ** sccs_id[] = {"@(#) 1.21 ims_mrp.h "} */ /***************************************************************************** ** ** INCLUDE FILE NAME: ims_mrp.h ** PURPOSE: IMS MRP definitions ** ** (C) Copyright TRICORD SYSTEMS INC. ** All rights reserved. Reproduction in whole or part without ** the expressed written consent of Tricord Systems, Inc., ** Plymouth, Minnesota is prohibited. ** *****************************************************************************/ /***************************************************************************** ** MRP status definitions *****************************************************************************/ enum MRP_STATUS { MRPST_OK = 0, /* normal request termination */ MRPST_MRP_TO, /* MRP timeout */ MRPST_NO_SESSION, /* no session active */ MRPST_ABORT, /* function aborted */ MRPST_INV_FUNC, /* invalid function */ MRPST_INV_SUB, /* invalid sub-function */ MRPST_INV_SGC, /* invalid scatter/gather count */ MRPST_INV_PARAM, /* invalid parameter */ MRPST_INV_SM_ID, /* invalid system module ID */ MRPST_INV_BIST_ID, /* invalid BIST table number */ MRPST_INV_REQ_ID, /* invalid request ID */ MRPST_INV_PASSWORD, /* invalid password */ MRPST_INV_ENTRY_NUM, /* invalid entry number */ MRPST_INV_LENGTH, /* invalid length of MRP */ MRPST_INV_AulongRESS, /* invalid address */ MRPST_INV_COUNT, /* invalid count */ MRPST_INV_TIME, /* invalid time */ MRPST_INV_DATE, /* invalid date */ MRPST_BIST_FAIL, /* BIST diagnostic failed */ MRPST_BIST_ABORT, /* BIST diagnostic aborted */ MRPST_KB_EMPTY, /* keyboard buffer empty */ MRPST_KB_FULL, /* keyboard buffer full */ MRPST_WRITE_FAIL, /* write failure */ MRPST_READ_FAIL, /* read failure */ MRPST_ERRLOG_EMPTY, /* error log empty */ MRPST_ERRLOG_NOT_FOUND, /* error log seq num not found */ MRPST_SHUTDOWN_FAIL, /* user shutdown failed */ MRPST_MAX /* maximum MRP status value */ }; /***************************************************************************** ** MRP function definitions *****************************************************************************/ enum MRP_FUNCTION { RQ_ALARM, /* alarm event */ RQ_ALARM_CLEAR, /* clear alarm event */ RQ_AP_ACTIVE, /* set/abort registration for user shutdown */ RQ_AP_DOWN, /* set/abort registration for user shutdown */ RQ_AP_SHUTDOWN, /* set/abort registration for user shutdown */ RQ_AP_SHUTDOWN_TO, /* update OS shutdown timer */ RQ_BIOS_WARM_BOOT, /* used to detect BIOS warm boot */ RQ_BIST_ABORT, /* abort BIST diagnostic */ RQ_BIST_ENTRY, /* read BIST table entry */ RQ_BIST_LEN, /* read BIST table length */ RQ_BIST_LOADRUN, /* download/execute BIST diagnostic */ RQ_BIST_RUN, /* execute BIST diagnostic */ RQ_CON_DISABLE, /* disable local console redirection */ RQ_CON_ENABLE, /* enable local console redirection */ RQ_CON_KEYBOARD, /* read/write keyboard buffer */ RQ_CON_VIDEO, /* read/write video memory */ RQ_DATA, /* read/write data */ RQ_ERROR_LOG, /* read and clear next error log entry */ RQ_IMS_CONFIG, /* read/write IMS/local configuration */ RQ_IMS_TIMEDATE, /* read/write IMS/local time and date */ RQ_MEM_IO, /* read/write local/system memory or i/o registers */ RQ_OS_SHUTDOWN, /* set/abort registration for operating system shutdown */ RQ_OS_STATUS, /* get operating system shutdown status */ RQ_RSC_TIMEDATE, /* read remote system console time and date */ RQ_SB_ACTIVITY, /* read system bus activity data */ RQ_SM_CONTROL, /* read/write system module control register */ RQ_SM_IDS, /* read system module IDs */ RQ_SM_INFO, /* read system module status information */ RQ_SM_STATS, /* read system module statistics data */ RQ_SM_STATUS, /* read system module status register */ RQ_SYS_CONFIG, /* read/write system configuration */ RQ_SYS_STATUS, /* read system status information */ RQ_UPS_STATUS, /* update external UPS status */ RQ_MAX /* maximum function/request value */ }; enum MRP_SUBFUNCTION { RQSUB_NONE = 0, /* no operation */ RQSUB_READ, /* read operation */ RQSUB_WRITE, /* write operation */ RQSUB_SET, /* set operation */ RQSUB_ABORT, /* abort operation */ RQSUB_MAX /* max sub-function code */ }; enum MRP_PRIORITY { MRP_PRI_LO, /* low priority */ MRP_PRI_HI, /* high priority */ MRP_PRI_MAX /* high priority */ }; #define MRP_PRI_SOLICITED (0<<7) /* solicited MRPs sent to RSC */ #define MRP_PRI_UNSOLICITED (1<<7) /* unsolicited MRPs sent to RSC */ /***************************************************************************** ** MRP header definition *****************************************************************************/ #pragma pack(1) typedef struct mrp_hdr_t { struct mrp_hdr_t *hdd_thread; /* IMS host device driver thread word */ ulong in_dual_port; /* data set in dual port */ struct mrp_hdr_t *virtual_addr;/* virtual address of MRP */ char *sleep_addr; /* Address to sleep and issue wakeup on when mrp is completed */ unchar key[2]; /* 'MR' key value */ #define MRP_KEY1 'M' #define MRP_KEY2 'R' ushort length; /* length of request */ unchar function; /* function number */ unchar sub_function; /* sub-function number */ ulong request_id; /* request identifier */ ushort timeout; /* request timeout value */ unchar priority; /* request priority and solicited/unsolicited flag */ unchar status; /* request status */ ulong devno; /* device and session numbers */ ulong reserved1; /* RESERVED */ ulong drv[2]; /* application reserved area */ ulong ims[2]; /* IMS reserved area */ unchar reserved3; /* RESERVED */ unchar checksum; /* checksum value of MRP header */ } MRP_HDR; #define MRP_HDR_SIZE (sizeof(MRP_HDR)) /***************************************************************************** ** MRP request definitions *****************************************************************************/ /* * --- MRP_AP_ACTIVE */ #define MAX_AP_VERSION 7 #define MAX_AP_DRIVER 15 typedef struct { MRP_HDR hdr; unchar ap_type; #define AP_UNIX_SCO 1 ulong ap_options; #define AP_OPTION_CONSOLE (1<<0) /* Remote console supported. */ unchar ap_version[MAX_AP_VERSION+1]; /* operating system version. */ #define SCO_3_2_4 "3.2.4" unchar ap_driver[MAX_AP_DRIVER+1]; /* Driver Revision Number. */ } MRP_AP_ACTIVE; /* operating system is up and running */ #define MRP_AP_ACTIVE_SIZE (sizeof(MRP_AP_ACTIVE)) /* * --- MRP_AP_DOWN */ typedef struct { MRP_HDR hdr; } MRP_AP_DOWN; /* operating system has completed shutdown */ #define MRP_AP_DOWN_SIZE (sizeof(MRP_AP_DOWN)) /* * --- MRP_AP_SHUTDOWN */ enum shutdown_reason_t { SHUTDOWN_USER, SHUTDOWN_TEMP, SHUTDOWN_POWER, MAX_SHUTDOWN_REASON }; typedef struct { MRP_HDR hdr; /* input parameters */ ushort delay_time; /* delay time after OS is down before system reset (seconds) */ /* output parameters */ ushort shutdown_time; /* delay time to start shutdown (minutes) */ unchar shutdown_reason; /* reason for shutdown */ unchar shutdown_msg[60]; /* ASCII-Z shutdown message (from IMS or user) */ } MRP_AP_SHUTDOWN; /* set/abort registration for user shutdown */ #define MRP_AP_SHUTDOWN_SIZE (sizeof(MRP_AP_SHUTDOWN)) /***************************************************************************** ** MRP request definition *****************************************************************************/ union MRP_PACKETS { MRP_AP_ACTIVE mrp_ap_active; MRP_AP_DOWN mrp_ap_down; MRP_AP_SHUTDOWN mrp_ap_shutdown; }; #define MRP_MAX_PACKET_SIZE (sizeof(union MRP_PACKETS)) #pragma pack() #ifdef __STDC__ #pragma comment(exestr, "@(#) imsd.h 26.1 95/07/19 ") #else #ident "@(#) imsd.h 26.1 95/07/19 " #endif /* ** ident @(#) imsd.h 1.18 1 5/24/95 11:28:15 ** ** sccs_id[] = {"@(#) 1.18 imsd.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: imsd.h ** ** PURPOSE: Intelligent Maintenance Subsystem Daemon ** Interface Declarations. ** ** DEPENDENCIES: ** o NONE ** ** ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1992 ** All rights reserved. ** ** *************************************************************************** */ /* *************************************************************************** ** Defines *************************************************************************** */ /* ** Type values returned by the IMS driver to the IMS daemon */ #define TYPE_LOG 1 /* Returned data is log message */ #define TYPE_READ 2 /* Completed read request from IMS */ /* *************************************************************************** ** Macros *************************************************************************** */ /* *************************************************************************** ** Typedefs *************************************************************************** */ typedef struct read_req { int type; char buffer[IMS_MAX_LOG_MSG]; } READ_REQ; m._..nmkdevn.m..o.scsitape_iiopp.scsi_iiopqhd_iioprcdrom_iiopstape_iioptgetns0uperms: # @(#) scsitape_iiop.sh 26.1 95/07/21 # # Copyright (C) 1992-1995 The Santa Cruz Operation, Inc. # All Rights Reserved. # The information in this file is provided for the exclusive use of # the licensees of The Santa Cruz Operation, Inc. Such users have the # right to use, modify, and incorporate this code into other products # for purposes authorized by the license agreement provided they include # this notice and the associated copyright notice with any such product. # The information in this file is provided "AS IS" without warranty. # # mkdev/scsitape - SCSI Tape Drive Configuration # # SCSI specific functions for mkdev tape # File is sourced by mkdev tape and run when a SCSI device is selected # rel=`grep rel /etc/perms/rts | sed "s/^#rel=//" | cut -c1-7` shared_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" client_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" ROOT=/ export ROOT . ${ROOT}/etc/conf/bin/path_map.sh init_path_mapping PATH=/etc:/bin:/usr/bin LANG=english_us.ascii export PATH LANG # Set change to NO change=NO tmp=/tmp/tp.$$ Stpdefault=/etc/default/Stp CPACKD=`get_mapped_path ID_CPACK_D` Stpspace=$CPACKD/Stp/space.h Stp_default_route=gen_Stp_route CSDEV=`get_mapped_path ID_SDEVICE_D` System=$CSDEV/Stp System_entry="Stp Y 1 0 0 0 0 0 0 0" CMDEV=`get_mapped_path ID_MDEVICE` Master=$CMDEV Stpfuncs="Stpopen Stpclose Stpinit Stpread Stpwrite Stpioctl" STPRETENSION=16 STPNOREWIND=8 STPCONTROL=128 # ---------- LOCAL FUNCTIONS ---------- These routines perform functions # specific to the Stp configuration # requirements # askSCSI_def: # ----------- # Establish the Stp unit which we are configuring # # Global variables set: # SCSIpos # askSCSI_def() { clearscr mesg="The current configuration is:\n Unit \tDescription\n `showsconfig` Enter the unit number you wish to become the new default\n " nStps=`wc -l < ${System}` nStps=`expr $nStps - 1` while : do prompt || return $FAIL case ${cmd} in [0-9]*) if [ $cmd -lt 0 -o $cmd -gt $nStps ] then echo "Invalid choice, please enter a number between 0 and $nStps" continue else SCSIpos=$cmd break fi ;; *) echo "Invalid choice" continue ;; esac done return $OK } # last_mdev: # --------- # return the number of entries in the mdevice file with the first field # matching the string passed in as argument # last_mdev() { cntd_entr=0 cntd_entr=`awk -e 'BEGIN { entries = 0 } \$1 == "'"$1"'" { entries ++ } END { print entries }' ${Master}` return } # rmvdrvr: # ----------- # remove the th mdevice entry associated with the . Used for # clearing unused majors when extended minor numbers are used. # Does not remove the first entry. This is the base major entry and is # explicitly removed by the confrm_scsi() function. # Called as: # rmvdrvr rmvdrvr() { pwd=`pwd` SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` cd $CCFD entry=$2 driver=$1 retval=$OK if [ ${entry} -eq 1 ] then cd ${pwd} return $FAIL fi awk -e 'BEGIN { entries = 0; } "'"$driver"'" == $1 { entries ++; if ( entries == '$entry' ) { print $6 } }' ${Master} | ( read majno ${SCFD}/configure -d -c -Z -m ${majno} > $CCFD/conflog || { conferr retval=$FAIL } ) cd ${pwd} return $retval } # parse_mscsi # ----------- # parse mscsi to get the HATYPE, HA, ID and LUN of a particular unit # Returns # $OK if the entry exists # $FAIL if the entry does not exist # Globals set # HATYPE which type of host adapter driver the unit is attached to # HA the host adapter number the unit is attached to # BUS the scsi bus of the adapter the target is attached to # ID the target SCSI ID of the unit # LUN The Logical Unit Number of the unit # # Calling sequence # parse_mscsi parse_mscsi() { MSCSI=`get_mapped_path ID_MSCSI` unit=$1 driver=$2 [ "x$unit" = "x" ] && return $FAIL [ "x$driver" = "x" ] && return $FAIL args=$* set `grep -v -e '^*' $MSCSI | awk ' BEGIN { entries=0; found=0; } /'$driver'/ { if ( entries == '$unit' ) { found=1; printf("%s %d %d %d %d\n", $1, $3, $4, $5, $6); } else { entries++; } } END { if ( found == 0 ) { printf("UNKNOWN -1 -1 -1\n") } }'` HATYPE=$1 HA=$2 ID=$3 LUN=$4 BUS=$5 set $args if [ "$HATYPE" = "UNKNOWN" ] then return $FAIL else return $OK fi } # getuserchoice # ------------- # Ask the user to specify the configuration of the SCSI tape drive. # Selectable items are: # Vendor ID string (optional) # SCSI version (optional) # Response data format (optional) # Router (mandatory default gen_Stp_route) # For all the optional items if a value is not chosen, the appropriate # default value will be used. # # Global variables updated: # Stpident Vendor ID string (default 0) # Stpversion SCSI version (default -1) # Stprdf Response data format (default -1) # Stproute Router (default gen_Stp_route) # Stpvendor Router index in table (default 0) # getuserchoice() { Stproute=${Stp_default_route} Stpvendor=0 # get Vendor ID string mesg=" Enter Vendor Identification string or press to use default " prompt Default || return $FAIL Stpident=\"$cmd\" if [ "${cmd}" = "Default" ] then Stpident=0 fi # get SCSI Version mesg=" Enter SCSI version that device is conformant to or press to use default " while : do prompt Default || return $FAIL if [ "${cmd}" = "Default" ] then Stpversion=-1 break fi case $cmd in [0-9]*) Stpversion=$cmd ;; *) error "Please enter a number or for default" continue ;; esac break done #get Response Data Format mesg=" Enter Response Data Format that device uses or press to use default " while : do prompt Default || return $FAIL if [ "${cmd}" = "Default" ] then Stprdf=-1 break fi case $cmd in [0-9]*) Stprdf=$cmd ;; *) error "Please enter a number or for default" continue ;; esac break done # get route for tape drive - this needs to parse the /etc/default/Stp # file and display the contents lines=`grep -v -e '^*' ${Stpdefault} | wc -l` mesg=`grep -v -e '^*' ${Stpdefault} | awk -F , ' BEGIN { printf("The following tape drive types are supported:\n\n"); } END { printf("\n\nPlease choose one of the above, press \nfor default,"); } { printf("\t%d. %s\n", FNR, $2) } '` while : do prompt Default || return $FAIL case $cmd in [0-9]*) if [ ${cmd} -lt 1 -o ${cmd} -gt ${lines} ] then echo "Invalid choice, please enter a number between 1 and ${lines}" continue fi Stpvendor=`expr $cmd - 1` Stproute=`grep -v -e '^*' ${Stpdefault} | awk -F , '(FNR=='$cmd') { print $1 }` break ;; *) if [ "${cmd}" = "Default" ] then Stpvendor=0 Stproute=${Stp_default_route} break else echo "Invalid choice, please try again" continue fi ;; esac done return $OK } # # rationalise_Stpspace # -------------------- # creates a list of drivers used by the new configuration obtained from # the Stp_tape_cfg[] table # rationalise_Stpspace() { # Create the route table and external definitions needed routes=`awk -F , ' BEGIN { in_table = 0; } /\/\* BEGIN SCO_STP ENHANCEMENTS \*\// { in_table = 1; next; } /\/\* END SCO_STP ENHANCEMENTS \*\// { in_table = 0; } { if ( in_table ) { sub(" }", "", $5); printf("\t%s,\\\\\n", $5); } }' ${Stpspace} | sort | uniq ` if [ "x$routes" = "x" ] then routes="\\" fi externs=`awk -F , ' BEGIN { in_table = 0; } /\/\* BEGIN SCO_STP ENHANCEMENTS \*\// { in_table = 1; next; } /\/\* END SCO_STP ENHANCEMENTS \*\// { in_table = 0; } { if ( in_table ) { sub(" }", "", $5); printf("extern int %s();\\\\\n", $5); } }' ${Stpspace} | sort | uniq ` if [ "x$externs" = "x" ] then externs="\\" fi # Now we need to do the sed itself # First do the route table sed -e " \:/\* BEGIN SCO_STP ROUTERS \*/:,\:/\* END SCO_STP ROUTERS \*/:c\\ /\* BEGIN SCO_STP ROUTERS \*/\\ ${routes} /\* END SCO_STP ROUTERS \*/ " ${Stpspace} > ${Stpspace}.00 || return $FAIL sed -e " \:\* BEGIN SCO_STP EXTERNS \*/:,\:/\* END SCO_STP EXTERNS \*/:c\\ /\* BEGIN SCO_STP EXTERNS \*/\\ ${externs} /\* END SCO_STP EXTERNS \*/ " ${Stpspace}.00 > ${Stpspace}.01 || return $FAIL mv ${Stpspace}.01 ${Stpspace} rm -f ${Stpspace}.00 return $OK } # find_Stpentry # ------------- # Locates the line number of the Stp_tape_cfg[] entry for the given unit # Calling sequence # find_Stpentry # Returns # $OK if the unit has an entry # $FAIL if the unit does not exist in the table # Global variables # line set to the line number of the Stp_tape_cfg entry # find_entry() { unit=$1 entry=`expr $unit + 1` line=`awk ' BEGIN { offset=-1; stop=0; } /\/\* BEGIN SCO_STP ENHANCEMENTS \*\// { offset = FNR } /\/\* END SCO_STP ENHANCEMENTS \*\// { stop = FNR } END { if ( offset < 0 || stop == 0 ) { print -1 } else { if ( ('$entry' + offset) >= stop ) { print -1 } else { print offset + '$entry' } } }' ${Stpspace}` if [ $line -lt 0 ] then return $FAIL else return $OK fi } # delete_Stpspace # --------------- # Remove the Stp_tape_cfg[] entry for the given unit # Calling sequence # delete_Stpspace # Returns # $OK if successful # $FAIL if the modification failed # delete_Stpspace() { unit=$1 find_entry $unit || return $FAIL sed -e "${line}d" ${Stpspace} > ${Stpspace}.00 || return $FAIL mv ${Stpspace}.00 ${Stpspace} return $OK } # update_Stpspace # --------------- # Change the Stp/space.h file to either Add or Remove the unit entry # If we are adding an entry, use the preset Stpvendor, Stpident, # Stprdf, Stpversion variables to create the tape config entry. # # Calling sequence: # update_Stpspace [Add|Remove] # update_Stpspace() { unit=$1 action=$2 case $action in Add) # Add a new entry to the space.h file sed -e "/\/\* END SCO_STP ENHANCEMENTS \*\//i\\ { ${Stpident}, ${Stpvendor}, ${Stpversion}, ${Stprdf}, ${Stproute} }, " ${Stpspace} > ${Stpspace}.00 || cleanup $FAIL TUVWXYZ[\]^_`abcmv ${Stpspace}.00 ${Stpspace} # create list of drivers needed in new configuration rationalise_Stpspace || cleanup $FAIL ;; Remove) # Delete the entry in Stp_tape_cfg table corresponding to $unit delete_Stpspace $unit || cleanup $FAIL # update list of drivers needed in new configuration rationalise_Stpspace || cleanup $FAIL ;; *) error "update_Stpspace: Unexpected action value $action" return $FAIL esac return $OK } # showsconfig # ----------- # display the current SCSI tape configuration by obtaining the router # entry from ${Stpspace} and displaying the text entry in ${Stpdefault} # showsconfig() { routes=`awk -F , ' BEGIN { in_table = 0; } END { printf("\n"); } /\/\* BEGIN SCO_STP ENHANCEMENTS \*\// { in_table = 1; next; } /\/\* END SCO_STP ENHANCEMENTS \*\// { in_table = 0; } { if ( in_table ) { sub(" }", "", $5); printf("%s ", $5); } }' ${Stpspace}` unit=0 for i in $routes do grep -v -e '^*' ${Stpdefault} | awk -F , '{ if ( match($1, "'$i'") ) { printf("%8d\t%s\n", '$unit', $2) } }' unit=`expr $unit + 1` done } # config_Stp # ---------- # Prompt the user for configuration information used for the specified # unit. Information is: # Vendor ID, SCSI version, Response Data Format # Can be called for both remove and add. # Updates the Stp/space.h configuration file # Calling sequence: # config_Stp [Add|Remove] # config_Stp() { unit=$1 action=$2 default=0 [ -f ${Stpdefault} ] || { # couldnt find default configuration file, only allow the # generic entry default=1 echo "Warning: could not find ${Stpdefault} Only default configuration options are possible" } [ -f ${Stpspace} ] || { error "Missing ${Stpspace} installation cannot proceed" cleanup ${FAIL} } case ${action} in Add|add) Stpident=0 Stpvendor=0 Stpversion=-1 Stprdf=-1 Stproute=${Stp_default_route} [ ${default} -eq 0 ] && getuserchoice # update configuration info update_Stpspace $unit Add || return $FAIL ;; Remove|remove) update_Stpspace $unit Remove || return $FAIL ;; esac return $OK } ############### # ---------- CONFIGURE ROUTINES ------- These routines extract information # from and modify kernel configuration # files and parameters. # This routine sets cf_state and the device major number if applicable. # Possible values for cf_state are as follows. # NO: Device not present in mdevice file and therefore has # no major number. # PART: Device present in mdevice file but the device does not have a # corresponding entry in the sdevice file # N.B. there should be one entry per unit # EXTRA: Adding one more Stp entry will require a new major device number # to be used. This is for extended minor device numbers # Removing one Stp unit will require an mdevice entry to be removed # Return values: # $OK if the configuration files do not need to be updated # $FAIL if the configuration files may need to be updated confchk_scsi () { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` name=$1 cf_state= major= pwd=`pwd` cd $CCFD major=`${SCFD}/configure -j $name` || { cf_state=NO cd ${pwd} return $FAIL } oldnum=`expr $SCSIpos / 8` newadd=`expr $SCSIpos + 1` newadd=`expr $newadd / 8` newdel=`expr $SCSIpos - 1` newdel=`expr $newdel / 8` if [ ${oldnum} -eq ${newadd} -a ${oldnum} -eq ${newdel} ] then cf_state=PART if [ -r ${System} ] then : else getyn " This device has an entry in the master device file but no corresponding system device entry. Do you wish to continue and have a default entry created?" || cleanup $FAIL fi cd ${pwd} return $FAIL else if [ ${oldnum} -ne ${newadd} ] then cf_state=ADD_EXTRA Stpoffset=`expr ${newadd} \* 256` else cf_state=DEL_EXTRA fi cd ${pwd} return $FAIL fi } # # Add Stp driver according to cf_state. # # If cf_state is NO we configure in the driver # if cf_state is PART or DEL_EXTRA we just add an sdevice entry # if cf_state is ADD_EXTRA we must add a new mdevice entry for extended minors # plus an sdevice entry # Global variables used and where set: # $fns: add routines # $cf_state: confchk_scsi() # $Stpoffset: confchk_scsi() confadd_scsi() { SCFD=`get_mapped_path ID_SCF_D` pwd=`pwd` cd $SCFD case $cf_state in NO) echo "\nAdding device to system configuration files ...\c" >&2 [ -f ${System} ] || { cp /dev/null ${System} } major=`./configure -j NEXTMAJOR` flags="Iocrwi" char="iHcsZpR" entry="Stp ${flags} ${char} Stp 0 ${major} 1 1 -1" echo ${entry} | tr ' ' ' ' >> ${Master} ;; DEL_EXTRA|PART) echo "\nUpdating system configuration ...\c" >&2 ;; ADD_EXTRA) echo "\nAdding device to system configuration ...\c" >&2 Stpmajor=`./configure -j ${DRIVER}` || { conferr cd ${pwd} return $FAIL } major=`./configure -j NEXTMAJOR` flags="Iocrwi" char="iHcsZpRM" entry="Stp ${flags} ${char} Stp 0 ${major} ${Stpmajor} ${Stpoffset} -1" echo ${entry} | tr ' ' ' ' >> ${Master} ;; *) echo "Unknown state ${cf_state}" cd ${pwd} return $FAIL ;; esac # # Add an sdevice entry to the ${System} file # echo ${System_entry} | tr ' ' ' ' >> ${System} echo "\n\nSystem files have been successfully updated." change=YES cd ${pwd} return $OK } # Configure driver out of system configuration files # Removes sdevice entry and deconfigures driver when no more units are left # Removes extended minor entries from mdevice when necessary # Global variables used and where set: # $cf_state: confchk_scsi() # $major: confchk_scsi() # If cf_state is DEL_EXTRA we must remove an entry from mdevice confrm_scsi() { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` pwd=`pwd` cd $SCFD nStps=`wc -l < ${System}` || { echo "Unable to read sdevice file" cd ${pwd} cleanup $FAIL } echo "\nUpdating system files to effect removal of driver ...\c" sed '1d' ${System} > ${System}.new mv ${System}.new ${System} if [ $nStps -eq 1 ] then # remove Stp driver from kernel ./configure -c -d -m $major > $CCFD/conflog 2>&1 || { conferr cd ${pwd} return $FAIL } fi if [ $cf_state = DEL_EXTRA ] then # remove last mdevice entry last_mdev Stp rmvdrvr Stp ${cntd_entr} || { cd ${pwd} return $FAIL } fi echo "\n\nSystem files have been updated." rm -f $CCFD/conflog change=YES cd ${pwd} return $OK } # mk_Stpnodes: # ------------ # create special device nodes for given unit. These are added to the # node.d/Stp entry and will be created when the kernel is relinked # # Calling sequence: # mk_Stpnodes # # The following entries are created: # Retension /dev/rmt/Sc0sr # No Rewind /dev/rmt/Sc0sn # /dev/nrStp # Raw device /dev/rmt/Sc0s # /dev/rStp # Control device /dev/rmt/Sc0sx # /dev/xStp # # mk_Stpnodes() { unit=$1 offset=`expr $unit / 8` #add appropriate minor multiples for offset=`expr $offset \* 256` #extended device numbers #retension device ret=`expr $unit + $STPRETENSION` ret=`expr $ret + $offset` #no rewind device nrw=`expr $unit + $STPNOREWIND` nrw=`expr $nrw + $offset` #raw device raw=`expr $unit + $offset` #control device ctl=`expr $unit + $STPCONTROL` ctl=`expr $ctl + $offset` mkdevice_t rmt/Sc0s${unit}r ${ret} mkdevice_t rmt/Sc0s${unit}n ${nrw} mkdevice_t rmt/Sc0s${unit} ${raw} mkdevice_t rmt/Sc0s${unit}x ${ctl} lndevice l rmt/Sc0s${unit}n nrStp${unit} lndevice l rmt/Sc0s${unit} rStp${unit} lndevice l rmt/Sc0s${unit}x xStp${unit} # add device.dat entry create_Stp_dd_entry ${unit} update_dd_minor $DRIVER$unit D_NOREWIND_NODE ${nrw} update_dd_minor $DRIVER$unit D_REWIND_NODE ${raw} update_dd_minor $DRIVER$unit D_CTL_NODE ${ctl} # update space.c file update_probe_struct ${unit} } # rm_Stpnodes: # ----------- # remove special device nodes for given unit from node.d/Stp # The /dev entries will be removed when the kernel is relinked # # Calling sequence: # rm_Stpnodes # rm_Stpnodes() { unit=$1 rmdevice rmt/Sc0s${unit}r $2 rmdevice rmt/Sc0s${unit}n $2 rmdevice rmt/Sc0s${unit} $2 rmdevice rmt/Sc0s${unit}x $2 rmdevice nrStp${unit} $2 rmdevice rStp${unit} $2 rmdevice xStp${unit} $2 make_nodes=YES # remove device.dat entry remove_dd_entry $DRIVER$unit # update space.c file update_probe_struct `expr ${unit} - 1` } # ------------- Add Drivers These routines add drivers to the # kernel configuration, update mscsi # and create device nodes # addscsi: # ------- # Check that link-kit is installed, Stp driver is configured in, # Update mscsi and link-kit # Get tape configuration information from user # # Global variables used and where set: # $DRIVER, $DESCR: menu routines; # $major: confchk_scsi() confadd_scsi() # $SCSIpos: find_SCSIpos() # Global variables set: # dev_major, change # addscsi () { # Check for the presence of the link kit. Install if it not present. permschk && linkchk # Configure the driver if necassary. find_SCSIpos nStps=`expr $SCSIpos + 1` update=0 confchk_scsi "$DRIVER" || { update=1 } # Edit /etc/conf/cf.d/mscsi /bin/sh /usr/lib/mkdev/.scsi_iiop -a -t -n || return $FAIL change=YES # Update the system configuration for the new Stp entry if [ $update -eq 1 ] then # Add scsi driver to config files. fns=${Stpfuncs} confadd_scsi || cleanup $FAIL fi # Set dev_major for use in mkdevice(). dev_major=$major SCSIpos=${nStps} # Create pure scsi devices. mk_Stpnodes ${SCSIpos} # Configure the SCSI tape to match user preference echo "\nConfiguring Stp driver ..." config_Stp ${SCSIpos} Add echo "\nStp driver successfully configured" # Check to see if we already have a default tape device def_nodeclash && { # Link driver to default devices. lnk_defaults "$DRIVER" def_driveclash && { # edit /etc/default/tape. edit_def "$DRIVER" } } return $OK } # ------- Remove Drivers -------- These routines remove tape drivers from # configuration files and delete # appropriate devices. # rmscsi # ----- # Remove a specified Stp unit from the kernel configuration. Updates mdevice, # sdevice and mscsi. node.d/Stp has the appropriate nodes removed for the unit. # Note: only the ${Stpspace} file needs to have a particular unit removed. All # other kernel configuration files can just have the last unit cleared. # To support this, we prompt the user for the unit to remove first and # then use the last mscsi entry for the actual kernel reconfiguration. # Only config_Stp needs the real unit number to work correctly # # Global variables used and where set: # $DRIVER, $DESCR: menu routines; # $SCSIpos: find_SCSIpos() rmscsi() { # prompt the user for the desired unit [ -f ${System} ] || { error "There are no SCSI tapes currently configured." return $FAIL } mesg="The current configuration is:\n Unit \tDescription\n `showsconfig` Enter the unit number you wish to remove " nStps=`wc -l < ${System}` nStps=`expr $nStps - 1` while : do prompt || return $FAIL case ${cmd} in [0-9]*) if [ $cmd -lt 0 -o $cmd -gt $nStps ] then echo "Invalid choice, please enter a number between 0 and $nStps" continue else Drivenum=$cmd break fi ;; *) echo "Invalid choice" continue ;; esac done # now get the last drive which we will remove from the # kernel configuration find_SCSIpos ; oSCSIpos=$SCSIpos confchk_scsi "$DRIVER" || { if [ "$cf_state" = "NO" ] then echo " The ${DESCR}r is not currently configured.\n" return $FAIL fi } if [ $oSCSIpos -lt 0 ] then getyn " There are currently no SCSI Tape Drives configured in the /etc/conf/cf.d/mscsi file. Do you wish to continue." || return $FAIL else # We know the entry to remove from mscsi so we get the HA, ID, # LUN and HATYPE for the entry parse_mscsi $Drivenum $DRIVER || return $FAIL /bin/sh /usr/lib/mkdev/.scsi -r -t -n $HA $ID $LUN $HATYPE $BUS || return $FAIL fi find_SCSIpos ; nSCSIpos=$SCSIpos differ=`expr $oSCSIpos - $nSCSIpos` case $differ in 0) echo " The number of SCSI Tape Drives has not been changed." return $FAIL ;; esac change=YES SCSIpos=$oSCSIpos if [ $SCSIpos -gt $nSCSIpos ] then # Remove entries from node.d/Stp rm_Stpnodes ${SCSIpos} "$DRIVER" is_default && { echo "\nRemoving default tape devices." rm_defaults "$DRIVER" edit_def "NONE" } SCSIpos=`expr $SCSIpos - 1` fi permschk && linkchk confrm_scsi || cleanup $FAIL # remove the Stp configuration information for this unit config_Stp ${Drivenum} Remove echo " The $DESCR specified and associated devices have been removed." return $OK } # ----- Change Default Tape ------ These routines implement a change # in the default tape drive. # Global variables used and where set: # $DRIVER, $DESCR: menu routines; # $SCSIpos: find_SCSIpos() or askSCSI_def changescsi() { # This will return the number of SCSI tape drives. find_SCSIpos confchk_scsi "$DRIVER" || { if [ $cf_state = NO ] then echo "\nThe ${DESCR}r is not currently installed." return $FAIL fi } # If ct exists, we want to let it keep it's default status. confchk "ct" && { echo " The presence of the Cartridge Tape Driver has been detected. The Cartridge Tape Drive must use the default devices to function properly. Therefore, to use a SCSI Drive as the default, you must first remove the Cartridge Tape." return $FAIL } if [ $SCSIpos -gt 0 ]; then # This routine will reset SCSIpos to the one they want. askSCSI_def || return $FAIL lnk_defaults "$DRIVER" else lnk_defaults "$DRIVER" fi edit_def "$DRIVER" return $OK } # ------- MENU ROUTINES ------- These routines present a menu, # prompt the user, set global variables # and execute appropriate routines. #install menu for SCSI type tapes # installsmenu () { DESCR="SCSI Tape Drive" DRIVER=Stp addscsi || return changebootstr } # remove menu for SCSI type tapes removesmenu () { DESCR="SCSI Tape Drive" DRIVER=Stp rmscsi || return changebootstr } #change menu for SCSI type tapes changesmenu () { DESCR="SCSI Tape Drive" DRIVER=Stp changescsi || return changebootstr } # display current SCSI tape configuration showsmenu () { [ -f ${System} ] || { error "There are no SCSI tapes currently configured." return $FAIL } echo "\n\nThe current SCSI tape configuration is:\n" echo " Unit \tDescription\n" showsconfig echo "\nPress to continue \c" read X } configsmenu() { clearscr while mesg="\n\nSCSI Tape Drive Configuration Program \n 1. Install a SCSI Tape Drive 2. Remove a SCSI Tape Drive 3. Change default Tape Drive 4. View Current SCSI Tape Drive configuration Select an option " quit="return to main menu" do prompt || break # reset these flags prior to each pass through menu major= IPL= IV= select=$cmd case $select in 1) installsmenu ;; 2) removesmenu ;; 3) changesmenu ;; 4) showsmenu ;; *) echo "\n Please select either 1, 2, 3 or 4" continue ;; esac done } # create a device.dat entry for a device create_Stp_dd_entry() { devfile="/etc/conf/pack.d/Stp/device.dat" echo Stp${1}: >> ${devfile} echo '\t'INDEX=Stp${1} >> ${devfile} echo '\t'PATH=node0,node1 >> ${devfile} echo '\t'node0=D_SUBSYS,SCSI Tape,0,D_TAPE_SUBSYS,,NULL >> ${devfile} echo '\t'node1=D_UNIT,Drive $1,0,$1,D_REMOVABLE,NULL >> ${devfile} echo '\t'D_USER_MSG=SCSI Tape Drive,8,0,,NULL >> ${devfile} echo '\t'D_REWIND_NODE = >> ${devfile} echo '\t'D_NOREWIND_NODE = >> ${devfile} echo '\t'D_CTL_NODE = >> ${devfile} } # rewrite the probe information file in space.c # assumes that devices are contiguously numbered from 0 # and that we pass in the number of the last valid unit update_probe_struct() { tmp="/tmp/$1.$$" devfile="/etc/conf/pack.d/$DRIVER/space.c" awk ' BEGIN { i = 0 } { if ( $1 == "/*_PROBE_START_*/" ) { i = 1 ; n = 0 ; print n = '$1' for (dv = 0; (dv <= n ); dv++) { printf "#define Stp%d\t0\n", dv } printf "int StpProbe[] = {" for (dv = 0; (dv <= n ); dv++) { printf "Stp%d,", dv } printf "0};\n" } if ( $1 == "/*_PROBE_STOP_*/" ) { i = 0 } if ( i == 0 ) { print } }' < $devfile > $tmp mv -f $tmp $devfile } : # @(#) scsi_iiop.sh 26.1 95/07/21 # # Copyright (C) 1989-1995 The Santa Cruz Operation, Inc. # All Rights Reserved. # The information in this file is provided for the exclusive use of # the licensees of The Santa Cruz Operation, Inc. Such users have the # right to use, modify, and incorporate this code into other products # for purposes authorized by the license agreement provided they include # this notice and the associated copyright notice with any such product. # The information in this file is provided "AS IS" without warranty. # # mkdev/.scsi - SCSI Configuration # rel=`grep rel /etc/perms/rts | sed "s/^#rel=//" | cut -c1-7` shared_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" client_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" ROOT=/ export ROOT . ${ROOT}/etc/conf/bin/path_map.sh init_path_mapping # set the standard exit values : ${OK=0} ${FAIL=1} ${STOP=10} # set the environment variables LANG=english_us.ascii export LANG PATH=/etc:/bin:/usr/bin export PATH umask 022 #file specifying default SCSI host adaptor type USE_DEF=1 UPGRADE=N HALISTFILE=/etc/default/scsihas # RTS not LINK firstime= # # Standard functions # # Print an error message # # Usage: error "message" # Argument is a quoted error message # Notes: error always returns 1. # error() { echo "\nError: $*" >&2 return 1 } # Prompt with mesg, return non-zero on q prompt() { while echo "\n${mesg}or enter q to quit: \c" >&2 do read cmd case $cmd in +x|-x) set $cmd ;; Q|q) return $FAIL ;; !*) eval `expr "$cmd" : "!\(.*\)"` ;; "") # If there is an argument use it as the default # else loop until 'cmd' is set [ "$1" ] && { cmd=$1 return $OK } : continue ;; *) return $OK ;; esac done } # Prompt for yes or no answer - returns non-zero for no getyn() { while echo "\n$* (y/n) \c">&2 do read yn rest case $yn in [yY]) return $OK ;; [nN]) return $FAIL ;; *) echo "Please answer y or n" >&2 ;; esac done } # # begin mkdev scsi functions # settrap () { trap 'cleanup $FAIL' 1 2 3 15 } unsettrap () { trap '' 1 2 3 15 } cleanup () { rm -rf /tmp/scsi_* /tmp/hw /tmp/mdev.$$ /tmp/sdev.$$ #special exit function for -C (check), used by mkdev hd #output status to filedes 3: index [added] hatype #index = index to be used in the minor device number to index cfg array # -1 = not configured #'added' indicates that device was configured during this invocation [ $check = 1 ] && { [ -n "$thisentry" ] && get_index echo $index $ADDED $hatype 1>&3 } exit $1 } # perms list needed if link kit must be installed permschk () { return $OK if [ -f /etc/perms/extmd ]; then PERM=/etc/perms/extmd else error "Cannot locate /etc/perms/extmd. This file is needed to verify Link Kit installation." cleanup $FAIL fi } # test to see if link kit is installed check_link() { return $OK cd / until fixperm -i -d LINK $PERM do case $? in 4) echo "\nThe Link Kit is not installed." >&2 ;; 5) echo "\nThe Link Kit is only partially installed." >&2 ;; *) echo "\nError testing for Link Kit. Exiting." >&2; cleanup $FAIL ;; esac # Not fully installed. Do so here getyn "\nDo you wish to install it now?" || { # answered no echo " The Link Kit must be installed to run this program. Exiting ..." cleanup $OK } # answered yes, so install link kit echo "\nInvoking /etc/custom\n" /etc/custom -o -i LINK || { # custom exited unsuccessfully error "custom failed to install Link Kit successfully. Please try again." cleanup $FAIL } done } # determine a default host adaptor type: # use command line parameter HATYPE # else, pick up the last entry from mscsi # else, see what adapter shows up in the boot screen # else, default to 'ad' get_hatype () { if [ -n "$HATYPE" ] then hatype=$HATYPE return fi grep -v "*" $mscsi | \ while read ha attach number id lun bus do echo $ha >/tmp/scsi_e$$ done if [ ! -f /tmp/scsi_e$$ ] then while read device base vec dma type ha id lun do case $device in %adapter) echo $type | sed "s/type=//" >/tmp/scsi_e$$ break ;; esac done < /dev/string/cfg fi if [ -f /tmp/scsi_e$$ ] then hatype=`cat /tmp/scsi_e$$` rm /tmp/scsi_e$$ else hatype=ad fi } show_haparams () { SDEV=`get_mapped_path ID_SDEVICE_D` cmdev=`get_mapped_path ID_MDEVICE` sdev=$SDEV/$hatype sdev_line=`expr $HA + 1` set `grep -n -v "\*" $sdev | sed -n ${sdev_line}p` ha_tag=`echo $1 | sed 's/^.*://'` sdev_line=`echo $1 | sed 's/:.*//'` ha_sdev_unit=$3 ha_sdev_ipl=$4 ha_sdev_type=$5 ha_vec=$6 ha_sio=$7 ha_eio=$8 ha_scma=$9 shift ha_ecma=$9 set `grep "^$ha_tag[ ]" $cmdev` ha_dma=$9 echo "\nThe following parameters will be used to configure '$hatype' SCSI host adapter $HA:\n" [ "$ha_vec" -ne 0 ] && echo "\tInterrupt vector\t$ha_vec\n" [ "$ha_sio" -ne 0 ] && echo "\tI/O address\t0x$ha_sio 0x$ha_eio\n" [ "$ha_scma" -ne 0 ] && echo "\tController memory address\t0x$ha_scma 0x$ha_ecma" [ "$ha_dma" -ne -1 ] && echo "\tDMA channel\t$ha_dma\n" getyn "Change these parameters? " || return $OK while : do pmes="\\\nThe following parameters will be used to configure '$hatype' SCSI host adapter $HA:\\\n\\\n" [ "$ha_vec" -ne 0 ] && parms="1 $parms" [ "$ha_sio" -ne 0 ] && parms="$parms 2 3" [ "$ha_scma" -ne 0 ] && parms="$parms 4 5" [ "$ha_dma" -ne -1 ] && parms="$parms 6" #get irq, sio and eio for i in $parms do case $i in 1) thisdev="\nWhat is the interrupt vector for this adapter?" pmes="$pmes\\\tInterrupt vector\\\t\$ha_vec\\\n";; 2) thisdev="\nWhat is the start IO address (hex) for this adapter?" pmes="$pmes\\\tStart I/O address\\\t0x\$ha_sio\\\n";; 3) thisdev="\nWhat is the end IO address (hex) for this adapter?" pmes="$pmes\\\tEnd I/O address\\\t\\\t0x\$ha_eio\\\n";; 4) thisdev="\nWhat is the start controller memory address (hex) for this adapter?" pmes="$pmes\\\tStart controller memory address\\\t0x\$ha_scma\\\n";; 5) thisdev="\nWhat is the end controller memory address (hex) for this adapter?" pmes="$pmes\\\tEnd controller memory address\\\t0x\$ha_ecma\\\n";; 6) thisdev="\nWhat is the DMA channel for this adapter?" pmes="$pmes\\\tDMA channel\\\t\\\t\$ha_dma\\\n";; esac while : do echo "$thisdev\nenter number, or q to quit: \c" read x case $x in *[a-fA-F0-9]*) case $i in 1) ha_vec=$x check_vec $ha_vec || continue ;; 2) ha_sio=$x check_io $ha_sio || continue ;; 3) ha_eio=$x check_io $ha_eio || continue ;; 4) ha_scma=$x check_cma $ha_scma || continue ;; 5) ha_ecma=$x check_cma $ha_ecma || continue ;; 6) ha_dma=$x check_vec $ha_dma || continue ;; esac break ;; q|Q) return $FAIL ;; *) echo "\nInvalid choice. Please try again." ;; esac done done [ -z "$parms" ] && break eval echo "$pmes" getyn "Update the link-kit?" [ $? -eq $OK ] && break done sed -e "${sdev_line}c\\ $ha_tag Y $ha_sdev_unit $ha_sdev_ipl $ha_sdev_type $ha_vec \ $ha_sio $ha_eio $ha_scma $ha_ecma " $sdev > /tmp/sdev.$$ mv /tmp/sdev.$$ $sdev awk 'BEGIN {OFS="\t"} {if($1==HATAG)print $1,$2,$3,$4,$5,$6,$7,$8,DMATAG; \ else print $0}' \ DMATAG=$ha_dma HATAG=$ha_tag /etc/conf/cf.d/mdevice > /tmp/mdev.$$ mv /tmp/mdev.$$ $cmdev return $OK } # get ID number, and LUN get_numbers () { for i in 1 2 3 do [ -n "$BUS" -a $i = 1 ] && continue [ -n "$ID" -a $i = 2 ] && continue [ -n "$LUN" -a $i = 3 ] && continue case $i in 1) thisdev="\nWhat SCSI Bus is this device attached to? Press to use the default:0\nSelect 0-n," ;; 2) thisdev="\nWhat is the Target ID for this device?\ \nSelect 0-15," ;; 3) thisdev="\nWhat is the LUN of this device? Press to use the default: 0\nSelect 0-7,";; esac while : do echo "$thisdev or h for help, or q to quit: \c" read x case $x in [0-7]) case $i in 3) LUN=$x ;; 2) ID=$x ;; 1) BUS=$x ;; esac break ;; q|Q) cleanup $OK ;; h|H) scsi_help ;; *) if [ -z "$x" -a $i -eq 3 ] then LUN=0 break fi if [ -z "$x" -a $i -eq 1 ] then BUS=0 break fi if [ $i -eq 2 -a ! -z "$x" ] then ID=$x check_ID $x && break fi echo "\nInvalid selection. Please try again." ;; esac done done } # display current SCSI configuration scsi_display () { grep -v "*" $mscsi | sed "s/hd /Sdsk /" > /tmp/scsi_d$$ # old "hd" entries can just as well be "Sdsk", and it's simpler echo "\nThe configuration file currently has entries for the\ following devices:\n" echo "Host\nAdapter Adapter\nType Device Number ID LUN Bus\n-------------------------------------------" sed "s/Sdsk/disk/g" /tmp/scsi_d$$ | \ sed "s/Stp/tape/g" | \ sed "s/Srom/cd-rom/g" | \ sed "s/Sflp/floptical/g" echo "\nPress any key to continue: \c" read x return 0 } # is this entry already in mscsi? check_dup () { if grep "^$thisentry" /tmp/scsi_a$$ > /dev/null 2>&1 then [ "$action" = "add" ] && { case $devtype in Sdsk) devname=disk ;; Stp) devname=tape ;; Srom) devname=cd-rom ;; Sflp) devname=floptical;; esac echo "\nCannot add this $devname." echo "Another $devname is already configured at this location." } return 1 fi return 0 } # has the maximum for this device type already been reached? check_max () { devcount=`grep -c $devtype /tmp/scsi_a$$` case $devtype in Srom) [ $devcount -eq 256 ] && { echo "\nError. Cannot add another cd-rom." echo "\nThe maximum number of cd-roms -- 256 -- are \ already configured." return 1 } ;; Sflp) [ $devcount -eq 7 ] && { echo "\nError. Cannot add another floptical." echo "\nThe maximum number of flopticals -- 7 -- are \ already configured." return 1 } ;; esac return 0 } # issue warning if another device type is at that location check_other () { checkentry="$hatype .* $HA $ID $LUN $BUSopqrstuvwxyz{|}~" if grep "^$checkentry" /tmp/scsi_a$$ > /dev/null 2>&1 then # note: init.link now removes the hd entry if non-SCSI root if getyn "Warning! Another device is configured at\ this location.\nDo you want to overwrite this location with the new entry?" then grep -v "^$checkentry" /tmp/scsi_a$$ > /tmp/scsi_f$$ mv /tmp/scsi_f$$ /tmp/scsi_a$$ return 0 else return 1 fi fi return 0 } # make sure that adapter and Sdevice are configured in configure_in () { for dev in $hatype $devtype do sdev=`get_mapped_path ID_SDEVICE_D` if grep -s N $sdev/$dev >/dev/null then # configure in: change N to Y in sdevice.d file sed "s/N/Y/" $sdev/$dev > $sdev/$dev.new mv $sdev/$dev.new $sdev/$dev fi done # and there are no longer any 'ad' entries in mscsi, then set # sdevice.d entry to N. grep "^ad" /tmp/scsi_a$$ > /dev/null 2>&1 res=$? [ "$UPGRADE" = "Y" -a $res -ne 0 ] && { sed "s,Y,N," $sdev/ad > /tmp/scsi_ad$$ mv /tmp/scsi_ad$$ $sdev/ad } } # add entry to mscsi, after appropriate error checking add_mscsi () { check_dup || return 1 check_max || return 1 check_other || return 1 # If this is a 174X being configured to run in enhanced mode, # we must use the existing 'ad' entries in mscsi instead of # adding new ones. if [ "$UPGRADE" = "N" ] then echo "$thisentry" >> /tmp/scsi_a$$ else cat /tmp/scsi_a$$ | sed "s%^\(ad\)\([ ]*[a-zA-Z]*[ ]*$HA\)%eiad\2%"\ > /tmp/scsi_a1$$ mv /tmp/scsi_a1$$ /tmp/scsi_a$$ fi index=`expr \`grep -c $devtype /tmp/scsi_a$$\` - 1` configure_in ADDED=added return 0 } rem_mscsi () { echo thisentry = $thisentry check_dup || { sed "/^$thisentry/d" /tmp/scsi_a$$ > /tmp/scsi_b$$ mv /tmp/scsi_b$$ /tmp/scsi_a$$ return 0 } case $BUS in 0) thisentry="$hatype $devtype $HA $ID $LUN";; *) ;; esac check_dup || { sed "/^$thisentry/d" /tmp/scsi_a$$ > /tmp/scsi_b$$ mv /tmp/scsi_b$$ /tmp/scsi_a$$ return 0 } echo "\nError. Cannot remove this device." echo "This type of device is not configured at this location." return 1 } # edit mscsi to add or remove this device; return 0 if mscsi modified, 1 if not edit_mscsi () { # split mscsi into commented lines and real entries grep "*" $mscsi > /tmp/scsi_c$$ grep -v "*" $mscsi | sed "s/hd /Sdsk /" > /tmp/scsi_a$$ # old "hd" entries can just as well be "Sdsk", and it's simpler case $action in add) add_mscsi || return 1 ;; remove) rem_mscsi || return 1 ;; esac cat /tmp/scsi_a$$ >> /tmp/scsi_c$$ mv /tmp/scsi_c$$ $mscsi } #get SCSI index of device listed in $thisentry get_index () { index=-1 if [ "$devtype" = "Sdsk" ] then grep -v "*" $mscsi | sed "s/hd /Sdsk /" | grep $devtype > /tmp/scsi_a$$ else grep -v "*" $mscsi | grep "Dsk" >> /tmp/scsi_a$$ fi line=`grep -n "^$thisentry" /tmp/scsi_a$$` [ -z "$line" ] && return index=`expr \`expr "$line" : '\([0-9][0-9]*\)'\` - 1` rm -f /tmp/scsi_a$$ } scsi_help () { echo "\ \nSCSI Help Message -- \nInstallation of a SCSI device requires reconfiguration of the kernel.\ \nThe SCSI configuration file must be updated with the location of the new\ \ndevice. The kernel must be rebuilt and rebooted to access the new\ \ndevice.\ \n\ \nTo specify the location of the device to be added or removed,\ \nyou need to know four pieces of information: The host adapter number,\ \nthe SCSI bus of the adapter, the ID number of the controller, \ \nand the logical unit number (LUN) of the device.\ \n\nHost Adapter Number --\ \n\nA host adapter is a card that plugs into a slot on the motherboard.\ \nIt supports a SCSI bus. Several host adapters may be installed on\ \na system. The first host adapter is SCSI-0. The second is SCSI-1.\ \nThe nth host adapter is SCSI-n. This numbering is unique for each \ \ntype of host adapter on the system." echo "\nPress return to continue: \c" read x echo "\ \nSCSI Bus number -- \ \n\nSome host adapter cards may support more than one SCSI bus. The\ \nnumber of SCSI busses that an adapter can support is determined by\ \nthe host adapter hardware. The valid range of bus numbers is 0-m,\ \nwhere m is 1 less then the number of busses the card can support.\ \nFor host adapters which only support a single bus the only valid\ \nbus number is 0.\ \nSCSI Controller ID number -- \ \n\nUp to 7 controllers may be put on a SCSI bus. Each controller has \ \na unique ID number. This number is determined by jumper settings \ \non the controller. The valid range of ID numbers is 0-7.\ \n\nSCSI Logical Unit Number (LUN) --\n\ \nMost SCSI devices are manufactured with a controller embedded in the \ \nsame physical unit as the device. These controllers support one device \ \nonly. In this case, the LUN of the device is 0.\ \nNon-embedded controllers may support up to 8 SCSI devices.\ \nIn this case, LUN numbers are determined by jumper settings on\ \neach device. The valid range of LUN numbers is 0-7." echo "\nPress return to continue: \c" read x } check_ID () { [ `expr "$1"` -ge 0 -a `expr "$1"` -le 15 ] && return $OK echo "\nInvalid ID value. Please try again." ID= return $FAIL } check_vec () { [ `expr "$1" : '[0-9][0-9]*'` -eq `expr "$1" : '.*'` ] && return $OK echo "\nInvalid choice. Please try again." return $FAIL } check_io() { [ `expr "$1" : '[a-fA-F0-9][a-fA-F0-9]*'` -eq `expr "$1" : '.*'` ] && return $OK echo "\nInvalid choice. Please try again." return $FAIL } check_cma() { check_io $1 return $? } #To configure next host adapter in sdevice.d file add_ha_num() { sdev=$1 while : do getyn "'$hatype' SCSI host adapter $HA is not configured.\ \nWould you like to update the link-kit?" [ $? -eq $FAIL ] && { echo "\n'$hatype' SCSI host adapter $HA must be configured in order for\nthe kernel to successfully re-link" return $OK } #use parameters from last entry set -- `grep -v "\*" $sdev | tail -1` name=$1 unit=$3 ipl=$4 vectype=$5 vec=$6 sio=$7 eio=$8 scma=$9 shift 1 ecma=$9 pmes="\\\nThe following parameters will be used to configure '$hatype' SCSI host adapter $HA:\\\n\\\n" #[ "$vectype" -ne 0 -a "$vec" -ne 0 ] && parms="1 $parms" [ "$vec" -ne 0 ] && parms="1 $parms" [ "$sio" -ne 0 ] && parms="$parms 2 3" [ "$scma" -ne 0 ] && parms="$parms 4 5" #get irq, sio and eio for i in $parms do case $i in 1) thisdev="\nWhat is the interrupt vector for this adapter?" pmes="$pmes\\\tInterrupt vector\\\t\$vec\\\n";; 2) thisdev="\nWhat is the start IO address (hex) for this adapter?" pmes="$pmes\\\tStart I/O address\\\t0x\$sio\\\n";; 3) thisdev="\nWhat is the end IO address (hex) for this adapter?" pmes="$pmes\\\tEnd I/O address\\\t\\\t0x\$eio\\\n";; 4) thisdev="\nWhat is the start controller memory address (hex) for this adapter?" pmes="$pmes\\\tStart controller memory address\\\t0x\$scma\\\n";; 5) thisdev="\nWhat is the end controller memory address (hex) for this adapter?" pmes="$pmes\\\tEnd controller memory address\\\t0x\$ecma\\\n";; esac while : do echo "$thisdev\nenter number, or q to quit: \c" read x case $x in *[a-fA-F0-9]*) case $i in 1) vec=$x check_vec $vec || continue ;; 2) sio=$x check_io $sio || continue ;; 3) eio=$x check_io $eio || continue ;; 4) scma=$x check_cma $scma || continue ;; 5) ecma=$x check_cma $ecma || continue ;; esac break ;; q|Q) return $FAIL ;; *) echo "\nInvalid choice. Please try again." ;; esac done done [ -z "$parms" ] && break eval echo "$pmes" getyn "Update the link-kit?" [ $? -eq $OK ] && break done echo "$name\tY\t$unit\t$ipl\t$vectype\t$vec\t$sio\t$eio\t$scma\t$ecma">>$sdev return $OK } # list_haprefixes() { echo "\n\nPrefix\t\tSCSI Host Adapter Type\n" sed '/^#/d /^[ ]*$/d' $HALISTFILE | while read line do set -- $line echo "$1\t\t\c" shift echo $* done } # Get adapter type (supply a default) and number get_adapter () { get_hatype while : do mesg="\ Enter the prefix of the SCSI host adapter that supports this device or press for the default: '$hatype'\nEnter h for a list of host adapters " #skip first prompt if hatype given on command line cmd=$hatype if [ -z "$HATYPE" -o -z "$hatype" ] then # changed below to cleanup $FAIL from cleanup $OK prompt $hatype || cleanup $FAIL case "$cmd" in h|H) list_haprefixes continue;; esac fi HATYPE= sdevroot=`get_mapped_path ID_SDEVICE_D` sdev=$sdevroot/$cmd [ ! -f $sdev ] && { echo "\nMissing 'sdevice.d' file for host adapter driver '$cmd'" get_hatype continue } hatype=$cmd hamax=`grep -v "\*" $sdev | wc -l | sed 's/[ ]//g' ` [ "$hamax" -gt 0 ] && break echo "\nIncomplete 'sdevice.d' file for host adapter driver '$cmd'" get_hatype done if [ "$hatype" = "iiop" ] then return $OK fi [ -z "$HA" -o \( "$HA" -gt $hamax -o "$HA" -lt 0 \) ] && { mesg="Which '$hatype' SCSI host adapter supports this device?\ \nSelect 0-${hamax}, " while : do prompt || return $FAIL case $cmd in [0-$hamax]) HA=$cmd; break;; *) echo "\nInvalid selection. Please try again." ;; esac done } if [ $HA -eq $hamax ] then while : do add_ha_num $sdev && return $OK done elif [ ${action} = "add" ] then show_haparams fi return $OK } get_device () { while quit=" or enter q to quit:" mesg="What type of device do you want to $action? 1. Hard Disk 2. Tape 3. CD-ROM 4. Floptical 5. Other Select an option " do prompt || cleanup $OK devcmd=$cmd case $devcmd in 1) devtype=Sdsk break ;; 2) devtype=Stp break ;; 3) devtype=Srom break ;; 4) devtype=Sflp break ;; *) echo "\nPlease enter 1 2 3 4 or q to quit." ;; esac done } just_relink () { CCFD=`get_mapped_path ID_CCF_D` unset ROOT ( cd $CCFD; ./link_unix ) ROOT=/ export ROOT } upgrade_mscsi () { #make a new mscsi file with added 'bus' field from old style #split into comments and real entries grep "*" $mscsi > /tmp/scsi_c$$ grep -v "*" $mscsi | \ while read ha attach number id lun do echo "$ha\t$attach\t$number\t$id\t$lun\t0" >> /tmp/scsi_d$$ done mv $mscsi $mscsi.old cat /tmp/scsi_c$$ /tmp/scsi_d$$ > $mscsi rm /tmp/scsi_c$$ /tmp/scsi_d$$ } ask_relink () { getyn "A new kernel must be built, to reflect the changes\n\ to the SCSI configuration. Do you want to do this now?" case $? in 0) dir=`pwd` cd /etc/conf/cf.d unset ROOT ./link_unix ROOT=/ export ROOT case $? in 0) cd $dir return 0 ;; 1) cd $dir return 1 ;; esac ;; 1) return 1 ;; esac } get_action () { while quit=" or enter q to quit:" mesg="\tSCSI Device Configuration\n 1. Add a SCSI device 2. Remove a SCSI device 3. Display current SCSI configuration 4. Display SCSI help message Select an option " do prompt || cleanup $OK maincmd=$cmd case $maincmd in 1) action=add break ;; 2) action=remove break ;; 3) scsi_display ;; 4) scsi_help ;; *) echo "\nPlease select 1,2,3, or 4" ;; esac done } usage () { echo "\n\ Usage: /usr/lib/mkdev/.scsi [ -artdcfnhuCU ] [ha [bus [id [lun [hatype] ] ] ] ]\n\n\ -a add SCSI device\n\ -r remove SCSI device\n\ -t device is a tape\n\ -d device is a disk\n\ -c device is a cd-rom\n\ -f device is a floptical\n\ -n do not reconfigure & relink the kernel\n\ -h display SCSI help message\n\ -u display this usage message\n\ -C check if device is configured\n\ -U upgrade mscsi file\n\ \n All arguments are optional" exit $OK } # begin main init_path_mapping mscsi=`get_mapped_path ID_MSCSI` devtype= action= relink= check=0 index=-1 settrap # arg processing [ $# != 0 ] && { set -- `getopt artdcfnhuC $*` || usage for i in $* do case $i in -a) action=add ;; -r) action=remove ;; -t) devtype=Stp ;; -d) devtype=Sdsk ;; -c) devtype=Srom ;; -f) devtype=Sflp ;; -n) relink=no ;; -h) scsi_help exit $OK ;; -u) usage ;; -C) check=1; ;; -U) upgrade_mscsi exit $OK ;; --) shift; break ;; *) break;; esac shift done PID=$1 HA=$2 ID=$3 LUN=$4 HATYPE=$5 BUS=$6 } # verify that link kit is installed check_link # determine a default host adaptor type # get_hatype while : do [ ! "$action" -a $check != 1 ] && get_action [ ! "$devtype" ] && get_device #get_adapter || cleanup $OK #if [ "$hatype" = "iiop" ] #then hatype=$HATYPE [ ! "$HA" -o ! "$ID" -o ! "$LUN" ] && { /usr/bin/rview c /tmp/$$.view view_status=$? [ $view_status != 0 -o ! -s "/tmp/$$.view" ] && { rm -f /tmp/$$.view cleanup $FAIL } # ## Get the mscsi entry. # read hatype devtype HA ID LUN BUS < /tmp/$$.view rm -f /tmp/$$.view } #else # [ ! "$HA" -o ! "$BUS" -o ! "$ID" -o ! "$LUN" ] && get_numbers #fi thisentry="$hatype $devtype $HA $ID $LUN $BUS" if [ -z "$firstime" ] then # make this available to hd to create NS0LIST file echo "$thisentry" >> /tmp/ns0list$PID firstime=y fi # If hatype is 'eiad' and there is already an 'ad' entry with # the same HA number in mscsi, then its quite likely that the # user is configuring a 174X running in 154X emulation mode, to # run in enhanced mode. Handle this by replacing ad instances of # the given HA number, with 'eiad'. if [ "$hatype" = "eiad" ] then grep -v "\*" $mscsi > /tmp/scsi_a$$ line=`grep -n "^ad[ ]*[a-zA-Z]*[ ]*$HA" /tmp/scsi_a$$` if [ -n "$line" ] then getyn "Are you reconfiguring a 174X adapter which is currently\ running in 154X\nemulation mode, to run in enhanced mode ?" case $? in 0) UPGRADE=Y ;; 1) ;; esac fi fi #once thisentry is set, check only (no action) can exit [ $check = 1 ] && { [ -z "$action" ] && cleanup $OK get_index [ "$action" = "add" -a $index -ne -1 ] && cleanup $OK [ "$action" = "remove" -a $index -eq -1 ] && cleanup $OK } # Give user a last chance to back out, else edit mscsi file echo "\nYou are about to $action the following SCSI device:\n" echo "Host\nAdapter Adapter\nType Device Number ID LUN BUS\n----------------------------------------------" echo "$hatype\t$devtype\t$HA\t$ID\t$LUN\t$BUS" getyn "Update SCSI configuration?" && edit_mscsi case $? in 0) echo "\nThe SCSI configuration file has been updated." # if -n flag given on command line, don't prompt for relink [ "$relink" = "no" ] && cleanup $OK if [ "$_RELINK" -o "$_NOPROMPT" ] then just_relink cleanup $OK fi if ask_relink then cleanup $OK else echo "\nThe kernel will not be rebuilt now." [ "$action" = "add" ] && { echo "\nNote: Any device that \ has been added to the SCSI configuration\nwill not be usable until the \ kernel is rebuilt & rebooted." } cleanup $FAIL fi ;; 1) echo "\nSCSI configuration files not updated." getyn "Would you like to try again?" case $? in 0) HA= BUS= ID= LUN= continue ;; 1) echo "\nSCSI Configuration script exiting." cleanup $FAIL ;; esac ;; esac done : # @(#) hd_iiop.sh 26.1 95/07/21 # # Copyright (C) 1987-1995 The Santa Cruz Operation, Inc. # All Rights Reserved. # The information in this file is provided for the exclusive use of # the licensees of The Santa Cruz Operation, Inc. Such users have the # right to use, modify, and incorporate this code into other products # for purposes authorized by the license agreement provided they include # this notice and the associated copyright notice with any such product. # The information in this file is provided "AS IS" without warranty. # # mkdev/hd - Hard Disk Configuration # # source in standard functions, message file and iqm variables, if present thisentry= ns0list=/usr/lib/mkdev/perms/NS0LIST # Set up pathname mapping rel=`grep rel /etc/perms/rts | sed "s/^#rel=//" | cut -c1-7` shared_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" client_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" ROOT=/ export ROOT [ "$IQM_FILE" ] && { . "$IQM_FILE" } || { . $ROOT/etc/conf/bin/path_map.sh init_path_mapping shared_cf_dir=`get_mapped_path ID_SCF_D` client_pack_dir=`get_mapped_path ID_CPACK_D` } [ "$STDFUNCS" ] && { . "$STDFUNCS" } || { echo "Fatal Error: Can't load function file: $STDFUNCS" exit 1 } # set umask umask 0 #Hooks for IDA Driver #disk type 'I' indicates an IDA driver IDASCRIPT=/usr/lib/mkdev/ida #pick up 'mkdev hd' back-end functions . /usr/lib/mkdev/.hdfuncs [ -z "$IQM_FILE" ] && { #and pick up nodefuncs for DQI stuff . /usr/lib/mkdev/.nodefuncs } # mkdev hd functions # set a trap so that if the user dels out, a value of $STOP # is passed to the calling program settrap() { if [ -n "$interactive" ] then trap 'error "Installation interrupted." cleanup $FAIL' 1 2 3 15 else trap 'cleanup $FAIL' 1 2 3 15 fi } # unset the traps unsettrap() { trap '' 1 2 3 15 } get_args () { case ${rootdisk}$arch in WAT|WMC|IAT) case ${rootdisk} in W) echo "\nYour root hard disk is attached to an ST506 controller." ;; I) echo "\nYour root hard disk is attached to an IDA controller." ;; esac mesg="Pick one of the choices below or you may quit and invoke mkdev hd -u for a detailed usage message. 1) Add a hard disk to ST506 controller 2) Add a hard disk to SCSI controller 3) Add a hard disk to an IDA controller (EISA).\n Enter 1, 2, 3 " while : do prompt || { cleanup $FAIL } case $cmd in 1) newtype=W case $arch in AT|MC) major=1 set_disknum drivenum=$disknum ctrlnum=0 ;; esac break;; 2) newtype=S break;; 3) exec $IDASCRIPT echo "\nPlease enter 1 or 2 (or 'q' to quit)";; *) echo "\nPlease enter 1 or 2 (or 'q' to quit)";; esac done ;; EAT) echo "\nYour root hard disk is attached to an OMTI controller." if getyn "The only available choice is to add one other hard disk.\n\ Enter 'y' to add another disk. If you enter 'n' you will exit\nthis \ script. You may then invoke mkdev hd -u for a detailed\nusage message." then newtype=E drivenum=1 ctrlnum=0 major=1 else cleanup $FAIL fi ;; EMC) echo "\nYour root hard disk is attached to an ESDI controller." mesg="Pick one of the choices below or you may quit and invoke mkdev hd -u for a detailed usage message. 1) Add a hard disk to ESDI controller 2) Add a hard disk to SCSI controller Enter 1, 2 " while : do prompt || { cleanup $FAIL } case $cmd in 1) newtype=E drivenum=1 ctrlnum=0 major=1 break;; 2) newtype=S break;; *) echo "\nPlease enter 1 or 2 (or 'q' to quit)";; esac done ;; SAT|SMC) echo "\nYour rootdisk is attached to a SCSI controller." if getyn "The only available choice is to add another SCSI disk.\n\ Do you want to add another SCSI disk?" then newtype=S else cleanup $FAIL fi ;; esac } # this function used when adding ST506 or ESDI disks get_drivenum () { while [ "$drivenum" != "0" -a "$drivenum" != "1" ] do echo "\nWill this disk be the first or second disk on this controller?" echo "Enter 1 (first) or 2 (second): \c" read num case $num in 1|2) drivenum=`expr $num - 1` ;; q|Q) cleanup $FAIL ;; *) echo "Error. Not a valid number. Try again" ;; esac done } # this function used only when adding ST506 disks get_ctrlnum () { while [ "$ctrlnum" != "0" -a "$ctrlnum" != "1" ] do echo "\nWill this disk attach to the first or second ST506 controller?" echo "Enter 1 (first) or 2 (second): \c" read cnum case $cnum in 1) ctrlnum=`expr $cnum - 1` major=1 ;; 2) ctrlnum=`expr $cnum - 1` major=54 ;; q|Q) cleanup $FAIL ;; *) echo "Error. Not a valid number. Try again" ;; esac done } scsi_config () { #check that disk if configured and add if necessary to mscsi #.scsi writes to filedes 3: 1) SCSI index to use and 2) 'a' if added pid=$$ /bin/sh /usr/lib/mkdev/.scsi_iiop -n -a -C -d $pid $HA $ID $LUN $HATYPE $BUS 3>${tmp}4.$$ scsi_ret=$? set -- `cat ${tmp}4.$$` scsi_index=$1 if [ "$2" = "iiop" ] then hatype=iiop else hatype=$3 fi [ "$scsi_index" -eq -1 ] && error scsi_noconfig #was it already configured? [ "$2" != "added" ] && return 0 [ $scsi_ret = 0 ] && { relink=`expr $relink + 1 ` return 0 } rm -f ${tmp}4.$$ cleanup $FAIL } # get the major number associated with the scsi entry scsi_major () { if [ "$rootdisk" = "S" -a "$hatype" = "iiop" ] then driver=hd else driver=Sdsk fi driver_to_major } # usage and help usage () { echo " Usage: $0 drivenum ctrlnum [ lun [ hatype ] ] [-nhu ] -u display this usage message -h display usage message for combining disk interfaces -n means initialize the disk non-interactively using system defaults. This may only be done when installing the root hard disk (when drivenum is 0 and ctrlnum is 0; for SCSI disks, lun is not specified and defaults to 0) The arguments 'drivenum', 'ctrlnum' and 'lun' are dependent on the type of hard disk being installed. The arguments 'lun' and 'hatype' apply to SCSI disks only. SCO System V supports four different hard disk interfaces -- ST506 (standard), ESDI, IDA (EISA), and SCSI. Following is a section describing installation of each of these. Please note: ST506 and SCSI interfaces may be combined on the same system. ESDI and SCSI interfaces may also be combined on an MCA system. To view a guide to selecting mkdev hd arguments when combining these interfaces, enter \"mkdev hd -h\" at a shell prompt." echo "\nPress return to continue: \c" read x echo "\n Installation of a disk on to an ST506 controller ------------------------------------------------ drivenum is the number of the disk drive. The first disk on a controller is disk 0; the second disk is disk 1. ctrlnum is the controller number. Two controllers are supported. The first controller is ctrlnum 0. It may also be referred to as \"ST506-0\". The second controller is ctrlnum 1. It may be also be referred to as \"ST506-1\". On an MCA system, only the first controller \"ST506-0\" is supported. ST506 disks will install with one of the following commands: mkdev hd 0 0 (or ST506-0) for the first disk on first controller (root) mkdev hd 1 0 (or ST506-0) for the second disk on first controller mkdev hd 0 1 (or ST506-1) for the first disk on second controller (not MCA) mkdev hd 1 1 (or ST506-1) for the second disk on second controller (not MCA) NOTE: Some ST506 controllers may support ESDI interface disks." echo "\nPress return to continue: \c" read x echo "\n Installation of a disk on to an OMTI or ESDI controller ------------------------------------------------------- drivenum is the number of the disk drive. The first disk on the controller is disk 0. The second disk is disk 1. ctrlnum is the controller number. One controller is supported. The ctrlnum is always 0. It may be referred to as \"OMTI-0\", or as \"ESDI-0\". ESDI disks will install with one of the following commands: mkdev hd 0 0 (or OMTI-0, or ESDI-0) for the first disk on the controller (root) mkdev hd 1 0 (or OMTI-0, or ESDI-0) for the second disk on the controller NOTE: Some OMTI controllers may support standard interface disks." echo "\nPress return to continue: \c" read x echo " Installation of a SCSI disk on to a SCSI bus -------------------------------------------- drivenum is the ID number of the controller for this disk. The ID number is determined by jumper settings. Valid ID numbers are 0-7. ctrlnum is the host adapter number. Multiple host adapters are supported. The first host adapter is \"SCSI-0\". The second host adapter is \"SCSI-1\", etc. lun Most SCSI disks are manufactured with a controller embedded in the same physical unit as the disk. These controllers support only one disk. In this case the lun (logical unit number) is 0. The lun argument is optional. If not specified, it will default to 0. If you have a non-embedded controller, you must set the lun for each device, via jumper settings. Valid lun numbers are 0-7. hatype is the type of SCSI host adapter referenced by ctrlnum." bus Some SCSI host adapters control more than one SCSI bus; this field specifies which SCSI bus the disk is connected to. Valid bus numbers are determined by the host adapter. If not specified it will default to 0. echo "\nPress return to continue: \c" read x echo " Invoke mkdev hd with the correct numbers as follows: mkdev hd [0-7] [SCSI-x] [0-7] [hatype] [bus] Please note: This program 'mkdev hd' must be invoked twice to install a SCSI disk. The first time, the kernel will be reconfigured to support the new disk. The second time, the disk will be initialized. Use the same mkdev hd arguments both times.\n" echo "\nPress return to continue: \c" read x echo "\n Installation of a disk on to a IDA (Intelligent Disk Array) controller ---------------------------------------------------------------------- drivenum is the logical number of the disk drive. The first disk array on a controller is disk 0; the second disk is disk 1. ctrlnum is the controller number. Six controllers are supported. The first controller is ctrlnum 0, the second controller is ctrlnum 1 and so on. These may also be referred to as \"IDA-0\", \"IDA-1\" and so on. IDA disks will install with one of the following commands: mkdev hd 0 0 (or IDA-0) for the first disk on first controller mkdev hd 1 0 (or IDA-0) for the second disk on first controller mkdev hd 0 1 (or IDA-1) for the first disk on second controller mkdev hd 1 1 (or IDA-1) for the second disk on second controller \n" cleanup $OK } combo_help () { echo " Combining Hard Disk Interfaces ------------------------------ SCSI hardware may be added on to a system that has a root hard disk attached to an ST506 controller. On an MCA system, SCSI hardware may also be added when the root hard disk is attached to an ESDI controller. The addition of ST506 or ESDI disks on to a system with a SCSI root disk is not supported. Adding ST506 or ESDI disks to a combination system is identical to adding them to a simple system. Invoke 'mkdev hd -u' for more information. Adding SCSI disks to a combination system is accomplished by invoking mkdev hd with the arguments 'drivenum', 'ctrlnum', 'lun' and 'hatype' The first argument, 'drivenum', is the disk number. Choices for 'drivenum' are identical to the choices on a SCSI-only system. Invoke 'mkdev hd -u' for further information." echo "\nPress return to continue: \c" read x echo " The second argument, 'ctrlnum', must be in the following format: \"SCSI-0\" -- for the first SCSI Host Adapter \"SCSI-1\" -- for the second SCSI Host Adapter \"SCSI-n\" -- for the n+1 th SCSI Host Adapter The third argument 'lun', is optional. Selection of this argument is identical to selection of it when installing on a SCSI-only system. Invoke 'mkdev hd -u' for more information. The fourth argument 'hatype', is optional. This is the prefix of the SCSI host adapter driver used to control 'ctrlnum'. To specify a hatype, you must give a complete command line including id, ctrlnum, id, and hatype. Example: Adding a SCSI disk to the first SCSI host adapter on a combination system. If disk ID is 0, and the disk is being attached to the first SCSI host adapter, and the lun is 0, enter: mkdev hd 0 SCSI-0 0\n" cleanup $OK } do_relink() { [ $relink -lt 1 ] && return if getyn "A new kernel must be built and rebooted before disk \ configuration can continue. Would you like to relink at this time?" then unset ROOT ( cd "$shared_cf_dir"; ./link_unix ) ROOT=/ export ROOT else echo "\nYou must build a new kernel before proceeding with \ further configuration\nof this disk." fi echo "\nAfter the system is rebooted with the new kernel, reinvoke mkdev hd_iiop to initialize the new hard disk.\n" exit $? } create_iqm_mount_variable() { iqm_disknum=$1 iqm_active_partition=$2 iqm_division=$3 iqm_action=$4 if [ "$iqm_action" = "M" ]; then iqm_division_name=$5 iqm_mount_point=$6 echo "IQM_HDP_MOUNT_DR${iqm_disknum}_PART${iqm_active_partition}_DIV${iqm_division}=\"M $iqm_division_name ${iqm_mount_point}\"" >> $iqm_divvy_file else echo "IQM_HDP_MOUNT_DR${iqm_disknum}_PART${iqm_active_partition}_DIV${iqm_division}=\"N\"" >> $iqm_divvy_file fi } ask_for_mount_point() { iqm_disknum=$1 iqm_active_partition=$2 iqm_division=$3 iqm_mount_state=$4 iqm_mount_name=$5 iqm_mount_point=$6 # # Need to check for duplicate mount points somehow....!!!!! # if [ "$iqm_mount_state" = "M" -a -z "$iqm_mount_point" ]; then if [ -z "$iqm_issued_mount_msg" ];then echo "It is necessary to obtain mount points for any additional" echo "non-root and non-boot mountable filesystems. Please ensure" echo "that the mount points are unique for each filesystem." echo "" echo "" iqm_issued_mount_msg=yes fi echo "Please enter the mount point for division - $iqm_mount_name \c" read mount_point_name create_iqm_mount_variable $iqm_disknum $iqm_active_partition $iqm_division $iqm_mount_state $iqm_mount_name $mount_point_name else create_iqm_mount_variable $iqm_disknum $iqm_active_partition $iqm_division $iqm_mount_state $iqm_mount_name $iqm_mount_point fi } get_iqm_mount_points() { iqm_disknum=`eval echo $1` iqm_active_partition=$2 iqm_last_division=$3 . $iqm_divvy_file # # Should not do this. What about the future with multiple disks/parts.... # rm $iqm_divvy_file while [ "$iqm_last_division" -ge "0" ] do IQM_VAR="$"IQM_HDP_MOUNT_DR${1}_PART${2}_DIV${iqm_last_division} IQM_DATA=`eval echo $IQM_VAR` if test "${IQM_DATA}" then ask_for_mount_point $1 $2 $iqm_last_division $IQM_DATA fi iqm_last_division=`expr $iqm_last_division - 1` done cat $iqm_divvy_file >> $IQM_FILE } create_divvy_names_file() { # Mount the root division, get division names, unmount if [ -r /tmp/newroot ];then rm /tmp/newroot fi rootminor=`expr 40 + $rootDivision` #rootminor=106 mknod /tmp/newroot b 1 $rootminor mount -m /tmp/newroot /mnt result=$? if [ $result != 0 ];then echo "Mount of root filesystem failed." cleanup $FAIL fi cdev=${cdev:-/dev/rdsk/${disknum:-0}s0} /etc/divvy -P -N -d /mnt/dev/ $cdev > /tmp/divvynames.$$ umount -m /mnt # It better be here... if [ -r /tmp/newroot ];then rm /tmp/newroot fi } get_mount_points_and_set_IQM_variables() { create_divvy_names_file count=0 get_active_unix_partition $cdev active_unix_parititon=$? while read division start end name type do # make entries for empty divisons while [ $count != $division ] do create_iqm_mount_variable $disknum $active_unix_parititon $count N count=`expr $count + 1` done if [ "$name" = "boot" ]; then create_iqm_mount_variable $disknum $active_unix_parititon $count M boot /stand elif [ "$name" = "root" ]; then create_iqm_mount_variable $disknum $active_unix_parititon $count M root / elif [ "$name" != "recover" -a "$type" != "WHOLE DISK" -a "$type" != "NON FS" ]; then create_iqm_mount_variable $disknum $active_unix_parititon $count M $name else # ignore division 7, WHOLE DISK if [ "$count" != "7" ]; then create_iqm_mount_variable $disknum $active_unix_parititon $count N fi fi count=`expr $count + 1` done < /tmp/divvynames.$$ rm /tmp/divvynames.$$ get_iqm_mount_points $disknum $active_unix_parititon 8 } set_fdisk_IQM_variables() { cdev=${cdev:-/dev/rdsk/${disknum:-0}s0} active=0 fdisk -p -f $cdev | ( while read part do set `echo $part` if [ "$5" = "UNIX" ] then [ "$6" = "Active" ] && { echo "IQM_HDP_DR${drivenum}_PART${1}=\"$2 $4 UNIX\"" >> $IQM_FILE break } fi done ) } set_divvy_IQM_variables() { create_divvy_names_file count=0 get_active_unix_partition $cdev active_unix_partition=$? while read division start end name type do # make entries for empty divisons while [ $count != $division ] do echo "IQM_HDP_DR${drivenum}_PART${active_unix_partition}_DIV${count}=\"D\"" >> $IQM_FILE count=`expr $count + 1` done if [ "$type" = "NON FS" ]; then type="NONFS" fi if [ "$type" != "WHOLE DISK" ]; then echo "IQM_HDP_DR${drivenum}_PART${active_unix_partition}_DIV${division}=\"C $name $type $start $end\"" >> $IQM_FILE fi count=`expr $count + 1` done < /tmp/divvynames.$$ rm /tmp/divvynames.$$ return 0 } # # Need to determine if boot=root # and set IQM_HDP_FSDEFS approprietly # set_FSDefsIQM() { create_divvy_names_file while read division start end name type do if [ "$name" = "boot" ];then return 1 fi done < /tmp/divvynames.$$ result=$? if [ "$result" = "0" ]; then echo "IQM_HDP_FSDEFS=\"dump=swap boot=root\"" >> $IQM_FILE else echo "IQM_HDP_FSDEFS=\"dump=swap\"" >> $IQM_FILE fi rm /tmp/divvynames.$$ } # This program examines the mscsi file and returns the number of # SCSI disk devices configured. findunit is used to calculate unit # numbers for SCSI disks. findunit() { [ -r "$mscsi" ] || { error "\nCannot read $mscsi." cleanup $FAIL } tnum=`sed '/^*/d' "$mscsi" | grep -c "Sdsk"` [ -n "$tnum" ] || { error "\nGrep failed to read $mscsi." cleanup $FAIL } # SCSI numbering starts at 0. SCSIpos=`expr $tnum - 1` return $OK } # create an Sdsk device.dat entry create_Sdsk_dd_entry() { devfile="${client_pack_dir}/Sdsk/device.dat" echo Sdsk${1}: >> ${devfile} echo '\t'INDEX=Sdsk${1} >> ${devfile} echo '\t'PATH=node0,node1 >> ${devfile} echo '\t'node0=D_SUBSYS,SCSI Disk,0,D_HARDDSK_SUBSYS,,NULL >> ${devfile} echo '\t'node1=D_UNIT,SCSI Drive $1,0,$1,D_RANDOM_ACCESS D_NODE,NULL >> ${devfile} echo '\t'D_USER_MSG=SCSI Disk Drive,0,0,,NULL >> ${devfile} echo '\t'D_BLOCK_NODE = >> ${devfile} echo '\t'D_CHAR_NODE = >> ${devfile} } # rewrite the probe information file in space.c # assumes that devices are contiguously numbered from 0 # and that we pass in the number of the last valid unit update_probe_struct() { tmp="/tmp/$1.$$" devfile="${client_pack_dir}/Sdsk/space.c" awk ' BEGIN { i = 0 } { if ( $1 == "/*_PROBE_START_*/" ) { i = 1 ; n = 0 ; print n = '$1' for (dv = 0; (dv <= n ); dv++) { printf "#define Sdsk%d\t0\n", dv } printf "int SdskProbe[] = {" for (dv = 0; (dv <= n ); dv++) { printf "Sdsk%d,", dv } printf "0};\n" } if ( $1 == "/*_PROBE_STOP_*/" ) { i = 0 } if ( i == 0 ) { print } }' < $devfile > $tmp mv -f $tmp $devfile } makeroothd() { # figure out hard disk type get_root_type # chance to bail out, not if ISL, already given chance before call. [ "$interactive" ] && [ ! "$IQM_FILE" ] && quitnow # run dparam; invoke dkinit if it's an ST506 disk rundparam # fdisk for all, and badtrack for ST506 disks diskprep # divide the disk into file systems rundivvy # Create file that will provide map from mscsi to 0s0,1s0,2s0 so on read thisentry < /tmp/ns0list$$ grep "$thisentry" $ns0list > /dev/null if [ "$?" -ne 0 ] then cat /tmp/ns0list$$ >> $ns0list fi rm -f /tmp/ns0list$$ if [ -n "$IQM_FILE" ]; then # Make sure our temporary file is empty > $iqm_divvy_file get_mount_points_and_set_IQM_variables set_fdisk_IQM_variables set_divvy_IQM_variables set_FSDefsIQM fi } makenonroothd() { # if SCSI, verify that SCSI kernel configuration includes this disk [ "$newtype" = "S" ] && { scsi_config # get major number of SCSI driver from mdevice scsi_major } # set minor numbers set_minors # determine disk number for use in perms list set_disknum # make sure NDISK is big enough conf_ndisk # if SCSI update the device.dat and space.c files. #[ "$newtype" = "S" ] && { # Update the device.dat file # find how many Sdsk's already configured. # findunit # unit=$SCSIpos # create_Sdsk_dd_entry ${unit} # Now fix up the device node minor numbers # DRIVER=Sdsk # update_dd_minor $DRIVER$unit D_BLOCK_NODE $minor_0 # update_dd_minor $DRIVER$unit D_CHAR_NODE $minor_0 # Now update the space.c file # update_probe_struct ${unit} # } # do we need a relink/reboot before we can talk to the device? do_relink # last chance to bail out quitnow # create devices fix # get disk parameters; if ST506/ESDI disk, call dkinit rundparam # fdisk for all, and badtrack for ST506/ESDI disk diskprep # check whether the disk should be divided into divisions checkvdisk && { # divide the disk into file systems rundivvy } echo "\nHard disk initialization procedure completed.\n" } #### begin main #### hatype= if cat /dev/mcapos 1>/dev/null 2>/dev/null then arch=MC else arch=AT fi # ROOT INSTALL CASE if [ "$1" = "0" -a "$2" = "0" -o "${EMERGENCY}" = "bootroot" ] then if [ "$3" = "-n" ] then interactive= elif [ "$3" ] then error bad_arg fi ctrlnum=0 drivenum=0 disknum=0 major=1 rootinstall=TRUE makeroothd cleanup $OK fi # NON-ROOT INSTALL CASE case "$#" in 0) no_args=true # Get root hd type to prompt them for valid choices get_root_type get_args ;; 1) case $1 in -u) usage ;; -h) combo_help ;; *) error bad_arg ;; esac ;; 2|3|4|5) # make sure sed is installed for use by this script [ -x "/bin/sed" ] || error no_sed # Save command line args argv=$* # Find out root hd type to make sure their input is valid get_root_type set $argv case "$2" in ST506-0|ST506-1) newtype=W ;; OMTI-0|ESDI-0) newtype=E ;; SCSI-[0-9]) newtype=S ;; IDA-[0-9]) newtype=I ;; [0-9]) newtype=$rootdisk ;; *) error bad_arg ;; esac case "$2" in *[0-9]) ctrlnum=`expr "$2" : '.*\(.\)$'` ;; esac case ${newtype}$3 in S) LUN=0 ;; S[0-7]) LUN=$3 ;; E|W|I) ;; *) error bad_arg ;; esac [ $# -eq 4 ] && { case $newtype in S) HATYPE=$4 ;; *) error bad_arg;; esac } [ $# -eq 5 ] && { case $newtype in S) HATYPE=$4 BUS=$5 ;; *) error bad_arg ;; esac } case ${newtype}$1 in S[0-7]) ID=$1 HA=$ctrlnum ;; E0|W0) drivenum=0 ;; E1|W1) drivenum=1 ;; E*) error esdi_disk ;; W*) error st506_disk ;; I*) drivenum=$1 ;; *) error bad_arg ;; esac major=1 case ${rootdisk}${newtype} in SS) ;; SE) error esdi_add ;; SW) error st506_add ;; ES) [ $arch = AT ] && \ error scsi_omti ;; EE) [ $ctrlnum -eq 0 ] || \ error esdi_one ;; EW) error st506_add ;; WS) ;; WE) error esdi_add ;; WW) ;; # IDA disks ?I) exec $IDASCRIPT $drivenum $ctrlnum;; IE) ;; #ok? IS) ;; IW) [ $ctrlnum -eq 0 ] && error root_ida esac # set the traps settrap ;; *) error bad_arg ;; esac #need link-kit for node.d, idmknod and mscsi files check_link makenonroothd cleanup $OK : # @(#) cdrom_iiop.sh 26.1 95/07/21 # # Copyright (C) 1990-1995 The Santa Cruz Operation, Inc. # All Rights Reserved. # The information in this file is provided for the exclusive use of # the licensees of The Santa Cruz Operation, Inc. Such users have the # right to use, modify, and incorporate this code into other products # for purposes authorized by the license agreement provided they include # this notice and the associated copyright notice with any such product. # The information in this file is provided "AS IS" without warranty. # # mkdev/cdrom - CD-ROM and WORM Configuration # rel=`grep rel /etc/perms/rts | sed "s/^#rel=//" | cut -c1-7` shared_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" client_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" ROOT=/ export ROOT . ${ROOT}/etc/conf/bin/path_map.sh init_path_mapping PATH=/etc:/bin:/usr/bin LANG=english_us.ascii export PATH LANG # Set change to NO change=NO tmp=/tmp/cd.$$ # Define return values : ${OK=0} ${FAIL=1} ${STOP=10} ${HALT=11} # Function definitions ########################## # ---------- STANDARD ROUTINES -------- These routines are common to scripts # requiring kernel relinking. # Define traps for critical and non critical code. set_trap() { trap 'echo "Interrupted! Exiting ..."; cleanup 1' 1 2 3 15 } unset_trap() { trap '' 1 2 3 15 } # Remove temp files and exit with the status passed as argument cleanup() { trap '' 1 2 3 15 [ "$tmp" ] && rm -f $tmp* exit $1 } # clear the screen if it is supported clearscr() { # check if the terminal environment is set up [ "$TERM" ] && clear 2> /dev/null } # Prompt for yes or no answer - returns non-zero for no getyn() { while echo "\n$* (y/n) \c">&2 do read yn rest case $yn in [yY]) return $OK ;; [nN]) return $FAIL ;; *) echo "Please answer y or n" >&2 ;; esac done } # Prompt with mesg, return non-zero on q prompt() { while echo "\n${mesg}or enter q to ${quit}: \c" >&2 do read cmd case $cmd in +x|-x) set $cmd ;; Q|q) return $FAIL ;; !*) eval `expr "$cmd" : "!\(.*\)"` ;; "") # If there is an argument use it as the default # else loop until 'cmd' is set [ "$1" ] && { cmd=$1 return $OK } : continue ;; *) return $OK ;; esac done } # Print an error message error() { echo "\nError: $*" >&2 return $FAIL } # Configure error message conferr() { CCFD=`get_mapped_path ID_CCF_D` error "\nConfigure failed to update system configuration. Check $CCFD/conflog for details." } # perms list needed if link kit must be installed permschk () { return $OK if [ -f /etc/perms/extmd ]; then PERM=/etc/perms/extmd else error "Cannot locate /etc/perms/extmd. This file is needed to verify Link Kit installation." cleanup $FAIL fi } # test to see if link kit is installed linkchk() { return $OK cd / until fixperm -i -d LINK $PERM do case $? in 4) echo "\nThe Link Kit is not installed." >&2 ;; 5) echo "\nThe Link Kit is only partially installed." >&2 ;; *) echo "\nError testing for Link Kit. Exiting." >&2; cleanup $FAIL ;; esac # Not fully installed. Do so here getyn "\nDo you wish to install it now?" || { # answered no echo " The Link Kit must be installed to run this program. Exiting ..." cleanup $OK } # answered yes, so install link kit echo "\nInvoking /etc/custom\n" /etc/custom -o -i LINK || { # custom exited unsuccessfully error "custom failed to install Link Kit successfully. Please try again." cleanup $FAIL } done } asklink() { SCFD=`get_mapped_path ID_SCF_D` getyn " You must create a new kernel to effect the driver change you specified. Do you wish to create a new kernel now?" || { echo " To create a new kernel execute $SCFD/link_unix. Then you must reboot your system by executing /etc/shutdown -i0 before the changes you have specified will be implemented.\n" return $FAIL } return $OK } # re-link new kernel klink() { SCFD=`get_mapped_path ID_SCF_D` cd $SCFD unset ROOT ./link_unix || { echo "\nError: Kernel link failed." ROOT=/ export ROOT cleanup $FAIL } ROOT=/ export ROOT return $OK } # ---------- CONFIGURE ROUTINES ------- These routines extract information # from and modify kernel configuration # files and parameters. # This routine sets cf_state and the device major number if applicable. # Possible values for cf_state are as follows. # NO: Device not present in mdevice file and therefore has # no major number. # PART: Device present in mdevice file but the -Y option in the configure # field of the sdevice file is not set. This causes the driver to # be excluded from the next reconfiguration. # All: Device has a major number and the -Y option is set in # the sdevice file. confchk () { name=$1 cf_state= major= SCFD=`get_mapped_path ID_SCF_D` cd $SCFD major=`./configure -j $name` || { cf_state=NO return $FAIL } cf_state=PART CSDEVD=`get_mapped_path ID_SDEVICE_D` if [ -f $CSDEVD/$name ] then fieldval=`awk '{print $2}' $CSDEVD/$name` || { error "awk failed to read sdevice file." cleanup $FAIL } [ "$fieldval" = "Y" ] && { cf_state=YES return $OK } else getyn " This device has an entry in the master device file but no corresponding system device entry. Do you wish to continue and have a default entry created?" || cleanup $FAIL fi return $FAIL } # Add driver according to cf_state. # Global variables used and where set: # $fns: add routines; $cf_state: confchk(); # $major: confchk() or add routine confadd() { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` cd $CCFD case $cf_state in NO) echo "\nAdding device to system configuration files ...\c" >&2 [ "$ipl" ] && IPL="-l $ipl" [ "$iv" ] && IV="-v $iv" $SCFD/configure -a $fns $devchar -m $major $IPL $IV > conflog 2>&1 || { conferr return $FAIL } $SCFD/configure -d $devchar -m $major -R > conflog 2>&1 || { conferr return $FAIL } $SCFD/configure -a $devchar -m $major -Y > conflog || { conferr return $FAIL } ;; PART) $SCFD/configure -a $devchar -m $major -Y > conflog || { conferr return $FAIL } ;; esac echo "\n\nSystem files have been successfully updated." change=YES rm -f conflog return $OK } # Configure driver out of system configuration files by unsetting -Y option. # Global variables used and where set: # $major: confchk() confrm() { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` cd $CCFD echo "\nUpdating system files to effect removal of driver ...\c" $SCFD/configure $devchar -d -m $major -Y > conflog 2>&1 || { conferr return $FAIL } echo "\n\nSystem files have been updated." rm -f conflog change=YES return $OK } # ------- Add Drivers -------- These routines add drivers to configuration # files and create necessary devices # -------CD-ROM SPECIFIC ROUTINES ------- These routines are specific to the # CD-ROM driver # # This program examines the mscsi file and finds out the number of # SCSI cd-rom devices configured. SCSIpos is used to calculate minor # device numbers for SCSI cd-roms. # Global variables set: # SCSIpos find_SCSIpos() { CMSCSI=`get_mapped_path ID_MSCSI` [ -r $CMSCSI ] || { error "\nCannot read $CMSCSI" cleanup $FAIL } num=`sed '/^*/d' $CMSCSI | grep -c "$DRIVER"` [ -n "$num" ] || { error "\nGrep failed to read $CMSCSI." cleanup $FAIL } # calculate total number of driver units configured # SCSI numbering starts at 0. SCSIpos=`expr $num - 1` return $OK } # Create all non-default devices. # Global variables used and where set: # $SCSIpos: find_SCSIpos(); $MINIpos: find_MINIpos() mk_nodes() { minor=`expr 0 + $SCSIpos` echo "$DRIVER $DEVNAME$minor b $minor" >> /etc/conf/node.d/$DRIVER echo "$DRIVER r$DEVNAME$minor c $minor" >> /etc/conf/node.d/$DRIVER } rm_nodes() { CNODED=`get_mapped_path ID_NODE_D` minor=`expr 0 + $SCSIpos` cp $CNODED/$DRIVER /tmp/$DRIVER.$$ grep -v $DEVNAME$minor /tmp/$DRIVER.$$ > $CNODED/$DRIVER rm /tmp/$DRIVER.$$ rm -f /dev/*$DEVNAME$SCSIpos } # Create all non-default devices. # Global variables used and where set: # $DRIVER, $DESCR: menu routines; $major: confchk() or confadd() # $SCSIpos: find_SCSIpos() # Global variables set: # dev_major, change install () { CMSCSI=`get_mapped_path ID_MSCSI` CNODED=`get_mapped_path ID_NODE_D` # Check for the presence of the link kit. Install if it not present. permschk && linkchk # Configure the driver if necessary. confchk "$DRIVER" || { # Add scsi driver to config files. fns=$FNS devchar=$DEVCHAR major=$MAJOR confadd || cleanup $FAIL } find_SCSIpos ; oSCSIpos=$SCSIpos [ $oSCSIpos -ge $MAXUNIT ] && { echo " Sorry, the maximum of $MAXUNIT $NAME Drives has been reached. Unable to configure another one." return $FAIL } getyn "The $NAME Driver must be configured before use. Do you wish to configure the $NAME Driver now?" || { echo " The SCSI $NAME Driver has been added to system configuration files. However, $CMSCSI must also be updated before using a SCSI $NAME Drive. It is advisable to reinvoke mkdev $MYNAME to accomplish this." return $FAIL } # Make sure mscsi and node.d are in synch: # in particular, after installation there may be # cdt nodes and Srom in mscsi, but no Srom cd nodes: # remove Srom from mscsi so we can add successfully # (possibly with a different ID or whatever) # if [ -s $CNODED/$DRIVER ] then [ $SCSIpos -ge 0 ] || rm -f $CNODED/$DRIVER elif [ $SCSIpos -ge 0 ] then cp $CMSCSI /tmp/$DRIVER.$$ grep -v $DRIVER /tmp/$DRIVER.$$ > $CMSCSI rm -f /tmp/$DRIVER.$$ SCSIpos=-1; oSCSIpos=-1 fi # Edit /etc/conf/cf.d/mscsi as was /bin/sh /usr/lib/mkdev/.scsi_iiop -a $DEVTYPE -n || return $FAIL while : do find_SCSIpos ; nSCSIpos=$SCSIpos differ=`expr $nSCSIpos - $oSCSIpos` case $differ in 0) getyn " The number of SCSI $NAME Drives has not been changed. Do you wish to try again?" || return $FAIL ;; *) [ $SCSIpos -lt $MAXUNIT ] && break; echo " A maximum of $MAXUNIT SCSI $NAME Drives are allowed. Please reconfigure." ;; esac echo " Invoking the interface to the master SCSI device file." /bin/sh /usr/lib/mkdev/.scsi_iiop || return $FAIL done change=YES # Set dev_major for use in mkdevice(). dev_major=$major SCSIpos=$oSCSIpos while [ $SCSIpos -lt $nSCSIpos ] do SCSIpos=`expr $SCSIpos + 1` # Create pure scsi devices. mk_nodes "$DRIVER" done if [ "$MYNAME" = "cdrom" ] then # first unit configured [ "$oSCSIpos" -eq -1 ] && { getyn "Do you want to configure a $CDTNAME installation device?" && { cdtinstall || cleanup $FAIL } } fi # don't bother with the kernel linking with -l option getyn "Do you want to add/configure the $HSFILSYS file system?" && { /bin/sh /usr/lib/mkdev/$HSFILSYS -l } return $OK } # $DRIVER, $DESCR: menu routines; # $SCSIpos: find_SCSIpos() remove() { CMSCSI=`get_mapped_path ID_MSCSI` confchk "$DRIVER" || { echo " The $NAME Driver is not currently configured.\n" return $FAIL } find_SCSIpos ; oSCSIpos=$SCSIpos if [ $oSCSIpos -lt 0 ] then getyn " There are currently no SCSI $NAME Drives configured in the /etc/conf/cf.d/mscsi file. Do you wish to continue." || return $FAIL # Pretend we have 4 so we can remove any nodes created and # remove scsi driver from kernel. oSCSIpos=$MAXUNIT else # Edit /etc/conf/cf.d/mscsi /bin/sh /usr/lib/mkdev/.scsi_iiop -r $DEVTYPE -n || return $FAIL fi find_SCSIpos ; nSCSIpos=$SCSIpos differ=`expr $oSCSIpos - $nSCSIpos` case $differ in 0) echo " The number of SCSI $NAME Drives has not been changed." return $FAIL ;; esac change=YES SCSIpos=$oSCSIpos while [ $SCSIpos -gt $nSCSIpos ] do rm_nodes SCSIpos=`expr $SCSIpos - 1` done [ $SCSIpos -eq -1 ] && { permschk && linkchk devchar=$DEVCHAR confrm || cleanup $FAIL echo " The SCSI $NAME Driver and associated devices have been removed." } if [ "$MYNAME" = "cdrom" ] then [ $SCSIpos -eq -1 ] && { cdtremove } confchk "$DRIVER" && { echo " $NAME device unit 0 (first $NAME device in $CMSCSI) is configured as the $CDTNAME installation device." } fi # don't bother with the kernel linking with -l option getyn "Do you want to remove the $HSFILSYS file system?" && { /bin/sh /usr/lib/mkdev/$HSFILSYS -l } return $OK } # -------CD-ROM/TAPE SPECIFIC ROUTINES ------- These routines are specific # to the CD-ROM/TAPE driver # cdtedit() { CPACKD=`get_mapped_path ID_CPACK_D` [ -r $CPACKD/$CDTDRIVER/space.c ] || { error "\nCannot read $CPACKD/$CDTDRIVER/space.c." cleanup $FAIL } ed - $CPACKD/$CDTDRIVER/space.c <<-EOF /phydrv_name/s?= "[A-Za-z].*";?= "$DRIVER";? /cdt_unitnum/s?num = [0-9]*;?num = $unitnum;? w q EOF } cdtmk_nodes() { CNODED=`get_mapped_path ID_NODE_D` nodefile="$CNODED/$CDTDRIVER" rm -f $nodefile > $nodefile minor=`expr 0 + $unitnum` echo "$CDTDRIVER r$CDTDRIVER$unitnum c $minor" >> $nodefile minor=`expr 128 + $unitnum` echo "$CDTDRIVER x$CDTDRIVER$unitnum c $minor" >> $nodefile minor=`expr 8 + $unitnum` echo "$CDTDRIVER nr$CDTDRIVER$unitnum c $minor" >> $nodefile } cdtrm_nodes() { CNODED=`get_mapped_path ID_NODE_D` CPACKD=`get_mapped_path ID_CPACK_D` rm -f $CNODED/$CDTDRIVER # since the author deleted all entries in node.d there # seems little point leaving any device files around. rm -f /dev/*cdt* } cdtinstall() { CMSCSI=`get_mapped_path ID_MSCSI` # Check for the presence of the link kit. Install if it not present. permschk && linkchk # Check for presence of CD-ROM driver. Fail if not present. confchk "$DRIVER" || { echo "\nThe $NAME Driver is not configured currently. It must be configured before the $CDTNAME Driver is used." return $FAIL } # Check for presence of CD-ROM device configured. Fail if not present. find_SCSIpos [ "$SCSIpos" -lt 0 ] && { echo " The SCSI $NAME Driver has been added to system configuration files. However, no $NAME devices are configured in $CMSCSI. Install the $NAME driver again to accomplish this." return $FAIL } echo "\nConfiguring $CDTDRIVER driver ..." # Configure the driver if necessary. confchk "$CDTDRIVER" || { # Add scsi driver to config files. fns=$CDTFNS devchar=$CDTDEVCHAR major=$CDTMAJOR confadd || cleanup $FAIL } unitnum=0 # edit $CPACKD/$CDTDRIVER/space.c cdtedit # Create driver devices. cdtmk_nodes echo " $NAME device unit 0 (first $NAME device in ) $CMSCSI configured as the $CDTNAME installation device." change=YES return $OK } cdtremove() { permschk && linkchk confchk "$CDTDRIVER" || { echo " The $CDTNAME Driver is not currently configured.\n" return $FAIL } echo "\nRemoving $CDTDRIVER driver ..." devchar=$CDTDEVCHAR confrm || cleanup $FAIL cdtrm_nodes echo " The $CDTNAME Driver and associated devices have been removed." return $OK } # main() ######################### set_trap cd / clearscr MYNAME=`basename $0` HSFILSYS="high-sierra" case $MYNAME in cdrom_iiop) # CD-ROM driver DRIVER=Srom NAME=CD-ROM DEVNAME=cd DEVTYPE=-c DEVCHAR="-b -c" MAJOR=51 MAXUNIT=256 FNS="Srominit Sromopen Sromclose Sromread Sromstrategy Sromioctl" # CD-ROM/TAPE driver CDTDRIVER=cdt CDTNAME=CD-ROM/TAPE CDTFNS="cdtopen cdtclose cdtread cdtioctl" CDTDEVCHAR="-c" CDTMAJOR=50 # Configuration options MESG="\n\n$NAME Configuration Program \n 1. Install a $NAME Drive 2. Remove a $NAME Drive 3. Install a $CDTNAME Driver 4. Remove a $CDTNAME Driver Select an option " break ;; worm) DRIVER=Swrm NAME=WORM DEVNAME=worm DEVTYPE=-w DEVCHAR="-b -c" MAXUNIT=8 FNS="Swrminit Swrmopen Swrmclose Swrmread Swrmwrite Swrmstrategy Swrmioctl" MESG="\n\n$NAME Configuration Program \n 1. Install a $NAME Drive 2. Remove a $NAME Drive Select an option " break ;; *) echo "configuration of `basename $0` not supported" exit $FAIL esac while mesg=$MESG quit="quit" do prompt || break # reset these flags prior to each pass through menu major= IPL= IV= select=$cmd if [ "$MYNAME" = "cdrom" ] then case $select in 1) install ;; 2) remove ;; 3) cdtinstall ;; 4) cdtremove ;; *) echo "\n Please select 1, 2, 3 or 4." continue ;; esac else case $select in 1) install ;; 2) remove ;; *) echo "\n Please select either 1 or 2." continue ;; esac fi done if [ "$change" = "YES" -a ! "$_RELINK" ] then asklink && klink fi cleanup $OK : # @(#) tape_iiop.sh 26.1 95/07/21 # # Copyright (C) 1986-1995 The Santa Cruz Operation, Inc. # All Rights Reserved. # The information in this file is provided for the exclusive use of # the licensees of The Santa Cruz Operation, Inc. Such users have the # right to use, modify, and incorporate this code into other products # for purposes authorized by the license agreement provided they include # this notice and the associated copyright notice with any such product. # The information in this file is provided "AS IS" without warranty. # # mkdev/tape - Tape Drive Configuration # # rel=`grep rel /etc/perms/rts | sed "s/^#rel=//" | cut -c1-7` shared_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" client_ssoId="__SSO_ID_ST@SCO:Unix:$rel @SSO_ID_END__" ROOT=/ export ROOT . ${ROOT}/etc/conf/bin/path_map.sh init_path_mapping PATH=/etc:/bin:/usr/bin LANG=english_us.ascii export PATH LANG # source in standard tape functions TAPEFUNCS=/usr/lib/mkdev/.tapefuncs [ -f ${TAPEFUNCS} ] && { . ${TAPEFUNCS} } || { echo "Fatal Error: Cannot load function file: ${TAPEFUNCS}" exit 1 } # Set change to NO change=NO tmp=/tmp/tp.$$ # ---------- CONFIGURE ROUTINES ------- These routines extract information # from and modify kernel configuration # files and parameters. # This routine sets cf_state and the device major number if applicable. # Possible values for cf_state are as follows. # NO: Device not present in mdevice file and therefore has # no major number. # PART: Device present in mdevice file but the -Y option in the configure # field of the sdevice file is not set. This causes the driver to # be excluded from the next reconfiguration. # All: Device has a major number and the -Y option is set in # the sdevice file. confchk () { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` CSDEV=`get_mapped_path ID_SDEVICE_D` name=$1 cf_state= major= cd $CCFD major=`$SCFD/configure -j $name` || { cf_state=NO return $FAIL } cf_state=PART if [ -r $CSDEV/$name ] then vars=$* set `cat $CSDEV/$name` || { error "cat failed to read sdevice file." cleanup $FAIL } fieldval=$2 set $vars [ "$fieldval" = "Y" ] && { cf_state=YES return $OK } else getyn " This device has an entry in the master device file but no corresponding system device entry. Do you wish to continue and have a default entry created?" || cleanup $FAIL fi return $FAIL } # Add driver according to cf_state. # Global variables used and where set: # $fns: add routines; $cf_state: confchk(); # $major: confchk() or add routine confadd() { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` CSDEV=`get_mapped_path ID_SDEVICE_D` case $cf_state in NO) echo "\nAdding device to system configuration files ...\c" >&2 major=`$SCFD/configure -j NEXTMAJOR` [ "$ipl" ] && IPL="-l $ipl" [ "$iv" ] && IV="-v $iv" $SCFD/configure -a $fns -c -R -m $major $IPL $IV > $CCFD/conflog 2>&1 || { conferr return $FAIL } ;; esac echo "\n\nSystem files have been successfully updated." change=YES rm -f $CCFD/conflog 2>/dev/null return $OK } # Configure driver out of system configuration files by unsetting -Y option. # Global variables used and where set: # $major: confchk() confrm() { SCFD=`get_mapped_path ID_SCF_D` CCFD=`get_mapped_path ID_CCF_D` cd $CCFD echo "\nUpdating system files to effect removal of driver ...\c" $SCFD/configure -c -d -m $major -Y -R > conflog 2>&1 || { conferr return $FAIL } echo "\n\nSystem files have been updated." rm -f conflog change=YES return $OK } # Add the QIC-02 driver to configuration files and make devices. # Global variables used and where set: # $DRIVER, $DESCR: menu routines; $major: confchk() or confadd() # Global variables set: # fns, dev_major addqic02 () { SPACKD=`get_mapped_path ID_SPACK_D` # Check for the presence of the link kit. Install if it not present. permschk && linkchk confchk "$DRIVER" && { getyn " The ${DESCR}r is already present in system configuration files. Do you wish to continue?" || return $FAIL } # ctconfig allows user to modify interrupt and base address # (it edits values in /etc/conf/pack.d/ct/space.c ) CPCKD=`get_mapped_path ID_CPACK_D` cd $CPCKD/ct $SPACKD/ct/ctconfig || { error " The system must be configured in order to use the $DESCR. Exiting ...\n" cleanup $FAIL } # Remove tmp file created by ctconfig. rm -f /tmp/ctconfig* fns="ctinit ctioctl ctread ctwrite ctopen ctclose" confadd || cleanup $FAIL cd / # Set dev_major for use in mkdevice(). dev_major=$major # mk_nodes() is not required ct. Nodes created in lnk_defaults(). # Presently, def_nodeclash will always return true for ct since # it must use default devices. def_nodeclash && { # Link driver to default devices. lnk_defaults "$DRIVER" def_driveclash && { # edit /etc/default/tape. edit_def "$DRIVER" } } return $OK } # Global variables used and where set: # $DRIVER, $DESCR: menu routines; $major: confchk() or confadd() # $MINIpos: ask_MINIpos() # Global variables set: # fns, dev_major addqic40 () { CPACKD=`get_mapped_path ID_CPACK_D` # Check for the presence of the link kit. Install if it not present. permschk && linkchk confchk "$DRIVER" && { getyn " The ${DESCR}r is already present in system configuration files. Do you wish to continue?" || return $FAIL } qic40_query || return $FAIL # Set the unit number QICpos ("2" is the default), QICsoft, & QICauto. ask_QICpos "2" || return $FAIL if [ $QICsoft -eq 0 ] then sed -e "s/FT_SOFT_SELECT;/FT_HARD_SELECT;/" $CPACKD/ft/space.c > /tmp/space$$ else sed -e "s/FT_HARD_SELECT;/FT_SOFT_SELECT;/" $CPACKD/ft/space.c > /tmp/space$$ fi cp $CPACKD/ft/space.c $CPACKD/ft/space.c.bak mv /tmp/space$$ $CPACKD/ft/space.c if [ $QICauto -eq 0 ] then sed -e "s/FT_AUTO;/FT_OLD;/" $CPACKD/ft/space.c > /tmp/space$$ else sed -e "s/FT_OLD;/FT_AUTO;/" $CPACKD/ft/space.c > /tmp/space$$ fi mv /tmp/space$$ $CPACKD/ft/space.c fns="ftinit ftioctl ftread ftwrite ftopen ftclose ftpoll" # Add to configuration files. confadd || cleanup $FAIL # Set dev_major for use in mkdevice(). major was set in confchk(). dev_major=$major # Create QIC-40/QIC-80 devices. mk_nodes "$DRIVER" def_nodeclash && { # Link driver to default devices. lnk_defaults "$DRIVER" def_driveclash && { # edit /etc/default/tape. edit_def "$DRIVER" } } return $OK } # add irwin minitape driver # Global variables used and where set: # $DRIVER, $DESCR: menu routines; $major: confchk() or confadd() # $MINIpos: ask_MINIpos() # Global variables set: # fns, dev_major addmini () { CPACKD=`get_mapped_path ID_CPACK_D` CRCD=`get_mapped_path ID_RC_D` # Check for the presence of the link kit. Install if it not present. permschk && linkchk confchk "$DRIVER" && { getyn " The ${DESCR}r is already present in system configuration files. Do you wish to continue?" || return $FAIL } # Set the unit number MINIpos. "1" is the default. ask_MINIpos "1" "$DRIVER" || return $FAIL fns="mcinit mcioctl mcread mcwrite mcopen mcclose mcpoll" # Add to configuration files. confadd || cleanup $FAIL # Set dev_major for use in mkdevice(). major was set in confchk(). dev_major=$major # Create pure irwin devices. mk_nodes "$DRIVER" def_nodeclash && { # Link driver to default devices. lnk_defaults "$DRIVER" def_driveclash && { # edit /etc/default/tape. edit_def "$DRIVER" } } # Install rc script cp $CPACKD/mc/rc $CRCD/mc return $OK } # ------- Remove Drivers -------- These routines remove tape drivers from # configuration files and delete # appropriate devices. # Global variables used and where set: # $DRIVER, $DESCR: menu routines rmqic02 () { # Check for the presence of the link kit. Install if it not present. permschk && linkchk confchk "$DRIVER" || { echo " The ${DESCR}r is not currently configured.\n" return $FAIL } confrm || cleanup $FAIL rm_defaults "$DRIVER" is_default && { echo "\nRemoving default tape devices." rm_defaults "$DRIVER" edit_def "NONE" } echo "\n${DESCR}r and associated devices have been removed." return $OK } # Global variables used and where set: # $DRIVER, $DESCR: menu routines rmmini () { CRCD=`get_mapped_path ID_CR_D` # Check for the presence of the link kit. Install if it not present. permschk && linkchk confchk "$DRIVER" || { echo " The ${DESCR}r is not currently configured.\n" return $FAIL } confrm || cleanup $FAIL rm_nodes "$DRIVER" is_default && { echo "\nRemoving default tape devices." rm_defaults "$DRIVER" edit_def "NONE" } echo "\n${DESCR}r and associated devices have been removed." rm -f $CRCD/$DRIVER return $OK } # Global variables used and where set: # $DRIVER, $DESCR: menu routines rmqic40 () { # Check for the presence of the link kit. Install if it not present. permschk && linkchk confchk "$DRIVER" || { echo " The ${DESCR}r is not currently configured.\n" return $FAIL } confrm || cleanup $FAIL rm_nodes "$DRIVER" is_default && { echo "\nRemoving default tape devices." rm_defaults "$DRIVER" edit_def "NONE" } echo "\n${DESCR}r and associated devices have been removed." return $OK } # ----- Change Default Tape ------ These routines implement a change # in the default tape drive. # Qic-02 Cartridge Tape. # Global variables used and where set: # $DRIVER, $DESCR: menu routines; changeqic02() { confchk "$DRIVER" || { echo "\nThe ${DESCR}r is not currently installed." return $FAIL } # QIC-02 is always linked to the default devices. Just edit $DEFAULT edit_def "$DRIVER" return $OK } # Irwin mini tape. # Global variables used and where set: # $DRIVER, $DESCR: menu routines; changemini() { confchk "$DRIVER" || { echo "\nThe ${DESCR}r is not currently installed." return $FAIL } lnk_defaults "$DRIVER" edit_def "$DRIVER" return $OK } # Qic-40 mini tape. # Global variables used and where set: # $DRIVER, $DESCR: menu routines; changeqic40() { confchk "$DRIVER" || { echo "\nThe ${DESCR}r is not currently installed." return $FAIL } lnk_defaults "$DRIVER" edit_def "$DRIVER" return $OK } # ------- MENU ROUTINES ------- These routines present a menu, # prompt the user, set global variables # and execute appropriate routines. # find out what they want to install installmenu () { quit="return to the main menu" mesg=" Tape Drive Installation Menu 1. Install Cartridge Tape Drive 2. Install Mini-Cartridge Tape Drive 3. Install Qic-40 or Qic-80 Tape Drive 4. Install $CPQS_DESCR Select an option " while : do prompt || return itape=$cmd case $itape in 1) DESCR="Cartridge Tape Drive" DRIVER=ct addqic02 || return changebootstr ;; 2) DESCR="Mini-Cartridge Tape Drive" DRIVER=mc addmini || return changebootstr ;; 3) DESCR="Qic-40 or Qic-80 Tape Drive" DRIVER=ft addqic40 || return changebootstr ;; 4) DESCR=$CPQS_DESCR DRIVER=$CPQS_DRIVER add$CPQS_DRIVER || return changebootstr ;; *) error "Please enter 1,2,3,4 or q to quit" continue ;; esac break done } # find out what they want to remove removemenu () { quit="return to the main menu" mesg=" Tape Drive Removal Menu 1. Remove Cartridge Tape Drive 2. Remove Mini-Cartridge Tape Drive 3. Remove Qic-40 or Qic-80 Tape Drive 4. Remove $CPQS_DESCR Select an option " while : do prompt || return rtape=$cmd case $rtape in 1) DESCR="Cartridge Tape Drive" DRIVER=ct rmqic02 || return changebootstr ;; 2) DESCR="Mini-Cartridge Tape Drive" DRIVER=mc rmmini || return changebootstr ;; 3) DESCR="Qic-40 or Qic-80 Tape Drive" DRIVER=ft rmqic40 || return changebootstr ;; 4) DESCR=$CPQS_DESCR DRIVER=$CPQS_DRIVER rm$CPQS_DRIVER || return changebootstr ;; *) error "Please enter 1,2,3 or q to quit" continue ;; esac break done } changemenu() { quit="return to the main menu" mesg=" Default Tape Drive Update Menu 1. Cartridge Tape Drive 2. Mini-Cartridge Tape Drive 3. Qic-40 or Qic-80 Tape Drive 4. $CPQS_DESCR Please select which tape drive you would like to have linked to default devices " while : do prompt || return ctape=$cmd case $ctape in 1) DESCR="Cartridge Tape Drive" DRIVER=ct changeqic02 || return changebootstr ;; 2) DESCR="Mini-Cartridge Tape Drive" DRIVER=mc changemini || return changebootstr ;; 3) DESCR="Qic-40 or Qic-80 Tape Drive" DRIVER=ft changeqic40 || return changebootstr ;; 4) DESCR=$CPQS_DESCR DRIVER=$CPQS_DRIVER change$CPQS_DRIVER || return changebootstr ;; *) error "Please enter 1,2,3 or q to quit" continue ;; esac break done } # # configmenu: # ---------- # Main configuration menu for non-SCSI tape drives # configmenu() { clearscr while mesg="\n\nTape Drive Configuration Program \n 1. Install a Tape Drive 2. Remove a Tape Drive 3. Change default Tape Drive Select an option " quit="quit" do prompt || break # reset these flags prior to each pass through menu major= IPL= IV= select=$cmd case $select in 1) installmenu ;; 2) removemenu ;; 3) changemenu ;; *) echo "\n Please select either 1, 2 or 3" continue ;; esac done } # main() ######################### init_path_mapping set_trap #pick-up compaq functionality if [ -f $CPQS_SCRIPT ] then . $CPQS_SCRIPT else CPQS_DESCR="Compaq CPQS Tape Drive" CPQS_DRIVER=cpqs fi #pick-up SCSI functionality SCSI_TAPESCRIPT=/usr/lib/mkdev/.scsitape_iiop if [ -f $SCSI_TAPESCRIPT ] then . $SCSI_TAPESCRIPT fi cd / clearscr while mesg="\n\nTape Drive Configuration Program \n 1. Configure SCSI tape drive 2. Configure non-SCSI tape drive Select an option " quit="quit" do prompt || break # reset these flags prior to each pass through menu major= IPL= IV= select=$cmd case $select in 1) configsmenu ;; 2) configmenu ;; *) echo "\n Please select either 1 or 2" continue ;; esac done SBIN=`get_mapped_path ID_BIN` if [ "$change" = "YES" ] then if [ "$_RELINK" -o "$_NOPROMPT" ] then klink else asklink && klink fi elif [ "$make_nodes" = "YES" ] then $SBIN/idmknod fi cleanup $OK : ## ## ident @(#) @(#) getns0 1.2 1 5/24/95 11:28:32 ## ## sccs_id[] = {"@(#) 1.2 getns0 "} ## # # This script returns a number, 1 thru n, which represents # the order that a disk device was installed in and also # denotes the node file associated with the disk, i.e., 1s0 # 2s0, 3s0 and so on. This script uses the mscsi entry of # the disk in question as input and utilizes the file # /usr/lib/mkdev/perms/NS0LIST to figure out which node file # the drive in question was installed as. # ns0list=/usr/lib/mkdev/perms/NS0LIST mscsientry= # ## main # fgrep -v "#" $ns0list > /tmp/getns0$$ mscsientry=`fgrep -n "$1" /tmp/getns0$$` if [ "$mscsientry" ] then mscsientry=`expr "$mscsientry" : '\([0-9][0-9]*\)'` else mscsientry=0 fi rm -f /tmp/getns0$$ exit $mscsientry u.n..vNS0LIST## ## ident @(#) @(#) NS0LIST.orig 1.1 1 1/2/95 08:02:00 ## ## sccs_id[] = {"@(#) NS0LIST 26.1 95/07/21 "} ## # # This file contains a list of disk devices, as they were # installed. It provides a map from an installed disk devices # mscsi entry to the appropriate device node that was created # when that device was installed, i.e., 0s0, 1s0, 2s0, 3s0, and so on # w.]..xpiiop~iiopimsDsktpicx.w..ySpace.czSpace.o{System|Master}Driver.o#ident "@(#) space.c 26.2 95/07/19 " /* * Copyright (C) The Santa Cruz Operation, 1994-1995. * This Module contains Proprietary Information of * The Santa Cruz Operation and should be treated as Confidential. */ /* ** ident @(#) @(#) space.c.iiop 1.21 1 5/24/95 11:27:56 ** ** sccs_id[] = {"@(#) 1.21 space.c.iiop "} */ /* *************************************************************************** ** ** MODULE NAME: space.c.iiop ** ** PURPOSE: IIOP device driver table. ** ** DEPENDENCIES: ** ** ** REVISION HISTORY: ** FPR/CRN Date Author Description ** 05/22/90 J. Ruf Initial release. ** 06/21/90 J. Ruf Added IIOP firmware timeout support. ** 10/31/90 J. Ruf Supporting two IIOP boards. ** 11/08/90 J. Ruf Added revision info to identify ** auto-configuration pic ipl value. ** 08/14/91 J. Ruf Added RAID 1 support. ** 11/08/91 J. Ruf Added iiop_poll() loop counter. ** 12/13/91 J. Ruf Provide a single IIOP driver source. ** 04/24/92 J. Ruf Added Extended IIOP support for two ** controllers each with a maximum of ** two SCSI channels. ** 06/09/92 J. Ruf Allow sufficient cache for EIOP RAID 1. ** 08/14/92 S. Cady Add stuff for K2 support ** 08/01/93 K. Conner Distributed interrupt support, mpx 3.0. ** ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990 - 1992 ** All rights reserved. ** ** *************************************************************************** */ /* *************************************************************************** ** System Include Files *************************************************************************** */ #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/cmn_err.h" #include "sys/immu.h" #include "sys/systm.h" #include "sys/buf.h" #include "sys/iobuf.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/scsi.h" #include "sys/devreg.h" /* New adapter init interface structs. */ #include "sys/ci/ciintr.h" /* *************************************************************************** ** Module Related Include Files *************************************************************************** */ #include "sys/iiop.h" #include "config.h" /* *************************************************************************** ** Defines *************************************************************************** */ #define IIOP_TIMEOUT 120000 /* Timeout of 2 minutes in milliseconds. */ #define IIOP_MIN 60000 /* Timeout of 1 minute in Hertz. */ #define IIOP_MAX_IORPS 164 /* 1 More than upper level req_io's and scatter/gather descriptors. */ #define IIOP_MAX_LIORPS 164 /* 1 More than upper level req_io's and scatter/gather descriptors. */ /* ** W A R N I N G ! ! ! ** The following define must match IIOP_MAX_REQIO_K2 in ** space.c.dsk */ #define IIOP_MAX_IORPS_K2 512 /* 1 More than upper level req_io's and scatter/gather descriptors. */ #define IIOP_MAX_LIORPS_K2 512 /* 1 More than upper level req_io's and scatter/gather descriptors. */ #define IIOP_PUT_EM_IN_DUAL_PORT 0 /* Put both physical and logical IORP data sets in dual port memory if this define is TRUE and dual port memory is available. */ /* ** NOTE: Currently SCO MPX 3.0.0j doesnot support dynamic distribution ** of ISS interrupt to a subset of all processors ** ** Select one of each of the following pairs to dictate whether that ** processor is to field an ISS interrupt. 0 - no, non-zero then yes */ /*#define CPU1 0x1*/ /* CPU1 - master gets ISS interrupts. */ #define CPU1 0x0 /* CPU1 - master does not get ISS interrupts. */ #define CPU2 0x2 /* CPU2 - slave 1 gets ISS interrupts. */ /*#define CPU2 0x0*/ /* CPU2 - slave 1 does not get ISS interrupts.*/ #define CPU3 0x4 /* CPU3 - slave 2 gets ISS interrupts. */ /*#define CPU3 0x0*/ /* CPU3 - slave 2 does not get ISS interrupts.*/ #define CPU4 0x8 /* CPU4 - slave 3 gets ISS interrupts. */ /*#define CPU4 0x0*/ /* CPU4 - slave 3 does not get ISS interrupts.*/ #define CPU5 0x10 /* CPU5 - slave 4 gets ISS interrupts. */ /*#define CPU5 0x0*/ /* CPU5 - slave 4 does not get ISS interrupts.*/ #define CPU6 0x20 /* CPU6 - slave 5 gets ISS interrupts. */ /*#define CPU6 0x0*/ /* CPU6 - slave 5 does not get ISS interrupts.*/ #define CPU7 0x40 /* CPU7 - slave 6 gets ISS interrupts. */ /*#define CPU7 0x0*/ /* CPU7 - slave 6 does not get ISS interrupts.*/ /* ** The following define SHAREG_EX_PROCESSOR_MASK dictates which ** cpus IIOP interrupts are allowed to occur on. -Modify the above ** defines to dicate who gets ISS interrupts. */ #define SHAREG_EX_PROCESSOR_MASK ICPU_EXANY /* Interrupt routine will run on any processor but not in parallel on multiple processors. */ /*#define SHAREG_EX_PROCESSOR_MASK ICPU_ANY*/ /* Interrupt routine will run on any processor and in parallel on multiple processors. */ /* ** NOTE: Currently SCO MPX 3.0.0j doesnot support dynamic distribution ** of ISS interrupt to a subset of all processors ** If they do, then we can do the following, if we want to. ** In the mean time we have to do the define above. */ /*#define SHAREG_EX_PROCESSOR_MASK (CPU1 | CPU2 | CPU3 | CPU4 | CPU5 | CPU6 | CPU7 )*/ /* *************************************************************************** ** Global Static Storage *************************************************************************** */ /* *************************************************************************** ** IIOP specific environment, first controller contains boot device. *************************************************************************** */ extern int piiop_entry(); /* Adapter entry routine, issue request. */ extern int piiopintr(); /* Adapter interrupt routine, finish request. */ extern int iiop_get_geometry(); /* Drive capacity to bios geometry computation. */ extern void iiop_init_drive(); /* Set disk drives readahead and bad blocking algorithm. */ /* ** Lock structures associated with each controller */ /* ** Controller 1 */ static struct lockb iorp_lock_ctlr_1 = {0,0}; /* IORP LOCK */ static char pad1[28] = {0}; /* 32 bytes apart */ static struct lockb liorp_lock_ctlr_1 = {0,0}; /* LIORP LOCK */ static char pad2[28] = {0}; /* 32 bytes apart */ static struct lockb submitq_lock_ctlr_1 = {0,0};/* Submission queue lock. */ static char pad3[28] = {0}; /* 32 bytes apart */ static struct lockb cmpltq_lock_ctlr_1 = {0,0}; /* Complete queue lock. */ static char pad4[28] = {0}; /* 32 bytes apart */ static struct lockb rq_lock_ctlr_1 = {0,0}; /* Generic request queue lock.*/ static char pad5[28] = {0}; /* 32 bytes apart */ static struct lockb errorq_lock_ctlr_1 = {0,0}; /* Error queue lock. */ static char pad6[28] = {0}; /* 32 bytes apart */ /* ** Controller 2 */ static struct lockb iorp_lock_ctlr_2 = {0,0}; /* IORP LOCK */ static char pad7[28] = {0}; /* 32 bytes apart */ static struct lockb liorp_lock_ctlr_2 = {0,0}; /* LIORP LOCK */ static char pad8[28] = {0}; /* 32 bytes apart */ static struct lockb submitq_lock_ctlr_2 = {0,0};/* Submission queue lock. */ static char pad9[28] = {0}; /* 32 bytes apart */ static struct lockb cmpltq_lock_ctlr_2 = {0,0}; /* Complete queue lock. */ static char pada[28] = {0}; /* 32 bytes apart */ static struct lockb rq_lock_ctlr_2 = {0,0}; /* Generic request queue lock.*/ static char padb[28] = {0}; /* 32 bytes apart */ static struct lockb errorq_lock_ctlr_2 = {0,0}; /* Error queue lock. */ static char padc[28] = {0}; /* 32 bytes apart */ /* ** Controller 3 */ static struct lockb iorp_lock_ctlr_3 = {0,0}; /* IORP LOCK */ static char padd[28] = {0}; /* 32 bytes apart */ static struct lockb liorp_lock_ctlr_3 = {0,0}; /* LIORP LOCK */ static char pade[28] = {0}; /* 32 bytes apart */ static struct lockb submitq_lock_ctlr_3 = {0,0};/* Submission queue lock. */ static char padf[28] = {0}; /* 32 bytes apart */ static struct lockb cmpltq_lock_ctlr_3 = {0,0}; /* Complete queue lock. */ static char padg[28] = {0}; /* 32 bytes apart */ static struct lockb rq_lock_ctlr_3 = {0,0}; /* Generic request queue lock.*/ static char padh[28] = {0}; /* 32 bytes apart */ static struct lockb errorq_lock_ctlr_3 = {0,0}; /* Error queue lock. */ static char padi[28] = {0}; /* 32 bytes apart */ /* ** Controller 4 */ static struct lockb iorp_lock_ctlr_4 = {0,0}; /* IORP LOCK */ static char padj[28] = {0}; /* 32 bytes apart */ static struct lockb liorp_lock_ctlr_4 = {0,0}; /* LIORP LOCK */ static char padk[28] = {0}; /* 32 bytes apart */ static struct lockb submitq_lock_ctlr_4 = {0,0};/* Submission queue lock. */ static char padl[28] = {0}; /* 32 bytes apart */ static struct lockb cmpltq_lock_ctlr_4 = {0,0}; /* Complete queue lock. */ static char padm[28] = {0}; /* 32 bytes apart */ static struct lockb rq_lock_ctlr_4 = {0,0}; /* Generic request queue lock.*/ static char padn[28] = {0}; /* 32 bytes apart */ static struct lockb errorq_lock_ctlr_4 = {0,0}; /* Error queue lock. */ static char pado[28] = {0}; /* 32 bytes apart */ /* ** Controller 5 */ static struct lockb iorp_lock_ctlr_5 = {0,0}; /* IORP LOCK */ static char padp[28] = {0}; /* 32 bytes apart */ static struct lockb liorp_lock_ctlr_5 = {0,0}; /* LIORP LOCK */ static char padq[28] = {0}; /* 32 bytes apart */ static struct lockb submitq_lock_ctlr_5 = {0,0};/* Submission queue lock. */ static char padr[28] = {0}; /* 32 bytes apart */ static struct lockb cmpltq_lock_ctlr_5 = {0,0}; /* Complete queue lock. */ static char pads[28] = {0}; /* 32 bytes apart */ static struct lockb rq_lock_ctlr_5 = {0,0}; /* Generic request queue lock.*/ static char padt[28] = {0}; /* 32 bytes apart */ static struct lockb errorq_lock_ctlr_5 = {0,0}; /* Error queue lock. */ static char padu[28] = {0}; /* 32 bytes apart */ /* ** Controller 6 */ static struct lockb iorp_lock_ctlr_6 = {0,0}; /* IORP LOCK */ static char padv[28] = {0}; /* 32 bytes apart */ static struct lockb liorp_lock_ctlr_6 = {0,0}; /* LIORP LOCK */ static char padw[28] = {0}; /* 32 bytes apart */ static struct lockb submitq_lock_ctlr_6 = {0,0};/* Submission queue lock. */ static char padx[28] = {0}; /* 32 bytes apart */ static struct lockb cmpltq_lock_ctlr_6 = {0,0}; /* Complete queue lock. */ static char pady[28] = {0}; /* 32 bytes apart */ static struct lockb rq_lock_ctlr_6 = {0,0}; /* Generic request queue lock.*/ static char padz[28] = {0}; /* 32 bytes apart */ static struct lockb errorq_lock_ctlr_6 = {0,0}; /* Error queue lock. */ static char padaa[28] = {0}; /* 32 bytes apart */ SHAREG_EX iiop_ctlr_1 = { (SHAREG *) NULL, (SHAREG *) NULL, piiop_entry, piiopintr, (int) SHAREG_VERSION, 1, 1, 0, (int) IROUTE_GLOBAL, (int) IIOP_INTR_PRI, (int) IMODE_EXCLUSIVE, (int) SHAREG_EX_PROCESSOR_MASK, 0, 0 }; SHAREG_EX iiop_ctlr_2 = { (SHAREG *) NULL, (SHAREG *) NULL, piiop_entry, piiopintr, (int) SHAREG_VERSION, 1, 1, 0, (int) IROUTE_GLOBAL, (int) IIOP_INTR_PRI, (int) IMODE_EXCLUSIVE, (int) SHAREG_EX_PROCESSOR_MASK, 0, 0 }; SHAREG_EX iiop_ctlr_3 = { (SHAREG *) NULL, (SHAREG *) NULL, piiop_entry, piiopintr, (int) SHAREG_VERSION, 1, 1, 0, (int) IROUTE_GLOBAL, (int) IIOP_INTR_PRI, (int) IMODE_EXCLUSIVE, (int) SHAREG_EX_PROCESSOR_MASK, 0, 0 }; SHAREG_EX iiop_ctlr_4 = { (SHAREG *) NULL, (SHAREG *) NULL, piiop_entry, piiopintr, (int) SHAREG_VERSION, 1, 1, 0, (int) IROUTE_GLOBAL, (int) IIOP_INTR_PRI, (int) IMODE_EXCLUSIVE, (int) SHAREG_EX_PROCESSOR_MASK, 0, 0 }; SHAREG_EX iiop_ctlr_5 = { (SHAREG *) NULL, (SHAREG *) NULL, piiop_entry, piiopintr, (int) SHAREG_VERSION, 1, 1, 0, (int) IROUTE_GLOBAL, (int) IIOP_INTR_PRI, (int) IMODE_EXCLUSIVE, (int) SHAREG_EX_PROCESSOR_MASK, 0, 0 }; SHAREG_EX iiop_ctlr_6 = { (SHAREG *) NULL, (SHAREG *) NULL, piiop_entry, piiopintr, (int) SHAREG_VERSION, 1, 1, 0, (int) IROUTE_GLOBAL, (int) IIOP_INTR_PRI, (int) IMODE_EXCLUSIVE, (int) SHAREG_EX_PROCESSOR_MASK, 0, 0 }; IIOP_DEVICE iiop_devices[] = { /* ** IIOP device 0. */ {(int) 0, (int) 0, (int) 0, (int) 0, &iiop_ctlr_1, (IIOP_CONTROL_REG *) IIOP_X_CNTRL_REG, (paddr_t) IIOP_X_DP_RAM, (struct lockb *) &iorp_lock_ctlr_1, (struct lockb *) &liorp_lock_ctlr_1, (struct lockb *) &submitq_lock_ctlr_1, (struct lockb *) &cmpltq_lock_ctlr_1, (struct lockb *) &rq_lock_ctlr_1, (struct lockb *) &errorq_lock_ctlr_1, }, /* ** IIOP device 1. */ {(int) 0, (int) 0, (int) 0, (int) 0, &iiop_ctlr_2, (IIOP_CONTROL_REG *) IIOP_X_CNTRL_REG, (paddr_t) IIOP_X_DP_RAM, (struct lockb *) &iorp_lock_ctlr_2, (struct lockb *) &liorp_lock_ctlr_2, (struct lockb *) &submitq_lock_ctlr_2, (struct lockb *) &cmpltq_lock_ctlr_2, (struct lockb *) &rq_lock_ctlr_2, (struct lockb *) &errorq_lock_ctlr_2, }, /* ** IIOP device 2. */ {(int) 0, (int) 0, (int) 0, (int) 0, &iiop_ctlr_3, (IIOP_CONTROL_REG *) IIOP_X_CNTRL_REG, (paddr_t) IIOP_X_DP_RAM, (struct lockb *) &iorp_lock_ctlr_3, (struct lockb *) &liorp_lock_ctlr_3, (struct lockb *) &submitq_lock_ctlr_3, (struct lockb *) &cmpltq_lock_ctlr_3, (struct lockb *) &rq_lock_ctlr_3, (struct lockb *) &errorq_lock_ctlr_3, }, /* ** IIOP device 3. */ {(int) 0, (int) 0, (int) 0, (int) 0, &iiop_ctlr_4, (IIOP_CONTROL_REG *) IIOP_X_CNTRL_REG, (paddr_t) IIOP_X_DP_RAM, (struct lockb *) &iorp_lock_ctlr_4, (struct lockb *) &liorp_lock_ctlr_4, (struct lockb *) &submitq_lock_ctlr_4, (struct lockb *) &cmpltq_lock_ctlr_4, (struct lockb *) &rq_lock_ctlr_4, (struct lockb *) &errorq_lock_ctlr_4, }, /* ** IIOP device 4. */ {(int) 0, (int) 0, (int) 0, (int) 0, &iiop_ctlr_5, (IIOP_CONTROL_REG *) IIOP_X_CNTRL_REG, (paddr_t) IIOP_X_DP_RAM, (struct lockb *) &iorp_lock_ctlr_5, (struct lockb *) &liorp_lock_ctlr_5, (struct lockb *) &submitq_lock_ctlr_5, (struct lockb *) &cmpltq_lock_ctlr_5, (struct lockb *) &rq_lock_ctlr_5, (struct lockb *) &errorq_lock_ctlr_5, }, /* ** IIOP device 5. */ {(int) 0, (int) 0, (int) 0, (int) 0, &iiop_ctlr_6, (IIOP_CONTROL_REG *) IIOP_X_CNTRL_REG, (paddr_t) IIOP_X_DP_RAM, (struct lockb *) &iorp_lock_ctlr_6, (struct lockb *) &liorp_lock_ctlr_6, (struct lockb *) &submitq_lock_ctlr_6, (struct lockb *) &cmpltq_lock_ctlr_6, (struct lockb *) &rq_lock_ctlr_6, (struct lockb *) &errorq_lock_ctlr_6, }, }; /* *************************************************************************** ** Command timeout values. *************************************************************************** */ IIOP_CMD iiop_cmds[] = { /* 0x00 TEST_CMD */ {IIOP_TIMEOUT, 0, IIOP_SCSI_CMD}, /* 0x01 REWIND_CMD */ {IIOP_MIN*30, 0, IIOP_SCSI_CMD}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x03 SENSE_CMD */ {IIOP_TIMEOUT, 0, IIOP_SCSI_READ}, /* 0x04 FORMAT_CMD */ {IIOP_MIN*60*2, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, IIOP_SCSI_READ}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x07 RD_BACK_CMD */ {IIOP_MIN, 0, IIOP_SCSI_WRITE}, /* 0x08 READ_CMD */ {0xfffffff, 0, IIOP_SCSI_READ}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x0A WRITE_CMD */ {0xfffffff, 0, IIOP_SCSI_WRITE}, /* 0x0B SEEK_CMD */ {IIOP_TIMEOUT, 0, IIOP_SCSI_CMD}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x0F TP_RDB */ {IIOP_TIMEOUT, 0, -1}, /* 0x10 TP_WFM */ {IIOP_TIMEOUT, 0, IIOP_SCSI_CMD}, /* 0x11 TP_SP */ {IIOP_MIN*30, 0, IIOP_SCSI_CMD}, /* 0x12 INQUIRY_CMD */ {IIOP_TIMEOUT, 0, IIOP_SCSI_READ}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x15 MODESELECT_CMD */ {IIOP_TIMEOUT, 0, IIOP_SCSI_WRITE}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x19 TP_ERASE */ {IIOP_MIN*60*3, 0, IIOP_SCSI_CMD}, /* 0x1A MODESENSE_CMD */ {IIOP_TIMEOUT, 0, IIOP_SCSI_READ}, /* 0x1B TP_LOAD */ {IIOP_MIN*30, 0, IIOP_SCSI_CMD}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x1E unused */ {IIOP_TIMEOUT, 0, IIOP_SCSI_CMD}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* unused */ {IIOP_TIMEOUT, 0, -1}, /* 0x25 READ_CAP_CMD */ {IIOP_TIMEOUT, 8, IIOP_SCSI_READ}, /* DEFAULT ENTRY */ {IIOP_TIMEOUT, 0, -1}, }; /* *************************************************************************** ** Configuration information *************************************************************************** */ int is_K2; /* (K2_ADDED) contains value returned */ /* by call to ims_is_K2() */ int iiop_cmds_len = (sizeof(iiop_cmds) / sizeof(IIOP_CMD)) -1; int iiop_tune_iorps_dpm = IIOP_PUT_EM_IN_DUAL_PORT; /* Put physical IORP d.s. in dual port if TRUE and dual port available. */ int iiop_tune_liorps_dpm = IIOP_PUT_EM_IN_DUAL_PORT; /* Put logical IORP d.s. in dual port if TRUE and dual port available. */ int iiop_tune_iorps = IIOP_MAX_IORPS; int iiop_tune_liorps = IIOP_MAX_LIORPS; int iiop_tune_iorps_k2 = IIOP_MAX_IORPS_K2; int iiop_tune_liorps_k2 = IIOP_MAX_LIORPS_K2; int Log_IIOP_Errors = 1; /* Enable IIOP SCSI error reports. */ int max_iiop_elogs = 10000; /* Number of error reports before being disabled. */ int iiop_1st_eisa_slot = IIOP_EISA_SLOT_9; int iiop_last_eisa_slot = IIOP_EISA_SLOT_13; int iiop_1st_eisa_irq = IIOP_EISA_VECT_9; int iiop_max_devices = sizeof(iiop_devices) / sizeof(IIOP_DEVICE); int iiop_dp_ram_incr = IIOP_DP_RAM_INCR; int iiop_intr_ipl = IIOP_INTR_PRI; /* Interrupt Priority Level. */ /* *************************************************************************** ** Individual SCSI disk manufacturer's mode select command to ** enable disk drive readahead and bad blocking algorithm. *************************************************************************** */ char iiop_cdc_ms_cmd[] = { /* Mode Select Parameter List */ 0, 0, 0, 0, /* Error Recovery Page*/ 0x1, 6, /* Error Recovery Parameters */ 0xc0, 0x1b, 0xb, 0, 0, 0xff, /* Cache Control Page */ 0x38, 14, /* Cache Control Parameters */ 0x11, 0xff, 0x34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; char iiop_fuji2_ms_cmd[] = { /* Mode Select Parameter List */ 0, 0, 0, 0, /* Error Recovery Page*/ 0x1, 10, /* Error Recovery Parameters */ 0xec, 0x12, 0xb, 0, 0, 0, 0x12, 0, 0, 0, /* Cache Control Page */ 0x8, 10, /* Cache Control Parameters */ 0x0, 0, 0xff, 0xff, 0, 0, 0x00, 0xff, 0x00, 0xff }; /* ** Table of SCSI disk manufacturer. */ IIOP_MS_TABLE iiop_ms_table[] = { {"CDC ", (ulong) 4, iiop_cdc_ms_cmd, (ulong) sizeof(iiop_cdc_ms_cmd)}, {"SEAGATE", (ulong) 7, iiop_cdc_ms_cmd, (ulong) sizeof(iiop_cdc_ms_cmd)}, {"IMPRIMIS", (ulong) 8, iiop_cdc_ms_cmd, (ulong) sizeof(iiop_cdc_ms_cmd)}, {"FUJITSU", (ulong) 7, iiop_fuji2_ms_cmd, (ulong) sizeof(iiop_fuji2_ms_cmd)}, }; int iiop_ms_tbl_entries = sizeof(iiop_ms_table) / sizeof(IIOP_MS_TABLE); /* *************************************************************************** ** STUBS for NON-RAID 1 *************************************************************************** */ #ifndef RAID_0 int iiop_release_revision = IIOP_EIOP_REV; int raid_get_geometry(scsi_req, cylinders, heads, sectors) REQ_IO *scsi_req; /* (i) SCSI request, ID and LUN. */ ushort *cylinders; /* (u) # cylinders in device. */ ushort *heads; /* (u) # heads in device. */ ushort *sectors; /* (u) # sectors in track of device. */ { if ( iiop_get_geometry(scsi_req, cylinders, heads, sectors) ) return (-1); iiop_init_drive(&iiop_devices[IIOP_HA_NUM(scsi_req->ha_num, is_K2)], scsi_req); return (0); } #else int iiop_release_revision = IIOP_EIOP_R1_REV; #endif ,r6fvM++`:6ʜnfwFZ+9vtR\۹2Lݛ{ cJBIA@A'G$"<'I>wQDk Ϲ[nKebG谷K$(Yta^VBvז9Bӳ^)Y\p8oWtZ+=**3UHNGJ8lȻf?s߻vqa\ A/ғozu=ٿ/ok>(|=^? ׏WB|ULS>@B7*ݾwଝV?|Iw! ;f|x\>18I[;YVw$O+hryEƾIrLʥ%y򗓛:^V\djJ^t2ť4֮ˏ,Zy//*a9J4V;//+6Z}*XfŇ2kN:֪Tx9.euz6tkgR漷/j]6ifJx sqpiբK^ykMUŲ',kTή:n24Gx~f!s#\[Cqo! Aݠv3埱bL9FGbr_G7m:vlQgqGO\ItIyM'$}&ؓzO\I ='{bOpI$L'I߉9OI$'$O I$:O.X☓$ěBO@Ihhn ?1cL&d^MC/}jEM苘u/(: 9(ٕU:.mv"!fdIh^ȉ Cf8)ʥZFj?*Ō$;c*;&бac6e^wlCWǪlCUxUx`{{rQ2Or0Ӄɻu0 d! Sx9h!.待  f4Їrٶkny^{[h +Ur\:X&@w{{]'5m㒝R.slA *T' ?p"]Pq(uQ =X#`/ȟA QQ # |dݺ&' $W7OjѢ&jN:E\U.okBsV'\^oNMqAMpMQ<~q6Beҫi_? ҂׆MB*7g>r3Jgw]쒯!qu%g.U1Lu}򛞂"]X^*8ά |m$l-#]igmL쳈++ Y&h?.xATA Dsj նVʐ/TFq_pR"BDɍMt^K0lϹd %r: .>(?sT A"E_i6Kj/0POWɄx(x""b`qi(oL-#񒑍ő@zW6ȓ2H$:IxD][up7uĉ=:.j{F,Uqy%k,^%N4daߎR@H~rz֑TeJ,YP5`#)eBPqE\$nVI?r! 5\%M˞(IBl -c8tne2% "AbF\dH{'Hˮ1I4гIlR6N AYϝSI5~Yq\n;V~7vAu*7U70GdnXܾ.8ga#5^ldH:=@Xt䪦AM4!0 oR+ ]UL2xĈhWxGyަ%+Enr)-xq$% ep\0ЬkYE^9f~J.lhFvw`ۛ< ]/h|e6. # !B:m(1we%P8 Z CP;mGb/a^Vc7nn%Zth%tZUM&Sj"Mx,`mw_qz]1)Մ /Y~ڭ],:fjǏ4,WzV5)$.S (-C %$ gY+ ,KZ;X)}$~:MQ %.&  rM&w!0c\¢j/'4֮{ I#sm2E)EGDlX(Fe[}4MdQDI*IPr)+RZ5c-G&N+2qz/[nD8y/Y#POn񓽺g"3m ,[|hYQ2$ bfKTK@4ɾ *T&Qn!,Z8iVซeVL89iRÿuunw]Zᙪi߅Nl=eSbS͇pkW'(ܐ`][ M-H ۔U+CX#<:DhKa񆌋l5ɯjt#:p]t//;%Ӎ,p'*|hǞ3k1J *Ѯϋ1pfBGl` &"0_,Wye,kM\[Otl`sC;!hn~$d2+NJ^8t2qp^;L(t붙[!M.qIP/^qvZ{uW}M6P)9rtI Ȅ#l=pE,p:- 0/&Y`rWDIG_IgI!F"-<݌ds^(#_I?ǚۢֆ?:YCT7<t[@MН;N,0r PI~#RZR$"u\e_ c)q]3eg҆5t̲wڄiEPZ>-g!a!r)bՅ&&6L2[glo?MO\K_ J!UZAښKskma*ld>IMAyjȕLcy4TTZ>ę(F. kAFa,PN>@AyVv{¡ّf*u6ȇT=*~P 5!ݲ\CdRq/=fbe /R ^`z+c|0xWx"f\> X<(_koZXD,)A/k)dIΎCq|1hHô˔h|j.nѳwɄ -uc\=(iu}/RF?I^3bҼ^DT9Ʈ'$glM|q51SkI#PC tXz)}og|0 khWo4ĩ7$974-VG .>0[W+QqV 7wل,Þ7qyqw0$T{wE ިaʤϕt:QJRor@:D@.H .act4dU' 7^&+B޳ 'PF>bkU!N]s;-ҕh7ĴZRZ)Z--Z+@FVB&u C &BD6|(ä΄b/z>U&p8nEKGa$P >n>k~H} FnAᾌ-C]%!쯶,R;`CFy\۴\rclcb4m^'[Ix;CA˓pvzd()CCƇ285f'$uƚ L[ ~'[.*e)iPĿԓx?o]nIx- S*`p+.h{DosWVJyN||a=o<1\=K;胡sn.w|~Zټ`[S/d^1#qtsHhyQ{1tJD KyBX 鳼0Ai Œ`(\ytWQz (S tGV7&C]$F5gz; z=6vcp*.8u[)'~W;_l{Qx%1^z8TMhqB%pS]暛sK(\Skg9 2c\[Qn4\ʓosc{ՠT@UL7ټ R$7|=Z!F 7~YVhK6 Kg~xykūp3xŸ1 ,zIe Жfj;ߟt*FJ;q5z 2epQnR<`Hl/ܥka)rZ:Shه2hҡ\HLKZ~۾JB\a:ꎯ b((7RM:mwxD!t=}RJ]h^NI68K"_-)0m2[m\m85-JȄbIm Bm%Xcvwو7-M3 4N46}s﯉*y,netZi/WM,5|dGȺEk " 0SXZmyI% , '( 1vk[ʹjdi<%o. ~½yjڼܶeROcQ&/!*q9t rtèo*`_JUx8p.")cputGFUq ;>y: crkCw̠<8FkukkpP.B[4Y4kٮeJEǯ4ZP0m 󆍷B֫iBu_o]~C71DgXf}şgZ50MuJ0Ư#q<"+ļ>;(ˈE)"SaKMa)'+4~$~p ȾtѰ _B!|ȓMEr6&C~2Ԟ۱j9L^XAQTZTO@vU³{dݺ2+X跬gP.vu{_Dޛwֶvo,?{("Ѝ\Cv09$j?j\{N lvݍ{m0-Id2'%z]>2Uod8 2XYnvpR"+wQb UUuuȗkZÍ /Yp .l}/lselRoX `#_BE27,E5YJ h?=sd[z1fjSz'}kjm;=KZpN[ݗXG# h|C ;[X[baT$MW{;k?v ŴM660z|l͐a=z-t];BՀef߻"`9dm`oaFZLϞ#pQ$&[5Ӳ3hnU+~Fr`kc.2х' qIVX@DB 0,,BmYĔ+(P >Ӿ7ѱ &v,Pť^{ 6K3 7m\cR*8 +3Clr> aLv/QxǾwVTvl>&'Ę,+ھ/@zh6pft:;CG HŻH}SIwf,alXTY7 ѱnюݒ &22FF p̹},CNZl29ˣ&rgp4`aSFcrݰ@!by8g ճcPͻzV܆6BΙL=H,qԵg#UCE$xj sJ2;bՌt8VC4LmױO,-eդڻâm!L]>7Mgͥ3e$mGV&fQI+0ZgnʩSv_|4A?7,`A)3=|@(L">(pHBh9ِPFCGh{L!?8>JC <YeYj<վ|RӰ5 OeU@op~#:ڹU؄9?d?2l Qw'9?@3p~9^\9^^$k䌣ZpvBVH.~sND3Y2ޫ&|:QtÓ5rfGQY6We O rygN5e evGkؘ}MB }deaU09s Ys.r}T-Yl'9 a5puT9?o+g9|efåL8:(l_͙)hQkȏX_,jh$9ル~fM+{e ?\rE3SGu~g[ƍ=˙n,r~\ا8?\Yݜp)p~˚#U02`Ohs`ٗG3O:?lO:}Āy2dY2&;N9p|&ӓ9?r~ɉ&'97O9?6=4lޜuS4l5G;wz?9͇٘_ݙw;]26c|v@fC4賆QlpuGۜ5ΘG:b~Ft.Gsa''Ι3Q84c2j>>kR8?닢 {'Go$ip||qGۜڜp~}a;8>gGo:|Ιz8:5vrr|g:lOTN `oHswƶ~?l"z xȏo6h qG:0=˜8=llOaښOtڗdG'Gxry('w>p{ܝS>e''jp~)5?|Q۪SJ8>)ݜ8?T lP!ڤ W ' ITxVBcH#T#$ E3??0G=#yC!NG0XLȶcȇH_S-W' $P@5 P lP_>ByY|C#<Ċ!& $ሏ-# Tp'd! ?b^AW@'ê+UFhb}t^ 5qq8!'OodCTo%CU x^VG_G\b<#mGeb9#PD\]BB%lC9Z d;@Ct#6ՈfzB#!+kw!sD~ثC UW#1Qݰvuν31\53 ߨL^c0zl?KC,cﺘR uZ b/m|ʴuZι>cP]U>E׬9'T1BAf51qGS{ Ͷ":ʯm2HͿ^d >r5}of] /_@듵(.mK܀R#UP˾(9k;1RA>r.ln!8.b j+ XVv5vwzi{A6q*_,T]/{r'jN-"^,Em*Qqr ha_num, is_K2)], scsi_req); return (0); } #else int iiop_release_revision = IIOP_EIOP_R1_REV; #endif iiop N 1 5 0 0 ac80 ac8b fe010000 fe010fff iiop N 2 5 0 0 0 0 0 0 iiop N 3 5 0 0 0 0 0 0 iiop N 4 5 0 0 0 0 0 0 iiop N 5 5 0 0 0 0 0 0 iiop N 6 5 0 0 0 0 0 0 iiop iiop c 0 root other 600 iiop iiop1 c 1 root other 600 iiop hiI hkiHc iiop 0 0 1 32 -1 !ٴ/-@T 4 %HI([ mp-RAɤA>bݗn;;iOAYR31(FeIՇOT>݉=[H&z~DRR%kL-һPI8kPBƻ55Çc箳E鴤h%L.gB86)"_H& |K̲M&*:'K6jax'jL$ B P?Jjb$I },ObvD=%u\Z`2Xm o3 50Aw1X,)wX 2 <ĒYlq )ITyNR..hl¸2RċёJ=V jXWAwnY` R\i0&m]e+dwWZ5JoAf-!+nYʨAkSY)a9,녛z_)G*GXm >Gk%5*6Դ3XUwoR+HR 䬱%{gJY3nĨ/a]`YE!K@  n`Ӣgػji0w);k=)AUlX֖G'@G'N8и2jJs,gsjN%xK<.7}dq§q]ny Cc+GK =7!!(?OcsOѸ2WS%O _RZLk!Ho똡&E&e_~rZuʬ1dj10c|na 8 )3Fzx==>nX5= ZI|+KK^շ- 'CIb-RW1M U_2m٨=ĩk>L Fja]7?X$ԟE M+hZ̤PYTvʑ5"ӵ*p &3T.'|AJ 9 O~ ͤR,64bg\2+3vj(EͶ&nѧj>Bl$Q.E1:_HEMiEim"\a 4-ItZ˥>+HE&cF\ZDLi(FOJEY$XFNrY7Jߋ?~96g³|6~l}-;ˏ36׵sLetw&lzK%c[eT4kNAFtITܳ-i%FX3Rå-gJ  :h<} Pn>7}Q\ᆭe(XD/Gü"MB,3^mo >$2Pvh46bMUۛnr&b\+K"a~a4?W@BL!dK'nVپ Lw*F#yÈ&ԘP i p$;9h<4Hpk#Iw;~0׊mfm#7 (Tb34 kY5bg75"RfE 90AH`cȴI;mt*Gfr@/!2࿏Qx<0N&E M݆w<8dQJw7~(,4,=emF&j$+Qi*bmaW_ KvR=-Q!տmxNXK.; >H4J7\NSɕJ$he/O<7/0#@0)kL''ĬΠ,1,N5h٫Ju Pyc(GZ.mEò ĩȦG, HLRU7Zl )$s|ǜĚ*yɚ5mz" [>fXÃW\6YKn9RYF!,PIDvޘ2 mv":]]-u,Wt Z ۄ:Ox0U; h[P=]c <X\va>Ƶq-"^S'QAgfUY#oOe SzoˏLq yD{5VKCҢ4Qhz;bE5t\"飆-*1IE \~r1;/8pP@C IAAl3PL+W-%xt1.KEKXF;;YqL 5E=@)1HV*2~C+8X,K 4&wGM6uoɧՀZ@Ә74^ PM~|r-,5= |oUO (P8h-@g(I!VC6A"n]7J7%`pdWxi-ܧ'L8G }`K `(.=AJ2%6[9^4U@#hI"~%9W7tMX7Ktl3Odb-rEr{Hczo@=eE#.4mh3bl{X#ϜH\\,l@2-N;|Zj8^t>*L72~C[@0N T3D7`~q#<}mMzɯP 2M} llu$?y#')% ?% ( |܈0qA|K h_t]ǛZuulX](΄$~1nzL1JzP=eR^R!%)9@ 8N>Bg[Bg5r#!A:il*4 @1'zBJyB`Ң:C\E!n?HBiHEvĩ X4Ԧ>E1fxK180i<4% jj<Rq,.@q|P$aZ .J%TTR(YV' 7,J`}d;Xץ"l;U K{wOX^HEOYG[qbg˴6g7K-Qxh PX{Lm$D 2#\dVf, S<̹1~\ b뀅Zqpܖ觳qjH) k@1tJrFrvc<0%&6{ !z;QA=R*l"~W$ݽs,yA\I%^Jr}E_ӔxCgl^BPb6&a~4:j'2cZ2@ce@ceZx6}m:$-5BXr`BZ(a‡3@'|OF @]^w!ō ! 5Ž OYJB Un8S=mQ j~WQ~mm,z ")GG)o(D{)+6 M%@sW)߸/fmQ)i\9&(G)2?R>uA5ZGx| `5PԡϘ?P@UÕk!Ǹ! ē(7o g3NMh|itfHɹK3s&Ī`+-V M[M0q~]Щ&'mu] 6ߓ2i?z;12EqɓΘvq,`^  G*)kX8Pk XG Lcd/,2헴eπ}/ЏRW ﻁf6>мl@ct[N JF=c8,YKe"d[<`q6tX,smaodH]\02,2:E-fXlߓ@y10IϜݒq { ?E} Rخy/(@t #]'8d uFۡ-q,$ &ÍΦ9"j$NrrZ%odVyY88pu$cؤNUDUwyh0SGF@z:l M߇W ʰ֜:#{8o6)Prhhhe2Xir5VɿEC"r;T]3 p m aWhrw $, ,4J.L'jqc<0JN2-V6 m!m8nCvGFz;G `O2a))V5ď'G8q lPBmv^T)?9mÔ>1\&@Vл U808?\Ԉ('"}Iu2qǟ8ARpK^Y.̜#񰱝 L4- /˹2`ﲠW&լl豓yRX[ ր=k2pO`=zRc*Cu[ϗݑ2{M-Kk%}We|0(cM߶'n=G (eC1T? !8$o:Ōu;[gtA/ OeL,X4g0>HDq}o^%Jhؙ=lӍ'0K@uO2kl'h ,%1\3n6q\ #w|KG{~< L诅<ub/rC!\yTu;羾Hs#U-Y;^^pSK P`qx \|0栧75}p0w׏6P)=&[`N^ֆK,idd°O{p#+>*X_vyVzKtUiN 72[p9,F>8wY,"&Am Y>h\p[e ,=2{Me߇-ݿS)RqXJ!J% d@eҫ^$P'P`Z20eX 79"[3f wˣWzXrҹs@OC#G)?{ߙr׆P1o]5ZަY. K%c>^n2ς]r .5?ji"&,tjJRPߧ,$ge^ l \J\%('HWJn}pJφbHkmC6QA?Zk'^˺Mn"kS<&|Agj1ZX9G ZIhrOTZzBd0VmC)H0=Br0E"Nnt;-y"W01N!@Y \XI8̓<_WXA7MJйEZ:X[޾o^]~¯@Eաv{;'xwF?f`9 00͠'rӺm+]WS\ۧwnl6KۼxǚYj{w\^VU ͜/{\b/S5zVvO7rV_ֹrE,~7mض2L]}VqqYm7I](^+`h꺥Mú/z-ː(u`9|KG&usV r[yglF꛷_^0K䥠coz9V~2aV8 1XYnuNվr /_/r{::FZ9RcVpV뀹 vafHx;%߬uPʊ” mb/CF4qtUnX&i3sXs[x dWW7-_φ 54zVTk;n\hgRGJh$il+s^8~{6웾wY_P % 5iW?z.`eNՓSh,Xuth>nr&\7nu5!W>ۻo8'X#'&II׼wP8n4T~G)imR^T2tן#<[ z 1*N49ySTauZy j߼^Gn}tza%\rK.¢*c{ONOLy2٪1nW`_rͻK*_Tу_Zy16iv_U\꯲z,_wLRiVͯ`qSaoE&M/Dirj&Z.KmHӁĸ|J.F[_/ rpŢFߥ^OeS AށNu.6/lhҀ_15hzޱ>PSˇ$$4((09 16 :|rx7RQ 'O(7ptdݞfH7 3D =Y )2AIrjLRdbz>xF=RXGQwj`~ңXTeIf11jppw1fn>Y*KN0+ c =i(Ob4hL64W1Br}*=W잏Yj:ѫ=(HD(͒z?|Y[xY^M3tŽQ[1><}LywBsykcŒ(B}Ѽ =q(>܁RGVr&؞8"g 4c cZj?mizD Ƙ4xaGB3G=@~V\crnD񧣒=ͮ?Vpz|ͭ8ߺh35#e\ -Z^a➎y~ip~G7q̜C՜0ddq78~78op|Ӄ̘32`ys͜8=9vqcN̛}dx;wԟL>dvu>TOigߞT*xMq捐hYьhF1sF1G1c=نͬlXB͙o przgKeL-5O9ӳPNVjptɘqQ=QZz5vnz0NaG>? ?p{̇8>)[)˘n^\*˘n\eepr\rvӍF}#Ѻ==Y5[+>d.-%ހۜ #a1>B`kf  :;0k[Lsv`m0rg(Ehjvg(lp}';u9V_Fb|ʜTps3!{=2ߴ9nq37ţ6")씰NCF{OGz#p!@{ס@!+F}ژGkqF|0#tw`klB=Fv@ʦ#0??HDnVDLhqpl@7BtD8ypklǑ\Y !ը؀܌D;N S98*0a1b Z  ̇)疹h5ϭe{czraC zk0d>} J%> 12; if (ims_debug_msg) cmn_err(CE_CONT, "ims_init_wccb: slot from tfpmap = %x.\n",slot); /* ** Set up physical address of I'm alive counter for this processor ** in the WCCB (Watchdog counter control block */ wd_ia = (WCNTB *) (ims->wd_ia + (slot - IMS_BASESLOTNUM)); if (ims_debug_msg) cmn_err(CE_CONT, "ims_init_wccb: virt addr of wd_ia = %x.\n",wd_ia); wd_ia->wccb_max_ud = ims_cpu_dead_timeout; ims->virt_wccb->cntptrs[slot - IMS_BASESLOTNUM] = VIRTTOPHYS(ims->hdr, ims->dp_ram, wd_ia); } } if (ims_debug_msg) cmn_err(CE_CONT, "ims_init_wccb: Exitting ims_init_wccb.\n"); } #else /* *************************************************************************** ** ** FUNCTION NAME: ims_init_wccb (UNIPROCESSOR VERSION) ** ** PURPOSE: To initialize the watchdog counter control block (WCCB) ** with the physical addresses of the "I'm alive" counter ** for this CPU. ** ** METHOD: ** ** o Read the slot value that this processor is running in. ** o Set up the physical address ** of the "I'm alive" counter associated with this processor ** in the WCCB (Watchdog counter control block). The WCCB ** is indexed by (slot-IMS_BASESLOTNUM).A ** o Also initialize the GROSS timeout that the IMS is to use ** when determining if the CPU is dead or not. ** ** EXIT STATUS: ** ** o NONE. ** ** DEPENDENCIES: ** ** o Cannot be TRICORD MPX software. ** ** REVISION HISTORY: ** FPR/CRN Date Author Description ** 08/01/92 K. Conner Initial release. ** *************************************************************************** */ void ims_init_wccb(ims) IMS_DEVICE *ims; /* (i) Pointer to device control */ { int slot; WCNTB *wd_ia; /* ** Find out what slot its in */ slot = inb(CCS_SLOT); slot = slot >> 4; /* Slot is in upper nibble of lower eight bits. */ if (ims_debug_msg) cmn_err(CE_CONT, "ims_init_wccb: UNI processor system, slot = %d\n",slot); /* ** Set up physical address of I'm alive counter for this processor ** in the WCCB (Watchdog counter control block */ wd_ia = (WCNTB *) (ims->wd_ia + (slot - IMS_BASESLOTNUM)); wd_ia->wccb_max_ud = ims_cpu_dead_timeout; ims->virt_wccb->cntptrs[slot - IMS_BASESLOTNUM] = VIRTTOPHYS(ims->hdr, ims->dp_ram, wd_ia); } #endif /*Multiprocessor*/ /* *************************************************************************** ** ** FUNCTION NAME: ims_check_for_debugger ** ** PURPOSE: To monitor characters incoming from the remote console ** looking for the string "scodb^x" and enter the ** kernel debugger. ** ** METHOD: ** ** o Always look for the indicated string. ** o If found call debugger. ** ** EXIT STATUS: ** ** o None ** ** DEPENDENCIES: ** ** K2 and IMS. ** ** REVISION HISTORY: ** FPR/CRN Date Author Description ** 10/01/92 K. Conner Initial release. ** *************************************************************************** */ void ims_check_for_debugger(inp_char) unchar inp_char; /* (i) Character received from remote console. */ { #ifdef SCODB_0 extern FNCT_PTR cdebugger; static int index = 0; /* Current index into Saved string. */ static unchar debug_string[6]; /* Saved debug string. "scodb(Ctrl x)" cause remote console to enter kernel debugger. */ if (index == 0) { if (inp_char == 's') { debug_string[index] = 's'; index++; } else index = 0; /* Reset index. */ } else if (index == 1) { if (inp_char == 'c') { debug_string[index] = 'c'; index++; } else index = 0; /* Reset index. */ } else if (index == 2) { if (inp_char == 'o') { debug_string[index] = 'o'; index++; } else index = 0; /* Reset index. */ } else if (index == 3) { if (inp_char == 'd') { debug_string[index] = 'd'; index++; } else index = 0; /* Reset index. */ } else if (index == 4) { if (inp_char == 'b') { debug_string[index] = 'b'; index++; } else index = 0; /* Reset index. */ } else if (index == 5) { if (inp_char == 0x18) /* Control x */ { debug_string[index] = 0x18; (void) cdebugger(0,0); index = 0; } else index = 0; /* Reset index. */ } #endif } : # Don't run the daemon if the iiop driver did not printcfg # /bin/cat /dev/string/cfg | /bin/grep iiop if [ $? -eq 0 ] then # See if the ims daemon is already running # If he is, do not start another /bin/ps -e | /usr/bin/fgrep imsd > /dev/null 2>&1 if [ ! $? -eq 0 ] then /usr/bin/imsd /dev/ims fi fi ims N 1 0 0 0 0 0 fdf00000 fdf00fff ims rhiI iHc ims 0 0 1 1 -1 ims ims c 0 root other 600 #ѥ$}r]d%I@P@ larAHK% a%$nFHku7Q\sAH9 ( (?FQ %߽Us+q7wjڮ.N6*v3IdI)$\Z I/M$$o۠CT޹=Z$9Dbzhtd^Ҭf>/I.w\b}(zI/ vR?'sXgEC$ G[B+ !}L0>5wSm@ <[|CTp`^_iJ𭹟cbp-흻ˮ(7qcl >C4}YX#*HW7V Pm!j򉊍 %enI'Q+ >ׇ]W١Wu61:AX"ٹPm&`R3`(VVL_|ÐVXSE:Pn`P+R840@ӫ=:Zg5:4^0+ϕ #jscu.۫Saq Ɖ% 55ۻ`5|XBk6A}Y`1~n6׸vﺖ\wJv&%cG8fI#[b6& dFՇ [N~ c!.i`8zOR@m Ex|5 ?n8{w6TMaI\*ɾvr*֖v3sdTm`LXYVVtMnsm`$mĢRH&=dSZ5ƅ'iw&0ːXFěl l[F}V`X=;L.G$PR7dZOQ'Gk^&e8ŊE"YB ;L,Lh)],)B_cc[UJ&f6mQw7"V _3V@UgF?/b0Ygv7U5*_=hӣYlAY`Cگ-W-WzHwc |gøV̋Q9wTJG ڸ kѽ`Wg{#cw"6kg 5>F̷ܰdNA%uQx;|mIࡍRfD.LH^7&c'}_g+Y%+;+_ p1˅] R8. kcԈ7wXE'QZ0uSY,L3׃nMd-m~fhtRI?mų=^4 Ѕωl=T ʤjk!BމP`ʷbJ.A9C -$"ۘmbOoAV_Ԧ822._0V81:1l슍t .e2nx1hMGK5+= 7WxԷ&a<:/~)I*i.ȿ؊m> 4+l/hu97,~enAEة8_ged@#%_@JѷܣWr`Ր-| N{P,h׷Vo4N/Uhh^vO/ӫ3ݯ1E؍V0;o퓨~uu7i;u7 Qw7l6nb{;w7K!"A_k6ٻ҅w`A:NbtN؜mRڸru`V0o>ɡicuRs/)ՎmL6e/{,A42j@gX2h| gen+&ƃAD1c6E{ASx[e5S\LW'찬Y̽=o-PVӆQJYoM- QAY`սpTmRUR)J dmŚY P1"yU6:teu֍w8ӫscQ0nlƻFaA}r*2|nY_rs~(ZB~PfլVY_p KZ w~k>cR#/vyfXawjLX8v!$ JzP7X72.e~@HxYB6Q-ǹ Wb,:ﻥ'xz%{K*ޙX,'B;6fKKYNZ ?˪ ճn 5I{?M83uW{ft`2+/羲Qi·jO;Yگ/܌󖥹wD'QwQ3 84H"=8 -mE!O 3/aZ!̌/dxe1dfrca ,aqtY` 3JMZh 5![2[&컂a@.;\/iE.k/iisvbnҏ+3ŷzIAn?YCec]Y‹NM)cxU*h?_ˁ=q /)5 ۂ+ԝX+n"[M\}BM404s]GBgZQv8v̿.bhF|2]q+T]vՠ4R٤J=5 |sl.qm{3p ʘ^EK eL-1֬-EZ, C0N`[ /īuhL-F{{~!^G>-Y{%yߤ|bHx|[=f$kP⛣Wq\L?R톹n+˶*eLQ͆OEx5<ԢZu1hmybl|(2d狳>U^-bK33݂XnPbn*33AWsK(~`0Umּ\+ZDa3[w°KLv3c. 馍w ;KL0w[ gg^٦W ਦ%x%0ics[$wWJ%@P^ȕCѸ#$U>TŮL!4 ڟ,—R@YK [}\Gz㹩@i7Ҹ" ~A00!R٬t]Z%ܮ;ra&aיsy.F[6xꁕ<V4 ra\Q זF nљtl\W`7Wi- 35WW0j)NpyMfe}#:Q"5";Fv¹e]m{+.*2^J Q}KVvn=a'BtҐ4:CEيa$_o |"/ČM]ğW+?qw|DMqu0.>,`.u4R O XTXl8d~߳7< 9T,TJ6┲s3}\0FWI!yw}]ZwK5\~^B.}zِ}-5pـĄp`;8a귍 Y߃˒e՟ fnlQo7Yҏ΅3,0t6fZѸW> Fz kl5HB# I }􁩷Fָ8ج͟LZe.:PRz3r4 9F6)z u6>_4)gI cq벇^Eo4=E Q4%ׄ>mtq:wTaH--`t$ ev10%q5l@_S=ϯ߇#n qϫte?*=Nyk (rBz\ F(O6IiO>tY{K]C/HX J&b6M0c)YXETG+ VT)GjXiy2ɣudrwG˗ Q){݁d:geQJ qˌy@9xGǛ1;3U{+n7`@o #:fWKIX_iL -f/~ ^IIʘA۩hЮWkpz+K5zv iqhcF>J(84rb_Зt[p D)5߽g+i8`Km^[eVʦ !I%xN>Vx4+I&hB0Ev?n@ G:4VzH\HECLwYf楟1.7ǬԕXi0߅U.=ƋsAPSti%P Inyݚ ɋQ̉}9d/.gX>76vH62!hlƖmzJ]M^T`AilUrUewMXEZR0[`MF-tVҜ!ey\jFX{##Ix*z$6|ņRfmxfa}AJB(S 8oRVbTehăVFQPVVC, 1^iǹDʝPt6PvO} `XyO s»c H#O@'p"|{lxihӨ?R\7Cb|xc^4 CR ŋ]1}6 3NmxVܝ54,jNIߴ3Avۋԕ(|;ڈ; 'UzDdGhx}Im0xş7a)ٕ(cKS#A[XƊ6 ,~__pIc[ɦSnMS|!AJIh \\L XϤԝ ӷUɕT(Lv\’#@t>9TU `hҫm5nU9NȖǼ/<1m 6׀=85b`|فmbE+_VQKq+7Gζ &CN= %į%ƏaqH «?BQ 4\f8=6\[TIo06wGg`>)uJ݁D0X S|4 6!ШXwu%Wt;m~Fxmߗqs0PI]5X+*h ˋZБr' v\PpoeHo3AKi'A$3tې\.{@Mx蟓03^kXHPa-q y x)`#R<1,|?lC;Ub)c%}M'rl[+ji&9Cߦ@K Ua`6E7ؤ8vG4&"ҋ|Ƚċљ{Qm8e8ZQXdyF9Q'=,}-_8*2LIB9BgCӄ Sh۳r񞃧muGvFD_hm ςY8uGrBfVN f% {M7G~c}$iEf胂_Qf4C|cW!cg~0!l FRfF:]`(*!Qfݴ&w*6ƃd$dȱ1ߊ6o4.~Zm9K5gaa"juLMd7zR1AE7H=B-Y>_%Ə6 IDjGO"r\𡖞rʢ*Ŋh=n mAJyF c\Zu XFQ~g/ E% (ʍYuc5`֧AFҼho6$ۉbU4Z4B#n rmc!"Fo[tDSiČ6H Cr#^cQl9Z!R@.K+R= Ԏ+>w#p T{Rd Ї[s˄:x{\! H=A/Ƨ1el,hZgeb@j&#Z'%1{aX ůaa0M90~k$`JD۩وainV H x2/峈A +IߨL;16voG}Quǯƣ\..Zk$81~ݠ#2?S;HXڶojx-=~lP$ ՔR%nU˴>6 g3WA}r Fpj{L }9KHB `x q' 3)!|tǓcG-h+JYCKshR򉾐kO'*#V,jt鼯x[zJi4Ym/cEUTSvz4iC$"(dhWėܜ2PUO\f"t2Ws6+ \vxe #6aIvxʮ!?˱ѭ뱥N=tWΟ^˰5/]~qv_o /O]"ZA͘:.J+_Ю,7.+.#vfu?\a9-$uAp_IՅw_IWK]L=%+]L“sYz&+3/ ,ve:ZzwyMvSPu.PZZ4^'\-zN7TD&Mrtյ:UsH'RS 7MO'yVrq[|'ʚj:w V zEsni(g> T3iԃAn*uURqDFYIKLUA*B< z949,Cϝ U^Memstg&1^4w\s4Req_RxZ{O)"=k aYQi4Am=C@h/Fwm} `Cl/.+gs# z:mb}%ykF5`: ۻsL֒*.^M^wIc46oBl Pt͂+ʼ :dvty]|хܰ'3 ΆU9f#/G 3[W]Tp4^nf*7a]Yp…_H P*ɲ&<$2u֌5Y1xMr.u/ mncmnԍ" kiڼ"ԛ`u4BN94(I?V ΅lKrs8M 8f 0su# VN΃XwTOp45ϬZ է?7Qxq`ag  =|c=^<duϜrPI;>ޒsG>`pNyTr[L4uAJjں>alDσ һg2̮#{=Ca=Cpv=|a=T=oԃz=ɇ{8uX %æ?nSRKo?ZWWۀ֨&0־ԏ꧵ )@s?rkECL*H)֧Y K5a5ؤ=K&`ZIuj ǚ2K%"c!*h޶tmC֛(N6-ڰf@iJX?D7)#ɵ/>,M6"!ŰW[N#2RU.S]Tn+j i_h_ÞzIΙ:WCe-CކV*a,6B!kSpc"7 .h)z/V3bmu34t;ԭƸ4@?ZM0B;=?ӭp<$OMi-֧ qFytKh(p4gDʂOSR6ՠr\Fi@L3_Lrr =%:pzו%}M:jP5$YDRaǣ1FuRk$1-kMdSa_0LXoNqθp&[_,5f:v ɗ'F /̧%ֵs38h>ep,>ԹvY \#G'bze&srZ p\ ~4Ij $sN~:_MÚr?c8Kȿߨv;ʪPaǁ:O//.KCmnopq2k×9Dsؑh5y,qw8AzTĆ(j}Q %tl,է=+LK߉|̏,*J |ǣTr8ƥ}hs=<8$+8< ߖ=н)O8.cwA)33ߢ =H{MrI؉D% 4H(G 4G%GA߸j p%&TqP"9QQ!C'ED8*3H'"8QՕc^"|1OA1!GP7@ |D!w(Ve}$G =i {7!{? ]B30sԢ~(F?jAFF YGy%\F2`sG!kΣ/: .ʏdA?z}۠Að8ޅL6uhP7R(څG /Mh|Q|kq3DEA/ۈ>bN7$uq''=wu|I}IóB'B?>V NOQ7񢏊@=diQE Cąq,[slkʎ= x؃ 84 }DQHr|R(c54QhEփuGcOq1g={3OA=3Of{ A?@=ݳ= A?P {C!Phr|(E" [RR}sCߟv  6dĨG*;v_sZG<4cbRJğO񘓓OBs(:.GEtQOt_ Ģb*ğG=$Qr$QeqG' 0n2  PQؕ`Q5 ?f;B> Ao1Gw>~Gl\qи|q;{=yt/A݂(Gڠ"A?x(POn΁Z(h'6}ߠ2n4ABjE!vB oj"(܅g(G@8qqA<}8{xf;ҠDQ"Zqf/@??ҁ(B? ?iPc~{k磉Eb(1;"QGǟ=_ohq{!y|LyBǟZch*BHL2;t'QGE|dN8QȢDޑE( "Og J6,! Jq>-hJfM[iBo9jP@l; {޷޶۫"ř#7Ld ƒcA`16ƒX%Q@Xfoww߽{cvI$8~3ism @~wJ| a9 +{04p!41Cy01dcæ!zq~wL;}QGB@N~V}IIjjGv"'.;E IԟCgTz?<>6w T~*uQtg>ǫzS?F ά`? ?=maJa}z`؀A^>w!>pNt~\ΞbA?Ϝ6Aܿt$z!::㇯JA=z➼&MO `'|' >XO͕OvGN'v;`' p'a=OpA?'a?Ξb=Հ;XG=>{Bm$ Б?($qD=`=Ոv'@w>b|?Bx?d}Yo9]vIJ=w>cfzBٞ<3վwN-h{]h~!-yt&MpO$~#Qjtݩ!9A7-OQû;PBWP;kat'`Ml{ݨwAډȑ>1g@t@ =[߇mn}g.Aw8`<X(pv;` HV=z(JKC $k+=( h?0ʂLFYDc(C27P"np`&̎RyFyHm<}t(ѕ$lQ$wQ#Xh}Y#/ 2 $HHbG4م"a >#`Κx$}G$#щEŜHӒ:/&G$p**QmD k7K:44Ό*O&e7Vª:6.|ךP久)vHLc%'R/<ԭK.Xqy!B"y`hG~(<D!yq#6!ďۄp "(_tW0"$qf"=Hjl~i#Z3H"GHD\:(n}BF¾=)ym:k(Qt{hQ UDž HI85׷=>_hc,CBiףL}:s#N]]:zӔF56F݌ 9FFF?dhLTj,{:E5{@ܡ7Ԡ#?$d;`IhMvQUbr&F+% .4RFHw%ȿuHQ;3_Y쉰hh׮̧6ͯZvSj)CQg׻إWQ{YEWKq]Uu Φx4Y_$d&Ws]v"W>OG=,U{e9 W3ՆydmH:7I1%h6%V-1*-3oSNF?8<)7XER.w..Space.cTdsk.hMasterSystemDriver.o#ident "@(#) space.c 26.1 95/06/26 " /* * Copyright (C) The Santa Cruz Operation, 1994-1995. * This Module contains Proprietary Information of * The Santa Cruz Operation and should be treated as Confidential. */ /* ** ident @(#) space.c.dsk 1.12 1 1/2/95 12:51:36 ** ** sccs_id[] = {"@(#) 1.12 space.c.dsk "} */ /* *************************************************************************** ** ** MODULE NAME: space.c.dsk ** ** PURPOSE: Dsk space.c file, tunable parameters. ** ** DEPENDENCIES: ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990, 1991, 1992 ** All rights reserved. ** ** *************************************************************************** */ /* *************************************************************************** ** System Include Files *************************************************************************** */ #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/immu.h" #include "sys/systm.h" #include "sys/buf.h" #include "sys/iobuf.h" #include "sys/dir.h" #include "sys/user.h" #include "sys/dio.h" #include "sys/disk.h" #include "sys/errno.h" #include "sys/conf.h" #include "sys/cmn_err.h" #include "sys/devreg.h" #include "sys/scsi.h" /* *************************************************************************** ** Module Related Include Files *************************************************************************** */ #include "Tdsk.h" /* Scatter/gather d.s. definition. */ /* *************************************************************************** ** Defines *************************************************************************** */ /* ** The following define may be changed by the postinstall script ** to WAKEUPN_STUB_YES or WAKEUPN_STUB_NO. On systems that are pre MSV4.2 you ** will get a undefined symbol, wakeupn, from the Tdsk driver. This define ** controls whether the stub routine (in this space.c) will be ** included */ #define WAKEUPN #define DSK_MAX_DRIVERS 1 /* 7 drivers * 4 drives = 28 drives. */ #define IIOP_REQIO_THRESHOLD 1000 /* Put out warning message if we run out of free REQ_IO's this many times*/ #define IIOP_SG_THRESHOLD 1000 /* Put out warning message if we run out of free Scatter-Gather buffers this many times */ /* ** W A R N I N G ! ! ! The following define cannot be greater than ** the define by the same name in /etc/conf/pack.d/Sdsk/space.c ** This is here to support mpsar -d */ #define NSDSK_STATS 28 /* Size of Sdskstats in entries */ /* ** W A R N I N G ! ! ! The following define must match ** IIOP_MAX_IORPS_K2 in space.c.iiop. */ #define IIOP_MAX_REQIO_K2 512 /* Size of time_t array for Sar */ /* *************************************************************************** ** Global Static Storage *************************************************************************** */ int iiop_hit_max_reqio = 0; /* Counter for REQ_IO buffer unavailable */ int iiop_hit_max_sg = 0; /* Counter for Scatter-Gather buffer unavailable */ int iiop_max_reqio_threshold = IIOP_REQIO_THRESHOLD; int iiop_max_sg_threshold = IIOP_SG_THRESHOLD; DSK_TABLE Dsk_driver[DSK_MAX_DRIVERS];/* Always 1 since 3.2.4 */ int Dsk_do_block_sg = 1; /* File system scatter/gather is enabled now for Everest. */ int Dsk_log_removals = 1; /* Log drives removed after installed */ int Dsk_wakeupn = 1; /* If 1 then Dsk driver will call wakeupn rather than wakeup when waking up processes after running out of resources. This should be more efficient that wakeup., kec mwc. */ /* ** Stub code for pre-MSV4.2 systems. wakeupn doenot exist in these kernels */ #ifdef WAKEUPN_STUB_YES int wakeupn(address, number) char *address; int number; { return(wakeup(address)); } #endif /* ** Number of disk devices we are supporting for mpsar -d */ int Dsk_nsdsk_stats = NSDSK_STATS; /* ** Starting time array for Sar statistics */ time_t Dsk_io_start[IIOP_MAX_REQIO_K2]; #ifdef __STDC__ #pragma comment(exestr, "@(#) Tdsk.h 26.1 95/06/26 ") #else #ident "@(#) Tdsk.h 26.1 95/06/26 " #endif /* ** ident @(#) Tdsk.h 1.10 1 5/24/95 11:28:14 ** ** sccs_id[] = {"@(#) 1.10 Tdsk.h "} */ /* *************************************************************************** ** ** INCLUDE FILE NAME: Tdsk.h ** ** PURPOSE: Upper level disk driver data structure definitions. ** ** DEPENDENCIES: ** ** o None. ** ** ** COPYRIGHT: ** ** (c) Tricord systems, Inc. 1990, 1991, 1992 ** All rights reserved. ** ** *************************************************************************** */ /* *************************************************************************** ** Defines *************************************************************************** */ #define MAX_SG_DESCRIPTORS 33 /* Nbr 4K pages to comprise 128K xfer. */ #define DSK_MAX_SCSI_ID 15 /* Maximum SCSI id value. */ #define SCSI_BOOT_IDENTIFY 99 /* Dsk specific init command for REQ_IO structure. */ #define MAX_DISKS 360 /* 6 ISSs by 4 busses by 15 drives */ #define B_DSK_SG 0x80000000 /* Tricord scatter/gather. */ /* ***************************************************************************** Macros ****************************************************************************/ #define DSK_NDISKS ((DPHYS(0xff))+1) /* Max. nbr. of disks. */ /* *************************************************************************** ** Typedefs *************************************************************************** */ /* ** The scatter/gather definition. This structure is filled by ** the driver making the I/O request. */ typedef struct { paddr_t p_addr; /* Physical buffer address. */ long size; /* Byte count. */ } SG_PAIRS; typedef struct sg_descr { u_short count; /* Number of SG_PAIRS. */ SG_PAIRS ptrs[MAX_SG_DESCRIPTORS];/* Max. grouping of SG_PAIRS. */ struct sg_descr *next; /* Link list of descriptors. */ struct buf *av_forw; /* Saved bp->av_forw ptr. */ u_long b_bcount; /* Saved bp->b_bcount. */ u_long b_blkno; /* Saved bp->b_blkno. */ } SG_DESCRIPTOR; typedef struct disks { DEVCFG *config_tbl; /* Ptr to device config. tbl. */ dip_t disk_para; /* Diskinfo d.s. */ struct dkcntlrtab ctrl_info;/* Info from host adapter cfg table. */ union { struct { /* ** WARNING: ** The order of the following must be the same as ** the data stored in the character array by the ** adapter driver when computing the geometry. */ u_short cylinders; /* Simulated number of cylinders. */ u_short heads; /* Simulated number of heads. */ u_short sectors; /* Simulated number of sectors. */ } st506; u_char bytes[sizeof(u_short)*3]; } geometry; /* Simulated ST506 disk drive. */ } DSKDISKS; typedef struct { REQ_IO *free_buf; /* Head of free list. */ SG_DESCRIPTOR *free_descr; /* Head of the scatter/gather free list. */ u_int buffers; /* The number of REQ_IO d.s. */ u_int sg_buffers; /* The number of scatter/gather buffers. */ u_int used; /* Active buffers. */ u_int used_sg; /* Active scatter/gather buffers. */ u_short want_buffer; /* Waiting on disk drive buffer. */ u_short want_sg; /* Waiting on scatter/gather buffer. */ DSKDISKS drives[MAX_DISKS];/* Array of disk units. */ DEVCFG *cfg_tbl; /* Pointer to head of DskXcfg[]. */ dev_t dev_major; /* Major device number. */ caddr_t *reqio_start; /* Starting virtual address of REQ_IO pool*/ } DSK_TABLE; Dsk Iocrwi iHobCcpZk Dsk 0 0 1 2 -1 Dsk N 1 5 0 0 0 0 0 0 ͤ{e_Kad% 9 Dni$(KaeB!%Y=T3Wg/{ۙۛv×h aCmQU@*OyRs{w9{ݛm%+CV3 A\ܲ;ʠ%hiΤhQ*:@!g]I̅1]% 0\?i!T/ed#MU!RUڱt_yR#kȕ;ᢞj~ۅ>%W N_q[%ؽVW{c_-e,AuxRH/FCJ8 \?4 ]H$6hV.\F elONp' iQУFp%MMRU=iluakJ.(B?0OZ* U[R= )Q;QjK-nxf \ހrTF1M%Rz.bF6sJ.!dZظΖhN[>m3Plk<V9ur9(]p 3pϩkɽ[& ݮnH2}bymM.\@b.P+'|D3R'E%Jm([)db6S ysD,ņii9Df.4k};p 6n8K- zDp7C {z3}CBRŻM``â}*_+:4 =p+Gtt>=nnt|tz֌wGoC;ğ.k4r8aE;Njwn{.&8A5wST)Pn('s k@&= ![s窬R'֥0]k])ϐ/w b8>:nCȓt"dɈyyQͩ*EfkS5%]⒒\Tob]_[]Cjz;Zj0 lw>yw d= ;Tm#&ߤ?0&j~#ā kǷυǏm}JzZVAu j[)3#Ÿ*$pRSut[X4YSI.M) RZG`hЅaN5W¶"JDFVn.A3}0Biu(p{vJ;ؔI.|Չu:}  \9"c.8c1d[QmKKeӷz*_qHt<` ݎ/bvP? DlTw#PTCaJ Q TEl~&VZS15]jN&ȚKj |k(݅f6`dי3tSCB@:\j[FxU)™0F'iT#W GEqn=1YK!9Cx`QeqY ǎ 8AM̭hCZkvݻL[n) und-v.$.xDt:ÓzxWqއfwq$ݛTF|D S%Axn]uY;Pq[#k7M*{Fv.Tig/'!  9,5~%gYdKߡ*ao(@k|zتM q@]O]+ZXe#)~ۆ>;e:\E>7_kUn[7S@;cxGWS < ?!&s~b`tRZ=$]C}xx*Y9W VW|tA=DyzuaUQ-Dކǩ{yM8 6OSҭ]q"6Z~f'Nv 4a>AEآMI~t(eԬj $J֎ܱ9E3.w5(:61j~MM`':5܉xr(`NTZq@p12 D5 0&9} smrLN3K <$Jk 4%Q^ҳX_nÃeY1υ^Xjh>pÞ2K8Ea`N|q* ˃~%I`::-ԗ'^yY\5-%l~0!n\x=_K7G~G2B mSK0A? IK.A>=K,A}"X)U.kPf #.D@フ!mү)6ӔD igD_|x`Ke1 S"校pG*&{*B\3ԥ#j)z0l}q@EN#mt<t\z`gc-+aUXN-ttm-'>뷡:5}/&=5$M91/R$ O<@X 25ʽ.@ \tԙ.ux+%{'Wz!1&Rweޏ>0wܓcTf) ux;TgF;tDѩ ^)o->.WWBqo_q!\$Yu1ߣr=h,k*0b1n0C7 W$$r\`86^ h6_Ĩ早%$y_G_A}aL!ю. :q_%BC"xL EHUxM_Ǔˆg&B7T\1*.Mӗ' ]z|/\OS} W֧='盩3-D\l /s7ATWsXNxчL[PPG{.ʈ)_??Z^HBa@; &`~x$cr4HcRsI(dGs߸<zQ_z֠,w(-?`B|WDOço4XwIvp9AcqzeDlM.,˓UXqCr:L)ǯl$<s@4?ue.BI,-5,CE>t2(// O ;Ρס{a[yg[ '?9~zvf@H$OȒE=PAQWӁI2,d˷6:jb)ó*'oX2y ,Y"`V؃M"JscO!6O7):|*=hC}_W""݈LxC ۳ sڲ{Yq@&+O 73ePΣSUeWѸ>NYxAsbhKſKA/+aULktړך/h #/ TCM3ZzO&UY ' v=ǯ$K\0 $2w`J̛iCg@pFO}>+p~R}  vOOB! 7 ͓O;Z-_hxe>"6x,zV~wAj[֗A&z?H!~B0|"%s'hub| @B`IؾF@x;NiNeQ#jQUG*4Pɜ@t'8;8;+w;iV`hZp{5fbӀ=٫3!}fxhBs&` =@؀ )Et~w9?h$'0h@𪵆: 1 t+ XgB8Q׬6vvbb冏rs&b̙9<ɛ,M՜q8?xJdЬ&Z"kP&H)_wg;ꝳ읟P>&z[]2Y2[1N@Z:B h/8>@ػ9>@ЬќkMSFĞhuFg؜FwF^h0wo:hy4ivFh.g>l` BjC)s~wM>ٵ;ۭ4*i-2=#'3~{ӱ}z'bM &{Ԁ=9?Ñ3xp}PNCs!P]& M|p~ ?ߜ38iG8iEƌ.2pKfNN*-f_t{t9W^f/XZԗg; :g^f~y^fv|3yg'p:o9?pT^}odyPJ6czHXy(Q~t~t}MgM7c'˝4NOΚoݝ䌣Vp{> 'O/|Iߜ2FO\_8ݕr|ryIo>e)R]ϛVd 6LnL82f9>~L>]12v^LLO:?rG16l( v98.yv9=9?0ӓPG?P}sP\u_;( ayQuP89G3Bupig:=:?ztr'g q ʛ-S9Se]SbN*f-mN'llߝ;fnU&bO4rkCJZ) UyA,$YH"=8rPICG,MsqH9GQHCz,yF;6)!M7% {ͶW'$/D|vG,>2>D$uRx [OC+! j B$ *GxN*x~.Ƿ!I"nr]cGG{W9CC䜈! +-%!óWTwz v?e)s`9e^R(_ꥱJ"δ<؄vsiUc],w_}(xۻJ7XIƮ YlYMvIՆ*) {X#”FRH1E̴?)\f905*XzXĞT,j>J L-@:)f(g) K@Ucȵ2qu[,r=6zb/c**G##U#뼆 =DއC^@r}68ޏb (!\ez6~I(/롤rRY7^"k'2Tdzѫ[֍ZRxu]I. 4'կ[diZ !b 'QyGIH`9) $EaFH) _$-(zIkRST"cP߄nos+(vom9"܎H[Tql i="la msP%B$V0ȲX)zAݑiݕX&9}/%"Hm.BRr/Í .w..Space.cStubs.cpicdummy.cMasterSystemDriver.o#ident "@(#) space.c 26.1 95/06/26 " /* * Copyright (C) 1988-1995 The Santa Cruz Operation, Inc. * All Rights Reserved. * The information in this file is provided for the exclusive use of * the licensees of The Santa Cruz Operation, Inc. Such users have the * right to use, modify, and incorporate this code into other products * for purposes authorized by the license agreement provided they include * this notice and the associated copyright notice with any such product. * The information in this file is provided "AS IS" without warranty. */ /* Copyright (c) 1984, 1986, 1987, 1988 AT&T */ /* All Rights Reserved */ /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */ #include "sys/ipl.h" #include "sys/pic.h" /* Initialized data for Programmable Interupt Controllers */ unsigned short cmdport[] /* command port addrs for pics */ = { MCMD_PORT, SCMD_PORT, 0xCC0 }; unsigned short imrport[] /* intr mask port addrs for pics */ = { MIMR_PORT, SIMR_PORT, 0xCC1 }; unsigned char masterpic[NPIC] /* index of this pic's master (for 82380) */ = { 0, 0 }; unsigned char picbuffered = PICBUFFERED; /* PICs in buffered mode */ unsigned char i82380 = I82380; /* i82380 chip used */ int npic = NPIC; /* number of pics configured */ #ident "@(#) stubs.c 26.1 95/07/03 " /* * Copyright (C) The Santa Cruz Operation, 1995. * This Module contains Proprietary Information of * The Santa Cruz Operation and should be treated as Confidential. */ /* * The code marked with symbols from the list below, is owned * by The Santa Cruz Operation Inc., and represents SCO value * added portions of source code requiring special arrangements * with SCO for inclusion in any product. * Symbol: Market Module: * SCO_BASE Platform Binding Code * SCO_ENH Enhanced Device Driver * SCO_ADM System Administration & Miscellaneous Tools * SCO_C2TCB SCO Trusted Computing Base-TCB C2 Level * SCO_DEVSYS SCO Development System Extension * SCO_INTL SCO Internationalization Extension * SCO_BTCB SCO Trusted Computing Base TCB B Level Extension * SCO_REALTIME SCO Realtime Extension * SCO_HIGHPERF SCO High Performance Tape and Disk Device Drivers * SCO_VID SCO Video and Graphics Device Drivers (2.3.x) * SCO_TOOLS SCO System Administration Tools * SCO_FS Alternate File Systems * SCO_GAMES SCO Games */ /* BEGIN SCO_BASE */ tpicinit() {} picinit_8259() {} /* END SCO_BASE */ /* * Include the tpic space.c */ #include "../tpic/space.c" tpic - i tpic 0 0 0 0 -1 tpic N 0 5 1 5 0 0 0 0 j6ԃӻ6utsp_+v3Ekmɕ[R:c ۉe5CL ev:  *-VB(ZPC%-%i% +ʫ!6!,&d#7ЮRen;:g/{7'g fjɒ/ υ"AS2Vx1DZ+(tg=fNӖ,  ;}Vn)Sm4t9IL.'BitWpa`6f1yWs5y5{. sl3-m$Uck v < /˟P~YApVw/ <)aD)U,(t7iėfj_a ?/*SI DC͹ |!M7q:f:c#HfٝasM7 (tKն{ڧVL06vLUt%KetN1]"*;2ҲӱlhMayuA4s-t澧MQZpVM8_ѩ=8UNubWogn΅-6tSfEePij?z!~%i}*xT(T7rMv.jw!]UW |7;~:_,f^<{m~\6nmmwd'eִΈu2=2.B39|7d۸<2v.;z!?9D&&|!BH\~7(.7jGwd褈~qg&MH=tN#bdRM&;Dᦋf4[;M 4LAE}a4gMy!2Q7tD>ȇ7j ;zwmأ⨉C(8(EqDO>uvsM50pYb:H/_%raG)|^f7uG3dSqczH^ưqO+b $mscsi.tmp mv $mscsi.tmp $mscsi } patch_mscsi() { unsettrap sed -e '/^piiop/s/piiop/iiop/' $mscsi > $tmp mv $tmp $mscsi settrap return $OK } # patch scsihas file tmp1=/tmp/postbtld1.$$ scsihas=/etc/default/scsihas patch_scsihas() { unsettrap rm -f $tmp grep 'iiop' $scsihas > $tmp test -s "$tmp" && return $OK echo "iiop\t\t\"Tricord Intelligent SCSI Controller and (IMS), Version 5.00\"" > $tmp cat $scsihas $tmp > $tmp1 mv $tmp1 $scsihas rm $tmp settrap return $OK } #main patch_scsihas patch_mscsi # # Turn off piiop and turn on iiop, Dsk, ims, and tpic # # Turn off piiop # sed -e 's/Y/N/' $SDEVICE/piiop > $SDEVICE/piiop.tmp.$$ cp $SDEVICE/piiop.tmp.$$ $SDEVICE/piiop rm $SDEVICE/piiop.tmp.$$ > /dev/null 2>&1 # Turn on iiop # sed -e 's/N/Y/' $SDEVICE/iiop > $SDEVICE/iiop.tmp.$$ cp $SDEVICE/iiop.tmp.$$ $SDEVICE/iiop rm $SDEVICE/iiop.tmp.$$ > /dev/null 2>&1 # Turn on Dsk # sed -e 's/N/Y/' $SDEVICE/Dsk > $SDEVICE/Dsk.tmp.$$ cp $SDEVICE/Dsk.tmp.$$ $SDEVICE/Dsk rm $SDEVICE/Dsk.tmp.$$ > /dev/null 2>&1 # Turn on ims # sed -e 's/N/Y/' $SDEVICE/ims > $SDEVICE/ims.tmp.$$ cp $SDEVICE/ims.tmp.$$ $SDEVICE/ims rm $SDEVICE/ims.tmp.$$ > /dev/null 2>&1 # Turn on tpic # sed -e 's/N/Y/' $SDEVICE/tpic > $SDEVICE/tpic.tmp.$$ cp $SDEVICE/tpic.tmp.$$ $SDEVICE/tpic rm -f $SDEVICE/tpic.tmp.$$ > /dev/null 2>&1 # # Change all Sdsk entries in mscsi to Dsk # sed -e 's/Sdsk/Dsk/' $mscsi > $mscsi.tmp.$$ cp $mscsi.tmp.$$ $mscsi rm -f $mscsi.tmp.$$ > /dev/null 2>&1 & # # Move pic/space.c into place # mv /etc/conf/pack.d/tpic/space.c /etc/conf/pack.d/pic/space.c # # SED the Sdsk entries in the pack.d/hd/space.c to Dsk # sed -e 's/Sdsk/Dsk/g' /etc/conf/pack.d/hd/space.c > /tmp/hd.$$ mv /tmp/hd.$$ /etc/conf/pack.d/hd/space.c # # If there is an enabled a15k GPI, turn it off because it can trash # EIIOP devices in EISA slot 12 # if [ -r /etc/conf/sdevice.d/a15k ] then # There is an a15k file, see if it is on. # grep 'Y' /etc/conf/sdevice.d/a15k > /dev/null 2>&1 if [ $? -eq 0 ] then # It is on, so turn it off. # sed -e 's/Y/N/' /etc/conf/sdevice.d/a15k > /tmp/a15k.tmp.$$ cp /tmp/a15k.tmp.$$ /etc/conf/sdevice.d/a15k rm -r /tmp/a15k.tmp.$$ > /dev/null 2>&1 fi fi # # Now go do the boot_pdm stuff to find out if the root disk is an array. # if [ -x /usr/bin/read_boot_pdm ] then # # We are running before the kernel link so we need to make a temporary # node for read_boot_pdm to use. # /etc/mknod /dev/iiop c 6 1 /usr/bin/read_boot_pdm if [ -s /etc/logical_boot.id ] then update_boot_drive_lun fi rm -f /etc/logical_boot_id > /dev/null 2>&1 rm -f /etc/rev.id > /dev/null 2>&1 rm -f /dev/iiop > /dev/null 2>&1 else echo 'WARNING: /usr/bin/read_boot_pdm not found' fi # # @(#) preinstall 26.3 95/08/22 # # Move the files to *.Z, then uncompress them # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; # # Check for a directory at /etc/idrc.d and create it if it missing. # if [ ! -d /etc/idrc.d ] then # There may be a file there so remove it just in case rm -f /etc/idrc.d mkdir -p /etc/idrc.d > /dev/null 2>&1 fi /iiop/driver/iiop /iiop/driver/tpic /iiop/driver/ims /iiop/driver/Dsk /iiop/driver/piiop Tricord Intelligent SCSI Controller and (IMS), Version 5.00 /iiop/driver/piiop ...driverinstall...slha...Space.oSpace.cMasterSystemDriver.o Zwڈ zd(8TXLuۋݓDc >WkE*j[N>+M1 Ц*BJo~`FLħ<~fDx՜>_OٚÿD3+xZD\),$t3n5`bzNc=(EsUg7?GN/82k}Xljk^Hޣni%f٨H.P{w*]sۋhWq QoH\F\V7Y:S$ys+K4aw2vP#ident "@(#) space.c 26.1 95/10/31 " /************************************************************************* * * Copyright 1995 Santa Cruz Operation, Inc., All Rights Reserved. * * This software contains the valuable trade secrets of Symbios Logic. * The software is protected under copyright laws as an unpublished work * of Symbios Logic. Notice is for informational purposes only and does * not imply publication. The user of this software may make copies of * the software for use with parts manufactured by Symbios Logic or under * license from Symbios Logic and for no other use. * *************************************************************************/ /************************************************************************ * * * Copyright 1995 Symbios Logic Inc. All rights reserved. * * * * This file is confidential and a trade secret of Symbios Logic Inc. * * The receipt of or possession of this file does not convey any * * rights to reproduce or disclose its contents or to manufacture, * * use, or sell anything is may describe, in whole, or in part, * * without the specific written consent of Symbios Logic Inc. * * * ************************************************************************/ /*+++HDR * Name: Space.c * Title: * $Workfile: * $Revision: * $Modtime: * Programmer: * Creation Date: * * Version History * --------------- * * Date Who? Description * -------- ---- ------------------------------------------------------- * *------------------------------------------------------------------------- * * $Header: $ * $Log: $ * * ---*/ #include "sys/devreg.h" /*DECLARATIONS*/ extern void bsim_doinit(); extern long SIM17Action(); #define MAX_HBA 8 void (*bsSIMInitTable[])() = { /*INITPTR*/ bsim_doinit, 0 }; long (*bsSIMActionTable[])() = { /*ACTIONPTR*/ SIM17Action, 0 }; SHAREG_EX slreg [MAX_HBA]; int slha_processor = DRIVER_CPU_DEFAULT; /* tuneable haInfo Parameters */ int slha_do_buffer = 1; int slha_do_tagged = 1; int DCDebug_exPath=8; /* exclude this HBA from DCDebug tracing */ slha Iip iHh slha 0 0 1 2 -1 slha Y 1 5 0 0 0 0 0 0 %`fvlKlJZBPLQlgB[Y!Eʳ\6B}Epsmcv-@r"qN`ִ ߿wy<<'8zT>rBC/=;}fP/rMZ}.,=}7u`|ղc:^3>#;kͿ}gۜߧAvOL+:e:Wzl9B$x݂Ƅ%pi{Ձѫ5Aop cKk5}iz*nYvzSq{]QNh!q^{ig-ޕ0TORGt WШTT~|G(&Uv/GڼL,iJUm-ZC lA+T {X^ n2zh߰˅dRۗ<' #V2 03u륬Y:@Ï2#^*:O BNsCz6c̈o+v8Y|- _w~d{ #j(9,^wtYؖ]tt⻦5QLGrpD$:i7qtL⺟Tt͛HJKbkJC25sT dm.6ytLjzC&0QtY$:ϡ#Y 9t]\k +-W=W7wM׺sQ'a6zvh'a6pW(hc#vF?僱ǨT 47r'XX 1{ Q}gUnE0 Se"=O >ڤKZG,Ǚ^?Io H(ůxj4;z8Er]Bl@'syyvC!X!60fe~Y#>Y ($]ʢ3Jmȳ@Fmgx@߅Nҍ2a|Lp^ UhZ` ܑGps |PWRbO`]#q-N$}mu/s$6 hZ3+'j}VE9Js]<ˆxbl#46Vv%25Z8>a|:TӾ\c6ͤAԆh%"X VWa-YJ]Nvg-˫J|rIZ*U_A۸dTBOFP#.Ԛ.9L~xjJWWȊWPky~ȼ:QMڲK4|z8(5< jʄUVЬ_!#4,&]kP; ^ڥXI;X{RĮ լGP{<igd9Ƃ^+l%P]OͨRk)9B+o@9 'ܕzmV@>W(%q\_VxCA0YUsIPkSg ;.I#6>zO)T+' QW׶.Obxh>^`˖K>(Iy/\YlP:AD5洼27LB=qUժ;W³J֡K t ,k:TN1Z$t M.#`a)~j Gi8v!Ή ~870nĄ1) +8[ڭ~iMgKdjlд>mi?Zj2Y*+@QWjt L y4SV*<Q8*:EGI$ t5Fjp%{-ՄӹdN' 3033Z<$ׄI+>IiL~0fXMp#vƯ,m,ȍo55<8ȩOۺcQ%"aBL]=TUZ1e1޶A3]]-{S b"1ֻRNJGTqRqtTjWtUQkNV_J)*iT4Lc3:9J`4NƆ[HD<f P=E4 W&d4 FG hRk97BMMZ JTd&* Kf#%d<1M%޶C}BmmÊ2;~d}x O d G"_0muFy mTw^U*yAP-dDzuq1^ّ)aP2Ī~T~79P $;627NgRx {oMt$7ޙ}ژ5 ?(Pmq͙@k77q{N5)6Hj&1a;^HjY'!|`7)/l{g|!/Nt6 ,@ Ab@t_Dޛ,)!txn KzL^4tȽz/[/\ 9𤡏 ɝ#@#\(oo$94V\|gslad89̺c/9=C\l|3bj*7RmgO$B&3eB :&aF0T`KJeeeW&\%5a}9.teuvcNEivV&G ݦRkYJÃ<%qzp}qx+ ou2xk o7@y3,w&TOD0-8&5U@9jQÅ_(8[Q&wT:Ei^-^C9}davxO>zQ'T^ؑѸ9Ųn*a68$&_* r3,@j z 쇞υ v+rBNY(@YZko9ڳ%ܩH@69ɛP;ڤ!uԅ~_yFշ1 apac<.nNpq7fjK*/KZ<ͤU]#|:pNgJ :+ubYڒF咼&*VC^~ U{=Fhϒ590iv1Bs tc> Ұw~:U2): Y3H]_)bJIg|%,Dv6%rtLx87dx/B+񏷶!GaD vVެ2-?ص 5ߚ?MA~&fNKj {) XfY/Tv-iϰȮ4*w[܋ ǙbT(tªEKzwDv2dLN>N[ $j<3,zPJ~WtHLb"\K:<}䨒$V[߁BE>2@v;f5ClCM8=0p} (S-N)ӈ/`/`_GcLC_~|u}:!5gk__?_ zv_,&9\BإK0AϮ?so2bd-Xt3'1g鯉֌~a+HHVNʋ^Z>Hͨba.+`xXֺOgQ ~v&Q޺6XyӽWw5X]0!v(Gߞ)c6߉=`35Vj]X:uU.٬]>ؠ^Wuw|[+]]ߢpBlDž 2Keg}❤ ;L3^,;c|Jb潳aOFX#J*q%>IwCLyհuI)etyA3gfǓzP?+kG$P! .:ê9dVoUޫ veL̶vn rX?-?(sݢ.y;TwCmwB~ dJƏXqO =_z07#k:pHrN,Z劝,;%<[wX܎WƑ \Cu*gp.q8!Aj-b{cXx+ #eO1}<Ő `0Kr2.GJJH{:.z k׺pŭSt]=`PAelh )S3~ =\]X]t`42_[a{Y@N(ՔNqA:9-bp˪=X{⇱?o2bj''9@mR [fN>z\NiH-o<"V+ıЭ@iL2N\@p Rʀ"[LBx5V}+5} b ڰL Y:q|ÜpJB7' # y.J7G`A;210=yv'tyXrݾW݉/SSK'V˱M?xv+jH.n^+AuXsz.Sɳ#]PLH{Ĭ&43͍u52LtQ]Tpon01c 9JabuF#$sFpϼ:;jy:k?υCs?p!&ϵ'LZ~ k ^\5^I_#.&ؔ/JtXKP+ ?oJxnm{SAC5[ ^ÐTu AϜ= K+/ݍWx$V^U9'gxr,Z}r3ʍ~ce‹[3`=eiu$OxHDp洼 |/9ݦ+b9+!8ա (yHw, hl+풊`LS +}YIaB.EJݴ{N&1gZ*ًߟmʵ]YrYuG ӵ9Ŕ O}rޝTKH;Bp va~j[՝bJ΁Ϟݯu꽟'-ؗl*um 9gsCG7({:#l]L񫧛 LyC G:( Z ^8aD2<J]ؼ5:0z(X:t9h4SpL$,] f@š,⾜6ȩ.-t]$wӌU鋠_F}](9: U MH Y`b'ݔ Wuq^ | `Xi4;~B3nrvo,A`f-}`xU\hU@ੂɍc8<]>l0IBJaͅ%A/P~"81sUEի;KfΆ܀OLڀ'Zle  B½N AmGd f| ̀"<̽]C:0X`-9Pq yG@5%bf9 `GttA Bc՚| g@3W_t4L걇9 \^M|)s(.,L03^ydI6M?<²W)pj^(kɁ N~nŘhj;q;h7G /;X)_Zy@*h(:9"Ϝw@ z A.3,Eڳ&G Dt |Vy$DE_EŃ>Ւ̬iJZz9ɊMo=YXT)GZgur:w"ߓXy+{ w{#/g{}2ywQgNx%!:k:OHtvKq]O&?ݣxGKͨl7w3qmee9ܚ?jY@+@kքesThGnzSG~i9X9sH9!$! WMHw#AftEnu9֙zm:ew'bEf|[2AMWZM4+V$%y_ S lUfŰ"aN&̡sG.cī&Y I-̓FIFȼ4% J?+fq+u*WgeŮa_VM[7$~O!^>A5s'}+;z P"EI̮d{ &>R{D߆"9Sw]#:8 1x!~p' 8ooA (Dz׳])^ wGL[쬰r^.(Ë88@""4Kb|1YWG:q NLgAkgG "cֿ([g?@ o)"Ȋ\[S՜SӫC2vGLiǰ2Mu)2Pg.YʾBk6(AhIlf]ot,m<2ۄU)qc-sv]ĖE+Z+BpHn8 HqY{8Lbo0fX76w/ 7xBnˊW3y{ft6Acq%|/[ͨC j> ? 6Q|A7j{_Nt0RQg \jY>W8%rV]W+Ϟċ+3aC9@dWӧҘӦLg)|ɧkO}qg%!؅^8niu})?@ yv׶)oɈY'~ =b>?&f&~,N'<Y߱@tDfHM ag&:1q)=0%k0>z'?'Sm?n_f X{\}E>+A4pC WK˞l;;5]Pp!bpg~g$Hf kV1lrL#W&S3dqYbϛQVә$IkG ᖟv '#',4̑ڳ>[BP\I a$5_ I Dҡ?s= > Ee SF֏wٓ&;!S*xGc8hGABAcֱz\t7KE'/I QéKASePqQ/&kx< UoU@E3 : H{&\ݨTIIJ[z{2ߋ0n1 joHVk0V[QP=HP&OZTg7_C!ĹC:Ӌ-ϙDҨD̦JTI̪@ͳvu bɹA9OPIho8L"XdSK:ȼyz~i=C]nV+.kH'?P\M E靲"2CD~܂ֵ wQ:+vW7jtNhwǜm`XI* 3߀=nQ)k3$8rpx)čr#Q*4r9S&6Đ(@)7trG裇h.J`59dpdK9o2 }{!Uﳑ:hh Л]ݑCVwO[ymQiQQK^mC-,W+)Ѳ[90/v9e{m\62]G^V\uFW}|Y$)~4@VTnMfn( iz6x mcy|K(iVT}|c,C&ݫH?pIF2RE x8D"1}MJhp#ue)a96-eP:Mߧl29WA BXy˖RFgg\Z9K|ͽ̅y>N̔실=P׀ 5m܆(}/ _nn o.6`w.cУ bӫ^c˱3X>,KBKQN`pRF4MA3C?a. 56h*b-Ф^QT( WeH7oG@Q1Ȏ, 웑` DFL >kP I)X<eĪP0cS& #pd?C8'Ĭu pOyO$,rDta`l5. );<|׆fͩ O^9S&cC`^Ws1!U_)Tڎ bB*5sW `x72?Џ,|>!BsrE9"ܑNn@=Xg"\W.H$U˜cgΧt۷cSYowV<[__թkFgDiR:ja¤8оx:"m#l|3& äSܣ RrDgG8 m0JmgЗ|UT˙ t4f5O DQ}ǰNOB,k+fyNkɥ[Z^l m>3)O)DRDuݿ J04\5- ׮4\-:R4iCۈ܁GN;K4|ע=3 ?]vύ:9*GIH#Mk9<>\3ϑ?)&!غ(OzY+{^!1.[;SHf:lo7 /+;!ǂ ܲ<&}tu8B8\(`8Ok*kX+tE 7zdbV0h7:mI>Y?}c Fñ`z>SU>l# lAV{fL'᧠kIόmU42dv{Q\lPL!8M5#褾~rFr;#=tIWt9y@=HĤW˧Rފ40gfCOhIN0w @6ϴ[.EuNm!Vuţ" / t$.>Zە5:]' 4rEcSR(p4P AFt"Y3 ~ۓ͟@\p6xxDz|&\? MRY "!%3v>2$MCLFfO(ÌCqOFҨYf{sdnzϑ[B|3WLZBi VnV Em)@g9©'xXZVv^gt'{$ʚ~~,^hHD}׷P1 ׹?u?GuW'* x3{&_6 ]x2q_fKt@} 0xE"ùBJh4edّ|_@ʆo/jT[;R&-%.9,S& R2jKeP5]h)wEVv-0JL#؄ZJs O-nA*7(Q6RI g?/SzDϱ2e g\w$XYKq/\+c0m%[ $EqƜ5-RiF'QR$و. 8_Dc1IGMHXp>8 ^ exᆔ}pUq\G%|" 7YSq `X(a~1x0ҷcR4ÑJ+JWKnA3eAJ 幋Š1ќ.Fh:$)Q=:e|)q+}he⶛́z֩5.4V|p`ſ"Hي4`"^Dp%?&hҭ725ue%:hQ1=u@[1oIr[">àW'՗#l3 bxFY5،0#vRK“ &| `;bGcxcJꝔQ,Cb.#zl`wy 3U`ȉuNMrx)ہ=(CA @|RL D2#) F.SfJN^/։|B1QϳL>*M e{zKxbHryբCHcZ}nY;tpZ!d d-Zh=4qKrdti.applgq7'T+U:4u7+ aL} kp1oH:AuUw O^RǫM>~ԅEyUeE}kWG (}p-m(TPF&2;%41t?˪F{b+ @I>^^|UYxT3MJ(YccO;UŘvS^ھ3{CUhHW|Ҽ<`SU9Hq4зЩppmCo0ǑYDrH 7^9stcaimOުě|%V˄.q;2JuU{2ܜ"UxFiUpBPH* &*Ɋ9T9`***L*H1#.UFݕ2#R Te،jY7F4VԠUIpuߔI  }/ԃ5C(|GjGCvMmR3/T#CTq5ӄե4u/Wz6Y>8Q@zޞ;'r74fd'lwڕ(riCVgEՖ)<}-u._TeoLDft(z4Q_}n\L+GHc4yz$1+UEN_2an_4U}Z/IrězL|Mfulhz`BAs˕q(7K~^S 'z˕Z[3m@^jx7_WQ,`rNh)yD #X|̌Li;l|E* ̹ sù s꾋;~NW^b:w]*W.A*{Z]D8e@PW5 MpYK?ϸ5|Jڎ7iA?-J+\]vmKO{lM*woP Y꿿g|aފ=IFFv0ͤA% +j#=Kt#:8d%wljƩmTЛ''6#K@Z5b}y]H clw9ު ; 1]eW7cBU՝:Ռ³*jγ iDԔzߧl<>ú &㇡PU}H Q]/&00b Dt% `&5Ce;mB#د^X\V1O<}?x0ݳHJmskȫPԞS$9w ^+.`Wn`:wNf⻅'!nۡ)xb!ŏ  Zlf͸V\9(1xeܓ.W=1Z%/' <ФAmO{B>Ǚv5"v w}w-^UΏgJN ^9U!]w&*k8r0/CP$j'@Nͺw$]#+1g_蝫ÿzN0. 835ͪ .ߛޚ(U+<-H?)ÙŶAo)|o?)I*7um 9)АSj7"k8IO0$0+^+>bLGsQ23NsQYlN>@G'\⩆ +$Ւں9:;%r_ig4e5h {<)]7Y iGZ:ЏC_L(Xq73׏̱PStZ9>~4jqlF[7z MIPqERc|+B\88]e*CLa3Y`7kta%*G%BcH:9Pmƛ'qL>bV`K̭FH} Uϱ/tf = |O?nz&6/ s͟F/QJiw#.IFg[ B w8 8^,c<"]Nn2#@|n2@@e>, ׂ[@{ts*KxڕFʻʈ JHԴŘ4 ^+,b!{mft@Ky30v)5!&GjoN8RڇjCf '`^rB&YӋ" ϼM^tfōxDD$nLlA Qf$fdC[)wdVL:^ FV-;:G!6hWڥf(n'N64['xZæGmZ O\7CXY$eQ '!鷄FjgJm?'`pΤq&gށjԳj:jBY y+BH$SϩY84TxV9E|fnߍq|mCR=ܼAT :BZiӍznC9e%qzT 7/kWbsY6,Ixh8 'Me?PD QzsxsPS/@SI8td:wuUIDDh#/huAzmdw&L7YxNHfr*%?',[mq/Na7RQTR~+eeC Rl*p#[,7' M)B#*? l90A %TS.9׃$MѤ/br XH9e䠒%(Ârͬqe(4TJ"?4/2ڢ-LVE2o"w[_J{逕o =0;m38xJR,7XBKчk,&-Q(n~3PB\b7µ /o 6V+w0;a;z^ ^ + &F _@F" wxlzPHCo2P@hzYXnU7a w9 yVWؘbV̠6.t`Y$_A1v4#6Rh|(9:> :špݯ=%VVS :NЁKT<ճE!]\ڵ$hYҖ1ȴѯU{ u]3" Ը%c45qeìTJ _pB04>t KI =5H ~=U.1w%HyB4sM ]uPV@Ozu.1ƜJ4%O0pߧzۃLn@m;g96ol fjIT`ޝtYAlmqT&ҟ+R2N6lZN7+ g\l$ʡnn--g ($<\ ٰ>@#^W\ } zCFvKhc߀ほ-V)kgY&V\:6α`V#2\`Cl_&|g"'5_V~L|,!0G~N%`d y `Q% bzbO% (b7^:YБ^Ḃ1(&eSHd*xΎ;U,aƠD{by89X*da 2"g ˇѨ\47'dw—݇UsE}]7;wl<{%u!}&ڮF+F0'],"h8Qkc骂bu%ƕ꿰/ir˼@|Fŏ#ʂmxbXt` ~˭Lki hCO+aiYvCsyi^Ε-)"^p߲PA6 ~XjXEe:^(ChX=W)bΤ11kl꽲b~A7$uB6SN1{vRvmwYվˁ=/k ۆ>ڏ+;VGìuee2l%1+s%ejB.@|y/?$/4 ̼ݗRЗեe>TRPԼKx^yR/<^J.T|yܗ1yߗplGΠ<԰J KhI%Q[瞫d+Ce"$3 `{M@j* >` 'Ų^bL b?οT3~ '?_.>y5~!7+ 5?΂OAF_FhH:7Ǟ+h{*9y0l~ByxMAx\!Uia,)8 {Q\qq2 Whl)^K'r`qNzF>G)=Ry*>B8KUӬ°7h%v j vAGWʵ +ࢆ[IT o4\ x0Ux4+T8L^6X@5D6bt5Vzv }a#޼L"k!`JjYLQrR7fI9eȡA''ªVP2x2@Ldꂠ%袗6"6.gen\KjyI) =搬8-]R.◥|2)e$mO5ZD)DɆRGZjIxİZWP gPTx:>.m)hLɔ<njK0Y5BCi< h &㍷i'e#yOR ELEQOyh1o)x M|Y<^m0چj- eE]XR] \fXe %x~P_abVמA@@T^,\hI7i$MD߱׌oUI4EY冄v,,w,}꿛3&<~҇ ,3ӔY]iן\Hqw慦/s2y|]]G}tX|Pml¿ʕ08{Qw΃u##٥#v.58v5?\1v$ot~a`S%6Kb8=-z ^4ZBԙJZy3^YxYlTo֕jxǂ+It/R\6pꋀl F&T;W\q &p>PGn$>Pfq3UДXJwxVw=V4Ȥ1l6d݂ɺ][!#2T߅nbGS]~|Т} 2'!M΂ $d|Y jm"R4)-pmtR'['W0ǯCo0KpX;1"W3c]g:BZ&:@`1oV %LVw$ 5H_)ܲ%> nEyEm820Uu,6<%!%UwDkRc.\,=IA۫"UVQet]!+CI 3<a{Hd$(+π!96$-KK`P Z=-IQ#S̃xX'Jt$-Nێ|/|A 2s᷇r[å =7ϧաMқzah>*@Ç[؉YH[6A}fޘFf,P>f Oy(ԎmHvfNթ +8uF䞔;!XlIo.5a]ljmf[|sؾzΗI|#gh#jX;3 6f{&]/W8&`}`CnPYMƃ?QՋΕ3J`c$!+ެiMˮDx8yc~Hʮ=L`9$HԸ b @ېyZ^>Z9Ae WV҅^f.\mjk8L~!ͤٮUԶJK}5Ttg21ȵ}S]DsR% j]KĖ2ÀUԊ$D %Y9|d̻Œ3/󤄤v m\ lI$yh%BK=|Hb@14f0+@xs[ 8 ٕ;x jm(!Ҍp(de>݇e?={y0R9r*iL WmE#jVNzl˜3O,G_Pvt.h͎"6Ugwbgw td (G}!꿆txi5z7'cRo>G)%;\3#,i  W0GaS@SfȖ*\!? Ź[Ww2!K&9a \GcdǩlK}6z3Ku6bKE1jrNFc=XMѤb~||@9XR0T.G72池}0@4&C!׉K 9! GxHݡƽLw݀er98ĵL!W`XPS'-@ɟ⒦ InN;|L"99F1~g6tdșѢ;KUQ =8ۻ|%R%9Del3ު}*gaxCÌ@R22QA!"wJqh~TIoQ:>g/MZPÎ: Pn:I~<9_{{s`Mn1UfgсQÛE L4vtq~~y tS{&s~ҽ=%LDK%4bɪF]AJ8;SB1CK;D)V~ wSZ C:[[Bߥ@$t* C[g KEzq]J=Q%m1Ov7L8=3FaħGz}r)60cu8bRJכ-ĸԸ\G: w k,-2̬xWd{D 9-v-5nj8dG:vZm&67RE}tt)7%Ԭt騑{R\4wdgDJ'uhgQh2VVGM'0o_tj'1ݹ3ԷS㐓fo;B[uh%IY^57 >κxrkz78t?QxG+t&:"o7 + 0 PȞ\jރMo<ڌWV v5)ʐUW:2UIt2{.ABtɄd3oC~MMZe%]G_-6p6qV] _'AKM\Fba!p)MumՍ@e啑+8G_֏/ ] қZeZ8MjaMϽA_Yڰ~EK:  UrY!S-[^{-9 gt V" :dpC w-ҀWLɎ*P:BQ_gnd/{jɞċ@YG&Atk6>&m ޵]R9U`Pe…YJjµCIxPrźz W+-ؕ[. X$n!C?9yw#ꮺ"yVޏ]SSe,/*j,{;1/6 dEUJx_-GeDejTuGҗ$5D~f4U+C3YK7]RwjKJs{!38ʞI_TNs ’оoPO<vu9uM X=5$[RDcw~uB%Nn;ՂSzvNWRܫǹQz"U<&#*%ݺ|Bz 窴vE뜭3|8,S|rMg=(GvpG`!wBd|O5*%bM·kz";+ HᱪaY]d")S񽪗"S-D2F0ukUgqa Xj~;Mj*NDRsC_{Fe[gS55ot)'ϮUgϒ^UG s%[ɮouPn33uǗ>@O(OZKп:<7UnzNR@U^xI`*z!y}H$ZO7<{Er5d=%ّ;0**DA姽Ɉ[vWV8^DzWfoh5zNOLTRV0>|Fw0.>>+A\ޞ]hUAm鹯pY Ӯ=ŨY}rŤw{t8 ]ռ"</Tj1+QovsY jVphJ;xzaHS$^i{5$zs{!繋=VʾoPoD@ҐN!kD2sz+n~XޑnZ@8(O :'R;VA=*:nI*.A _FwQ%+zP,X@T6wU<T AU֒QcI(Xp4XVqMY_bg? ߡ?@.}ȻeE| jGbo~'%z-)'QE/=IKhzM(Ͽ֧nᓆ[HEqgWtfd!rXk;hգ8iJڒyveͫFexuùfl+QZ7]TY &k5^d,'D? d~)2NFJB1x\S‡늲4,k5h#XسjݚVy\x27O=Da!8ǯ]RŕX/## T-p(iw ( e>ʕ68RnY[д$[󙏛.__z]re%f^Yf9)hZ^eOon斖sYn]P/51,utG-*]mQ4̴k]b ґjLI+^V$9ؿL|[r9ܲȞKUTO:?bzP^ߔ)WN5g@ѩ`ͳdDO[='4仕Y6h00-d]ΒѲq=C-k,rC+nQ7okXp0{srK7f3Vmi /.9a(vkp?ֶ S;ތjF5Ƭ瑏,FԍZYS2~nFo%M\K1_?J}nï..[$% &Z69ɵ5nԱ+-|WDEhhuܓ!ߢpثo50*_?:iϩ=69eVjHͭ] 1+,Ui>yL4]9tnd$ERWgE>]![+ZX.pVz}7u6;ۡY*F2 R:BqL]:BW9R S|&L+~WF*Dw=HBӺRm)iJ$YQQ&f՗[kp/^J<Qh"iw )d#/3ץ,?ߢfXMPQ_Dʖ p::FمL1 ə'Oq3N%hc:UyU3fITo ';.ĿCQgظUd^ )nRɡ;R5W{Mc757:Jp'N\R6wXuro?W^8P |{^]Z+lk0He3E@MM.+љ'??pÖz*'9Y|<_S۝ѹdi`mv,%ذ8 ; f5eizά2hK9{/|iRedpaɛ̑bE OO9lv3s(6YH+}$7paP9_-Bͪ#O櫐$>'a,t7f|3' f,')FsI'/ rޓ fD^fqjptv-4 2.Qr^U@+{\zʅ[3-_#  fM3lM*,kHvYRŵ2G)[9:g3._:zA4TTK4jR$GHzt2kAI 6$~EՏPֲ݂;OgAڗ;΁vin|ޝ1'Iֱ~xLvyŠi$.Nnwp?)us)eZ'/:/ њ{{73P[O©ORJy7g:Ll?rU?4oaٿn~&ZG7ߩߕMV>dmiHe 9܋W6ww^;>mtE+$#~Թ={/+WP9_0_iZ [$^Rȿ(.4%ɬR/{/1{ޗ/uؗ {!{/I{㗾I{8/v^ D{{/}/}~^^ȕeRYziwOt/zꖋ/Q EDɗ$0^Jx"F^ܽR/|/~B/xE/~^tWA{d/l휽//Oo#HٛFf癗#sa5515p^V^nu}enF/:)XH͍eަ4F;tHIGۣN~B #C ;ZήCG$\|zsˑ9.8tE%ƓJ6OiDsi6gːi^-.Y.G \f F sztQ2i%*Jb]˟BkfnjqZAUUllo\1Rrrk#/N"!q±#h1 7+ɖb#iiM ݳۯ$ĹkLKff$X1b\Ut13"Pu6.1YVK'DŽ.{r{W!&}ؗPwmf~yTMrhga*_5xf,geK9n>SR," #g`A+@DbdED C肑ZI8o+|ԟXxOŌԛk\A%+3v Faybͱu/bz1lXֶn _/p Yen QuI/@#F*J #A)G_dnIG/ۛ _ YŔ2L,q$$|HrdTdUZ}{=b\xamr^^/v{9ݐ}=t,;X Q`5aw`:vwGn S7 3nH +XXqdA4D<0i=@@?ZAaϨ!{}}8p,#r}}e^t~GX^}km!(R JCoq{e-h+]I`A$;x_#GF;؎!Jv#g ؎E L܀X33:gc:Նw# tPRw ׈3 M c@de`έ*x|8/A;߃;s ťcۀn@7pp h pHi1=ݐY>udj|_6Ҁb?AHxvS+01,G7f:{YAd-΀Cޠ#@u=}@lǗJ^ /d=\!~al( rbaRCpq }@H%| ?0 Z1@7 Zǀɀ@f@gq`349 =Vu,B>w =U 9O>v܄{nv?h= Aؖ" ɄxPX HF7 t=G].#0͂h@6[Iҝ#ZN#ZNvgDŽ}ݤ󱴜مxaoi:]wP  ~€̀YGi߬Vjo>tifkηrC?gk9߯ߜ=@-{[$7`հ\PGl; [t>zڐpjdDp- al<ݴ Ҧꭦm9? D+ rbNa8s Xy$ ~ dmq cfhG~)rC>z}aG@`/~7p 6{X 7= _Wkfq0FP~p p| 7 yJ@{0ϱ QE;G7kX/fGhhq<LY>z#E3%?qoܰF o}p8[ foFa6sgFG2A%ohý#nj:?j3ؿ^A". p  *4N7τz@xӑz >XgNEXQ qGF"@ua_r/ `a€85r{p6<́|pZ,r1@ $;8$ʻ7 (̀O9Sc5i#d-4E$s-X^ z!l[`$l S*A*ή˭WD@Amkmsn8qkÌx[<B=(gք#?X2hhԐpVv"M (-=+[d0͛>l9\8p P~pjmO_ lc'Gހ!oؑxbFp pq' ][v]͸&AJ8bY}s&|N(V (`#Ѐp7^a~śusō;0b΅!oX{0ѿcyaqhcDƜ(#l<4^Wpl-cNJ!n^x`6`x]n}eե|mڀ}Ppn`9RgdX=ݠp9l\Ȟ?=D>8m F'`4'*s'oBtUų-δ>!][Aƾen7Va\ـ@>X)2@6#8#=O9?hFkq`4@9`oFpϼhjh-Nui t`<SqN S?J-Pr}fPjrYFlHbیgwj?+R\`M`g"9/S TwEqYQBA"=`/V9: =!v [r CؐgU"7qxn)7,q.a΀u9s95cfAՓA 0a{y{y̘pygf[j?捞dq @9 >qCoٽf-;p߳}Apoy=3{3o,骞 :ު@nӁuӴ;I<  1Lr.m7űak0FB{h]hEz!rh~AVJߴWg{쎣F-[ {}[Fa| "ujxH8A#?8@y`6 s `[@-|`HAT<`pZb`7`3 8G@t=@}qڻ3Gtr@:`7$L74X#iN~9EsݥrAVH;pzPH[ބzЏk;Cx 1i51;fÇӚP l5By{jl}ڞ1~VP`;c=49$ChњՐxA+>h -R$Dyψ Ҥ8= i9D?jABEpqӸ8DžN ][Z컃~@[D h@0Al}5MA5ZAƆy02rPta#D~0ϼYA8<-{MlrkzXeq~?x ʤ[ ^1{ppy?fm`7 CTsSTy` |a{MB5r,ǨOQV;͝Vz՜Vr՜ v>( HV,ì;!iu/rq}Gk@?0ߛ~sn 2AΤ1ʙ-l[:"#K:ӣ-i*Ө[ZӁd֜GA8ݨ[C? _0-kl&;vÀ߀Ysz?AЫI˯=% y@cqZsŏ"Nߠ# ǰ9hِ8eҸPg3 /|nw! ydn|{ k^q{:HqC79&C7PՆ}xg߇bvv'nߧbvy`6F88;< (m͑Y~Ѥol# V+d'V@;KR:w}'pww'FnhZk__)Q/VE" X<лQSeַWZ-wNyrG%?u?pWFpXژo;0ۃ=0]aM_(4|b3OQO>V/|h E{7EB&pzh"ɺ,],]j[ ?tOrZ ;-^I rWfanJrZ>}á~qng0egcEG>^O3vUoϻ$X#|s={Gf{0=.hX$|F_N?XG4}gc4u7n74r>i"*>\3?;zFӑSGiǥϜOo z?laaaFyޜѨ ^6f]очt~_~zʅߖQ-_._k~wD6/9q*6|oT}T~` ;ÓΌ?)2h6fEh.h$4l=fsG$tf|{f߂Tٛo0V|P{_H^FG}TOufL[4vG ~HAc3:{4e;Ghh/ M3xg>Z>=٣:TOTOM&XF)4o9Eb97d插h;$^6ƍѣg*Qл14kGF(Efqтhٚ:GVh4c2 fG\hG^h ;#Gfh;sFѻ4o; }ģzh<F4xbj@>T=dy!\cn*5`K f|yc|@;GEΏ>OBQFYGG;G9StE#Y2V/TC,CFx50-_`o\@q~ 9|Lv`q/Tڽ@^Xr@9H VP_Lp@_I\Z~n_j(rD_X?e "XgcCP>hVT ߹j.rvw c@fh7Bn]Q](S΋Ë߄8I1b*5:.9\.: (,P9pjⶭs'Ⱦs"v 6w% rH/WMU3cp5;ԃ6a7;m~"DcHbw-:m Ճu븼; uB6δ9h'd+/–RXu Ƒ~pUNVϨi~p}lـ4ڠ_2nhunހ:zZP>H|w^o^(i2.ߴ跐 9cN+pST \`ٿV8`i$9CbR:M໪+ .PDXOp틁tgu!͍IH́Rǰ籤HC0evV*⸰t 4{h0Chjm:߬A݄~1@SPڵdp~=qCc(r M}τ -00]٪<.@ၿ<&Ico1Wƞ)^QvyKpj=F mH,y뱝v}HIJ`ZGE`@Rаz`uP/r?W  m]Rt UUV* &T&j}3Aw1.LJGe66f9=:JBʝGdդ{#a*kcBxχ6̔)mV.0,O|(׊`bDN\8OSsG8hbhPOmS$!IޟJ(o 4>8~:؛1I-Cݫ -=`J^޳)(Fy1VFƪS=J1ux>ŝD6]qMn" "0俈>xVl+N>UNegX!X>tdE~#ٔ9;8J{]i߇u҇H1`ljidz>Da0>^P۵XmGMC Ca16&FZ $ goULq"z>l;Ε:J'z+i/H@Ga:Puͧ):eS q6NyGύhVnAHO AXV^XȎR.6\E`Hb7Hlrk ^`brOSpxSg'f&3q+ &iܗ $ M!|%E ,yl'B$&\@::,9gh4h m*vF0B6P_fGt\vJ"6xta#?JXҚ!{ʔ,Jan&qWkkgjx=9bVN7}c`iea^u7̠ϝl rӵ4BV# v5GY;CB $5)l`PMX 2JA -p`4  h ]i:Jn8L@1Ǵ9O gw*mk9وb7 NelQS*@@B9Gvqq[wy#X^ WÚ:sNçGQsMN KAd7OMzmjQ0Ջɷ7ؕh&ҭţsF Y0\p=7S@0l쓶w?aoua;hwjkwuYtrK\STJNQb:|&bv͆؅|P`!uB=%۩?K%&2G...postinstallpreinstallslha.namedriversbtld# # @(#) postinstall 26.1 95/10/31 # # Return codes : ${OK=0} ${FAIL=1} ${STOP=10} ${HALT=11} # Trap signals, exit and return meaningful code settrap() { trap 'exit $STOP' 1 2 3 15 } # Ignore signals unsettrap() { trap '' 1 2 3 15 } mscsi=/etc/conf/cf.d/mscsi tmp=/tmp/postbtld.$$ patch_mscsi() { unsettrap sed -e '/^auto/s/auto/slha/' $mscsi > $tmp mv $tmp $mscsi settrap return $OK } # patch scsihas file tmp1=/tmp/postbtld1.$$ scsihas=/etc/default/scsihas patch_scsihas() { unsettrap rm -f $tmp grep 'slha' $scsihas > $tmp test -s "$tmp" && return $OK echo "slha\t\t\"Symbios Logic SYM53C8xx PCI to SCSI I/O Controller Driver\"" > $tmp cat $scsihas $tmp > $tmp1 mv $tmp1 $scsihas rm $tmp settrap return $OK } #main patch_scsihas patch_mscsi # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; Symbios Logic SYM53C8xx PCI to SCSI I/O Controller Driver /slha/driver/slha /slha/driver/slha ...driverinstall...smad...Space.oSpace.cSystemMasterDriver.ocw@ÙiR.b`3ªif")6 ϗ5%wnB\2/ Q<_iN"KKGd =,='UTP Wg,1-_|X\Dnk+8W8#<ɘL5h;k}ȴRi@BkzOww?4W5u*>o7j>?7 q%BP['2ףߞ.-}QÐ?@@?2+3{jh4 54:5Si0!vi4r)I^c`[7,yULu _D'^ae:i#ident "@(#) space.c 26.1 95/07/19 " /* * Portions Copyright 1994-1995 The Santa Cruz Operation, Inc * All Rights Reserved * * Copyright 1993 Adaptec, Inc., All Rights Reserved. * * This software contains the valuable trade secrets of Adaptec. The * software is protected under copyright laws as an unpublished work of * Adaptec. Notice is for informational purposes only and does not * imply publication. The user of this software may make copies of * the software for use with parts manufactured by Adaptec or under * license from Adaptec and for no other use. * *********************************************************************/ #include "sys/types.h" #include "sys/iobuf.h" #include "sys/buf.h" #include "sys/dio.h" #include "sys/disk.h" #include "sys/fs/s5param.h" #include "sys/scsi.h" #include "sys/elog.h" #include "sys/open.h" #include "sys/devreg.h" #include "sys/param.h" #include "sys/adaptec.h" #include "config.h" #ifndef SCSI_NSMAD #define SCSI_NSMAD 2 #endif #if SCSI_NSMAD == 0 #undef SCSI_NSMAD #define SCSI_NSMAD 1 #endif #ifndef SMAD_0_SIOA #define SMAD_0_SIOA 0x340 #endif int smad_num_adapters = SCSI_NSMAD ; /* Structure area that will be used in the smad driver */ unsigned char smadinstalled[SCSI_NSMAD]; /* marked if installed */ struct dkcntlrtab smadctlrinfo[SCSI_NSMAD]; /* info. for disk setup */ SHAREG_EX smadreg[SCSI_NSMAD]; /* un-registered adapter */ /* info. for Sharegister */ /* Host Adapter Base Address * By default, Host Adapter Number 0 is set at port address 0x340. * If you want to configure Host Adapter Number 0 as 0x340 and Host * Adapter Number 1 as 0x140, you need to define the "smad_base" as: * smad_base[SCSI_NSMAD] = {0x340, 0x140}; */ paddr_t smad_base[SCSI_NSMAD] = {SMAD_0_SIOA}; /* CONFIGURABLE PARAMETERS * * How to set configuration paramters: * If you compile the way it is now, all the configuration parameters * is set to the default by the HIM. If you want to change the default, * the first number indicates whether the default should be changed. * If set to 0, the parameter will be set to the default. If set * to 1, the second number will be used to override the default. * * NOTE: The supported values that are indicated as "default" are * used for non-readable jumper hardware. For example, AHA-1510. * For readable jumper hardware like AHA-1520, default values will * not be used, but reading from jumper settings. */ /* Host Adapter SCSI ID * For non-readable jumper hardware, the driver uses 7 as default ID. * Else, information will be retrieved from reading the jumper. * For example, if you want to configure Host Adapter Number 0 as * SCSI ID 5 and Host Adapter Number 1 as default, you need to modify * the "smad_hba_id" as: * smad_hba_id[SCSI_NSMAD] = {1,5,0,0}; */ aha_change smad_hba_id[SCSI_NSMAD]; /* Interrupt Level * For non-readable jumper hardware, the driver uses 11 as default IRQ. * Else, information will be retrieved from reading the jumper. */ aha_change smad_irq[SCSI_NSMAD]; /* Parity Option * This specifies whether the host adapter will check parity * on incoming SCSI data. (parity will always generate on * outbound SCSI data) * The supported values are: * 1 parity checking is enabled (default) * 0 parity checking is disbled */ aha_change smad_parity[SCSI_NSMAD]; /* Fast SCSI Option * To enable/disable the Fast SCSI option * The supported values are: * 1 If this is set and an AIC-6360 is present, * synchronous transfers up to 10 MBytes/second * may be negotiated. * 0 If this is cleared, the AIC-6360 will accept * synchronous data transfer negotiations up to * 5 MBytes/second. */ aha_change smad_fast[SCSI_NSMAD]; /* Asynchronous Option * The supported values are: * 1 respond to synchronous negotiation attempts * by SCSI tagets (default) * 0 refuse to respond to synchronous negotiation * and operate in asynchronous mode, only */ aha_change smad_asyn[SCSI_NSMAD]; /* Synchronous Negotiation Option * The supported values are: * 0 initiate for synchronous negotiation (default) * 1 respond to synchronous negotiation * (see "smad_asyn" for running asynchronous mode) */ aha_change smad_sync_mode[SCSI_NSMAD][8]; /* Allow Disconnection * **NOTE** If Disconnection is not allowed, tag-queueing must be * turned off. Turning on Tag-queuing must also allow Disconnection! * The supported values are: * 0 allow target to disconnect (default) * 1 do not allow target to disconnect */ aha_change smad_discon[SCSI_NSMAD][8]; /* CPU Interrupt Load Weighting * Usually set to interrupt priority level of driver. */ int smad_weight = SMAD_0_IPL; /* CPU Interrupt Processor Choice * This describes which processor(s) can execute smadintr(); * DRIVER_CPU_DEFAULT smadintr() can take place on whatever * the driver default is; in this case * any CPU (ie. distribute interrupts) * 1 execute only on the base processor */ int smad_processor = DRIVER_CPU_DEFAULT; smad Y 1 5 0 11 140 15e 0 0 smad I iHh smad 0 0 1 2 -1 $8{m'nK%[d$(X*Qp@,aid6P-*js*+l'9mݳe^a;;8BVP(QUyX*"jPMg߿r*wW@8aFy,n̓L0`͌ 0h͂p)S붇\}>6$,VR~L/Qapb5$kqG'Yb$0\NM~?}V $酭{^*XMxuw[^Mv\:v\&qpT%-*N~ڂqip]a$qt7>WyB ۡ9w'JcoG6ϾxPog3{^U虥1ާÙ5௢S3Iş=dg2P'3RwݰWr7Qm>{sb xcoXWzok8(Ҏ~Q҆[]m^Smu hQ5gB 25͍_XƛM5{DÂG C=~QSh:#aIA-5b3.8A&6$dul:f m"魺riXJ1U:|;i@ml67pxL0rc еUq+=~;τtyB `4d,,ß= NJ9(\3ThP _I*!ǰ ɾWaA9YzSpQ0-wzpFqD$ Na_jCVrRCT|zx,␁ =Nt |Nd!0E|O:sCrcZӞ@s:GIxD ; 6/cKumYf32IX;(x<3qO%(0 K$$~4)m%Zs+9&7ԕ~%/pqSإv^/GolV$;HĴRfu6['-ZNCT+)g޿| R4E{Á9G;hz}FCF͉Q oq86絯HD|3;5gdfl@hq/R :ME"ش^L;qP:x84%)9I3k:HO)Eq`>ܠeQN<m*X sY>If ġV.Rg0 p0;eyF%i}ɧZFՈkvJvu!^<pmA0.ŊPo-%YЪ6J\Q-0ľO J 0p`zޏDeʻx1^5ea`%`(u b6 6UL= W_N+1l> f߂FpGH7m٠(4:ci&.2M$PV(wx:PeI8}H:JXgγwŬt]FHKq0ut]E-Q[bcv* 3C6=z1V+ rȭUp̓IeUvF~4rgI -R۬I^` 0E'Pxd'^(R~o 58["T|Fmlհ/l}3^cE` i6f/'"@ }WvPu5u=tqAyqd{5IrX`D4O'#uB ?9\6MIk-[dN4n(٧o=X|Z#Xk`}'4@Yl _lm1H xlmv,R98v 7:C(`$u*nͪNMsMA&fp[;Rze+5𒬜ejc%n? iq}c%KA;27sXę9.$KQlN7?>4N*,cī0)9{\b70NxL?|Դù|;%Im${?Tox7dWAx5POEV (zNl&$cWzE3Y9Ps@qR*.vg=DR'uBYzLz+\Xڮ'nDG8h Į\J̭lE} 51s[3&B$Q$'x ;@{눳R0O)oꕺ&'?] ` [ꍻbޘI ׸i8V#ZPcX1;}9 ayf ^ذO.rsŤ9$/^3ǰ EX[ }4yh|0"J%vO_R\dŁh:ǒ,{a/˄TY- pKg5d*z$J% z;uM.ăNWo3D=|3daͯBۓ{$R ɽ [);L 5e2t +͖MDm(S;b0W;Ƃ[18@ː ?N 1qL\n}&G͊< <nZ߯RTEDmĎv$/Shg X*>7 Gٍ+QkqW¼'eqY:ZV)im"cpd!?jKXB)s[xGw^ϱ $<@揞 gB:[u:Tn0IvuRNqJB wPyco(u-eڇ .81%hR?pb,SC@.r8 7YZw.^.D J=Iڙ"jde#b˅ ؈0R*CN]\' 38XE.!?.*hڲ-lTB]$ckHkWݝ sa#04bh"hoD+ xT=I hžåd$֓׺$s(h`m@$ +X 0QO'#- W zA ЛK xX!a0<~[l$*?)E\ς/h6Ţ{ !!\G{*j/'qA 6Թ X Ielg ߕvR|oEf3_/% >F?7PP(r=TCԵP)oRGTd:KXm"0-B)6[_-+ےAVvO "b#qfˢBR)ݴo8U#cM^.32FTL"nЄp%R] F X);c`#Q뀹3)1=q s p4@~z-]!bh0 f_r쟷 `p_y#fDMJ5Frלt2ey!4UB߁d Qds8|.t Sk{$G!&=1(0dR812^^U؋'zLL`-Eb$DL]rYţag)IRsU3 2H7mPkؘ$'B3 b 2<&g#z(qW6,5ٮy܀s=Bco$G5(i\6c\E:gitm|G ~]DU  Ŀ\-MU)KI%vB:h_EZ5;u}]bڶ5˫Ihhobfd4&I3 p,pQ ;".K c 1'ڀEuOS+:8.M uZb}wPp`{- Oo Aq1mX[(:-wrJ65,濿L2| x/ؓi=P8ŕY("X"?a8^:ۧ{9gsw3Gޢjpy~P+7SjmAy(XYG?G}UILlYsL yi{eza#k;XNhQ_lL'BQ@h GgutBNL;Q|qqe8tѧF' ` 9ܱB&~#A6ok0I2u2a$][Ӝ%F?,2&X~iI'pZ`e4H_;(QFj\>Xx&'x&F{zP?DsYe~{$V7P>[BΣiejnĈd}eAl>tt岿*A>dtP>{iX$ ֌r3kIDs;%S;}*pH7!F7|l&L) R{`T=E,|faj$N)/E3wOCBlUS+aS@ʞRW<80!MN ?&$N[GL=LH0k"} ՞" <>:{>NCNM4NhԶE7_! oWcf{"T,B (%˫6!؁D'ƿ\X}?_4ؚ ^R?R|Iy%N.ENh4~Td~ cx4 p# Io?N3aϗRqi$<[&sZv=Q/bm{n:.bzЪ\хq))5\@Um_%0VcϚH˞z_ #]1}~~C0_#dAU1%159ԗ7]lT3ށ>,ms^<<Ac59'l;/9x4 p<__r<q;a967}lVnʚ2ϖ~8f!q_c+]N$h-mr}79W+ԛF+f|K1@C- `P&w˃! ^^*/J.xWkW3j} yIk}81<|kg/ݚw 49E"fx;G#a15Pܮl>o^Ot l!E$N~٧]pXN fGDRp|SryIv'-q/!-0vbQ Nb7ZhFq !s}N0Cp:h~:,Z97i&dĴKF *?T/:gV@T#HVi =OA.n*]Q{QN}Inx:mX;亭No=L" !L   = 1N;zuMylGwhzOK6 bɒGSFlj欓Db'R3ŧ;tLTĤmH},˸M J8 !&cb0 ާ1ԤOfpD Yo`]|zQBv0Tb*tNGf' ev^R엷`kt']5?26l+.٣x?L氲mGU0?`8L' w_[ptk˅AGoB .;O$[}Eu6^N5K1|O[p#wuyQKv _G̅M7pp#G= %.K4Ms ko3&~G0:m2S gwû| xg}0*BR{# zXAӦ/+֫Ba|pg7UܸokHEiJ mLg6G 4n@~}Mi?^^~~M~]CB6'_z),-* @"N2@zt69< MّJ›Ak~# Cߑ(gK))ݘK(kNEGyjrCuVWY.P6yhRϩ6E` .DT(el鈁w rq?S[w]CZu~'n| m"e~谍s!@<s+F (+ b1U_*89D1&|4Ѧ*Un91|\uH_P ]r>gN N0gQ4.VPzE K.51i#7݈>Ŏ[QfP eݚe'ku3aa1̅Ԧ]7IH X*˺mo- 'XHqAŌAfXYn6~7ap44@(ymm |31@p'x㙽x~=XGYXD;\Dq,1hdCIz-_V#dMYn7zon:yl> tb|{2oX ,B!جH(/ú.ڎU)^IYggJ)唥b&кVN,DqAu3ҙ+Xg^0e7˫ S ji 5P DkK2@5z ȞZ%ÜHZ $<'(+t Ei0QNtԲh6(F 0 66Hݐrl_iz)~8-فTڍʌ 7>|%NO &edhSH׃53LTX GXf_OgXcMD`Wym]#I3@(mɄ.3?JD?POF$NIST)q)n̷4;#/Pټ7`ׅޮ$Op$}Obob}eږ\۵= YVRm&C纲$\أ `~~zK0h79 +Һjn[}kt5>'ZgD|bk8_2OMn$m6*4WR-!zk$rA󿩄I]mU ˹:fxOǧK.XB?btZ a0l36m⑉QP=̘. VO&Py6q'45afP{J'fu>?Ot4Jk$Vjex2e6*:XY#*.^;fu*7#+U9ߐ1KeE̤uG7NGX0s9#Rl8ڡ ln zv3БY@e$;vFTU 0".*ކyvF"o j[Htnm}8j6mM!xޔP5#<(`dH_W;0WG66J$̗#ZHu)i30ʞdKcW $ Pg.a}?!@M@1 ~|:wJ%Nu0ժfhD@?Fu0* 2fLWvd̐;08?ɐ1m l Cx1˻x)fa} M䧴?%GmQ4Ut$v76<{`htF)'mPrnc}I7#:""l4䃢oU mLIi6Lf<7L-e_a(Y;QHTsH>jI\]^_`aE +{yt_X%Y.'/s O#t;?hoqgnS'/&v|d^T#qS90+L1)BU|chH9a t7Kv[o#2KKlp76W!nBn^H"fP7cvv۹32'29tOaE712*ox'^paF|O εL\m*B<Ɂ"!p~\cVv@f>8{_' _Ҭj 9`SA3C L's?3n-D j@>ѓNc>MD'dh$jV)S$&vԞ%^B(4lU 9xJiqq8u͕a3>O.ZHgteGì1 RAZQK"Z0[ ?e @7-Ju;[\LOݷl`YD41'CF}̳,Y.ʎfFȂٯb/q}ԁm'%GIǩ j>^#<\* *  >T"LZq/1]er%)j,2RݞX;9^{Io3E%Q>mKfa&0iJ9ņ%7Ad1 788ܺ;u`C v*Ja>ދ=b[~[j\PrV̝0aS b-{At8{B7L{ NQY K=^P{Xp,`3& pckX|9-uƳ&4?~oo7krS!e\Wנ{ ˳=UqYk\}p q;u6ZW.쬵C@~R!]=]vc\Zp:}I5;*+$5juZ,޳]]Wj6utlZb.w_՟PөX9-Srʻ(бȏ[7S.kV'Bݠp e69<>Sx`@RVu_^uΌ3:pf萮Bίb f0j6S ºbSMAZWZ>klC/A9uyuzfs[eW9T`:7CcBWիd[A4bFTmSeO͹Xv1; /: 'ߎ=yBF;Ra]j.nUh5zrv[X9eYհasA}qqegZTdz(+k7xQԗ=ѭ{ .L(ȬfJ+^%F :-FmZϖQfs5v>OrFaݭG<ܦQJz0^YJv aG+~-g 6󂎬EVMk>reգӭGZaj=jjT >TtG*5^؅arֳB.MS=&j^MSY%:(֣yQZR>/}*%U%U%Uk?`(bʪ(偋LyY+ghF\e}Z}bپk?o-KfY*gzױ֣( YYeleeBM Qؕ렢yGZE%>|eµ<(`VvFMLM.k=QJ-{-GZj>RxQMj#4n\(ik<0FaT%ZϳZl QVaPQ+Q*gZUhګ%UgTQУ*=ҵu!G,?5.]nZ6W#FS6T)նTy-l?ح{ ?DP-w^ޭg0cIFX %H0I!$@$$UT>I:Ν{ (kvȷ)R#hmʚU\m +kBJ}U_=;䜒K̀R~ dV{@ȭ̊w(~l$$hrjp&~:VRfx;?8MJ=?8FUCP> {=rvź yy`yae4{`2@@~?,'WL%xLdȟ$6uETXO>0X~w fVG9T3+j;ڎ@qHCӛQTBl*;JOM*P?8.iC,=-G|@ l\\ X =@߁>H0ͭ@u9b''ή볦D|b?IP- '::zցv{1䁣0t7O >Pb֏ׁ@>hO_U7Xw&K6*@[˿~tw 㪏6`{p=RĪ]$?՞Msk`k@֐U"~'EZgЪyA<7|m վP@$xy@yr}ikjò^;Vy>BCQbXw;h:9:p=Э@|`>YBPwFPׁ@@^lfh?`H'l$C,>dvw"Cל g^oҪx9M)~K\HP v-/gP>05gȟmfJ:$?fӨsZsa|zCsBBJPU |0;?RI $^R'@~06֪گ&H[AhvٓP#.U6M6Uߧ̤O-^$Zp} wt"SE߉{ô>iKT ]qX-?KQSouj?+ݱ3Bk^gb<…C;nz3;pA(aBJqA6 yb6w,t*Hиl{y䃧]G96"S;F #?/#Ħ8v+:?T iNG"3+^r-iWuF;m=YQI^.jjvkz";HA1GC=Ӷi_;cAFx(;8pbg`F?Tħö?XFDy71bB6ۈ.Z~^zt9 L_}'OCN9(";b#'#";QNRA0AǑ{~ܡ!-J+p/C>wy tGEC(ak]σgW9D^O+CE!Ǖϕbr2NݿLt%ZCg3OGNF+aƕqǸN`݄ Pfr6<11iСұ"ʗС;؇wuO.z?,h(&$.}W<1Ȝ6Kq96B1¡Ov(׽\Mξ8#Ȍv ݴ! YjK!ιeʐMz[n4Ė0/xyZrc3&2afh{= Mrq KN˝vĊɮbdxٳ1UrTļk˿K Vn8bQ-LjKK\ܸ[ I\ȢWq&4lJh`qؑ/=tIM9y.L2y,?ޞqMZe\W1b$m-'sn ˀW:QM3<"[tl?oV)&-bv4N͍c\\B-;f;#!&15IzLrb{B$w"L|ˉ@WPW1tJ|JݩW1~hOUeRh=m$’䧰Y6<'nkoE_ nGײ:|Lͣ?U%/&eFZ]4{`l4ɂGa@Iew=0f"`L$h̷6)(skjf 7tivuC5TqܛK`oe%ޜ4+&JZTVd8q&8DEL=7 ǼwIwK֡ŗ2b=N.Tb zp5*Zp vuP_ w mbǡ...postinstallpreinstallsmad.namebtlddrivers# # @(#) postinstall 26.1 95/07/19 # # Return codes : ${OK=0} ${FAIL=1} ${STOP=10} ${HALT=11} # Trap signals, exit and return meaningful code settrap() { trap 'exit $STOP' 1 2 3 15 } # Ignore signals unsettrap() { trap '' 1 2 3 15 } mscsi=/etc/conf/cf.d/mscsi tmp=/tmp/postbtld.$$ patch_mscsi() { unsettrap sed -e '/^auto/s/auto/smad/' $mscsi > $tmp mv $tmp $mscsi settrap return $OK } # patch scsihas file tmp1=/tmp/postbtld1.$$ scsihas=/etc/default/scsihas patch_scsihas() { unsettrap rm -f $tmp grep 'smad' $scsihas > $tmp test -s "$tmp" && return $OK echo "smad\t\t\"Adaptec AIC-6x60 Chipset\"" > $tmp cat $scsihas $tmp > $tmp1 mv $tmp1 $scsihas rm $tmp settrap return $OK } #main patch_scsihas patch_mscsi # # Move the files to *.Z, then uncompress them # # for fname in `/ibin/find ${pkgpath}/driver -name "*.o"` do /ibin/mv -f $fname ${fname}.Z done # # /ibin/find ${pkgpath}/driver -name '*.Z' -exec /ibin/uncompress {} \; Adaptec AIC-6x60 chipset Host Adapter Driver /smad/driver/smad /smad/driver/smad ...driverinstall...wd...Space.oSpace.cDevice.datSystemMasterDriver.o