From 9c418678f607fb13230b09703d9453c369fc719f Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Sat, 22 Apr 2017 12:53:48 +0200 Subject: [PATCH] Add files --- binary/Linux/lsiutil.x86_64 | Bin 0 -> 500997 bytes binary/Solaris/lsiutil.i386 | Bin 0 -> 489584 bytes binary/Solaris/lsiutil.sparc | Bin 0 -> 541736 bytes binary/dos/lsiutil.exe | Bin 0 -> 569715 bytes binary/efi/lsiutil.efi | Bin 0 -> 642560 bytes binary/efi/lsiutil32.efi | Bin 0 -> 384992 bytes binary/efi/lsiutil64.efi | Bin 0 -> 913920 bytes binary/windows/LSIUtil.exe | Bin 0 -> 402944 bytes binary/windows/LSIUtil_amd64.exe | Bin 0 -> 641024 bytes binary/windows/LSIUtil_ia64.exe | Bin 0 -> 888832 bytes changes.txt | 861 + source/Makefile_Linux | 3 + source/Makefile_Solaris | 3 + source/Makefile_Windows | 2 + source/getopt.c | 108 + source/helper.c | 1241 + source/inc/ata.h | 869 + source/inc/devioctl.h | 145 + source/inc/dmi_ioctl.h | 443 + source/inc/getopt.h | 32 + source/inc/helper.h | 146 + source/inc/mpt2sas_ctl.h | 398 + source/inc/mptctl.h | 567 + source/inc/mptsas_ioctl.h | 260 + source/inc/ntddscsi.h | 313 + source/inc/sas.h | 1886 ++ source/inc/sym_dmi.h | 268 + source/lsi/mpi.h | 800 + source/lsi/mpi2.h | 1200 + source/lsi/mpi2_cnfg.h | 3071 ++ source/lsi/mpi2_hbd.h | 118 + source/lsi/mpi2_history.txt | 460 + source/lsi/mpi2_init.h | 571 + source/lsi/mpi2_ioc.h | 1721 ++ source/lsi/mpi2_ra.h | 85 + source/lsi/mpi2_raid.h | 303 + source/lsi/mpi2_sas.h | 297 + source/lsi/mpi2_targ.h | 560 + source/lsi/mpi2_tool.h | 438 + source/lsi/mpi2_type.h | 92 + source/lsi/mpi_cnfg.h | 3129 +++ source/lsi/mpi_fc.h | 366 + source/lsi/mpi_init.h | 580 + source/lsi/mpi_ioc.h | 1206 + source/lsi/mpi_raid.h | 259 + source/lsi/mpi_sas.h | 278 + source/lsi/mpi_tool.h | 407 + source/lsi/mpi_type.h | 94 + source/lsiutil.c | 43217 +++++++++++++++++++++++++++++ source/mpt.c | 2680 ++ 50 files changed, 69477 insertions(+) create mode 100644 binary/Linux/lsiutil.x86_64 create mode 100644 binary/Solaris/lsiutil.i386 create mode 100644 binary/Solaris/lsiutil.sparc create mode 100644 binary/dos/lsiutil.exe create mode 100644 binary/efi/lsiutil.efi create mode 100644 binary/efi/lsiutil32.efi create mode 100644 binary/efi/lsiutil64.efi create mode 100644 binary/windows/LSIUtil.exe create mode 100644 binary/windows/LSIUtil_amd64.exe create mode 100644 binary/windows/LSIUtil_ia64.exe create mode 100644 changes.txt create mode 100755 source/Makefile_Linux create mode 100755 source/Makefile_Solaris create mode 100755 source/Makefile_Windows create mode 100755 source/getopt.c create mode 100755 source/helper.c create mode 100755 source/inc/ata.h create mode 100755 source/inc/devioctl.h create mode 100755 source/inc/dmi_ioctl.h create mode 100755 source/inc/getopt.h create mode 100755 source/inc/helper.h create mode 100755 source/inc/mpt2sas_ctl.h create mode 100755 source/inc/mptctl.h create mode 100755 source/inc/mptsas_ioctl.h create mode 100755 source/inc/ntddscsi.h create mode 100755 source/inc/sas.h create mode 100755 source/inc/sym_dmi.h create mode 100755 source/lsi/mpi.h create mode 100755 source/lsi/mpi2.h create mode 100755 source/lsi/mpi2_cnfg.h create mode 100755 source/lsi/mpi2_hbd.h create mode 100755 source/lsi/mpi2_history.txt create mode 100755 source/lsi/mpi2_init.h create mode 100755 source/lsi/mpi2_ioc.h create mode 100755 source/lsi/mpi2_ra.h create mode 100755 source/lsi/mpi2_raid.h create mode 100755 source/lsi/mpi2_sas.h create mode 100755 source/lsi/mpi2_targ.h create mode 100755 source/lsi/mpi2_tool.h create mode 100755 source/lsi/mpi2_type.h create mode 100755 source/lsi/mpi_cnfg.h create mode 100755 source/lsi/mpi_fc.h create mode 100755 source/lsi/mpi_init.h create mode 100755 source/lsi/mpi_ioc.h create mode 100755 source/lsi/mpi_raid.h create mode 100755 source/lsi/mpi_sas.h create mode 100755 source/lsi/mpi_tool.h create mode 100755 source/lsi/mpi_type.h create mode 100755 source/lsiutil.c create mode 100755 source/mpt.c diff --git a/binary/Linux/lsiutil.x86_64 b/binary/Linux/lsiutil.x86_64 new file mode 100644 index 0000000000000000000000000000000000000000..40225a033214453f12775dad955f5a5f696c9099 GIT binary patch literal 500997 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Πv&=8O#lJueb~=Y{6Wi$a>K4SvA$2mlb{IEg0=fk{jDI{Bw)`kEDb`s$ z{ZyyREk&WeeVu4L7KQgTXELVD#*Dd8Mru0)sW^83T=YSq!FP}&u`kVJu@y1vO>D?M z#!t~y`1A_#G+U8X6FxLC(-HPB6)c=CM8=Co-=m{mhAx@w>=9^M)gtknCe!pV{Js z!SR=B%lm2itHvn{K|p>0FnD7=Ech-16RB&{fdS39tKi0j8%!pp8$x26dctXli(>;d zfbWBN?1V0UAKvv(tKWeKz7_C61xa58cU`}WypHMv4$M-`>jM}tg#iQ1fWEldYXO0| z1ZJ5)%r%zHAdm}A>xP>^V7IIYSq+6obj&)(K@_>Y<>2sr2QVE;UpE4gqOkPu20oeK zqnQ898Uk##&h9?jf*sh@xwB!#W3x_2R~Mv zfZE%EiTBduf~53LO0Y&1$&EgCvIteEY7jXC=KU9`VG_rwuB8+vqfIe8L@KYrdv@cbM2sGtV__8GHF?ZB2gI!n!lQ<7Jq1n%6vs~Bxok9rY_^UO zTRsT(dcYil(?Acd4)DIe>@a5*IdP0~OpFEsN{j;5+<6o*8Uu{-&`+UE zTY6%`axXK$gk=?6PFNli7dJPE`-GSwbHdULKPD_&;mCn6hI53#)UMok5$iIdoMuA! zu;A#go2==_{HK1XjvhZm4K{ zi!mVBj!RTOk~l?Yjc{}@67HVGe42#a|BzL+0<;vXHV1d7s%zOUWQ;sh0>NiWASQ{} zQ|eSE!IXM@S)n7tpI%m&)Cc-W?H(x$Gi{I~56jf2BPh8441X$~YM^hh{Tl>8*Wi;S zdg_YCG2i*iaATp(M_d*+xuHaFPe39Aa7LbOA`y_Q{L=Lx<$yT`RpR1_v0?4LvfzO; zmMk!3GKBj}yR-&}_vkN_yrUq-HwI3Imzg>6#SM7-?cJCh7zKSMdQO{UMuB5yc&Z6V zivfn20H!u$bk$(0H?2m~s&ae5yct|>2??E-4@!clwQSQ+|CV>slKaW973-@t zVuT*=uEu5d{BJcd4&CaWk4C|T8Z;`Wv3LhEYMhT=V#<-dSIU`c+yf^I7PA^FVnJ^r z2ykLIC=0&>r*aikqP=y!LfGVDzsnR~H8&!T8qsnFkSyXw*rpn*>!aai1 zL1SR#X>20I`o5!a2a=FQe*zcA=c0!X0vf*3uP2qhC&z%aaQr-M8X+)lfc-ENQVo3z zVnz$k9fYrXu%pi6TxI@Dk~Z*~50ueh@o5(PoS?E^P%(xgeWQ0ik+UF|AQA76N1ObX zioXYxWgr>UxCVi^8i00`d!%GsJp$2;i@&V(8&oYvE5KI(@j*dehMpDw%#Tug0b&yA zmzmTihK<&)M0(uJa%i}E0){@aH;MBWfH>Tb+OBvH$TS^93L}>>spo+P&jIRVJq8eE z^ZtlQr5}-U%t+I5I}?@&v5K_Q$Y44qx?K{@0^xQwY9siK#7>j%zqx`r?^(-lRR{#z zI2JBA%!nfy$N{sX$0rqhtcAwm{F4=MSg>SV+5%4@?$TD&q84jMm5<|OHR6)jMjDuD+SBYzlPpIyr@Uz*^WL#FQiGc8oL6h_Y zRE{2Ce4c*UEv2Ijv!Y*K&W_{?oS}v$=A3KV2n0rAOyFojp2^pf;A3+7@^tx3lmhgk zi@N1|JU?J)=ldJUH(9BLj)*IwVtFgI7Xxsl{QrhpM6r^#$9Rx$V0m0%#F}x0R*4Em zXt**$i;EFjT#V4-VuXgv5gJb7E>iVJS`GrRYMg_m0`rP2Xd7ZI#Fcg28p}Jd7D7y- zt#H|p7vDmdl0%mDfERiFL^jo%+{SV+Osu}oqP}dnyTvuzirZ3Z<0&AEx*>({>(9XZ zlaO!HRJR~1&!@7rUSWR^Yhc9ZAdavf73U2%iNgMj z8=YF(v+y>iWmiVu?MI>F@MPm4sj9cBeP1(=p2-HB+W6y-Hch6T011WV{GpXYRZ#TG z#>prKO=uSKhs)5S#kieA-Sfx)@eq+5Nx?pMGJhOcbMV4F$BTE zjaN3#NX+JPWYb6mJ(lqsz+T^s8_w|!ikxNFMP`dsp?)z(+;Y>aQFCDz$sR zL8pEbuQ&$XxFiw(`;fdV{>LWZ?^-rL@(U#MVSPIh`?GB9hjquEY^r^C?1#m$e+w+r z4g26%IZEyM=%>(cB3w8k_SK2lzm4L%V$b#v>h}pAaxI%1UCPeXmGnQKVUd0oUO;-y zBt7m~`ku(oLg}U^brLZL4}GqZ>Vo$a;LRK}FjtZ$hY(F5;gY2jPJ;0{Zz zfz}(>XjrGk=ADDMc?24FW^BjQ+8@R8NfR|ExKMLuB+vUc23AlCF zzIwn-CI(%xdu5N*E}$uEeC~5ZWkp4DQBFLtqs_2M*> z58~CD%W9QlsiDHWK_9iTNj$qtHO3fK7@Phb5@%SLr301h7NZYlPWDVP$m{gG*e>v! zK257IWSC;8AcUR#_L%o%dUHnFp~ulXE9On7cU8>$^({;r^L_%ax}K-{Rk49k*XEma zgglK?om%cpe8xoPrL?BSo)7d$5Gxy!FC98tM$^j+ZN2|j$dg-rLz=?q_9n`|0E~C? zhGGyuAo?f450abiios?9_9O-!$P7b&{iXI=!=v22#iP{kZMruW>0Csjod!PSv?Ex! z9y`De{{ZZp-4}~76fqLMnA8v6$VuqgO((@Z&$U;FH)oVhvk&Q=8}sgc%txpvw|=&g%+?}OK(Xs@&!^sz-tPNPj)Dr>MC&;v0iA-nFxEC8%4F-H-H2Vw-s zf>*{9{S%P!o8Sk|1o|DSv*?!*Xb%=Hz2k8Dy^a_O^m_{4$Z4RTbQkoF#1G|gfjkHO zL|vO@GLAWa=4mmJa>l5Sq^|z6oBkZbuL3zLYo6>tB;!(yT>KP#Yb^992o_h}s z-qo}{M&I#F3s_2%W3=4_xfU$7DK7@gv|xRjX2oC*z&OEZS{VaS2HQdyN*&mgak5?N;}&dClP3oIt(7*jsXPX|#fmqiX;ln%JzzFDbH2m${a#Q4 zd)P)fHe93^@|xLDaXw~g$A|8&V`wO#HN6TV8pqmsM|df5A!k8KEmaD2tq&0?Q8N-& zIjCK7q*=Dx%6c%fhTI?FP%w$=M3#k|%J|O}X9*S}@xv_d2kSZ{3^@mmjSgFvK8-P< zq521`J3-!|Vfj33Bl-HcZDmC1P<+qV5(&Zi@kau1z*1rd0JgNd2y_h+ zySby5oT)dfo$f77%bDdVm{vw}n^yAugrE8&OYM4s*0 zAfx&t;sAc;=ql{Vo*rjUPdD~7c715^CXaCNBM$h~#B{B3_5We+?c<{=uK)4fWCIHX zZ@_>-qO7`TP}GR1i3Z8SMmHL0R8T}vlm}7KM%`6VAc>o3w#x!qYH8J0Tdh>FrLBd4 znw#(xd}zgoYJ5g)<*thov4)61e((3py|Z_-0qy7Y{o}{$MfTpg=bV{2bLPyMnKNfl zn}D@!{QwGz*~t_r(P`L<#a&Ih<20+U_Cjr5Kn2kz@YIm2ITJX@$U&}`D9#?^9+^+j z^mV-qb@k$E_TWFsrGix%p)IRi!J)_@A8N!Cc~37=IXoGLMEt?_sYZQ@@KaQIkAF_Vz@!7sQDgZ4&xV9lC? zy(sR1P6H=qMB;j*lB{3fhw@`W>)L8JmTG zQ)0sdfqS~k*x>(|O+nQF0h`3)T)oN}ybiny(Bm3AzCrIylw5F#JU|u518|5B)9@fF zaV;LKN>qSDoSj#aM}FOXy2Yb@tjulT5kG=AB4&gjg?vdo&mt~ZPU6^)#APWUXkJfP zp;sz$FV=wEFp#r`uPPN;R83Df4ZyxzkHZaizZ}Lus97PPVk{G}x?!z9eXYrvRe-7g za?bMLHTp`G@pxn`9OC`aa2r_{eVc!OzMX&n_8R_{$9%X62F1t2$N-8zAy%HR?@$z+ zpdex_#%Xt1v;>u?pz?E43B>Mn^-L-642!4hs!d9Xnb;gY*H+5M@P*UCoIq?MZqm4N zB<}6b*DDp~B853Z48-NJz{v7gWj=GA5GyUwYZU0^7ASlPl+sm`6YQv9#|R7P-JNcc z*4+`;^r(cF()e72$l}f08R6y(_&}EGZ>WB|b1{qlzdGKE{YvO?DB@3yMGt~Rcyp!j zd#K$#7X|=|X>6!48}@G45rJ5px0D~G+b3K?@xoWGoM0QZG*7$&%5!)qc(#wn*Q29Z z%{Rg0tj_Dh8{(Vz@q@{-h(}g|=i8ltoXAA3htGiZc=Q{5hC~?G$XC535#-4o{t>lf7kM%W5K1MAxUi8yq}aGj zxSy48#1%EgZPovX^C%(WnlYOp0gOSCl9faCbm1JLx2dw;Pl{&#i-Spw^t`A2P~M4i z(veR2L8RV-Q?Oy!))-|en%0dOmY5!Wi7BSM-sJzWm=3wIyO?5;Sc$3A5>xEK{3tQq z?-a5r#1u8Mi|LP$O(AzbQZ|2!*@V#2hn3A=PE420hwu3z+3YvjvP5qNtR)*iESn{S z{(m5wjx#M~{>6f1{zsP0W|p|yTR$F@g!7m@mWZ97cLnC^jjF2og*>PAhhf?AoD_YtZ;pZarg7LBxGJ7sdGwy*|rlz6jVhUky8i~)rk^1KO z*d~X$vVntOq}90IhXx$Om(Wmd3*~G$7gU;iU96PB^t&vVoY^m z2P@{vKufwJ#)$3sH7mjK-B=*#m0N{0c;q9VRXu&6L;JFBs9af3=l%+T0AgMr%$wGOvku|m%&68c zhd=$gwgn3r@YcXTc)8=c#7jTL3;Qu#B3)F z4__XuT@DhwWgK>RA<5y_!(U8%3VHqUSsU@^Y$rm>8+n-gjOGJx#yf`(ye#kBh6?X_ zW~6$*x5x}r@AnpqCqkUhyVEYGN;jAw1)$nG#sqcAaJRWY&Q+(i7c zWgM-(JpQ00GsPX#*Uv#QXJtb_OyV8CSWUsZnnnm+i78#7HHY97M9v}BzB%mCi!c`W?2rjzrIEx{Q^j+N4Dduu4btN04a3f6bw5yNlQxq z4L}i6VEN8l3Mz?j_<)RxLg6NR?WtDz;vXOjEHq{73)T40A0H(?8-WVz5C+2TBzFDO z()=qe5)Ug9ui&F3L7^gv7fcfNzWAg?A~8i2VU5E7nZh4!;@{f?{w#%`C-7fU_?Pet zMJcHojg(W>1zYBj|>AcMo{?E4)o6p2#I7zp*{wO;mVM6R%%de!Y9Z8?5lIF!6-- zl#<`;rRnwi_*Sca^rj+TxRaI2mtXdP_Xmad8Q_W6KMn7?9`J5cc#Kz(Y(esWvI%dO zvI{Nv#9|JX;TN_64Yvh{w;c_`!5qXbN&jlBtl%ZKar_{h+C>8<#)P*GNXOY=;@HRj zmlaMQUu2{_pF?B0`ymV4p0!-zhw7&@-f9%lD1!orG->tspyhGy)bFK*I902A3SY(3 zFvr~iJXC6R56Ps;yYui~7`y|2N6CBHmhj8+#0;cdiS@yG_??2^S@@lV^MqCMKC8r} zIb#ZXA-zKW-kpQ**Ww-C!zcF&U6L3*XUsT$zk1G?i}-uloH3>N4HcUBJ|B;2UFg&C zcdSo1t0cx+X(&I_U=k-z)3+;)_xoEc(RmWH5&=BMrze5U0S+#JyNucn&Q!!ui1T9R zsON@5>w4QzC?J3LUnEk?+Rk6R3;9)0w1W)8d+{c%?o^b8zFa5bS6llwHG8Kj za{JBLuo9{TXIzuCPVdBi#Yhu6aF#V%Y!uKkTN`v2icNt>e?f#^apwRIQ{shrtyI`` zJ!7}nu)Fc2^IO!i9fa)ldgvP@Qb})^j6XP(N_H+{B3^C$cmc>_d=_g>k@rnVH=HGxE3$+$OQiJIg~29Ucf1WWq(1#AK6GQiJ~nfA20XaeVt{ZS zkPKMJL}X=Szy=`qz<}OJ{xJ*~0r^3dOD_vm<7eFEq51gnUmdz#_l&Xx;xBVenG>tV z+FI9T4Pq*fg~R=&p*=R`#_nFKdq`H4>Y2W(0JBx8Yz3%P zrLsX@kY1_<$i`l(f1uu0sRpA|meCL|!wY8s+YcY!2p(%<8i2F#xYg)&TDiH#+2~^; z12HTN1>ekJVT`vI77oUo*h{PD(1BBL+S1M7K_K#xkZ5jo;ObovU(6no)PFoOr`WD*Uw)K6Fg7x~M6bPgARI zq!xdHB9P3kK@p(qM{cUs!Cd`7>Tymm(ZcL`_Q?zR?1!fR7b!%b5=!B7P>4w>{0hyH zE``s5NoDmN%eAEsv$>QQ;(VMbhWnKmE;u)x-3>D>c2lr$(n3MsuAq}*I8{N<0JJ54 zoMn>JLjJ~_0}aT%-!i)2a-YUm{IMy9-vF=&G5i!L-Nm5&2CG~hCUv<2#3p%H!iRE` z)fHmcQ9U$qtxX13D;mP(#U^;aP&p>+wpc;eAxE095QfxhRKL)(V0lb(cEx_CMJ{m| z!Aguij9`6xy;=1iC0M>I)j3+sbHC9uuCz8Uo&%jg>=u{Jk+(eZ9~_y-Ke#Cmq@P}v zis(@dXl-rCq4!rw^N?gbJCf-WU^2ZCh$66CrL#2D2W~%GT`o_e7akh2U37T#>$|VD zay}b~6_JG2bhduI@|`=L#i2-G$si|CyeYK9=EN7LOIB4at42i<^=SE9UPerZO6 z5-V^=(CFCQ6*HqEsVCj~LiQM;43n#;Kcy&}sG0Lc7C&@ZP7@KZr+tpkm;> z8Qj*#C$u_M7AH?so&3$?FFcfb*TI721yA^m&`^SDiR6oUObfqPIb*pwSUt&)w1;<8 z)2A#Cf3zjX12SynaCmuOAfA^eMq}2JAKsK1nE63@EPogdcAm5~6Mh3f$;9GazJ9VQ z)jQXLRShS_*)PPWbJV97@QLO>XfO2U<9zH2JeJ3Pnh9#RX4EWlTplXY)|NR-t_mSu z!dH5!!mI^mqO#;l9%-Kp$MdiB3F_NyejDwJO=sBxv1!M_FH{r`V&Mch_**7Wu2U$Z zWEn4x1<%R!7YDuhi~E<)M9{8zS()*wE|mWQqy@2@)uB&OHrqk?SdhbDha(|8ne>(F z;||+L^v(Qmb7uTu0D|3-Z^EDTCV%ILJLiYyM&8$x9Qh;A;7F81qd(}`z#r)49DSQ2 z{D6%x+m*Rv8R>l8bGBtn&guaq0k0&zQi1R+lU4TEc&8HrV`Y1H-@wXpXKVa*&N3H5 za6*Gb5o#2&3&@Gy_?C+@QuTXyc*Sj;0P7{8>9;GkelQ)TCkselts*=G;Hy=NUmh4@ zRi{hXpca`xfRwB7yf>jx@gCgwM^<1~W;$WmV>rcmbgbiT@%yY}w zMTc&W-kaMrpki9HKr!l1LD6uFt@Ytn>%%;Jfam8tvCK#-y)<-&_3SGMooGFeJ1I1n z=s2RpjY}ub3-l;)Uo8iLSrU?C#gr@lrXGvZa7aT#99Qnd2B659xXm0#(mLVA=f@VvNN zF1kXTTrGYlG(dku)%opfP?`mLkt*IMCg8ZT2bes)){I|U4%A)D;XIi`=t3To=IV^L zZiV+1{LU%f9?I3$wd;RVc~p_)AZ^{7Os-NnU5(_V^Hh~B6S>p*iScHWs79#Vxcy}4 z?I;%WSBRtF0v7QzI{X(oOM^$rhzri}cR8Ui5?SHzG8aRfo)?h%tEw3Bsibkm6uQ^q zy3;!=^&RTlKk$u?u1IWGiH$@+T{}!uwM6=2S&msYm#iPy3;ihwS&;%pMWbBZ>1c5^ zo;}6y*l;2K1T_Eljuv;5`P{CrQcM~RRM|~yH?y~;9GR%yy;5{Q%-|#6aACaw8%8{) z=iwEx`DM`pJ*NhXQa|@{1AFTRz6h0$fEUJBCxQKuYhiMKsnuPLQD;JIaZY*cA{-p| zdyC3rS7N<&61*;P3~-7$!^Unv0EFGX+Jg>|dWnC0+QctG#^sCL=8jE(*|xXI<)AiU zjL3*NS%G)uK4TF|A$okg6QxFU$ohxy>x*9Of|qr_F+jqySv8Ytt8**-<1W_f8GFiC zQ|)%3gF{o}XtaJnHP4W%QGsZ0f3dNsuQ-|($?!$C6mQXfV#py&I0yvbG{TeH{Kx0{ z<})5^l8=O7pW=m4K|DJdRP-)B@HlE=)K`F*qYLq_t@EABE0%~WH0$~kfF`O%M=QT~ zh8thRUPlHuKjt_$x&B^OE6|C@857%#1S1jQOQdeA%>t*kX5ti9=2B0I&BB ze}PRYgc#t541BRq&aA22H@G z*n6V2?odU(dTJfS^^N#4l1PZmKw%0q`V|l&8;gx}qK_z|lTD(JDWXGtBepmBsjq&#vkdKDEnPN3cG(oaCi1%r)Kn5W|$OOxi|6%j|P zV4RF+@pa&Wc?es|(ZEASW3wK^N?CMvuQMnPV^IC7U5kGe4+6`y(iy>!ZhiKF48w*Uwc<+dCOmfEir; zm9{J!_L2|B0LzNOjAh>(;#(`;7FB7>-o=~MLTrV@wGfrPFLDq&F<`Bmo)BEPV8jwg zKUXOvgL$vg<9I2L=I>^VpBpU&h`3hmQrB~>!E}1TVZ3LhuJ0Y@B5MNSG%#itskR=8 zS|G;NZlJ)R6CbP8N6q$8nEb_GRzCn8kPWvzy-|S~lPm@F1R6hD=Y1Z;AS5|ba=6|i z4>FWTOFm>QpyPb&8vv4CVB_9Df%lkD_=-QOenS{onnwmM(sV;*csDX+F`S_Rs=Pp-?Rx{-sm5OI+S4~* zk;S>@X!Bd4`EC1N?dm~m@C`8k!v8^!O1KgeuE>OI1Ke>967D0w9T${vBTcvh6K)&w z@S15JGp!l$u*pNNIauTcEbmi2-Zf-NqbABjQeK+Zh^ zE+H~$**!Knq^#NHaI$&90@VS$(rKS8$745fGEVuUIqT(|sJ=ut_LBgNxV-vY77EV} zqwR9e$!>LtrjXoMkx^{2xyOjDhTZ`chcV)KbQvKOJwtldn(ed}(5P6p$tSnTC(%y% zmy34l&O^~oZhQmpL_7WWG6C0}|Dv6C;2YpXJH001y2}LHDc8(D$KFo%Hmbn%EZIz3 z;eQLM4u9WQt52XE#2gn(2lBXvYzh0J4Y;Zxo*?>tk5gKt=abRGwCA8U()d~}1Wiy1 z>M~?18YDguRtTgZrz>vFUVt$ZUalu z1i=y(+rXjx#Rd0W#)s#K7Qt5f9F^lISO$7j&wR`9Ci-#qSi9X1uXzdDCp|*uxrFi4wUOwph zL?8b36@R<%eZ5B2I{p*%HJqD9^zo&i09wxO{cteC^4?y*^9wWTR$%6vfmrTC;(rt& zL1NzRK9qv-bEyq|C?nms+`bD$UV|`apIu9 zZv8P;lIu{C`Y-37B+bg1n|#q=om>BnTHYCp?-0Y{j~4B;t?P_n`7z}9BEKZlS(Wne zRws&+jhIfwE!wg|G(;lR%`}`6^}Aa+-koS}9>wn#f-{Ym2F_v}cX|GNJ}i-n*eq|U z6LFcxvZ#sgTyg{Qygeyk^Pb9x3nh33*zNFL};F{TO3l903D`AbzV9g90MbnO9YwtorYh!chBH2&1jxe6e+Xt@VMTn)b8~Y zexT-nr|VCluhFVF)rhG0KBEIxzfkMk3$RH?KTws5{6%~K0R|i8wk6iAarql9uLCjW1X_X<>5l5&$dwcGay$) zzE54K3?Wf0R2C;f|FM;JI?`XD+9(ens16P)mjN-jq;$7fr@R!OY~W`A9K0nbf2SLY zlgE&HY>8|r*jsFiBg#}NXGNr78t1>8V)FEZRGzLwG17U8HKp>{Z7`Zx{&ddX2c$I4 z-ikzH_23`R*|9dx76Q2<@=Ypdha#~j&SoOr4@V(zv|NT5kt@G2K$LmQeql2!=zvuz zma))ByPwyIp+j^_Gmr4pcQo=?YSVLa2H(zZehj-gqdHeOv|r%LUwy0U@HgYwh1fyn zNLYHrWG5aLwhLLFy1i`O z4^@HQgP*a`T0*a2xTK-E3T7-G^}O>eE9tKQdx4TkO^8F7L9d^kD^L#3V0wi=e8PSK z{!BoJEAXwK4`|zwK&m*>&U{XYS?E^IZLZ?k^GOvE#IpT@AG5H+gLQz7(D35up0CkE zG}H+bIo#j4S}1?iCZa53CjU^&&JJOoh zUxerI!K~l~>nDmQSMaR$SBa<0;3?~`6;Bz#A=x~yQf*-mh&6Bl!M(d5L)G3><;w!Bt!f=*LSYnA?o)M!fr>K17Zp(e&m1=@ z*vr`qW(2~`SpD-O01g&X@U~H`qhR?}eiNPD?C0DNn}IG^A$5-E>zELi8iOzi69e@r zSPz5-3OEoCz{`Ha?2KzrG@b&!5rSF4Q`)oG*C#QPq+~I(t`^R(A&9D#bS(ZSvqP+|_#nwL+ta2@!b*MQo4v z#s@l}pfAHqJn|mS7ByW1EPaityi-(OUL4tUGbzF?VpP*2@strPXnIgQWd@ILY6BA1 zr-HfRP8qC6NPp^t!gd{d(!mPHc1q(a(mBT=A8 z+yW9j@O^WAhm4_KTGt^O#P`B3AXI4OZKWMsOMM%@5O4nNc=PCAl9uN0#0$b1w98N1 z@aFb4ek0$S@#b3JAp!X*W5drE2rQCtHeD}YVAQ9m!GJ2+8{;svJn!XfD$w$|Ct4@= zGXj0K;!LwM(DGG34lW1<1&fr+%msRbLVcL1kbN1QiCtlu+!juDgJYlI+Iy>rG+V~x+ zTiUV389J`fIaNGnga#tP)ktC6;6@t6Wg|OId89@39kIOmmA*|C{yiTWbiy%Q@A;Nf^IIBeAm6!5J8 z=A0B3TV5GgB4G-`rt321Wj7P* z82guD<+&S3(m2{a;Xr?vV?Id0QC|uT2~!e>Qz;BIO-iI* zKRVk@&4|rSEci#ZlE{1cLJa2lIySrHNPE6$aDRJa86F^0!Ggvs@kBWb9@lt>e9QpZ0)fbA-0UF4#19EC!7{i$MYY{u#zIc6ReAXunOTMAZ(eU@cG`NC znP zJH!)}UH@zNmCEiU@nlza7b3;dm(8k5i<#xRMcLZg=|}nYVO1o@Ax*|90$l7(mv*$e z#O|Ni2Q&v6kV1M!Xb}E7H{1$n@m1td1{JnZ-=Q)Yf=sZBR#y)W)P2xRm%<=Ts!~|2 zN|SbMvMEy7sYyNBu_>uWVX-PL3Ul>vO0?htOB*a1!w!BZ1J^XHo$QUmpNeXrjB3DA zqxuX5eJ!99r^DyN8=ai@#uq(4Rl-Dvus2CQiYg$s2te>3TVaUS-;6jRlj{3o&!)al zQy5KB;tb}LWHd$DIuEfyF<5GA-^6802q&jEt76ZGj)?yX1xqCptnVW-pjHkLqf=pA z1dPPZq7c4Rq#wweWQt0x#^|~LWKK#Yz+3?|Ljk=HAS|*${=JNg^z0!jrai{Hz1Wbg z&iDn;$GnL_(;sC;Q4NRj2jE!RmrEKk9_y`?-}1^L2W#%dEUDK; z+S++1^^-Ge*0c(4{7Fe?3I6by)Qxu#0kPNXy#GSB&Jd#P_`M+zgSVF78^l9Na%x=~ z*$7QqMEnPU&&)-}h)pdf_gMW!H^9w3m~bOU>Tbf@rr9fsrMO_d#pS;M_0^VOCI(*Y zGh!}s{u84fzfx%6Y1D~A(bEWXNc7hyy>9WlS{&%EfbOPLF}Riozu0!5&>Uvs5{R^O za~IXR%Z-up9v6kR6hmJLEUZ3Anct6Bl{Eet((7wH4s&(RvoRoU;4_B4?f%Gj`f}AD zUV)cK;;bKmvQ44<5-7-3TS{|Xwyj)LCnGtD63m2AASY31ZxKA%Ho*c{Kci7uRC5oS zxgXhHG!Dxng|@byVTD#o8kOrGG1c0`*fD_~^v>c`YBttwI#uEJpT}YEMei1HTwA-s z%eDEAjnZE5HU1r3;TYbr5z(q!#OefCvaMsIQw~&eY9p2_#QX(j$`#T?!rZ1@OgS*Y z367O>g09TqIdV?W6cI)Kh0Tu*e*7)$xy2T*O@^TICF)~)uw4ID`2S=!nq zUPeq{TX3!c30>l)TNfVcyl>(`pP`710TF~;I)O0nnn>^97Z!M<0?Gpr`Z*icrPW9A zL)9=1;(}h|XiAF9!zbF@&wSo&OcA7J9=;SVk`a=4|fwBEF1w?W&N;ec3gENJm)u&=QI^}`^4 zbV-J^l|A?(3^ac;U?+T!Ka&s8NUl_jSc1HKHH!`*2IWgs1|WGry6sN>K9-+jH4N(K z5T~W&eD2^wY#2EkxSwd!(}UW>YDL<<5_t13rG^*QZ-LGF%|YIEGZTeQWJ`T7m`e*-t^I#z55v8PD+^eU!P;ul9$q*~$V1nUG>9hv z{C_Zrj|aFkhy&>A!XW0gtwnJLbkNpbrUk++uF|5tT73$9zS&!Y_{KmW?*I~=`{5z)z-cvXa(y}CH*G1-lo9s z0(jz1?9Td%H*3pg!Z6@|ew;&+%{uMJg206jbGn`j@}~Z@lAV)C(vylEtnaJ8s34qx zP=@W|Q?aVO_$rk3N?aL-DhKONquMSKk|-L~vv}G^D z5Vnk7V%dyd!C6>{q;M1dNHru34B=m9Q%1J{2$50;m|kjFK`7*0!m<=R!WN8AM_wr! zk@k@AbWtWUN+1Kd8v0VH)(b>k0#JtquwUoHB;dM4JDJ>b@Hqsb%Oe@Je31%f#nG$t za$#yHHXcb!*n|ZL6N@}n;9W``wwAZ!g)!d=)bObH5Pnd*AHA`SD>qC_`YYO@Ctyj9 zQ}Lr=%(%x|yizGC&Sdzn?YzXdJUCTX57G|Eelp9r5+{pKsPJUp? z<0u-8K501P5)^QDk8vw>uvqt@osTKvi{b*S8hL+}BiJJ9Sr&U5;Miem`83BD%g&a8 z*x?u^hgyr)2^K95@a3&#_$z*?#QC0M{tE8n-NSco8J6OY??L<-*VQo1TaJfIvI5ZQ ztMOf1D=z`Idk0`7Lp8-7c>x|N(U71$#(FH5p)#Qh(51YiN-#Pef?#7*%jGfU8H#xy zoeqAU%Jag9^yMnGm8rRUo9aqykr00o6hwcL&fuIZ{ufE{C)s5%-WM3Z?>wY>2nE*O zL#|SXifVTkS;8#O56dYZif_vEo~V>(kCJB(WX+q!`e6bhMX!Z4!p%8ieq_qvi{2U# zv98#v6O##R{5%?8$eH_>o6XGIoJ4Hmc%bSsjA2T0%+WIk0bB2Q! z_Od>h7ZgV8yqxW@UPTp=_KH3Re6~V^Kvb*yBP)UajT`;y9>cS3ALVF}HTw^O%Iq=L zcsTnyq;FTP`t@mch<(OV6QWZ=yl#VFixwI;n=qbIs|P;Y4W`Jr$b<FMZVvWsM#a#B=f%-w5N2d1DR_Hp>OMAgg;#q@E zfPrlz(NQ^hdHVqT zxr04(0XyYxd}61hC2Q}L!b=66veMU>%}=NW#B`70z0fTC@nW{-_g>D9*%#vlI_5F# zm{p2}{!`Jj`U1|@#Dz$+LT8Jc@3>28N+rh5IxpYt!pL(fey_j2dA(g6w~1}Ck^18* zvv)_(HbijamYo!J@AQ@(IZhb*e(!bi=USMs{#Z!{fo7OM*DIiz66gj2G+F@7GJ$3* zpc^I7904>^0L?XlZc;$ENT8bm1c!DCL_l9Bi@iFVjz2l-idSoWlV;ju#} zyUH{`Cx+X)%B4)m)lXD?=X@l@|8qceAT~0koVwS05b6IwI_Z0iQ{csIStr!5Hr>lu zQ51Q&wov+)<58+y<=kok(Bp#y@^$ z_MZLd`B5xiVb@k{I6+U+zoJiTV8bsPpSW`U*j=Lnk_~!`^+_81i@y-g|Ew%4+%!JBY;(cF=G&D5$Bir_U8F^=1%ykrk z%pS_ZdkZdC+UmdMyu}#S^z1XwoXWeHjL17JhcXyL zix`pin5)zu%cZdkMTgDDK+^}K*S>q-$3w?Ue6E4Cd^IrAjvU{Oxz3BUwsd95%bZ$o zX)OVX(cZEV@0E?fO4ZJ$v5*Y#T(pf*`}HAA96#1`e3pLhcQPh{=qQ1fT^?|$6nv3A zBJ#2E=&>AFKh}#B^hd)5bcG2WutVQwLeEgpf0odbOz28Gbg2p5prC6d^fVKCiXD2O z3B5)^Um>Aqnb0%r(ErBDJj>mtpodH7c_#E+JM>x;+A+@J$v&^BWzdAKvO_nR&;<(m zWeL5|gr0AQo@zo@D(FWD{i3&yjZ2o-d29G+QaaMN2`I(8+u5ezJI8P>V9`A;8rHPX_-s0~s zB@T^Lvuvxn;hbpVlq#H=66g6Oj!;oHzI}C!bTTZ;Z@KVTsSJ? zcwG72uhCWTFy(6Y89dCGW+ zFkAyst?pSEDhz|*v%bWC#gyonJbb3rUCF^1ld0#u4l*IOLKsoJU0p0@gV5IOlO3UA zJ;!fJMJ@6RL)~o>_%YTgd!WmTpQ?#85>NHe@OO)4O%J~yy zM^wQl`+dx@%W&hu;$vesW|8dx> ziE~imT$C*6X0_heGR1ya6dF&l*m-;MPnD=RZ8Mukarp z9~TcMg8<2ywdk@DY@x)Ki0>SOMfbuxsWd%=qFFUGmVI#uC+#qqSUeQEgt$1@m=joO z*3hHXKZ-#$ygx%*`g1(6B}Bi2c(Q0s**92nRt8EmmFq?eIP?3)2O%k!;1i@I2PGyl z|Hbp{P*0#phBp-o-yL!Kj#BDGUQZJ0P&|beOjbwyH9J&)l*njHg~AZ-i2uP3wVJg4 znhJ&bIN~*SsMF^HYKesEZk>2>$%XbH9y!Uvx?hWi)QL&Kd~a4?eDkVx()lBEX^Bx^$-$WZ+*8f`fH(3f)) z&>ssAk3S=8sRnL19^EmZddn4j-K4(y`MO+vJ%_K2>h)y48tU~JzUGx#9na0zO7;33 zEKj{gy?(*hHR|;PzV1-3ukkhKB8${Ze63Wkf8uL{di^b4<4&5O5a}wa-qZyo>yiVt z&eU4!0l!4As60G4dfA=$>WXH)=@wz+Z^s)FnFEjOu_?g+#RHJ`0MfJuoYBQ^qBkCx zV73e1?w4%A^TaN*7ODhNPV1!kI0oIwZ$iD>y~&Y0fzfdR}%JP zJ8U6fkqzaY)jA4}fWba+<td%PmD%S zr+TCbU|tr%Nwj2jHYPwvV0F&LmayhvG>+f#9rqNvG50eJYZh~7nhG;I>1{En^~C8^ zCg%jKll*OS6Fx)Bto1Nwx!A+^)X-D5n zZv2hH8!{Ys;aKo!=)-4Runk7jZ?I6c)(td^ql1>=lN$KH9su)TQ)|{W;P zA-j^WB2WMpr0Hjv%@X$p;3CjPXGZ8^tSAa&;Uk3Vm$fN|bli33s?5-7Ek;J987hLf zkrj26029U^n+tc1dDz~l=XzXXCK~Ht1_!T;@QRSthZ(${f^DwPS8e$)UZX+pXnmDR z3KL==>ez_f97YhY@x2GpydR|w!}_Pfd>CksycD$!{F68u1*STRjXT8fMi2Z7u6hkC z{&zhD!6g~ET|bE*Q;hq_#=#pCGZ2D;IpsdriGiQ%b-1(3H)_u5C-y=lRqx&C@6BD_ zEjhc*+9bTOaR(5W^*H<_@?zr-CXU9R<%#}$bn{OpzQBMT8vs`d);|TRVs!;Jdw#}} zT(ShFv$J@6_19rTZe8FsPzFME?`v!5WtB0cHPI@OS}=+w)FY}?Fpa}78&?bye<4sqIcjriFb|TkXz3qTc>K_C!iMNng3N|OrH=)fOXN^ zLE?4eeXLfdDdMRxy8iEqII1DX2fqO$YBzJHXIta?fryN?yE_G6zBi7;J;bQER==42 z9#%Qhxr0(APfW>$F|u83+;MU1_MZw?Y4sHn!((D#c^6MIis^&3E)FtcUF@*UApA$`L1s z@VHMjEZn}tZSVo?G3R0M!6G!H$-`P-#E*UUAKncgcN}uXY4h$o zN{`(xobN?DOyKE^NxiA6J567$nrd!l{vDGNYe&g#8_RvQi>0gLKoM`uRl|+~U+j_h zC9;`*B_hd?1niG zKt#(aw}hq;DOO>$W#>b1==zUI#l=d^_6G+~_Pt2kw}p$=09~$MDi4s?3T$Mbf~&lkg>j8efly78e}cf>RHNW zmHscJqmRgq)0LgPieydd4YzbN_O1?uS zPn5|hIVdDceV$B~_4HI&#qh}F?p*03le_b9FO(;$*q!4a$mH(rvl+?Vn{o})I<}BS z$u@sPCXzu(>9}7erpnRnGBH&Qr^&=rfxTEJri%6`B#Lkbh=iDpU{8zP@R^KXhuJ6B zX$syyWL*)8-H=2kFC|&e0dNA&b($`++|r=c6u!e$=!NKc8g2(IvU=6xzKDi;@rk%E zkd{4m;qioFd;~UMQNQFy@gI(2SvEV-Jp-ya9z-He;*Tzi{D*esJ1&S`?F0VslD*XQ?*D-<-si?EtOYSiL_Lnjz?NI))x|NQ)&z4i!>H5+56lg zEw#n}+mE=Z(y~LOrApOnA`Od%FQ8-DB=C8p$Dc-;uv#F}p8Vo#95{3e|*?%|PX7=AVIC5(1 zp7gE+7z_xmjN*N@_i;Q}J*xU-T&p84`>pdnf^^JUIf>(}_1E%sC0-N9(YWT5HOmvH zLiQP^Y+W3j#)I{%2M7hMn3+kO%X0@YJCzY3_=-!^OZ95`j&0sT;_)iF9Y z&JG199+A!!KG3H%fIdO*@I{bB4$K2JHYZ$mxE4%7qH@Sq;3h6nXPEkM|j zxc&b^YHMkZBXJ%Ia`unHo`iycb8L|8Alf10hpG<*S0zemuYRj1h_ig@0@Mom8R_v& z!f&RpvK-#ZIO2Kaa^3b*&<}d5zy$Z~J7?b}%f+=C1_qjg)&7$(p?<^JY_jakZR!=t2NtDQ*sa*kC32<>DH{yd+LZD#J>=cc--u?xvW|hN^w~ zYp8ShAf_NbeY<$<10Qz%ZSmMQI52#$pHFYYTjPiL1OMty_|S}WVC49ei71N0_-7WV zfiX^a@Mg1-WFgp&EF6rZN#4F}KWt4ms%BbAEX2TruRFXiwPk8cs8XD@v1P7~X8<$OWU0I^o#WTdVsG-mKANv2eWFgB0O-wLQ_F4aj$f zanxetC=7T1^d-?4``y8zFNwC;-zPXAyuaT|Y>oBgKU~`5ICYW2{Yn?D$}LXO0oy=Q zG{8mrrduXCzy^S&jPpo{Px))wS;;2YlgVz*w06~aA0X`o z>4S%H6L~O7)JpLy7aygIYk9=5L~js3qJ2tk6zvo2D@J~?=g0LPt^reUxHOCfL>ZgS zVqf)evdKf9>G*CNiy5T`ugp1txWS?0;SY?EFwAK0Cme#In#MvStpNc2{wT0eJ%ktQ z4oie~qBdgVfkTB8Eq&CPfoh)vo^(UE0nbptuM*e|URvFj zK_M>%ax#>0sZDKh&4oM7z2|gsp3)^8tz1#8yn^{%U^=e&6JhktUNIrbZ!B~P)YoR4 z{oyerV4~qI{wM^$q;C_a7Jqc-$ylJ7hINTbEI3Z`A^a!SV5aEJs$~Clay8-G4!?JV zGk6|=;pjKXJBlk#XY<$s!1Dzkq56mmpDl&k2;4X_=jm()o6JQXdA`Vdgv+<(v7B&Y z09T83-Y!S*q#r2L48RN70jrmzP8O?0Fn)t)_S+eTtrKCH0`Ps0d;_OW1Y2@mhmbP; z@CSXUUC+e>Wx-(#068pndGO2yy_~}=&+RcDzs6+bZh*3`k&QL~%&GbJ9!%THHez7Q zJt7&*pwSWc7_VI=<$s8Nx++7=fhys`0Osl!x8DReMzs6ELQ01|Gh{U`UHt$ zvq;C;inPDWboNN3-Ub8-!of96ei=Eg6oz|1Tx?hfFG2lcRiPJweZ01^@tQCKR+=RUTL}pLg^!*PLiobD1(>*z-KVLxlmrfD9U-A zDrfGGE$8pA?zx=KA6?G3Cm*Jq%i&|+b2;a$a?S(H5xHUU^ZO~ba{i=t7J^=O=|@Jj z76s zIi8OTuh|Sc*bGKWTucOgJ;?is-)8l5W%WgS@Q+adjes+yLLD;l^S#mWE?7L`(qJvT z%^4Z*irnJ%H_XgV3<&Qygx6LXE_3VnY@CdMK$S<@x)G%T*&D^Dia6d@@IgOI0g9x}WF7 zMC|d+$jCg^1$OXYKQ;+OJkBj%9{sMA$G$PXK#+0JBN>f+Au#0;h%n;E02Ig@a|ncS z&+jdj=B(I|vTSB#fB{%VD*w%;k|!gKVW=`9mGgX^6|KA!Zj8TMIiGZ5y$*25y$*A%ASg2E-$nkz5|(rJ3U%mop_iLtY$p( zd$eH=N4;m{~2$PQZ=Ko@R zbFu}yjo^*g>*S6MScO2ks7jH=7`;X{)3-R8#3>4|jam-_n2WbE`1#}F%?f@#7jJCn z(Lwop#!E>Ph0gQ1aFbPms5MB4K&xf~36RvS};I z{vg;rQr@urSm(VD)su^B2#+50PQ!evdRzh%QnL_dw0wCODk)`;5Uq2D6h25ACLZ!wL!oR~Z;*ZB&w1s{KgGle|h7J|S}42?V#mL2M;M_)0A%*@SO?M^gBnNfEwC zitt@(3g5chrSSb_LsIytMSB*$@NRbiGjg1i=b5L-KPzI3ITi1XGc?-T!LgA!ax1g; z;N)kptrWm7nmBZ<-ll}J?ORBim@LOvLU?Tx#wL8hRz+T=H7GqNK+&8IgfrrzNw5eL z&6Iim&j6yADvW#iTBTm+DFR|#5W@`2)uQ+-EJIN)PJw6osamM zEZslx>Jyvkh`j?Jfj^<5h;@Kdl;ew9cI3q-W#H!U@x|tOrSa#>b4r}L$`du=&XUDv zhK(^ePJ%K+EA}gKBJL42+8d$vTC}gjao16`U-4JI-MtqC&lPQT#d*%{!}+CnYkIjy zv!H7f8;7Tsd$1}us11?S^3e3LvOJ!+miPE!t2#C^b589dN9FjC8^0Olmvd_?wfSDf zIU>DHW%MFmB}ahZa^wV0?~d?mKw!S^(jAvsQu2U83PfFAZC%wU1i|Ws;Nr&BR2CS! z)2K|6RC?)!ii%HB!NO9mzqmae>v&?V#a6@&h1D;KwXQ4&_b`3h$5;H?;_0eO9PQjb zhFu|ad0^((Xri+vzb2iXhilbh{=Vec;&THtHwK)Dn>sQRSDfLFW~z{yMb7cT1vTJX z@Xne=nU`DoB{3U0K;HzXbI}EQ$G+@!?_R;49KAsmaW0Z1PZOtg=Vk@Ip~p2U;0qM6 zKVrc6blbE5=asfe$ds9 z!cWFY>}mbc(*{yjeZ~K*eovgw{}a1eY=%oJ2S)H%nn0f~pSc-JRP(YNWw=qj?meXV zY7U-=gL(4lLalC#e8TMkf5ns7a0eSFYr|^TRkZpsAdE(poS!ThKMs6v)s~)wFXVl! zBFizSwzzV$U0?ZRIpB2nOCq* zS+4TnQBohYR=*eD3T=U)I$6%xv|}^6T|5V~D+?zM59uvRIW)s1m$%~m0%#?fTKxm~ ztyz?Hlvck;Jh{Hs>hC1Ub(i&u-G@cpE_jPM?>b>l?f&JC;Ia65&=EWuKPw#CFh6u< zZ#@6P!Mn098>p@I4Hg}>{21ppZS5-vp8%%fX|oU71LfGEM4$-ekcOo=5enC|fq0 zzQI1yJla+LZu!g)VFVxN*qR9gby9y7sk8lrA028k%D&-Ay`FV_RFKp`_8Y6UEzkY7|rz-Px87J0jzL%F{7laEU7mfa?hz4^hI;G59&;3FY9Y%Y*yVdxz(FU73j-ESbBUjC$qLmcelB zx&X-7mSc&)y)1IC99BJE{DT}dMVEoleCOq%0X6e8t`7C9nV)IOM=qQI2RZaNamYc) zwQ(W*mcd{ahE7Dq-)Ku7!61_8CEL=EV~(jB0V?X5(9ZZW?4zWp1I##ZUq4p-b&P^hMfmsa-%J#fa3yrFJG@lKLzF>Wm<599qXyOPCD65x;hR zk;8*!1Z~Aum}eca(SL`0h}FE&KEV;FFees6_wwR050?GK^!jB0!2;li4*j!Q?EHMa zA3Bk$hYNwDxlV~?^EmG$Lw6Mpm3hXeTsNm9;BA281R^hd59U0Y+%>5GvU*T_9KL|} z-eP!lRPS0I_Y-pF7Tl%T3*)R)bYE*Y(dx7C)js@kG&wa7o+{ch&bx$G%f|Q%rN-fx z3N4s#8)`4ZsV6_y;t* zJ5dIHxoZrnm5Pb_ITYsoX_)6mn3QT1GyhPl?n9F>mA`&<>~ zxHQaHOw7*n(@L9d$8@J*er#ekrDNhuY%_L`V=>6k~^F;}Ev_PSn5{3Yp_ znjLd$8s@PkW==XLyfc%f^`v2*VPd{hoW>#U>?+=VE*Dm8k}%H1d^8;si1H#&_Wadp zm}_Rrdft$ZDRctSiFrpFrfy;uq+<%5U||-eVgA#^{HiFeo#b{ghyP0WqNq$xtvTw7|O8M~=`(h#;Qn|D)LcZRJp z2`xx3f@og;A!Z~E^RFi6*mO+MycXt9(lB2%F|*P!Me|yiyqbg7Qqok}YGS@R8r6oQ z5TaStizV(PaOPQ*g_|{6!k($0p{b>6n6B7Une)Q>*_T zx?LGsyG`u=z>a^4FDi4(L59_5nTMJ=pMqnc`vsQt^fO*XkZp?|E?y+8ezvU^AS9|_ z5qfjHtUL*6H&E}GgzifxbXPY*qDB^>h>eifPN+DY(COU>330FpmD&gu+X=N}fxBDP z{yhq%=Vg*PT0MNfgrpZC5bnH1l!Ru7T z+aOqH(a$pJpWab6*coJ#-eG6ppW!{%je);EOEA!fY3RJ_-zUyjgeAvPs6XxN&atpr z`stw34U?@Y_Rh&`UdDG5MF?Zfx;egB)>Q?(bCVh_3@46LG=xmE|ua$PM+G?|K_kl<^Orf(a%!kr28%@kWI;POs z7Uq;R%*`g|QR$e%F1Ij`Ps7}9V!nN5T4{w{Zejj=Z1;M8Xkz{vm@i;`3CkLE7ZZ(S zbIc>R*pk0D35<+R&qWi&1-7X%DxXek0zarG{;Hl1``wgv?_1W3jJgv8}}oZRs&=(GI_NOpaE^%~%K#3frR) zSRzZ$c1S>mq9aHE93v)yo=Bp;=C#R-WTZ~&4<{nI_Q>*>HiTPAIrWm&@ z%)h5$#!bvy(lM!Hn=DLmHAf1oJ59{9(lNzQWMTT!^6YI+>h_IDtEU)>EX>|%n1fBs zm(nrCP-J2L15@!-4h=Uk!@zt&_GoBJB@>o8I=~c&C6a(vzX}QH)p_V6qXh{wn9S%W z?41u$WOo?_AdO9xTRqsPT>O;0)FKuJeh#;6gjUbVtia}tH5S<&>USAK%rc(}NaR*w z&uuF_Z!9wdfohrCh5|4T_bQYXf2%E}=1n~ILKjwKq^7deS#`EqS!kKWPgKrUb@R;X zK8A@o`Sm6)UveY!n?&ZOE-p{WTv*^^ka^-SY2@Ugvt7nSliVVcbBpZc_W#yi7eVf; zQ@Xl@t>jT8C2uT(2Qi^$`C=&B&+WvXODFaOh{dl@(do+q=morky9(P7zDz`_MJ%|<{~|O0;xJCggnES+;bu)-#q?_A{g(aira#(CG&H?L8cM_g$6f$L z-j2opf^My9Y_*9z`LfICBl8Su$rg-X2i*e}G}|+L<~M2l{LRU>j%AJX7Tv#K(oSA- zsC>&#==yX*le-ZT3d|xj*GA}bJE6RELfPF234LY}8fGK(ot@C@kEK;@)9}=)3H4?X zdI!^Mt7_S^ZF9f-(+S-JLTD6eOl$R_Ly($>@F%T35J z3_%9AK4Kd(;ruH`ol{JT$>FO=(A;HwWMCgn#OiN~0< zxn981o^6v@wz$t;>YqNE#^0I9nX)S8PmkHk@CgVj-qY=DXFKqCWBJ#D%r8z5eK0D}p$7fLtYe=lC~X1?a^A;}-O z;j0bcIOtm**+)M_w{VY=HvA1}9PDV;H!nDud$q}!n3LiDC}UG<01?1(HVB@prkDh><=X1)d2Q-aM# zLS##ETkvcW{JkRhGBzz`S;${HJH84?V!XA|BJAPoX1q>_oXMSQcccIt!@jM47#Nbl z(MM%0x9DndWQp-iSl$Y}H;Z3+ixA_PY{xr}z_j5<9KnF+@Ar&W%Hdyd0FDDeuiFTt zD?<*XTN)X-VA3*7j9Ds*G* zf^7Uw4PA?(yJD4@7&^+gx9rbIHdXzb)h8y#0&oA+P!aL=1Mf`W;dg52WZ}<}XvrL1 zOYfTEjn&`QcPz(Ywg%-15dMcHbTM*`4G3R_930*d;uM>R8_dV}-W!fte;?z!Eoh2O ziL2Q-(X5e3)z-Rl>YC{YfIId^2D6LbTYR9wbqqv1@%~oVF%H}s8|)uw%{tHq3iy}k z7l@5>2Ao-YkU%dL=Vg|FeD@lNw_PKg*xRkM1XIA`$S%Ym(;A06no2>zn2GL!U=Kxs znFc>$PxW2$@naMpr)PVMVkeF@KfTXSo5UwkH_hJ`X$wHy0z4&9iK3 zo3~MTDln&&dVAO0USZe$Z0qVAvIRYl}Gihh36$H)htrKsQeu-te)3C)&I zNm%wV3Xc48rJDd8wP*&$-$SaRVAv^~Wm51;3Ypq6o>L+Pf6TiDj|kre3Xb^0_@hYd zwUhYj7qSp}lEkp;=~e-R<7DDG94zMDig~gE-`jEjDsXWZj)i*y{Vs~PFB~FiyzK+x zun{e+2NdF4UnT|!cMLO5k4VKSg#1Xn_@hMy#!S=(ojDQ@%xnp0O_N+6)0I3Y*bk0u z2tJoz{A%^i;#WgA1!f*BkCj{~^hwi6cUrP>f?1hzlp_ZYb|-8v-WVzoJvs`PcmpS- z-`cTn`w8uD?Tl>d^A?UT42Zn1H!3NA>=jBm`+uGggTxTsJ;x$mgOBlCw5w=6h{Rl* z?_P@60sa9(jHu^D89_`+)p0A>pc$dTs0U&a zmGMZN+ZXATUZFp~j0)X?ma!^ikM+P|p^e>Z2hWJ$poloW7ZfLVAp8e;M#K!vBrGMa zmKiP>-Q|(Z;#TClA@|Yg`SRq7?LZAxhgf0cSk{V(x6py*gvK>`7-90D^hP2iRW2QU z&}uju0KGRF&7ZCBP))UW8`b(1mV47@c%@o}n4&itx6(|CY(+<(ARGhpA7i%g^!YG4 z-VKU*(ec^%$<-?rg(pl3Ii!$noF*u2iDruYg-=^{;shJ~?WyqJA7qYOIQrl6b7*hm z0n7sY=HhoGemTb~#4j@*jbCqMW9=&_RR*lEu7hQLzLlpH5tQG9)WdPC?F8FlEBk4m zPg~PY`*66V{tEC+U}XiKrc{8rGbp>8e3M0>{_yTRw5BieEi*I^{b1CSJJ`nAFpANj zLO>?KJ++R9w<{u_S@%}ta>l@luIY%cz9?im%!IfT68u z#*G&71IUcs6$Q)IPgA{ZAgZG`sMg8Et5_zKtrHX7hF5>?G7dawnHcmgv`Thf_@z3$ zIu^@gyHqI{+8Es{@=7MHklZ}vnjM*x=R(ISjuE)}y~IG24qjTQ0E@{7w-VNOKcGh! z4l+%M?4UJcMqQ)iQE;W@^Fup%NL#CKu^onn-%LDFq-S_>U9BL z*%BVMM81*vJr!7JAS->xa7vct5)GdR2? z*@oUC&jhl!;215V*MJN<&qB)ruuhDJcUQt9=5eqbIhN77rfy&UXQkWs7@u}X8z6{q z9g8npZiG<=q1Uk@>WxeSQmGaZ<#?=qY4oOiPJ*@I6la#IY@vryO|E+wv@SO z3d|FX3Fr=DK>QmPGW6|=Pnp2pfNFO&;lD#iyE%+Lc#Ld;joENNfs=tDa9;_!Xq~r| zL|X}qAHIlRu0T2vTSvSC%5!)q#N*`|&ZDDQ$AD)IbzUFd5Zcv`A826596VRx+2I7_ zL?#Aeh}?k{kM%W372<>NN`PV-g#(XXJRU%S@mL^Iod@tZ5|8{BF|=(698ri@%$W+9 z#86J6kg?}Qm5{Dtd~>0KRV95Mdvn8;)PZMu3VY1h)2uKh@*&J&1aGfJNf^`O43s#s zNyh9B4hO`~U_0R+8qCGkoMGv%NVC-sMgk4(SAYU;ZTTvv_K>p%)1B+|$x67V0~Qfj zM}uyrwzOT84dN%}8qvuP?G;e|Zj#l*&LlLhx(jb{MOO%<*tkq=KbLQ8>CC|D+dtww zuvB{}gV_ubf-ERmIaE)NuK?F%2aYidvqgZI52HgbPzCpbvL)WE5&jvcLc$^&g$#iy4ZlMgRaj{`n;8GfAqOBY zAB0dd#T4sl7@t}>FhKIfU-OR$j)IGQ|l^D;ibOEco>UI-MRea3n^Uw1zzKCfsInmAjCEy zvvIz5_cpMJOCbfu&vE)yR9~prsn{k%k>;@h!eh2?9*#Tf&(#}Lv!0C{x_9{EPB0%h zw&uBi zs{jZZRbs7te*cIhgy8P;LeIp;J2CW;aJS&WSvb%nih{UUYe2w(@W#v{wpv{OCO+}5 z)*1N5GbdHP+RgZ$ljx7Z1+H3!T3tQf)9yJnlKXqIxaY~@277HSbBs;+qPPhHB>#v; ztPZ-Mc$j`=V#M%vP{Wc%a1cTQ1P7zVhct(G>RgbRNsVTj>LZ53VXE_Lnft?TH2E!_SyONGU>#0dG)Yi_Iof@a%>byJwgg6@saXF%VK{!{f zZXm6nc7@#5c!=@COg>!>DMo7sMSggg&j*m64^A(^BeR*0>jYSiNm~7r$OCo`Z^@X0 zarRI61+$mpM=&|k*3#+5_bUnZ=>Nyun}A1EWbebB(1Ebo0a+EL)kdSDMg>hIXg74Q z;{=I{ih@oQMBJlxBq~BeCz@*$K}BU;W|&cDaK{lbMCB&zI*vw}QQV`BaNDryD4+=W z-uKkK)i<3mGRyD(e0iSqy|?PrcIworQ>RXy3S5Xs1amh%Rnn8$0)C?qXC!7LH7~;O zBiz0{5?{rViq!GNUt}oys!4Q2)ZuvY7Rf{S?B%QKi>Gs&sF!C0 zr{V=98s+KNE46%c2MWgNxF{T8e~H^3gTAG!MO-=7C5k{~V<#}!$ zMDmu2{&5ZPJOC18lx9MEAAFc$ixK8qda`*9wA~_rS}_E}<78T71U%1_eHBv#l;)bM zE&~Ma#>|}HjM8G}v>pNgSTJ3vAm@r;k^)p=Nfm{2TPwQF@Kst$Tp(gZN zbGeS$`;r|aw{3Fjbxq5ZJpG9=;IOU<8XFZ@3PT=)-r(=D9-uS?*ExMR{?@e!K6Rrl z_Een#nK@LsXCMZUubL;NizY)4_2u#pPzhP5&ywwvGh!pd<`A5L?qTMj!PXSi3|9mf z>&BmlfY?YsVU(WF$moL)=-?B)6Ng!TW@lNXvOFs`@}k$6<)P+35M%X14r?<;GYEfm zn^3XD6Xf)zx{$4ZCWs#(G#XPNl>p(kz@X(nsr*&{b-6=EVcEGr>7dx&PBV`*=jnX@ zh&42t1mm5jf?I>gTE6qd%is4Oa^v_B&{S)l{%w(ParQZbY0QJ#5XBR?f zkfkr4P{7i|y7cc*EmaI>3v&bFRrYrvd$pH(Dk~MwXm}Jk8yQ`hRCy;D}Y+*mNj4L9g*rog+c5T)l4;1+^da5~Eck<2`=!4>Q@?&d5 zj6J-@TnY54KKc-`@+N+IK<+)vx}%*Ae2q!rBr?nNT;zl;LYV9nn>jjcKEjkJi~h6; z=1I&CGLca$0cO(!lvkotT#gj5i~#%bDf+r*vqDL<}>VbVggBPa@)-*{O(VLaZR7CBs?9WKXfTPUAJHzjYb6(Y9kjr=*}Z7b5hGrzFB7} zSh!RO1T%bhZ2{6LGX-%=QSKJF$COSe*IDd%u6=P`R2D^v60jsy<~p5VH4~(i`95YL z)UQZo?wRP+?>8M}{o4e5{>0?jx^$94(bYLZ+qD zWHOED_>;&TsM4IBxQPkaGBbCQ(}EAcJX2e1VQragZMlYhhOk7ht2bU#uwxUHz7=}v zbb{MDND#L(XA8byUd+(+T;fz{Ob2N$bPA!YVbh3C(6@sY9O<+G@R$TOYy!+WwY5J% zOM%voRrxN^u&;Lj`?i8TTfsJH*n2yG{eyxXM}q)AH-Um+vsxF+iY3{aVsmaiMEw8) zK+W0}D>QHt+%InF;tuDW1Mbntfj%YW%7jn()`C zQ%K9t5rNn@==NUkRJ%WpwJe>B(Wy4Nx)^Vbe$XYwQmPHq@bm#&P(=f|HinX3;S6o}VCg}CR zrCQ5K`c;!v;Om4p)|=m6?aZBzEfP$=c|S0Tu9eJ!*1(U6OW!>ofl|yTK~&4o&4>f} z|MQQ&hgSIRYsg*UtBNC$5btM>y zpx#&Y36@;pylVrKrr%*^mN=yR60!nfC-F+ITpjutLeX{K-3yDgs>hMgajl5Ho@7>N zxH7;kXJ)!LO<17E;jJ_D5AyF^bvTW z+Jnlcsj*#MqTTQdbHVNiHy7!;B%TD0n)T;L_)J(3Ls8x_D34AmcUrmV8 zSCR3xSwBJ}6`@-lOLYDx;6AfNGcsz!EiEL1Aj>P`FcLx3v5_ag2Wy(n(=^g)>lP+ka*I3121OlSzuojrsOJ17yGJy zn$e5N-Nc{;6z_LO^9-!jcs+Ugzwq=r0)~QRUl&eZTi<;8mEbJiAT4fiu}GFNDa#v* ztxcn%h!sY4;r(^Bcz;Fb!P*VB#lR!btz2&={k|^L-M0rkGZbr`96g=m9NjQC4s{=%plas_rtuY+z7|jG6s%sQlLg&JVg?6Z z2my2xfavD>g6J;cSpFC2-e#R*qw69r(@J6u!1$NV(pJ&?e9b$xE~1zm)TYR zDbiJcgWRmDKU*3X4V0P_5T(L;OCFC%9)f{Uc0Ed&MTN@ZUY*4mlEsq18eqU&taEwm zF}CJ>$>nI)L>QUlhtYiWqXPfo?1Hc2)=S-DqM|Aof$X%t+kOx%l*z7IG z;D|sNrqEmze?kOxp8cSZ4vtTz^Gnv7m78+`1+zgIrkOP;R-x$_)J%jLsLp_KpvYt8 ze27Vn=W2X4=VPwMlFb*2-&utyT(z5^)DXfd5TE|!26PiXog+)V@lL7ls#dfb>+FH% z7EPP=4wp@|V#H#DcQb%}ugnSj1J9||ZD>OTmts0uV7g7v)%&)83p5DkfVG_Vl?xC`lv5JWD#rZyt+XOF%c z@J~*rV>QRA)c2bB&9|v7lU5yB+de8B7z^0OR@9TORZdtPh%s8KS3FFsPPTf z#C5t?=7V`kuNYgw!JfhP2yDCAAFF|U2o`liqEO4V0;>_;TGKCj`b3B;m4M40t`?Q6z6_1c|xXa$q1`~H7B)MY=nIHrA zxeBzk&yEa1eQUiRKkUIfpmjQc>*_5)-a1+Z{4ld6%YQJZ2Fbu|Gob8Q;=AgTP)w znhu9^3KLbuEL@wg!yGWpp^}3UgDc?}h*o1N_);y5%TF_lHP8-BUI22btoObLuoWbZ z>8J=yY-;9vS?$EMw)J|A(;ny~XIUk3ciJfGAZa}`L3ldc19*ZUi~}(W2aZ(iMaCSk zIm+C@<{#Uvldz5w>3S5#h-fZ|SjWD0I2h?MnEZM9T`eMbUE4esD(c$`-ME3Mq9Pv; zv%&7sNw9{Zb?(q;z{1rYIC{R-%+O~JtC0kHu3-VQrw+RjVJ*j|hE7CiY`3qhw~H9g zL|EAPCoQp7rWIn18p_);>k%~S5Eszl0IEZSJt_Bk;UFm* zqy}#}(zu#A0?@`cq85RQxC?m|{QXDJIhG$$f`LRK(^TjV>w<_>5vgYrYb8^%kI;1* z`osI$Lx28`=CfbG4$s`Kp`Ymh`b9v4?gJc7eQ$LHxQFuOwX9d@*!yqI*j}Hn-FW||rp$H?d=X*BZU$ox?c>lBgo`d(7 z@Qy-;DswPS68OqiUoWe#fcjdBFYNlOk5~AC$)ZjIcd5W-_#l^MJ2m;=do7tUnh1Wn ztOD(J_%UpP;6$eQ*>IIp&kZAnwJO$)S)p`BZC%$p?-K6*uMpZn6@ z%lmuT0Ap+8*1>68-`#7Tr)Qj%b5Yjh)xKAjgjt+9QO7)m7_g=h$b80gu912#!pS%r zbO+9o5X?6e8 zsiX}Ch%5FydVoPLFLNMt7ibD#)p}HJkuAV>CKRkjJk4#HjK=zy= zu4gAW)6#i>xF4KSO+z`?I-}*jdsOELWnKnsEoXk#w~)&mvaG*O2Y-ZMHEGpyY$dlW zcyF+P6fi#!MU+ywpsj@SElp3uVMQDY%loeEyXrT5RgEZ_lJj)L zn$va9ZL8&MIzLb$iIxN^8C{_ZXtJYkv!iD+dZCVf(T={=j)ub+kJ+H3@3W)J?dTbd zZr0H^OZ1Y!?F@cES80+Rd<%m;*Ez^6KyVnc^&A9)_k%pcX&XVGFX@Cw00Ly653(PF zSSu884&$UVm+TqbFu8XlkshSYSu1vHO6)4^$b^QA_MQc$|RWp`tz|zNPQ#OC`EtJVALC^tW`u zTTPKS7~6AT*+E$SjK?BotNE_3$Qa~>+gdUEW1xldKJm>hq?EBGda0cSq{;)QpJ24G zw!O^F+8D7XYv?n#=zyQ0?`Af;54>f)?7zE8X+~T}5(L&b6d}0AX~vUl97~?h2DZy{ zNnn>eUki9BI#jNr1krYroOFp(EB5{lcfRvMli2y*0mV^T*|4^9#098HC_X(!khtQ5 zGtmm*6Xr_u#E#XPOj&ES&8ugPoU-BKPyMNUxc>4*2FyfD+tZqcZF|7IS#>f;g;!uyHayAh?95tH}E1NWCX3i{`^Hqic$G!xcQU z4oy&eG^go2FGHS+1@uB;)`RDZe-a^BE)`gm@e#zu9I+caxF_CcQSGRw1a6?YSQl&=PQeS% zOI%jqUc6cNn;SI58bBxk%0u3dygk+jSWJSC@~D2zM5M!9f4n*1ddOi5I)Hvk7OE7t z3?2YV9F3oN#u%tUokQ$O)l8%Y5hsX{x!hi+y%xyA%>H7gd}4-{Gg+`7j1Hl>{TL+S zbR5R}SiBqa1LIjjQ6K^*lQ@rDWXuUnLx_?Q*Z}mw%;TNnI86}2a5Hj2W3x9sd;#u% z?LPo}A>^aA-rk|SHM72~nIi`mIk&Km*mVlVqk(+xi*~+(6m(&rcD83PcVxW2yJ!>7 z{F_kkW%NMr%+3sKKw&R-Lu0s|#kQd0>jCKG?RzDSD@>-vGKX!!R}VZ0AI6ih->X=* z3tyY@#n|)kiQKx|z~`#ZZuaLn>a(l;S*$)Y?ay)Qvy1)76Pd`Wv;9fT;xohk~4jyy*Ub3bOio^Ncahe2K*TMLrZ`SE((bS+4iKs$nlf7 z5=g83$%{E~)(H+SBIrL!CKED}krH&WFq7rjxGq7=e&KquR95w)jccY&;`&j1xp7^k zVr^W{uw!jpKVpB{xPI9Fv~m3#`_snt0{hd(^+Wcjjq3;PPaD?{*q=78=i`&OW?lD* z>nI{qaXrVzH5T0tu1SWa7|zRrz@S5$T-R1{eiXh_P0&;09idO(^g;Wu+3pjhumpVvL%UzTQOWVkUXtbD_g|W*g`Uuw85&a^z;8#kA zA-NH7jU0^ap%DyjKL_{2Sa^s4crA5e&N)FGkDa4P5nF{q$#Gm5mKKSR0?~u;Kzx+n2>GeR+AdUI6&S`&#P=@yJKz5H@QDE(w!bs&?;<>1*gUa{W^7e~ zLlKNACsetybr!Zb4hcj5nLYtsW31r%X@iy`JWK#7a1avk*2GIOXkvR|a>xwJw`d~*+4d8D8{eTF^?n0Rk`{26dj4$QF~Szt8@p_M?6JP z3^fUscpF_3*Cj}XTXfvCbQXdv<7|eHMeW*%Pb(ol6^r<^65>-a^(KQLK9xXx+UpW* zx*&^JAuwU1e-%|IJkwT?_qA{C?UbTEju!Gr8FGS;4d3+sF7fH@*|xOgyCp$sso0h2 zpAiSqYMVyy?-Ag_zA$yaof)Hd=M2f#7KkA7_tY>b1@7nr>Sv9MPtg*v3EBXb|GmA>O+QoOGhFJPC}= zHU+$jz@kUGguwnA9Nu=X2BscT0sjFjSz8x&0-!kumT>x9%X0CcSRv0WKJ}gs)TjG~ z!t6R3v03qqm#z_E=rVj6&jzOO@o3;$rleFwR$qZ!9afJxhJ|83Lm}OSh{mr5z76)_UQJ}NLWe0;f=hM}Zr#sXr;^cw#NL+{@M)}skU7S%hUjj!V z&|Ii9&0xtSrscs=K991|>4(yx0mRH8I$kjNnMau$bdvXGBFUjlQVNHYD#=%GqQZa| z&Q^x}#?%gb5+E=HW9A{~_GcbOgwE_5=gIlrXQ>I#uLnBM;<$$Nb@)UDg3JR?dy2yG zid2=k2Q8&;BAB$lBuUhhPDCKU2dAoSSVYKF)rbhr4iqc2u7XPNP3OqefSG(isY9w8 zaq>mTBEi-GnL*{EVgPQvg$dNf*ExLZbqBCz7G{pJe&j(xVd&UbrIgxf)_|5mGpKW( zqZ6Fno?3Xe$EFr+?=g9b{|Yh|GHRN-wzj1DhDc!t`*t{1xp@)MWbCn*pFXwLh>g7U z&JL8=AL6V}JNv@KIw2M=c6y?#+Zh->A&F8Jo=YSVoQU~qHW066Da+0qBvHz$a~2Y* zotP(BX^e!Rbj>nI3C^AstYcD~Q@}}uunaKi(P{W8$gCM37|YFxAWrW?YlP7RVD@LwG_v zz|L?y3n_mV*ljS+(3P5iN}1>C&q97)qd!mMXNCSemY)yk&q4hBqyFs4&k{|IdvC*- zM(LjAM5Y?kzO^?0uKJoC>uhtpPO#X>3#&SykXMjRyKRoOYcz%MGV1pf~p|&9UXcOLw)8Z9S}r-GU0+K79_i*4hc`8{0LsaK@i{#@Zne} zkZgr!S;3E?AaV%S?fhire}p_Cr34(ywRX_Z@5jR!A{*0?xM$*!NHUXVJx#<6P16S z=JvLf9O*D=z+LooIyY3b)N1@8!ed?WA!q^fB%BkOK7EGbB2-T}p4_kMTY7U}D(mLy zL7azpJJhADi>$PVaSdG|gd_u_Q7NsUO#sK*X07}?%A*DR+YA72ENSODrO+WKzL0c) z?Mbv{fwYEq+ZB+*ZShnvYe)MT56Yk17e6J324TH26|!=juJ-I(_Mg>ev#g|VAlCgb zDAiE+=<%kdvpfM=DoObe6qR+OGoANmIP2q(I(V}XAb7Ll$xqlk`Psli7Ul3{_pzp3 zh=8|1^c~0C1a{zf)px+J$9n1m_QL4CIL10*)<82?7yfXW(|tU12arAh84r+Y8f3Z# zd59wOJRNZ`qHtr*9RQa`e0%0*?y{qazn5mgxv=Zy~pl@j}+xcv;tkaq_KOOWHI0RusY1hYn>cwomS#&OwvF#)+QxUXvhk%2ZQ2Uh$cuTr(HLp`!fQN5dwJtG z|G;k~X8Wm}w;5lwnTHNjS|B#_J;Y|-Xlk^&LzeZ!Y#!=5ppm$Qw!%Ik1^oqBd&KAw zu*cGe+;-e+TDr4dyqTQ^Tl!Iu;pj{q*7RTuD(raKsK5f%H}?{R!KP~JJkY?QdX(Rc z)Iz(7`+-C=`zD8YFGd6lnx;b{2ocKD=JgXzwK6!5_-}7wKQt?j!vZARNlpj90|f#! z)VSjUBV_@yw!XW`q0`>1z&c&rhlo&oqYHXMt=qm??##5!2or55pKB>b;6e4XJnfli zjLkV`I@V?cpl2pg>-#0% z$(*{Wr=3^FlV3JqBF2yPemv>T@?)rgz(pX_kI+4lxY6#3c7`Kl0j~A-zY?$)NI~TE z@DovJyiMc}Rg~jm_|f$!-e&mc=?YA9Dv;QOT-r1I2;$o_{0q76ZWJV8i?ilgwh%16 z_`hW7Hb(~&Kd&!M5Q}Sy0vF(>aN}+BI$h(XI7YL-T`)*6)5g!+`Ortv+eRtZ@ zu3+u85=jRz|}};Wd!~`Rs(?>x#Zy_OGD6-eaN5Cb_`$=!tAfHC^Qgt zCr=1_>QBcHtT>zWjN2C;&ZdTI;JOMOb|Y4|**7~JB@@*omU1ZclfPItA@K5YP+#k-koeej49oaACfr*tfIYp$k(d|39YaY7amf$|{R z+VvJ^lhxc{t0I13@jT7zTRNdjI9`&;_6(z&l3XtA1pZ?v8*t|6N^Ajo>uFwGcbdAS zy{WDMFSLQHy8thABz$n)P4bo=?G@XdA-B0NncfZOL?ZRb6HasR zS$7?fF@eR16?45^%!*}BG0Su@%iP5*N3v|wxBIg3!pa6_tnakN_ z4b0uvdJ~Wn-CC1V2?o__Kl3gTR{{hnkfEx ztxdZKWiqSFGE%u@QT=iG(Jm#;I)HLE^cw@A&y0twf;=WTz&<93erGSI@X3w`Ecz>( zL^#xXe~v;XW&%_wcy*_}{g$#P&H zDgb9>aQ^ruye!9gHW>&ar~jYh!IHIU*YACyZ@i!r7gWE zyll{TdF87A3NIHx?X|ynX>Px$+=am+2lT-FIGFM+<0tzN2sn&NtG`Tr zNL|Q92NdB44%l(xIb!4o%*--}37ZODetZoo-8)8>W54k+fcAoKnI(7922}6~F zsSC|5<>8*9oVJ9^mPH`ead@X{{~Y4=Bg!V;51>E#SL}y!_yU5*Q#97&>4s}n1$d9~ z&qCvGC{YxRc(N2>B=%xi7WU$D!>Xia0av+G$Mvw5R?4P;GQoU2i97LIJNjoJd3rf= zlC7x!wbU#^GUVeDJ=?{05A;<(%JS#hHCJ*8C9e@bxX0c`#0xZ)C+0j&EH6!VWPc1T zXDjpticsca-OPJ55PiETqWT?xAcB_lgjxf{^=4Y)9%KNOhOwgSM~T^Z2O3K8V1Jp7 zI1vy=Qc(3by>Z6N>UwLPHnB>$az znKLIo#~dbP`j(b<=EkTT6*oSz<_@quMDJYb@toj+lVQNgD(x3lD_qX4BRjt=G@1${iE@hz?$T*Xj7wHXE2BOty!^yMDP49@qR>yP6_6Q?7D ziWV|nGy4`t&R7Di?#|U}&{7=!|L36n-1-K(A2ht|#$O(=XOPxU+rNRDI!d3MME6LW ztQU`JPev6ak9{bM+AoQP=#*}68QB@7UBB8m%fP32yt3Xk?SWhY)Wc0xHl>U2^}y?o z+6XZxu0T8#dfnUZpzWL}YCeXF`c6&EofkQpJMJd?mLl8gR^L4t@&U<2*Twus|l zv}-r*i;JDUJBfoeN7_rDu6uoReBedU04KNDmJk@tPHwTKs&l~+*q3dOL97EZ)ux(n z=_v1MW4fc?l3QoLc50CLGt7NL%ecK=RI40kD-z&-gCc>qUso-FE5+Ajp(V9RTFhhP ztvfajb|C@Qf?Z zhSt%!NOGD=d6RpG?}3XP3bZKrC3pB{Ai~+E>Nk~`SnyC10)588-6 zaqaKjh6oZhXH`XBc=0UfZWhTa_MDBT$C0eX*5vtFrtHd%|H*y0T8-ZETzzQZbe2#%bsk;+wMaQ{*jPKKm7V8v}-PFu-+ zz!K!D7RB!%7vIubQl_mS;_b=IHEoUiJ^F98q~op=y-kLev4yh54igZ(CduoeI-7=M zC|)V$ObT3G{jslV4&bUj7JW`g6govv=*|E~4%Gt3psma0FJgvx~{su}M+-@h=07r~r0qjec>*?)$7!SF`-ZA)us-{lI z4`;wft`iZb-zyG#ucjOp+>gbRe;jS|S+@L)Ps~_)JNmP57AN z-QPOgBONJVft$iO!husU_+zLVS^X(^r-p;?!|`5ezw?xN1>WPM$tv!|8(Bp)o;C9W zRd^JxEx@llGwmmZLxvAfPp{~r3eiJ0fNd5RVxJL2FN52$0$vW983qYDCUfjQ-ua|h z0PIFTxBdWy6}bR!l$c<4yT&mHeiqimiFud->R3jS53v7I_`trjzm$@A8755!-WqGH zZpRlQC__yp0p!}AFJvRWJzqHWF{dvRD1cfPj0;v0R2vi=;VDRTZ$x8UbO>YbRRf8m zVHN=Tl5qi3@2s+6j)0vx-B}$ySlm&Ko_v(ERrw_xNw}jE13qa{Fa;^NUiZrY{tw34 zPOJ5D*B&*LeaTDYcoiwk43uXlM=niWddMYcH1{(8+O7xIjB|Q`XQz~JCT^2_!Zjhij2H&z zr%iW!^&WR2c`UAQ+Rnvha-;oj0WHgHyV(5AZ%7-`9_+RszPn!gQ18^K-1`D|y;#xI~R39s&v))-n=j3k_6TpNVkVYqRz zJ;P9fV`l9(2$vL*M$`u3C#O0aggLX6JW3PP*siu4gtL)C^`A_7``#eDuHV1CK{$^? zrsEAl$DXO}z99AJ`H{)*0}+4ki7Dr0WWe_xc;{B3Yn$-RU$tFnlVx_aO~^@uHmmkF zA<=jp^i(c=S`#5K`EOtjnEadN=?DW$+6V*WPR;H2eitB#GAO2%*;^HGNdXZuIY&}^vsrP_1?vQB3*5>x>EV0XJm0MXt z8;&U%Nd14+cus)DAfus*jMh8tUoY)%yGL_pA*2LcM1$4ye(plh>X_Ji&)M2P7OV9A z+bV%`G8tz{CvRHxfg28FicXT+UcndEc8czU{noFOmh{d*HIz}pXn2h>70lp*yc%|W z>?`jwWr+n|TWGvdgni~6E7I$Z#NKkDu@0XNJ65FCpNP-8eC{`^t?2qOc!#%_gX_=6 z3#^%-kKLQD^s)1xl-2s!Q}pZ*h}bhUS28?4Pa!zM#iy5B6QOvYKnOc8xUszmN^lch zA)1V???m7vdL3j-y~g+1z~E}LtnpIb$^4?{r2{I`|b}3ZJ9|T7>t5MP+mgK^@B1o?$0ji|NG&%19~E%pUr3^c?M{x6jDsq z|H}b+e;69ckE3AkFsP3gV-$Yrk7vfqd&Gkv)c3hVSnQ0vhJR<|r4GAeP>@V{FvdWq z;5@V~;ZMB8t$T)?iHXyslTz!E17urC?M*`Yim*_;K;66`3fb7mUyr3Um(zB|Y>o!e ztD})PQK)ten&vvotU}2q_2z}RO2b97PV*?!tmHDgFVeVVze@>R$2wy9sT8N%tktCm zgxi|{exiXi{LToZ<9B?Zlk~FEr@lvNen8rapxpJCB`>(+5eFrVzc+5_RJn((oOuiu zU3HpcZ5stG%ek6|HsdpF>=F69rLQYuEh4J7%-Yy89MW*D_fufm6IsCOcv&5J&x6p-biH)rO6?-=2PK~ca>{*ZtL`vOQN( z5h3$#{rMC=<;*1fLU-s!tOfvd%;ndf!j^bhtjl4_6#!{DG&MfyOsoL$R#kT@{Tydv zbNVn3w?mAcbOu)CU5H?R3!RJA%#jaz6+0aIU<&r&hsvtS<;lW2gLH3u7pvS&%=oHL zK<^meVEcVS?I^fDv-91TpRp&AMH@e3^AUi-V*43uS7aHYU1UEMpNa7>iI&+5{EJlW zTJ_1TRAvrHM+n6_1@K{mR|+NW!eD7LAgFoL144}eY6rRaNEr#YM>rBvw1OX>o*W5s zYJ7Ftf5Y~!%&ctAy6L=I=b7=Oc zgM{Xy(8oP15%DT{C{M~QJ>aUbIkR>SgkjpZQs;+dJ?{)sF55R*OMkC2=wnXM=<0$p z6RkiLGUJ?B)llBYoTsC$k%(?aG(Cy+G1uvccNno25srIzF#z(ba=C}I5Sg)X<-&cF zm8T2Oyw&NeyP3&sWWxKYD24D3uM|Z12f}1%5KrC!)Em$H@PvAyN*ujoMfw|jN8K1&#un!UD48jy0Zkti|Z%;c16m&4{T#q8#O*=F1a)#Tv9S^r$J5`%$ zC&E-R;07U;Gwlp}!Jc+9Z^N|HdKy~zznOM6yXKj0{r|gpW(+i5lw_)I1xs+vGsUQ` z`L6Dt5Nm%dK=w7y_yO<>^UR*Se?8B9ig;^K#{bPcQ-RDooM$l0T#%f*_BF?ZSa-KC z%Nzv!i#etjqFszP9iNFSF%}&1?r@F?f=<*N^BxW$*>g-B+{;D%xDy*&Q^vQkFVgE1 z?4GUop{Y2}cV)*mrq$DSyiOfaQ=vIh==x?zWr6h@4JhC26JRE$+18y+P(mEx>{u0W z$LjMChs*J8K)Zx*W6of_o5Y#4#Cr*l;A>d}g!OQ91#RO-GQh9_E5CIVwv0s5KSXer zVok?_H3j>ZLFF9|jHw1r%8rXbyv#Pg*VKL<@=qjyc(YV@$r%j$JHqx^Z~-qsOD*-y znQDAhKY;2;$-e5l@hYVsfzn4nHH=FwVIPQlCRmN$*E%x%Tc@DN%TXlQaggjf#Gg@~ ziYbBc8O-2_!_kCp$N*h92F)iv#8FRyvEAMDzIR9^qL@c?dv0Ln7;LR(vksfcux~k! zB&&0*uFgotuGd5yTjjnbx($g&K%&(<>Vr%=20spc`WrWP0{snj(_b6PyW)%vC~x)f z6w3RsQd8dhLP#Vs*V16VBydsQB1s^W_oO69p}fhGz(sk}kwB4l8Q@)%mj_4^Ko&5~ zwN6e)lt*(CH~QDiP?UE#`aj24cJPjHAU6|}de-gEc>i)3Q2QM_BdEjPX4q#o!F5=k z5L{|u7pcO0)wFDv0)5rgL6cr`W6hbMx1nVNNoszxTo-m33&T-ol3EU_>_q;YL{b|j zq=uwBL1{xlX}O>@)`ygqlR|0F+~!c)LY;R8^X|*WZO~!go{X?GgsF;T&TufXff1IA z$RaLLybX~}!*&aa$@D-NvBG=zK&fbV2NbAN+g7T?pb5T6B&Oma^D z`~(o|$7Mt5lQVgD$r}h|t#d}jhxyIBbRWEk@D@y%?PDH7Ol)_TvIAXt#}I~{@Imkk z0-3Eah68VTs7yJS1JtDMT3p1`bQ0mKdJR;Eweoo47;9zBh<-NhxHNnl4dUknH#p=} z)Dyttn?IXR<@tU^Spu1aJ<(xIv7eY<07*P?7st|n(r-6kqDXos3dZo7-ohQdEU6Oe zAPg~SX~$vT(YWYyrDUQmI|k<%A_GqF5zSa$3+$Wobr&3eJnFj;TV(Blp3^{G33NMv zs8ows2mH9l7J=JJ4>Ar>sYC_n!^Pz*H>f;8BS z%!Ep$h_7CpLG2=549-1?_3mGH_xr5t`{@BJDp5Yf^bh@(GBp2ThAkMhD+N)0Puc#`x-dBL$Z z!i4>!KbW)2CFMZ#NA@b~W*wtpxi-c=DQ+vYbieh`u{{wR$K`*_=^Z-t@*A!84(?~x zeS?8_RH1y7Gn=f(!6ATK0`7vGW?Y9Hf%r?q8H+i^b(z;Gzeaesk5?sF0J?~eOy zq_M~SP`;{hpTo>SX8{Je$NgK`zclWj280^-;~>Q#adO&IC!LU%WGd@V8{J=R(kiH$`cd?06kg=Jod-f=Pmgvs`{OqoMwsz%bjgI~4 zD10u`pDp~{pg%w1=MbItul&rM<&e;FerD^>7w{?VTTZT^SX;x*_Oh*N1aN7VXyDlz z*iT@z%46M6U@GmZ4j}LX4SYUIDeJ2wq;oAJi7)~5{ka{0BJ+{3L zmCsBiDe!K&-nZNDV3wVb5t!xGy@gq(;VX^~g8u|BUXiQ^MeEPJcjtb6Qn zq!3z2M34+aiN&>H+2eI{r)$_jfK@Czv%(>=i*)Q>)O>8-7Oqbr{NX$rz3}8FFO^4? zr|C=&XO+2?BDjlQT5r6(tBZt^E>QV828b;>B5b`_yr(*vQ+Dt*7g&usOJ?K40>c7v4aE{88^?>dbie;<+PK2R z4}+uZ1mDsX;o1`1?l6`+UUG|tuG60mr>b}(wE@M}!4S7$>j!Vw@XTdaXrS2ua@Fi+ ze1e#86+vcfx7SyVCbT9l0xdY|Y4&W#y)Ks8dz1oCc@wjZH+mEp-^WHiaV)zvWrN>~ z;%w6m!5)>teWACo8R{mG7@|{DDeoL6iFBtjQS)^+f3JB-rAg7FJfhO*4rQ8WnMU?z zW+9CW3D*J0A2lpAnq4)UdzIaqdD5C_AhU6!oc!y`lYcnj8V+<< zk8WZ}g4qb};vnP82Pv^OKT!U*PY z#$O`77dDv9xYl2qdx~9M=*{i=o~Y}4 zva0V%Qr|X}$gFfY{SBx@OCPgAWA#$j>P!%Rgl3GV^QF#{_2l0yR5X&e@|H6qb*)ba z{?fg*<%P)3uV^jVm*5 z;&&=T&KtMDi1H(NNyv!QjV@nu+*~FcDvr8s!Ne?%ULR~w!R`% zUg^J>S3u|08+o}Xv=ghmez(J4a0;Pg=2E$N0EJWd%2x(qdbSvQ6xmA3g|E*Yf>lyk zijMa6tMp{SRbM-{QZ9)!S5Z8?MiPmy{PB_~g|Cd3M4GLrMCVDORh%XUBaxY-NvjXQ zQ>Tf8E_T?^cj!77ZZ=VV!)!n`BsD)-5re8rb33Afnt#;YnAv-fplZGj*n$8`1s*h8j=?zsfxUr=JUzyT z$xQcRh9+O^Wj?3#cuHkz>VO3Za3|{8K~18mHJOY6SEr4~XQI;8Y3!JNbs8mZZ1<6L zgHVcQ+6zhb6|h&5>dVhBzXJ(Ehib>({&Q`}Ty{hUl40XO^l|Ft&hK6U{M-96Ke5kJ zZ+DJMs+7V02vXSs+iFRaGT1MWL@9%Psw5KXn1@7WgB}z|0bC7s3_V*WJnjNiY;|l` zD}0^7{&$xPx4Q;#wbdFu9-YkuvRxZ8EE(wEV6lcf<<{@N;>t=q4CHj=K|C@7 z&Tq=THh1Z^AB%*nBqgMxxL168N3dv>j+Wg9+&<>Tg;UrlOjg^>ne9x%-}EN~+F_RH zkPRw?+$CrgL4pQ%`KzYxdc?Yr`3yc2^?I|gautbjUxZqYI63?s4NRl4LOYw@hzaM`zKXNW2+Y8edjTZW#QQKq?ZD2@?5A={q2|9{PEtcg z2covjV?6S}eobO7vXP*uk6kh?Y{(u)iE#|g{@7A+txKb=K?cw`2Zyfi9wMgq^i}_v z82($cCg$u8i8=4XvQ34PSBo2a+`1Vy7K;=6MRZ~xf|@>5=SM!o6@@olk?+e%^147x z^){ULWA6+Bnspd`WC&!_CV+S0nCmne6McY2==Gy#v&cN+WA2X>nrQgscQZ0^!I{SGOoOTcFY-OF~rr^U|r8(B*O)-Sn@$~ zx#viHjVve0RKJh#smOu*bb~!JujYVQfH0y3tM*}6dTfQn90?A`Pb@G_jbG&r88>(% zlm7xl^3bRUj>$42M>j?)8#9qaEIa z10F+wJriNFP>kmBabOP$DHK$1Lr*&miS|kuYmzD2$vm;^Qvn!N zpTrit()U`3^fDR#5c{~uqG?n-oSSJk2{UZj!LU=gof=T)z(1v7O8g10b|0i#4hKf6YEx--OCwJ+?Zp9PHJBp+Q_oQ&N9a5;t=zE>7<%@eL&8MT;P=*$bN%g z_}e2;OcEB_ODxy?PNU(p4`evO6GeJ~!lfoPnG7rTM0=wN6=(^!pNoyNz@|=<{)*Hp zAG?sadQgrEMr!9P$1JfG*<_@-tniH;VlWb)*8}zQEv;cSS+j6_F$Z9Lkr%(QIu6{{ z=z$R^02?hoaLpQoj1O84W36~kWFDJ=Dn-<=tHUR*RmLySL15|#IG9Rf&8?BHO{`%l z)z-qGNN*9CzLh#LT+ZCiz1?S-6oYRupT-)_JkLQT386PyD8kFPv=CVms6f2gtO@@K zA7v`s9s3B=wWFA|6$8*9Tx*T%R1_DDj_|$mTA&#rQybT2`d)#WbUaW9=_}Xzej_H1 z$+(}q2QBv45-_7TjoHj2@h7BLIEdzPU`R!4FX$18t;tTw(t3s&#UWT2X@Z}2H(Znh zU;7ePtPEmc2I}+UCz$VeZ_re%oY>177=^Mw!P9Y?!J5j1NlkUG<;8J1Nplj?6vc;p z{$l`19t||$(`*{;4DV|Xpn|yXZxAbo94L8y6XfWgdD?Pc6%@J%*u7zo<6d(JMSv?V zaTEr}A-Or=LR{*!>7zZZD5e}4wfxSER5=B7Cq(A2ozI_p;xnQ@x8SpA#E?-)6+N4q zq7ztN3-aP~{Re!mSYCtNKnOxPR=>=>t;?CA4)HRCdFqhwy6kPmZb}K-O8frH_~a>` zvxqhoj#1+!O@h;h15^3tH$T-v=J}}CGVY;>+FuIhX`n9n?t9%X;Hub(vtBzxO`~6c zLzquq8TKqgrvMIioXMR6UsV;N(b5S>9PLk9%U=F9iqlm-16B6Df-2Hm_T{KBh7r3N zq|RREBJq6Y>r@{V*4pD`s}K_s3Ug6F^;mLl$gj&P5bd-=9iDE=mW2mt^WLBF>-urXkQMZpb)XsR08|aV z`Vdlx7j{l^4ZyfH9GSWn8lzA!uF_>xX<0WgwqZub)hN*pyD^#{MxPH80cSPjxKC&1 zRPJu2Sas+5;C3yv{2b>gJD6@!{IAlw1Oi@X-&{@+Eg9^JG~h26)rbz}80SDmhGDa! z#2GwhH`R7o6gF6$V%yVz3KQ$1+cP1^k$PZY_F< z>somJE<4K&Q#iihBEWbW2venDj&#G6zS+IIhA9CIS>gN!-_j;bXt7oPiSDDRm7B{+ z>0q@Y_Wc?kPBRp*aJA&QZ<8(YRnG&cxlZ%C!Dx-?sdl<63!f^fP@7=lFwg?*K*@}9 zxIluptRh&j`Z=zHQVS?VxNsk426aYj!QdRJu8S>3{k1@(x(P@_5$NayNzE+RY3@fF zk}?4-Z&=A|9}{M=hPgrKo2+2PcvevMvdTc2t^p7NG^g0=9{`Oi`l>3>B-3-J(_TNb zV@}IwF@kT_iO3E#`h?WuXRasMO8$W_^EHTP$bOE(vlT`{qw$2G#Hu%1oyZ?@rZ!rc zhzTQz)SrX*0=&1(G;?+N3&BEF`4z}tmH*;-?($R09EI;TWzLr}c{SMpyD+|I*@f|) zl^BD9;TP*nJSh8>NS&4hNH^U6q%DHDfyX!19)5KqfN}sXIs=he&p^2*bMrHRWOGJ2 z2g6ErW7c=Zg1i`m*VO|i!a~L;B##5bwSj}lCUY8_J7LBku6RB2Bw2*ZDvd{!5A|YW z1TW!3Ws7Eoymm=bPuZkd0U2~W5*wd&!YTwWX5mz4bdE!LSd&I#a4DC!dDin_SP(*9 zr6p?ezT{&7L_%XG)*~TBXb%C#>GZ<2>UuJ;xL{D|hCbi%6>7lGD4Ls(P6HlUI8p5C zaLfp*w{fFq>`N~+TLa&SeerXwu?Jrp0)sQQBP*VK!2g+%$?syel*Vjl4~F{$YeP6Y zYJAuDO;*i#FTT>%7cQsu24jt#B9q?;)|$W@_{Q2Ap_Jx(Etk^A2<`0 zmeLSOCJz&H~i0{uPa&$wDIoaOxbdq!GWOk-MN*6B;SPnw{DP5^7b0 zuPR@@x0^LN&bV9T1*r^avt?fnU>DnNV^&qef{Z<}kt1MKfc`ANK-G#YA)naD=AKk! zrEInYQBJ$fmSPwq+Wg`m6xwdHrMo0b(O4ZUiA0t9HCfUEP4=I3a#$VNhgvai!2*^m zSKjCND#R!c%u){!+|V-NRf=iQqzWo)X>eXUI!(l&q}qH%#75?HB;ZmbWN*fflI=m# z*l1@nw(=)Wkm3@4eB+v8KXvlm8A7VCaopw~19%Kc;9(rHlfQj`!0%K{nTaC+Vl9DX zhPh6+B@1nd-NCygSE1HwWvj$5^8I37BssQrDsCLX!b4pqiQz0~xTr$%$1jPFxCFYf zYmwM-IGgL}#+>UT?ahYc$4djF{jC??R=TmlLFjXaAZa3oAGW#JXcG0B^1dkB(%1J_{gr&xHD~((}tP| z4q@f z7vb;}0AuXK(HN&J;~i_wI&uvzsPPlzB<8pNY=`9(8mqyL!Bil!zx~fW-196ZDMQ6Q zvu_;@A9ikmc_O?E*w%@~F6+c~d-lNnNys;U4V<8KEvVYztGW*ZQw$T?pC}&J;f0Mr z0A2@qrlCmKKVtH+fXan?59^wc;*WjIF&ddSBHP4pWWCZqS z2jir`_~~yXC?BG|(MfeQCfwQ5fhpniHl~D+A$d6B)2as_&qvnlvNqBjDV?I}{EK zXj9b>&%_-rDJ8aQLdSfdad@Aq$X=>H5a2JZR3C)bTKxw z$euJN3mBIS1Y3wFZsHWdMc|Gtu;E4kj=JS103o(c%ICLj?o<_^s+$&1$}>2mn%Y6> z{9=v}L`!^2mjr%~cZj=zn;7v26>&2J?AHR1<3l-KDGTjT-Wb!OVP#9kdQ~94O}+9* zOTEhc(0=e-j3?UfrA)C|Xz9HSorT;o@rY*Fg4poI+eLPIP9DcSjfZi_68usQa4wp@ zNm_#?%35W+b+ZU(M&Ega?)e~oMLCh6CB7B8X)pM7jWZq5Bv{E>>rt+fwZLS`SvPJ& zvIEA}PKU6ia1yDtwbWo8L2|6zaQupBc*GUuzBv~mhs5>xDXg6i-VzN=z@8MUMuE-w6seIMtQsBQsE#7oAFG>nqhKAm^ue0L9W!ai)4n-eDNhykU`Y75#jxOq< z=hSl7#BYm%VdD>!1C56%|2cC!xN+22%n-cIFcwoHH15tk16vx%B+cmrkqvvOd&sv# za6sF6urG=y7&JPZy)GhSF}ociW0dFT;GxJFs6rcRoN{)+^xS9Kj3wyK|@6d3f50 zUUfTcWopZDQjMhS^;^Ve>5cVN`;%?~PF3jf`uGzm2vJDlWmjf42ev2VRi ze2H*t^z~o@)3i+bJ7xtma>;cL;_W4uOc-LQOyn2V-T-5S3;i%ikTES=Wf3bq;@8oC@6dQuT0r9^(q&*26N-8XXEdu2Kjhy1EccjYyNUr4niL~BH(%?ae zu;u?9N+dl__LHK=x8H-07iD?lUJ=T3jdYQbjLbF~=(cvE?R|!4)7928&Y!S(mTpoS zKm_1u-i7v3M3e=*CJG(wH8#9!!7}UXGz!Oh1W$%k3Qtmiv9%7<&!A`&`*Kh0FX@nu z!ynOWR<6enPInv5URasbzT4S&3}+r1l$uSBWK*$mZ^b)ltVWmzH>|F%#1WnN^Y2pX z@Xym(hl-7RD&9%A6Qcq9YAh?O^GWRPY-G9JQKi zgbrXUP`zLGuKM`auEvJIEMsNkS6*Zg)ENx2Gl1olDlZ2aa1&$J%&gi`zUudUg)16& zd5sknZ&nDs*A&B)cfx_lq(W!%!FFlzEMQM%(vr^xqtZ2_uqDqG4;5X)vrwh{*tRrm zUZA&i4i6v)bWA=NAy+u;alhL0YlE+zxTUEdwj)BZO_?p|73af?*Z#5>_qC5FuePHm z;rQeMJ4W|Si~2BU2Sa7i8=x)?ds=V+;JiM|i?B2zdIktjux^EtIJ9$>2U6?ua}iZP zk@3EQ?{J-LFtm(8@Id=!-6xlZJ(YVX7ex=N`-;iZy{(|6MiDTaN{yU zLkHbGddM=u;&7r*Z?cWGoz+eS{fhI;NE zVVGLw`{uq6o(Ft${n*FMjyvRWIv{09jPQKbHN_)j4Gj)avkRMg*t5*{-LnT0Y8ylk zD4e`Xm^eET)IYnQ(HQ$8v!$O77s3x$O1M{tg5HqqF5l8(bjROAv9En0Fa2zxkS z{BxW>yIa8|8T)SmL+&^PKeKw`PGQa-VPDv4IgGaq_lxc7R7ZV^1RW51omL|)okOov zU!hwKL||)tc7J&FjeWU2-1VE9tk+rPQ03l*cti)X(Up6JvU}o%)U5i78iMTjIVtU* zpzHh5=G69Mhqz7q7iie$6|AfMgk}3J4Rg1GakU>XZQ5Ufx}mY#UF~PRCFp?Aa#kJf zU%n7e-F_j=@Lj6?zHry?YO*-5b#`V%f31W6ZmH!Tit;hBzF8XkYA)(w&xqZeloNEy zrj`^!{>P~@9lq_Y*tA=v)b)}6@Xj_S3;?Uk-x2H!8+jcmV{1}nALBzkrswHWu4XA8 zB?t5@7P5llxa<&}gFOx_B7M`=1p9ar_x{w{sw0s-25DtQN#DIS#eEWGh%-0n{JSB4 z;TbO3;$V~kjf5HsX9kYr`iUc9j5**Q2XF6vaXSO@p1J!IGpkTIID!1NH0x=upWETZz#l z@H49iE=l1CC$>ioK!)^C!!JWdAFgdin%zwEab1O^*?=^=nPzvVIub2z zJ#Xpps*r5Ps|yieTDme72?wLe8s9sdJ+a!%p64|G;trs$5vWz>Gz~ROLnSd;04QUv zJ?-AGi~Ud(@XP9hlecES10hY9b*?A`d(DQlomO^u#by0=PMz0s5F@%H!s{Cx#-Qsa zv0lXPj_qlkN9({)|5)?(u2v16yIY+AU)K!?h@S()fh}bju`lPsPis?bT`9OOhF25z zh08K3HtuF<#amt+3umZt&VX2JT3NS>LeO-mkEi9xSZg{yFYCKESaV~amj1EUPG!CM zSv#f^jNuE{{C~8)4SZBJ7B)Up1}IRt1q&2JDKco4s#Vc#rIij$VX8%|q9USJL9B`{ z$_%0cZJnufwhUB7MORn+Tz1tJ6`_3C+m?^wcf~JOMJtHjVL(w=C?NEGp5)%lZKuL_;`g#;0%#3!#f;+LZ8Qw7=kS zV~1&f9ct4^fBcRXMT{)t(5u$zpzF{xLO_<^C8jEE5f5s5R*OeHpp42V4aM8moD;&4jb%s)Hfx}MqF8J&GY6wD zvcSDm{H}ACiC;f$lHU81Je96we)Oz#_19K;@9#A&?7CdIPzoMQ4tzo553Dg>ca~nJ znrzk1!>vM>@aR*a;^9&8$=a&P(~I}5Pg`>%A__F`r$SA}!+5LBi1&rI3~T3$86*gP zN^8s%yf}gNG9GuZS*ti1;|c&1^|S{p zK4}1eoJZ&;N3zO?nL>I|`CN!j@hyRY%SDocMqcm7FRS=Z{`xO9)#v9<`YvEf1_ z#@uVu5vq<2TFY@2>npaS>V=2a8LBZ4Jx|N|6{xDc3gZzP%Dl8V+m6%#@+ejV=LZWI9+Y)?n zL1+_z*y?cMywLra*IoVb+f!TRx*VAA@1-z*(SZ+8v+2MBl5r#|3KWsXZ>c`ez6o*c1F_FBGu+ZaZz1 zY>j|-zLGo^AGKc%k5AFUF2{980=BWO%oA1SMMq_R+RS_?__j-B?qthctukM7ROTDZ z%=?3HCyLCtw=}E{ZN&Wbzjh(zO)7sMGe4V4%9~-x?A@}k!u%cJHFuE__1%K#|A}f?p6td9=3R*UO?@t zC7}}PBSJM)<-6d)vJXza_X=)yhVxzFs}n0PON#XlHXlK#F`pBrV^e;T!=tSlduF7v z?f{R3ALw%DMN%F7uz6X&e@xZYu#67_WLL?NI8gDeK2eoE#-uUM&X=R~@*S9wTk!Br zx2-6Oi-4qpu+gqh=*(vO*^(EJw{gYZ&$;{YgYoP0mZsX1!95JJIosK(`HE&p~ve+MF=vqbNv-7eoHp26a|bl6C7Egic@eAYCF7p*fqf;9w*##ifw2B1}N zp@4;3h7->FniSrPfLB0A_k$cg`4Out&Ot&jxAj{$HUl)hM8zMEc-b|BdzqM-pO+{y z8}R{71TC~Rz=oO(<0!-{1~HD9F-`iF@zk)11${i=uEXa5tu>myTotnl_hXJi#4_4q zgAE$DLfT-vU18g*u-yb~x?_n|w@CMW%As#4t6hQL{neS;jRev2acQh>nk zLi*!Y!;iMGmG+C465Z3Pppyu@gYr4K5K3vHwbSHsn;Uc5!q-tn+eS9+Vaf2wnUF3^ zp5>{!ER{D#@eW*yuNyDNcJkG{zyH!5&;4~n8hshn@4|IG7}3b>>Bj0OQ2`iG5y&)l zKP3l&xgptDPlo*IU%vexZ1N_Z##!&O6YwV>cFi*NwV>PZe+-f@_Ee3>?FcJ5A7$%r zsajo3kkcg5Wh6Ke1UG=fi&Bv1isSL;&O!P%1wRDvh2iEmc(p4yJJsRuA?BotJ$EI? zhWmn8mF{r{zQwvX_8l&$da6c*^uJwdEpNa12z`Zff7|Bnu=Ue>h~>^yL2x5)%cpa9 zDpgzbG(-xu|3sr6?I2_YY&z7|?J7P8k6i7>Sz;~_MzKZR*1<9{@Z|0NV059Mk*O*& zF@F?BR=CTM${7rEDYjbm-KxTwK&BTd1{uQOY!&RoVAmN|1v@dgRHgpsLj>zoa3_Pf zA8ao6KVfi`3N|9Rma{@I_adDGf2cl5CH|AJvsCb}gr!*l%9x?>S0Gkuo?psw_~>A+ zK6tz@GzJ}3(8ylHkG!gaUm=+Bo62}kcKeNBMKt9KYq*b>#FL! ztkz9;$K?pY-r8N8zYeoKyl=uB)ABv`Dj!e;@7i*hcU2bv(h+?aPDj&Pe7G4)?xA@xoK5PgUx`2dcsed6h4U*S0Dj zcRwiVPYrm60(}plvi=Tqzg`9qZs-SL*>9~1RPrV6smA^)4w9KwQKr1WRtmWVa4NhxfkHFF2PQsF1YpZ zy`KCxi`TA4y2*!~y=J$td)P1bdi_kdm10VoT|Aq`%47HQv!X3)zN_^CjeY<&+p-JKx@18VNJ|p774gl7<`_Q$-_+>X z-VfoI?M0N5y+~y`7ny8R^l${D-(j;)*dTDYs(b_I2HQmZ8&Am-3Q93or`SHm&2eM&HTJv3 zKZ5^2P$m__tkn=!t#T(3>gqkig}NFT%lRk^*4aPzFjhT+H6gI*OBAKm?|{oib|9b8=%*zELQ_YR3s`M25>xWHI-Lo&PQhYQlC*^_Iv?YLoC_&VNRQ1 z7M4Vh4tc&t2qJtpjuBA!H5q7(glQa;#&nz}n%NhBW^`h$r$N{AQw`yz?K;!{h^XHb z#X-y878gm>(*VTsTWp!mG(7E)hF^FLpwfR4j8bIE0eX?D=G8zc^n~ag7!$D1zAGHZ zKvl)NM91sKgg2sIO6~AV~=9}%BFPiKRv^@JFjW|@Z;(alg zw&@xrSO=jrp}uqF1otekdwplUW`@LYzBRo- zpRhl0Qz02um&-<|E{!{whD7@DLvMrI!cQ^9=FLWNO z@bv*cz4~^Gvl5VC9?0gEP>B6`Jg1!nvVEvWGorwmxI_&*mZ$0(oWs5b$FMt#j4IAnuQBYYlvTOw${nQrizH@wq4uD##*M>@TeXchm27?LNt*=__E?WW*%$s5=3 zFL%p>;8^;X<8|R^KFnNf3FhGKjq4FPi~(_bgTD5}f$j_NVO;lsT$f^~b$EM&{u46; zJ1wWjc*X>H+LDn4pHmck6$imhypTZ<^Fqc4{Io7)&;g;mkU^QjD?hFTA0%ZZLN%N( zeAzOfRZxffy)tiw_au}VxQ)K5M0xb<9CBOb)iWT<6JKU|aPVCJbs9@)f&Vutebvcw*K$DU&X(zY@TD?gPp)%ag@q~9rpM}`Pr4Q_} zWo8?5R*;Gfphi(K6!rv|()!E%$ zK;Ntgd2BrdB^nlo^dJm9RoA*KVY*kr%mNIK1U2*0(^UTe2;(af@#oGYJ?mMk0WKj7 zjshj3HA^s|m8g^~Gq(%5r_0>knY))>tzc3BgA*gztDE6ZC;lFU(DXV5@lylTvArs| zgTeUY4<8|j)=!1>#W9QRv<}Y+Hk^|~9F1)nmS?PNrRnOh584S|EZ)|in50&U^cMD!0vM+(417Cd`(T&#N)hEBaJ zdoR2YXFg}49SXFuhk^~xk&8w4IsdMXQZ1AZi|;p1ft?r2Fe`Wq`~#X=UG!X_hZ%5= z!+)8T{40!}-fY9~HHmSq=JZ%2r$_H*oO7$4kdOJY49XynmDe!DC%5#8ilY1Lp_$W> zCUE;5fom+>dm&&k6PBUs{(?66&FR38IpzUUBeI#qT36}U?GcTA+sHU zJFJ}k605j!6o(@*6Rq$NvufiyF50SEjajw5&@tn+TdHdJ8mFpkx>)M-w}~v>W_?yh%I7MHrWi zF?ANo8>tS=>8R1P7-=|Dn0aK8Dz*e8_kAI2r#Y0OlxM|Ucvxo zW$l6F>C(Bc!Bovk=)ccwl0Z*@KudY3PFuOvJQoEcp0}HU|F+`!wK_%UP(|oK5Q_7u z=B=yPv-%OqJz(B%);w);5_|ha`Mp<9{JYgypVVT4&^d?0*`e5ymkYNY z*gc@x<5d@(paeSeyk{mS?k+%D9l(k9gn$cigK&l&_qDJuj4_%x&9Wbq0&VOi47+9M z1cn8=U8erJ&`Qlpw|hzdHFRncxsB&mw~VV%LI!CZd)|VqA=TQp~Wt zaSBj@g-Ig-Iynw%CQ30W0;gV-11Zpro2I)1%b{5;cc;; z!t5B^*MF9Yj@2*7-ZpC}aup(5iORNZ9c#DE28Sbo1;Guj>=y;4+M)oM0%R{GN&X@F zQkC^-WF@jD6;q8E-xS%Fh2a=q;P8dF`aUqsZl=K8D*bUf9BJZ#i@{vc!g8Lx%wok0 zh(wG)0Tcd=$rDv_29i;A)2coO?se7i%bpln(MuY4Txrg2;@&fCH?)oM)au zMm$Pe;iibIa`i*6d;6c}sVwY&YOtQVpDTNTXwuT{W^>^1vuD$|Q=Ry8Mgn+~tnCS3 zk*L=xD$hgda?TtjXmfH_EE5V-_(L?N-U3h~l~63+7yu|*Sc7r87|aIZddrs?F#&|%@7@blrc|$k<$?ENi=^= zFpunuMo${!VKJNu=)U+R@&wD&hhfNp2Q4GH?b`&*T*n1EEvTs~&G9K5iR*hVN4SKys1!o~BD2$#D?x1nUJV(S`AZaW(*dGt? zg*U*w14M7D8s)S_bgDw+1fsIp{TzVasi1qcg>J>3xGeTVR5N%uN1OjIe1r|`3Kji8 zXP_`lePs-Se{r!$F~gt3)dA&4l*f<=(0>wKg2BIgnHgSsxeU)hc+FW8vF(R$6p))Q z<*QDNK9A98b`edlc+t^}KIINX(<3$UKE`OiV!8Stsvr*Mnk1BuMM`g`bV7zTydGty z+{hFjk6B$k0VzDNW~Pj1$~J_B>S#v33=bL6&5Q&x3-U2W(iCh0rF}2!vos#HY8ODN z5hk6Pa33b>Z-y_uP=sSMnRwcGoNf~5jAK(6?gH;aX82NuzdT=s$C%}XaMzssvS*p$ ze~psip=)}uc?Oup+;a&oS7~|*;v{>YzKZPqoiXxW^egMr?!=OhH*3kGSkO&(Z{-2Y z=0beol%?N|Q{y2$G3lZ7s_8Bs1z%{&>ZLnvYO zA_Sn>ZiaFbY^FPej2iNh;2LVYu)JpJ&1(Fdvl0i}dAN?775Sk(qJXvET}dPbTRrc559$Cs5^o?jzHPU$A#?=44#R@;na2*d9CyJ2ALpzsSuEzM5H9CCdfaF57YK z@Q+7YF)v<&OBiE&(Ntah2Q16KXVY(#CVkkPr_hvNoamb(jK1EFdscegH-LXXPQu4j zJO!A9`Ix=8-#9$)kDHu%RK{k;C+k;k;@lzzqz?<;N-+%Ob}VhjOAw~*c&YeZAvDuM z7?Y?sShi$x6I7!P&pZjT_X|AJk;df`)c3lR(2Ih&rwq#+(g5Dk63t7&ccDF9r)zKiaA0x740OP>HYx*{*AL9IOCBDq}(u( z%-c&_d6@%yB-7xc3kt4J4Wum8;(uuv-1k|N2F#dUSe;L48fv#kvU54&#A}Q$?h9ve zkK_z!`qri*7`qG@xG6#gCu4ImBx6ekhn~yy@(twIwwoiH(U@%>z0p>VO+0sOw>#|H zA5%eqTxT!D6i)MCG4^U)!8&;5z|N?)^5P!ZP4n=wwURn#svMKKVX``h^uVxQ4c$X< z#hSP>^%UO6U=N14$?c1*6F_3fuI3?Caex%s=i}5q@%x1N`#1b{A}uI?bPw#6FF^#- zA7wg%kKwoM?rzRm$z^B# z7F2NENNTik@O{*j(@C77)kZg9ExH2Gwr!2!FRQy~NWiX!bU*XF&?{F6WBT~WZSXjA zA!aG;3fO(j+zKFg_DmBN-Ga#F$+XuOiH~5D;7D)h(ZZdZ)nm`bDEcRoF4Qoa~>{vt*5<3>n_%L3+3kxsl?6boii^6QU zpo#At)B#Hy8p17to3#qMOO3Us9E4<_;Q$c11#=Lg!#zLpLOnZ{KR(xvbhs5f;$1HWASM&(W@%CCE%?p z6HcPIIFD}x-1!m=V%t%yxeMUUZke-+j(cX9n;0Zm?X!?Rxrsr-#U_Sw*U23aSNI>o zDbJ&Jx1`}}ZdA~KPRf1Zat0A1<>B)GAm9l$I$ zD>)Eg(WknDAqne!lCs`Q52l9NYkT-b*pJ}B)PI7op$p$W&+*hB<9flQz-NYFME^75 zyd&2Mo^E4AzYGYZ5xo?;K4~ba%5#DHIcU)jVi3gb=_dkwpG-{f4`Ekx6w>D$$CRG> zf~A8TegTv9029;&t9p@2+Kwcwx>*42-ExP>KbXikw26!(QZG|EmLrEv&3g(#3ZP6t zNdW{@)^5yq#y_3rEV2v}nrHP4q!GGFLF2>PKmE@5p_d7LH=x-^+mKAvSRUA+E$K@U zlZKcD$O#EUNz8xJek2dUQt-%FLU5;-|H$rn5X+PZS&;1xj2*g5ja%tI`lqteACVS^ z@Ae6C5K4j!gOwgv#kGa|u){%IF694j2Ksw}G4>cZ&YS(yoNZz~xeD2N<-D&o>?-g` zC+fqB#ICg>XCM;xaz^^k=Z$o+RlVBWs@{xcxv01>QrAkWwRf*DU$2o?`8EdgL;t|o z>n4p@Y&S<>I!Wklm3GNN?u~7XU2a8q5W%g0{G*G;5~PMU`C4hAN2&bi$V^|sQXizX zoF`^hbCp`d!ZGu(bH|}8A*aTmOBft0gQLwL9nB-vV+Or4$o}I&p+QI*i*KIY%EvFx zOL_4_SNAgj$$$KwZTl{>eOKDPi)`N$ZQsS_H_()rpP1lg;?uI(^t9_Evsq+hvB_bO z7ab{U;2IVu3^T;TFVTwNG2m5DZc2s{4{<~-XH9GHaVke4$)=3Sft z@?>w)7Bpce(6*`YFJz<U_eHi{v23z|EY@xwB4MDt0 zHKf62{dU6ez1Y1JDIC>VDF1PMr{RAnVWE$K%Zx&dBbNzUh42h33mjI5=wM48nlpj2 zB^jcaDt> zt@@K40?(kOCJ7a$(PaT$p!-xY)hLDwj>j?0OP+rfa|hLL&KDv^%#-pAfM@l)@4WMl zN31wJYpKx;mj#D6*6-<2ewddNXPptbth9W4S?ee`HT3NN8n-keDGxZeWPf~zEBtZn znDDOP_A*;aB%=>Jy4*R$M%1BaBvD-zQO5ysB>zaon*kSG%=F6M>hF$c7P7Zi&*Y8x zdgvbsIAneBa9&LwGHc^EX0L~D zHe5$NsU`XA1-3{ z%^Mz9k0|;n*s(+6sr2?8jt!E&rxobjO3q|0Cj}}6TSu78KmOo zwEid#meylG#(NQRzy{ys3m+oic41We0CuO#lEi)q$EU;CfkQXaPV&u1QuSKAUR(LO z^K-pfRYO-Wb%3Fv%-kxmCa^!SFTzRB*9iXSkB8EpzsdYhaYI^ux(B6aOySpOujSTgK3Dz$Dsztw@f}?D#yon zx6rI51}XOJ$~SNoZ`(2flVi6;$qczI*>1OlEC?Yra34(P3-L$D+USD^&9Ca{5`1Ec zgUb3Xqm7pMcHICQNEY?i380^(kX|J9Rdo`|Ji!Byo>TTxSA+!Y#266d4^3G## zK7fs#+HY~bydioLQfRR@Z~lST;+F&;I>H%~n=JmMvf15W*GU01P9(>-YTka*G8uh| ztTsddj3X)(h&FP!W{55GLS*J-{@BeHl1G6gc=#-BK3~-k8!uTua^q!}Y5MPsx0IvT zvLqGNcN(G!MU>c{x#mi=XHGo4>@tLTTVS;?nS&W<>0t}3;(kgWrf~OV4SLW@d4ee| z;KJ4EcOa!tJSE7KFPXxvnKj&+F|pmmlnqGn)Np%7JWm&=av-)nqR)#|ZqclkTQpX+ ze#It8v{IyUn?@+W@w{I$^=6Sef_XU_;;D5^<)fA5_hdQJps*j0y+71P+=GgPJxZ`) z0JCk7^!giEiQ7iDthp?KR-bs*YnXKxqHI||d;(c{YEa0kIP6B&lUx77V{|~D2J-qfPJ}#6pV+j2ZP3DnTbQOrxd%%4E$JtJ)-K^Bu`DzRiG9JS#8uVzW|V< z;w3M^?p5scc({rlmj}ngOW^*t&9+g?24O8$BpUvV!e0~)FY%)K6SVh<2yHSLv zHRefin9PB|w7vXA>G5R<>uP&526hb}jM9Z%n-v-3z7&dgpp_}QE& zEipeMU_ID_Do*uHIcVfh~qAXzd-q-3kMCBM5(l8f4Kq<&Sp6GMJ>%^+LF8sN*%QRSNS_3`sgSA7520irC43xrOzxm6##t|Ea zJE)B?gLh`m4zuq>jq|lt--(Gt(1Mdf^Li#s?(D*8Yv@)RN`Gd7IPAW7(=<={VMlA= zPkeIX%&e=Of#a+46S2l2D^%qt;j5Wnpc>8V2TvQS((cEwBZzG03LHlQzmpy2T=WUE zr~k{Eb9O!|vyWuFhIIp( z#8VpkLMIV&*nuk1eJjLiaotd4L~(OTPhD;` z;%5kwDgq0tt_M{XH8a{#L)MVg5Ij8g4^xA^ad~VKA0c6hW<&#!Q0&x;-xadgk-m}0 zU2eTtQ8@xs@?D8Cr1&Cod(juU3=c7jJL=b~Zgq_-|(HN;7m$vGCF+)n;e6w^= z>_mVjb_5#xFkynpxAoxL%bmg8!B4p%+RxO}Ua@%dJW!yc42Lmlvsk3~h0Do_Mm9P^ z6cXi~E_Bz_|1T5JhabzSFGZh(UY1?__F`1}FDQ~{JA3OB6)mqKA?DZbRFF?0Le4uc zTx(HNhK!usarh9^p&YZEzw+=RHRH3)crn-@)1ccYNL|1`z?#>qkP~V{xVMyl9-MyU z%LblUN{qIrDguCO*q;vK2fy4i}l3cba;A1 z-7+zqI0HB8OH|GlToPIXdq!(5F7=yMwfslpEseyI(Vz&JTqUrJLiSW z*8tg7xe)o{s>Xl6#|X6uR_5REx`3VdOH;j-bKI9r!%FlvIL32NFAPWJ-e+GdKLId- z^UEJPqL7A?;ydwThjly*WbCpOy+yV6Rrh1Oy#`qDoEI8&hQ3IRuu(|U(_gbVAd^8r z;+5MCLK+0-=}RV9seO=2|0Eek$V@FJy%Y`^sLAC23%VbIA&PWE15(61Qw?I`XPy=# z7{#$P^ITeR!))95YqMNPcZuTxActo!;|$arF)6HFFn7zN!hb$XVvdal+XbW z<$VEOKu&T4kKT5`MJi3_@gZx0${yGmG%(u z$?85_Z*F9QGArkVFw)P# z@79Y{Nk^*C3Dqk21A?Uer&`oD_yrKyO4@?N*l_|uv&!)XA{zxH>GX!5X=bS}e1pH> zDR($%h-f&XQYY2C;S4<6{3G2sfOifk65oA8a84jae^v?jYk)qQ3Jp`QQE}%p4v!cs zNt*s!Y(m4R$sn3}6DjwR#pIE8u6FkSr45hBf!g&`#U&3yFdfAu4I-1`5}9esCulhc z8}b&f?^Vrg$0-X$F2yM_*W)tRAm*a$RvWWS20WQ1(`ec#nWYN>l2=;HG7Z0~s-&(b&Mhkx+Yf7fmNl>Iyd8lHe+Q4zb?_#jMD z3f&{1wb2vD+eGu(4YigUIMG%GY(kaMvMOFx&_| z&Txf@Jc{AKN~z(X$#f$m(?K=|&iBIX25lMjup7Mc<*THb5MhICM4yQZ@f2NS^t+~8 z+Wt1&Zi?1GEaC1D=A5789Vh79X~rj)fV}?j=pX3AgjUppig=pw1`__Kg3rL6MHGzH z#Ae0iQ&BMN5TC1vOA#UQUwtWPaw}08+>rH~0{{nQF~y`(w}m4&Au2U_4knlzxxWKN zbkBUM0_`8{{Pjcf6U9&ELtq{Nw3C=CWwv&MVWY?<IshKN`*>KCzPLV8HI_&ThUbhmGei=3a+z9dGCI z*nK9K%SS)CU)va!Oiq119=rWJ!Q-5|?L7Vh^4oa)aRvpCKe3vPSkX?Z&Ov(Yc!49% zfXKm6RD{8h_8WsitZTzR%hSxtCo`K=-YI&_kOS{lw3llbqPyne4;%#W zC&7OjcCW_hOO)_z3ZbSReY1+t5g||Ik>~UlmGC?hz?qKdQ%p!-Wl8G@67*sfoW~&P zF-liS#VRkBt}j#R*C4%oJ$Dsjm+H+bdK{u-qit~KAYv`m=U4__UqP$yQgY*1B)x{K zqZp+-RC zW-tzj;BW{WfMd_YqrJQdw9L*A|HrGnypzj}x#Lj~;))rVVFpU{2S;Zf0D68QKj{Vztq@a_KN}m1u%mVE1Y0pM}zS>%bnrQd28$ECEn-fJvn?(Pgb<_Lb<@7 z6NCQp-SBnpGT@3cKz2*%8hO5DUTIwg2cl2}JN;eU z5TtUOfuS@R?>Taeo~XvfzPVuNTlKMOfbL|3*W&Pzb`H-1ho1t9i!IL1YQxztASXE6 zaT7Ru{rQr!GeFB!C$6xN!zXC-ot(|%96noQ;Tq>&pX6|#F&keUaro~T&V1+wvCnSg zl}ip^fb-P9!{L*wreji??k+Yte5%FaoRrMtv|fBCNhZg}dnJ1l|1dobV7nF>kK)!d zIQNfEgw%Chd1SGFYm{hyJg4*dGi%l!B^!=d4tLNE8{{lFhdp`Isx;wUa1PM zx*HA2GK~cNz=C~@W~4NY6(s_n; z6wVXtg^w&TkITfRNQ|ZOcs;@RkKaqh7qa1KBR=&rmE4(kmk<^oPKB^|cr3puv?Le_ znqkZs1A?elXbYc5tBFTV(K%&A=|9fsjZES7qa&`Np6rcx4*DQwe$M(OrkS5Lgw@7w zF6DPXZ#k1qrHbaL6Aj`+3uhI;u_CV^!JtZOSfZ+4J$oreX~RMC?lL z;o?XOT9P&Q`Lefg#>tE8SAIG?l(jn!Q^KXHgdKOrYZn+A%dn|Go0+uH>2>aaIG>|M zrbA(g@$#NvKr{i*&=i%=6+EX^{0D^n4&Pyl?(?~5X|3W-fc^&O)%%7o5M0$U^9`45 zMt3RQ-qJ#4K*Va}F>OqGgMGQ;v~(ZO>K(U16qiuSF(%eseDf(d9Ppwx9X#Ol5Al^B zknn2=?veLv1bhz}U}L7Smbg_H5R*K{U2ya+^SY^awG+=UXJx~9xKe$9>3 zrcFZ?=Iq~9e=va`^(})>Zop9)0@@@-ci(5ZRj{I?(&B^5 z@B?!?ON*~qK4RRjpsekP$}&e(rfo#Etwel8-A@$s;Ak64a~by>;^bsCr6&A(OUnK| z^#^<6sW$fCOS3hdBEm-}j_5YHosWq+Q)A~~lE2mYKy zNPy^Pu)WwA`bCiiZoZ6_=P@&7_>1_8{)!#_c54+XY__!uXpFsNGcyEtPm~Lm+wYX> z-21=3V978SESaV{H$tg%lcCPR24UCb;Ea)N1Vyf&kP}AJ9yASNsZ2~mLD1U<5yIB8 zO?Pl$D&s;ug6-ETTex$ASr=GB!jd1?U>+cNI}PR;fXk&#L5PtL#GSjdDB%#c0u^l~{&Q*6Uk6ifo9>Hv%bbxx6$rwd zbjW!4T*)w*1yf3=`|7_-FhYpoZ2J$*RqDVTBv8g+Yu+Ca)P9?C+A;*GPe{BZ?RI8>Pn_h?H8O{8w?7t2p*4kELgh4}UAd|0k=Lw#m+~pTyj+|m1ge|;@lwHA<22?NkCkqfF}W1xIw~esAKwh8o2?^ zniM)QR(-+sDFwkzE>HFzZ4un2vOy>F4Y*>Z$PPq)*(3=ZHS^0MH^IU5bv+B8=2Qu0 zp~91#Uv;BDf8>qubj=$k5ChGL`H>Ya6bZ(5rMZfv`Oxs#$EQR$p)vrf0}fhj*YQ^XZ;jUrCJU z5*RB{GN%`#VFiB4p2@!OTY}B@jqd04kA|y`zS&0LT>PeZvzr5FNZJy;*`r+ncPuaa z?qqFn8S**;{k+-d;~Yz%mp6M-B7VDgvoCS^kH-~a_~%RUWdBn7q8#uXL;Ldj;idH0 zsk-A0tG8di1!64$Rnk^@PJwkfWtr38M-0wwrMsh_p$L&31Y~pyoS^5ajI)qYGQ^#K zGj|;bi92(DRgHEDU@Ymtu?;bCFD^Iq>x!G+C4Ie>#VN94ZVLz^WLl#)q2GKSb!OX% zu}e7;%dx>AvCfvri?8ekQ^c@w@tJ70FLN_52*_)6-K$s;wu&-Un`Jj+`!2Wv&Q5su z8oacq9-dF2yoIK#XjTrYhCj6dam4SMV%3p%~v>O$T`M`_iv~H-B3$2vCv%HiN z+QJ3EAR5(r<4ed&n9!{nvZ?lY@9l^AVgg`o>WmY}WRsn)XVzMM7`w?*Q!tuL#pB24 zO*Q4NtE2rf7W85Tz7F8Ni1d!{i%55+M&6UsxEq6n)vFb3wF&zyn;Wo8@oS`*usUF^ z=XtENlDqEU7WJPZMVKmJTG#6os(he2`f;QQ+X&hI*c|F%fUx`j~7Fg%M*5gsu*I~Kl}Y+nB68@vcH$UPe$o^s<^+F zVEEpgeSUJ_xb3JCH*bH$nihTtQqwh=K7T zsV$m~juLpIpP<&km@{^p)%ju;1xH{UI57?|6CKU`OGSlvpm;(enV%IlnV)qwnV;4E zE#{XaT;u5u!Ps53iXYL2qD8cdzapo;SJ7W}BZhivoz)w27zBjFnERNV3T_K75IPFv zZ5rZ#N3}T~!-~uMQ*EyVW&oemFwQwse&rb%_>wdDGi^se>og&UwS}WWu9yhgjiNL- zPZ#QlZ4`9}EG%rer?52bfoXyl(!>bN-lm2A28ziKT8O%dH~V^50C%CJN<%fKY)*M! zM_{BG1=mvL=-^F(Q}V-K=ZB>;Ay@(+_li{uO#+b~;I0S(W9%|c4|vvAC67dMY*g9Z zKY)9&2H&`9Adx`9jbeqh07pZtQ zkCF}RiFy7cA=NPV;*16RzR)4>OW-pHpA@7*5yK?_>=>Ae<6*>#7Nf(kVzvdECNG#% z?(olvD}NMZRTQ_FmZ$Pd+~t^F8QPs8>Ku4}tGog>zEvEYInNX|v1^bWDUa&Z|V=ug7TyG7) zLsN+CT|5I3rhY1F>~l78W}WZYl-Cz;Va>p$3bsRdY69*Wh?(y%q*f?l(vdlq*G<3Y zQ*$=p&Gn03In64&6lKdLas1$Y1vEla5ch>$8b>htdaCA=_ahU{_e!D@fXxHP#fVIc zYh^qxjTeOw>8S04KUB(UHp$KzpzpcSvYT{6sj}1STvSy;ZZ~p5RW=~~xKTX~g=!w~ zW@|W>AO1di0LX&dyGBMIfwZ}EWW2;?Bv>WNi@~kNSXrW0aRrg%t`bjgfb{5-#BvbR z@OdKPMfZtF@I;~HC}^#8$}JYimu28BH?oj`LHtg5C45a-mo&h2X@WVR_?(W z*>DU46OSLA!c&*vS#eS5-tg1OgWpV}G75IzrTRQJ^(ljuI- z_25(NPsl@um6K5-DAXz*0;xQ^J>9(CfuLheGX9vp1Y3=n7^!$3TsTS{#_5an)y&78 z=-QWXr`e}@_v)W0&c6^PdaRdShYDDKuL2>X^U9`H^xGdh-3k>}^h=BlIU3|pEXfAq z0%K1PyW9og=usqMt`I!rs-cyGTgf|yqc0B8h2p8#THLg@*y1L>&?U;llQj6GRz$n+ zfAxWYyOZr4AejCS;P`-R>|^muL|ynQ9VZy5hJWaWMG9coq~Q-o!jCX02^kZ83%y{{ z$(c8p+lb!94#qCT<1lyq*U6s9f+VCQdse42cSNpu#Fc2_o0#~nS#R>?Yskhy)BsTW z1gdzNc*yy*bz&wm-)CQ{n62_!OfiNE-o;>ggC!JhW-#ur^C|{`$YD%=z+4(|{t*7M zvQQGt7}(@$Bm|l|FVXxZlQEoX{-*I4_dW9R@W*pM{)}$*R!(;p;Ol&+;58eceR~bK z5`3FS8^mtpq_;Bzzf{Xb5xAIu@hF%(Q@Y+}qg;(sA)~S{QHM$;ie}}#)%6C)F;!!=%>O#?2C{oU#2+0}L=qHsp ztzsUeJx!TYExixhG41SG9E0E1nS6I4;OU$5TsWoKp#=|VLZ-vPG3Lr8XkKH;)fl&* z*$z6Njs25~I^hyq^TLJI1oyeY?R&d5RN{k}vhn6yq{s;u_X1UTJ$wzr^03S$57P$^ zxdN`&y2l0t4|S4yyz4brtOufH$>Uk_R@JdjPZq_~^eXvxxmFUs$2EB5EBQ0)6)*^zM09YQ8-DU!vPB~<&*KzX)07NZPfJ>c84?x%le z>-sxmwT8#zG~_qibZ@sN_!!QH$qJ7MZS#b`@YL@f%wwfX6s@y>42rFo6=Y+Dfz4CC z6N*@A`P;x%R#AuZFU%d@T5lYWiN+J$3Des5db7fkDX{FaVHpD~6t%!1I+LCQT6Y1*-xd)U3)xmHP#e+g_Dg z^={wh3mDP zSkKVscXbPIb(eV#|#!TtFzvgtSz1B~J@29E)$4QNnsa#zuQ)H zOzQ8G@Y5?G7jhrhmYx1%ZS^>Gg;@^_S|kgfCx7h4#~Ri#+7ru*8ZL;Uo$%FW(_%IN z#10;>-4?;IZX&l5QuVY=RwK@1;b3jtyafi?HH)56dgOW_fHVeAb;AiN(bL8S$P!zp z7bzU)c7WpofkRwfECr5mJ!-8zTn7&xu0Ud_4)+96973G~$Kf_`CoRO~AHHB5~S;Ne97%`|-QGzsQX3?H`M9pFsEEfdnx>%sR(R zImVw6+G4`@^`}9|GG{-3Kl7`C2?l?2qR%Y&E%dAz?OofiM8kgmREodPL% z)d1*x*~T5+VCC2D{S*b-L~#nT#@2)C9IQaEKpNlI=!Y`6wD*R+i;Gw;TRL{1?dIpU zORbuGd7oL6fdE1y40jIL6WnIq$@1zX&Ap02H`!y7AGfATsalYWh*;ScFajZ8WmJBELH;ZJoek)NHASn;|4 zEMiGr^BnLAK~VAeyn!CLh)CovfA;#)pCe;X5WO`;3Om7z-~O$YPLO$)!>>s>EC$96 zu%33vWY);(|4%t`dfS$GTQ5P|Y5Ivu1~no=;uibaX;m{aeBnkT5y)-a^%S6@8cZ-k zy{F!dKDXI)q;QGW0-{5b!~m0g-|HngXdq-^W7UiQY>mcTltB)t@`j4g{a$j1*LbEv zjK|Pw0E_FB!V?uA;wcD!Uj8CuUne;Y;m4NBnL49t4!6@YRdXO+0kKebxrUIGM7=$7um!an^$Tg?}F5BF^UNi#J+sd_Zt~;4IDy7b6E8 zt<&euCH&l;=xkzuSD2kmII7|)hm*Ee93YS0N18S(+4R~);06>htATK<~ZIK2+Do-(xw0G{8gK>bKxY=s>3s8=QK6b1#=E?qYUJ{P7oV+!A zqjr%ITg*gI`#&`cbWI%dqZT8yH1{vQaKo*epxX_3wMgRo*qJ!_Otv~w2ew%R-TB?7gxz=sMf6=2x0s9j)>?1adw zOI@}9v`2nF4v|;!AXXOC`$l`xhe+Z)l&-BRN~-ZffRu=WD{l%X2ge^&{?Gvz3 zb+0Wcx%Omx(v7yHKDA@)NrgzN*drS$(`=+O^yD`!)@v$6BQdCIKM*-9dxWf-lE`&%o7Q<93BS=gkC{oC+EJ}jYD;R@I#X>)?OLb6 zmej6wPD2tGSUI83wa_D|C{>_VtzrQ_(Q21@g1@%H*{4r6*HaguxfoQ<70XA=YpkU19C>u0k3X=B zXocSwOgUm~N}mjs=~>?he7^zKC3cQ4au1%J zTr6_d?&TxQz~C@u_W^m4dz|92b7LU86g3Zhk4E)HCgQR3FZFkTcQxlY3%P8ztcE}i za&{t8cAyRE&^Aan9%CYCD2&n8ZRHnEW>q+cZkxIFtuN z6Dk1&w(?%@Cs%*6AVShh~GgBE%XdOJew z4JVFkr|+%*I!2!BwB=LzBYSVGI(T|DC9K?|=0cj2g#FZ=;4 zT$@p9O)m!FiXXE_Iu7d99)mD5us;6Iwc@H==3Ca3do_e?F!$RFAuzPiS1>AfM9QZi zr3DFs2tg4}VIt132&o|rSo$EY8F6_mOA-?P7_=BBEor#bTErKko=PTxUba&^dgW>jw`7uM6|zi%=q*5Gyf%i#<;08Ikt2&E z2#ZU7TeQ{bs<>^S2gNa6RNZlOalr%o0)y@KCyZ>K`8`GR$f`41_n`pUEGG$CmKUn3 zUt!WhIMOmh((+8URrQM{Eld}*a6q-I`cbqHM$&R9$wmvK^`(lIzv9|VFxMTYQ$T-0K&ps!ukHBM6I2dq;G`vMj6W zm&@Xq4qjd-COG2&Ya~YKNwNNV5%S2Eeb*ya1wz7bbg{j(&{!D1t#PG=vSdgg)Iz7o zkZ4&gG)RW(SeO>-g%G)jiTVJH(ROo)X34EILNU|tLb*w?Q;487CkQceGAArNr8A zTx$a6nSjqqz!wzYl>m%adac=Nco}!UG1Sb<$``;>2+G+kd1t!HK2T;iTcS<&Z*aPu z(uOT!W;bN^Q&slQQ3Q*sF=5$EET>+Q=~95N0#N@_wcj{MS;3uJ#W*N5)DSVlKQ1L3 zl^_aG+1bV2#9-o~ZvmGj(kwHS;X!ga-uznLxl2(M^vo)#nV3P7TLn0G$hj6*<`cw1 z**p_}O*_GUWA1&}uEJ>e8`_wqWL&t#}wz>CD=pVFo9>BmmOQ1B%78{Gsc!L#<@|i*!t@1>|>cNN;FGKp^ zUSnFg>!xuDtk@rKGZuScg=#L*OkGh1_ZIVD#SONgx%QzHHslrJ=|8lR`R*SscGJ~7 zS_?<=y^)Lr0$pVSO;$kHNT90$1Q?i%v%GjPk@wYd@azj#nmO|5(`?l`2Oqfb4&M3q8^@gkdg=P)Yw3Pc34#KbU)tMD_v##PRR5 zWmBiUCz|?HmG5&P7i*m80)Xm8NSA#uP0;j1K4|j)nJ6AMQB+G5yUw(VUP2Ve?1&ZW zO)CG1BLB-GKVCxEZ(MHXPkdjH@K2S0qRO8nD2a6z*#3C8C)$RJ3uZj@Cx*z`_{(xD zp`hAE$7mQ7>9KQ+^DS;^qpccTINq5dSfLKuNU z;>b7#h# zl*+lUj1e6DPnYb831>+rTp~GOS*FE7myfWRHw4iCzdC-=eAV%ybDx2n=I9+QT(eF9 z2Po&Pxw6a4g(R0Mr7yf+R3)w`L*t2Dj0uH4H@?6o2+RZ5QZW=Wo3Nnojn^Nuh2Y{~ z?u(;2gsvqkUV0`P01^{Uprz8uq3mlCt=90NnMB^$DZ$*^MD8KX-IuwMVY$q3 zlgiK^890OD0Nrcon2tOC6iM+-q?q$5p~x2cUZ9hmHq#Qj!QA~G(R1{v$f6%RgM=>- z8A!W8K-xbLw10V;Mf(EKC~3bunENV`_{S5$l|(?=WrmkjhO3Z)^}J8Oih7=E!nR1* zas_)jUv=T)j!qCgBkCzrR|xLbi?&$xtg>WfFjs3^&sQ^LJvkg$Pk{hrFGXI= zQ2S1`>iH~aRP}r-Pu25wB0z@34@HKJD#J`28)#|AJ}wvO1a zFmfH_#&q}H*axF?z>A!$vKFH0QAjKyPmm<`$cCWf+395*>fuk1V(Lwyq){BtG@>j8 zDaLfj<6!PDqXY-=eQkE&5}p(X2jmeqT1H}Ps5K<l^dYa(tU6)tm3-%A#-g!Inw&)vv{7 z=BZ?AIuPSfAs)_S%x4^#0&s>3Rq;y1G%Z1M-(1WTd4y@$;aWJ3Z^vpf<~$@yJ6Ppv995t_%Tv< zd}49z@%93SsRBBofDX|XL{gHqmEFq@bPAjYVLu(`xbwdc-kszKbP3*_n2L7IQn(u^ zC@tdO{M91s?0_rK4d`bG^t>m47rOAK z@Tb6kisFFl?f7p}_{RaiAWaLM4{>-_g=4fM38fm^dTJ4x7OyG?u8)-jk96`M7d+y^kytO*>P7NbJo+ENp znc;eTiTlf0t0&@f&E@!03vmQ#s_0sbq6o`0{FV?fHk2{=;4*5ezF7g^D1l3uq^-P# zj?*2VT77yx5`%|_X`!KD=-}aWEi_PkoQ!kA$>M9c7V0WKPSrw3&_;Ti%G?u~Ri~vK zvO4XjUZN$@{v`@@JH@@#ztMvhXd^&z^AwFHMHps&^ zDfm0DH?}8+;TXP^1XVjvTjfto)RVVb&AbC*Id-D9ak> zk50(mS{l(--Z}tX6v)zNE4T*%SDT3rwRL4F;w%;*Q?S4DUeAm{d9XoU$r27{qH}5# zwtU2?&M7=#b6e|BQ{y zgpY-N#6SuR7rGuEn{gQISoEBy?EmogF7Qnj+2455rVyZz00oMG1PEFb-Kwaqw3^Tq zQ>|E`A}YFdixpQ^t0qzvXfdreh5)Xt;;Q>&U9Y>Yi!O4vPq`L#cf~v2u;T5BK|xWd z-1`51XP#&Bq~iMff8O`=`jI}FIcLtCIdf*_%*>gYIo&&ZhTIX{odzf#Lv?iT$(jHN zKk5I$cyUZu^qlYJjp*ih8H zXUI|bO8p+3xC)v{;hf}xM-s>cx_8o3DS2^`XK}cIae}SzDfDMMM>;NvC{O6SWG+0G zc4J(3r|5(RBCa1_5w3n6$dNVne5DdzB8^5wB{;dEhYTxVjBrF`y=PV&#!B z-C@&fHuRr*2zhWl3^Q$UyIk8EPDO;Zh;^YLT2YX_eXi)9L!LJK4b|6A+Uj?7Z1rdN z*y`_{vDM$l4xzbgR{QMO$wXt%ZOar$B|s_xQb}*e){;IMTT6h{R^qhb1b@lU9ya_v zez0vd?cPZ1jCe%{?ulY4PjQuR1TQ>gGt0KNJ^wn}>h`hM$*rE!_OeJ3rrN{M5GuVu z#y5lyzjgd3wu?muc{>*t5V{LrW%^Am1~eFHb&2hB%3DTk9L}?-`4)Q9jzzZ|Ertp3 zxDD<=fX_1~@#WEd*yTMT7#->@gQ4d1$8a${wv^_;0%1WS9VgZg4B|rBl{L0-@0UFI zAe%XmIzV~#0|-jg*w*GE!c|&{dz$bs(lNHaHz1z8>##Vy&w=Lb101%tSttJec=-j! z?m|QdBXeP)9*>8V!B~0pAf_DjbNc&9(1OUO++bw9E&O?~8kdR&GkH}Us?!sUVdr=P z_M0!rW^LsKW0`!YDprD0`C)S6CYM(aa;0@a$EsyS&q6^|D4 z04I-z!ycT&m*&L{Y-I>UH{wdB!tad7;fv20#}k)#l*O{~#?^b~pfo8@3>Z~TP)OcH zhdmw;6bGPG2H4@f@4sXa%8wMkgB3`7_(VaxP7(k1L`fXAV@vjf`pIl)?^ZFcrL!JJ zC^gD~*WKCb1pm`*F7Q7+x)nFcLuclkT<)!c$`?hq0p9eot89ZPTCf^*FZ&4l1|jkg zUKPi{9NCuLEMDDqH2dw%muK+Jau?%G6MxJ1!bP7tYl^J6; zaN-mkpW_XG+q^&^u&!_k<}CCA_AOgWZHIx+i!tYL8b1t1b#tjbdGde7Isn@eShAvf z*R+*pbk@HlG%LHU)WP-Kmsou$_VoDlVvNa$f|(Ej`yX7+!b`!;emFiZUq1)MKrK~f zV*NfoHV+g0%1o@%!%Jy;8K%6VqsPHhxH!31mGfG1(dk^!4V4s%Ug1VAblqWF7iJOtZ26Yw=x~M(2zUVQ#cG;3A&^!RXeXAoU~?4dWy{li;y- zK)ms6q0)~C+kn7tD-nC~*D?{asR8|M#NTk9Ei^)Nzi+niSzfL+AJtw`N_T~b>C|iX z9JYFwmmu1-$^5G^4%^lkp2t_YOj|DN4Pnb&YvQea9GcxS!5p;peR~h%$Tr^fxcwHI zd7Oz`9Fad6g@Io23%<`WZkH?zhL0t2Pdy~I%#ztb1Y zlq(EWVCY{6t+@%s^{*%CSg8XlSZSZ@jBXh7W3(gE+AVr8vN2OFXbg~~AprNu+4ma@ z8GEA_Ibs)OV>#m#ruN6j6@gGZ=d|dh*<W_YJR`gX%yTUPjn zV09R-q&mFIyXnD9xm*&v+JUo&?R8iGdA0LY{aq-H0srmGQ=xC(#LPv4Q>=n*dN%>-TkmpX=R+>;N=hD!CIBdcc#jBHuA-wMQ2xjD~#`Uewj%v z=o%}P?dW|lk*(@!c7D!(OXp7~J=Bu$t<35+M_$ZIxL;v6Fhv% zG^7t*W>SkQ=(gk8y}?%((JjSf1-<%HNGzNO_p^kUJBir)5Q}SL1mJRTO+P=b_3r_< zYiOKUh70%;E)hj6i`VtF_!B;=AMR8HeHMbeBc{wCXsZK3Uii?JAY})F11to~tpxWZ zQXF!2To$jjYXeBFR~j{WW|AyY`ki}nTio2)%KsJ;?||$p+~42 za(9P=EXQ<14Vl2=ud@6LIgb}!eMyV{{lcA8;sa>lu zo&tu}pt4$uAe!cuZfKf5@`dIya1sx7$0zKE6@FV*i6mKI z(ex9LSuzwk=%_ydLt4uSl#Yz=f$-5^i4NmUq!m;Wykp05nZlFDLAX6&cPeBn{ok4t-BQ=Da}g&W*+sD70Adc(>QktVDkx0CB5r`g;(F7e#kdbBH4%Q|%xAwXPMMYqS#riQ{@zDVD0k>z=jmm0yAZC<&s4X`MR zCLmq~i@pMTk_~!7G{<8sD@}-2dK{bw^I;`h{p&cr+$eDTFolg}H2id`TNiHU`eqyp zb}b#)3}m6|Zsz3btCq{EWOydRu`tf=?$OJEO!c-wUh-H2&g-I4Th8mISy#?()JI`m zbvRfE1Yv3E=5MH@4YrP9oXizkJ7AODG)``SOA|ISu_3j@`#sW7Mx;YEW;%VP%0jLDnN=&P4r8_?n27s$E%~rY= zvH!npC6=d)t#tFp7P}$GLhyfOD^XBgY$cDC;HLHzhssuZ5OuqTc1_CiO4&*jbr*{N z*=gEJyqv+Co~wR;oajX|@u1OiwfyiIlD6G4O@0#N1&k*)6tG1#^IskxZAq zQrRgzg_YDx+80E$SV{jvcWbH?>97o4=qM|RFli+{AX70yXb>6uNvaO%>OT}nq)Z&q z)#;CXB*t;c52LkK)f$QI27E&G;b_+mQ}(jmLBN47`{M99k3 z_zxK(Hek30MD+GVwTO4A7)w?N`C9Ce`9?GoTg3TWL`RCx80LjNVs(z6jCg5}ObHl$ ziD z`8>a)!lSXXc(#31co>!iuzxYP(7G(pI1bV&e0@&R*v8BYAD8GxfmxOg8eba-oLB0J zQx+fBz2RI>ctBaavb(+EoKwQRxN(``31@E2@HBOXuw&j0d!4u+qD|~*_6&QHCl`6( zp<+aM!mcFlECy1je~}0G-2nAng#FEqL3mga8Dl7CA-SbF8p_9n+^V%~QO|N=9EP3I z4zx8Gf1rE^TRx)DQEP8vFu{BQixd@5TG{%>BZ2sp_;!F82AMKG@d)P?gSBRb*I(hi z3_Pt>0S@+&IWA+4=pRImpBp(|gB;-;1cq{=41V8Lu(z3fR92*uRTA zcoEF3NJn?bNms?}k77zWy^Li7nuN@eeG3cDPLUj1Ou}6}U{!p>Ag^f>_Jj8_(-Ds* zA=8VJF+ELlbb&AlC*iIMSv7}|05|Yln;#hexR76XvTJ4Oxbae0;nHC2DolmZ*N_o7 zZ@={}`zk#AinwYcu2sZ^2a~~e#sNl#^`|8AU@d>AsS5evSQhaM9OV^vV;#lPF>6kh zuLzP`!$qjnXdN1fR^+9(5b73o!s~#2a)yk6>)>AzkA=F) z*Wq+9t65%sQ5GBO4T{@q3X>sRrt-1=Iu>xCo8b{P^Y1);Vz=<%$U2g=h24>LJH(If z{>T=4S#&3MHk@Vi58EoQvxQgTlAVn3;Fw^>KmKm=H18afiDbSuQ%T{ZY{SD&-h4=2 z^zqZ!V`ik-X1&?KztZRn42`PAz<^uv2zOiImm2U20T&w0g*BCah5^q9TsD})XuS%2 zhXL*ja7ny!v<+L#v+VCnU7dj!vRFwIVN=V!YG$8pC4Y~R{&frj279;-CPn`N1OB{# z3-&s!`9EvG?*m-2_q`Ro#sJ>}u*u#G#U8ntWkrA4KrbP+fY(6;-HPyzfiO~Kx7P~( z!~kakY;+HwS>gK(_@{1F+7GSpj5}oavPr;2_wbe#-q(Qt1#s}^B!6?P2%`*yyCgz3 z5kgjkvkZi5B!Zg=T)VP-zL})h&@3!WAk3ske5Ju^T5~1CS@Q{Jf zNCeTjb0I@<{6X%g}-dTM+>;9omwmWLj#`0>;qm8`Qu8T zV&H27;WKpEK=2Zw(u!ca)2M%mkVk}RR)qcr!ec;yY=_$4hxle%W$QtN7yt4MnPLLX zCRpr48w~X;p1@D9V$mX-rh+tW!3KPBluz+_ijhl^WMeE2{5urzYy&tPKq18vr-Jzn zSf+qMf+g7scA)|L5}mmi`byjicBuh-6)*@U9|?05@Ye?LISCvGV6FmQZvgL;zybh= zD&VaKFeHIR0D2T~t^vGE0(}5_74RMdc#Z@H0L)Xs`wZYP2@C=_RskP2fHn!lEq*2W z3iyNp{1ja|%83&zCF2zE9|mx%1XcoApnz)(;4>094ZtD=+++Y3NZ@n;eG2$*19+1J zRsk4Lz;_McWB{R0W1&e>p=fa6S3drY!@mOjE5bh?{sr)loXz^I9Kz|LQ19spo|RRZBzJ4 z_y^oj*eK#?gi}B*#~bUC+oz{wESkU&(F8&{vU~0=w7+JttLajtBIQs7WPqr!@~Ya;uvE7AB0#c(pJj1 z8iB6GXB-h(Fjf31SEQ6rH1Oj^0}l<7y|G)UqHA~n1!{^30_(-WG|^WH@u0&(`F(&< z{rvd$!*>F{nfR9AtKo`VIjj%Rj*h+#=M%_?Gc2wX*m`V;E)cie(_5v}hL#=O z4p(=Z8@)z3(g9k5&-_;q=fRV=d>{nrX;cGanhbp?L%bvru(xEWN`~ej1Ub$?$dvB2 z_$^hb2EWvx(sUQ{pl_oclxND+f(00*Ol?4FC4`IsFC;_lGS500+95-8WQZmvFdJm3 z4k7T*!o6Mjp6?#3@x8ztOwn$c%GGA&hY$1>us7m0943+%7q^C*_8VjQcA%Sv8+ zU%;1D#RILXs#YLiRMkrS{I69-+Q+D>^@v7QwGwJp)n)`zRkclqjOyUT*ew3r_$`b7 z4t}MoV=x9PQ|LQnYLQK&_d}*Os-s;(m>GopnG6}#q05jV^6!aaj2%DVx6G3p72@XQ zm}6ix&^L%q+!2f%42JixA}Bvq5&bViMaWI11DM|tz6@}PlOOgBe>T34;cG|uFZg;O z1I{tQ-Qx(hXw}lh-!hdX443paKv4DYN#hqO7vsZ3|!>#D3XZMk%^Y7Yb3t|$S*d+ zxQojF@VrKCH~hKTi9fg4@#ogj*b@x_v=`qxo7?8bcg`}10LdBRt<7A|sSjd3=MJvt*d=QCcfnX>JINP{HJb2Mu?W>Mve#bN z#2;ap_;i&DJIbTqX@`~Zc_+L<%c37fitSi8vxR)j{^@eTe&4xWob1$J6qDrqK95lise#maWva31Qb>54`V(BO5}%3rbrXMUh#7kxU)rn|Qs?i9!7B3rWeZ*t)! z)zr)4+kuB}pC!k3GYgKE>&6FySm3S44{_FoE~b5>xUYh5DnZ`T^Dh{K;PivInt`jI zr<19i__!h3Z?83{VK;+(Qru8SQWn580$iG3F?_yc_>o;;_}81!R5#h@A8J5OuBIRa zX<>O7FcY{dy;F0xoAbFIi0dlw<4U+eM;X2Z+b+5z(tZ?Pu9$mQ#vPO6fvjx&oc7bQ zJ4D&#s4d)iV(>nXW_ttpPV=vZ`C={n5nS=W!sDHaM(=!-5n1qZ<-7RPylFXtfVdl@ zlh?yfhvzarxZQ}_gJ1dZ1(>FaaxPp=rAKuyu&pgsfYAg9r2;uaPtKaahZV%52y@{| zYLU``9}eRleB9-_8yx$^z2h$-8C|re+viP=g}g;)$nkKb`s-gFF71 zO?V`1rG@7w(BeqFV!wDo?UIel?dns_=ePcv8#mtA$k{sTR{o8#|Y%;}zg| zrN-01A$+=AtIkioR547xRAKu*Af7B8kvt8O>KGyBzsb>By=oNy+-v%R?m-7daoUqv z_#DOsReUX&COa!&;U-~PVsG|0mzpErY?bz(NK5>oVyjr3Ow!L>fNfOVM>aH2`01_P z@S1xj5<7R9qCZC^=5yw$#CR8q`5lO1H3OztiGOk>(&ejk87kemBHbLXC%yL@@PW~- z=`TGhywxxY0ZG1KP`4I(gnru@L{|qu$mN zywC16@UrKcHShz^n=mbrv#rRhOyn^Nd7D6nOo{BaBHwEwPgKYc3*=c6Ime28m5E%f zkZ%;osA|z1F(ikIWD2T8AiAHWJb}r|8T_uLtcJ4#+)OLGo){ea?VIp8FWzL?V-Ihp zk#!y)Uy|yCi3eW@0*zf!lg3wFX`FA+*a8~6?cuFdC=W*TRQLa~=ogWxeg>34R3tt8 zIL7fDO+LOnM^hla&&o@SVk^Y*4bRbVp$6w@*w}vgsv6plG`XEYbQUu?-igu0P}Bwp z4&(2v9j2n@JS-Fy&hywzq*Bh5gVFWFtmgPRXp1zXR8u&BUQ&#^iQxb-aV>OVhQ*EX zZD3$1m|?p3%<<0D!)rKm+k*alFz*~_n3IL;2>L_ zGJqE=liehTc+)l94UwKu9&~eYc%bA*|JzD5Nmt9;7++m0$1Y}$&B))6kq>OfP#1;o zyB3Ya_&^Y410mxC4ssNVyT*g8&25fb5jzHx{af(mTE@-z`tc<;lHqi*=;K-zqw?vo zJMTr=p$^g-RE3_vb4Sr+;u%UFTfi88xCF;zTUBN8=~*c{xh>C7iOj<)ry0a@w5JuZ z_u#RS__d^z3rb;7l1sL?nKXlTsPay23rMZux@5|IBs{p`&fX)#{duG-w_#5IJ|n~3 z@p1Kpy}CnXaT~KZjM)UmGMiN6xAxHk5G%OPjnB-)Lp|~7nQo~wvNG7NAqpuNOf2zG zw!@qF5f*&W6j$S6e#>1=NpJ(L5aU(o)RMU4L>wnRA({w``NWSo#gX7rTnX-=aPWSZ zX8Y6}RX)R+8!kbx<7s)*Dxy9sq`Y&q3WdEA*oh+YU;Va}caD-bWMdG@ZTZ4VXv;rM zLUoGJ??`ALc#oIbgGXh&>$<5!sR{suSe>(bxRZ-HD^!7S}Im2Ew<%|f;T6t}E;J1e`nF->$( zE3vSy^_ypX6#(4tRb&cChN}nu_)I+RzNrVVMjg~}aI&juFRGu{E)Jw%xO}!2JDj$b zp&-V^tC6TncwFULh$V6CB^XKeO8kypFSQmWgj$Lsipx~=51&8GYip`N2`_)l8!Wm` z%xMMVcCpNXo4DSt-z~MFiW^-5mN^U5BAa?8ra<3{E(>2OxyduQSpwO2;pQrnn~z0P zI~F&Sz>Ok&5G*wuoZ@PFoImDx2Tqc{*yzr4HTP$xc6TG$*nl(Mz`)@HrZ8;uy9UFm z1^cjQ#POc*L0Jw9PRL?BDkprh#ah{blR&}hBf-ofuapxSq(@(bdL}y}YwPo3&YhXt{?@Q%IkW6;=Nl2NZ^WF&s9;@|>6#h{LYJV$$2s70wk^L5R?4 zyx=wwNd+EO463-Kkb3X)O`LlY${c1F_{!tfw04#gZ~kW5 zF`F<5F1!LW6zkCKYVso{QG!3e_~=RyMJbDRYUiVBq``MCn9`=I;IA0GP6a&-)~R4$ z2LGUf83?Y!sAjA2N9s@iO*lvUr-FTfQ#$LgtZIY!rztt}?2Z({PGKzQpZ$ufIh%zE z$U&xYAvp9$4tJYzQG4pnrW&e*5^>)4>7eg|Lh)ZR=WO z#YX8iEWM3j4Gs3L|CpBEN%sj$5B{S-O0A1Xu?&HJ$a@XM>uPSxnn*SX%jwD1f0)yg z9pFLRt_q(pj{qfTmf@e>rr-W|Ve4rLg|!J-Fy8F)Q7>M_osAo!qwnE-5vDM_IEnW> zaJlaiC|Gv9au}W=9g`^B=(_m5VD+2uspk>(YrsTwW8sdFht{fFOD)4xgT7>R7;uu= z_AR(cBzvwSx+(d4j>>MdpOj60Ca_8Gl4oTLDFnaDGS5Y=P*=J7L|vt&&YLvz#dn2a zsmonl=qlB0Q`*8e6X4-IZLv~?EjU`!b$#)jQ@AL=8UNo=%l?*b^#Lq;g>polL=Iu0 z;g2HzC}bG_o9*)M-L-9sU;res6nXtvmWN0t_SxD;S58w6zqPh@b23ZBj2i7J@K zV4(^QX7GF!?8#v67iQ;isNGO%(Su06&PGX4j>gYn(L_43T=(1p(>2N$E32T;Sb_>* ztBM>pfZG=S(SnNLUqLXoM1Wgt9)LLW*Vl|a+PR^Zk2CJgCXxA$=H_@^lcy$yC)i=~X($POO8t0K+ zO}KKD`$x%Bari}RP$g-{*{8&8z!?3sihh~VRYtU~qF-Qi8KN(Wc5pvnC<xU+9D-#OIyA+iQJAgL4|2X`XwKEz?ukQEbOF8FA5mF)!|+^nlo>3MbwyM-*89i!V~ z1$Z$9$N=C$#poj`fCG@-d21!nE&WiQ7_?Uombg z;tU=$WchWKVILwq!F6%bj@Gb=qFX%~8K`w`xBj1)=vzxt-KywiWz*CC%DxqQQ@5Wj zyR6j9mCJG9MRr-g1yZ7z%)O{2@q0iMV-Oc9?)N1Yz{A6|T-~hWFq5L4*!0`n!U)UO z-c%{40m!xgY}9xlnlO4lZXo0uw^sDkzEs#J0XsP)wn9{VK{Dr`^_(swo15vON^+41}vII*lL+t`Hqg^D5_IUx@kldGu$cG{)$WMs%%;4l%kHGaI5Zt3q7#8>^wYg2U=w9H-)wC5T z$u4?7kktPU09j0B+W7&ZA3*eKC^XF!cJ!7N)3iZg2Vgw$idka?rkg{>ZWQH<&_ z9LF-aO$CQB*r9@b81y7et?NYl5eAJg3uWK$K2g{-m;($lrNWY1q!Q`qF?)&_4HjcG z-~x^#Q3v~O9nfqEzWc#AC(g(J#`x_{Of!CY5|fNyKEQbs6LA|71;#I1;#B;aKeqr* z5ZKKeia_epmI`UdB0=g3m3NEfa(EMc7A*s&7e(V{PrkN7iOOxn#<)jO}?pbHSIf!agMox_z72HyPg0YGm z=uLUDPppD(f*?#iD(7zH4UY+hp`Mm&Bb37UkXxkq(!?BM|+B{!WY0py7+s<6ow~(<;=4MLWwuF7d*T z*sz3cZcEr;Jf)3NoV;L;9E>j!(;C)N5u)_Rc3O7;CZgSF+f?6i;4O1D!-WZHhd4(F zPX*XHJ*9_5Kcsyl6D(@;6$|TtA_ep< zM8P#DJU;!YfBxal^Ke8FJD@%YruvY6_MgNITKJVDGoo*%ixOM2?s8n~=!}lVTT2if zJ2o-)P;{GdOqP?GVIUvA23;JWn6HGU!qrG0Zr>5z^!lOXb8=RVC7`i-PnJndtMe_> z>TFe_t^WgI=GeE0g^O7bw!d(4XsvDBby8_%a_Fk zeV&Hp3Pf8E?7*Iffq|AdoyoBmm#_JfCZEH}!(tV5BWPlZ`*@}!i7*GMkl2v@QfM}& zM7isY7Nob%6O9MPt@JBrov|KiMlhY8Z8s`v3Qiqk+4rxiZTt^<>DA;bQ4El_MFH*x zU@ZmFG8}(ohx6c2G4ZL?bj9$m6!#@^fy)uEgZ{EoBh*v z0o~Qa^8uLDQiKsblY+hHLM*VL{o{`?Gy|D27=Y*F9SgjKG17bp zW1^%jOkCqhjPTWoyO7QNgHNshYI%4xFrWHr{c^7Jg#!jQ%|>EBwSIXxANQVLI{)CZ zwO_S{y+B^})mp59Hvq$iXEuZgM3+wdWouhQV=SHiWgG+CyUl71A}F^j*Kzp}T(dm! zicH9)Y&)(|ZhB+h1!nO?CnA(JGy87LTkM4!#SsDO!PIY-sCup~t}`v08!R@-aYRwOwxj8WbR^C}Wj*T2EJ#3z}fczM%jU zi146>x(t7~prJ1Fn(*mh+$V%Dd`d85D7ZX45@^?khXO4W9tgDS!^VARiBB*piw>YG z$9<5sMUb8UHp`fxf;D~MYC3?g_O#;lBVeG2ly9WX7p(5oZ-QH$@Y!oiyGeCxrhRLP zeZBxQp+0QhpMo=2(-ksux-E33mak}> z%=~w&o@OZXH_JT=f|C9A-^F7avbjTn+}P@9P$cwMF}T@59UXH3h39|x=}Y|_m-?A+ z{Nxbk!Ee7jhE{`XbzvKEA&}`%Hyp9h<;daAFqkl=2KCoY<&cX5X25F`nboxUm==jB zd-yQllIf36bmHO&s);Lp2|AXtYPhBh&A|N;J==G~aDd3!8d}kWpS;n{4_=b#c9lyz6`CY59`#C+6c^oq%o|=;xaUMl<7*lhE zwg^$9+UD5ixqKP3GI3%A-4CGk-;&vE*OGvDN)1dUTW9z*Y*tROg--Gn++Yt6zy}4|jD+OT-5K_=)T3@IWEsUc;R)gZcg&3gTdaH6Dj%K|#pNLQ zO$KIyfm+4D6vaR>$z>f4pDAQT8qWVpqu?KAAzYw=o@LI&cqrdt)u;snunvuynqhM_ zGJ9yA(ApJ3|Fz|ci+^te1zcT$nP{!np`uqJnwLDx{H<70M4c{iz#8|%Mso@7s+X=x*7+em8* z+BU^#TbtQWL1tBuSqDl6nXxZG6KC(BIro|ZcnH{#SqL(#)26BDyAVy8?L}HCv!x1F z16Ws?&F+6JnH7PC@zQM0S_|+) z+&zj5o=f3K6!7M0w(rbh?b!0u+DP=J(VOXNVnNE|*SfVTh5t10VM4#X9454fIbxyW zgbwVsV{~ugS9cK4+o?5+eF=XyfxZ$x0b8Mp?4x6D9gP?f(U&g zL!^e#E*T;@gg%ua(nIJo86rW1KF23nqHSMpO72gaF_P|L--1?rJO{&epl~MPf!Jah zQ9B-aK&R(-B(o!WhA`11#6YW_nbxZ3Icnz5>xNGBlbpvwO}?2?X|(|$-dfRRegy~m>6fluEEwu@jd_GR?SFdLbNY5 zO^DyZKOj;Zdu)uU%Fq;b( z6edUHU?(1%>wrnXv*Gk$v>s_Xf(^rCP;1Bq0hk*VND>;EZoFvQm83MJPS72&3r2^+ zcoY~A#gjOeAnHY5fCy~8S0WL&;MrxvNLk2kpfq|I<*dvIpM;@(vMoG2HIq9X%cxLK zvSZHVh9fFjIsb^wM_V6%T$4UR@_>D|Kb;#at>8vsJPrv0%og&*!vJ1+nuaf8R|cX# z(j_LS@7@h=$3>GrAt2XgekRr5@jw(b7tZA`sbW5X-Ahs6M2Q3LoFBnWYz&O&GW!<4 z{X;FO@a6&!%YAP=i<4Y`fF>jkqOoAYMMklVm^yn_2}JEbDqSgpQYo6+u?l0TiaaM` z)gjTMxXluX{(yxt)T;j_H~)%7k^o9w>5sJa6r@5|NO!(2sx={&!z1NXtO>Dzhf5AL zWm9^^RaD_4m!^@x&7;N2It%|#Ai6JIs8}YS8U{I-{8m=P^QZ{09)6X_ z!^ElAl^X+v9pURR7qUv_+*U&jq2cM|wcLGX<2w#GP{E*z=phqTqG#;}=CoP`*@JDy z#CKpMKB2QH zT!&cdy$P|X_xJybdVh2Qsuqmk{eXLs|69-iX6H*+fGJ2Jvp<95Cxw#Eh8SLXz*lpA zZLX(KhvJ4Vo{ySS5Q{{J=&~kSz_5U7~K#oY)v^ghq|vucD7{SF(08> zH+@~-EUq#QL_7RFHi!FagB8nvcuADuEEUm+2t($7LH#J1H=smZV6DSf5|`6)tg>*e8YNFkY>W8wtvu9qtgGQdINb}sk+(z&2! zRvY#>U?CTvxMKX~J_A<*%kkAqw;C&e$AiUS90y&E#l#uN4VKWWPnnB}xBgZvCJyHk zvp5z9%Zuk?x9t`(cQt(odTDEjSFSgekTXrxBy)z5&5UVS{U%?e9Q;A#(~QWbtmsbd zR#n8|NQ4a@ynalw>4SNF(3Oi}YIou)D2HXtd3`PEUO~E{6ImG2 zJ@QY8SUl{U|AU}>v7&s0SqjyJ)+ft7f~pED3}h$*L%kTqQ`&W3@O|Ti#ZJQKl5pVGGpJW3`*`K zfIr;k4-QpO>__A_S6ikCw&8t7{MS|@(6FsYuWoKHa>&bowZS|vT5@GxTdg>{cMUYi z=>t37M$uMrM=tWprAMflr*+qnsAbU&{?$1^z$4mg`8B3|T-}nU#|}mRB+wUSPZXgw zmd36Xn`rl`M$r>+vFGCkI8r+!=G-9&QWlvT>t)q%VMi8go(?AcSTDZI(7wdUfQn4y8NL+& z7)Nx^?MnQ!RVML2DdM}qF;3@>Mu9Ds*;-)oC<&hE{tQoaZ{E<6L3fKk16j6mu@a4Q z?B(%sO)v(zM;JZ@-BQ{S-tCZ`KL#h+mV0K=_rW+!y9Uw8GmimSM*PU(?%~|@)3?ox zUoR#RIDG_BMfSAupb4V>4tkWiwX^+ChwHNSG49fUoIIVmgncO(AG-;b;q*Gzz!zBeuM(i$Gri3(aDq( zD9EfA6JGJ+kx*0|_5$1kX_;^e@Od}lIZGCKVss^k*1n;^e`y;LkN5K*p_JVZEGh+&knC5&l=0qc=`T>*j03+u6`%?MajkvFH`lOmZ5{w{BmExO_xee7CTta8S`JoYL~ZHsV3d;t|MU}rpEQ|??otGEK(J=99txSD z>(c4nt>{hq3B5iz?kw{9kS)3Qrl%=UX?g)b&UPL!$^R&t#~!`+ji&tR4n`dJ4<^prh)EYzDePmJ70(=7 z_#XSQ31Azuh)F{iDpTBJ(4RZTMCGywbNuZIMhxV2jS=@NuZeZB5mWG?8B=V;oLXhZ zh*1la*1v6*X0U-17-r&hH)3A!m@zzJE3VNX6PL|3lkQ|R{t4cEDw@5Z!rpv`iM`y4 z{dX138y zWRZH=azpCL982sOW-PnA={PVAlN--eZqEH>tC3wI<~RQ60s5$j77yn1{_})!UN{rm`0xF^ZAxYFdUYVSZEcIK<7@q3tjWW~wqdktggg3R+I( zh91Oq01IS-PmW^#C6c~kXLSW$$0e$#q13;q0gG_mzpOr{Yg~(i(3bOa_v1v8vBq>HrRhA%Vp9(A-_0`M)zpP76cQ(zGE&1?z68@;$c zE)Ddi0jlDDPcw=~eXRoT7JcQ_hZO0_nR5C%mQ%Eux|12=SDk*8L}K!NdHq`i46eV* zhCb^X+MVz>!v%IfV?Y^d#|BV?jA0Ye*U+^}-n+-`P1;5T&z4{sPz>_&4q$Vwl0oA- zJ0F6m4;CKl9U!+1(mtc&|$5dp(3Yb}WVx0&T} z$4Roynlkt!ZXicph2ddJDcki(UA7HQVs%bi$W7M=$`JGJhj^8ZANI7tN}zCtH#9HH zU-eAH`_PAMNh>_JAf8&fU~JfxA-h^3*C)deWu(&{>W06L@Bnl*jVuKI!#;ie z&;-|fEs?;=ay4;InS6^qT7@XG6=6No#^4hi`No0$VlO0wm)ozxv+fY{(||=c&fjJ0 z7;f`NxBEBfy+-ft4p&Rv!6FZiUFeKW$%dETGSx2j;?zoVq6AEgm)mgoLTgvhHwew6 zq^h_i>{`jg=mB5{xM}{4me*nS8BYU~+=ovS9JTxlt$ppAwA)>!-)Xf9uK{?n0nUf_ z6}j>uf!98}Q2R)A5LW`JtpvIU;iOHtxoI|SLYsqI2R3-nP?&bEU`ICPltnf>0)=0@ z79_9?2I*qYqv}@EnCl_g!}6~edkBer4xwAMw#C@{hPr9X6@wo?gQkE^kBd@VMA(6^ zUi~o_5nPQnY}bJFyh~;K5Va$wdO=i4MJ#Z9HdeoxB0LfSE`^f}Z*TfS+pDsegDec? zBIBinpVw>PH%H6=(G=(9KuO#HF11<}S88y^0h*jWi?9CjPRUsfiUqY~oXLV0Vd9!x zzktsmKY_5yv&bd?PTWjKyyAf51V1Xudj;S+Ui9zyI6*BIJx-6Q^6|dB$%f}dY65m26aG0YO`dQy2QalywTUZ;$)7#oi zmElSt`eV1%;;rqqoO?^H-h$P1w8Xc-KGrYXi5Ec$?U!NxhXi#b@Nx2`72KT? z*??kiM6o}re=ks&3=h(_D?Yw_62*yrl-Q3PEJeQ(8`?(EorlbNTSwfV6#bR&(u+<5 z@fbxfP-H@qOqZfZNXA-pUW#HV`q&JXdM35CKypPscjQ zaayg)F@rf4e&kx@2F;{bds;#CCs6GNQA5~jl^5N%LQX%_KNa1n=?ZHjuyCD_<~(eQ zVmV^Ut3SOkKJ;-4eJ1>~{)9n<)rNtC)n#^Og#>V|#L(I;P^IpXA)dY(*K#<0&B6 z2~ZdE3S$CirASp+9C?B9&x%3UwcryRk3(nP9d4Q+z`mvxbc~h4gY48}1Coo(#hCli zf}p7!uek{JZ=jk<M6| zDm4!JV>#Htm4lBQia6{!ye+j5D^{_jVR*-%MDJ>8Z2-dJb~=8j9!1oI`Da1c%m z+|g(G$*xI4U-zalmAILNxn=_>TF+8^_#b{Qk-q@NV-ipd?6|CwXXk?P1=3bT)x!A! zH!%P;7#)XKROB_Vvk>_uE z0GhCnA*?u`$syV(*eE9(j`@YP+2Ml13TOC?SP(_qcG@<4fck)Ft?kwVb>RDDujN8a#4K#(#}^E|1NyEu>*Upir9(>BoJDN z>D*#fyuSm$$pfoVUvYy-)~=w7WU@v8ZJ`_4bzjeBEiGHac7jnCDH?1Gofkxbt76&5 z&))!S!;Zfw+MaH~4>?FRwTJq$BR*=@=!winSb`2TeGcvQPX;>xFK({RWD~%aRZww% z{r`YREZXeHo5WhJik@sl2cAdtauq!u(Ofujvm*Zr_EL-N?GT)t`Qe9LWGCInrN4@+ z={uYrfV%7j5Ow}NKH3gN_fvG80Cq^=VFI0F8wv_UtNR` zrMpZabl^}I(|s%voCd-+h43yA{NlI+t9u#Xmg+`GRQE;FZNk;`FlL$i8@-PszALYL z70E`Bj6iK&OJOPdVWwZK;I9LYZeesQc-zp? zt>p)xux=9Cd2#3KRy&SpLLyBxph9 zaa;x?Wx@8Oju7wr5uF34pJ!tFX&xaSgd@bU+8oW9Vaj4O=p_f>AXBW?X^HNG=wGbJ z#-oO~-$2f29<0dyn|{73*ZdK3YqML`l8smK@{oY1r3bu9!EXoLQe4r8pf?jrA0W zxTm&U0e3$H2_deJwnN435OFKR{d|r4Z|@P^>#dJ&-SCA&vt^p%UTI+T*YZ`|V~EqL zRPcTT;eF{^_?E*soCG7JFBFGErA?d-5~je;`Y$ar(5pzKSrM6p;6>5hVyN_MRAjRt zy?AM+cVML5ne1WybTqXJJuhFH%pP-a+Tf32+BnP zzxLtPxXLO%wKMt#rbKp_J^h0A?U>;-k^K^6K6()Pc5J*yI(mhMw7doMNJr05U)&ba z@-GBdZ^s|et*1Dt2Ys?pR`_9fy@ieI$i@!E#xw+tB9pAYMeu?whYcFd!3&pq6feg& zGz{4nFXONN#f$Oz*^Ik^A}0MJ7N(`GVEPsi3I-%{mMzs{zq9YKfxdsl`7)w8GHoprG8Xd<&Xv40R z)4e0u40E+Q#pps1W*2Q4YB>@q_>F+`@qs=q>_K1e2<5d55q+y2#=;n*mxZy=U3Rkt zh%vj_ZHmYkk%_xYKfhPOdkDB^^%A@?+VUGdHOi4VH_NQ`#2+vmt_pcaYCaYBHsbtZ z`<^2pl}(mkbXNRBgXh8@&GI7x78P4I?G&!lVnF0v5BmbG_@EzXl+f+C@Tu|dh|*@N z%w{4p!=wuj)t0OH3dE~zw~w%gXl|IDVe|s^Ct0vZTCqEDntnC;?DBdDy7vM^)5P`R zOA|LJzRwCTCOTqG6JdGQ7Y+loS2t?y=qdab1lrl3&ChV(Ott;#>ClT9Of}GR)1kj&FxAvN>CnCmrW#EKf(dNdq~D)_rGL~VW_p^to2d{x z?nmW|B|U6(m81NaGdFrG(2sKq21iDC2N34qc?^2^D;J$GU;HL|Dg0jI=XdZ-&fP!I zK96*|T#ZTjD<|}>SRyT}Ze!vC%!&N2C7bcsv1`eu(#Fq1&PE(ceF4akBbk6~Wn7Qa z#{D?mjL60hLRj+wa^oU|sG1evU#KRp;roVD9iQ$?7<&0zAW&eHD&Mx>0-d%j+UvC7OVgLx*$aD&4g z!F*>yk-S&>q+{0rWG(2qa>+-c!zeR2xDx0npKG2QCnr~UDhuaTb z7ahVQCJP(EgIEj|dH_1qRNUTL5vob{k1fd-WCPiiTmmlK7`kLa-0>ok@YvN)ijR~= zd5(T5ln9p8HA*$K#TZs{wUCNijy*#ciU;})(YawW;ySCWU zEbh$dmqw^o*s97o8MOcJw8D{4c-abbBGzoQGI0!4|AF8sf(2`<8}y3C@GD zA>#2XG{hV^5{O3i`ti_q_TS{=G})>GXrm`^iOM(scG0fz{>!4Fz%fRU*YwYJA{B2l z`9EkQ@1?hq8ndV2%X!CWBLY3uM$R_Tsj{N6xLm7nXdYVUT7`o-$=*D-Ae%~nO+}PO zHkE#?mfpBl6OXzt5J@r$x4X(WHnq+x6kV$Dxb!wrgJVm^vJJ$_$5s@+BG!sJlv*8% z(+1iCH_6Y#@4_sO9D>RoN~tU_IT0f##=ifivbhi>o#f#aYhK!VAI+24fPdGSi@@RW z!c{RSkh(g$)?5Mo78eWt5o(0%^87EJh z#Q^{zl5#MIO9X#3E^6H+X4rHF_yOzfn9Ba#Rjps}%D|PE)0yyCSGBHQV6t}$aDM5k z)_Z|XdQVQJk@=;*5L}u9rVuTC!W6iUa(5;eJru;yi%tQ*e=6WvvrPf#oFfD*-ao)w zb9nbcpzGJKhZh-BqmZtq=kO!#jKP7J>Bq%~1EFOO_R3D#u^Y<}AL|-6j3}h)`FBbc zyuxDCtN;nEpu1@@Ji%bI3O>N#4i&tI!91slT*qLY3SN&Oo1{~}6(SO@RpOQ%O5)1& zi)rhi)wEU$~Z;bYdxFI;HFcc$^> zbwJ$2#Ld6;mx7z<79JS0+hqS6#M(q{FbiQ}0OisEstwNHXrmzk9^57Z22@%#PTmeY z9mf`Uz6)b2&_th8pwGpQ0!2Cm+Xi;*4Y*cbitC?>Fa0Z~aOV|YicUFH07+Ceb=GC+ z;YzI5;f%Tn%#?wdB5d=LO8j4U!oG8pbg-sZ<}q+ zTN1Uzit5(CI18wRC#d!fa~V~;lQ^Hp@%DA-+ofS)Kr1?~)d6fqwTiR^bQ1=nia@Vq+BVrwKs??QLDVRTpX--D))ONEJ5W zan1oZ7X&jy-k@c>@xVQ3fa0dZ=SA(lg^bumZ9*te*d975l`6W?a+#K<(%lZs#6hqr z+X9|==Vdsl`>Fo`%*6YEW9cr+*Gk3S)~v=VZi6*%06-XP)-pcE-n-glr2rX3H;|e9 zVD-M>hA+^wvDL-Lou059+Jv@=KAO%zw(uosN>_qqUuK_| zd3vyVKN-NTb%CBhzA3Ia6{|i6JA^pGM*->w1=D2K?nzE1-OTXC7P|Ri|FP+^JpYC6 zV-~ul_AiN95V@nk7S2XLaK7#K{)uz32NW2O!KhC;sNg09+2(xd9asBJ=2+Z( zx)_Tqsi!$?K*mwOk5(8nLpKaT2n^@v0Mpp<>6iZ=j+kbYXb}|0uNK0w5<`&icT4O7 zmnoVG=`%hofT3iDAcqk!bOkACeg0+ z7Q(=eFkl+T4SmmIA!!*U`d3PN3(g++du&Ni0aDZyxB(valriS(%mgy7AX%-26dwge zlph`sws2Tmnkqj|SxNam{GycaWn#ji|KTDjU!kIg3?^v0N_Y(tMvA|PQL-mRibn{_ zBP^2jDaw9O=FTnUW0Bl&AQ+Of4ueI%GbQ)guTqlBrsVRZ=10_SNQ zM)emL3CYQ*HGsp$*`vpB%EBr+Nlk$#?zc!T&y-xY_AgSb2E|CRA1Xx2<@GXEs|w?w zl-xD4&4h&H^7JdqrQ}4LR+6hz2~R}ANb$4x8j|~R0V!K0*G*CG4$7wFXfPJoLKg^2 zgMoZ>WXg(kt=z%qQ9P-($4wgyzI*gfF)LwX6HSk&LHFpNp$ijt4CX*Uu=WgnInE@v z0r!6il?3i;6PF9gHi;1$$IOIjDMiW5a5Kvu{Wh7IA%E65V?!p5Y|_B6;LZ$qbMP-4 z|D1RXBY-jA5iSxl4fvS58XrJXwC)^Qts4L6OD=#|;hV&TIKF6;BhCctUzfoOKml^f zs*mcmz`>kKlvK(Itzd}2rccp*7eW%#DGBx<|0F@P=)+-imc@&Ti0js80x=Vpe#)kB zuYo8u!-|-#pC=JfTv+q^H3p)GDr7};>H{Sr4nEBBdh`MVF_(zoPi5`UzZM|civ95m z21qD3Qv5%^rLr8y3E2^pSBwD3+akq(gA(z6lXETin{1nhy0zYKvI-GmeNw$s*Zl#h>a-XEg&8%GMOdvrQ-!xGq@@(SEC;{R-@&GAzYQN zBHUPwPFp(S6tc@a{I_?Bd3fpdX0!kLWYO$}&G?hYQ+7fqKQj-1Z7#|w?8GRL1g~A^ z;m-m^l*O2bW0Is71&w()0>_?*v+$gU{|;;R>|lT9$rLdUKNVRYdmf&z*!v0+{iS($ z2C!-59)G^9g>K+da1OCjh!&$GO~5=cC~gC26lb>C+=6lWn4Mt?81jDmI#b?rPZIJz zB^Y0V#{r4ILZmg*=`TNPou5Agf04BL`DJs=`T0VCVg?at0WBWwQ(X3^567#JaN?p` z@IN>wF{8|RH>XxYgVlHdS2CSBZgFITJ-R^P8}#B6GWqz%Mx5U*+*bbvn$4M(q2#SQ zQT2cMwP_n|VX(HM)G(D+B53r(##=uA`SXOQiff@0>&<)#iM-3V@j=o!IThhR{14No@CoXSl1Exl8LzPI(ml6_Qms-%h4`{xS}xSC#uK)M#?)jAYqnc{Lif`T^kx(ydi zE5Kg>u&~;2XNE0wn`n$i#&99PgKZUf0p8cQU}M;W+dx$jLb*;Yw~r~VX&{xvUh=lC zDAN?mnLt6?X7i8NrixOMQMk8$k(6Q}^LNfzX*P7Y=@P8z(!-e=9KxPkdRt7)MhQ=v zZ8r7y8BA&Es|ZShP#n1qSc9@(HWGg(o?cU&*Dchoruc+z;R=7lym2;H)Cm)@X8yqp zH|Dp8q0i_7yxBc6?3nM~vm4>A+5eXLEmI}CGCe;JXD~cSkW$;H7>fNm&tG_TRp?h; z$qixp*wiZMR=XnFO%Y|6?132Q9ZcyNUAPZ5FE$FO=I<^%+$opTF*IdE%;SI<-4glS zZuX~q`+~>p;7;F2Ljc#DG_Jzeq%L;OS^4LZ-i&^@YZ>{rBf^BZ1>^z)vdjYU2uQww zz}eYM;1khBmu2Tp&Sk&#c~z= zn!yeg+=-xK{qyro)}72X*w@Tvb$X&_tcjMZL~nu%Q?O7{Uaogi6^%}DxgJMHJ))4G zL@-i(YQrdDd|EHpyAagVjL&nJJ0+@*e@Ysk;&MGf@N`A+QV@hAw-~c9;1eoUU1>RQ z_QTykFuz<)gP8sQN87u=M_HWv<1a!4Bf6lVsHm@!NKhcVNeGD$Vc9GsB{#DPVAaNu zY#@h_#JxahEnpWa+X$r>t*6@7)}Gd$(~G@%FN^hpr&p@2($-em{(9V;SZlpvz3}^f zpP6^|eK(<}=l}csqa-uW^UO0d&pb2p%rlo4dnM>=6rSttsh`9_#g1>IBYyfI_HvKn zK>NReh<8b0>@{COWAAbFmkH_(YC6AX2h&H=BhIJs-puYERue}J-=CYkchY6G=^xJf zO>Ol-U-N&{y@$&nc+ZrD9Ou=kWbuU2VD*t5UqMe~ec+y(jq5wPmz_#b#?fZwtIy<~ zoSF`Bs^;DgK<0@+<~GxOZ^aBu`(^VttkrL7@)U!{s( z3_qWgnwMP3%JbSViasXd|P0NyD;oI_BTqSK*n;=ceW z4y;mIzS+(y&fD{vG#OmBP;)b zbf}Mi*QHZ?SR4f3pH4A1ZoJuO=QD=|lfrA#p`q<(q(ej4DF)dZMkgW~d|)=n=`yfg zW*ckDobP&C=bQzg2d_-dM-g}b77;R82ub>TQpW;`srX%v**tYDhzIPBz6V6vC|)ZK zm9e<~J)sJ6^J9}v7tFW&<6shez{cj{ zNRkGs!esQ!jR@dRcRI8*^`VVcva^oQ6F;BbwL_$yd>^YmQ@8a6x~*rawsso$4BfQF zXiHUon|YkY_ML8EQ|-{N^huKfvhjIz+VrEGV!;K{loJL~T*%Z2Ve|ldvnN9ISl{MMYY)=M7!wA2Fp~ zG^R(?Q(^K>7&*R(g@iMHCfp+z?oIX;4e|!g5TA6~$r9kDHT?1JGMC`Kyf|$#zk|C{ zgr2>>8sjFOE#oeH?S?_D`E8AF!ISxL=X>bUNupT%S zV4O5dPp(79n1-jONS9ehVp|hqXZn!PNeVs#g&Aztp%qg|HC)iX4aJ8-pt`e$XKwf~ zVr_^$wXJZtV1dRt_2zd6kD^5Sjo0)m2hM@$=xaGTT_1zX_9EK@wR~wzgR@^w~kt zeTTsuyRQe9LzT?+(GW5hDe+3zM^QF71t25eE_y}y63KF;q6BTkv$qHViu!!^T(&B9 zc6WVB2w%#~gFqjEBgnnf*u4cv=DE?G=g+~#$vo@E%kv^#C|ELIkp{$R(UU+p za<1kbK*pv%aX0UK%UK^@tw?TXDeBym^=`_WbCh^1`Hu&#aZ_ICrd*$+yp)vJyD47> z($uWVP$ptL6XKENYC&Q!|7-RzD~L5qfvYeI1D1nSNuXAN|hp_YQ4q-Nu?1oqT17@-d5loMS(?@Y~sR$3-RQbcE zU#m{{K@?p^QK!2r@T-stidceCr50zx@CiDUtLVUa?YVJ55neui`tO?bzCE`VK<26y zl_LpVz9f4Qs#2Faw%oUS3-GiWY3+%1HC?Q$Q+rT=g<@hArhl0FBaE!JqJ_Tu@T&(M z7oYb?hy9+~?MH9%R)g~L4ragcQ@7>ImdjifJ2)n3=a{5lFiCy8{=zQD0TPXe0}i63 z*>92nt$mreL_B-!RiM+aXb`@f(UIGQ3GP}W!eQ@-{8da3d<;shM0{T<=lzosXL;GG zacXo`50;|~*C$KpaS;v>8%{ppQ3$ewxr9xrhReE({E~bWOW?07I+Vi?5~o=CwK^;jZA{VX=lybwAfqbl#HKNr)f#i9+)MrAc9^|!r^bE6~Z`y~W!zMK8$X?{5E5*at2{zj!M{QJU zkik<9*QJhPi3)K7J46s&U@wnehNw_T)WNBg!o-_$XO8a;UcOamYeJOfOu!1_8+Wqq z=#&2X^euNw7*(lH%Q=|?C)I~q*vXXsY*>Kr%qS(fh-${U{=ld8n7JQm71gtLz@b^6gm$PX$f3n27AIY96r9BY`0 z{!955_8<)^at~msC063p`a=?Cvij5y2)2@I)gE-Bxe@N7_u+g@mzz7!s{83bDH(_T zJTLpxTsI#(nA%r^PO_l}2H6K9= zIlcM0OX0h(`4kvQbe}}mIoKVDrfUAr>N%J`cBN1q8Q^5nLq~yyFCO&meKkySf_7z+~VRkv2u8oe*W|HHwr!nHuz8jZYGQ_#1KC1je=o7PD;!M1mEX7S3UX& z!UVvR5(OkI$i4)#7dQLxPQ!CMK93dUR4Cn4tdzJea(TVfG9|ZoxdkE}yLj0F=t$42 zdDo7r(DCb)*K78HDX3Gn2UD)H;L&dQw#0f&%BmOEcQ|{`ld<5-yo^arA^bql1easUmg$)(Jx-avkJO`gr)r)YL^~zs>Rkl=kn~UL^+qrY=g$sI z#ZxGd;OM+e-5;F2zyuiJBLZ?egao+6Or7RP$_|u)*DbP_utz>db972D!&S#hKrx6^E@ZL36zRUs=H|Z zI~?CqN8h37Yf!;yTh3y8iuzZ->`S#mZ$`d~UqQzQdKA6FrYwTP?NvAaotwzXX6#Lc z%X$`ELSL4>b-C}pgLpJy=&f4mOc%lEEtxpuqzOBgE90RNf8G(OHGSfQ9cPXD063Nd z6bKo3BcJ5tA3!}W8ZFrUm;H$u>ZBN4w|4p^jw&BKhOUkBF2U)kE!#$Rqgd$?x_03% z`fIlNB{e8DvyskvklqW*t*92Ot-5*d9G~#$=xmy_7-{AosE4lMu!w5AFRdY#nz(n6 zPv6b2Mh5XOkNQP0nL9CUDZ=xwfnJ^^P`s*^>hWDzi*fST8ju*wFL3B}(7)e6rI_D; zQ*LhOm+&iS_7j)T8n=XB5k=l!O%eF9BbPfMoVZ$LavCc?T#V!57vj4T4NHpeTggQ= zkI6hf7pj=MM!5nhM&5%DOS!*pe2im=YdC7BH=46sefsYW>Bno+KgO4Csj} zPKmv{igr@=YSxBdg9DJ|JRs_Lx+X5)lPGF~&ui^YoC&7czODzl_WlWUhP6+u+Y8I6 zhb*3ery8JAoB^JYn7s4vCne7uom{&I=+Q#J{T9Oknsz%uEsi(vF`hCESpb5LwiX|_ zMz!F|Z73?$el0)a>1VSuHqi2$fKMLcv+^~P7#~oiOk(*1U%*a zx+9OCtwe_tP`GG>67Rui#N05pQ*c*b>-B@}0gT_)#tOyeJu!S%2#dxBKD4C1xl_0M zsl+K<1lrga;`vD5u6f|+ySI|ED_y?xJ-kK4y`>;SyH7(XRdY%ghs-mV`|f=slQo6x zz6$0X#DdDwjlER)lG!l&^uh6L_C5@mvVc!04Oiz!cMi?6k{67yu$gHyone0l_=#{v z-i3fsyzZh>d0}YMP6&H9cHvv5`|hoStA6INw{wGb`}UX z84jB={1jMK-g_~6(}0_0`EGfXfob^olx`fYMHZl)#ACJ1ls`RbsY2T@E|FW<)R z6E)^}_d1P<{Bq59t;tWGQN4HhtlFxVx7xmYakc~cVx8r*Z-pT|9|Z#vUkIDDbGUZ* zY`7s(M<=7pEyRtur4zPXz&2QzsWVC6!ce8^r0?ZU#aCL37E+IA?U{zk_;%4lo~r4< zb}gG^ze#!kNrjlDQRY4?xa0wp0e$p%cB}TW@48($oG%>CVUhrg;m_P-c*VdAdYLE+ zfZ6Z0Zh9-gYRlN1%Ow4KW;0D?lemCVw;}2?(Y3g6vY$9f*X?BKYbSZa_~P7g4}2 z_&(A#(_#^NrGd7NHx0JrPlL_+OE8!}S)B(t9dZ)Ajy8gI zooi0~CNNgQ@4N4gA_n2;c>5CA)78E=D(8)~ioHk^Y^#`o*KuSldZ}&0a3GKT~RtUsoF7 zn9B23i+lPXuikj?g|#lknue>SQdd={IaS5Wa8H_=o@Qz)hy7HKJjJ(rHL8g#JIf|+ zotmK?n%#Il`e30teSZzYN-5c!>e7>nWRs23m1$WNljZoCz8_JUswuykdRg}1GniQ9 zeIgpX1+YdRJnBHWCbqMGgBj=PojCmbBskNrb{K#8B*zi?`}Lxu^7ng1S^4|0yxay` zg?;VO;F@52unk6E>c!cCs9B(bqR_DN8hV7;c`$rG>KaraIX5$H zmNV}Cq6MXAkzAk3dUo%-$I+rQ*>TUNjLxDeBB}*NyUowudm#^geN)|n@a^Vt2(?Vx z57}a8=|5+q1#7O5JU`?za<4_6vf2p#;KrRhcQ)+p#sYFS(>xJ;^Dh%#dF1bt(|>#9 ztqapn&--!uH;?>r%DmsCU!C_fzLJC|wk$OLb*A`dfE9eW#{pMapNFys_e`44XDjRQ zQbF=7qxG2)V+j1QnXP^eJgUq&`&E=M{e(Nuc|S`3;*md0nfHtI%k!SxGf{?j)O2}W z^`ptdayl$k(?>N(UaHomcbc+%6uckg%;74|&A5A$ejH}tPdPoF&6)5liqEF_{1o3! z&d^tdq^X+2>!@PBOuz(g zm1_B(jgvU-r?QjwgbL~~!O2RcZuq3SG!FZ%z%F2L3cxnOwio-Q(3SYoPh3s_M{1q$n#OvuOwf-|7sAFJh>+{IrsnvF&J{=l)L(F)wj>eOgYEV z#8pnAN72*%b1lVi#)B6_3pSPkIpI_EqCL^SH}o@{IN92o=ED5Wcaa`cr~VE}rsyO; z{R@t0ynUWZpG?1t`+_4c>gXqr%6f6+IUNsotN2e4cYPvb8jEnhruqBt@P5$SmrjI{ za?>q*qi4?(zL2H*4B=evU^}FSJH((DC7)sd%4`Z#bml*C3v2d%gMg z*KGYGe4YZh8}Z!%A~$$0!AXLP-QZ~e zqdl%6;u1IF%~sHd37+c)9|ain^NA>NBMy;%Cc%7E*p&SqMgPt@K(NUS;xnZGGr+9) zj#uA1K5|4ynl~fzV?_AMV)At0_h;|?7r^cV%q8!)-v{~K<#-mhClTMt=tXC3O>cqLst^_=Dzu~ol(PJiB&S=SbPRWWGU1y>*8Qp23Co_7F ziN0BfXrCFXvWTW?zTZZnOwSxOWQPIA(c3ArolG)9_}Z0<@WY0|R~6x{25_qoUf8M# zziHsx72#tBuo(c?F#7>U{U*O=M0u>B3zAcF`1(&{(!?>Op~*EbOhntxa3#J7)FUrr zf1lf%kDP@hIpM)a9F=eGebGz)&t9yVCd8v#-OyOn;ou)o&if zwJF_{$p+{BwNUyuc#$SCZSRVAF!ODhvUdeO`E$}%%{=}YxQ1;q$4BS+eX!5bYwl*+ z52mhCb|5;k5H)b+yPB|9XXd(seAZ0-n%NK4Vl;RbIO!bw@%FzOXKz{ZuJq@JfpW33 z$m(u4E9rp02!P8c94^8{kG~OIavj;~W%AHUFzIqL;di@Kc|N=o^s5|BD36&E4sYlD zGT+N;kgR3_#+C@rLE2LpN!45q#qsp+C~Wl1uZ`9$M#9XHQIirzUo_Zr7=6b?3lUA# zJS$4OEOYKnj`8#gjv1$FG6J8Qxy-Z+?NR%_zwZk+-)-bu8{52Wa|vs?SMO) z7S3!o@RZQEX!;|D&nB|H(U9@*bLMj<+Nil<7ENB8s+q1!Yn|_O$@#+etrqq)T+uY} z8RT=H;ZwlqQzrUGEuy0)`U0Y!&$r?8*@n}PfOHfe7f1I=R&z5$hTv-;NY!l7ML2nn zBj8Uklk-jVBaBvuqQsPPs?jgbLQ8>DtGA#!81;OVX&Ae=Q{Yl{W2pm&h+G)if3;Z^L&&^z9;NKPaPJ#O}mmB!) zfV8NJm+&ti0)smf$T zv5(pydh&JZ$u|t?DDD=eYVKFK{lpzIxStE|4&o9+&YU+ZbJP%gQwTmJ1Zy+L4E$Ds zcL{u1=Jby_%CueJs|7wcbE$#%2)tb2zD(G_n*ew6^<_R_;FSWG#YJ*Os^;&~*3}NB zKeNYFeX4N&wGhm52z;4)48iC!i0X)mKF8=3+fjm_GWtQ2?*T^lndr9|{gR2^$!Nwz zKY^&uar?52-|*b#g3ryg7<%@Q1naG5{bmS(10>n{ej?xIt{-5u@ zb9_G!k^eQj9DXiW>JK6H$XvKz&6@U>zX38Gc^GRk1qkK$4$kyCw$#~@$4(4TR<`sd z?f(GYC10DYp9GBA`tjD?$U}%YOGvzLCg$!(HekK^B_P!Db%u-Ytv8@eZt^ny@e(kN z1LjO>uJvvl>*kTQUi#Zf9~z%N)&=^xUiwX>KXZKgkGu%nn>-tzQ=%oL{}W)WWO@XV zXAp6ur1bB_7nFP+_9nHM^lqK>^M69*c0}F?FP)W8{(?8xL1s636aDyd(8U3B~H2^@2jS&R_2vv(Cj`a-|~ELJwE73=c6x-SHk|9eG=z}@g;knd_Dqg#I3t? z0?w_wLpZ}dawgKM=D3pdMdy<5(U9VfFLW}Dg}n@u2K0cSmj-Fo#bz z2Ji%Oxd&&yv|OfKEOMD(%Kt6YZRG9AD!;!yDfzvqqu>6uD(`bTz9y;0o1Y-AHG$vL zHS57wRw??g1Md>Y%T>tYHqGOTpCB@<8Q3tU;h%BVljk9O%BRnp{vM`ZmrG*k?Na4W zTI!|WN&1p;=s&tlm2aw-zJ>J1cql$qGZ#wc8WVl#gBS>$W?Yc*LwxrGVr9=mqRcuI zoyusHnabW>%(?DIY#EQMxxgv&^7j)w=H&z?dIX86 z!E-Z++<}yg41PuHzmEUrODcW?;^XO4_Yagl-~~;$KHXUfo_HtJNn`ZkZ+%KX=X>b~ zNk2=|+gRo~`j(ul^yeKe`*TCza?)o3bF8ZKwE}3rjT+ytqtoJt-jpXZW>pWDKBBlp8@8iyue7N7IJm`?@#^-h5xEI z=_tp^PXT6%pY!MZr4lvY3Y=4ZGef_9_&xY@uJN+EldS68tYpGHnOp)67dVBmXr?Up zXTJ|FBYB^;znV-Yf?6w{D24V%%~%9ZFK{n0rxcfw{%OF*pD$-6NnghFGjf}Y+Ub8+d{5Ey!h$QS zgQVvp1x8h*eLp;iOs@o3&EPKk=#!rZX0eyahscDF#u_F$eG7dX^phP2w*u@M!ZM91Kh*FsY0D$5TCgPdEDh?^a5@LjqobBVdOKK{&6rG-J-Zm zGteu+W&dc0t1x$g$7mB9;Xe49#jY4#W^&!QlJuoS|K<~T`%~dBH28<_p}p*O4M)K5 zeux6r((EE$+?~RUyXp(~X74}!Zg%bQw{a}b{WX_!kPr2&)DR~5cz>N|=*Sw_v)q+wqOCh^jx#s! zAn9@w9Yi!$Q-gBSce&kUu#RMdhOA!5&eCM}7H=uAgQNe73 z`>5a|Qj&p8wSo5we2Ku6jrr077V~A8%eO zYwH{2$PLE}G8+x>HUKmGO*DY;z;%g2%HA1% z4+5U~yor8W_-q$Gb2HyE@P8F}kHCGI62taJ7u#8>ny@A~WD;Jd32c}w*QIKTgkT`E z&Tv>JoTmzWZDx;w&lUJJmsInZz7aYYjwg3Q|KW{7}g1M6U%ivAqCTm_7?(pPE84y zNy4d`;dKT+SKzNLVoiOSJqGS`F+_VltqGb>Dj-1R%VZ3dKYL@HG@JjdpKOQfKTjVQ+%s0GwtJ!x^CADx#@=*Jl1`;5P}pP2kHiuNnA&z?TYq zZsz3uj+oX8yhz~Kt1vQN26*OtL*_@+X`ZH3&1+?p!rV;25cq`8a{~8e>J9wOOTg!d zVVh<2I)nW+qdEKTM~J3sJ|j%r?*8up?s1uXQ3#(YWhvb5{@xlD$HkghHg=3FM% zDZ-q~q!|F0X}O$H>r$uJ1Q6xth^t^_<2brbctxvz6;q}u8mRq?uO0u)xej5+S7krH)HGUB6hntf> zhYIe{z(WNq4Q$qQ2m8iCC-i?z=u$&B&4hlWv0(l5c}|jdDM-oWuO`&!5aRwn9};_D zE(pYA!&5T{l4$G9atJc}mm)OoyAyo--Z>wq*kySWe0a~SFwQgXl7tO=@8|1}b$j>w z`3F~_a9)3Zi4NO!1@k3{L!cuOcydx%f9lx#ww|0m7(8C|*!?(!V~w<5h=tY6FJRP8 z;oSc|ex+@MD^a}7=0nL7zC#837$B{W9-=|h#7!t(W@x_C;>#F4w$O?C8NIXAiC)BL zHsD0hVD$b9Cpr;P5x~gf7jRKka0T+LOBWo+C^~W*oGy6Rr*@)xOm1Wk;{5uQ%_}0a z4ovHUJA1fhDpDx3_wRps8wb!&N|e?OFM8v2+~=HC>Ev_!9Aw*KqBkR|#L$Fnhj$hA zArHL2aT>B?kUyhm)MOFdeyWBs0?Lg!N(MFMPW%;0!WcoKZUiAvYveEjh_^WLgNzp( zfiejC+lbb6{SZ|NqR@5erH>!Ja)Y&Z#e{T$1u-0$4<6Z{y#y^z7hFgR+?l>$f6 z*<)(-;KfdjZh+1_0gkvXfdns|HV4goKZa;D^Y+_De{!hc?D;z5DwbncQ3L)+K}uMV z;qxCt5;ZDp$kjmdiQdm4v1<0r zMQGcDMiTcRs@gV&L%W9xHZIWB%3?>4B8K@)GRFfINW-6o^jp-*5=SeyAQx4!;5}?D*746kV6G6^EK)sMt2ph19KsruHto0oUhHHte-|wCC4d{ z~s+SQbW@k-L%X!6(Z%SO>I_0?0xM z@xuS65b+4+F3=$Jvw_L@tDI(e_(J5c(L}$2s1nowa!3`-pGSpjI8;!?062^;KUC0$ zY$aTQ%F<`b2!huk$e+>Ksneb>WWqC3r#*wfNuz~_3NGlq*uvJ4_23@l){uS)uA}dc zuxz+VdJAs`)MQFfoy34#P0uXefEU@G0s*?>Lo=oCCKe2ze+OvPMYsHNP3-w&O^V0jKo1;*=VXfp+-r#MMU;rTwUt9`3ESi9)#1NvG zupxkuC>*+Z&BLe6L3Pi`++(C)ief71|7{lMlgn8O-|nv>>E7hK!!ws5MfEeun(Ehm z`zZ7bhr8jKGeB0?^&`AK4G-AksMn;Q;}h5EneUXMc6b>DPcaQI2p+>I&0^6hH`7wK6_LvE`ZUixVEBIJo_p2V0z@wHcmstdLt$&Tkn z&P9@J^qc%%)MFTr?*Cg$EiNG>Fr@p!hw<^M%&SINCCDEg5eGFeqco%!b)zJ3_4;;2 z5l3;V@P|Kjd+#V(N|L?ble|XWhlU>hw1js*wPPAcm+O*`M1Vr)V^Z90y_KoE6nc2q zE;6b9;SCpVPwZ`(kp8q#1*?B~Llo5^ht#oU+ZT+kb@Q7DeqQ3L9Py6%b+@HIy^Dsb z0~CRfSKVzo!zD^UH$32~(dfm@_IxMNv1L1^8%`-z7F=Um6e&O}cik+NuiHE0bl<%v z?Skb{m!4S-%;>)?osSC>duvap88erVilqyZb9D8s(sE##CBhHc7C_V`A z>ju1~cnUfnM%U*jIiu@O|3pK@_wi41>vg!`2_SajIUrBs(~+5Q^2xJEnWJWmTaB?f zGp*X0f0iPOTpbNVGjAUhv;85iNBE%r@T5mm_dm(@PT+GoEt4>!WllE(!aJA+MoVgk z>+o+m_7&>z)Tq!5FQ1*BgfA4BoSp(D1k0S%6Z;GWt6$sk*;-tEoC)mxXCjl4E%@yW z)4p9T5DYrf-IvZmN4g5|2BgA^BnZ_>D2$Mr50)TQD=<7R=FA6|Ak;0u*$B}xz;iOBQUJILF#PBXgT6=cOpg$ge>sD*smmWaj|44?ZBWyREKE z=^!pq|Kb>~;r@~@f3eoC?x`Al$5W$AT%6bnmr4J2I1SHu1Z$JS{ zgk(^Lw=%bL*6B^L=+g0~2c>_$kMkVINE1pYS|3KhC2+#_1ppIeaAaLSJo^ckh+mm; zVi7+B+&>}WZ;{167V*s>F(Q8EQ#tzoS;SW&DMk0S#0f;~2Z2k(!E^pc5x;k)C&g3v zRQZ@Ljvng!_|GU_jwPs`?p%LBOoV*|flSuu*}sD)sMPo}=xPNA=-c-dq>!digS63l z+z5a4SSllGo;+u`8TU(%ymztOFHIK8sGhy+lV%hiI|_Y&wAqy(N1 z%*M;#ifPk$OgS?Bc&8qReY<$1z|>&Z)D!h+I&xfE7R=m{!t`fqDE(S@WZ&+)AO}AA z4fn5dqVnl^t^=?%p1-srQHAB*8K@Eah7Ys{hQVyKOhW*$4t$0XTSJgH?49>UX}K^B z{>jFEr{|XyA)=BjpUHv$}8BXFbjM^og1=?rla`)!NqKsupvv?xV>Vq}qo@!wYT8k;z8tN}@6| zWW@6j%8}Q-kc4!ZIcAE!6-1-c)6Zn?H|bIU!QdgG&Vpn6chPVsZl^V4+bL@pmVu$G zyUjuL|D~P&blN}LP7i?c#O?IXRHvP;h4%&`6r0Ppi!O7gS0$pZk~%=&z5=I>#+xQ& zc6jiZo*fFZSHhotBFXJ|G;ffqs&P67i|3NsUl4Vb<$tZ+-$43*PPcU)k#~CuNFLZ?Z6t`v^Lv0m8%7CvyNG&4D5fVEm zIq#ocJDkDQ!RgEbtzwM~s4VmffFHIQF37xou~q%JZ(kFdhfW91(fCY}SpImq^>Iwz zuZRa$SY*HaOXYgq{ihSP^9T?wL6;(TXDo89Bo1Nm_I&n~+hI29B}7r(-pC|}a`=0) zz6KKY)!m_ziA?YZQ9LDl+%aJcJi@ zPdEWpVPM0n%v}Yad+lPl?BKu?zuj^(fVPA8aKR2>Y4sIsK>&jM_~SH7DTG4>{{awx zT#AM^RN~(Uk0GA=gq&T%I*G;Ac9A2jy5Vac7hyg3um7~L9-Q+3MOeF#3c~utxgxCh z&roi+a%{k!SW3$vB`Vq1COb-2h+ZqE*Iz`xI$l-!#Uru*gnrdNrSWNIy4=8hYOYfD>_t$0CngO&>>1Sa1sc!tb1p&Bs6ZRk{wVSZwY1vKq@!!BP zT`&VlvLAuwDHo@2R}BjCARV3QCtU8$dL)-dKgMP&_zn{DNAx@R14zL=_Ra>et4m1J z-Uw{}YLsB>OEYDd=%I@w2L}gY3CO1{XgQT2Me|@Z z)+se{L)%zTr)rX;2V&Rv+bywy4Y6oEF4#4lU7h_2yQFDABgwrztsI7_v%w=V(l2YY&Y`+B8#_L|;-K2^~75A;V}QRLa!+26S#x|x}<8RBuf zwRgkDMBEb6hJmh49(qzGdbf14wS;0-Y#=#kHzyNzbC2E1X0X5&1&Q}|b@rjE(Rj2U zMUQlD>FwVjg4Y6dwXYFZBq?RE>YGFMie!A7Y3j(T282CFA-KIoJT~Ttwp{+BvA)2siqg#5rqEh{~jYwjVv)#^~5=){arOmcL zRMns$iGi*Gr>1S4@lAGHG`6|7Uj&cJ_I4*Bh{oRd=FUXdMoTE9DWxTy?gJ^hl7)wq z{Q9g@?NI(9;Q7amZ>2HbGlVW3R-Jm2l4yU@N!6f8 zx~LwIBNqapXVKm*Q5Ts5aZ|N)#uB~ka-Ch9pm9tHZB?a;G_pz6AgYyvAW^wysIcf@ z|9XtvMhf*R>S-6NwzqRb|3Ey^+lB7g!&YfUtvlnWcxw(#$Tcj=6*wWD&j)dE+mBID~2W73TZC<6|ND~Q1oFs^Z!nsI&)0$ud zGUbmIZf$LDl^`ORh|r+bfogk&-)ad-#E(dT&@zDvdR>DZ43J>KIz_+E4*C_1LJ7G8 zEU!jLSX8(|VTVPS2`j1*7ZwsKb6`V5)}r!Iz+diXk(?kXogm6)f@LNcG6Zd8t0@pR zBnX!)c$q)QqBvYkj*D_RF3KfbWP<=xe!yQ@L8u7^a>4Rku)+j$$--o;(@CvO7?sI| z4R6pJj$s>BGc<;0Wv*0};as>Xms1txpb`S=)N$y891Nzf#7G6vMiSc0l1D(ECL zx!EgQRzVd+Ol5&wLI!n0395t=6afhB3TbHx>QV#(l}_Oqbodgg3Qwq}En^lcV+J)X zgGy9o5>&|;tj*EZ=AfEcd5#%_ni+$dnFLib1~oGY=AepMxoH9kDP9s(yd-EybtM3F zvX!7Abwph*!jn2kP_rde(=w>pGRT&(B9TZXnob0zgG{J{OsIoMID{WE;9slQUom7C z`^yk2??#Nj;M%kX$`lvw>B+U0D`ja%lT_zvA?n#bb+#kfifgO zs>^M=v84^8_u%EWRVZ;xpm8-p0_38&-idPFqYW2@)zV#Pg_~+SBH>V5eRGqw;;OcA zM{##ealZs32pKG-+V*=_g8>IS*iVu3^m+4pXS;VJwbsG&1}IL+gzNI%jZ3WXz)LTjNb zvv?=01V|FqXj;=6Y-E;wiCAZa`ctm{l&L>RhxJc{i@~N&G{aVFZEtrJbpi)#zFpjH zH?Am+N4p@usv-VE)%=yzLMIA9SvQ+YLkg{g7qu9mu#pPN`Y^)zRO%Ich<7 zI=aO?T0p9JXIw`m*xB6;dBv^L__layS6^p5URoS4&5Htp0(waRQ(WEfcvrkvb1$`! zoAZCJlmfBV_hFR-AQn>OQoNulezil3MAr(mG~Qj@l?x$Uya1hPJi=IUw4caltI?> zfrX3gRaW^z@U$xBH-;oepmefKV5RxvXp{sihTPo{hB}KOJ!MsWZO6(s)1^_KwF6kk zP~3KnFe$WF)rTA06s3c)fv(c^$$05tS8plD2KluRO$9@ci;$k)4R&O(6N}bdH{L3% zhgft2d*$FrVIHI+7Znf96)QXLNd7m9nVZOK?aQR}0fT{1-qw6LzXyF1!% z%YsWSHRG2^)r(OIE6v^yqHxw`Oql!&iQ?yKmwO9yA)tAM0;H=G zor_)q@fA`F0NmWUDQb5^J}7m6oV^UodCjv0vj(zI{4haq%8~+a67}zjV&U7^^SMb{^L`&bA|(QF=s3xw{8UU(a!Z|Hs)SHx+f<`X;K`@yIU;V1_Uqzlo*+kiME zFVW4>?%qzSVJy0NV2e0A^uUTyT8;BDwPx4j=NPcP*s?1vdy!>VSa!K(m!UYyYq35y zuqoQF8*DzxhK7u7qnBmSam}#|7^g)Xg&eA-ZRZ;i$%@`@mqZe9p`zyV1P}<@C5^qb z+5mzN73~Dg&^Q;$crjHfhY##7lX{+I+iRp5>?U+?nobMK%g~z*c zm4Rd&{<3a(HRz>+)=@>_RZgzA(U1dM0ffdRVgr5XJ7QCcuEDpfMcycJD*|6(f46P} zl|fGUGF^gszIHn5pw$3*sfiRCBfcB}Z1J_$QoT5Jh!o?+@*gITh+V=71l^YwZ>}Zl z8$AeDlgtNi_63xM8m;`)ra|(v;MgnLrQCj|Z+0eOi*)HRRrxsDNlCoMu*4mKOT5Gj7S@8e&OYRsfpj0s%9(S7G zm}Z8eT}fFqTwEN#SVnCy16Tf!1yP|D>$0|XS+RaA){RmZI?iVZa1g^ECvaOl?J`4R z`u5{TFK#4Kfr#JFIhv~+&M9W`gNUqyBp(D-hG@dhJ}hh?(N23KwmkZi91}5b)axP9 z63;$7(|RJ9Z=(ziuppuRv@f{k!+hrKxyZ_m5IPbuPed`0I?*1z#beq=QH5GVYQYC9 zU?4ZwDOgYD|H-r!*~caTjo*gjsUT9y$5?9Gga57 zcycpaMvvaenf*c&xGg2<7S;qSF=)r3zst_2b4uNqhQC1P4?3GY; zz(C3zRJjwVZ~}{*K&2B{>;$T;74^*#atxSInF*Df5L|Lt@3E;>?(P^IT`nA4dWb2b zP-yK^j5&G0z<9v2@qpzDxH6Q>I~S%W+=0{2?S#i9Dt93(T;WCe+$&wk#jbFbD_rdg zLp@f8@+wOY1ubJ`Smb0dA7b#rl^7hjGtJ~u2)P@q<>uw$XC*NB3Ux@^jD{K?s|GK_6 z5f|?jBaU4GN8HwEY(Cb++w9H_oxT0^>B6Xn8_HQOL*zE?ZS6P_dz*Ge)sXV3!jls0 zXj>X9Hqr-``wpqFh_;It@s}~(JyEO-)he5YfGh*C5pFC1M-8Q8$r4XI z$AuOsvDUK&F=BSZd#Vi;TjDaQ!xIMW*{XkBBz?+v4Zn!k1JQ1{zLYn+qz~))K8%v{ z3a!3)FU+>Sg}_;bp5}{m#_IjF85p*iu|!rzu_YaY34XQsMAu#G;4oc4 zv+DbM2Hd#l5Y7-37t>(GhGisDwrI$21^ckRfEfsPptF33ubhT>=VmMz(L_zO6qY)I zy#i%%S{ZgrcOPxX`F35fwH7-8+*&PcH7;znF>Ikt#c|Oo8pc)~+$%IUgvuCfE1*~u zzw)D%!NM$Lqf%|y_bs(~Ad3(krZqyxj(Ff;tSU*| zO}(abQ7y8>eT*$;ti(l*loJH09b|Oxp&%v2akLvJJr|tC1v_?*6R<06fo~aYt{f_| zs$ho;hJpgI0}E|ipArzcpa5k6p%LX&3l%{L42W_dWFHMF2|Y z7D`Z6dXhrM*n^SHfE<-7p##t5qu{xwRi1Z&=78{W3Iv_Z_%a~HLc}|_z$GiLAeGW| zzQQ_qJ>dStnr3S!%u~2G#q?(y zV8O(rJ$8R|tId@vv`kIkvMzST*~U!eR4~) zhvLKI2PYSfuc@;oPQGMp$-HQI1OkM(lV zIS_8@3v&_^3*C%3Nf zsid|ZQnwme_5E;D!*DV5cGu=^`wFX2{pCPo{Ozz`9G@%Z6xY<}7#Y$sb~Pp*99HZe z*j#7@{D=hMd|$B$k${d=1hJWfzD_3yglxPb%AXJgq-nsq3dWc-`Np*C#%pB3y>1~n zMFs7Pp%-dX1|`M;FznS}f^38L1b=EVhOp0IT9aQ_7ss!4MV%Qx4`j(?1zSiq4(ODG zi=Rj9AQqX1Fd^BSJBNBV!^hAAD{% zq^IUrLM25V{sC61!SbwW(Zyid6@Z;fHv7BaK-`HNky@*~hAYN^AO5s56$~R7P(g(J5+b@#v-HeUD`keE_X$GpwzcP>5>rcK=a5PO zUs2rtU^F%Wp!P30do|q_d|hgD#8K2ZDk-BisI|kHGdu_LKJ1uvi3vvvcx+^S z6yEHuXh7`fI0hMqEBLgz`3k!S{cn(GUgbnO`Wx(Zo?L*?dF}*-UjUnU12=U87zGm0 z+qk`e73NY&;OhK7SD4y5SJ*lzHq1W`gP3qP<46)@#m#RfZSPOwcq!K-JZzJLN3g%v z+=H<}p!9*0dS!1co`5wO+tw`2EJ&^gh*YKEpz8sv?4f$xiu7QdX{AYgfT}ZN8&8VK zH75GC{z17o#R^9A)>t=2=kLYH`Ka+(((r^p1sQQ?w~%shA$28kjJe>@>tT*Hcb6M$AlepQbUzVk13D2fc*me-~gNaQQHK$ zTIrs)UJgZIoP$N1*rv`%1X0<|>#O)6^hm^ zWEawKrbgtNN2L^wT2&NsvwIT);)Hh#o8Vj?;Oq``tBHl7;-U0%dtzHOG2gDF5~9Sk zK-?wsD5GSqrHG46y27f8a(qWGkLoex^N2_*R!efs1OQcB?ldc0E@Y?#1YgYJ3VLK# zhVYkXg0LSsfX(wray`za@%SOy3VvD>T?3mR+kXNL@zfel5n+SLO#&QTx#Oe=VAW?* z1jHL78mC;zaCp#~4y^3!+yGNE91bHFh|QwwMv;g~guF27V|)vEqh)zfbQTAK)Vys$ zr&JyYRiT*$o}mG3x5wppij=?$YV7Tb4d8$v_O;_)Of9Z+Z3HO4lsIeeE~OLIr8H4f zN(d*vlm_IKl7PHYdO)fy9+0Qtxm=x4Iqw8WIV()43`gV@tlWeuOsFgfMUfQcCRAZU zWi1ZBaucdBp|Tdk*@P-gsI0|sHlYfJczRX_HGO^s!yC`YV(5f#E0*ZTdm%438DrR#W;vOHZx930o;ybFAUj-L$%su@(4>no2DD)x>8{Fs@%5|&PCzjdF5o+7feTH=>WhK)c$%pge$sXX*+n$Mdpl;VW?DXnD;osuGOhLbZ~n zzBnwURsweJZ&JU^Kn>OPAXUZlp|TWLHxRmct~Xba6P6Yy=&@_$OcT!TPOb~Xz0$W0 z-V1C__Tpk?OuNBN{>qzW;W(|@u(h<0iFM0gLu3Chw=CbRc5j)t3kvHg#>KjB5#AP; z^P4c7m7xk>h|FZD`uHiG_8H#^V6f^;kQKyHIIBs{2U$E}FX!tmp00=Ik-znZq!oe9 zwPG6_1vFeYwU?3s;)^v7m-Y^H z!7+qTS-cb1Nd(RtBSiA=#!{fY;GV9rFeDxaIEb4C-4?R2iu?ND&c!dRY5e#Xz(3r> zQRl@SryjNdcq&bn8Bja)RQx!%rT9L<)y2KoOoqP(r%ZXp9$S2JPLQNLYq?->U@(b0 z{<4x+G{Q!;0~S^aR_ZvZvG&AXo9AelYH6NwiiGUsAjT271tpU;29#!;1&3z`nh@XA zI|zG?y#@AVp;b+fFbV{pnsNi%gRqm}k`iZ>dv9J4O5Hts_V!j+0yviF?ZwNuxx@e-C2T1tzf6Ki;lUI0>&lT% zNlO96?H%sg2u~z-o-~YB24n!2>NXJzj38x4Vvm6nsM_nJz}y&5D!B2+Pvk|gy0VYx z+G^B=U=?^}TWzSTAs6}6yYJq_)YPn-j2~uDH*-g!RYt*!lpzz@1ec8~w0{{3tt2`I z#hR*_h@$i+lk9T$$;DBrN>a{!gnHRjM5o{(d41TlTorhpQ7)Df zw^g>Njb=DI6Ub6+o9O;Rt5~5S+5oxhQhE{0Lm%8_M^!1bY6ZDX?}nC9p74j#S?oRk zuiLd*?sbeoF%ypJV-RdsC=j;`@^R93dVk0%l{A~)7cww1$AHFnTNDh70oklUz00MC zc#!=t3=6Fa3Pf}ANVm{h#7gRn%>e*_T`64PN}*OcaKRzx4$N4>Hl|-ubFIY!Rj$iA z3jq{y5jD>2%B$6iT0mFe-N;WY}<0RJaiAGA6|$7lP$Ch)NfNH86<9E`+BR zRW1bkzDZG?Lr7OJ2-ruuB5KG~%>{E_+*3Jq2}l9h31vKm4;~fdg6(|al9Ri2;UD8=3LpVDJy`)&v^5!Hi zOm(5BR*K?5D6|>}_-cGF(5f+qlvEDufSUQ>k z%K!`?eC>gSi?LpfL97ENxGlgRhxTc(EsgNqz}X#PT&raYC%u>tEAear%f zbFeRpClKJ%Q$B@4{Z~?Vi=(r)KI2!dpWtr5KugsaROa8(f3#Bj)l25%d0isO10 z-GV%t$!#VaQW6uW8J9k-P%RuK7KbsoVa0NWd2hWhxhcAS00(aIw1DLgZnXR>Hp;2- zU@V5!8&_fxY|UE!l^bCa;9mg$%J8oo|0?ir(MCDwC^b}}TJhL&TZOgeUk$-Ib78IT z*LiPNC=C47a%j&|N6{@gi{cOAEh#pKzt#zaH{v>zy5%Q3NcGKfhDX9-=dm{`fzFyi z@Wz6bcW<0EyD$w@YNmn3PN2#OR679(MiE0gD&UkU;FKwVGAR^9h5R~#wXKnkmR76~ z*IDgwXgWJ^dWQ|srrPFKtgO|J8%UdL+wpQmJ^+snt*PhMon=Q_!lC+L1McTGw}!&) zE!=0tHtedf;Vltt%B~2vTH$qV9THc**j&8rs+O=7s;h75XbLv!kjZ34GfwF$gbLzK ziE!hJhN~;XR_O>2xZv2o33d28q*YedhdM%V55rL)u=W-1 z=!#$@tm967%1yq3YNiQ{!v`=opFqbrd@6E$@Q^;*Zf&qN9BOV_S-;9^Zs9{H==aSl zSK`$5%JwEaNeGr10;|K2;>9G@&V=ffQo#;qI^JQJ^=S^ z=yC68tB0Dx@v8!Wt+HC%n+Vkvjj(v4){QOYcmSqF!l+ajgN{SQsG=`3GAl>bOpBm# zo$w;7t{J_jp&dIT^^G0P?QK?La9u~J5lRd9b2!3N-yK)BQ_n=!exurQ|7v_x8FD*e zx-w+{50G-3>qKnJEf&S!(NcGnzhhPXDyLB6g9GD(%f<)0cn8Mk?FPGeyTLBrZm^4Y z+4#KOU>9#U*u~oocJVGBpSK(A;_U{zc)P*n`7ISVar5U;<21h;Ii~sD$T7|DMyjd? z#&7;HU{%#IU{%#IU>9$9%lSoFgxU>u@pgk4z-_=_q0>+SdGXhCoMu2!TA|Rhjey!Vro@xhN zvc|ONm9+!N@zju9$s9l)i91&z$;%WOxn(UR9$9NhUPc~SYm%G@9Duhh6s>6vk`OS4 z#G4UFT(Z`Qycv0Atw{1~ohR!um#oY3W$gfRCDV{x$s9l)i91&z@yJ>rZdp5kJT4He zk&-5Hi9kbgB5(j+E*@Ev#4BqJ@n+w(SYYeto z!P;7}%7YF1l#LY%wggwyH`KRX)v=JD;K=UvZlGA9cFE~ ztqrGvVBI!`$3Vsa!g6>g5^8N<(aM!5644C0swt$SWAJXYV`^8KmZ%mdfIlxExu}p| z8Uc<+n4h|(c`alZToYEpu5W5Ur9Xy=c!R_;0tgaVSP3MHg0g&qvOI$F ze1h^kf{J{Ciadfv`2>sd2rBalD)R^y=MyX@0p#!3a)l6bF$bmk6}=sjTnJn+MHcXI z&@l()qNbd|A<*H1DY7yT2OV=zE^5u8Y%GUz4+kAn9Ln9)nu7bj(4GEklKy zt0G(E;hwiMIOv$-Q0b=DweY|c*%qPNgHf^~Ck*a4t-2OE{6189jEVu>ji2Rt`=ztbW$DDNih+5>*~x*B8dtQA05+tbWHQXNaf|@3|+!!k%y0t zX+Aop`Bdif0YIik;Zy11qhp$nj%hxN^Z5Xf zLR`$e`V6GI8#z&@WMfo10Emm3SHpqyF!SnoV2qLz;$r4ib09s;yow$eqv?dWn0a*_ zNDniwwg<+jJ0UJ+UWEtJ!_2GlfiXHyh>Mw5>w)wz^Xh$IjN%jGV&+wSAU({y${!e` z{e-xfdG#Mi4>NBMC>zrQ2+1)+Oj7I7+KKAkPJzY$9Rc}@I{A`SY zaImsuWC;-LE&_qHwlTXRFo8k*C<3j)0zn`GE#_yD1Ozhj4@O1~3HwRF^Y@)|^5@>V zx4L@vK?wWx?whQ8@5z&yCo@l;Jm=)e^bBxc9kP)bP)W@IJf)DOXMp?akd4fMN@@n+ zDTORO1Kd}KY-9#hQZoQgDP-vx;J!L!BQv0qngMu9AxqBy_thaAnE{p548T(gS$YPz zuZC=4WCrj}7_@kbk-0~k0q)Tu8<_zMsTqK$6teUTa9 zBSmv(G*WcXug670f0iyffW<{)mS>But?Mk}n02UVw4w5Z;F}G;$6Gw_(%q@B`TXX=6iw3{R7JVhRXzoBqiVi#K znBZ5kMF+6BXmF=&(N}Ye=H7Os=&QM{zM3sMfW<|Fmt~87A-8Dmnn#L$A-CukvPB25 zxM*;`Y|+nFKRXo)2Iy1u}z*GhDm|6i>%V%qWVWlcC%Gd&6sscHz4RU-g1#+1ifO9D@ z!rmglR0VPv9JT_v706|A0M4zz2$PEdQx(WzbJ#xQRv?$r0XVk;Bdjh0OjRI<*Nmv-tkcdN~24GwM%(YOHV<_`3Y`gCWtu?rCS!rv>k zW&eA+YRZDQM&+F^s$}H>=yXYE5mU`%OIVH}ksRgcskNDug7>5}5=8zM=+A)fj+Nw2yPoq7v8zV`%dRD^?-T@m&=h`2?^X*T)bS-gu9c_Olr~UD} zkZZL4F`R3E{LZyMe&^aBzjN)6-?{e3?_B%icdq^MJKz4)OV<*oiqiHkHi{LZyMe&^etdKvK=GVkp=1ROU_)~k(|`~yXJ z#M7uYcLIR1pNK`cH;zE_yY7vf9^s864!oa2K`N@J3j*s@KIaPxZ(Kp)jVma;aRtHk zClsV2dAgv=NI~I^D=55i1%)@RpoO>~6}{61EsPWt-nfFo8&^#=R$H9ZcJshWR?lhb~JpHJ{BRYdG)LtpZ zAn_i^c?ZbqN_DG=#Y9)S)RWNE>vdW<_xad28N+_)oN~?s@DxtJWD6JAotAx@jp|naU ztrALG2&FC1KUjunynkH1TVLmh)luV~t}coXR(RxyZ*De0%Z)pjXOPxPtJ^hbYu%Ha zUBDg^l2Zetdt-&cf%p^u(kneREtWT{YqiF*#0`SekE(b5E7?KGh!KVexm6x)Jn2x{ zT(8zQ;HZCV9UPVZOV$7ixe#jWcQ9`^*TlC*e?%X2??A^K%CzAL8CY8;C`(e*TvB%| zMjk{`B)*W<{SrSZ?on16FA0+H0hsIoRAZAI7$2<4ICvm+Vv7GD@N>&2gv1joMN(p) zk0-YS7eSVX4a}Q}5b%m|F9KY6wY3QsBk%Kt<;aLfa;$8FcIY)Fj(b{{YWb&H344_o zGa-Qm*?e|!VXCmS!|{>+RyGz17kcmbHD-5e=--j@G%_X01K$DtqFm_DRm>v{iBW> zy4LaLcU#d}5kDx_t6N)WTYUvR2K|Eg#$mzQg7WW{8>w<-B-a6MD0ox6JIKXX*mDy* z2lqzp7CLjSzVVW7gO)d%2%ClB!*xN7B)Ej2xqMq5Z*Q!iYXyQ|Z9~~7&su^oSM?ON$nOmB^FDMNk3rmaDo+G6} zrZ9}7#1*Qk-wpuo&6P2U%khL44%#R|=l(qN#;EluASl!lLmr3GV5&M1LR zCbu+wUr-u87M2$5FH+h@b$fgBZkXF>F8oPrsTb*a3{y>Rjr4s%jqtIsM!_tT(|%ZI za!b?q1*PF*VQIkBbJhl29>wXnd*^paO%A=A+hMJ0}9J7f6{-K26!Y9ES9 z9LIVh<4Rr|iQ2^<)#Dw06HC2V~I+ah?8 zuiV91ZHNod|EFK*YD!Rew{K8tfdB!Y4yd2Ewf*eEv#el==FE6MFQOO~b8%mLp-0`fE z+(J$#mB(d6(=n1eUY#X3RTjBrLwzxlJ6>%e9@9RPhQdpTWowiI*<7w#u$2g3YSfpj zYktbhTR(Je!|t+%JsK`HLwo_*<=Jm;@jRBSxX7;GXksXeLWS1&J%%dt#+pd&AC=h7+9zpV8Ry+(I#vgDoSGv+@iJc7R5c${NKLoe~PHP!is1^ zfJTgo{=Gcm41W!pb*(J~=ru#6P|UMJ(b~6?!Be6qS|>flb_2;MVuQk-7M_;&;r4sc z5NVYFR+lkv8zyk$4W_Zwj-9z(gCNZ}tK9H_LUyJbHMo_ za0kBRWG4V;zs+Wu-<;kuW}Mk=ZSxifD_D^<*f%J=XM;gisscbL$ox(5bdX=Vd!e3z z@3}w5&N#fRZSj@yMHGRCV4s7EG^8|Y#dMpM{)Q4$pBxLpOCB4-Zmw)wI+UDw!vZs} zs6+6t z60ikqZjyCyu;T=py+mY_JN6-Zo9QBhjoy+_iZy<@10!thJ=uczDuyDB)32bn&AdTu zE_tQ(^(TG^6}_^2(Hob~k6?@`=~QHl-?tqn3=|jb6rhb6yMH=)K3wNHimOqn9z>oY#UkdhhWvGR+9y=w*yI z=e6LC-g~@P^6*A4W4t-91#k4;ayk@`k2W4t-91#k4;<9#6yZ}c+8oAX-m${}SD zEwDcz^X7^#42o+Bm*Dt4vtXZ~>Pm_%JU7g9t0)Rw9Mb4Y?Vf0`B_|BD^tBOitiVve z!{Opq4I&uOQdR3;xu5tt&S2=nes+>X+D$90f=;U9;MHy6FjJ=ABuvax?WJOL=MQ4-8{Q2KqqF7G+txS4(_H&^Cs$SdMp<}tKQzJ^|f^c+<_HFZL# z=FAcJIrxztO*gnY6weO&Jmh7f+fVNMQ0r915Ku9OmoXpeBMl4?@o);w7W>q;<3yl< z{$2i}cgv42wDfJ3ex9XYVyT16rZe{a=@%=Wp`~AA=?5(RdP~32(hphs#b2WNKGpPZ z7{33?(vMpD-&y*Dmi}E!{|8Hd%F=&m=`UFNNlPcK*RLD=Z&~`=mi|ji|8GnGz|ucu z?S7M`pKIw`EWK&zJ1xC!>4v3EOF#CdO203+=dZMM-_pYjoP+;&JsnuRpIG|UmVTY3 z|AnRBVClc>?KyA#K4|Uwc1u5E>33WDy_Wufr9W!v$1VLyOMlkVPgwdZmj0Th|Ffn4 zyQRNt>3Qq>dc*&o)#LXq{d61WpK0lvE&Vf=UbFN?OIIxYbC!OQrHQ3mmcHH6OO{qF zeZAXrUVL|~9)I4_`<5P9+Ozb;()U~XwU(Z@ye#}*Fg$9YCS%~Qumxqzxa&rS@`U8 z+4BEqmL6LAVN1W)(*M!YKe(p#`d=*lg6sNx(b9KWx?}0bEd6FnKW^zSS^9ri`sp_m z&nMok>4kS``W8z+-O}HDQQ!ZJrQdJqhb%p{^eZi`S^8y`zUe14|EF8}W=qQxrf)I0 zFR}E`TKZ*{ep9(x;@{U<`t_OTZ_hk`DD&*{{Ygpx+f4mGl6lUy<9qD;XMMZU>E*w! z=?`04|2BR8GJF0md;ZAJ>HBR<|GcI9mL6OBeoH@W>3_d>Q~Kk3Ed5bSKWXWYXP({r z*E{{`Kc;eC?|NtPeZt!DJ5QCa?>N=;uB9J!&yV!|$1Hu@V}1TNmhM~rud(!RTKaq6 zpm6W`tD3efJ+<@$mO8kz(r+>N@5$u*iOlm^c-;42wS51|(l=Xu-S=!dW8aqw;I{33 z$I??vKVa!MS^5!6zu(eqIe%2oKW^oH;&m$bHx1A1-`4*9neW#0pIZ96mXE{{zmsz@E=~tW+k1OYi<@=zeKVa!6Ed5^?DG9dNk5UP|IcQg zv+ek0`~LNJmt}n!Sekv_&3w;3yL^9A(r?PNC;Oaj$G*Y;Xj|#@@l5(bd;W-}AG7rP zE&cg@&G+DeroVBZ>5q0bU3{qN-?#Md9qIGeSo+hJ{?0((pW5?Zvh-Ul{Z30iYUvMJ z`hR^$^S$q{Y5D<6KV<1gE&aQe{zFTD-O_()>1TYi=KuFCJ+SnLE&a@I(eL*x{VSIK zl%@aH($D#z!u>~n#1SrQc(z!}mt2{q+AeI(*#v`42y;?fdMHY5E10evzeb{Ub_0!|*QrwwBwqH2dt{ z|4B*fnf7F#v+ekDga597qjdPo&zZXXlcuhmN#Xyv;LcmGN#W0ebKhO++UuUrN*(;9 zslzuZ{QqC!9G!mF=EWy1{pXgx<=^VO`PZ3e_x_Dk>GOKg;WLchpZLNRk(Y1T^Nyt* zOHVERfTe%S(x0>R4=w%u-`D!R=?^shLQ7w?v}@`2TKdl{{TC%I|N5tC`qh^Hw57jf z=_mg^{r>e+n*NBTKWXVNTI$+Ul>XRfY5t$L^tUYi4?kPqzunTFrQc!c&smzq`-k@a zvpz@jU$=DC(w?O^-mKrdmOird1D1Y^rT^U0e{Jb!e6Hqui=}l-?^ybmEd3En|2Ipo zeZJ6`ydKHeAY{lL=ivh-Iiee+xL^L??suUq=m(jT+*O*Rj5G=`SbAvb2Q2+|OMlSPpSAS2Ed7}o?YCdB^l$xH zeV#P^C(oJh@13)pN$c|`749AXvC@6R(yy@e3#aw{+b#XuMz`;@=U=wx@3rS2v-GdL zUGx17OMlzaZ@ZB0-;dez-?8-XTl$NZ{+6Y4*3U0m`i++UbxXg?((ku)r}wbef80xI zz1IE1PO{P+O8VvfUbpukxzjp4?Qpu38vWD3UMIo(PI7C|KRr%X`ki62(LYIQPrAbs z0m46qpq*^BhQr7GL0do?r^m;L$k=I@Hjg`l)=9VDYaJ$ylh#Qm^S#+U>I_d>N5={O zYL7a-6ZsXMR$3>msnXKx`#0t4pS-iN+^8q@xy@wIdEY7Ol00q=li}&!US~MmKRtX= zA(MCZ`hYk-e0s?Pw!7`52ZHQ(d)?uI0^WRzCJtJ?2c6`k-%k!(1N_?W50dF&((U2j zw`$S#-d=w&=oc#u>Cd=E)NtgAq zy4*;T>G^9HS<{vJ>Lg&LwVTysyR)A(TMy1c39O}3ZqbWY^x_lWKhyJgc>~p{ zJc<9~@R;7y{|W5Wa{uV4)oUmFt?nU+`M7&>kl^eu$K2^KSpo(inwcJ6yu{aQ{Ra%k zB=4`Ww8`^p)uwpPI$=oN%?%8QlhZ*DrRHIl=9Z?1Ans~+aP+t}=p;MGhy7MNnOVKN zyR)^nSzWo9^!JmKr^lUSx=p}peND?TNNtr=eY8b{JO}<{*nL0Bd4h7b5K2PJN#|by zi|{pEL71n)I(o=6YIsikBXw+GypqK<55SBb93(T1ASpdHOocOFdljL7M==5q}o`X!+-CQd0Dx4Fo!vR?*Mi6bM+p&e!6|p757I{9+6K#2X?aSHQ@;$5Y zyygDs@M(gj66}mi(8=H_xcg=0F5q9=c+l1? zK!e2**--~Bibt)Jy@Lqq?smOdQ=q8?eW>dUD1#s9PLKDn(|Z8ceFokDmBrh}>P33n z5b=10)*)MNZ8I?UPxtpb1F3BWtMOYzvtF&=N*)X2!4%xMgUi@286SUg$*t(ZYK^5& zZS;GykNSs@i6DLr!M8XDxJI8GU@4Xw$ddf1b=Yl({_^cOFWnI?Xr-9!&rkOZ-YkLU zhEIocdxzlIb7Wz=?arg_UT1E4IH$kdxGjQf-@rmB|F;Ztn!^i+ML(V;&l;KkC3siG zf1FoE+5G!wO~9_>--b__zd3RKr-0p(|G6}Iwgy~{3ClkQY*+qQeRd-MTS4BfXEn)> zpd{6HdjQ$gYP@yu6tZEG+=lRj5tTgaJUe*SlmE4!wd8-*XLbBoU3)fsHo$+aXNSPGh4!&Fli=wH zhAPV5Kt0x;oq|G7f$Q|yGHBYG7|&4faC9s`+kSTQ*)eLny6 z?~$=~jQZ@MzwZNM3-}bzS>06JOYTb!eU?wL<>;Mk^&fWz>-}~I5}^FeQ?|Y*8SITD zTLVnm{^@X1c$XLVuypQr+b0KS;E&-O$DIx(U->Jj558>;`rMcG2V8hje?nek&GAWE z)#`zt9-)!Tt>f1H?jb~s4n*$=PK&UAu?#jlN3usf9T+_byQtKN$5$G3r`J89NH2fI z_0{jlI#K&>_FIGYWcA5{7S(5Zcwv|vc6$%GE9>|0t78iko~I#63`ux?oE}aI9j#4B zre`aQj?IL(x<{1t8;kcR53J{O5&Q}ZxqkX-QC@$ zF(W)4Qado=kDDt|Ax)0 zqe6(^TuoL74Q>Z--drAVcAX@o!c<;6LlxQW(jK36-=JKb;XL3e@-+;1!dc{h{Kl~R}`zzew@Xuv^)2czPE3C>c5@EGO{q3xy>rwb zKtmWQwIKVE-b9Q(BN)43c^)^x*4W;aet&Skb9ks7u%mijynoO-IlzVufo2=GvAv?w zQK+E(UdN{Na272*#!G636;6fqOG%(RP(blTeH!K|6>df?|5EW)*H>a}*Jkf`!CIv3 z=fau6SHAkGB9ze%J>+VAw4PYCate?cl7Y_w@iS#7~n_BBbPXVa`yNT+>k^55{G~51d7Lf z%vmWeEx6`FZ5ZsrT@xb$AGNU@cGAd%Zgxay(mgFF~Ji4D}vFlyrq$ zOQB}rET#_spbzCewMZ+2?jx!uoJ_;6_WBfj8QR?EnnZ2VWmHoC33{c;;3cPI+K`*J zk`e62xS(~`(jaOMVLk!`4?XKep7a0e1z(Ted-@5 z0G@C%n-qus6*&U3(^`@=sgKq_GvlCR8c$LCBRA{0`brt-hrL$s!U;$25sXQY{J6qc zfsXw{nuF{?R)5uMR*(;p>Ql&(39U%z;iKb28M6to< z4m(Zfu=_xmm}W=mRwXxTz+YLBSa@hYfhdI5VDa4!Kc)5fw0={5;fwuh_D^8ZTEFS$ zx31gM*DlZR1Jb4ZQNasK^h;$QHGZ9oFHxz?dDB?kg5(O7(tI+5yWQ^Ala{Fqs`D3Z zP3C+UfiI81S7P`eUmCv`dL(x+PesOu=-58p3%0vtyYq<6)!vEZX2{b+7!4mn=vkzs zJbUf(wUpSkc$u3Hm+_KqS}?kfTYKG;r(_7No=jn|5$yTeY))x*!Q{`MCE_^GTNdV6hzk870|2QXfS{T?>F zhB1QM+~4Q656IBsE0s$m7c|oe$Zb6p-)lvF;a==~q{Z6NsNPcgxUKVVG)^Pww3@0Rt%SODr zB|&Oj?P+M7iPqJN6Bmd6toOu}maN>Rcan~~B>YV;RLFB6^_}*_2MWRoRwzmu@koWz z&*0WD)99_C_!>`pFmpy&JsjJ(-Qfxg*$6Z9D276}DZcFvWmIX;L)jVR;fh)EU;V3+uE2wIr$~c0R1BIIRl}O*4$E7w$1`a_}E_=Rak(I z@SP2Z`mNQs()16gRlG437@q$|m7+&8T{KT zchwexh6-I=-O>9!Yr4xqc|d!MQe_J=*j^XcroG4}I=e2*tJ~wj&?RgjaB(C8YnV3G5w4-+F zb|}-(>S4Dv?4TP&!xZh9fx%pNu)@M_21TWTn$ML9?C!0XxY23sH%>(Ro6KrQ`&^h` z8Czs*W?K{!1(qUe>f!kc-`6SnYwz`;rF=@lK~oL0#RJG(*ui0_v`m;&VNYbd0N9W9)jIUY!%p0hY=mB|lN0&O znJ%jpN!RWlwYoj+htYDdsvq`;5G?2&xCe8;LoWT618*{S44zkiZDkBa`j6tna7qJ7 zx%3={i+ZPZgmLJc1sugVG>26CcK5sBYV30Et;C{&+)|DkM^VpZJ5q<3Lu&NN$!B_I z?m$p5Sgj}-x$TJaYPo(KMCFc-70d zuC;R%KDeQtja%cq5lwMi^asb9`p zC(_4F$IJNv?7#G-&&TS{qF*kdirhr@(FW!^in`8xUiVIxf z>IAMhgds|nGpuk}j+HJ`O}f{%j*p?t5GdHGgnh!g*rhxN$Ao<|_TzEp{$Z>4@FFZv zkis}S>-+)y+neiPOxRPwYk@XeOc_~7A@7L0u7h))#_9~+N@A(wO1YBU$2lRM1;V_< zmP3lk)Q)FzPSsC?z6JEs5)H{7l(R5kYO{R3R+ni86a&T(i%hCc98a!Z@PF8j8ZZvd z8F#3~wsx}X?W~ZotO&2O368)!BSK6^`eCTQp^dD6oZ?@w!HuFJn-!H?(5>q3 z#=Qyr#I!!-puxC;>JH$q^oV}6(k>||w-}yR0i;;0A@&CxoZgX{+WLp5RUpSe)P*jC z*ssk4cRps0Iyde{@{OZ*cVBFwJrR&?I9d6=enl-C$s4xgaA-O0aGyo{_$*e@J;=0s zvfHU|V%Gq_Cs==)gZJ^JB{e71_}u zJlXK&eIHwuy6gnAvND7vIpHk&_nY05qt@`D6yxeWrW~#M6gJ4*7`93L4k*Me3U@DX zu{u@xa@=RipZcBphPLFslvEZea&;)*TeEaJ-2B&*88OVdC)eVgG^kgo%%qG@oogX&iPs$Mh{Y&HB3&cMXU5 zO#gufyo(cmsn@@hl$V}%FwkJK6z@@wsmLjtF&OUc3#1ee;SWN`_sDFQYe(Nw@ zG8?*lfDO6nsASr*VWJ=$Aql8x=kdf9f5tPq@Ecr53ZJhnl`EI! zR}M52MIXKiP;zB(qj6p@(j9Ht^rd(lz{>o4urCEY!u3{9c*)?o~MC z?k%#@?_JBoF+v+Rc$%$;AV-EU@YKP}yqciDI#DxRHC9g#(e2kjRIFmuXkJ}h0#E3* z?;{>U9-c6W$B%vwSD6rQVM4gY@o=^6?al2QG&(_WmK`k(LF-#}Fz(?HtjrjvF+xlW z#{ys0vqY~@r79`_4)c=XqZSma0Vg}X)8Jcy`1yqI3TgDB$kp)#APIr5yP*o6-D}g^G!y7#Jd-6#;R! ztEB+C`3`Kyt3K|B`fEGHL#x!ivwv&rh+JGJcw0O^W7{Xe z-vD~eF%{!I^2e!Q5aPlks6~0|s5%+`_0?M|)n*M;rEj*jAgceM^SD2N?JKv4N$S6S z_oZ?8kFjbw*;Sk1N5y3I-@}mxrb6k+esan=94V=w^n{8!GT^z6(t7Pvg@nDa3o#;#E(^RiTb>8o2IC5%LZnrc zeK_4{n1OZE^M%Y=DI~S9mp$+>LYladPzy- z4}n_eW2QMr0ZO&(c~eKJl;Pny6@17TNCC)y49O4Po-}DVNp4vV1Hr*YOxw0WOQ_|c zxGL6hl*qOd!1Yq8#A6ELUb zg63O4Z@xv%w|3rqR}wR{Fyr{ih!Gg*iG1c=jf`jJGru?WU!(jO%^I-(wn>3BW#vv9 z9rq@{K1Y5THgUi&aeL94+ek?7d!RSw{IPnois^Yef6jTDJKWN97377y2nwI$V6RSB zQ~2V*G|vLUAW373oWTzL6^~=iOy$nudputAzQ^M-?|VG{^1frdXk}%9O6lMWu(C=g z6j5_|aIlHO^B;EDt5A^4<3A`l01Ug5aFS$(FDm#@f!+fjz@Nc( z>9PZgxt+I}!Gb9YVFBZ#qD}!iZan){U>>Ugbgy|e9ygvR$#3No^jza|`Mkl>R9q{? z+emO-u;&#{V#l}*%B}OYwZ>%2yU7K|t)~(mFs!7WCzNL^SJWZXJL$#?>BxGh78zmf z)cU50pEKWr!5`87)V)S{Q5k(Fe<`+5CQsnsN{5cKP@N1r*q_6%+<6CPv0Md`6pDp; zS(mYLkxD8y6$e@%3~QYiWP#FE*k5AZgrnvOEHRug<=K3q(O!cs(8IBl4(*!?hp%Q_ z9_XFKRD8cfB~TlC$l!?=!RrTjml`=!B5s6>`w3|pjmq$CmQ!JnlEps)>%DXqwuDr9 z;WvW~V6M`&9AarWtfWIPAKs(%<1^?9M$ROkhRwysSd>0q<6sVcA|iP;gTB-uP@q#`og@EL z`uBQ+q-B$vOOF8F()jFCXng@1*++0&~$Ucr}%Iy)2Bxrb# z_B1=?EAAaS0;#;x<4|XfX0&&6xyAvfIqldtG!ek9=ixB8V>>aFhW+DXj`RBV^71Iy zl)N5NBbtjv`BKXv?_r-Hm9&jWSa=XM#au#AySGgb-=-V}{u(%X&fNuGOO#%mc@41g zMJ9+y`XR7iI3EU&6qjEct$Pe><*Ik@7NyH}tJ_vmZecq+ALM6$ehg!&QGA4K+!0Ti zBjMQE`3`uhD$3513I&%i^{8-z;9p)cYbOm7dfw9{A^Du6#ZJ@H;x>dFz|3P;ZO7#P;R4&CvuekzA_4) zGlmntKERs+Ry+-POV(|;xF_<6LwsLxQGcu3MZ;gq?W6VJWOW~Q zd&E_PJ=JFhp~+cvA8o^P!hG$ng&=oc<-X)lU-&g(%THJ6Nos8V85qvG^Dj~}xq3zo z(q;sw`1?<_17$0yRP)s&T!0ACd)A1@xI^SsTPSv22I&ZXHA}<&#P?-@t3o}{5%14WVpC_;YA{;o^A~_fU zLG7#15%jBg)NLgi1$k|A<(-Y?&F$^laLa!t4-{b^lB3PX{(GX0{8VlE_T~g5#4|LV`?Cuf z4ThWVZp2eeAV24^OH8>H63;7T(62H73~-+Nm)4=exJl_$W1v892=N3*u0~(p!Yw3l zy^=@<1k-Vq&MR)>5`aVBQw>?Zihwqyv*E5i(f)j(8>RWerc1xa?WegcPbbA1HgRdn z(J4YI$gqNR(t!d2O-#8-VA0N(-XMQ&tq6UsJ5mZIN(VhUwjL%HMJUL-&vR~t^>wZY zXQ~iv;g0DLhcZeH0^k*HcTWEZtXqzy1r9FmA8aeb=$c*?lG7OfXl!=eJPiI>^yoS5 zVetm1kb^Z;);JO{=s#8+M*4JzBE<8Bv(34f!nm@PP zzdvZ1LY;lbC1>VIxdN^uZs6G0Y^i52a&s3?2+G0Uw^vl8GS96)vIiVyUnmxZ#^r-B zRiGNS4xP%hld>WQ;A8MTb4RA6!di>?B9?^sqze2%t+K)lR1ehiXLP}8Ww+&Y%#{~X z4fp!xGxMdrHhn&oqs|QTTDmD-g2L67xM+wnW$yr<)_Jq-x%mgqH>x}0+hu)$|I)<% zRx+byJxg!~QdgUdp7jhq1PnDa2{Sw7_k2bdgp{07)_@nec80W^F_tyy_(R}Pa0IHe zX+AQi%qTXh`1ea7QYuQg;iOnAW-%g=)(gKrx1L&-d{t1(sw*BhDY~DzxPW8~rYK5k zrM#T7p9Q%X)6IrWo*pim#NwbY^8W^gJj8f27bovI?VO$u3;YLU1Hws|*!J=ql>j{@ zzdK6K3h{wDn9E!4BLYPm)E_f^zATPXn<;nsgb!3|^;~+OboU?;A zcwBDUnM70M!q}QRM66G~{L1`dnv3Ys2q{04pMh~QnHgkcwCarC1{oPX1&m7|e-IV7 zxww%Y`XdC5wMC3@Ty?qLV#M(gLaF~Z^~4Weyol^rC|Ftsi!e_ZEy1&yOZcUHPa0P5 zJR`vxp;^k8uOzqb9|L!JY2os`{jMxs^}k05bI$y5@~;#lLk~@WZ=??FSnGr5Z-@5b zr1{To$JzLD+u?`Mc{&m8cR~|9Px1`{xux;EP}(DmGCUm}!FyrHMSMz*Iob9_F)MQ> z$Qk1U>V%L?Is))Qw>zFQCJjcYvXFM&*U#57VTLO!#&-$dZ zjI3G|m`8|>;1_w^yn-@u5Kim^&=o=*&06_j84Qt;Gs{X*JO-r@E(?%w3#J;B@yRuK z0lqzXQ{Hl|-<*S^1};ikZ^{o6A!$I(h~NTD#D)XIA}H9SKAK?)X}*?apLdYng#R}s zA-AqgU%~SA43Z^Ru?4Pi`fo_nzch%4!60$+Y>-Ez5incEnygEozAak)&`;VR>Fld; zG`WWV7U|=J|L6n-MDt5kwQT0m$L{U*63Nnr9JYLK?qN%`-{6&W${oh$h~P=%GjkYx z=!!FQaI|7Q&<+!5cnsyrG=ww!u3yi@Zt(2>GhvDUHZKj(D}eQcy!7QL4z#?!g z)FbHgOKbhd&Him%&B>|4wAsh2{Bd1<)Q8KA6m(ziT$J-3Tn)!|M``(X1M6KhHMb5= zA5?qoEx0qWSf_IC05Gp)Ic84-4bHW-yDb-U%F#xrIjJT79Gv6T-qX8?gS1ZYQH%{R z3EU?MpCPzY%>;icwJR484|HazT#09bT}A7#Gu#8Op}nJ{$DeTxfz4pG4jgs&27PnY zVkIE?6WVDp{kV`LWDJu6X~3a%Z6kTc%nQ`V70MjyKgQVylQ0Q3+IEf?-RDb%ELR0P z`!g~jAM_$^MyEoeN?)_2(SXAZpjH~wh((LKqDgj8Sz3d}Wpp?e($gyM_uq2fO9Kaz zfTBhXCRP-_hMP06=_z~F7kmfa+d1i8)bn0bRS6#{L44U|RFWM+e>;HdD)dZo?Rk6{gf{Jm;Qkp8TbQn-hMR|knqZGj@6479z zALO!{M3eT_(`vydWX5*zSTC+pwUrN7iQ!%#oY;xkP+xDh78YQ+TorAgl7NnMcAjo( z2Z}XUH?)qnpCOfH`BleTt-GmNw!nT^+NOkd1nDs>7$*Y9i6uLV!iJG2J=YP-U=&~FMp-eY!?(iMKVPn+{MOpo zVis>KoVS=7i{U@~bH$Vpt!P|xuHLxvT;*sfQ90Hh2%|3jp)=->p+BrQTn~CWkMsg5 z1FC@TZRuWys>tcyNrnqBEsy{tGUz)FpY`I|)pPi;8KZfJ69x){eH_F9Gjrw|nWk{H zAwT>S=D(jr#FNqgB0ei!5V@Mb+3)ChlDP;pB}6~oh%daM5(KfifJT4GztnEB@;UGk zWCR8IllESbj&RTs>=#wj3%cRm!aYFUICZj63akpb|Up==T_f z)IZ3va8?xm&~c|+b-z-_&1XD0!ap0R={=q^vY-UUMUgm`g_s%oJ!T ziyP@ZrX9gPy|uP^3%Bm5e}$P1%!^j-(~iBSc8HF2xXV7}p8ly}6TOo}9bJ`L-9H@+ zMJ}e7zBu+yP$d~J*k0~oQqz2mRb1{Y!<7P6G4#&mqdIk36ZiGF7PS|%syIy$BMFNIki9Q>L6RDeI-56^+$ z(K~~G3IxT}S66u~1Ls1wf~dL1|`Yc}+pQW@viVDN8){ep!i!S~iJEC_FV z0;4Pbrhvi^%#&Z;QfMhGv1$^fY_v%R2)NX@LXkJe?%278vvh-Qaw~ zkMyFNiP#6?T5CZ%q6!XKpx(>l&QEA%rF|JV272QCDIoE&)8t?afE!_KoyxK-is9~b z2CYLJ?O7Py4EO+k65!lZ(LE9q9Xm+d3n#E!(PYJ|op7=O$y6y@7v1$ahiqKdhfAO! zqSC`&?-4}(;l}G7_qB6if8T&hYzNUw5NssGe9$$(02N!;zS~rr!O6I~hBeTIdhih(aVZQ0VZeW=Gc@ zb)R%Bv?+`AAo$^M!6~|cKStvV z^D)K?E~Vo^8aF6;iDfD?`4svyQz9;9$K?|;iXbB!ft7s>^{k{^sw2VO^5#6l$eNK|Q{&i&&PeVs@l$)!e-aIso``7cWd$<=^6d3C0 ziAkf=k<$Tu$L?^GmL(7)u+b$&tqcRD2&mVIArmfJ)XC&eZgExf9#TM~h zZKg0Sb|ug#(HZ#7?H{FVoA%&yQ5H^DWI@cin9nI6LS$g9O}uZx3$!|9il<_<9WITf zgEEU0Eile-DX@6uxpR{tP7%33X?Y3y;)gg_(Q|%Rdaj%*Rv(3}3GVK6vT(CZBQdpa zyN_8(o}h8wNi$h8^}I4m^5b%qnkg#2o%f$jItdS?xA^Sw=zVT5b&PAx5C2gxpg5$j z`4UcyP4SqU(5((`5%r!86ICUz9?y@>wX24;bkM_LHMLMrP?NlRoF5DJL3SpIJyW%t zi#gD3gXsHD*G0x7k03c!(t7Qbpc0~DhjP3{n@Tk?gu`NxQ(!1BFURBsyY_k7tXC0m zHEw9-$t=AJ^Zr5WLp`F5EWV(n?)*vw4F%#Bca4}&ayeQni9S+pr65Jm-{i@Y+4TP* z$7l4dlUi%I&yee7F(=zF=RoS#!(*JvZD&n!b{g^vGKcgm7q%;+gkuC|gu#4l;I;%9 zL@z)#yx=4QNKF!`K;>Fm+PKRRfxrhla05!VCllDoDsvcb3!W3fLXdKz_7$QW=10n$ zx=WBVVSj77TpYpHZbw6ld9TxTdtBgX6S}&CDxeD-H8?!xox-mmzLi*}Lm@CjA!4G) z`E;n(KrnG&h>>xCYT;B1hYpLh9L4Q&Yf53c;;lVe@JhD@-2{v@I5Ui6G}1IGql*;L zSO(>!8J9$No@Rx5r1;Pc=#*{G5yIxW5qfqjkY6XJISivP3HikpNQb#qRD6e1Q`Ho| z+45E3gn<;d8wzR17&06!rN42!3HAn0Bt#UJ!$#o*5utd#TTa%*pxY7!jyA8HEJ4i) z1$sE~=-lFq!sakeDFhbriFMmcPEYt*i!NDJ4o;(&Iwr58TZY|)1Ivg>o^c@AsX8=&t}H~Y(y|`(xvGKY z%EYDNXSEcC;%^F0ZDNO#MNpWFvXqoLu9y#oacnz!gj7lDbDKnh*h7Wmm|;~gTlLT; zR!|R068lmhmj{}LKcs*_epb?N@d0eulKO6$K4&`N-Bz&@pJs?^S(KpTV{m^vb;T^g}O@Y9OiC*>|A!=XXBjGEJ&S{*`Q z{z3dZx%m{1yjx#84sZ!Kv~RP8XxJ9j3JNY6S&AMxoSa@R&w1&UEno9vb{Fs%8E6yN zzeyti#82{R*mAHc;kFhqOjV{mbpp~fd<6K}xi>)Wbm53hgbEN`3a}_aN8b^3DdiJ* ztc<|P0#H|jhToI05ah@HjrD+|0u*~D=HdDp@D7NlT1Q<#EWefkePkv-#t{O$^4ziF zfiWcq38vh%+RL_3d{L+*nV3Akgwb}~$M#Fl+u2c(^3ulIE}0T{6dU$yR7EWLLEMh| zaQV#TTlblF%KVLc|plb3y>{COEym$xAPxod)t5r(M0XK@YB zb)JlPjH^8tlC|mv?>0Dh>D3``4W;Z#O$6qaX@R&L${%5i%BkxFw@*nGBd;p8FOw72 z5Ks;)3pOEKFc?8eA=0I5n7PoGcH)%|l<=_=Y(!RYNH*kyL=9O*Z?DT{E@zJEhXb}| z&*SwF&eafW`l*FVc664@mO}67P@t;YAu5ANl*c4V6ieTf;aV`WYB$v z^SUhF=EZSBMX4Y)Jpd;{GjSylEKnz+&4=5?g9BW%fF)0sA7?0&{oTf$?dm$a(wS^z zzbP6hoLAvTj!{!(r+U{1g5bKE&K(31sZ(s3a@-P}S=&EWjmCf=(2gT2NU<1GGJo!? zKG4w6*_aTN6PrbNebK=QYCxW2z<~h^B(1vxkq_Zgkh)%n^kkOkWWm|EtR62+SdYqc z)dQ!=bJ~=`we8yJZDi_9Vk&aF^uU)4e#QQBW2J=Ut3YXQwzbLf!IY{OvE7H>->8h` zS?*uv^u}_k!GYgua>;D!FR8IYkckHUBW!x5k180z(Vvc3#94{|^755)^C{cJy`6XO zLa5?A*cX!^SfU!eiX}OxlP4$KYT2!%RQK?d6|Vc#ab*_Xhn=Ux8_sXWyX9fs$Gm=y z%)AmuuH%s@iK}CVFX|Rp_GKolqF(+UmSW)Owh{VQ0&io()YhYD1HK}l6gtIc7s(VN zP1SQOutzTSvRi>QJud!CGi6-pB{Ti#?yTy5e1PrXH6 z`T1ma%b$*q2{VV%+&xR;3G1r*x?Hp*bbyH-ZFwD#hZ^UOyVOlkZiI&sXt#Bx2B5u5 zk3X$%;V?-TGt=0(7?m-9xja8i5Aw3U!-2q6e@|RQmvfZkMrXmi3ubqT#z1x0BV@Q5UG7t)%W#)hBq(=X-P0_jCzAXFk8~ z`+Qb^%(o#o$Wj`hpnhf8Y4oQ1QbFtv#z3fC$A33P15{a|t^w*(xPBh1Cy{D;;Q;z>yvX&@+s7s)2C(8|Vfjt?pA8aU5F0TeaP_+QzNs zZ3aGmG{ipSi715J6bVW+G#-wT=gdipy6tI}EdTD_;?GMgwb>=T80GUEeB9HeH|8U7SMuR*_NicP;%DGe?qu8ll2O1(I?qVK^;Cr%=>m9qXL<;cx)5-7C1m@N$O zs&B*wTl|QHJ_uvK-+e;0>kHvpIXG;^D)jjm?5>n4B`nz^KwKS#UE+E9fZq1}<_IP0 z*E#Z}#tVjCq%`Q0y+UIE4r?276yo~1Sd&94O-kpDA~NUEnLUD#tmzJg%Z~B^Tl~P? zF@VS`z}@_vMhMuBBOSWbD5b{bGr(l1u4Ev=0?S@xPRGWkd8|u`8WuzpEnC7C6OfkCR{tVq#!Ea9owsX_VtjuSq}SSgAa*Ozgf%PY^$ z8;!?$qj|UP97egf>UHe$va$D!rn05%CPl8nQ;divS39w9;`~DyCdwD$_j-a5%s*WB zxKySc1a}J2gnF%fT`#cA^{^hrq=zv%0x^Iwq`MFH_DNXu4s2%)1L8GjXolBDttbskTqCh-|BNDatevpY!G%3hy$ zRq?~1cZ|3hoC>_#Ot?uP57bf;h=U;D;+zRXIQVsNjRfQSSgzOExSQP` zjt!1hQp*!+(1;IVeSCvfJ@3&xasQC!tIG-2{XHy(8V}nB6`6U;Qj~@B`-==D?$lm`M~jD+<(TH*V^&gFyrd*Z@}t?kMP{^+*mzSh)v1`%5g18!JXL>B73R!-n*OI zvC$?)8bL_7Gm!z3aI#S=AfAq^)W(_v3(HGb=f>F~8{50JjS1S1dcb84ek&lh3TQIY z#*z7jYZ#|-KIFh|=a~1lff3*dwqCQOX1gf;1$grLKC#E6HY|N)GO`N<#0t+-U;?Ms zLdwA9u;MyD+{ZLP1NQWo7swhD8RL*<_S3)#L>we1X!Kgg7;{(>1E&kJ;MB%uvj+5J zD&9^o#Iegx50e_Sp;3`{FLMtkr=ipz7Ooll`+U388yJMh46gpzfYEN*x2tXnL&G4h zKgvP@P5{NRqvj7FR z5i}iz!4(N@>h5(rF!AD)eSh#&;xS091!He13=D!6%F#gg(P>v4E1j8tg8iE;gr@Sv z`L1-u&G-+oFI9EcTTZ5?T3G;$`I$IcJccbkU_#k+GKD?)kT-asKctr;c+gJWet8ow zwnsb%L_zC_PXAM~&k0rVn@BFZ^oqe0?1F$8*oGH=Z=faaQB+@wGpuizPfZNGP(Z3D zWw@Ciat1Ed4+9;T0-3zPV|&4~x7Y8@rX?%2T8otlyA8R&DS{sdONNZ*sqiYAWI-SHsh%*jlY;&uLmf!jAv?M}6K#_%^Wio%$fmdy<3u3>QR+Fui=hIt zSy^ZF896sDvE$fOG&!y)u6VJ!qK2Ei@vf#7HGgV5_Mzz>+4FWm`^G$AXypxrl-m z^tj*vqKi4#EXS#ECJGBFA((?uTIQ5g%(zhy=&*l)j4ms4_av;om=7s<+Zs#A0J${T z1A~f@(69)(PNfkM0CPkjd8X zU@O=V_j`!mqHmPTR-VkMHlzsOInf}Vq&Tv%n|xn#*-LdMT0CC933@$|uO;?>Wd3r4 zWM*Z%ey6s(dUtna^X|slW_5+Z$XC7d5z0AleoC*hmz<`BMSbMhK{_w?4_goPEW#Lv zclhj50PEo_OGksGA^+5lC=`S)A^HI~a4H1_eV=L`a9G~QNFbDxr>HbuQ8hJK!dw|*00a0t(?v1aN=L$sbG6ALF%2z z8%5hjyc=vf#X$lSD|^1O+fki2tCWJ{CR3JcC=QOp-qQ*a!b<;3rep@o>u!B>cW0yC z++E(>Xl{?$p!xQk@4A{Z&h7fOk@k2WQ&s|!*ape!5>K zt)HXUIqK*7FVrBn`@(0fU{U`$ed$^4n>wR|mfbdbgm~=UsWbQxYD<1$2MzHnXZ|Y# zm;h2{^?K`AIGS4!BK~970}T^zQyR8#XZG3n5p(<6lYkwMJ;)8CHBZx2eDX5PEFb~X zm4e3skQzBSvqcM@sYV}HFhrdYTFY>`6a*;GcG~YqWW9?)JGLN-dEFNHv2;^RQf`nJ zNK6`g;O47Jn5Z%=K|)x7(a5ut zuye>+AUr#`!t=hCCx#n6&l?asxXiiT0Fc3V#yMSIzoPTE4zVkD^qj4O(A2@D&eNtr z!O$(lG+%H9*4E!x))HlgUAv@967osI-f;?zB98Ayk( z;65}D?cmb)pZU-Jhl4A==S)Ez+_?M82zS&c22BCWmn?aN?m6 z-HRNR;Oj|zF8H+Eeh0@>z5iIC<9Y&2FFsU|=)U80dq&{w7C|C(_-s_I+c8Gd_+YVY z@pL)i%t^^iEg5(Ywg8+1&p-!T(V0mIn0SSw(MD(yTJVouWNhcxM|&XyhwE7r-f=tv zn1utW&VXw);z$G83Iu$FGtQF*Lc0T;tN_b$S8cfI6A=36;0zOQ%f$KuR{)b%U4vZz zjILh}Lh-rr!}V9xm9}0wUm91ggY)I$-WCf-r^X4MkOyi9hb3$vW`!Z6JI-hvJ`1-& zrGSI;_+URg&eTERJb!}iT`ukm_W{N&F_I#JQtDp7Q}M%$ZUcQSmv|#=X{Nxr#kQ z7OA6g2=tZ~7?{lBpwEs@7N_~GY9wvcYFpcz>*B=*b2@#dP#-Gx;MF)2hgD)ArHeFh z!ZqP^XqN+`r`$M&{U2vydtEqFNRu>9KcZv6vR0Fr{fy}ZtgQr>L?H5WyLHS+E8?=u zqv}?{fDh`#grTM(4q-4+fZXdJ)660E3U@b3j0{Ctz+6N*8^O1p@{Oe13*1p54~k14 zqTP$b3--_~4*>;eNJL=(pm(PuU)0`XHV8fn)@rqR9?5o-d-0=$`Y%N991h_K=k1vd zsCOhdy-or}m~N*RD#y3mAt^pm9Qd#P)&Om_5n@VvK&Tt8SQf zXh`us!XpG>5Z#&cVY*L}GRSrS|7_E0KR)Q7lZFpTXw<4@7A0npTMay2d0|?sH^gli z3f_?7Oi(4%$3cHebe8dnvkP}HtTD_G+Ci5l%!H33NrE=NJqQya`JGipoh-nKPUd zPN=QtNo;2v+N~!Q7)g&aVS2WFmE172H~+gUzma?1D_slM*Q|Lc*Y~4|t{5Ul?r@xo z-6t}Di9!Zo(04c<>pbRx2Qm)D3^`ya(D~((C{d|Il&Si)xawN&Is<~s zWyPo{{HHj)?YM@YnZ8Q!$Qt%3lt7wC{8Q52CeTzv0tbqO#@IG3gdWmcj#_eii1Ocr z!jtxfok{^hUNZrmwz{7>$ziH4aq5x|uI$E&iDtFw{&i}Tyn|&}`|Cd3DP(?lESYRve4B!l>|b%hu&doTfNv>=u3QmM@AxhNhi!wm_&6bJ@|%TZyL=y?Ip)>U)Er^C5DTpcx>8}1FeyOg8n z_zw)!u*mQ2@*D_e)Hpa5_jkK(2X`L^_T#-Si>GHQOzPN~kSWSPmx0+x}O*rD>YSlOC~WX7cs*>rSZI-yioOsf9=$e$F% z36ETueTqi2MD;THK=6sj`@M_NTJz#kf*9fT;mPB!0y6$MDrv6L5gvb(5&bJs1jPSA zfmuAL$z9_$D9+@b1TiYO2B5ui=n6Gmy$h*UIkIzvpDK~smoG0n5(=zrWMgXZybAgN zY>rgpgF|omM}V=F8DOg>_+9z1fgJJ(5RV4w*$FH{DBOL=96ZLrO?~EfIp&4>`~2AA z;HVn@QFy6KL@(bMJ(=aR$$0}A2@E0mj?BUmbH0zlS6AQRRVCoqEAz<=CcgQqfZsmuT}-?`W2Q}*Y+d>Zbsfst z5qvTq6UZ~la9AIM=2f0F?AdUEZh9X zLH}`VcyszKV3YgLd8u9S>cX_n1D0uAU0ZY4QEFA>Ui8WHH#XO6DFn$P)Cpqi&9@?w zcZ?JYddWTOXXG0xjQOsjJn~0zU>ny|EIHt%PL7lF9h0|{Rn}O`hCs?)7As|B%oj<{ zsgmJ*0!|w1POP6uX(_)!Q)i?obp5De8&x%ae8~BdHF^@}!K*3_4Bh8I>?&-*=!8_H z3{})+s*M6%fd`VS*c9%CAiTDFrqg5K+qt#|z`Yo%w&yFJbiip$$qTIqDv!~P6E0-L zh|YWJ`-5<*gdPVL`~YyOjQQ!pB>~E~y*UmC#q@6U&fM|bV|I!#jrfF&%oDK-spsC@ zHdv(nba!nup$m2$AoM2;%t*(rJw|Dm!$~$g--HP9Fj?y!QPJtM2wmm7SYS2!CGFB! zmuqVc4=DX4Myk3*e?Uw=Tb2}+;F0gzNmZOIJ475}Dt3Kg7*FLZ=$A%q3tnN%I921l za~Q{ly379HVj7(v?n;!shk%PD%i{ z6@=Wyg@*F=lYT&akIoPi%Nvp~vmf#*6-Qmri~X?E!&Dj%DgEH)eS6Raql-F~=evXr zg!0)BHvh+gFR)#A^io+IDbR~I_MSr6fgJ|e7Gxgq5*=%E9uUUy0>=qXZ(-9LX0&uW zx8PHy#fZFRyT6MX|%2WiON{8vXj(rU-yr3!`0}rdd#4oogn5=KrQ3A{m55Qf8 zf4TWk-{f3;PpO1uZ@6?l=>;QN%qa)J&cr+*}p^{ zH;})~kePz#G3Z<CrJpB7%wNv0o9~ zF-XxFS2&)?=jP0`6odIqDC$i-ekpKM1~>JHjv=cHn_b!-!7?Wm+cc*2sUWt67Alx&% zS(VHnPQF>H_xi0va2f2O;3b0%r#H6cDCX znS99B4YyW0m}KVY^zfuR3oS6MO;QP2pA9}og450Q;ezF=|-BAoPwuJOrTudl4Ft0%aFDPAA}(i(EHBZbmZbadoB; z=-CNPQ&9{y)OwNq@9OIm*C`Hc^}80q3D3*KxUe2rB2UFABkBj>;UXZQ|ncOJmv;5pEY_JJ2gcdFY>_Rz4;P2N?uOX@+O zc6TVs`KJk3XMceHxk`GlY8K2u{_GiShwjKkKLKN+(p6(m%wf zhnKLtr|vcp$Ow+e6!3NxQDnAjjat*NAzn5upPz!DJH^Ata#R%Zk25DSE-hy9;WFwwfDxS(+#qL7E*x5`(08 zd1{KPv?Q731~&EAJRQ*F#vbIZ7bh4HQvuOHbmMBf)#1g<4#DF~$?RkO=dmCn=aC|L z%FTEJ`k(T<)%Y@22u7_OU@YA~ec(|&O;rRBRdw)q3NC`&NaoN?37A6NH%=7yp+|JX z73wrVcx1f-WWX>Hu3q1x`YLgYd-)PWNW4O{(A6HEf-YYLUnDV&!dJ*5Ok5z)1!(n_ zFNq^8{;f6wwVq^aH8Jx-m&v`NvX$HvoxyPGlp_M-s2d6|C$qSR6Rtr}I^PFFeI>!0 z)8rNWJJg4^CS6VLC$G4EOyy%O;eNfxVE9xbiuu>f51^j*DzCb7G|Dy$G}7~TwmoO4 zAvsfqy6L$eT60})R5A0ngN{8#kQGW2Py|CHL2D$yg?lGr4mN~f5$(|H!wjB;0o-J$ zaWMeH5%RGnrdab;XlHYZSWL)0-Jg)9go3&w;D%dB<#?jUem@I736t}=kKlFIc^?KK zyc}f!uJ<7jVE#y9n5URapu-*x#`|ay>^5t!b#b-|NrL-aVAH%nID+~y;uw7Q+=6uXHgyr?A9i zFoygLs7gaQdP9`tI_XBS4ei|3CTQX;rA2ckJyS444u#)i*u%|0CJsYT=~ZfenvBv= z-yl0Q6zYU}sZAGbMS&^!M>WB=ad=IxZ$toZ2wLJhAFluN^OrTh3QD+h zE@X%jCZZ(Y%~z`4e92_MlRLdN4jX9gJ?e6^O4N%`14ge z2hsFSz--QuK`lzdyuGdlfbm0Zw11nyL)*gkiZY!c0*v#(E#>4f;yM=Ax-49!3`;j? zF6SKR)ZnmLZtxSb`f}x(W1pjSLHEg?&)i`!YvleZoCZWNHqan}Y8aQYLy9V_3pgJ) zj4J7fhkDre3&RtSUUEHGjoCrAB3sJ1(E`~zK+lO`1vW=+`T)`zq7%gV-(Q#?{+KG& zQdgRfgWS7RvT%2GNO%L@^+s0jCpb*M#_s6wliM;!4iq9T?WENSU7kAFzwIH&UaBeR zoX7;eK2MWi2h{Z!lP}eTbc@RJri;AB&(PDwyy$+MItrcu)?pQ>v5Ngl{93->K z{QME6;*$e5paqeU3>qJ<>pF#LWA;-BhqjX7IcAgtY=KLd6wNcq`a$Ao|$_X)YInOUZ@u z1^iRNKNwXPz;QY1^hQzMABqPsUMT7)Es9zv4f6M^vXNMi*hn2uKy+5S9(4yNJc;i0Jlc%$ z?Ev0)wQk(syMZ0hjRyzaue$N@@W#=N-tmq14TdK-P9NQP{N(BT=gZehrP(L+N#RI1 z>OR3#lP%-yKDKT>QO_o`2$oAfOQBwMl%)N{R$?FHA9@iH>zP*Fc;QXjn!xrAaF}Q+& zIXb3q2iRPHta;f~SQy3^dQ$v>kpXL-3`NWp2cMbu{LBK_7okWmut{!}(8x6K=j!Jc z!u;BW`O$Ry12Y?t&lXk^_$R2RD>}E9u6}vzh^)n7&6`Fs zVXm#{O(eH#)s@=zE;WDKcWNtTls^ev1#p-`yYJblt}wt25YO-4-o*7LYdZ+mU0>hb z+-U-aenppfxIMSlC=ti}?$+)1&hOqr{S@1RuTuD4KI41kjPDEi-!t_q zPuPy~ZcaPOXS74Uk7SjJ1TimQ}-`d^U+?K#bh&@|h7pysWL7|DtFYiuPzEXVh@+%XT zUzxCc;5%3Q7bYx!VZ!o(?_A|CPFVipgyjR@xyrvXVfj}kEFbvJRsPip%fC8d`M`Is z@?V&+{1+xHANbBy{3@8t7Tm?qq z^BG_s++^jCXMm%4^BG_s++^jCXMm%4^BG_s++^jCXMm%4^BG_s++^jCXMm%4^BG_s z++^jCXMprWT7=ky%a-f6Hr8t!&70Lmjgeb+Z`W_#E{*xVwt1J5L8K&i`S*6lfej5J!xmRDC!S8*f??!rv^d8dW=U;v880iVpZ$SF;KYI1G??(Dj zq#sB6>7RJ@wO>KHi1c@n-az`9pIs__{x7`xT7vWiq}Pys1=1~~Eu;rX-}*nj`r6kb z{k~s(^|cQp{oG%A^|kLqT0{B|kiLZUH;}fF{y#|nbEKd5Ii=EfBb`C|LrC9^^gsAz z)D!7HLVAq!&;81)ul+@&eWZUA>4!dv`XT+wUq!v%Tq<4r$HEB_S0;=qM^W3WE?rhfs8g6NM0`Lmp3uIH}3^{;X?%)^yF9@8$6N z|L*&BzwZ0DU(I)YulHVi?X}l_{9fN{8c3Jv+{0fWE|8z?LH&?5e*Psf6>{rd)C)P~ z7t{;+GvqeN`TI~micR+4{?CAC-c0qmt zS-q}vYpU)`1dwIb_9do5rq$S&D21$j2=pKyhRm#o_SD>$=mA;n(0z##$d#G<5^Eq^ z*4dZX4EZqRF34te_a$7GbN4`IL)NXgFVPut7vw<5BMw7($T^TpAp0J^FR>1?LxX*Z z9gxi$?MpN`4Dmi{U!o6WX48F%iIBO?_a){-c03mKLbg8+`jFSOL4EZxUfQBQ$ZGA- z9>{ld_a%xT=N*swAb;twFR=phyUy?za>>d261yR%bVGfIJJ&i7enQ@#4?iIr79t*y z6HncjSP1#rX{ZD-6YQ6J>gs}Wboo3DXB0e@DnnBCj5l_Y!=ELg?Ts|h)F%0qq%>6$qA(|nYNoOe6QL*8^Z`V%s95#kFu_CELvIe0O~ zE##dKV4P<=m+|1fL@wl~D-ajRYad2EkTo7byCCO1ih0u%{yh%6kZqoTUywyl!7gOI zr(qXzz%z&&WcTMVzM7%^FJU}GE?`#)hpMLl1J=fc=Rg$Q9?q56E2?zz@i7L-r?jLv9|vKaqJH z=Iv<22eQ*R_yM`N82XS6u7N&e?HTa94d(Am_zn5c4TvM;&9mVLetA9CVc=tF)v z5B4GNycPD_I=Aq4#0Ro;0pbI>;g0=@*^oQ#+@Dwh`N%@F7jnYAXa{85`%o^&xdr#b zFUVJxqCUt6m!m$&r4OUskZ-R-eUK|3g@5f3ms0o#`P}2E4|2~F=m*H{s}WboC!gM* zSOgWkosf$aA_ z{D%C`N9d>HvA%u`e<6E*jyOVg---4?mi=>oVh7~%T^NrYFb@BXeuu2~GvWaG0^|zF zhxbDd@>ExrXwVVgb)=Ui`ar&1qbxBSa#F3b#5%}Lhn6LFK)!JV^iFW@)h5t`ENWJk zmL$+#Nme>us7c%oi%(vsp5~Xh$`Vr{ZyH{fSO|I2IM|2$0CG3vvlGe^ ztve&`lgbiBkZDt(2bn$*qiZ@~wH$I~n76 z5$c7U{yum=TxsYevejw2Y^3f#+60;#Qmct*&eh27@BTW65b1Z z9QbOK*CaMZ;3vC5;Q9;fmytaubynJpbh+^MWt$W$#)VrM6QI)dAFl!2cNzO`K2`;!I#>of`+wt(^^cG`e<0>@Hco`e^I zUkIL7PQ9JM;6uUJ8D0$Dv~l3(L242^b8uaHWZ;GrvxbiV ze+T>u!>5Dy%nls3WasElN4#ACJ^{Qn{B`*mnfVzF@-wpYGg{|mU#b{skGib5n0go0C4P$_xZl z;@cP<+PQh)u$7eiC*?YVj|N{TykACeOX{5R@htiMk)J^RU6PM>4<^!k@y7iPH69lKk{^>{+b>_mhyKjFM|p4@RN|Pz&UDZymTkQfOqx{A*L^ zrOr*eC4EknSyg9LlR~~-y`Xp3v4J~E09q_U?2iC{3cN^w#$$d;7!b*yiTuNk3*5|T zexHN!T88|)k#Fs;1%C#7R0;|X%Lt-gNu0MM|H!t1TPk)7GqBTpfA)Z{1OHk8`Y#%1 z@h7Va_UfF#b;`hnu`B)15&55W`Hk@z(+}fNu143uy(Mu(|6yF@VO*roN}H1^_0B>5 z)*x{A;eE3FRmh)`7r1LBKkUcs@_v-|ZbJUg$iGMOBjai(`2769JtExK+dX49;y))f zT+7oj-v3k(xaktd-#M;YK(!0XJzE&y{9RrS?a9k%jabj9GAn&f+AU$bMnLbP(*jol zwPfv@iTtmTzd-T_X5`9znw35SUi)#i4Ea}g58UAb3NtcANW9j9-vPc@K$3WFM}Eg1 zfqO#o5wGqUJ5n@Y(vM}x{{s2%N=?byT~v8Kh5e5)zovH(uKP*LC0U=O+&GjgJ1cP2 z4#w-hu4__m8Oo)d9k^P5pq%v2c9g5#H*ojjJ^ifIKVm<tNnYR1`*i9;8Zd#YdH z`o@(@G7qG_Vw9^kAaKjl%KfSshmw>^fzN{KDwJC}FmPAmJ;p&GLil>{mgjN(i16*; z4}(t?MRFN8d%&BWPj1#jv6oc?XJO5clxqWCcTnKo7kj#n1%929c=tm7F66hDc#O;_ zO^Gf@QU*!tFNWR`7X)syfUy2Rhh><*0Qqx}|C-o28-rFh2+>87@~e^GcSztq6Od$| z*n<2HMS=Sl*BP^acF&lfS}DHLFSQOqT!sg3Q}TZ4o>5Y{ocL3Sa^H^%Tr;W9$EABl zX_fNzUH)gT%&~#XPLeNin~D6~ivyRA@hWk{rf#@PPYwsVt)?uC*BgDzY6)U%?(^`O!-a7|9M{EPEC?8arhSbr`*bZ{f)S1 z9g2IOw*{_&*!c~;F3@}U_TSc%c8!4E%L@W`K@z_teH_`;qJigg<4#@#Gfpjd!D+7=Oc{&==hcVj>unpFZXlv zc}~`m{>X2#C~zk*erElV<7cJwyV#wBa{d1txav~Q&%45m$T@Kp@(16C&soeb%)mw= zYYLLIZxix|EXMd1HZo&f-1@r*dUYQN+|5w4=Z&!awQ(;R`DaPK`oZ(N)YB39-y*-8 ztdqY{&tT{s_h8^kp@wy+PjnrUeP%lHKSKVIk{>zOECAmN9FtA zKlyOMF!=Qk`Ad=iIP=5LAGv;?lJa|y-~TV%$ISi_wm%d1(jN}oFH+vrAGRO)%~u9) zmE`+#lb$OAJ@-lb21D;{=rt8Rwol3zgYO3ayYHvXas9LidapbhxbC7Cj>B~o`g<+% z4|zOrgXH{%aX%x8AsLT5p*QmBz}=9J3-53Ayn%f!uhM`N{~OmqKR?IMdA&3G=;ySK z;4`1+eS_W@gl2#4kNiPvIX}YwIk>-zKgG!Z2>C0dU6uU_hqav`(l4t}ZpKT2JFR^D z=a%=o#B~$$H?9lZhd!=Ll7u51AA6v;^c8%*5j%r0Pa^xD_?J}|-$ks)=Mc%S>|b}3 zs1z@$zZc3)eJybHSk8aG38!#{{ka%=H@_aZOGGb8{1za8?}osCZVTgARNl^T{3HL~ zje&cJ;{x@d59^fg&s&h6zX_iUV)FMO|FgFOH%sat=s&;f=Z$du*Td)g%{b3UKI#wc z@5UKS_kZNy_)g%SI+!n?c*4*3QocX(yZ${0?_VXGpT)@k5c!YB)V~1vv)|)+7WXA| z-H`hdVf&F^>wSJ+3+Kg>@_8ZoTcrF}>~naZto}X7{}lQ4>Azh+vM~66+J?`O5&55xVKukm?6^ul=J zfGkFkI^w4V@-w~<+&jXO&4jtUHe1eX2;c+ z8@*&d$f{+4`P zbjJxZX}Mk~x3*!Pn;u(V<#N*RGf}Q{cAi^;_kR9igOR$CBu>kazYY0a({X|J`~C|D zb@{#`es6+a{iE|-Rh;jV#%af)mHZa_=|^B)?U3j8%D5Vd&o#Q>9=yF7j*m9b%Q_*? z-6x+@EB8aV(It!L2$XxGOP+fR_Z^ay!+KeHKFEAtgmNXP=DD#I#=Bqd!c91`;7J@e zLI11M^4wI>@0ZcX-q-vV`9pi;xfRIv^XuTbM9SA{i1p+2`204=e;oPu$CU4d{JuSt z=VzhJIOP9`{JW%l?~FjtQ!~MDIwQ~Rrd{-Jg>(NhQB;!E*odaG9eq>xbam-0Jzt*GN->%AY z?})wMIWJMfmEq;StMlAvGG8vpn0WA855Mj-#s{-&O7h(82j^d<&pBeJ5PEg5!}=w9 z=6;jR;}OVzVn&|-JXY?Xo?A*%q6Zg={{rX_pPA>r!F#r+QoRzdwb1K*eV%*npkDNI zO<_ioc!|GzP_Fu{JogWYGx{Yw-$u^QSx4cSl-YUiSFtPmdt@PzdOITjs~hv&fP-;~ z)|>S6fs`AEa$RrEbJLQSE5sesr2V@L<<`u>x{`d|#o0eSX}Rqvciw_LcWd%}Gd4b1 zP4IohU3u;n@zcjgj+f=<`;N%J{O&xLCi6HvryTq~P1@NX`P2TK=W^oq!5zu{or7{K z9>{Y+a(}yLEWy`p=8I41&-Ey`Yk6Mz{mQTdq;HWVe<$+0J%l)jzk@QC;A@%kFIZ%} zrDx+=p_O^=2dNkLGh+8Y=)L?{o|__e%Exi}_p-RJT(^>cVt)k6by}V0#>oDM?+@$7 z?5}g6w|Fhq3*4VgYJXjwO7rt-3>v`@!adAshPU2FAa<$*g^Pj_tF!~}3fXv&* zO>w_$Q=a?!;CiIzX^hm0=V`Im3;GYeofkfDP(H6P2laE~ION~FInUqMAB6fM{UGg_ zgZ#7K&2vrS;#->h{InkBCcdBNE>D4xBFy?oJHq}){+CPH%?KKOf|| z)PwD;IG^WN9c$LCK+{)Ug^^A{n1$0s<4ir?nGw%A{b z{6}`=xtCLMVfs(T-FD|V+5z`UYzH}ZjybV3-X`)1?R5h^~#!Qm#c6+ zDn_|I`|{i_DVOAXgaydoUY6&!NB?pKaubKb=Mm%P61D0fNie77`txupA_)R)x~_hIVhyOD9_N|Nu>y-;pSR=)e9 zO47K*);AO71~trgd*k8~)4sJR*YBu&w=8*m_<&fg(g2k9?LoQ!G|zWGC+~OcW0gOT zNx3$y@IBkn`R;=BnD)h-Uq+x@&tvo5fw=lMS5NBaB9!aiCg0y@Og7G9&JkNsuB>go z`%Civ!+1&FzFMtuKO#5ZJreghwKRFTLX_)!68uaa7o1yaRcfECYtvD#TGxE{G~WAj z)WQ4N67NOGe*yX5#n~;bQOT~9+k$cr7v#Hp@s#BL>=xv28i4hpCi0Vw zo6RxpKNim%56zFiuN!mzC`7qeM)Cl<&Gp{skF9WSa^1gPF)*JTBjz zDeVc*(|zQlVwl4H5Bc9-lJB1f4D+!7Q9<(8BR^|GzW?4K%s)7eB!4IJTTRUOpAY>$ zP=3E&`XT)|tmnvIFE*3KD`vcOLAkY)^WDYOV#@8V9B1*T80A`BneWb#^)AWxFAI== z)z$f~3cj~W?oZ81<6i7;Lb>baVm*|0m~qhp=v(BsycPR_)cYIzW)=>=8y6s6V#l1T zBwihnf6ra{?zA}nN|Mj_aVWRrp?vqS)Su)&&K%_5v@+j4Rvr0C`=RnY3i}`BPFkJs zmY|p)KL_tah`&3L{{ixMB=6s(^GwP$Zj0yJp2>I3!RjdL(v*JFK7ZWs4~ zE01sSr$5To+mP=*jcb3*J~;>Fet09_y;}oDlJ$SgzO^3Z)^Evoha~qicHJ&Rxwp3F zJ9(}oX?;n~V=|9Aw!`Q9o%t@cDlSH1H%;<+R^mGtdegtochy8M$vmHq{29CR-Cc3} zMw0za?5;++hCk=Kf8xFP?LXJ}&otuS7UU<8e}=3}Bk_4ZiGQM32ECrY=DRgnq2B!J zN%SPEMJ}GJuUFuz$T;bpkuCS@qh&u%Gj5Bc~feGV`j|Ki831^&6?b22tpiF_W;LVa71f70y*?vr#}M8@m4 z;D;|Pa93r5|3<%Mb-?HR6$Nf-%}_7t_r?;(F3{_=y1>m!zV6@|$mI8{ic#)`XA1mt zO3C^=rrau&oA_LT8!GcKS-B+N%SpU;qTD;r7q~30^Ei-K_rfYz z+xar=$~-H|*d2WyP~tNfFMBusF@L4p0=%5}W`PU;Yr$mgO!9d!3*|PU-1F}hxYzI= z{a*fi6+6MNeV^kG=f7~{lCg*+@ku`c&uM*7;C~M!JU`B_aK3DT{Im}XTn~xgAlxT0 z_w5Rif5t}zZup_dPv-BA7M11&TyoPB&!BaH6|=y%#z;9eHz&GUj{Zzl48sbA>E%X~BTDj1Wx@v|EGqnj1FjoDHC$bIN_ zmG_e@s7lh`b8BRN&#l3;2NE0-p`OG;>dFMaQAp2usk5q%l3QB-*<@k=oBlTf{~Lk- zPedTWq>ZuH%4G|XBu5BI^3g$3X5Ao^vIR)0URW4PS=uF)rUoM1ProK6i0qsmh;Xt* zhv|?Y6mpc4G?n>>_)E8w70VJS36Hvj=`czavUE$@HE&cXbxqqqM|2&OEnAX2S|q8* zp+P8>FRA6P<)gTy6<#3)`o0+Rf{oHG{C+|5Go)T;G0MUsv{1 zZ^{cP$5UQSIhXQ2%10?*qj}?!&pCM z4rN!$-jo+o+J1_=4q7)q=HP!T{2PCQNB@*|`SxKmTmU_76XJ|Gh1LfA^iY{-=FVYc-Q=Svu9p+ZOQa$S6nuwc=Du6$6qq;;)}+P#{a55`26$E8PLC9-?Mw4 z+3Sp+r*}W?)PgQ2pLF609XlM~KBsM)B&7a6XC)H7&rJ04`DY}0p57w?Zwd?Y6N$W_Th~8zNhD4=IdKy5J9j!UaROvV zuiN2xFWcuP673Rj8kff|nUnrlX?8*Ap@_HTRdddxynT=#{`%ROUT$N3pHqHM`7@Z_0Bihf_|ZypnPT z?c_YZB-YB0* zF7b(SDf3$?uKsFI`8aC*+Rn{?IxRG3`5*ObBK?(^t8Fn{LT>vtm;OkWrhavSG=k=uCoTV=jCYs1~L2$@(g4D z9CGP{XuZS8>zaCXoYyn;PNlx(GstCJME%$CDd+E~{|l*a`BL)w(2x507`dFMqx^Yt zJfd8IzfLaWF{=M}ay;@_!Ot(rWxb2~|1){E;Z^VO{o9mW>&T4ZjmVoBJMGAu8{UUUQQn-~&X6W_vyl84!*$-_5s3==%cze>1}gAJ$z>jieVt3$T~EUm zo{_>&G;S|ZA73?B(C_VcLz1>^xaM3{=nr54fGbTfGmfGB@}yqDn`hd$&QhcS$s<{h33q{%oK>mg_v45B=yo+C_ck$PSavqg!zm z)z9qa=bdt@m(Qcy0K^yd=Wq1ia-ByDpqm-d-$i}l=@DM#Zr{HP4R1!i$nb9DOAH@O zzKk3qOq0o1;7aP%bQAe1fGEG8ywq^*m(}DNhg`Q5i~V|ms+h0w%zo74|4@NyjaX2bKzw-|mN`8LDVpY7!8&qVrDiPO#wW9J6) zord2>zRU2Z$iFpQ{n<^f{>-O8mP73ir9XPUiaSTCpVd*jj6?NP=TR-gt47X6QGMNi zvyA>G#-{-}M3}abH^!CN(exF0Hb9i`CvRbRt$Pc@qOA=-ioA{C?Z|Tt&m-?>cwh3) zhL0fcV)zvD!0;Q$#oK7R7LxZc{9*E5hCff<$MCYCLd>bA^AkZ2ap#VKAL>0;Zw<{8-5dciQ)H>&oulI^4W&JNIu8#&E)e9 z|BQTr;XjfuG(7#!KF*5_uTQ?j@K)r@3_po{h2cHPR~bH-ywvbZ$X6SF4fz_wZzW%A z_%iZ!hL@7BH~g>U8w~$D`6k16l5aNrXYwtESG&*0d7I%!kZ(8qSn?f)cOlF{NcN=~k`5wb>C*N!Ma`H06pC*^XRXXxCZ6HrK`~&jphJQmY|5szw&H?gF z!!sBAILotHQT@i`4GeEf-q`SN1xjfSx<#m?$IQKEU8F_!hJCYAH{8aM6hM!AbWcXO} z5r$7E9|MkmIX{Xrm#pF{B zUrs*V@Rj5xhCfa|)9`1=XB%D~5c5XQUD77`(Kx(7JJrEpsyw|(F3&AQ`Brkd-xcNm zB$wwbqWs_FwG982T<>EeJ4|{G)ca%VXZ8DizgT`ac_vCn>upY6$M6p1_WpJka=nl3 zy}|PxR z>}YzCybnN>>$$o=xyD(~)dLOJ`8C+^w`so!Tz$t|_Zj(6!*xCm1D86r-rdw6Vf0fT zCQ=9r@z@@!v{|NGNhU4;grMUTXHSJ1YN8=ke?sa_YxL5zQKmPwd zzMC_ic6@gtx8u7PxgFm{!CcQ9rklk2U-o@{0`LOMbE8xctqO#_v644n*fc9dbKAjv}}F zLR=;PQ})}jUY&nhUm>}je>z_+*ZC@IxwKd3v5qfUv!lEp?aRIpjn4@3#)cP@XB&P! zc?-kuAa8B>gXC=tf0|tP9b|{;b@Gn5iu$>gytCoE$h#Q6mpm}M#UvAi&Bq8&#~$phnOJ8~%%ZC4j^JC6F0+i^6U+>WD5$?Z70ntY(C_crpuhA$^C zGW<#M5r(fLA7l6y@^OZLNj}l=pU8_1PkqqGd8*;{$)_8B40(y+oycbzUPwOM@PXuW z49Df~N*A-d^mTN87L(igSwb%JGdgeQklW{TbUs&yzSN=fQ|EIn!xz$y%-g6x&#(3I zwVylwLVf$W;~8@Mx#LxGJOBSqF7v-ay)XEB?f3XQsc*l>|AE|okMADxcI-NmL7r{v zebMVTHM|M+n;G7g+&Ex{eDzx_{U$1^IulnaxU%!`EK89Ssmsfrn zc^iOey)(&WU5nOx2YGwLA0R*8@KW*)hQCN|*T+rdvOY%Z{h0hD!@nj!+3>yOrx;#! zg^!zEXS2uyqklAcp5e!n=Nlf77Z~1~TxyTTc`$hoqkjqc>4r}u?`imK@-qy-le`yr zwBBXpvhGLY{1o}whQCbS*YM5c{S5zv-0mOWlFR-Pt@i-=d4?bI7vEp!8{U9?kl`)K z?LO3zyvXREMn2T={^Y|9A5LyR$4nw00sUy4uO%O2?A%UnKbPE3ZaReiP4`%ey!oN$*(i~F7g?MKS(|kJlelckwYFnlEWlZF?QuLh6SJA-_U(Z7TIS;Lo-KWF$8E!PieiQk-hTl#8cf(hZZvl_i`waOuqrZ{-1H-qHe`xp@nb~Mfqjq>44FCuP3i=^zS0CVfb?L zLkwR{UeoYb$nE#?X#O8cdLK=Em!DLYj{DsGuGUL^s=MvvnE>(wcf+Lj@3L{FOfvNI zdsA|)SMSF)0~e{;6hUAMd07Y$abnF1nJwCSQp6QGeVMK0fw*br`vxue9#t z$mM*cOzd|d*K?HS^(8Nbj`*o*B>8H9s6SVduLqCDXFmC>lwQGaHUA0XGd7m@!8t_*M8BjjQv>d!0Wy3T8v_sM0Q7k|>k2-3IY^1PGy zqxvbU3&Z>)3_qN_A-L$Oers}lK1z94@@(iw{XCnz1$fk-(d6=66aJOkpH6;);kS{W z2p;ukDY-rerT#oiuFpX!{~LJ#J5hgjlFRc;_*d@FKJv2-uk)0ToBVCws6Wlg^?4_) z_hfQ?-bs0Ha(Uh<>d#1WdAL{1U@&BOebQ^=BEmK98jJK2NUCBPoBIT%JdY z`tt?3JV%6o<^GhB-)MNfr+s{G0+0H0H2ECx=s4*@KHu;@%j4^+@D{`|7!SQ&-nPf3?B8T75RGb zs6SoFHyGZRd=q%opRwfI!SS!$pKHiJHvCTVPr#%8tRUY39`y$%lctxbFS_#cN7Lq* z@*k5|hry^_JulWG7vCl6c~N2#_4^yz$s!kBN&g{lfcH`RX=@6@{KkgYCeJp!5qS&4 zTamXmyaRa~!@H5^8h!?ON5hNAI~zWQyo=#Ckq3q^CYM%65q1G5iMdwT9nKzRvKK-GyR{g&-(k}>8M5a6;1m4;rji$a{c{q{eE4!uG{web^X1~ z>QIc@pZdO!PYrTi=g(yv4l#Tfc}>GFA+KfZUrlbG_nJp8&vixpSwb%V|4o!XPM!%a zG18>_Q5Jx3_5TIxHy~I2H^>_UMD4#%ZhueyOLF;rc(pCIc9Uo0ebgVv=MP$dNA1@l zKicpk$yKoAg(d7toH4b8m8qbF^Ip$@TvY zL3WsiliU9XVLZ9*m#fL8U!wlsLY{5-BJvi7uOzo|dyc$~(ceIxYxs8Zj)w0h?`(KF zpa1A$cmwjl@HXUyh6m(54DV0g%kVMeeGH#Y-rw-~kMB` zzTWWX$Tt|ifqawU+sQW@zMFiD;pyuNLGX8Z4R1ic-S9T#I}8uVcN*TGe3#*4$iFpw zI{9wH=acU-d^!1E!*ThW={c55hgNj`*8kT<&lkEs=)NK63t`H2->42Iwv=z8{aWM@ zVfuhP6IY_I={xc)fT%wSa=V|@`D}8O{jib!&U!J z;h z)A_FUq4tN;=d>?zjE-luZ`V&K{d}{Y7=xnq2xTs((DW_KWIwA(ws;eJyhuxs87xa*2Obe-OETu2MUr$g_?9 zrR2>FpHAMw@EgeWbCue^ja=5-s6T%uKi2RSP=B`-{``tj2R7g7D1i^SY z=jD<+3PY2+zN&rw|Mp~kmG2a_-FjcfuDg0)M&@yJUDW$B^$hpr`+~}g$ZbE5Cb#`Of!xOFa&jA|ndEj}>F{84{&9O*vzd*gQt>yh|H>T6t--$QQOzk*!b zulm{_+J5EFP+#Z2a_uLb|H}2bLp%TV|JShV>L%KkeKI<3z9P4uEA;=@$Ts@bHWY?k z(gLs1eMR3@?vsfdRE2T*fcew|9`T+-b6bxpEWj8>3!rnZ`Bc$z3=f9SuSTa{Pa=o?DM0x98T*v+(0SoOD2U%BendZRFWtM?sL-v#oC)c^g==={}v z+TM?7K|7XfJhNdd8qYlHD@S&iG@eay71ckF`pT*9G@i|j{$pw1%T+P{y^$0SAC7A?mMbqLVe|`ukp0|(QWkKa*e0#Q_=W5Mt$XKU*p-<=)X>V z<*Kjol>IJhe<$^otG>pwozX94dzGuc##8rAjn6jfD_4Dur|hRP4praf`SGb-^);UM zevo^!FjTQz<0*S@w7o}CU%A@XcMK`$ji>Z})c!i^D_4DuXLqAt%JwQ(eT`=ifM`6oQD3?0Ydm`aMC0l5{rFU_ z`WnyP)Yo`!r~j5~Jo`XD+TLHNuUzeGJkK`zbv8-l@%O~Z!wbAIT-p; z|3_0_x!TuwUSRaEp}um}*LYrN^cPWIx$0{?hZy}*wpY38YdnhpqVe2DedVgJ@f-mV zji)Q{<5RinYdl9$U*oxk{#&l`90UDmJl~_fa<#AV9BcHyqrP(0*LYrJ^bh%4VW^^9 z^);Rs8~t3iSGnqIJjVe<<2jJ}%2i+EIT0Wl&l2h@SAC7=Bwa=jyo^Mor~knzj5c>xbtk>xi#*58g~wjJ8#CFE91_O zap%Oi^I+V$FYbI7caDoYuf?6q;?7@j=d8H%RNT2K?tBz?4vIVP#GPy6&M$H2l(_Rq z+_@v}d=Yn!h&wODoeSdj|G0fVZaUjeIJ& z?1$y4(4QBk1Lz(md249@YI4nckGupt>d$xN*BX8Z?|WTmcrNRmVfaAuncz`BOUP$~ zt1o!#TGIYa+jqWwF` zHSa0%h2T*?-y*-;@NdcQF+7*`-fQ?k@uS7RD8fB}AK{wUihLPZ z)X#u?x#1U*KWKO<>wU=ZZR9J!qkg*6d^}fyt1o!#uB81($u;k8@>1}qpHGlKZun;M zCk)SJy-ylGkbE_G)Xx&~HQ?$C-n#E-|2cBatGU_7c`bO<&lcn_7@kl5qT!{i_a(!( zk*@=f`sup+c&-OmU+~rqq5ap$HSa3&4d78f?^nquBe@xwKQ) z*vI7`N_yX1{FgYXuiYd5N8>k`T>OmkN#t3E&n0hQ_(SB44S$h5+wk|vTNwTwd27RQ z`MXleyM>{i?Z1ZP`aP{0%OTg#O&YImV2X z$#op4o#)A=KcfC@A=mF8)Sq4C^#R0&+R^c${ij^N@6!HLuHS2A!-k9x<@!CI{XSMd zKT7{a{rrXg9AkI}zaKl+aGfW|8Lof#q>bVFcTep7Z2h|@IYwXq?uorWy?luuKe4pwm+>3r!^!QuE_~0o zTgHXQYYwZC+X78$Pf>Uz@xKy=lP=Ko$< zoxjH`{TsD0p7s8p&aZ1|NBSjde<8W7$I&>iAh+M+#?8l8^k3#<)Xp;UMuxvg`?{_p zJ4`yivT+slQ}+SwmuQ|Z`P;A6_&lb>H`-5sbe&Q^bbPBH|5I_<7>SG2@q5#UEN9o% zAIP=cYOe<8i#=ayzLhPgZ^x&`RmZ2scx z-1f7MyKMLnT}P_kQ7CS?7KVrLcf53BecJz8q#wDB<9KrI|7Z-fY*a>{=W89!_?_=( zus&&XbpG5yUd8YgObzRM70Uh6VUA>t4_8eY9 zZqMPjliPFM{p9u>uKvbJZMVcuel#BHuf|Wg&PN+3J+En;R6p+dVSOH0*G<)bGSa^2 zeAqy4*BN~tSlg|3KB0aKwoBW;hdkTx8rup(75jNl%f-q6x5e)$w!^N|`aHG9PvaC9 zzxK3~jfTs(kbad^NUm{Jeh#^Q-d8?0#?JH@J9A^~+#h4-sTeyO$aCSdv{n7tO5PbP zI==Kdaebak(fAyQ zu~X+mA7^W)1-Z4;ncVtwW{jPo!$jNDSmhQ{3;r$Nipr4gMaqz3=e9 zzqhUtO)g9MeSz*{sd9LB( z$vYZ8i(J<2XuIwq*Yy+GVS0=_z*SWLHF9Z1lz&3r!|)%-Wu1)bSKBTY@c*M5eiXT^ zpHcl2$#wmavXXj|>pJEszIP)p0*KnVjC_RQbIHdT{s8$n!=E9aX!u*?#fE=DKGpDj zKGCtvrN=Q2(t1>_}9doJTy(gozfCeO9rY2@xp&n4cHZY3`w7hfc; zAYVeB9a86BA}{&M+v!36KKYJsJ(qrv^qt!O&U0Dc!t^QI`@QGV&ywnq2fHiUX-Qu4 zZ_m~LlgNvHsK|S%ogXXOAEJDZ=dxZ&nndpQdOjaax@;@I}58dJ8R&s>rGJeF*X5>W;J(u_k??k?i zTimwplbL8?!#{!CW=qYm1aJ@rQN5^`y;r2Ewlc^{A6v*blhyd7D`ByA;M zLN0zv`ib0Sd;RQ?Vh#Ds$02Cy`3UlQHK$3dOptM^7+4Gjpv!v&t*GH)>hfVcdG;I3J4s<@IGfm-Ly|`*TJ9 z-^NWzGd~U{dNXbh?JQ~Oc{aI@rxK1Q`TGizbY0ky?)A5TNmknDeq6e`701~T1Pd@Ts&gz_#sm!kMz^=#863$=Hll}Q5rIC?6BcOhEJX{ zWYpO4W8K(_3`iDO=O*Ka?xUo0>i#`!Movz<$yZDsF>>PMc2hf_ION2R?M99p)oya} z&`HHP{am{#lP9&CJZX5li9?59JaqKP$?ft7oZhRj-Ds)2?eRJ7+vl`z2OnJb-UG7p z`eh%Vb9`=2u1hJoA*@!`&gv;w<27Y7UXI4kBG#*NC|GJrb?M90)N0{jB)yufhpE-8 z;T3sRrD>_DReD3DrB@j{z8HB`eY}f1Fwqg+9^j|FRwMy8Wj4FS3MWkt_|9q z>W1JQUD<@U;)?dnM)uHbFj`JqDevF!7Lw49bYF9o6d9Z;GgGwi@hqHrdG)F(YoVWV zQA$9jhC$u?_^I}cKgLvk{!qS6+wX3efZ=oP-j zfKT^t(IXvQTE@vWPpNr&y>7Kq@ugqYmhSX=|J_vm@?z!2(qOkrj_X#-8*EieTnNNu zPKtq5Q&0tlk5-)uN2?$71fi^%G63uluL-8tqg)AH?N#_@)B`27uxf-cDE7R7w zl(fv8u1&l4YLS+aJ>{~ggD~k+Qv4w~ywzzda5B|%hKn6{8-7yV`FO45M>vx)YcavG zyV?Drbz}=WC?u*iW00lF~5k z!XMJ=+?O`t{j@sOi_<1_Nvks|Z9>nqj4p#7dHuH3=I}&3^XIw*5}GqLvsSh0^CMjH z)u>;r{P$zRbu!&37f3zlrOv84DkGRtZEo5v>2s=#n=pQK_LT9H$BrI9azwVQ4wJ`B zm{eR5{qA+lmlZ2!6)vw~_?V%STv(}S$+}nYd-sybW2cQAQtU>Kzigr#I%)Lq=pr62 z*paXg86srJ&`FbqUV+^J%dwN{Zq zClrs&$;&^zZSm02yy`cl->G~%di<1}VN=GA8_{;`2$v&QV}?#1<8nq^F&?J9ES}_Z zE*m*XP9PO7h9Ga!$ZtQvOdgzY>ea=YNo6f00XrwbiV`GxbRXLRkjZr110uiA^|6YUeCm{hUZl(DI$rgD}4{6~sSDw!Ej#orgCy@uTIZviww*pDoTI zNxkBV)~|6H3YLZ+E$ey|;t`@gehAlU5`r;v29Q2(_a zm6HE!qM$%2(&1zj~oBCvA?Viq@Qy6TZ~1@z)Ox4Oo6xn&x;b z8h^F6)nGG zo^St-dA|LsFE%9UwaRb7qUCq7{4SO+W&L5{B;|iH<(J&*>tAxKufOzuE$L-;#Y?vz z*W!!%U({iAsL`i`pYeNJRxFTR@iKH?T+B6G%X=>lW@>X(*29}*<5)CmM@Azyw`qHd|XWV-7GI3*rUnTbxKV6vpV|t9ba+!R`RubO!;e1^yNF4 z3eBY(5L142Ctv<3Q@~uhp)uvRb@t^4MjMa!I&Kxq->DRvw*PZa^5qXR73!tREAU3& zt4)!op6tv28ijaob!WzuFF3`Q@AF^E%kK&3*pI5-&hodJ3e9EckLlvj%!=;5{ta9| zj{)t9AB~^xYc;@<)j#nXU;d7xLv!UXw*K;rByZB-UFX!GQcfCn8$BmRGt=OSp8qQH zbe!jcC<@=F;pA4Dlvj0n4vQ8_!zoP9R~0#;a!3$G;rle)a?p0!dD{>r8bf1o7q`7)d_umLc zuVgvhS1aqLUx*t{K4V~^Y6?r44`$t7?KgIam zG$*%`DyKAeRAmT~=9=@oOhBu4h&0~0r7;YvfwbGo~G{I%wrn`S9tRYzsl5yPU z!z`^`exq8;iHFJbbHG!Qj1&3%lj16mlb#{3JWkF9mwMM77U12%bP3+3xJGUv&j-2= zO($PMuIroJa1lGX^#i;+nBx4u6Ds0=HqT#LVrj_hxjr|YrYMw;hrF`?FMvzEn|bqF z3&q9x?@&k<&yQpHF7TAp%JU-Jr&6t5l>*SOAdw2|OG2|pN}3LeId=jcMO z?s`(c=dt-AIY9r&vW^E zGznM$S3%*4w)@_Wwr`cs*4FL~ddzPkGz@udH|U5U)axC-;yDEJ?~e9yzJT#Lk^Gusudn@eHhJy7p5IG5Mc^{d^|=k5 z*OREfX@Ix?EAKxozzxMrtQ2$|$&qv6IwD)`u zj}mgfN#eG_#O`ngjJkL+1{`uq!zViOGV?T}~ zAKJ+4uM4d?cLRBcBG3Ot{oBCB&mHu0J{z-`T+h7>k9(4K)=u{Qb+P|A=UxvvD~pIv zsbB4KU+s}6d?!{g|9oLfNwt|eGCAW?8fOZP0-~TT`$lv$5?ricqTX;T@{5V4zH~(pUd#DX z(t7eEE(pTw$>FPWe+Liaz~|d~kbh78#LwRT8Mu~o2nM#S8_#guj$(W3lXuR}3-y+S zug)Dy-mymzk|)Sd3^^|%q6fJ6qt6%Wd9R3emj2-Fw@LMdCdb&B9m5yJ@W*I>8~yLf zK))KJzmxizJA=>>IX_7%BR_m$L3n*tW++@%4c{((E^8q7ksR=3>q$QK^?5{H-!2IC zYrC6P`hF3=C0$8AhyD8+`{jD_f3EfZBsfm)3hg&?B^*~lXvMjQsK5O=Z@(4W^#b{$ zySyFQFD1Pf+QB-^=iI8Z-Y=;?il3V>{loMl^&Ou>-A!H#`=^YnPOE+Yj$yl+k)N09 z{n<$S9mv0#?e)XYEwFVec(^a{`NR2XzJj6DpO77dKYt+*-5$ z&ZYf6clvdsfj93K)6P%Zy#0F^w2&y#86VvyuG6zkB{D{n<)8>y4d{ zssFauTP_$su*_?=Ox#9{vP|WHu*ZPS6_#voNGv4ZGhKb#(1_O zZg)5?+o*ph^=rTB z^)+tylTW-Q2sQOw`e)wk3J@RL|RU{&phodb8)#Xs0jv%V&Fk^!w)_ z;NiUBbMR9cx8jf=yuU~H-3;29J;l%W$M`+seW89Mx0&(L@xOxlJ%9D}uF3KhydH8^ z77<^>@Ly=>$DY1jcd<-Od=8d<(DfbdNvaoF;1aj5PV@Rx8HX03KF;%eetiRZSL%P! zBM1$=%Xpqi{UzV~dA-h?cNbFsBYr+w!Fn$XIh7(}Hudv21tDEb{dwf)z3JmQ4D(ac z1K`px`ui0i+A^Cy!za#I;bz>3r{}bA2G>WGxB($o zs|V%9;1VBw{(K$da|7+9*7NbilcZs~n|$v^&*gg|Ne|PGK3`p(^}ay;n_mw?y-TS7 zCiQpZ`tdfAaej~bTLZ6uUs%eyPsyJ+-`9I6{oEaLDn&$<+CKjCrg=LTvEB^wy4U4} z+DphAlP_ND`4t>LEx{!|>-c*SdS1#S*XQTU&kwY7DnIw>zC4P&A#d}h-Ahvcu#^*opH z`I5Z(O3znO|7Y@kN9BiP8RvUSrjLJZ#^FTj*8~sONj?w1oAV+o?EQI?shX>hGQCCDd3qw!F zW8alDihSy8L3mw{{!FF)YhFWiXB}%p-pH*p``Vkd^U;Ie&XLsrggoOrU$5R*`HpqF&7SfJ9xGv|7=il>oUL&tde({f<-h&L^ zKO4w9t@icKV!J-09sPaC&eZ=Q)MsT8Q5EMwiCfEC{dibPJBO2B`$G_F&!#^olHYZ# z=SR_24{-6n=sWMf)_WfHi!So^yV1_*P`{C@W!Ak3)XzG>xA#7-+p|K>$|B+(>fgZq zqABwp68otQ-3oIqT21{O4|#tcW_w>IU)#{vJDu}xD|ycOo_|IEKPNwqP6X5Tp+T;jR-Uf-?~>bDH_aW3Wk%p&qrsQN`R(NMe)js?*e?&0U&wuj>h3x4Fg~|ejL)mo zuk(tx--~g3hx+<^*SYlb3+gYg<>NVs_3kC#wcPV_X(#<~AJ0;=KGy=r(po8HQ$N$p z)0UxrZC8WeYiQg~BHy#m*Sm}Lo<=@p5f;d1hT7hmma8Rpjq9 z@%mTL&Mo9m%<%O-PQHYE`q$o0wW>bjaq`i>css9BeO4>=1*M0e`fsNvf+iUVsH`S&fn z{S7QL4P53?1NLKe@)^|MxWLUjQz`VC(9arh70b?6b^{}pB(Xat^Y+@2Kj+V0({zTOuY=R(@a zW*qP^N0`o5evV%UG(Lkvj&}Xx=c(Qwo8a)Uqe~oMe?`z_&98*|8JAO@{Q;JAm2g$aNi)bP?P){@(b4c{(YMD9w4vr zlh>a`{Ufk+$~bAwIB@%N$AOFgMF+h8lVL6Rnw9*?U%fvM(taU%>l?kkJclXioRItX z(boyoU$DZ*XDL4yTn8@xv@!n7rGAq|L1^X#+JAuj*=Kxvo710XLOa-xc)rr{wuSoJ z%e?{UQkQkIX!h{Hq(i{Qz9yUN}k%#^W({9kbh161>_6Jo1E+8e>>y0 zg8bnEAJ2O^AYLFpdz{yQkn8HJ;L=}f%(}5n_22bzXhJ(*lP@0U?Vri`q~mjy#Pif1 zp6h*~Rw1X;5pfFjZ~80<=`8kFfAYp1e7$>Ve-!yOcX@sJ^=V0$lmF$2AiO>=e08pb z{D!IC&IQ!Jk-S=#kHi1f*VVu{a-QW$kD^jVw24A;^eDYvNE@gc-EHnJy(CoY^{#iF z+PhoZcbAZ$>FmsSce?h>+{}2rrpieOsG|PRL68pKr!9c34HX>&KtJpZE89-*LbG7(APPz5<+in)cQA1-Aa2 z@k7?piar0e&U4Spi#+mHmH%^$>xZX)UDEl@JugRf{2MyY6YrLJZ2ipJQE-tw?|Mk~ z|A3Bvm*V%H7dgN6o$`TSQat*ejQ>lO=dFsr?URCkPw~3qPk&z4eNESGD}L#s$mbg6 z^A2#blj9XRBs%`9H_1HI$E2V0ivRBiWuJen>wboD88iLwV>`DQHK0GG_<@fu z^6)EFkIyK6#1;ITDxc>SfA%{v&!1c=tNc*$e^EYjttJ zGXIxl8tZ+EU;QP)Kdtz2;FL%1{1wSZ3R|ai{I~8E`9G&`bQHhtR|SvZSM;-`_-k*K z{a>Z$+Ee_F!;3ub2L2az&bYpq`t=ZSI+wZcW=GHaxX$y+!?NyY6~Fi<^L$6gfBNra z{5N#`4-~)p?nPepd0qQ|6u<2O!3~eS@;xHYU#<&o`Vu!N{?fC8o4od6#XojLaFegw zivRmlfsagoQF?;Cty@nfmr>ni8h6~FHRncwug zt~)IH{R!=}>2a<104KZs{byvJM|IsB6@PMF@MWFV$nc0}aaYs>gs75`brrzX}vZ_@Ek ze^bW4qT_E@{IN$CdF0hs$Oo2yQ=VGXIBfi)rQep|)3I01e&+%lDN58J0`HJFC{FCh8$p1;;^XiVj0#5s1)BT&e=5KVKFPxWoUefb^ z*UUeXbxpi|S@BB~8UL@kpZ`$YSrhz%;s>rLz0Cex3!L_|S&`@UiuWq`37!YvtNDn` zZ+P#T;@!)2UgV(qT}Sau?e=BeLSOOse`1M|GY902J;mEC!RdRA^z$jjfA^I|e!Z{b zzX+W3px&=_Q1P$n_`;MXaBS@A#ol;EardILDE zYwqc~pays77v{_PgN(n!dhwq{Zr{@V+@|>NJuK&KDBru|P3E}=IIpYsS()!`Mv5<9 zlDK5*qtEF4@BKO1|L1hwFDm}h?SkK^_@D7ShphW6ar+xOzqvp0ewEJ)JdeJZ`t@%* z|Mrn(MxQw>Z~ln!+5a8Zt2+MfcZnQcJ0RoVd4t50Yi|&_{iO2G8yS}|)BoPC8$${zkf;Qd0b#z1R(e4&@Z||16S#|&R}3~52H{oUU8Ew%|`t`-m>j_Z=++kn%$ml zu=JXV%Am=VIU2n_Ji#%?jQ33o=q?bKHYZ0QQvX1Q4)mPO}bpfi<;4C9Hr}L8L;U|kLk+8=?_&l z6?J^a>-lMhiRjN3ZWZd%MJg}}ZxiPDEl`!*D;b z5`P%&`M4O*r)lr<)AgtprenNQy=D$VfLfe1&32M#w7r9ykhV7yzaQ*lab6fQ2;e|V zxU^+AE$_1CW^}O)*#^I}p;oYtt70rQEUe#*+y-<@GH$rEQ)5p-$|}K-Zbpi4B+;;z zK-cadN@uK*ce4by#W99X9Qz(@Zp{h30W1l+lec6~3sw-h*`Ok*N$B>XwlRsi10xKw zNp2;sAME*s6?FV`G@xC>aN7`QGC3RIF0I127mNpxqg1Tb-;Zrv@`R(&u}O<&ITE2! zmyvP9oppe{fK-ZG{}Lzg>^(M9F>+)7xi~}iPSqD5C*2KVqkdXUv-2lgiKAaRE-^Kn`_G5?`19s>_pmu+oY_<{j1209SP5mV69Xm>Ak^nGe zgs`NtQwEVeqTn>7D&m-P@? zQy9W7?`jx#{1}!CixUq(;zo-c$+?rxQZg0|Aqy7n3Plz#Z;1m=S=@QD&*K4H z0p~Br1IpPh$1E>e0taZg@Evsm_@Cqzjo@B%#!rI&1p1mvFG3UQGY3O77cG3q5Q;5I z7#kA#W{#({gXNJqQ|S$kOeR?NV*njam=K;svHvHrBeQVSYi;3Uhz&S`u?H*k$L%;< zg4-^G6S|;#`=Fkn z7Mi^z{oIn9q~x5N)k8lz@{^YUhY9KCAe}kEIvmB&wREMfkTJeJ&INADMXtz;-nOEHgVNn7bk`lh%}*#EQtnC z!~n`v%P6_gab*CNyCsVaR|z2K=fJ0EN;{y$hefw>t>3)F=Vp@_*GontP@Tjs#gdz? zemu%5!G-8RFN!00+Jw`fHH?{Q&{_?bjs|5?I-8RO4X1z+ba7ZjlO`!W*Q0rVhV36s ziCUx9@n;CzYICJUOIJwnJm<>IBmo6W5b-#0l>#qkg`BW!0;aIdPGTY5fZ3Pr7v3T{ z2{{?uZ-HnEB{mMTDY)=d0W{5`v1#%!{9@mO7wx5zEXwo4k&3ECHme7r%?ht6YKlS< z8WLxiB*HNcxD+`FtQa*A(m!be)=6q%ii~;HWX{Agh*F9dB;}o%=!)SD*Z4|^SCsAR z-j-MZZikK1QR0{6JWoA&)ZO;O)>b`nX+xCgnHb=kzXH zU4g17+^ccSH8@Ii_`IffbQ)BK9-o}bWjdd!XlP~GAS{S4ATJxq9HnSbXI}%)Z+c)6 z$Z#SbO*M3OE{Yni;KZO(OQ>THW*<9b9)%=v+R_W!qoI&^4r60Z&=6;TX_N}7B<7sBI~9kRbJkNLJa#Vd7A}!Qi>(L+uataNI`I7&3eKDv z(heLnd@4Ct5}OHnMw{?aF072%u>;1Ymy$zH{={974Ac zd>2AMajvJqzKS3vu~L{&LEK1$9J}U)lVdskgi0ym7t*5Ygi;h)AOr^Sf=l%s6ymv< z^PFTD2o#S0%C>D>Gyha>JUyz}&_kdM0-B6&4$aF-TpsT$0I3lF)^`*boFz-V+r-by7|`8dCB}BO66Ew=W`6h(sI;E2bovYBhmd zt20*2f>VST2kD8rTWIvOoe-;0IjJnBz1bv@7R!)?$)oeA!JMMP0Oz=kHn?b)^Ho=> z9x3o7Sybu7AfkHcS?reOqup223C;ii5U7D^k?>gHUPLT#nQke@(b9;zKV&L?mirdC z0P4%~~l!+0a@MQdXXTpsgXJ|sMB#rI++Yo&!vq@d%h1-Ql?do?VXg+Q!>Y`5*CyVNdp z<4IW%=QI-*WO2PEAzibX6#EfMc{g{=26>=0rf#jt#oef%QE!v8DL4rgJYfh0yk>*b!rd|p-?4F&VlVS}87&%!r&=*|_E_#Ggl_Uj- z3B5$l1$bhAABA?sS!q|9BSlLetR0~q(Ueml^ai0z=dl+Ri3c{9l7`7OutMg`3f4GE zb{%wALoe;2F~JqfwCkAe@Jxwilntqp#E26jLBWMf?ZCo%SN5rC*Yy*!2(H5-Eohl8 zy%z1-z%`uP3hVa=oE*jSsFgc0CeM8M3 zdE3m`3OfX+JVUn(W6EWj^RJ>Es}_QacB&B8&^a6BEqQoDtW{KZGd{oMJ1#SeQlWr1 z*z7cw!z#(t!Z+#1u`yFWu!|=>4(eZpD7C{XsA)m)Dp*3vlOW% zzp6pagd>$Y2iuuO6om>D3)Hv8MDWzPRW8$@O$QGhP$#3fq>Z5wX!NM@6Sqs+YuIOcpTN-xPQ$2ur1~os*W0<59BI@&{p~5_zSRF@djaRV2^V zn!SE!4}a+4@K;U+^C(sIBjzLM*lFI-kFrslstyEzNJ+J}6B97{6XGhto#GA>#W-J- zvqoO|v`u3Zp#_Fz(!<;bawdo>NoctIU;}hviVfJHO>_+8s^w?|9$b+dEt0!AHb$wT z3t#7Qi%-f=tZ0bUpY!l)#$k(?4bzZr(}(he$gyVDHYKM_n}1O@F|EYL$kxq+reh~9 z&!-No5pc;tl;R-HLV9Vjc033&(z!5y$~?&N_&-LGxj8JF`LseRGH&5%7|y;qwIs@N zDoOB&IKxvLs^)mI{K2eb35^2?=&7GG2Wep76U;rhH9}N3HP+D%+$5rtVhA!Ux_}@X z&S3IuesVU*cBnIepuA75PK;P>F58VBshcd;<35)f2P?2RkG23

rzxX83V%9#pJO zkhFb#jJbaiGxI73wKo!PIor;0VM8h_ehV>R*G%rfHSlK_Pr|^L_&5kMs5-KOgpgpk zRx`q(bdS_KaSz|`{C#B4ho8h@wu`LsFEY#U3_{uw*4cMfW&|3x#l5ZG5f)a(hcupqm zBirZ1KqM0Hny%d@VjdOoXUF6*Ma$j-l}IL>XK1kL`>wME&k@_8b~foC}1QxZwH&Jbbhw- zFSg`+p0nPuya}8WUFsZwBEqEbKxpV>Cy#FhFjhCfQ$lb{51gxPLJ}?URU>2?b;j9m z=+J{fi@)%ra-h`4K}Z(k%p_HQAy?C7z;}8^=}vjo>B0z8B6@eZRH{5SHklf&MvS5& QHK(y;=rOO`pMJdhf2cA;f&c&j literal 0 HcmV?d00001 diff --git a/binary/Solaris/lsiutil.i386 b/binary/Solaris/lsiutil.i386 new file mode 100644 index 0000000000000000000000000000000000000000..3f65f77abf760b525d526ab6802c2e1584e5b111 GIT binary patch literal 489584 zcmeFadq7mx`UboQm|>ylpkh&4kzr|Bd8;I~gTid2TY0q@$*|}r+XOEhpF@g#F312wy%Hm@=XuhG?HGwMarkg z#mn|H+?w{({Tk%s$D&2y@16}dke)tGRj8+HTGrPE1>+DmPPIQ6`AKY_bfM2veqpg| z(S^kY7kJzkj6#%bGa?u8py=_<8)9W!t#vWluLvKnkI^PP604mL0nVcksvO6|{9!*h zhEjO&IF;B7yf-Kw)CbfT#Bt%+4FK_z2pR}FnLvF`F#?JYQk;F_=QPmipk&aQAmcN{ z2!NlZ!YSZqo8r$gh0VcX0Ox|vGe;tPKIj6_g`kljemH=mLDZRxLB{721X4lcRm24F z%TzcGd@?8lU<* zw}4lxu$kQkuv$d~6~7%k1iAxsC+IGa`ExhGdQ-$brf~P*UlDPyio9R(zbXEJ;$#o1 z@I&AagEoL31M#yF^f>5A0(_nVJp+0c^c?6PpiQ8EfnEgh^Acz?=oQcw(5s-=LEAt( zK>WN3YLp>OdrNVHy^X*w(7T}bKusWicI!<00Q_SWCi?{RDd=<1K9KqIg#urKH-q+r z4uZZ08J};A0Qk42usPTc@E_3kD)I;LA3;BZ{;T4Sf*%7N2X&}8vR^^JnQ$kO zpZTT(U#`+K!DoPGDm+VZ=F38OHfRngN5x+aehp|I=vvTx5I+mS^Fa9^C#Vp#7~}%+ za|3uW$gMErZdBoNa1Y3n)MTNI0{;J}yE4~f99<&{_1JnR|6SNcb7U*q|@p(sucY(hPdJohD+70>u^daaY z&?g|{^C`k#g1%C5&EWf0n0XGWa0~dirugqn;dX@oqwvqB_#>w9QG}0yj+^2-RQNaW z-;MYv_z<9IPz=Zl;>QLqKyjd6pmIdQ{5qu!%B!y2_{8aEkpuq~C27ZPL zvs|(Y4^cct@w35)tFU5We~jf~`R9Lp?54E-rZ9siDV(JEsfwG~8D?M#4>g4u9B#rR zOyTaqF)HFBQ^GhEzSI;qQHB4a_$0;CO?kQpFYg`!Jj)a}TZOX~zsi)x;Jj{_Fc-9t z0rklTFE9Z3Vo(vtWr`~{g^l2iMnG|&2`@8+Z#IQjBD_lBD#iVZ*MQ%u!ejx^8WT2x zYY|vyfIs2)nd1L$3Y&wE06c1rK==t0e%cgf@Og#*srUzI|%>Vgc*Fl8~zY@59lLP{9YCQ%oJw?zcK>g2UNJl6vtpIs15WT z0X~Ox7XEu!g?>`}NH`@DIH7{SM546cjj#na3B*q{c#I0$6c>u?IbfTB`W^}h=ce;p{-l)gxX3rum$ zU8L~!ruY(sOBF6N#hcq;c&SQT4t^8pW>emkrf?O)x0rB^3f~648Wb?4-LArSfUh;h zv%R}b_^&E_pDFI|rZDsKvjK6BfF1=s2HFVX=LyB1Qe2OX{QXA{@h_^lmrZH4D!f(k z*A#z4@jAsLHS3|q9^(JqE$;npm?ih9xQ`XztN3T&pM&;+zEE-IHV>HMzDD>Pg_)x{q0UxHq=PGUzPX&Fa^D)c zBTo1fjx$xj{Pu3x@LL$o^da5S&j+q7)$gdHa9bmN26qI{>X!eS{{wfgpFY5*hB(1u ztbcj8@+K&Q>+!epv3SA#yq}h&Jpw-Kd#mtcy!xX&_r}RFvEpI$pSTWqPVZQ;K3d1S zftx$x1@{q_=NUEz_kdu?ub*EJdadGCm7jaXxE(@V9HW=-4Xka%of|mICxH)t$STsn z*&c27(aU4S28AbpdsF)e6i5ES@{IP&9ab?%rOyYiv`5mNz&BnYM8CdzeHFloCi$v? zn+Nm}yp&^ocLEinkT!ni-rFk)M8i-8>;W)p&6|ILfVpcLXdieQ`^l zaQzdIKImhc;JJ$FQ-SxGl4@_o(^1 z75H3Vte{LY%#X>OZ|GU63ruq61IOB%M_K zxG+xiR_pyZ@FPjFg7d)ie$ayC%0C=<;V`Vve!6~L4E)#3Sn-3JkN1#o!?zK8 zI0@-#hhxQK1NHjm1CJdZCm!ytV>fW3seeA;pK{`aQ}t&ZaL4VjVx6l0N#HuaO-xky zMc~kDLY%7PeFM16G{3um7aorn8&Ds||7+ln*V)8c)t}?Q?;aE)Pqi0^aoA|mmn7il zM%u(EHJ_t^6HNLs0l3flSTRD`lT6^#p0){(!V7?tZnlXtlzcAWG?drv{a~$}cz?X8 zRPyz9;F8Z`#RK51F9dFUk`Z_oIN{AWS-wA> ze7yi1JYo}tYJD^SZx2|-qsYth9|C{dH&*a$Mf?MBnm1N_r_z4~PLApmp1;1(<23BA zY>V=p1N_+PSixrvEI$^w4)W{zkfcon-n&qU7dWm+pAKBv5?O!qfEPB~#FwgkA#jFi zK1zYN53-3%p@%HL0(gwaD(+MHZw0Px!G5gzcOUVyB5a?Y1RjR*(BRxaArlc>ZPn0l;a! z`iL@B-$>vErPyy(eUpI`P5L<v12(?MmpQ;ZH0?dYNf` z-UxifdYhK#~veG63%08?ie#R=^ROx>Ow&lTpQ|ZqFm+lmT=V8kKB5)M!?O~Pw zP2f|W5h6yVe+Ik^{w9*;djAS|ZC;%C0t3wQ{{cQ)7ALM&`8$DQO!FyV=YQKH#Qn8yVW@TMU)5vS^(3H<48vEm(-el749 zf3=DhRlXdU&*Ay(jpdgE?>>sxQ-*byq@R=3c{~7p*$v$=f{~P+eL8ZsXW50m@ z@_v)~PX@l#V-vh@BR(5A+cchIfbYEBDy~=kNeBMLBSddwe1Hqb32{iJ&joHQw~0Dc z-}S)r+GE8xYW}K$7n=6VyMZ^v_L26A>*I0Yb^o%72UPtp1JAuGPVml#^1TQA6ZQw* znG$~n+zfr)0L=33z-fmg{*Sc}64WOd{3PJYXX3?3tas)g1$_H)tGHj)-vqs_`vU$F z`or`Lq~F(J6Dw5ub-=^!vx!D!FFe4n&5RSDsQ%prY=6%xeneZ8?-^ipN>qZezL$X? zFzsir0?!x+e;5Z@*&pB)jW+RjWzW6`?(o_K?<1N1D{$lKLR_H6yBE$`KmKMDuPOZ+ z1ibJytY_q7{&Rrq?}z`b0$kyi+<4qwM^g?lf9S&eDZrXahYoWTHvjPHt~^a z&jY;R4D6Q)di_D*9q(JkHYMM^z_(&Q3@H3K@QiP5qQ8>wW#G>qi|kK3f#3PkCV2lu zc@F?5K5rFItMZ3{t4;gyPrxhQwTin{dM{iEB*Pvi19N-_0q136KZG8zz6*I_0RPvp zzf*w&MMAu!R( z+J6)H=RH4D^JB#)s=x074|&cict6hm?FHVD5i71z?SBWn)@2hvDt(N@xnNsjtT>>`p9b8! z&L;Y)^*91}y=lFT2L5ntoZz{V^``@;VSO3)Zw|2WNk-sC;JG)(iaLau{}$lB*T;(K zYJCKOza0}RjwyLI0=Iu=6?|^N{I$UAP4@V8;5APRu~wz;0-hda6OSl)_XGDI5GMvI zd+CEcM%lOP&=IY+@eP0qZ{vc+Wqrf_L%6=L1LYjuqooedB?Df50lvQ|YsS z>o&n2Df@Q=a5L<$VeeJ~|BC&H_fxE|8u;+Qi2r>T@M=HqFI0aw02i3T48+KX6KGj|;aE2-We}G>yt&bzXtNtN`P4(|L;JR(`q6~fj z*Z(O4u)m$KiJMh_&jr?CpLVGF9l*&ZdzT5^ccoR_rs}H!A8TrVKGJPIA*xjQ8-VAn zi>$w!fO~DQif2{&8er`N&Le1_@@xdYEFo6hsN~rOY{&SttNgoxn_-`tftmjs-~`ir z9|vBH`MXo)zX3=J&gWEMccKut ztNFw%YiVH13g!t^JAA2=YyD1~2S zdRnYlquQ$nwhXihm%<+cmq*8mZ_zK7{{eX67Mu@}&i?eqIll6=K4OoY-@)3+z?R2j zMHc3r`Og7PGx^u!fJed}`BeWifSb{uWMI~p3w#^qb6|>I-VMC4Pak>T$@JyGC1tj- zKM(+Z=}W8NvrxA8DDX9X;>2CbKE42a&yvXf#~aLV8lOhsdBP@6QugZ;;0BXEHv_L% z_gnq&MqvkV9nR0AOwBAB|tJ<4S{7%H)Ed~C5MVx3kRjW!&@3-fL}6=??m9MVE+w!Jq`GU zVK%{Mp>qC#51H)ueBgyxPZ%ya{sq8s2V=#RYCrb_r@eypg8p(o9|Asx^9J98VSO(H zdrjl>I&gDzAF)a0ZvxhEACsl}^EGhIzar4scmp^M_ua<$?F4S`A1BUH?d<^;%OmUS zTi`m_=VYX_d^Gg#K9fHZ2mJiYHnCFa(@DS^P5OR1aG7a;JsWt1>HIVT7>63ccahG- zdKv?KHSbGhdxN#V0RPn{#4~DrWCQR1+$J7Z`cVk{B;eKD?Aan*>peT0DjgXM5D6TS-?XV z#)a=At_OZ_q!8t5d{zSAmnOsjmH%DLi}^nDKBTWR&EG@754~*--{=1exDMx$4Qf5S z3VZ|iLp6S{!QM3=gTDeyefSo7oo(uWBl2(91AB%3F#RC#zu=!6>){Y^rRhBRHuA-o z=HtIeKgG0upb}aW?r*ME^D_we$D=keLe0+z;0umf#dT`@Qi0c-*7qdfggbEFRr#NW zohUG+&q4YZpTPd8^u@r-O!~P5*i&IzZ@_<@7%Q4p{x5M(tHk*|OO40fNH17p6(6bb zdJ?!2;zl@WuPpruno1=X`|zs{D4~N>h3w@RPq||5M{R6nN;!Sg~E<%Ybh@Y!j1J|FVE@ zy9?)KRo}J1^KP<=ph_HZ?GBn z`$^hn;Iz*o{^y6l-^1RftM>K-fAEe~@cj|?|9jwBcgKo1lzg4Q+j8;zP^H^Xhkxje z3(I>B@MZfW=gU;!Z0I+(HCf+e;AZSMm{!O?Sjz-1HrcOhfUm;-zFy^b0WU3%6RTAJ z1Hh-@{wr6d-wRx1(x;8UXTrW1`r_@Y}$@oFv4@YW`b*hp&khyA}Q~@JF~mctPdwlZ^YdEwQ4n zvVW%oKe^Q^{-e?_1Fo4BE2=QTZ2wB&UK_3Ad^KLz0Xy%qiC|1eP zs>bgwU=9956By@fBk)(xMxIB!2z^~d?KJy77T&n&b zfOEgIi3-)Am*p*@v)0F*JP#?!9wtL#r?7Z^DPOnzrp5ZQV6)wNZUF<7y0%o}K7H8yn^K#0H-FXF?C(o1X zTvnD>THq|tEz4W%%pIBQ@;XaAnx`C*8tRzoD_P_$pH%8u>MTbEbIXxFX0*oUvfX;) zS^;XEj9xp-XFC_WJYJb|imSY2XjTjDDBPA_#)=4_|Oo9-?xbS=(;NR#rtE_bO%D{+?Omz3drRlGbqZ&9%`d(=qH zQ{-McC(o1N^5nahILnti%F8j(6gvwomwGjiw>-aWIU}xddS<#+HwxWl&QjTVmpj*o zM!WVMxg*VII!hOOi}aCn&T*D{oSM7Li{aHg`BR+`xzNq(r?`rpGcmQY)-q?ghr>|n z&2<&10WEN+7d!LHC*|j99#4K=X(6hdgPF+6^LV^PttcmnuOf?3-z|GQsRKHQi(!-*J6qqPoEk~>PTqg#> zt1a=AmAgv4gjG_)IQo6fvRdFux^ho z`5e@$uhTB8e~cRDaC;atX7zcLCY#q7^rYMci<4W*H6I?-NnS7QTY)jCu*YT20y*6f zYL*f}X)45BjNRa>GR%T*M8a#Oq)cjndGLC7J5<>I+$)pNOg;0oi60%8hG^%UN8&?6aNuPRszUT&dgRb>+jP_=>rr<(N;# zv|-32b2dqin>2j0VQ7{(GtqfhuB#MER+^73NncgmaSGUH7*+~M{ibUyQU{ps@J5+aS{~UdbxVpFah75mbeHDRm>P{5=0o#Hvlbr0 z++3rET-~W~L5p%1mCDQil36aT$*MYrKT4AG4XbBqPDU!M#){l$SqBD&6taOJy zD{?oY!s9b0&AQ$dbE*7T;8wr)b7_#i;WhT`e8*Vz% zj8r{#d7IC?XnEKg4L?UW15`T5)@2-6k6d!F_LGWTa$=mz zu#tG7qb_}k!g#t%%3#2x#=tGgck0`wvG$;6`fd;X*B2aWgL}r2DJ!5W$5!$^F5Tk` zPqWfkByyLHtP(CAZn#Nvb>>gGc#EeqBu5klnw1QO3^PW@Z6vrqsX!}>2sdP*a%#hRcAf~F=~OK zcVKzD;D?}3R~6;EMOw5OWE7-4n)%`)z3VYInqg_y+EIpYl6v1r`LxSj7VL7rOz_M+>$gTSa&e4)8MS) zK;VYaSE^7T_dL1am&uJuuSadUf2@a7h*(Hi0_DqgyNmTx1m;5eO>!;kJ~Z8Kh}G2w zNkxYnBnMNTag2=-Iy^OV*5pZnUQBqJpQme=dl1%%+?J!dxJVTG8Z=P4LXm$yKg zX>Q@(Vs574LCr?RYN+XScCmGo-`GFGvQvljiO};JJ`5+?urpK&<-Vxd??F>NuuihO zMw;woVIKB-bQ-qU6K)fJx2K>dl~i6dCo;{@d?cH*pKjNCN07gn(xKBBiA z|090tq}-WTbD_>bK3D+bOsiWk?$(*E5|=a~QqC#)(kC*sWcuv%bT%B>Rc6YGD_qLc zG;M^kB>EPQVTSWRd+rP;=1vx4?r;|i+}ysWa8-xBXL-2NHwxHto^oV4N`bxISzzp9 zQM4P@WtNl=+& zxr7ZbRN2bHLTM~>7_Y?#Z$%>Z_rneNgIr_=+}=*V+6M=Wea3d^0) z`mp7l>oQv#IA3%Wq&dlVm*&G*mx9m_W4oETL=I?4-ZHiJ(S@E?B==RrF_0@18;x;$ zVP1v0>oB?}Emekdw8`C4c3m0X$hlZvq+sbw2g2*ZiJz+#$BoD;LY503+36RPeUdKimTV=R{Hw>9c4ZJf!dFuZBu+04AkRYx zJfq-HDqRJs_FXRs_46GP=IEtl?*ZYrs~ud9n!M|gUb%4));B#EqZ_o`tl2n#WaP|t zS8kIjaH#fc9S2_dNzPzl0gI3_YcuMY)+=!2< zYrV0HN%sWxz$<~9>6O=%=IhpJ&Sl2@NbjWE^muUV$P<;EK&3}AY}g>p?epT2OFz>7 zVZ|8NN)hFzDOc_|_V=uEXQ69Z*ga=wl`)el#%ZFK=)(th*n=+c^aZ1XS;SUXj)O(G zxD-rBk!H+ipB@zd66K5P7iP0yH*lU)ix`$BY~H1%(pLjUQ{O$M0!Qu;c%_A+k-JTR zIZltU8P0I!m%BM%nmp9PGI|PdNz&cLksBOu7G$m^rlYT+!k8230_J91Gjr06>FM;A z%k(o$Ij=nR{T5O>oCRf4l`+!NRCx0iOMU3U^PleVE_LbM>S_5z9Dil)&G$?&^)wbR z6p@oc*cIx@f?{AeLEX+ta=6OmKEH@=zH!uXn^%5MgJ%qkym&EfRTvACweMl_)y+We z=!=v@y7El%!Tq2vJ4<=z^jSHJ*y>D|^LqQ?b3vDL z0t(P78m4JBOb4b}K4{Usg#zinbzc!^03MphaN+g3xdL>vkm<&w0d;WA&CSKZc?lZg z<)LyJ<%VoDipmTxg)3J&ug-G%!t?@-F2PXC$2{~%ao(f*exn@sE^A-iHNYz9Pmjv= zJ3pS!dr-DfCbM3exrm2)`mb_9sw+eN8jyRmlzCENp$m69tla1d^Z@64!viv3hHz5K z^X06lB|4`N*M~d~cUcF@yP!p$?ZkPyG@T|%ZP6zE$HXsHJ336XuPl5X(C_qm>Y!R5 z+)AY>ro(|S^{Ht2tkPM^9mg2*RH`0A!P9_FOm^p$>sQn_DCM8*%*%%<=7K^Us!PT_ zHZ{+KBdqg}p83=+SG<(P&>swUxyKn^i2C&ftVl?9DN5q0#+FZ;_;52cc)2EVzNvnV!7d>(npau+L!tb<4~gBRy(Z^>r`@ zW2qngJU6(?pw75uR*wmdYie~}(e+Uo2ZmkE;`6^5;adrq9Nx>$$eONhRCAdK0>_9;MT6bKympu(gcu(-)e3iQd_d>aa;U%Z*ig6q=HqFUyH}}-(rPpJT z;p~~`Dwii#xjK16pnDL=GS~b7Qy#>oD`Bw^p6jgxYbLiR~^I+SAlg_dwb8N6n~1-}?;1 ztt!Cd&N+DgpC=!LW`w(r@)7q$ZckdNuY|q$Nl%lvp308RNmsXI6v*`U0B6Op)cX4D z`bY*A#OJ}SuD(ymJ20Hln5C{dQdyH$)oDW<{q^K{3NTK^d8 zDQ_e$68d9F#u(`a*JFCpfk=+-HT`)?_nZ+NDH91rQvW>kzjHGc-*dyC_rS-4kBicO zH~3EAt)O_|PY}=F)Z@GD{C>;`5WiQr7c>;acdVBqjlVU;-^cqAv=DKZgMSP@5uCr{ z#NTIo7?{6tG76l(9raJ}rQrL(@rt+n-EF?}%ipg}17D1^(?Rbdd>rHleGTIG`Yu8q ze!rKmHs1^C2RswF62#vZ<8Q;gfp~sL{%_!~fuDsqekU~=#P4GA``s6lkj~$p%Ll&| zn7@HL4&h@U{+7=&&7_-e+3Oi_+pgXjPMNzCxN~~_%jf{Q+)*dN>C}n{En6%{5s&Jpw~gg zpud0`5kDDxA9xu!e{Xm__-mlOh~xX+_2B#-P(1h&@PnWgpnn114L%S29MDN1{)TY{ z;(iA4UGH|pT>#GaxbH-G3y9w-i2^-^xZl7}2E7S-4wwsqzZEzJ!5h<_AxHfRy>8t~u1zX!hn^bKe~Xdx&O#NWWd*JCs% zh`+f!gz?~~fu9c=0a^>X9qEsN#)7^E=69>^LwF*n8Te_?8iX%I{4Vf~py43?=GqP5 z1Hoq?&p;5rmw6bx1LQ-v4>-Tu@&Nc4IgzXdu2;g>+?fqnsg z0-V2jatZ2e06!c23&dq2>;jEMcn*la@i+>2JHnrWPDOYR=y`pjShqzNfhe00!PY168y$U)2{0;cE;6U-1r>re0Y3@ickrHL z9Kv%!--31nyTNCH4+Q7;4t5|cKvx6L2A>3a26R5~W1zbbUI%&{^eFHUlz9l@qo4!8 zmx9|sFC+Xu`1PRu2&aQ$koP=LDZ*Kxub2;XI>Nia4}q!?{ti3^`Q8N|26_SXBjT&T z&jjxTzYjD4v>B9)yk5k=0-6mv7c?F59pE9*GSKtDmx138UI5~6w!gwK;w}R}AD9#W z62gNK+yVL(zl~zU#&LukhTsssOK8~(PCUq>wGv~|@;4)`r$T1(?;sC3CYIk7w7!N4 z@tsU7gx-g8u`ndfl&UC#T`TzlRfx4K9WphF6e}v}p0<<1JbO z`523qNWR^oC6Qka`Nvu#>&gEOogjzOJU||@XdB33 zEH}z@i}n=xBCG>)81PNxm6&t#n=M)`IX1}G$cMl-k=tN5$P=*M$YCURk$+;*n#i|9 zA1~U28S5On7k@EpTIW#CG_8`>*4&BDP|kP})7qLO=FAtNMy;(*VroE967eR9sR>2N z#2X~0MidPrUMI1JmWxIbS4td1JdU_bVnLinyinqJ;%UTL5+@LI3AUw4oJf2%@koi2 zh!+wkOFWpE9coLEIGMPNSd%z~cp35G-w`o%7;zxi?6 z(xkd z+(euPjCl)xu7}qUJXE^}8EWdhakE=5L_T{-A~&14CAB12PVlZ>`+d8U?9JkK0B+m`IpYl*0a!jYyY`1 zTII@kM|Lobthxcr-- zpZhL`v~S3t3E|o8pE^1_8~v=_;%`W}_PPZ-(Egm(`N&wcW9LXVpBN0Lu-x0;l#qWJ za&qic4f9jtcV?srB+J@fLT$mj(~zg;1Mk3~e+0|bd3%RsTp%%}v&r9(c!SR6a*Pu@X7sLm=n3BOMtxH(jK>nT-YAdVyy$QR$uc*EEgkHW_zm?xp zwb(aD`*&EX>wN9w2Qp&Sbchqrj1&tyv<4o7LDzQ1q};h53N{LrGL5bS(-M#tasmS`xIly)N0_()C2BtRj!^Isz|fqSKz53hj)FXa zenJrb@Js7mNNyjb^7`1A-ndMx0j`|*6!IneVjHatjP(CvIi>DclfU`WM{9v=nbF^n zf;r>r*VJFtCrB0auaD6ue=2GV`rlG$xj9b3S*Oid9OLT@(jB2 zS}^88{)8^nMvlc@7)eZV>X)m&d4xaxYs9x5@9cbp-!-qPTP8EUg$Vyd{@S7D?ehq~ zHO$f4E@Sx{*No+FYccjY8Ov|FGnT)&&e*@oSpI&C<{gazq%^H7I2V|94(#(7*hiSo z+(VHN1~;In>X)&I=CWslIYN%4R4c!gy>e_YriNeF-?jr4ZNUoE0*yaEVZXQDe%JPK zyRl$kwz5;CdU3GMMy2hkK}VvRvp1=~ZfplZhptL8yId+a9D`ES`QivLOSyhoh zCFiEC*&R}^ALAMcI^r8MqC2&~S2Ae}2DtO5e;nKGZ?gp6!YUtb-<;jMv$7)@#;v25 z?^J)Qr7)4KzXqnQE6z@0whQZffmn#=Yq_-9EL0+NxMFv-FG6nv3tEB$najR8@zm-M z?Ca|T?|Ty~J4Sfzse4!c8l2IxIG7s-gW@PQBSqsQB!BH zz9Jf1LFXyhcI`C}a@SCc;cK+UoaY=kK)20HPrGK;&%wJF8RnCLV1Y z!gjGYFC$af-u&`21(2pH+|x&4p980{ZVV_jZW!zS3+smMnht=tD;W11NyJ@4|Jj*ZBr)qK8kf&C4~Q%5T;xH*XNW=Tuf-rxR4qV4D{GR|iWI5xKTf;W}A zW7W3^r|$3#4>>j%HLp=MKZ2U6NPU8i4dWeRg>}3meq|EIBZLgC^{~rr4?v`C%b=|7 zQGuO-wvx{G$563rgWd5IoSg0x%hCmGVM zfSqf*8J1AalD}bL7aJyrZbPV|$I z&gIugvwOL;TMt0p;zKhw1~PR)URHvfCk3(i&XnfMVqeRnaw=&_EsRUMD1I!>2zoMB(fTXD#tSAe2g z+Xwig3y~0-u>l>4H<{xPR6WZ1UqRm1A7Jm$thDxTB9pAS zja7wecohbPl^*HaNUNz^K8p1r3Pnz^_$E{FTiFIoQ{QkkRTRLtE;Pj={c)!6q_r?A zUC)@BY&4U4*n4qAvXc*@>Ks$m=P~1il-3=G^d_DK*KPcnZ1Dj=uG?|2cfosDUm&3| z<`VhL2M50+LErIUg>m+iMmiIX;b=UUR7o z#r$Zm8Htenm1(xn{nul(3vtR^GPtnn#5&D85bRF4jbQ6FZ!Fk7n(uPt?Qh?F^-1*y zF)nE*qj~%0y-@o^`{o7+l3?Fl4;F9V{4Q6MS_{dQSPL^DmeH-PFrxNX()tJL{rm06 zm>8%ptZ$3a0qWT0-+u-zQek~-AAfVKsfV(vXj4^g+T*gAM#n)d)t9hxp?z~^bj<1* z2jTf=SDqN+omF|_GVkS;Cwlpk+tclvR_VbLu5F>Dk5lAosu__>)u}s5WM=r@0h@B2R^uf3~ z4pTXJyQ8db3S2UHqxPDAA{onta^_IZagZ~pXAkPxk#Yl5PKASss9;u1RmZ%?znkY9 zUA0VrKkmz~S{4sJ&o?iab2wBUUGsr``cJrS4E!t|JZW`mj;=br{Zf|fP$d!c4M$1v zc~}b#(ec>3EvcXRj^b`10jrHNWpbr%lvY??Y7P1p_8H1(x^)X8XW$+Gf!}Mbh_C9X z!e4te-;Pn?wFxNT?*{dAJbU%qGGX2-yT9XVdkr2BYFxkJ9M{>apOiTk z*=z36i&9d5hu2&p}jGM^mjUe6LMF@b+SQ2J zWUcDBRi^MEz8+pRx~ju3<35vdGJN}cGF&a=x65!1!!^(2F9gsVq1$DzeoQ7ayefeW z+{V}%77b^-6TrK&s$)I4ujJ<)RUIj)!Mj-JtA?xk?q#;QRUPCjW^J-mb)3m;j;f9! z;J&f#7gu$pG3ElDuj*gbaW?VkRUN~aqkns1RmWt;#8-7pA&&`7D%in)r4Pc$i{=D% z(Yzpmt3x?EcfvyoH0lxY^gJpVv0W;p|Cea5Nc~tpp?0|wmVUtqIt4y#B{y5@zr|J+ zZP{7Xnez;qP6Nk{lW!o@eHqpLf1Kx&d)7q`b ziZ>A&`7GXheod#m+>>RBkq7yknSY@kPN+gS+bAm?6I`ec`E$=CmPWI2)tCN?M2u4E z;fm?V?~v0;?I&AB9$*stmUlTw?y$~i@sEt4a2sY%WY3^^g)DfI`G+Z6?$ z&R>_5+GxKchylmNo@Fnhr1#|$y65FR(>x2`z+_<-%2@wr2+O_)b5P`_7%jm&!kl+2 z(vf6;WioejPWE~hdn{Z`-tqF$g8h}sf59>_mtMd|eVhb+gjw%esWV)uO;uXQN@s>E zMT46sCysX{b}e_lDu*;x?l8-pWG?s0xYWj#voO>aIn)C<(j8Q7-(|c9*2gY0 zIw=&72XG=O_2ZRi(|v`b=xC`Nm*p+3TxLo47FEJ&^)9Mh7CqZ%YoC|e=)KB3G8?`z zMuu0~9GRqBAWQ(!`Z5@1&Rx#jjuw@38gu3vIeD=XzE+i+r8?OJeeuBs2|=5EbCxdi zv?R+r!QP>pl2YHV$hS1hv2yD06M^`YR{MU6m>7r(4jA5n z%ltqBP%tXk8_6BfCmH@H=P3qRxtfD=)@($!z<9N>nNAfj9l`9BL~LFHtA2;J&x3Y#=qd3(p)tF~=J#1-JznN*x7Ma~-uzhU~^EBX3;K%y5Gb}&uJ`s3FX_|fQc}%2lWUe5R%u`0& z>OW1UYPGq#RNbZVRTXVlAXRVe=&FTnd=vYRVyqh7mcoR?^{r=E4(~o5*p6$pJNg+V z8)MS7#*B1JC-u6?cew2snnh#|BcCxM4EW+JJ_DnTEDNeb9Kyk|4vKl@2h@n&uEN^dKrZ$(#Q4vRJC3Dx;Wi` z>K!gesQpXixV+~au_}kZA>KG;NKKnSO~b=QM^hkY54;;%KRlP@6;U$erBMpa^cjiW!V342joqt zJQ1~ZF=Dq=;g8+18}e|%;FV@K@`*B9&S>m|UDJ3nw4OWXP&A3Bn3O7Y@2cA&iS#b} zBARg%EKB>UC#HNZWASC;p&g%&>f3Z3t2po_d>~Ydj>D<-_;o5=tW6#)Gb5zQ+?Hmc; z=h-(nqX8^ASg{9_G≠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

bd6^ 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�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%0A&mN2g0ID%u-xYad905J?8YFpZEAT8~;DSZok(# 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 F{{SmRvXB4( literal 0 HcmV?d00001 diff --git a/binary/Solaris/lsiutil.sparc b/binary/Solaris/lsiutil.sparc new file mode 100644 index 0000000000000000000000000000000000000000..928bf7987e649ba7618bb8faef6210e8f46708ba GIT binary patch literal 541736 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

6~cG;yrJN9>kynm_X$qiH?q5Hd~Ey<J-4?}DC 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 z�Zh`Zs-Oj;`^#ahi#zDqRTnj6H)|2O^)v(opK z(|>S1u6tvz6fP5gk?7z@4>VLKg_|L*7xeRqWK&vxab8dz4bW(R&XRsVu%0OWE@O`_HsOfp7p!R8 zM;c0!QO0h<>KQTV8b7G-sn9>_IMV7Q%iG|u;Y}|0`H&0F&SpjDcSd6$>x#zkK^XfR z=JWem=RdA80)2!w#zh;!!EaCXX=4F<9AxpwsH^Vzy13T;{x@1j8v_1%8s%HibqaLO zgSGx_o$r7)6_IApmRs=~%B7!C>SAq8#0ZT)bNX3o(~NnUH1@stm7({-W4!;7#|4HS zyv!OW8aPX^N!NYl7&tE8z8YN}b_JU6_jTV*p91%rh_1>HoP249c(BV!h?iQfyn4u^ zJDleFV}kAAzY9lzwbRNY-K})CJJDZu!Rznf95ryRyNJBV{u378`WfE=txfnGs#Je^ z=f$~`E^#$$&_enBIqdQO!Sh0swC=%sgn-K@R2RDKilvt&BFv$!hi3LX#F!kR+(E*l zgfFwk9DaFduOOe~XR#j1E`#;x)nmE6Y}}bm+J@YE6qo)vQBFOVYh9xMCB0YntPm}s z|6hQnX>B@Rv`X+{D?R=2czo01(;K*~T*^FX3nw)WciM0jaS^>A8Q;@N(}x8^(ibT|VWC3vke{|O_u}%w)S_{MuCniW{kX=Qx-JA4 z2BBj$jKQ^$4+`7qSw6Z>PHe{qce)e02rm z<=?;akHSUTHoKu(W8j1ub!JNTiV8V*#oVf7OlQ+J*&JQ_ChPh_uCBQAVN*_yS9u+K zPH^J`gg$PJ?|Bz6@2}6Ud(q;?`+eLXUFV_kJ(q1nMnHSt-HIh^YgxSND15{>E-?6F z_=qh<246mAL&Hbt{WtIr4_%NEz8L;tYf)Nb^0ziL{Da<^=LTQ4GyiEvKkez`$%yuTkd=k3OuspZ&fIj{J*o#K55~UKPGFyVT&>=U@Mv;!S&@Z>-57 zt#?T`<6Oc#QyI1#{Qpns_t$jZkuk1Y1?@VZJbpZKKK7qZwd66{-?2u#SN~}r^z9{` z&Gcmg?;>8dcgw)%)0x|sDqVvw8;m8wtkDskGUC##-D$IS#}d+4>pZ+o$a;$$5Z;^c2;pwRqlBG=qDk8cUncA#Jk}6BM|y6_S=m6G#0*vb?LqR z+`Fi|_HKPgtU9?N_AcU1OSWZX(-l>J_3lD1`mRV)j;pqWlWk52d;8;x*MGIS*VKc* z9o@m>CfNyZe>a|$ z2oYB!`u5<$xbYKCSs_#2ri5r_NfNn^pPsZa$~5*#{43f*d+;NPz4*QNbI)S+zy(PM zIYP*^!N4ybopWV&hu{TFC!}NtMO#Ua{C`Rqn4jA_vpY)&uiyPT;d=>R6Ru&?{W!LW z8OF7Z^cUV;vd6Qz^yI$GleHfQ_rQ_`Z~&RDFa#a z31$2xWz3_DrM*`;&LPqrn%NVw>o9hYD$6nS(w2pt{JqndJEtXEW6tcj@uB{B?-hIl zM_^JWJZ%WGC!3ehm?^F#{lLy06Q7y?cIMgki5r}Y@fVIS$K*xq zfjTGF$YyjWd!9IW-fZ7z@vd_{#3uy9)A(M&JwV`y`>}#}2zeW}#@_c8^x;x?uj(W? z0bZUa*fta;@i`u!Abfy_u2R40OXt4GS6=hh)O&w(cWqksby4Q%3U3_O?Doe1T8{m3 zQg&cF>$CShE8d%SOc5OV7|Xu8dgOq^;JN-GOPpdBBs9&bv7u)X1)LXChM!1<*2Kv7#+6#VHWiUU-^wD0%`YOiu zeZAxNtlvv};WIwY_q4w8d+xL2mZD7VVT;MvxhWI8b!@x7Xv=)W4PX9;RDrptS+H0r z{7pi`pmk-e14kvlVQxE3%>U)AQ+p$saDxNwX-kLTosT2$DeNPi`o-8EZHzhGMC0HSnWM`eNok{T{3SlWsEUPDiHmyz0Z(z28o)8)wsY=)EKQFT1w? z?kjV&W}eYYNL&qgU218Mq4j*@huzR8?O#iUCxJ1=Uz)*__vGM3`Sj&kA70R;LeV6Z z-)HJ|srU7lL@%hfh&doUD^#c_Kr_nUm}abb#?p*(=q>a8+LT8(?%C?k4f%yzAkqvLwha+=+ zjK;|3+fBOpdM8Yhwu?NRKe|Wfe=2Mm?!u`_@eQx}+Ej2te3s-w;iE^CHNr|5)Z?!Gk_|fC8hiS;2*~an_x4QR#3{ zcVo`uz_<68#wx}4P*0W4#w%TKX-sn!d3n5$_(@7DzedQysu7&vf72_!afG`~kljj_ zFbf}?FOxTH>^e$gMbLsM{|YI)*p^*D+e@@>{~xqHV%t6@&~|gbwrx9iY`?j-tKG?V zvu2hGPvW7L7a6;9_BouPkX=ENIq7(|lkCmGq4YlD!LhUVlg8rKWa2Z-QR3JBk-g2a zByKw{6gQ95%del7#RPQ{@BWn1m6+E^m2TM zM7zrwfABGTC%$*@!k=bysheGmzumh_Guf80vFvguKE4T>zVzH!_+H;<@q~B*_pBIS z7WlA;FlMLa`z*%Jr+V)U#*Ony4ak7F*HrJi-;^~VQMiw@Mf*8d^dx7B4sfQ3b6E5# z8D`x$+z@qScYhxJhhM>lM}CrlDWQBPM8?qOrt+!W3m*?FKEH1HBjP8g6S^MM{!4SzrmgVyUoD^1*e2WDJlb%Nx&KddTy+23)m z`Prfk&<&q9v?<^7;kLD#XJm@tGa{|5-M#EbgFY$qaYJYC@I^W7EQEYh;`$0M>vQt=RxWT%MYgN!R9JgkMNf7 zVR$Q>ttXK&cys8U4}-ha_Few}=GpmFBmTUMx(!dwTUqOL!SET z=Pdq8Pa2dTfZLC~D*V;@W7A%@FWiRwVD(nPCfSz1wzd2hFwI-rcFp(pGgG^;bJ~S( zg2=X#o+E`hJA6fY$2CCW>DXL$yJA9=~mh*WDkApOhCr#>TTB z9ZCg z%XvTLEMaWFq_IW6oZUGdz0=vq(5QO{u;zVMt{r!$k)N|)p1Etk%|D0yT^1KaFYbfq zGqNr8s;m{Y=3I`~7ReILom>+SnD#vOg*7F+jtEz1Po*sn`QH@wOT+TvpLAHh>y?i& zL2k0^N6KF@&-o?zG@kXaNc~{X#a*2IBM!Tsvcuzdz0g3OzDObr|HNHdi6X6Atdr4A ztW|Ag$qCXSwN=8Cw87J(SF?E|=x<&_mV0!hwDsB5FAtRLg0FU+TJF5qc{VZ&`rpc< z`g)ysG`Oy4eN_F}@=VD0bqtK)nYC7~{-xFy_8PP$DZTb@+;A+cvKfc7%)DS6*vl04 zj^DLE*<|e4)~ny-9iTmZjKdU-iG@uIeTkxPi9EJ26K)9iWH-QH?7Ad_&Ec;7ttGoM z<&tWsoP(3K4D6{T_KPFsH``6hu+ zgZl0(p?$8a@%cBc!P>9b_zZ9;Xe>z@Kc8CDn&5{6>)-_O$HBGJ@YykM+$n!Qb?>LW z&9og|May%6{$A5Je%Fs0nq0{`ot@aH?pl~AV4k5f_2yIKSuTC>=|^1h4cQEY8pFuj zJvn$CI5|;mL?&KWEqriqcppzK@yNDrm`2EW+)&f#^yr*s#Rg=E#6iz)_$wR6`KPbQ<_53YN5 zPwYsEn`kfDqkZcH;Dqevu0J$KYdAX{L&v-)1${xcvuD+@nR}X-UK&G}yyq^$DB<0Y zUmB|>eswE$sN|O%MEReC_FabUOf$B;&FR|Mu(OSPSMr=-TTa{z>Y9xF_B(}+1I@h7 zLGRPgJ9ZsC2l+Rhe;I77l7!C?b`l;Ue3I~4!VKYI(p^dT9N)c!&!Z>TK3i*mIg^0y z<_X5V9DUI>&rfv|#^=az-I3DDmSYy_bXIa!efIag(jAG8fLpSaeNZ@3pS^nr_^`zC zeUi0EHp+Q;Cv5+34gUB0wCoM;Gt!=L8TT1AMqHh}N52*?@L-VZ>oc~m(z_j1UwXZB z8HpqLePL`&Ule~m!-6|Gp{ecEJA(#lKz9&f&Ipa`19!?{(wVo26vF5{XdO6 z?|uuoV|*TufIHKH=aD>k2XW`@;D7jBGavp3xbstRMe}4B?tm{N=})WK(}}}9B;Z0NQULjk-MG~jn%p}WK-61rFdyymQ{>gUiqop(RzOl zHucXV1As37b$d9QZ7VRgqS9%aa{`P}g=d4cOLvmh=GyGp@Po^D^;2g@u+6N^MeO&F zwT0{DPvJf2K`YqbS2G7omODMKBNq>`{-L{Z#Z#&-WAA0_>O%gO@#~_j`_>9uMSekc}VhD#1U;`;%=M@p;CFiEsNydE!;ZqrE}#*5h^+Rd4+EQ=Pjc#B5UiW`7-j2>&;sU;&MN#Jq0R_> zf_kpCbr(=Ke0UG*syUM}j}RNKo-42&Ns~W#ULnevjCs_*fcmi~dFejv0p<%wfw^>^ zySSs|s^o31WYm*@Cq7w1yN2L-{bCDGoi#-+9g8q7m6FBf@Hq$j;b}=H-z2j%MoKF_ z1(}g-H3xZ)0q29j`QQj}uC(>b-}~?BkNCJS?}MgqglbEDw)rK>pEnBZMNgTX3P;Je@k)@!fz-WH&OA$oYg1 zR9!oZGiSTERBc#*Ol3D`%9fyO-pyIF7GyKK(KV;hHSb2(oS6z8DdgSoHPd@s`>wMo zYmwjV=A2rbxIO%j61T#>ql4~g^xm&M#(NWOTS(iWC(YLpGAEl8gxKmeOZJIvR`WH4 zoK0%}1mRhP3kW9@>ii~WR}yK_K+!Swoy>>k`2!_AE}?9n*AiDsI?nzye+Zai7Z3|6 zWIk*Mer8=Mh=-og-fXlvz?`V$spgr?6C<5>PAfpCL@Rje_&*DrlwI8~?ff`s+SnQ^ zt)3T}OZ?9nbNNH)Z;ZCi>2;DJ|GsKF?y~<`jI8H^G=9Kr+?m9|r;EOVe-+oWAGv#3 zK<0GcHrlVWq)XG+@$~U@>K9!)vJAgrOD~b%Fl6ADcryP&)*o!8k&UO3Qzb(|zhUs4 z+(j*$fS#ks@eU_jy)%WB-<7vcj1w*?9$byrXYc%-IVVUSwbeUUc-JQa?fhaV?W9b} zWtAsEp2Ic|ym~HA;QsH>X9Inc%^vuC=YO&msej^uj||T2`3*Gb8EnvgOS#OQJAcGF zgDf(ZTotWz80&Wg+VFQn*mrU9!6@TlHq;NX1!rAv(*S>AK29mXC9N90Jan#yk z#!+JkFV@yj?W%7f+qciCZ+2`KQ0Ab)6(hTC##gHkf9FM8_a4grDEKuukgh9`?vNc1 zrIY-xDUfb!Al=ip%}U4qKQ>^~UC+3-1=8&!T?_3~x>?BYVuAA31k!zvbj>#1G}0{! zl$Q#m>m^;vrkhMU&ici~-y8uxN5S`B_W~on2Z2=!=O%u~cQfBF@tpz}-bUQ-ZT>Ry zA0U4T@zpAWHkLpen~0Nrxa5dh({+yN1^($S_Z74YIvM*9`uUkay9}M-e`9@i)gLVm zk5L)4>*slE)skNCE|?0|etaCqYFYa`So`PHXMg)^tySWC;BzF01#YVjF}D`bj!*Nw zF4-1~K+`7^N*26_e@jU76g*YG{bnAm`YGSvwciK${xRQAc;8baeE)#&AK34?e1Dhk zAKLFle1DtoA5rH#;?~Wc=lqpIbf^8maR8V;f!_20{oPNx`|m=>h`)E;*@izwPp|3g z7}0Nri65rlT#c=U{4b)5!XLlu>p?kll|C(~Ka?J91i$@Z^j5ShnI~LtAgF8vfoN&{Gba>_LSR_>% z%VM_|Z7O#n+{1Q_g+~kRFO(il`Zi$ml{K7g6g+s>{$F>rSBY=5yk^el&;Ry!XLLxO z<`kYi;1r%2<*DUqa|$P4&9lWRJd5ycv-qFjS;EtdjO!Tu%^vPI&cNU7!FTi^{7pCh zqUGPJ8=X-U{-zsSx;prqZv1125-&eI|4K3e9om)mr7N&#rs{n|S$~{4(#)uPW(o$-u^L{h$8QvvR zgkK-hGjdP*=O}l-*4cu%bBp-3M(n419XI0ZGr{Ma{QT*X?j*Y8(?*n`Pw!q#zOv0$ zm&`rrxqQl_@8G=S8(-D25$icg9XC=3HY?asvcJzePkh?QGTZJ&8e{175@;(t@yd1h z5?pNKQrP!HvsShccO!gQ(8p$(NmJ5&AkW^q`|gToI>4Ek&|Qsbso+N$w`fgC1=5q| zCfR7~e>jd!1^*xe8{(nVRq_d{c<^hiNHts3Jb zz8c#YOZm^#IDeV%?e<$^y@YR#wd}pRvG-ac83XY*ah7gzAU;K()%P2Tzmd8$AIb?Q z5?Xt+SOK^gviKQkuxIIHmt6=RH((v<^Akz$3`|cuds6cIcox9j$8`UX!Cm_NsM1mQ zJHbyMcQ2*iKJMcGGl#nu@gBroYoGOScK~-cs678n2D-VKz1TMK$Y!M)J0@eBC7zu3 z3S_|8PMP-;Y_ohFKtH(N7)fH|GTa72`Jg|GDZA2^UFFG?O?lGo_+?|4l?-V<2v@=P z;F19PcX^GNfFHq-~_ zl4#h_TuQZqJ9aL8eTkh*6NM}L%v?%+gSn!)ggv$9QtE!bHJ9|wTuN=?Teugsa|wBi z=2B|C<`Q*(RR2_-k@?)5LAq&WK6!eY25gXF#PIwa(5@j<*&r<%aMCHJ{;c<9F6?8o%Gbz z1s<`-O^x;TY_*5s3+%pp<;~*jb>>I39r^8tJEQp1&xw4w85Lh*0~Q9}jRAO*rr2q-0AwjQ&sU zq>X!Nt2@dVD39c8bBv5X8mq3)9!+ZuI)PU}z7`kkZF%_ruIaMx5Ai-=-?#8?U_+gp z|1*9CRewA0F`H&1?{n?D%lmxbCjPFNb*EJPov#mp_gUG=KgP))f6)+lGTqT}U2go* z;ReS4>$jgc{;8KW9^x16_Zbu*_y^@NGTuBHKeDu8ayPzfc_d?-!Nb{Yiwh&<6E4uEV))-F!U^3$Qsg*KG)7$~ z$p4bAkoD~2!WZ6)c>kDv*PeL3eJ|$yBlf*SVF0(}%L6*QztUQ+dD%-T#{;UzzX{zFGDN-S*!Z{A=N#IRi=BiF|kF;qPU3&#g0% zPZ<0KMlBxxM)UFae*@<9_ea=a&jga_JtVTuR3dtnC; zbooN;6MBZxILWc|aa_6qU}I_A*Yc}4-!9esy>mani5gpK(P4+^kqublw z%cFHuc(QL?LN<2b(AQGbo3VRx(E#S*RQT7g-DcoJI*pCq!J*#^K0a+>4Um2))MqLtqQnE zSMxT)%pq(uR0eAk{r=iQ(b_yX`D>x2-A2z*K^s`-fAvYh37Qpx7RuJ5hcZ4!S@V3l z%==>EKB{u*Pf*`A{{(n)Mz}uv@VC`J;AwOT0eGtH%P6nKmvK;^56??RfaiL_jCy^V zS}S;hJ16M1wxKIz{`IA&flt#||E972O=JC=2F;s>-qXVDW#Gj;^5NA*d&Co+c@lW} zdLeu7@~8 zDe45Lg@acqtzCo8ZSY~W7?>;u9*d0**u$$p9Pv545>6q1d>&X00;}IuIiZeZyKDHx z=8BDr^i7yh{qX7$`tlvd==4!xNE?8O^u%2r&b|1}lfux0-DlD5b_y?s1C^H203OXNt%^!0hENH8xJ7HG{SP15uG zr+vkg)siadN$?%j8GUF=t-o)Dw(106E3pj!}?#dME2Me(G?^t9aS}QdTC#_x+UB z!5&-jrjC{gu@v9;w@jGYd8QX1QTjC#5-Gm#Uo+wQt}$MGRPjyau@v9;bM`7-;>E`l zzdXt@HsZNMvcJfSk1HOYJjFNu!8YoQhw4o#z9DMvp2YX*^#`P<*vokLVdE$s*Y@>q z=xbVi1pZg?zNoz{QMf07 zdykDv+%a}re9zFge7?1kAJ|n@iRroJ?8@jI^bYIo@_b5g0 z)q~z^UPCycGqjwgb>!1b{wZ`{-ZY)PNZ*`x;Olezefs7k-$T5Nczf*No_!J6`sHwr zJ+zNAy8GbA=p#C=+i#Rl;UN5e1R+755Mg{PCe-rmXJt@ch^zh`;eEe58nZ4Jfsx@TGA^j^j(<>MazW%pU6 zGAL_1aGuf#d{@y9%K0sG#OL?^jy5>R`%VX+nZri*qVg`Fyp9y#9-UdSTD-1gF19}W ze@tO+>HpOKf-Zes|2Li&i(n6mza3Ze1Nsp}pP-eD{AnI|8l3D&Fpiy>YlB zFb<=w-JRb2dhi5iWyY-WcDM zz;8Btpqn`F>W}eF%*UHDL0{Vb-dg*D+&Jg+Pou$HYlF8h_^&2^?%_wGTlm~(Z6NN! zj)C*f)z}4~C-u%j`*siLKV_#-sCy;Xj7?4+vP zABd)_8Y+|KJfr+JH&i*^8Ajfdp1zQK?k*SIHule=+i~Z6Va9Kv_+-}CG5o8W`C?P-&|i+9;i zy2P);mU0pAYeySP>fxM=S?jCqm`=!zDRN_fJa4t*xg34@t&Asr4gtxsUpdm+kCI+67{|(P;W>y!RIafb(a6K?S{60 z$Pu%4hL~%q`r=XGhTmP(cwz^`ziG|c}Gn9of^?&{NPX5 znq~H2@B!chc3-U#`>p*!C41##_PdbpDF3VNcbM-ozGvC*BEH$vwa()kKTC;Xt?PU* z(tm~E2mHdV$p5F{my7k_4o7>nfB*kxEqJ~tM>np_uG6^tv|}WCd@5_f21}QX?OI?h z(06b?^BrPO9d)VGjVAFSlrHya$Vhen@2v%#{l)%tL>j_=$D6}OM+hzHZ#a>b^y6>Q zse;Z2*8ybyj{MVtb4~493*w<$K22HJ*$(mTd2)ZrXFXpb9>4Q##wH36Bi?X~@^L0{ zH#p_Y_VfVSdx1+$Ujvsq{rO6qm0LG8S$QpfN#Hw;9^lsBiSHEc7H?Gif$Z;9ZokUi z5R*O7yY_OHr8$zxHX^r9wkBnpDgUwBdz7&M%IF{QV~C&8h~1Oo^3QUx)}2)54WC|OdpNT-KN#~|D1jRJ&fS*!}@{|V12h>z0HSp z-1!%^&BLdd(e;8K((g2}$M_I^SYpTepVXd1<9k-2JJY&iWIKkQtbjfldXg{KNsJ=b zNsJ=bNsJ=b!S6QZpD5SCA0+W7%5@TP#h)nGNhB5DaB{hh#+&{AEx%yAt^MgOKhwGi zT=`csmw*4szw(su*XR&#d!ObNvj0`kOPy(21kW7gov&d3c15}-GwjZFzAJfrUCU>| z=Q4QcMeLXU8QwDmueD?}d=sAqkAPR7%pYxvmjf`<8eJ3FS@dv5wC#&wPz z&o5{^-{qa7=>jG?8#4pDRPJ)hB)FrZ37%p}8~s6Nc|{j9JnY+ou&&MMExGRf;Hl`tY2t4c2h2SEA88HT%)DcWru|lZ4mPJ;>sHmSY#fi}p$)f8JCQatnf*WeTVH?pUg{Zb&+pOF5o{l@jqq{$S>TmPwr6x7 zz+~wWEq&5F>Y#l^Bedb417kd8*?DhGE~)<0_b$dITAyA1D{y1-D08V?JdWlQd)z*6 z?4Et@#5pw_#*zVeFkY_vzea)a@*j-Qzf1Dy?_UVUwybYbRzNq|bbbI9?`ZJXwBfRs zQyK?w-smWi<3!jeo%vSb3cW|SnQ=r%N7ijF*B<6nbele`Z#xmz0lgDtVT1Hucza*( zbdGSJ`LtMTCwq~?2BdIL;!kGvc^UbY2{V8E{Y}W~qHeCwZdpw|^DXVG^zdU!C$s}y z)N)=2j{JW#UDUGookSPqjTyeJuqivi_KbDFm#IwDxb0J43%tH= zqp!W=60-Muj!^a3#Ehsolc4j+`E9NT2TMjxs?W<3V&sF;91t3Gx^Z zqC1-F>5ei%9^*lDNArOn{OU5D|H&Zp%<(qBU3LHeP;a$tGks0dZ)5_?+IU}tedr^} zO-3#$d(k8MCLFY|xfdOX=&07_%7)5JsJ$%vy2f?$4e?MzSw_BmLLJDe{BlGel;4(f z#Fld_<)G78{Pm-`1XC&8?r%0@;#Eu9};7BhdiXhQUVsAnq;W!KPtv#5KMw2@8xb z%ZOVjf0psk(iiCKsoFb1Cl1w&KqmrrVWQ7pe<~n*xn1-b*s=a|u`xxTT zzb)r1HFC{XvxlrFy1pN?wH*vpy$ zte(@FAv!AG#_+&{v=w^L_zTwJd86#)I51cz-wr_-{9oqYKfaEt&i|i#bCY|UCe6+7^p{N2 zLJJmXp-5GD!)@9Iw`wRAOIdK5rllgw2CO9#X|6HW zDyWrDzu09_FKxxj^6^u(YL!a9&)1nV$s|p%fVlg|JZ9$1ne*d)-sk;(pZEKH-X~%^ zi~9Ab{~HGSkL~QC64}mLK1&}b>pAF0W;}MYr?w^v3H5)d{F>FdO3}6LJ^a4{{yJcb z&6Sw5reqU)9p%a7ehQFzTxGZ;rCr|i*q=P{|dTIU$UumpBclueP6m$={}_k z)pz-~gu2grNY5HMqBYQAa6U+@-gO?Kkt13I9ftKmxkvjxyjJNiVj01fdC2^pdI;I# zE6x2Ye}p`dLT8?U7f44Q#)^)SHW(|qESpp;1ls+$@8&iMZ|9QEuEzpwVTytoNvu$e%J2^^rc#d;Zr6WZ|r7u=t|K^tb8x} z)QMe``w(-3b9J{r!dySu+Rn}aA2|P_bvAO9&b^4@@}CBM4ni9lWxB#=>DU5Zm~pld zw`sSx7TGo9tl)g9?*cy)cN~}&183R2i-5h^=Vsv#E@k4J`Qn)P;e)u8;Gg4g=|t^d z+pvSdTV9#%t=37ctIdp|?PY7QW7CfENZZG0ADwMGIHa~`gV^WTl*k{%Z6Ah1-a2Ot z_%lbibfSIGeneuRZ$pM~xZl49{E7ktl{e2Z}8M5D2ZCjmo;`)y>Jhx$Aj&H2a z6mh<<4;@0^-n%u5KfJed)~4^ZXC^XkV*|Tg?g!x9gsvpIlzUxcuLHNR*X1O$HVB6@ zv0IRXjlJ%Z!WHs~c9n>hL0gc`bBa5#G^A}0e3r8VqO@&GVJL0eVtn_Gr)_rabR2EN z*N^hBpBw)=L))kqeqrbt{5N;^Mttl>(m6%)tdHgyYC8~L`Rv7me8t)Qzn8E4Z0W!} zY;x|Qow5Hp-r{%~2jsj6Z^^wW;4Qx8Eq;Wz_z~XX592Lk*-ZGLsO|%&M z*$`UH`*HR(Y@3$1_z~XXM|g{Gd5dp(iyzVjc#9w5ExzR~P9=CeTVr-2yyZlFMNX7g zGM}{`ko^bR@XaqpX@mFDFNCqhg}f!S#Z@);-|{W^OLZs@56-Py9vwQjb}j%f zzDa(a|1%$%ZXr6W-N>TSSrALOXZJ|!B=q;A#W0gksP@IkcU)`CA?K!sXJZtHK1Cy( zkzw`)5DUn*>o(fehL3SN6Z4j})fDg#$G1t^q00V(SEubI4SP2Xq)^O z)nDR&xW<;)28?&X>%>>!gE1?c6h(NQWD{`PiwQ?X@4>+VdOy$?V)iSYwfca6lyFt` zQP)1|d_Qd?cD&JDZN?X7c)WvevZs3Yuy_ZXpt0x+Zuu>|JreKW7R4qw8qE)FeM6{U z#J+isd~L%0lV{-rpuDtY2W7GUXUZY2iI1v zfir;_2iCM1{6z15q<-;I>{6SsOA+VWm7Tf1H<3XfBi~BNWw*$WqDpB|zmtfKrFOW# ziTxMGK(yN9!1 z6Y2*viy;l^121ncuwJS(`CWNi9nFD+;K?}LtbE)*#Xa=JiNSB1P6bxP&}(`< zcVg&y$fe%^Uf(2s-tN%f-^Z7YwMrg&Rq|^Ewmj^3v2Q+9x7a~$y_OR0YoW!Hcg z9=L{{Yh_tze*mY3#C9R?9puHAY~`D|*F|X1H~98>(vZ1@vqt9mlW;aa%^B6UmY?Rb z-`ZubwL2q!T?Rj2qZd#AiL*ViyX`%w^E~O-C^B62a2d|hr6clNU3r$9y6r3%duS%L z=iHtl=XP?Yt?YNgBkhNriS1i{)c8mIWJxFwgkwOz-b-F&8t*;aC$N^@uCZYZ7KHIM z(9@J?JevFaH>%uQz7y=3A2vQZGh)d2Fg69o=y5wf<3<^uH&SL~d~(qkV1K7MPupgZ zhjGctFF!giyZNU0KhbenZ^k8r_jUMsYCqTrpjJ!?RI7F-(>oZ5)n`Fb)T! z>!Zjxgnks3AN(YK{5UlKfqpO!&A;QWad<@I5YjElpkW*q6DNq+@#xA#lNgs~_Ww0z zpc%jt+vWu3rF72t-ZKxr$vkMY^I|u8wJ!YCv(TU}eAP2=zXOHL3U~KmvWX-aKL35)Tz8b_*%t3$Wg?4RU zc5U+QR3C#mq`7#DiT$a0R+4e><2L+ds_3R?<0F!Pa+Hr$VSm?mrBmL0#uiB%Oqs_1 zehYgu2I|cTe`uq0{Lsbbdu)E*L;L$J$w>Yipt&i16Ws=Pt$xDbbX)mo zJXK^3?Xx<7&hh6_{rOh(=g)H1?g)5tjP@8g0ejL-%um+9u5?L5@Q1We=N8Uo?K#n0 zcANX3=FDirGeu8Jz~8;}?@G$8hwf*DJ5k$wxHc>f-~JgNi0#bDMaXN`o(7MnU&Pqdxx@o>4IkL}%aOaHb0~zt zI>rM0kUcwZ`#(Ft=cvB|RMI8H+6 zdonM2wT}Zjx0%>x^TG2?_tj?ios5jsQRC;CFTKncmw9v#{AETkPqGEh_`FVYAcC(G zhvTboDS+e6FCLGt-c=F&yG!%L;w$jK`8UVotH(L71Ni-U^qt_V!6n5@kiUrZ>_+GO zK=RR>0{U=s0r|UAdQ!EO{PplckYvRVfa!UhyU1P#F7c<3Ub26dXX!dQL*UWoBj-Nq z6*)RP;L-J@adyC?8;INNaley0X9qmGk^3I*ck!Jw10Kb(k`B+j z`8K78X}vtRq&PPt;l=w>K4t^{d*0(c;O7}V%b;hJUw><06zgm@}e;YU>B|l@uFTJ%{wYMagcQ=28^O&!r z9=n(4<_}TsctscQ&b1*gQpfo zc&heTAak#{i1AQ7z!K3b(pa0WxIk%o?=AOfk2#b4km?E7y3bATnM?b;ZONYb*eo*a z^SSL2XkHh7*E^CuneD{v$L^b$O zGd2r%nvq8`#1N|Q$x9di74#l`$)36Qm1m>_X}GU8BYV_t1FwJV|CRQf8+a9Sir!3D zJRvMQc1OY+D}5DZ|2<{TP}$J#S?Xi{de(T?BLiNK40yfUz~w%FX3zXzo!N5{Ylw^K z_j_4KybqaYJ8jNz@8W(w@ohVQV|7HT3mP+#KCoX&^!BOi&!)cri9XoV~5gePfe2 zF3w&rx{>9;gicuR|d1Xd^c0U?<-0qSdz>FKXc0hPQ*;^==^Z%yKuw&yKByJt&-6G@m zEWd4rvAZR}oinu`c?W&#;sTGBlXe=9^=sh4zIdWu<{*nz*(th?Mciy=e6^$HRkJ~7e|si=ObIB z@#C)CM7*<=oNenT9AaKMq8~crE9g_gtA&0b-?pC>!j>_79eOeJ`zCG$x?MM78*n4G z0k^_y^F(hdzI-}(UFI4a0r|tdvMM9A5ugj^?0E7wA`_~7{d4dXuSPPU-h)0m*Z^%G zJ2IuFk4p-skI0)pP=A>3)!^5-TthY?eZl?UnBY#ISR35 z8Xbe;K3@_%FFwTc`8ItS&z$|TbK!kX^D&!tl(dX}hR#A`w)jqC#<}^);yiu_W-l$U z_6N`7F7pS^<1X_}%-6fD9(`lAIcGTZTd&c3RDaHU?5XKHmuwiDnXqx}Rfq378yIZP zY8^cL&a>UIe{H+Z7wkS#^sfW^g0bhaFU~89?js%P%wFXq)_760{d$T{^NVYb?Rr|4{@E87|Q)vJ{ z7^mR;59QPQF!*b)a`hM9R0z)X#_rzSf8#OXmD&#;rM)fLSTXZpU3$}Q-E-+pUBc6v`LAYUdw(=X#H=NiXV!Ik0~!&S;P zmMhIw$yLS0TyTkJoN4Gw?p(kgvsfSVQ{_QNYP^noWyyv8r*@XO==QVHDU{IW5_rXb zP~T(lqP*U#n&KXJ&O(U)3;M=yH8#cm{)ysg2g&y>^2zpuO-JV&thfsv+e#mtcqV>K zWg^G^y?k0kAD~AQMK^XqF9TcH0KLQ(Hk4jU7ar=(rC*BLMeO^)d4JO9B9pa9Zwl;O z_3uPz>?^3F)z)EbCK?a=e~ZTd{$f97#;hYFd&zD;0sm!;X^-Mje#^q@24F=z%J^j3 zi(GKy$9dn^X5w@sa}%fA!tO!AN_}G7ma0z1rcAISt(CNEY&%kdr7fHF|C9#GmacI5 zYXjq;E%fQ6*AB)5eJfENz!=&1#u1->Czf%BzmEG}iPNTkNNvr@v|V;?mLP zfa;0TA>p#@#(mHS%@yvPm%(}oI?)TApsZ_NL0KtV))-q>DP`fm08KgBV}El%Q{Xpe zi>?H?no%qqv#!FvZRMO`-#sv5UJm%#$>vR2FL#~~;72_;ApDpEynMkckN-Lsv@r{9 z%t9MkU(C!x8?(^HEVPle_{=P{F$-nUApA^r=_|AA(T#!GhvP7j>_gPpPj9fF5^4L&l`X?pv0-;ATaF)|&NeCEmCB9-H&e`q1nCvtZB7yES9pa}N&b}0KPHmDG?IU; z&7V?!)uDaOUWZwuK7$XfDTn%#gZ$%Dvw`VcaOlUt8Qu24xmhm()5c}MWU7Tp6sBuK zm>dsN=LaE7!5R4Nr>aMQ=}qDPB^jqjFnt!7-aE5Ee+(~s!`8Tiy)b}h2e7p;l^*yM z$>uKursKfbsuP7NYk_epAGnSY{DfP&n){bO1N`;@zcP3%>yza_VU4G?@)+P=W#L~1 zE_JO*}u&bLGF!bmN<5x(UD7OKUv@PqjW!0pHf# zWvyaptbMjVP{H~J9%SgGXerMIPwcbtff_{?t35$ktab!hOtNq#>m%>UWY10Vfut{Y zN*3F~+U_>ic5MkSML<3I$>KZm$s1X(ni%NNt_ylyuZsKpXSr*wm7nQCPh9AU3q5h6 zCoc5Fg`T+36Bl}dzG$WkJ#nEYF7bCv8FkRw1;ARdup3#wEWkeN6fsuBqVct!37)T* z&$HGmVjB3 z;v>+ij!dlN!auL`?$z1mA)Rr?khdZ7UL1Ybv*f<2Cg(Qpz-{O9VZKA(V(;2MV0;jL ziey*Gd!J(7ELYxYY;3@|BJ{k|TxafP zohe$k8eYwF70)UAY|fe&4&NHYc}j2(;{pkX6T{aN*hsaWAYTwGtaS{rE_jdf@h{*b z7M_>IeW1Kn&d*vi3%VSU9f<9y7&mq6;1NUDAD{ex!uf5*u4Gct-x}us!{Tf3mR}04 z!0?N@3+8cjX~6YAxcY!Ay30?R`Og?sYutI?t+fFEb_(9gM;g4%Z6c3!1gXD(L&Uy_ zZPLFlfkW>a#G%-_5Qi9Z^p&5!l5;wiX>C+>;R|O<7jcMmbPY{hm!NC*9%8B`?Jbt zkj@UB5B^IxT!#HcvUxFdIHmanpH}Q}!QmF*;8WIx^zV{w#ZIjEosQGekS+Io{ISuc ze#6Mjn$ zAibiMv@eq9uGwyI9@}g;j7L_zk@MKTINLRAUiL7j@2Jj<_1g22{pR$h3aLIW$;y;z zWQCSWC(d)J%D2yBb-&BbpI}}L%%5u29i2bQ>#+`^{7EXGOR{?d^$ecJ#L5)xfAI+GfW4{D8;ZP|$pDN#mEl)OinbY}1!G z_wGr?){IS6zJm6IV>_1giq@)p;!BJzW7u#{b$%@OG=y?1?6jOIibXqFS@7pSE_uK#dDR~XP>KIZuzYf z@+t4ud55XP*jIpE2D(YSekXS4n?>Vp`20p<@o8-X3`?L7O&f~bPW z%(+XfKIIb0Nt>Bl?ZsYYds2FP>`v&hGqLLzOTN(j9A({EJ<__9wHE8RtX;=t?K&>Y zIxbs5S*+tmT*JOpS#}-AI?SvIv#jH?V<~IND=5qC7p8rcwyY}3GHWTylMEHgKRQQC zYr^>lNo!|Z1vd}dX4Qo+cC=8pXsBqW(nMF8Dt)?GGtFl_UeEYwEI4OgGU*MR|1)Ko zo;@GJicf}>51_#}xO{8N#IE}p<0{_?bRZ$0x?w!u@DoROO+EbQTH5(K{g0k}Vh1!- zx)s?2u(9^tU)v6i&s5oVrKNX3_blIC*~kKWKs+ydKn?LI$7~F3Eg2^ve%#!D{W02Z z^cC=2;gEDf&qK#+XruORV*|NPHau(~*FD6&9-cN}t0S#b<#7JeWWnR^0}n6LopPUr z4>z6Z#4p3I*hjAx+eW*)u(Jd_Zt?Qo=?~lID`xRr2-2@;;Q47-f;qpK=jUyHbny@G zv(FoNJ}7uUlxc++>%Sw}bo)-d-wM)7#?KU~l@3 zcoN@hI>h@XyJnyLBf)dA{@W2e179b$UC)z(JhFii)3cH}`diTf(uC4G=jZecoa9?k%RJ`%EZO95znpQIdX#TYuDc{?Yt>A3F`u*dwiua*CKdC)4eB7t zV|c+CS!5w}dS}oN!SIZ1N$(liKdf)sb-O74Y05M_l=^ykFYulejXHB(XW?Bx168-mFd=Q!C?ft)vI(%w+t;fo^I*9(E+-(L-~i%tp}9`ye-|j z?urQAN{Vi&%;x^DO<1^4s+(^w}LoFK+h?y$ERZr{ZsJg4k) zQun)<$HUk3`&seMztGMhbGendueDT^4oGfaIh*|+&`M}PnSCGpkMF8uH#9(c z1MbD#Q``*=SaoF{9_c&iU1s#b@7tN{l4bfzGL@^D^Sw@-NfB(sx$=nfl zqH-I4dz|UO8Iky>+eNx0XM5nQxq(WWQeb{nXo67$T z*(Q(?u;U!3a*Oh31@|7s(@kDP$&J^G-5k= zsh3XoO!b4b`;~UEqUSd{XS%&Oqcuh-i>gnRwom^WDd$W0${g05_%irX>;y5^x0Rc9 zZ^O1PIO=zqw>2C3euZsPS!&brNLg!@4>>Q^!8r_!4>J1HeUiI?7xcm*{8HOUt`93i-Gmk zkv7LzUrFwZ1#-*n>oz8P7NA=+|AF)G*MI0CM>|*a+tgi&{w9qdREOs;>Sr%hmC6S; zV{*k#P0q>a9N>5^f$WgV*0rR1{y-lah)VZ!hux3*(`q5Kd$pXmWMbD%qIZ{#mHZVKi;xo zaXuGft6G>J78@lO_@#b=dkKD3%h>yJ^Jso`v=5`U_MiQ*51bi@@yMLi9#LfJ0onF? z^lY>0S!dmm$c$Zix+@>6a6W`_@7kLCH~c5%%+TDV?Mw9!F!6=UqVL5Pms{B5B3>Z5 z&fAhvUY(0M3mANxF`Z@T66+G?2YCANFYc@8c~IYYUe9;Q9eURO-!7hecqabuRBTJ1 zU{9%`E9e{hzb_nO%>F@T>jH+eqCSm0yTD23R?cEi#BJPXbC-YGS-|a$e3Osjo4`ZP z>o(`vs@_i+ydx$O{&z0@+s%C%exiBuCp7-RTl&cK`ecuM7H0utbhAJFDL5X&riwEA z_Ez+q=6%NRXYJLlaaNkeVd9xxu}AORcdNgwg^}++eu-ivg)-P^dCB)r`RM4sx9Z==6B0lgT* zI(!=V0WB?%XK?}>Mv63-JO%EP@WY8wZW*@oIL}4O2fyBdy(c{tTyC$qqW=Nf^a!zQ ziBo%$;?#Ou^EL3onoUc*iK^e$b;_!l#1@@{3<1usn&XCkZOHogxy?bhO8gn|EWLwI z`Bi6<|6H5@++q38Jud$@3Ks9cy(KpOOEq+(1NvOYJgNr=kug8_S!j^XDw(Z0dZO(y zYnf5}6JAa`Z8;1`jX6F^5~8pP%w+av4U^02pkuTP+zC&>g9jh{MLO=M!vgtt%%|8z|IY# z6LzeoGFFG}Gy1|>u{{)Ki{ z_BKq7D{m(D(QicJD5Rmw8hdLuUG|^MUsFE$SYr>yQ6LZSTJ|IA+#T`)<*CFxD8FvW zUp9~Ie}~$sdkWv~PwqUXu>&sXLJfaKZ=`cLUi=*MO8d99=K=qHbKYb80iNQd|7?LI2LJeGzx#6M-jsR!V%#Av0?DP5cr!h6s}pAr?&+#Z$KU_0#;SblMv?Y zlXZeU8l%J9j1{o>;7h>#!bm$$ewi@O1TeqW;6)~O?Vknv5U1`w(7p6G)BUC+)BOvW z+vx8Dy)Sg)0-od2+ikytH7dH+htQ2%oO?ZEik%HPYI^r!t|MGWxsK5f=Bblm>S_tW@X z)Odb2)|hc>+LDhtr%^^*@*C8fErK_V=iYx7I$Dh<^VbC~iR0COGpmohwB-V5{xr3Pc3_9d zzKeG^<~SO!65ijz`y~4gzcu+A?E4(vrO&Og?{Cfp_5{Ub5ENyGnl>JWNE+bB4^PJ;hZ|g3Q2Yxj*&N!Ycnj{)x^Tl&XPy9+WDz(S`^kLd%dBjKOKauP% z@XvI{m00d(9WGpZuj+$F*D#)AcxFFP_g>n4zRf>T`RPv^bh(CS`HhtF{k*-DNBU=! zPJPn_w`e;KI-fr5b@&czdr$pR|7_pBDmzZ34Ra%HAhydue@t7}(Rb=|*#piT`N$t^ zd#+KvA$-Ditq=0nu8(`dp(~V!e=GUEhxZTYT{zu>o*tc<&LtejI5Q_c@*M4{5$)RJ zW+dNSa0vNk5AuoH&G$oUBW3)H$^ajP_x~J}=O%c+fcJm2?*{jHf17YM%$jCU9_=jkK@4yKhn3Zm_2oowj-N3@)5Od z|GL_)J}DjAqkc@3{6?JhBzvcdoLE2Y8EfbnJpT=ufaWV5dfhKM0Gq;H!Xf3!CA$wZE{eq^+)7CI2n^mW z{6kM7{o@~%hcv~&NDuO;QTcuz9GN*X-~Y(_N9X(3etM9fe&nL#`Tn)6|D$r(M=q*_ zk4bim@cm4L@1yIA^8I6HpE%$D2r(!|leMnBDAG=B>@P>wy7un_zJJY&z_L0MyGHxV zB7DE6jhHqap1&z3zdmet+rBV2TlU4dSwk10eS5&c7`ljxJ4y?jX>jcs8<=m5cfH1I zW2@OCtNiIZgMW6>KKX9Oz5xH?AN;7Vow8x9tA9%MkIjb+ACw)*SFe1u@ehKtZ{Zw` zxg#8czZc(rWmd3G*OO1<-rWDfK6Ea}z$xjN*cWN!b+x5Qa|pTcSS@*#E?Hzdd0E?^ zwym~N@<VSo@3-+dcl`*j~ z<0N?o9v}Gz{g~WV`;14uZ@VwuIItexmFzjfnpkUHvnKw^>De*4goAvPsm69(wkzf1 zM_``ksSk|ThbgOy`>ot-H8&{pT;!439KMia;H|(R7SA|S+A61J!uL|v!@SS3??rqc z&pWbbwjUVQscrN%q|Md6O@1x!A#JX(?;&j-Yu`iKoV4$AR1RgvIq%w0TGEL-EeQvk zOxD@7Bp>(MT?e_W#4paE=ajtov5zsfwR-mxZ^b*l5xV45vzEC_V`IkcUT1vb!v1FA z0{uQs{g2WqaJK>8y$d)mW(}Oh2j!#6Ytt?#jWvJ<|hF(so;1r_WxD@z&noF69x< zYi%pOi|&6rJ`|rq|9Sy!2j7cUu+D{_pr1rnc{_G*ool+TO8equ7b&EsS{)X4q)Me@ z`xwweDK;H?4$cA8en<4T;uRH73h3+F}`tds%%|VcBy@@;626r z0{bqUME{!2@_x^{szqKfKG*yXx<6m`h9KV}2ibcf`Ib@szpMO}*c*x+=hx^F9C&i< zmVCz1+*N*XKONS=b2-n;ZF(uso_$X8+{*Jkc_Vuj2gTA%#{vhSU@$!2cJV%w4|~>2 zHn9iT<&en{nva3 zef<4g4|(mzwxV?OFxRx)z9f4d>0gbc7f8REbfXts$DE1a(oN0%>pH+C>5k|}e4FMJ z<88*p`fv$);KKi2x;c$sl# zytI49L6^ndQ2b!8uQY+sI&HkMd9DZ#tQLFWg} z#QrHcN3drt6r3-~`Qz(1BzGQVT%9;u-wfQXEfIcp_O4Pl#Z?2{Yv?U?Ynj{9%@_5R zx^?L3@fQN#rEa~6DPHOtzgO~Cl0S$kUh0N>+lxrA&ZYCQC_N1K93+{utJ4Si@jWPl zt|f-k;9CP4oZxQu6s#uS2sD^+oMP$X)sKlTLO*7!&$j(zBJB_NJ*xfqL1*H-OWg!M z5)HJoIMV(S{t3ke?`xv0N;@Kr)BY|xcXFhfGxif-Okk~lUMsO1-nMRv9~GfOv}VBor;VtUHWvsZLQhw z0|(;$Ts?jr@>8&PE>ktpIl;0I>@npza5VW%$5A-DQ3~b>Tyj9Scnxv#$1;PM%A7E?HMU zW!t*iO&eP3p7BW=bNdog|9`1|`7X0YmjCf#+7i|;{x3d9zd!sVc$(}QCsM!q*BPnb zAEEv>TYvXU)Gz)Y*8d>&&#>cW;7#AZgAeweT*9kjeIoi7&lQ7HDRiQ(*$gziXkAU= z@VeTx@KBE6DoHs`55&xeb)D!Fr()a>j)%l$VYWE*kUmx{BqZ_DKYa(M) z4P>EAwb!~tbG3+ZKfJC!t9D3UuaC6jSCMuskF?`@+Oa%}r(u6-$1Zf%3wq1lTKZ{x zIw(_qG5C~!_$u&Nu|JDd2k%!rQSR16>iaFeRN?q8RDGG)hbHoGZHTw55C4UC@h{O3 z8|P`~vF84^70`yjhS22PA{qj1C>MUvR%pYAn~-%9me#3VBhb1J&m-?{`0+USaX=TD z3*?o&Dt;@OSu(Nsvuoc&{yd9!&bi5IuOVfJ^6H|D#nBm*eV9DR4Cruz`Xvv9G6Qty z!zZ;>xke5ok88`3oPo@+Xg=jAPaSzO$T!-@YUo%f>q3`|FNyMzXDNBdu7fUFc*)Nw zTo<$eFU2NR98SqN=UD!+_LanA<-CSg&v(Y;GA=eD|AYS1S`$&) z;oJAxY8Kmh`XO+kaT{shj-)AG)jrblk+eq{EB)IYN$VnQ25CDYXLJUp~C- zPRemZe-!9Rl6+0_Z)w55g;*2DzeQ;+4Fz;Uj@kc+U!Cmu&dMb|@u@O8zhweC3}UwU z^EWtI=~SFMuVjDRo82OBv+H2*7}tV-MvjN ztNd^t;SB2?5kDO1(Q^&H`V#A8js|^SBwgFN-WI2htDe5pZ(8EjpxaujI_O_w1Lp>G zO?T4UPw~uo4D>He|KhfPwXO7NHGKqbPOp=96z@srM45e+$mrVZ#$LS2jqIz8uD^5D znON%-Ck71YyQjYY8aO0YA$PBwZT);^5B2l8b@t$1KGq(r4Ya?^*IjW!f;|N@{Sxp- z@ja6Cr%wIxIvnW*OVnq^Pd;q_#r2hN{E>rRbAKfKkQQ=Ybr!##B{trA=#QlRCzCfA zzr$4@f*wo9`M=H|X_WTMA1T`YH>&;OC*V#Udar*AaCa%||0(nFnYo^GHt{IpE` zhO`?B#vf_vYG{7cA89xI4*s?D+9$!?ke16QY$bX*e9YOm=i@(?iRW4~mIOAa|sPwBf@3{~p$c5027?cShSVKnJb_ciS=znkU;%W{%)f zWb~d}TnG95RN!Yrud!dpsiQ+!wcO|PYWL{+RMLB@(+G7 zSJ*Q3Z#}d&Azl{f6vEgtSN%W9Y__cDd6w+6ySe|WU-H~$pP%KqV4n}bD`(kf;{Q(d zGO;Va#Qw))v~7Tg(`W5fH+`nxN4bu09p-wT>uIiiwu~QAM&3T_3@4?3m-@epe2^Xm zUbBGL2P5#RHTh@*@cI<+IuyVwSeH_s>@u_1U$5`~0elV#etOq4ww!yVdzEi9uziDM zWWG0O3{+Ng{~xZ^cRL1JyM9;yN(YBrX>9dMqrJ!#SAS7uf+xoRn6jXkS=kufcFIsb z`nHa|OXrowN zVIxu*wvJDM!@{fYsSc%6)^!@|QDB-OFTOpdJ>pmRR)DJpkFK5u91g0T=%U`jIIACm zX$CleXIHUX=qpiE$A0n|{deM(_m34LpqvPHD8C zHeLNTl^5+N|C}VaDi3`^{@1?UrEL*dHt-Ete(;aL@+fVn29~t*syXEKLs$xqz)b6n zyQAd~gX44yNAw^AaMb#LG&nX<&raZIY%mcx9znK$g8ml*I68)wQMcgOMF07Ib&9?g zEF6#M88}LpQZx*XM^sL8|L=F}n=LPdscaL~-dJCZvOV-qJ<^UkL&jO_gV==ri)(!PZ7h_OBt!KX3GOW!#= zA}E(K=H5Zs%C9u?+i#{l<7}M<#?<*dV{nu@%^FAJ6pYJ9r(6718HXsNp!@UGbAK`N zFtE1wr|o^;{i{6rCzg91zGStlJAs2auYmRfV{B=S4l!-n!!3L92Uk#!%G0-{w5d*h zkq3c=`9Gt0Hm>t5-{F(27(XZnwQ{$bP7G>6YZ$6{0*6P(K6u*@`GqyCu3;#B!ORVVID2hn8qBf zA+LNR@6d&-J_EjmGENC)VcT8u+i01<;l2@;s+J8lwmw&x)r#oAehx zpY)ghD(PQyIO#8gZ%pc~U>*iIyzV}H2cN6Z8A{T5IO8dsSZbebp!`YR)`HqTPU~T0 zTVg4@MUl1f7_G;G|6FHp;^Z0pSE~P%C$d(1i`G|NtQpK2?~`sS|4BE^)xhO)&ER6c zh&z`n!_~w!pKAeEmTM_CXYGf$y_fUh&`IDkm<1QX+jD!`c9ms~-GH=O$#1OLbY@(g z@=1Opz22_*9w*)Gx8}d?{5M1TdcL0;`R}yIfB1e=2j`2zTl&^<20L(m7##;Oo_hB1 zj@^05S9wS03YR|o;pIG@e#~wzm?h^_E|9lN9yy! zNT1K=d4~Nj?6dwGsn6%p$4hLV75__p&e}e6KF~m)=cvEx>;9ylwR^)7=t-;L_wzfF zJNG~bg!AlKGkE$5@T>B9)+?Mho;}QZh4t-q?Bfy55dKZ#`($vaD)1Z4o%dAIU*ZM4 zJPVvzTTbgxJ;0c_!v)bl);c@)Fc!>zcUoJbFipNXykEdOuqv1s(|u)y0UbMQx)lB; z^Em6Ne@DujsI`8sE+0F0UVmZ7j0`c>3vY{OV&|*A-0KQvT^q!HF8s4-eHfz%`bg}j z!aJZZhCWbNS&Q+D^JP259_Djqbm0{Al!u`krGf!Ca<=9b|0MW6gM4S|Jpv=0=UsE+ zFuLWp5g38%F9{>gc^U#E*+*X~j6@qQeUd%{qqhq#7Dn%g!iYT88Uy9?K2wm--vv2* zl1Q^ST!`RsA%epNGjCNEFndP2zm;b07fg&Y%~{#+iWo=v2N8#W^$u}M0{!5$nBzFq zA%9-xNf7_Y=yS>np{+1pC@WO^HCofsxNJKTU9KMULRv)w9_rbDN_$ z2PdiCfM+?9|EE#T#1{Sw%i+BNTs=7~NB@T9Xw1E~e4M!;zg_3P$=UNLzt)t$#ZR=5 zw#w+V^3rL!YI9hZ>QK3qKSAkXeYCq#{rn5{>0E=CtPk8vtDLYt+E}J{>X~KXlhQjd z1YW-2g@03FT9}_avb~qJ4E}RIdCHV0{D<$@YoqYjd;fF3BOQfei*NLkp2 ze8~~R{>#eeSZjgrQug#!vZ<66M6c8GE#vt#dq0)5RF1TL^y4You6>YP*#Nhux)I!( zDxX1ci@k5G6Y9hjlJoA2c&$;4o5xPn7RQXJ(e~SAN+S-em$1Um2 zvdzayPYluLVGoB7@1y+5l=(FGH20sZoR`&kFhAq`k;0lY(b=909VhRaa|0hL`C`cC zPWr%n6%F9b@aNHMdx9HfoiEs-gIdD1^ypOo8us)pBVDoXwBJj9*9IQQ&<->r&3=Y2 zZ{$p_TfS3B-FC=H0T2Hmau%{y7CyLiTOwPut$g0G`-)v;gvA|{QHv~=!uC{S;q@T! zqOC6RsvKwKTku~YKGva`Zqd=1Zt73O&0KjN<4NK2YPsuM-Ts+weH(s?Pry%U(<<@dp?x#-kG}QaiXUZdC+#KQ zfd6ke?gjeU9*n)tjnUZOd}3qoz1p$o3^p_N(y{)8vu1v}@;u(R!aF<(+({K0{1xHSGXql~}yvz$6?{D;qnH(HpK(Y_(`VQ?;Jbyc-|(+7yvvsh*)4k*npw>A)?6xUc#&)d5!$kWEkZwTOHWDf00*)2q_Fkt zoI=hFj$e=cw+s7k7JKmB*uR$&6ZL!B>wNEQ?hn;vmxl3SIsfT$mcD+NZSU{>4w4n8)UfK-b2hUNSEd^Z1?8y-}9pPIC^_ z;_un~ybt6*JCgtJH22AuCx0E6=m~Kog8fm61Ub+~y>Ga)Yg`y7P z3u>Lxk?@LIQo+7up5wr-UwnY)*p@jy=Pz%Pk7VhdWDk0{#apPOio0STjPFQKacF~N zj4|pb>31vL>+q#Ze!+e#*BoarKEFRaa*lJJ69VG;>LB$;s@^&59qE zs%^Z36B+F*NwVhX<9!Ez%{mr2bHEo^YgTY|RQ|+zNxc3VXw@h*%EUS8V?H|Je6;gzZGM_(MrdFi!g-8gd?yZgOH4yowb2Cm@;5AUq#xi9CiuCD0$GT)FxXfNezzDMS; z8DIF}knxp1I6A)KBhm3yEWDw-CHspL8)NU)@|L%1j8Ak-UoEe(V|W7mCR_)o~LJO4DCFPuUwLKcz@}68pw|akRM-*d73@3 zdHO=#Fj>M2`5ip03mzt3w-a9H!TY`k@7sVs*7rDvch9NtK=#jA9=K^kzylYtCKk_I z)C3(lf`8oi*hf={@IL7%Cn1N(UOEE*TU2*E|6AM~;b%)C{13jcsPuULw-`MS>%w-k zziff{AN3y=PiXGXhUfqC9`eh@?7bSue*yXTSe`(HVoz8+MeW{m%E`zI*~iGEy@1L6r=0Ba{vG87*JHhWS6bne zlc)8P#`_G_$7R+UVZBxksM<##kp)gh_O7N4;{PR;j2&e@ge_t>zCE{T40(Tme<$+( zS-nSj>V9|we02#vEq&y%I=2tp5uJaQH!}9Y`fN}h&AeI~`ew~P_}@>MPsrx1Kg1Wc z{y;w8AMiz`?T_-uS4&HQr&+f_Q={{3w6z;D(VyNlY`!_8z^&=T;P$F{&w0S)Zw@yL zui-rCCE)hQ=ZC>9b$GgeekXI}A?6D5*+ioY@|{UWKN{%aiWPT=ZoQOZFuF^O0kh+_YK z??^?@AHQ~nFWKc!l8Nz^(AwjL9QSkP<(=&_G7~bf_xCaV~*?0D8IS?13zFs9=7w&c|Mgb^0xSjKSwMyUv?hm><6%uHqN5X7HEba z=B2Oexi)xPy%<{rFX#E+@MH1Y9j~shCYwN>O3VKw^gY36J+`YRTY~(LuCtKhYy_Ez*DZ4aP3 zweP!mUmHAcPV?MqpXc-3VxN7Uy@0=5p*`)dV@z-Q$~oEeeZ^V!5oc<9>4(}T9lP}E zl6&b#JnRSOHIQCt$N?z&5ewVe(%{w8R^tn&|M{2pXOw2!@2UNjz^h}+>De@E9(=}p z+5XLbPH=`jg&E?{`H7s9rQc?qa?DQvEAj{BWy@6FHej@JX2GNt2YM&PoG^O+09F~r zaX3YJu(8B)Wv=$Rizb_R*u9BtY7M$P`G`q}B_A>Rfei1lM%{(-wK+kX*A8v-=J*ge|MlC={xbeTQ&G*sfmZ5FlthqB_w+iv!^RrVmPgY(9{e(Uv12x=xJdUR& zV__Gp5#Q!s%l#SdI!kvy_j>LJxNH4;ko$Pzs`YXcZd&A)`nKrzPl>nRph(V&g~7Hr-YBHIRnJfmi~=nGx3epPB}Da zKo6a(&cu4BpfjLs{cHSM$#WYzu;LzU$2AeZ6_V^6I062*@cc?$? zCwS(`ik|(%zdZ0%1-Mnw^K)d7g#j!s$Nztdb24!0sM(Zh=lu2Qte>{lJmYY-`|kVL ze|k)YUcGefo{g>~QY|bV9IctXZ{{;C) zGQY#xYU6N?Dp8NkFRwj&yU;Z zlX%`^pV4#n?6uG1d6v(L@++p_(|Q)Z7#m%OYwSdU54tCQQr<%OM;K?}ll;q9CwmIJ zXXIl6kLBD`^oK3@nlt~eqderJ%U4UzVtum9&=E7|vYI<@RXOBqV9n7CJ{9N-@wr|3 zRF~X3Gpn=5l}5Y}*SzDCo%S}lLvcD0!RbxT;CRk7{;mUYRL{b1MRFeF*GZce1^zYf ze@JULuicG-$0hnseZ=P(l+lFOeJ?2+9@{!78#+nKid!6M0!Jhh%}~FoUwcO$v)}%X zZ}RP%qHnYZ|DQ%T6T9qKwC;EYy*Tus_mn(-WylPt6cXOO1}~IO+%4!b^RaijOFA$` zM+cr3de6*AxBg7;nOVub`?<%tAK+fZ{UG-Q_n&iThuCGD|1r>CY~PnF{@+~E|1*-V zSO)8T>Go<|BhPKN^roHtoTQbkoG~clNmr`(mBb+N{AR_n{~Wd^?MGR|y~gT$huMuT zI~-kK1^S5B#AZ0KE@j>Mnyo*XvoE2Ob!9iiZuI-Rz@4bwP<)NCGR|qy(ukS#$Us>2%RxHiW9_lwcnRC<@4hz-K1*}x2hfQ=*7CWm zd`uGTLtd_T?#s}LZtDv6i6)30v{dihv-qRN?wy&Bf1SfLtW7b4KDBFGt(!&fx|2AG z-syuj#>Y6H(ibns*N8KNdJ6VA%k#eAc`-2(d+_~Mp2hokwlcteZlypJxoI{cm zat-WBj;!P1Tcv#a73T?QO+8liQ07GH{Uqg1hHrc=&~;w+3DPA?Jg9fcV<*@a;(h_s z6Kl)KYD)|D)RwY5YbI|JygQXYv*!@}@M*P&c3nhY$J36_s~vp%CD(Jm!(GJI%1r0JwWg2-$9G~g@WAoA z!SSWRJh`F^JNo0;(dUD|kLS`^5BxoZ4Ey+wx&rc=!F%G1_B_vAdF+AO1FdR<7ueEe zPpBIOr_uLc7C#=R7hWB~x#kE?6N}(|zds(Q7k(g;{}U0MW)8gXx#Mwq;kzRFuL^Mb zeFfTC8^P(r7N^sr;50EBU)(eTP9L^7jjZDg=%yIUG2qcrY^RFFQmT4r+qbB*o^jj} zjO+V)co%*@q<4$YC(@4Q5%77mc1%?}z-RnVz44Mm!PUdy6YIG5eFcfF)-Kj3fJ^Nl}QYvssmZ_#EC}^_)ES;tPhVI$Nz`=+P$~&ZzLa{EZF>Q`~KVi z1D+3&kB9bs!GXV#+*ABN(0AE2hV-4aL3XIzw_x*$jeX|T+VU9_AZ0oV{<{6zc=UbRg8PQfNB2mdu;BUxMgsBmI_cdRLYTQUM{hOH?V zaMr(aixQ?%xm?oa7`ZuWlI z0egAf-I>^XzKTvRPWp{|+{L?Xx?-q2zK-}ToHfu)-07wD{KuZH$~&qGevoI16XaQx zCeID)tNc!zCqJlk|C-crpCGRk1R9kulNXJRd#JY@|47#Q#cQ zD;)4YQ;Y@iQ=MlV`pL;ZZupsIZOO0iv;CPx8F8IyM%(A1=a`6Gl$QLTo8%HJ)XGS0 zvfm*WO>&84VfTtma&`W9AVcw;wc9+e!;Q6B7-x#}Oy~c`o z+SJ8a_g&JrjpHBoDY`oAG65`see7`qQ}Wq1W{{mL`KNvZW!k*ug01~-bdr0WMb`-@ zo^-O?Ht=tA{|A48u5}W1lxaMIyxBwKX(sPdo7cB_pH^PwW8bmPubtF;A?*g|=vT5c zSmRBy_07-3-p!uPu6>e$tiG^5PoNE-dighP^JUiq3-bQ*4%!`QuS4B8>~*r8whbMD zU-}2T!#1csm3`ZlzVXYG-cxuH?462DVQr8i*6D^K$Em_sC?WgiSxvEtN>@GLo81HO z@qfA_*|k^jZ$v+-Z)&HN-H7e&vVLSPB^>8T^4$^7$2KIpumjz!_&*u_2Tsn^fBTbN zeZ9%9-6PpS&%qA6y>7Gi@euE0s0~&6#k0?IoQGy)#*Qd~qhe|8oq^ zvNs1kqWDV<=lbwb(zutZ{K~J@Ro7*RX%;v`Nd8VaW^AV~pQR-_S+4{SlctvTwj$$$H{W&U9R$|H0Miz4cwhGky3n zk9cLNCTFUBU&y<@pJd-J=e>yciT3>iylah7ulM~G4`(;if67@T9V|9@bifZ^Veg9t z3q2pHcz6ju63X{MAd5) z5+@eHH_y(+66iz1Tc4Q#eJ<5J6<$HtwLY&zAA+yRrGK{gRHpwUc-OYKqU+;)|DE0Q zmC*Nrxn$_wl7l1DyG#Fj6nfVMz3aWB>KSZx5qd|t)bn32kKQf$%8ApvC4NY2z{MMx z--Gn-!WSPqp59&B6{UC3{n2>D*zF~m34ei4oNxFHc-d)=J}< z_Jht2On&&xqtbKtX*#E8;5@p z?~*CzASd%)W5-JIe+K3Nd2R~x=)28xwfro@c|zN-;(bBT7R9@DZc@Jc)kdzZ_|Tn- z+>DJUuNZy!YqYYb>_)|{eIsMP1D~Gl*v219_H@qXzs|bG&ix7SAQ9j}9cSfwTl_2N zi((bvOT2uYVCS{F8q13Xqwre*Q=`8?r`<1|-Zb(_7H%@IBz~pn5bx*fJu++)>yn(Bf6w64rp(S8?yE!UrPf3a`s zUtJG=`t%=zfC^137ppa^qO;*97D5)BzWr*#S?!)N!^7A%)6&e0tM1$Mn^Ed-7ej|3gJuPu31sw4A1P)H7D95!QJ`{yF zF?wR)bc^ty3O``gW$W_-Jh|kX!iPaTy+rXpJ86T~Pf6M^UG@suK~x63b*9?Ujtz)< ztj+gb9kkO0hr3AQtU4Fo`>rpMHUm77&H4a$?T;>Sk8PQesXB<>pLx@waSr`)&AzsC zdwzp1dSEXC`AaocwomL$bX~@Xb5(Sf?t>e^p^%4`&@TDS39f7DLqY8v-&^N{4aMw2p{l2zVb>xPX3DL#%0H~mS_7{ zv-i>4UbV|3>_*+-o#<7}HYq8(i-X+mHWLQgz$*zawnF zc)V#(MGt41pKyEL7;O(_3ckeuf|ePa7q5!FM{Nk`Sa)kk#~w&_dygb{?(RxW)Xd5UC+MP?iuzOTXpxe5U+W@BuLNd+`#kgb0^R4{lEsBS-Ox|0_|G@4|HO6 znb@h`R#&tSd=%~bBsMnYC-{oqV6ym6_)Y0{uROHx&(i5n6CBA`t$e)|-K_!biy1j- zkoLt&8T)KJ6H9@UDeOP)Nc3;l$n?*&D^fS~?~e~g=-(05-B;1=L93vD-M0+VzwVU* z{p-$!^lv+`#+ONc{ip1}Pkn^Gsr-w>^2x`3B&YI7MR!ZE&hB2N@`Lqt_ZoX&t@8DJ zqU~TjB;z{VC-t4w-LS*UPuQOEg|h?wZSMcf51Fr%0~kA}=^JAu`R0_};KozQosaKJ z?%ZR?{%Lrh(}yk*{7jsMT#N61tWRrN-z(?6&c4fjSjKym-gCv7+7{#kV3*jH?7k!i zt>;WQSGXXUKgoM@|GU=gQ#o6mTIliy!5cZI#I$EirUC!c134!hrevN&Psm& ztJ(L^!hict>P~OKFL+~hrfA>1?ztOF+!$reS-rXtYxxJ?>6_Qxv~q@D`;}P*&I`}f z0^cU~dW_vQy?d7CN)8ziyy3i?_+>3=-+jvQVy(&Uw%yQh&S~2K?ap%F#(fDm(nNU+ zpi>J()43ZP3uVrtyamrq?_Rizy~D_e*8!&)oKZLj7>OridwiG9u6A}OyXQh{Cp5^W z&41u_HM)?7r;^?0d7Cp6(N!TgWQey%`)rw#IguMvj} zbkNPm+rXPbqniLmbN9W;b=%@@8UIht#4dW8u`Z*|Io{^%6^$A25Psd6cFI+bp-cFT zTgf~^{;yH1ca+R)k;p-cq=kSn3K+i8$ z{J(9MA4wn9052-0-D&Ypo=bR!Mww^gxOlP67BA2t9e0L|^k+&(78=k+O4k(dqbYlu z`!D`FeXh-MMg}rS5}3{jzBM*H0gvSSgL}tiQ!Q(=DZUqjkF#t$zXFeFTD>-#(0`2Y zO#9z5{u{@CoB6M_op|tkFWnC>u-|>YbC%r2ckz9!Eo%d1?ctf&n-_n9XK<(I-=g>) z+5?J1y&$n#hU2|pu_Kj@ktf}f%4qIf!n13io7%yzE-ukmd{G|XRy%e6>Bw3-%K%;m z50n4N75JZY&kcBzd4_L^pItGR^z&JxeV=pU(u_Onu8Thm>{wqIc@A62yNDZXnCI4ql*ilZDXviU82Y}h(sjlICvU5-{E79|=3M8} z^`uWk_PL`vySx~gCztlyXiMyiOEUPPTua+0O;ugCtSOWuUwCNG3u}XVO&!{MYhiTj z$4&aH?*Byv(I)zTo!S$Yud+GENb6tu)C(RdjW2oUs%_2v7d@do{CB1P)3_t|U8l7Q zbfeP9f$oa)IMa?jwfoQaeB@5>jd}C~Bbz3WO|2}59wEu|pM&{!(KnEv_b~QaFZ{sk z$i%>}cd8D(Q}1?UO08|!Z|FitFY2T{mE;qxN?F-i-rB$ix7oa3CNJp~`j7UeBrAApjVxV~tI1a}hh~sJ zb|3lmj?Y^SajI)If6y)7W81!pcKHMHd`Ez%>w+`RzR$fuGP&1L2=EEnocHe|qt8IU zdXKjyz%%r%ZM=V<`&{sk^sLFhq1tT|K5}oe^?iu?4$-bE(`VnQHvROS8q+W0k*U3b zKd0|OE41!nFX_eK9rP26J;DDeyZ^6>F>H8*IhmW_GWVUBO|K>$KR=T`xF@VNQ$u>W zO((YIK>k|N;SchuyePxi)`3U+Rlm}ND~%cKJox?zk9em{)5lV5w@-r`O`MT@3G?t2 z(u>YQSD<&&&*q;)Q90%=_It7qD3ydZo0ukJGex7wGW!24`WAa7v>p1Z{~I5{PEH#N zucC}f%6P?X;NRk0B0E-c5p8P9#4h|E@Qv*NuJCo}lh(%<{+KhCoA#fPcm8xnL3<(K6+rr5;~@Jv55$Z(bLiq2kSF6ewrI$Qot zD!DZr$RCf`DJ|PQgJI zb#6Vq)4g*>r`uYaPi#o%%Ua*zl>PhcSuS-4dr{DP6gesK`6sP8rx06pjvvb*OVge> zdGNJJ(N`}<9}P{T{}rm&+fvY+E=S&&Yuj-+>}Ngy(4LQPU@T7OSz{99X%uY^VWBpE z2w2ox8Gv=!MgK>Axb;o$Nh{BCYge5boV~W@Gh-PnvL zGIussU(t_FzTBn{$ZI+B$uDB}8HKduAnujiQ{1b-pXxQNDOR$kU_UVB`KG*$l*2o| zhyGwWdXTjkWL6bdeJ-RyUr=9NTG-38QL>{3g1P0e#gD4t)wuCxsg~$nZkGEqk64V zBiHb~bg_*;%cZ$~n6(eb;Qx;G69>tS-(J?VeF6d1^)> z$#cASM&a~OR$^b+uOv@-_nJ6EN%+hqlpmvyr*n^UpRKf2ug7*z*;+5HIUBn(aodU* z2gUTvh3B_We=dl3W#n%QKlaHR_>HmfE2T`yvhdCee-1vedcWum!U3&}R%loHqc7%(J)Fj7wgFr2H^8Zc_B_KwOKER|?ZajC0kk$avw-K$P-dZS z*(yq;$3nk*5L?ADa76N<=w}Fnf99Wk_J8*O4gTND*_Ho4d+#4#)m7zxpL=tY8z7KN z2uYwIhwvk5o034G(3Y0dAC}Zo%gj{2s669si9zbNXIO zzI)FhZ-AcP>lugM2|0xy_>#p-j-&aDjQs7=|Ajh2@ko;656)ZW?Bb^E$NzpCI&#tX zsK?qz9BDwT8<&GKi&ZWL?fCy6lJ(C#LvPuc z4(0thy=7;6Nc+%VzNZ}-@8igKAB%Tp=2HIe*IRy+vy|texBTy;^l7H;lhs>xrr&(M zpMH_dp~h!>Mdt`1RwoF8K@ zyi@C~aEi3co3b}P0G-LxZQdkZUZ~r=fwYlSbP4``a_jI0X2C`$9f7Bdz2f*WU>O^L zXUpN}ja#%n!Sh%h<=amW?UkKH>?ev_k*Cu>>t}4)UDUOf@yRkr{)V^a&F6UkmiIlp zPx0P}KI<#I|L&FguD>0q@48oW>i$}9{E_;u%`Ne+DU@gRoy%5Jp7foft5)B+O#T9< zkVpDX`7M|Kk166~j>5Ct|8oeU1I+hea0i83+T2Lr=t$lpeWUi#?045Jgl1WN zqq8|c2N3>Kywx|dANtkaJesvp>CmBgmS#2Uo4rH^-ppk^XyTpZ{b^u@tp$7h82X+( zTZ@4@pFMvP8Bo&NTKH$Hmp$ie(m{nZ>jSplMcwrs_2~L8?Wymm?Je!Nthc^n=Hb$g z%MaIgxcTjG%C7qnIC`FFE#q`PY3u2~_GYut;oXG}&qs&Xtht*?w7e);MUUe-;H7kU zlVp>Tr^B0QzmYK+9o~3jvw=+q{J8E^kEIY;BI9fjYz4pP_-@KB`=Zg`?er(kZgehH zAA~2lw)hj#-yH=O4f@cXM_`-uU@9 zW#1#*RQzx~(K7h|>AMrF3*O7zJ|{iV16EJ8t2}*HJ(1#Bdj|KreCO$jmetd*ss6p0 zXf^T{-Z9Y_=*y;On78z^=1^(pD~wt3#(Oi`n-=Mm8^fw$84zPY{e}rAzjcb`HtV}YHpQpU_E4?x(Ymy zjlJ|j+7B6CT(plks~5Tf|DPRI$WUHY`Opi;$~qF#3&}Umx;oeBg`RRhwF>=s0duWD zb8UdR1@1?YcewujNy)pWAC;b*HmH2z9&JRIwN5myjQS__0S6m5PjR#nIlU(xP+1{; z-JA#}FK>OV@ z+wouL=e46Y*N*?1skk1=|681>+F^B3(gA(f4}x4fCL{-SLuv6 z9RINUX42*O2QP~31iqAUZ;t!Xdzjlg&wxMyyMmnjhcQoJS1?wx`22aDLJrvN9yl)8 zGZypLt@6si-TC?k#trLNc}8Cj%}E#?6LSQ0>mA*Z>T4M{>6j*K{)!)I#>ZjEdlZ3B z!0HwL!K2(T1D>W2e3Gp7`>g9nhpp@H_oB?htl#QL_cUMQK|17TH!%N=?g`p59U0IK zvNb_|?M&s4l49Yj(vb$;(+%8fguZlj^ev(XjAgOrS&mm-{p1k6h*s$T!!dXCBNt`R ziFIygorwB7(~(D3r6XSC`opSUd}R(Fu4k_go(do8lK3$KAEb9J%;0Y`3kFKWDziLcnmv%!*xmgCUwkz9QiZxG3aFxb7fYhE;$nz&$KvO3CyE{ zPgC}7&(q)Kmgi+(w(P2qW?;MY@9DZ^TxprJvQLVL{#G|eenQ#kc-&}WbtI#3_#Tn& zhk5Cqv+2wmeceodhwD@`kGo4u{yx>!tg#6K)i;4RddIHS->|kTdnWn?BhT~coSx$I z?N=E4>BL2CS>i3Gig!Q-=vE#z8KhCh5qup zsi-$9<#?l*3$aubn&2d-n02K!9U09UpK`qk7B?FxJMBdp|C4!w4NK%|!ISY}&vDxT zHaU_vMz=Z1rfp-I{B3{Xm3;Z)H7;`df-ME!SmgKx+oC?_ExoaqA(KooKgb*Za&0o6 zpEhOF(k9X-qsS#C3$b#kx0Tv9e9yLFy4t{;q7O~jJ9_0&Y=-=uPK10#^xg1}%}$_q z0rJ?09(`|&xU7Fp6y7TR41zBoTLj7(Em+ZCXwda1sLNNFcN^c*3zh3Xx~Xz>e2E7a zyVInb!vC!EWpq>PE^2VMp>Ih|^dj4C@FEY=f6|TBoT4u(zj*%x-h_KDBHw}}Ix5%b zsAyA^bdmP=L)UjYQ_j>;c~gP!NF5b^cFg_M>?yDR7xYh4DQ61h$R{yvHae;>4Qu=L zY0~8JBR5>2{BMem3SW9gM^%^1>8R?GWzd^HTt`)x%;~7=k~tk!U9!S&4Ftz4DX%gW z>&p5Yy)wS1t(zZA182&h$&psqiL{!%R2RAi_5lvCZbGA7ua6e~f*R1AxTh{Tnf{*V(=m8PWb@LK z9XQ_1JnVJSPH$~+VRvnCf%>_@$;6lk3G`pDgXe~xYaT)WiclfyJ~*vK7x32FH7EGn zKr}hFxhy%L|GbZbKWX|gpS3$df7jFZL~3FX*)tZK;uhxoDo^+14YTRC-#LADU9yBW z>#ktUBi;YoPdWHf0>4|_NWgo?s$`V^ta;bV|KAG!e^CEZ<*w0h?LfE1{f!55a2J2p z7-KC&9@7~RXXPjNz#yt2l6?zVnG+)pw?M)VWoen$Cmbv5vrBapz;cj!C=~ zV{CXUE1TK*TgzJs#|kyRxjr=h0$8AHS}NVf_|JaZ+`DD;Ky8!}%4^X1EHdloM^3+0 zZ}pG9ZEeanz9ih?|8~)2>4YRhrtcS0UX@_N7@TgS|H!9W?LC&VTLu2VUPInVwodUT zk}pSd{LNqeWvCZ|?iGu7=^pJuFOyo!kE!k8srdVZ?MD~=7^!0_uw~s4mPK1e<@Fu^ z|1;X?`$s8f@C<>!D|sCIbCP_^Y&qxKazcHY8DF)Twl)gCNPCsi z=C_M~SMg74bEr?Vc=39-#fwm%#ysf$wZ(x@pGMphui7}HPgB{%-EHG$h4rDg`*R!T zhH?6~Fdb+6^sTKEW)#yFbEkUP&ZcZvyKT$({JhLd?xi(2J!W`(*HRmA_V5~urtH#} z1RpPQooLs1-e2Wi#(W=?^^&GPH_xv7qS9EMo8!cmp<}zgm7hP#%YxHh8KBGK>NJVC*1k4Jo)|(YmoiyDnGKie$tn|^zg(Z?_UV)xFff}fH(FS z@^9F>026Qg#8q9)oBP%l6*vWb$Z|dY1@h_Tw$GaE-4F=@%mK zmHB=Smwxn2pKy(b^U_b0PM-RYQ!lcfrSCh_CtTzA^3snIttQ=jNI!wcu0@g~oBOj^ zFMq*ZEbdIZHee^>An)W3N^>5Q{Ws_7z+u_0>VAqaUvE?PKmLMzMal;)Fne_TOCL1% zsg-tpSNEx*7yK9GLb|WwJFMGAR!aC^bMn)!UPC`v`{V4zWXs3BYXuXz$6`yZ&;8o+ zE4TEbFJ6$=yp0L>`DXr0|Fg74{Xxd_HI0SZm)ADv^s!yE&9!Y?ptjStHrl4X{iApY zwU6*W+4rMrpThXZ-t&bEq<`!BhSF_`vKK7vdc?jTRyu|0+iv=%bPp<>?bFxo`yr)k zhY#EjO}g)HZ}gU>uG5mrM1rdWvrmGzA9eryq_H_$SJ&X)17DviM^D9_ps7YLwxeN< z%h*|&=5_y0zt;eVI)BU1c^Er}ee^f~{LeJOmHr;G{e4#Lv;BPDzMoV3Y=8S~f1g%5 z+s_}^_cKbTa1ae5shgcqBihCNA2YVnt|GOoDSO=$e5d(-zs4)-Iq!p)9AKX@iZPJi zd+y@nT+4#9y2%8$Kmur}}&A!?$27^=-8E%`x?{ms9)0I@OQfcvnE3F>D$u;T`h($KKevg*vZ; z4+zesPRizojYF%A|}1%n|s^-`{S^;C`p;-mNltui#reV&8Dzgq`iL)dYr3q;>#6ges2$H7;?B#>^Fue==pYRXDF@ZUdD*&%No)&XB@_}T7w&^X|F)EzAA zbNz5EwciEb@A@t0VZ|SP4|xx?^uq~YTZMkt*IT&2ohI*Lyjdsc%2!p(D__?cJQ)ZsXi`dM@R)Rk&MqJ{Vr! zoZm;6==tdDsax~Ov{5_}`*HZA|HS8sYv?@mdalv?ly(KF9G%yBxH`qLUpuRQ@YS>E z2RQ>WsAn6Pl}2WnjvhhpB^})GHpsW^hkm$~J~eZe8k%Y9g|z-}W7v}5`MBDmI+lS6iKc%|tf5~si<5%6@JMkQ3;wUvII0Zl{X5e1hWwGz6L$}A&9ghW?w4B`syepPz@LT-~^pwZZBeE}bD&myQ8hTwUKBtDN!1D>J``CrxMGB5HB zeWL%zsCyvaUmRy7jm!jDa2Y<{hRK!XCr-K!`GpH*$4aMf${m!c(5{K0e>m>e;QqR6 zPjkP3d29(41<3El~K zI{BtPjL)9(*9jlvKloqxD*t8kAv(REaR9%UYaN1SMqjTrc+MF!=!eHyB>o=*=U;^m zLci}szk8xR-qir@_MqL1FJ|2F%buOf7-7HGsPrxHgHHsk2%SbSDj?y z_2Ojt5p<~`T)>G@1JGOAvcjy1OHVIn{L!`fgKL?}e6^wWgMA@1WJOz#$f5`ae_l$o*R`%aMJo6uJf8JVHn%XMr^LDfKL_moFe_n z+`8#Hoa^5Ye&zI_jS(|9*(b6W)IPEE5PQe%k5?R7P2AJSr4-j=!@Y#D$ByhEzK?Jp zd&(W`Df_W$`~-VSt>HUZ!!zthckC+94CK<@>Vb0wq)*c(vz|3&uYv!sMkZ+Vj&MlV zy))!zioD2UEzITdw25@=|EmXVI%vyv%kt9g(caN-apiyJtxE3)==abW8MrZbpb6S< zs2t>pGhEtHG#=i~#(jr4Pv2hT>KC9diGcR77MHX#PgqMM*faEj@5xJ@NGpEXS1{-A zfMzHBd)-p-wGg`j*7IxHf%AC^W5Z_b*#>g!e#JAu{?HKY>F3MrF^&DEc*_$10mc{k zGWpR(T(fI)%#p0j*x>Ws!k$O-)$SFqk?fYkrKk zc$txX;w;|FZ^6c?SL481RRYcVh2|7I(QB+(;U4*y(ji>RUbwy1lV8p_{6d9o=W5#7 zZs{6(Gs}<9_7X5JrqQc1lT||I%D|n)+&~dpF~Dx!{2ehVxj_ zPpB_5J?G>MaE>(7)L-CsLf_o~d(h%|33(pJ?r>mpV!DHW+B@)b%bqNuHnfy_R|-^SDnfLWa^Sv7Y5D%jGjVLBb8slNG$?FeS6&^Qv3Hk~{!=#p&B`x0wUk2}b|%Fq zzg_SWJrQrbpM3&z)xeiL#WM9jNSCLO7-fS@Pt&nv!D2uLyca-(hQ^HvgyA< zn)3qIc$I<8iq0KAXVW=R_)c-MxQ#{N7NP7olE5^MLUzrQz-JF4sISyXo{v%?;I|@-@%<(09?t zcT!H?9KZI7aE|luCerj+9AzE3mif;*!C1qe9@W~|$DINB^BLL~-klP$v~O@;GpC^C zFKr&2(>I;|!O(oZ8vWn&TI3N+!N0zcu7&Tm#E|S7+%q_{{pF6vN5l1+wy53gDgGP1 z5_`1Yd@pak#*c>CTR=CiM*laxkvbHvBy9L_>A9G{=#8`ocZ$;sJH9uUG@P?K$$I=W zciN>{pPy#`*1-36M(#V1hFQL9)Jvg?kjgm)`=KI*L z9TIL*--mgF>!yv9Y#YDLe{`mz`ECe& zx!V%Fd6|7vK{s&L{s~*RqurGq(jS`pHL1IeveUL~pRy;Pt!$MGzj!re4l5fyb`^0) zjb58OGmT!G`!1;Gr|`ii@fp((pYY!)?o${4k!BsDz8+}H6nNCB;41z9TJg4cM+R7m z@0g?hKU3Oq#Q$6}EB=G@kI~Kzn@16uwXQaEt)qdW{U=P)F9s4}CVT_-A2_B~n z$p5{Fb>xp#;+7`TLgaO#`>l#_Y-xr0p~Gx ztmg`*L;Hqr2F#Z#&ZVBv96WRH@cP%c#XFDX@TllF%t`I(Pg#FkN!B@ipG+-sB7WdR z26=JMd6#%`X#Abfl@p@d8+j~mQY8AOb&Yp~xJU|HsvgHfHrplofIX69ZRESM(1MZ_ z_pSCg8TLm(B)T;F8t(%8j@`2g+zA5toBhunw-esv#VBKRs=$$51+>!BnH$fB|Ap`- zOPigIju-QHn6;(K{+IkeL--l;b+Ya^SULm!zgp)!LcXa`Fab{_Uz*5X=NNSsif`sA zAP)QH&SSjC>FwX26n!l8??>*O%Tug)#pUJEo{2jnN#6<$gfE1bI%(U&`G0ql4R0l! z(Z3Nq;4|m}7BSZI1!v6@=ILnom=j9N{Aq+A5`Bdx6m8U4(mvTL1vE$u-kd_V56@_(|Jwko*7gW_-oE*j3 zt3)%KN5Z2C7u)a{y}wKvY&@&BP4Hr0f;Q-0;8Dm)HjbZ>-8jaHZ6rS5)^j6y3eSJ% ze&mrm{T+_#n{MkXvHcsH*S~RL|GJBlrTB4)-fitc)o$63sXc|%XMDh8d@LAfZA!sc zLVJOeul-V_pyI)IvgW_)2aH9d((t@#aMEz+m4SE_*oaJMbNq*B1F22w^?u zkA`(!{blq$tnV)w@9ot0X7;_HpsxOWXi?brt8Cww=K9_en7(_C_GD^{8TU7(?+tS_ z?z#G~$75V#Z)V>M8s_XyC6cD!QRbietv)tomuz6ZuO`e~Ub2q)wwtz~t3n1Rd~lNZ z$4NTtR;8m~#(rBg40K?CNo4yc{Bt(^ZiZB@HhK%jJ-lJ@#-t*|K-cA5gyIxC&GBn|5aD1Tz_YB zH1lJV+QI|f(b^Pf&WvxN-;5V+52n+`vHHh1bS}7x|C7`XzJXnE3*Y#Qf#y3&k9-kZ z&bx>&wdqvO`}iJXzg5o1`NqEtw9%B4{42r5Z_QwXKL{7mY{9~u|FQil(-< zV`eIrecf+OiU+P1eYNR|>8A%wj(d?Seu^JI={&71{}ulQ4fnK0b=NsstEP9?nRV_e z-sof8TX+{70VbPbt_Munt6lM;=riws0-ocMFP#8p$JJ-nvg5SpE#Q@>`muv!zi8IN zNyKTK7>_HD(w;T8Jx}8QEv>zHhB`J=hb{ZbEzvG)s;}6lF*`C?M^l>e3ssNpXMyTc z*&AZ+i#?P9+<~KS_rgvA`_SLE#5~Rf7+#q3HD|-OE3y9z@$E|a|B~$IM9T3Jhv2U7 ztM<7>=m$)kXUwO(0YC03_ zKPNoKexe=z7hC&M_|7t|dE%j=JIrVHAS3R<-bLKHi(Kt#5~(T=d;HwEtgFimi_7^E z^ToHER(jyJY-8Atq8D==VQIL*ifdy0b?c+WU{mEhT_)|ek1swY{ZdLBYv z9oEBH%Ei<_%nuoJeYXDhu$M}e1jx3jztJ&%ExKba{;kjI*R*2fnlBq^V6==pC4XQZ z$>L&d%;l!+6~6`77KQC)KFz1S;G4zWzxBY~|4+5|Y1-Qmwio!;4TJChe0v-J2>8k` z8|Q30R|4Oiw6`{FFYulDCd2nnZSVh~z39Di^91-#3E?Zc7UDYdWQOL%y7#-BDH45i zO4px>)A3E{5uowNdl%opx>ID~vI4lgmwKv{2fjH0Z757t`G$U)ImtLyQ|7~knHcf~ z&M;`6cx75QZJEWCdC7<}-$t3`$^-qc4BN_ljX~cyPmU~ybxZSY_D!dcLo+xJ+L>U# zGl@OTWcJBZ{avnj6!yK&6zJ>^*oP(AqYTjAi&>|R+PK}sEhBCYam#0r4xdw*i+Jyu zxWjuGnR7d`N&e5)dddDtGAQ&aS8k%cvgt37UPWs%X{M3}dkyJ}mi#yCt?_+{{Noov zY{_ZhHO6l>d7|^^yW;4>QRaP`x6%C)?opaWjm|>iun*}x(I%h36>e-@EoUDson$Ye zb*qPSMmkfWz04VVi;e6pHnNu)#?R5|?%A$jmsVc(BUMWCWoYD=FH9CUkMW|~BMr+V z+BDlW=QG4dYJWjr3OOT`=pE(8WRqd(sMhOK8;cz6vx|D>xZ+`c(3D-Q^M7l1126SS zbQyfOMgR2hubnZ-knX#T!Hc=L>SE#=iR&fq=G?g4+L$*k?Tia@<;CI)^T&nrKO@Iw z@!q^~`G<2Hmlqj}cG{a!UkM)w$Ax)>A87bY`T~y;?Maw@E@y*+V(?$*RMC@n9{3Xb zOv#||c~>yfkK{J|NNz(;lE2SvW(<2=F3+3Lo% zj*tgG+3-+2+V`rx_sn$@hsPvi8=UmmW+z}S`Z0~oHrlKIPt_)o87%%N{7SpVMSb#v zjK<|_!2b|u*ZVlP{`7ODozL`_cK+aSY3Cu%gFY)6rpAZ7w~|+9+Hd{; z2TAwcymaFKSLDX+{h+VDogH&f?ZbK@A!!7I@H4UY8^<|1;R#fwQ(DV$)Qy39%J;c|Y^kwG2TJWa(r z<ibSyrH)W=jd$-ZP}_gop;|5?`-R>O-FKb zDp|yy>o<&{?yeax9*;g2KpSsHhW0J(p9~$18d}l^oZ7l8I}aJ0UD)}U-{Ojo$LEFX zD6hsD`dJ`)DSC3hr6(;=^^ts+coL;qw+Q|zXp%iG`e#>9`DWS(jQ+*a>>{<@#v$8w z&9|WyoS9Qw-jG&6%lTi_QzyO1<+?}0)3^9wwHf+7hH#U<(QozxNAXwEt9DU8GVna! z+PP&7|COhh|810mzt1J``j_to2iNdz^j3WT6W`0hjhN(Nf)RO&l$J98I=@V8D0=aI z*UOcJiO1QWf!j-ki`eP6Vpr2U7aT@+lK@YxuBLMZ;a>1}5$TrGZX;7AEL=X6N+fp^ zUS`ASWsEIIng0Oo_MGz>pOx)#lD5ZWTzCfa#v^)_o4^J zX6b`w@AyD&Pp!Q4@sspp#jtWHTYCN;Cn@|q22F@iXIy&<(n4!5|7+Pp0H>SP9^zOR zFJEor3c;V_d`thoTw(B7JoR-)83SktcF!5f#<(}ssiYs+C}o73Q`jF$?}`jj_EPeZ zFtp!dJI)<(=6rhP{j2GxL=}u%xlsgmh63^(n9Ov!AwVc!(RF|hjnOqxKFcv8`T=~$L}r_Z+*Ge zf6;|Yc*|eKQ|hnU=(l=;V~AT*1b5O;Cf#Jgk@@>Mz0DW}#-C6H{7HrIO}IdBPgtVQp{ z_xlO#gjz}4y8!$Ie-pWKZ`qhDcRF|}T)d@S<)TB}{?No*SKB!4+l0fy)suv8wqflB zm#ZJlmB}r%JBWd&$QjnxSv)OdPbEC%{RVitM)WE_kJ9GjBRKLt)uHn7O_BsYRqe6N zXwEpU1fE0tUo)QWIL3c2<5{8coOe_9q|z}*KhSK>`1?~Rud3N;!WV;SccIE|%3dbf z$3)u~?zQM#E<7Rr8zHVUwncnD$iJHvo~Ju>b9q}ezQFu)eQO=|@g<$+ipykPri@UQA)l@ect2HRI+A8RQ!}p)L!wzN=FXQw zbc!eamM+;@zTMzL9-UL#5x8K_;a#@W!racW%dSyhXwMA#Sb?pQz#-4r!;8rXGRdL{fp8F;2~ z8w1_oY_;p4107(0Ql@%=7y1lWdM3%~V_N?duQxan0f#uZ;%Q9H*(lN&f4JbNwd=V| zcPDGC!!gu3mXL<*%8kLIZ>e2gWYLrSt3;+Vc-D@%9}_2k#3uw3&ZKRE-+2Q&!(Rs6 zt9U~5hWf`+jw5*3aTG(ec`|C*iVcHhnljNO8%D#b&{dn3_33Pul~Qt+UkaM zl=dWq&qMZ&FZ4>E*hc%pGH56C#@H`~=Q>tM&-r`Kb(98_L!Is78K}22XM5awRBL+9 z_W1G|*%|-?*&#YbUSzcCXRP&@&6gx!o6VPZe&cfPpj?ubTr-!?Ii-BIf34yrOdScs zvy2qQG$JJ?Heua_^mVgYBIp2jx+lg)`EeHr&i z-w`*6z2XK{*y5XeO=&lE-I8Klq(jwst)V|b-uaM6q4&@3r+(QW2l1}{@Qes+yvu!# zebD6CLT5>q^(A|$S-Ya2WbNw1&h$NP*nO~W)WVw}%hVcj+W_H%M`Ep<8)*&Cjcfv! zb#6qy2dqCavpy%VSDXrd%oH5vH9DV_tpR=RhptXz4(YzePeDgB^wlN2mUoi(Cx9*I zNF*0vKU5sRSLg2Z8>n+aKHB=3b0XndGQ4i>>0kWV;9An?T%>frYYebeJ`dPW0rpb_ zd(L0IL+x#jds8stLq?boeI88WPbuLaw)oa_9noPzAs}OpM8TqjiFChRK{v-R;JG@Veu%jC6lWZ@aHDfQF$=zG{3E_+F^Emml1D}raZz5-IJ|O%OeVpeR z-v3$UZ^|yh|EIe;q(zG3dn@t(q`Ea1^oAY-Ti5yQw~haUe7dw+bcp-KWy7SspcC~X zrJ9?m=-JPxyn-x5@{j?zqgS1vDm=%+oQ*LLj%sc(Cp^M0iss3tj&O!}afhJAM>E)9&>wV4i+t$uYTMsW)4yID{v_e!Hhd?%t>(L6 z@^Qk8Y?%H3^c6PzVZs}282`W1+ie*8-|77}{64}bZCLyNVjF%h;VK(mNw_u#TNnJh z^eMqM2Ro-@KQvY8NCWL%^k=|7VaI{Fe`$x(hIAL){>MjcdeUA;o=v31POYGCbJ?w; z`RxC#ouKFJmhG_@St$G8@oj`3&wYyzAO9F(t%-znH!Jp>SM`bhvNn(QIqRi+gvGlS zaz-0{@B5qoFF(4zq0L>tD2T4R0v{|cw3q+3kNE$pW-sbgNWMv*&_M=9$GZOZ!07Hb z!0SB)uM;o4@}doim+m2aJnlHRY)Bjl2p_{`V;^D9-(>b+A0lo*{0Z$d{#a-m=g|yJ z{KRwPoJ2D^vlRL=KQQf8S;$w+8WyF@A48WSD$n2L zB^KS3J)wNmu~6`WHfl}eKBTTwJja_?I>@jLY{#y{*N|XqY_?W--0|dykMC4jw6mYG zMJMoM*)_mF`3)?jOz?hTH)F6`?erp-phxJ+!1uH%-+IdYEQ3Rtr&4!0(bNibHYyic zg8pw_>8@ILS&}qKXY(gL?zvd_2>J01dr6ndQ5t_I_Pmt6?)D7)oHy0qn9S0yFA4TJ z99Y=Gx{2?DOKt%c==m;rFYn2;VY23@r8$N-6Mnbxy9ROlHV$-WKW_jRB02lbuD zd)>~wPLgjG{fGDR&bUwcSe+NKGEB>RdEwZL=L_3`uH?n-;n-8ppQ#?s!yW3VH{)u? ze}CMJ>+|+)#$VxIG5&kG+a(c@*R5$+TD5VUEJ=ryntABZgLlFu@Z(rw?yILr_}nK5JB zeSBrHHJLeE0z(@bc}x!W}*wXJQQh@+Q+UHErovl%BDYq#}a<=Zv>BZN%HJG z)+O&&TcH(Zje&khF6^{HBl76r8fZq9d;pA~hZm4;(lfE6NBx$Z-xK=QZqr;#do?dd z?EfygGDn||=I#F$J}{gfI-50Cl$*EzyQIP9%iI4g{L&CzbJi0vW-$&z-Z!KiJ6q(vJtvqcV5q7@m3feyKKZ&d#!PR{CDM zU-EzNekuRl{j0Om!_M6|R}RNxov#O1&0XcdW)khy*?PNgS@10U$Q1Pje60|Cay&l$ z%<=gDB6!;WV{`Z^cp4u6n}P}dB!7{t0hlkq{?}d2c*s|p_UD$rU(lg?E$(T3pOwdh z8r{nq@$Vbq(|aRsOtSWMwaHjF{pq%2-^F6;9pKh4AAPicL| z9(^TuG9>9ocxG_oa5Uj?4Q8}qhsUWueK6T9nvAdOU{TYjTf1Z-S+fW z#d8i#=kT;&u;;uMycHeOaeb5SJjQ-dUQgU}lz9blgJ%^(neTLD6h_~HoPNhDe>{2d z7wIIlAJ7?`R@#9~a3#8fWF{vY90?P+okIshn1H*Zto(M0-&*bPJ$c=HcUpkG8T9k# zI~E&$yaHIDRhy3t3L4$wB&ykCw8s2mzKelZhW3tEf4s=W1AOaVLdp9$s{y}!Q}#t8 zw`$dWyV=8PpZ-y18Tksfu%B(o!_&VO zo&x)k_UX^z8xFo~!M%ColxLs5C{P^tGr2Ju?we;n3>rf#eAV?7wB z@gzO#_xuiM@p8&3Q69CC^j%F8XJi8sVeBWi&NOz2s_*mE zhYrTbJXiPu;|-swaUkv!N1Wsy(P$J>4w+Vxy0SIl1zwGJZd_$s~{+F1)Ttc3%Qf-lHN zj>FqN_R8QL7HQp|`VQ7r$=lzlHNw^(@^ItD6JZ-UW;kz~bQptc!~>D<3avZf%mndZ zBl6?p;XTX1d6#y#Yiw9o%a7p$jkJeZOXI{vzj1qpa}!DF24B@Shvcn41L*%SA;)&40sR1p(%Uuuff0bR44mc zo!62bOqF0j-wYoJuEz{4@o6ABZPr}lE6A+5t%5saZD7=teZTR`7Vcx@^X{>t1DO*w zU2VBBuXd?ZcY#eFjw|nZMfHxr70uy1T)FsrBXH%T|3kR4!s5!i-WXT@%|8pSTxW5` zv$#@zc3gS)6C-e?5Ajje#2tp=@~j%X^EpX93SYru2S`c%;Z8(QeHF;-|3gHE!ZN$Ac}n zdx!^%%+Z=ox(?D||371`(hd3MS#VcgT6pxF{t5aM?lbzx7ZYvW6yLj+wfRSz<9qL- z4Xhs#wLzzrA-oXl(~~){B;HNp4#5eYPd)NK}zIZ0c7Y}eS{*x;4#dDwIjX@@~r7622J2>Z9n~#=ueFeDC zzj>Vh8{`|Dfp}MdKb+PaZ0F(suiB?SoPU^E%=%Iw?(`=`)0-Qd&0uKoe! z`1rXQ*c9*Bn8V+>pWi}z$m?+ibR)Dm0$rVxsqeTaw5^y0ZgAghdUvepH`u~Gw`XEY zKeljBV+(hZKL0(qgm1#6cn@=Ko^K;ZOHl{^?>In0RzK3^%P1p?lMcX+e-wtg=zH<})Ga>4@wnb!Kk*l58f}?Il>VCud6crkb*U`<&V$o~1k9)%zujyVzEq zfxGexrTBc@75*^apf^t9xzet0(Z_kZi`dd6cqz>xXG~9J*8%RQ7zpdK`BsyDw(^GQ ze^=XEv3Fp8`q&N#_n~id@rmKaY*||=OZ#|uNyBTNFL<<&F5szQ?}u-m{t$2QCA$M( zvVFo0=z#n-$aa8no~Q9n=sQJSP1(7pp8-c$D@p?7XEyHFiX*T5P!uViblL|@Y+>H$ z+i&$HC;FM;5vT(g6skS66+D>xGvR^yEPfN(w~AD7G;+C1oYgt09ZZ%1CMlb`!S zjt1rHyd^f>d9Hb%5#hg{dCYt!+Hqtft7c6wnySpw^ zwSInvy9?6MyXR+&A3o6?(RSho^N0qq??C=$XmSD^knBf(KYBI*&yCS^^f39pd|@)S z6mMLwl+JTkv<_N z8(r$SmVM97q~%U}(T)1w0;e?r_G!RrdHUmSF;9Z0ipS-tf3j!vw;k2Xjb zRzc^(|0nq}%{cBqi)!bQP z=0U0EIDK6Z#M?D5ic+kXeeu1>EgE)+2J4%CPUU<1GsSl)?KsUp*7@zM^Q#{!T#{w2 ze_m@nd)%knE8UaG1$Q79>}QYjd@7M-kGnU6j+-q@9vWBiY})pADv2ntfG$Xo>rh6a2KV?k@Q6cH}AH+FlP| zIMb2bHU$i{t|QyXU(4_hT{be)HhS^ z)FJ*YE&k1p6>wX6`Yq~{$`aofj@NX?D=3$&wO;$&gyr|nHeMgnc&UtVO&1?vc!HZw zkJI{&@2pa-mQ-aa4%d)=C-|KRN$`Cia|Qfm!( z+mPq`(<#sGC+ECOTGqR{8+lI=ZlJGt+0v`H?E8@u^kN@5IaQICZ8~S^Iu3%9?ECii z^4;I#e(GQjN9Ob~o_*988M5nYK>qJWEUzzEj7it*Jz&%Kz_%CY(mRFtD_cVwFCzV0 z`bgvNG<&MgwvoT1E{MW^MsjQHZH=t4J#(WeW<>15dy$2r!=54@d7W>fF z^82#|jx#N%ciSspYzF3(t9Eb)n;V&lE`asF$BSI_IPU`r1Glf{;5Fwff(h+C_!{de zI(_439Q+FR#}i3+9_`iL7MwM6nLjtIU@bLzf_aV3+jkeb$XUAj;n5O1kiP^aoRM!Z z_$2vDI=I)7K4Z)?rF#!HWj`n0!|aO%A7HbBw#aAS;9h|BPy6n;)a* zoj`q=eEAwO4}-Vx(`Dk7^VdA_lg!;p=yZYhJff4(Em!Tf<-dpWH-+WXz7X%;5#n8b zeTEmOKKZJVuj}T-@cR)}U$c`epgv^Yv_<|+a`p|c3U5`fztb>) z&cXj8=KqZTe0(@pKS{z1;UM$!bF>@&cJD#q;wAxyr^Z>@Gh?*xmkS z!Y*%&mc1GEoSh~Bzag6NOTppIn%m$zHY&Fao8P-~^BdZzwZAT!Kfeo@-^}a20%xTc z&T-~*F>%A@x%AKHHqWo``qSt6#yifO=XIHLnCJaX**fX^wI?68&isM6dXDqFuH((X zp*NW4e>Ckn_jz7-H?V8?6Jd9b^StguZzk-9=6T(pzZvzMeVzlqp?QA%e|(-_*(G}} zyM|8>=lJVd!-voD3r7u`<5&9O+-9D8p4RdFHQdha#P46j8+-rsxqY|fNBMjtYxspf zJGZ%g;g7-36@Marp5xrUu;TV}>1ufRYIyi+^vBicCaTdNS0`PbnLM@9ZyNpa$1=s~k7W|+ z>dc`2_%-Q|6Lk*!e1CV5FWPXl8x5T0^Q{iGOMXbSewU1xUp6%>;ut89sia&b?c|Jm(>unx%U%w|$wEH#k z+{zuXYc@@0&lxzyZOJ93zq$T>vue;D7#l~^Kl*{a!(&a^1DTm=M>1*7 zcx`3xxrMp|?lk<$7i%;4K+5PYtg*a}e=7VYjn_B+WRMkPvd9b)p|2$L`J@X5)9D*~ zfn8r;0=Ib6 zXl#_ryyAQ2y2Tquxmo#H+F0hrdXe#Dn8U!dl6hn9>5}aM<1?9ZflF{3{u5ev#WJ$} zlFs;9;+%QFLt#CnE!7%e=S_t0R^mphyiEynexi)E_~RNc$=?_w!EdYP7x|G(oS&6k zB86{D=t5L-wr=Osd!S<)4E-uc2bn-$ zc_-&q@91#?{IYl5kuMiI8^3P!t;ngG^L?>V)5Mr$Fm; z&SjCMeZ?baANL5loKKQm?7Gd+J})T{M$ly-Sd+4a{mE+Kuhva$1JBRNRl zkcmki5z5AxSLg3xUJc5w(0%Bvf#P=&zdNLDLHwH=85{XbxK?_1Y>{L$CYc8LtI@}u zZ{+_rO`}bt^ZsF)2Gab4+G5jicakZmI4{i#(qLmWm}Yq{&BffOHCT>Mnx?!oH`_G7 z%1g7GG@r;zv%;qN51R(sFCV+-|FzNxuZC#$f#q*Z({B2^Jeu}3^8JZ4?fe^aH0?m& z{|rsL>GuDhrsZt+{%2@f?N82~rqyEqKa!@^J_~;3(Xde3;JLAHcU#^o~a>Zb=Yl&)Og8(YnZ4oBkXft^J1R zC}C)F?L)M`*M=V;eB6dxg`+mSgYY67{wm=WHvDD68*Lc-pYSYw?H35EF6c?^X2P<~ zl#Q6^#i=1!INz2Yi!}FWT_Fv&UecwW&;6evyqvVvpQ)`)w0jfj(4U28$@;Gfy{mM|b?dL1_Bg=`qL2K;vm=8M^(I=!B3{JMt^N z(r?Y^T>Ys1=sqszTs?ZK_cyOhPwn9BcgK=sblu|2wEZ=n)-d%!{=apmeuB=_(|^{^ z%;1@Ne-rvz&$%lAUKhgOaOX{yvl-L&OuRpPDQE2QBX|#fjc?&@ykIUcz;~9%nU@z? zZ*sQ3v`y>Hk>T=i{MdDAT}^0B+-laGYyS(M%P(rp8KV8QHNp$l?{@^~V#9T49lQlP zu8E<|VrrvT!Ma?6jlql9nIWHD_aJaVr)TsB(AerV^b_98sSMYVGuNNm64GrA|5vj% zVKy#3=!*B3v49;?Ri|HN0ZF50v9H9uAVfjx4{*}tOfN$Bt%RG#px zJ?HGFQr=Wk9{UUZ8*$E_^Qtw^QU_;nX8%NGD2?BmmTggZ&b|y@QRnPGud&PFMGgG_ zj7I94#P@dF_t0*0gsx{_Qu7|a)tT;^eFHX(|CxO{Kc{%?Z1x?uVf<_ClP@*mCA-;o z(uR?-?mK0}iSC;HP7d}ptp78r7>jgxj|XG<58>Tx=pb}PM|ZuY>EA~;mtnsFT?2-p z?%JMVtHG|SGp)Xm?gP-3<>7cvhdu@6)5H2cM|~?s)MxIG!v^6Fl}(+Kbl;)UQ1=eX z`wRKSu=SS7#!~e_XR3hxC-UlDrg}A>ku9TdMxW?8v9{d!HZV4ZKZ-bxgYTa^c9p+` zZl!Y#HW2;zmXpoH3*5K3hW*3~+`rh)9^(ak0cD`2hq-T3zUB^NzoM~t0oe8e&!aYs z{n@?@`s@yT>n@_+3G*7o+ZbC9XkrcP|BS8rhTbg)zB&gsL9|e9wf(v(Ptl4`!x2n3Erqi_P?^vD4}fE!j7}oUW7V}R446tiMCJFchjXW zNF$xB=1EwW_DM5_(#-k|X~MY_rYR)NS#o z_xJ;8BsrC$QeW58kTk=2g5DNdT=A{iY|J|)Nd^h3U zHr!0O&xX0jS7jPW7b0SqsCj&@+*^h5R6;(~C~YpzO4?siaeH~HW$gau2cwr}9v+u=B&Axu|Qz`n{?RZml z@4LnvxZ`&!XL}O|$2KHh&SHa8p!ktv&Uz%@3gFwU%^I)3@KeT~>)-J&7t6%=p_?>g zD7mc}w^UUUI)x0E@iaVjqthiC|NC&e8M~4m+Knl5#^3Ep##-L0wh!UiSjK)37H>31 z1b5~?zKi$0sIcBDhjGD1L;U4TPdYNnI@DcH`6{z6kiUWFct?3Z&%0m)bml2wm|y?? z_fkI>>|g1%+R@4?!|RA{(l(%feco8 zS(i(AIPZq7b9{dZHe*w%?>TsenC1s<);y6fu<^jIi1u8j`iP&eJ}I7l9L>x7?Yz8d zo6S3e`wHA}ot>q;J@mha`fV8*;Tm=Cy^p%h81kl`$+^?ofI6mpm2U_oC1J zZ1|)!YpK66kpC|Ehn}#Zxa-u0xL?rAnDx4^yPT7VfnWW(JbnRd=XRx|o(gy}-7oni zeKVKT=fZFug^pXFuroXR;`^{gnt6csp2ve9u6-}^-M-mrI>q~O;No9)u860D66At!3|JW-Y^0853 z4|WN1Q0}KPba~XgM&~lETYSSmBsHHdrhQc#VqK?^X-9i1W7<-*tqGY#xtrf#T__qjVb*OLo!@ z;Z1xaaq6RKkG(%&W5kX4I~?xX$eub}jE{QPDR`>Zck=pEr2Z%mdL_b-}TUAB%!2lDik#;-N7KKVxcl3jbs{RiO3 z;D4AO=ImLRhc&QxJnJ8Ouk5B`zgRpLWActoWe$5jv#&kel%4Seyl@c0Il44^TJU9! z2)c3DAI1ak~gTBBV_W00f$|;px zu6wjwCB2T$PPXv0k{AC_cN9_{=M5LBjk2?aemuq))v2wji+aTWo3nSD$oEtUJ}b)I zYQbFa6U<~I$@h4|oZs+8J1Y*AxYMOO^Mj1e#Z1syfbPO0D^w5T5J%oWzAtWkN#G-H z#%kS{ra1P<6Xip}-a%xVum?1i@Lh ztU>(86c`mqhG~8p1usI&zd={Hy&Uu#6hV$U>GCTwR##;oR zN_|7$`=pC{5E-C&40A4M1l)JeabIE>#6j08i)Yuv=2Yus3;{#87k zg`e(dHSi-(jJ%l;c8Zs79$Bz>yeUSp9F3v9lxD|uz zPuO;(u|r7Hj)446C_bR9^_+d+{DbKyet9BC%QI7U)(!QOeL-aB{GgaSu;NGQXKoBQ zC&ZmtTZqeR2lraIx?f84rr6&VIJ}LFPO^*cIsPDh8_~u%aCkD;#u-4ddM)E2-(63N zCK_7nIdAcIC7luZir9}NEPOcsKf~2`3w>gb)3poO*tX)!0X;WmGRKhVp1v_`CpdRu zD()rVfu3akv+r?T__km6)HWSgeYBr?gR|A^+Il7b^QhN7hkEPt>Mczb4Xd}o)|)YK zTbg}b>%u@D%tE{&eh`kV6Pwgdc=dPF21ARHRqo(yULWT`%(?u~7bmnDAAXS?oDIt` z&3Ckx2LqQQdqc;;88X9v3*W?lbKbXFwgK8#0I%xuXT~9y;%PSL_MDODz|474t;Meb zx9(c*aL=9F8!sA5esfMo?W4Rh*5~6*+3DG58a;bwrkkMelK+Xuj7ehpSYTh?P!=y7f3@oQ94e|JEPrjRY$#oT9rSgb}U%cJRm2o@# z_3g8XOYp8GEqsVcJJzO!7T))5Y%ULC6A>Bnua7w&3DYVaaUUj5^x5RMaeqbJCKET5_X*$y*9Qc09<1I0 z{N6&G^azPOIDbO0+RdZ=`Q`8r`zvqDLf6)YdC7O3Xq)sVd2v@MPG`~b;ub4Tz9jPE z7Ag)~p{lPhNLD>m=1ly?f*|pYi-O`kWBsZ4!Krv;L8kcOv6<{67iAKBSH3zkU5?#T zj6JQ-oc$3z7P@gKaTZtxf(bNyBl!Dg;N)ABj_-T;{_}b8D1sB;pX2*od{^pQFmKAb zCxN@qdCj%Z>Rxyx4?c)9LtW+^DBtLr=WW5B?&E%Ltyw2pNnYlv#AODVVxYCZp zRyz(g+P?tzZ5jv0WrqF!ipGKOY5KO~a3AB)#=eUEcGubsNV=XvuE!oal5(KULDB;U zPAMKZz(1YFm*!c=>ioR1s>&NH$^Qq(in@z5&bID5se9lo<6e&RODhMAI68DawIFoK3aU*Ekyw4GrN89GT_jl2@ zvZbeA5N$K%4${YY|A#V0(AIgC#O2Y83)Cj~nf!K|HjO1Nubn2H_HZNHnIta1oeR`X zwPjb14o|TB_YfVv>GXG?Z}?h1-2qKaY=61KM|awe?$m?dXoufO!drAcJn@JRPw~V3 zmA4e5d)>Z!V)bfttv|%ZVUTa;%z$**KSYm<9J52ZZG{8E(qTWHGIw}&oXqpvBN$D# zyx+Cpo%V!dcjfxPy$I8e86P_M0MwjUnDyZudA202TE{5w80Em*Ov~8xd=I9-J}>=N zcnqZ%%sF2??T}5+_h9-f^3vZc9W3d-L;5^lw$;FO(4J+T_RFMsf;8o!Zh+aG61rK4Xh~IeaH?qc8e7xhtLu0)N``cJwyyH0K zOr-n=DGMF%Du=sW#>hX2<`Z)x$-fr)&{14d_O~BXn04}9;%E5&u<~Pftvy-9+#x>2 zjVT<;-QktT@*kbz;Qw*M{^w*~9q@kR*lS;-a;dw6deQ$)Z-h2KEBN^>;**@qA1!Rk zrfWKm(RO5=({%oKl7TO8#_yFp*p;{EVD~Z7p3J3@zmVzX4gkt?ik4>ovpw!l>8oE% zU#6`VjBP&`nSL>+*q^=vjv>$NIA(EZvTYytf5?{5{YGB<#0L)_8w0nFYdQC9?&6E$ zSHi+JL!CEJkNnFNs^8>2kGSg;$NO5fhx%_6PFuc9zL@`S^4>o_uHw4;zq?xPu4Ktx z{j%j>_*ynt7=y*nItj)Lp+sqEaPp*y8=zVLh~uYCirdiCO=xu^%SPm(iDC>G2+3NO zjUj|Mgc8RV)@G|ZZl0uZsY4uU!eSJv5CaMr5JqUf@6YU9>1r*JA5Z&yzpvN#kA3aE zcV^DaoH^&rnKNh3tcTvA{Z;V60m}!g@cTMo`D4{`p5^1AJS%t>f9!=nl&9}Po~_Tq z0n$Cb$!A1)Q#_C8_QWTZZj!frxCg%d5B$g4gZy3bUJ^z9}DEaNcs)=UM7FP9sgyF z|Mh`9=ZMG2^9yi2yNj5xY1%J)uI^78#13f3Q+p!ZQ{vPW)`HouF`nA<7fnt+KBdR$ ztVo%)2l;0(ep)-S20G*4pNM!GSLDIa4t-~=jSmIiX7a8)-#t_jfQRdmo*en?Q!HI_$?(!++&J@LySeF*=~)B{25?!JUhiHdf>FV`L{| zzq*mGz2l56e)c1BOZPSUV~gxO<4dQH?Hv5)M)F@RIY&RO>^x)B z>0>+R#X$aKL3W<;S>bGSY~3LL|DGM&zakHDT}-^6>#Ph-@lAY+54NK-;*z0^MeixC zwF5GgeYx(EPGl%Pg+_)d7IrSiIMXGIg0T4h$ATxh!}A9;?p~LXt?{w4 z^$hrbKI?B^z784Mfky0J&l&FqK6`X$T&_Mq3wMpBg#+#We9HW}mpDr)#{2+rAG`wJ zKD*A3slnJEgYTR0z4~;z*3A@nesvn2_vzs%&yped5~kQUJTRoXJp9J7$^M$T^o;4J z)5DzBz<8OM?7-7p%0BKHmE+LErvv$K2+XDGe`p+f__IL%)dhN({W|bxj>>v>mGX!d zTbE#4Vh(yBsdeY<7sxji`>yPq+6%>g?B=x(AfALK{CO37e{VPTe&@w0J@V-(*FEiH z@{rb&|K0=8O`bdv(o3yeSOUzrtz$C#xUS?rb^j|ifx*HYVB$26)JNL)pqpCiX+UNT zp+6Ht&*QGQQQOG{>rMJQj-vRGo z?+p}y6$j(F(B}5shq3qTj_~tt zUYo3FizFxY#?zrT?#c7gX{U|vo7N^LwMLTVSz;2lwx{@>au}=gHm*&U>zs@3qw7WX zgD2?($c5P}X?L|*!|qBdX4FySbR=NcNoOagOThOOU`^4SK)D%wi)wMvYhUT(mXNqwl$v4@t~#VAAmlIo$t&xq}$ zrPyY`hL5zzx!(A)TbeG@x5q2e+Dorid+Mm4Hf`Eko!)En-zi)vKeXB~LH@rb{~`K4 zqfq9r=J{p7-9&YKV!S%uCVxtG2tMme?MpdYzrbJBE%|rPxLf_Fjg*&ctFNISTdGs| zQ7Jut>m8&A%7y}EiMKv(*#TSj?~2NXN6TI@G=ABYx+_8TVhOKjQYMP*9^Wq&k5S)I{Qn^_N!X)}9SKAx}0Oi*^6Ez5d%Oj+#46Wgf06oMP(-k z$~I3>w$YZ|S5$UNpzJ#)D4VopzgAQhJ#D1T3nwVM!j}DVQQ2Pw%Fdji?0Q@F9|C2a zv2x>ziV4cL+p>ROR5lLnwq9&ABXp%U2js@(Pft*G zuPyujqOt+Garxm1%KG$tMN!#++_?O^6O=t_>%Fk3Y(Q>Y&b@Tw(etW)TXud?*?`=* ze8&W32W?sIXd1y4XI6sq!sT1XFS|N!%hJX%WrO3pX@au#g|ctGUQ{+XzMr0;Y@;pP zUsN_Yz8{~U>=Ik{r$uFh<4ZiY@$kI5*_Qo&QQ6@5zITGMD{NWp;bU+W9N%|NP@ux0NpDjS#=F6ZvWLRoZ^GU+;_bN}jgTi)=$)q_Iw@rmZy=r-sP z#4d7!V;=Y6jnyMoZ?mvI6KIRd2F5(eoh9S;W4A5)=S5`$W1f6|g0g#U+3SkR2F5)3 zAAVVj1Jk#H{x7R3V>xKcb5?oYkkZ)y%3)i6in!%*>?2PR+tg)k{1i6mC9I8~ zVr{(K>U)tw{~UY2PV$R^dMcEMpW^&+mSwtGyA{frbt87Wp|=8U7A*QZ0*lxWBV!(f zRR=8Ow%I%P?T3Q(d=V`AKLYE2P5^6aGF1PA=$7 zllJt3?dmmn)n0p7DsjOz`EMy*G*aR?5f5LP3%IAl=P&qXG)9Ecp_1eA|5NDS>k8vG z6y$%E4bseb{I9YbY}p|Ht89>FiupgMc0>Cr-)_tM{IB?3Vf=X_ZMv@g%)FBDxZAWq?KXv@;nwgR3^e@pI&Bx}&I7{_It#~6`2CMGRw+^JrBD%3EFZ=IKf z4(b)(-p9AGPeBLke0+n`ob^5XPu0a5N^#Xn$J9%^3cB60oL_H%H`Q0G%MN`YKoi1M zKu#?Cw?J9(muSMrRmS4#3ezsqituna(4Nu&9=d&)(3y`1@S1YQ!Grdmi}7%lj|Z=7 zrGw3*KTuC#epxo2{;z&pxiS>g|JCon{IYC3{a@l_YZr5XT&f4V2Sr5*5)ard>!3WOx0`e|jS7?7)PhiX?Tj8BI@7I`PUow8tk}0xJT-5A* z4tdjU+bliK=W}fB%NqPPLua2-nQUcFelz0Rcd#!o4g2CW?FBwa|FNAu#ops`Y^P6g zzIt7MMXK`Uid4m&=eou=0Dr{|PQsb#mY>T5@aOJ|}&A=;NRGE;j8 z>c`&%cunv$FIf3-*=qrKl>vCOEIjsiPlLBw@RT=OnWAsW8thV!BfI1Db&~ozKj~bg zzK@;%=6Z#BZ@Vw6%EylPW&a*%i@A?WV_ul=rhS<9_&n*4&*g!B307dfyKH3rUo@{U zM@_qO99ZWGmgXP&L?4VF*HPioA9w6h*XvzlU!u9j`1_bMB=z&4Y0>t>v~hI4pSx#d z{6=W{vb+60Leq8XAM|T%b2;hk{0|=(JDuNG_0!hl+q!69kbf`x z=s5LEvh_SWPCY-geKGaew#N!E{dwiGKNx{IYCn^#vhwv*cYr2THZXr*_O1!aTKRhF z>w&VmPbgrwyKIqP7J4d^zM=LN=I>STl1u3=mVR-hm9}vmhA^NjWO`*eR$Pl z`mxH&+*6+qv_)lu{V1EDY@=<*XN$`E@`*MsJvBkuCARD*ipmCb|E0g2plq`(dwo&a zz?{DH*aT%)*s|{{DjQhuE&bsHW!KrV%Zkbd=HsOYCMdhXmTf938<>xmeq(~N?Y8XP zqOyVccxgINmU)qL7NhjC&6a1cXWo#{PwW*{Jv=feuG;;Mh~u!A_7uJ-8B0U#?FRX4 z>CGc`pc9g3I)Mr4WX_skP-yrA|x#~BB&E9XS6$@i&V z?W^yLBxl`uZW>=nbI)Apju>~$nKDa9=70F2^1;%y<|EyqOZ;`6m#g~)^M~$Okq+kKPZpP`3L%B*Jw-63XDM`^-7-qhGS6I z85jdQr@e7&fTmPe2p!hW{Yyve|Ezm{rar1Z+RvO;_r-BwF?XA};op_lpU1#urRHVi zR3AE2obM-eW?%vI=C3C-hm&s#F<=_U&f)Wth4sej6@|Hc$NGW}v$|b#0r+3SUD;{X z2d$|6;ZYs@(%}04Of%P3xE0W=^tnpfLYxvW#Peje%RW!hIVR>xot3Kvw{e@lERerE zkbjc$qtjQ~wWL|w+-Re5hY?=3bToLX z2o`gIPqUYf&i`X!K}WUY%>RQy{a@`0tluvk;s2s`agMe2`ElBHq^MoY5hLyTAATQ^ zB}KM?+MkRA>$`%bv9oJ3?FVbDI)#5bR&_;VHM;&E)xXU80lG752k6V!zlvmL?W5zg zA+0u0r_sM`ovfXMbN!{W1N{ox{?J=i9|b1!^57Q)$LCRW&Ci4!$Kjndw^=*9Q?NyY z3-D?8`4oEUhtIg9iTXy?{FjCT_01Q4ST|MJb(7&UyKb7Sxx%iS#_$>W<2JwHGn>CW zkl*Jsf1Iohq4tvj99bK};D`NjD)h(b)?;K6Yop85U;4rv5yaiQ{?+db^mVcFJXet> zehl*y`}jUiEIxjQZ7q&m`Wd!0cNCUSU+>x zXjQPpLyN|NHPy!fbDqxc{Zw$tyO95C{xx^_F{{`+|F$C^g_eBXH=$3S2i!a! zncwI8##A{WbWL;q?MmoGd&*NpBl=$Od#HQA@n4~g@l7$lrc?LHH${Ffz;&WYXEt!T zA9DT)TP{Vt@3!Sm1j;?Aa@xzc<))|{WjJqA_j@{TLR--hbgtp*Z;7sz5B$hi;Ai@g z?_Aoo#P?s|{cQOVsE*M)dZ*o{dgMc8>UmH8Rq9cnRDL%3cNgWqS@~_==jC%_^K$>M zn=8tDQy}ltHhz=f#_*|RJ{{AJQ6IqfaE4+s(CkeMe#r8u3+95wJLTg=c~EH=*Erc1Hm)4 z#5y_DTAG>JN)7%QQyUl6+@rIHHeus2_f7_FJkldLi-B*My8zfZ&h~lyKXY<%&++FL z_dI)QaZlfg#XUcNesRxp#HRkw{mW8uzV&~7X*$mLUwmz8Do)z-_g$KclmD0fi+fJo zztoNMFJCT0@1pgV{JRRalGy&O77x(GeC{~RX$> zxq!U**@#AU&(+j>NAhrAqVUlb@i<@S=}b>z(*uoasa*SLEnfEXYO5X!Y2t?@*4g> zJ6yhr4*YM|@~z1~!$!GZN?vkaq+2nQp>tv(C&!INr0+p`-m)dBc!S)L*|WRA(=|tR zrc>|jz{AhXIjD2?4th~KDSzI#+8mF&o$!g{{0wzwR8D8=Xve>B#`bIW-Q)Qm`PR#M z+ehrTG~XWPTMyqJvfp$r_nUm%$G5NBZ#lm0;oCp*O|c`MM)o3?YQD+$Z`gO2_pkH* zfZDJlV523Ljk%ku6xrg(d>YSI>+^$!mjvEj;tBb!ao6CVYg|cVtZHr(e$5%m_Y8k5 zEn4HpdNRvCobH9(f$p>%e$d&|qr~9*H2!}XWTx&M+yEcw{z%rrMt;VL`53zGqO^EX z=f|Msn$Mbg`3_Fwt+Vi-gC|LYH)?KtJpMNw@Lw$OowE)#f1&UGw=B=*d}<^!;rY}T z8~2(l@Z?nf;WKo`+?lTUR;`nDp4~C$HN1{Yn04JRk;{&a znGxoEsM%YRAG~;eYb@P-M=X6c=f=O-l79(*12d;dK0c*#R`=1FRMED0Vh?S5ns(Pf ze<{8HSH=He&iLo-lyo!yz5HJ-{*wGXZH`LJ)tv;yzcusB_x!jZiUoqq;~XxuNV~9K zoIr0)bIv)$Uchc>ujCPIwHLwztfBL&gMNj=oP*_GaU?392QQ3G6j-~D^UF?g%oz^a zbU*L+>z(HZlMt_pCGdkevylu{ahB9IF`*Po zjd$tHAw3t`X?X=)(N6gI#V^xN6PprVsrGrL*I5Oxq{Sm7yH2KWu~%kk@nKU=cSO2uQ8 z4ph$Cp}xx0RecWnYmz=_&4(^odk1(vd>ELFNlx=S?I7N9&yP7j`2_R$Pmlq$@x`_H zhz}T=ZFauChw^AT*bntz^#RGSV4d*HS*nj8b3*lG%?X|4UEsPd^8Rzo2T$*=o7(}5 zL6vR&h*Ptj_`T_f6W@NR8{7C!cTRdf{?m)xc-l=S(hbb@@QkI4DJ}V`HyA^{jr3y; z^iO<&o&oNSH~N?S6c|^73utee@Ig7||G9@n+w*7(a`c~$_YNO_kqtwGfo9RXXES0SnJcZ<}vww z+x)u!x7pW$jxTg0hsf6&S~iqj=$2-wKil9Eld9(=|F!%N@?X#Y5dVtXnB!k@^!oUp z&woGvjr^bBe^F+k8}qii5$pnS=|IqBu4$GYX7V z!%^_L7P^|z6;0uXpK^At%}n2UX&OKLv}_%VfpxEFS2TkS$lSY#p8i$z^lb$?ZqQsF z1LxJ*s8e;j)vpxG5}9t+NXYe?abjB2@$XzYK-9OpU~Yq)PEzVfUQ05 z?BwH|xivATqFoX8oF*UFy|Ic1G@mg=FU|i4|1-C6pUaWS$DP|3vd1v_c!<7)ww8OW z!II?-@D*vI4|pZ9o3+SDj4krllfP8DmCEoOv;R@P#r5oUdWst*88%BWDBlE}JD`hd zpFeq?$(09x%b9pQsKDPYFF}7Ik4BGcefguku?DAjY){$vW#qeFX(f&mY32OtqtT4P z!MV%wZ?eCXAwGWOOz@$*j1`A|7kKdQOKDzh>WpTz--Qh<|8?3>myPCoC*Z~EVqO&g zd7Vx6F*CO8WlXTr9ojzQw5$a9xuOP1e48jpi}vU+2lL zJB*CrKEE}5m)@qmMtm@xnaK26Nhjo>56yZ1k%u3NZI?a<<$ z`)=kwwS(xk*sSiq2bcM*!V?(J)h6P`6v8O~fbA}CjzVVm3r7>NvwroZo z`0aR``u7s^Fi(ub12->nxpQ6inN0ZRi(Io_Z;fX{vaj)dq}|$2z~0tNyu_z87A^UU z*`rVl)0M(~13KQZZ!(U1BC>x^{$I-Ts6UR2dvh`5L^zUFqvsTYrL|)?&K5S}|&LceCXe)(_BmOaA^j z=s?&{%$ON|u)I?yo>3XgH{vh&X86WYzNvhb^qJtg#=A9__x{1ngNuZDw*05^v_WTH zeg5;|d^G^)S;0{`?h2UW?JDr@+m!7Hls%%dKJPN0Ieo~Je&mVdNH%(=V$e%omv=J8 zyt`gHIUV|pdAELJ3h(oomuG0aI~iYnBkyF^p1pmvo3&ypH-W4H7o1&jW`FK`x%ij* zjck;kEHi!OapcCO;9WA}P(W^cA9?X_k{7+mixT98cnX_XJ@d8XMYuRtJNz1!ya?I_ zTahb<{*f2JKh{;zGeG>ir#2SuVf-2YvJE`VzwTkoAvd1ch}_`W*ucf#8{u!k@%dZ# z<4Jb$ojIj&&k^z@q&U0KmlvcjaIyxRj7MKVc`P}Ly?8giD{j*s_&zX38%o%>(tJxl zPGW=Giw!P?56l64U=+XQ`^0bAhR*vm_K`irZ@HKFE$b+Qt!3pl$|xpl1s)XLf>2RliTc>?>;ksg%zJ=3V!V)F$2D) zdB>h9N8g#e!R8O_l}&jjkpHV%1Cf6~G)ewX*!;XRKNjHsIFSFgLi~uytH@8hm@4k4 z=^2Fo9CWN(H5UQnTGF&1ga4||H&6LzXv^raFtGH6bILDhwL1e4##Gj|>N zb`9BPF8DfYYn?~c+HQ_`(og4}pj-Pd=%X^dZL-(O9>H3yC>rAcRhInsOow|n?zVhd8*-8@3$#qBR zH*<0o{ABD@$n2}C82{aobcxnQ_pi-VvlkQgcDh<4UEW0-#Lv=K(b3EuM#y@Ha&_5A zMz-78w5I~OQ?2(2);M)rPG93-*R34pyY%;|8@cP}w=DaT%F-6C&!Q?1yyu0dPUuSS z@bdJw2=jG3-J(4q=(2@&m!^#!w(@D^)w8$LksgcgomPwvV@Cs)?%wN9hAQqLUk%@{ z8ha-Gv5|NU=dey-y|@=UcnTglzg()XZiwbj_yfO9kLozB>rnA*H=6dpyJ zipPST&8JNRL*)y0w&6cRj+q#u0a!O4jydboe4=LqfmG3}frn+t0;kFBzUB>-O z_&hYA2m1Hi^>Fu{xz~v}Hk!xHy;sCA>FF)xSvAP>VJnjq=V!WP-FSP}ti7>$XUzWI z9n7zavwTOwn}iJkpFh`m!bKM-ai-qGxfmA~hl zRO0SLrV_ei&FV&;M2567&cgR*X#ZyLjgC{oe(tGu#|sr~3QjFHfd8bv2y^#!=!YrV zdV+af^j-(O!mG|qXmu9zHvIP1L%uAA)~2wB+UKRyq8qbD5)CjPxGnjLZ&7wCZFye- z-xc3r?l{c*6_hz9dLG88y*kxjwuK8dwuaLN53Te`bcg*warS@J8_6*L zrX*9#kg4<3R`~2S(JU}pX>%_y>eOapBy;Bi^jg~EiKciy(zZSsroBhnR%n0K+}TmC zJmB!8@@!e3ECJ4X;QWBTdi)J`fKtx9)#{JzE&g8n<+y) zmYxCrUH<#UX90bw`BB6FM}qv1oG$P`H2N80YaQNf_#YkeY&SCCB;o&LdkC z|D($tdv2@@h(r7I|EkY|%bD_fv2x&F1l!VhhiIH<>RZ{&^AAe6e~|h<&NJsD#4D@B z6XFk^S4*dZKSucGNC|feQuY?U=g5QJmfFB`#+DTiod6fu4=Y^R4|ztuRLK7)AYUr+ z{Tb1Fz9RWTo?38q7`cG0&%dj&^6vt3!W{+us-m2HKTtmCi~Xz08wG2x`nxmjoMN2z zuU&;c;neQ?XtI{^I+hHTKizRXK#@1{l>r~+-p-V{gOT>0Bu{tS^~n<7w`1ed6t;U$ zdO3RKq!+30ke4PV6l)6f?mT6&4Y?!UXvfzJM>)29v62< zW7&of^R5f7uFe^Iw$UJlTg{q*Gou$thxke5!WEwe<^ z{BmvAc|Hy*H(r`HIDqc^k-^xrJ*~YLsvIyfz}iin)s*8-FHiTE*gFv?b!yzDOVGb> zlJ|(pz@OPPecA-v&w)(fo@~9z(_M?`ga-B`<=b*yddUoav&-$*Rlz*i~UtZi0do()i z?2RoQOk4XW{sH}}x6n>k?cC<=N;}BD_pvsVB!1MGPlX?on?}~9#?CadkD;-Gp5y5XH@|(6n@A^;iQEEb>ZV00*0Cwp zvC2QX@1guVz*{GKT{{+~5}k=;)$s++G=8&f`_R{D-&q65zEhWJT?HM6J4eJnll_x<0(!zdmP96ApEurc`d$}@7<88%|)f__5DP}#rHPwF)N)!gUXJrw^< zwqj#HfrgAN^EmS`^RcgU7TGeLld>=D0TyuO^E{4?vg~`{?zgZ}CXqw`M>fiZ|6j0C ze%sn8ADzk_U)U(&H|!Q(i1#rzN~OQXd^BpKY?6QD7#n3^?4*Y)7JvLverAkhr?hk_ zdx&o@DY5q45j*8Lc2VEX2+T2bfZga7##R0a7XfE3YelV3xC?RAMyWRYW_7f+{N!T_mpiNQR58Zz=k9Q}~Hk~{C zFK?UHYvZ(wI1z<*sZGC$trR$G_^rcc`U&_jXe%{(D{_jx1>aV>;|OcOb*+)V$G0gJ zGV}Sz+)!u1_FU!1qs4|fZI9vE_}6LU|68`nCnP&gw@t?PBQJgf+hmfp+y9Ymav^%p z|8?7>Kc3hq-)20`9uVv89Vy1M*fzN$8H%$GpKtCMkp73B>f0)h*yj{_o^)9o-?rx% z&(dqR@f};e(UsFYTfNz=6LpU|I&?u-#>ROse!1(gS$>yu;YrfAQ~oez`ZL(h0yY=o zB=%767~lU&>FxU7k}vxor`ui1yGM24&>u^$m)(W@=+$NKIoJ0l=^U(vJFAI z;R)=9{Q4x=HP(tb;zh2wFH%L;Y$G?dQJTl^uHL-z&5$ zJ^&2e3D76GSriAhs9k?`gWoP>X1QQKgg?Sw=uWy;CqL;>vTY*wKZFl!9vtX=Mb6gs zW9sr~@2Az?mVEr*c<&(Z#=VpqZ9{`YTjU@4b~t*>ZwvjbwD=CzCI27Qb*-)IQCrtK zTi40G=&gG(E~;&$?WH~16PGWK!3A-Se_b2!V=Igk_=u?ulr`f7t|vbfbB(V|5e~N6 zc3o`S#r?kq2VYjZv~K#w+RUtPEX`pz&N&xdlmD7<3y$6;_};B<3w4z;|Dp%RKL;(K z7Z|!QHe_hCpYNZgAHS^)8QXLGlUu9}SvvV|VMA8gKUG=U5`#vgD$ln+QTt>=*1LQv zy`7l^dj5~lU9ovUllT~^U*whj-^4)W+xgyo4Gwy3g=}$~6E5d2Ga)aXF04n_Bujc1 zWkT4G_?Db?0X8G0gL}my7oArI$58wNK8k4hFF7-B@OqYbMYR9x$9pH|sz%0pf%qse z-ZSB;ZH!Zc*1FQL(y-82jA~O>(u*Hjy2YpeJx~ralGX3V`JBujHii}t+N+7 z_O}whZhwopL3>@Yz4RB&3nz=`1<4KCiVY(6!_()5vP(wgwzE}h6wM3t1)7U}_w;$8 zY+)dOyVh`;7s!viiT&g0^FrAff&4dV-XY)D$j>^ke0j&nyx{z`#+9@#(sXXb?roK^ zE;KaZK)0XJegS#zA&>UIv{qyXtxR!g!rJG$e^Hu!ujpTsUR$v9#5#B`+V?u=rNEqX zhS!yojaf9zT5RFSU9-rQ$>7cId&T}<^AUC5#5c)+AFBSso>vTq|KOfi>{G$Ht9Z{# z^&w-pYc*%+SboRaKlR(d{G$D@sfD>}@crm)Cax|0uSJ&PGZnj5`#sRuMvXnNbS5%H zd2F^?J4fH6ISO7W6Q3Y2V*0n~dD3;>u~y&SzV5gF#IIX0sN2pnv3F5_3iuH_W}N?< zw;>rSeNA=HuItsV(e-gpigB-R$^S^}Re!G{yN9+;v{&((-K$`qBElYp*{gVQtew*C zRb2jlU{3YmY4$3w#Joe`vV*eXg*g_tx5B^2 zc(0?(32Z+ewteoQ#iyZknQzegvOE(01?z3YBaG>9 zYR|u@Z!Dk0rT3t>YLC<0O(GhPCc}>lHuH$J&nq7P2;FGyVQumzHvdt(MzQ(L+NH5j z*3ecn&(AO)$+vj;aFR{LY58CG{>W$lH`Ty7RjBJRq|2MCn=Vy41(*{?3 zitMaFZv55gd=qXRl_#acW93DR_%r^z6#k6aC+Tu4tepID0d^_pf87<(nz1dmy$6Y^%g^jv82qK#|K9>!GU%T&hZ6RgWZ_}yQ$>v}Je3`H~#*O328eoJ`2&%Q6; zhb%ihg*(eW@3O`SeTMG|+ox{ffx58a7}<8C=n4HO&c5jfZJuwDhkb%r#OBd=#=i9H z^#ABC+Q>S_E3x)6+SO!fW*yHF`@DkZMfO>G&ehq{`FlB6vZ4l?GkU4+pT357*5x{r z;YtT6#Qx#_ua^8dJ?MSy$}br~-Yb=t{Q})lz1#PLgqV{e zzI*kwBOLIvuV~|4GT4VDy9+p|r+)5r&DC#g%HfNN&u>%C_xVMa$L8IX3$#0lpID*( zqjP%dx8bCIcTKY7=(3&_$e&9YkM|-QYZ&)G;XMf+Is0SYe~*3HPcZ*D^OMfUgm;}& zdol)H?J&Bq-FJ#C)cjxAck;&Bck)8PeJAvP_MJSl@1$q^DvV!ZVf>2so!%r?hnd$U z-*qnJMlWsZE>oSf_iEa&SVP*M{h*glYYq2~`_`^R)|GMxN>4NI7wA4^)dkHjIrO&m zz505vKFa%a?bo-cB_DZ9^`YB+(CbX8zS)KPBCnIbk@u;pkLM-iBL+&O%-|9JK$o1N zG-&KbZ%2V&$j4nS5&6f~f!hxXx4?*7n8!(XRL0wxshfIDetVj|D2+vFf&O(S@YY=s zqxX$N{|ob?f6+eqT9r?<56v0c--r(|Gza~p4gFA86Mo}y`)!o&$OGN!Y>V^wf}Yw5 zXb-#i+tOa54ce1_03W38NN38n;(GCRJOGZH@Q)~)fDhu^XwT6FJrxtQr|j+8LmT34 z@Zx6i;+&opchjD2w1+m9(?-QMDPg=W7S6oRw1e!3KhB+_h38PTJ%L@m^V$A*b4ar4 zEBtbs6RVH5C+79r{G1yKJ*YIVGbj4hIf4#-<9~z3ADCsR3px9I61}F<+p!v$&dYrN ziqgK4*rE9O{Wecb-;@TO7?^E|bcepNHf^R#4Ydwk|uLmi&~uBzJyab@6QFPWYDrxszZXUyb~`(c5lt7i|AJU>>qCm)Z9B z0!MPF$nb+Z0>N6(_38}jm@ufO-%$Jp04ao(^^82zRYlQP!xNK5`~`A}aingOrZ?g2J* zmf30biLP32+;|fD9@Hy%4|T*I^9twQIKx)G-I)fx-BJC_9`I`J3Rat0H%{s#ANUY0 zvaTw5Cu6I<>qE3vctl>5;Qu#wpflF94P9$n=EhWZuk7oMQLCptC^d=d}hRP`WEzb z?T#Jr&{Mnuj~UvMPU!V5IN)_b(|qTwgT9CI`mS^G*j-Zmuc1BV@aQ`7FxQ!L-?G8z ztUPP7R4M#fy$7AxAFJL!a2$BFJe(A5urKVSLcPsN^9_6Hu--rSPxyoIFB$+(CxKmW z%Q=)Q%a%J%_B_Yg6Lmu!VQjDkm^zpDrqVK``Sl3~?S23l(`BRUeV?bg1m}wEWY1w= zvwq`}RK1r@&4V5;Nk`M6?EBK3FHE_xQYgK~#AcShlmN~>%n|Z|)jV{LXpi>c3x&V; zu3Q+Hld+B7%X10O37((fS-g#3iqVHEzHTv%UbgsojEP^KR#DHE7_7J zt$>U0$B;uKXCe9a9q@4Iamvt^KLv-0%;E!$nZ=Lw^KWTY=T%4e_5gglo4l`6zwoU3 zzeN3}ty=d|zdb)652^k@9jw>FzrU5X05mhXGeUaAwdtZ8XLxJuv3`{y@A(0EOAS2bABDG^Je9yRdv4Ip zWMBzi-6$P8&(p6)3s3P2{PvwKc*<|vwvM__0n4NVYi<#oqrh3mn9S682jD-h_AxZCKi&EIjNYmD-YwNBWQg-s`ZAyN zPyoguU>u~Lb)qZsw5hM)p_zS%ae3J}Ypgg2a<@=Sk zT!X&Vf`5&>%2}AQFFN65>=N+`ZT>sbs+pgUD9=N6xyA>;J9|3EIb)Q35d3jI;yCA) zR&aLWIQu&5)3F1)=fR(ywJSNdA3DCPHn-FXe-y|gJ_63lCh}YioOP-bS{!0L%CU ze-^0^Uc^7KEcrF}>V8o(r!RC&9FEK)r|KYSUOFe4_%YdXNSEErJ=E-lm?I9BvILVSrl1{yz z)s90~J4#pEsy+Pg@jD+f-%00tBd~(y%1ylQjv_O7+tF-wiE5G1|nd<~MSe7C)OjG+}9h7>L>r(>~u@J=okK-KHMwsBi70p54}8)3#%k?#WR*u>HSv@3z=uZbu{;e=uz3 zDnCymkY_7-X5s5E{_xWq19jX=`tG9iC4uxd($^KG;|n~}#+yiQRJyk_9Rv58Gmr<) z2f^P+ya0XUeK#^;H}eg;fpayyCwVZ!+YQ*J`s(KI;oGN=J1KbEG5Du0wcYaes-u+K zExeHazPo{;GFkB8Vbdd)7w23ao7G!6{}C_Ed$TiDbssOCe~3A2UDC;~MAjOeld&s9 zuJ7jipY#1%|2r_sOnXV=`yWe=G1ju3#W>G8Z2LDWs3Y|)U>s;yfmT*0DaZLQw^Zf8 z3H6MmH7A|nH%ZgHA-(qxH7+gr>0j1=w)D(eXhw5plz-MzkIjcp!|(%p8jsEAyJ8C0 zo(Yb+YCBIn6xr^u*1#Xk4IPho=;BUQ;U4-VaGa3u_jdtj59NzNJ*~neb!!ev=v%gS z&BI=L?Nz*2nD@xX)CRRpvECxt$j7A5>pdcQueC3G+W7c;(^zBlnR>g-Uh*X2rnmIW zM7H!}3E?064DlK1*JwYcs2?rE==s(2mLu!6-vLjB*#CE>D{4<#^XW(#<=4B#ZQ9Zv z^gr|zv=<-CAFJ^f^Z8@w$E4SH!XNym24Lv^9?L^RKOhfx@gxKMVd5eC>Aj>!41Iwk z#&TX!-u?ir?~u2)t3a=Qdj|vQ-z2@FBjTZ}I#sqk&oW;H_;m={e#{Bfp>#I@BfTxw zO}y!m_A0$8kiL!dn~LBk1L+;44|I(!zdVrMPWoUMZ49)JJ*E+Sd8D5xO5YGj-#~g_ zQF?nIeLd;NiqeB)x{mZ)i_-T7%BM(gD@s2cNMAwvhNAS~7%eCL#p0eO^p@zvOdQ*qo&hO(;)upuLO8lPjuYMIe1X z=|_vw*9X#Pk=|aE9>jMo>0VKK5Z@J~f1)Toi0=sLYl_kX_7w*xAf5TYyQ?UDc_97Ur0*_DPX*GyLHdJ5 z>FWdO_mRG*DBTOBf0gt{iqbm*>35R8w{Qd7_+uvE=Bj4p**DF|1)m`&&H3H_o&u_=s+WS5qYP~W4`Z; zpc4%b&lBGOPx851@`P^{#PHv9m~`IvY0btrty>dGXXsnxOQ;O?!&S_+rRi9Ay}t46 zkp45~UCwT}HQB}8)A>J}|Ct@JZsHXUeFfcT9nXt+zK7>Vo-g8goAfxIujKi5=|?<& zkmoI0AF3|eVeS*>-mfdv4l5hXI2rwh?nX1bj$dLQi%0}H!ucLZA`=g_)|>-QMv)4HSfo%I=W`r_{R zCenKscbD;9`H4UJnDS3T{txkA!FvV&mA2eu-fMZEV&By-hxaNAr`p1)*-Y#;VixVB zz43PXbg;}RY2zM6tvS%8>and3u_qpCLp`Ma+EJXXjC1bmRd8l>j<=&*X2X8(F4w~t6HEsGN|0VqYg~h=Q6X0OI#lc@4LZ95k zI(?=?tgD*U`GeB+iOD6ukh>b$OJR>6pO29}{up~Hn-kCGTjR+R`+anupM2Q``)_Qk zS?#nDUx$7u8T6c-?GeZ${h8}2<|P!m{9yU(Lu3Kll&^E2Op~Lc4&2v z<*#pA{(87D|EzSmTd8v^bS`>_M<$%(1G?#U;khHW@0jHc&J(yD@WTA;;(dzu4R7rG zS%Ek9Jv}~e?8_B+W8d+E;tl+y%ETMQ>3mYWLDbKQc!QXp%kGAU;El@hd1GH+Th%;A zF|mTYaq}o|l-vSufVV_Dd~#^PzW(fjeJ6sv;nSdaLvg(hF4#8!osIBDkY?{L&s5%B z<5Z5J*_tH0vG1g%S?3;T_Q}QjLzZU4KFwax><|aVb%HcYoR9>3I}*G5?ny~}!JNu5 zG+UD#p;_{aW-I-26Xk~%=}OscrP<$*masP%TEcfkI>G+AmX;dShj!?} zms@SDPkOO=-W_s6KA-<4@&rC)o=!C*(+7IzrJ4h>96B8w+)5q#){?(|@bS|5_~>Z9 z-gkuGkJAY^lv}({ajsq7e?nVt3i|)~yyDA(iFsz<(b0NWZKK{NsrLx<-dmveQy+oe zwJ$C@@8zHQYu`Up_d%ZL^87vgcD`)wL33#byw$xS=s!5FTpCwS>^nr+8-F{V-}eK` ztj8Wk+{=Aq{1$)9de{99^{!E!Y0f!;5BW!1J$H3Icx(rcz2LFS;xP^$U2sO6_kCUb zGvDu%K1iJMeY^NSlmGkp$0vRtF5402E@b|KeGis2I-G?{x$xy4-XFnND?y&U)Y(n` zDU>@97z1?K?vwlm`Hud<)f@Qv^4w$JJw4mDa@SXC18u#Ywn|3(HjXs=EZCcCKdXG$ z;56Udqculo?Wz-9(0`823UrD@!L~@AfbI^TpNE}L<^P=W+HaL@@oarFw!p}l#umu8 z`Sx3FHX=Kxr+jntjraQ2dVCj3&&1YfzE9WpT@g1@Rai?6Y$E$pu=Mvjd(Qj1e4OiFcICtkZ*0(B(!I}iZ;)>T zV<&&3GWf{)8+9LR$-95<`x`M%QD~!&aV7qrI}#HeTl=1*Gx*XLc!KBkJfGk>$8!_U zzu(5~#?^{2qo+eJ9{| zk!DR?@Vgj(>xb-p7{3eK_V3W1|4m!!eE1`N7Q?3^)(1j(U>*NP8Mqkh1L3?8;hXPc zFuo6jGl<>gZG0e{LB`@S;iHPS3ZrM{<6w4}>%LCAHV=#X5tUvwZlc`#?B@n{8Xb-{5xw zdF2BU4%Bs%>LSmL><2Z`o^r-VaODFL=YO&tuYxbc@Ei9srqICw(bLDFEBUgF^@SLI zV=HzM=;W~h^86`q*OR9VI1&C6&{(zTOW$cn!6(8Q{0Qw3EXiN_OelRrApHY=x@}J% zw0X2;_>I4%J?ll2)b)FZp*QgM(Gj1C;Wz#g8`A*aK4N?(hTr%k<0GGm0gHp(9yTey z%?8$5{32@E<5#;hPRniDEYdz|d?tq9xSqVDJ`=;IbQXQYXQB;$-Sjax)H=hR9GoYx z@%X+J!kc1?%U9yP)FqsoGb@zQ-KDrdyq>q|mz#9v8#DLJfR+Pu4=@!UaMZ`b8AM(b zd@R7>1u6>;_X2A=b+RWn;(u|DNt6GD^Ln4H>nwev@(Rf#+L0jbWzvlQ1@H>@pg6DV z-rEtL1uxTimp{g1DkFc4-Hd&}A7efK7=3%E%~dSRzDK7%Q;$E!9_H7H{4o|?IO>nl zq;b#~;E%C|@o+V6_WcW@L)yIFzJFfrhHj3x3=f`!Hb(t1hT(16WN4~-u0uL9@xXfK z%%DHUWZnz@7{i02t-Z+Bi;c|^ngrKTrGt~N1p6QK&0t=w8}ZE;9vmcJePA9g_+|_b z=J2U#IxfG9;lY0NUG#6(Il4b*Ms`8>QCr989m18V(L01IQEBVGiFzdNY0j%+HU-lg?`|i0*kN9NlZr8-5wRqhl#;Uc~t0kCT!=PU>fR zr(MA{Yw@~5Yj4)1WBix3R!297_t>AWo|nH3JJszMa^FFDI*-jNen)vOzipD6-|Qr( z$X90L*>2<>>;jyVQanx0Ead!{VsZOEdVY#@&W6<=T$Bvyj96H=_dXe=M0Ck?~}g-a+N!n`zCvm_cJsPkdM1xt&a%)=J1{Pp)AfykcY8~y*F>ZiY} z)NksOuLu77Clwb&->=hm%4y!1N!#kwFWRQH;)k@)Mx8^wS0~v=NtZKrildzf)OmvX zE)LYU#KOHwaKU*T1QX9JSHj)$*nE0UZsbfmIt%v~Am*$m6RS_;`sK3O??&E&2L+9}SK;6p2kI*j85eyMGyN}rNxrZ1Fbd5e@H4Qup z%=4YlPq~Md^Ye&gaZO$_H6a>IIhqA|$n0u!su=hBzNncuxwkw8b-nUWf)U`ur-gr|;jt{z`cl`mtwrI*)bn~~jtH1bbT zTJNGHcO>OP#8oxEnFpJb&O~(>8)7`^2o~+r{WppWpmXl(XUF4=BmMl8-%q2%G0xyJ znqeO4HMmMA8k(K3-ofeL3a3_1$v^z3=3aQ{i7~v$#wpRd44vI_ zddr>it>H9&Zpm`y=C@kiq`mJ7MfKV4yzKXPp&Qt}v@-OU3iRAj9ik=~Y7en~bLe;4 zD~EP}1)WDk572EnzSV{J48yN}k9I-TCpRDFn{6v|(Sf0Z6{!e!2i5mhpnsr~vwu>O ztw@=>xHx|m<~#WHertVM`!FR__uWs-h>u9_L*MU|KP9l^MnA7e8U0-O_*Tw0)&Qoy z-$_3=^_~5peaPaSst=l-qrL&V!q!(gvgW8rO&(cuRHUZ-?)|&}L)7SaEHnCl}TMh1kJNS7y(=E$)@*dyv0)7n~*w`}_dx3j(m& zi{t!&h22)=jNIoVU0wVXgxS{NNiKeVYdGKE#rUCU!&Q9kcd?Ek_FalQCX?aE0;(=DLk}Q~USZs*@GBu@<6??wyY)e{he|yUmdvFjMUTcHF`) z3&1vOZ3}zSZv$I-nK$Y+=b}$2juZ0r3(dQ2b`>g)9IjJOlj%{C)3?HT~+%vC! z`fZ8R&(qrSrICI*6NSkq@-_8Zs`RaQGhb9wu)znAg(v*#Wt@Fd!Gt5nTuG3mk8~&b@<5IS?mx*0JIzNMl zxaudJ`+wYi((eeSdtGK-T;_EdJzV*I$l92-!OO(J8ifNMp#@hmM0tA2(?p()!8}&a z)A@{_+kE&<&P|c;Z-e>x)&Y!fF}~{rQ|0C-or}O{{Vw#}-N-ZlUKQ3(KWFW96dUc& zvC-~6QjtqMQIV@^!*P;4BC4 zGlO^s?!Bb_F=_aXo^~$z=XX>eZzug%=&=5|;0kPVC(XI!;nzz8`x|O=AMi_x;3Fqq z;r^e7T+;c~P#`S?KTD^@hWN_G(rKULne>yun6)L63-4i#=ym0!b5BAp@zs;GwLx1E*pNibg{6F@*UQ%-N-A602 zhn+KWe(ha+<4j-L@i>3SdVsZK+EIOn-UpoRX3r_2H2-X#(rN2i2TeV>!g)DhZZ37g z2b=Sf&-yk=?~GfcVBL%#o?UagjJtb~{E{(&GHwHNb(_;8x~x~a4~zV@Hh-O9ZH|uA z<2JBXv1KMHkLrf+%MbA!tg```sIms`xlUL*zj-(KGw19c5#GRQ7(S_Io%wTYw;hb- zJ=pkk&dTswfj%3s<-VN7*4&RRyWi_dN_J^q4EgXf@xK}lQSP&%0sggqt@qaqE%}$s zeKdUETID#A!wb5PJ;InvkKx<)I=*R+0$$Z|Y>Oo`jy}m6;C)$y1pD5D*+r=cG*HHW z1^;3GEBO!cKbijo|5Jp&*2LVTUlzZoV_DZLly6KI$~UG}K9X%rt9+RMLixrt^D*zT zk0#D`_?NHqba*<>^BKVPz}uQOr)3ZyvVQP=uI~8##+pocffK&bwmq_|_IL;HpW0RX z>_9e>fwt&VGW64Z_^ZLIIevYQ@{H{~g^o5?BM?RX&QyG7*;rrndaL>Ghzh(Cx`@EcI#Te3em*?HU`P9RS)Ie@Q_aoR}>rO1_ z?jBgs-PO0C8$T299m(O_tUjd{FvphlMRIX`NV#{#@J*EOjp!7Kd9)e-la$`cr|*lN z#P6Scl{?p%7!!-IaaF?kmYga>gbUM)pG=HCY%KIN->s#Aa00 zS?~qmZcHbEJqq8eQ=h`#Se1@2#u3NlWxe`_%BG{uuc=9Ep$DVk68p1s74KN`&?6YD~MvM-iO!V`yVdpYOa{gUmcct>ZduhlQ>tW2{P zcWt_MZd!dNZQ29W0o}U71L?@Ll+%!8--~yfcR+d6-vCa|11ELk;RINfDqEDlVWRv2 z{Ll5$&a5=D6I$rz*{n++6b>ROd~s8y=qd?hQVn*%1bE>7@}$;SQ}k}@)42+b8S(ZU z6Ss);n9_TJ(aOI^B%d8?lZr{rcoxPU{q+}F(gg!N_7-5g@hW(vZbL7UGjm#bf1dF; z5l@Ag^CNc7FZJhqjSsweSZgwk(-y{QtGyEv8%lM-hT>_@e@-W~!kGAbty=fbR9%NT zC)6_ht6QFccfsXUeWT8j2P#ujR4;3niD2r^*hmq~sD;TM*{^OCOxqvLM^Wf3(^iU& zXQ#1;O~W1*PS5wMHb-3UEOMQj*JcvT9bxZ2S8{P`EA)O#V=mHOxr|YfC!#uy*Hs{4gGEk{@1sDo)=&{y@~5 zW@r(r_jxfm)(6|&~3m4NSCtK#CGa}o|T%$Ac z3{B%VOMlw&_4W7UyzNdM^wOv@;H*KgT4yJLRnX;W!`=sGC$VEXbpd^z{L6M0=EZ^6 z(1VyyU;4+wy!g_$Xy-A1UTh0F;iK_%T(-L2c)CpMKIl5Znp%GF^7G~1Zio6jwIe2d zL^#wxclP~?c1QGlL321O9N9XF|2dDj_@!;OPW1oLIF@y|jh$q8a_FA1cixjDBtB(hIH`{?Kves}snm z0nYphW*=t*gLCV~^Vqu$$ZE#ySoVB3%GmbZd=7g0g@yapH(gk;<@oa{{6Uv_@fTsI*ay&3v9u00693n2B+nBz&yheLV?zly zhs>Hqws-D)Op^Ci=y2xY1qX)GoDl}^_^vB6O`ON--q?X5d?RP-p2lA2 z#->Mz$9bx^F{iz%s)FA0;`59{68TY*U6e!@b(83-@lC%brkQL!8!ti^<=#KZJLw$I zwDv?a7i&)h*^ttn$Yklh9g&oa?*81CYSV}BYV5`1*fyN$*e15s%*&%cg=NdcH(j>O zi0`A$z2Oz@yfbHx)&~OHoHVk<_~gF4+0AfIT@GJ`LVQ`~2y+(1=bhFv@~h3v9pkh) zV%uEsRalgY(&kueB%Rc_bcCG{^Zqe#uYLZRox)LtD>={pf@}5{)PJ6%$VTQA^KAAP zeETVL5PH0JcW1I^K;-}@cHyOFd@~G_j z8!t*5oCp{8eH0g@3-*(X+zS2^{Hu;Q|L~?e#it8X4!RI-N8o6^>GL>nz#%+7K2Fmm z$oJn6ufH+vc6cH5?>)j}w!+BzQgpA)N051Zi~lBk;*X(tt=QI!ZaD6lG~{J}7km83 zR`%AD#1Sg&CmxEYN_AFB`XtX$oj0@3G2oZn1D!JON`962^RMc#?{W0symZ*jq#vSB zl&|+`qa7LN(}sPH>HjYB+yhL*JJ7yp$3NF}3v+sVnVVOel$U+elDm+D_aFxgyp|i2 zAH8{`4QkWfQO;|XB&+T^Cslv*h34#33I9fKP`iPl_mMK2d51r_zd1K@fAgKxcbDp` z&Qt(@q^$CyuRv?L`X|u?`A_g)s&e<=ai4K3uHGW-?KJd-{nRPSvrl_`&J==peB^ z(N}MHYqfMywHJ6pTWGUC$7_Bcor6xitT~ALds3aq*lf9xV_~J6xSe6Q0>6O4T?t3= z9v|$89oVxaF(%fc^$U3M%SCmM))IvumuBzXy)n>nJF`n*mrjGcQR;3H6>dTB3u-V4P4Gj}-Xc|T*WvDfon*#pVP zxt+c)FTK)5;xmvYb3K74vz$w7Q~=W5R7If3jLIfp13MJ^j#OR3|aha|($7I(6y z9pqD#I-axje8tv}zW2gC(9L?K@xP7tJMoW*j8~WT2Y_qN>9S8?>aykV>3HFmE!g}` z+bdHIww?2ST|0Yg`yPFpcHS6hC;tC#f1y6g z(%P4VB#_)flI8_sueUixiqvcSPbqDw)%HjuQtP$UaxJAOX-W~Ty-hJHDz*_(P-&%# zN)>aS?{D_(bM`remwTW4fBv86c^ciEJu_?8tXZ>W&6+hY`!&{^syGwy8fOAp*;Dr# z-(8%;8I9K-8vIH&>r$_69lDTjwLkVCHbP1VcE9=|^7!$NzG3!MMC^DO3G7jc1oo&z zj@zT+w*kB#(A$}6@aIovox=1X_<~O(-OLet4t1jwhqd$^(%A>jf*jI*+_T`{Xw{qk z7M;lXKGDTDWdG2b9?94IPI{DiN#G2Z?u;Jz!Cm&wXzDUld4S6eId5{FVS8tIz3UX< zmsh;nAwYx9F^UGAv&iqvdh|2AZ&e=N7x4ZI=7qVYA1QC7RNtsuz7sx0u>GaW7>~J= zuvBxvu`AFGd-C>gVt$2OmZq;{zJi~&ul!8UW=Hz18rYu3Z}xXD==OajeKgj8m+|g9 zIqd_C&kC4T7vhV;hr&636L0411KaVTwCmdl{p9P|(Rcsm?_@`!_=R%A>)X>Vz)z`o z!i;0>Y1tv|NedZR)}Jh$p%nDs3#(JeLmIfIt1d}A`I6;{_C60sCecL&tLfkPrVcf9 zQLfS9b`6wzmxw>AJNputV@1-t`m#<#-KlHJD%KrWnl;b%RQNuCet4=i&jHe#lx@~6 zDf5$zXKBaC|`NSAMs*`p*<{KJR_P# zzxY5~Fkg$wKKsE=Ec=pm-&Vv9LiQ8)yNE6h;R>(XUwF+tLU7QvS@Bf%_4gGQ`1O2jzwq#s8lq&tAI`2r|za`C# zP2l9N7v6PNC8onyQHPGa{haYwG$tIOP4TU-@a{cI@$UhoUtK0Vl1Jn;>o((mjnBPS zu@^|~DV?gaR^*nZuE=kve>)xyZ~p+_)WlZlS31h-=_1L$c*uA#ns;x`+^_UJ#reDf zXKc=uVaLLiz1-~}-Ja%zR485(=RnUG%7kNZGeMq`81$(W6eIg;*b1l(Z=H5kLKqsm`>9P^`^?$5+eP8+p zK0VLZ^u}!Ynka+szDR$+QLC`k-#MZId$nQ> z<&ak8r{UXsnRYv%^fYJsI@S%*)uz4pE|}|>I^cs843F9u|6k!Q(#+W+c);F@H?PE| zF)+Me#`~O*^SbWnebD!H|L>L01iFWa|KYY$@xHI6`v7zeg08T_yysdP{}7~+czyrR zuSXW|rk=Jv`R1!>&;D_oZ}9!Ek+~kuH$K$f7yEvc_l@x27m4`ac$@g67UnGr^H2~* za!Q+M-LQpc8Rz--Fm_7bRG01GTpxsI-LQ^y|bPVE<2H9bs!Tyz#X9 zB|2tH$Y1b9dlLr4-E9Ki;kAB9! zvtIq^0>8g7PkE62%iIV1l>+q{mBZe@>6@@W!uPul?^8V+=8d0{hjq98Tj-<1+2@<_ zlSQQ|(DHA@58ViSg#7Dy_i#Id)o-*O%=sAn*v)(w*;{7>=Yajt$@n&4#i%gjb9ms7 z7HLh0Ia;bY6M;|s^`DU6KjUy_1lVv}Sl`8cL-;vo#&^Ipw=%M?z1rg8Ds)6EJRB&R zH$e|^Ujd$bZM}A(pZBr#Vef-%pf}k2B>U&hCu4k`9o4<)gP>sozoLb2V0(ST=3PQL zd#qekTiG1r!w3)G{m`0a6Y?}b4Cr1;?yz$BuKTzCjO{y$dTR~%6OnW`Mc@B89@hO@ zOSJVRE1dS!Znrf3p^R?E@6?-Da)*iNg~oFkZ&UX; z;gpq}3EM$^S8<+WXQ93m^=Kos4uwYp>1T|GukXBzZ&QkY)J5xy&xkg|TgFxT&V%BW zO+T|OJ)*SzVU`Uh&W^HUwSwPNBZ=P4djJB#*5ciBD-N^_!-d`jyTyH zLaydX16aGP;2R{v*e_K|`=O`Pwu#nW_S+r67lV)Ijlotg(g#w0&vc-Q)S?eAz+P7GK^txFCNV;Rgr* z=`wi!ZQ>+tRuQc zpMl5RjnJ0P{vhO?I5f#=p0K@U33>Q9oUCS)~_S_(q$4*oNyA4!3nn zb}}?(d$^qxv!BSn4}tG*?CAek9rq=8c(HL23sG|p!$dozdq12Mld$5?gVt1`ka8S$vdb|nxWa_17l+= zVeGc@nLDXZhDqx-d{~)lz883aI|~=^tt<1rKxiEZPgS>1!Pl6shNtG+p2$?w>GvJmkFgD&^HtelBNYeEdg&83_KmU|U)Iiu3VbbUgmDeDV&_ z{T9$t2marKzZm>FGws)}I9|Wkes_HR_%2}2fww8YxR>%3=a(;?VPqv{C|&b>IJ{zeEiQIkAI;{-p9aC`{}-@*Qz@i>(uW{EEZx9Tuow394dG`=Gdhg-r(^fFgi<=ymPN?un!NR`l)c>O zU5)YhY{X|9|3yE(jd-JH+KhY$^-Pr~%LU@~a>=p{w-auV?0NaR)h~L>w+Fat$%qFR zIT4(A{du*ehrbZ{JaDt+y}z$f{X70mpPmEr&{JEGZZYw5)!!^kSuZfmH4n^EpE>B^(Hzmpwb5y99uES#R(B}q z4nN_Syk9PPm)smQI`qKI#QYv_PLRKq{1-@G1NkTW`2*!_0?w7(sm{FX{_jpZ-k3E; zWaDRSnXvcPy!s4w-V*xY&xqgT-COf&CvjD2c`0APN4AN*Vpa09u^w5~jy`4IY8`r& z{oZbr-wM&dewT_a>_u-L;+C{T@7T&bgl}{|c4SBYZFMW1NJ{H)&(72x!i;C^L3hnJ zQp2m;HE-AcLhgXxR)rrmf9J*9ZkIom-_=@2 z`)|Ab-mz{zFsqp( z+w1Ubqvm7GS@9db*2vyMeUI)E@h@=SQ!)57*Yo)=JI)_ReEwJReFyDj9j&~g6MWa> zhf+V2Z^7Cx&e=X~wk@lB!8I3L(#wN{3p`hVM|wVpr%w`|n|i?$0?)xDSr{Q%Kn~cK zZ~9HC@+I|~OIo6L{tP)tQNN*m>uKL?+NweAn1)XqdnX#{>!dIbNe{{i{rjGHe+s7* z%uHDXFW%fpJ+|_Fjt9_LA!mOVWyG{%$4^4ryq}>IJY&GC&Qd&aY_5@ z+M;mILs{D%;2Us^WBYYChL3}J$^LB?ht|xz_*D1uK>j}|f7r97vy9E3;V#m6KwkVU z%xRbhAa_~PE3FysGK~SGZBUxxBsc0m;7{fkefiFF#IHbKru|>#{9l24@^*Xmb>XwT zu(I^(Zq5psdmd99hua;3eR=vrD!HIeQ@ z(fustmO^)OpS>`N?&SXe26{wvD}On37en{Ck|&?;0_MsJ2k8DnQr+Jm?|ksIdUcNH zg-+_6kXQOEC^O1CgS?zAGBWJf*_YvAz0{fgFe8hpGwTko7HZC$)K#CAH1@i z^j!N*s-coi;$B2vb*GYKv{3Z}){cwvWxVoJrMG$cAmWLf)#!ot(i zv)|xJ;Lq&nutb^I|9&!k(6$Tv2mQVOPw;1x{BkMuXP-aZb11*FmE-*flJk?VQ~klu zCz^=E-&|OiNK4OqNwi46CdtSCN5R$U;{wly*5tYM?4JEecsi2syh*;FAZM$6Jomiv z*i8A#fy-xq!ZFS62BTW$4h*&acC)zM#j#7k4c zkMe+vo9mXrg?{P+$4e)n@yQU9n$#5`3Mgdw-R;9C^-H9$V+&IGbE& z#@Rcblb%kh^9Q17XaC1OWDjSWzb{vNTj9m=I(nwFOLTA0emmU(nzemd$k}(4KHnFA z1#3VN7d@`?nc63hZ~CzKTFAVV8-?sgkiTGam@OXR+i?Jn@e;@XwzR?cv3aSYI zjyCbvm}0#1@$ECR^osg_f-IpwTFLtd?xfQClW;NDeMRm2xg^?jhTPQE;!^)l#&wvy z+rafX4_DzB!hGj;drdMfzfCQ!UmuUF9C>)<$Ka~5ZF)Ivs`ECv|3!Jr?OomqSA+k{ zy|igx^og;Jqg$C$+*Z@m#FKuvu+yHbw}Th>pJJM zxUSpYY;|3jU(HLC`#tm0+w-LB&_m5D&~JYK_vWOf16Gpu)kP83rrJ}{I|J2bJNj?` z8a_q7*|7a*)Q|Es|339`Fnd(oR)s3%cJvJE+_eFR_07OK()NgWOxg|P&sROL z;Vu>K@P^V<^w|0Qrty0rze*cN-TuJ$Ph^+N9#ve{!`P`_o%bE0jCOdCDSB<(0pgP9 z*yo6j0R3q`{rHUAC`C|liI=5NxtUc$7W<7*efBYyTR-a&R&d>GqtB$ zJSHwP_1fr1#I3V1nVfIrjMvE3Hk?KJyM#B|aFp=h2umlzyOFzmT--Anp&t3R&U`bw zY)>G3ANqh$^+@8+56874c^!{ z68-TdZsr#J0pGOyqFM*W_w=%#ls&PD`=MyxZxWZn8g}-#C%V~d=Z4SvcF899+a-~l zG-v!Gs@}now@Bpzgu$HT{qtu`n?Io?)N6R1Jj(ePWF9-*4^xAoz3tU zUM~1%L<<7J=SzAM08wLYUXbxVIYip?{EXJB|kcmV6lKZO_m_xre~kNsER zHMp_Wr0cA$#(u5u?_j@{`8G5%myIlQUnyZ^khaT|>`+!e#;n*pma*dSn#4W*_RQkG z``4*|W2aLm^{IOW8*;jzhSrecDI=GAA=IbuK_<};FTcn5a9CmBo}xd^vHi{Q%6|E; zlx@a<)?7Emvq8D%)$@O)TfNLYKEVd%Tc%%Gg+{cq8dX|HIFhwf`?4nLk4~!}mG4@GE0Qk><$Z6z*kz{XX{QkoI4x z@5d=i=VW8`eU19wKejto-wo;QvX|dk!S8w0cf-ceAkoDdzUn*A)^`oGl`2ks78*ye z@5t6SbgKHE@6(V}U)KK$BdV`(hTGb``i^Q(s4rl*jJG;P>{Y$HlwhT?sN4W~$hHrX>J?}?BlJJmHr?;G=8ZIbr>u-Myj$7(gmj|UHr-LisRePm z)HdB8z>h&48Ku3pO%ZL=miHr_+ZcHAw&_0TwM}XE3C5p+y^TKsT4D7Hr zpSq84WiR-i7QO(?zw|=alcGy{MmTNVKG&L8V0Z?dHEVdc<#Eq-sS|Sk%zi5NNP7G+ z`#_1)ozM8O|2#A%)p6B^T_UU(gwVomr%FWmlR8-8D5_IPf|aGZ43 z#B^>YlXt$O`^YCO%wGlLrwuUkqB6}Bg`Yhtl-Kj;jhcH9e&xjY{v*}q;jXY`d{=2M zBYaO=d}}SfKb#ofP~9o5JUfra_c6^kmA2jD3tN1@Iw8KE9?Mhb;p6d@X{;8$pIChC z|26f!Utzu%fxpV}&rQfqW$sw&)9?eENB%$Y=q`oDb97INbYm8ISLBCuFHMSn)&w17 z@qB)vE&EQ3hxI>$XZ4B8{@mYeo)()YWb^!s2}eJBn@wNtg>Svuh8w)_16SH`t-`&_ z$BR!|m_>p~l#d@s$B18_H~4z~?Ar2g_V9Nuv*|Z^;pe2c1V7IU|Etc)DLmT?|G3tM zKjDRsy=BAKdf}c<8=mHc@00#k{wZGgF`pk-D6F)W=rgyj;T@Psfw<+w$qpMIkGt)0 z3#T)0Ht%g67Vf-w+=`DZTtOgCdj^H?>_FT*#OaI|=Vg6-EB;EH?%Xl`zjt~1`3JU6 zIm*}4^QYfgo^t1z+4uSf;&v)dVQ=1oy2&`)>|`7o#WRs-I?sHb3Z6!ul{{;C+ITiQ z8GlLVA^k6e|8m61`0E&+Iv&D*CH=2Ec)Fa7w?^?y-dk&VZ{yj* z^At}v&k@qHc}DOQdvK!d|2NNc&IIf_d|qU_d`7I-OlJ($9CT12<4wqU>9PS%x|y#M zm(7`V%}f8nIGIhm&RLT?N^+Df*g$^GuZCYrKE-o>cJfGUfg;|qHM5Zy?V-;le`qcF z8Edsamhhh+Q1}-YxH*)27I0@V20Pk+s&WbABly#VZ%yjXVg7emcnYC;eO{Sx?*aD$ z)^DrWbJWD$NDh0P?`DtlQT8(5!#6eZ*~fej-|?CQ4vjmqU+{tJyIFsps`-n`Vvd<> z>PK40*^B%;`WBh^!Mx1SFogWt|EqMZXAgyzLmEGokF-AUM*b(gbN;Vz5AT2FUH-p( z@reCB%;`e1>jr;yQn$VvHXmF+6+QfJ(l7KFK4D)fulB6YAzuCh;mu%uOa3T@m7YR+ zzHr?>$-CPj4ZB`8me#s;_U^Vx-LW~7x35TRS?qVt+P)IL{1v{e=3GP*d~&WBKI~@p zck_L-)F#d{=dKtLlD(WF+nKYQ*I_#__LlN3>BpvX*5x|R_v0TmaS`IK3~PtU^--392R&vc$3ejs*X9(&`t`Xc48)V&qF-v@8HV8Hty&}-~x(HHj4H)cMJ zjW3?<&U$P*Wo*WtT(>c6`x0!sCGACSI!`uFU!Gi^JYaQpPc+{_`DdZOhIU-M{dRu& z{_FOY_<%USw0-S+_@}Y!N_i?s%fa7K)tMEUj*M_l#I0kUBoChty8ZGy@SEwobLt;o z6c6|YM)+rTuDfZ76FbkELHp_Z-#U}1c;-m4_9L7U-q4;8@A7|K5k4z?pQ-bN@Ha}M zo1s_yzL2)-?AtDR+5jB`Ix-f{4@XLMmaQm~?&@seh!W;Kdgts%?#ld#zI&3odC~T0 zctbd4G;8=u>&$xWN_db$J!XfT7eAsdBk)(TC&}$k_?X%SUfuwl_CIUAr;fU1ut$4A zd(p!A(hZ{NHl6F|dmN;Hk@m@s(JET-?M$8>eOB};p1tEus)OptIni_AbI9vMFHNKm z9o9R3F`YTcr|gT>Hnejn9H9c&Mk{T473pV@&ix;cRjJ**zVgx}&@(YjF zv$(S(`bkqZyaLzU04~Ag2^TQe3x+jqGxz5ELe1t6AGr!(U^U%WEElsotQ zv%94!yvOV*>MH;FK(Bs#k5R8y`!2urF3KuVSxI`s&cR;Xta{N7(j9|*A3SY?%)a;% zZFVd9$ElAoFDPBXIi2?9JawhnJh_Csko~T9w=|t6o2M@i=cL?X))wGo)LiMU?U`492o-PRm88eZ?}Zh)IL$Fq2klIM2vu)gB+<)y!o zM|Rd6^1TNf=Qnjf{N8^}EdM2){}BIFzF@=`&Q%55;iW&Rd~jW5>ms;a!0G<)KzqH^ zB{<;<&^g}Hsq>@a(`S?NJZ^E1j^iGwcAl3+=cB*{=o}da=Hp2)n=Op^t@6ansYx)L zt2B5lPeyhEGdT%ny@h#SwDTnBT>60aWgG-1pY>YZ4ah#nqlcMCo4Gu?Pkw>7^niOL zbR6~i%oJpLFKZnIu18-%G2vmm`)}_;KX=QI_#^c1Ncy(?nCtt7j6YHL_P0bY{h|6G zIz)C6bt{-dUe5ODu7vITzh!m%nt`F%T`7_5a4uoti0O2jx4EU~#ScldcCw3|`~jon zQEb(}=ku)N9sBj~`{~cCO?{~w_02MC71X^Ynwn32&Di?2b~I%sX|98y#a zZH89L>L%V_H*hQs@cqRXsJqtTs81pG(TmR#mj6Lvc=O_J!hf}4`p%30N%$@5d$_my zj)!lYEt8KiUwk;e-i58;V9!p-e0#1p94E=Ug}e`$yhFDiRa@D6DDo*M-_qC(3~P2~ z&kH^iH<$3e(EI`E3Wo^aL-@mvq1%rM2fpjR`T@tdRJ|N zU6Q{JzZ81)P1hT3Bp*L?3HQCijb1tiPjiWj@l?F$`?e(kzV;EF;3%SQ z?JdzsKkv*-=mY19uhc2_?Kq866Je-yBLQDUjZ)GcXdzD;VnZ8n=j>;^OxaE_}x6@N3CtSZVGF?hq?QGo$PUJ z>BHFZ*wx#2Ou(+z9Ya=*WLxqLb%%4H_@tvL!>RLR(?%iZI^@{st)C#r5A+M=Nsb>F zZ2H&!A6cD*{)*`&`d6O9z{PZu^c%Jf--6xVrEm1;-e%+`c5gFxuH-3>W9dSQ#thE~3lD2-~F51qv=?mZG{V*_pBVPW$$@ZOfaB~lY;=jTBE*t-E z$PBmtJ5x3eE{r}%yEAvqV~%y0GqhE<{hMw3hiU)6aZl8OBGQ?^u9MwPJ0E^{NO=UA zxQDx=lG~fP1U7fn`9Yw)r}^#uW7=#c}8-^L=r)Sq_n0kj`9e z&kL$Mv;_SLgIju@?;&34oC|k`P#52yfNVYgKJp}e#JvCcBgo<&-kI}1&%TvJe?kHN z1kMz-MzXfv39j$kGVj)}>=S-92NKSAwJv1C!uz*Gf5P)x*Uc9$o^Q5ay0xY)YildI zNb`Q~>DXFfeFeG1{SAM{QR14t^s*}6Z?&-Kt*wo`8-D=rbr$|0@1+mZ4ql&mp8Nks zb~CS(ea+lu&qL_8f3o2@TqoBAkN2z{c(3t8;iGwKch=Slr2~5pu;y$zW9Yv#uN}f~ zhUx}PDRtY*oNeunp<8R1gC^YR-Erw-Yh*{VcePb}6qxti$glRW4NKZ9ft}a<7vy6H zY1WUi=d1EnwO_pTcHKR(m1h%Sza08sE_Dpc7xe*Uu>Ya-@Ck9>GD^6uT;v|dc9_~I@L-&dMR z8%!3j>A#tseZ!L7JJlaMG75Y@!)UJ`hlVgGD%AT9;Cw&BLzPk12;1dn7@;)EF>@Q* z5Al!Gr`W6|?NkfDRjv(m(i9ke-o)_U!5 zt&98;zVaSiPfo`UOo1n7w^DZaPB)4!YvKC^gFBEz?SZ6^U)@2!I%PZ0j^05#gX_6p z2HUx%XOH%+S-r3ae~7Oa_Pi;*PzcW`gKvwK8QtpjtLOGeW{K|>9oRY8u+NVJFMb(k znAUt&oKsrMd(1yEaAtNnb;+imvY%>Cm+T(Vyu&Ho%=*jSw@nViyHcGc9E8r+I%7HW ze0T_7S!c{}QohbSe|pk9AKK0SWAyl*?Q1jLbYE{PpXO-~XSV!jM`jUgSB&8yr%1A` zIPj0hCnUY$uVa24U*oL_>zF-n-lRJDI9sCQ-%JSi{6#**K>8zpNC@}5^Kvk(vY_+Z z@O5S!XYro}6W&mM!Q`3QvLSqW?m!=QCeRc8=j(#_TB7FepFsK5ZzZPJ-5U(+UF|1( zuO(V_h2{=E9lgEUYL;Ip2?Y-w&+?kZ;Q^7n+Yl;3y>p`)(sih0u*v2=^ z3rG4i1>zSIU(icD`-KV%dx^i9_))#Y-$;B>FY&X9AKgp*EaK1WC4L(5=8TE@Wq{7B zh(Es^=_!52dZR&m>v=6khpRRF^cDf*q zHEzC+RZ??4h>-Pmgc=T;Q=|o#zO)@>`0yFQi>GXfC*F7iOM&D0WeanbD z%DZ^;IoffIeZQIa1@?Ub?_v9XBk!Alod=FVNwj2&7Sg2WMleohkdDpv+)TpeEHivC zb^&zzuv1AJ8i2iu@DSyTof(V6P9kkEu*UBVUiCxf5YH9!tFtGn!#KvnP4sK|sLRoL z-(8z~<*=`oxaY1IUdX*D@i9#_XiOuItNe_I%Oxw}^^85C%#9jvNgJj#+XlY85B0ol#`rk@p4~@V z&TQ#AYd}9*E$3%RW zCh44Ke|~EEuF4P6VDZWK`v=9hM6cu9}{J)T}cmIsmt`G0mPI)M3AT<4$zO>n!A0vTEVz{{;uF?3(_7oaY77+5c1MB(rE8M%XDQCZ@r>sG-AS}q{LgTncO?4lnS*1{m-_ItN!R{CAN~`Bt1P_n+arSGt(X%F`5JNRr5GX@;NUey?IWaD5LpMS~`>{R^s zDMzqVcQFPW!A?EQ7;uEU|Fanbj%*oP;4%gr;f~ypr~93~)cr_HPuGVkpWnap%NWr0 zKEH$beV1SCj|BaE8TzZu=3`G*qP{`a#|P41CA~SApYh>*rQ3V{rMHe)TrU8-E(i;* za{{<_lb+l!h6K`|Bz;#>{xbvV9i$&jO3w_WZ$&1gn|<1RnHPT;|3@b4;GscW=-@%J zfBgK|R65(Fylv#2nE)Gdyn70K`zvJjYYX;!z}E5mUHFcVw(Hycve%{STl}K4yS~XU zzU{96#V>yCuCMcZmR~0OluTRMa#x`zN@Ho+{+sildT0DM>vp1<@xO3ET*o}~Zzs_)S#cj&*C63w&X5<^Gil$Kp0VZiQMz;u zc8t|EZ(WaUn0bJKiT+!Wbd3l9bkySG%oqE?d^z;^%YN+{nui4J>8Ia;e=+;KB|81` zg!JgNu3*?}!$ke%>8n>Fp1vyV^z>EvQGdRTUVFDKFXCFgWabhrJx^ess9P;B2$y{Z8eXxahR9HI(PiPi)+0h)edd z8Jkz*2kl0?T%@^luwA~M*e+AeUUeTY?b^#(hL61y#F04f`B=hw7PL17@h6S>cD{M! zUxN6^Q*|17&QHpt@joVCy_OUGSY1*c`hPqR`)Lzo(BeqqU*Ufy;kYURNAzDm9!!US z+we2zquXs=_q`oVr>^6I`IGoPJOjJACE9tv@&t89>de%iXkV}TNw>M1;^~lJv|ct; zXW{Lcr=+v+xvZnTOPPgh2A0e=tu=v}~)&_vvR%S^J{n;ht!cAN`X3z0~RE#5(OheEN0T&6(%Y zNUZ#xSF01sk6!puLb&I^i@|WOa@F(N3qcs_e1Bq{H}xi)zK_ky*8cfPIKC6a(R-h0 zU6hpPYp2fhjipI>ZVl$?O?L-$wEPe2JpaSXtTP%PX_fVn&a^&K*YlBfAI0{37yrX9 zY|nS`ksikOe3yL(`O{ubW#+Z;Pcnd=v-?JVv2%9I|Cca-P@lB&B|lEU zr?*@FKi{X9j=8GqWv2XD@hve6rVc5B=nz=OZ&ts&mrV0WH{-z@l+XuIhTG5L*t z_GZDy!=DlUSh!btjZQRURV+`>A3qGrK(BdvK1%E-J%42V?^L?r{cS;7T6+HYaxjl? zcd)L@Jq}K`%C$an<2P%GzOy`--{`oWKQjM6Rk?kW`qCeN6U-x=Ez!-a9mmJumS}}! zEygzk({t?AAWV{e_s$0P981t&3FB$chnEF$QvZ8{bey{W?^Z@=M6Y-tD5uBE@#Wit z>EQj*Y2r0|k^K7gg7?SZ4ai<+qW$0VW@oTI9<4v0n?Osn{H)_(dOl3(canE#UM89~ zE{PtEwNB>wTb#@@Zsoa?=Wd<{dA9NFaWZrI@-WlyGo5EXPX*6fo*hnR-#i||xs!QT z^8i0!EYFor=1}6!+Q>uPSqFKJdgZ7r|2dodXOH0l{_HxQFi)qGc}_YH`F*%^mJq&` zXA@65&tWI?+-@h+CBHk0XClvZo;IG%JUe*0oXnBgJo!A=@ql|IX@&E7DtH=sR`Nhk z;UOn;l*>c>sC7IK@=*U#&{9Nv5%E4Pz5NzZ&!S^a=IA**;PhcegM0K5C-b~w9_nx& zaDLi(q@72(W57SAj;Ecpd>-D<5A&?$Y2yLzAJ0E{@DCaIhYb8f2L2%f|B!)y$iP2j z;2$#Z|1}xN!7k6iM$W;0&bgasGtW~z`+2af`{ePAbuzQDnX?I>(U<2+o)Pv}@BeRk zR1f9?*>|4gQF?EW^7Iz}--$aBuHNF4;}rJe{P*DRiRkh3oGAVOMEsrJ`Gu#<8iCdz zm@Bi!`_xagp4yx5+*{XN@8C0kcSGL3VtnTBvS+UupZU9-(agqY{x09Vl+XM<_Uui@ zXZ{{%H648B?{QW$AD{VqoYf3*F7N%#L+)iCD0_stn}%}Vjh$6seO|s{#X$@Ee?~Uj z_pjP@XvMGKU3;+fj{k3DH}C9EdrJO)y{jI#n04W*v?~Z79WpbGdw5cg65oK&0N?jh zU*tD=AFlTL2q*r(f>M5~fJxpn;_sypoYw!hSRa#F14#`z{XO2r_7`ejh+wt3-Ei=>w( zq=(F!tDpWf>8-Xb{Qn~pcq?3ivUZW4z+d`{FMsgyckQGfwzT?da2Kjj|FG`C$2kXfG53^UmKi7fGs7(di57=&gb;sXu+Q;lypgw;42qqo*3kC6= zf@kD;(wzUbd3>Ik{bN22Dnm4QbUdm4UuxeE^1eE$e*XSf;qE4VOF}xjIL_ZE_mI9P zDLv3WPtyMjoTT(X`#eeiFBp@Q?za!)#*^y*%}MEg`zU=2>FbixeSRvP{y)+mzkGRT z{W4*Xq>oSarT-`G7ml}&@ZAl*ggw=?kH(+(lW_WV5YGPv&XdU4led$eC}VLQsQiro z1%5yB+BcNAr#z{B8-SOtSKd1Mlk6V7FXerVeP{eHoEeleaH+GZqYyV$W zLOm1dWc)8|O_D=>3oW?MPvfdDhqHiB)F0?Br3ZCa0G|Cng`JlE%XvSXgj-|OQ9aPg z{(m<&A>A9J{PYV*FSf9Z|Lz>hH0xWZI_n0nPo~3E_8{Udr|RpYqWEkK1SK%dXPZ z|C9T#-(Qrj{-2-BXO-#I;|coz$jKfJoQv}IpYx4}1U>}I+X4K7g!K5iIF+}J^hAA- z$b-$Kue0U(JTUqy0ViXK=(9Ak|Hph!GA^f#A%XNClHQ(>pFR44^zV|sCn-H3i%-!1 zM<&W@f-F9v{;xi&`mN->ILI&BPr`3)t(RJv@a6=xZBJvWGOVC-({Lf9=UV#-9CBvyX>4#TksltPdZ) zHon*PiBT5rTY~e~cDes_<^W`tv_q`Va;L(sGuP@~(CC)4bgu(^Yif5FhQz;ixBQUz zyYMM~TiV^SIvbXZ2<|iX*W9N{c#aLL4V7->pL_NmB)lAaMs|qrvgz}=*J6i9$K!{f zW3qSyZAaO2NE`2Zhr2q)gg3Y;c{5Y0n9Cl^t;!OPCiX9VJbz|(*^0qsZQP}l${F-* z|870fCI3&MS5nbMH;yDsdoKj{hc<1$<`wWQU19F{UI{94EczH8rTm@pW&h8y z@AQA8vp*nS>;IBHy*~-P?Yw`;`{Tg3T3(Bn%XT;m_ww6B8MAi4SI#!FM=|9Z?l{_| z^iI-gv$MFL^Ki&{{0{DN(>?FHr@yc67!zLcL$Kig>2Ba{Sr0-_u`O$e>cieP^hCMt zZphFb?(A<$TajDH{UdxIMR;Q{rA9t=Z;1_K6U6S z;=NF`rx)y9l^2OH*Guhm+f#MdL&vCvPf?F=(57Rlht6eYcaAF9OWqtKqdmL64Bb^e z-R&1RPHQT6VgS>T?zP#d+0i$Jo4snfL+?XdK0I`eQvP(0Hs@Vv>l7W()6|{5aIbt3 zwCP)v!yO%uFZF34E~9hQ!oBgb7Vfn$(CPSh)M)>DZby1#8~46sQTCyZQIT!n`6@8x zK33`ygweeguUHt}oiWtbHwcpo%nKH#0hkd626}8c>7?&gy4TKyTWDk5|CMXocmllI zGzfbRxPZa~ySD5UBh4gg;}$EuM$835?>DWDE z6^HD0+VB_~))=MqQ8wIV!>$eQvf&X5r%j2r>yA2ef6q*3sD(LbVFuaoUK`dqFqPS@ zuylY8oBl*NOM9z4I!iYT27a0ISk!+oa&^#`D?647$1IJdmg7@9GpcWtY4DDUA`prFXddy5Z@vvkb0%-OA55 z&EDSStbdC1i&YL|_c;A(eA$^9;(ndfWjo#Vdxb;q9qxMW%}8A)m?DMk_>qU5t#L_X z$nj&-Zx8t60`)n=8=IU#!U2C6!*^=@KW=Bdxu`eSzyvO7tNj5l-ZFq!^ z-pT&Ig2_So5dTdbW;*%eCHxqr-yQI32YgeTb&Oiyy^l5#ze3J$8CN|U0l8y*E(naz z1$*%y9TXgV^yGPV^d05xNMG;E${T76OM}x(yJ*kvDcc2|cT6$_z1(@5x{Uk5xX_Nj>fwBONBCYRWpv1y zCs=I0VX7CfDTwBf+s8z>6DKl-{&wc7jIi!&K1X!;FrHl*nL>P@9m-GHtDNq1!dVJ; zxb2Sc(|?a>>`@$P{e&Y^cC6Yh%g{IlA9c3EYOj@9;nZF3W6+9h2oLexZQg#D6H47R zlY4roCw0o$nH@?MpTIfl1$gweG2QuJyUfieeJtsj+y$Gja#xTKn1LOm3ijSUxjTPV ze)l-+ptRN4L_6V?-pzMdzviUD`%FKN;K`T%2K4fqBOXb2&`x=b84T?^+PI_5+;K=9 z@7+b)h#vaw-j10e$I3nJVd^d0TkRp*i-|L~PD{^k@&B3mD*flTkMh1z?M_=10Dp|W zz@0$SWhuwFcR5>g9oFrRuFPA1=(Y>cIg-cJ`?7@>yCD17)V8OP??G!)OF2LI+aIq@ zji^2P=q|rKscmg9q_%DBNNu~DJN`ZcT&{)tq2L6gFztT^^*Okk^1<=0`it#P(iKJz zAeW!!-5-BLwq7G8&x*Idw^m zw4H@lnZAI$q)X1x>F@1y!j5DGxjnYa4Lg!y^$7z*zXImNT~52BbZn2%nyg2+b-~jX zj?zAh4GX`u2i)hkWBJ%$Jfa>xFZeDxb_Uc1fJ9zwYC(DMR&FHV66W*mb8~(J~ zN<8LH(Pf?GUXXqxhE zue5m*#~#DiuypJ%R_5)~x1Ybqy^wn- z_q+N%O+HWe`E2?6eabx%U)P?3uXmo9uW7n#QtftItX@5DZR(Y;@_BlEZ5Awi)j71@ z_*xgk6>ZHrO}^?3hR@fFdgH6cKzO>%@^rd*Y1?M1dH2TVDTdCL|OV|_c=8n`+v3n(nmu%7p->Q@j)4LrTrEArXDbvWn zL5&NPmoFOm9pKw8N#&fOd@4iq2k>9t8-B}+w^rsA918H^7T%u+k6+(w{eG=FpXWH~ z^zDzhvo4qUpZfN}2WfleeLL|drZVr_$^337G?r}Ue$(D~BU$wOHZ+blG^cCrKQxH& zxt13BETpq0^4pK!@dflr*%(K7(!4Ub>#9_9xvVuqy6X-R&wKis!QIUt@V;g!elGao z(|~LYZt3~W3tiYplDU>>?gf$&^4NCxjXD3XJSS*}-`jR57LVwQ7wOlNliz6mAL5<% z{0;N}f{nhM1jl&F8m4jn)MNZ_Hu+<`=sEEi|Cw`c$FB(>+~fyq;z6SU{kvG#-) zrak$!?KwwtV%whA{|~h1m8aRBC8yDz_&1Jg&wr+#dwKl!Gc zTLE(jXyNXR-=zDz4z>?@kiU+P)JBwNe5D?I$5HHU-BYS>jIzJ#U<7;V(23d#`|3I2 z1&3_xy|%678%IZXaQ{!i7O$;3_Wj>)tByaOUR!lMej071b8yLhZw__n=JDI=oM2l~ zNBJjCIIf&{9C_&t<6k(jydMh4d$;9bx8>nl?7(cx!*Bi%@GyLuJY05a9(EX?i$7Pf z`fCCF>kRO4w9iA0jYW)8%&8>f=-XFj`Z5{RPf25^{304VH4Y7A9P-ZnN5{=VKKFyi zju9Onm;4I$1Ult4ji**lHBY%nbXp#B{x`!kRZQA2DgNk(rB_ckz$8h#7k_dFPuI9Xdbn_YKFU znRQM(-!{IVQ8S%S5pLSZSdHG|`vj%U%p;CHIC%ZWi)m~2vL0hEtL`2<#@%Dwkt;hT zwMlx9vFRheJ<_c9@5~IPpmX@HbNhqL^Yg;%jo)UHd`z_0IE~jWJ-^-!O+!`=-e+`C zZ*pU7>F98sWoG>-Hb;>!EjTuf*p1Eu-(zdN`O29c>H9)HKBX~dd5Sqp8+P?Z#zlYb zel~f2raXf082!p2mD3VE$aewE+~P!Xx7*g^49TU+A>VNMBEfeLK1^(`_1#JfC5A?IPPwqpiG6f|dk%vwYM2+A+Qr;JcQ*5H|vSWc)eQ<2=hVd~W+f zy~$Dlc0?~Sb!l%hW#fcHdlfn&2Mae^I|@JDE7{ghdsO}m_SLT=ujUkkl@}kMnIp>Qr14gL(YC4f zZS>ZrdGU5?e>m2rv~w?QIw$~pziCq|@3!6cdp;=nO4@&@x`~(iMcuI~%P+S6YH$gTbGF}{DgjeRKt^$YKV zy!-)Whvf$c&nEHF$-JJkFxPV)y?ROS&-E3(#|wTYXKGHA@Bhj8nX94YZk~-!=B(*F z)Muu{ZzsQ#`R(R8U&(zCC)> z!X4YR%FDayW3ID0*GXH&dac2IuVZkpY!9cd9_gI5dMb4IxV^MKN)v9AE|_0C=|S8p z!(QH%lOxV1a6g>un6(|r9Ba)^ctbcp|JvvWs#BWdeRq_&lx+OI@FSY$uIf$k9_X;Cx!d1&S+2XIK%0uwSrZVcCDFA`sxHHCHy02n8z=^ zms066CWiAxhrU6hZwe>U*e?$pJx zb;&+eUHC?8r|O~ld~K4G@*fw4({7s-O4&Rlocg^BowToBe(}9Y;l6iewD;T5Cj^heedrhZw(FeRO2Vn(^@PuIb)6b;2q8x*jeV@ySp|xIV;MYKI=Aw`fVz6QqWzgKcC>F z{cI9r!;nyHY_MY^>oSi`qCajM>F}Ms5e2Iw8SU6rQ;vlrd?gl}Cc^s<+e40iJJQh! z#Pgl1V=44&zaI%#@V%wy(H^C@M56}`+~eKZUpeUM0n$2xae(PhQO>w=OKa;Z$GTP3 zjqcnT^KYDc!?^TQL;0|{OdR~Y8or+fpiyD zFR834TUvR!Yf_3DJh+-#5Ac>sknva9Tvu7&=r}pks~gG|E~%_=y%=|CZAGP9UE?mT ztZ5=|&WxIqB|CLxiz_R@7sq2_3>uXj%O8&(>y}J(msHnOinO{S+8wi`a#`gPx2WQL1F@u`x~Z{x$wed^RAm-n0)HDC%jz3pNm--o z=eFpb*>#mQ?xM2lB~A5}?xNay!*4f$b)*M5qrRTRYLD5J;g#k%U$EtsEm>mTZ1tU4 zHOtDDR8wS4!}7}dv2J7iEpFN3vg#VY9h<$3MU$KP-*J}L)>jl&Tvb$K@h!Ziu`(fC z-53ly3#%I&iYhLT#m!z);ZkB#rMtYW!7VDD+&tE;sa$U3s=X+x(tCY-WR+d#5e!ukzX^M=voF%Bw2N zztGUM)Ey&^oG((Uy@s*P>Ui*Fb#;|x^$l)gt-G+&ZLF$v8|o^{tIL+SHMKS47B$tB zH&PRVV-_wctN8+mR7c_P37ustJ$Lr?ux)WoS)&B1sCZ&?Vxc}9oqBO&mC|Zz8{IN@ zY15L%>N;u!yDu4E;;Q`{D8O~+Lyakpoti-^%WLcFo9Ynjv2I;`ZFwaPvb-9U9C3!6a-6aPBA3Yjm1f(_?&4T}5|gd82KB z0A6=`<+AGX%H!de)|E9@qtlcn2tWUpI#^ucGcf^i5YD{2*LfWGn0G&P4lLVt>cm-%AWs{GSOH;JSIUOeDYVys7iXyJJ38 z*;swPW5Xrxn5%0SmX|f2Z?oF?3GSF_wF~RZ{AeGZ{0qjH5R1IJf<^n6F{;%2B{$W4 zp{90u&2jNX6FhxgRP4RXx_*W`W)_3b;`%bF%jm9qwM&|oR{DzLlO|+a`|2iCN`*VW ztX^8Gh#ugHLPK27c<_v|Hy4is6fyKhVRi8@HdQx%*7eGB?QexD%qZ-|I!c(5VmNN>Kv8HypMWFoUUszmU+f+kG zfJpk+QuIip<>y$}D;FM^m!bxrlMVA4X<;~21l#=oe0Aoar}?{iR*gHSzIJhaWrOS$ zFz{wNKv6?dxdyxJn&SypQc*)w0|t%9MhRAVZB0XU10q#^i>G!x1Vs%?%f3+QR+KfC z#X+!ZK5Hqnbj?8&VYf$& zQHM&`ouQom&vfWFI5h6S$f6Sc3r;gM^LufHQFbwVLJgoIb8c*)_LYmu7!O>OP$RW$ zm_kc@s>$bh5hIYBMjo$}MX4y68>y)s5&(uNMalQY>ya4&^u|KmDtrrmU`^ zw$ZWe(})RS`omT8Rlrzx{8jS=QB~WB2JU6h$hl$m{2Ansji?z`xpY~BuLS6kb1N51 ztzq)dtz1%B)&NdpGkXP&b#JVxw-BZR?)Zz`SRP{B62ivD_3GzNFzJjD9s(~GxQQm- zl%P2G62eKiiFR`4K}9(hW{nwFYngwzH;*58Nw1X?{9M(A3Q#Lq|I8deakcVHmX4e} z{<4w;Nh+$aJ&Sx^z0p3_BvL32^0_ zoEU={D_x@?1`>o;FzbQ1>Y4`7RhL&wUY1re|GtI!uFU6nNeLL#IsI}B%Po=OXU^2} z#wHAYj|s-y_{7!jnBwN5X3sYFrl0Zoh^=%E228v-Dpu|Z@RFpesa_SZ_OyVZ$Mt!o z>0O*j&|;dlu5L*+%!u3lF?hz=My8!i$IN_G1FMl2A0H$xtkjTER$k614?97*sJedX z^0NBM9OhL)_Epp}3VD{Z!J35Bw0BHYnT{;c1gcSUs*2hgusP1uiVE7Qb_s(8=2rcQ zN46VkjbtHLWg6+N_{T&m(5C{eM!VfqUyDM3w`K+d-jbEdnpBreZ!%v=QD0n_AWmwcWz zfjy(i2!GOpV$-zZYp$6wL)D&MTU)=da>){pWpO)ZxzU)u2>Bf{p00ivlQ2Ko@v%{E z>`%6h$5qFfUR}1hMuS~>EZLYke!8XO>yW||!utSTw1sF1N5m~?v-B*Vq$=rpaJ;0dy}sj;pJdvm$rDt-ks?pWl@ zYvmb{G&e1+^E8J^pH;J{HeT(7s+sh8F^7N;6|0)fUxDcq{7X!q$%ukBV+8PFPLw`R zI-9@5beuY3zhSzEA(nna(^5l15=bmvFPF#BS-+&^vKcw;SRS)9dLLP4m~q>9s7@nS z!xyUSyn!VLWl9T4i!c=7y<%F5mXl`I^kt+QlXHQ^$aakX?;5MdjLb2Xd3XXyPMF=n z&tW9snrW96U*=vt-iibAcG-Bsc6RS5ToMeEZ`=Za4cvn3+^IIFflCZexNJczS@08s zVd0tK;hA{Zj5ypS6Q+$Xo=_a4zzbgz3(J>KJZYjkwZx;?hG+NyUU-t*Z2gZmJj0Lh z!jpY)$A%O0Uz(6!Qd~SS2v0aM-MwbcwNu@xhG*a_8P8n7=b*wRN$?XA!xNJ56HdTC zVSF!P6)6tPn>TL~1jWj0=1+C?<2|b4a528veA8@8L#HVx25-YLcpHwx8!~-x@zF#C z;Z=_Wc$&=@EDwI7-z+x&!~p!f67k8;AU-M_z;D9St^E1v)8q9q>C=+ZkRBs2xDQJAr`*cV^}=w6&MeD1=_HW-q#bs`l`Id`c0acL=WKvdI%@bLpXsR zg@g1c9Ha;S2l;^>OyHmNVq88vJ!$2`*Q37P^uvCBU+?KkXp{Hnwv zI?Mu$l_r=uRkvV-`1!F*&FeLG&BdL{v_z{M7Qp(IT|eE==Z9U-kd3Xs+3BqH{^Osp z>vA)!f83o`RaUdO(lz!E$Z##+BAl~od_OAwqK0z3+gM=kbr@n^iBOH@!EERTERz|{ zvG`dy-J5$!Nr0c{nX+(Vz8R!I>DNneF#{zjem?W^IwRY{{?mPnMOJF(n?u z)KuJTXu$a%EYI^?&Z}*zFSlOfczU4n^06o6yQX>xR;9;}sm#2WAQ#wX?kB5jmzXz_ zKFz!@7y%8}m({R%#(H$4CC8mxy|}8e!65SK@|LMxyDIF0MzfnwYK7Cl8NAoYYaT4k zanu}4-K&>LME&xw#XVl<&TeXSXD@Q+s=a}e;59I5UV?|avOzvvA)Z&ZOa%#zZ6#0i zJno2&O4mczTkC5cWS8IPlr=PHQ8x+IoT>BXshn%3&bm&&b1B+5dGT%4H^!#7p8aYP z-KiC2bbxxy=J@i46P&MUtxCBySu=L;^>gOqQ~IKongiiFh21OXO=Edz*2S}#;~7tn zSuk#BGJ?U{!^cDw^JJ58US$pLXfp+MO|<;iMmM-u*3^QbZpkfUV~8qP@0Ovy2rqv_ zm4|5Fjnk&hm^aU#20Ag5yuOkZ(i*uN=yArFZ)y-K7Roh2_DXXc{{=q)OHA~)%I2!F zCi!jfcU@a;8jH5Ib%{+^@mo*xXPU8+7S-1-#St;Bwq{ZF;yK8muN>I9`b*<}p z3~(vj@X5JTug9}$)?Ky1plRts79EP1A-WQ1S~)J4<+w@eja;&jpd8UQ^y9c)rSZxz?K8}vIL^nq|}RSi9z1RsD5KqbOin1pm|@32kd z=As4^Ks+p8f*#W>N%83Isk5e!XQ@24pq;cnuJmGe%yH}DCSM?%zYcEV{S0Wu7+wqD zuiBd34s4W|$?85GL*$OdH+q`u;qr^pYm)P8WM^>E@WQxAuhYW2Cwyje4J?TJ=cd(` zEx{tvC!UUPp{umeIsPg{wfFS~&!1!qRgUrF#^Z?^>lR;S7u-*l&k$sDl}tWmChE_=w~BF% zwd43PmT1!6Vuq{YCox@laE8)pb|*O2~=$X^D^ViJfcgabOF>xaG@h z#?>tIq>=Tkg!uABy~kJiZp;8Yqjax$6yF;j#mDj7xTLYZj5(C~Wol!7nPiw>h`6TA zvykU`+hm*@%Gf^w6-*M0eT7mp3*BQSiq~I#F*0IE_j{XMmy_so@h~wZ6^>c?lX^2R z>@%!4CZ4;bwzf_P7L_fm$M;-Ot-VET^lL0DH*=D@riHAG#K4^K?zIc+P_-rYccT3r zU+le9ut`Sv*aD; z$rlvwZRxNBDB&W6n~i34cN0*iMEFIEwEN_^c<6}1v2?}&;P?f?Uk$NNKx?{1<4Pt5 ze7~`zIFH41kK$M&FV{?)!)!wPUNrYP>ECgvg3ubuh3ho_j>mKL=Rg1X`6g%5ywPev zcScS5l8fgp!6ZYi$rFF^HA~7CU(8I$aKfDfe;66D_L*k-&Eoj9#0xaKG?tFcx$KRS zIC{eX8O+$={|dk)deQ$EZ|~aF){?9Z>gy0O5%Uw)*%O?NV~jxpW9-xPX;}zc@8;GB z?A>oi2O&VVIp)>~d^zC{?}z!}^E`Q}%en~R-S22`BduChSy@?GRase?S#mBzPWAWv z?u237!lQitD7Yfh1MuFz-wpe0g+8`iwo$Nwwn{Xii^Iyx z6P&Ah4mroTwI0;&kvqz4olVhM`yf;pLEyx1o&us^$(U&M<~r`ci z;^qQ&Bvfv|vJrFhT{I@`KvIj<=Wo0jErD7GS9cUCgym(F3UrKk!-5Xy?xE#5-aBfi zNS6bm3v)#`V#yJ5%B20tZLjtz{0+>?(d8AT3fCnzo7Qbhryo8pozggS6KgfLiD8Xn zUM_w0>E-guKtXSiT9tF2S(s1E#?2@L@Mp^}R_9V^_uVFxahc6JphF(6O)nPA1`pP4 zGTSZSU{cK)?-Yl+a;pvSu=&W~@wp67=R7)s2pu_l2+#C*7A}+pCP<3U%2GH-gz%%L zA1+WS&=ZIsXFUJyU@xTqw0%)7p!Dk)m_=?(3Vc2H z_WbM&`+V+mtis7FbZuPE3=16qW;zb-u-Y%$u)x>B_zV7qfgjc{YV#m|f5s%c%9VL> z{n>gp&96SA5ab2P%hd2fzW}3K+D-GBiXrT$p*V#6Cx*W;1cQhM5yBY!7RGYt7qm#x z1Xzh-(*vV@vkQMp%Ofg9kmQ!lwxf~)*vyOl#VO=dSdiH$nr`o_vcA`c5%*a%P^WPC zfla6CC)I*jtd(GjEXpYb;E}YInTl9dqE*spXJM&MOpho&B`4 zSDH_c5|q)vz9X#PScffV0&h=QF3*y@hcVAJjDficdJC=`k}DzNUSGg8+wHggJG3V$ zFY@2~1uW=xuqPc{!4Mq=&#K&Q7%%ic*&ku=j_Cm1jUoDg-XU#&bGeYq*3tLx=_7J+ z@$LWE`+9}3Q-0=K+n+!`apQV>@-UWI@gDF7Ly8&0+9nJ+D5sz%xg6h(&R|GIJO0E- z(AP-p2Tws;alTRQhblk7YM!542wD3QSmZ>@eshaC^!k1Rar6vUU-7((+PK^63yuNU z)#==T>R{hbdPzoQLT2rX!>~{1OIwY#x zXW`aRF6UD4ol?XFy@q_EXB!t1pxX_&axA$k!eAmhkVdvJu0(CCTCR!14D^_ux=p7okXvlIfdW%2mI<;v#*JN&A1f;y!QhCb z0PV$`O-G<_O>b2lv*P$I^;%dD4d9e{NEbPuZ)(O@nH~>}y8_VR zdA{C3uabui^7iIBTORZ0jdpksooA4_Azz6rBgpvR`3LipjUgZ4;6vgJOg%42@^8OJ z1+(CDuZkHgQ7|>9Pb$j|RiQJv{%}W+1=e2l`|vsB)7ZcvxiPY#ciCC1USQq z;{rB7JaVR^4`pNs%yf$7>#g(g#hD2tu4h@QA{oE96OH-NuH`#BDp@<^2p+ODEmA0nV;&S$QOplB|7)0eBR6m-xQ$~*y5#Koa&#`C2jT==Al7gUwv z)1GFpgR8AfbFp8m@F=^MYoB}y(~2lw3bF`C7=x^Me+RlG zJy-5XWnBl#k_kPNa$-KCJdTRt!{;O@aRJK*K1j=#xPkFKRL2E%1O&gDu^npQX_sq( z#jeffgJgVXd1ZKWKEtw6&I&6QB@fS2WrD$Zs(j--Rla$i${+vvpBe!t>IFHjtM;Nr z;pcyLz9+^bbC6T}XPCA79{vC-&C%5!RCFOlszW|b7g38zZI@~3@+ zey>m|cT2ed2+xQ6NzK?l9Cr5y$j2EUY6Vy((&V(TkMHaK8Q*>^={aO&3VPABfF5SW z5>}F;x5Jw;JN)BlGa?@xt8&xE-}uH;?3ELS zytw#h{^l`VNDI$w&z$$Sya!6Rr{F=9Ifc)F2i6DC@5vgc2nVA?T_~I7D|2ZTx*8lV9`UFr zkXY=nO6fFy6?;JG`0}2WbWJH=_dchH4hW3d`W|+NY*l)e+8EabC@SF5%auvEqm=Jq zT1fduDq#Ox$2YORP%Gq6nNtRvocL<`IGTs!H2+3aH1(_;vXKR!=?mgKuxAB%@QipSU(SCvp1{C~u>e%SmSH27+7E=e zvG#a*U4BGHpAp2|5(%4VvPSnj& z4#pxJU~L_J4-h)bt1s$sXWL8Vspu*du5UNb7equA#h?gJJLgvi@D`FCqW*|dy^A); z$OVFO1Oy<|p9q@-0!6QU^jrS&4<%9kgg7jek)?&O>E%(#M)%@^;xod;NSILeSrVX( zXiE0k*tTVj(IR5J3UgO-x)`v^@6Lu8vC8i<+dsDa%7z-k)&oP+XTYa|11SdHWMBMz zJ04g5;dVR>ueKe5l^)ZHXuqz|k1T|88k7he4{ilO!*8Y1K-ox}y`TAjakHatHk7>Xk$+r&o<^+RuD%^+homPC7 z@ievkEPOl-z=Qlet+4TRFwhd^6Q4XZgU+$DC{rnnz;#ruF*1!V(O3^k(+`hRtygVxn#a%^KbbgB5c{SsHx zm4>)maFAhhpm&omJ@2}^zPUy~WL;;BMD2~;?PJakLM{7Mow8(E6rThgx=P>nM*GbP z3wHRmy0OZy_VPx1nLnyf=r5!jN3`Pxf$zArhVmdrKz>9$b>Ov~58zo>Fh3u2n>cOj zOoE}38UFLGwd0YE7}h-s$aZ)4rwYRA9eNQl;RMe>R$q#IqX-1m3RnHGNvZE8^wXsn z^FjRS^V|l9(QxT~L`!y{-)DR=dM(0M>JcTCkUTbngTnECSBkdD`~58$zgt_fdJS>1 zr#bRAU^@g;^)N3%{FAc{9;`zvFVG0AL5PgyC^}j=(V|?q-Dwg)b%rQTt`Q9ZIvgmt zp@-;i4T{%;y&)^dz~qEpiq{Dr!$KN<_z9Mh7d+1i4nSN+4r7S(L2MBDwSBY;JrEV}S66g|vIeP`e+cvR*FcyusmrhP&mpG%DCBE? zg;K2kjo4(k2C@FRL>uwFMI}9(WxiKtXR`e?7c@iwdXL z)By3FI{_#zdov-}dpm?&n=HZm7xy2#S7-a!K(g8{LsK9M`xqJPYCdqwW!PlWnArxN z(?*wbQcIi^xb$_ezQ0F&^&MufLL5REKpX-Xe~!Kv3p^!M=U0uk+dw?f8M{PKPov6R zBFF_i?PytN=6NCrARHf78%zWHut!+40oPCtX3(%t=-Ihpuz#TD1TsH10c zZb2>egPLD|w#?Xe{>>j9B-od}>3jgj-Dm&r{{q=sfBC=oSNA*rLUbzdqfDUnb>(25 z@{JzRYbx+U@RJFqe5GX5L=JyDD9bHtu)UNmnWqLzNQI2(4B4pT>kHFz ztK`Gz2O=OXj(4e2oq(3=iKAoTLbu^(2Pr zX;t#$CWcb}PMUwHfp#!|=>EtZu0TThFm4UjR5$kz`G#*KTo9gRUAs_mo%2xQ&v0Pg zj@S|g__S36WPcW?6+DL+Q)s@VK~haa9(jJwch~T*@n;_U6H$LAjnZeD%JCW6`b`Z} zulv)UEOOMOpUV(D!14(5GMr_}z9Yax+gUt3tK1m$y+l%$EXjmFVw$%HNVoUmw=d5} zl*Tnd6vM#D>9ud0HGe*2*z?2j?IrkyUK=3c`5Cok&`d`!D(d5qZ-*vjE=TQ2wnv6!(~f9d@yX+sa;ineo)lQlgnaW(?o<&KZRQNbKA_SEKJ|6K%} ziQB>N$Jhc{EAhOUKLT$oR@kHBb}I$~LqBP#n*xk^iW7aAoKcSZa@$D~?JWl2A^aqr zeGj8GrfRy-0DPVH9P@|t1XHGi_s2X}O52~NC)uT5SUBwe}-;yNSzFgw~JW*fo8pOaDLE*O~?8(wSFoFc&; zI6RJV#AGgozM#+fq1p!-NovN4!DM_xzlv3nO5kCOWb~W_SytzE0GYkK);On#_6`So zyVzw|?6Eq?Y_-Gzloh4v@)+gIsaXV$&U?J32I2s3H#!^L$@W1WE*bbvEWP9`_}^SA zhMk_wmuDD_5=JWtug5h_3d7>#igPv$#$v(Q%4wJs%u#N&8306lgK^(X7~26JPO{X% zE$vop>R>CX2iV^KNrSW*QS$*mInjK`(WbUFpvU=Vl!O{oX*n7)RLa!jmC(6NUf+7j zU0PMlE8SuF9pcfAbbE_dr2N%2`!*7Wr~8E{KIe6j!+W~=t0b^lYyS@&i~08*++Rry zL`dW}Be6r5p=J|r%qN}<&+9XJzfB4+r@G*`%nLt!Z7#H3rg zE}^GZkCE9(GPEz4;VqcGCdc&?9)jlNm;zVoHTl$Sv$3myJ-ZA)h?OFsCdVgoyoDGD z&cd#A13n2Bvh4yQP)bp%VK^S{LsSGdeALLBQx7)JToRpso8C{O1*+%y0lQq{y+>O^ z>5U_P*2#Ol<*E@*9M4faN2)$@28?(L0R^n_#+W9r9WR|uL3Da@fNd4 zZ%R?Lz;|dH`JErey`*9@SmhQ8o`#1u4cr%c5yLzf5{CxJI>C7`c?min-C)|{UdA^7 zApF4?-qT=sru)5tahZa}H^WyZQ3oOJ-G9Igb5CCr3c4$S+)3O#Dd)8`7GWHX^T4;+C zT_m^)U#0<3_^jL~cmQOTGQiK$r(qMyS14lTHGK*QR`Of_Z}0aGHaC7@teRi6bCUEa zrCa2W<4WbAXH1`3T=FrZ3HyK_mXio4VW{MM@JsJ)zxUhlXy+HD;4cULVgKM=f770I z{>7Oj1ySARbM^&$LXM`p3am(z85m+;V#I>_hX=>~-J1T0=?}ICCZ-x<2kRvSN{Bzx z+2O@Hnu2zRawvh=7!sfdDpow@A#YMv%HIGE?8)Jkqu1B!RD;?JLQh7uC@^%6Si}c0 zbmfcm=eCB^5le_X4hmH!i*{5jc)TatSxGnqm3%p)im0Lep>dtmNcCYGQsUuoXAB?Z zdYu{KN9A3f;y0^}EAi8EH`KfYtq#vYns{qYlr+p*w4bw2A+qt{9A0U{$O*j2wad*A zll+g?p%MRN-y<`&w8Uc3E-pf_1!qZGN%VL5@qnw4gkEKf?eZv^+v8F$+L$hHSPch84uMiBknDTq$=iFumS&T<|OhkA;G^vxW(}mEM2;! z{_=bJ_gb1*`!(s`V2aJ8h^570xH5^MtfB8uibskf$ z{kU?%Ql;u}S)H&9M>@R%`qUT;(M*7dD~ zz~ybN(c>-7--BJ8eVJf+>^LP{^>JDc14+4e)4s{}S(en1W&1 zGAh2D-^y)%+;b>^_A=g^D^K0~Xs^rL>Npj&8+nij^Zt6#XtT?bZt%WRTE{76sxwI$ zo)(5MycYUCs}Iz}ZW^j#(Ul?~p5BR0ykL(g-o3G#q%EEGMHt4c*N-WdL;Lkwf@(jL zk3${5jmI~tt}(tse^AGY?w@Hwo&ztSgOy+E+L^we(#~i{x4*sj2B$Tc({V;-$4@3e zEXx|`d$rp6MB^>d1?}!DLfiMh0WSgkc)SANmB+R5^c=>#2+~dOWz4IjoeTr)1IV^8 z&%h+2ShYKiLM8cM<_3imxgF=*r|}SoGlQ+*VZE4}!icK-u)p&<@jl3JdG;`#bAHMo z%Y%V`m~R^3=X~)K@V);_@aNDG+%(F}j9r)wdG2o3u$dPVhq%?LhP0KzfIqVC?YM!;I(j`sTaF z*^>1tzITy2WRP_#aqgl5=`z(DnbEQc{aCzY-AeLL%geSFT*rtv6j!%Y`{QnHniwu^ z^>Cu4I5MBFS6{io0H@b_D*E$Ml5VrFlhNN{JEY{Q-G4yWGm&&DbbyGovvdUCB{0F}IqSIk>&)E}w5 zPiFdDAB4a#_PIcw{laLVCeD-0GcFbm_x845@BLo%w)@@PV?I6Md@Gwv(cMRP9>kj@ zbnLTmi4A9o69mVAEliL-VTj3TX1Pgdn3ID9mhASrjvU|#U)w@1vZryX$Z=Q;#rFIN zc48{lMm}BvpU7z*!~h&sWBHbM!uNV;k*D*%Xjl)zD4XdK4&}25C!{-njnqUhY|h(@ zYqdfI@~a{})*-D7>9Gz?kAk)e5=N7ld~)wPThbkR;SidYG9mT&5W&<}s)^_*Hy48u zE_fMCNKdFbP`7hkBTOt#^XrQOhC(>$Wb_Q(Qs|Z?fkjZ<7(%RsQP)|-lR0^QB_?F0 zFqTf}a{N2RDKefL^hOIqWwRy~$(-0PB4m+<1}a1^K9(yhXuDNHJJvS0*Xu``pvgP| zpdb-_65Af$>(c%6L;$xvxs~Y zQ+7I`{Y=2*xI9Q?Wk`g2s!2iMhVs5@ktb@`z06MAg1d_EDM37*Lb*0Du1gepzm8z+ zt%9#l_br@*`h@{uGL~UGWesEhMtV+}Ws*RdX8)hfL#*ckHd!c($e}(3e zo@#!EWA(H9)4N46UjG2nQ>{AKLv%cd(zXafwEZWJS!6{!!iFGtZ_4#T8j&k1DzSvC zkv00XS=EK{B`gqNSt!P)hG5iW2d8u#mAtMnYS_q$2TiO5{LYJBsp8^+l3CRy0_&XI zn3P!C@v;ki%I7R91c}XcQlh!NzIHa^qXJ3=p*b}?gTb3lGen!yYLlf~`Me})8k+&T zM@Cte#_KDaacPFa)eve4S>NV3FH1mN45*}#thjC`h{L&v-$3@NSf#;~*pE*`5_pty z2X#?aZ#h%Ba=?lFe5&_qiUAd7*l@EZGU1ckn}zqud6$$A^M!5=v1+Q3m#F5IU}}ZAV)XUkIf*`gt4$KPKZWHH&q^{?qGRH#jHI>o!MD7!Pf+j9tia8$a9Utuu4v%q_ z>fyl@g+fpXJP!kZ(P>m<=34A-? zpM#)VWj}EnQ*8m&T5Nj_iZp3Z{5_6W0)JNgH!Xx%Qk1=cl@EqJ=+NH%t=yNFyl1_$ zwYvr{Yxj=qY&ft=ttZDqxC!d^`q$QOCkpsU7e&n8T;r;dbMk&xh1vr}WWK5C9|?h+ zb`HoD#emGt#M?hBexCmk_<8?D3~IYCzE%XA`mZ6(U%7a49#Y>y;n=12HST?$I!~cG zZjh7={8ckQ=me2~w{<|etu+G#k>_@JTM3P*v{(yuB_KKBFwP?HLRJl6g16O&aJ<*% zup6^Ytsen5Axv{XN$q&Ng8zkCGQtR-sx_WhB3cjRb(Qq%+LQN{7^s&f(O8K$aasma zxdvvrY9UoUow%h@Le)=e@%`NJ8oIfJ)RCHWK&EO=GyjLK+i6zs6;bKfMrdlk#A*|{ zDZAgAvuuJ4YmlWA6JUPtHTI9N+2Oq9Tl}QhB)26dOTp$({RWkZV`gKxQW!nCKnoTM zxlrP?X%@46ThW4iX86%k8D5M5Pd0JqX!~%0*cyj#VJ0jXY?@OZ)%eJ6T%O98_QK(q z>u&GU`1CW$K(LgHW+MmUf2kW?W^1|13*#Mtp7upmtv>ts?AtjDbo(-54{>7|tUfd} z2BcQM_e=M6-#yU%JkAntL_{_~ICs!>pw;hGxScWQ9)Dg+rO64D1F6bu4e z6!1$mpVTzKc@b9c2@aYW-(IT1Ftf{6Xm$#VF%9RByX|?>MIUOSqVtWF*E*n*CaOt! zC_2Sb&*8vkx&{a+H7_v^DP-A}qh6e^<}-S!x*}{>kPls!oFZ_D6$@MMkB@NB+ubZ3 zlx=kf+X^UyBd%P@p3^+MnDY_v#n=cJf&roZ?r^B}$hn#0ha@>KiwC8e3H8XiaNRjD z?V7xN-8nGN%iyzy3niecUEqL4ga;l2(Q6)Xd2Y5d{y3ta84~=w%+F(0O+yJ}x*d@m zSvzRJ9bD2BHmo=$Z4c^E0&`^I;=7My-^kcecx#C5jD($(flGog+U*hsu^b?4AsnE6 zTVIpVHKUxF#38cq-0;nS=_Hl_g@bnMdoNXeukDc|Rj_rq(E|etW5Lx` z*q~#szvOiqUayO#c6jEm%NKT5t^@t4a`9SF_?PE+P_IdxESOeH;}_tba9khG^p1V= zUU5Flz2f**{p(pPL}%hld_sUGeQbr;DfS$~r`U56=0sA`I44Zl#fdn-L+BDd;FCr# z;j>06D>PIYo`bkAx-N_VqQR!bH`e16*maG;j-2)z>Oek6Tlf3}eqi(_xfbOe1wd$# zQ(vk)cmBjdh0mOKKsZgS*2Ao3cYpy_|MA_gfz|wCm_A#6+PA_5ImA^fm+})@$v5Pk z?)9j6zQ#CY1~|=UVlh;h9%n4p?)m5sT$`Z;?}7MXg~Mx#3+6R@zH0n0&!OL*FN^b) zXOSoO-HCCzRK4aAtel$jb}%3F(WAW@zsvKL_4vCsEF!aGb?ED&=%| z-TJsjA-Ctt;~0h4;fLpIj#s2vJ>RrAM9k^!pcrIVMTWZ4ALa2PjPkWHD2aVYsz z$J-0>juXHEPu`y4Mu-x{3i?!yTP(R#Jdv#-PI2CzNXf4-Iz7Y@A*Kw2l5Sv`U z6BW55R19U(R(U>y#Auh;BSF(=YG2Rm{k0$U2DU5m9NKW_ClGm(#^rPaB`1&P3-!WI z7CRkr6%x_tL?felK1it=NoPW3>4G}Uo4Y*Eem!4+2fMtR5)P6t%vTU_Ztrh+*n}Ht zCv+Z2TVfCR8vkrkT@m4XW`ve_F;nWrzKZr1h9%Zp zI<8Z=FG-Z19Crj-K`yt4T-+IK?!Dh_+#7_Psyc7n8H9Wj2F{6BL_M%~-uuIyTsM3ZK%|d#e1P)s#Pp}1q73Sr=UjhbFIUg3> z@ZDdX~tQ6rcH!GL9C@dF4<4sonwBfN9mT?6cCItykI8>j0V z+zPID?~agw5N{bURJD&|4xDhp`KtmC_RZ1jS#=pJ-1fr1gtjTtG;VQOUja`igd;^| z$iO|hvt80&nP4HwTdQ$w3O7zObO9XPvW4?nB+0!-A0w#;yj}lFN>XTM4n}3hkqTFk;ovUIxl4RH}uzp|^>Ebx9nK z!271WM*sOf!goG4yej9V0TxN*>S`}EgFXkSd2VZo-4cNbU-pJdKW${#7FO7|HTSpc zdrWXJK*Z&@W|^+7!}SqnwO-vU_&&Nm0-vEBG(||1 zP8uTsbeCAUw;}-AQN3v*UAqQ zETsOYyl+tS`xx{-Fy;w53igQ2LMVCJqBG?sem3a8>kV_9ir2`)Oe-oKLN-Xo4c z|C$529e?DCA1?ZY00#XUNA)L~VCo?uYtqg}dsQFC-IiGkQHFqMEdC%cpoEv?DOKwe zT$_h}iGewkovb_r1~`B)?xveAJr{SJ3Cr zOq4o29uFn1=j@rTT^dV~+l(Ya|Mf*NNjuskrwqEa;?wvWEKoj*0Cwy02zVh4j2YG` z-{8=~M#e9~)zwrO>kAsWq{QqMhkBjDJ6%M~OB>pu(|!FPv_9gI6lC>~vEp%iZ0S6p zW&a!hx_fs5C5oS_^&J(-ONs!TR485--@Yy8|6~6{-2z1zHB6&Rh=tVDgF&3%2NCBC zH$z-`qyY})vvH6wOJKsbMuS>$9$_W<=;y#zsoE!q08Zk2Q1MEOGd3N^fYg7u)Me;$ ztEK1hu!rE);J6u~Sm;Si0x^4M8CEQ>>002f{yrh5aQ*BSd(ptJ2A4BE0NYIXAXNCN zrufWIEXCvM`YZRtf&&icq~}j*M}=QO|EoG7*d_AfXL7#mR6@(mj3UP)ybTtbjdW?Q zC#O<9ebfn}nd%MnnNqA7pOjjy7Gg#Vy(SZt8z5gu90hx9E$QMtS(-rLJO1+N^gNF% z%=b&TXOqts@c7l~)7#Nkizj@0dFOGEUr8;NKAw1T>y;_?zxvGgbp9K&B0ll_-gD*lDUxJq0 z30uMS9Zte9J7ROKw#L>3d>xFx;4fvQ;x!@;e+H8BfH3IRExe!gncQc~hNO*ITz|HX zbqTJS&)RGJvHEOPu4!m5Gg#aU)7;Q*DL9sR3<%7k9x!e05ECJ$H3^3hnuU-@A{0X5 zfMaMqx~@Qxfj!iGBLl5sCxqy1IdEYWjY{I+F!&|9&4OTXlV08efeN|b1;H;bzG#FF z__09dR)JMoNJ>34f6!E6INWUUA3w_*6g6?7ggoJVPM+K0xueg0Pgv3CP@tYqjIX|k z6OHs~DIcs`pm3qpB~SEKQ^}$3YQ$RmA?I3#FR$AWOYB@`BKJ@68(e(S66BgEUtk=-~O01j;=QZ)K(m61% zvLQlvPvK$f?pEO(k3v9+e>Gl;X^(_E%vFmW8S-~(GPYyJkZ%gycK?z2mt%g?i5`)v z<06*46@`+LIwZ;HwU&sk5X2sT31N+JUpH@9*0y4^5)Hpj80F#=y2deF=+GaM539Rn zJ=J*>&@RuvjbST~D=?(mkOe<{iH%?)91Of!V8v|p@Cr(D(#6^Mk=rxKSmsytl$s=q z4{?2i4s0w3o`mll3>TbMh|$2uB`@7UL&$VJEe)RP$GlinVY;5& zpWlhlC!1eIL7mNE)sLZuR>}M=ea@bCPW6pEC0?7ClhT|!)$way{6DI;u^bCWY9BPA zdJq%84o40L?nyY%ZEY%`M11+p10qNM33D$4X z$(uP}tBWn*C2kv0MLjSADuC*07l~3v-dBBj3RI@s5EsLc6zs;|^u*vlVjB{ywUL5% z(%zh&%q~k^k}Xqdl2qp3LjxA)q$&Q(<`72zB3F&N8DX;mC2CGf{;kxdUvOcuiPzR} zr9v~jsF3L)(uH(X+}zyULc0t@LhfYcC=?IPpbRzlgUuFW@Y!JZu>a3^PA15KD{-}Gs_!0f;XlIUb-F zxcJt3IN!SLKc&7NCW}+z5$h@tL^C7{_dG*S9fplm{rfi$ybsG(tG@hiv3!A#?EkWT z>O*_KAm?ZMJnZIV!`iUNVt19nQBcFf}7);lhVnmtx5 zNH?oky_l8b`oI$6j}LyxcBPQQpqszHGX42j7VJ{oNj*4Eh~^7Q3`arv1p4n&ZlQw| z>|KLvx)yLCu7OiYlBe9{;t``vr!xMAVE|*0K~j*g7Uy?3V4x{1Dl>ZN)j_KB5uM@H zSb`5CVr||iCxFr|D`rOnLXSo_?K$3LC?OljMQM4BvV-`OssgRPlBE&jM80e4*NOc~ z{nQ1E4eYPm8#qhjJ$mcym$=I|>mhFpAg0yn5~0E{6gU)!#Rvh*Gu#DC!2=x}Zr(Gm z8L?lHFeG0`Fwu7@0hN8ld^YA34Fv#NMtnpgnPNgpP}8sES3ynNcgxvNgV;)g7UzG@ z))8IfNRTAI9xgFIOuqB{^S_%InC#o7jc zl-5y3pnUERL0km*?%UVJ!ne-)(zlhhrPtRd7#2&t>yz7&9r?0b2QM=#zV%-jJNP&3!g^rLH{cO%H>#;CHbi>U2doL_~ZD-DwVEPG~(X8 zd>>lrVp+KhE%MKla_bqvLOB_)a6sTiX0}{bJwC8T$oUC^#XOWz_NOsb7`G(f*6i?acD?~H@ja1>keiHQ81m~xvve| zk>?k-gMO0xAqk2WGNU(Wcp>4?DM3B8i0C|uEhe8_@#E(3^bg@RhB~^8G-lucj?TwW zXs->X&XO>t6Gz5j^+Z$8Fh%XBR%JET4Hzs?ZAdh`9DtS}=`f_~t5te#@g#yHy3P)Q zN;rY^ut9{vX|_C=6_moMvmBTWf*-B2MO`~qhyR6L-9i{n_TusboJYCiMfbV1EPX+~ z+088rSdg81K?6<}R03B^Qh)SS=Bxw*&Q$FUQOX4%M%T_pu-J1G$EU^02Jc|JMFh2M zv~p3=^(%oba?Ha5d6buB#ZzHnO1E?!n|4$;~j_&GuNUr1h)$G{B< zeDXA=u4vB^HzKwD&@^3SJ)rHOo=9hYF-LX-UC|?-Ersyua!*`lZePkVH|!()zgef_ zQqofdcEVB|a;arpw2N=bUoxLh{GCM-7{RTP7o5Sc5X%bfp<$zOht-sKZu8TChDt~g z8*qUz8EgZe%}}nA9e%S9v{zL@Tw8g;=n`aZu}+0HPE&N2?R;C(CA10NBf%g}s2Czr znh1T#Wp6(1OtiQrpNI)koXP{*4o*?UD=Uew72zC;IIwVfPc^$0<0 zec_Sy-lTQDr+gf$#$&@`&gj$WW-k~(sr)Ar;>IQxJIcs?oCl`+YwQZb023|JE*=6{ZcqWOLp4HP{bA$p)jui2ic+wY8c|p9F>OB8*d<->5j`?}- zM~ODWM_#xplSub=C4+n!gIAW46aHDGE%RJB*y?OIg< zutYpE&4?r3tB-e|G=Ev~7?>UTqy0AYPzcG2X+T04g{#q7m0sNd-y$9`U_)E8G#x_K z%Si~69k=FT3-Z1oRybcMhBVe??{u78~R@}bVH5Zr_PMlOCtd1`4yL0pdC@pCqH>A8xS z&CS9(^iqrC5iS~3!{e~~6nj{%>D+Cd71|@V55g_lAMURt-Ukd7Ocheqt;P|r<@DAa zXM#i}z7Cg-l?Ii*4B*$_F#$k9a3=0F@m@>QZ!!ifaaKhx8KE;}5dlP~UU@Cqon1@j z;t$Tx6W5q<<2E*INiuKQY`Q6%_lsNDRMC=*;1_a(i3x6H8aYz7u9$8X<|R-{nxD1; zF+W!t54cJCqx=mf$+4az_(61U^EF#b(|c-HFca3zlCbaJe66-PP+j2IfyPp8J$68l zKaHTfz=RH7bXG-5L4Sapc9*4lE}26{wDm9MPt#aNE=X9voL}9*qeFK4HNC#v?5Lys zVqtrKqWl~gA5KV({Ly$5g|J(zmJu)ne#$9}^Fk7*Sk2r;^zsh&>8@4loK-3>FBSc-E0BPL)pYVIIhJm`u<5x%mxF`z4- z^?+H}4t}*)i%6677}eq5LmrWn5(9gAF8`5Rn6kw8?{RmJeP|Bg*9NNG2Dzz2qjcA9 z=D*e$Z1Dj7U*-v7?CDJ;^p(%;uzCkQID;VQv14Q3cCCH7zpBXdQ?9!!$@3gAVWf8! zr>xX{B|Gb#X<*FtdvEt@C=t`AQ=(UBg>S9igP#6)Z{M4i{(e_~99Y7EJ?p%t%M^X& zOZ)S&xVzER0n0Jn5xH5B`)V$}i;Jt4Pr}QW08BWF?KR{RYQ`qmY>u&|5`=92vl^uE ze~QrcX?$^0f<P7x2O8!t9`q{)K`lq zcxwr_;aT4VyAT&YR1E{Yj+}ld;m#@a{;4bC;Gc^>(E^b}%6_V7`RC&A^1==W{`?P} zsjwMUDH1T4LiSze3iK8~;1NLQVsXeU-s;g4H8aS_e7YU&mGX@~ppS|JS}2(E*WrqM z`5yVTS8sr(Y`AgCDYg&g{42y`6BSYWcWO>xQVKn}X@2}-T9C(i5ZB}Pm>-(zk&v3+ z{-V%(_fS#R-lQE?m$yTgS-@|~UxI(INo4RrLxnDmJGc>XGH3~+Q9gyP-g^}Lsg*g! zam0mN)nm1!eZ1;gaL1A!P;rR1Ri6OsD3H~56AcjLBFO;4>A-S+a>RmHc6g4;DcxS( z^OhRT3_dCO(-?Dbw;~-RYRIMe5Y`rU>v3Svrmac7qZ|aeku$f{g~wGqFE3LQzynId zAgNzWBg(bfyr2i03oNK-_`)u;4|Dj35gQ%L9Km=_p7@O5xui#BJpTPpdr~_F-m8E7 zqxcgt+>hnVm-%4=ptv=XI!H!B67ELWieljs(JRgo_K`bRa5{z~_XfDrsEV*QcQxL*0n8J6_`E4cm&rs^2CNvmWgHA6Tt^R!(UDx@Yxs!T&BZe)ed(cib#LK!N4!HQp`88($Gce-c=goQwH1zddun$Aeui!yvnZ6yA0TmmgUu5P1GwVNt=n*Oe;IpkaxsdT)tl7n z)i6IkWqi~Q(dY+p0R9RblY#)396-YguHY3^g72nXDj}^~AYxD4nhcx8KW`Km&4bC^ z*K^GXmAB-nzzHFo{XAdv8U_&6gUTG^>+Z9N+3}WBxqQ$l8Arf$>wN(&zXV5Qd;z#Q zV%STwpGnh5TFEO1yD62>BWLIvfF(8g;NY!%B{QWOgvt^4UOzUy7u?|Bo-L~$(|dxS zuY~FA3RLo8KvS_oVxF7QpPQhbCd?uKjQb$G*#ZnoLp5zD4{d=qI7| zk%OcF#I1~M;SNz#Fn?zY24)CZC`wym?1{+@AY0{#R(6X?;}#6r;4g3eaG;n$-5ltE zofW2Z4C}fgCPG2)F~W!#fnybri4d(JBf}#}l-LPHSL)3QGd+mY6H9Zh3;{_69vTIG zm*Z7HV-_smXQ)aLP5r1@MtckECTz2*A`<-`osToaglT;Mv~7B|~zLYy!$<+Fp$f4`D$fqE*3jY zJ3L!2<9rJd$cd06;LnbLKRW{c>f}XEnLgadg!02j+K#)PeIB&UFqoQ9?vV5P&jG2Q$B~Y%r;{8rTGzpE(ViLfdMbX zy_OW>$d5fcdtqKbfiM}f;AATf5lki7GfHL8=(6k?Oqo5SYqDpIitHI(l0BnKvS)M& zp8Iz5L}(csUP>1-aXT9Lw>u1sC&cPVH?dr~14+g_-JzA!mEGBW%#Uu0C>i)9U4c~7 z1qhZ(_C^Xv_`N25HASEBgP~=tU78^9Acw@xM2Z|e-&!QxngVXJ7hfr6X?ofc-6TVC zB!R5ytqFq*N=1-u&urtU2I|aU%0b}4aMtg6r~`FMu>})xn6j%(WS%FrQfykT&HE*w z*hVQkp(37W=kRkb1I*!Vu>YZsyClJ_b9*1b>pwC;V%k9F@;zT^8sEIT58 zc(09R1H#S-Lb=NA*cZtbw{-pt{m6tz9njwd{RwRzpoMpRiR=pqGu2a3nWGB9P)y7b zL_-Gb{_!6rm0#hSGxkcZ&vU(-!h;F#r{eSY`)uH_zg4A=f^A__EY=qG==*b3ra?zX z^`dF3g)hHhp2K{!{B3LNKQJ+d7{8m#xD{wiVmgCIKO@-L)srIl6O`JF?l`BN?zw|p ztiZ!t@s$LMbhhZn*8U%(SD=_6)L%=3DIn@RiwCQ+LKoht$*-`%=j;7dEEq zFTdX#V49T3qC+^%o7MvO;Jg$n?{mLy4wROXUvNBtsVCsgCFEfI0q4ZxE|urU?RAnr znlZFQLr@Dm&%8O^!qax4i~ zdG8y3zQhOT?f@7y@J=92kD2E{sE_PanH;kDn&$^H(KkAqqMq2^6O9PRTM!0IdmIVv z#pd=7@2+paNMfZ*Gi^Z^dKN5^V(SS5nd@8nO&~4{MUGuqU?;;f1d=(B_(UgHwjFBW z@Bs0O!P zFF%1qDf7D|9_{w_4i5Ug!|vZ~uha*<4l9!Neb_rh72DT9 zW{6f&KMAf`l9NR#?R*p&Gvyy~UdK8RJhI3`UJl2@G{hCIP)kWr1*?(RtRYT-R3g@N z6`V=x69A2S~>#3&YSWmKKtPVNxHEny#X z_6+qTy_E04SX&VBqb+KE{xotI8ufX@0Wz zVTjN<;GNOc=;AxVHQ_Mp{Nu+lW(xhhA89x@>XK>sL7@YubQYcntGDHYUoj4sESZr3 z5w#w})2(fcJ0WKq-$1I89qRt*7Akk0Qb0L$>Lt*P`?`T9=-G)lR%MR{1&4aI;8-`*$0?Lr*h zbG?L6bihcqer7mfK3Tr_SSlA^L^)s9N^lkSedt69aRxTyZM^qlpPr66Il-sdU6^3z zw9mN4V+{_iuxG(qetSccew?XH^Z1t=asWdNConZhBq>B6zY*Nv%m0F!XMAt<@M~^> z8BRioVxYkdg$vEC#RtTU1ma@$lnl5?{!ATr+Y`)tosEv_&cYT^Y?IkP8iYj1-WuMY zOf7Z?z3jD*ZVTIu62qfv^9Bh}@`RlZt+^^>^%I&djXWkwpX6=d3p*>!%(jI$J zYL916@zVB${C+zchA;0utEOk|bby9uH-BC!J+GFYJ6%1M@pi71o>xoHoi4`&KU&{P z>3OyE+}SVTQ+i%4J$Lp?_>`VkOV6GC5L4Cl$d;+F%a!81dV9Z39*yWLh z9+RIt5%0$;y;tDwrVCW(ImyhxZyHpd#MfpiBFi;!4$CMPb}B=vtN&4{$LjtIp1r|0wf zeYVNw`9$O?iX*vjTegVjvUs7gi}TN8Ou?Y0XbPc3#oA02;Y7k9V0!cc*i=v6SkCs8 zJ%rk-4>CTAbXUoUJ9%j?F4m!-7~5O_-s`WQA9F0cuSxP)Z|Fzm@PyoPnhS~U_L$)H z|8senJaHgx9U$!|!ARn*-pkHQ%+6dXn5NI$xR1s=mI5yiE)nQNt~}H6;pI8Ads+T& zE++AmL}k-{)?R=1@+Co>jJa-#W*MAwe}kBC8WC$B7n_WWm()*Oa&yml$LCEi&naGv z)G;V$10f?Pu3sVi6CkmffCK$M$Z{!yjE%FpdM&rtNYniugARi-ck@nXK!V6OL_Sr`In$nGG z@8*usV{Fsr-jE^>FWdcM-Y`52o}9z$Q*IA3B1`4~%{#-eLVs7<$vXu|J8QA}N5po< zUX%uaHL!I}yH7p5-lcNCTQSTGQ(-bLc*ewQ;tA9oN|t^h2Kq(X<1R zZ6eul!z}uuBeHU-~i|LtPr4e}~ z>#!ND;5#)_22Sa3#G8g|ggZ5J04^w4C(H(SYUUiSF~Mwbr)Cat4>3g%XKb09m09BM zg4$HvxH2c8}XFZ-}ly0ZUWfg1KG)`3oycJ^UHrI;v^=ronxM`F=QrJt$99aB2<|axyj|loPaE-)uk}+t82I`s>N8 zgUb1?5&67utPST{@MkNr&GRzbz!-*tkLm*6uh!v^~EPmy*OJX7!swk$k?q(pnB{;RDgZ~o)qq$G9R6PUI1OlFWO ztCsk5@@HYvS?HL8U9jadp<@-WGv$o*tA(GmmHiNhkk9-&oz^ZN*@QCN#9E@mzp9cz zi6;D$733$duJC7$_hW$vY|ZW&QphFOZHGF8;3IStla*Nt#|jVb?Y1c2$D?CKFN5vn zpXL|!at-Gv%4eGz%V;OHg%N9qMFhMsE%*is+Dh*5PjEiLkbBT6)Yc&QKLG#rb`}19 zE)5FSc5|7;h?xa0#K;X7>s$ay;AZ^6ZTFw%ZM8+_S>R(2YbEAd3EaxEpd^$0ulKLfFd{^7I`h0Rf zofx%F%tS8q9}hseFDiMTaA+b@166#8cHpBD`jfrk;c@?6fA_E`IL{CFHvLha4~K`{ zo&Dp3{;+?@_gmegZ7;y*_nUif^sSZe53};aUO#&t?7r)6<0OI~mKXmUdD7>@^Gg^x zk1lT{t^WlETJ{!xR`Ntk_qo=_zxETy*>dOX6>OW&p3N_>Aq4e&yYsBwLF_{!i_al# zc%0LWMUaN>59(Q*U5eEqL-{}v z-1d`sZvgZdP$e_)E;q2y4_`vXr8oVZXy|DW9|3b8f@OHTm=TZ8PvP;R7LN=TT@$69 z;XLuv2p$Z66#}n7hhGafdw#)`QeqKD%T{s|H`1P8Oo~OmAv4*VZ3*p8m&f3Jq3 z6DPi5y5a#zlM8WtMK)>iy}Ih0T68+kpzXIdcA&P$9+o<*N7Ai>gZhMSLs)%5^@~7Z zxM>V5McRVNZf+2yjLL2t5byxu%lO}Pr#!cqeRS+%Gktq~>Gbd5d_DQ7B5j6p?YeTf zra?|4g%=z>QPmheT?wOjipxS}{P0MEY-3rUf<$~4moHKCU7teLjJx4IqM=ZhQIB5{GH(xAl-Z%e6@FZgy z$vFrvzGrkAj1e$4?l{&O6kX^g^(_O{NF;g*YDRsU#c<++)Y~3#QG#INu|C0Ef5*`+ zuUEdrrNWq%c=Ks$;icE4x6prdx4jk9mm?fCfQ?S>0TS$T4Fne#=N820>{nbxLikmCZM5hg)^ zf=ibik|Fc$_5H_B_y+0{^%Mr&aJe+9K>vs}aSGmzNYBs9aBQ(P{53zXi!11Ws~Rz0 zKEW5je1sN$y+MN+qcS=TP1N6ye1}`${#ki1#KB#xb8{gAkzB`^caPkKc;{h>$njVQ zJWMO-gMp0E>hqk$C?fe_)h?_On1O2>Z;J7p@JI8XREb*L*RP1Md52b@6M`gx`ap7t z_#PG>gd!9+U{z^PiBF~RudJuxxbG6dQ8`zcu~6(|dLVfpe$eO(3Lpu^(B9bW9`C>X z8*S3XxcdG18RjY|4|x+B4AT2gi`5MT$az{k-*|IzeL@$WmfCT<-pjZYd4%tnp z5D&N(a;=QzI)(@^Q-@AmV|gLgkEBQ+EL$ajHjDaV`e75^8w{PB!VDuLaBbyOqyTFw zUKXH$Bm&)Kd0D~ry*Qx-+fP2#AxFRJZLIniNi$cZnaf7rwvoHD@j{5a;{8xVZOFT| zeFs?2p1+~*B>&=0WBjcx-clZmRB@93j$1T48^7ZQg4K=RasR;j#_#KOFe-iK%yS64 zfC^#8uz#q7V*2$e8e8`lVDfbk_3R$E$UiOCRyQ!sU7ela(#g6OMJ6T>H}`JHNB_)O z@~zC6Z*_V;_ty_$5hY5)&iFA|E(4!fR7NS&DqYulLJ2*2h`%ds$40W8vQi;HUXzygZyAn@~D& zUEi{uz@M0}6La1+&sM=7^rKu+)f?T6PR=jj1xjf;$>+7oH%N8}i&NgLq=9#k%Dk&) z#tXRq$+Obyhf=zH8tCUGrS~}>Jd|Hd$Y#T*oV5ub_1|#D8IC4{YY!~9&JGVa%8$cu z2j7Ml*_PX#Q$e176hDTg{|cma@vlm^y7Gs}yYu4^F#Mb44`(j_ z9eMZVKmRU%Yy;MC#`Hc@u}M_ZvpD>8{guX? z69(ai-slqg3v9fo4b}SItcNjhy`U*8NioldM*g?(K0 zIa$)XZNxJ4>h$88hOqDj!CsTLr{B;|)JIr9kwfMF$RSmLHT@{+53%o4W@i3%)JKPy z+WclJON&4&(OxEgRKjp~Tvtdlw%b|0D_qMX;aj$QdDat+?^?-ZlFL^Yv9JG$mWBprYO3 zQB=USf0EqV_fdBW+e_fd5FQuskYYcpIvqk6A|t^9 z9OHJpbhGr8KV$XR5QdDL4%KB5oF}VFizUM*Oo!(MY#p11s-zaEsW%4BT5S6Cd$yW zZT73)s~NOkZYEBk9nM3C8Y>6>7e&|O=e&nOe&HQIr}@JAS__I~Zgn_cDPLIpHQ_g( zE?OPVPs-omTHX_`4Cxs<zZk3Q&4L!QGMd%J?qe&4FS% zZlh>N)(M%17qIJ_V3wSc8|@?gZCyb>b(ZjFB^KdI7ejVPu&gcmwtDkg9qEsFiNHRl z!jv&q*dGIlNrw6B?0lp#g$&zPYenhHAZYdPN#7x6^U3vxI|)odEvhgXuXTuU;<%fd zbA|M_dG?mm$0^-#=UOX9Us)g07s3U=lXSImih&jM_sYk*zSLxRsr<}!3CoH|g@Sv$ ze*p&6e{_BqIql0eRFz}zAerA)e*5%&BK(Qv^RvI!`TPyA(qgzgbR;M3cHcEN!{kSM ziSrwrDo|R08eM`f2Kvjq=IbFPfE*2-UyXh>uXR2fT*+A&FtFlS|3yCJ30azI;~eT{ zdZiRMY10%X8Mk}lv{Lt4$L$u*H*4PlKI^3-496XHS!CS)^&ZNX@_U8^4CK{udqlnL z^qewooqlK8rN$ocGLtW4+!{TnWtZ{S14Ab?CCkdVGx=A$O6j(e$Xm`5dK{r`T9I)k zN@wSaEBJT>K9KSCPFN63f^&E77*4S~eHx#BMlKm=5|quL*JUDp9BF z$-O+@{R0D8Ks2JPPE}S!7CE8Q(6CsNVDib0RRjNIu>%BDZ0jFL5r# z9ItA!^-5OJXQj3N!8VC~4P=IgOly40ndRptDwzR}=Q4TL;a+B|)Oj@7fnPEC!09tB zpN@CV&on)9vfMwI4pH}A8G^Mvvn-%HS_%P~$t zzxydWuzAjQ98g}yG(ce@%_gUjeXC-Ian z#!Hy)w-`st@(caokx98M39zN{e8GHGM($Pm5ZrJ=XyM(r>30Yi?thjqgY?&$PaJYls+|` zlnCh^rvDoI59P=~;r&YWy-3_%<7)N2NZkJZdG$SK!~lP-`kpNf?_X5kXDwc@zNaJ? z%D=3<*PV;whp>$q0ScBD{#1=LC;xakg;?SWu>^|An>^3)*|Fl_p}Nqa4a&+sO65FmnGjGCvOm+= z>jvLqQZDh*VrewtChbZ0X^wNqNA8`iT~A?|GQJnX49dvb(hUC)6d|CW;P2vbf#Y*E zgP=_ABQ0$Y@ue3nag==__pddKm%3=n{xA``y?wgR!(}dMX26yGo$8Zt)g$&{ah*^F zp8*hg(6;QouI<+WQ)C?j&&>+uM~1g0a{e~?f8`NIcCt0nT7_xo^b-$#Bh)k|39o&NIj*tE3;;ffi?16wb-az8rIL^ME1Lv7%|Koc(Pb(^Vb8 z4k&F}gH~<-DSD~kA&^Q!hCk;6Z@0)06tXgrN!!W!+}klF-*ce{((0AlOyqU4u{4X z8xfHsk{!qz={JPb$;tm3$|}rgySs6UUK6PSydirZ+EJ!wNpr0=ks9z`k~5n@q1Bp5 z4LrXggN4zgS{U%vn(z(jAZmNA9j*cpK3Ef}LC$}|JD8cl#!>HVT@$H+?@uH$@DveS z;JuLX>-E`8Lj}3bL@!8Jk&}s!;H;hq%v0c2T;qTjB8>_4aV12uNwD|ptVifdw69fB zfOqSJAJauaz#{7ckNv>>;LzReV=nFnuC*Te$=_$MTcJLpj16Z}rL;TL8{UVi<^4;= z7vo;^t-VbPOz~3dMf#gTe|xU=Quu-U!#9J?ZEto$bzm)!GI`!QQ zkDmvoU!nfUn z%|cuxycw;eKF=rbh}$38SI;59hbmxY1BRJ5kxq}WbmBzeY204Y@6*ETynsd8aC}p= zVTaaPZm&ppwdUTAFK!UKiEHfO>dWA`hUl&*A+oWdzOuJhhTTjRhLX3O(!;X!7Kl1Ni#1Sp2Gg zc-X{aJltKvDmlH_T1PbnxZE&)28ohU-{_A6tK$Ibdxi)ex>pleAt7?Rl*ZQ*nkhUb zijS|Kt|5^4bO@_h%U&S4){{Q}zfB!+S2qSrMkHen-x`zbF zAq<1u50a_)m6?9U?K`kv<=DdC?l4jd_a5b+nHOcTg7&3U&(SAy_v8p1$vG?hy;#J( zBtXdQK>tx7<-Yg_{!VcJ55CUy>s-H1ihp=NX61+@Y{*Wz_2;HrrYUv0C-t;fVY&=P z%9|6P1|QT$SfC*O4z~L|sTE?4z)f_{@X|oB^kFC@t$wvx?#)YgCYHBQFg)8&T zH72X?VVIP=(VtNqCl#O>c9BodBxJULxD6%q>R9d%4zL3cbPpY}#yt{3hZ$F9U(pZ; zK1y3Cm{T<2;>hq~yePSN$GahXk{5VC6M~ zw7ak4aWjv!WmbW|hDh}?$P#E)8uJOK`gUjC*}jSkx=;4s7B&y_o%qYaH4XAAXi(q^ z99+_bkZO$-#LOp$x3#q342s1{WdlcJ@wSY}zE0erhirLq-U+tCG{@QWBb@ZEWSR@* z|GTmLl}ptSfg50`90_MD`fUv$;oWj~M?}K_XIwp`brLI%Z5C|@%K@d=BTDMLK`RU676GTT=9=O}d z#n$fc2U%SvR2R)5@(a!DuzrS}#|{NbP(uZ;uUKI5^Aa<;%3kn}UG#S8Dq}ktuMc4o zFL83jsED^?hI>RHZ&5DMWed)q^w_%aV2EIekJs072g~Gia!wAJjMUM=;W_>kYJodZ zl#ebGOvPx1Fc+m=jy*`cCA=I?Tx%4X!ilK@?Nz~rgsjPh1papIU-74dKS=r&Gd5p= zQ?NneA3R{<)(Xpbm+5|~auekv=>qglu^^J+JymkoSCG`%z^ot0FKI6b&!{yV1QM8K zn&?!@MnGkJe1JJEjgB_#np!Unwz*x2fc1_szmH-*dMKWpIy5cGHC$>u(`6EdVAAQJTa znchU;^w_-y%b$MIdDNvF&Mr!7!v=n(GPM#~v5WB%CfXja)OiPe#`W#eA-Ek@hhO+o z@9D+QE!Q&23mh>i$azF2faSeKH3nYs85`uF8$bpIEufA5itP+(#m^K({syS%O}coA z@hg0bvteFuv;Yrp%;3t06J0ODL6o;2yFLonXTq|JC&hvb>{jdv$&5P?z2lr9+J6_E z*f=^M1}wOsv}E@?wca5g=xQZ?pw}1Q+w)At!*3W z{{Vet05uj)$_wAr23P(bKotG5Yz2>hn@1=j(I-v^9UTmR$!^Z4ZYTMKsE zm(04{{UjxpU+XvRn!2~QqwkUmx6`X#^_zWh3sZ`qMjH|S5Tz977DHH`F{PXvWiYhmExwaf z#BJ+J*k`rtQhPRmu#=h^Aw}%IaIiD6ju~8?U=l|EP(E8WWRXvw4e9V~$m1DTJYi8A zhx_-a{Ps5Cb&Jn_1mw>t!h8=jTF~|Kwe*vCg~*fD-!@_+P4HcA9ptohR6E{2zCB@>uA_N@Jm7P+U^TM%I@ag!C=#$ zVdb-Vgqx5ynTH>}n*vZI9TAq^4S26es~GP0dxP$FA-NEbY44!dKic2)2;OpghlNLD zmgF`MDIw1Y|NXju5T6hKw(s%3d5UrHuD|K`n)UW}w+3&Haft{p?r-W%B5(WMO*AXb zTe@YW6`l>Y=k@!~W`WDRy|;t?4|3Bn>oRUkZ0Q6sUD14fFt%LO=ioyZy*j`!X!0fs-rA&;|qyT=v@dN_QS zB@q5jf9H5}(0y|}9Q;pjm&5S@(&72JLJn}PVg6*-iSZub zyjD2Qc-rp4=JsCiH@*q^i~}_v8><)vI@xo4ul2|G`rPXsFCPo9ZVh_Jy>0Y}AfV|- zuRTegUw4OnOK?2wcq-u4eyR8)f4c!L(lfa2;~KbrpPtv#w)XM}4>ECI`4aww`@EJ6 zYt7!)7DAtG;g)eBL`}LhIOQ91)0_Rl-X>;%-2ve^H?+#>N-Q+3l;4L*Io-)pPWNV& z(~Wy7@Yj@@mGl>$F18uRhXWsYyYGg{6Xu=m?i=PkIND_`fQYgS@Ev!xUepxY+#b+gzKYPR8?%{T$?V~qD?s)I$(DBFmdHmNSjs=;(mX8}U z?sR`Y?(Ja69$=0Ei&n~&GF09>Le`Uw?>pL{Dencsl=niQDer|h*yd$M!C5|jgL&Ip z-)hySqsH2F)Kr^}8tT*Ij2Pax8|qKf)B4l&wEi?btv^ezslU@uf0~}wpQfkvr|D_^ zS$a+VD-HFh>1q9GdRl*)p4OkG$NEeB(Qe}VO1|lQ-VQYYXMQT>eH_&Dc`V;K76?1q90daVD=!QRpS^6}1KsQV;) zhWOon)85{DPafeXOMg3f^H!6y^iD(mPHq0Zz1Ow*kzSj>(|`}s8}irV(|J>mPv^}_ zEj~!EgMZkq$A{?+`D^h({#tyHUW*UY>)~ev4gGc4%?K*#?NWb3;;Zd%PcPSJ>6P|) zdTss;J>?t8pP`qe*YvmKujy|~ug9mRzb$`-zMfu(Kl`=JAI#76hWxeoAb+L54NfgS zb^WdRGlE*b5}%BqlHMuxcc-DhJ-yr>ORu!Y(`)l*=xM)7{tUe&y{5ku<|ni%(sDYyOO&*01&by;ACLY#nOHx2KoeZ|Rlx zczSLA3_a~v$zRjol3vr_o?Z(d{aPM>mcKHdEWJWsPp^Yt*Wb)v*WZ?2i%(sDTmD*n z>iS#rX9Si04(YK0P{mMs8`^Rl_W8asb#c-+q{u59D1JknXz?53gM33=kZ*2+na;f- zzX^-qgfZCN+B??0yuguX>R)W1nZ76d_?}OE{_D};;BP@?v$MZ?%ssF-ASlQz(exo< z-FO4?ySXWvgYLH7+bdW=AJ*OPz8-834*z!idT=-d z94ZnM{go*UU7?jI5Cwwecg;*|FnqVSeT1!V|L}0I8=BL?p1$_QV5c^j`H$I#VejDR z^?_?6K{uqMFaNgN(?smj>#`wVmM!oDj)3Lk{9tMz(La!Q)LSptpv3fcO%o)&DSr*1 z{k`|N(YgDsZ~Z#hJ>1(LZo@BAbtCd@N)RIY7V-3 z+70=zSIzQu8uE2Y`Bob8t(5YuHso6^<$KZ|- z887jXXPrE#1rMOg>6%;ew@dKsIlyZl*Tc)w6L_5xJbMoCIt}o$^aS2Y37$O%cqilGph0k=?d+F+S@$7@xWNs{R-woceJn8#nzpL-f#0_a%~b;2HB-cZZPD zXF^J!SNyr%02k>QTqs;Jxb__2+H-*0X@HCL3~r|c*Pa7hdk%0{8sH*5gS%3KYtI3$ zJqNfDHEQXbh#*40)e>BL4sh)`z{Q+j3pZH{1n%<^Tzd|1?K!|*Yk-UNj1Frhxb__2 z+H-*Wq5&?_Gq^8GaP2w3wdVkLy#X%LGq~#|xb__2+H-*WvH>pAGq^8HaP2w3wdVl0 zT^(@JPfRz!{_F!Idj{a_8G!Y?y^Y=O2IN z!HomX-{)}SfYbNY0T4B7taC*3!InB;QD(XZ=Htm#`FwsX}sZm4!1PkIt}BE=^5P8c*FY~ zZfU%A8pa#bGq|PkhW9z#(s=7Mj5nrda7*J2?{m1N@z!Y=Z%ohNmc|?2=Wt8otEseKM!+2wQ2Ddcc@IHrI8gHG3@y7HFZfU&X z{r^YZ+rYy$Gs-(145^n1zv~}CGQNoMv z_spDmp4ru!z`dXQ`Tzg>Vc7GVmow*_IdkUad9=>wTQJ|YonyX9e#jSW`S|(fv0sNg z_VaDqIp&+>=kYC=ZoI)yW#X}6+iDv2*EJnzIoRBw?RJyp(>~1S-JIx3Ak2^U;05(tnhr$oKNPEvSpxp(R8*cV^3p&NdF0q$OrH4B zuI%gMe!1)~Do9P)4}T2!96e!e`!wxaTEKZiVW-BC=Q?dOnZ`#I!^>*vcuOe`wTjpvX@u2qW3 z6W=D~kJpXokSDI6FAuS_s602FLms)lDJIWN=djOB=a46^pDzzFxTrigpFFm^74ZKotGa>_`G~yAAy4Wya1h-FF+TJy!_(w!~vHH zmRG;HJaPSedGZ2uz$Y(2=j9idCl0vz^5g~RJU+$klNX?a`gs95FTc1valp-&Coe$f z@hL7(UVskj=LP7z{NnP&0XJWsya1iYr?@+F&t_|Wc_cIw&s9@jUx_kBFxx7R%} z@t8*$as5m|dvIQRDG%F&eS3M1(_YssZ@kM3{JXs%OY)WBl6+;nBwst=mGb7j?RVAl z9H}wvqFBCkQ7m7&D3&i>wC-%))6g30@3Gh4W3Ru*UVr=I@=o@o$|As)MSv}f09zKV zdoUmG)$TgTAX*b~D&QOAeZ-iq?s(w@&p{@}s$sXMT5 zAAffc^=;qFZ?D_EM=cSX$q`nX)wBy`i!+-@Uo8G~d0!urz;*Rk%pLRoLanp5bwEd*KO@9YcGC`JuhS z{Lo%uerT^SKeShvAKEL-5A7A^hxQ8dLwkk!p}q3*1AE2yoz7lc1G|L&73PQb3iCsI zh54bq!u-%)VSZ?@Fh8_cm>=3J%n$7q=7;tQ^Fw>(=3J%n$7q=7;tQ^Fw=u`JuhS{Lo%uerT^SKeSg~zEwDipR)2b?{zQf1o33w&KA2+ zI6LyEaNPB@x3unTJ=l^LcQl?x3zo0%^PP3$IOX%5b(iKl>-v0FjyyTso!nA6SV>%5 zFOVb7&zB?4&zB?4&zFN2dGq9ON4=$TY(0k@aelrWaelrWaelrW+Y01xN4%wSY&(Y> zaelrWaelrWalV)1;QqaL9c*Ynw6p1;U0FlS1;^diIrv{*J}+zV_5@k2thjp`_zTEr zUC+yp!<~`88xQ~PSpGh7*TI(PPhj(LH0(z5^<71IHz0Z=tw_FYw6lI^rj^y&3zUbc zQP7V!Td{uZd!701w-mPb<}KP@3iI1@YMY9;YC>CQEy#lNP`u?}5fDu*!Bdh{O zSOtu*3K(G(Fv2QegjGO~x4Pxm+E?`7S|H!n0{ONU$hWmXzO4oFZ7q;*Yk_=Q3*_5c zAm6qE`L?Ni{L?ft4fF13#5H!`y?38XO+ODjzG=IA=Q+l1lD8gcMeF^Ch&}A>Y2Vzy zBclj%zHxu>@89gTe?iSfq~DLXFuV8H$1nbZ?JK|XcXfp^LgcGEu(PS5rA|(r@@i`E z94gAUcM(!oJ~D6Zn#DrrvBr<6y#BzxoqPB5=e>LOu?X61c|SR_f#k?K$$4(?A!6Qv zrWSinvxKW2mb)Xkz9=i_xiEt^Rzdkj4r4LDks;syHw}cP;P@2d`VaYd+S@h4!jw;h zF=T)l8?}Sn8`QVl>9Oj@pEyfxcYYK=;$$p$Fs>)T(uIr<7kMCmf_3f0PVy(p{*7O$ z#|x)Er=YgHXRLMGGY8~d;OM<@wj$vGh#l*jF+ctx3Wit)HV@;6oXPX+2iVpRvDAnE zo~8r4aOS-Cm0J#GG6$Mlxj$=Rdz5ML*AN*ehIy58`zPo78d?d(yc4g#ks$r-;?KGH z+q=3u<2#3F=fyn*f1=LIh3yAhn1|8*fRBT5dGO;H= z?y}@E$L2cyx!!8w=lb(@f+DZ9vHrAgXC{Ls_SQ50TqfEV?%9cCc;2u_2TOnN1L5RA zEk|wFL6EQAxTz+_l^XI5i|ECD`U|1i->?TyY1+I0PItdhx4*TiS)>we?1O374|lP3 zjW(}wf4%sVttWLH<_~eIxe#cnJAjDy#2Z=eeOsFkH2JV6{vdyQqSuMCp4R78kwWUY zi%+_4ZphFHf5zE@E$aDcfP0)g^6LpjvW@=<9OP-&y${bxP=}{CViGBD-`#g)$g#1% z$5NzTWTRqyLKDh-kg<#{=olAiSF~!8dPRpo`Vga8E$jm)_j3zH+Mlbc6|6}8$fc#i zl5(skb~{J@x$Wev9(i7o_OHzzylzm;C5!Pphlz^o9Y4jgGkXa?o@N!*+vT5IZ^}de zD8l!(>CIEK*QB=`or=3galP}Nt`!+?o|+Za+vT5IZ^~a)Z;n>Qrpglg@O17q=`BaK z*Q0mdQ@kR2^K`DL-Y);#dQ<+YdT)P?dh-EPtdh@jLHR%n%*QIyfQ^_LZ&FdgV^>+E^)|>KI)%&K`s5h^jye7Tj_qz0sUpFZp z*LdxusNOFB+d zh=1@pOi??z{Bzrh@>jJ}&1pTui7MfG<1=hmC@SJnHL z*QhtI_q-;(;rF`qj$i93uD872BZ}*1Nu1PjZ-AoZfdPt@7h3>})hlLzV)b6l0LAKu z8@;9Fy3sqQ{;vGo`sZ)>it&GK`WN5u73KFT4p6NAtLv{DzH{oIzwukjKY!y_to*g< zUwq?Nl;7*pKY!!5l%H<=&Z&R?2C!)RSM~qm8^B_GUYq~F`UbEV-&Y@h-2k3b|NM>M zQvUfH!D8jFZTyRG1dH-}UE`m>5nReoH-hKXKYv45wEe4&fAI}rF+Q(t{9k=TSd4GM z_-~a97;X{xeNWy%YmVN)u@;cn>hEpjUZwzZi_~C$8PeZ$(4Ret!IE{*UFgV#tF+s@ zpBrrc!oL1)eu@<3q=Ujd|Ko{LpPviZFE>A2r|@S5ygSp}?3>B&DK07Vza=1ir9FRO zz#XJ?CcmrTnl8dRxuSL4THN!v*wzk)M-#4kP*qf-(2c)VDYUw(*;<%>g2 zaeh1|EXuFo%qa}H>6BODmNX!rtF9)wcC#iE|K*)DHYHpr@2%U}q??l{KXTVb-g9fR z&kBV<~nBDWWn;1JTd+V(a$#_vY%(uQ2<;RNY zg|%g8`C+B%c57&1k*|0(9`5>B$IaW-TU*9^&%XL#i0c~n?+Kr`iX65dyI7Z3<~DuH*tuh>c0{XrIJKQ$%2OscM<^wM`|@4*dx=A@NMl;B;VR2%Gcp#tYqlz zGb3wXqGhXh2C=tb7eVcyS?mW*%6akEJ|5B`1=~_xlMn~ZxjaYc7Au)PaV}bpg#Lka zT<$}$E0N#5;laZeefkhNQbB$sVL`q=4dcGv^Rd4v6NRCI{3smRd~DAM-D&4MwEYnq z-W0Sy#VGuua$hJDK|k^ygZs^8XKDn=`>7)Po`YAFlOK+_v>bktFD#}07Kyy>?cr!` z<4244?&GQGuBJPs>VAIv*~;MaTN-$6gD|mEBcIPd(AsF@hR538HP-%k+v>mpiM28% z`H3el2a}G+yjrFOA|K0F{@6!+f_ydclKM>t?F;eE4R;mkRi3xp6>^UTsvzJ0Jjjyz zj=SUIG|Kx~8e2ce&*Ky1tCWsUG`Hkeiu4s2ktfXejI5kYJciW%ggtm?Q|nSyHGhf0 zmgYOoOY@zGnjea8C0v@H$0w|BO{Vojm8_~o@+~9Hmx$t36}K^U2iYtxbtjjK0&@85St%Luj5gepT{SxuMT4CFVR-z3G{bQGUpu zk|p_;|F$?k;=lb|{B6M!K4KqAmgHOh+vEI*zk4Alsvpa53!?l`eoB_)TmCo3`4NBj zf>BgI=5Gt4{E$B-OY$xMo8tV4zk6XRsvq;W1yO#;pOPi{mjBK6y%yQ$@DhUG?b=u? zOKxGlG_ixj|NL7Dvcr@gC-lEiN4KnIoOS9O+N5s8M}C!%5%$9-~ayHLHma+_Dvr9=GCi|yZc?`EAPqd+s$KhdHD+e_U-cW@k^gyq(AF# zuTpOP$9(j?FKfLb`7RtSt#6}6k@|L) z7s4_=lNZb zZ!H({(fZbMVLo%fEgl8(NWPjsU!Lf{>VOA_U_KnFcQSo` zk#_dgE?=J4j+eQL=Wjhn{Pm+Jqt@?9||DJ#Y^bY8=N;g9PlhUow-&48+ z`X7|;gMMD=5$JC#{TTG$Dm@PU*Giv&o>O`f`s+$R4gEExXQ2OF=~K|Bl%9kBveM5( ze@W@H&|gscCFmJPCsNRVtn^yw&nTUS{sW~qLqDx_4fLm!u801l(i!OAR{CD(Nu_(B zKce(7^oNulh5n$@k3*kO`Z)Cam3|WX*OZ=u{uQO4fgV@-B=j#TeH!`~l%9wFIi+8K zeoW~F=yyB1q!jw6l&*k&m(uH@N0hFDKBn|`=s~4xp$C+1g6>ng4Z2t9Zs@~G=b*ck zeiXVx=`rZHEByrYTa})GzFX<1pj(xmhQ3SbXQB5iJqvxO($7IR3N6WfZTLI=Uf_F$ zSvDxo7gqA!!FQ=iBsTF~W)e3(!8iZ-M4?b5(}# z3&}6#d#y>lL-N-dvwVDD@n!n>$~y-Z7hf@nd!FKZk$NRAl}z)!mb9F7u}K`RwR9qT zn(q{|OXMggtsueAey))J!{`rvSHU+*yg=J28H;1K_;b9&45H*eXTZpr4-TWa`sqpP>DNHFUEa_0H(e0%=6 zZ+-I{UqAhqU;B$c`yZ#i`js#L>6gCvg=aqVhoAoar+@EvKlRDqdFr=6@$rv+^dles z;BWr-4;=sX@n0T$>^<)uee|7=JalY$Xz;=QqkRwD-+P3A{rujy-gD?+YfJN8`}Z~7 zdB@&8yBq3u+4fHSCUV0W6>8QKwzQx7Pj>UFY_Z^FGzxQp6Z@s7O z?n4I`7p4EqfyKrB`xcvA`JIb*>}^~`n)~LTq*2lsX`FPNG(nmqO_8QaGo+KGS+i_J>dcYm zNoPoB&GH`^QU$4!R7I*L)six#4pI+kgfvDvPMRc5lTMQ6Nbvg68PbAT{^Jy>l2k>i zAvKcPNIj$x(irKuy7V%>li*3dg?1rn`Hv+INDN@klehfG%pZZVz7WuZzU#!wH?f=CZu*4*f8=+a+i}Xci5q@o2SK3Se zJq7sH`7eKQocf}h$RPYD_H!D(yfjvTkAqVr zwZ}`7(DIKUdpr#-Yl7>0`Af6VD-~n^m*xxbS+E3ZZT~W))!k#U1M8UQ_oB!v>zUg7 z<*EW)0~UK~|8{(2ee(4)&>`*sUqtf#<)AAAJPLhjfXAU_e0=>0=qpIt-^-%E%mih1-KgeYQ^w-rM3WPz;7U_ysvaXi_OFb zh5rcu7yoit^1{#S^_Q@%&`a9CBK8aYZA@yB#9rbbJ^A>R32@4m@jv7h`v(5@$}Cv? z&FgmtI`F4OVCYYam0NYcNwKg0Jm zF@8n#zc$8;3(&GxbM;f!_TnFcOF?PAJ(iJa1iy*o%i99Xcv<Q|8F8W?BvZT zM&85-bcm0GTci4^#1wQ}fKNi-8{m29jtD#c-HL_(0(5{&D#1Nb{Zxs_-xpw!Js02( z=-~)E{v(RvUm|pfkAokL>ZeLX{?P!7{Er2A9(pXoj{oC|h5rI{fUUoblc)ZWtc3R1 z`^$TS@>*z*y}!JVJoT4k2Xu^`zdS)+1&RKXqkIc4RXoAB=;-kb^oan^Lr=t5s+lJh zBVVb=I~m|==%)fK_MeKdv&Yklk*Bl+I>e*kX_D=Ta*^$s01K~~0E_*fjj-b{dD33^ z&+{GNGN3s{QvPKk|7?Io{?h>#`R5|+_&=u@{$(A|Asz+KlRSTs|M>um{AU6zvb_*t z$N#Ki;Xe-@V?f^LC$ASh)DPAR8(&i7Ir}*OSP|owMc0ZL+jzG&!YNsbYS5ttcEEC`k=+*#_K(_^W9Qxh>PeOMDcm}#Vz;n<&0X_@e7vmIU7_U+y?{H8q z@`?;*)YX*>r$ULO&DWdFYt{i@eXq_&kwU+GzjhrJ+v+ zSmd1za0dExfJNT90FOdH7hsWhKENXH^8uE=&jffL`h@^5K#R;O-}x2LKL~IYwAAtC zwa_mGxXmpkQF#t5b$$IYa4NtP;1vO$21}p5{w#QHfak%L0Y;X@`WUaEZ6Y0DphWK_KykqH^T%I?^lZa_Xl_${6K)u zg8RT~zm?KH7h~DVCx!!@0wbfZzp4WKXn-rhqXABX9}935cr3yYc^|i4i7b+ke^oW# z^r`x#R@Fkwy{FSRwJHNG=Mj%PpwADm=&~ZfqtO05Ec=})us^Rzf8zys0$f4z{H6Yy z0M9_j=i}6>S+GAJBl)U%u=u-gkA1n%jqqyG4V$TssntTKNv_Y-YU~xQUkQ_1T>}>X zbv#q68=)oX_^s}MZVK=SbSA>f?Rwm*nDdBTkK1Bw&mZ3Zu*d3g$~s6Y|LRHT&KQe- znfpj3Hlxw_*RHNWP);`{rKYFKWTg`#P%H| z)xSdgB^cj|F|drUFFy|572rweV7x12{DbkXI0^RS%}7@Fa9Dz|+vf0X_*W zJbe3k=tl#*06iMxbt&k_0$d3_7T{{=$0H1p_erg51WR8Uf7Z1@$NrUC*8>*+l5+fK zoyZoRcc;K2gYfX{$%+W4)`=_?B+q{WI#^HEN&8^Gux=)L}f&>3tHxCvaJ--F$ z`2I6>k;oF?f2J;yy7B#I>Y^&}dXmVCu? zi_R+F#cj~H1h@zK)&P${-xlC8=wLoxd>mXGlutqL4Dbx}t^m(M*9CYUx}K!^UVIk1 zk)-lfrl9u*xDxt~09QfZ8Q>b|CX({26keI2yaW2K0Oz2a13U`d65w&@AU;%1fZKxd zY3O?bd=mPt0iJ_?TY%3%2l1qG0o)OnUs3_x8Q?VZeF3h9?h0@%bT>)$y(9zOLsI)) zB6P5yxMTzz>?bZ61IPP`)FsEkeI(Cs5;{ln{AQpZ4Dc-UV1VbLhXQ;SI*4yFHEn!T zewS8)A0c^M1^vzd*Fe83z>UyBJiN3GJQ|dXtnUu6l)Wdw;u*m)!0hYQS2=FBI36keG4Lw2f{AQtlE5P&69}4hU=nuzuJ!E+Qw7vo? zeJH>6RnQ*~a1Hb)0^A7w+W~Haeu|{>t?z-J3d%>JKNa9{=-&Bzb;g&|ePlap_+QlsE$fBy zzp4ZJDU$NPN@Sl>Ec~VKr%9f_@P3x$`OiRqQL*r!gZ>i9^FIrHlBE1MrJzqKhX1BC z^ejpFZ>oWwCn^6;8R%~-hX1A>=EB`n4fQJJ-3P$FL|8ejb*z=!){P_T%1pflq^PdMl4)**Pz~eElssKL$=3B+rS?MEB~q-coMAqtB@`6RDdVIQ((`38axB`{AVFQAK)|KKLIQM zYozE|{-^w}sRW-4a5eZ8SovSm2!2i)k?_B3Iw1chz$4(lwPmh+96S$p{2}r_scR;| zQYLBXCw0vXnQ?jQ8uW?oH{|&U_KMagfBz=3y8cqv%tNnLOv`J|LZhShm%0`*ynnb> z+NMcPp47EMZwhcVbX9}(Ey=f^fvykm z95iDPm7j%fit%+RXpuqNUzdh%4Y0^2HuL4R&@#U~mbM)M7P>pYIq04Mk3#nacpO^l zczzSm!vUU#7905TS?EUtd^GBD<+=Uxh*zu?Ne`>hc1uH-z4@rFUHqHM$c1ee|-gbg_bj)uCIa)o`+mt z3tknJw?WJM>e}D+IcVYG?Bn*sYZVLsQRvF3Jazpz^m>wSKLH)TznQvz8Z3u6iMJw; z*f&j5`(H0(v5Dl{pMkzQ#y3C)@8_m&5ZOd0*Ir7)PwIv=P|94ni;pSAK0byx@+2D~{apM|atu-IpNjHM`yr`00Mj-XsB)CRZ_x<0@i(2}R}R*yh81$Z1f6W~ec z)&S2yw*`0(`rZJah3<&)7RWH3ZV`EVf^w0!FTf&OF2Eho!vPj~C8_*d#-Se#u*f?a z;2G%00xa^51z6;LJjPp7(85#sZ%so#5#Va*;{g_VPXxFFdLqCg>yrT%-Xf#tFZ5FZ zo`IeUu*my#fX_lt$9S8_`%Hk-&@%z9fqpi?8R(M%?tnfOV3Bt=z~j)T11$22Oe+7j z8R+K%EM@Zn7I~kK@ph5-On}qSF9cZRl{U(Mdj|Rk0q%ibh%iLnC$)VPEN$IZY^MQrFdw3Y19Q?D+cf)Xiy1d>+)zqN|LT$jkfw zH`fMO%0*wl-b%UX>#>xNfo1&_f0Od#0haPfa0N;Dvp(HC!}pp1&p}^6a{ijS`3$u8 zKkC;2BmWaz3HIxi;3}}>DgT;U=-_-^(*};u*KU4zf0RD+KdG7?GQ^f{{9OHTeoavp z&#zR?2slM@yizq|(6XQL_&BuK*W*cOZ!cQbOoPQfzWgM#w}+I^fyExa{0y|$U&

5T;5lfSf4==0Xqm(wFF@DC_|_D(%s(x^wGw(qfUBTy z53sbY4R9m$t^l_|*9W)e=0 z_etG41C}yhe-=96XW!?G{mZ>iANbd;^VFCA)SvC&8_E1jl92CB^Lz*M(eB5^|8zdd zP(|+xh(2e*;*Tnigto~4knA?;%ln^{<$qGQ$#?|%+*S<^^tr7OEc!TkQ@3?M$MMGf zy_DC_%P&~vwetJ@zxY7@=l`_-)NMH!`u;@UQLyjN-(QFgL`T0r_x36#&vC8m?Kue+ zdwBh)q5XMD`a21h_~Ogwp@ZiGx19xt_FDkQ_DjiB2<6`)eZ}&pc2t5ze&sJ@krT_4 z+HoB0WA`8fn)icJw!gS1^&2Wn(r6`@;;8g$RkPW&+;Afcl$NZ zAOErMkH-9*zVZ0F{{8q0zj^ot_|3p@yzO|#<1MA(C-r8j5XkrDDzKLi{%@`U$MU7# z+z9sLXEj5wM?6e!h75r2ZJ?B9r)&w?`bW-20}nKic=vqxdB4 zCumnmQhUF723pob#rA#Tbd29T550-x`b(`8e07Xh3l7%5H=hMpk#zj+`^4AA_;!(f zbAZ#(*9W*7T9V3hdn2^0cOHxVY69G&wB!|;f4Aqf{58(M+sCM%ig=}NpMduMMu~`T z$ItcU{87eB^}T%>S}JL|egF5|<3Yu|PwMtraM=GDaM1tC8L;;siLX=O*nix7ise}% z-&?32`42t4Mf&poBe)Xm*E_*g;0sC4eyO*Joqhb4@(ftoIDJ!Z>41*cyVP59VDDd$ z1)tPg#>f#FeEZ|jfxd5<1dG0EPkWw=^>fc>D=7E!O+$zJoCJsZ%!5OH7Qmv9v?qSn z@)cnus};f2qGAD3|f{SmcxPjX}ALr^nJ>^z-LYebZ(NFqR{dP?SSlZ8mC4Q-XyXFGy^$Ygzbt%dNZ1s~q zRKB_@Xpe<|CD@<0v434{fJHtjm;JwQ-w|MGFZ#)*)t8S3SlUZpJ4mWu-DH5Jz35j< zQvK>e?DgBF<&0lFWO$yi`bnntU!R8dSon+l4MDlcWLB&mM&69Ja?qE8b^^{YP_V6WePEf@V3paX36%aEt?HB>@-Ec^xE6_i&8SmcxP z=Ac~KdMxclzm}jp7hq{$18ya$ehtS1EbV8(Z6wvNVJ5&{zqe{R`Zb(|4zShlUh-7G z-4)Ot3xARS?Lm1}fJHtje@9R*W8ty17ya6U@(@e=8p=9Is^9MM084w(ubZU$?Vb*> z*YB{Fqu=f`&;hpkNuR3Uo)oml!e8X?4a(C27Wt(7{-C@zz|vlLJrI<41X$XOetjg> zZ_ikOrM>8vBdLCSrULBs8`N_2+cOUxV?f?#$$H!<#pjWPzsNJm|5uO{H;R6%Vr=&( z6=1QK)Su@6uVX!~l~#T|7X7Nge*G0J0{Qh;@F>`?uYyHBkxA?&_zeH|>nFHyecUPb zO_NmKof+s20T$bC4DdL#U+;vU=(mZa{S~ZVOV+Ex^=X&r(8z+uwQ?q zd)XISUc;|`1nlFp;0bUeN%bp;w@cz{VLWXR+xU12zlIDrh?fmHu#cBg zejM!Mqu?2^$f)`i#=FA!w!4bDKEBa@x5ysEuiZUhAHSr09Na-t{R-mIlK4{?Z}y~V z>*Edl_SAxXd=cCM_VGmU7}&=T!Bb$df$Fzs9y*Q(sm5yXFiGb_qv&%iz@pDX0T%ub z2Uz&an5uq_bI^~Hw7#?+NfI^iKzP68bTc_P2Ky zT4d7x?trxK&kLr%JJNhVPSXDFsD=K;0CzzDQh-OHe>uR?-#AJ8yF>bWf~5W332A;! zG5y_{h87>w{_d=Wet&>FpnoI4qtG7+u=IC=r2X9~{Y{Xxza~igzP#$!lm30{2}r_sk_?1BA@Da*9dfZfXAWF zBRPAf?wW)a`F;J9&?^Hx5AE%TzITbdBBR!Cu7nQuFU{3pZ$IicH-bffU%v-B*snB? zf-fRDd7OQPr|9SJ_q=`leO@{)xA#X^gM~l+t(@VzN->sbJ`R0NfTy6Zjj^Z_{=MJI zv*68fx%}Qlxc?ASg!_+GDew&>)o+zBtPZf~vL(Q2=&b=3S+_+PBJY!Go&ifA-hOk? ze*8o~kx%+me`}Gtfj_oL|AGIt)PN;V=SNE|^rZpLK#RS7c?a|r0nS0ENh(jv2=s;+ zizwlKuw@MF_k(`?Vl1`8PpaiOFwnO}`V0KCWeOblXUjC$`zI}1=D;F^m+uU8;GZoE zVDF#QZl`JvE% zTF+80{-gB|LWY0edr)Na^A}0Qyw*OhKX*Ut^>=wv!+(~<+n?a?j-MY-?EAXqt)y#_ zS9mP_qz=mX2lMM-BUp4)e>vCzElN5Jk@ra*90f~#ufO<*A1{fQ3*fkYs&GCZoS-}y zuY*(Ic)Xnce!RrLgqP^#}gVQ{g#Z^LD46$ z*CA;i=yynX`SHRshpNG`ynwvV68?v3DG&LzfrI{}D74q19N4cn(%&dp`cwZuG!7la z!$T9`z+Q)@z=6FE&42@Y9hwEl_HyHqCQt0;r6^s)etK-ZI0p1a4PYa*#Ajz+`q5qzf*Ug(fYoBu}4btpxT7?_L2QUTOLleh4zyARg?$wr>zF;=TBOn z7X|aDEkn8RQ2%J_fe!qmZ4@m2;mgH7@p=i!`#AYT7fB-T6yIJS?;n9aHvU({^%obQ z{d{45+vkxYpW~Nmn}iPhwQU9*`0MIcgl^JZD(1&jP`d>^v3 z#c!*CmOSP6wkqg*16&K;NmBXWCUwL5IdE8itf2lxLH+51`mL;Iq(GF@C$qvN^zMXpvF* zzr6-}dw?_0lIP2Npmzj#6uLIR$D!*3JO$kt;FHiYpFF>LXz9b_1!$RHir-NI-4@^~ zXg?pY&pT?t9VB00>UIY>2Q4!D@-gVX08cWuM{H47ITtSlgOwIOD{vVv*+Q-3bNv^$Hk3=TH zt_?)=NwrU!@}p_6oH>YJ?K7slUwFtE3IBQUS*E|r)4}b@fb?H2r6$!;Y04iQh5iAF zoQ`T!{!>zxQ=Bp7@0oyZQ=Bv9?}d!`jhpfhO_3owN_*t_&{?4rBhQB`pwo)yO!L-W(w~$snDWn7LvMEY zz6w)5GXcFxag{0myzr`0Tx-hzWCq%ox0&)UOn`+4{O-${@@Ius{`ZZ6b6{V8!jyk8 z0~UKo{b}$NwC6u-%D*%YmiA?op8?N8i+t$UWx!{lGKwor`JW0sqPPZ}gO>iJKJxwP z1XP+NxW|;Al=5!HBc}Y+S!lIy7xMmj2UzUs))h8_j61Ne_1EXMe9Dyn`Y5#eXBYPS^$D;q$9^AxpD*uD zfivLEByzjcru@V#)Jux7-^4t$`ct9*cT#^cO}WfrX^*_WBb4G|_Wp7$uovzEBwg64kUU0yRckw zG`6K?@n3CT!o`fF^edl)lL_qNl>4{4FW)B7vmjsK74ohB)|g2d3H*^z!mZho{=x`8u|ABmLFK+Ik@))`2t@k-=_TjjC_G*u7Xc* zmoM--`374b0?YYLu-8w{Z-PhVi*n~X0{DP0ag_T%Sk80N2YgusAi&}a(FZK&kLUxI z^HlT!Ul{=iaJm3*D8L&F@KptPQvtrZ0Kb93+GNUKw)V%l&^K`{`qxUmM2XlZaWnR8 zRg66o_3DN4CI2-s7Z|UE)Mxw>hs?73XOVuaq(sI)(P5VLw}GEfd_OmOk8k0-o;fyKY>fZq(?zWD{D4<6&YQt{`(*1y2wUw=ljAJu2> zb>c#M{DWEc;0wY-_4^L?s|oPS^lvf!i+<>Tx?0M?GM?w<%a^za`!s1e`X=6El7p>` zUz*8=y%QfWC4VUKpS10<gJWKrw#Tk=)0C|)3ir?zzgOk6c-6Z~i@hfT5@Yp4m$>(y^KcnS8 zZ%Qv2VW^)_{C@Pu9$x?C2TjQx@H?+b%YWY_CMMyxL-DhwM4oLVeE+9)A6%>Y{i8|r zJqNqZTL0fo;^7qd1&2#l=)OiT@CJ=e7RNn3C@>Uy|zor4!hSD z_VRp^a@t4yKW)mYMu92i_c?whWg7miicgv3D=**=&no_|N&L|Y%GIAsUxZ&{%&)B6 zl)XXpea6)N_6?FSz#0 zR+-XY#C~OJ|79CZ^84LPRrR-JwbZqrwEh1w?DIEgAx~=iBPRL1&FEXBc*G<-i4T7M zE&F-uKTCbj?>9JSj)N6Z}ulg@T-;YgDU+ulT!j!#dl=;`_>M!3+h<}Xorxf38lJ}#3Vq9@E`q%RJnZ&{r>&t>xG^qvg+=*H-Tpr|GY_li2nTgn0mq_{^EF0f5Ifb zo`IkGS8AGjgbvC@-nGd44O99U<6o-!rM_=UOYyga&gaw*@gK3j+M~S8lz&h3_n3e4 z_s1jXr~XiWr78Q{YT9=@`O2>|%W9BsmFi!<)s!4O$tGIIw|uWD{cG%z$Z7pHQ~IkF z@Ox76kV)QM1J?Ln&VFMAeAzQv&V2aZEY==(_AmdKDVaRMeB7+%Uos`9kT;>@U;cIc zb35|u_>@0qNNq(#E;U)9X@Y4a~|i$uZ_cRLh)~y z(obW*4^&LrQ>~`>?h8^U-doj5Ae_90e*&fSPDL&^8C3e z{d^kvPAmRLll;*P{jX5We(U896OI3Qi>B<26JVYH=d)k@>lfnk^Di`IFL%@aq-%eE zl}T=YhVoO2w=-X>!8*R@-)@pOjs@izQ+nYX?R9+4Cte;KM!#pZJ@erc=(9}idH&Ct z#J4tMANA++@sHD!fjl2GiEkp0kH6=C#+0=`1y+A4yAS*HfYn~-f5DXf%7`)PQtfZv zB<7|l_VT>IeoDqq<^%KT{2#FOT#vlIKJnr|>M4K0wO?_bDf=e4)Z=S78Nko`%Zgh~ zNo8w*8};5G=lHM4GM>}$Q~6f(ndF5(K;Ore|GOxEE+~JGNxbVZ=EJ;}zt1H9rVaj; zihsu>zdZr=)kT z{j>D#==(VQRNs}qZ4%#QJdzq;R({TuuA@Au!6K~|6H!-8~oaDTBimQwr%5TmjPE=FBPx15oY@yg^lVZ-Na&Mi`{mtqN^d48o zZ}qkK*=&cO!32Q2zn;Q?=k)C+}+F z$@^9?p6YL_e_iUzCvE?~n)7Ur$glQaE%6op5&kUx`Y3R%_V;Hd@ovT|sq@;m z7VKU6sMf#JBtP*q0rGV{@AhND<<)m!?gGKYx*2v*4ew_yQbuGFVVhR>;DT~ z&x6%JDqb;(->m{`JXo{JBz|s$_@?#OT!nwWApGH1$(Db!J|~!P{MR%v{%dKk@q5i7 zlgwoQqIPcTm?+@2}+LSzvKb2H# zIq~!59?Et8ulc%3JoY%{IzDTNmvuj&zbCc+_w^n>t@6Hvf5~|0_#}zH_BqK}SAId# zl*!-vlRt0SD~2wXxTjdtyg@bDVKZwWuwaPE|YjBL;HCx zXTA9}{=Ix$%l|9>vJlI20rz2_oCwN4sP}WCFY)Apr%cJGPNA>b_kz!worU zAODp0M#ujG#(%kB^`8sAZ;}J}TT=b)f<;rZ2mdkCuKk7OCb_o~eV$N!DMyhu@FvCA znzDxD=%@C%u#Sc6XR!5%xDd{scJV`dhn<^+Na?F!zgVSF-+4ULqK~t-X}- z9F=nV0kM;y~&ikh53`}aPqC?zW1YJjL!>-?=dA;Ka2dE z6?5L}K_A;cS!+4p|MV14w*4x3Q<)^Xp{(--g~e)d&?bw01_=X`P!toB>?E|dJ*9QrmX|1neY z?GdoZho0-$Z`_7GOT0WEH|3)laD~%%-4{*r#TT%Lum25`+$QZcKCSy#v#bRD%GCe4 zqE3Eylyc>F(fRruOy$4ma>jpiEdNEsPy5`~mvf)~b2XILI{7ZDHzhy&6zh}Dzl+-R zxn;GJ@1h}7dcj<*&qe>ml>Hm?x9oXsKW<8&Z<9w!icgrtFTyXO@#>-}Q}*p@u=>MA zUpC2mut#E8>$6_|n$&Mo%>B)avtXV77yZyA{yBxbPrLGqxv%*b%FEQ>F202Mi#&e( zFHW1%-+h|lS*!K0L7xo8X{XP{^`>n8aj=f(#qG=|`uF2`@gt`6GgBB@{e`=!l0Q67 zdAIWWCGJZe1*a5qKh-$_`+3DPrcB<=NSsjoEt6~#`>FmHvmP84eZ*dTF8)`2&Rpx{ ztK`1!@1CGw!L_fvjGw9AMEh#RZ)CkZMR}`Y=I>X=@uwY%cX3s_K>4uZy{6sR_oJ8m7yL)Y zQ|qsm^O)54?SDp}YkU9Ue3*SHDE}?@TsSf7^tt4Z7~f}t@-MjO%y$2>mPd-r?~NU( zqvLhS-3rK=f#kvHSYSNtvVVs9_+rQCOa zd=xnDD!Qh`IMG_Q2LTj+W!C2-(%_NK%YJ>{~Yo@D@9;FmvVl%iS}z$o=Z7T9hs04 zEuS|fx7N`9IcRy?=z*%O^nA&itjbaJD$Q{effY%e!K&II^Qnie0kzI;?IKCf3GR|os;xms`z(I z$+M>@e^&7yn9}bvU;KXaGVbqdw^Oe3>$1P$`33Tq9M}5)W=hiZUsmbxdhV<4m-$xj z#&i7&Q?jm)`e(HK3f3q3^Ydf>cqp#X){jZtCcb=gACawPoTx*KFMc^%{L*OSXD+aUky zXG*?_K4t1Zmvi4#GlIOT&*d5R-)FJcgzNwEdrVUNe|b*%ALjg0jlA`WA9C-t`2F+c z+#lHYR(yY-G-Yq6KeI#Yf5s#$;b$IG{56yODEgIn`R7g9oAD37Kf3&TCizy%{r%SE zKQ<+QM!CPQx#B$blik!;`>pzsz9*G)@?UYOS+-|AucbZh`n%#vo==NBGm5V>T#3T3 zmim>va)z2Z~)UQ~zj`-&;O4}U84?Rnn&=^pBz(DvLv%6mROeqMPY>(BGxCRcuC z+LTpeucZ3xmD^47+7og6mGATSJ8u7d<(rB3r($`oyu-bx=hy!$xt~2D{i*y{j_`cA zgZirPmBjnck5gXlV6JM;wztrEae99!=i#`1Oxbm~?AD#y5cwNc)Q14%orUL)I zmihPuOrvfFdW*QmJ0 zB=0&79#P!DdEnkyp7fpI+5q!>;#dYeul0GJxoieK$=!dcw8ec)cm%PRo=$uJ|_m zYa0IQUmNk~qoZK;myLIu#OY!1b6TJ0ucs%#zWz_~yjAe1({Cg9U!QsbyhH1Mfag^U z;1h~JVoH89g*-YRR&oD)Sopi~?;GkpHq84t4|Vn(%MQJ%t@HXWQ$IM+-8tNOz56m< zgTq6^#||H+q^q;9uf4s!d!YSD-@tvHeeK=D1A{~DoySI8(c!_)quKWEV@HoZV!8&7 z=K8Y3+3xGNZ@YPmIXp1fm2Dp$XcyL|y}hpWKy!Q3-j>$(c2IpDYG`cV-Mn*OL;J3V zJ$v_4LAq)0?H&n%IV357t+5X|)!;jQwAL{MOwq}Qh4HYv3gTuQ! zyM~9T)tv3@HvI#;`#O)9p`L+<>jwG{_a4b~9?6>fdIyHub5QNu+k1zzM~8gdz5Ry= zw$iq~cPQ7_`AEy*oYaR~Z+mZl@38dUHPpKovbPhfv}A{ed;5<_Z~F$ivn|>Fp{!vr zbNjMK2L>OxySF&w>nb{^T; z)s-ExqQ#=`w4BUP*Pg6p;CjXmhX(qN9nFgDj*3JZ#0=fNgA|BC>hQ77L1!=e8p$yt z*}>htgGV1GyMEx|{=NasCie0&HqtCB?e8AMR!sx_N5uZ-XlE{$?cQ~4$TSTM6|IK0`g${++`;;`B#5hi}?` zU+-{zwyXDOXCKX5vO`|7eZ5_S16|mf>^f8%&U(cU4-I!pUpjOmeciyZ{^9K45L2zI zC!2wPQ*ZwR)}jsB?wkyn8R{Hr?;U7AhIGy&s?{U9`UZyVIEieH*^&BzV~orGV@L1H z4({w9dKi;P+ivTBuIW~7I*=RYKXbUZzuR|edI!2(r5j_9gKHkY!?sU!Xc!SeTe5@V z+jv#C$k5!`%kYU0i%A%Qy1s1Z;LgK`d;4%k{L2~^Po>{p^RV^%;eoyZk@QHmzv;fZ z!7f_v%VC$JM;UivGjMoV2Hp;BW^iB_PbJ%WN>8u4adY+v-0dVl+ru(*7%41`qi4E$ zolGsc&MxchZbFK4Q^ktty{u{ANJIbdV6V(46d0-_9308s{cx{U?@&)y?|y=z!Nd9g z(C}avOMsIy2CvIR}ZFiSg%pA=g?K+wx(<)Tx@a>uA19c7c z2b&v+qxDMb?2_82EygQ?k@3|1O0uy{f=p8_qMI^sClnAV$F);{i1;>$Ifrn|b{G45#Zr9(N8)j5&WZ*i z{4N#|X6La!nFVmusg0v&3!6OX)(aP2tcx*2`;Q$a7#cS|nYMa{hf z5)AO0;lY7E8EO6#4-djzU*7<0(!ddGWgTPhM=+D{*gr5d+}kx|dWU3YIMXaK(^lt5 zLs@YPfvkSBV23{^^9Uxf@eMPXc}y=h>bau2PQ1N$_z{sX zGnhTxJK{!4I_vN1biEsw9ze+5 z59^>{I;@+^4k8g@8Fy^73vKHF;aP)l5ogdy)V}q`0zXy>x(ArCE!M-$z>stD7VCR1 z_8*cRkT&&EScht7pUhHgQ)^}h9ih80{NN)EgM(~=Si;1}5?f?4gaJM~4sFcr?U9lkFF-#|E=*Ci{SduZhnN$;!WHZ+-jjRxwalXaDYj!KPzG z?V&#UH-`ta64rJjUye25$Rqok#No*j2_$yfVG%3gGP0ZUTN(*)hTe$}ObyuuF?VDs z!O}x@#|CBSqB&hdyz@IE=Mn^5S$(ukv^!ye+}m7NCsOM`9Z(OGH9*W}mkzu=TEwMh z=aJAi3qof0q4w-hdzUQwv}eS^@(0b(1HCyEWq}!Bj^a8b1ozIi{~-y6G_)RIjdQef z#F|j^WUmu%?x-nVuF@|Je$KK!Qf#@&&VyY8or8Fhtc?;I2HRyOMbTNu)WxhGHz)8$ zgp>g?IKwfvN;$&$@ZCL~!!4|({jwQo&UR(t76(OCIM!!pfeq!dXEU!vqlte=T*ylOr5WI2QCX8joa$blsEKX^qG%bN%new|C+S zH1m6MNN?5H>veQwC$@C|Eq>qvGs?O-W_MS)o=5WC-FhY4T^|Ow${}LdZ3JADXdD=3 zFEYqh7}Le!Q#a0j*BIA&z-lJeA;^atL4P#BXS0KJi9_{roZH39yOpIIWxv}UD%b`4 z$iz-moxESRbwdPV*>d8WoSd@t*~6XqXcRAG`De#zcYufOqF8MIqJ3_akirIrgH-1* zt4BXxz!{~;#)<`bu#2h0cOR}TUd!UaR^(XM@ZN6oplnXuPR_+{v7*?taBRiBT|g5F z#a-PdCX(OoAd4(Y0}Wk0mLpBvfyKKX8M`=#?v~Sxu5?H#`xK;fn|&ggbZjTFSjQbJ zWzCfRIMqa$ZhNj2kaso-ogW^%y9iM@`B9e4)`5Y(A=xSHYOQaKUBeG3to9Ccxnnf+ zJ=vlC1A5|7S)x^&5XQ`i)YyBJ9?a34J%_XO6rQd8_S0^}4&b!*++xpod3&XU_KFAOE#aqoqd+8ouu7E5478pp;*!`zr(#8 z@w~xhbC(}{s3zw+H3G*2Sq-9qr8fokhM=zdKB^Hh+?7C)&6k=&#FdH2!aT?U%5NhJ z4W}VvtHEaMo|anH$CP&NaoQP`A-9ih(R2Jxj)+5cS(Sy&&iEGYoI2T=$9Ex~2La1Y zLs{2{J6ot_5AHV9V1f+6)vmDl@m7rJ_f2{-+uJYKPVA35dk5{=$nG&@D?P*&L$0rP zSUkr$4Wky_&opP5mv#%XyUQOE`?)RPE=>Y#6rCbBEMi~p%teYc1bWkZE;7^N9fMse z4RN=V~-O|Ub~5mkA!Bp^N89)M#2RU`Uy1f zhdjGIXzcCgT1)qsEN%7o?BBU>Zykbp%Q|!9A1URsCa-0&$a#xXK$Mo);+8{pjq&hD zvDL1H(LT$%kRCdye>it+n7tn>l07Oql?t|U`MWl^m5l;rkpb~nBEtj6xKkR8PgNWe zhI-o{;%1=zuvvt?+&1}l4bw0lax)-`h|~~W!4L_fi^IHQ97;OrZjMGx<~@;v zk>$K4wsto%0Y9$l?Cc!av$K7FTdOIeklz^$%bBbXAM#=~$VEY&>_7?3TzR>$%*7n1 z4MKMBJK3Ab@us0kqKpV)S0@>q!j0yxfq^JO+cht~0&)B9f!4uZ&T`!0b@n~-&g|gb zy~91SM#Iak&wj08l8cYaB8F4yX_GtkXanW8|M5ixqRCc5W2d-@4=r}7Mm;M*`w$^S zWYjGX{ZVfyGIccE?id!u3f;ldiwh9K%-_vMm3)s}T?N-7Vknu%-rmgvJi_QdVndgN zJ$tDw7Vs;U?K<+~nmBeu-W6}`qrRPh(wD4gOZO{IhW!Hsxct4Jy&e>hjCC_fz)5Zb7?{^L}Xm-CA9&(M{a=Y6Dv6-7uTu50j5jAu&NIY(j zgMm1f4PAaT_YMs|-0OV8wBPYiyZ3=QZq{Yd*C}J!+M5aYI3T<}m&LW4vz}Zlyzj%h|o!`1N{f|ZX~kY(wiQ41CJ|-kH@ED*{JE@-QC$c%m8vGVf)YSs&jBC8{Nvg zwbnMZcR(BiWm{$K_%P>hyZzhUT#~06oG&Dd+UVlFw#GT+d!i>%rO&b2Qn> zkg9>x>&0o|7PETDES#eC3et?yrPrv;mav_H}Zp`YN}V zH)|X&BEXjDBIRK>zIuy{>$usYe{o_E+O(lo#gfIEe0 zq{33}vK8FhZwRbxkldiR^I++|AlmpXsZ8yxK6%SOV8|1+R)VlRPosagK>IlnUSBue zXCmve588dK-&)b#`>13($Lu=%khOZ@wqi*nQOzXkMfZd@6c;mc6g+Xh;9g7jN8w!w z2iz&*n zv-z_-K#4c8=ecoT;=X=FByw`~Gk8p%XLj~whq~C&*fzpOPWdtm)q1iFW#maHb|P0U zL5Mc;_-S8euend|QKLtHQa4^KI0EK^rwTUyVWi+DFj|1Trv)|~!o)Ix+=#GKYR>XF zuHSBThunRH4P!E8qiEO4&d>*yZVBS{qQYKl=R_s{*i*Lwez~^+>VLI&zA;u6R{)>6 z_x)M+EwalJMOg4@sbcHC$1Y$IN!gaIf+ZFO1X|iLhdL{F^gp z=FXgV-`ttG>dNHa^2fTwiQ!FSajeYp*vquUN4(KmX=i*I%1oR9IYSH{}w_{M+OF&2Bc1AIJQ9 z*2eJA-aC?Sg~;Q2rG8mQvNXTA(AL)4R%l^&=OM8|=u%cHF3sJTTh+{Jo@N`@<#M2D3z}w^gYeR;nwQkGnD8=N<7I0+ zRwa2Q2(sq0fD*}dO~b0@d`=YAv%JzPVofG%>#9gY&Wga)oMm&sG^`R0)2=p>G#2dg zhMFodz9S>jO*M59wV6K0wl&{w*Jn27Hl1_n*a{-TmcKQHOnTD_&u+f@2&hvJh<1V!5{JSTDM@VZ}m0XdaW5 zVjo;t2}AaL&KcA?vb)mC6o+__c3g%pm!ZyKTYA724UkInj7^f|RY?E#N^dFe@N}68 z8VB3DDsO9F_b_L_IA%g3;}}sIcRf7nvPD^kR5PpMx~yi?%S2AfaV8QQQz}`~r9&pN z8E>SP7q7o<)u{OL=pGhJUK_9V*!RFP@%n&%A9QNm>6!O|EsfU)^oO8(qEu=di!*44 zx>)XFxp!Ya5K^J+#wsgN@>NRG$W-SB{;cqJ#MDLh0h;*UbRV4t<3a56(WeZ}x3`9- zOa{SUBKTl-1oE$dHf4Fm9@&S;@G9To+Q8x}9{wWBu9xWEDQ>ObfGqOk2O!>pQ?u`I z^jmzaz9P7w_3SzG(D0B0<72ss@OzLvo-2vKRt0$jZR3&{kSi?!>_x$;T&b-JR%+Br zg4$jc*d+qnG}|r_a9|J6b|v-7)SCA6_GuoFZtSAnVB%fT~;@2hsyR@qsv=kFF2YAA^Osux;K4hVC8XEK?_&b_{0l+7U1FUyG@q+V! zC$A8a_{8)jo&q7dMSNoP_m7=Vluf_7@i*1>|KSs@J{NwlPj{|UMMeHSNTDgI}jb>OM^!kr#G?bEZDI@ViPYPyqSVI|j2<_0uv@OUFfdkMYd@#Bv>{HaYY zeKtOGms7d()HO;f&v&BbMROg#EIqp~@^+qY$9ON=LV)hfr| z3e=%ljcz&$e^KK2=x9*TGPOs75N%$tsLEPDO`0=eTtBewX??Idt%PhmW};h7P&TJT&f8 zuW#snr+?@HPe1DA-*WU_UT)Wuj=t;Z7S+4!gy+BD(^Eb@y}|L%YLDOxv*Iwu{$~!u z`H1RnHt|1VjAQ;dQR^?Fs*^VXSyemt4u3!#t;u2CN*_#>y&BY{w9^Zj$yD7 z+41+tihRmMcexZ@CgRWg#4v6$eTP&1hsi3&*aHdt5ct^yet|N0KnU_lMbR?s)rX%1 zRm}NM^{<&kzvx-Qo?T7EOaaB(Xr-|{R*{&vLqUixkO!OW4w6o3Mg;?tRx#!rr=C1{UPm^O{e3CJ+ zB+=)NP*}c(+v~uSefT_PcGmdSk`4hKsnIP>MBdE0!>QYJY@G!^ul(BukH?4!y;VK% z=~gndcrJ3>(+J`LLpTBOf*YSNU^=&eTO8F98ha(v z{8!-8CV`8ysfHGP3II*Z==*bRp3_SxUwCQSS^0hrAjy}B%IH>NvGzB`^ShJ!?Gs@t zor*l~C(Z#+g-LYaSN)VZ;5%XZ9L<}m)7>BshNwgM{!dG z|BT`gz4~?xeD_?E;N#QHTh#dit$dJ_K`po1LYBXm)$l&$^fzK7dC@07OVuC-(AUKO ziLccGD}3&*Iua5M?^o_9(r3_ztr3I4g<3DDL8icqnOKl~1*{V- z=(g){1Vmvw%TT4j?ty-C1lu6VCbNPbsQ@Bx#7$wxR*dOktA7DA!j$D??Xwnd2rqc>royeBmJI9KK+gpa?K@P9uu!x08Qk? zo*=gnI3`|Y?Ba1_B+e6CLJ0M^k#gUKh`vn^86(lGA&NfvZzTFeb`^3Lm1Z|Fo+PGj z0++f;5IK>*1G(1}*6&iux2dv+JfEam-|Zfz+};z$NHk?)QeOl3h?o1K`;OJN4vKly z%QbnP$lXa4J2U+9;X{b&DXYOl5c?#2o9N`^oS8Jy$n0e`1i9}*336MI+X6nLD&^`S z=nse@$Nyu#la(gg*Ov&x2l|GFA8{4ASkD{E_Wl~UQ914+pgC=M9#(m z4?$$4zV{R59-)u(J+pGgr|s}G64fPT|AOet6?h^U^gWi4TZY^+@X6$!NXT^}*O|}(Sk?Cwu;iz{Ck`Ta zkT-?g=W6Ki&|gTUAG(m0vsbS^4kDA=w-CiXX?Nz<(Pd1YNNc~1?yHU|>@Lz468=UE zFc!>t9GtOK4T1L(lmH_)_YTzGP?f6j&QFxPlK#`M?ce28RYG6u8<_swBy!Rh5_0X* zP8$<){(e}d>yvT|^Hf^$hTwJBc@Pr%e_xhlW9Ywud_ zt!g}j#;jzmm=phdiY1dRWaeV*Gnuj8?0^4nWjbT`DvX^$xZi<#2tOknE2ZL|E`>!L6)q)lbvRtosLVTLmgr-ac+D&k{mIPywPGNfkUM6qKH^U8 z*M-MQ*}~(+OxqJLOlsjdF;xpcR2FV1%b62@fwb_vSa?oNxQMa%i&Qa+#a|^P#Gj}5 zr=;mIHC{pS#Z)1&_%ga6PNQ}~+Zu1;SX3EpuI-R6ELPKx^ytB&YS{ou+M4i|R8!2iXj}B#j7sg; zcom}_EjrLPYx-jK(aK2EYx|T|rPr67Z?!;CCYGxG5^-&-S;!nj$uUf)wx_rki(FB> zKw{Chi(4*Mx>ZG*c4rY^SVYw@rut~7dhKN50gO;Pn_hX?v*i2os#B|?G~`|FYpv*_ zcJRNAe{f@L@Wr%0vj#Wj-=v*gtp2we=NBa-ZDNBPm;9t1EU(t~o__oF`YpY&e7h2= zwl|!pvcCu)G%RNnpDwLN+pFa^#>Y#Vp0QhNhy~-fE0~$Viyi4lV!4ey#<57(9-Ud_ z#va$RNN0S#Yw-Z7M>l-ghNUbPZjAR-@E0ZH|57A97>)8AgNqdu&teg0m`~%etlY-P&HuC!;9a_TU;ngLt+M!X-eJb> z_?t4usbVR&Dv1DZO%5mCM8hb9b(@eo8oL7PfiJAxSj@_u-6?f(%k=s$7BX!YCaPn} zIhyZG-&J~ZqMddjbNf75+j{G*J(9_YJ9TmMaB0hai9fY{Xe_M(dw_3&;hMf7xgfqW zsqNz%Io7rd#q$-Ou_2%0g$_;UwVQyb@UZw^M-LB+%4OLS3Rn0XdPTsYk62VW&(R~u ziX0U$N@I0RuRR=l+(Tn^eYjSYY|)XDEv_YPSDe@wGv!*ObVf>DQet&)vr&CU_8T%N zrQh}aI(5qEk}^Cx<%q@uIP4Ap?&E&L{elusy&7XSjeUX$&b5pDex6O#; z<Xg%~%A&~)7)(`atS5$`^&E$BICCi?_c^`dn#%W9v-gIqO*h)7 zzS)yfOH+H1cCNdee|>q|Ygt--#_^cqPf6*4Z*<4{Q;)8JLQc_BP;e4;p zJQt_s;w>p%4@H8dRi%g0>(h^M|OB%;uFM24Ab^#RTZqC(LO&=uT#Wb zzgdbX70h|A)$aJiPQh7Crn&IgQZ{tqai65^DJxu%zI$!9(Z1F0MZ4#FIHy0tGAa|< zYg-xZtHblVRfmhlDSgU{=9Px${Wli5y>Cg;LoC`1hp5;Iu>v09sBo~v=V&$ug5{xj z3$^TRpTrqEXM>zU{I@2ysuM=*=46aITP?AO%an|f)R+PW*j96t)DXV1B{l`<0O)E( zBt?IUP^sfCe7N8|d$pRj>L_sc)$G)&A&Zq#2e?#daeoOSrgVUWDp;8~#4R6-Ug3vS z)~e#WFKD{fk~56}OB}Cov-t1Hie!@WpQ`x!3yGgi*1ho9OQsO5)^Z-w_Q&sYYE_*7 z$aO!nc=-jbrlf}y@x&h$F?Y01u-b7fatK5I0b}5N^_z;7QoO1`s{v!)3Lbs3u{We| z#ZuNOJP&fYxCe`TydjH04=DC%;UdhXPixRF#J4s|x|UlM%PmT~pyd{3<<2Q=Qb8=< zGs!vMoqV{7TwWF?Tc+D=Ojw38EsZWY^u3)OHEMZ!>vFvXW!OWp2p=g+(1$eASbYtj|`J zh`0D&_1q?j6%SEKD{Rcz#wP;b>({;y$1@nFEP7nq41v&$7epxqvR{SZy269xZD{Pz zPJ@&Q`S3 zrH4wYor&LbGcQE0DLsR<%hCAow#B`qsK=YFMC9ZIN~rEiL`G4&G1V$1){Skacip0o z${9Ya=NCW8JvUvH*Wc**gq2pspGl4$lRH80dI-75yogMfvVNGSbT2YzCr2YMUY*<# zKa|{2H}Qg)w7v0i{t1xT+Nt=U3)u5a$I_X~Tgfq3S?;lA;|QYtVb(h~_?Q+x*(orN zY7h0%!Y3TWq^#s~Soma(%2+~1rRC{RDo-wN?pTI+3rE>KXG~3RyrmgoII+N`4(ur? zjJXXp;fsu|l@>SW{4XWqC^_$rLf`n~(cO_w>6IntuZYT}hr(LndF`}W=89-*Y@Vj! zM=PVsYDyf9c+)ErN9tZ<-KEIw|D_quQ*t0kBE!t&anYMmv)SU25^pwb@yKMjreXZ8>zFjtz&Wl<#&R2C;fvZW8vk}%i{iR5oumFUgD@|2NP%d;?L2#`QRLBTca{(;HMe58s{@pwOzG`_-gKo zALPcz$mLx~+mW%mygFlB`jOObS4UcL9bVe0bx&Qa_Jd7=Dg3KsGxbgUvJ6FaX$J^t zD__awU5TrA>6N3}s*4X{3%rjl@ZN-k1E-~zYA&cAkEvqt5g)3@uTg89_!6cs+8vcM zDgluTT(g6uI}(5S{K5-ND#&`HCxO|>Y~E$*$&w30qsp2J&a|59 za3jmk*j@5_qt;N8bQZ`JPL}0-NiJ*}>+*uUs6Kj=*5xHR*5x@l(Xj^U*tw^ce6O9x z@j-q(P1UM!nr?~p_lR2ZaukjzsP}y_wnEem)wnl5Z$U(E^PqPh?=kTd{z{1@)y_5! zXu|(CaZHi5=s=`3I@zz)lvj=V;JrsH51r58hwJ?&nAy98pc-1yLW(obUAzL0@4{pC zZ0PV2+@RYykZDzAVNZNba>F>rBYw|@&RAvW!633=Sw#F9mC!(FC=!MydTm%G@tm(4 z{v$Ph(Ot5|sa12oaIA1ftCQ}+BJeJ2-9=~Of+(Pjg|n#nkju`S-xw=u*VPq32R3{=>Mt#~q) z`&c~g#Q-%Gjg}3bgTX!&%Xt(~Se83)Xe|6#Jm44K78w@{mwv3oA3hsvu|jqPSxHrB zPrNL5v9v2=TP)`>sfK^JHxSDy#F{t6ll-*E@kx{{oRKV?l`OnJS$JQvu&6A&SWIT1 zXZ)UE$(BGYJTKl?!3Go}(o`*A=?`&XH}dr=Io6_Va6?({(XyPQ742DdI59k)5sKv= z%h)||U@Y7q?P;>Byb`CoH{ToFt{qz8V)3Bst`WnbW0Y5B92m%T?eZ%Ax77g^8+|CY zZv4245}LmDR-THzd0@VhQI(M6n;@=58MLwuWrjJm&9`M7fQ1knB5Qm4W$rIfpxre| z+h1O(?JygK1b;87qHnHNJfm{62%R)%@lw^^ci3|o^%=>GZ3#CYQ>qr!HuGJOpTvGU zZXRKiP?aB%_=2N0o-G{7q=E;I4TGj3N1{fBjq^uT@v%5ZqU3#9Inb;h= z_Z&*qW?ws0JB_6bUyMhB@tc$J*^U2vxLGOc%G?!EGEYW_+N~`PrXMdkHz?8-Lx?}t zh`-1wuga+Bb5&j`ZBEth5avv_jPVrsDk`LS(Vwf6T$AU!xHlhl@5J-vm1}R~`g3A2 zG#giWjY;9#T9sE@Il=PHn6+3tlhpP@=p5$`g1YU0S2ShucFupe*U%U~(EQjTT~cG& zH)YmF9X&2(kvkzC;gjeI11#Lw4`y?DO*pl5RLhbJ&F9r^XwI~1X>Xz#7FsBuNfzOn z*)~_WFTM-yRiKvb&fpsqWFg`P#n#1?K~~e?T9R117zz zn;P+GKlS4x>`cZ1ZC|eNWH`aEplttFMZi+4M`(I{XP{&OjPZ6*2q~i0WP2Wi@Dti0 zCopXe0E15Ei4Q!lWpf9}B_g9N+Xt<%0ZCjjOyI8*8ktg)4GE&D7K697&l+%7R^ML@ zMTQkmQU9p#@1)3pl6i2G^@`0?Vs{XB;>}znN3Yj*Xy;@7UGcjDrqb)s!i|X_x(!zN z7}`lDIMJ+{63u|=@uIfJtw)+`wQx&F?CgHDclJQZ zewd4}){@Zx=Y4L`7H=rlU#aQON6oz_LbCIdUEK3EnMIloANp0oIV$J2{sV?!6P0XH zbVx?H2*Gd$#=5k2VBfeit7kj1`YZXD3W4OaNjF3eA6)bV7ftc5l7{kGkWU4^{}fC@ z+6e#O@ElVb=W+i@qC-i~uEZj(weLH%=t8kBU8(lGw3ll`a(sT0%lHzVVk%~4uP7OH zaYp`jL&Cj5W?Y_6^J_XcS-JY$Ttkyq9j$Fwf_9Tp$ve#%HLPv<_t0$nl~l_4Jv%gR zaI&;rf3@1yeyg+#YWVCwpijUDg6; zR7O?Vp(!I`<0&>@bTOXBqW#1?^t`|cr9Y4rrP(uL3z}y(=HHtLq7)*zWeY-CvzyM& zN!uO6sD}jloc;5*%&i4i#YXwkwo8?n+h-mW%EL@HYL?9YWkmNtfv1d{->V*X~2%3cTtp@US%I5$BeHW)aS2Z}&{!d``8h{KJeUq?wUr(-Qks$?uNG~lb_ zryH@QkSmUQ8iA5yyO?^CNT zVy~R*qY2Lozac2g^~BVnQ23ICu4JJTJRt4_Uvk;5e!+5;SYbd2mK69|!-+Goa47vq zhY~G(aWPDoQ=V|sP08e1_`zE329vB>v~2<5?A6qVLvmy+*A#Q0RS^{9=%D&=6D86b zIVoVM7uNRVbt>R%o_+#+rS2RQ3(Znv_UK?Q{j}k6~}abnIEQZN4M^(W%5&#oJS~)9LjUl9jb+ z+q~bQa6&`m*HV0{b>`kZr?q?A93|eD>1X$w68#o-_WQH@ zO1?*miSBK4o7$PJA^Sx!Jsz~9c5(N%Xq$nNOZ!FAGxyAP^DUdU`|Rl_&z^=`c6-`3 zJ+n5ybu^Tz&-SJ5)AY1$X}fXIIUacW@$LGZIiu3*wX@n^(t#%1@|z7n>Az+xU}k?b zG^uZr95m;O+WoZ$()P95{#X79Nu>B{>uL{3`HLJ;@j`{u_QDU! zZ_$)~II=>4v!=@hWit1oHn;(nxe|jmAoM9PpXS=0gcsL-!;kjv*G~#Jmh@uLlSyEa zk43yOC7yZIAv0twdqoDL3~J%?;C|dM7Gm*-Phy9403CnuBs7J}XlrI=?Q-*);$t{7_WZGApLQ-*r|pYf z67QJQ^z7_@CAdKR1NufkF(_9V9DL2=8|q-)LzQU}4kvu5CH0M$*M-AURg7zxCrZv2 z6}IF$u6h)1(^&4s_+>}&nUB@iO@|-G!|jR28g(h#6Bk>f%E_!dJAPvaZC&ce8*h&b zRzPcvrg{7o2!L={(|L*u4w-64O5!)Dox@tSw{?x%OIw;7F3`?sUr+$o zk^`o8;*#!OGve#+L8Kp?WgEt`wQi%mX=C)AI3?wtnfcQvMp9egwiWZ^-a_MYeG#s?#YZ5DH+?& z!l}jYthK;MxqMUH>#oIKOzS?fPY` z?UJqK`%bTDw<%qU6)G__ae758(49&)heYv|SlAa(?6EAsy)A;leDT>+oq1%Um&8sOI#DXB{qQ|gkX;Lj&h^a74>Ca$PX;M@E#Sw z84hJKP41(eh64PJw$&2GnvQ}g(Mx05u6S?$L?ZzEGzDpDlv}E}P__jvzZHROIT*iL zT3H-vwVL3P*bN;9^2icIj(FqIL_02k&OuI@x=l4?X*{z5dY_NQ@B0-D-1Y^VbISdh zVC>*xDlGbziNqi9T!D9LoqsYRKz2fX@5d#`RTt|>bTqZ z6HgRQp;8Vu1s8?fZ-q+^t!mjSS!=OM9;3_9%ef0ntIBfrr-DHI-9xzhOu|US_1-O* zUjK(nLc!<!Wrul;wF3Zn6fFLiejUaX?x2n;h;#3`HFvT)C%h}cNC6++LX2fS2mY($8j5| zCnXo)eA-B??mDUNMyVc#YqV=>Y@C9tGyrM2=a(GF+!wu?Tf&JDlv5{sfl7WWUVnmu zzv3qK_k^qNSyorZOlKin3a(W6(IADK=n)n`mOo$Zpv$FJSrS z5usR7JxZlY{%Yst4u(3Z@Rgv_&2>*R`DT>QMKK%@j0&CwLHXdgMGOhEkzOBjq)Mu& zotP-?O!L>ZNy4~Ij7r;&Uh@Z|1MR2cZBofjNxG1#-K^!-LrjWqYcCvSq0GJf+eRw+ zkl3m4BJpqI{<7b3<4_;VsmEkiQEIZkFWyAq9!-+z9+I>PhiH=5{1 zQ{8B$8_jj&65VK_8!dI?Qr&2!8?ANYGTmsS8<*=wTis}<8!5WcUN^4LjVpDdgI-ro zb@HQ8zm2#bmJb~xK}ss(~YURaldXnpc~V4W4dn4(2be8F-tcd)Qx=IDA0|F zZbWsXP&a1l#vI+4s~ZpL#>2WXPdDc4Mv-nT(2ZilVNcwIN%(2Zrf@uqGp*Nqjr@s@79tsC#?#!B6IS2y0%jrVoq1Ks#gH&*G! zN4l|EH$K*lHM;RH-B_y|>vZE2-S|{DDs*GLZfwwvjk@ufZhWpAU+Bgr-Kf-!&AL&g z8@g_6(Ty*4qgpp=bYrV-Y}1YHy0JqyzS0dtH+JgA*SfJwH)?fbw{Gmwjc;`0Tiw{J z8{g^1KHb=_8{g~30p0jPH-6NOpLFA(ZXD8$pLOFG-8ifpM|9&?-S|y6e%Fn-Zq(_< zQQb)B#xdPEt{W$G;}6|9sT+Ul#wp!6ts7@_<1gK)*NwBf(V!dWbmP2kT+oe+y79Me zH0nlDH?As>Up=S4itJQ72DL&w2?48h#b+@H^}U>#`?&XAJ4_j2ETNP4*`EQ;!$ZHn-Z#pGR=zr>+N7M{cuoXKb@2-{aQB8NV-% z9Bq5Xfw)nJ*oa{eed0D!`vWBSxHH}cUT?i_^6yZd*7h+SO7P0G`gsiZ-*JtJE2Pk2 zptff0PP70!UNpoR@%8;@fYWD~mlCUOI?wL4sTHcgyj19=opP8SMj%S7`1<}d(rQCz` z6r@aR2%|XKjtY7}jf`aR&0f>Wl~2Z8Hid zPMbOc0KOn6pj&x}r+k}`Ah#V4C{ z&pJ<@Ih~2g{$Cj4|8qVtmnjpcp^J%;JagU)BKgtDktiOA!ijqYyOssn{Vbm?VQ;dv zYzy1V;_M7_N-d>MQZH$gbieel^n%R)_n&)5#C`uG<^Ll=`Y-8tFY+HWG2CSR^G{~~ z*$pwMMgLd+o5-Z5FfZMbOP|Evodp8=Zp*!2gqucZ+r zVo)vIj2&sta~Rv#!o)3z^YNVFiTL+{H8_r+T5+BZ_ZXgkGxl;zv!0FYc9Z61?0^4J z%})AX;?`&QPLbGv6m#6STcyRg@e7Q8NFRu_4pzEZiuc0z8?TGiKsmFo#;TD9h2$=|A zy(|l%J3igh2>{5r!ZPMHq%K z9AN~)NQ65Pau7x#+=Vb2VGP1pgmDPt5poeGAl!{G5n&R-WP~XQc?kC)+>3A@!c>I& z5gtI8hAZOzp>* z))ko2@tDqwn97-$#_KVKmtp$KFl`TF%BEwgzQz>I#?&n8hs#Dx$tFxk6HLSVn1W^a z{Jr?xrTDz1_^dPdoE;eUTNv(g472x4tUv){=c6b$8!Pb;ZY>|i?9OK_e*t#XBa9V3 z%2-UpNquff-QZqLBzAQ(iK(G?19WmY;kf-2pqD4Ap}GKF6!f_OtplC3^Fxe2M6u?K zJ_20IXbqqZqji83MxO#YFxmjPhSBGMYZ+An(iv?9+{9=Ppev&TfXgI`k5xnKB&)M8 ziJlmzhF*~^dWB4f#;I(bOh*BROzi>96bb_-Df9x$zNDCCLk~HuN{=|`$y_y5VbePu z^fBm3PAmUGC!I$9lTK;`VNZ@RofY(-Q<~|vIpGMae^B9!cCzOe6FkAbQ|a^JQm&A zLocG(a1XtVER*UCNbrRR|A_tD3I z_CA`$sQ^`@(53dOrUmFI=6v=e;Ju2I&&@jM$g&qMMbI`x; z!D`uG?lQkTV1IcVC+$VCbf;*y&PgXgIaF$Tuga#Y)CCY%X)<7>iyj9&;Gz!!n_NWq zscf%F9e2@QB#v{7A_Z2{S-%~0Ri$(RoTG+bq0ij^eo_pAngEr7?7Upr?QU&(p!La z0cjmzeL(sW@OeOT_E*{FfOHAq%YbwzU|T@C8(;*anSk1WR0J0zxZ|X2ae_k^ae#*L zNUI=q;AcA2E=XNPD_?~KL zcaWZ`;++0Kkgmz)eg0-e*zq7;HBDvbgLLf-6}ltchl#q6(LullCMI!+BqlLm5|j9& zL{0Bk*-?qQ1I|kH$o*xEIvWSc5|h6%KKJ?9q`j9sC)>milQg{ zbd89dwIdXut|G-1Fw3x%0DXiyS6OtZt5t%H4@m#&rLu_uX%`?bAiaQ{HZ>rv089@^ z`;quyK+5i|vS>ic0n80Z_WQYiN!HT0EYoyza+{J28* zBjbdf@wZ|f@=F~SYxvM%HU0_S!inv<*_wV07(a}Mw^P0=7~uP z+RV9?lhz~SYNu7diygVmjtqBNeT=muQ=HUXEZ#$QnMF=(ITzbyUbIt|*(ocX6cV+n z?X104gdGy1A=Kcscvmyk`p^$l>qFP8)*!a3)<6%~k>62Rw0qo+K$|jCTG^2_E5dGc z5yNKb4elW3VTcuBxh_6kp(5mq35~hTZ)B@n^Z_>8Iv1s&;%>X41{ZY!{kKg&>!!A# zSGvuvQG?!@CA8at4?=lj^kjhwJCDW{s-at%HNHWJh#fu~itcRmZf9(@B5Wsg-q|Yq zfzesy-z-`DIxJbk941*!jkQxIN!H>N+gVGk2zyDQj&sz|Taqa&m@d&o(BDY(2H&CV z2Z^SDK5o;0Ni-F-lg#{(pRCSqu_OJg2pdQ=4n^;_in6Ih)8|01B6=Lj3(1m2PuLaT zuq%E+^d1WCAleRq;>YJ9Vdvf~Q;WH3C`-0F9%4nqs#HQsG)yJ>c0ffZqox<#*RY794e?N*7)FY%vi@9>K?Duf+mWy?i{ZyH~K6+dyGX274{`G8)B%(Kp%4j|E#Gcr<&$ zOPw&b4K@eA#z!MS-)IZzTYdC6=s~u0e%41-#VT9wqrHF)KH3V{?4zA1G}&+M%15BW z3C&5fBJ5Q^NehMb2v#1N$}Ar83=~~a@Eo&Pf4W4a^Hp}6M9%}JOH>9}BvA?A4T+ut zyd%+PfXxye1MI{J!6`p2S+n3FF$*`4Sc77++TB3Zxd@Vps0ZM0qAmcpEZS`;)7_vl zWO^3RQx*;8!EzBYZJsO|gt^LP+G*KpFh!wnQM!*pO%_0gE7TcKs?cb_vx;b91H^@B zqE-=2oKr*-{T*f#p^=u%UAl6zN~VIhJLUca+v32plvYUuz><$3*ka9ol9tevmh`A0l7 z9r*z-FBVGoS~~PtFGWDV?X{Zu(o01smh@67ppTE91ia!CZGYV<0PNBhXN0^7wQ z?kMvk9U5To`x&x0+fiAZZLo16kwUN8k=1r&pH(AtLZ+ocuS(ih|D_7ugs$4!degOb z4L4HyGc z0+1V!wgDyuq;CQD1f-t<_XniofEfYlQS6fZfV31)7?55BJQR>RJ^>#@Kzb9@BLS%& zsK)}*IKbk76a|#SAOSpu3QJY?9BgyIO9AO)z-s~NbHJMcX)oaIfb<98y@2F;5)%@T zIs?|gI0AeUknRF(2uM=^U!Z9~70f6=bwJt<*dCBh0(J(Z_D`v7cR(5h*b8e4@I8zp zz)u0`S->v=X*J+Cyxs&H4M;x#P6VVl;1uTNX_eJuUI6C<(rtjofHVg{LFpraGbk0} zYdt|RvOrLbtZ7h;tVK||9IM&dgtjJJVM3}29Zl$L!VM;LF`=6Yxu(HVV43yo;~;g% z%+v9CI)P;7*cf>{5%eUuKE z?xU+7#aQh^kNRl96T&B8Zu=K~v>5a|w)(NkM;lRXtB;<23|=1}-3RJ7A1wzQ_fajN z+Apn!INa`+Mq*WV`la^)yZzEyz+S)fIpBN0R1NsaFYN*R;+Osg{N|T}SgNCb={mp( zztjbA$}jZ-)cd8ufb)K7JfP7pEdfwK!pUaNfHeG3EI+msAP|sN0h$J+gMbzRDFJ8= zt6fuB+kn(-iOR0P-UXy$?*cjoq*;K@$ip$bAs`I}bb;*;=mtj=pl3jO7|=H$y$1*f zBpq-&wkhB$7u~X04fS+ci-A);2J|?ao(%B_y3nTQ3z{u<(F!ELU?;!sqHjQdXwwj; ze}IPQR)qDl%|%UOYUn$ghD^N)^f8-0?V@)})R5%1%DdcD1sa0Ytbe(ieg=J$O~X$* z3iWTZ>7j0NV;@Ym>HFQ3kNi0{4JG_F&}BCLjGH!re#fR)x#_o<$~L;`Z@^YJwZfc! z>!!>l*tm9~zubh056K>DP#zBzfxg_PJHQtY8tS?^=)NA>h-RR!??du={SbV?d13HAEW~PxlJ1$nhhEbeY5q`9(oD1$39j~ytEER_ zAphfPsL?L#aZ)GHm)b(Kos&jCj_V^QJ%r?2?BsqzX`XRa0f}3B5$Y(BTcx=gmEU^ zZNd~2?lWPU3A0Rym@vnLc_tK_@Tdu;CM+>wDM{_o?K394V8SaVykWu$6IPP+H@@!! zlANfp+JvQiLyB@8_%TZYZEGG}V+P3Xgbk7Ulm z@Sl<7oQiFex!_`ZMHO~frr#iXnkvH0n59q`ct8>d9_!l7hiZSts15lS1;h7HZQ=x_X_pmcduASTu*WJf|=@tYN{74d}5R2`>ah; z0@VeRyjmnP-A85U7k3t)1Ag?;LBLTnPZAebp>Fm~E8N-qcI2)AjeJE7?om7UPba;BWEG4F&|JlXVhAdmKXp<`eohVH ze$-s4-YT^PJ=mu2RH+;2$u@nzN|Qj(vFQcihoE8jnDw7gX%*--?4=}+=Ujm$r&VV1_36I(2WlT(38nY%1 zPjxs4>}kI^7{J7&4L4sHOu_vyrtkqKCM}##L{49Y1_4wDRRQ3++yR*5 zpg#bAIp{0^`W$-=Kk9Xo6L7mz6mGHpjgQ;}3=a-~t5Sau_u}^Xh`7`RJwPDm!GdbC{cF(HyvX3VLkgr))r; z`8XlpPp^Yo;HNEsN#+&h%m6ildNe@Y-r)DMG#cO!(j36mLHYnNJxIR;N=z~S4($77 z@WltMDZ<1zV36gEZp7%;GBL=FjD7@F#b^@7_O-|hon+Q4BS{kPV6Kzs0CKlUbQ&;- z$h!j9BV>IS-ukp(0X>%J9>CWm7UmoKihs6DHAsF`7EZ=zWU2$TLl(Y9xca!~@i&=P zA+e1@j<;~Ptxzk#42A9h6exTTgoz9h#($~~b zC(EaY|J0G#I-N(u+~8dGHf{htl!w-?wVz^TdZ+-&({X!)WW3NapKmO-^PlsGYB1>d zwr=jFG3dLk*D99owFU*n1+9l-Hoe^|mITipUU>(M+1xM%elbgPtOp8gV34*TcOBl9 zpzWbdEWvmtW_tz`vrxdSZSfSN!zlYUxcExwjdt=kc%AqNc#2u+6cg*#O%f~hxg=(L z2W}5n3ijU-(881gR}wu5Djn;OuD>!9_men?znO_}4fDmiMW)Rt*&DBx_b_hAcfge@Ed!*(e+n3H@{uA{G=OUllgr$O+l%*A1`&Si`!I1W&wl6$ zH>Gaj_p7hCsRa4Ixy20|RA63=S)Tb&H?LJJ+bfE_<`u;bdT9+R1)%K#E{CrQ0H^$$ zA3&Az)2{$L1mT~R9iTQJs%&(CIw5g!fbIq0?NS;N2M1{iKnv0#!1X4RoyCOP{}D!S zAu&&)_N!F(f<##WJi^HV;9hnP;76h(00*SuN7&0UjRcg*v41-%bQ55mlWqZQ zbW%6KW+(Lk)WE35WS%xD*w%fKI8&uC0A}(tfWs=i0Dw{ZGT>Sl{R()%MeWw$Ue85i z0UxN>j5R z>k}Ua|KY!o*vT)b*G#~T$zdcm570Tl7(A9-tFp>~nE68ix*Al!AoT*=7Np?-9MW3> zUj{{yc78g)0eOB(--wa<#f{=lKNW&HXu@efm4b2v1Y8oJ1)$nthX5YH^Gm=&GZFt4 zZ=Ux`fXVrh>yR{>WL9RS=#)bta`8$28UY$19DaGGc@pc}6JKgI0I zGzg&LDGinbdQ>T>xe6Ue(;q3K=^Zd!*QufT4ocPe5z`!EOMm1Lla5z0d?BH`Y(Y)v zE~fwyC#68;4=kd!<``RoOnT)DQ53R~iC11=1%>~YiF*OZyix%GF7_4}*<(Js1AvEgj|1v_R0(Lxq}A99lNlYsUU-~Im7vx! zdh>HsXS5f9CoJk07=%Q5D1sL!9|J}ZU5UKOunhpUM1xTT%;s^xl``!D490_xO<;U7 z%>=w6OS{nYT3I>-sFbN!B|Ppj%?EfDssLP2=u4D@=qFG&;t|VcXw**11gwI44v;W8 z5FQy-fx;7`LjWjwd|$v>-Mk7P=At_Qt=#k!px7<)@Z|PuP!oLQ)p1GXqdkBZpvY}e z8D0_&0d>qrPXGdVYlg%uKaKhlO1_^S1L%GlhD1C-n+bRdM+~qgK-&R(0;HnISUjWz zKx11B$Pd!jfO)3k_GFOufZ7|RN!8eqj9vlYnw9^j^lr0i|D2@dp9vT9e=%KxUdp-0!;2jS=4OoSj&;WSBJM6%Q@rudD=_&>V&FC{g zo|pOnR>27a_ywnHC%mEd?YP@ViJf?N?4#oVT!V8t`iYOSz5+k>Q2{{p(?@_we)<}) z#!n{z2|V#M;4TlCT!Y;gpg{(|X{1L0Sj5%H&9L6&vI#-@8Od0`k?3V{kRpIhxNieI z$fzZt)YPY*HT9_v8MXTwrs_acrXC)LgWC(x@jE% z?uK6hAGoRc9xxg=jR8nrA#GZFX$GiaUYZYh)+@vloNZiK{R__*0H1s5e&k)^qiVnc zAKmZ`B#OC;8-276i39wiv0T4sEan%D;RJG7_q8c1_xnYgf11kjT6PXQ~fBYSwVUa@JNt00`N%s2f*7w@_!2k9He%D?Lq1c_#sGl0w5gc0X;in!80Uww~rR1UIyoiUs1-uC#DqyXLr0<2YaV6kY>|sE6yj%u= zE58ev;iL6{XM9uxu-t}KV9uawafJ#v?4v&c0lySt*gbw~djNMO_S@y|wvEuoPr1kl z+Zi*gC(P_IKaImjyk))z!Fk{|+BUy9N5{>?^CB?>6~xqwX9vhYmCphMZXF8R7Uz{g zQh&fM3({qP9zmJ_!29*-fKfOdfGI($0z3$ZBLEsl`yau-f;0&5LXaK?ycMK(0BeG@ z7l2dM>?eqqAY}vo2=Z4)_(2&h#q>92vf}N$df< z%H%uZDM{>)6_VI3pGaa0ZI#4^`biSoE7j!4HxYf0rXeCZZ<+|}dLOnPUQP0?N20>p zB&t`C*n!(gwD|+xprNA^B>ICs&v#%`JemP?!0%%KU1TxNTV*k7nBwVZ`Yl;Z!3J4O z!Pl~wf+MiBFa_siF$IvYd%Ki$?`biB9w|x-f6?zE`KB8Dph?ZIzp|=(5 zM+MK>E{1mJ7dKdYfT16FxlPuwRux;H>`L}XTg=84Ed0ju!^FlcxRdnZ8Gpz^Sw zHC!m_w~9A|P}O@2PfY|~^TV*LZ3Fyjx79`l9@UCgXWAw?uKs%+#)`UWCIEN(FQMW! z9V$O2*X}vZMCcK#N$~p_P;!|9sNx3(s{rP zFI{njYxgt^Q0t|~kHBpJ#ah&!=A)6~a|(U*1@ce%=x5|ZrMyezzivk|m^I2QX3ZY_ ztmfkPzWS5bMGV%51zvFgAuG(QM;o|AqN79#(k8b$2YKNWffiQT|T z(B2k@^w-U>7eiYelG=qwzH&$xM9MCQB#D%798xn8*=I+7up@^Yl3!#Uu~YtZNLzSy zhTs3afqpJJXf=S~O9J2*aeDyxMcgld=J?qt#xUAxP4OI?TP=Zy5hMQ6$!9urkG-$I z0|O8%{-bK{h!Ff6V)L=}xF$V{Z}iY>bPj=0_xTiXmPHW_WTa7jF+~6a^g3JaahjKH2~Y8X93RmC?DW9FCL*m zOcHzv8be_m4=3% zhpIP^|7v*u|Ib{{{qo^P$L5Fc|KfPSkNbJnj)Z9~={6f9bKy5jZet3i5Ee7xuV9i{1RKVx72X?eL0+6F zg&v1>_m$+0$=hutY~Qw9iiuu6{eoX%^sP_1ET4Y3e{mzy_rgBaSFeFCJwgX=XXB^)VcPObN?$6dGSB&YtKjKJ1lNz_MgQ>6gV#)VM?{_wagc1EGl1@$5 zgCC|(_-`1(Ux0W~lWh!<;rl(3@l95yYwR9Y6WuHNHLtGNv}HKMG5?YLM^_EZro$xn zR+!{+VUpWLlU#C4)xLvwWa!x+qO#)^|IVs}1QkH}Cj==hrb*fdHSU2mJL9K9gZ>(7 z9Z}QQMnT}e_Gf``{m8W9Y!FEa-3kfr zyxt$9N4Pr4>>P+gOmB6r+2LHVhw6XtKT*tag*WDDB>QEgbUi90$A{#skc`aeeotle zi5Q{%Ct{z*-<^FL|D`az_En=5_Eobh>XFjx5Nf!v}WP8a^7|vO%hTiM!hrs@^WIpM3^^>~)eh6bWqg<7p3ZlUx|pb754^*?*~QV$Q~pyq~jP zB%kE$Y?7rpyM$yJJ%HplJcYR*>WlBV+L2lJ8*B#hsbtTNfgj#c^=|wNYm)H&`xe#v z_;P;KxU!h`z6op=z=ZSP0VMy&o&gE6x9_m4iyBc5FX#`x`zgY~5)Ho`JImwy3XufR4>Df*!MCvXnZewrDz-c&J`upSvO`yfdf z%l>hajl(2xSeOKcR#o+FReOQF7sFhzvZ^|n1bm(Ahk^aHn*B~o*`f)f|E*#4f32ol zEvZ@Q4^}o&vxxlSpX2B-4U8lj0B`QGx^3_W-x=NWYFsL-cJJQ=NI@pzYJAOJAYsR8 zAjvo3o^5e&hNVm0#zAbGSXYXp81a+RC5iSAA583Yi0D8bCPDe(U;I%{yNT==ehd+} zQcs-e>~F5V4(o&i%x0~UQNUXy_<_zPL2a@ApWHpDG_cC?pAXf9|9m?$#*lY*Ml3gF zY!9yf7p{H{BMuuu{zgw_tv7kkWbMR1QF%w<2uo%EN?PRfF1qCO;xEcsYi>Lp^(G0! z#62WC!;;7o)Yks}BK`RL|AHmjUnrN@EQF;{ zv^gZ}6zvaMgVk5~d>ulcK8yG+@Lp83%Saw7+I=MKJw8f;esl^6##&F4b>a8$ip4k_taxD z_9@9Q0*{aowdJON3Q2|SK9a4`ApKKlpkxYfc}V!?C|DjL7f(q4A|~YQcdnkv+2(6B zUu?6c(BRWc$&qZ3w;doKn3tyX+`P5t>IycRNp22#cZctc-}*x8VJ~_w@)ib(c|_4( z|5q*!p#@k0`Cf;6xPQt$N_I57-AXo!1ed>=B)v@b%R-0)v0HZOi7LjTKyYw$t#*fjqvf zXPaHtv%Oc=vn>vJ_}ln~t}6RyYvfSe_zD|1;D+Zx3*q14Rg!2MZ5Y0MUr2Tji@igt zHdOpWQ1}Wk*!&^z38qTwHmutG5(m@rinT0ya3Qfb1lT*gQUG1Xs{)%=El(6FVp>Ff z^IKKhS(GJJ+g|`}Q82_gULl4W_t)%6WxU7kw7|zT`#@kBu^j|Z(f85P86|yC*St{Y zI}E*;*?4{r^&X%14sea&tZ=o(F-CYgDYnkP&e_2)G>HfCEYkbDpZ z%jJRmZ%S@-$fO_akc>Luxf&uHuV!q&tZxLiF6d8im9;f$8(TsC^CP7DCuU)J zsORP|1v^myk4a744OW$dMcFoIHws{)7=qB8h>F8g{HBq&s>|j59%17k{wOi_Nca94 zXXb5zC=9CF_VbR9YjIvyp~0Uf+vo-cA6tsTZx(pi7r9@QU68s2UMbl!fsaboChv=% zz}}Dm7TPlet|;3-0{EfrUhq7Vv8ECDwrtM`WGnWM02=~9m3ByC8>>_FVww|R2cW-t z2htK->(uiQ%AAS^kEJ$Hjjs}GE(&7yt^%E%9pgcQCZAW*xWtUZvMIA21`So8!2ssp z_y)XaF&-Q~#4%Y}KwTYj@6Fm3D#mAcO>9d;#)?>Mx3GL?cEf_PaW*kOeC>@Na9XK( zP-In8_kfl8NdkKmY_^#ImwIF3SGwQt1O+TCrUlzL~6~FB6!8 z3!VUL>CoPztM;cFKD%ls6J-utYXl|%*3Ijz?I{P;>^y;P>6TN24ZBw2!HFS^BM;ZZ zIFhW?E-UN7jpSnFDaC+Tlc;KTsAz?JwH+x$d6YBPtz$110M*#EB zq`AN4>#QFI7BDUfd{eiQz)B)X35+bcNpE`QYa$pO!I+ZUOz)qC-7~_?IXbK5lStO;I{}?MX)-8q$y?2Mo?^WhpV1S zlj|$cyUF%cFPPrsy1cFzo>G#3nRdx1$75 z2;3lW2O-ZqNca!El9G+_dz7(b#U2(wWfi*a-IcWKK2fo))$Qi6jibT~D(bOIDrt{h zju4<8OGE(QW7$oZsNd|YXaRf~eyS%Hl3T*e`FI>p-$?9ZF-~!|v4)PPU8>VSx?7{H zzg?I<8pMRrgpsg~>BmNSL*pbx4{C+ka z(!b5xA-Z#GhDr~T6M}*XPr_BocqC_U2|S-m8~H}6dupIgIFMkt>{X*c^1$ylV&mL+ zGjC7m`hR&@IWx|_Ek@k%eixWlNF@Ud$-@*nsAx@ky;l`A!H+Ha3BGYZ#-bt(WT^OzTsPNV99+d(2f5OT#Qxmv2|-Fp8wR- z{j5oK>n6&}vBEE~M4aRAzPxVlsnnlY`_G1+vVP8%3E)D|Rt>v8XM1^&+?|seg{@|< zO?gsD1N*@NdRQDzU)sRe@I@~D^?u6PJEHuPvxNc`CSQS#^Y*X6*7@+Rye7)mx@SoC z56R&nVH?Qjog5NmC4V(kiQmU=uV&svlrB}-8Rex~g!4j}8BRp^E(#{FVP?3nVEt5T zMZt#a;hI7Wt7b|XEsJ)rN^D=W;{|X^3Ij@4JRC&%2}dJ=Ka1&ovZeGsH5NC@YF-NW z@p^dQ==Mq)dlBzM`S@Rl>W^j}q(O+_jjG-o)B0aMA;^$e>zLCDv}89`07Ln3m-bER z)1brA(==8#*-Lt?YFNZ<7YwC$Rnpj}oZkMha(eq5u@p3al@nWA09*HiJV-FK@-1g^ z>XZLd(s(mTYxpEdYxpinA7E9Ib_mpF;Ylh^Mb`_-rXktZX-MBCTB#>0!aw0sMy6@ z_^y%!r5y`YOo|)ZRqcw+JQ=${e?5@!qGDrL-d{gZwQqF2FkF9GwdSq-0K)cVR}Y9T zq7E=8ByWdg0Wp$M?XWxPJI9Y9!3)!0q4e`fQ%Dd9{Z-45APoAe-LaZ_0z>DJoDmYV zf)E>RaNgP2x8T^sh6oUC?i~-3>%;W@B9pl?P|`dgaJaMWTKY2d&#;?&Apx*7+)jyG z1el6)>&A~}M~Rhvqh126QTqt6h4ioPb6iF-@=jqER|dwsDwEuzjid&>>V9QBlCcLp z@bQ{`R6X3Hb=`P5axBl-<6?DL+k6w>#MxOpPk?=bCj_vj3Hvhx^R`sX469v~g-PRQ z0;PggH}%DFDD5JEJJ{I*j~46^ftL&Rs{rb|ZT&}YJjlSQufIs10*$4`&>I>h%o@e9 zeaVu|Ju3kLclW>>g!|8sBaD--iSXo?UpwFjB*tr+Y?c5a*FF}&KKyTivFLYvXKLUc z97O#sE2*fzOC=TcJ69w=9!ex9v7TK?e<%X5oW8X$jPmbh0b-y&Brv{eO9Y5jvfy9O z^JUfDw8jJCmAoN9#FF;~h*`2wfT$&33lO)YqEbXIX)ZwQl2!slFWF6i_$8eMh+uNK z05ME@3lPQRWC7xs3=$xc$@v1rGPzuUXeKuZ5YOZe0V0|_AV5r$Cj^LU^1J|XO=BM_@}tO<~|p|AFg?8Pa&>nki(y^Stn8W0egFpEDir2K673U$HzH{-&@vG@w-Dk z6~EDwhv|$xx3g9BV};CN-D)@KC(lO}!S;#G6Xl-7)(HHX*gjkOmb7-Zr2wWj{XIw~ zINkX{XSeG5W6dIsl`bu@t)(Tf)t;xK51aiXuwGOHZ6h^M0~PuDTlqS742qx2aO@W& zO7n16R0&}zh{iUIkEnXWfXjw#SPBxvBaDxG=hE>Jc{wsiHLjzLd3QWxP1B^kG(Xciy zT8Lebj#XLnn$lNC?35m&pk59CCDt+Fzr3kt*SGaey^S@!z|)cPT+MD2<3F@s0?F4rHHJ#!n5M#Igh?~}P9nI95V_Ff6TBwS&->{(VR@nIXnE!ooidprLS z?6ak!{3GLV|Xee zIJ_;MKbvf+Kqg&;BuIe1b?b*@vylA%_+xu2m&^HNe zS4m}VEI&>Vg`qV(bdO3}>ZFR@t1R|af`HE88kq6C49t@WVksUxdTaX381QW)kgcYA zp7pA!WJFNuAolK74KL5Tc=?7NUbREjHHcyCug}MhU3HAE+DL(^)wJ(niXD2|dy%rB zY7@n?DpJ-|?P*b3#@^T}_ShZM-bk=E-Kkg2eibX8#aZ>&({eU;8~?6YJv}OLMK0}K zxTO1+jA5(a(VCR=QcUBqoc-JT0Hf!SnKVgR;Jj%s&y*N0fRYWyYB^2+eqX{i>`k1>3~;D{R3f$HN3L?3S)7hl#ay=XF>Sgf&i1^!KyWk#k&z4 zRxJ6qr;yfXwagb6R_QT!G4PG-6E z<-AFJU{O9nY!g_L>I52R;Ci9r7vZfaP|gOGg%3_D1G8lNu<>(v*w`uYwZw?|+iU>> zk2Y)Po4Jr!XVT_u$v(8eE_v5&GcN{p$h-399(2sRmI9sfuAK+T=RufaEZkDH{DsZ2 zbS6h*wQw;uA`FSJJ+G_AoG5eM7$vMnN~wBob}3cQy;Vxpa~R17QH#MO2u)~nf_m=R zrd0TPhv0X*FH?5lLCZZ-5>_!9C9i{@o+vE{2`O+OmNzPe_3=vrn8t@iE6xc;|D_wB zv70Sm6+2#F>xzvQU@i2V2R^E;9}jM2;?**ib$(dJF0O>uBpt$#w_ixur}zH~rg=ep zXIu=b+l`u1@%_@KRD8!aZ^vDIJEqW90RmJG7TB+n3W~Tz1Q{D^(IDCX5*BBxDyd|@ zEz__cN~&oI{+>_*$Fv~OcdVsS@W@&!1&^<#QZSp_K?-K$Cn!UEL>*}Fs1>~<>OfJC z1}PZfE=a+P>Z$O%39&u&Bd|#MRsjEj6#@q(_KyG>|H97xanbOH_4eJkKW*YEM1UCQ zdAviE?@Hf>g!PTTS{;&|ocUUrAzQ`xC!s#9};zJSc?<8>U>f7ktFjcM40lbnyU+%6>curMCCtTNM{8C zNrhSAtwK60EF`p)26}{yFe|VH8)k(Pu9C_k{9c&LH!r4oC#>XrXFiM|2D-t=#W1*d z2OuwO{VKbm21bcN*vf}K-3ZBsAz@3`f0edM8mC7?kxPSV2wUX-7I=NX($Rk<{J!_= z?i6?yLpXs~s;L#nNBoAOprq3e@9na^KX9$4of>TBymKR#*!~_@u(vF3 zVy1&>LToi>Q>v`KhSr$9tivq zPwPR45LT4|nrTmp)**cV;QU56hd11A>WmFa%jZCCr=^>Z)+@D>#S~W{G zLWJrG8lkf-)d*Q8)d;ynmH>Gr;FOvt%GyLm7%=PnSKlyf5l zrsUjp0#kGDR)JYW0afwW*>n>?{9h`-IVHjIW;uo>?ftu8M`bgCCPGsQ>=iv^u+GEG zitw9m{I34q9}!R6b0lT-c#BYg7QES9V^YB`QbDGx-t(&zcOAUl~%u*<_d&-0IC z+EX>_V0lF}2;BXj)%6hs_u(2F-}$=E2isk&xBt@hCQY(kB&e%5z&bd_V#mbSo0GBb zrQ;+og+k1U|EN%_@Vnu86Dnba>J1=|loeOfGp9$qBxnEG)4vTirhXM*cd}VWPx(1# z#|fZYnIgdZ`Cgzu8%BG1p6hYd5MX^YM_@V5M*=8VlD$0-4&7@Bp!?iYfZ!MB?BlbZ zz!gK3R| zVs#SkgUf%DYQg*@7%pMN+fI}MXF~a1<796|Y-t=_N$)cT*Cug%O2kDEk{>FHTg8re zkPOCF?LB2Yj^7h%+<8@Nwx4JGvFbX~WF*s5{dEHij$H&WvOQE_6i(yUb_# zYh#Q}jD*I$#DHU^t13YLD6;)tov*Yx*ov<$#U|70S03Y1h0;igN zA;3y*jR2O!o9*G>FY#kK3f#^1*KAKgDSC`3|0NcJz#AL}DbNi2bn)z%aX;?so6$aF z&noNijC~})_E$##8>_is3&|cAgHEy_qmeMlatfEf4?9(d`yU}WI>_*+W^F%ZuzWjT z07vIg=X-2Gi}EAqcnA=dBvihg#@D2OFyR~;XXcwUGdCv1F#@wH-vy9$@9OGrjt|}w z0)OM&FMtZ^O#y;_Ef5&N5qAQt$yN(6^X+D%(yX&Dj&*NE;9O275||n(^s+$N z5Wi=Yy3;H;!%fE-NzBAZdcDSd_$aHBEI}nJ#^p`+kN{fNj7p#a_cHG`N*Y91xj|%h+L^!_&7F-? zAHWRqaey zQh1j16(DSK8}WP@nK=gJPEpp*+M@#dXYCz<=~??);ESv^sls3Ri3N_!S!aPuQG*EF zgb$fObHc+3u<+KmN{$J~l)aRL7S)so%j_FP zIf&(<0Agz>&hEswqF`~j`Jw*qU)NFzcttI>R$3JeCpU|(CB)?^mXG9No(P93P zmu2mCf#x}zF3>q=?+Tosv!4V|is8c3Q#qS9OFq4jt$x{BcFWt#P~ntIGETx^tdVcmJpthvg;v zXV>}b#zYPr6L^v!zXCWeJ}*{6bNh!SszJCfDjnhmHZbB{Up?SVoYe%d|9VV-`6hfM zPPz0&F$4Qf8GGV>EkDaMYWB7$NIl^*6RE(DgM4kjKtkrZ$oHz`_3)WjlB-^}fwNzf zf#JQrRg6>ccrd&F)=8+w%Fs*Z>k!XMr!2L>8lP*7?t|=&h(YP(nqYf>Td=)Hg77bN zR@zgNFI0#??kZbD?;C{w&`a88(uYJdjB`}ut&E+b{*U+e9s+H%Hc|k|eS!dy0Kz+4 zf`U#T8ofgJ;>X9YcMd_Zl!b>;;K9czP!^QzXVpVA^*04rLtNj(f4}Q1)^xN7sAl&R z<)NxA6!;b`lPav#Y%lQ~Qn%v-_<1!aGzd31NR-18n>@$Y(*t)wQ7&~hQ{WM2zY5?x z8hDW50?#3q%GgISkN5P&PmC0-JA?Sm4;jE~k!L(U#$sNTv2g;sW$hsWgsiy&r*Te% zzzD20kD+G2+2n`R)_FU~UpIEm+Xw+n>7Et`Rvw-MXY(NSeTh+9FVDJ$u|J;{n2$4w0G2!95aYw+=bcip=EwO*VAbw_dgPm4y1pX} zTzG%>(={WQ_hLl3?7z(GWgF|s4b)W+3ADzLRg9_g|1lN0S)q^e)m~Rg$C8&TaRRGhp2L&)ycvhfXx3>g#C6t{&-@5%Sa4l{EC;PiURkw`=a6aBqpk-qB zsAu9|^R58#2@gNPGaq0!N`L{lA#jVOU+cawVNXjtWP_P|wCC`#AN_OBAyRu^Uk5vA zodxn)J6T}stX(OnZ$R? zE7lL@<3838-Z@7pcWzi7EGpOyx@L=+kUx!sigu5#&*anqdhA_cvhIowg|3NG^W7oPD&?^@AV4 z9YoMm{yi0YQD9odo)vgLX7LX!76pHukhMwGeia2h?tTM&^-M`e2s~Y}egcG6JX@fI zXN|zlXlVrq7xRd~X861d5Y6Rf0gSj734F_cA+QUEGpG7nEW~wL03FKy>U-!+jukkX zkZuCQ5hVnW7)J@5G>~lAg(=Zkf$eMdkpKhV-vU?%o_V%sem8=@Yqr&Co`TtJNAYZc9hLx- z^syc!J8>E~<_W}Y_6DA8#yz2Y%(FVHvN`DDzV!-+*Xpja*n@d>cjT8I%&)uQ0v~X` z-x5z*P6BNAO$S%@t);o!GrTYjxe- zA%Kx;coZUWPSP_KaYYtD-yOiV5uC_Q(dquVuR--Kz|wVz2gws9z1aWap{_Un3Er3j zi%Pb?0G1@-V>C6{Ria=^@{quuP4BhmryshIo##kArVgDs?ev=LJAYpj&mLtT; z2yL4Z!80jHu$1)^0t$<5&h#bz3D-?!J6zX9yYl%2%O9+3Y{2|Ahx^>D>$Ai4a3ZYh zni!)#|2|@0=^EoOP6GCU@ebDYuVp(hNy*(%8b3#XYwT@F z`f{2e$JFQ~!>4q4#_pH%z}z4F<=D|V3snUJ*J#vBjER%%zv zAak69N29L)Q}uzp8|-{FS5HKi-&CXH<%#Vk@G3420(8ye1+c0aEN~CU9}E1B7DwPD zvzY>IGWMPT;Sj$OKondpfM>uK1ATvaloPoHniBz1-|^I}T5~4xUi9VB+WFRvYeN9CbYuH65Q7jh^}5@1sHc226)d*Pn#zMFhdsb-tkd3L%2@x9ou9 ztiY~ld&F^E;J_8m$1EM{r0w?U)`e{)=M!rR%GbLB53 z;zLoP-FtI78$-)wMV(BI2^mLHHyB`7>p>n0OiziaF(>}t|BIjn(Y$~3W5A{nv?7AI zD6J!C6SLYyuuIJ95JAVXyHlk)MG8jc<7fNVenZ6#`QG0G%h#bpJmoE9Mga_|mkD6i z8nT$KH#y();Ocdl0FGUk2>gzKDR6$lzC6$KaB$Nyfw2hs0(Y~2t_rctuL*E!(*^>( z*H!`_6l_NUM5&GfKNsu(fj3QofDg#|V~3@LL3{B3Kf2l z1h3;6bdLZ0-n32NORV4o*gJVw;Ge7;vB>v1OxHgX1uM621u$J-A%N-n8iBnrT|d`X zh(O;=;AA$XReWI1HWB4q+~@^{=WJI2#+Ob4V~9B`aBt2{QmM(P9YmRyvl9gfQ8q|m zPR@o3yq&Wv1eWIP1_9#jO%rf=drqKApc#Qp@-|*z8_rl4*g0?S3Sa=cPypNbZv;+6 zeiJw&Z~q7k&%5br*yTj0(SO3;?>Yil%eE9?8NH1FX0y8pJe9Y71fI{^!2)mR-8|Lv zJ~pPLXyq} zg1sd$pkN;fEJ|GV8~;szOWfcuJSaLhM__Abtq1!r*v8qL5~#2TyZt#&i)c$BQ&dbI0tXQaM1YeprU~?C<5S=~bT9%V z%?;K^xt2)JqKqemlE8yz?+VOd?@Ztovu^}GW0zFm2eT&q1&;U=0+_jOF2LSOTLC8Z zU&YKaWDimHgGZDT(PV0%oQdC`z%E(qDxSSL2|(Zo{Okly%Gy8yR@&zYT$Qy;1=yau zP2eHIK?`8W`lvvXxQ`^AW+Ny@P)Xby>Jr4h86ugsSp>}^Xc57t5wwb+b&^WLZ6auw zxNB75E)jG{+)JVmPA6n_il9s4nk(zT#B~?w7MZ&zZdZx%JrZ|_K(EAg5$Kb+fdc&! zcccJub*>T^n7B&?1|@E^z+mnrQGZC{ZWkDqxXA*;6Zf>h2x9o@{ftapL*SakZ6Yu_ zacu?0ByKN(TN4iI@c+*E#GNBBA#oQAOr#kClM?rUz?8&2E-*E5&j?IQ+{*&f6E{LH zd}iXV6PT5_TLoT9+}#3m5;sNQwZuIsFfVcM3CvI2LV*tww^U$3;+6|6Ox#}rkCcNR zvhh3TWnAR{ZX(f77C?3OrvN&$mIA~}3p_v6(o)C`A#Titbvxu@U;MK4Ov(n)DlQjg z-^A9rz-OI7SONiDu4W7L=6D)`DbC76Jr7IxqXc%u96{hxj0Obw<31Gl&TQjho|&EK z-2@KhzYyq`v6}@j3hyd#9bweh_ssY<9wiF9NdpBqw(4SmHzLpb8M{^#b~CRKz`yY& zft|4-5I~a^e2nmQ{auvlY-TrD=)xCXT<}59E!JODn$Qv?7Bkx z)+N@WIDTLjWL1&L6Eok}v3}k*7T7LttpxUA4_u&c-gXo?GjDqeT*m1i0uQ1E6F{oo zPhckd#I_&qi~o=s+B7hl>n{qYsqCV7 z5)9;R1lGpRM1cM3b^^ym9@a-8>$I44PAqjtI4!>}Fh z&UqeT4+8grp!MD_Mo~PJleTnn(f5(^N2J`DOG`aK%nR|Hm&U?uaJ+S(oD{X^XGeWH zo-g5E8x&KXXCj4_MJRQ4eBr}NDWyYv^ZRmux$gD9NLdsqH^iTQTsh?-5>U9;VU?7E z`Y=$iX9@KTia-7NwOBLZnkA=yUQa3SB`M`IPBGNoAB^Tei#hvKl+WVZz-%s1`o^a? zFFpktgitdcWr63$*uwwB79JT}czkT(uaWY1r0l^~pgPj|8T&&3E!~cn_|8_u=vZLu zoGlkv%z;#w`YcYKJ6>RN(QXyM;$xn`5CX(yJf>-I*wl#RG+L zRsTkmWs#>;PkA`#Bisv{g3ye;iBmbkH@-{E!WizOYoH`JCVC@Cj0e0Lp7T4xe(jf# zxyCA1d#(*)7S8tkJ|x|*0vP(j)fJvroixTFovN7{&_`Kx5ciU|h|980m{+HkB3SJ~n9tcvl+; z@UHd|n9eCd0&K7xCqNv|>jdW3>~?{9HG4vUsCLf_EU4L1fzR=F5m-{Qyjn=WsLce} zRBR_etblz4u+=(I0O!)70vIWe5~$(fEYPfOa|JeJGe=<4x|!b3R&{G8fD>v*0koV4 z3v{U4NdkP$p#pr(YXuHQ_bJf5ZnFe>@_hxc6szg$oK&~X1O{RmDR36M&;mp7rxv)V zZZ`>xpf3p^s?WOIzvru*y(hrF|6+lgo&6(lJAsX_@H}@Bk4@ly4!jb;2>LjI$5C?$ zJnif%0p$A00*tzI1$K&O{O+HTK_=R+kCo9o6FPK)p@=^q{bEFCWsJwW>q>v;yCVmI z3cMqyxtXUD6a4w2F=m;SWZMzCqoJ`@jg^W_4l zi|-d;8hGA=NS60cB}7?Jl%Z94DSzlx}^Z}bSnYm>1_p&r`ri2Pq!C9p6=*Df;>HUF6Xy}1Xi^8f*) z=RpEU&*ustJr5H=dcM>HBJ1jg$j<)0NX|Y%ZuSXMvv0+s#En#;C5Yt$-zIL1z>kR= zC$Kzm69j%s+eri`8fqnb#|h_na+j@ zoagLjfeR7T1=?5BuG^z(BS!llsduCdtJ+EVGtFXD8J z$c|s1^&hT-h-q`7D>q-iDsyy zlGG~bWL+oc1$(6_NxIXIsdm`%|1yHVBH&%uuJ!lm;H)I@AaUCT7@T$%cnf{RzW%NY zgWbl~7)$Q%mwG+SHWfI4#kyEowRaJ~>}a~c0a?3IpgYIldXSufBQyip9R>Sb*E0(K zpsdF1f_*GT+$H`H@Fqvs`L?wxT5ADJ8iSF>8AaPq6oN1WBjB5GMe5+0Ii^1F5Y#MW z^(OkgXHL!~bR>7izwioOb563qUR|==bb$!3H}A?Y0wWFI;~<1Wnq#f@2IsOVe99Z~+_Oh*B> zT7t1sb8M(3IN=L>vbqL_S|{A>pZ1r6%@z2Uvnmep6yj|KW z1WISzw@>n=mJtL?;7-C~3SdYV!1b6(it_Kjq4zafaL}syBZoc=7wDPT)dF?u|AMnC}G(g6qv@s}wep zD+O@RoTT3M5E@N&kC|o{3G9FxLx8AY1J(YQ@Y57%iF~1Mh8^o-d_COq~N7bUS}EcN_mN5VkXn43{*eBg4cd+x!;)wjXV>Jp>q!PEx6L z%QjLsAOMLUZP;G+37*0}!OYChJU=UGtR2Um1LN3pd>nhut)zFjBy~?}um%mo2{A>& z*z-tSqP<>8r^9z5Wm&~8P`g&7lw^yl?%YX9V`|lIQ9dSTVRYz;YxX$*Nc~v-3Y<>p z6#+chcDp@&+A{=R!u9PoPr)f`k|-?i-@VmSJ}BGgqWr~)#sZ(=xVg1|k7bm5pLm|N zt2RIYgP*ReJ>{sXt!(9a22`y!-cvrW+PG~!ywnF~R>da^8p?kO0!y4(EAc2Wf0e0i>~w1dzto5C<7|b%T%w%{tdIGRUeYnRGI>gZYRI4G z_m#O>gMD=?%ytw$-ipu#(`6XiiNq+r|L zO`PU}75vvv?km_?_Yj7qV6D{~KIJqOfxio`m)_H^MY~Ou!-;O9G8YExwNXX;NWFvY z?C_U;UJSQOFl;;JUOaS4)=Nc^5?&YJ7u`S|(xFQd*uBY0ss%%mzM>3_GxSKp-rPka z{TXColABVs=S6umQeMSxLX<^S`$PbZKwu_NMaWu@L)w+qA`Z2C5k~B8UvuY3Ay~z( zo|2p!1k0RwXj3X&m2Ja2{p-Rhy^jFF^g=%*g2UVi zK5J|RgLV&|jNk)&aYXr?(OKZ|9s_pCbyBe&8WQ%3Gpzk37fKtj%O!YCz<{PyJF+u8BNfqr-X7 z^ZcCl#^j|C{sS@JhXufB!Y7}HMGL^>|!LLhI)OM45+^iG=B|W7a<<>v4~7A|`?%YdvNqQ8sHzi|^HBFN)GR z@*IXswJ66%9@Y(QC;ECWjyzkGt$eSiw2cZ=PSZMGlw)F_xvOmdio#qSn)){3J?`_R znAAdhI5RwC{ad#G6LU6Bxy|GJ+@@kPRcfc0HMnBk?^k;w&)pmoB+8`7^WT{DX2sU1 z`23i~nL^>F%PaP;O0A4p7h*9x$=A$q7kD14+WVqRk3-pOF^f^Ild{?phg>^18Eg1imNBgJca$ety4w%&t%d)7tgQ7)q#FGM?a6 za$V!(;jc^R!*soIM%RlncAp9&-A@(BXKjYS`ozi+*a;I5feu-FQvk(SXmp=!T6{2} zl9Yu;EEMNB`cQmYEIyl%vf_CyYQz?0ZK$U(r~B3<`zdK4iSF_r|4QGCDz9&HcC;wV zqFRj2gAt-^7KPNk@-|VF&QVCcAa8Goa(U#Ln75xrc_8xq58DilHJF)&XF~hmSrjXz zA7aOXohu3!xq$~mv)e^EG3D{c*!h3=#*pB^@2{AheKIv9Ebjf)A&O?v=*NsT%|GOs zH5)8&5#f~t7%)zf*o*7$x=(l>6wDh7WKsGm3tjJLVm^|%-2(jx4JdG4-8K~Su;}LZ zXe@<$@aD>5ODY_ka!))1`B`L*w-LsOQ!v%v@~sH4FDX1A0$xoWeOx0?UiGMxc!ItnNIyWS0tjz;=)T zhVwNw0Yla{0ytb9B(P7DohWcrlMNL(6^m8@hMq?RZfdeu1fFiPb=A7}n$ik?h!tkb zX@#4X(+W9`IaG*RBUE^DIjs=)@KE7{xZbM5FUsi)SQ~AsD4RrZX2re`WmpVzFp|hB z#42De+xc<-E(o5|TVSoKT`thN8s1)G|9Cn^-v}?0!_N*xD#&HgFfS*L!DUO9$26cVN-|NaqxyRY5 zqC5~wy@)Hbrq{P4&r)Z3wfV=$(~?+5qO`K~SH>T1ZPkN}7e?8O+5c5NxCn$662Tx$ z+-w#Ho@Qu8R0=sT@a&winWF3-_Ytnl*pH&z7&F7%5Q8+GK%dS$j%gLyUU`5G_9u*eh$M-w7LpqXd#%su5i~ zM200ARv1Dy!$(fyWE+mkd)_y6ue1X-4vkr;c?0vYRco!0Z zDnr&)5wJBHDECC>M} zdw8b*TDNho=6^lFn(%i~F!9*p8Bh5lZy$-m;QjRsPgx(UTV?HyiH87&y)O#jr~IYB zy&P)rtY>}!1+ZRDsXM8 zh)r$|YtJb})l$ZPi^1x}TTNdn%DdPA3$Pk3&+>O725tWvmp@_Gn)L)aj7@?^Irjhh`)wNpa;An$vR(#bE^ zu4~eAjoBpp692(7Rd>K6B22-|FJTIPIr9A8WD~^GGHT1ODccF6V0;lu5nLpcnpI9` z`S(y|si&c(3SbQ;8!CnRB>c1t!yyYV(?CJH94JpG>A(7H>b#%)FYJQ+99h}w2(0WK zg@2V`G{f}M4siCM09us5!&YzL85?=n#tl4+ovr<(|3>()b`>D7%p*^F?FNBmj(y65 zX6D`zXl`z2ffnXg33S6MQ>6x*y)W>fxr&NopL6h2zUDX0E)&=gH$!#h_Qd%VbDxa8 zrmPDy)->HS6Y#T_0Ac9v7hqNXnE(;#HhS9gY@M~f0*JHs3lKQwO#w_MR|wpW6NK)C zH^cye_p^4c!0+gO1PVEOT!7F5ZwmCyr9T@%qgIJ>bI!KZFUr#XNCA#Pyi5SucB%mO zFyS}GHu*16@;IaG@7)mB2Z0@Mg%CKHNMq_5!_4)Y?O!kNXSjlKzt77QSZH>gz>m0c z3SiOHUto>dU;&&rchL}bP1YSf$JcX1)?F%qHh#elez4BsBPr(Y1#2Vb;RS0afYvuq z#zjyg6u273xDWtV{lypj3vU}K$bcb>GfXC^<_ebn0>sA)luZfGFA9+1EJI#IMJ$}?;=R*X;!|TGB@gJJuM<=RZlC#$|5`F*zJt6G}Xr)IB-=Ok7t0t0#70?f>Tc?h$& z_Cbf&(wp8Fv!>Q;qL`n=d`Dnj%}rhCn^CN%?ODaf*lgcv*vsBl;5+t0cJ|H4vBnkH zitP=7vpLjOPkJ+FU#LPvw?LU}_JXpuU}sDHlJF1#Fnk0xQ^!adNGxFWR8DOSU;X9? z5ZywLXFv(1K8smvGWLdQ?o+ktY7b)KOnu|6*fSI0Hw#VuIs&2$ho`{qWRQ4n%BDNg z*zkv~>1`u;KLWN=Ld{ne)0)|>49u5vs;TO^1=|k+!oY^CN1ANDUcxEm6nvG&wQ8VZ z3p}Spz@A2+(CY#~vlhTT(M_H>B7uTrH&c&1KL$ZvN+f693p@7k#yUrESbTN-C*Aeu zFieN{{A2_lM6fEB`X_>>Y+51e)KD{_ffnjsgr3;v|9o$`J7D3ugGy_yqIRA^&Em z5B);T9d)kW$V2Veuw#G)A0y(*DFpRBstpOrP}n zqFb<=Z|a0d!PYj6s|cpyZM=;JL#2L+%|C~f>PSQ}3!n!wud>dF6yoHDEH)GRh#6@* z0Bo8=7abdU_+>&DZH|GD>gko(X&NrZB} za6QHS5#Zt*D6=D&AHha!L5aC*)-DmKB5n$7pG$xIS0Z>f0yh3{)>}O*g8T9*Gb_t5 zT&zN;s(M@@9WI)Pr6!#Pjtep@jis@JhE68-{0b%d^tlo`OaHQ!I;s4iG4oNkLNtjR;ysfGiQ1ky`@TD`SJzjeAC+f`!nfx&=08gEdMF%h)dh z({d?zI+uzf&*f6)|3wNbkRX%bdJ@Lfgit^#PUzo|)go^_MA;%zI_9mrDEmfA_gD%~ z@4$RQv+Ch+ZUXGN{BIUbC z*@$6BZ@zU?DiLwIO_*2-Sr7oBheA(aXbK|nCz0}N1gFLM^sESeBtT_n-!qrz-CYNJ z@LQy;%De3j^_10-k`!FEi>G7@Zs36)6botbN(7C9ds6i@iL)6f+@|e)*65NuQl;)FaX^QsOfI=5 zfu~CDNijcHax((v3R!#x)Y&P#d}1aUU~O~>gf|H{qpW%)zd%kjuIFciw}xmaO4@1cS}{_u$VPG zQby$6EEOM_ckOkHYa-9+2*yO7TO-f-yi2PtBN~cWdijGxP2S)iW#aURTe2Det~gJ#+GI{r!EZ*LWK$J}*`{Kku$lJs;#< zE7h|g?-r__g^_1b-mOwSOQ0O!>-jcjwaK|n_V$!^IrqH4E;+ZMdP0YsYpo8@G3T~b z2k4Y@7wzepyX0I?fdg}{+g_g1EmFGY+#=P}BT}%(IY{+jj}uB^k8_8LV~=xvM_+tk z&Yhup2IbuGDn2;pGU|sza;}fsGc4y$S3Sc4YR?Elv#XwwIX6M|T$6KGtDe!^LiLQv zxh+)BtvPp->KUJN*QlNeIrpUMnV56$s-8(X_o(Wbl5_W~o~g0T({iq}>Y0vTyy}^m zbCXritepE&^}LjG%T>>uoO@ICyq0sbRnNSfdq>6R=iC5+4`R&=a_&{tvoPnrQ9X-t zuCC%sa;~i6-{#z6fgfY3iI3_epY){<=nTbXLZhPsn4Ad_*eC0^KKIrFVa`T zSH|E*qYd8KVd-&{xwdE2u#en z_XH+o-KPRmvTljM)T~=3fb&>r&vcCb)v%daR}q+%b?XYe6rXEOe6H8xbIps-H9zZy zsKO88b1jI^wJ<){qWD}(;&Xi)pX1e6CgTxmL&LN^S>lspR0K;eXbU{^tm?8x#RSJt#a;Ab%546x4k;RyH$76;r>(pubNJg zA4l+61dAj1I)d*aSQf#b)pX+Eyvs1Pty4>2aShegVOI1@b{nNdvj)CBZL zq)dvF<`Z$!d?8MnbK|7>Gbe&;7+g_GpW=@Q{^qoAjfeko+P6TaDdj0dP>!G;LHnk3 zK7F$(eJ%oqgy$lxN0=geL@+dhk>!-<=5qS%ca+nKb#CN&Kk{(cNSOLLV`G+PUQI| z@*q@%mr$;z^{j)cK{83F*Z~f$raZkP&q`o!9hiX1E zpWfoCeEQ}ei&-;b7O^|RNBJXW{Ts8^FQi#JN6@L@vg%_;7F6gaEkT1vb;x8OPpTpw>SzL36z2aq%M6pt3tr(m@e zp6jbf!D2Kte)D3QwQVtFKA@NuKRi+f72ROn3&}GyV@T1B5oK7>eJU`#=)M&gQFI@x zsUwT-7lCVvu8aPZ(M5NJ!1!W%_Xmn;o1cs~eKy|ImC}Zl;vctJ{3}l?xdEzYK>XuQ zFS${ooE0hOMsPs{7e#Ps1Xo1RGD+{XRg%7hy_2+sUlM6SFSF`W(AHAs_LedqW-0Rz zF>6K4DreHHV>0eIO^C;3+{FTYGwC09as;PFa7F}YM{r&QLnGKKn>M3uHf=`NY=x{?IE88PeG2tLWWDS8P^E>i`5&bny= z8zH=@)FwH%kH8i=H%ee@$E;6d){2T#aJ zCPf%__OGXZZlAg<>K7gr!6wel?dzG_J2ypOPR7kY$x|{}cY(mJS=U0~uDn~*-)Es? zyiMykHoxadt;$ySc&&vCQGd7xN@npKQA(Ln8wLtT!c9_EyCygPbYJ0v5pb;NEUkri zMPo0pCmMS(A0D&%M{r>TV73m@>DGV2{Y$1z!^JVAUS>=Z-GAm*@Mv zq~jyy#G-rTe19(ns~P8cfW9{{Gc-+B*1bi0P4zrfa@{ZTJdc*#XaOer69k?vx#0rO zM4oON8OY?t?=wvf`?~EI~Sh) z@W^v?5<~F^BlB|+yc(Gacomw# zp^4!$u`mqZ^v6h9&JU~i{C7Tm&jn6=(?&+Qkbcvah4hhkE2OU%o0srfj*hy@p^w1iHlCNlw<7 zqt(q3W+SCh#0o8FWzipor#RKpM?MQf3U$$|2ur0me;v#M55`h2n++N4b;}<|3L)~t zE!d9>x4;iD+~SXTi`DTKnN0dJy)m$A-aM1Ov0XAYM--He;kj;$6yoQEtcN3*h3&AI z=VsETV&4`X=i^NJQ5Hwa*O~Z(#Jm3Dt+}LX45aEpVm{9g=`Np-1(I zJiQ~&X_4pb$a7`nxi<3L5h?dX$`jf2*=J(HtjBpX{=)CFT++87v}zCiO@vkrpiKn0 zsD7+!NjuJKuy$5J@i1l=I>MX2zP9(eYT z;OGddiQD`Nf77)Rx0ArSMA;J9fEWM*EzMO&cpeOKx=0((;2FR%ST~DueH`oFiC{r4 z-3?sKP^qm1jLgFq{3Y_>SsEI)Q9jiYqx}w)_K`virYZV598naC-~)@ku>H0u z2-|^zupI!x_6lVoYzGR$b^r+50U&G#fUq3^c0A#4dbs3zs(2-vKF;oht5xF(B|lSV z7!qjdS%IVY%>|ApSf#+pS$j_4yvTfE%pzn*C`B~9z;k^pj;BI+hj(L%p`YlPto@(r zX~*%Y`Y5|4_M|9#B{p4P|42CmpcZzI%*Q6_f6*`U42Y!$MIM~PLxm?go1o&C697fv zT4#?55dA9bH?2j~LEUsiOaIEv&5hCT**a>>@calbVSw3K6+aW-4}lBK#tB>&nc0gB z%wNZ>A7ZIrV<|SL!V70}DpW|M^iW~*n6*VFZ3dpkfqB=+jCD<5K9Hl`)cEc(>zJ5z zLd@!)NgwdcO!|Q5$C^h)p3$-REwT80@uti~p@sN4hnqeZvtH*Y6FoZyJmDRF8gKDc zyv4G}jPZ$jLeiD9Jjz5YMt&t3P`Ce(Tu`?sNk-LeqH*j=-CpNvM%@Nx3d!8M?V2kj zAJ*+Mu9gOtm38|G&KdYDdlsB|N$}U*AP);0;N-0&ngU6_Y+FKHk5i3Fwkq2<*+SBu zP%T__E!zPkJ@GIg8Bn&1NG>SbwIrj;p)F;5h^xuva6h)fxtd$H#Uvk=Z4JrNvTao0 zer4-Gk|)|9$$B_FlWbM7OGwxP^-b!EWe8V2D>j{E06V257gX#^l2H}=lVn`roQy+5 zk>{&eJCeB-JAmZFik(2Rv|{IztPGs_s*UDqJ&e^zwyN68B*YT=grsZLej(|JwnD2>}*P_v`C8dbCNNygP|G|6NRJ|~$$BxRDhf%8MG z;ka5_vtLM7)~rY`$P-bSWIdu}k!%${e|tiea5Xn)*Kvmrb2g3ym)>(o@_F4BFQ$jN z+A1#=<`mD;HE;7t*hF1KG9a(#yMSP6T#dtBiB2>*Z>>pY5V64bti0{(dls9mBrEgQ zpJY9P`;lyg?-EISB4LwsEvPH@EZAhO1{CZGk_(tRNJbUZKgSV!gsaH~TS79UU_X=0 zE!f{A9~RW=r3G7y{<*SXElBc3HE_M6?Z_1y^BsNP#iy90Yted;U=ZGqWI)jdkz7!; z5hSCEb`!}s&ekBAT(pNsW)y8Y$y}CYBp>3UOtQ47|6wJknR1oKjGF}Gn=*ggR+!$9 zbS>#=dzSRH14??@QGqzFqA>|~Ko2-c+4_|TS%mgRk z5((mKjRcpv^+?(iE`wx`tZhp|EZ24Yr{#fZyrH%5$9l$T*}l+as_@SB%`u6 zhUB`e-AZy}*2a^J&DsQ#aao&4awm}uN&GZPavy>-$>gjpCV7}}S0s;RZ5hdv9QI8z z13y8MXE~9`6_OXS)*zXkwGBz;X00X38$3J7+dMSMd&IRR`H-h2`6O#SNj~Q>NxtMU zNtSZ(2Fdprwvhakwd+WJC9*Ba$}H}}h2$^7+mfuw;t5koj94NhL>qaYq$y`}NeH|7 z4hb$X3rN<>*tq2bo&4xA)JvK2llB<(R*Ch1zUlSz8wUQ99oe_@gfYBrW+ zT+JRJnOw8SNM-T&Ae6Q=} zBK@BG?B_oBxzGBX!$l)N(4&R}^&aI1q8>FBXy+3_pu?lC1v)*d0Z4e%QXt9kXrRZV z9sx2QwF>YTsM>>xlkY8nAfHqK^#$r?AX=asY1)t$w07BjRt6OX9H0VQv)5AWv6ACuq>0j zet}z0p;`oF`Z`+CHeRcTE$8z++$xLIJ%GPRJq84d)Qdo{NWBKs7pW~kl+TZW_9A8L zPkKe_AfU5I9StOk)X6}yNR0z}c<>m=a8eR*@<1fub*pBe(yjh<5D8hGV!*AdG3eIS zSnt+6i}C^mKHJ^uexQTH;XtQbtpgHn^)`@nt51L)xB3FexRujOLdEJ(z+0@21%3#W&wgc4+zxrFd7i$)-Ir(=YD_==88aPv3dna6sr$_WU=}b=qXma zfD9)#kt|fgQ>6sp<6eMK2J+eG*8_J)z0!2(7^&1(3z*60}?EW0ZHx#0($b)KY>i1dJ}Lu z)q8-KUKFUb`ddF&1wjRP#~cVcmC=ucoT>zfI@Mu7yHgztbXeVPCpYXuC7h}XNOFn^ z=;7%{Amdb*15O_62E6$y0+i>g+ki?sTENc%ZXm!xHXz7RH=sUWy#++`)qjBYe5?P1 zLNGh?b)gen0*hNRUlmFt$=58%@XCTT5|=t&8VLtfDMPtS4Tq}a5-=d((j9crr6xhu zyL5@7RtMeQ*U?H*I`IM|m=a1tE?tx!uI_=#@GTbLEYL;q(r-eQbE+JuEYL-9@}!uw zBSYu9+)yb-Ivk7p8t@y+=_W6R8UQf$IS!~d)JPy|s7XM(p=JRchWahgX{bgZ!FQ=Z zlJ6^k9z#6?WO!&2V0r!>z-v?6fO4DK4RHT_aWU!H)Db|yriKDRn;Hw$+tf55%AIyV zJMU=&9jwg(oi=p`kl-sOAjx}*Ko1LeK!!`{0jE-*0$y%#2g*5(P(peSq-R$L z1DyHu0i5`&1pIb20pPUX1whcQ<^uH`^#r1J)dsZN)n9-P*580mj*|ijyLtmi+SMmO zk6mSej9s~Cn@&1m!0S*a0_6@h0;uGIO2F?>Gk}0Y{Tc}JEDTW3@BoPN!9RdzNR<;c zFWwzX)WxbFfMz%jaPq1p;4M*8fpRWl0V+#WBj7Jlw*i3?^#~9wQ7-`XEF%F?u5bm~ zOZcpYqLipIppy#$fdtp70?85;0D4N)JRnn|B7l>(838Y!zXRnS)df^?-znhd?Gqrt z3-8B~o=16ss7IX$ba>PmKqptk011z7IZ12E*29}pSY|xxasZh>>nI}QYe7*S1zPlj zRv%Yipf12ITA=0u?Odk^ba0Cv&{?4V4kQZH3qZ0!y$SRX4#*U!?*S)$+|gvdPz?sk z3)KjqvQV7|`1yzs2=EXS5G+(}Kz*UQABYyJr-62s7=eyL^)H~4?h{B9D%a0RuTUKU z^c1RJ0GUEn4LF%a0^TC^8=#zrm4Hg#TLSz=>JcDNq`H70clZJITABUVQsqQ6Rz1r9hI`@qiv4#RD>K^%mgdt#!bQU?QL8 z#p)oSl1>ru^Aal%C|0#VuvmqFdfsRPqQ&Y~pq*t@prcql2Xu0ghgkAj_2F33j{%(w zSb+ph21qhI2YMW8I*@UwD*-3(j{sh}GoUI|SKPt^dKJT(h&I@PZMFH4C)xl_e~N~iiW z;CHIO0RbM-27*qt0jTE*CLrom+kkeamOzJ7_y!S3I@M`Fk5g3x8P4?r z&U|$l;ALtFl;^7^pfX?m9`NU@Wk7(di+~{C7z6eB>UAKRuRZ|U^VNTWj(qh!(3!8? zgGeu59RVacLk{%tz8#R^{yo6yQWpSTm--b@?o!tSmAuph_+9D`K!8i-fFO&XK)p*P zfT&Bo1+=@=R-nVBz63g5DvySj;KO4e$zgGzhsmq7#saMbyajq-R$id0#L`gf8Si=x zl?2KSwH2r|)E6=cHkAEPQs=8RAZVx~fO0is-w0JIzGY@mb34}eZX1%ZU2!a&kc zi-8_P-3DX~buZv#`48}N(=t#_w**wuEdhRBumb`%l>vfWMtT_OaR?oV+SJd1cDg~J z!=}yvI&Eqakg%x>fg}&406l!i3uJ663OG5a4tSNi4=7jaX`oW6HGrRM2Z4Z6TY#Wa zp8@sUKKV1!Q_2Iha|0^Sq11^$Czt3038l^jl1j}0dX)MVkm0*Mz{zKKfY+|>0?O^` zuRtX$Z-C#fx`BXQC4rz_nLs@~7ZA0pyn&?0tqMQ~51j#>c6BO{;M-szX;-yCk6m2? zWH<~DI2~#+;H3it${p%2K&3-H2KZTK1_HcL4+I_RUqHP>Z3m*S0pMu z>ZKv1;87cafJbcxg51=CmwNgtAj*^t=%C92Iz8$$Hc#G5! zpu9+p0V?T906!N)0RcKGAXuap1NA(021JWg2hh%Cjz9-D>;s)e>R&*jNPP+<>8pSq z`l?e&s7Uz$CwI95Ubi|MD5qOeB;-~XK?N)-XwAp!-Rg2Iqx3mIyIWlkbhuRn=;XCP zAmLVj0FrLC4CryIzX2KEVg;PV>P5g?tTq7U#p+FV-6PTmg&yd~;-pu9vi0i8(s zi3D({$AKP)E^Wr4)tZyJ6P8{c%>~N2^%JP%lS;s!r~U&3^3*p#Fi$y8B7-b_08w7{ z1KRV{DL_Y_8Uu84F%yu;Q&$4XJhc$$$y2uinLPC%;B=}LfR}A8pq$%;fJ&~c0Q^o> z@C(voRTBt0)hR$d%b7rw_pg9* zsDU1$t{^?42AnQ+3gC6AF+jOXO#>=j>Po=x;`1xgbE#W_pi4an)VtIQAnIbDkMvyX zL!iT@z6Ls7sz4g0OC1695H*l->6KaM{=HK*Zj~&<0DhKXfB*}afYVS{Gj8=7Y9UZ= zs2EUbs5=0^p_TywL;W2H8fpblZ>WC)QA2$UwDWie&|#?J2-?)UK)p?U4n(+O0aIBM5Tt(_^GlN9V)vv=CHW>46)W>4Bx53%&{A_I@FUmk^~_j& z@=WRcef6=XoNM704u^lCtcXPyD4M;$SWoO#qQfpU)u z0+k-M2=KEp1_V6nSs=)bIY2#cSBxe-dM==y=PG~>`YNE4{V^axI3USf4e0Tx9w6gU z2c3bJ0u6LazmzN$sFSdyTM9~+3X~tpS*YTtlchp+8B{rM+TvDOsBVPva~&>j0RSpk zsGO1|rb$pyYa_0`P<;*6!4+bJ>tqIYCRyT!VM(u09S_xGrI0C96QG=Iui@q`QkOxM z^I0k>R2HcgC_k?w3kz5~gbH#4x}Efj)Voko?i3?jdy&dOb#P6(q*tU$sz|R$mmyiC zPJrsMQpm8?2j%3g8z~=OB0`n3z()#|ZuNU8Ki3nJLV!~uP(im&q28_DgNm}9C+V>; z2-V@%DRjD(XAJ4Nbs3Uwbplk6l|qJF5uu#LIt4EagHYwH2$Di&v04V@=QS7N3>2#u zpn_Z*3{_vOl2B3JbS9te#p+9_j$)lcXR-1ibqU_$!7a%`Bvg-;LWYaZpqwQ-1#gLJ zhN>)4+wkcxQTK^kp89?SWzW;?s60=1S(SOpBVO{<&w)UmUfl}jS?i{GY9y9XdM*cf zu@((G^VAe96L~5KB&`L-9xJkp6}8i8tza=}!b>?1DFT(uod7>yy8;2HE<@0%o`tIC zp-3R=RBr(t%$+^LpjOJ^8w&&~C*uncyl3u=Ul!<&@V@Y}-M5D*r)yohyl+&eC@Nydy zR5?KEl{^3d<#*{60xsQdgY3CUZMt;xjq=qyp607>Rm_{@~3T~JOoxN2Yl`|m)xN1Y5*dQ>$K@Mxd)9yJ{*>QP~! z!=u`OPTm&*5+3y+ko0K2^mx?MP#L-<0BJQRQ50*r4>8>dg_yn#baEl(IRr0I{eWbF zIuYn8P^SYKc9sEWp_&GG3)M`ZyiolLsAMe<@Y7cTfkM>^1i4cIs4vtkj~1$jpxO)7 zGeAe7u7E_LS__rrW(A<9P=(1vh8Y;(q_e@&Tco}K%8QtKlMtO0ZvG-Q04h+Vjsk)# z+X405)Il9ZtbB&J%`Y<1!QJ>kr&~RUTf(iL0+QBbtH-U`lX0tVES<%ggWh8G7F0QtCZMud zGcr)D;|y}#1Izki^*s<}-q5qU*UD@Rq0> zfO2L_KqXtQfWJiD1q4deLjXd1{{%AcP#XY*b_ama4xC8T4s|+!&`tp|>_`L7Jhc?? zvfT`n=c&y=C40xeBx>#f0|Knx0l_>q1E|ka*8@@dF`%7|X`mxdeE}r$ROwkHl&6LO zJ$Y&rkYUpdaIyQ12EsXBqEQ@sYXv-t&dIMok8 zr&IMmn-qAG80c}Tu|USD0)R7LT>*IWRRd7YeK|lS6C=RSsc0a;8|y$YUwsVJb1^Ou z%~z$=bbG$8st(rqL{(ZFTnTG~E19qR#-4n26h1TgsuFNo`&C{J^`k?|`TQTK5&O=3a+ORf~YR)I~soYXpEKr%ZqzdORRQ=LR^rP6hB5 zsFgrD4^9A;R-5)0s1Kk51)94~Lk~Q?h8}U28+xc&X;@=ScBmLY1~~gIV@!6vfO_tP zkTIX32axTC9yxXp4$DqMj};S!9wa7t6BElGLk|lxh8_<(ZF(T+W%9$=t(+U5fl8Y- z=CkR+UcjbDc|n^V-qqXmxGqXK24C$qJ(BCN=^0y27*c*GLG`GvIj(!x)f+vstxE+>Jgxm$rg~{ zO$8uHIG~3Yk;aprQhvZ`S62gGyIKmA+tourCG#V|Z&x1y0j5ILq-R&Z0P5}PA|Ps4 z*8}aG@B=#7-~u|CdI1T$`VvUm)nR_pdBNYN=a;@*sQep*Mg^~d=C+8=*MvqF zzYERPO@ViWMk!~YcNMD2_l0&Ash$gYiKs}m|66EpkvjPN{L;giHl&0uFH+y*&NVpE z&xEezTKtRhOHXH+OVfUi1VW!xq$Lvw@4+w68HKdbtCi* zB)e1SC{qg3Yh@0yOXzkM&Y($DRiPpt%QEL zNcoQvI>{yx{@)|Mp9|enq&DEbjrficI#Z<1xPbDL-x8snZnXmcg>IGf3hi~P*Pst` ztEhgFq{^MW74_bd?BV|ha)vG3imI<=+e&|~4JL1kXv20cz1D^u9<^8-zVfKwYr{?+ zCDn%SJgQS09&uSuoQQ&0LfKckRP+bo1)Ac1=$Bn8scBS(@a8@C5_-iQ-LV0B8`hdv zD3SM}dBBENCuJ*8pFtNED6i6GD^QBEbC)6Q0(bOFf9T_xwc3S7(F}&>ORi4MYc!7V z>MZS1uD^B=wN}G3q7|$RchYV7pMm48}L6s+@owWLbvkJ!=XaAv&;*9 zC*cnhx`VfSp&!Bj&xGzQQ13vmB))+{CkoW3&@UILdQB$_R4?>HaF0vzIq#3leJ9)(7C8@8DLUlFt zBZaD6x82S{wRAegbm%qTq(k>g8Hf6M3VCNyb1GG2O${saw42|WAqKdA9=9ML4*>N% z$p}O_qXM+&sU<)M0f5dt^$d{UTLK`Nr?vt;-2Mq<@>KCO65`cn!0S|_fO5`g0+k#c z0sKrpfdJD@Ajp>lK)q8v4@8~nO`zSWwgVjqNPzU{w1EUqRsl(;8V~d^5CAgl0s>C9 z;{Y#L+5zS4!vU4~>LtLRuigiO`Fda+%~xMRwX*>Smpby*F+gX&8X-K(SAHOwZ}BW& zGkRBkmeEemiNNSWSC-LUmoU2YFjrP-mb_e-BK}?bmh38PQ%ek)bG+t^DLLD zOp1GefVf{s!+THYAe(bEthvlVwUVrNsiDv}&=9o}i@GeOMlegMxzsG&?!tGB))p;AA5XK;3)^lq;22ONo>k0QgzQ1OlvM0zsw$ zK)up4uqYinlcsj=fyJ_ejX0oFshfd>QV#-2zA*rLl-dYnlKvfnu4V&K9%KjF?WzUnV5<-4w5!K~1k+U@$+{_!VUG`R zI`jsR*P(ZQ%Gt6TMnc?o4*2DJEE00)y`CVObWrsiGzFp#z1P$3(0e@{4!zgY>5#pi z(v2?LV^R5D#aUo`xmgVE0^7a%3zj8$ws)3@O}_%$u-nD3&SiVzWBGhE>9QT64exW! z-y!1kk;_)9ZytHsW$UjErptEQVdC^(m+ftB_{wFQ_mKoQSZvU}j>AxIYJI!Y}G3L~U!G^kB8;0;Pi8kr;|+DNHcaF|mNrZ>RFyXH;mU>DFx60Vw1J!QuF{4X zhKgzfpR(Mh4RZ{2zcz&Uf<+tnrsV}~xQfLaZ3r9c18v~*$nUga0XyXSo2Uju`Lv;l z8~3!K#ZXhVVTqwG(1u$KHCr2QH&jR)7O>8uzr%UUX7lSx;i^{arnCCoO=nNrZHEn( zN?D#W>~h)S$B7MBwA_EC7`URvG8hH6B(m}U|NH+i2VO~kf6Lzg{!UpQ=l3MPXZStK zZzaFy`E~JI&+iR>oB8ekFA&*2JCYLg!!*~9wQMkvpRBSQ>FWQY&Wl(M7eWRfL z&`%%or2Q#-%N(D*rOb!-{;lJEQ#%`0+40sg-dENV_8l^G>q;9WF6RehQ+Ijj1F~afO;eoL{_PH(D3?&Tr_oUE{p&f|g0Xnz@B@?YN#_GuH;pt7*e-)lh=W zEo+fy%CVgj+uxA-{&&Q|wLd~1PPI5b=MRCu#VWj^Nm_9ACeL?Ic zcoL?N^9eSuVOOuG=>cUJ4ZCfg#dm3g^4#=$40EM4^Z2{O*FgBT8NLNI6`NwF`2vn) z)YCjq45Q`w48zmx=I{cg#FUeL!$f}6&0Tp4IXP%-fg7OjA;;5&2Hs&9QC_ckC!?xCzh=Gya zr3-G?xs(j9aFKe&rWbCWK~3#=ZlA2SEkH`%$8LIT{pytZ;=$JS4IkRSc;I64HjiAL zU(tm)%|K@6i_8r0+;kY}QT;QXbhM6l)KF!!|8JRJd~!DPKaiU^9I~wzK1IGQxMo?y z0$<2+ZQgRxl4g+Hz_ME~2jb6ZoGx`7Gv^u=8xZ2RanaS>EC#EZ!$+^$Lh)A8DH^ez z=EhN!a$BFp4)aAUENPn-I!gG^GJ>${9I21K@9iC>Jk5)K=W#gl z`{XomVI^DBdbh8E zQfuJPOS=3d*X7<_e6ta+c{V zhHFA!igazQl;XNpNkO%y*<@C%up1SbiVgeKOw5cSwdVS7a&;3P6Gh$*W|I8nI(bL>QZhP9)osmX zvcJyc=$hJ4wRk&2dvlAFSD_B(wM=zfEIK2yQ!RJ`_KJR(mn~~Gtu0r?DFYsLT7w_P3SxvQe!2GtnRUDjpVjTkdv(B;CWZ_>>ap})$u#!7-dU_t8~-&H@XqsP6f z;k(jn9_=e)(*lasm-3$=hGw1`#NZ*+a<{Jma=+B2D)vtOm$}rZl6w4Z%{WPwtWNTU z$VKRf)wcIqpVM(sq|guDEvm&L8@?^Q=3d(OB-*!h`}10yS`nuTi7QliF&z8u6sxK~ z6`SM5W?R-~8eE<-xt8IdN0)|+{kQNr~;V>iqxd(!YUpNm82Pf~W5|?HMk4;F_U+2${R3otRnL+vptg)p&l}l6W!v_@w18Z1|6q^IDD%<$2q6(3Ft7d`4X-2 z5>0xr=={5Io*tkghqY8YRtT>#4`~bg+(R5~3rkz7^Y$M~Xis<;*tT%cO6lVF_mHU0 zH`*M>S8PUo4w-fFh;0k$YR0y@s%-yAe-V0*LTl!kZ&u`3y6S0RspjUGmZ=uIwxwPX z`I#`A@;ri1STFr@)yxYoxM(eX_TafgTi&VI;CQgMrMqQpe&z$=O3MxTdkSoJexFK3zL)WJ}g_i{;sVi+GM5HWM%6SxoVV#dGW(+qTajbZjjH z)!K&nrM-29+3w2LwKleK?Uc!Z>9N(Zw<|KSU9t7%do-L8i3NEV&!X_U1F6`A{+fJn z>zICi^9i0rO20j&Hm>taI~j-f3olx`mrVsW$B_08v7TJZP(sE5RsgdM$A?v2fo6cP zSC5=Yb{q|@xhwo1jBHsL;xwf;GT&#b%d6-jroIG4jp^t|6KiSRM^;Qf<@{Ox=5JN_ zaE+y&=6Xn-neH(@j7I92RzwZY(o0T>U+Q2$oS4&i{5+dH;O4`L_YC!w~*ObszIK@wulmq5}bewLAKqa84QafUHg9@yYPawn(r535MiDcOT^w_&I=VTqW3D~ItXzEmpJ)*bst zY)7~Md>N;jb>C62S?6o_g0;+GZ^0tixTxePC*xXJVzGKh{2mEw`f+`@!PEQ@gw{{7 z9agLro6P`jt33NVm}iQ$sIr{b*n8#)Vpnv4*D|q|5!^meo8RxoI{yIc9%)UQ%>yV}FtVuRQcv@Ej8^pDmF~%WfyF&WtPd=1iC7<4+;8Ymf26ouu+A0t=Y-4^SJySQ(uF(2?B*xo z2x2k+F`D_#Yc5Sq{4H$0MYAbew{!8CDwg)1t!y=<$n-J_8_%})_1 z9o41Q$)}#(H|ES~1qf3v?xefg~@NKf;#;*zbm3neS(qB(P=v7~Rkcy)x&jGyb8 z9D0rBW`277zAbS;d=XmbOPt~-N=uw(=AR%s!`LmF{E8g4YcavJVN ze5JVF%ZLY1BbQm>kvzjZPQn-Gw8;iflTE_ULQgH0@RpuRzhL!Rk>!$eTlh3{0V0C7 z7>!yuwon_-!Z^Wg8EZvtOk8-0RvS;yO7L1WE}af7BTlpPI7^Wpq?Po$Vs*c^Vp&Re zgIb|wuuu1BjoI%qjGL!u>oYK$VeQ?Wel&9ZU?W^i%EQT5tWgw>R$oW0H0@ZdH|HHJ ziPs&ZnrM0%su`Ro?Ee`q^*`Z=B4#k!l-Dsy!#NqY$W&Fc1=b-sPfh9flI zT-QR)Ph~ux>i}cjRu|}Lj!I$sdOFemx~H2(VmVRxiJtB{ou6z^caoK1^6{S0%tp&^*1R@PIW+j9fuACA?f&30C)cW}@Hu3Uc24hF6dv#K}uSGb6DQ31u2AaxLp z$?7Vsa$og`Rqn_7${i=NTs)L}1~Khl?z(9|Qs%kj$(mJ4@7^08FeQGaYntxemq`<> zF`IO*OG6h)p+;IopvYgHM~m=DBOj_WYK=L}kH5B>S_5mEbN7^D0{KbF*lW7(hp#2B z)O)BIsmsWAH$C9nECadXRl}@Co7X^jSYLGbXw^3pXKZ!jhorNk@mu~@g|BF)r9Fr7 zul!t|<~4wokv%W@ofI~xB%z_I29cxB-1 zBC$Wy1&a!a;E-lvsqsS@4^7rBT1(0B^8GkAIsTh{IaZ4g84hWV6=*_+Lu<~>3BuQ? zUq;hettMl4_e@&STCH6EDtvxJ`*5Y--@j0gf7O@Mw9aXGO>6#W)6Y3c&)RIWIqdNVn#s5Tg=Qlj_6((%JOd}oi^HP@?IUzYhQ{mMtW^^ZqKu3 z<0rjFZ|~|))JXEZFrV3mI~W_Ve>uAe!}63nvRX}GanPN<6^>d=vg+w;dP~wt?H_Qd z1a$a<@v4%Btv3eo(l0prXd~qhF7VJw{3u*+6=f*x(fb|Wiiz)QUbcOM=@38}cle7b5GiQe{> zGFDdM04HV*wKlxT5)gK<@GejF|Yt>qw5*AvJ1ir;Cc382|-$& zU(nRn;Sfvbsul@Om#=aXNQcN-oAExcdm6)a*dc?bb;tnX+9D!sFVfn1U}VuyTX<+H z6C?xlO-AYlnyJo8`eD4y?nho`4UO!!)xCvQ-(fBwru5Uqm3~m-@+>aJe`pJZPyIlP z)*YQpNnXLZZB%JIP}c32RYIe2moRZbK*zmrj^F(}SGYYnehE9GY1XM+duC*j&lWzJ z^j|wjGBiXobiB?`8jtC>euCA@vt43j(GXksORE==nIe6bRy~ebB0isrZ+l$$Y#t(+ zo>;h&ewZcCRRU%byF|6!9@`don&pSt4a=2bcw@J;74tMLik>E!V6CJlFl2~sE|cM~ zL{Os}%eQlDbOc`>%0kU3pW$hG4>wtF&yV@bxB-y`y0*8lYPhk#-P81T)^WmNEYQaM zqr~Hc0Wp7-Huz%x@d)dL@|b_3ptsvUfB;6!KPlLFW}fYu;>?6$Dx8nCa6TBHRT7Ns zuJJT4g^EuYKH9K3jBCYNLdne3c1;P8XX~?Uz3!x@Ot_??E52w(%Z?E{7usX~8IeUy zZHgm{W|S@>@QhLdYL=!RbxEZ#==oCQ;C7*8l=rjCp`uXm<19RwIa_Lu6%f-O3IJE)8o>F(yRkl4LGMlIM zwZlhSx!^uFl%|)pO+3PCYo4~hNRfu{hXR$rn}px45>7|!gc%7xPc!*l2OV^f5$yK6 z8{{ufhw%4!qpZcB7rAkOt{1j*;~|?FK6eN2Xpxf#T~Zyr-^oA{xJ?C!Hyx zFP@nuBw~S_#YYUOxJBUF`Ky0Chpu?iMx4o_|WNk0<{gd+!Sq& zPCh%@`I#o9I^L|#jdt=ayWAXZ`hThOJ#*A2(=s@)mZ-8LbTV}@P23s*?=XwD)8@~_ zqH$4~?uJjT=v_IUT<_Jf+IBZ~H(+JnOmvOC4OC>^=7!+;-&pGDz3bRa>Z<6CbUCCi zK6hBof9!7CcleF$99Z|UHEXxT$Lf8%qf(Li67OlmD_yfBk~awHFkk$O#2M*w#TN}r zH02M#&NEt^>(c3FJ*tRor+10H5f4fK^1S59eD)r@(fHE6_@!T@PIB#3!dczQPBTcv zi3#?+?g_ee#&)$_?9_^g?&qO{_flWx3k>U!ps6bd6I^#XLl|f8rLu(A*6Y8f*_wJwf z(!M**KT}vK$UY_bq~Bg8uvlSc7_(81;VVVi=yJ?qK)z2o2I_Kj5?GhRn=40Z6oR4k z<9TAB3rb19u}==sl*@(tduhsFkW*a)^Q{_Kctwu;CN5;!`D5HaZtuLCRaUM?=Cs`o z^D!A_i?(x1Ii&dt^KFEp`5uwF6%DSLT#j?fzZoV=m-#(xO&91kcWe+DdHYb^o>M=^ z!~a%}EAAGK&(CH4gly)8p0GW^W4cCoN_0plI5Dw%zyUb@!a*Qv-b z@JEW_q8Kt9)VK7?=QxS%x9D0e}pDP!+&vR zPQxE#*1R5e%z^qa(YH z_B1_0RqIxGlcZ&{(xP@8HMP3*e;4a*3>A?r+Q{T-)5UlC%H~aVFE(!ouVS1v*%|}v zu8E~6M0nq{tt3hA9Fof}D|2bDVYcfyUF6NdKA$Y*>ZESWCROIEB`KMnBqawSZC#dI zg;`7TkL!v`|F@4Pvg9CKnQKfIPH-$?{xI_s$`_3P;W0XMYa$3g;Kh0S@?w-^?!G;I z_?87#R8XA7kLi15?jvno8kfv54lJFVlCxFhr3+R(Cv0Z)!PtIs>=uyTqVk}u^hy$oNOfnV&mr%QmW#bD6XYPJuVq62)CI6u^4=tkORt_} z2dbVWV#CK8WHa^KTt!q#MSRI3Mz$j=O>JQkWl7xUWce8u98q&Ud$Rjv0ZktXu!ea% z%`MssTmMt%6tKn47C)yF5>uEK@}04=}=q$cpf}1LJ>`ndgXiJx!%}kIfpm z*979~4=DNGtHXopX5^*^*2dF$_=xP}z|B46xOaEoNHL^~+(uaoUy3+S7yWC{y6e^@`6oc_$$hGbJ<6dIjaT`Lif!v5( zAB?+ISk@!0NsGDU--zKZ+U+!5v8FIRqN8=EKE~Rr;6(h7GB0IC_g#v;`a`>()!0_I z+I${;I4pdaY}5>533!J&6FoC7Ve@d@Hav7f`W0=NMzGVV$WBjPL33~2;i>w$a>i5o z&!Q_yveZg4-CeOc{mRODq?OBI>>f$k-1;x_Ifg*iBD8~L`DARM?|Er2twB$`)|FY; zPr*xCw7bu zRO;zmq(bYDn2#;_CAd3N9cxKY<*1Z6M>wkS+4Zv$c;nTNRo4A!Z8`48hQokIux(9mwFxH zBD;z`&A-7QEE-s&7hFQZqA6%o1|{7SW=n0P&c@3Wn0cX!PaMQLoh^J&8=_isj%fZahP6|Z(J=k(_N*ji!tHSTkHn@CdX?Kkq;!5Pu)5dEcHBxG58G* z-Qb7Yb{@Arwwh6$iq9Gp9BqSLONcx(#?uf!I({WpJ1rO=qpNldRV#hGuG+hFjAf0x zb>>34Ss%%O*=ozkOkh~+1$)WNeDV~(XD3n92x9Mzi#>OXL8c?SU3H2h0~2xBBemkq zJZUq`fA)FB{=gt;BPC0htz+z?9N`HSn}YGlCAHSsO5GB)`253kkgbYMjC0`g7&T(e z!g&0I*v4t}V>OoitaXevKVU%~o>O~=bYTRB%ox~Ed!x3+P z8rN8puM{f=3w4nfp2LFa0_UxbxU)N|Nvz`MPnr_yHtMbj)>OhC&cA0a7d!I0pVwt#P0agQw~BTC z0oK=wwG0#X$%r{aN8-fVg>aZAkWVi>-~5>UhEF!`H5nEAkV#GeIU|J8M-6w*}PVe`kJ8Fl=e?0^{ z2X+Xi_?CfVhs3l*2e7@~Fv1b0rMk1RrQZ(4r7_H+{&j!cxK5f_>VeBR1NkH_>8(^t zJ}oN!$zFAqtK5NP+N#{N2#>B_7k2vObm$$4*+I;)*D5wyCs&AD(ut2L&1RsjW&peH zdonG>8aZ}YooD3SA$5g&ifswi+CE9SFUdgg)9}EYXdRhNy%qb&rw+Dw(_4^T&4b>s zH&^~|W3Q1m%>gMTElm-cdZ;f@Gq0PCz#Yz@=GqnRd5UtanvwixwD?=Vc+ zBaG%hnF7(@aA|A8v!6S3Y; z<-9I-MZ~eMhF&Sw2dbR=#ri;%vqY>9R5^8hk?d1vv#`$9=`t~AU9G7@88#1Bd76GF zB7_3iS0I?gyUoM#!YtKo6+56rWK$cvZ)&^uPOUbZn)tR-s}kS)a71APN1A0zKdYK$(%;R3Uc71u zg)ik(t5U{m*NF#?idgx}?@Q+!7Ltxin?0{nGA8j-x@>AkZ8JAowxy`9$TmmhCHdH) zH2rrDIqb)Jvjd;GjxL3H|Bfz--H%A!Z^e2)sk=z*4wSm_Vtt_0oha4^N}X4%50tvz zjWnn=vV=|zS*$>4zIltv`h@k0TxB5|LYW)!zL#j+0jUE?#8vx>#)G)+D;l>+S|J)Q zV&Ot0U3=2h=SjbLD_%7`e&eVZqJ^rZ5-yQA_N#sWgT-tjMoM?GJ5qm4QIhl&> zGPl3>(;58^w|z6ZO?>a&3KZ(Y*=c%EWK7dQJ^j6q{VD9Y^pmG8dR5`$P>d*I*U^hdBZWDzFhoC!fV^cI^+`@hxr#B$>V*IEYp#crdLcE+S@W( zLS2+zf6H0FoH)T>J$~HSF;!=b9yRjx5yMZbJayP9Cs%kF)I7zG!A5?69B&v8@Ou~Y zgety%0{hTlv4oW$9m z-!y)+`TdsPB7S;y*|>e8lEXM}t&$m@W;7cSo6KFXZ?$Ct>l}lSpPEp*QNh{#ZphK{{U@v>%X!l6w@C|#QN{l zW{0*HDKaOJUTB5z^-cbm@1QJLA7ju@38&73O6^h2Rz z=8;}Vr{@R_`3=NHS>mCqAkNJaXI~95CQICUEyS=aF@ujt%wsJ=zHFRC3aL9EQ^qnM zDcmnSON~Z|yRD%*>@-p*Lbo;fr2nV^hY2oUd7TVm4wq0<%%i9gS{9#G)>ZO-^iX^> zXBM2__=B9!xbY%}u@bm>!-AQO-!>5CjkAe=Fjo9GQm={v>@P9ZF7J|P%_u__IJ*2B zP0feWEJM6gza%r9@VH$kl75hQBsEDV{YRF@p3^C%@5Nq{l*H1vLCEw#CpMeJy7Qzm zH8~mb$szI4A{mih`@*y0#gdV>3AWfj@7Lnue!dKgR_Ez!!u>{ZD$%cv`TkKx-L?~` z8S&nn@igTVQ=8v*zt9P%k^Wog`1us>3}I%T2$)XqLs(CCWSFe!*P&Nlf=8BHzLWOf zRaekZe6N;(p)2QD4j=F1pwfq|ywY-b*>bqd3gNKwE(dLIAlfH~#QyoeWjkE7SC&`K zuwo7CSUt_Mwrs_mpMGF+=-0TK+jr@j3Ec#dx>WO08jLPW9*Jr(YAtQpbxAm{VOK@n z!Ip*5(&QU}r__hkWy7wM!)C*-Vd0N!LXSwKf5=AqvP3FhL?C6-l117yhD6#dVXN3M zCAP#j5m)nXjeSyA&ICu~(pYd2CJDpYJo(m!t;i*sPF(?&lirZ`dg9Yn7cl4OXxuE0 zgjZw*I&>)RrjgCoEQnM+h2z2jOZ?M!cIS!ykaSWdM664Rqo|pbd_U8jC)z~2|5wN+ z-#`dW|J$P7Ir^W_7MF%M^a|U0_hH+i_)9&4pN3x8Rug(avUd5mRyC}VtZgO(-Fc#= z7^@noMfeRpfCO2kv>KMV2%SX_B1=F`Gw@-_%H&W1{j2HCMmHKFwS?$;^F#rrPQhb$ zp6E!ObDt(feQL5ldk{=mAq_zlCvmYm) zxpD>xE}tb?s6*)PmnC;uB$qPBPn9eLSZm+BlkJ|+Tzuu`O7~$S`ew9bjghN--%h;? z_t_p$LX8$x2Jtmk+1W1?V>Y3L_fYRzl;{Sie^``E<)NPEZ^Lt1XrUgrD9IPpGX4^a zC@`qoEK2GZs@bB18&HU?_|&3V_v^@LQSCLuw z{eH3HtJ64V`|FHAXsa;jns21c?(}P+B|=`NNyqXhAXY8FznMXfV}}b1^`=2+1um%< zVK+Td{8WiDV%kUSs2k3frIqMLPuuUP>-`e7ddb(vTHR&bh&kFs1E$xH9Om=1$;r;x zj<$d;)?cEGk8d`f9HN!pGOa^*+C6Ow!La13s!xkHm;Rr$XnH>_`iS)|?G~l0-qYM7lvVwnX4z55ih!pXooB>{Wou-Ir!9zV z?^h!^4qH6^f2q~!Se73n=}E_Agl|u;2pMD`^&si&k%Wc5{nFf9^uFPgl!)F&txZP} zO}vR~7g+MjlREdbJ&7>J9nB&p=Gi3HYdNRiF_)Gh)Cti#y6x$&scHhDLFB-^*NT?W zfz+OKTi;VhG2H=6kIK!TqFV0u$uJPrJsyxQL44PQDv3g?%^LH*-(@=jn`g=G7TYCv zhG(g4Gqa|smlo+Yu%vlKz9lzD5P7Z?jxx`Zcf{us?Q`{qD(ez2bC1~QS^6?=ZDVcd zcZp#{!n0&KHdMUCTjgnc1S&S(?V#9VlYVyj5yIgznu;Ehh^5YI!*C?F5K50=#5y!m zIMM#47Vpp;2=45;$s$pzn%8%081Zk<(ys^+cl=p~y=`aP;>$&<+G-qfwZt20dsWtSnZEPLTw7Je|%KBSCR`VqJ5&vG0%oTOv zE3p}6eZ_ncen|vlY%e$L9#U5n(_KxfmL}Y=`^35!p(GjFo@g2FVS`KB3!^k~NDank zHfs3txkc#)!&YXt6*nD3xX@QptgF7zTq1EGpYjMLXa#+fb`5D%(&` zv#4xCJr0VJNSq>r5-F>Z!Y<+KuApUP`-I`x}_5 zge^?1|9uEOr4JUSCP=f%@u2xbi)&f6CRh02mQ`ynSyWc7$w#7lxb;_y%5v*2%V(Bb zZ5EZ~){RgwM7RY*ny(VF%r{c2f6vXAKuTi`f_hR$1097|re%XTu9t06tbGor)`f?$ zS1Y>smS}{z@B(7hT%GE0M7kUk;_f?yfjNImZkKq{$!s&=1X&j?bHw_EN8vduobg*E z#JJe)4jJ>IDkQ%2W>OUzPa;iix9c1&uY!A~i#umw=gpiWOYIhc>KhF_$p~)`?;fzI zEbrQ(Qg8DoR4#Sc^BG>(IYP6Ac-JC`^mK{z$p34kO}ogeumGz?W`F14Z}7b1SN ziF<@$Sv9bq>^+B5e0-Awy(>J3Xk|cwp?)VgNLeWx@q=e+3%1#|`n)Jn^YCo+x8~aFrtl%zcB-^fUprk9zhEG2 z91I(MuyoRtEGsvEDkc6=R(5G8M~;>EQJFu+%DZ(XmqtL_e(TSKy#w>U z(m5ir=vV|&cpJY(c#3Eg#d>)}?5%-H`mfie zneK@c^WRwhdz{jDgr1YwALE+@nuqRQMM@j+5ZW#-w_7fH1Yq7|5joaAs&hHwzx4l% zeB+M4>;8Y5E&fL>wG$mIwGNnEYxVtS>#%)&|C;#xfpjZ_>0*3zF_Wg_Pj@dr*Zu~k zlhlLN2{g@tw+KyE^}Isf4jAv{I=&JA=W1Z_Nvc7TkZP!sYB*0Ha$SDXqCTeOYGT3d zj_G{IkAu0GvuOL&#CYa2>3gp0w>NVu@tIz;(nBIv9c1g~@z89E;|v{#BPAy@gx`yW z-*ulcDC{eQGSI1Z1k zj<#unu+bWH%FyEpVY#ef{g~wc?0;i9dTuCw_$0iB6oz0l!v5)@x1_kI>a<ONZ<$=(?Y3uh(jSRzauT-K;(#@5X+A}k1^NbX$5>RhD?7xZvIDpRsJmt`0_jH3a)MdBR z9y z1BaN^iDh#*GS`n>!(7HH+ig0KBUd&wO}xyS4s0}Ex@}L{&T_=>+*7s_C&wo__%1+~ zt;R}Mm(42FMswI^-tC8A)GhP)$DzH*X+orwN}3|SEY|z#lD-%yJ%i?0$N46+eA}Potu8Y zr^vbLtfDf9GKANKy-WxE(TW_r*9uI_0kv3@?f-T7f$0~1tOlJ{yh8S#oA7asn1YzY}fn+A+u|>*{jAf9O!4Q)?_}ATM7CbA@*4bl0*M+O;|sh=@WgR zUMj2j)MC4^9yKh=A&|CUEgPvs)hsBYL4(?e`XS~9!w?q0zjI>gMrWq4XnrF zwbxv&EnTrMxQX@ELOSLy&ypcHc$yY4wa-r5%-fjPr}|^fPV@BG+W5pWN^;r%Fka~j zXForZy<{vGXv?~^?x>)zd5TzW)r*c?a&ZAR7vdw;*F8bj~^Ys;}=Mo;Qex>^ILNpO9Z<$(a^;2_zfX z>rKBT#}4-4%hwQDP5kUhlOt;#Q$k5e`pGTAqq6j0v){JmFJF&!`rYOK6xbB6Dw7L@ z|3DOahPk#jwg$W0{YxiAmP@&8b>)%e4`VRu`b{=ZeU^k*$H$h%TEy-G9q_`nT<6Ex zWd;=BuL-kI5TTyUy1zCTMG~x^2jQr;Zj+${e zxcO}?mK&5`FYcHZaQdI+u!K485;zv=_ z0#3I0`?Xeo*Wy1|J_G(PR{csv7q^NqHK^VhpY}?udY!q2m@&5aOXJmi9~g^n$2ng8 zL@++HD;AZpPP}?uOdpFe2U1Q+)vk{xB_)_r}i*{u_A1$8SHKijkqgceE8*$d(Vn3l1eOf1K zw(7WI(Km6`If&1EI-AUUIx9Kql5C<+=Mt3=vFJMfN}m2Mp4&C0<1!B-(YE&YwI^Al zUhd<&8hswhEI>_JX|QIz>`DZLnlRk?*tM*d$nNnn6+-$m- zu+{7Ex_XPNV2#uY;xef>8DdvEV%F*69j5J3t(2O6 zAWJO1{US?lfs9kaikn!W-~lPx^(i!7Ir9)4JqD9p!kjun$i`kd^PV-znfHS&TTZVw zxh$iczWkomChK5o(-)Re&S3t>GRhgu_r-{?dzv;`rjxlM+%na8nqII>0Z-G@mWex4 z921mMQFMnq!&jJxv!{rtA1d z#WKzDG|AnOgt(j=y~V^G3lzS>GB#o?w~UK1{>(B)FqT@zCX9KO@&6(1O~9invViUG zq=5zl9Wg*q6vWm6MJ0$r2uKJ7f&z930YpGX5wC$kg>FQKK*vsNI!!AojvJ%6@5?w0 zvMGcmY%Yk3ps0wb_u8Nloe%=T_nxZT*>t}Dd!8Td+^SQjPMtbcb!tBq##zgb9u)4z z`LlN3gY%#`L#Jk98Ak*E0Z{Bgg8DGdP1?B_=PK>IALr}Zxdi7k+W8R9N5mOAwSXh! zxU3QUSt&|nRT_V^nStE(k-|5v=Lw;>XTGevq|;e<#{1<<(iPy?fWsHw78q&wLAfiV zd2~bT=>b(YbkXOk8;a(xjTWv%o5#kxhDH{P3NOEDUu4qSlba#|wEw=~3Ag92ne3ig z75uTUklB6KOS;c`Ix%r-Tir~Z*zmW^;nuQsfK{3hbE-f~4NnS~g4u;m%Z9iDyG_<% z9r2xXHFN+fikL9P$QeuA+l$*r?-G_c4bqI8O7X+yD8c?M+HNsj5o>BKB0J5?Q57L& z|I`t1>#h&;q>RB{*(?2d?-JU9+72!-X8~b+rMh>shIrS-KcF8}!wt0gR`Y^aWGo>q z4C1MwRkFY3P^o-~UWt~7W;A=muzG{ffv=F&H-%A?yqdkSUkL-zPsdp2gIs#8>W0DqSDw z8B1x;qiwjZpbI=(0>&DX$%i@nGcBQ=*G}HZV5`b3pqrb#v40Q$dzqgXuZ?_^Q|8Ku zFORmCIBZt(goSd(*U5k2rI(TOi22&*@&nyHhm@sic8@3Ko^FHK1X z;WFq+Ov-YN_5?p8CuPih%@7LUWn8ubuy3*6uEMkeV9@yAX*5oKROD<5E8plYi71<> zW-Ep2ZZO;Xd~)4v&;J)~d7_Y1hNx8JSdKkyNKr9Ut?j5}J+*rG6D1=xwOXg9R{8Y) z5v8=OXFyv$G?BaGs1XV^Jv2bh$~gkfbn%JDx>GRo5||$;Oix(sB8CRY>9aa)@mN<2 z_Emx{HTfAE`yQ}Y&ZQ`=o`h#nBL23eJT`9_o6+<$= zT(~`JqBn2hrpO-a2O{X3utU^M*e@Hk0O{i&ye;L5p$G75td6UjOQ z!&S4baV|`yS?5*kcR`lAHUt_}Dl9={XKwf0dz@k}ccnDaYN?Ev0LQL%MtHg*{z-$B z7SyG*d%T@NXP_fBE<1EQdExWiH&$sSuaoK%f1p9kvbvZ{>tl8jHbTcbd+syHvc$#C zhcB{4Sw2WaR=Ldc8TV@nsXlXpqL9WhUQhT^iI||$RXkGt_j(q!$GxgEY;dZuM& z%$)omY$8wEN z^-LpRDUTQWSd1{gor>nEV2}}BKYx7WfcY3h7@RjlyFJH!&4n~|I_KkRCF5bVMrMtF zYN7GFq*MK&WWlZUn0YS^fc|&I6h2$cX=r7!MB-CzxX{=v_>~RuCxai~S7>}KA+I(J z86qKTAaX85B=eD;{LPE>RT-*u^>M_Xr~ZZxxn*P+n}{KgG%u`oMBJ<$`*p@)Ojd}- z<{Rxpq;Qp;LJvHYnHzz+%)6z$hH$xQu4}?`KTZf_mCSYXeJ;?eWNr%I34!heyVbiD z3Ddh=h2O>+46!mlD(*cf+LJ-F^Vj$hMWc2?psmoTg+@zg@ST9w6Ohe+qT(kjlaH)d z9xgC4gsbHrC<(^D)C!XfNmjn*Xku*K?>)cBsLtG7d{(e;w%?UKH2!OFuCrU9Iyg7! zyg*fOZgTg)kFjCDXI2)E7W}a;=g!Pp&!QikbC^mj zg*auME~I6;Q1>oROb$~(z*$8)`hlpS@$UeT+RL8sF+>#XTj&W_iLBDR7<=sPEzjx5 zkbJ+pd~CXNLo6p9>!~qW0B{}&_QN>mW{ES;IoK0kqg+YDJ>h>TSMq3Wu_8Dx%^B!H zBINL-312eV z6HS9tCVP{#Qzm<(wNoa0!?aT-d;P^3&1tI`j%)}W@UYrfQR_-L+@S-VD{5Mg=5;Ge zD9F(?PpJn55TtbzuN_Kf@=2DyK#M_KDo)LK++M((( zn2`_4IytS?ii58HwZY?8`rn2Z|67?>@mXb`H}31*l=`4}Eb>A8K_)AKU;B;!J@8Y% z@h1aTzwxJdzRF6r?jWBGb^S28xP9}s%~PA#G^=j*TeBn0era~IW18b8$5h8(9a9|R zc&)e4F~(8g812Y+_#C4g!+6Gbh$F|5?YPo$xudtEm*W!0g^q5H3mjfY7j+0>?<|Mo zH~Z&dNB)2P(h2+j`#TpJfA;&G^qUj*zkUVzEPs1Xaz|!BdzMw_w1^F!dOdn=Rd*`< zx=*;#a%9>Y+>!A@XJs-l2~>(wIcVD&B5Pm@!uqRrKutOF$6_=4bMrwFbR}l}wwh%) z>0te?%u0I-%@i$TJ%9ADfj32NG8xRut4XYR{=AJkqHYw0Ho0WA`WYy%fySwK5Hwr& zY+!`{0nB(w>dJc1K{Pgq=ij#H8}U4Eds>#_dDQltFP=rVN4?Xu(Dr3V%`jqH%?! zc&44m4dQ8yC)!TtOfa7L8K!Odq~qe5t3CF~ra+O=`W~P+0BxM$MFPIsrj-!( zwF11tCO1z!-6dk9GJZ_JZEc*l#M8{Ca!X%Nn3m@--V^B0l}$?KCxPw-N^P-a)4t?R z-fG75dTT=^y+(%`mz06}dQ$=;1^S4Ma+`Rfji|LY?iS!28{<{+++us)70*OG(QCb= zk9Ay~>_-A0Vk3Pco<4XQ)u`VDdag!k!uR~vhATp7vJOoMJ;OLppocf>hH#m9_TyL-%H2~I>h*0JdfF)j*IZbY)__m zf_S3Ws`5In%BxU<29j!aUC84SlFv)iIr9uuq^G*+Ti>)XwLBy>n48m*1@1bAr^-~j=i*#vk(fX!?mT-FP{ z9mZ|Uctv9=Tq?lbO@Mg+v8|GhQ3CPp>r8U4`v)a$dT~Z#aj;@Y#83cBAoZ~p#k?!c=Xzys} zNOPRwXzMtg#_Msk!QN$x<1|MrM@w!(ws17(vZl+COsB;>*6}7&zcE3F;}w3(`Mtxh zlHbSte&^>YaX2pKcLl$J{6_Jc#BUKlSASde!Kbo%+Gzl!*L0}Vf@DPo60Z1?^%A^`Bm{d_W_4vB)@6= z7V>+D-<$ll^4rJHMn;w8=Q7viay%Xu0* zEVKDgZEsI#m2&j*gm&RD`XdS}1LAXd{jvA#^Fp;fXI~bo?Gf0)taI#WqbuQNX(CDM zJOj+{LbZKn?Vs~isP@WP&(8TQRC{Cm@i{v~wHb4EglaE~-#2GdsJ6wdb#vYc)wY=x znzJHQd#;*LMxS7$;}B-leovJ-Z-(p+of^^ zTq0P<9I|(X=dN5(=Uh(0o^U^$g7FrM?YDz*hu92q9^xUI8}Z>TJ?wPEC*Zi@2o4?= zGJCn%Bgw<@1V)A9193F(isK3#!_LETF{X;ev_sNGc)FA<=DA zDSQ=rjz-@w4U{2*GO90|$)E(r*xP`C@oEa0u`T??{Cs0O6hyWcZ{yT~0X6$?hL6DMNLw|(1`Nrp)-qcIc(nkxHvujX;D0pGE-roPwJw@U;=v}- zR00b$&{!=rZnr%(;+blDL|>TWY|jYsTxEN16VCwKvrIfaZI9~2&cjpRiS6|d*PU33 z#>rA!fBr1pi5*>K=TmiJ7pqRpJfMMELwu?|)&N#-beHuX-DPc5T^6UO>96F4agF{w z=$MB^b^}yZNTKyE>`krPd=sVvb?x_r&xKgY0yUfR#M1D{3rZKM_Xvt_r#d+WRC{AU zn#qr^)4(<>-D2ixX5uSC$6fQAVHtD5j?nQ|;!0Ui5juWjK-%jnBB<9~beuFh1Fyj& zoGG^a9R}z+ynv+#qP$*0qCxGR9K`L%9bM433mg{zeb~oO1JX0dpfnq$`$lP z_4l8ttEwm5MWN96$KL>w_L(j7am)Lpq}%2Z+-}^72GfkXDSNaum~7+7!-)ptTd9gE z(O|Cq<_`_#Beb3_0k6hoXSg*=&TOZ>Mi=q8ZO>KWIsUdHYD^H%Pk0(un%0K&Kjvo| zr>;Ur1h}CI@F@YlW>Z@so@IC%HN0;HTCP!~7Nnvjt~6={>Id35<&-6WC)xCRiN|Mq zMu}%|JsAomkYC4~A))8%&^ln508{PwFN-JH_G}hU^$IP7uf$_%52`WqBTsmI5+Xe& z@Q*ayuD;B95^CYRhY0<*4y^-@5#SRx-Ra`F-}c-ko>DxdAPOrnS51&xCgD>xaw4(T z##VujvPoFt86+ewPAnu@=%-}X=FAHP0553*d|7}U zn*cWo(4~P1`PLWamlFE@a$O&kCf$ptVdpSGYtjuG$JV4Hv?hHm0aTjwO07vBv8kyw zlTUfR3e<(4i*DOqwMSF6@%wQ7A!tJd|RT7Nv6P_0+%_@Wm@&Fy*#HP=$>k$KC} zBVwGTu^w3`>qfRR8UA=enIvmE31yP<jt{!a@us!{6d*IEJ2X#{MWwZOZewehKhOl%a=+Bhu0VNHO^j{@w~ z1lU=CXEy=%6QJ7$s#FRDQvH_7V4^nkwz;zzxm8d;)+mib7E8z~9b)`jJg?fGed2l2 z_P8Fy^MLJ17f;ys^bpTn+cR7|)A2+n%Yt9#*9%)4HwbK;MnEh;N(7SI5b~TrF0&z8 zi`blRmXMBr7P4PLPH}RagbWw8!aQPo&Jxdea;Ch&fJo?(b}tFrW+SS`u~rZpC?R{8 z@tnqKJj_^}05%+E{N1LeD%wo#vBuQ3g+Cc)eDzzREezD?iMCMrJZ<4BqS7vQbJ*RI z*D&h_7>^Q-fG1ug;BoEFe+l<}+CAbG+#%eF#*@oPiFx=gx?tDRM5}q9ShvT-Jk0*SI4sdb} z*6P_Xpq&ob{tf{h8U~y=qPX_IOTbC(-YM=Qxa(N`Ob5JILBL+z^<%B86JxFA8fEq# zHh8oVCeGsmV~6twZKx61On*a;kBy;F6UG{Q0pZk*71Gh4Sk)lGOw_`i*w%VQaKJMn)UHhT4p7$faDBjPh zOZ<)3h4&J8*N4)qY|2=tyT49QuM>-WmK}uZo4D&3dPoPfGzoaPVSwD&Ax0kwSkN%w zMjh}PGhXW^+=6ZY?F~h`+=KKV(p{hx>X{mOWtUcC1kG_$J` z?e7y#-_!7s(OAq{SpA5FdnRY|tx+K1t`&EVb|0k6wXVQjS0rcYfEmdIoZT=WNe8^; zBEV$_s9A>fvm$GDqanv}CluMD$1&VcSEBdgA#rynur@0!wY1;~zpSI*#A=82D(-|H z2wp@&kL$n=Ik@j@5cu^(01E*8$*kvE9p^nx7hBh9_vT5sufbi%+o{71csqgz-ZrA9 ztnLl5_BO=q0&vsm z0ES4ky7_Y3MDhKIDF)T+Y*l|hP8?ZG@kO({VIhvg3LDttEcu?(J&uZ6cggW2CzcNT za)xS)K2Tb5EWP4XDi5E7z>A>#eUY=)yZDYBJucs8$RkZ=#!J#f)8n1SCXU&ph{I=$ zl+ZI&Xxck0ukt2~d3$e8w+->SIOt;EUCvmicXXOSm!9{|9GUBlQF2IRc`P&iUFB`)w zxO)~&7bsaWPxQ54Z;~$U_GESRE+q?gi}%|GvN-l7@32;U&-to!XI0GaOwasj;j7M_ z!M;9!hOvXR-u;rkx6O3C?qk2%H(5*Q_9r7M$07c%V&iUW*X{cW_?sBwj?RuFh^39S?cA6y4Ye;H1?Zg==;*HU@q>nk%$b)z zZ?E9fM_IE-5Q9_$xbrWpIs&$>p;V9vH!hSI$+jmCk1}0m{_>m(#yp3_Dk=8L#truu zTri;dm=^VQA^)!utgl^8YMR7rnuZaQB$nA88E6`>2;^P`aU%wyA-4>3y7-Kb2wFv2 z4s)gsC;!4iL$t2)l1N1xS#sh7of8e+==;*tip`i1Hr1^c!g|E8xP_HqMaO8uLU*u<9Fg4GLO zMGdkysTY#y%IQLRS7K*#>V9$W;HNwPvVs4j2b0j*mmIcN85nwdU!k|mPxJ0jS1Ck!+vIGr5Dl^%K?$XW_KRh~7X`tt&I#DF8m5Aldd0`fX$8e^0|x1^#3M_y}l$-vxMVt#<@iX0SnUiVn_};N^-H|w}Qv`6-3!wcynqPg7$IBsm~3|xZ5gmVY? z3CXoF@o6GG|8$*Y7HSCX z-X`Tu6%3oo8%+UUcW`%EeFF9n&)!(a}$YWyS4% zw9Fn)DbX=E|4z>R30b+nT_k3RRE5`ySPxrFbNnLi%9VQgtGo9{!G$lSbeAYj%-1tG zAiK*itx#p5O!9+zZNdEJ0m5wf7FFFPUsT2Z|KMI#Hg2;82hCvS_+<)F(y=~fkv@^X zglY~f(=Cg#r<7&pH-fpl=->m-c}%HR8NcEmcr9@)ko3gfu85$0^-g*!YePZ zL*0`S8X8)kN;bq9Um4BSXJd*NdltO}PHb4V+5E>ON70DYbaHZ^L91pOtxJ;F=HptS zX})p29eFSkY$x@piN8Q*C%x5PfF&$*B+=!OrOzj8NiPe&`rix z!droHEkG^&w{=KD_+qj$HY{DA>@Mux&zI`Ct20UV^PTRwr#%ji-Y-!Zl&9Br`p+Wg zst+6Hc2+_}yHl)Q$LiVil+Gc)##~_}kK|PSD9`OJr{SZyJ$=TjgmB-dhhing7GUFq z7Th8amAaf;%YCWkx1HYiNT82r#cio$dAE(j^rs}FKL~yEpCSq|SfmPJwO-QNrJycr zE*bEws2=NCaYQ1HwPSXDikPn}oYeRxY?y6ANC=Ph4kFOC$xZX~$&odaKS)++`;?AF zzb^)Jbi~vZZ9C0`mK#W+X)PnbT1^aP{z=EvqHAz~F$9EWCf*jvu z+#rhS!G;9x)*h8zTYs3LnWs+0SB3_N`Ehi5XV&qpT>cns{tDUiaM_sJWC$Hb0Whku z^a%JA?iZ3&H>gK*_3mpI38G3nD3Pro%JgQ96bz3p?4h~t1ZGZUv5*?`32xfcdweLL zrF>8!0`$?wplIS?yjkzaYmV>q+n%qmZ51ln?aE!Agi5ea%_xAfx0_ZuA z+!AFf7@t=IyXj94KBiMK;xaly#Qg0MUGO9DtdiNMc|b$-%y9o`HTgrqrma_nb>Dwn zNOP$oPX{Aq88Ih;wLxa)>^s0MqMS-UBzmVQ*kN+H;r|=VlC6WrV|TZ zrK9BH@Nzi|$YWskcEOWn6ul!_iVdaH6?b@vxHKDw$|& zE|TiGIPk8P*f(&oinK&*(yhXZDlyYM)XWyzc{pgos;aZVlO|q`Oiy3C^2GCq;BoFR zL|ZF?Z9`zKUjTN6P9K5&OqOkd2^F(SRGWTf(UzeM0GdmJYgJy+PQU1)5`28$;!_i1 znp78IQ&&T~tbGXqn&$jAio1qodJN&T@Tfe99L2u2JjPB^HgOqWD#89iraOh2W>idN zhCqY?skSg6b=j7hFraFeY-KZf|4KGNq2kkM>2Y~_Ka$T?W!!#@w z^&kZy5ZTgnI$@Ut{Hg>-T!4B!wwy}m%BSAP=D$7f>Agg?K>Dh~YjwLWy_P`e ziZD$}=~-(gpe9Odzxj&p+yYG(~afBs?G~ufR@qB5+cY_EDQ`CWQYh@6iS_QmGq1U%DF+mw(C@2qn zN{e#%C&EiZZB)7PCZQPKMAGfF8uf&yNlLQ?-pNj>%KUVVXa-NIaDiBanz`#drB20d z^^!R6NF4KlrrBsuSY0;czQ4}KIuLa>=B^QZS$vyw7s92haFIwD`QtU20t3sX2H?JFep38M4{k@{0&KSG2pDV)`i%QkgfcGO(1 z6!DoKu7=SgFq(175_}3#+Mp#;$=GJyBp|IZteN6oq!_l|z?~34>3p`;iyUgnJF*u( zm+B{~Qi_#HM^)eM>}rn!N;dTr^6^8Aiq$}NG?CSt(cMrtzR?BwvR))pJ6ZC1itida zdYRtHDyJ(2B(bXS%e%B1S$MBvoZ1_p`6fGFaM}eodGPW!M;)GSZd&VYKYJ@-$b`5$(3vpYFr`S zXe<@!Z(OX(-WmzFBq_*ZTg(~3)>y>>cX=)07*NQFJ8*x-`iyPmxgE<#rpvN_ z1t~~IV)^Nr8$2;cI-FK8lS|h(K{0rzT)Mtax#ZGyzH-T>>tVQL&NnEvVt-4Ts?d;@ z$cMGg`#6K;C?C|$8&tQWqwHZ2*pomxBh9HXd)Uwn?#qX#QFDSk77{9@j7qn8!k5!M zGe(t`-)M}QW}f{v$yQr~wN6o@d8i8|u#?eYvK1K#NqG(e}|~=XSH-MX;M3Jty*0 ztbclRjMvq)f3aC~Ch_cDvM20^oF>)N6TTUb#IbRrZ5jVFkdLxzLKPx}*GD5sfW+>p zWHg!@`N{d&|1}wleL#oj?)8W*cr4j-*UJ=%=k6l@29F_u$8nSgT)~q_;64E=351nP zB=C1!{Q^i}mI8?c3|w~Z^-7JgNh)rud!-~P`N+|VACf|A`%4R8`{)7C?ZyJp|%_ z&=W%;B_oxnxs{=rngsC(6Yo*dRMc$9xnZ>FM5%PN73j8iP{@?&qG%GtkXAkFv| zF)EPx?jkDpzo^_s(u)n7jQJb^h&V>KP8EJvM!n`;WZX)E$Y?zgDp5H0M5v?ikRgEu zdUkcA3Y8@gB^=$PoLi)5qK3RR(uHCR9}dWSaMHdRx%NOwTMJLHJhP~a@TBHcXK7C2 zD@KovKW9@jXOkMW-)@B!k>-(~qFGH_Ks=PiPz=(Z*e*H@>wGAqxv|#a!_L`PSX{y6 zC;OP%fJ6u9hK$1{wQ4W38(&nOf3Th%JQ7vH7;W5wkU08-EW!%pUM0g#OnO#T)OJ34 zj0w}Wsu&aobvQ+$KLpFnMdaTD1mgRdtj6d4(lr_ zy?j_^#Q_v|s&glnBgXYZ#cNlVbHggO{vDwWy)l4F(~qTjvPQ7iIymEt@-qkJIQPV> zO1Jr6spmRUuEe3Y;pW?(dajE!MD5fLkX5-kEiRT%{D>rcMdTx~q313i*T=b?&2a*{ z@AUVqr+$%5utH>V&L60!Xo%{IhIK5zM)yUrLFo*QV)s)v&STOEm0p9hp6Kp~W?43d zwQM(O$h49>T^M@0upadl9iX}>ru^U475M`yz|EexY~}fSu{Jr;%M$mX=H}pakjLIj z12R(^kZFz$e?|y8;j1+nVxxeio7m~^UZ48KiD-oQjO@Bt?GmxNC8s4$|`g9c#>y#SWn4bC7f>yDV4#+0J#UEyv4R~Eyrlg~LWuI|V zU8+y20C&W+difK5`U|wo;GNQ^|5Lf7Pk#`XQX|ss`QHN2C7UD@Z=pO>Y^ zf0kt?yqfD{g))W4vfD5E@IXzt!Lr+zjh8FyvY%Mbahq*l)7j2D zL?81k_F<+{%Ree=J%4 zqqADF438Ad`jtXY>{> z=^UsGqj`Ns9#|abI#{akN-RdJ4%E7j?oN!1ji3YeWeuB3I#Qgs8dcCvM^vVLT`jalMG#?41dOPd+ zL|XWQO-{$?v4xmUn~`sXM5L=iA}X&nh|vq_jfme{?(%v&_wVc}y#!FX*Bd;zKX{@G zdm4CyC#HBxWfQD_Yfot#zSb1}C~NugFa|Mw)?;Wxa=C?D&wMHeIkjl5?}4l9tf50A zB3mfI!iFU{a6pq1?5fyuizwh~h$^!w4a)55MrD>qndQxIMVXns`%+@h)|FUZqQt_( zb%~{$k5Ts$CHDT%_@<2YR`1>{;8I+x8WvZcDruu%qPS#?*|fN}P(o5T6xYHT|8K>l zA7M?D(*G)|6jfCD6xBrUlmcB;ZSK-Vm50bB;cOC)mq&-)MjgqEm(-P8H^Li~TSvUA z+){B!xw-jT*YHP`o3cYl(G9VrBcsexu24mHS~e$Q+h4{5+V+vFYzC9cI$mgfVp?jv zMHNz0e)D!zK4WIJ`p7!gyqBTH2|!UIVna1l;|X|-ucgKf)0puM#)-Pvmo<*vUt(8E z+{-2IF<0PpS@`AXq*5@-sCMX7v%u-0lgXaaD(V9E$x2PWp;OHRZkddJp*(IP;`u;4 zC)okote~wlRNB0PzM-I}Yv|Jn=%WhSHgKj;Sd@T7YFWlqX$#WQ~RXiG@fc94qy@_@ETU7x`6;45EC@?xHqio#-;K%S*jy z5$dh-tT02rckzU~0W_ZG0FT~-J-AR61~&56n^i9=g&%GM3j1{ZiO0OqVK{J53*}IP zEC~1_zeJ9YCaDwvc>v76(k8Kf#>h_2qN#X+%Z%?x#4OeH>u9J{eTli;F9kvdBgUOI zg<81gj4Gn=c<$wb790K3&_HfkDVIj2d(EEEjO@tRMJ2*KGRF>LvfvRNlICLC*XcD< zZ6m2}a53}a`Jan~j}r@2K9QLS%Y671oz<08WP90X2ypA7&so2^nF!WG)~`ap_rwl3 zD7G|^i^DpMp9P)~-e&4KE?8aAdK!h`miV%gQ@+UCQQXpQLcgba!dHsOy9-})G#AMF zQaNjxC?u8L-dgIi`XqXSg?1hd$3tn$0(JrA(eWwL83t9GrG{2 zD#^7_$)%8KDL36_G)frS%?2Au$G?iUx9^AvLZ1a$G@M8rg`-Xv@>-SXSC=;&TNebPz!{>#Ba z4#9;E5g8};>qG5`g%kVr;SM;-nV?#q3wdg8=_&-TO5{x(swP-suAQFzt}v7A1*^=BcepbvJoh*$8Es+pyZI`c)?Oj`oMilC4YA`!c~^_bGBrnv z@-b&4MNu(}iDI`1kR>QGWQhxIM4IsLux5gRUt~m`#@+}1Ic>;dPV?EF`D8Z_WP}g< zFJ`FvqbC*tB~p=7o+$&?pXPiI!qDbc6>&Uw%U}E#G>^ZJqyw$h>E)=)Yo5(Ye_h+6 z5~}tISJDO}$MaR|`o+AM)+Md;GUMFW$wAfMRi;&$$;LGW1+D1l9_9y_BCwtURQ7pU zx*8-eHnNBk-;pqPxh3)`XOUfz{c9wPoWtQ7ca8aPRF2ZZrNxYuqdb9j*ngFpd;13m zw>u+-JK}SdGm$Ivr9?Y<3nDct`dAKod~QB_rRJ`OF;=)6t+`{=+$n{%k_#cYWvH|W zNASSO%AqNa$XHi=HNn51W)F5PH#oZQ5fh`E8!=~^?dzE9Hwos(yP|X5*v0|FQyuwR;7)OtjY^3OmD6Un z4L3PrAU50rS42m-B0EaH#owahczS^$55=pMbaUgKk_|WKUcRB#)R;S-K6R>Me|pOb zdCQ`|cbqE7h^dQmukL#Mx9Ot1N5z%PH2JM4%1_XaY)8m^m@SA`~;-{7*Q9u%jnlL3&Su`Ssc-4C|s}U+T zMYn-@Cqs3md*4UqG!a&DLqB-NNk?Psl8k#mrCg?(m2*|*RUzzpiowxT@5CxfbYja5 z%sBW~S1?o<0U0HR0;7iL=3*TyQOb`JQIu{E(1PEbtgdi*N~IUJqx5FvZ%%3)WttsD zCUL=Uj#pQ>J*BStD7Q$I3mZqd%#Lyp-h$W;j{JN%{t+-^JGPG%mHEkDDglkei-d~j3QY#t?bBrX~ zAiYa8JN^&i?{Jdb8>(^p&kxnK^j{FFY32V*s3yhVEmYId-#t{*D{$e;Y?{i(l^3eN zJ=Ndd>Te(Qx1ahuK>cOx;MmAH(wCw7fl%!%RJRM&9YXazq58g1{bZ$%kt6YRrHy=7 za%eFGd?knP;zRY#J<_Q5Mst5MS2OBX)pyQEtl|V}J3!Aj><1@>I}JPX1QO$mDGEgwMS}v5{W7;b=CGU=9Su7MJd7g>RB{_A|GpfN6;Ev zr%W$_s3+BAsh$@XvTGfrTtr@uccbwg}e~LC~s$Pn*#%hdKf^n5#^zwwW`L1H$#9{T- zq07YGL!dr!b;aem=LbZ;Dg}Sph)X92kG1sN&775@ExwYmXckUe@!TmHIyhTPfjH8< z4=;t$4Kde1j6Zq8?LZDr?RMqQ5}88v)JJ|!BEQf$@|%gsGPL{=iW2vCiA(i3h~G~5 zV~IPxaa@1HxNvg0QIo4A)Yj@!3k+$DD0lQKrXbY{MBIWg2+)2x}L z@~R5kMV#^(#aEUMxpZdrX6pE~`ZUH#8ap&{LWzI!xGfmT8%q_6zoWt*?Io)|?mZIs zzQ%DMX&AS?9rx?Zqk&6gd7d@qv&+X^GP7(7U+OwxIE$hf*`{vWn3DB zUgF*h6xHMj%VScjItr)~7oG1qK5P}2ZsHr9T72ct)=>%g!rCZ+5#6p#wZ7MYpKU;r zC2tskaV8(Za9RB|AlC*st(!IA5gXvPR%^gU8_>o2P5`XftCIocBQBg-HlkZC-^rnk zNjQ%)AH1kP>TE=}6H1-^xsLQv*MA~CfH-@a9eF#e|WR-r>(B9+FslC38-Tr=U5*6LUz zV&Ph)+{(?lSQke4J79>@)!O06X0elA*-b884PsbNgHliZm{1?|f2V%1hfVz+n>srl z>rTa&)l+H1O%C(;OvU^E;_(ShC6FsJD(ZriR5mD=bIJ|~lT2fLDpLrlYvNQ4c3Cdf zBKGL1)k8WJDc~+@^}U{pzX%tB|2r4yHW%yuHy2526;4mbC;)khN>0|yBJ(Q;l7!C~ zEeWNlgxvotyKh{i*bZFB4WdC(B*FJm|Fl5rb823qqnyP?)g@}y6Ysn-kF?^86oG?3 z$KTOHSo}97Y9$1c#~&BfDVa^8XJ;nA1v>>op^sk)yk-PkbAq9#?WG zC`eoW(5P$7kgkRP)^dbju+*cVBgi+j7*ld-L= zf|^t$w64ymE?=(FuCAn~ypE9zuPg;J-xYm6)_6(Ev%gMYwSXeO(o+vssj!+{d|v2S zt3aPsBAxh^vD=;Tw^-}sHmm}yU+`{5b$oTG#^v85W6+QFIOgzl-ICv6#gr2yq^QoP z4KJVJy(RcvRhe0a!@ac(Zed@hMq{cs1$mVZOeL%WW8!~c>p4ZIZbJL|5{!=2(XdE$MM`RACBd${s>06WPBYq(fFKZmJza8-aLlc$a*J?`k zRsBe%E!%eH??tM761{nIJC>a8U`nRaLh^6d$C@aywlt2l^Ff`vhZAWrF=JHpV12Bm z66^lPu^zKy%~oms&Rl7XT0S)LjopHNgGL8Fe=>D%u6g_)I+?48Ky{glnw(1v{<7#; zM3GEoQm@V?sRIc-m-4oZa9TjCy-iDovt3CSn;aDbf|S5~4<|1w4!F+RP*LMb3G#l- zvHntr%b=*Zna)##&D8iH-xw+M781*>yrsTc?|MM0H8UFGRj3wi&*4PVL+4iMb85`p z33dEA-9VAtp1(~!=h>i19qVpu>{$$9=wkhmk3!$D(ki91Ql=q3qYM_zJe|5MVPL>V zue6xe_iO1q0VHEv@W6+Wokb}vx2iNmQj%bUw1y?vk!>I=nFOmV-CSd#g2lOELVJMb!C$OV%9zva8rG( z(T$3#^+H&aRW0^@MN!J`A?PXHV95)ajF?{MQ?d;?2CW?$@@WE+ZOL1m;G9T6x>z0c zz^jW4yqF{p(B5Hu6cLv-RYRsLge0qsFLIt+QY(AyoK?pk-ZiJ4_Rnq|Tz$btr-RdH z4-udjM&G+xDF~|wNOeWfQz}8hZx&X3o5aj5!d$>P17F(yZkbiBakp z%?z9NKWLM_tO%Hp)C&U0t#Fnx0j~Az_X3T*TFy{VXZuJK-4e;2gA^By9qwezcogEn0D^EO$pVcUDj!LbYyLQbW(N3u7dJH4z8I?IcBfY|A5%#lWvoT zd>*}ov&!qs_C$+k`9yRt3E@3t!e@LfS-D3MPO)wWkA3FcHmlnT-}mvSi(Fu3(bB8M z)kTS`s}xY~h0(&UJQy^M`Nmn-M2hEGc{ClPOgOzl5p-GehG9FZCduzXKlxk9q#((2=M)%^39Hc?MW`uO6!8CK>*w=S z_WkczFG4grXB(R^No)6I%_c0ND+D#y$m@W^scf=PFqbu7eRv_am$~;~l4DI8fwA1tRNU=& zi&_;qVk1YdIIGC<@8;CqB1c)^^0G<2_~vG-h(&3!!d?{M%qi^5bcfu^qsYg)jG=EZ zuf5x%LYxv#{Vn10xH5_Y++~dbu14e57NjMMVXOwwgXrkV0{en0YRNHu6+hjsxXG(2 zybu1WT7S5R^q>o@6G&X^V6L{g!k)bL@Hys2bDHiEyC6P!S!qeM{@T^a!qN*krJv= zmssu+g^`%3zj3bJC~KUe0Lyci@lt#=mkWC3d8aclA}@OB=l3ZpLu!29vRrz0u*&kV z@1%@m%xC*zS~Ra!zA-{YL7kf08$^+Fkt)ixNM0+2+9uz)rw;YW2B>l_GJ(pA;)<2F z^q~Icy7$aC)~k3jT)VkJyx9^jFA381~W>y4O)u% zao-8^DQaIyrKKz~X_xFW4Oj*ffmSPHL{QiK2Q1cr`vouvjFk_Gs}HVFZL0)kKjm$S zSK(b$hj*^HL^Rf4aE*@U{^m0_;x#8tmin2ZlpUSjw0o!wx%;FWf0c=HR_-UB*sHYR z>FZOXg=Tb=*SQnZUP+>=`tY|ryFn37FW#4uTx^yPYgm$as-lIuFry38Be{D-JvAe) zJ)1i!Tzoc3wUWdvY5&~_chbH{#q^CT*~yZudY#C#NJjSzXL!XIhgOg$LZ+Mk=#Cbr zyy0bE$ml#eR9kiMEZPs2diBH;`xIxsaRJ4xhsZbRL{-zANs2NzNxq{EFQmN*kuA9= z+=zU7E}6R=Qag2}ZQ7)s!$Us$hDCgr-9ZDx0s{gYt5EnJaVJVpETG|3bt4M{KpPFynB!X4} zXA_Wb{7d}s;ILZbr%cuA^k1}FmNcxhwEHx1dvLQrt?)0wU2=RGV9#B0*#Wppy1jyH zUE;>AmM@eBXu!sKh*`678Yub3t>RZ?kCWRixqGDESnUYIEooRSwOi;~@+c#M=>TY2 z=!g5P%W>epQv4XFJ8sG3hRanfI|#ZgZF4yJWZC#MYcBI4V-#hhhv^F^NNsZ^Do9y~ zGMel~-Rjmfe@Mx3kz8?qk^44 z*{D(+5IRi=-I@qR%bVX^tGTlge&p;R`XM^$1omd{NR8~FIq$4*iP6G6p<03O1irt% zu^0o_CsJH&6BJ34;-e5WiW8xc+@0pFjS=Rm6c33yDGdnoD-+0OZe!j?Da;x!1xzy0 zkMwFvHMTsavac1QIxt5M5^x2tZttcqapJnM{n1eIiBtYF%BOcI&pjbaT!+f0cW`ei zyRk#4c#i}WbO;{sl;`d#E9g+R+g({UyF)a0XY}fHM!3nrZ|(~f?{wnWc3Y_UkORke z$8iYceOENMCUSK;O+Ju9FIhP_&B0NN!R5PVrdyGBRS$e`|xM;@eb z^3^acQdN+#O=(JV-I?}CP1;Ig{1KB&vW#$Zm+MXLRKoP&Z+8b9{YyYHu-i;)sm>L4 z_5iW9Z&C%?uj@DwS=|!kMM1nWPn2Ow@TRJh(UDc5Z`yoxEMIjuMkaA0JIY5^nX<)7 z#EkX9Z+T46BkgV8Ch1boUGN;5cUu!eFGVq*}gR#9Xa#z-NuQI8agdt<6gt)t|~a*CT1 zT9+_uSt-M}`5YVbgo8xDiHXT@0H>Av2x=-jRmVw-Z)d5+RVd3KK4XIj{-r{ZUy89` zJWG|wRkzIYHZ2tacC(9me$U9~8QZc(%`H}o{LZbBoYc^UR9RaY6v=V%e0+_0F|5d* zL5j7jIm;@t`ZCNV7?ELaz2;J7UObEt7pF%g<1Dyn>rhqZlyov~FSxV>2XbG@*p7b8 z#e&PrTI5H^2*f~`0i~*w%qey;)4GmbZ&iVgl0^Ab7M{2OSG|da-v0ow zYhKz0^8BJAS6B1?RjgMg9|A4-&F^y6qYIs-4yYg5SR}ey+w33<-YsdxJd4L7a?Tx(SWcO(<|d{4#p2;Zm)(C0Q&ONhd~4 zIu(518Go3kb^aNAKPkRiOX$-AB_SyWx4nPGie1T}O|a#YS?eXU=^d7MnS+Xu{4JpM z8v``89^6wgoLGFNycA4x4E zj4QE%0;bRpRi-(&*euyh#Dh^xj0%dp2k)moCq?H>Q3v&OmZH~9;X2p1N#?tsNY!U0 z5x&<8vAT5xO(26Ed5A6%T5FXwGJo;Jwjqg(FL+YBy$lY+KS;zaJaU~jD6Usm<&ZW< z9mnd{gJC={Off`E(FM*ztqygn!zRd@)6}Nx=r55!FW zrZ~+!rMKYV;9uwz2YqiA4&*%gA}I4=B|RZ?fn?=ye`W+Y(Hw)EZ3Prlg_Vq*x_VTB zXXVWBEV@-tm+GLkie|}12e4sCT<{Trkc}@rh21F})f>djT}W`VPfj|KFt1~E=qdMAOZ=b*zw$*|TRxIW)VqXdKB zo-|i0MEA7Fg!b^bp5zB_X#sN%m=m8BlxR5^JI+aM!pt?2&^#4C9laYg?gL=4LrZ$i z{7bE&((CHtMfpC7&*)96<}l5h6_fB&3?AgnG0by9dU!HNlMZ`IdnGYm8n+o!Hh1&K zY-i_Yo74|%j5yReapzXMB2v)Koz>ax8ECnQI4HhHU4Kc@yRpYulT~#oqi?j|*A(J5J>5)Owqo(QIid4OKk%DSJU-+mUDH(BD-9R?V zrN(^7A8Q-49DT58uSSqswH>O)#{}#7%Q_vh8X3ueekTou<}58)Rw$U1D5V{mJJspA zH&xoOQsGncupo9rB}p$-@ns9e74=P3G_QhAkX{HnA_}21$EFj_o*^-pO3d7bF=y1p z9I9iA*m#m7J5krZ$o!Q%>;NJ=tx+~D|+Mv{=KWl5C$$HsW)$4b3Hu*|m92Zr~3 zC{HXZF#J$W>LGHFahR*CMJt=nPAWK(NT56F2DhZkZHF8;?x46&7dk_{^8*~>ZL6h`IzK zGQ=b+kOE_{;KuTe629j4t0^6I%Vd+gkpkJ!xDHQfUzSr>hjXM3U#99Xtx+-}`jQb| zWGju=uD{Mby564Bot+gpPOfy87#8A^3`KIpCPGlTWDjnBe3kKp@YM^xC`V(1c+S@z zD$`dCOjPTW9Y~sWPdy}2T_5|zJDg&_J%tm_ebp$%yrhlp2HWb&zwatV)k-F|9tv&O z5SWmnH}Cs`k*DsqGrllO@J05NY%0?~=zCR3k^z9IG7O_~0U4z!@-Bbq#SKme z1vobI>p*if(%|?JrJa7u^0_?WG^uW^@wSuwQt432^U|^w+2tZ*(9!t`1zT8Pw4}Vu zOBHMB(3ixd(q|JdOQ-D#pNB^o;W3-*JRqKRa%vFeRC6of;n;o@pp5UZ&5e_hmR@F-HDXU#P6;zqQZd(R zT#Xmn>>3){l9r9kBoKN+2zo*!{(3aemAO5TmS14xOP;eB!OGmA4Nav^TyIcX4aFs0 zr$|fkL&Uo!Vv>rOYJDmttDXd@%2Q>1O>XG-1)kEMfm@f*utrlu-y>oH`H=q1S2)ht zC=}L%j}qX`fn;47Y#lwmz1(Wigy*E%lBkq|tm`8kXs0 zKmlstQwnF1_a-5-HMGBt9GFno%+wT?yFZj~kU$=C^n`23wj9?9-zX%z;DfxJBWI%V z%C^LA8CTmh=n+86&tjBZ_N@0bp}~rK`?r#eVVs;O)0fE2v|*}j(defI+OKdL(8AgSE%J^@q)gUq`)>5R=BXjH?~Ri6*2d$IFxTq1b&m}h(pj(tydI|Y zqdie((c_dTeg)TOyiByjyF;s0>@-V8Yn+bwFC`f|ewwHBlyWc@c?>d267z7_^S*tO z?hqBTZjL$fR#hN@37lH`lfo!lJZF{3Sh5)jJqe=_ar_9-GT&2!~bLr0S?4mz6OK(JQ-mmTc|DGq;In;9mZxseu3 z`r^-q7PuV&Grp8GMAjgPg!T0D`bwskUqmtZf%Sc$TxAaYO?0v#GMSan60ek$JYM37 z{Y`Mzs&+~r@e6rl&;gh01(CjkPstBeEgX*X9W|XD6+gQwWLeo6xShEV530;d8JBOg zWejQFJy>d4T6{L=8U6Q$PB!yL^z`K*B(NyAM6p1XO#0$b6KGqrhac;S0T!Tcfkwi~diKdfKv%us;HvA)3?j{h+*Mjm>j_}3OpZUUc z)u4C~q0$xFs3yYy(JlsWI=%Oa+&{ah=&++hh=Q2r+q%foy+=2 z_*m;L1v6_NbCeQd78pU28f5m+If&oJ+T<)_tt8)3N2{xoLC}dFB)S|<;ntAD7$k^Q zY+S-1`c6pG&dT_h%}_0jSVz{?gp4mTXOYAeinVurwHrH+lxa`Q`xI>$yT_47hwrL>I0kb>cHgE9AKUaq+9 z6tAR6gi%_uOBsnPl7LrrAv)qB7@{QRbnsc&My^DWExhSd5O9@;9o+@JS1{WA_2;L}-XEUmY z!a^&O;|BIDuIw#N{w69C36jIX>dHB!6(f)~8?dmi!1z!||2nWiC3Pn%DXU$Ovn%N^ zo3;kVpGNh%^yKbIsZvVwGr2Q<5_-=-kEW!c4d!;w>VjPiRhirUCgTtlk-44G>3t#= zHH=t4wVSRZF0mu7k%$cF@KQ2T@)*U+_(GXgoR5zx+C8fkm+ZLhFC*)p>*iWAr(#Sg zG2^A7xoFKcnejkdVF1(zzdk4W9PaVrS%CYZ}5xD>5gtkhkr6?Zm~00N>`z`9!nMSUJFTHIKb z{NJB5&yxl9`|9uidO_|pGv}O{IdjgL?aWN}Wh>XUqp^*T1FP#yr?sxEr@rMTU4r0^MD)ae&l2-1yre>} zy3nOO;R8q!m*1)wW)`)^#eMArhazD5t*r2-gOq;TpKfTK%8viJVH1s!`)D+}5l{CZYPp^kl@r5~BnCtWwkogm+7 z>QDX~NNU*w=Psgq{g6n+Pi19|sV1?;fPT^u)10CVz&d^=^~g#7uHG5(a(J$`nFvViWde9wiIZS1pbWuzT>Dc|~8< z7e3)H{Bfp@`J9z!+Nck2nW^^;nV1)a-zCh%O;m$NDXCYXrr*;NVnOgDF)t}5H;lRD z2V4j>MmMHAYj1<}+;@lCkUgVbtf0DqN)-CL{U8@x7ECS!tN)XVcD}q1#IWK2{;(1zOaN>d< z|Ed~j!A<>{mM1SB%Hr6l;q1kY)@JS~Eya)Sx^Nh?qZ=)Qg?!zlFE6QrF2=VF4Gmb_ zZX7qil0p?%f}9XCTL4_EHq09apk?9TZqS{wfBv~#9H4)tg9#3WVkIRk7Hnd;qdY#5 z7-{tU(?T%0_&FX{Zx~G-(=Yqi(}Lb#$dnanidbThG32=y>2M1hLj`E*-h{1*-E%>c zHoG>h?TM9?3$t6IM9G9mNNYBP1`~403q@y$7A*!57y8`Q|HwDzJBhu(AmNzYItZ6W zVZ1dJ?nZcCxxUvhMSW*BvNGMsr#@+?!=Z;Sc!O%BzZiMsE2qxN`R1QzOle!!u2)X7 zkgd7Y(!9EXxpauVnAn|<(+$uc|BujIf}=|G=79lz2o2$fT|CWv7kvFc5}7i?h-_NS z@#ynJM%!(ti^Ac|zyFs)hZ*N34_`3){|%)Clq>&t6tzw+{JHLbM4=V5p@@&YJLZ6b z<&`4<5*Y1kDN*}V5(qqfq3X}=CPgR;W?)!YI8w{f(W=3Lm;5ko|MgZ@f}K>V^(WG)>>^S% z7_)L>i(ucVXE??~@C2>RRb8BcM2--j5lmgJrd$yFl7jvNyR$c%&?BFEjX zLZ4^o#lbzGdqr=eSA`_{4_LG=K<=(Wh3|6R{~df-1SduisR^8pXKBX)-;uMyWntq| zL(EStDx|j=1sFeP>SubQ+=Wz2Dk~C(%C`V;VxD#fztQ`KQIrnBVhQH6Qzo!=|)jds((C284E+YZAIV$RY=JkbI0K zILwC-8|R)pz%N> zxGO>VZ<}Yy+%e=8oT7yJR`47yZE$r}^UX6eJ%q6y{Odx5l|+l>ltdb2=T%%AeE791 zNlk`iZz*(NGVGpRA-*KW;T-mY=I%veTKm-~-D4p}?NG*rcuH{V@chIy04|0VQ~B+& zEM7a4T*$13p!S;;-F4w`aZy_+Y&RbJZ@Be#sWK_b-sLt5mRT?s98bj@%RdB|hEpAk z@#}=_Jx3{dGU!eN&!_EVMrcX{YpiA)FQ>2xoYK^PLyXmAgpCti^|@Bh_y4oeiC}wS z<+97TjBeX&m)sc2@c1MLK`#&8@;S??^O%?MCtiCUG@T5&ey^?Zu3CMGDpv6IOA;CC012P#;(=@vyL+M*F0MsBT1I zxNEv#B56wnW%Kk~NhQ>_(t_#yQdPC_Oht|KVrt`WjusP&gQtID$C*X@k{RXXkHQwD z7iIr48>%_gOGfh(bet01ahclCCB3Ykv*Tt3xqs(_a+Yg1`H%e3IrrfNH>A1esOZS-{Fc~zM%X$);qO8yGcduR^`soKj@R!3{-#Beh{u%v z*-<7Dn-=8}Gfy#ZMlmsBK2%IY6q8R($G3=iGKwiA=0L^V6UCGebF^YIQA}@QDim{F z6f=pK>lE{cFlMRBbBkgsq8OFu?~3Uc#i%^5E2e7{qw;*Im;<92m8alsVmd}KDo=04 zZ0}+ycqwt31a4FQOQg$J*$vC`RS6c3d3AG`00pQB0GB+#AI-Nl|?i!vrb~w@uoDYxqj9 zWKKh^PMOb~TzwpSRU;F+<+D?C`fehz7^Z_u*L7W;$h(*;D_6JHkYgP6q2BxA&p{T_ zeaJogsde<%f z4P47)v)ait1s6eg^h(8*j}Es=yCWC(Za0I^OWcXPx<$dnpD4>L2i;m({@Nl^RW@ar z+#<3`S*~mm*`zF^Tx1JnIW3A2yG&WSM=_#r%5qo~)1)j#QA`sn@}ig~c5UqJnwT^D zp^^D0ifK}o*TR@ZO-(a5icxt?SssaER31~7JEE8-F{p`RnuO=7D5gnSE{I}K7CG2C zW$DgWbVjmzg9a|)t#JNh11Y}-YgH+|kXv82!}&wo%E%ZgRM|HF_0Pf)UAcft>dQ`R zam|h{<`K{%5zvtUO`0$uC&^O4l(In@5^&(v8z)z zPp*GIsWvVJp~upRJ@IKM8&ht#lv#O3ra6qg%|F@Ylst6cfb5&z>7siHnAW?39z1?y zwv8ysHEC|gkS`kHUWWLb3TJ#3zh^mh4xy6<+F8pU}HoO9Os>6O(>RONHeJ9}~0 z)!B_+$$K^^=l;BPtir&5TS#F$^m{yJZD7VQOS2T-%Cq!f3(^?o6@TIJ1RP~4c6@%1 zALF&SoJM!}_ht5`f|>s^9V7Lse~}-}@k9=nPWPN2bCxy4^G0d=)V9+2jq?dGP7_S& z>bemz-Ne8ygL~1L>x_R#f&K23g%b@pmxc>5Q@P>*ni}DK0s$`P;<9aqIbOBE+XL>7 zz&2&>-WrTDUml+}ooY=QUr;cj>R@86h_5hDYu`loBbBltK6N9%jSeFFyc@bc%F2{P zw-fbeFwX)wFfGUPTWPY6q1+!9)^2J4SivdbcW?RG*@A&G4n7u(S(b##=EcyQShZUV zq{{3otRXx};-o4+{qCVE5VyjO+XDy2ZY|*YXa9apOT6LPTT@#~a0zsUSNU$v zhY<7p!G1k)CVO15^K9ZXs7K5!g_)ZO!^}bDV~SzscZ4+g5(_2r`jsozMoO=5m?>{3 ze_uP?13Rk*O&Xu*n_Ja~z5kPjKD+mrQf!cn$Idie14Yfl!H|$5a{2nNn2awnJsl45 zDI*enCvoVYCPn8zX&bF`Js;Tn1ovC4#F0!V>(-8Y%wpne&a&-vrLKlb4)sK`v z=&mP95w_R_6>lFaUThdFl;s{a)O%FXc@|xWEL}D!d5+P&yxg0kq%TUWLYR6fU}rc8 zt{DMxFY3+X$bxEcP#iiBjbduc(a~j$4_aC*@R3$;p`iclVmNa2nu0YUz>(}gdS5H% zsxan!Vxo2JE^TT0IqlShJZy~}U!cV`?*MGMIZS-}px@J>MbDMRVvy=INS+oGPkT{L z72bIfv>*Q&*bM^>_IFfPxm^eb;=&GNKDE+4|G}&LnL7$1$fS{fjBYN?F}SJ+!kBP# zbk>2!Hn%xC=rJ8#;rU0A*nstQ{u?2QKZu0O5jxXa)A3r;$$?JwkE%#=7V9AUJ;k2u z!*k2U5|$BRNjmGleLwrJtR|jMUZv|`mEw{8`}sNil~cPe{N|sVSDl)EgC&pgznV0^ zU^wv|stQUs)nC_G_pAlAfA|T}A<=U0b@i7Y9bh#IcDR%h=xe94(=Yt$z2edj%IU^C z@zwPMPv>BPA4`ayE+I62#b+UP9SD+#gqR4FT~QOc*s8}VuCWGJp`QxdOP zNyu>`Ui%xOnPGR7W3hWvNrYo>xf7K74X$8Ix z0~-}s7X}Xc4}o{Wzz_vign>UP@M0KvSbAk$C~2<2k_;0e#m3=(i52V+h3XAt&q2-P{7AOKS-B zj&iaC=5B2P(V;a270$^f=KjzE!gr!;4_AgcQ3Wj$7O1kD;#1pGNA~lGjNh!I=cyg> zc#ZkZ@Gf-7kk5#(-s)gS4ThvoA|3V_eY-T=yBRbv5 z!=#nU)$u_-70FCKHyZl?>{)tZh7t!Im-eke>Rqeq-;9tc9Iz+&5(qA|6VqSt-?sw&|aJl+j zWu`4={c4F%zko|GD>Kt;)_{g{7QzP1Ai?Xqw^L*7cQ!Px5-K zir04qI@7-(hWDdhR~e26kMHjzVujg{=Qg&G^1Q#BMn(!p5p(Ray19AS8iXf4&_i{8H_{hseVydef>%@^jqm&A-l7? zD_UeiXK$tFy_-T>XX1a$a6O&H7*d=O5ajjKRlSK?mhM<;9wTvL9G{MCy^JhX$EPOZzm zMwsk)`S9Kng8Xzg`e$=?IDmp>7g6n-F(Z#A}8@GZgFg@!I|_B-_bR)e{Ik{a|`4M_1jeG#c~N zU&*U96OT;=yIx$~sOM;2N6Gorb2MArr=FwP#%FqS!2Xp4L87KHwSF~T*Y7ZI4O|H( z(eUx-=UdAJ&miCUJ#z(}daup=p;~G)ciD;KwHnynK;qadUIa;CcN+S9KsD;35TUZ1|yJPBh%HU$4){rmCYUDBHPg zBAGQ{pN?w!IrpfeF4D!A%EMBi4s zfm-dHQ55zDH)mMx-#epa2G4@`bjkmafi??i5(zQ_q5dHvAN_h2E}ILeSGnKavMJ=@ zTUEMh1h_)NO-l+eu0K<4h1*n}$eD)qc_hou>VcmS5^qEVP{8D;Z1wW+o-}{3T+O~U zFL{5YJTEAMmnr+W@!M5JQks}|Hs$eu?*bS!soPMmMv>(fneV-+KtBf&TnUxPI#xZG zUD(3D)VySph5|fqABfx&d<5H=Vd%Y~M&27bh#ww$IWGMM7cC!!oBvk#7I}JUpD8Ew z&iRHHht>hYi$fhH!;|%wFfR_h8fjFEXNMlzMR(Ul4-XZT>p0CXcWGI78YwxjiPCNy z;=y-bPY#^}smOlstX$rga3IjssqU@1!cG6F>l|E8Pw{hPibUooy`{gq^_H!BN%=*z z7)Xq4J&>4c1Bs!2yFJxRCBbu8cX!)%H_ok$NR)DfuuEpI0{RM@JztOH^(-Gf{?wj( zY4I@Gr|YInnVg)DT7&&o$L3GkL!|OE6=S z*=^aGGC5awY(no7p|du7ntwXzdTMFHUEC4+nt%B+T%pQ=_4ftLUh?1)h|c^^WZ0hU zS;h%`Ejf};=kz-~1b+BCnJTa0i&)Pp-m`p>6t_oU>EG(+2;Z-H*DW)4^zZs7wdBdl z=>xKFOo`cJkIC=!v8Go^GTZBd+NpD5IelLhG)Mw77f zyOV4Ob;m2L*HAp-CsVuBGVy(ofBf#&Dyi)kaci|iVSJ+VMalL&N|*==2;)T7nddbR zt@J(sEB%chGXy-wjm3V)6UF?hy@Q)Ef!@==_@5MtWX#NJeR*^#WW$;mv`RC#sMwiF zDr5RrcHvIs&zCH3Aq8u&gpz^*p%k3l^-IaOPBNPy_~R{?eB|C_f@4%_%o}>x$OG>_ z8uUcnx^Zpr$faZ`+(-)i-aF%(AoLY3v-1geaH2u*SCCi!T543dGyE0GYY)LMP4`cX zMf%)BrTKcvubda(84dW;-VQems^FvDDKfZaa>@H)awW;OiZa-i<7}PB9?W*DG{4m< zjo!{4kvIb%;{M!rt%bM|i9xjXsjU`tPK(yx`X^4u-*!ZTaw3N#KuU&tfwkk1P?m1m z=O)M6f!;1H%XF|SQ&kZQP~CEp9T(_Q17W9=i4jz){C>3?A7k(L+{cLfuXP_++&|uZ zB-2N!iSMuDj~mZvm$G_%VuXlQ%~=LHK60{8`fZk=Yn{d6f9}?-YopM$3uMpwCoZrH zFFI?OFviQo5$MNK;=Y+4VBqs8jr zp_4*8bUeLLD?9Yvt}6P@c4$+#(3W%$balU>G?|}xJm{8a3|f4(K-5KhP(bw$gzze#yyPVH$k}8oeJ(cFLRnHoeW2 zn6s&?oa*lGU-WROy6XTOkX=sEV|ph!`K^7a?+nn|&;B>9HP`fzNy?0Vuyjlt#JV8; zt$+19p;f-0Dw$Ru6>8Rt-zvB3{ufolQ;j zr<1g#DAJGUdFYX46<+60VA?(HC02>lj~7)H^Cw=T4Z?xJJhZ_rdETfeu(DI_iK4JF zdaxF4?mlK$Rfc)^qfrmE9N4heIErkes<;lObyY6@NmWY!->On<&nFMBR8=liRaWOm zRf*ShMYw_!n=5gQDsdb43GM9^_926fspIYz{P&`~oC>G4>;0*g(xkPwLn-_I&`OrK zK1#2ghmPgUouS1?q@$mDaudB9xVsd}qUn~&SKdTXhE6V+RP&2LqIyD8JKuVx?hc%|)8 zz4bVyb+$)DT-tZlTXkYIxgop9)vr}=O$csD_0~faH{TwLFu3^S%ivM<))L~gpMQUR zZce)sa&xxxo6GN>E&g{5zX##1c+H_)9=Qad*)u=U!+Nvq?;`vArv3fI{(h^!b^)2> zseIV*p>xSi*L&o5{gS<+*N9C&Zf?ptjQ=6}h9%}QyBd_yS%S<-8mco%TL`R{(rYzV zlf?DBcJ%myo+sIsf9;E5WQ$?fD{Y;r9FZsp$82W!+0qEqT8#B>`3a&8 z_HGp-1Gf0oo+>Bjjv$ef+>^n9o>msY^zL+29Kc~NrK*Lort4Y%v{MXA32eSKAVbh_ zp_=npH()ho4N2=@5D7~RtmY*WnC~bdwX8UE(;zX!g{g$FQ(IW_x)U%Ke%BG!Rbx}_ z>K1KV1@s78!>{r-5A!KCOK-nC|S_xcoD3F*^E_=XlDOq zj9|RWg?JB$_8_-hO?)T@wTyd5dUumJua3ot^fv!GBcAX2=dJ#YU2I%1?Qn>kbZr|M zw|{`hCI0SOejUY&*`+fd63t4DekSyuBZ>{2wOOEu(k1MV-K}t1&%Iu<2=*>`X&?n&c9{U0qX^pSA3qyhWN*WUb~ix< zH&dt9vqh)R;e_!K>rI_fYw&)gSg;bw%I6M1h6Cx&K_{ZT74T<)^6<~e6YFC*k4v6R zxJIxnWSd^Q6N3j3h(-Qu?EMH<07k}u z{6HWlxmsr*MkIPSY|D3(K-+3ymR&z8QQUrI{fI<&|Juz^m~IH^yzI>X0b>9dX)BOj zSva&J-QfTFKuV1io-lHFYTKUUx}~2f}7Gf1@ZUu_(5?Kfh zLm;&D3J7Vy6rcRK(KvYAVX18g#&2X(hPbCKt|WfblYC$zmiyli1mSzi7oW^1iEI+_ z8*xn_sK2RghsGx}Xy@a?c{>2W4`8W)v{;I%W zAy47;bJL!V=4TfWxm56nX8LqL$+g2m!Y4Vh_wWgB!AQXFlAb!)+d}OZcUft-x z?r=Hul<_}FcBuUpVazwM7ZWK^xo zIp=(24uHRR2H;CRPB@y6bxnen+}#OTm4L1sO4@Qh4mp;Om-wiN+ip5Wsz zN_v2gw`texU-{_Wi;vs**ljW&X+A1PlV1pJ<7HkldcslxUaPXTO+>gym${c&em5f<3uUZqAeZf0zH8_XT}PBH(>`R^99W9hfk?+;3UtH)n&>Z@^7qP7>9>6Kl-Fj3K!^bJ}}Kzaf_uWbo?R^vixhXTR-0WyPqoAdz0wvnUat_B3Eq3OKtzX>GgJ zYbXSueKxHGKsX2h56$|OH$0DSkR;&fXuH?M>Z?la4R8TGU3KLdi_YXZX@Rk%;T?B^l%_Nr|A z1vxZ-*H@l?P6vu^0+y*zmjo=R+jC$)2=>@9@tZ!`Pkt8XG~o;vP9u<+F5r~)1G~pp zhGVa@6*6#ohgF9B^x#Cn+!92M9*3tb{Z8Xq6u7c+o-b?er*RPQ^ZvpxY82xc3tEc* z)g8n^g7Zo-##24%kz&KVA)hf`fKIvp$wUTdOA3BVd_KKyUR~_i-}0Mlzp;dV(kqw7 z+IGp_p5f~4q28%Ys1N@isJU+=R?JS4JmVHSc4_ZMGAU$3C45@FdV?I3(@Rq~a7*dU zxAEO{Q%o&^u8o-i(PI5P^sUiffy=X2$|`O0_V0tx$QrwxPBXY0K*VrEofq{*j(DK=3o-+uMMuY~fes^6X%p|Ecs1H}Q1wHBHJe_&M2#9$vGIo0TtRe8 z&RBy7T4mbk&tiga9EqhGcCp)Dyp)Q#4j(h>#)wEQFibU&11dGRUCA$7a*=zcp;Wba z#vueJBO}ogY@*!1Y`q%-=YiaMUSK;&Y;F`~Zm~(hh(uxL7F&^|{fKwh;!e_vn`?5G z-TWag7q7Rn>>UP1D{x#Gs8isuFmRs&`-Fi81q#BzdIcJ}aF9xRd$JSge-j3dR^YQR z@LL7m4Fl&W@M;+F6j%@jstC;871{G2cQMhv+H(icHmn9$b+mR#E$JMrDaU}>^$?GU z#GeeIX+f+;2n}osBrp-LdT#>a+I+YpJhyk>xYT2m;9drldtZ^hK*J#aUGX;W{1vVBM903y#>OTOk@{$`;(fz&08&?e*;9-(;MkL&es#| z-mdG3e$hocy5mB+dvXVU)xO?v0n7k^2V$34Rts_|S@s$4kECQDkE}$Oa=f?}tVKRY zNSfm{fA~dPQP9#>XzLP`{LpH^&Wx?k6W1kki}ty6i^Y%B#kJq=uB_h8^KK|rNeZ-%9*$)^y0H9sc&J-MtHGOTNrVA!13+XDIm+5M;Kfq;!3Uu!A@x;Nb z?G|xF%`Zu!WVm7QZeZ-_9`9at;i|8)-)CY8zgFXBvla1r-Rp~s#4e#hDhqoN7`K9rR$Xyu)gb> zFkpSxm@r^{*STT9`mXXYV0~A=FkpSx31PtcuEWEC^oA`KGKecwt`emw) z@K>k_hAhpTdsuoIb!-2|;UDkwjjQn6Tx7A@f7AfJqLM2!6-OVwD!pRAvSS%vP?UI0 zB@|H_j&oA_D+$aQOL>RZF1%)sc&)CTs@|q~V|?=YO4DbUCd4RB%VM)H2d^Bm?d{+T zYZ5uL5BQTsiIn!vsv8}tW0a;(z?F7bi!@D>j8vxLLM@Bum3vo0*#CCDxK|Qbhh~Gi zwH6c03>lLtyFPR74SjMKr-zJ5pL;`~_tP`H2%V`ok7hf2XeCVquSe2gw3oj>doMIr zaz8axayM(FGsq*Tln82o#@(qyF3U`~FjIA2>(Sk9hO!?LU+#?pC4=IfW#!1PT^$@E z{7XdXd_+l_cpow9iYL0I$yXh;>W^1tzhSHI{p=;gwbq)eMExgP zbJb2-^CN>2HN@$u2`A*>Ok>U3!Br#pMikB+Fx>RV|BjP-D39y;zpwyLu$|}6!a8D# z{73i=x-p6PKid6JHsF;t3k7{iZ&kQ*@BF!_811^0t96oSqy^Z2ma!D#Y%04xGm@No(EBD*I!(eKYy0oic z=g*B7G?9%axShfggH3fcvDJvz4HYu8HTC5}kKHt0d+S@Ii)rKd&fX(1#ILlRwbBst zzrz6+gR+OoRBB0gmU7NMXE7tXZ(DS|hdP9)_dXiWN5+4p%%7Ia?|cP?O>fb}s~cUT zmBK#Xp+6jXm5oRX_#Diq_ZbBcuD|N@X8CuM${XWGwiAQEMAy|vO@iv?uNj7Q>$;jJ zvsOUbRAHVH{M$g+&|Erzs}4A&yv34;r~XDNCFz2bBM+gGRd>?5iwyJB-h8t+IGc`{ z&E(ug*uQ<#n!xUdr+Io`uKmq!aQz#5ZH;p@jLoiPXxY7A8M$=NKC1z#ZgnhWyfy;I zS?CoJ*Tu%G#3cN8UT|W2F2m?fImuq+TsqV%;VdF=<+ad?RThXrpuoTDYD5XQIsXD0u0W2Qiap!}*)5l925?`a)6(j#;>6WoXy{uV=$k_!%Qt_^p!dy78#-+MHWai! zxNM!&mZexKe|Gq=iqwW)<^CQ2M&Q1bz+Dac&kJ1hiVAb1aF!IUt-yk&SrX#tW=T%y zF8G?(WMyvrVNU4QvawBLnb1wdT^OM&427=uxlZK1Zy|C|JMc*4=5;jL=#I#(&^7K7 zIXKp9WTnKezeZ$(6N4lWF1QML`;d;5_V32$Dn7j~v;pB>ex;*rxjWHo=g4=4WDC(7 zmFSP?eVcwi61@dtvcEUzQWjY21SQ&cE+|I$lY=j@;8-(%T?6ZtKS1nye| z?#rrTm9&+}t#=|<+AMMda6yHViB)%|LCM76a+*0oT&XVel)RVtZJu?ab`GM}IVX8y zrFW&o>>BR4Z!*4PEFdxK<{zsG9m?Pz&W97T^Ue>(OVHGf`X@KR_D9fq2b`|A85%1R z-6=x1R-G%)B&)jQtZ~V;e6wKycgdhXMeRO_vUVdv>f8(d^pDq%fnL{zuwXaGg7F>k z(Cn4{$m!XC)9>t50SI`JI+)_gI26KiD zm$G#;L(@`rE`gseWjE5%!}oA0yFLDyEU9to8zX{-P2D1P?X;NvT7+VY*>86Mr6v&z z5tf0#;$7BOR$qD8+B#m_K&T;LM;bAUzXdbaXMhHre~_;FBEAaS)NV><-S(-2YpIVcdU27+SL)CHS?HY-8-T1{F&O=Ft+v zbr>_?p#^(B7;1qQQQSEj{1l~SW7?uW0vpX8K&Av=Me25kHKRF3mrogy7>b(*?*+(5 zc5p)bX+wA@0cYvl2J;CzqrNzwguy0ulhz*i=9=>APigX;;jY2BE>wJb>p!Y`VKCk* z*?Ko-j-^Fvw3v-mr$#SEYLr?sI#}Nw9hxIjQw%&7bcK|8_;h;r6t|GsGB&_to z0K}gkpEx>n^X@`zj^aRp9GJhrfjM`X)!>-$_t4P6IT0Q^a0e3(3!TDkzDn(X4KGOX zzrR3F->~z;P=xv)-tcLshP8#cui9SF5wIxty{;dScqG4H^7strRnm)he=EHuwKz8& zq*fu|{wQcvWX2}Wc>80J|8Fh9G%b9l7jNFmig@~68;qBGzxgj*8)1YCoWKmUKrHCXJk$6MueeVjxU=CHLj7tLx9r<&g7*=Tq~M z-Vd(Qvp-O!3j$ic(L0FJ27A-=wX3f=wJM)FueiJCHK!2jP&KA{yVf$VzA*hR?|*A5 zs?Io*M4lM?$r-Mg2HIs3kk!8O_UBc!05TQ$J= z)IT)Y_pjg6(sI{L^aV}3rS#BPXTj=ZvsM%6coY1{flxt?1wMe4!rT-k`pUHT$;{}c zwI>~oQBBK-c}ppZ|7WOUL9oxye-PQ{iHchq8%U0+##p@m4%#7`%1k!`y39ZXhI(HL zf4JcnXbVZR&*}~RwZ6kGcRb2RCvB^BcFi=ytbG5UcbNtxJL(FWK|ltVbi)93+(-o; zPs{{ij*OiD?=axjzr%oA{|*Cg{W}b}_3tp? z*1yBR3siP)K1K2Ob}>;gODLvh*YVoNNHxnJybbGN_(tmA2G;dH8u*%>U;*;zvnp2PZwGg~7x8neu=kZ(0&d?#X-U$#%2P z1SNal?927@R~I!w-#5>$(@&i{MDaU_S>X_m-~0)z7%T5= z%5((CUBg>Qv<|tJ+z=Lx}!}`JozfexZl0$-=@c{_q*2; z*oU?Gs?| z$7AShoK%LW*8`e94b<)nz=^4bD3;sGZ`1u@~k>;5|b4eXc(uu{ji20cO z_RG04OsBBI_8@yPY+f8FT^QC)Ni(de>}J40N|e1Q#}<_mK%YH+xLRo=$DYdh^rx*b zDTvo8(9~5VnWnz)Xft~@%gE0! z8Uw+=q>y4^`<0YQagLL7O2n>DI@Qle{D91~*8u(!R-WOL!sXsaQn9Y9Oo_ql?Q+!5 zFXm{8Epn7eQk)gRWw@qQhFjilkztJ81ApO4mm#)T8S?&yGW;1aFfO{p<|-;f#rW4Utt552fnh0D@SO?o2q?20&o9fHXEBE_g|58he_3eE~q$~6*{_NL{g_$7gYa{2u z%{Zs|U93I>n##7(KO@4CL5XmRnsJ8tTYjth{I&^ai@#rl^P3iYTeG5x2WR_BgfpbF zMSZ?l8S>yfaQtT+aB#-`EFQ}*A!uL&UKXKx!%TDxpEP&uvXyfQ1FYLv25B0u3G%$N zaW9-#C!95ObaSzwh?ToW+N=qSQMM~(l*-MZK&PtS(JAt3RGveuJkH4_`;hklaoP1M z4pZkzn8W;gP5;*{emlu2Xis-F)>K4XVy9*J(H>;`{YczfuGGCT^FA*Iv(;mipQ(V40l5-mxA#CR{S9 zSGT8#gg#z5c~22b#uQ9C|QghZ-cd;8c zH1NxckF{FdW9_eR9Fqa(H*wKLngv|!u%o17%_N=|A?IR`f2)nGq4 z)y1~8&AY+yYH-M_1@>}M%-(>~13P*<c~|+2I~O+AqOd20)Y)>><4Hy7c2O(4f+zfWnU)1_*~m}Bq_@qZ zBA<@^V~*FvGUbVkSIk}q5;&n-`jdI|$6WsXiu1A^MP_nEOdiCL;e#n>#d^Fy;dDOE zY~SOfWD&cNeX~AyT=fQr!JE#yC^5gs$5o%|qeGAXRJ}i?_pa=B#%!d-%buK_tPHnU zv#%1GO^9MG6g%?84wxVFH)9;M&XR<3dX1)$+Odq4Te0AAxB2AQE0L2tN()G&FeWHS zOgXiSoALBmF`-}AS1!&BDow48>;0(?sfGD{b#Nh9~4G6C>0N5m3XkZl@tz5Z%KbMoKOkP zpYZo^s|WGgCqsCyO>A*IPp2Eu)bz`|JY9bmAUH(tnO@H7UAcF{CW>&b6(K*o=V^%v*|E=XNF`SHuK(xvJ zK-Q!}jsQhS-fu!HQ4+kuIzncrz25U9R1>{Rgv#dagnP2D?7Y!&ZzQl?ZRV<}8HI8wM}z#vy-&gJt@$u;H`z z{+oi81@+Tw{r!eSlDUnz68~=@>_&v4lfMsBEHb`W0o${@kF&~C)#figfmJqX7JUQueCRVJf(9Y~p zkYetl-?g9H6fCJgDdbFovs*ct*?Ao{$+__2Von*VpFGr?Aql(Akrck)hXGCSsMc1E z8V7&>={*Th_Pt2tiqcDi^Q6r?$;xrA#2M$za1u_AZWs1+V1s|qhC7Q)UW8yGQy>J_ z;8Q06?ZoDzmrO29Y{p|9)L7>$bpd5^`|k4`NMyB^;BW{Xvs%XsQc7xl$87-G1)sloJJ9WO%4kck&n9)LiSMq2n3Ef=^EGzt3Nzg5%))+-mW2ogz zTx0AOHpZX4@6{L^7FdnlY0x_v@-_JcWC;9JyXPBxq}@w#JB)gjc>NSGf>NHvY&Jag z4!l{e?DjXW{brgt<(jy9gPbVRFWZ*m(8#b1vMtAaQg+^QJTWYR+j8u$5-dwIBnA{) z5&4sdX7KxcurXz=ySMFZ(`$vN!febgLa#|EACRa2bkp&*2;8LRZTU26A4M)0Sex6t zeW;1E$@dv#(|OisBw$McmAeRXH1#5x73crpAX_+=Z08nt^Ce+O+xZ^bUL29gOTW`~ zH9P;f0kp~8#wr#=*K|Yu_3j`mqpO_Ck=_9E_kV2!3%F%~ysqA-*;V8vMX;vQ*3}}t z25tN`$BI}Gt?4eMde(|(mvjFWQS=Uf0&?%pH<_S^yj6~gS|8aJ;I0enuMxB4u~O-c zX{z|62A-e(280)-4vf^|Q<)Lwc#ky!)i|2bY2Vugw+IfpH-zd&6u5ix{87L$=2!F4 zNn3%h<}5&Vn%y9+ae>Z})C{+e-FPR=K6oLZk9`!z>$~%jJuky!0iuDq;!bMSDzB+l z^VaQX?6I6Hjn|9>%$$`tJ`A)rd4)wQ^qt{GuX|~lK-6&WJ#qR)ZgN9r&%2?Pwdz2yHJRGJ#j|iL>W#(L(X-{Ppw0ECweMdSbj}czRoC z9yr*}jhon`m+o^Wx_ve=dnq{CB_gIBu6xyvdvAqI!(0;!>Xo2ioa=8fvSH?gHBx!e zTY7<>bVl*|9+ZqRO6N(?Xda_k?aC*)O37UJR1^fm?j{$Uoy_2e+LtrW$aW3oX(o;G4x{uW}-1CnjM?~l5sR%d!+F175?uWe!w`T(aA6}I&>Hs zTQnxuC={Z(47q;g)>rHxgK4Y1O=;yx7KV*+y;R~dC^>chDzr-pvrEPH_`z(=v9T40 z&YcD@*%ZrU)iv1U@Xb%(`~-)3MRf}5Xym!K0hE1@)g_%~*y)alhn^2x-CAze$5G2^ zuXg8_yFP-oma7r0Gh|aQ1lrk!N`r}UXj%<3CYSnW;b4MIf219IRdQnsADnpYzf8&s zl7;`Z*JxY>9WL`21gQiGF;%?Mf=V&3yZP4I)3q zy&V%fMw(PRmL|^Z)TMNCkm#VU7(4hQ<1q97czu5f1YD+XO$5n{S)n|G%-OhBui#D8 z_g_LuDK$yyGG%n4%S+lFm)pwV*;rQHSllHq*?;bRfU7f5I5*jI?h`KDnYwpLeUe+( zKw=jYCdhYr^OH9}l`tVxU4lm_1B)Qf&3!~!&Yk<5et41*fa0BH>$GQE%GQYgM6!h! z)=y;XfC$!PtFvHf4w;2(nq+Gm%e$y43!bfHt8|PmXDg+3mP~9V6(5OR+d9Q--{PZ{ zY|SE~m28zFTM?BTT2s;LrBT`Ls5Hq|7s*zqwcB=vA_$F42qhE_I)b>6E`n72v`}gsOAh2oo<|ZokogjjT<)?t-Y-nH>FHT&1(e z0-PA?Er8$t*H0T`vj=z|iv7A)ud_O}&cnR8a8_A*!A=4<@@E9@VMi$xxTiiawiip_ zj%gOS(xA;~1nw+I2XeATC_3w)PUi|QO`P*9XWdtvvdx1flsh@<7-5d`fq+1#y!gqjpgnS)uZFf<2Tn6hx5@7{Aes~>(-@!zvLT?)K<6X4zee9&^zN)> z=ci1ft8cKi`S{e|lkuglfJJQ_N2c^{lh|l0j160uKjgcU*k%gSi^a?_;LQFT?NCmp zD$}|LNhs4%R5j+`c==YMkBfIWNQ-+YN3JJ8z?r(f9DnvJ+{do>BxIlUk zGPi%bHi@`#H<(FuYD@cgjr-^julb9`?8<2zKDfDcDnGOTP6>ls`GUj@a-j)oS*B`C z2l7>6u%h8#JTt@irnBw%dNg|Hr~oHg0b;?&45*?PdA0t-p3=mwdXJY^xE`?AQ@QL^ zH5gOO#?c%;VCA*tPw$Qi7-X-P8uNHfqMSE-UnKqc#-Vl3CKeg3;mkUDz|?=@ekY52 zcng&Ii~qDH3KlYIp)?EzaOVCNHyJS)#tHtY3WL-ryeUtSV=G~z(><)2x zH=&S(Y$?o0qzHwd zHGJ|$*r%Ovd0N6ZdsQDQ>I1?m4$!rPF*J&9__WYm?Pnw=TgW-y&q&-vNbdL`z02p6 zsdi^A4pT&|Ap%GJsfjcnxa|`qQczS%8y9K`r+qnm`hN+|iYIy*;6l8xcn}j!A~*6w zabD)r=aY2BP&t`PBDW~CN~$cS+DVmff4o_h#S{Orrz0(DQe{)lu?CoL$|+{~)lGm+ zTI>&WK%sIfe_C2x@`pD;H>>hKt)Nv*pj8F`&?ac9a!`o|nXHAndz+>x(p~p~?xrmU z-PMCu=mOw0`UhxJ(S-E zr!SN1^Q)Jr`oWgzJ8ZR`j&L>r))5M_RYy2@Y>SStYS-!|0u5dSb>zGfKBefGgDZ|= zXShgVch56X=MwdF{Y=jA(O|$izNz8PfS&)2s@|4#h9&uj4+{@Jc#~U6ma6C#r++Rnw4*Kr3^Tqq?e`z zFx>kQfb4(VOOgz+c;I{&|L87xInQHIpShKc#h)>;y8eli;HLt0gA*rf^mPT}v>sNs zUN1D3*Ky*sj(3T*)B=xXNUxB0l*beQgxsVbv8A+OW6hVz zy|JY}Gg5(`>Ixk&$CccuwB;3Eg_4f8q=I0nOH!fyuX;ox6?}@2MvJU9Sj%wNu*D+l zmpktoe)x!SDC2ewKd0NVbLj)PMtVK_YuS$__EiJDe<=GW4LFv4bmu+9J0dDJ1DPo* zI_!6wiF)-Cl_gl-2I=fYiQ%SJGmy@gjv%VkMadhI<2Q`X`0yVj<=J8rKU?~shXbAW z`>^=@VwF1a^YpKu*^u5sZ&pkI7t;gyd45v*TY5F~T3zq&g623`iVkHKmXn8kGA!dU zr3jNqQP(!^R8hQkcjViX)$zWk);dMyKZm2g)&$(CCEeRu?j5{?+)Dhr!=!h+ zo4jmF%xyZCdxrzy|EW27imn`tKmX09$?l1o;k?bO{x7w4&#FU87uMAj{E-msQDnJy z4Cr%^*hc?1jz+&eoHin9++ni9SCEoTH|M4|o3pnNhK>kiA7L@*l+tx|4}_T%jVs>N zkee*@PEff%eaNg+pX}$}iG;IXwaV9DV##jdGiW25_Ms%;35VsKBoZ@SAp3qKbMt9R zwr`$?b(x*!s7XgJoHE?-1`=XtQ5kMHgIK*p*uj0dc{!|s*H1l=P+_o{WZtBkNnldE zM$Js*gnx66w)fMwGN>EP+%GJdtk9_xVIkC? zX=B!`GR|_wc7e+hA*7#UDuR=n&pOqvQXg|Q4 zEJ@zr&DPIn-naVs2+PVr^~0!Tu$N%U`N}T$Zq!eMH%mWrz3=t&OeDuGY-dHZK{c3{ z&35v*n0bFo+xggQ&UVJ9wq+kUw4eXrGz|8$msf~A@h>-oSoXo4?Pp~~$?WF^q9pq{ zEtrSb?M_B>%Aq?O&8N=rtB7o6FQ+CBLOq^a^oxdbR^8)?g8@lzp-p5}b~d9gtPIU4 zQhlHRzfG_ApF^GgS9|)*%uoxO?P)K#VD|L)_x++hJuOW71$%mAbMpUhd-}!SE%*Q5 z_Ecs%wY9Z9{j<@G{gORRx-3mMf^Q|gW>3#`Sl(!fN4X0`_B6F&F!xrh)&*nSZO;v3 zB{;g(?2Qtm|Gn*!sN)Fiv|e+)(swexo0*)_dxgd~cSUG?r#|#o!M1iIdNqQzrQNq) zaiSQXdOfgm;HE5tqCsZ~25UP)WMOmW{F2bKoi4`3s~2maqZ5ZP6zrYehWXN!mxJnA z54||uKXEc{K4*ZEk{k zK7zs=vFrH~RJH3lzP%0^1voP4eyMZsCb2PK)GzObqH=E_rG?mF{~ANj_eQDsV;n8W z91<0-tL)O>l{myDGNAA8=V4W??0b;xI0fBuI8_jGs&o_GM3U=Gs2E4hb4>+JJWOM0ER*l!@+zPuA4;Qz(pQfgkRgo9YTSbBV7kar!ab2XjtlMW=koq<*z zgq_GVq_=@o=s#bA5EVg`P$}C`4-tNLzcC%2-p$}fN}!6Vc=wTYqZ0=r9K|CMtP#|> zWF)e61bi7arbvZ_0X@U5+>YKX6>i%-Rxu|oU%G%@RcF>dwPBDhhiSox6%NF9t{o%Z zl@h>W7!h6bJ1E$;g~d&){ap^h+Uz$}Ev$Y27PY_HfmrRQKy6+Z>WX8*HjWF=#kfXw z??T-lBW!h#8H>iri+q04Uo!3bNC=tO-@q8nfSMHHAiwIfAgYZ1~=4&iKP&>c-WOI(ys z)U$g(o#!3Fq8}ZQHmoxo#o~ufM$=yU`$B&F^IVZ;=l3SCfT2&=wAtxEE=#Z1`@?u8$`P=rg(G04e>0h-xI~8$nLGh2{Tp0_ZGis+ z46YWz$?qlaR2A(|ON_CnQsGUDs^!OB>|8Ys1^ODNxZnWUmIsLNE`%2dDL2vIc?>0O zAU8}{2|~Hv?|eKl%l)%BiD#-_y+lF~6m7zSttt0jzLEBM>TZ=VfA*~F37kr0vy)7z z7T9&kf40?0Wo(4OL0T;SYC@iU)3geMef@TU$rs2Y-80OV)n!;uP<`# zPlITBy}d@<2QK^5&!*MiwXP5@9wnf26NRZ456&i z6*1Ktia{@D>g}%7N6Y0VkHSe&{jIfHBg;*;V>Rrc1@uEXbACrcD>cgZKYq!n(VoI| zH_1c5==8^}`f%6LRn23TBG37ZBc8#}dCD8Mu2!>=hMBhue};Qkh?D)Ty!mqvRP!$M zhcw_4H;n`{%c!9W?H}kWW$Jk(5SfmJC_JgM6`CVIpyr+>df%}uFHQauL!@%y31#i> zDCwr{t-zw#ok-lpUFMwL%p2KuM+5icPqhy!kN`lp%oUQRd~~b%3|F2b{$SR(DoG|P z;Nd%Rx8(kqz1xfbjnZC85lp!#NAT8s2KMd9GT>IKMsK&@0Z<;6aiQOSA*EFxehP_U ziTz!et_D@KUp4cZyqx&dQ6#>k&tQaTEK@xTppn_@2N|*@G5K!v2SJRkB%$1U7nn@P zjU*5C_qXf{f`cUzyYB+>8+U-be}w!&^01IgdeSN87a4^^0nD5v3M2gwfM>luD&S}g zc(56@cfS65wlKp$u)a^5#1E;3atSW<-(y;mep&3B*GUZbaiJ%n2(f;Obr=$g8n)!u zmF3aL71fos;iq$5nNDDIsVmcinWYU|I@OiwvN662>&iO1FHm*^sI;yuPDD2Yl7A9k z0PXI+0NMkfZgpjH!rsy;!`P{=3_HBEEN3?WGxVu-WqYNU*A3a5Qq)iQ{}_80_$Z63 z@qZH*2oTta0Z~ySMg&Al5RnLCh%8V_a1#hYC8&t$(}cS{xQXW3Wz~9V)mK~F zYD=wFMZ|DXNklGQk)o)0K`Z(^EGk|aA|UyH&zWa80eye}_XC?}&fG6&&YU@O&I~2> ztsttK`OPD-O|>6)`sU$FML{ErcKOT6R5dQ0&TQvd%^hbBZ!_7OqU-y)$K0La6ABjH zlZ{MQsBVH}EZY8Rk+Sb~PP|PgR%CEIH=pq#PhgJG1&hzTluy(Txd&|fsccOdCjiT1#0%=hGbRZG@t8ed!FWYT3vjz9Ne zwmM2-i?gWQlz4HrJ&&ulV9e8z4@Cx6G3-)iDuo=D#Q)b6nQcE#u_>Kmx+!BGWrR{? zWc)-K%l@A!a@r!pQ?<&Uf10*K#@&p;BA%$5pL^sW*k7f}>wGADwH(}=PDM#DsFPZSu&hp#=QC4$qT=&}@k!pAs%mzm zfvQGM=}^tAA6L`8OmbKyIb7}KsrTM8Dx!aZ3GxpTR;ppy)`<+DGu}jmU`%2nPH`@M zURKy}5egIwnH|Jo- zwI2PSmw9b<>E^K;&M;HG)p>YRzZ~bJqyMi*+#^*1> z)deDWUDbIxytLX(SbB0NYJQAZjtDx$ylzq9%YlS25wS_qnpctz<&Kxm`RPB_SyYzL zp&{q>zOn@8MO(Xsds{)gonPN>uy6?2Fglz+Y>~s?5sN2AUfv0!UaY*y|t*#CxEeyrEKEc(jjUf#A2Ey&V$dgy3~-F3b&_jm~(fXU>Cjo9QqEG7{q9@<5wn?f*CKck5?-6BMd+>92;Yw{lA&c+> z368lKvBU%UOZljn$y`DNH~KI>a<9*0eECScGTTX*aA*51x{L`$F{h>P>Z}@>ocg1M;LIwSi?kM$>MG>G<0(T@X z>jbGxcds(l0{pPl8+vzOH%epZdwNyqMEYb84`4NeUk)E<&7}p-CX>ioA;1~~!1s5_ zK7#M}JD;OwM$>MSiOS%C1+sCtgAd!!v(_49yV>d|DH&+!pUEx7)-OPF(Kwx zBXBX)c1GaRVD zL0z4G#VeG!gwdm1?w4XKB6}mfKg#+-dhVT=B8k@%Yl?_K#>jStLc{3!cSz_Q-4pKI zxY0J>P?T}*7}qoU)nLVN7U70_#p*4R1!c=GXv&tw;Uv4}zxX*~ZG zTG!~IE`j<3lr5zFW4>13p44{8VYQ7qMUI>V9$o_uzTKkeh9a)}ID&ik>f$sWr_GUC zlLd4|%Qv`y9)oF!-JEE6pWYa@gB$x<34TND;@GGnmbJa$*x%RgelpS@{QCRuwNFNl zUa~NI_up}J*O%tqzar!((nG6vuhU2m?OwgkM0yBEcYShR6-*eKWn}D28A<%yHq_*D z#ztqobB^&@#S|72D6!q~WDn~)?8wwTywpP&XAEf=x$he^KYN8H%N-6+MLc$3e18{s)b-OOCAXiC%`%Sm!7Mcq1HJlnHSk^ijk2 zvGJL0rK+tLnp|d$5ghvL)^yo9UfIwRX>)XcC*IRw!hoYfjG)7T`v1y|G?bcK!s_?6 zPf%tg`r}7IKh2)0F8?|bCD1V7!@UgC&Buf00>LM(&A$wX)6|U@h)e?x=o`cZx*w^7z43C9-gACSE?$$p$b8ljf(ocdAC0B?+Wal}61d5HUX_oz zG%Z7D-MzrxEW&D?oBD>Qw<>b(?rl}XNh(p9kgW=Ykj{`jNxfW^$M{ILVAqXQmM)Wq z%gvfI`G%}7d(rpRw+K3BQ#Yx<+=3~!Ewz3YAh5&)T5|wYN!A&yK7M@x)_%tsk2WNt z%hpbje5+Yf9B;x|b}X`?1LyH^hUvl-epU=*a}sM!*b1!m#txnx!o<#KG(h3VJ3x9)z4-9Ms~BC z%u)y&s9TcN5vm8W?*A(_y`)}eC+l1;Yl$!x^-q!T1(t+1r2zLEfG*H%E+rdxX$w(bk*-9MQPKf8RHZtU_4s-kV#k<)c|{3~*jJv-Xj>dM9?1yPTC`2fAj zM|Q}X_)uhIs>oChg_`dFngddRALRfu@6|zwln4UqbTYTsVN-`XAQkvg4stSMTJe9$ z0V%<_R4el5kJNtn2RWFn&|0O8KOrb+ug;bZ)#-dFP$w+85gbUjgYnXJ!sWe~(Tt9n zK<>w~Zy6+%>&YdGK6>e^5hMK3^Vu$_Q7v(ndOo6RXv7FNdOqif&l3{I@_gpwlWGo+ zlZoVBqzS_hZ_bYd3Wqnx9V7Xwa3RObS2mc@?_n_egSOzA3<7wzO`3SOu029^Eqr-6 zGlvRoua$;n(|#ev)0k6|WQKK<1ghFL)lQBZF3m9V^zT_34EJ*YhC=3^ z;ePb2p1uj+MZX9(&@Y?m7gYg|0E-~PEV0J*+qB=}v};M)RVOa%3KU$NyR@ACn!F|* zp*HP`rd_wBU3S_fv@2valhG>K^*BM3n{{;WRHvV1+L2lZ$1KxL(Kgb_VtAHyy~LDj ztDJ6L%seup^L<2df@lyTOcj;8`rY`$IsTO%kmQ*u@zn~$yC53G_eXs50~$GcfTi;? z!Wo@ADT(`+eXOroArX9dr)8zofF-D5W`?_vnASt!f!S$gn3^Jz zUq%FXE}@=ah}WzD+eqTeBEac!b*|0>KaPk-c*LNdn)kytnMH zKL=UuLwIO}{qQ2WM3@1o+R0ZgVV3~W$7J1AZc?gA@MC;R)yzO5m_xdUaXFXnqOHPa zfi+U{`|{yZFp>}6m$5hFn^YZ*pVX0i1AW#B!a+R#TkRC{a#Nh^CR~vhQ=IgG5Kj4W zEK5%~OEj)9A<{-fJl`>{jO5)w?rz-XWb$H@WpaCAbD-`ha$B- z-*uD8&AtlEkTme|_|_E);I~ww9%_qZ748kx zslmOER>{HUblZQ-Of?ebKj+tAJOft z-*P-n3ZMHWF6$REf399=FlY{`>eemz#h6YvOcZh2(?m;GwNCa8R7r+cI2HMpTK7r% zGcNfTZZpGQq*s-t3v!o9}F5QPN@quk4x#y?etH7S=I zERCP-hRKssrFre7<93NL!HZGKPQltC!#Tn$^?ZEjXQ?40Az0^5#|!ip98+SjRH7IG z7M&>A>R})VCn%ip_F*^4M+TCgho_R?;HE_XOwe51;J2iAk0(n+qAL{5+$a!zDIvZ{ zE-pc5U!=SB6m@rRCe-S|p^3W?S4z&`kAg#ph_m>@82b4*4{}A0QetV1^*V{s9l+dS z(gGc>)ZHVyGPKft8q<5Yj z@0}U%r=mJA?9EWtQYS3Auj#WKQPD9T!eu0e4qL)P(S}{@f62;Of#Lxqnj95yx<=MPv0XQCRrni~j2v&$Bmjg-j%H+Bl zaR}+qW^w4nNjMfOctW*zUf_|3T5^%x#HCg}%9DzT@p2W0DtK)nAg$nKwV@2P&gB3b21}AHC$y1rWhbjo)D`|WkPxkV`%8T{ z%&Qj2Bn`E{b++}&^cC(6m&kEh7AJe4gmbkPk!^IyI#YxeUtzft7&3ug4$iAa;w)`- zxRZX+|CXPgrukqy!-wu8bzi;_H{K}7ihwwid|C9Kg{uAM; zH0Ka@6~7z!Mfu&%?`eLo@cV#YDxQP8m0y=vGkm%HQvOGN2M{)l-}(QKIFjZk}%F>vH}s>Gfg-9J2V z>$gN|%fDy*W&&SSD~@GCAL{UKl;T28+?3~@BDtCQb^@)0+s%4^~|z?xV#0rWL`hkBoSw+%=Fq9Ot7< zw?B~esFc}D%FL8N)5p1kfPY{%cyPuL z;4j+YA!h=A09-l)v-}ThZ_M(AxpNHyI4-O3#X#bE@@pwRDl0s(@g?#P#pdMHeHt0p zxJ3YB6=&<;o}p>hY1k2=zv%q=xPnjk+gPy#tq#(-Ok7qtsR$@mXbu52F|2T zCoV*a=yKV~+2}axy<*3joO)`gUwJmWuU3Rjht!9w23@(U%ia~;b6sefG%3pt?&W)d z-wrxD#qOgM8p9M8idQ=E$lhrv0|)98?Y=d8E3CzY+vTm!U#_LO>!Ry(?cmOMaOddY z-az7Q=2JY_+EPSEUST>CFm_!|T}$L*?aO$1>tWp)FWFgYJx-QR8TrK~2k6kc&EYBW zlGb?T&S+EC1$IfRUAZ&)K;uGUxpNqD~->=Y7eD5`7YDRO9LzC z^HxgJXIYG5!H$d#iQt~q$e%e?|2iIA>U{Y#8WjALi5{yCC4zTo=XH!QjtKNmWMCrr zBr1eb*+;I?QHWP=;XU_lGpw(~^A7dQjt4(QN?r14EQDnj=(Q{-Q1>E4d{sAWS4x+$ zi4m@FRh~kej!Jo}&Q=Ji`LjTcML;3h{yi;Fxj@ze{>IBcb%sz1!s3!oIg!W~d;fm1 z(q7B50(HU^uDXj@T85CuRgWk{87l=^sSsr>mt2L$gsj)`bGBbCt;rR2$$I*wrMWgx zcdx|RPiUy6xhPO~mw-PQFps+(1oW{q5lZt!kki=7fYhW;z%B-)xi<;e&4AS9Mgg-8 zNM#}d1_ZQv^VgZImB|NhY8U3PA-5D?v;2`B{D9ibrl42@M1DmHS9?=VW@NJ7Nj)uA)Xkhd%3L@-_M0K0+BOdK8z0sYe@>FlG)d|Ansbtu*S5(7 zevE+RM~y4xBR5dY%sL_`p(5jkgsfc>V{JV6T`ZJSOFtLmKjHM)0?L6Z4DiayJ(hCz zR!bGLd0BVI~S3%A)`z7 zuqJwsfWUZEUW2m2y4WxLLRU-Xv!Snlgm4(%Iw-v`-Nij(le^i$`ATYki=Rho%jcKL zwT;&su+$1lUB_!(bK&2E*VrYCZQgVbE*>46A4r5x7EHaScA?*A9?6bJZVaqk(4%@` zBKXZ}4yt_i*K&VQt78vQx)r{N7^J4nMRw#yJGeOcw35(d)O_O6n)w-#ywyVa%i@vw zGlbanGhj&RyKEg{|njryC2&g2lr5O_NDB$XU5?Utm*}nlbt^x{KU5}$H3dv83I4C4) zUASghZJ=(Sq!8*n_pLxeoXVEv1?oUp-)f;vWkPwA0tsm<6B_xsKth?ygbx2l zAR$a;%c#^x0tsCzTSlFB0C{97Uuy9*lZ;!$62alD5d-)g7m5cjE^2amgse&;(C|Bm zBBv?kRp{HzF|{2i#uHbT%HO&A_fq{kyEJ6|k7PSbv+c*VbjL{>RS_^~p%VFpgpSqF zoR;7Wf1qAuy@_D8S)OE^S-%+NpADAfYk?qIE-_@T_~q38w$ZeJ3;Z`1zRSH-xTR{v z1Eg);q-|#&PY+XOnzJdj&ciF(+|Swg%R_DBsDE<3p-2bWA{kd!+LfJl<)mGbw}~ghaO3Ka%aG7KT+1@U-5W>Ja(w|p5ziILVm!FOxf48d zpXYp1HzmS4&174$JyH3cvqB_$s0fPn_8zw%Xrq)f5!?nQeC7a(jawqP49k*|WzIHy zs=Ke~vpfTn#VfZ%ud2CSr&B}uwv3IQHDhdIPr`!lCd#+PCT3To@Ba=w@zry65(n!4 zE!joZaU`%VR=zeCd`>6UMtlt`p%bfF!1jstoPfeil*+_f1!S0sc*%FA)@8KWdH+g5 z>we@Fj%Wko6R=2N0bSvGEwZ=A`xb2Ow#5z}gsqv7?c7gDyz*dtK^AOaw+;1e`WEgv z@!-KVb16Z#0L~|DKH$XPgx#YJ+kluYt)Uqe5Z^Luk(4~gl-vj|`rK7?xWTXyuyw{& zC@x)6$Ko=$rc3I13Z|D-*~J_5$j6l)DJx{ZiR~qGrt(v}e2@LIlY!8UYy$PNhI*s5 zp3xcwRq#gZUckYCEBau3nW1rHyf#Arb-b#58BGo4>$#X^T+c-L`i9`<>Y=f5*@=>S z8-knS!MmO3Q`-5vK-EO#Ni$rJ#e$DZ7mrI1RrtL0Fog?KLlhaA8lF$R;W=+^YIq`r zy4lyRNj_&jP1-%lm!xmHD!Y+KtWzWsMN^<8cvwS^aO#*B@mX+>z$LxOYsK`b{9}G z)2bZ@XCntPIJg%a3;~7g;GTGJucG019vbeLqdn}N0H(x)E3{cU0iOOW)lqN9%b#Qh zG{=K$!FVv_UV>mB;^mF;%2r+gEO*e7l?S1xg5;(G-!KV2Xd{|Tf}jK1$0K{3SMWh3 zbXv$-#}uG8&Mb=0*vN)1+V+b@0keslgr7cHt8H_h`V=C>k+Mg#wxnHeiAyJl$b*E3 z@OaL56--Z%mnEJund@+=dCYh?mbbZ@vPd?<+`_{UiNQ^`=mBiM?w8SC_Z%JWLjp3! zV9QS09iS%WSszi8-s-fmfMQQn)WBmPM1-EP5#E4_Zl~CUp4jGgj!nqsn>sFumpWY?(!`vv)-3-{8~8kg={_eq9tdFIodOkEo8sV0ktd#;kd z56X>^JmJz%UxgzT;g=~-QIfIhMpq84(>ZLZZd!!ztwgjRv{KjMkZn60`vRCq1MV~7E%Bd!~IHh#`;lea!-pSuNCNEq& z=CVNDLNZz-f`VuAV&hN0|Ij+kzopjPUgU3>cl!MoL=WUI`h+*ygC`zY(&vNBz}L&| z2EyB&q%W`sPweo1eR-Z|43;SA9SfdJ7N{aB-q__6sJHXy-peGZ-|=osDqR>LnTco-`>6m3ZW4>Z6ZiE%WmL&?6Edq9yp< zFojlMm(aT}RqDH1beh}I^KCjuS(HrjZmB;&*JOlGi9L7_haEh#<;A?nv06|(GS&_b zZ~82g8#i8p;z0l2<>y$ZpGa|COmU;j#|D=EolyIMGk3E*UbSObJSx~=2M5NZf*tYl zGntr$+ruZuOU4$yf$A@@JI=@5cS^w{N7oDwpD?;+Y@q%HiJ+6p>yNQ_NsM#XETkcc zdXBD;*E+jCU}Xp%)lknVEF+cEP|v|7jzB}bh$CXbUJV-6+E};cYa5nX7vevND(&!vWzS=Wrm*W`D~wxMEUa#CC^tRN%2w&eg z6Ch;GlJS~xv0!Nqv#Qi;17CR5^8)qCvR~HWcBVx2h|N3&P%<_#Q>5apO&@1+2Az;i z&gcgQ$q)zX_A`Nuw8}hF_*+m;%SzU3`N{ZU!*`Qb{oFv^XsLS5Sdp0s+ZV4qH&pmh zxPRkcrJAE_&JFi#{5wwf=aQd1fS7z=J(8bj6j#VxyuOSMg-Vr-jfMOfFQ-<`*ti~O zcPyO=vA3R(248uR(sZzRhBe?MI;Cd5Q>uPhg@*!5D~ZU|Qz0ypsDd5dAWnd-)#>pc zB5<^~Gc&qwkR6;OLc?Jy`gu9M*7xJ+Uk zX7ti9E<@1LTPOu3$90JXFK!suIToDVFwP$fj%^s157k-L#h7ErPWoLC!MdIX=&JAB zHdC9WW>5Do(GjbEoGA1wlFa*YL5L7M+<|MuxUQMCH+9X7bc@%IrSI%uHDCs`wfF7(^NzuJ@m1@(7j9aBMLHf%S3Ta6fUg5jG@(~hbk$7!@sg>f z*0ti%Qf`J1$`+hT&(OQypX4k8dt;Y&wVN<4>80nX1x?N%glTpY100W(6~1>vm&gf) zUoSXzTD-DsT3M;}PjZWw&u|_gL;GDgh_X_Azrojjg&p>7T28K#EH*%YKqt{|R^dFS z@bSn3ryE5og%_E+FZv#$dV6Ay(+h8VVlKO=0kW{Q7VIee);t&oC5zqtppfZ?&}j`b z2VTGiU@EuLq|f#1zYfpg$>euWZc3E4b!#rRx1){&(_CWPC)no1MordRFqC z*iBtkQoUi~kc@_#&TI)*Lk@V5*4Ty0nViuyZM>J4HZdZSvaU6W?JdqA$`Xm4yoXg= z!Yu;9YU>%IRAFo3Owwq6R3tY$Z7hpWyh!I&P&{ts96&aMQsK_WUTCM<%|=+kI?2Z3 zmv6VPlz=k4EEs zX*W6f>EI6t=5?daYIUZ#r8lu%@m8u2%wBaG@bXS8`ZVO`OOXw8*`$ttTX(5tII^v^ zWXxtY8%y$j&P!#|&JNpD&6o{pF1^D&TpYA-3+Y-E=~KHnD`UaQ?&;D6g4KFwz4flN zXt8GFcY6}1k9!p9seWpUNG`k3l$7y(sRCQv7S=KB*9$iW61R|%DUUd%jwp+M%1WCd-$EI)S8Jn^p zI}zN=_9m3^rmo}h;FC_2*4n{V!TgP+&^JM|V@17`QX^n&X+lQ-Fqqyb=a`|ECf3S7 z2`C4dfH3>_3n(XvtHkF;me)(fM-C8THTZ0#f@lDzjyHn`sbPu0=6o}F zkSb0TSPl|QInA~Hmy zWybyrBduzB8r_iH5N!OBnt!m>dGMq5iy1x9e4=~>^S)%8;PCrXSh%}6Om;m7 zseq#}u32f<<>J!Q+N!jlT%c~^-H~?Pn|3{vb}dW0{*`vENV{Zr47vS8Je1sij;r?L zLvEW1=mIBT0(#)8{rCqxYazvubimIv;D9TKIs{Bj2S8CtvCri+R;B2vcg;EPKx3L& zNAN4RN-Ha1QMM??xM&np+% z8)|>+_l3`cP8at;o#%XHP|g)5yI5I|HPGBPo;xH*QR$gOgGKC$uIEWQlcVd4L=<|e zq&kCCo~NIitLNgU$(>xyF8vzg36crcE{mQsbY7&lrLVX51JYY=nRdqF)$NVteON!n zaA9SRh;CURX>S*O89O)?^)AuL>VsFF3bo3Bw?FVoj0P;fhMFAEXQZsWCe&sRq^B zIfGVb^(4ALl-gvyT(V~i1Ka+tfoynmOADIZ(8b%%ag`3{>VFO zPcyaU_G!CyvQt29(VTsij9Cqqb|Q%iWArh}SrBn_y?iEW37&0Ct_ zL5^i~JhiH(B2MfDG-_2%a328yjapR`tcQ%gr&c8^Y-a(DT9q(HJ^>BeA&k)hityB` zgfZd{%@oT~zPQX9CLQ|~G(XL9e4>EARM%c}t>7!pYwC$=VIs2C*$HAPb~nhOb|P4u zs3~)Lyqp?;#4cNPDRuU3*0~m3+)y4|$+9}BAyRzg%Gypd%!DbK116Lg({D~JNO!&j zKWNs+Ph|8Sqx$aWX_uga@%uXMYDv2eq+L98<;ClaO9p?*9@cB-pS_)fn{$hK+e9{L zoY-(J(qZQ{;N#4$I(Fd_b4~-wLmG~waj}U#mS=K1el1DC<0X9X!sBLKwKs7D(|gd} z`LzHI8wYJ~SgZaU%++lfF#dJsDp!u6I;t4E-t@1l!C%i)oRSF$pTCeD)?;cv#}YN3 z>W`klS;{9k;u9>UI`qYN)epl66xZkpoTCUQ#?mE`Ida_VoHkp}QO32IILUuo)q(+E zph%XYo=etC�i9sXhYtxu(W}n?-fk`aKDfujw`PGJBY#5}!h(P(;?0QkHExte5jk zYA2^DweQg{rwYG?*`oWxe&h~OuggD=is>Osoth(dIB2;$e=K3CoA>JS&j-rb zlIpNqMNnn`K_uf|^NQ?0h%W^JSI4LupH3FI<2)umZ4U?Zc`fT%qPr)Ny4;A5cRPMfmX&(8yC;f)++o~Z$KK5(W+H^qJ@V4Q zTddxvWxxdam8Qn;&|aw3)|;UQ;bh>Qr!J7H`&Wy)H{0^n^9;FN^iOZKVXl1nlCCy# zuJ5fjLyS{ao598@tIZ&B>T2UHG}3&Woe2}{!s&m~NHn&>x&U^k1Ky!vCr%Nm^`}*8 zvej9Lm!1U3vh!3Q!;1MDmgXl3e+H!*R-8RJ8y?dSbce^1DFp-$jPr0P2>)!2p(EUP zkhDQKEmY>?SqjSX~D?Ds@?V|kgzVO8tMwig?J~QBcdaU%M0^$5@#~CLz`wqCRq@y~e^!L;>=U`Mm^!ngh9g zQk`FL8?xi{+bYt}CF>O|0M1B<)&fW07Kd!n|bk(th1aEDTxyAVxu(vrL1t zutpT71xo!8ALhA0qfKFf1b1TlYHMKoLztaOguu$1L`M_MHcFb`n@1i$^=9%JUNkSC z=th(^O+sobIVT_F61h*Ax%NiP3dlLqm6u4b%!r857E`A>kBG8tvUqcIA71htop^W| z=(@0mSG%dh!t@<}qr^2LB&JsDh%2U6@||XVDkJ>d`O*`4?xl<`HIo5yYPQhJjA#7VwqT`Zq}lhkH$OP+$`G^})z$KmLHG>)Uz z$Yy9YCy$c<`aXOd=WO<&#z5zdbQC?W#V3X%d@7D5IR1PZ zGb_Tl;_f^I_pgk5@aecKjr$34mwIu?(+wK;d16f?`gx>1y8yS`;I`&kdSUgkRMI^L z(AW$u;*3OkO9aFzUVIrnk19^V))(Yy1Qe;zs!9YuH39;e7V&x{+-;7$Z-a@7%;%#? zk|^1esB{Y20xPfUS`}aDj~8We1{(a%i~ZM(4B7t}Ry+8eKU``IP&ibW+PILah0ws7 zfi4!fE=q`7@p3*GBh~9K0wysyIS2u^*AAK~2p!yefpaIDNVPvX=w3ntlmksZE?4At zZL~?B{AX0nO&$^VpQ494G^^Qjycr70EXhsi353RyGTwGfOLw>&i)=$$oo> z?BD8;{pJqYKW8jkR;utY9y#dr(QN#f{LUfyO=%OND`_g1eu)8*^Yv(HYnEA`);as< zdMna-Mg+N4gZ=S(kHrwTM(1=f<)KM}=2U&(V_%|nVP{tR{ltMEbIL$$T_Z1S4KKS23cx2rX~wt8>UydPx&4%aMu?W3MI4KL$a?o$>KFLDvUwUP3nnq!2w-}2` z4;OiPN*ocD7iY&N_u98X4rc>(AtJB-jA*LKK1Cp*F{;TvNis6_Jx9TSIr|EwO*yg= zt)~sT5gj9OjD1g2QK0S|0oymCqPNvyBdWb&oMsX6C=in?@s-YMXp6%<|j#|6~FRW(%P(?&i1pW+hiai74ojMF+J%ND5dfTVgvT-r}km~pL7 zyEdm?(u*ea-)Yx7Y1ap7mx!~ynZPT@Kej;{#4P;ZaADy##RauN3Y=rQ^egg%R1~24 zU5zH$zZh>(7-H7K23#(f7damj8fJbq$_y3Q`NS3sR(qj7p1n}HOq+EhCA)sf3S(2K zCP|+f8=(*4CD)Y3E32`il;omNHeqncN{}qMQ41LFg~X}`iw)?27as1H!S!sfO2)s` zj8XSlY_yCPyR!XI^UxQxl<5Wq%V7e&QSl>IfD7fGHLCXzYx5`Rp=lxKy)R z)91#6=kmx%<+-u)ku5JmfM||y)y+gG6&s#rf&QQna<^Yo;99DF#NqldRZf7 ziOt^066qYJ&3Y&&CVL_42Z{Bti6s$WP>fO1Scpx#QPQ~rrHztC3Y0cV67t$^lys&* zX`>`w{_J3sBv)~^8zl_@>S&a7qSgXE*IuY!9#R^LgNvO-qcB+JeD$nMoT)!Hk1Xb# z3<`R}84^BQ7dhw6vlQJ~rwu-&*1J!fSHF{mdcG{5kJ4Lh!39bJQ4yIv!@7e0b?(u$ z+3rA?1!KLzD5vZ=(k{`LF`;Z6Jr@Egk4A`9h765oLWD@xGn`Z-AjmwRP&qLT)AKAY zp9DNW`D#5G-7i#5Ekv?4vQW9s43_%?vy1D20L6g7{SwgV!+$CPN=YY3JXM`jtEGzt zOlqi<@hbt}S5V6Moq(^Ub9qq%(#B45yn=qK)_v?Gh{4Qfj` zCy;<7!B$@bVE&0;Mc8}sbrp4$&wo((Tk^9f0oL9 zJ4`B$Y0*v$rHSu9obQ{}oQ{&L)cJNk>|HrLg;;wVnxmwi-}W9#nmf zglIlEUqgJv?DKRcDGCQru~9Nzd!30)CZ%vNOne55k18Cbcqy?AHwp((v^Rq&uvc96vq0T;0wh*pd#r1; zQiq%mI1Oe`P_PbtHty-Klf;|x(?tX--x55O8O{?N5KgTzPI$<=O=A7EJysU6{3h0J zA*LqQLlUdz@K{+U*6Z!Do{?A;hsVkbA1@^;EjM|+Be4pIMP0401jtvwU$rlIXdU;1 zp?RcDY>=EyM|?xHSmcni|IAbqHx$uC|IbMM8Gap_SZk_P-d-&&a9w*WnusE{c0^%& zEbWN<508~;Dt|(ItW%}Lu&ITq{4W*o>vrnJ3adLcm63GTA;m{9=RTjF#6nukbQUsV zTF1 zyp8PsE$wO+mvVmpO}mbQ*c!hx(k`LpCM{=3Ug+P_uI9AsLtI8~7~ON3y)iM1=RP=x zci#L;s3d!$0V@y56+Kfpft{q=FgSR#Fo_M&m#j-0IHjE__<|@GX>g1^R*|_Ko`6{x zmY@aTOhBlMv}_hH3}GvM8m$l1A1_0s+bzy`rpkssZR24HHkQ{3vZp&KPhgZ`xC~LYtNjVx#tWnjd^I;vO8Sqpw$LQ4gL6|sg z*`#N@Y`7|$t~-eLSp!SoK}Pk?5Dy9ZZltgR5T z0hn}@0%^}o9rF*kbWb=>6d#jQ=lFxG|-@=F-{kS)3XrviIJ zo6W(tuiX}OZvOem)5mbYGd}+^8Pn=PGRl(x`#I~_4(i~FYz!ZBn6866_g^}=X1MLQ z(}SDuOeO?lOy2U;!JW&H4zK?LJ%umY&rCrvlTz_$ycRai6c(QBzCzD}3Sx-6IlL)_ z3SxqIF^jf`3S2tOi<0W&a+yJT_{UL21Ifzg_B-PP%e)mr>_D#9~GehsH>@J$#4+2f6v6do{ zyjdqcp=pMGASSh3v)AcGkmWoAGP$*oHGw$V7Ss})nwf=1$m!H-LYx|jC)}FIGoyQE zL4iPF`y-Hfx(s!hfa=N{inixXy`or+IQ@mb4s7{?O3PUqF zWEw=Xgf!2TDS$QCvAlabFMkxZ3i-n0D~!qKZ?wb?y0jp(p>ZBj-0L)OZWdiXOQnm< z{_mtBS+3jWj-s$?;u7=8to=2i&23iZ1 zSalA-F435JmSG`bOf~N958=3H!2vxwF77)zc=6(E;`IU>U$jzVa{{AwUO&f!FU}tI z&Vq{?-Wij*;PU6CciU6hMOP1hge)ucKb1BYG>PGIF;_Xhf? zVN-IKB$w*W-%Vzp8T*`DtLG)^dlBIXOS2nkq%-d`#eD>#R7LI+x;R$<8{%S5bemXE z;#EE)RxdV?8Q&B(FFsy4hJdc~p?FPoh0%9bJD{(O?!xa*Wm@X}SCv!k%HHvNq?~xL zw;F;z2)c1iIwD}O=1T&$?B&ZsB0V8s`0#k5{@K7KOGpvf|FsU+@XY(`TVqTU!Q_j_s#I!$B2 z&IOxQ?XlA`4kyt!>SDhlpRP^+>Bj@E846^fmT6qwGTzPDL>-QLJ5kbNTI2QS$XOoC zbu~4^Oay)Ot#r^;n}%U<%7tJpqwiOP)9iT7#p^Q#+w*9EuDN^vrYq|`hsZ$8_s>*8NM|AJoIBWiIfuhlKAcUj z$V(QmoplCr7FQMm4TCpwfdo>?vP7^Mp~`Z8k7C{Wmz1VQu4;Oe!3YHVB1!CB7B8P# zTxKnnX?_c5dGX-z==u?b`vSMtQc9%T=-`=wTO&B*CEb}7_7XM3TqU~UQec2ZGo@T9+1n-|L3Hm2r6T_gIYO%S6<{J544MUk-{aAM1b+Q``+uo%lvbYbjZFE@+0#;CU`uftND$=NL{(`tS%@_W_T z+5V9zls3A2NMPw3(rv+Bn8?|84_Zv`UG>edIMsMw6>3(>@bZq@g$8f!Z{fynt6((` z4iLA8&EKfcK$#FqW~TD)D&lv&FJ8O zK;7T)kJb!fF{;C*#5-O&AS7lHLVt`sY6Op#@C_a9Q8%DVgs?;n$iyBMUg>G|O53BZ zMLZ{*9&9xTJ!BHJ0(-%aA&`>`)`?B3!<@q=RXQS2_c}mFn^ak~j7{niW0QJowB|%# zxV%HFKc69O7#JQW^^crl7M^I$K#bhf-c+pmxi!f%N|lF9%%Zo$7^UtsMyW#u9cmWS zMa!fLBoEa65m$$T7E_S4RoP~m z_?~Iv&Ukq*4jmFV@<70l?!smUxtd^VkzLbEOt7~sN*~&u9S_2}V5J+oN0;As5K||9 zNk=o!>ZR+%rtvb0QJY5R*b@~A<26Gntm{DzPBom)>X(J#@zPN;LTN@Pn;Cw45njy3 zOrBuFCDL`l5{}~#L`VQ)seD{7NI-kiUZaCU0=M@zQINySOfmZ}FL$YNaX>1Eyx3>I zW51_LKTZ2j+IK)MGyD)=az~)Q4VO3ds@Nywuy4q&-)!~{FA&Cc01TA48b6>#D&txs zkfRV7^{hbOD%29Fds?6$1hTrG#q{WMf^#bc< z9|E?f-i#K`DOxALE6R`d-nRVu5j<8W%n|6^W|wdzj!v==HE2T~*B7$OwSyC!i~bIR zR8GJm8u8}&e?&wU98%EMfa&ubJ5r1dH0L?`5=+63hH*XZ%CYf!xwF8ooLps(1Akey zhXfL@(My>5%H+n(SC%VXS))xE@jGNe;|@klcsDyc800c|hso2dLdJ#d$Gqc}vefU0 zOtwqp@)hW%xs7jf^3S?yiPz7T0?X&9g2~3<9L2)=i}7^j-QO2r@mZgQN40C_xVe0> zRgVWp7QPqp7dC}E8?^Pj=68uaSlD#^ePyx$jtp6sN;SChrDUY@@o|bIs(QiwL<5ZN z>?`Vv?d-X%k|U=X``MN1nGK;MlQ@;G9MbeX2CZ|PQFI|n=Pm69w4Zb4f&py}s?B2y z_Xlp>LUp++zA11kG6~<|_Oi206?7`lUB5)bvfWe<5o z%!k!wI9SbUN*FT;c2)fDdxTV7P-TaP#8}xXCpUx!C*P|O!+p;jn1$>Q$5QXF2moqivldNyZ$LZZMlTGcBGKl006WdP(v@h+DKM~x(=Jx#m z@iw;!wX`qT`cxn1bo{Cp#>*!(lx%(`v#jCj4Wb(&mOiRiY8DPQuH_pNi5qFH^D4SE zcC*yTvyrv?Y0KsOpzI%nZE;^>p0GtlSTK{fUT5*TFh(WL7w<9C*}!y#YFxtbB6^y% ziX7VzS%ffLLPczSF9u!3poFv6o`mjG59c79J_4DP+3c}eo@X|jZ3?HKUMkXl3e@kX z7u9Um`RW+0nHm=V%>+j>?I!IMPr^BrOA6Ze`zHde=!3*zl*rE3EI(tL^A_>;rYGcl^r93r<# z$n_@IF6{2R;R>~hm6i&FIaJJI-y^!cr7AwY%dk^LxhT3b!1-O6w=T0La$is(TI{^f z-p;orJ1bH}*UwaAV`G);^wn-~>!8@q6A;AYd#NrES>WLNQdluwWr4>6BlP%LpJz{$ zx?os4G&X+t*@!=eQ!iX0D$UIRy+e^I4oQn@;nR!%4 zt9+?D5g#Kjm5T?bV?tDUFu}#k&%C2}6R5vxB(ibz-%1W1E+s`N?>NqU^tB_sURO3l zRq;@EY*H`1ckL>$Np(8Ry=zqh8XMZm)@jy5(wOyqq>of(NF+n5GE^b)+Es?i1Z-Cs zDiN^Vc4d-)?J7eT2-vPNG*-ZNm7zib#bVYN^-_V9?FyF$8gtpRv_hV_>_7oN=>&a| zlg(%^;;VgpskMu=x{NrPnjnka@H(g0SO`>;pkGvWH)x!7R?fu?yI$FN)*n)%9()WW z$Oq)M#$)uZ#)CGuE!$kj*vfs4PR%1mHY_wDWglAdn2>~R^!#(ZS^EFYxxA62zko~o z*1ZF4lT$WNn?^vRO>>L5loNP3?fOUBCE|1w`gGa_W8wLU?A?Smr(GLy-Ov?|xeJ3(xV^J`Oo~Xr}L4GHPK|YfTO)Hxb<$i+=DJiYf z?=9^mJ;b=WG*vMnD_iewub3P$Gy_wyp(pcaOr}s4Q?;{{z80JShf3cUccPUklW@pwp9an^`YxF=ybc_!{cu81r&l(y7T zgW5_h>qn*-?F(nCGY{(K7Sk(Av6C+yet)C=ns!f-+zscfhc%{e#{4gRvp3MOZ}yL( zT^qD_Jln=w|HY!Dwv9F}ZL7AeA8kt+Q0Gxh7I66r>`Lb5_mI}9VJuDTO%t=7n3nPr zP4ceJaE~Q(71%G?BlB2>nYkNIEY;bi<17q8tMgx#xiD{QiN;WKwNp7_=_&c)*o54| zO^at4x%06UsB-6mFSyZi;pl6zmAe{}bQNX}!{RrH!JKUKM&E#$oUBTSNOqHZXY}7; zHBOw6++}Rz-t4904mVayEMxw*8__d!RFWWhCe>wcDP0R^I}whZ#NzFR z)${|>E#BfT8W*CFF+6!ByW*61GktU4jB@YJzNdOh|Cl@bWQ_sS7G4qV5_Dq#VEaOD zonACjP1l@yjq9Ige`pNSzHzQspR_^RB6t^;VSTdIm+Y+;Y|e$m@g}N&$$CK!_XW1E z?WSs2sX+@C#h0nD^huSVCbrS19 zxxm-O&FW#!g%?n_N4tBhuPEOdBQv=rN9KSo9$c`%EK=oUxc1wmgyXU52LLkod_=0jTROcy9KA>i9P%BA6k)_REkqquonP++Or@vZStssh6TFKY5w3?>1 z$#bu!OO(WCqYBcWarJXToMnGxzb;pvEh7QKhAtaf1#w|3w=pO#*&OfTEfe#i4r(3dX@d7vfZI5(Qq15rr#SdqC)HKQwq zaVtao#8`2+j2G<_<%k`y5>@>y;7T@Q&ed!ZP4@SDlQ-La^XLrUMo!}x7a3#IATABE zKVUPN9X-$%>0kJ6q#x)1dF{>77X#eilQiznPd7%ya;7oDBX6X}GJ15S9Oh?rXo=sE zyA8~)X9-cDl%XCFZMqL<#n8ex7jtYTaV$>dpQhLwq6_DCu+$kIpK$o)2E`C1IGOm2xx&dzDG+*D zlkN5J6k+vB*Nh-f=?P}-^)Y5`KLd{fz5;kf#&W;43{t?f?ZK4o>3q>uGWA!ZzheG@ zx>Gb8-YG}D2)sSW`PfCt2kv+VmF0Pug)HD#%P+?7Zhk2h9=Kj>wUC+nOrF+j0xb1_ z&jh&10}co<-ve@xIXhQ+z{vv4^nl?2s|B&03C1U7y?o&?p>ficXJ#-n7thTI+|E$9 zUz711K*1MBUX$U|T2b| zhFT4Fz9Aby>%C`ZieKkW4Eq$=o}RE1d+m>%`=}C@8iD#vY^ z{s2it^B29+KCCltJ$zUv05dtVbo36`A2UBXF+V!XNIGvae%3M>z8Cyv_|Wl7&z2*G z?{#ckUEXn&)jYZGFp9}tc!1RZ09xL8#W56>JFJC5k7*DBxY;|Q zWI;UzU~J=ejiSlBTBmUnvgA!`c-bIS#Y>06o6@Nj-t91Z4;Nj|wit9|0N zHoqUADmcu(e4XEQ>d;%3#DFyAgjhqz;MNTUbvBPTQtj7_5nZ5uwM-X%U-v?C5XCqs z)C>Em#M4=&)<|^FospU~2QV=|=gfnV;W(!lFFZWmjk#G3dKxlsG`{U7+(l%bbrqL&$ay33}c(~vU>ZY-`^BIWn3|rc9Plk$I9DS zaw~>DdrF}VCZFVersnsUL@WMc{UDw9u=b2|lkqjo(f@ystl19%K_HxBYo<`L`@2fm z8tt6|a`SrU={)V9f-k)O>8k}D)<2z$S9|}Y?k&H(;Q{TS4*jz|gDJC{UO%jVn(+OJ z{&`fr{i&`AM5od%(mmHn_lOEnhwiyQzV0O~4U3C1eN*_&;CC6nYJOpUi}^M1OCjs~ zw3ub(v~$4xVpEPaLV&Y9pjd!G9xzpa<2~R~0eX4BA^|cy;C=zV^C@y#FAMOw2eb(A zo(CK=iq!{QD4(;*_@q{!H&G^J54nZ9$r3b(P4=W{YgXXaZ7?{j2Rlb+nxj&A7BL4y z|N4uFiv3=oK7^xs3X@D6ntAF1k1y8gSO@CQAjFJssVSD&7JeaX5*2dBsHa?mvQRxQ z5zo`oo(<|bAI~+yZ8<&DA?pZ9T`taS>()fi*5z-*R~jM5r}0n@Q}%A!dO|vM^h1=VO{%+-c;17hfu&-h5ucP3w{qEMuO*4S zg+3OCa|WBsY30`U(wik@`{z_=GERg4*Up@Wwq5cmYE6b;!QQ|m2IH2hxUH5jiI$5_1z$#AV!aoAQU+S7!xDm*Dw{+s6NuU?p5 z7?)~>sfFq8eCZX??g@yz9*&_4bUYb4^GwRkz4G!YTZ$|IMXlSW35l2u(R@@VvM3PXnSw|p*D9on|V5|eXf={uV}Pvd>7J+ zkR>=&<~)=3ZJ(`W&Yz60H}BFDPG?)0vqVF4!25S3Co|W|oND9Ert8}Te8(9r0Y)lUM`>)vU@d6Sd&j8=%H*co?pc5lTDnmhfe~*jh}PO zLsIH;Km6d?yf6*7I3n8GEpRIrj>vkmXB-dvuBNQeur{Z^DV#&eB3CpG8n;V;a5Bh$ zOqiYI1T0r*uWSmIy07!@MPsMYM0+~Jd7mc`p%0j=6tOcO?}`XeHdr?mrug|`s0K`! zm*Ir0Gj>wZr1KAxM7LELyPf3&$Qh-5*z^K-DVfJ7%$3+ZP3+&MV#CoByG~+@ME;-d zWm1t+E03Bu1DeO9k>_oQ zHHb+hhn2ExqR&wnMe^^*|bB$!}ZlLWSzU|1h> zH@-xm)d13;QSsn|wj>Q)DS~SPmV^u79u4<6)Mz2x7s5RmGITNA7a35*#(R#j1W1A%PXEwgM>lufr|dT-c>9;(aK*q1)O3FzmNf_Rn$z68))LTs zlux_)0+jO&9P@*Du<2{<0$m@@oD!n?4G1BuTN`ZSanj^$v*9S zhG|J*r}(sEn9-P|Fg%Y|#IOPtW}J!4rAG+v8i?7!Ylu@T{3i+kcIq$+M1AH;L!hRe zg*(w*lr8t2_yxp{97=GhN{Fxd4>gS}2=A2z>E>&k?K<;$N!9B3-&|;S=tc=D9+7- z60d{nr@=gN@K&6a!I?bt1cl8Rs7jd`pe`KxRZE~})k;-p1_yI%DkB9Rv3Ei6B;dVFFRV@h3P{1^W}JlKD}SL9 z1ZY!wzy&N2!^uc84fcG-Ekm z4e3Us!a0}(0Gg}mzGyXe9B2Fu0c$H7((1cn>(kRvY!9wYsUKwzu1gta3+Pu9sNaSQ z^IG@3^y}sebHA#e?COrhe9;{bwf0pX2=;p{`dfR*DG%tKfaWj_g_>kvk2y=X;2?1H zF;K@~JW%nT`|gM6%NwgXaP)K}u8z|0lEhA2;a3h^#w2J*?IF6Jr>hw*VYcxIypf^| z*yCsBwU%}wVke0x7Caep!!;MKe#q0xGtvvwKo&jK2HH|zg+N-xH0;pck=4J ziB|_#`>(nJi%MqG<27qL5|WArumr28YFrZnBjPeD@_8FVnkk>SWg;Ey(Wiru$Wb0^ zo(N;PTn0}t>C0yf?z2={t(zM217A9q+3+tu?zQgPEg-9YvbQVLfJ1*{ zx3Djv2C!akUU+S(fq(x1T2>F77-v=OE*k}YT80({s>p1IK0{$yc4rl2n{(o->k_l# zr(v#!&gCx7SRxOgU^ph=KO5ueqd@w)ISk;xb#t(+C;zZPld*1YJbbPd9(|0i@Q$b; z(HEm<;IJcq-JAu9l)cx@wR{o59TrTeO%E=^ApGLcv4!X-Kw_)2}$u4ajht`}n| z>e{El@Ml$IGeSAbTZnrqFap@BWsE?|Fd`)xlE+qKw}Yo7v+xGUw=Kg6|0VRN2d7$| z(cj~aJBRiM5gy6#2KRRaj;Wm`yI9o|hoS-k>G%tC^j`oVlS^5n!xSuZGur%4nAF{E z;rJqs8=-%*LP0Gzr#yCdBe!7I$w3ITjt;aVOj_guR9paWhbwhC7w+}*ZiD!5kuB8> z{di;}kOzR&YawMvTmm(ak=Nd@EjpLU2ES81Rl9-3Z@~2;@_OgcYHx-+`V%4vYCc)> z>%Q=NH?Cv~=)O$ol)&Z1qhjxC1DW)4Cgtj9coRF_6xhO`_%3&y9RwQ}u~Aw68yW8OiDrXh8>ufw6#B#1*B1p17~Q4JS{iFs z8s=e%aX@usg@wCvGEhWgym2;2WaGm%%$%LbHR$zlsB0Rzl0vfzymI`UYS8ks03nUf zKRk%@N2Zn5eV{Hn)q(3t(2eLhDo2fopvRquBfIz&^oebO zp6zVPNJ>4RcU8H1t)z$N+QS8U zw<`pS_+$!lfrhf7w}MkBc7F@a;S~HH4N|T~%1=XrV0%b>!Cg+QZIN-GLUE%G>GVYu zM@q4PKtESJ`2ExPa&0?hawu-$39il^73@fNH+Dn6DK&ew@d3un&@ASCgQaC9=-;r< z3lW*;-2uF4eXdzoMbfaZePP5mD5^PX_j7eNFg&UZ0Yx}U^EQY?=)0a3VF+}yha`C{ zqg=}Z)AZ$da~y)NHr#`FBPaGuxpp~XVqd`yfjQZ5Ud_CDwH@;52`~13g;1fVL&z9G zG6E+`>L0XuL_1l~V$M~&S_d#rKCe{$2E-XNx9 z6(%g5?EoU|YWlO#%{%kHA36o9Bic^kJ`doh;7Zw|*mt;Qm( z4vc+(QBn3R5OGVD!_F`CiO`V9I1POxF2%<70{RtBVI8;@VT=Cgr`Q$$Dq3LcT9INq z6R%93kKbkZO~h|1ew?J$?sB0NJ}nFNtAG6s`Q*?}r)R6_8Ai`rrsq<6T1-zBJ+CTH z#Nnl(h_sB#;DKucM`-nkR)z~v1yid1gDLJ1UwkF79)^k->4k7gkUL0S+;eBcg%!O^ z#-`ZTg}kH>|IJ;B5en6^jliS^jaa`zGOmNGu2K&ov>ouYb!66lOMu!h`F9~^$G78KQd(Bw(|Q*{z)lb%Ghk z8F7`X93sU&Hjp1tN?&B+C1u)Aj2xsg0+lcPT~T>nWX?RmL|PuiUyR(l?e#_G+#{(T z;0ktWMdUF8l=(_EcQH`>f-6RYtFz-fwBhB4I@;&d0L0-A5s6r3H{8V#oI$~iBWeZu zw8_MBm+^%Ey6`-AlE5Q4C`V1Pr`; zj_x<%F2ErN_nn`>B_}l^V{xD>m069Jtei%7h>^N_l?EotH5D#pIO++1q(upS48Um{ z2~jLl<`P{I5_Jtlm7xZPL!!lE;>RxzcEES2759cTJWFE<0JN`m`maG~y(1&ZAYd&( z1tHQqGJG11F-GXGAQVXsH<)-xf*r$0j;K9A1?3Jl{Q&KRjXky(u?Se}$jFX8u3AIw zE?SUaYJtCKZ_efT#y3!*a-90+Csi$v#p?>rJKc3l(b}~~S=2Kvx}sBH6R8vuKB9%@ ziMnejvV~d${V_CSAXaR!tU!ZNHcsr!Ujd)A+uGGsbH>?d3JYu8q4Dt4uXZn;m6Erm z=BqpKHdaHq-M#c@J8t9lOfSS;SnfI^j8>#ZFHLRmo>o$?Y&H^EF4e#mw(Zt#!9%^=bsIrPg_)og38LkxdF^_+q;lcyW0|ty4aM|^ zD^hCql?INlxy@b?IJ!)Gi`dT)IA?HGs{J$jC$V>HhLi@f05LYu8&x$T)mNr%C0rMU zFZN;d;?xF5FT7MkYN8`j*E)J($^}q6|E2)`JHmhPIjPQwQ{5{z-yPzigR$Cgj9-Fy zQ{Oq!v53Mv3DH(b&KYG_=g9SlU~*v)EI@}K-u0`=)S2}=>sQx&)wOMZs(a~g5H@$+ z{fF^Fzf2`Yhrq6@fUlg`VADJJMX~?H^Wiuas^8Y&9Q1ae%aDsY{1G#*W>`*spi2vgvZxx;KPQlq z*Pe*)8*o$xf3@R|fnJHgYU}xh*VYThDHe( zS?@Gbfni9F@mGAzwEA4|H1u(2SKEKFs)r5GOeew7^<1+PIuR3AufuZ2Cati(LhhA?8DE; zn~8(1sVKM9mckZn_1M=m+++)V@9$P~u*_Yzm6F)#odQg-<;(+5SW*Z-6Ga`z;HEoR zS@&D-3vbQaT877ZdiXRS2-izLVP$!eSi}@Q?Wc=y+DgCU8jCaTx;+k&PBImZRftgy zegtx3sQvBw!i=uaB#a9lnCb6Xrsc4vfB2YrI8C<0cnU>#hj^o~=vWvzKyB#tF^CohrzHpc`I?9gRC{1Sl;=?+$gysYISx%W*YhRPX259-3gJa!1 z>qNsEOR{GIj1n$iEnTXw^=g(cgJ;##wQK~5@ez99kfPRyIS(`qDVIP$vz{;1=>riL zUWr%+nhEL)vkvD)^kTaY8X`&Bw2{aNTp4dKuOH*ev^X#c^pl8hrp>nJ{gk2FEd@NBS zyuuxV*0I9TT3VHlCA$pP_)4@`L1kJq2+{LD5`k5QgatqezB&=D`#Z4aph)D5p&Tjk z^b%7l^GmfheF%%l(1~X2W?e@YOM3geW@|T@{3p#FM_g1TP^;p#M$~v%Zx~cmgT=^D z8hm(z^-gkd_I?=lbO(LSPr-{x?5-;EC@?Y#t%p2FSa`pEZ{B`=<2cSGO@&|)udhTYPudG@a3yyA z^k=aA3dS1OLG-~JXjqv9s~WKDH8br98VTK9GcyG$b}(F032}8LjWA%hfAlAukGfK* zYa68r$i>@Q8WfXp)IN~FO+VwVU)4+qn@jyMm;NyPr5r)mcbyE*a72^~nP~8OBg4Gy zt83hK+bBI)F~W3rJvK-j@*0!=jRoBe(DHGCq1MZkk3Vb6d5)ac&(nlERYX>SbZc0hXs#ZvN)jdfDph zj}^Ny-W(iRy9BxH)GHt(QX$`gl*-810hP7;y=j3dvO?{3M`58)%sHUX+3bP`taDru6qVyh;*q)JgH?xJjImA3aMSox+o||zm-Uv2M~lhio#uk>m0EMkY(RAKkv6? zHXgN^%o^IQe|3^#)(Avon7hpSKh40Ac^ihJ6tftaDKmbgXfPvB0lG{O>lm(b`9QHP zyd}XlS=Sey>cEgC=(*tq)@12bCZ6>XhZnJC^?}F8<1!WJUmkm2n3^k0?JrEt0aH`Z zJqlCVg&)q;9Cwt{J&@NQcsnt*y|39imLJB{B~}ENrNPwx%Xkti(iI3CEF+M)ipX2= zQ{MvMWTrBkPE5U9VGE2yM4YLmX5e^XYR)W1W=6Uywjv8;L%W(X6D$kSiem`uZ3Z5X z?Cou_Hx;W-*c@kdZf90!C$lq=R)#F7V45X|EH`7Fa8JDEXv?~DCoQp(wD^K8%#)+0vVuGE@y`iz1 zUt!D8D@<$ykpy6;nFJjztx+E=vC<4ZVr9TPaXl5wYAT7EB*xK+d-;edv5xDs1s&w3VorS0>8?;;| z#Z?YCd+R5A-8lA)c?q@9c0}(+W6w5?qN=^Q`Y+gLm&_`WnKGQ<{j=L)Xp&Xs0O`Y` zmw0n3qS)vP@2<)Kon9eAUtuLY0}17U4{NgQMFGR>Fh`zmE%k8BF3i^to~UZpt1Toy zTK)LOXwi=TJ36LHqJZ^-Cm=YEvZD)39(inIKtu# zNWVs~pc{in>w77<28T_5Lg8sH7~#fTM}H0$h_ENXFp`*HhhtxfAvh5P^J&tL0mKRL zVDn;bsyXeq7W5tZqcCN|U?7vwE97Hy-!&V)$WdZOhHGv@NX1B&9iyD1@oAoL8#uE= z-&-Lwc{X~EhEB!z4RpC34J!YJ1wvBI&fjXj`mJ7t)vGY{@1!uVJs(It?m0YQi7=J` z<0(eD=WYk>vZw<7I}s9I3B#IR7>C4(3H=HXxn&s369S^^AKZY!=h~pc<%m6h7}h!8 zqL$TFVdLJG`Y@sl8Bg}oMn)g5f`vyY<4NF<@i9T(1tav6R4f)gTlKSG?Fi=FA zryUWePhTjLCl`+rR`%=iq*;s+((gOxDaklLvD3-~GTy~zFJGL{s6nl+?9 zE5Ht8J}?B|ls?v7w}$A{vR7o(Ah@zYPrmFqXI4f=4XDg7NOK3-nN{YW0@wF&)!s44 zmd)Bs2P_t;m;}ShJ{G%O@I#;&44yxV@z-H&oO>K08U=!Hd~m5Oxtd}a0!nNA1`&z+ z!T{><`Z^gSyrla2$Bg4^@5r(DN`>VN$95)hAg_c&`k&K*8dk zD5bJQdkBIOnJ;i&EJ`VLoom~yev{fupuF4f{VG{(N4V`ffUN2g; zl&;>(afAb16}q))?Z|PA*FmdZyz)+V=|5nqk5Xw*V(O-UAs$Dx5O!`4(0UpZ!Yoz3 zwJOT^3)xAXY0Mai5xj|;H%Hun(RXZ%s8!>7#96AEZ7__x^X znST^|qB6fPq~&S2-URvfSa1Fa6=KUT`l-NNR(P6mW^ zWG#yR5o&-9lQocvD8;k;)|0mmtgSG&3hlPbz~fmG=)}?A7sHrd9*R+gzgaofH-%EL5^cDBo>qIa;w!-uFCW)1)V3j#)0e^1URCyue{Kd zJ=8q|VvkT=P4`d*2l_+opv3OQ2>RBask#EkA_O|>4urVp+Kfg*5~=H&bIBA!%LUEoD>R!Y*vn<6(EQ!CYu>vjCDW5ZH!bmAsf)B!F8L0z`pk`xY)p9Ls5XCoZQKR?iS8y zqn9DD^4P|6;KShdiAlxi)}0Ja>Os6#(ffx!s0D;HTVfZZ>ICP-rw`3`uXwA)~Q2rL7ErD1_& zzTAlzC}F%*uL3Y|%s{mM88E$8fDspc#LPAi?@{o+&Se}TsbAsk%}>aCG(Kwg8@0$% zwdtv1_Fswo$Xgn$D;HP5AvFjC7DmB$3_evh&4y33(ChNyZmE#h3m^L?=2VJi%rBl^ z4)4a;a01-=a!mMG^L5vOHte{jfrQ1vF&ynk^J%-m2YtyZ(GkXD=#Di9L!Oop9-<|o z`uR##*3ANd^a@uS4#K_>=i)6YL30go%U<}}knmxIu?K+h0%w}ViU)YilEnj9@MDoD z3eK$II}RU%SO2RTb*h}mZ&n!+ve5QcFfkX7Bqr|QYCe&0|9t3tiJmnPE3kzbPE0uX z?bh~fChp#{D_=Svb5PFi_H`yn74}VdyN(?!R!Ava!Icg@xRM-m#hx>>H#3jj56wUr zFua8N<(U`3y|DsJX7)#v{v#xnol7nN8WsqFV*GrVh&c#*dm%QJLSDKHSmJ@GMfkhG z-}-vTD|Sd%8rB{$JANM1q8Lb%PH*EV<=y*L?!UNsE4z`>r(KFFGSEIIe-Xy zDg=rRUN?L)ShmJnsD0j3iM~7=E;!U=0mo$Cz%8Mo(a%E!3WQaEn|3RTt5oTi*zAV> zw{AK78D_Q+xkic)Q{6oj4g}P-f(5Fgp-WVlT(_>h1XTK?3X6KC>GrFz$HgHg8G`c$GdaC5=RJnFRuC;4yHkh-lO&L{ti2dxW!Fbfs4Qc0f6tPB>{(LyJcUalD zwUbBLLSA8A>_zQAMEQP;up{;_Mf4iw)hCuZcQveX*;`VP6Z*u%KWB;eB{T2CQKS ztpW=04R0Qs$7kIa%DbLZUM`%LclMrCv z#C=tcW2p{Cy_BM-$g0I}Aw4VZN|+S1UM$ z`efCXY3s<|s{zdO7BJH?>s+6rqpTbItt>6oegsH(ojycS8GcVhOuv`_YoXij2Ek*) zYka9IB#R1QU{P`2zG3=26l&5KqkWfq178$LNP_D`5F9<`!1UD;qbg$ zT~t%1FBI%9h-O!1mR6?UkD!LGsJ70JFuCjgiL|)Q#{pDwo6m5$%?E=Q{aV37>oygw zEY!+I=oc#VG*R0r6;g(=A_k6mDuGGZsNo}^qDZ1VFU#VXR-bP-v+(9B(Dk&`!_sMo z0GPwaqK&@4DI@3DrE47 zvyNjq1~Ro-j$*x5!PDvjR4k4rqJ52fJYq)ZG`!DhLHp>@G%uTnuDbsnxgV zwQJAgjJ%TJJtG9R)l<=o)T!nSB&o8atD*9O3gQRz6H!6-AI3(MlK3+%eQsFE zRp@Q3aA?<4CA45^5WO)~N`*EAAvm$;m)xCrpR!f2XY*NW@NEm#jRkjM@dJGq>LGfG z*JatH9(YyFA>=Tx%a{v?=W*Ew7zGP1?_TzwLX$(u(~ z{5Va8{ela}6paV0tu=!6dmemt<*lq}03@1{th*C7@V+)}WB2X~4!e8hXhAN#Vr;_6 z<`l2`_rG9hLcOfF<5K_n&C3~y5{!m;emew;13fkUcoIhO1| z=|~BjiFSW}6O^DWmWktxV{nlp%yH+l0xMq^&C8v|aeVae%9S3-WIgVB=XgvXCDG2< z=c4jrp9q(;p!Gh${@0h7u*&9+ej27-qSEHGl$g|7yLU!cGlB*?<&AR5mK8QTUc{31B(%uVQvOuS0h7z(u_D75t$Ydlg+?PY&*zy z>di}~0kY6pNt;!WUFWYK_4!C{7As*>XtRHkRLVjV&)Gn3mT3eVv%yoBH~cwQ>!Pk>gWslB=I6o?G6eSAnqHYd z04uOF6%QTe?kl!}9QrF}PTUqXw-w#^!(KLHqHw zVirYipscLzz*_M!DE!1*y50IAyr-o3-__m%Dx)BX2EEM z8TZw#MVN5dVlMB9tU3U$v64;3yhN@(5C8J#(^a7U2!qNQR1WbXoLSP zuDeq?z2os%E1X(7%*gbOuV7HVfwPU)f`$xNuq~y2i~|j};FjIZ1*B*PCfoDi(BFn7 zR3zlBfm>}@gd`kgz6aQ(iKoF~c<|?U#m+$ql6gOcY!C^Gi_3Thi3B|li4;y0Ge{&T z4s|wyI@i$K*wZ33)YA*d#gri2TnKSsgU!bG4;t)HNRsg?;=r9=;7%!;1)N8KJEP## zwj*9Rp#Kv~xnPiRg2d>nUi}>>7!FR%!H25V>;rF7DY+>81Y(Ru*!Q%W8Vt|ssn-*TrfZYrjBLT6aA`kuyFKpQB2^Tp|zX1_4o&jh*L2(whUSM|O zxW@_l-w+@Bj9rGhKmu1VP0P@mC#r%L@~9S;*;^~aZ#9fPvZ45h;rdjJ=IRSw9qNwK z>d%*73HDjr--85nbg*Jx8%QBNQix4=LUcEj!g%Rbo8K{U=9=i>Iu!09-%?Wz8;ICv=A z9es)|;*it-WAIQn|E}PnbpN-(LvH`h;Gqovr?D2K=@RTn_5Yi%&N~MG>R%NNdG})M zfWCDPkL&CDMK=m30?%Pl!;NgbyQQNE?#&K709j$q6_I6G0EjJ zH8%KUjDQriv*dEoKrf#B#wqWBvj&@Dh)u!c%qihb*fH6H_csS`#0erGiNIJD6h^W# zaM4h2EJ(+`CQ7V<9z-xE3-;KHJRR3WPJQ$*R9NG>)m+gX($)E3N*r#>JFX6t`t@3#5=elJWxn3cCOaxH<PwSAdV78OYcK3iPUA6AkcxIlY=_^(p$>!I*r;9prgb3mUocjyQ(Ug(e>LM+*<)M4!iW=VP-vXp(yXmWl9;;F|2<+U!Va)~K*A3zAp;hII}{AM`Ntg#`x} zHcFR+*QCNxVxG0tC&MV1(~vflmPc^95u9XhAA~g_kg2~12fDLBUU)qwp}WYSUH_B{ zl}V^^4pw@#eS*(Evyq7-oGd2dR zvLmyzz>v0YyU4z&eH~dTrBUE}_Skz6gPqjvWZ4i|bC;aMK$4NH)$HX50;99kq~y#)$w} zYC@)MdM$QK)Qb<;i0cq23MEK$(n=vfJtE^~z^$WbI#0~o-eB^G?W&&cx&yE1@ z+q>|6ZGU(Nwx)Z+iJszny)V#Ir7z!axBtdMVZ#j;Sct^*+v(%72Mt5jW;1$UG9?f9&tA#bspCum_(W9=4NqHSmS_V&45krF5kz8m(&P_$b~%ap|Hm_n zK$D4`S(b0nGN%c(VlxcP;|^;u^SF1;<&?J&_ebqy{K>y>CpX)F(}yD*?F6a*yq(8_O?VcIXi8s`Mt%=|o#$V}p6KGSWa23MF`fP2?y9JJuDEH*sx z7BpYN6OCw!H(P%c>RrldnoAtsf)=t0u<{1Y8>7oB}&s$o@~7!2dPxcb>5F zF3~EL=r2dme--^P%>4ge@RcC+4@JGy%KL%C1bh*9yD8vY^w1hW)^hYA9eN)mfPQF( zn;SXF_?|x1>Hp-`$5N z+umd|V3!HgvWqJwwfFMVYZqTTtoVOzjF&~uT#Hc_A5$?+YED6Gr7U+bhdrr zVK-wYOvv%?J09*pm`x~@2?myE|5kE!-DCelu6~1st)<@=tKLW{Sn~9TOsuymn!YhL zy`rMqT1(&W#Er4YyxX3(9i4S5?`T)ukk$-Z^pD~H9}R3;5-kZL{!e|)e^u`jEmG$E zH`QX7I#Mk7f9#O|YwkPdn~a!awYWlvj!z%K9d~O8HX1>OYcI6)?s&`lClX4_qfTtq zo7StASN(2M>kL{js&&pI49_3@OUoK>wcx8w7`80n(J=JG1wd;7RcCc%>_xETa6e9t zSYy3x6?7+p7JFobhkk@3GYs^);v*wGYz4vy3_kQcw6#Ld!xa+!5~PBgL6`!%@A4yS z44N)SSOMZiZRqPB5sBc9GJ}7bH8Ij?nrq1iV=Io!)PKxl4S-YH)+*AdQ>AW@RULro__-Y!C~xVVyDs zDTWHf*qU3_3`etMS;WMp8x}?|!UN6UnKYZN6+~|gx3PUEmjpAn%x)W@oX~%xIL0pa zYK;o3LjGsP7ns9}FJXz|hePuO=|4Ek3$xH*zD*zhu#zV87}2$`Uc{(@qDZZO7snIY z3PPVi=+jN;X-8Wt7isDn#yFV>&14V3*O8t=mm@O91@wP7U`A|mMdB)amm=YCP5StQrV!tU0lgnR z4F>eJuz1nuAc6z><>+)Y=M`YIUqT$la|kKXdNb%6333__AgGB|XWRwXAHO4ZKh}>D z?}*KX5B3B{XJ7_;G#nWz+PTE&HZytW@AAM~h9mZ^rP*X=CNB-}Da=2COM82a`G?rSe?cmR6BRFDeihs}~5RwW~P`Fn-yCN+gQOK+$6d3LZTi z#bmxncQ;Y+TK2nRtpaa7U#DMnIQ%riU#+qv&CrEW?GhADoe4Wb;2q6AunW@pRT}cV zkp_lqgL^Y@Pt#sk;L^MegMV~K{UQeq^Ie3g-)h;WE%-(GL-oG{H&#>0La6rb@FDO6 ze9#t|UEVf3ZeRpCyAcK@Kdxax7CF`Wm7^h)^)+0>ZL5Q;QtB7DJ_iKKm3gIAu7&pt zH>`5K3bRI81&ZdO)W%29Zc+rhQ2;-RN6|sG*W-yPpbGDYI$>#aZM+hnXp@76rlX)hCm!*fV z0KVL>AfKVg=P;h; zASl7p8GuXTDU&65N<)x8<>`Y8)a2Sb&*2~aj2vHV)#gzjL23&3K7DwAgd5kPuw2 zIw>yx&nckr9<=Et%OU$%a;zShWNBBg(paX|53zm7K;}H4g`$x`!0B+y;4O-N4)w4o zgUfB@pjoSI+tdLe-gs5EBce3sfeT2uS0ooms!set?wc5=FmM-pVBy3IP)gNZ&ff_3Ge{TRPnn=JPtgFQMV99!bLh{CKfNT2xLpenkv$j zYn};U$+0ROcF`G#wazQB{ZGwNim$@<>)o7d($d&L1;RbxBqn`~SPZ(sq(YZWrbU!tkJAa5r8^;J4zyUqxBu_|rMRVDAmt-D3i0 z5!il}MceD0f!7llN^e%zyf))2s><`?ppBhDA60ngnRr(d_@+4U)t!N-Dc}VruuPL4 zj{^_r3_MZ+hfLrqV%{7F?qUK{6M~yPVS0(;%{PJb0qhQKr#5QGBj_puCUs9pyuUka zrs(X&cGB+WMmxPn(5?yJGVSt-Xm?LFiqKdUwy5b~hm6&b51|svZ6EgpAK3??y;FZf z*{?+qvL&31Q}8vZulbQKR={xDb6R zJ|L13h9R9z1+q&;MhvXS`BZ$6CcGcu{osb|-*P#WC5Oadhm4H3=&$#{Sf||`!c)Jt z=xkYx8vK(x8iW^Bu@LFf;lu{?R*rdANC>QsFP4*hvM%J)=Acest2I(jk4U}5-q1V< zQjM#Suzyf0-UKYit97$M78V5OvS#vWG9cacJoyjt;uf{@jU z7l@JrfpfIRc(!+#*_v(o9!jAM1dc`fLd9Rg@*6$iQOh_xAR7O2aU5W89}D)#UICa% z4%l1Owc6mc4_*FX5tFr z*x&=|>ZQ63fnz#}lnh7ys!)Zu4z#zg!lK0!z}MhVYYXPk{-VltaVn1|3 zsOOouZUPRgqo+PYM}H6Z_N^6Lh8b7vgt(u8`cn$vmpLNy){s1ntyQU4G}(>X6D8-3Q$Ol0K#4BBCQ>vLiy?CXxSY%H`t1Vk zjFivh%0}JG2QdSXeil;4^dO@eANYs{z8ZYAvN+{KO@gQknh=G1aezZ@^z;N*Uzu$m^mowg%5UQm`hN{e1zRn z2E%sX=*Q8(@LGY{ABEql&+y`$iJj+-?t)CrQ_v)o;W_8_aq8)y9$jSW|amugWq zq5xt>U_~tUb(I&4D`4LBNSd9utu(ARv!~TRDH079I0+dQ5@3Z82O3AiXL9YCXN=F; z)wi%FP6SpAVvIC|RA`UKdDd0J(d)?R6W#L?7{*og+@wj`m!VD)@$)N|ZssCJy!rgt*Zea8s^KPVR|2fH*Z5Fv@ta`kW2NnIpl1SeLYyMJM`ON zV_c$@U4y+h+`^!D7dr9ahC7P$vog*vRkyjC-(ij;O*J66FN}`dt#`GHBJVcn4;7=rbhP z5qko&BJ-5tWEIo|KHx|$z$rT7=_Hy1NS+SB7}6fY%1^>&HckX4lWk=R6nZHEo>FLM+s~ z*eYrH5L}p6G^GC0(YPh;(kozN^-v88{mS(?cIS;2^=>|b81KfPY#%PC+O2OMVMZ{5@B46avl#<9*hw`?RHI(x(#;Sl)H|I25H8X^nXEt)h z8MLjDS+jju*f_dri3rD=_-hniVJ^|f7B)2_AoeYV$nP;>z97tp*jZ4KKZq>X?s^d9 zhS$C!mcqLJd3Wr*t%DNykd8ucHqQtT=>}n+Ef3zg8wbN9R{mcNQKV(y=I}kh-B6Jd z-U|~YeGG=g0x@!E0>XA}62t&Nl#7X;^;TlAK!JLi-2e<5u&Cax*Nz0(a>%QCc>xcu zV;C?#4%s&WSs{=qogvSPL!Og>JVPK;J41GfLyk^BrV1ofP;&0uF0kmlG6DH91gU&E z#Zk(n=zKK}IW+$Jh8z-yJU#(ANFd#vAw6-(yaZ%Vf%J5S{3hQj zdr<=Ns{)oC`)J8@u82d9Pe3*klCoQYEx#@LgK?Ot377{2n;qCxi`b&y90$8C0rpn` zOGyH|C=NC!0XAB|DC8Ellj30aCBXU!7$w{S`)!z2(#H~D`ynJsye+T~;$Y7wz}^!u z%C-geQXFh)0_+6=qhMQLbK_tu6JT`&Yfdm^n?5NH_D%w9qF{@IL8J%A!9GfWohM-A zo1j!J)E$T1k$~(WkfI-mRY87jDl$*Ak%0UX@>4E@oFtsfZ9` z3COzzQuIRt@`gC1V{%;huNO$s4++TpIAo6mG7i~00oe;*e)2Aj1MFnl}M? zO&l^m0eLkbBNGR482TKjE^j7!MQUCgepCYfEWu1RBtdqKLzX8Xy9lI6OakYpgQa=6 zL%bLqD-j`Y4N#S1=o=zRQq0V^>5CO$;8g5?)F8A}yBVlu2u|gtS9bsrt^nDIUhWZy zp@l*^y9#v(WVb%m#L^EL5KD`)}(8OZ^Pgyb^;hTl$lsKOGf~QP-q!S)P z-*rgQ!(O+0G9D?rh3B(DN;~w!q=5AJv{w$pvmgo2Du|d_{1LEJVFDaxb2q+?K~nsQ ztILr=xme#TZLm%Mo0*BHc@2=8s(uD=nZn3sq-yx`IOOI8 zdBPa~^#II;!N{b75lEVgq?2N+5P#3xxD~b;S6#}mXhNQ1_9>!vnAdBtbsR`u43d!#sss&xg#r)suerm4 zH<7>&&8Ho4ePV-QU+Y#{JxBZh-v1BtqJALQCL`^oaeqq(ZeCz$v>%_jk= zDI8Y-N4Z=}FM^~X2gD)INHWum43aQ8h(|b)ZUO{jvRr0@ zh%r9Ij49OuC^#7A@`*-0Z9m!N5si8w#G8_-nd+1k4(ul??185cHKqid8B?Z3EhK0^ zp0J^Rxlf^C`$+*B;}+B&K>cOfGYZt{Gn-nIfU2hU5oCxt&NOqRH~_LUl zj=qOXz_x;9dFqywQ4TVSEd#n?Y-dDQkW`Dm4iKsXXQ19j;Q}NU9M}qzu`SZg z0&$8p16!d*-00@sz^jORE*V>QpZ1-?c1bd}o070K3byj*#0YVle!Ypq)0|crZ}!&# z(CiZk%iK2TL*tO{1ms{sHglR{but-ou*?M55dbrvp>)^jXw2p2^(mMup~>zr)wZYE zn@IB+WXdFhlLke^(m3SV3CP6)DIHS+vM~-hA_3VTknCV2e}(hfIAloza*{yGKq-N9 zP#khn0`gpeq=HJq*)tCL*94?XAY}-e!1-0K5(!W9>;&Xah@Gi-6OdfA=We#AIhufM z5=haz3CMdCq&w6Ks<4ArkB<_dM!5_^R%(!0F8KUcC& zsq6@Oxp0XOp<-_~&rg(gBZNzym&bM_WBDR7Gx2Gw00dfHR3X$hfnP|gM|$gdNEQ31 z+48F|LvtG4ff*|s=OxXVNUm6Mg(5*UPAur|V7|B^325V*=>$Qm8YgbYQH^to)i|fg zl9|HhGO^9DnEJCq=TAoW?#~I1{s55yMN>?fKSI%^*6{R}Gle~YhoGRRlxpcWnEk#e z=&*@}L*9kJVoU>@&En2F1zi(RdC<#D!?+?RQam|w*_5^&PN?2#_Vt6ey6>(=ybQTH z)MoWiUYd`@A61m$Ds#2#2ku>BmDksNR2(SF1gh(XhA3t3?b99ronYaZ*~mPZT9j(%bzN+huOVTvocf|xTE zeF4rN$h8vfA`6T3VF&b|_o!lW{%~Y69_pzI;Vxpn>96Xw9|W3s%CxIG;W6|VOg!v1 z--1lV=~2UElb*-oc(AJlJU(sOVR$Ad;Rz<=aU|0-*2Kfv74ej6K?{$F+6g8Wawi{H z%;FD6n$+aWmdUio$)$=lY1aj*?_ zJr1(dA5}XJGlW^!QA~21k0!Y?(0g8C^Jkz<^hew{8RhneoQ#WY6anFZ;&DE$$tr?W zjiHbKQB@6DIup6aT0|zc#Fko(CL4>=4`7st^x1k84%w%uUHu?3H~MFx7MhQN)9UlG z&2nvM7{x1F=dlp2pdDL&plv4hQ5b}0vlo_!aVr)Ut0cLupCh$P@9cxRSr-*$pC^cze#mUs@~M%fYrOs^BM2YHf)uodyJQ(%;>O=Q?Yghj>J9vY&=T~$D-Z`$j61dU7GioQI1iYc>NT2o*gWgrp zTIx-5>bF(Aj=}G_qh}ypndU{f{yai)a>p6_7B7Dnng{%?LiARJ@Vhasfx#T5%XoJs zss(qpabA#FriCa%*9&S_q}rQV5y3gVa_uDsU#5a(VklgiPZn(O34_6-*H0B51)fBc zdJR#g#VCzSgCc`GCg}icn$Dcff^H?!eU)HaG1-=H2R-iS_xRgXKZ^h4$X&?$3QFeFj%Ax!oD{rN7!v5xG)&?P7(Xv5{&g$fDe;pT?^p3s zk@41SHRK&9o1(v#YcMbi15KdQfe#sNWl6QMi5uN)+W)kdly==|=$XoV|!@iW2-MxPa+Cy1#`R8>{gC2I(=jiZ_mU z1Jej%oaR9LF?KTG6mZV?S_K@82iQOaATmjdKpdw6av89INzPUQ7snwkQvrNdQ6=Fc zTEOv3JYX+e((rsTVv@yHrDh)Xnp~{Gb~+l|nDF}G4!2Kx0sKcdG)~`rohbtltYzRw zTml!-vk726?JHK+Itvg|^<*;OBlJ87UivgA735OBkU2n=4RcMXqyX!h*Y zISnIwd!6p3d$F;8k|{uhCX_y2r7-v)7~veT52Yew+Zsk59dEPU16fV=(ucM%b|sDw%Ms17W1Dynrc0K=PtJ9=*3i)P7&JDL!x;od-q`z%ygQp2`e z0@YRYD5Vi0;Efg_I>L*S0gLE)86ZAw5djMnAO|@i?{}nL`-tH=DqNm`*o|Q6RM3~e z;BvP<4?|Zd7kAxlJhMK}OMpJ=D*U~0^1Rfy_#y_gX7O(2x78imgfHyX4ls)~6Ui5s zxtS6;M!V^+2z^;X)iv1^(wDh&64kl=*GibE;p$=K&H@?Q+1GLkFtaIrU z9)XL?I_XWrkh2INbyRxOMf5%{v0dREPwzcUCfyH(26&iSsXac;f`CN~c$KhA;nGHu z?q9DG9blXRm3U8a+K9A*w4Ah4(!6PX)B2>@?EkPmV7uQo&vu{fUfVskxwbjBI$OvV zwB2c|wbj^W+h*8qwfSwg*rwU0+OD@vwq0wRXuHBT&NkLI#^$pPu;toP^c0)xixgYw z&JbDl(E5A;$J%ry!NxzNX;(!L?{^-Xv{M7@7 zzgF{0cP4&5GwdADaWQ^{_-UjGzdHP8(F+63mVdzY#uN0W(7OPx*ne7HJdSLq_r&#ZC%5c}-*^fH%t&u>AZz0RxOtObdP`4w=fc~PN!Kg|G=}ag zAz-zK*!fRCLgg1Yq2+4E3`Y!5{e|vx1Zpm!(p&Ck2ww|C>MiR4em(|6>K>P~58{q}y!*sVulq2wU%QN)8tRQEM z?C>s`wj;&XvK*n!PfqsOjCqJ^SxfIz^w!b4nck=ArA=GQc6t}kdjq}S(%V5V?u-Nh zDbqc5?YCaua){xtO!e4e<7c>9(s7+o^Q-h-jGCU_D|pBeIIpEQLtkU)Ie_U)-y-@> z#RCF?%$745(8_?`EqjRW3A)o;hA_MX?l<}(G~)1z!9@7iuy0Ji4HxFM?s@6g%@;<8 z+ncZVLj_#(HRhm&xJG3i{yHie((1bog8^GZu^q3b)Q_?U*QE@z1@x;ENh5#`8Y%ii zSoNiPycT^}#P4-VM`M4d*$=c(g14E`8l!;9i* zj_IHykuGSYqEu@gy=-CM=&WjB7nFt??IuKmJu`}89rx&vFTB4eJ= zP#6CO#0+K1)N((#yhTf6zwuI>_qH8llr_Zt}E&K3tc62 z-AdOex@zglr>l{!v+4Q=UH#xnljJv2f(uuL41yc#qhZ8A9385Rj2Ph4st|*@YeuQQ zU>o`$yzu&90!ZVDl(Bk)#JG&vh~a&;mfo|8_F9j`#2MiLy}aIrVvh91@(y;Q<*b8cF=I12;nLhn)GVy;e~ zP#G>h7vF*5;$a9qy1uvozT9weAyM$&$YN~FBj&7d@nqai*>znpOhd3SSFABti8?b} zJVixKq1-?D;7XKxHgca<+aX3{Q5023D)eTBi*qpAWbmw>m9?|a?UNQrt6W!nuFX>! zDLyy1wdN~Kb$}*1#_J0g4}y~3($g$ht(D>R;bIsMki4nk;z`P-g^R0|t13LF29V}L zZlEesT#Zemg2C%&rGn5hEBtg>qa$RemCRlll3QT7Ogrik9WI_J+WSglCX^ONsW;;T zx(ZPS<9fJ3#~^uf4J+njr;x15!JA_DqC9vud7N$fQI+{)Y|{r<=KE}cCF_c3qO-xn zxih-K$wj8vla=`sZPVSA`B&Hi_ahMNv$j~{t-n;}Uu*M!61x*`3FMEp`Pay*K&18F zT`4yHF8?3Dr_K0>&9CK8{#x!o!ezzr``>*7?6nLA(6_h~#`*V=2Zz1G_26YVGF(_v?X7%RKKtbA%k z{KNT9b9{ct7af7HKVXSNqqo7zJk>?1tu87DjxgoZ>>E*$E!A4opu`Q+ozmed!3;gn_yY-zf{CaxUplrF6P%E;%i zl3}HDDWIiujkM$I=3ja_RUIX&EK{O(l$FOnoX&}kcifvS=TQy>#n(*-(J0OE3A@8H zIxmgFUU!PLr`|*vd6>aDiykJKR155ufbys(iAN2)6|ie=vrp7X|A{bn6~+1`?z{~T zcMtT9H)=`D$2H-Ncghj%X{cR%(IsoA)L+~uxboV*_2q}yySkh^MS_*HM-{tyPj>vB z9`U!2b#7Bkr%r@SWOK*8IeQWRa6CofHE)4Jd(F}d6tQ#_-(S}y?sPfW!I|8KF@gAA z>V1t|(9WdD^|U+gnu%uEjL{9(CV(RS@fy==B|A0oh|;Y{+$^5Li95t%d8A44>P);s zPYdJC14nC-((rQriu4yMPu!vC<%wGry)1E$qE8A(J|aH1;kR=&fMH?80a=I~8zY(H z3@k78>-|WFBNGMAGT?ku4mL>Lk z4riG32PJPbg%XngSCk`%TnDXuLu;TZ;GW<^$%=;%s=2~G{^3ApLu4A5tJN~P{~F&p z>wU?m^NBLw=1%VI)t;JD4L-@*RPpY_)X;2(Fa<1knu>BU_(ldtIamZsy&u5*k@0u3 z@M^b0{%j7q#Z-&dr!fzcl$_VC08X)=6LA_>^2i?)W8VeJXvE?e%|bEIUpM23 zS~zkEh}M9QHQeMI1D@Q;fN%3Ck3@#EhP)JgtA17}qKocd*}X0hJ+ch(%qWL)WK!hk z%GGP<8yTfmO5QV+T%;oMDv;E>CX<&ZPe*!bOPb6r-N!P-QMG>*>)=#{M`0Pt^XYsG zF`JtH7!U2tFJPFyQ#dhYTzTZ^`6M-$q&)k~O(ON5S6|<&$sy3xJMn!vF}G>4yqwQ$Pb?ZYHL?budxhaACwZ0Zc>hNI zQu1$}@T@5VTp!ML)>o-^t|n7PlCO!x@s>n5^QJ!7sd3B zB)$jk?s3X~z?-98c-~bl`SqjvXM0Nm&252rTaIpzW76#kMPzzgx@r8Jgu-s4VmIe; zemRi3CoyJRIPx#$Xn}G>n)Rdn+1@fm>Pe)x7hq}=3lfObcLVNc2<$G$ig=rrF>>X8 zh`=uzY4m?*SEOz}l)ztE9W03)0*YH=xu$gY+D0+bG=q7YY!+=B7R>8pFSIfTv&DIX zUBB*G)Y|@L?2!#H)5-c&Z}K`=!&F|TD?ikeL9pRZgu?y|wu1TF%wg<2Q;_fl+Dm8xq8G9Bb^K9UFb8x{T>An$_g`Y!h{E3LIkYYC;ZA`156`EN6wvP&T_qz62 z?y6HBgUZ(APbK0_(Vg_`h8@_)4hbIrV>VTP1w;23oGng!mtR!LJI4zu^H@SE z+%Yexy2-2EdecdbNC z6*)l&K}uAd&qr;JS`)7mRxfVwV!DsoF#*%ujZ8X;rYh_B0!ubY*OBL`~x$*Q-^ zj>ZdZ1sCmZc8^acoypbBa9o%i0#Va64b}SzgC@~z4WAN;i2465Yt8Z{#tlaF`G`vO z)p2|a`4$$h;bFk}V3oVWIug$z@E3}jjQmlbcg*FKyw&O0=PvF0Hyc=ik)j+9q`M#D zOCNt;kv+#}pT%SZKPOx_D|8h3e`SP`5syBuJrKD+iCjsV+}+@gd_AtOo$0A1`f+nAx z68~_VsYXV@c!`zR4)iyW`1Yb+(b9dP%Y~%3J`kHyHf+4M>XK zj{*+2ipMt|QA>pMO!Ii+2x(xx!{_MX)9+yd8!%F3T+%s<+Yij>D>j-!8umqxo%&RP zqDI-&w~%uUTy&Vs+Vw#F#;UiocP+d8a!)AZE^7(+Rt8PdQ6^oOmq{)p&xq-rDO1Uv zA|EJ+=dbUY!=d=UBZoI#@qe1Tq$VcGo!%|!$ldqI-KgNAQ`Ny5$WYX=!>9PVahHEH zC#heNjdw|SMCxzG!XnOkQ{_+Rz{ZOm+FG=(OI|R$`R*LTXj1#5rRibw1XZ3DchtP2 z8%ge=f=!FKKTpM$>@Q+C98UE;%l1e0?8&s&QK9TWTKO}q^0`9m7u1z-IioHR8s0tD zn>Ulx7pV-i26zbwU2~PN-Pg*c5>-+vmcV5Qqe2Ih#voq&<*eOo=;z52#v7BFg13Ld zZtLb2cTJ?Z?j4%&RGm3gZEiGl77xh1*M5_3&)PZLdE!w>$J>q%)~e5roM&|BI6uy+ z;i2xaiPkDTl27=w+NR^eO@VuAI;odbJx^9rRqyf4?dI9e?Mg>| zgB23!!q9YHTKX$NvvCik)2FrCr|3%g5bAL37Xg0yV6@v2YvQl#YM8^Z$l)3i(Yd^E z0R?kLiAp*5A(6~9V;4gxmk=oAs&TMbS@XwTx095;E?Xw!S?m*BGH=cw)1 zV?g~9IjVH~RS4f{o8)|gFV8iLK1>4Z5xM4<=qRk70xLOFI&pCmtf&+kCTzV}qV82k zNy~5EzobobeT1o`IjOKYTlmmk&q}E?)wNO~8nq&zLFB+X>d$ofDM^=~+WSCEtIJ+p zjmiRE$zkjQ|1-)kOT7(!u*%3_Y?X3jY*z(G?+{Vh;?n%mT(7|Fbgy7rlIoyy2tBLg z-tA~OKH^I*LG(orEsI=mBXi6ncH*7t_W6NlinEWauV zK}K5$xMtGpTaEu{i)W30Ec|!|%z3FU2K)_9)Gfjm8IKrFUKwsUvFRBDj{eCSZ|XLT zf_8+*fPv<#3D38W%9lAQ8u3jSu-+N>M|*m*jrDLgCl}FT6K|*c7L>VPdm*y!Em@bj z516#_Q`DcOoaBuG?`q%7i$ohLx%|UvaZ-dpuk0MG{W){{ZwJav z2PF^V>Ez(b8~v$gry|5zr04ofLV3x3E52%{y$_Tp!Xf8HJBhLI1T0C5wXSwoihbLc zG#9eZcC8#{Q>_*#AVpcnx@Z99#cuf%t(40}u|KYqitlOYTS-#jAi9l#rw}Eo@zi&7n zC;Pr4eY(eo@tk$Z184^-XmxEs3b>#h|yQb+6r=QNQ{ z^tfO265a0?J(9U!sl?A|k9B7g`R3H0;y-AQexCYVeTL4}kH^?R!6HCmC zvCQN7c)FJ*Fghsg0KN;q!J3<>3Ehi_2k);8^LI7BpO*0#^KKoOqw|;rEBl6>eegTq z^6PwH_tiBs#I&p?fBOTLA3F)|HRtc01@|^{5X-wi?nh+#89pUND)Wg}Kt97H42wCB zPt7iiZLns;wm8kOy-YB%y|Qmndl}4K(}m@_g`w-i{8c(BkLkUZ>D&y{$hRf86W1G@ zSG#h3DqM40@2t>RBiH4<;NyJDZN3$$?0|#A@FrG^wy)XIeU7hwnemYoF`To`giMUUS~+Y+5%rb}a_H zxowRey_up(idXQP&F{xXk2oT5Zc7NBD~&Eq&taCwKA~4j0rU7p51@c%!1ni4}vWgE-+o!F!P@FDviqBx7eIqKh=Q z6<``yf^x01v8=f*kFkg;9-~6nI~&VoU!yocCO#WfZ9W}Zj5EwvT`XsxSE{`ikZ2R9R)KfUJ(Wy|AzAe&*LC^M8nAhycUM`bY0Z>_(ldmFxmDevb{-W(U z>x^VnGpW$xq1%Z8J&Xs@DlAMEr(r_}s#A|VU?Khq^LJh$o}Je@Bdpr$Fa^`J1ID#qLvX0abn<`c;CI;iH<;VG zq6>51S#?Ufq&+J1LyxaH9E`~G_#$`?!S{+?Y7$#<&L&h9r$UX`RdE{Qp`KB>y@ub< z4p44~Cx@p?Lltr9%kC%C!Cm<#oet~hEK~rOlBProulQzqzOFT6TFM}(W|Y^~j0WJ< zjB{Z2DkE&ewsGxOGY(7YA?pr#f5WP)SfBh)RxM)?-=0C^RCV5wh08NOjj_~E5DcgE zaxYHhEpN_zLNaX`7Nn9YEGZ;Y4x|v31Djj9R1yxTkyx?5R^-DZc(hO*fmxot7+bg!@V$V& zBD=Cb2;V5Mj|zd7K$$Y`@u44<7j5s-)j`xULY3)7T+v>Q+pGBZ+3xZPmIRY$u?Eo5 z#F+u=|I32@9TNh{XIYB*7D4a)%eM-X$f?XC6(+%LM!#hCgD zzOA8syV-rKG*lU-yQPw^X;;#cz=&qcl72$zkt`;et7%7(4T*qE@X)qx4KqUqCzbp) z15VcadeLz3xg_0w{EaAyr_Grfgts*GJbvCycv_z&p+-TMm~%Be1meoKH1wfhPlwj= zY5rF>SZi?kU#Q;eC+opl^>3J$YoUWevuuy+@R0Zto5qH6_}n3son-*!0;E)3?E|#~ zechd~Mv#Y1Dw9A|+Rh%PUjXeCcCd&59)k>RmTwiKNN02PI%OyMSr2CRqKaVFKmN>W zz_F-QL(6Q`89;VNtn6=;${F)_K}55Dlv)7fXl&DDd#QnNwfU$}Z{D+`BX|sHix1Nm zgwRo@v(>!Mdr%ZB$VYS=!C=%5XQE63CVVIlZ#!dvh(QKckHmKgyhwl{7%N^WvGc&N{nwd99OQy4($)VGcp43Sa zWz06c{V|tevtCMCQe+dSgM8)`b?k&DKkg?B9hciyvgwvN8_4t#t8!4Q!-f%OdT2a% z<|~#z)`#_jBMKV@t9mY*B*(+9K-K%q?$+9~C~u^pd^YdM_BXSi>@O=s6V{Z;P+Qe= zei%8ru_TXR*cXvG`7-9RsSMb?dte~@I_S#DtT~Ye_Og&4C1l6J0V*#HNC8Zm?9pOH z>`YA-{WmuB*V7b>)%b;sB&%)K#C_~+_Kw9)Wn^QI?2~{rq2@}qXHD0*_PCYb^Jol) zh9@2_7x*c~EltE)F~Sg$3Xe!S7tS7(GT0-MJVVj;vBk1kGy4Bd*KM-#&ZSfa+EGfM z7u2eg5+mV4+z6iHSz}6)|0}O})+Etbrf`t49iY28f3#(!Ia%N=3=QsDRHzA$TzLvM zD^ycz?8A*HuXCX>T-XwwE;Kn_p%F{zLetMwoChv6dE`QgWC~553JvKTWlW!7QDS?8 zicHUqMcd8m@rpsfaR%op*)y*?B4tUSXNy;yF`t2^bU>}l6bq^nTQI1>)`9A7_|TS& z>V3wFN}nujl6fPeHGnAC%)QP)QL`yv8UXJ#&Cy#gY`r z#f(JOuw4B>&1Lb#t?3T_$O|h&m*wEhB|XJ5BbT2!8;us3d>R$Hu|YFW(?biw-q@ql zWU`lg3PKZgomPz^Rx#ID#aw9>GxI+wW@GWD`thMt{2L+okT~^wijlmNGik`^b++(n zEKz`7NP>T1dK%h{hPHGrF)UhmB?gkR=guR*srS=M&qZkCLsv>Db|SJaJ;C?i&6Tda zSM`pSlom83>8mrdc(;)x0rN7mcJ>lQ{E!-_@uzjc3OnkNZtopOX*&nzfg7kc5^Y(w1VhkKklA z1gGb>jd5spPnLpZPBsIHmHorP!3M3QH|=kckF zE~vP*I!SJH6p0bdV14ci4btaDx&X%TrdycGbbVNzB$f0UhH%;r4r_|b8>?n>_>vE^ z8CKbzN&0=#62-qORK$md!+dy-7GLpJHpZ}2%l!)XGMcBklV>U<_0@Pt-*PmgFL4#A z4Dd90mvVuh8lNTBdsk>aUN?4_v8rHg5=Oc*w{S%IP0$?((D``(jXzHn65OyNln0%L z%FzB`-7A&eOAz04Zm{MSQsB{TR=)RK5UlO3^!Cr5&5`@c@4h`-WkfRBTVb-NX`fEn zo3dZ_?l{!TUa$W*v!|+-v-{+3bg=fvII1dh={~$HeUHx99-!agOxDT2Bs3j)QRS8D zO;%$-HKE}IdBS(AcJTPs?&$aN3$wK(`>?Khsnip%0wwNL9mk^U1fqC2iD@D4y06^o zedeInk~cu=pkTvdj0IL*BmJ@F3WXotV{l}t^(EO9w|T^nZ+3#=5jdVVQKG~Jz^>Im z7rk3w8fbXhlzF`Zr9#>8v)n{!fAe%QAxj9^-!`yg(ReCP*iW0Ot$6D<-|!{fl?9Mc zW*cXKOGi;P96>V(O8$k}Lz4?L82{bf`{g0Ka~^nj+~&yRpPV!-g{Ozcbo z!I~mPYA5!|U1PTsJKx6k#qvno7we_8gEe2%Re)x|gpNvw>S~Dk2`5$ULDX-`{gY7D zS36@lHOXM@^Z0j<4pl{GP;f`vKIG_h7gF7m2?N+vZ+eiU>8FHsvS4(v`7a9Bk3PxU z@E=AnQpQvok}%(jNHO7dtGycK^Bnk+@7g$=kT6LnP)Py&Y&SiJSIN8P>zuI%^t$&c<}FnSE3PrORu z%~qVdLb@oAh08)d=J>#qRVyy6dpL9~{sx`~_|aseGi3rF@^rnnb1~ z5ij{UMb1vcg4>#JnkBC1_tK0V--zCPsbJ(Jij*5YOcoJPF_q3#O!It^O97?+`JXg- zC*2)3-1$2xad{SMGzzr3q$fnk0aQ7ixZhCaSOWk5QDtn~f3M1U+-=JcBUpPAa?FS| zwyJMuHA;7ycX{$vt&*RN3tcVY^Vr*yP_U=g5CKN1ML3?wVj^Ovr$}sPNoX>mR*mft z*L>g+ne>9mK@_&gQZ$u3ORneT8kjDC8nCcwm0Mn6q)Hw;PPET5vU{1P`1LzH@}^uq zCm+@#Tb>TI3IB?o6w)*JWixcuT4NC#E;)6`U`0FaU@y32HBr(hwOJli^iecz3mZd9 zmF@L-uBpB$r0zgvUIIufHAibnRxTY59{@80vP4lMj|MQww+}HU`AmQi>S#5?zTmCu z^`wy-c3{HDQy}^vK0ntWe1O||J)sP@#`iLT@lOTpa(3#t%~w3bw8_k~R}spca|XTi z)Pne$Kx(JQ+`=QCDFjMM6kTU7o0vw0a?K4vR^F7V)WNXV|Hces`v8XIXvSE7hm&LoC^+Wz$*=I~5JJHAS$D0GrA@LNCuG36W zk)>0o+OEPEZ^`qoR}Cc)ExE#yucG5dWjd*MHc5g~BWVaYpn1SrG_4R%?@3+ED5*Qs z0$xUgOI`;)XTG|yvJ-XOmnkGorNJJLU@@UxBlj!Pa5iO2>S;EX=-eW>L-pcOG*;M2vG^UL7< zL4cO`#L;4YQt}6aT4NmWX<}>$!HZ9`9I^03xURwnf|TO_#Q!P!Q3z-XF?YyVGpae5 z4p!>LNS|&nu|2N~6TGZ~8nlgk;Uu^yG+fL=f{8Q5#T55_@aZ&}%02l+=V}03QbM%D zOG8z1SpJ-sI@bly|FUykuv)$Xa4~$<1&`og(YH=3Pt*sDfJKL@Ks5q)HKeP8jfAGF zf~Rp4dz2a3QC^}{1q(UkXGaCk11;WE+aA1C$Nj2V?@<}np#`TcF);-G{OUaxbq#@Y z=1XgY_ScG!>G^Xby_!GGZ=k+>c9?6*y2w2^$1_qf(Ah|F&qs#W_+3<5yF*Ya3r}&* zdjHD_hLJd5^fDAxHyzQY)OsqLDHk_IHKvH<90D zei!qb!EZLdx%{r>H=o}keg~peLwG&E+xXqV?=F77=l2l5NBFJa*TgU0HXwM*6Sq?} zg=%LMW&0Y>L$zxgFERgf&HqC4|10zVnE796{67zqJ`L8wq59(jX;Zr_R0kDrox*9M5(cgP(X4u5 z$4=#lMiIARbjMzDyc2Vm>lgy}glO`9O==fMICUq>IA?v`7Gn+SWMPSU?hoO@obYxJ#d!^{T@L_XjLK!M_#U(=ugG-{l>hjU@T0P z^Ha!$Bio>yZm`ZGgu3do_#S_(x3f_>9Fd;bG?H;lydGxhmWZ;3a>`$&F})R4=jsb5+N{?Ye(|7@+lRD zMcX?v9Ol^MQ@2)qd06x}RbL((U7FIG|KWsl&u<5#T;}{{jwF}s>>74KLFL`BII<`l zNtUI1TO&)|CX11JtNv;jsbamaR#y)}ZvzlZ&nB)+x(SO8xnRTjrVgtg8L}ijDUK{n zZHrvmp&56YiIS5%3Uu34WCt5gr}@z-3Pk)OCY;YzM+bAvHuxk>a`bSF=8*c4*+a)< z#}2Am#AU19%=+Pdrfq7=uI$H!1i>ZG^wuH$*m1--h!{QKc{_CzMJLZ(I5Lzpl6MN} zquBQ3&vBS?$b6NKLhHGioWwQx4S_@I&)0^JTwOJ_L6_{*X#5;sE%TK@?sR8yH=lE} z{8f7p&;Y=up<)~n2+?-g?#Uwr*K7*bPUZWA-|U~tAg;CKe6e$QBYT);XaA6ajpkJ=8JFZ*kFlsc}`-?;BJMSwRL(>7vyai8xY0#n!NaiJOq*_3W+I$ zR8Lg52+zH=-jMI_i;e_15b{IQE2>C$^&P+WAm;8wkZ~D36cY>0+&E&`#olDan8dy{}y02`5964@vOBIvz zZUaTogmEv{2kvFEo_i!;ZV%zAC5Rx{AHVV?XJdmkx>b}aSC`ejxdT~m;9;VghX{ugLW*$Ba^J=sj78b>##QH>)Ita;iv4v(E=Rm}v@A5BQ#SZ{K@ zyQBmL?j(dx!W{% z&p2{}HFJ#P@R%Ns_i_68V*EuPB`a)jux7Gx^yI>8 z6Hs<@+&=ed#q)S%mO6M+U$_*jNUVU8GbSjKC+I!RJA7%ea_q)s%T<`2GnF@%Z8D*xNOMXFp}04 z=7Bg_$+5)UFgizuYOWJCIx8~-j}6w0!;#cVh_!7~b2JDlb6sc5b)YfVP~GTmN$yfY z=(0NZ7fcuWTNv7~;m>_wt89{CG{^aX=3$eqYKAw^Cy8DaX`RK$K?*1QA%hxwrC1eX zC^2Rb_&MF~B_-+=J#m3w)6g3cS<=22x3o&#=gMD15XD&rNNq zT9kcg>`=&|5FWK@5wO1j+Pxg9$4=Be0P(g9=M9LrofwRBff~LZ!T2Y}!NV|`Tc(P+ zS+mKFpF&`5@aEs*j<;Ps@8o#f>|k7TTJg4-!FWFtXGU=GY4x0@y=8%7ynVBYaVPE( z8jZ|5al~Ri!FYoI5mm-{H~;arp9X6`cercgZZ5|r4b@d6G$Sytz`P+aZ_EgGn^9gi z3u$qkK~k$T;$9*38SxtfT`p*ggA&$11G-c}f_y-Y0JD1_@^?1XE>*H3O-X1sKE0@ogW-Er}@?!nr#h1Or; zjVaklW5Bq3oBt!s|2gJ=g89G1{MVcRUz`8O%>Ogy|2^~nx%uxdJ{ylS|3&8i9P|G} z^MAehzuEl%+5ESf|If{TmZaO5Z~ljy|MSiNO!I%e`FG6!W9I*9^Z%OpKUlhNJkI3&Hroq*H|k4VIJp$nwiMmI%Hqa+zUmgiq_{W^yL2et1s0s(bx5d zBLmQ;`#*%#`@dcjT)DIU!H2%5Imn#d>vCcjvwMHxInxt+e694e-Rp zUbg&>bT75^c)j}C_e~$&Y`Jj9nBYL^xg(R>C|B>V3*@JktJ8NWZ!S1n;(PM09boAm zCAyoSJ7f!Q9YQ5UxxV< zZyNGRuwfIoR?toUdX3pBy1PnwVg8Uw?Xl6`dHpO+o@Y7x7|OK{`J^)ZtXf*{a)B>+uZL@D(EZ7Y zVN=7Avz6Q<`y{j6_}V~e>cvTsGZgk)6PAkV0K;F+6>xTB zOYxfG?Yo<+qR0E!%s%tU#EII6ey)ELx5ZT+vU^=sw3~qclxv%RO=`!;*-oJ1m?2rr zdHSeh7OvJ9R?`knYr~`JzZ#m`o0B>91;yKDCvqng3i)l3Wp91)b0uti$30|c>@{bz zxh1rCjmAfsws^(q7jm8}-b7ogZSm&*gJFS?og}UQy-HjZqZ`Y*y^a`^zqw!xfl-uxYVOFnKm^xSS=A3wIjz)(pb>yag(IhZa zcUP&qGbu1+bL@$N^^UAc{p;b za``W^D?y~*w2QC*FxkzY)NmCyL^SW{>3@Tx1@8IHJG#S5zTah`q(57h#g2b{@ur4a zqoMJ1i8VkY%Sd8jZ$pbc7Rf(|N#tW}KzGQjQh{-QroQ0EMw3_~(%fGp#L08FE-=Ck zRDUEB(QODxp8h0|eoiy8U>hcveDsb>df->;vI0^EUjhm?Y(olgJ{WNpu+~tkwi(U>)=HvW%tPmW zRSBW{ONI?_&~{heU}fWsR{6_!M(5D&9qf$eLcZvY#vTaHamTPt#uyft{2=}Uk!1i% zvbl;@ofLP~Df9pD61hLtKm6uk;Qg>T9azYVug{4iI%1KreDfTMF+*tdbKlXqB6MPw zA(*TCxu^ZYWbHJ_m8HocFn>b?(w(zd>5}Zh;BAnNo}80USH4<_E+ue z6%BC7$S!B|#Z+0ucBzTl>kDeON4uBQ9XT@fS>2I9jBWzD493X~Ij?nGD(Jjae^Sl6 zTrGv{s=hoSR?slfUp1sK<}c;w<8zc7-7rhn_#lP|bx?L%Q!hFj6I|<}(E#hS^NMt? zSH1TmiKdG=`CQH?`RY%;YQOH7_}=X3i4~EzRMej4q$=4= z-@Vcj&?r5>JaU+_`8W#5pBmYw68FCqkuUUpL5<9-+?_MY&txIh{iOOyS@oA>SN$_s zyeYVHpYt+1I{wf|nrp>Dcjt9A3{xTp)sxypn_B7v)$Y1kV^%lRxBjXA09TD;M+W6< z2P*^{vGQ`hf8*PvHo?8L-&c&;7WHemEA%{p4Hn1Q;r=7#I(GR&rX#?KKL}n?d~{A zi3e|eK>>Feu3*4SkL+*FKOj0^u=+b;6(;Y)PMUs3c9~6o9qVM;>&ym@qCh2V%%EXW zpQ-LCHyTS=-phIM+tY@i*{!h1-?Uf++g$axJ%R(tu_YL9J#>n@jXDm~g5cNRNst9@ zUjqbxZ3&*$K~TGAI}xn=&jcHu4vCA7G85m^D>~=^p$A2eK?IiL-;;3BcK0n_48gkD zz@%W}NI;z_<(fEFY#S7(-Tk8%$094veyKD4^BYW3;x?K2x8iMbul3?_{ET20@}zRN zC{AN4%VxugcwnTb$QfVFU*IUi_Ur@(JirnHMSL-tr-5chxpxbtdk2c4S)*ZQhM|{* z^3P99)*~r-UNxS8scAu*OC;y7Zl1Olw)G0uo~PI=Ot2@{Z-2ulc?K0ph8xv5Y>|`E zPjy$#_pIYTnek4{xELA|h&6^WQ`|}$``hfw*{Ny7k7!PDT_)F+b@DGAN&U026saXABI?FPa`C8dd*c&wRpE-a zF>(5capcAh=`br9b8?vp?;aaMmbxe@YLs-tb;g2>lKx6(pi^w%$=N1$U{SBgC2Vs_ zo`|>UB(mwOg`AAqt%#ed>mSK()M=4Zfw^z+j+AK+++Q7Tnu=fz>*wvs?R%h~Ke%c^ zd#_+k7Dmku6Xm&-yZ)?eY-=E^mwC3bYEN&AQ?=)W*x^IZ_s9BH4eb@}?TM)}FtQ}| zZ^TqJwEwq43S)h$7Whw#9aKLjtLm%5ST=9n5{2c&()wOidwRus4!xi~SaX*QO#-jl z!wrun$RWsiIy8f}@?1dhDd$-KC-r^n`Xtq}HUxq-GjI|u^}HFFJ%zy8S9mt}pMPXT zfRI#Bo0<@dy*YH&7f{x;XR!7keK8D~J~0QMdyAnb z)0fbjCIGPX@}c(>K|cQmfIF1fr5WHCoR#YUPA3aZS7m^22q@wv=EEYpFavz1E0BCO z-I4*`+XXmRz+Ys5ae)2}@%A1pHj)>ZdKiQ--)l%h-xc~s-Xn(l=!ais_A9ApI_TTb zDP!-08;<1N+EG>?A%sB$6V9BCCFh)`C}NSLc3B?=u&=XcMLDh?J!r`0VC`*$dBhVH z@;=$UJK!@@3?xKi3qunvxV>xkK3bPWm3ZTuus7X3-YC>U{W$3sxG#N+YS3Api zD3R?xJl4jet^t;B@lwnD*K)f)wXJStkEmge3!Y_a|qWs-ok&*0P;K+_f&vljEt zXPu4WU0KYV8Q}UZzz+pXWq=QL0k#R~|9P5h0wC;23jPh%d&hL=dXgwCxCB@h4$k0S z-i6Rk5jr{p9N7i$;JyrS6F~n49t)TFsGquFa43*LYg&P~rIme87drW( zQybFRk= zcuNNOau?t@0e_nTt_0}cKqW1+uHI9EQ3q?kW>pZmXa}@a+lmbS&0UCTd8BD|26$x` z;6MR4W`N_n0JW*QX=?`f{Vu>k0=}66_U!^3EZ}bDCnFl>zqd0-P>jNd~x+D>pjwIYYqnGr*U-0A~p}IRjkT1sDXLB$ex2hJb}uXmRy!I;v^INX(rgVSJnHhL8TOaCg@y2AavE8v2IPpgrrMj zG&}x5&mpg|(gm*bMaO`OCC`dTD?GWg{$;uxQz9>4fNu&uyRS)I;O$Y}`TYQ4;mB7Y zr!Og)X28IqS**#)1z4&eo@F1 zJvh;`0LO{}bq|Mbz`>lyjeOK|(aFGtxaqKfwMZ_;yTYjnRq?@=x!?=`qWC}bNIlCe3n+d1*@3{ zoUmZ|EO?0ps~HE}V8QZP@U0yIXjC%d4z=YEfckUX)UpbSZzzbb$*C_Y@$DMY7W+aL zMrhs3j=Ot%)0t?B*#?E6WTCsybCHPGC9K|Oi{4+ER!-|?DL9f!!!me2R-0CaOZ zAw}&^WMQ%blKQXpc{p?jpR{i7#BFu+Te&j2xeH$x-P~=#o^I~3;11pV&Vt+ckkGvr zET5IgeVqfOo8J@Ap_}`y&(qB^i!7gw{eT5~%6ia(JCyam7VIhOAq(zM)*md`Q`R3X zxIIhi=0D3~+p12+cg0kd`uRS88tk;dQ{!D0BWhumq>>it9$9hM-$DwD+pWQ3X zbOng0>LB<1nVzanBg9jcfXL_j`aB%^9-p+Tif~(1oi0~KRfF(#QPr6i?5XN33+_(0Bf~FZH&+OkU@{bVe;9`#Mk!UPdbwUc9o7oyvVNq12alitB`J7 z2GBaJ8b_@R$v2S|^6Bet_@O7CzY~IdvN2@=k?&BJto-GVW-WAePgH-(v54`%C_vSd8wKpn{I?J^rgoN)y>r*co-)GjR zZZW<#>npUrFY%!o^?u<}O8_t;pS5Hy=4Ar%s-GjZLh!VDSij74QQ>SSGXzc`hYt?b4<+S73zN@ssDqXu z+kiZ{$s+(n9k)b(5`WV;YA0HYp)P9l`U1AiUxKJtX}pFOHL|0z$ew}fwmzOs{iYBq zwJbg>L$s+Y%uzFRnoUSriviqLi`{WS{=2o9BcyNDVy-12Byyf-eV!Hz@O5Y^WMQ7B z>X#T@knIyY!mYNbArMMF!9Y*qv%8rcqL0wZvi7kikXRa!NS&pDQNZGD<6<8mHRU`l zwE*{DaD!0AK)Wb-W=Sjz{gXf)Hb z;7918CbW(q#|5()hr5h>E9}&MP3TbqC`re;l~7%o{dj<8;c>#y!ee}%^rHjepo8Un z;+6dv2}~s~q@WQP#8(iGPeU$zjrb5+2|lv_G`=U=;Z!u5UW1#}=ziz3EUe`jhID4o zJwyx@0>CJy5m3DKse378Zt_w}clYJ~$J?D1q3HlLH)TH&eU^mg@*x>TBIg(Db64mZ zJ}Yuop7><2ZdvFeg{=r(!lx0Ug=FMf+;BRJkIj#!Lf|=IdHxyU_y$_vJbdu46q>fo zGFCn7U!3?(4;O2e5ZNr)Rj->xl;kOAF(25nggMIX;6--JwMDLF%={!b$n^uJ7Lw24 zTBS{mO$+dnb9L|B80U*M{roijtmNtRw1<2UtoaNN+uGXd%}%*s?YsDAS1&ky3_Fcp z#~p9dqza1ptMS}vJ*)Acm&q_yfif$x`~J7a`%*M z&0aFqvK%zOow!Lph`V~vNOkCIb~E&<-lOh1w-Vq^e$3#zdQZp%?8BYZ--!OkpT+D% zQh(L^Z0w#2&|f5?{`<0RCh_vAkw3|MyYc2GAAFY>do9U(J}1WU%=lIBvor@7x2aKT zjy7&fx)1K;gKZtm{FSNK>OH0}RP(HHTLO>cPR?Y3c7%<1rJOcHm*GrSYJHd*6!DZG zwEleYsXX3cTxs>l%?bq zt8v!n6|3>m-ZGdYjU3!W^~_Zh17;s8)$U6y;F_t{S_8>}TVr`6_ zSzGvC{Ob~Saf6r`+t2w*^LIyECjYOBcSoWA0d1)*UYgARKPX<^h?x8%d6emw(;#E| zU)|#6Xr!jkJ5BoqYl}>X3c#?%`VZC~qmaca1&Idz5Ay5$X^tqp#s;YJhSBU+9n7%I z?a%J-^k^}cO$l*fPooSWB+l!nFM#piDCsTm4y>f^Fp^%C)-tfO zo|ikReUQ2ypEPr!d4z|X*vhX~^q^mRnLk=}(TY$%Fc~$B=kuKdJ5dBr4gYuIsi^|* zdGO5i?sp*5aey!c}o4_|CD5-)6nr0~Nh%mcr|nnadXV+(v4A zHY@E>tbD)6{xjm=I?mR&5&*N&xqMi9KV6&lwRSMb_;t^$_$afh-!s|yA7`yttKW+7 zZ3}x^{oYHmX7&5K5S>ptR=-(WHml!l?i)Wd6W3b(R-NyyeoyRE<_?@rk@_zdtMk#P zmebAZ_eR(0AUHll(5!xMza&lYyO-0M6fp!J#86qEAKXFkdE}a2{mz}@*8gXMvM9Ld zm}1fD_xT41J;Lw#@Yckids%wXnz(|Yv}8Z}c1>KN;fS{;euo#wBFiet zNN1in`S3T-UiX9K1#7gXfO>4^mm?Hb%SU+>S!n}G(Us=itXa&od8_5(j%s5EU>0Sq zuSU}okdiMPG0U*~wwmmKB93YLW?B^a!V$A5`+5dNX@PQ{MX?MW&%BWPghh!Al}DTY z)$o>pEVCjKtL5)#@10i54^`|HCfL)%w--&bS{|9HTCLntP5uwjBQ=DiK6G{_>pF95 zR@3h?g=mudlZ!lS`w!)Zg>kK>FEv83i{h-Ne?J}jyNccKXkRjlQQ{3_vcm3X)4YVo zm<3l53eZhvIbC`VyDwQJQ~V35RQJcycq8oop%d0#5=$Nes$FzHcZ(5nvNs_e%Ij-= zo}L1ha3^i|HnFtw*h#-_n~e!%a$+?4PXZHXrdQpmV^pc9SKY4y*HERdJQ|XA)!mzN z{Ffo8MR$`1D0>MBN6ezTcf_zcgJX;coL3Fbb=Xh(9k9DSoCB4X+7B>KQs~!NvacAK z#iknZ11#(el-PBm_O8%2T<(QnB`yt7ztLlWR&dEr`KKK9ClWVhHM;@o_>l7awE6gA zLuV%{PM;m$8xGcTlGDfK`~sia-PetQn4IO2U&;Lc@KRcw3Uo)&1VC4ADtPhKyd%)F znQp$^u$c=nt)!~$(08)3VOLZygH*aD&tu+KE2kZo7H&>He&6{Ic=f6fwy9KQ2Y8!MmL1r-TJ`Q3g|BP(SpwV3R(oo|2{=978iTsY@ z*N5K`v20(EUpIdHqS^LHY=L>ZHJ`nmY_3fV?r0X->sj>!-j(Aos)LUkUQw?s!JgFk z{2ZFLBc!T>_)D-weP^P==k~r*3W>f5@^1}tYIR})9jeVLmwlc$;%VN{626Q2T`LYH>Cd(b4wKM#e*`m&`I#&XQalkKs& z{$1$^#Ns%|*NWwCD_4wshM}AqFfnoy>@4^18uEH&4$-s?S0TBl5_&GL#^02yT?3pG zh0j#K^XrdnvFlR=}7kvf0J~Ol{Zvi>uKVgF2dw)N+fwi zm%MLhp+}>m*GPg(9czb3oN!!!O)l3;1Z%b0v%8f;bDFD4_T|s!D<>SO_=ooSb~jlv zLWm~MR9zp}5h%@{=U+u1Mg7)FoyS{-A|ORz2b0{`ClzU=FZ+e3Fh zeNDE{%NyF75-BEc$zvH%c!8sR;VF@e6{rUnU@xGDqDJa&0$h1@BeSe4r*5R4)eY3? zA;?EwroH@#7O;y-Q?sqE^F)Z9y4H01x-Xk>^vFG8JF5ndh~+el^Cv$bI;18-%4tom z#)p-a^Nea_fyDppCL?}r{w?4*!CDCp?d5UWF|2FJ1OAtHm*i61*>OTowmz@4YVYyE z+KH0l@KC*fc(3SDH9UMf{P^f0m_x$?t}qk8S6UZ1GWCzD8~nXEjXgZ%iw?-{7i!Hm z#=4a%69T?eJ-jGI!_Tdfj-HfN2#MxJUr24~qN+0Yl5pBygSDE0&8B<}=@q-ki^AcZ z8HAc0ED8$#C7eUzIX6w_s=~^kNwjW@r^XV_wg!CBiSZU*^K9<8X=+@&E&KYhT+#77 zI;HH1P+6j2lGW*RNU$kK%-@qhsQ?QSdF58Mk4U;{<{wJ->7?m%Gnzg(qv><4rn8f} z#V`>w2~9~1o*H>llK3Hk=Frj`#hd)E57|}Ot9bj!`ht=H+fuvgHnO2Qv8Mg{Y~MvU zWc#kzBy2%kLrQLBbe?K+8l}KXQ}o zoMX@RPaC*Ck8rw}qTtbU2Yq4Ng4*Nl4g|HSy3tnT%Ofe-*X0|GeNnwCzGH9nvWJq) zh*}SJh~$u$D~~%jF_>vs|DM#Y$QH#tfw)Fxan5iR@F0##_X!vdn-~=*abbXYN3|-| zdoF(9gNuW;#{#UrDF^oh_G*dhn{sgj(cTe5i!RZ4#kDPO_58ra59|g0AsVfopM#s2 z)CzcVaRb?k$Hb%)u9y%A^WmNL91W|R0DHMhOdS~KV8?|;pv(};reMvZfQPYL4{z|6 z+bynm_iwB(psL%K9ShMr6I~w{Ff6fstZ}){dgXO4p|lePvDsCFd&GLhTT7U3mC_Q| zC z#MtAh$BW)QQRlEs8R|7XvV^*puAklga2S66GF&aO8GTE;Jd) zOWc&#{Bch8`%v~xjqDYqyMg4y+fR%Z#M}Ev4~e%Ah#nkoKb3up?WeID4f^(Q+MDZ) z5T1ICL$0Pk%<&uZ#)`E9<91`$o+dcX#Dkq{{sKFf4X5pVyms+xmg8|G=LL#s4T?NF zzuqL0%LQSIPsU9AiY#~O3}Z4vMR>JI*vfv`#4KL(c(2ycXyl_O3)w}gc)^C-VFE)F zy1%vld)zlstA(6 z$k~Zf+UK6A%S#j?-xB<`LZZ|#*u84P?OsXIze?u?W z)>bi#O}0&0yNt~j4f*};-eS(5YHzVrT*_;>)-~GfE!KASs;}5vd;~aEUk!^Lf?)}9 z=rPfpA)6}$V@gt=dA8M5>KQH8 zKMu;_$Xn!|B&Ei3S+Toj9Lip2&Kw<2`ob!Ud?A@%(kz+h4C5YM0vUQ@(1=MKuF^p+ zuVQtdeU5&C0x*=NZ1ZuNG1vZJxi_4PkA*$lnky`Zzy|+SKe}>aYiXdZwKTV9YiaMS z*3yIhjUg1*S{l?k@IbKn`1o-4)2qC>2~@${r|!`@16qwG;>Zpx;w>fq7K}rz(kK@3 zp+2eX)i9@xTO*CvtFMDKexg0In;S{F5d^EhfMu1$Xbrlj6N?;*Mxrt&-qyeJ7`7BB z^uag$Tsia9Y(CGDQ*okT>O~QT(*-mM{ zx|aIVAnmKf$h{d)8$r%?%8p5@o6}fD-jf?~J#)t?S-#|6T&vXnn+s4kmD1%Noy*ms zTOf(-O&;mFAMU(O*_Y1B84=&*S)NQQ;YD(%@$Sod2h z*YV~OtN{%v99vLWvVn{?EHQh>y__`NvEGa^cd_6`rv1_5R_`VxZiakavbz}!lik%1 zdI`@en*1DL5DWe^|f6xu^+6__5@aX)yb{r(qXgiF`Q&L@i#rxeKuo`074l|$dJv^ ze(@2SVe?aOG4SCgkjrI;k!MUb3q8hNI>`K#uJ9mNiskGbz-h@&$r3K@XRk1lPUkdO zqsFr8;N0qyzHIlkJ8#&x%@W5nzmwPVW#^ds%d%0F7_0i{&iFgQy34Yg-zn&M*zCk% zMZ2rs37*(amvOdpnC7aw(-bVqX4&T&p}+ree22eoQFil=em%+0Wr3pYRqt2Lb}kEW zOdCFXP7E|E_nsY~XH^=Wft>4a;SjC02G2I?$A_{Vi?qABFxsP?g>NF%|0H+!dX7+B zOdGL#eU9yuK*d-(uPA`x>>%&sarn16dr3#)Y4v~UX0r-gSL#<~_bx)vBBPIDn$><& znx`cuz8A%LPfYpW>R`(d-%CBF#0I?Kf63Vbu0r=OGB9L{_{;t+SHYF{e@WWimn%T;?YuERQ@cTl=!fG%snh zi4~DZA&HnuUyk6)>#}s+L!9`4V708FcvIcUbv z?h5!gBlA;-vdnblS~Gt#*cTg!?;3nnLwwPTJI$7CbpK43kol!8APg0Hb834h_)fRM z!k^W&RZoyk0g1;}JI^W2u_*7PR$*UCzhjDq-M`02&iW0qnEjM(h%AR?b`x-!3Di@F zisl}6e!7o7*kV6*3v)EKkDk?~kN!h03{xN7MGui>l!(YoBuQsPbye8?;{A7ch%2h|NqxWW_6SCM`Yq5nTMwN!b-ia9EKD%h4?jV)_jWXk@ zHbOd~mxb0JBj@&j`fx60*p@)LldLm9|dbJ2WfQbr8yx)Je?rt zQ=Yx1V70lgE->A=Xm2-#V&a33kJgPzHAi&Rq+wJjprbDzL^QK*uqWSWu!FVx2%+T^ zTIkr}$438}_Uss57+pPlMzm=a%Jwzg^^T#FQ-C|8|_hNHhQmjYa(_^>Kt2LN-%`9npja1Ut1K$1n$Da%^WxH;KRk)@@;YbEJDTC z6~^}<#y`%mVwV6XpeB)Bh)0vF*Azl{uSeN0&nq@J}C z#m>K~KYSER2v>i!7}lOuQ(`wd6}{_JlsgsIITZ_>ibYQ4)pb|=vgoh(sjwAot-HG~ zC9LlDt%#-Q*&Z&vVV5r0GO6t-fvZYqtvNYA$r8CI7j$dq!GW^K=ifgyWTq%&S0s8FEjAKvm^0 zagCDe8F7Z^Y~vAwcup}mTX7ZQGFx|>vhK#lYlYz6Mc)C%_t-G{Itic?eDqfLrVMa_ zfFw=za}S-N#)F^`ZW!G+9627Bd;OylZEnNpUxp*Y2}o32=l;lq<(Mif+7ZVj8;(pC z)`SJ_2piMfhCHnUYxLG|ZJP7 zmzCGm?!;xet$LvlhG*9q#3>ARY}xufEb20?snq3>3y_oh=AXHHBK_=v?mV@K{gE8= z_mZx+qvc}|kyY{TRUI;+*ZAf4q0|u)p5rI6OXtivvqLUFk6F3=4eq%6Z7c6;)!+UK z9{+PXxq*CI0?5m$xYiW=F$dG}*~3+If6o zcgI)$a=>5r$8IWw9NjKc1-Rqjxf90iDmx9e8lFPcqU0Qauz_@?tvDX-MCEnv$KRv2 zXpbFcs)+_u2R76WRz1>KLN+TG_+p1xSjE4nU&f+H%jx=J*j_@g_bQvl@W- zB$%3MQrgUWQQFB5W7pn;F9F)EwAQXAJRErflyqSpLWt2CTggh z>1Q_hN`h6~zNQf@+8%H1R(EM%+of1!5ylyWSc$0)?XI%y@KaFtxxYEx6v*Yh{NJ&I zlBETZ{V&?ec(En==~z=yUurmPSd`P0PFx5(H@q(TEt!sGbT6eo|sP4Ub^%x z_b=(t${3sC|HIk4z(-Y_{o{LfPm)d8unQy*5yGMyB-~68YXU)YA>k&lNenjyZ@8{# z6~j3Jl*`6VaL*o=T5DTdZL6ZKwf5CoY6DbFvM~V^4WJS(Y82F24rl}nkwo(UK6B3I zg7y8qpFf&Cb9v^OXYS8D^UO1k={Z*FIToPe(2#~+X_3_^$@`iAr;@yaQb$YjI~{Mj zjyESnle}I%QKS$3Uyw@6h4<)uun1JWmhe;ReOxPWN>PM#^Yk^6yP|6(>EZd_FxJRe z4nu2X7e=0c!~N(De?fid{UQKYQ{hJZ>WgjlpLrC(tDgt|Q1cv$<&NU2eu{!#)`Rr* zxcYGldL2Q*vd7(cRkfOwk!xxZpl;acCfhSr2+%Woh@#%6nXd z9n`mh@?J`ily{I9!(9bDv{mPs2Sa?lB%3uw6vlJ^IdaD-)(sTEb1y^gASVj}dhU}b zisx=jlLE5G9c3a_U*Xv97iqvbBL@Jw3nG8h&NYa|XelY=9W*hc-QO4+kOxN?h9GAV z^fngV>?zDk7;dj6{I5N6JzArPYufki%8Me`plw1M2KP>Ebi#ZmfQcotSCj1*WJi^B zE1VHGetK9U5@bc2s4AB{REJgc-Wg}8mi9yJ{~qeR6KE_Ehco3Vw8O9eg2}>o%E<~& z)zyc^IEFZA(*P`5N!t(t<^kMd*g5g#Xh&1OIe=^|Qjz&KM)sXx%G$7T*BU z(EQW@Pjnv*{DFo>Xv2X^a-dPb$89RHq&`C5zfyX*oF>G%y#)Y^R?1cbd3RvL0euzf zi`-E$FWTJYgxf{9`&7+U{kbDANB>(wZ`97!2Kqe#-uKnQ61E*oPUIa3lWSf^M~y5( zhtyrS^|-_wMj3c18z3E56B7v*@hpzjLUk;{b-MC8(g|k zsJC%j2W%r$8aIM?zWnY)WM*yX1=c23K7l4{Gj^DzO*%stXqf!qEGiMobm_d)-b3d_-Fbr#d{SD$9g=V3NponkO z;fZVP3r`FqjL^1PgCXJ=k)UqchC8I2RC)PAu%+(eMc&tlH>};(+kcZtve}LDsmqp^ zs`4ERix(NA zC$mMK0+6=~5$pzp^x<=$7t))4Gf)2(rPs5KETMEiP`Wru*ZY_kUcTr}H=n1QL_Ct7 zZ)7wg`?uOvX_vIxkD1z?EB_x%EjU{6wY-DVkw}!I&4Bx-I9fL82F^NFy@w{JsZM8g z-QEGuqEM5c>un8aO-keYKp1se4iL9@8K9$+N;X3L4M~~p{tXpa1PU=f{g^rZ_w{7DeWTM{)E}`nbLQIlTjO} zN~d^Zi3nAb$L$T_sDvH+Q}0l*5y!9}cR>3C8bwUz)E`8mDD{*U^%40alJqpNezA{B za*iY3?aieW`X(|mptn}+Rres7fqMss%y^*(lKD7pTVw`+ybmIRO-4w+L48$k`gJ`0 zK1y#4YBQyq09KS;_+xMH75Qz!Gd=m{@pKyjX7t&}UPP9bEQFYO7P=G+j6dy~L5n(0 z0r6oEMNm{&lT9Qwc!F5A9Oio$73*8z87>=toETEdTM!31@?v~ePKE@wjV;q>jGJ86 zd_F7GgMs1`JlWyHggwJGici-wT+Tj|^$gc&viXg9-v0V}*A;-eQaEJ5x%$DS@g?9s z++A-L-tI$>0BVQ~P;(Peb1kRl!d-m+y2+KG;Ow^UxD|)B0|Yun*Ei&x#G{}rI&r-Z z_bwatz$aWJtAxPT3Uurf>`5|feg6^3=d@Rk2OPwH+qvHWg47H91-9xBJ~WJTKiVX7Gx|4441h9D2VU-9e?@-C-4X|ioG(e;NbP4mVkqcn! zya#EF{RR=Zv3xqp?ef=L*Mhe|u_z0-H9YsBkEe4)cK4)fp>&^7x*4vGREMj0qQOM7k?1-j5xwS%%pCSD$Ki^c!jC>b z9Qi$}z~H3${4kQH(l(aHQT3S{*eO6_e-`ONS`w01o}v|#&k;WAzWU3RFlNQ)2>CuQ z52dphdQ}y}5Mp*3hEL#QObWALeVdPF(Ul8XD)e_c25-pqK1pqpM}+l0k1LG;QI8?a z?X98m8I`$6Co1}+FXu}!mIom_%APKDh`zm6oEhO6#>*gBf;}RH1J|#SH_c@ey{9O< z1JG9NQxDSL0Wz9rm-G^{)7NzE7hX4f>;(YxZU81(tHv#&)wm&HUOfi*h0VG_3 zw{>F6$5u?hYdjSbr<06Oo={UuQEOsr%IRCPiT`flzrW+Zf9AjcpEj=KQ~im7xyASRCbR&0tm;&y}NSr?Iu)X zQs#m4XLp$%{gtIe+0ES)frlOt?1qW*-8(4m{I_mzDd;O&gqH=9Cb7RiNi?Tq9tBcI z_Tde~;2K`aA3|A_m(RBHXq)yaS4>{SHgZ2bwSr|uXvq~CBh)jaYWx#0sFkK&_@yb4 zOrX%|3{FKyPz3Zp=>vsj`g}rXWCViM%!*G5o?^!7E?n%lkNrRr;p+cjj)hJF0okiJ z!-L!4J^B{<$qPCXYk!lUyKJTRlXhz0Q*q7v;nDcuG#yDvxnxvW;HO9hfej8x{O_|cCf90Q15$Fmc);kfXlE5)Sg1n4RT zZ;T=uDjSHl$n9+)_9aRs=&5kA?1Z<00@|M7jg(nybR2w$>c}oEAa9_HnX=jXTR;Q_ zvJ5AXwgZHSHfS#s+T06&)Su0~Ki_nxKI@M%5C~sqH`+tD0d;y?_S+lZP~O&d;O`ml zMIz-ckiuU>!bqjg6uAz7-We|=Y7Ry1L1%)lfDKXjP@6>P^}%Sp*{jy{p?Nv7BoMZq zDuQUHDn%fDbeb<67COz(+@aGv8cHgJ05rd658)*Ry#2$e-UW*PjlVy7Hxg;D{0gKU zCDNcW0{F4b1GIz?Ud%ptTrVK*Ex=#O3s}tF z@F!V6f;wippl8>7mj78nIAW~+MQh!#v?1x7iGSs9}A zvKJWTEM|GVVMaNN*~H#3qnyR;G97K?kI?4q?Of0_!`7r*mU~8TmOlQC>4|;*OTEO= zrog=Q-^M>o`snkGF(a~%yTz5X(yW3dK&Inw zVZ^}@#yG+-SoY529V&Re7KO9{SMhxb;JX9heqs2Usyh!G3O;4@+5 zo3}3ZZ~zqT-U*9a;Ll0<0yv*=y^2807~AoIq~>n_bc!*wqOdSgblukp3%w?+9o`n? zw2NHq!(UL@ZORdzC;OzP3lhZy=&Ph(&evIvuhw4u0w}7BBour9PDK8Rr?P6V!q$(e zFQELWo&kqir$a>`<)l7FsBpIM0DN!Ufl~zU@}t-NKZvhg6pJEk$M2iT|A4XxG+hz&(+ZLLx#>s( zHP*X=@tj+#{wr`q^Zph*24+dBAeMruoVP_~!++q91R;1p+7~JAgoD$>-47?B6L>#H zNy^xbyeKwa$TD_4_gTGE$}*Or`yx(MyLUJU(QEwU5U-b=Fon}Y+GVfnx-~Naiq!-b zbBTa6*!1XxN=~#QuL60fQ5@*G0A(55%hB0((ajV@`H&E`)?!DwU`!4^qj(4mBXDKH z_F>o-G$D$p$ZlF~Rywdg`>A=s51b4NEHVylJKYI2LX#}! z6=?_c(#q%P4zW-$Z6rml|8ghwlbW$THTXIjV<*Z&<$V&kSvvX%XW^M|3$I*QFQJH4 zGG-7ZnXnik56W|+HEFMY9Q6zGh)$!fvRhV9Ho8WYgxC;uc%!lwdcOe$ES2YAi_kl1 znMWf<)VOOYB1X@;6d0*4-QK@Y=r<}K%D_tL)H>cCVGp=bGPn^{E;{f#;zKP z{$+vtvA?~BJInvHnBK?VHTdhmpFYn|P#Sr!;x~vM#f@V9Q6e-x`qCQsR|?xRynbNk zTcW@U*8pbHOR$r+o|x6+p@zBAeNm#m4up;buMDNE{kYt*?1+Sy7rU46H%R+bq9)Fy`_xH%^hiFOJ@c!9csb^!; zehX@M_fUII=`E*8r#1l-O)s?vb$}?f$6n)gk(dJ;33HJ9N{e?f!DHJ3`B#6~S9REd zksEjqy2J^;z=qdowi|AS+=9F@<}1H(}EuRZ{E06?HU zG8vS4J=93Q;n83nuvdqWu$;mkF_Pf6>I~NyRt8&m{Oalq*EqaZND#Mi2pc$pu_fMD zC}ciDXa>NlZ;cEDdcE`GGWg0A8mas;M&=%pF|@IlX7SD}fp=WdIxdGKB<<5IhoyiyaiQHkyuV0_^Ao3cNEKh)ltbrlHtuL7%W8$dtmSMZ+jD z42^7}z%kK4Bp&MazC>Yz5r(f`cS-1pdfg>q;=mfIUp<@;6)I>~kt|o_=V0!gn7&CE zwhXHsSU!0HN@6R~>8{;u)EaUD+22tvFY96GVpl@92u4z#(gR4hfF_yeUqKoO)uwV% zuz@{9sVV@}uWe>l_q5H@XfFPSB;GbEuelPS--%M#VOs3ECos0g9D`k#i-Z{O$ z1Q-mfBmrtrAE-3yElX+ievUv^S53tiy-t*k zZ8tp2$@3S(^E7#WZ+MQ7CuDe1FtNNvM+xj(6lpOsle&CbD8<=?w;3!{yFQK%DB z{Wk>ix<~PoiZi>t3xNU*^H`6HXUN$Uj>g7E7+U;RL^3B2vo7*_$Tt{1r3C}W-)eDt zA3)GfK3QF;;;k6iudsuy)nO@9Vb~!eI-h;2NBJ)d+}LUyV97(hzq=J=H}EKtKdcLN z{(Yt1hbfc4>nXG&-XZJY{i6=$^;6t04G#(BSe4-!fVGpYF+2;%v(oVViag5<&mnm9 z`kJeU{8WAYYlcx@*s=7hugs&o#&~UcP;V2Mz%li&veSNE8Ag?Ts{6c`BR4Fg&D<;Y z)YJ{VHT5qY67MFyGS2``@}`*KnDhrM_#Za*4E`Df=7W zI84_!4o2Vs9ADx6<63!4NDnc#4=s=IO5xiFj-1^Kh5}m$C+dam)`-*E9##Ze7sKs^R8kf$Y^IvfF=O@TnP6! zkl>U|#G*OKw!W_T?$$9=ID7adojZRRVU2h#0bv5)!_m+}s(X`80Mk zoUjK|X-6ZE)T=`p0DY=BsQJ&qmYH{g$S|yDMkMVUD3ROyJkRxUj@bqdk}6HriCtOd zQOr?5Ot=jw2X@>~^K$Wn3@V_CIgb4UDg$&v$fLMXB)cIrxx>YbjI0 zKQ4gjidxxev|$xJr4{W1)FaJ$t0F<5@$?%|Z=s5&deoy;wyZ<*FK)Dc{VH4Rx zRB3ceG9*u{@xDSGGTqnJU4)*ZZPTfizwoWMiP)nQO}m!wQ9itMk1`mjqkEKFKnSZw zfIiP1+e9rafJl@|M_XJKDulCDw{$1bO<0wbOHxFN$x zQCi&IW)$4Jo@4}HIcb`;<b2x7QurtMGo`JnT^ixLI8h$0PA42QIRmb6H$O_^ ze(vJgVYq)1bmS_@L^?4xMfW2s5K4qi}nfRu{M#MG(c$V_y_|%cS%+pMgQwLHL31H`L zWSys1j>1EX!wa>?BGt*VRzsooYe%*@E`W`Q6|%3 zy!2k;KP4(*91mTN1`A3qi|^vnilMJB)dus6;;qbr@Ts^nE}fl=C+SZD@>?XG3dl8Q z(IfeL$^KI=rQV2{eh!^xy`@`pAz&L4D`99snH4iF`YwRi%m8)a5(YgzjA<$59>>pN z0;IA&I|Hx|^a18b>)u2!HPbuH@99ux#j!N(%{5_Ad^H-vTFerKD}an$XBMhw)&Z90&2E<^1umyX5?5O5Nh~#|8egH|#%tLwoo( z*{U42|GoL($*^)*Y4%5)nFkKCOX4m><8a6JU`OA`7wQkTQe-_PtUdU7xLDbb>fFti zf>tyUFKnH1P|dfJ!9h6=R^%VO0A+$&&JD;a^00kDY}q_ln@kg zH8VdaLH-<;+q&g}*=MBK_5zr|5Hs5~3mFf**B1YS(x%*NLm$$syci{Pgysl}H88w8 z*THjD8h6}QZ-FUa7gkX*)`ZKQs15%qt8!=uE+v_iFMoIbdnHy`Ci^ zFxVH)2rL%-4OY4jN;ODn>XbujZc6a6^^?q|z_8$Be)=vFg1#UejWaFIz)Z6WD@Knk z<`H7>u@&4A6ZEa(5OGeWGcYrjn~qcSY>Y&uzD?E)S!|qXb?(H~A)rYB5DXu&Qbg_? z$b%B6Qjo|Gv3El51Skgu32YL88fOl1DqpI3Njp|hkvgMAf(^i(v?cP_4q>r`Y$!Zf z#zdu)wWDh`&P+*AIvQtQhKZKSiI>Z1ARbgcXWdr=(Gg}rDh#@t!|VnOu9BToFh8)b zk#wm(@UifwD96FhC!yhh*}>?IQhih}R2nN`$G>}1MI4_-mxpx=wdDyF4!E$iXtBDL zd-+oga0uw7L)a)BN6v6sl=(?&krj4We4fM(b-qm*8h==s4~0l{-!`@zQ%Gj*a!{cz zhPW*_1Q_BAl*M=f1~Wu(vBUR{nRZp(fyI~+5Y#=#ik63h!H%*9i|Ngc_`!C{idV+* z5IeL9*x!&Z)*EVVn$mt;vNw5M@cBv!2Q9%Xa`MV!bC#|#i%wrxUb)rRwRDZe*Wk=* zm914LB(Wf0gR!eXeV~;Cdj?VFd8OOnQD2Xn@kzh4oXbBC0sHNmKqn7K!LE9i3h z-nC%b#~k2tX|G@;vp317JrC!{7?`$P?hlAA?U%R(wKsT$?_EKkG_HuOM=c@nUqQ3$ zq8?_Bcqy!1c2rI;#wef*;j#$wb5&IRZe#e~9Htq$G0?2+rH!HQc3W5c5*x2MmYxiP z%jGLFYum$SDW(PpOzq)ZDaQA%S+gK>>>bwQfqE^YJuKLNUCUGXYe%<-eUfN%Xl7e( zKX5O}tJV8lNoDSZ>`4qde}hBGbNJUey5#|wHl0+Rwb~5W;XqC%jK!ur8b_w4TvCjq z0LAT~;9PLjM2k-vxQnPFEfE$%a$p%gkv^E3>aDcgP@~iA_o?zZBF}**!n#(A#k`iq z>r*JBN5cVK?tt{N-46f1?7#ex-A@#rtbm!Kxu^d2CZu-Q25GomZ` zNUX>-prR|eQrM-GwHYh9@Q=RB_GEzeS+>nueC38#cfo9@6yH?X0mLS4RIu={TGkaX z2eI&%wbA#OT6QjA1^`v7TG$a?-EkzjDAxXr{Y5^OvDK8I(DgwDnCi%DfDCyD_`m4z z|KM01^M(Wdj1!m$T&`&opGN<$u&Iep;tP%dT@#0Si4>|PKEcDJ9QDB@g#%>3M}Lx?>1mXPtp0nu=hszSOvg!CJY?s6oi0PRLU5jJZYvjrLY68 z@%SxcWZ0w&guH9AqPKyOMWr^wg%7Cd(gTjcg@D%3vUfve@782e7Nwk`6P%WF2taS9 z?Pnnj6*x%!3C<7Vf&84Fl~4%BIi>Ivm5p<(Hyh0HUhoJcP}K*OixW!}9TPy2K|m{9 zz7uxPa3ZwqSg7onPQ&|1>fdmV)6fyEj}9UxI&x@I@wySf?&R4Rxn%KN-c`z)n+i|q zBdyt(T0x)vmBM$ClYher$7<1Ec*3C;o`~UAy-;~|%$AGBQ43q@S}p8UF4Zln^91{h zJKNNGE$TAVEE=(m9pGWdnhIM@_}5g(=tHy>b~P35CXW`^UAWs{*oCt0o>q9w?yukw zU23j~ZGc+HrWL+hz6ixv!Bp8@Xgkzn7bc1E;4;z)BI*$eQA-?rEV5S1n#o9c;R$k> z5nw?yg(0JJ++ouOQsP_@2_tKG|E1KchZ?khoXfivYrw$nrgrOKJK)swSRIRjCYGDE zn8-VraMA2A#m>9T2R*IpL`m2wEMvW`ORF2oPWhrzDRWlAv*FIAK+jY2Rzow!l2vJ2el`hbl%7#t`}|O$jH0g)~3(9X)>mmj0s$FJtPX=M-{5ne;wM>l~O! z(lw-(QWM>nsK6TLX4kE;se-T@YK4z(MU1jrolWecBl}xK3=;Ojve%=)`rO!)A?yG*1vShZew>` z2U3zLPlcBud;jXe>PSB8=OtygRK#o}cgBf88coFc1z3F+TI%|aY7_iEH(;~@*Y<8Ry%tFO&2iFsnbL#CZ58Uqpm|lcw=77t&A3% zKwc~Y2@>}rx*PMXlN$5lrN+F3pEu?WSOv44ra)d?4-?3z$;wmDP-*Iv5B+Oxu=2sn zACV9iye%=ay}iL9kx{a_=tp3wcC&|21llzYgte!24jeahu$K@7jy3_iF=jzWj&E$w zvstBNFl`tb>^blu7*V=UwWtY@7~XS!e@yqqix)@l zPV?cPd=m^ssdGfcEVv|Qs#;)G=U5SQ?IkfzD2}OfY>2tsAErkt`o~L8q}O7`&Dt%G z%rQx4vrfs$zAlq=63a+k#DU;g1Ru*fby=-V;Ow5#s0|1vRPB-C^XCSvxe(WU3&C96 z+(r{@4}Yh$@!d1p7Apy+zSZ0= zXb)o#nNot|jFeJFl2mZy)Uk_=t(X&bD{pa)ARv9CnZ)8alt_~krXF#DAdRFWN91C!eib-? z!6~(RV7cCEma)FkgK^3-lUjgf4AGp17;c+YO@0C;I)7kvbLO5GeR2%nbi%wPV3af4 zbNXhz{uii##NG;c-|p|kFwo88Pwyp5uP*zRWvD``&)^Ew_!(638Wx%Z#!*0K3 zz)r5tBE_}WnI(s2>$9OWbKGv=Rywea$F_?vAAAGDPT=Ar_=GTE+SmlZv^P1WY0BAG zP1|Rn4i4_0BU;}P@dC+HADL}N5kO(PfeS4j+n_dNgTPr9P12z(S+nIaq@0DBS4p~fpkSNPs>Dn-Ks z%j30~N+*a~v~RR${{heby)c^UQS`#vx7>;r(jV_Iv$rXqqEw_sLNwClpg33oTtj{D z`2rR3O-1AMj3()y$@BrSKZ7W$D2sA#EXoFkF}!B_i2NLG6^?? zAb8cs66O}ui-H_iL&IMC^2J(YnXu4?4Vg!2(cYDA&uqd=@wV}h;NwhPyE>TS>l`kpKnP${F5ny& z_b5-Iaq`)N*!^nP_&O7@#2hRNTJr<8@wqdhS?VZ%hjK!9k4fJzd1go|2oHXPOfY$Oun$2-6mKf<(iIxqe!*rG%Jqav-vsJgKmVx|cS$LGmPju=)!Tw2 z#z$L_H0@qA_qL!D+s3ISWq#}epiDD`B z(`mL`9mB>Xz_1w=tnxwzepko5TJAGw>Ch~6SYaGf@HP%B`%&LEDED6Z4X(^>1g#LW+Sq!Wut1`5 zKm5#1?cWGCr-U4&n7i0FeJ>UlK~4%4bb%*i<(M0|B&1fPcr2NytZwhb{0Hc8>Ze)6WcQZUQ$Pu31dK#o$Gtb_IsR3S0FNX&@=`1>Om; zbO@K0gh{6KS#JJZttI}z+SK?xYh&3gP#r#h`211-VJH{DbNEHN0>yo0; zBPd!24KsVMCz>RFk34*?G_)Z5;F@@hpyqVk|N7nBi~Z^YMnaguY^@>G-ughT~12IhR9&3|A2x*qKV;Rg7DBRI}G_B zZsqvq*qqv7q%zKnn%N>OOFK;1G5S04E>bYxw!?%8`^8-OD&L$$hiYy#C92~J)qGJI zm#da1VYi#z21!&idjSd2Tej$6ffRM>Om(HGOa-h>St(Z6$uZMbCdqbyKEy%o)x=t$ zbzAgqpj9l&yQyHoJZHhx1>?tGGuc@p-#_uDdwzbGbM?B_(p^8FO(lW#rSu8RB69&$bug+EtP_%bi}kJ!9YK z=MKUjNc(`G>eAcaszh><(@bAHL%!apWdvHbo7|qQF_dhKI`S4oSB6P^0ih|RMmpv? z&E}zf*7iC3MlbekIqKOl!K7t*rWfSPQC!QoHwY+)XM2c1=JdljfWSZaY`UnbZZlP7+! zWZo`#wr~PHW7I^f%qDG^XUh@K4wq@`VIpPg5znq+CNL7F=V-_W(%!-E*05*HmXV2{ z;vnVPeeipf#QpdzG|GDY&HxO1`s?k!&)d@Xj0rC2?t0aE_J2Za@XW7gOBndK9^G0m zS@O<4KeqOzmzFPBR5Hf1btIukKdr_lI`MD%{SRbaC&&3ViqmDG5XPuqmM@S=>eiQw zitv42zA$RJa@?a#+>KPq^q1*($_D zdhOZ21@`+svz&eD`Wj9!iFLL;Lzu389=|o<(eTa;Hr45;*>*^(v@1*8J6}F#K{X24 zL3ot#Qstwrmvc;Vr}Az3{@FAQFLu`;m9C1xh9d3a?KkcljlSiXw3XKw?baio0$b!( zOn5(W;Pg279BhoS49sd6 z!C5?yny_zlV0>V%5Lj&vlv?x{VwL=-Y(~P$$bE5vx9dIwqq?7%EUpQdpcEu=NBk_M z0IUNx9#*BmwjJmUNSlj?(w)-+N@H^Yh8Us(EE{!Sn&A_K_Y?~!?vgxcUnqjHvkL85 ztd`0A|v^5pb1q+;X+KgQQNla<8@iw=epq4q*Tn7&7&v)){ z)I+~fPErn4UVL_A=eZ5W>^mRxu38A;EQb#||g-oAJnW z*JJqUje*Fy!~T|-Cp23MZK1Vz7!GHsFmIcVAG2B}B3}2xia+Imqx}u>3o09Z#ZbyQ zt3oZ5`QxYF^`Z&?XSc3SOm98kGA)LtiwXfVQL|@S41r5R zxaLiKxp<9*3+VKNI%Xr-!_QbV{MbHziw`wBS0qplXV*))tH*|NhG#cbjK<^^%1POB zWI^oK`XA;m*dOtnePPg^qM4qv&&PGq86Gx?Ou&eoq+lIg6FDiH^hRCAHJPH@;UaB*=g^)lWy zgyuKtE|*Z7c~ofRS!v@{2-ieTMSE^yt~><4Ryi@dt=v9+FJM=jvDI0ib$1siyFvec zr6oFepr@l@N%TLIWRk}O??`NKFymAuKWQ_v)sjg?g?#9@kkG?H)3=(R#H170!7jy2 zV2!dWR|e-K`abIj%t;LFLzr)$7+RVVSeXdTfG7eH%niXq4%n0rh6b%_rtZr_`US4~q0gM>Rar=drL0 zyFjwXV;B)+?HM)-f=g_)FMm6*#HNiv@l$lZ{DYC$Y2R-1z3Y5~W|Y9~HsMhEN80~D z97)WVG#N+X-?Zl?I_0s@0KsH1NU7%=*7HXwgE}nNgnmFD^tzDKIK5Vc>eJZh=2_cw z9fD-1G`m0)r7`2dQsT9vr7wg0G}np)T^Q{Jqj)sRC_aLM^)iZrJX~iKhZE&XsZe|; zA6RPBMyloFe5D-Ku^}D|-2x=k;??1pODzS;aB!Kqa+bd%QFej_oJZW>X$}XD)1=wd z;eg_2_sVd8$8dRIaE{Hl$Dt#iV}k`Ay_L{e(x|Fy<#--P!Rk^`O_-afEQR(&Ft3|q zi55$#L#Yf#b~oGl1LRh>qle)+o%V)Ul+onGsCp>_g?Z5C`;t^|0uS1dL=m8(lV)<6 zOw;K{zEWL+w~OTw7*cFQuFu+LhOqzQ^+4>A znt9ZN#c>3jj>uZ%3?-ach!k&w+~YRv@E^i17q{TZ6B~@1iTeS`%6gZVG(&JL4SFE< z>K3F5O0HBAQr_O)=)=pML;dwuWoSc52NF8QC}wSRdt)y4dn+IKps;#<2v?7q<@Y9~XtxUvv~ zbq;1jl-A&o?hk>=Ii~=P=G4AGl*@!f=x5PHF6|^*AlY|uwLBRj<5cuWY&arYNJ?6c znMs?DL}N`Ge@6Jm1cw3Pjjpk?XQJiDYA1XbOQmKVAh{O+#hEh`IRXH26E4Ydf_4(2 z8K#YWQlQWrWd=_%<&qRrw39>{tZELzT8zY^$-b2g#r7}#m((5n4Xc)6F(VB-EObX2 z3x+z`baacR0zS?9vc}1--X>K_VLfPrLpc<@H}(9dzI|5ZVKH!TYA*CJ9KH(~3jfgS6 z3pYyBb$^jmK#t(tRNo$FZeVUI51yOq(605Z6@DgX`qrAK$m4_ej`Hmj{I!j9vplqwY^D{2M50Q?J)=Dq-s`QXNDXbSUNOU`yWi3XsKAP zlT^R84w^e3jR~gaSK-75A}mX;_6_GuiWkNbWBUn4O&InnE_Tal*d|`%f$Rx)GL=@3 za>gGvv%f$Xfkj1vW~=rogo)!kWBkxR9+~~^rpq|k7AnU3?acMxw8+;lS6ZbMoVUJP$&=G42qvhop#1|VUp}<6f!_iz~RfzkS%#y z2mEMwwqy-7Txs+f;yMl|CG{semL8@X-uuQqBhplA8*!cgAvcPx)o`&BP1l z$QX0ZoVC)3$U;mkIS**xNx+~ z5KTdpi}gT^T*jd=;SN#Fw78jZ2#E-5gp2|7gSEEjrGgb?$ea#y0Hb}x@sI4268L*F z1Agrqq;g{A?8z0JQ4d6LT`J|(-sF%50AVa%{w9BL2~>8Vz$nF|x5W9Rcx?ctTdQe3 zF?}=CJZEUJpe%7h1U-=xFdl~XUO*yN}N82~I z@}{sq@|*=*x6SWS_*&SY#y9c{1m&!P?P;(Xkw?hmu|M(z;47Bp+-=_+q?GsAtA0d?I6^6*5wa`jov}aackRh3d_Zc8CqgafxYS+MO=;u zY9{IG-b$t#g}xje_?f%N?koOnIRaliOo}LZV>tOEM3724*zUv32hX%)>dPmMq*k<2-|6r`ZjaiH@jzX75(Y_=HWueq4s|k&jVY7WB1B3#kIQpImKr~b`8Za^qZvQ$^F%;E-u>wY#v@EbY%oB+r@ZFyJy)i(8OHx&D z7wPDx^P$ddbkKM|!w+CtHFDH#@afZA9!CNs>Pux<=6h@5Qd#2W0i1F=w4xu1)h zY(d`}2yqE~{~|2`P-37+=+1L$^P;86?Fz(dHyASubx7TmCn_=x`1xMbUVRsOJLo|^ zCT)nZ$-uA<#2Q3WZ}T@eIJX9c6 zaLQMx`3_byilZ4CT$+geWMFAxdpJ(E1`cz!C6RV=q*pT->6C-rrDF6#i4`kKl1sH< zw2MKHBlEQH#1EO>0gnT7W2jW1#rX2d<0QhhS6zv*6KJ`pYlpY{=-nzaREFBv2uvSB zQ)C}?sm?TMUFa_IX zF&8d>=Zf;X?3=^L)8F|(`8D>+4;E4POKU`siuLjs%il~|0 z7+sO_XpA11c~tvK2c)5=eb@&cHwxa>qad;|X*&%pFUP=hwQs(|X$1TOjiaS1#|`gq zX!m396AvpybPw$4#@mEX(IA3!MWHr|19yU`MzkQ*+1eP{k4L+43($Bn7Y$c+20>^n zUsjszq7@XUj94uh--c1}{c>Uto{hi*X-Oibl=NFGI8+tQ# zRoVh`9a;+Coebu?6B`H5rQHcEeUj2X1Y^*`48yoi3tLM|WqtqBm?dah9d9piKm!0b zhHfE{HZqn>^9KnsaBYfui~)!DiwiY;*#=yJO!<8#Al~5v&BkVh40$?A0p}RJeeavQOIUol=RK z%;#3j3s|f5$L0D@t^5b?`J}1=r+hJtgtmZCXlM#Xe>4mWnj5UrQ_8f*T<7! zJ}#|~Lzw-e^|8dL558Dg1=77dfg!Kp&>0s3`;%#}s=&a2>PZWm1+*YokcL%vZycf% z6*~qDmKN(7(}ZJWT8wOwKSQcOeI_`|(OxG=^V;kBbe2UOT3UNuPiHxd&Qhl??9v=+ z0*QVSl)YOHBc!A&=ykNe4FyrO+i<>rZGYPtb)rjR1NhM{C+bLnEmAh-Z8~WV3VC4E zMq%x2jjOw03Hq9G2w)W_Qw(u%dH#-N@@L9!YICDgPXL}ns>PSJ-2Q~|6e9M3F6^2W zi}JZ@VZWrpTl#l^>->#Y<+_H7o_;?HI~4TuQM{j{-w%Vh3;tp7mv^bfw#@G80~IS# z%iUl#fJ>R-8jCAX@*=43c3OfXM(ArBT<4h6-Xus*gUcApJNM(fk?=suMv+>FT4e&U2>Jy`8q4=#y}ik`7=80N zN%k<~-UVaQY6Bot;bkt(IAsEzXs>awngmJ4bw1rl7EBE7&!CpnT%lsYV z>C((ZITZu~Q(ypl5?!I75H*Vc&M5s6aDmW2`8?Kgybf!&#>`-4b% z`t`K|!6HY&iw?W@Hf;CVdBy9o&E#&T6) zKtpkl)`+D3Dez1=fM;GxtTcEgFWH+t2;^g^6Nhviw#*-+DsP(?EHvdzl2RvRG|h0` zk^m$afOljb0H=K0dC7GPN_d-ggnS+1xXbz%R{jL5=x+94I}YbC8~+X2TF@In5?(L+ z1AJJIc`0qUk2FypjNRu7&4&5a4QXj|4VXjlYILaMK)DvHRuTwX8KkQwEsao46<)%Q9YWg@q&h+3@GWpA&nMN<18b%AbIH z!4ocq^|93M*BMCa=uYiO`%LQSkAaI(Z?%P1cPne~fQG$FLclI$OR9<~(7c(H-J*B; zG*C4G(p)F-rsP4_6HfLd*bmBw_kG&xsgi3fPL`_g0S0WkCS=Hql@8vw*?oOsQvmDl zSWBoE%j2=R1l?>7Ah2-On+YYAgrhx;?u(u_ma}6k$i;cKrR1XCr@8$X9k5r&bDI&( z?IJShq3k7~=*ev~a>Mk)jsXI>h4tJJ!gJdMP*hDWo|FM@lzA-9=jq@8S3G$QKv2yO zE3%t6EDK4fdC`@56uTuWDolh#-9aKOlR8&aFK7R%MKdhKNdyNxPEftEq%6fFm5xHT zpf979RP0jTSOSNNHevAoM!nNqF0(oqJN@ybsv~3 z+4Y2K_XfL;>M$??k9LT%!RG6IJaVB|Ki?Uwccn~(1Rm9lc-#4p&Nt)cvo*9(K%Ug! zAv2eST=L);b1UshsD}nOIfQ*!DC|{DRC!GzAE6^uj7BJxc+~tZ^`Q>!s`e(UM8kB1 zn&rn4QP!3gbrUVm6p}&mkqm@v?4rutTKmEak%xc`1q4MR<_8z$cy~0%naC0R%Th?I zbOe|UtV&8lL5DW(MSX_g`HNeQDvqttZqsK7JtKr=Agrh>xQ5RV2~;=W22!*H%o5~* zo7lJvzWw!gWUPOl5L&&K&fp?EC4b%U%J1D+lFM6az{Hu}A{;C?3N}78D|y#&g!4ukz=QCAyy z(5hU^?*_+0mT%+d|12FOXV&(d7c1eN1i|kWr@^pu_B#-d*K6MdXWM*xEP=T;H3i~V zu1~-zM@`T^UJn6RK1gX+2eV;&kue9-zR-mZ)AGel6L74rCa5=C)8EN%S)YnyW_7aq zkmx)9jnIgL=JX~7+?nzaiN9eGgesi7N_@B3zERy)7+Y@2#U2ucL-ms&18iS=t}Rwt zjuTpkGzQC;t(DY_rO7zb9fgW@Fz>Nt_tlrwa&TY!e8 ziLUxNodQZxo>(!+--(?kb!Y9bkPBpJ+rS66sp~{G0#!&{I_;o2iu4QYqKzYw?gUZO z5U(vJ)c2-g_!W!F`SfO#78=~F6{LaSse0DC^;Gg+A~aZR^L_peom>~|C)XUt5d5$| z7#Tpnn}BgfVx1Oq3>|f2Y|RaIczZz=t6Sj>gQ(trsI{`p(?sm=5g3{^049tc`30QH zr_iua3zG1N-|Cnhw2&Z1zi)S|L!D{MKD;JIojDfsI4;XMviDaE&OTCMhH;KuD|A9n zE4L%D6Ea8GOWLln0wkS(%w1nWSKObsvV)y(J5t3CaL$IaF4zC`H8+Z0cA3=zkH#R$L ze}p!k+GSJ_cviv_%5wri_Cfojw-D6E5o!?*#X<{&^WQ3U*&VCL!k^wD?8)v}6SD(t z+pSt~!i+7eAWeehZOIDCgyz|}I9Eg&TGS%sQ$B>}P)m{mxJMmH7ZtNxU=s<*_^m}O3rRX8qyYLoMt_|2-_ZYQ78W`fz{k1Z4HI(9#Y}26L?JZd4I0 zK+MH;PT7G&Ms-@<*N*KmubTH|Y7NTnSg6R(*6)SHY1=`w_6ol-2vxWb*>9+Nc_xwf zsA=+n+Fo4?r~jc87^!_7F3j2@z(V;Q{YQ#2m3YAUvEo4jK_-WNj*2? zfbYvTXn60(MM;mE1r1v>=&Qjq4~-G#YNSTeiFL~boZ;2uRZ?v1SLaYboT2|A5Lj1NCK2;CdsHDPGKfY z)39w}#lf(ah=QWts>gxy%vusfkx)jdf0h~#!ngSB`to=vdFP_i<+G#%gX%vj#b5ww zv3jc-tr1%4gdDkkLR0=Z%B(5>g#J0Df7em`Pl?zX{%yx63xgJ&)$KpKEl^!T{Fx#{ayG?G6c%dX|`KxbGMQ5^fazQEyt*4 zV1j)K5}!b6(yihY%jQBQvyULDLlp}@UB#CHIOMkaHLC)(HGO_>j;sgKp7SyFIC5%( z>7b^VTDWjm&Qyuh5iG`QZc#^45U!~D-VwIXGVT@CV;;;0LIn4OHKHRm_w8iR#Z299 zdNp=mrm~wicrz4GR9p;O)#X14_J{7wKup%NCZa(8>9#3Uei9&^@K2|*UzE<`I_U@K z255)os5)}8D!SNtOzPaK#uchbfklcsY@%qaGI-0=lDxA`2H5?$^uJhH`Zw51Mv0e1ju-XXvEP z(D~Dy0X3*55(eDW-n%+xCn^D5j4j3~0G3nf_ass3So5pw`ifuZnydL;+0ASGdiSGh zO7Y{efHXAw$eIDv4KZk7MLUj<6Zr({X^d(P&FvDJ>1r(17x>R9E@84d!KH*lwy{kD zGVIn;QASjt{SmshgPmau1en`MfT>p_VyPy(^HWfRs7y-3?yfUx5zTI>q>+4-*x@+e z=eXJ=$Kqxzy7y04Z45YPEsp&iIiYkz{Pj80hLrDBuXUi`WS?0bqnyF2pbXLHAw<2R z&qc6t6g6%`_;K?iatewe-U+C8Huyu@&vHvBBjCryd!_7@vWzM7a4D1z_Rz8paNzS! zpeyaBYjMpe?AJ(-rmNSp|Mc;g} zyYQTrrq07fCT1jhnrD2DY(U5Zj4&C9G%}EZIFmN0*BQ$VP~gT@)Kms9#@r96XBq{e z-iteDFzI5@eyT6+lR-P|FYw%wKout*_&S(?Jh^2CT%vY_K1H*Y!OR3KN5K9=$F#!M3KXZ6 zo1TCHh!a#xWORbp5=g>bvR1qQmmEun0IM>{fOcdck1~*LM#lWA)ql-MH`qZL#RJ{= z!q#+d<^oG-*$GR&IIXY?HO})C@&%1y63fN!(lc9mL@JCEpjLNGu3~u z8IZ6y17xwc4@7Oal4TvE8F)9UMS@c>x&bX<3(AfXbhN`djx+n>5ZbD&C@oIwF zcv%-2M4{P%DzA@uJlY0OuN(0uuGBwE*I4*kfVUWPF|{xeI|4N$bI%)?k4&K|*E9G) zYaIi)=Yk8emWchMdy9e92tN~I2d!4&t<<~KDZ2%_d zs{aZ321nA)2#VcD*eCERpGQ&19Iu?i@nUwX21-6bJE0itd)FGcBN58OfyH*?M#TSO~q{uL7NO&oM^F~b}7vvA^Ehf5~LoqnwTc75jy zVBOx8uGUcF-$Mr%nHLlwc$2)55n?tj4Zr@n*K^D5u*}$3U__+KI|eij)#V1!ne7bb>~US!;|lbeR{%zDYO&b%Bp+>UCs$ zr&CB@WNZ2&qeyA+)YU?{l`!6JV61}z9p|W&`e`v^F`~+`3eh<8cf@SSgtf5s2&+48 z7FvR{g!Z~zd1PRpZ(nY}E1dKK^}gsb#RvKU*@C4C7&^&%MxdUKo|qLEO?BgctAFO3PFLtG<->fP zZdrV7pqA|Gykhl0C@_|buf=F_z6(Pt%&!eWx@Oh4fy&VVSq>O*X61Sk?3cJ`s<#-Z zB@2d-(V8ye8lD#K54#mS#)CfCI!YlaS99g@Ry25;se|HU>ezs}2*;HdfH~4y;`nwaY8b{qNPx^ z8$QB8=(vyf|IjTb@X0npv(x#v@q-zO_E2 z69w#*N6gANpcIV=B>$4OlY_E9EYFR+1Uf({N%V2kgFtO`;e&jOxge9ayHq|wotk-C zXo4y3sev>?5P1+uaa)%OT4V@XkxS0CThr@l3r0K}suw!~+JRk$8HpDT-9S`^Kmlrm z%aeWN|5eP5DMUHnvu#XaH~t&@v(qG6bYPQ)p(jX1KjH$X7!0;F-v2$03qMPuvrO|4DqBNfcq)9a|DzRjHxLcN~ByoTMU~U$QidxJ$0WY z`u1%N|0B**V@}&QS{XTl%C{xPiI0xnLUCeR>cCO!9ie2ePAS7Wii=P^l-r$k{yn1q zvmfkN)P*5vOFo8n^3+@ll>S6=i~cnF{7|rOG&Ul-spXpn4DUOluk2WtS zUQX6a3@;3AMN5q9hqBG{EVTizDOZjl_bI$Yg?FUG7Janj1CU&AJT(6jUQ97fO{PMo z;&LyQ67_BrbbTD}3EB`U&1c`EQh8&?@BeY3GWU4YM2b~->8MmseVp-B_+#f&=zqTH zJJ1@~4(?nq93Al{{3yv!qi-oApZWjT`}TmUs_g%Bxfi%R>|#n`p^~A=Pzt_L5fCm) z%0m#JAvNV4dyG18ua8FL($(Z}#F}QNndvc;Q_VE>iccJzu$j@o_o$-d+)XOUVH8L-fQ6(lbxL;Y4QjplTFN6a9e|j zD|aMsTh7_0R*oiMLT7w!9wZa;T6HL)b*A1HB0qu99H7G z#u{kv4zb~)z@;s;sSjdR(=b(akFx3CVEafIxY(zSvPEMt&y>2Q6`gy4>nrP^gjSbq zhuNqtD=12Wy_YcchCppD(A>>nP|TiT@4d&CfT)9UK4}!L1+H~N{rNrC*Ic(EvdvV5 z<4?V#FfK)~5LXZjq)WxFiLnZ2?Sf3>4X{n+=|XxiO^FrUnI3 z{TRE34B4bUX^4;>AxtvUU1Y&v9*dW2umWOtoDJq10IKVaz=8I-hD0|z_s7qS#YqtZ z9wRn=F_NGi)Ci16pl1!h7`YCsQYfD&p&%;mJl0V5VhDy#n=US2gL*TJUu`3+=eqeL zxb|B;TNigkcQvVFvyr@HC_KdSsBSKLglG&Aa5q(tK~0;>1WgyVU?DX+?l5KmsnHm- z5nEW{@hy%GG3XB*8}S<{tc?&hMkMuaR(M0a+jJ8xjG$Y_S(g(Sx{(?2q=xcOmCX}2 z@{I@ zgM9`Jy&TRNUGngn|-&C7M)aI9?a-i=~%e|jXpbz zG8AK0aN#$#d}GCzZcv5}>LDO9l=d5BxcOtwGkAezr7=7%0O3?cIoyy(811Elbbo=% zwDkpofnBAHUEdt=@TymMFg)%f@=J$b5LSSgjP`;Scb)+V}v*`<*ZJ+9zArwSAdUd!Ct4e~Ljx|B#`v$Lk2k5?0Gai(P zL7O#*4&htFm~3L^uiR-QDKo@f#eCx`zcI#fC>rw4CT|O{$urj|l)&;`(xpv9Z8u|k z4VQ0|oSTeTG2&(flm)U`4Bu8n6@*saNR?SzMR)Bh(3BL7Bezl2Z_s`GxKoL(`{{%4 z=(?`IOGO>18say9A=N}jF6=|IUr6{+oWMQ8X5R=M5P_F*>R$)>j2dfe!);B z0KYU^{uYOPz?i@TRGa>VnY=>#TXe!h7u9t~Bpoe5Ka~~%{Rf$GVq$B0^&DKW31`;V zkcq?mf++A2t!d-z7)0h^e1wjB*R#X!ax9Y~bTqdwx~q<7gFj(hmmO zj?=nI2I%v_WP^DsVAxyu;yVg7nIbF`t47ni^AJXnxB?H&CxgfxAl9tKBA0B$@Cw;E zp|wFU1GJx%E%1?>@w;y=niM&il37<3v*jGtoX{p!j=lu2^Gkd}0c8u$Bx5xvp=7AN zCuzM2hmc{LK1z2Y71t|WpYwy2CKAotP+Sckiqp~4p?8J*wq}`$ejf0Wot53ZJf+_AH=+O;bCom7d zOitY^B}EVs7z(sh#T)=~xBdFvwqPh)z|{1zeMYuTpPtxBslyh+FJfe}@rjiy5u=X~ zvuRZq5Nm5^0%}Ufi3@7%>6Moqn>KI&+>?On4Po7#*}g)1gm(%>BdJ@6mF9A+-V!M zk9xRNX8nZjmfUH31X*I8qx>dPvy)v9sozfs75yZW7a~GjgXTev1oJ?T&h(cg=TTZH zTHG-Wb{F-ayb|*xo`v8U%+aR?#F>vdDyd!NTehE&=cH5ZfsGP6k~|GQRCoFM?byPd z9k9I(zd_rvEfN5AAXvBGj(e@MjZmD#&kkM2n#E%{u=ySg^)$$_z$BPCY8sTWF)7La zi2qdH1VzTUF*bfz0Dt-WwBPwCnmmsPt~;Pf?mU0FPk$RYOnZ}`;1X`Aq9bBgJBqAX z$r$tt{wfo;I1*cTzD=Y5NcyFG?bb=RDS8iJ|K&IqIyD7~KvovYc6{VVK@X!tG$Nxr z8{F1m{LzG?IM0X=dcv7&a*W-Mio|2Ux)D^j{jXp+GxDvaJ@ z(PU4=Dd)$wqi8BgoMO|Elry-iio^0-YHg^ijzeQ<>_s+dNOf2!5);(b)(~*lZ21LL zB>phW0x*>!HCAflvLPVs#10)d&S1xlXI5{DomBlutPV$`7sjUUs7-85IQR0)SgD}{ znqw-lv*>bflV^w^iLfI z5?D9i2X|_Ab*T=G4k}h^B@Ag`B`YI#rsGhCats=!O^XmnRSVMcC7olVJl&;S*c^jQ z3E0>~rR-|$`WWpe)lam3xH>!s<6s!>A^`RjhO>-giop(7D>C$hET*AMY}HfeDB*+u z9TxkX^~cts^N|eFZi6KvMUO8It3LiRN}h~Kg+V;dTN>eVopmJBH40qgHtm^EwSz9F z+0W>3Nd+xis2%I_u#=(O;PNFoC2uG@`wL03J;b(C9E;@Wk!gIinLablT^ zakO&Q*otnBJN-myG`(ZimJF{r53jWpik^@Yq#+v<9D8|4+j0?VsIZElE#|Jl6*#OC z(D@45$mb*JSDojh8C8`Y_HCG(swT4~mEI83*3}?_0n-vi!5dp@u~b0K8n#fh*SD8&ERD-fLX%ciLj-b7&QG zZA_Q4HWDP86@_^-0!g7=$#Nwlob3VZi96mg)m_BB5L@8Cz*!TNi%@$g?!E~1TBk>1 zK#c|>1Vc;csEXiSI~qv`9c{ayl^TMe05Q#V3aD(hJi9N=N-}3*HC5pW6y2f51@5Qg z8C8*tahS`8O^>A02R1$A1NdCK5T4~g(T+zAU$ApBl1B4dG-o)!*DSBc!VH-p!8m`= zBUqWh1bgVtRrEo2FPQBUT%K}$#5cQ1y`|*(%-!s2T$Kvu$>-kk+GZXL2zFwzqYEYW zZ9%kIX~C{=bx~V&VVh#w;0nS!$~tg70=u9jeX4nd(>N2t*J1Yw+pySv4Qb(x>TWyj zZZjR5nqh@s3`mmn=C^U!JodBgfar>`2N_>T%?0n&SiDkmm8AyztXGi>Bwe+vp;7JG zJy1p&Ro#!I+5uD=55AWwdRxrH6Ki*4iLS&%=6XWuE>9qI2L@dm)?~pB++p;`^-8Bx zcRm7r@rln_U%X)P_TxOd_ky4ub-Nd-hrE_kaWlQlDDk%uuy`q2FZ?KDV2tP{Z=xda zw5C8TX7t}L<&U^V@;&HZ56gEb1AsyHnMujEU<~zjhjGQe!64iK(SbTqb;`7A7fDDx z_Ufo%uDI|UIP=hD+D7kv5}!zac&yz02M8Yw!2{j9gIQ1sO=+1ufBA+phTB%`V)4qFcjkCCY($_)0~2!)th@OPovN9xp+}) zy$x;dbla`$s_u|iu^&G7g{pu`eHBKN4+T`F>s&*iQG6J5?A76FM?<=9x&hr7`ZJu% zpE=&Ng;srL-ecNQi8md@u6%d*9IYmo-J~UG>mSt*E^*xh zo%wWrCcyMq0tK9lz0G^ToOI+713t3O5Cu3+upT2~v=a2G?&$Yh8nFM;?S=9r1_HR% zMkt5IrrXOfJKsVJtKcg7XiOKXvbnqM*Tz|+Fds$|UPE|<1QaT^!uZRs_p8QY2Jqc@ ztSx?bk8NmGsoUN=9_O2|glGWPbhGR4TP~Wm(2>q*5|obOUA;eN-j?P?lKSuiF ztvA`P--DYaYJshM9*3e9f*keq4p%_Z<&tw%@f2$aC|Pf?!|G#DI!L(m^IV_dgL5W> z4@xp=IF4j8?Y;1E&E&rZyZjlPmUPLqt^GR${fhte`#DD9g-fB`<86A{m#>Pz^5!K1 zRvdZ`* z$_HX~{t3j82HnMoq@(LFhsPb+W|@v(GQGfRWq1t@!DrC^_m@9mr}q$%r{u7Hb$6QQ z2woX1MqztXK7EG9eOQWAYW6l*2}YPJnx>ri~z+k9D#YtTW| zTDp-2r@4mdXfW8b--c#f(pUxU^g=353thlfg=(BOGIvy)FP!Asr#pIZuXTSAqE?$v zW1*yIH(z+DdWEjKaJO8EVZLC7{)4eF-ovNe2_rXrS^_C=PMhQ?JIvwMM_LTJI7QLJ zU9PyQ`$o{MDj#q>6ih&wo{xTq7*d2$z48jmqlhllW6Q#_fa6ZyiXA)ezfcY-V1IN3 zh%*vPMsT4V7eRR)%K;jt$JYcvxftTqOhCD@G+4<5luMwD5tN%o3u)KggaP||++{a~ zHge(I5qAW>Vz>k@#hr>TJ6FrOuXAcZ_hn8E=srT{t|*{8g;N9SQaLjhkUCqZPfOp{ ze$R9R_ftHp@T|r&Vupd+g!f~3D)H>V^E946;`s|6@~^?W9?!dYTJf~wIfv&W9`e`W z3C9zO#~;5HVSWhzKj8mE_&ee6jej|4WY08kcO@IRk+Tfkzwq3WYT(Ag3f)g;8@NZ| zzX;EK_|y9|{OO$qe|rA`kAV0O!@mfA`V^!Y@gIW!Lx}$t{GWsWHu(Pm{g z_%i%QLj%}2_>Y7i2im^?{8jkh0>2Q%{R#Z-ct&LyxE#Fc$+{c3@%(h2^8PJgtG)bJ zz>nOo!=K)Nhkt<@m*SKA3xuI>dcTeL6ol3AYi@470{;O1PpkM{Sq82Yac)HTYWO#0 z8@RLZzu9cyR=|&NRKhwp6z*!y;tQwD8&8LiRL1J6xuoZe;L%N4B*;*@I3Ze2RPRP&^TN zd3jUZ2@CQI;D{F9$-^{Z#CEj%GS&W(n4&HbJSkidY}0lW%|wa}7%K-=1)F%wz*cbk;v-jh#8hIt#aKN6wsLy=&$y zYYbFHO`W;YI%B5AYJ^&%t?SS~XS!O5VM0r$>oBF0J`Um|h(7kmS+<{{_sf>; zPI^C&RLGrWkNQ;GXf( z`*2R(jng%Cr-zjew*^CCnk_)zS^;T616Uf?h!2jlTiof!+X@Vg)Yfv&T{JLaaWM)P z^mV6iD!rA((xXA;90ibEpNK=8n-L>*7Wi(!5lwf^xX@ks;NUC^UuYO-5&jgw9Jdu2 z$q~vNA#j-fdGHOSoPc}qo@J?6X>d2rvV;^FX7Od~oMXQqt1}#aI9=h8Nn@=DJ>wNJ z)~@ko+`WZPEpg&3quDTPiw9lSi0hYMHtjj&j{FD{ zL+CY!7YlG)_)fT@1;9n#k-_7S6fL~9>?iO?4jCN)BY_7N^t zjmRvp;|4!TyZy^3P1I{q9Lp96@7h0`MjP&?mh({ix-fEVtuyH8XZjOZ4BUwwqcKqa zS@?*YgKoGwV|+BeNkHT==%8o0S3atGkN5L_WSEb4gvVPh!Vw+kNED(P^~&%*%yJs} zy@s)=>euG+V^kj>;)8ZCd7B@pUWjy2qJHM<{fuAiO~CGz=3n~7ri76x2tlYmW)Ain^_FB#k6nhy>o}@2i!XfC6%9xLLFOl^kkIPL2=&`}342luyYQ*d zD|~zTWueD;5-`+HGdIS91Ra4(DQ;tsO@P(!=HNP^_%L-$WOJ0;ix)qz65bZg@iPyr1IwhL^PP4kf&^ zO(~Bt!XiU;(IfJ0e)+4#xK!ni7Ni$3y%`wb5o#?+yC;bJHA>a_x-XUeUj9eOe}=FB zvmSp|ts?rTVgm*7DyNI4ehDq~!_w=KFD;=H{IImEL4IrvRlF=x6oqWB8(VdufDIy=i##%P(7AMjoD}?((y* z&_)abb)Pz}1hvNd1x3{l#9}U0eFLldA9gB@%kQZ1#y zYE7#aAi)zru7ZF#=Od5Qc(Ld=dig#=zHLZ$pYIiP-QLvy53V}^$B*tzjcymp7Xs~^L$v;e z&@{|ljxpjd@z50G`yMA*a$<$KaGcT$hv7;%m8K7Hx!RCxKzR`)&Kaeqs2XwQ41(-Z zc|#D^`1~4!I|Um6T1UUR4~U*$3;Db%!_^sHAuCnjk7Atw4AiFJ9Ybvjs`ogk_MtXq z$7MwZs;%Rqg`jPEv;mohZMXzUjQ|>+ZRu!y&BIYbE<2|_7&9>;S8PgJIXyARLb@m$73iTF{>skV-fj<4l|8WEW$5KwLG zPI0ayazAF^L}(g=daG`gfN0)^XFeoET&nY~e-F{y9XHlhI>psN`Y5`=g7mzg(WeWuX5KjdQOW=m+Pdzo9_j%v$7}xbP(2 z?RaE7$Kk$&Cj;v@3-AzU{+G^GS$zN5snSC17yY z;Fc3}ZHKFmDz7>y*A{hU>T&h0wO!tC8Wd4mMWZ6T*RoL&Yo~mYK#u>pU?`&i`3?+- zoWE9!;IdaDhG3~{q`KVYofx*Jz?C~sUZnX?qnS(5(~H&!@q(6r&#Wrm%@!TrL`YBH zfevXl7Mm4jXdMcGPhpK(8?t5~e=7xJtM1ZV!}y<+mm zJ~laTLgI+OJh~?0FW%HGji+vDT&zz-C!PGE(qz5rS6C-^?o!K_K|UeKTtNP(_$IR0 zUO9_H&i?%(?U(%&j8p%2=tx41>RRbo_3bST+BfC+|CfYrg|s*?d9l9w9+dZo*v|Oh z<;_PVxBfps=Ov8~A97AQxtjCPk>?sBL6Uiet1d6=`%sZ>f3`X}`> ztSa7*X)_dq(uzXg`spIp7i0ZYYh}FF8>%txb%p_x&_xMmc#szhj$z9QXd#7OYTuQ) z$E~3kHySPRt(N#E*C5M2BuAKMv{ano>@G~ikV4^I=Aw1ma*MusV?^k=z6b^uA*_Y6 z;(P|yfZ04!xPU?DSZ5X7ixw1EaPk{BuZ3IczQDz;wTjw0`DYjuE{DF00*o|DjZ0yl z;rl|?4;a#lBmJbo4_9V=@czaxbbUCt_#h2H+0A=PPDKOhV<|DL4JZ~XzM}82THCm= zcH2+roEEf9jGFN-^no_e=Ix9QL9_*hxottNQ2K4@wj98@o5&e0wtyMp`a!mUFt;^W zXc0tc2r3roqYq`MiY{Pc7xP>k@3uG^bf(8PV!7R9FU4;~108BAIlQ((i8ZmS7-<<9 z){2{g`cB&r#1nv2-)RXu6?VcJ(DIdNX*m_vWE+I!hIAn#?sA(>EL^=h zqV8G*j!Kntb{JU4uizwbU4%t{ME!_AVjWRx6u!1}9sl*Vk1dXCsq1dgU$nHG1f`FK zZ;Ok>x45vTji$HUU8i8T_7qp~Epa8@ZNJ7@?<|OKw_l4XxhbsH^jlHrAy=x+5Y`>v zD%8ifnqCvb05iSTYcW22JcGS>iTKVNqw47;WLg2E&X;4K{-?ZN_xwX$@~_o7kc6bbQL` z-E)M-6~!Vu(TaE2w6N)68w_EOqA^It(Qnj;*|P(+F z-?Vn<#=#JtAXVxDEft-d-6M@RLt=)geqj*sU`3QgRgyIs)*?{gYs4ko&uBn0CwAO^ zDZWV+bdlt^WXsyeRQY{xZIdeXO|}%!nW0MNM5Jdpgn5|IVA0pwZj?8C0h3L@S{q-> z>d|2N9u;B-q~Zg2xriu(5G91gjpQ!+On|t+W6LZx3dv| z#fu7r4}@-^BffUVk@focmef3cwaM4(W^!Av6>KexN3TkI3NsI_Pc`h+e7Z1xd6Rl0`T zhI&Hb3a|y?0w#W=iIXZk?Y0XjxXI{gfNnHX6f5Y$3o6K zS#wxo5IS1E@@c@*7*UvuAev!Kd|I<3bje!WNA4rT%uNOZ=V>uoCR;b;962p zwIO5y_4eqw(MK5KYh6h!KjlFI?pteJccS4RxjDE7`0cQD_O%cNqnY_=!C$UFdOEC4 zs9zRvu{1cW-KtCNYQur4f;UIH^aXFm0B!Tvp*b* zO)u4l)twHjyEc><5p11Ij19I1TPo_fnXZwu?oJr^9nlRbw@doPPc}j92P+{ z>XKzEaDg9uJc04W;ks)#6N5PG9d)OT_G=h;5kpd3H@pQ?nAq0zv0lzbaUZ0 zjHWq^@6TeKUExYe-Gm{kV6r&Gm`yq31jF;!mg2PNO*5eSbS&uD zhP2d{25y~Wa0P4)Hf_OH1lMvn3<{5Q!H&f^k`dfeY_PcJ7%{?Vqy%!pdIQ5=(1*Pv zalJuBKZBtk-BLHCb4G({TO1L%ISiMwu>-*AYfJPXWZHtAIIcww`@kBmn`7vsfI*Cs z#&HZulqKD?H3lIodhugNZE7-Y!A1+$h!sNsEETy}8%88l;5jI=IYxZvM14_vuCe8< z?v%JNozeJg!sT%)Dsj4h#ac8J{?X=#KJ z$5b44`SS@=Q=^_%ccD{*fShsyhEtBdxU3fF2&IT4Ey5g3-;nx2G?hy?`bM5#wI)QK zfPD)=l+!@Bsvsov;)dwZ){Qp_;wml`O7n=+DxxI+1Z()NTS8kmGrw9NzZ>AU6#QVR zev7Nh4YB_$1OieHmf7yCC}$kB-R?-?Y$Fxq@|8a)@VM3< zoc!#rhdS5&V!{4D7Obq_JNww1Cl8<|qzJ(RA_BP_j%4TMFZy2pX=sz;+xLQ^y{>`M za1bx~W31{guRDuz@hRc*(&h56u+8I13~W{kjn$E_E{BE<6bvUnfJL_Ei=|OQW6pS?81j!Df%gMEF79Y@Q+APck5 zdjqLuwHcvs%chU71rTZ;ZNnUo0yxBhyGb|1w=#3|7HAKGKTeyWt}a^4QVa8fWGF03)Tr}B!vzrz!eEdFpVd2T;DETz~+0L{*ud}?~2E@LTnY= zIWFun1&!~tOgz3ZpzBl8p4x`xkZrVHC^XNq+-^2nX4Kn)cBSp%T%}#Dvn;n2V!{vA zM$Psw?9C0$U(oslv;w6Y!t}c`Y$l4VZUUH%yHZ^#mSp&kBCt`}8!#K`1Q~QA7?P28 z`!1a=U{|2)=FaqB`!0impfBXEjL-(pnnq{`)_@BQxcBs=Gt>FjGq1(G+j}r%W%*m& zf*T$B)UmCvKL6XRDfYlx;H5v*JCHgyj&>m6Ezp!5Fc@QnHEjrRal+MoB!e_+#6ZQuFE+BuaG*D(_aGDV_;$Gq^r;T^rr1oV zxf3rN-oofPWy=GnuC2QTQsGAY4`2zTFG2$%xWfBtfIB=Eb*itDVI1y>lcEuM3UN@a zg?ELvB^IG$*%EmkY8A!%fUT5VA|JU1dG5ozpZcomK@G*&rZ|9QUvDDSgI)oc=@gUy z48NsRU4={dMg6>liX@CgOTvKbjZ}wM05fw=ip2|yGzKiv809$%cxhkU^H?rkitcG0 zQ9C9;;Tg4-S_9(A**6FGo_)-IYX3dyD~+-aSbS3O60mqD*AuUoIAVVtY=57cP?jV$ z*=rD~FY`))KDo5up{*4&o__a(lqas%KA-fblw%(s{CwW3^yd?v+I1?WJo=8mr^HV< z_W8lG=aTmPWcb%L7gEBTxk2>*n}e0=-_;b>+2H5;L2#7*Af+0<)|5c!Ieq5K?=_t` z`1gMuYAA19_rzx@zdPG~Xn)x^zjhvE$bj$bl(0Sbvj5*6)bMpfsMw!fS%FY6(*T3c zvK#O(5dVU>LTZeJ3pfyq5r-n4)HJYhI*rmd;l|}+)>a(^f2arAPhE!6VEq*5ue=*9 z;o6GMIp`g4&BH-4wTbm~S~jdu34vcFY^H@eWw4<9Fs4LM<7POFv;-ZV-TYJRok7KCZ*44T zC%CS&2DoPB^~ntradd8N!n^W^B%RqZ>nq}qSBLY};o0jDT|NPMhu&1WZpYiMFPX_% zRYW7uJ$OgZH&sVQBZj_3zKS?1S=bMQ;!#8vY}a91UK3d%`vPgyQKrE5?{u~$kU4u@ zK-KYH5iGKr>}L!@(G?+Ei5N~!syo#3Sc7Q628VkZXtsR|#@;unlhqs41uM2d;tG^E zd&{oyIdv-NQ{p>i9nMN(8TA15A@UU*jwA;SK;c)F8Q23R(LI`RSzMVxtX5Ir_j52L>B9Jw_T<3mUzRx8x{& zE6F07SL#^rJFk>98|pelOqnnq5HM2jai^59wV5GJmU*tPsas-Gs&-dI-z;jL>x#tz zot(BvK(<*k(3vD>T3; zz}}BLp1!cZ{ot_>PpIw`c@J>xy(RFYFZORcGv#xSmo8P#B?NxW+BSt`UooNZskDS5 zBMxfI!x3Yf`TDlPtJ`c>SX1Ne>&8;N0wlksXgF(7CHh(*oKIg`J-PP*TwZ9hPHJ(M z#xKC^ZH_uZI~@VJ$7Vdv{*4o+JT3Qn3&4t{)$2lChgVp1koiWR^7vFfiUoMqx)ovc zh;~7n5k^78CZPyMTl5%+{}ttDX-vgdr>f7q5dakF+~8WLKz_6WV%lQIr_f^m0&Ph* zW?QEbx1`9%Cx{E|!?Txz=)O zwspkaU7a~II@X0{>N{Fa(W;K?t4!gr(Ad?95lqO82I~z^kt4np!CTsf)DQW11r8-F zGAK>;q6K-_ljz$?pvj)6)xu6f;bP2w^Yd`v|JpbqcpM}U3}k&1%8a@wp@^e0dy6)5 z%R|QrBgZK{m=;XV1>@Y=;kNgojbbUP7slQgI$a%56xRR?3UnJ{5NfSL<6B+`uf9U2 z0VZ993o6X#-@$pWo22nuYOMt`?bh7H_QWPA6sX4swt*6-0+6ZG^%!Y z0`77~{svSNYH{I$X(7N8&4QpE^;MCS7^r25*?t%|ZjroQx3NTw^rU{5E*NVu_GCi9 zS#KRvwIp>+W!^0N*`6_#ONdNtk4hw=mO_e_JkrZ3AOGsqwd1wNPoFye>FHeof3ybd z(i8m7SPQOzSe5|eOAO;JitX9_y!Tx}ix*{Om~)kTa)*q#$tQA!K?Ni7<#EXCh{aGq zS!Uc(M8m0K1D|VzEf0Qu#1nId4#TuFYRU5D%Q20^d24-ekyt%x-MH$m!8np*v2B_nKZYy$}TaslZ<_f;3zfh3_be;PuZf0jgN6J-~n_ zUpf@l6rMp#}2(7|ZsDN09;s(@xXh?i1PFziLD3xN18i3nR0o(Sja} zMnXZjP&yR$8H9%;cBGHkaevH?herv^4I@Q~6D6G}1&HrIDM|)W3KXRvQ3@6%qbP-l zQm80}iBh;I4HBgrM9Cyd5u!9$lx`HIA)+)?lp;mxCQ-Usl%hmwm?+&MO1Fwqv?vW1 zr4gb8{4pZb97>}^>2^_y6{XRlG)9!}5T&uA6emhQ5v6!hx>JB}yrxlqyPTqBL8S(nTpll+2=( zDN1uhX|5<`iPGJoG*6V~i&C~I<%m+QDCLRL0#V8rr2qTjUC~Xv_M@8wEqO?hr%0y|iD3yznU6d+B z=`m4qh|(5O+A2zqi_$hxsuU$&l&VBY5T)&+R4qc`ru2j;Jt<1R5~Zg^>DQw48&UeL zC_ODozZ0e3i_#xN=^0UaR+OF-rRPQIkD~M^QF=j?c8b!UMd?LRdP$UC7Nx(4(qBdC z6;b+|DE(cO{!5fz6{Xii=^vu>e?)1QD7`L9Z-~;HqO@C--V&ufqV!Kusu88VqO?zx z_KVWnqVz9OIv`31MX6Sl>O`qtltfWFBuejyQiCWpiqc_GY7(V)Md>|JdS8?zQTjlX zj)+pTD7A=Et0)~6r4L2vBT@QTl#Yo~n(n(P|B}$))(rHmTBTAo% z(pgbDCrY1-(ifuir6|dw)U<9{OpICs)$WUI+Gb65i zX*muc$wkhas6> zyh70i15%?~3AI~P7#3(ex)y%#zc5cqB0nenfr0l+X96{ zE5OQfP$foQb*<9)wnpU}yFI{|=g0x`F7BgL?59+KLsldriiar^#cX8+G$9Qo{%$|< z=507?7CWjxZ*Nw3YXx6-1X58|uMLE}O#!dhT55D)A^PDC$Ds{H&ZjV8QS9UZbuq%^J@E1{>+Y6{t%>%KP*gs z6_){pKd@@%pbMX1VV!~^Lra~cGlnr`Qg!07~nC| zl`WsaM4Oa9-1#Oj45HKsk(4?JF>Hh}AVr1wZw3q`!(lhq+>YdG!H2Wrzk)3g43sZg z_~C?vzl)$n)WkL#VzJW336rTf)S^MFthE0hl200snAFqpNmu*l&^uAEH8y;TMfe8E{`&Pn=kl>n+(G-zUB zd)rgYizvGbP?R-#l$?b>4hvuCF?d#FsI#E``tAEhlo+@mMHRYbdtLCZ+Yx|@Z+jDT z$m2a?$MMR#T|v94@Y&jwdmWO*j5ELnX_za1jGp9siS3}?V{5?c~uo;8zl5*8h_I_S-C;<9rhYDtBgcyHQD z7C5{Z9t9_+iHfO>a8h%Njo%oK+Z1?!UV9INjBA{wt3k(EM_FJ@69*|T2x$i1ELTIl zmkw&AU{&jC``GrMoN8*H(bDUv3*FjT{z3K14jP#hiC)O-F#rGZA?{hyB+ob4-`BI@ z+MBN+Gn_KhL@b` z=YcfP=%IrlbgqLhv~Sh%N0BQuZkumpma3RV#R?ZeTy&-gS4YYs_R&kuMvMxPe3&lb zS#YBH6KeCY+qNCg3Ot+ekXzB5Q*nVt#!NwQ(P=Gr<_lW(SV9^VqjPNMk~e>deM{cl zECloB_dCrW*{#9w2O+n8nOOh89&cuh@`|NbwfX(VOd7FriSEYCDEg3}LmC}d zVTv;geHD%$Z~faw=mg2cPzs@%oD%_s`K<=fqmY5O_Y(?O#V)F;E_#K}-mR5+wfU9m!dI$`0LaT@a+GI( zKb*0+9Rp+%q9uG|Ub`W7N&9q$?iEcktBc-O@Uv^D4C;gsVF~;?|1QWv$XZbsIx~#{ zP~jD%JM5?pg^=T-BUY+4KvxU1Z_Mgm znI6F!wypvT5)#f;zWg9Qs<+ZFZ*IdZ3)apGA>F1OG9r_mPsqC4R$}Qge@H8vG>|}& zelU|zsW`j3uol_s%Wf@;gNlfZ)eu7&8xaU~_Ap;`D3L-#xsw(Qbwwy@gRSzyPZs3M z=+iitd2hrWu;kX7boi+f{Zn0+@|j|aC3_!$rvf!RW$6RI9y;yt`Ql0KoS0oI-z{d3o1M;Y!;|kDyniij9*y=WI$9SJhYTO*aH|}QzkZD8- z(Ck4gf%c?NH|wi^scSHIBqUwk9BQ9AeR7Ebt|YW5)rOmeqI2`+!meFaR8?8Wv>uy2 z*LA_}PO=46e%jkuIn7aajw{pOJtu9eyF7|%vf2fkYn7}ZtA9(y2}7|}79;7Q9!hGZ zMmVlr-(;9^!=@mJfDu}zicS~s9ej^GinuulRV)uJWQUB=IL&IXUBiS`(=&w@gjxB@ z%U>Wwr16DUU~jMLUSnb_;T}Ds=t^0*VCw+t2-vj6MvYAt%C5w9@nu(_buthYB%5H+ z+y2B$pr-^i+Qwj2k^flNi#?&)4M7Q8Ys*7aEY>h+Y~hdTj?8YrGPJFOUlgt2>^cQ? z|DjMgUM6?7k=U1Yz=K~O#b4sr$8;U%b7MeRN0gI#!2ceQ5NsFtk(8mMy7wCN<3MG0V|pxz5GSy&#jhCa`~$f_>=KB64?ULEsx?O4H*uGd`Srvp4N*Q|^TU*Nmb%hsPHwZ-+ z;*O%nte&Uiv&j=CNMJvz>`G_7!FnrXZ-)5-wL}*Xa2~>KZHLTs^58!3Y(Rx7hXKng z*e`;ywboWFvGC|w6T?SBputVhnYz#Y1$)%K%CQkigxRJ*a+*2wsS(+>FRL3 zt|6`wqRGPzySrtlliJG00s-F!d5Al_F9Bu3EFS`Khpt0@3%x8%E>_PBLfSz9iQ;ER zb==-D zYzT+J1xi@9v3iLPp>&6<^21SGD?xb4>y&H(X|8gCQW^HI$rP0Casy@>TW; zpm&kc(B%=19{u`Rd>i%XgX|bqmVF|lvo0IMjzqX(9c7<{ZVF_lAMp7AKB+@jL%~Ip zd!&kA0z`&Q^Af??Pf(c2gk;kgzWyM6kOpydMIB@vBrpz^1z;`~y#Se`fQd?&;zY8I zu+CFei1M-5C!jDZDPfzkG<=S$4=`-hF?eGOAZ)Nxz_11UAhv)_=^kvMn_~F-{n#2( zm7FVSQ<9~t?Zd-ZOsP6dsnS@?B%-SD6WvuniR&^cHRvV@=Vd0#=!bC|K zwK*9sy~*hMid6pJ4we7wM*wEkyUpi}AKQBqtf7vcA!UZjh4HoN_9la?A+Zyi z@un@*huOPVlAR#4Z85ZYLM11Rx#sEY-^Ii9`FD5O0_{yu9%(<*Ln%ur8AZ5Lxa$uJR)jueyq%+}vDCS*R}j zQ2r&B07%DmH8d}NBfo@$FQmp68XZsCA!Kx@kF+t)F_31);OdMK?&L{mjB%=)B-Aw| z`F+gJ%7WR|6IUQxRQBozVWV&;G;tQn@^S>jVvdo{Lzu6+mLfy;bLDKVknB!}6yG5? zmVvhU60B>U49tKTi{qzH7F}_T-$~zywsS7tuKHwY1`SrRcK$nrr{1;jsw=d*@Jh8= zZXbK{mXqcy)hn-Kj*`!x@YrY`LN=OjP$t<1HpyNl!liz3r8lsYBq$#}cnqp+<&bo!f&JD|XUKG&R(u)_(CmRJ zRGmThE`OPi+(4n5AuMC2;fNao8w%6420#uy9! z!Sc%lm`R>f}|A9STv^PaJCxk=nk+2%ArV!qg!YF98T+LN4MVE-e`E9&=4EtCLFlo z+uW_LcPLOT1=>%6_B7i2!aU@H65l5V1_N2>Tb=qXaRQ6nTXagRk*G|W@@e_tqU4s zpElm6OP`(U=r(Tp9AgI4Q?+b2j>VGy0q(y@3!W%{O*ef&$qn{yf)Wt|d&%U-Cg za@V4?`!?W4%GS$Azm(X?Bzya*NI{OL;UILXsdNKg~r zhSr?gS9B1~osDj5IDevYiLUOvkp!gj7HWB6rJ^GFC2SiFegd0i_iEj6pZ4$57=X}n zbo{GubgqxW0UQ12y#{BY7ID#s!x{2-ztAH}D#^#Rio@+fcu-K^em z{x%+L#LmW(C}P+|u_u$!PY&l@bz&a1J0p}K5GuHALFILg*0yki|D((>Y|B>8* zatLsblWFHcAh}N6LuN4vx5{YHN z&1u*yj@a05RCHqAu9z=kzIefsSo=lC63PV(9E=DeV}_p}w{g!t+kU1;UWz?$=uYfv z-Q&K!(6GZCA(VwNPttLxX zJrrLWUKd;euUEOIb=K=(VfObVG57jn)u30+sjmEm-}kj{tb9E1ahB z!SXx;JLtCiJU82jwQP@kV=DT)(Yx_G;^yknF+m3%#dBXl#t-ZSz=6{<(vr{x$ z15UOfYj-G-6Lh$Zm0-g~#6n}`8T*-Owax&`QRsEW+$hi%@VbM@es>&qOXjN7RP4j$ z$-w7@{udtfu4oNz8&o~{IdFxYwu7vJk(_w^+_NXkhMsKeY&2MnCj%RR-A#t$U9PJq+uFx1V~$SORoD{6+3GPTZ+7X&9KV@t z_~&Huqw$zp}pSu~$&rV(s)za8#fD zD4iJ0y(6jix`L`BpTt`cd41`K*YlLEtO8|wupkJ>_73l8v(yC9W}u}e9IwhV0fY7e zi`{9|>?uD*ncE&nwN{DG4}Tip8roTC4atVIrRH9Y$#ME204>rO!C^;k#t6UOf|qGe zQ{5T;7~T*zhF=(Fcs&mlii}6YQZ%M6o+OAP`XxeOw1h~Oh#kX~L{Q9;;)vaoU#LM+ z$>y_H8h4LoP?(9{aYA8$5?BHIVA8Pc8xRXYzlWuk?eFbq*U(b9erUleLqOGVmcB$@ zNj^VFNj}%-QFjJ=^ey}#;wPE29=HH$=Tt)_ddBUESbsThRQgi?Swtl3wq%;|K%%sX zhiVH#-GjEpzaFs5_Qng9gD91MrfgJ3zK!3v2JMciyo;ouax_U4b@;m@-Y_P#SB|Ej zu+z-^Sd8HmLWxJ=w5}}9(+yf-pv-zJn?We2LaXd`h!YD<5mcqR+g;e63p<*T*W0O;7P97Jk#(b z;Q^{dph`@~lYs~Exw%|^I=48T%itF0aQPWreh!yzD=AsI+RCM`x^MN*R^Ip1M^fK{ z%ufRiWF%(Mnn!FuU&&?Px7ud8?|!QdJo=g9lecPPDPvyN>Yv`X`T=g?#&n#+AUy?X1uM$S)|)%Qt6cE#V3a%=yKO%=rab zxj9_UqKveKX>jIbFBXh5Z1<`Q}AgEMiPSo;f`$ZGH@wnVX+(F3bZS zGnbb($J~dTIp&*l<}946c;pmj&o<{P-wT)KnYny3(z3{$k;tXz=458gDK;-zh?JN! zido#b=Cll?)e{QdijRu5&+UV4!v6>xLe0&}E6z#FHY;C!S(}}kmY<<`D4%Hs1?KG8 z^Otgpb76j3I+CU4W>H=SmjSM%n~TA&y!0#&kFxW!iWw0NHA3{|rZ4kcK>@&-={dy- z_{5b?^_x&-o3o2EveM=h7i2B-uq&Z2Zo*_w>_o5FiCkLY!rYA9#X0kH(=w0A7O4_qB=I5r*^Y~||{*>YbPyX<Oj37aS#+UYte@ZwQkaZJrj0oJ#l!eLS0p zto4-$3RnA{%+1Y3wVPi!hiDe(7A~abws=7y2^Ooi3B~K+TLI<+TLI<+TLI< z+CJa`XnPBp7j18_7j18_7j18_7i}M~hxVNO+`_zs;_R$~bWZ)ourF~=;{4pjzJR$| zbLRR$Cin-L;1?t}ceZa30Q`bX@FxU7zaV~uCd~0CG-1v}UqS%*Vp*8xM~DFZg7^|b z5I;hI_!1(3KNkO7FHG~vcA^)rF*NbzwFdCuR3V;}X#l?<-c(r-KcXPy&1)9Khu12^ zkB|?q)gT@gXaL`|5NrF2gMtvCUl3nH2;#+SHIgqOUtTLg{B!Nc>j_@Gp5V`G4d6+c z3h|^&1Na5;rpki&@R~uqd94BbuzQk<+U2b zmyj>7l_37P_T%+LFJ5Ex=quM6z>|0t;z^kX@C)Kil?CzPHG_EbS_AlD@#eJ}#EaJ| z#KQs&;ETnF*A&E;*DAy}N4~sPgZL8i<+T#TKi3{!W9~@3b3xxAdrIHeR1O{(+R`s3 zBlw-bekZcuN$htr`<=pmr*c_2nYqQvw1$Snc4owkrm%gA7}q_p|P>J&XaEiY|$ z*8Hr6ON(b`EiCX%AE9)StufFPOZ&t;Sqq@eB)P1DMY;0}F^MoQT$q)EG-9gL57G}{ zE~aD^q~{mT&ZmV5M55kuX->N8?C0<8t<55)^_5BzO}{{#){GMTs1YpDKTQlcP(c6K zdAWI4t-umUW}%r`S13_x?!%^6t*^OzKAIqS=I zMj>)aOFRgO=~+P@=E4Q!Ah~1F^04-jJKqOH4mHu-?E6Yr7B60miT?aG>%ClaA4I5} z!pyYvg~gLqxd8y*B-Ly+h()7N0BXEc)`=8^3B}ZAdV*r*U~ZPTJJCM?hU7j0Cin-K z;1^(`e}IX80VeqenB*5=vVVZdegUTV2bkg)V5)zBsT2VGPf+;^CU{($mr~JaU5Z6# z0lZ*JutXmWs!Q|o3Qc?lhQwkom=bJ)4+hnxd3l9aF-+)>VWJNP)umvV=p96~cvP2)M|G)qCivq4z=LOk4<6N};!#~Ho{9c=0Px_M=z~Xf zsd!YEiU+-!FMqV|jqzua4<6N};!#~H9<*-0c(mq@;hF4%M|G)qRF{fpia#CzJo%d9 zgGY6#cvP2)XR1FQ06ci6`ruJrDjwCP;+f`;2LKPAX+C&Vmx@Pqsd$q7@c`h#ljMU( zb*Xq%mx?E`pFk7Dg9$DlQS_B*%~wO#U#fk@+E1?i1lw1#6Z?raLA+AtE8Ot(u5FrA zOIbhpPV^CQxO}qdE8?23hOD2EC;CV^Tt3KrprBnQslyd^KeK zYQO}a8UU9MGT$1Y`Krh!_NxH|@zemgypd^6wFYQT4Ozb$Fwv(5z~zI?w+3jw6S?d> zjn(Fy^!d33h52T6!#Fo5r-PEAZeNb_9N}tr|>3?{net|$AG_5|}Ljn>JZ^ppWf(|oue=_v!| zdWt`3PcU!NXv_RbPaTjn&9wWGo;o1uss5xr!MsVM{r9Q0{SFi zphoR`TD5_jHBW=(lK|{A_*U^mPe7jp4A8V;96ulj25j6Act8&HYu>y9`Xpe01`cEY z0TVD_6NkV9CZJy<=M~T=0RuF1m@f>NfB_pi1RgK}{hB(jfd7}aw`*=ANA^B>ySmzs zP|rl@v^&b6vc0un$Xkw|1F5|sutFgx}bjSXmIcVupCz#PNNGNNQhA04&MTH2)x{m||A zcMng{TT4p=(Bro_yZPI@z1|11*cUzT>~5#$!+l)qD4}%pr2c%8<>xu&S9;9Pv+_&R z`(gW3j&O3;+p~)15(Qx{QK04$4d(vI>Hdem?4VhGQvutMZjc+&4R}Mk;P<k-ZxDGPBB_VgXU7 z-M}O2tEQ;NYKnkVQv_%KR8aPyEwdB}P%TN2YDofBOA;)b8A!mpANt)_2fH73kNRm| z;FeHH7u3f5fNn~+J_je!Oe>lxMbU|Bo|e95WUD2#>j`s3wpu;L4fj|a6MvBr?8Dpc zDHO(w9^yvCpAV1O1^CXy6Z*#?*Q@SZ{5xfC(ucU?@aI~o_J>ePj*PL?_VM8%9)=Fv z{P;d>@4aptX6&`)iDr+Zakz%+1`ymZ_quNn`XBn>p?`W1a-DSh@R&WEN=;oEUhxvm zUpv)T5Mf_qkK-GryAQ{wa>k9|Hf7EWX%S|g76IpJCG@iFlT>4whEr>3MVa=jA?>Gz zwC4?JFB;O?jU9b>dt+?Dl?1FA}Cd^!nZY+cHC7KN*XNDG@=Nkww9^BiNWHA_vc^vLct- zs};dIozJC;%9L19nG!21Q({H96_pjabY88fGgncW5-TcGVnt<2tY|B*$ffXVMO$+f zl_{~JG9^}2rfjv|9_|0-EhjI!2X9$?vKRJf@2d$|95Er1r;iSd(;AW0RTAU;*O{8~ zJO>97UcK$bgAY2NP`)x4N^o~k~_A#FKW`PCqG+c|8p4{}RCs$AE$xGcYi(ol%PCMPcPCFvo=*y*3vGkX_xi1%Zl1%P3^L(c3D@utc)WVv5HPvTc@n8 zQ`XigYwMJ?b;{a0Wo@0ZwoX}Fr>t$OtZhra&qkv8R&wwC{-G$=sV2TXdt&}w<*O*Z zf7}O`NAH+tNNcUV(_Iv|@hv-z)3S3aY%P(ZdQke&&Z+#7c;vTyzAIB?`?!0s+uN25 zE*Biv`lck?SQ+&gb3~lAmq1%iR>z0k{UZ)#ygr1xw(yM#ossN|th@h?IedIzZaV&u zeef-X+@O|1zt(y+L?2CR6uh!%d@>&_ZC!SHzZj761CYWC7*v;H zHob%n^3D`Bf&9AIdHIv31z-A>Esx1rQ}b> z(iD&H^KAouMB_HwRI^6BUdN^xmN4W(36$fZ=t=|5n+&I~S%N~mZKDcmvc-w>COJ5M2 z`_iX)fG^^+T^`th9dr*448d?s-ydsR>2xEvJ(LS^byq_YQ5<$pPUzeI4kL!z!Tj!6 zyiU*wzK)a{4-B4abD?cVJTpj(v=tY05x4MUzbJ^~9CYIkN4u{Xzkt;hTL-KtG(isy2;L`w|z{Fe+@DS%Ax-0@qx1j`Xsl`plpD3 z?^HhP8(CZv0(MUTjpuxiPVR6>>aS31J;hIya*#5tl4vPuFv?QvB*#rZ>|K1C*-^`e z9Nux-Jy$#;MYN}pDACf8d!;kyYPUH1xolu*55A9H>9Tpv+(H}=uf7xa;j3;XzFl|G_Q zU!jkHTD6b4oHW-*^y!U#^z;RNmydm#y)!bfzD+$$w6WeSf9z1;k9{9Kr56@S@1Lofq@BpY)@laZS8^#(VaAO}m zeL)}jxUi2eR_P;l<`wz~s8#z|nwcB=hz+>8li|aHUh3<@Zt`)3HHKWPbX34r?J0Se zi9`!!qUA!-QmIIX5bu;5v2(A~Rq5SUTu?L9dDEya5{={z3r#N?)n&pFMOW$SYT}WA zt=!e60umPV1q8fQL{hQE1iX@v1c;SJ^&VmpAeRyFB0&iw{<2YBCMr>Ml~G+ySQ4<6 zM|G*VB!A{c-WxtFBH(2b6Gd0)>S{8RfUVrsn$*>r`U*1Qr_NBNk}~qGMAIZ5=#DAD~%0fu5`Y&w9+L@s+GntF;_b0Nmja?<+ajS8|F&q z(;N+!JS(cXNJJ@eAcc&&D^VLS2U~P|``g`vG&w9aQP3MaCJs=ec6*98WlGubERAe} zQrFx-i>B5Q2^{s~8=%p}Zohf05%U-GCD=dOF^?Mt5rtcqgOcxd4_bAYp)y-M%O+DM zHlwXs(8pWBZCudCYx)1Ymj1;I_;22)N7F{_sA1kgz?gebO1C#cE$w0;_r8R7qv|>c z@Kk7r+V=PMiGbxrV_Mn#{i~0Y>`hKc=Czh^{Gmj$^ka-k!dk+9`0(bhbkX{28N1s| z_+FU5t{G#-N;k`An1OXdv~aqM7ECF7QfV^wyxG!hh}_?a16xmzgKXK$1_$k-L88N( z9}H0{9Q%^+Xk<`Djic-2^!4FR8jtNaN3Y%TqShHqSNjD{BjzBg5gU2!yoJ-pFc&3? zS15y+M_>lV9>g7t)S|!5!SQR+I-JZpoH|sdtHUWdj0-5&fPpwr+_$l_r-X2O6V}m% zmx;S4N($VTD(M(XOB&X*+GP`S#cK5%EvS5o9En67KSqDs4oX~xx|X5}Ye}*iq$E4| zYhAA|7%P}Rb}F~qz&_(hqH2=R585_`KCMVWKmgOqgKf5ZH%m7<6mfhWN6u{e;3 zpY!Y?k+6C1!iOxiHbfzBmMTO!)I9Mm-dMYTsaK?=JeP1>O~PthOF0OjyuInTuySQd zp{%O%o#mlIMq>wt_eC5qj9bPRlG)Ad;6TSbn)Dl3R z)v=(gdE-Ne>d7StP0i4)?YGDswN6=D)_B3Irva>C2ytV22ePZ zEv^U8vc(^9CrhEd?RmhcB6O!^OLQ(_x z5(5c5u63c`aQvughLbg=mQBg?maWNC%LXYm3NAIkDY*(c5MZ?tA+a%MwFwY=tsbRR z3#K(C%NfK>CJxgiAwVLX1j+gURntr8mah4xt^F^JrD|WxvRa+8hT3b{H+wBd6=6JU zd}ZpCgW51haFR@vo=rFWBp1&PIZQSc!ttUxy=--*VR&fe`Hkkw_E-nY9633a-8P4o z)5wXyK*0|ioa57<3%oDh?-wrlZtoViSF_u5Mf?7Ed%?%!?V@)xxVfDbe_NmZeXaHA z(W4oWtBc-tasGL5aWNvy_QPU28Vvb0yPjOlMr%3r?aA%M@al(~;;SNumt~5x@4WtP z^V|An=iA@^vsO_-`mfaX=Hx^7?Jv83T>^1%d-J*YGWxz6K;nXXn_H)$wcew_^!#)2 zaWYlE_B-3fU^t{ZblMuIrhu@BvF(96^l5ZcRDysPCxcI;;<@1nG<}@hf~PUTyuX3F z@!ua7XNJXb4Om3bN3yE=uVXqixJpf!e6&`m4TgL*m5}2_Z|7w5hgod&(BhVRb&Fb1 z?S$$rt|m8yRebY#q{_!v0d6I)#~}}Wd7!cRu~6W53ZIRNKfNrDZZG#|H($q|aaMSq z3XJ`$^9ixp&u@y!$B#2`Hyi(R6f&w>P$~R94?)ihqPS1LTThI*XxrZV;@xOE8&9qv zwNK+2k?CVk6O~!skJHIzks}2B55YeGg*d&$f^)fwuaoJQ(Xdi+BJ@=6tnxh)e*SrF zSCR7zM=Qf5qUt(P{ak23H#du$33R@<_n)-YLev-IS+TQOJlNYS#vg5HzFbYdUj117 zy=biw`CS0Zw%7z>_KY9vR|L8-2a&J80sz`!s!TSnC)c+ZgM2EkwX())CK=8C?2TLo zZ+0`8W>flc!~<=0*0OY>be^==xF;Y|p-AE~kEvf=YdTr3qtVxW)>_JPSDv+X!0;0zN3l8O0d~l_1+Z23E4DHRCEBD4~pLg7i0Ls zCA|x+SS_nT-9J7lx~GStl;L=$`wbvf>q_GnZ^>XxHf#UIXfQ2IeN_an=GcVgd1`O~ z^V`U1+hNUEAyQ`&qy@QZupk;n{(3sO9!)Qp@Yb2V1f>3X?bT#*b1)fjMFNZ~jBd$` zF8NTfa$S5c1aNQzw-{XfF9%yfwIz(TZI25an9DX^sml0qpL-(e-{6(w*=J_R_-4#F z{?jUeqiOxB=QTL;1GHL%|7%`~^)O<2Yi{7ZTt0DpRlH)2=#MYO+SdBw$=v;*{fp}2iwmPJxbWyIP{Z2W*{HZ2UEP8Kb-!poSBb0m`r?I}@^So)RDgnc zsOWNG<97}2qSiyvm)AERz7EDWA6Py=3@4N6+34cpVX+gQikD2d=S;Y@H{+WkaK&;e z6*=}-=fTkf!RSYh~_rDj6=J+=VQB4x|KU}hgi;H};!G#QNK<(s~HR$|YH-!uX zWy}?LtO50L^RkW~taX5@l=b7|_>-@RpCNWJ2xFBZ z)F7d2rak%g(4ZV3m?KA$6xX`qM%U4hFnm~C-Cmx-K>a1kx@F$I#0zUx*ITBpW-as2 znk3`d>~{3QKYidr8{-hn7I3d__+T%d5|wNv)Ec=h$WF(ZLJkc`|=mxTwa3KqPWP4C!QZxNdr}r0>^m^BCBpW>Giz{bWU()PpRGt0{9ZvXA+(Z&XiQq}xv#hp?6(NFD%MQ?P? zvj4E?Y@$3^JAj-Z!11}syFP1fT{bG--i$BCH;})2@aMtLXXih&8~ORu=kb64{N>{3 z%b%~VfBwgGcJuS?Z$E$i_Whrm9Q;~)GrG7g-fCrCgPJB^gvX27_!d~ceZ86#kT2I{ zUERz`K}tbH1iNf&$J)mDLS4*Qo|!rfyLQ(_u`%+$?TzqQubRM;DV%4{hEJM`yR65~%NGEBvW@HTw$F z{EkFVY5qK>oBy~S%{2Y#=I055SGJWSM*?=W02mNff^{`Xp#Iw!`QILjo&Q~6*;!xQ zf|vikok7GbBWz5dVsZN)^!o>Pl-tk*e30MWUWu)5^;SU}EXRnF><=Y*rs)R@FZ|{& z(k|4oHQf_;eKGi6=^A* zIjoi|ik;ibYisj)DF>9<$8*^OY*7QV?1o+Ir!xClJ$vu-n=;s*i$ zfi~08;mqgd52`AqiS%~A4Yb*x{k+zGqzM#pnaCsd8IHrMV@s*4%B+#?pJOW`twO2o zVq*+tu65=hmgS|^6*&mYgGLWE=L?5+bIz*V=sy-~;DkGD!0*#*xtGN4FpL{)nEYg}X(}Lwzwm zpR#ZpyFr_M^K~@3TG;Bg@ssxE<|a7bu_=~83#H*C;yUfl^TlnU6UG=vDEpZ-%$c(Z z^VPc`j%KhX4oLhqrlb~JMW-|V$_=J+<${1WK z|IdZxuL^ETwOPCnM(gOfzl(UVk3csy^&M?YGaK!E;Bya!jiv#Pn3#q2OlZ2%ZesND zBhoZ$dfp4h_`cUvJkiOXawL`VF&9To^$(b!5s z8bmfML9Da6c_|_I=Ce95KtdE}=EDnLoY2KtTWa*5nzCrIIv3=JFA8`=hvkNC{rWH} z-qXf4O5uq2#z~v-io*O*qN7Vk$XH)lP!YE-k(gb~nwi$or;o2JNyT4uQQJ>uVE^Xx zbcCi2>F|oBV1^`tO>R`oZm+K|5V_V`pC*%G>*INAc0L=oW`o&WV@+gTX9l-?3D7%p zRqFdBziMV7nU?j(?W_@>k7Wj;Of^717g`@QIkY}JEPiPJz^@L!NcsUrtWVGZJ170( z1%52t&b76U*h?3J#D@&W%;e&MiFskCh16X|vnU})vQdMtddL?jGlLLR%QoNhIB^)` z5_MrRE$X#(G%#!LJj<6l?^HNnNxi?nji)!a^wBlph<|r=Z>=?GWjikRtndPMXP<;J z+Z`hEunWIH4!kh62Lcq*G71}RJGQoow&LzWyEgXcyVEI+9?x1E-(-;#!Cj8O0m-bW z8z0#YUcne3nho~2+UvXSXB>1tsavSkwFBPxMgEiXq#v)ayF%q2t^<3SBXN7 zCeS?AWbu)-GV8_10zH9oQ9&q;Zc88X4z=}U`nV72KRzA(rjJr?+T&i-KG>UE z96FMi);HSEX#9Hl0&3HypRXO;imY#Lg&m(X@>Z|3gWP$mQxy!y#w7?e68?0>9(!0k zU{TWYMz68Z!77y#3*uFVZ)Z}jOghMdQk!wWP- z+E-;G?Frr4Y;<|XJdZj0Xho#e6=!O-i`QqZj($DSuP82*>`coH1Q^#VsR@J8wKzz^ zv@u`kjFB`o7r9xcjTV`%F@J^m4}ARty2hofuaS}i18F(aNUcl^X>l9-aZ`gm8xN9y zxuLPj#%4zBH7$N7Lk$7|3Z+Crb4p0t==f+5S-@RL=*s;dP%gC0_f2XWzsPk(BCX(7Y3qHH!W&8a!y6oXHL z@s)7#t+oFA8~?ZPxEZbwU$TVCr6oL#Z_>kTefYD#9OJQMTO>R(oK!Gn;Tz&?0%k07z^*IMf@r*ef;k*Br;l~zzI zRP=|^2Q*@?F0?J(1wy<7H!szhGDoHHLz_G%eLaRJ>}^BZ)UIyvqYezs$~(tV{8d%XKj`uHKclqMtDz4cylEH{44`p^te#*^!SkEpUP5Y;&T#{ zI@cK>SSy}y3Ki)?yWo_DC9BsdxufJCJiq#wK5S(l)XntaN%ld#NFSbNAJqQz;aT=U zJxCvZ%05(j@jUyW5l$sulpoq6yY!*GnZ7tlKvrQvcRh8qGKs&?T`RrqE54*BD9AL^ z#e=4`?_sgKyK@2^+^?7lXb?g@Zss(99Vw|}m1NS8Tk-!&-1I$jQi@e2kTK zj0KJd>{T$qodd0-ahET7mdW`Y10(lavS>_C&F9S3`Xm_^%r&mN-Q`_Fbuy8y52sWp zS7uCe5139a)>>Pt_SI+rg(D2|u1e$k$B!f!hYKUw+dDC*4XWN!)w{;8t|nI-zfEw% z)Q)yA99&CtE_X_5BcmDw!C_5`wcku87XqO#r?7O~?;On-V{mp&yKqM=8Px}53$rl2 zdDUg%3chj&7)0sMbS(65X#lsa>ko{R{#Y!@EDGE+U6nlSWOO;FA@b7Q(tw3ev7%u# zk)L4*Uu!)PnqrG?ricU|tl3$$+%ZM*zsC#9U z;FG!(8;BLYM~IR@0PqHTYmOYm@_k{awN(vup&&R zOoV4f2+_!D9M-l7e6ck$@m))0yNan-g#Sz^Tg803*80iVRjeY+-mozKWRoL)vnIMf zzrGi^`BPjN>=}CTd6qL#FwCyCp4-?2X$;NsN6GIb3#egJ3kC`RPc=9(Gn5uK@#Ig~ zSAKmli%bSz4ZHq~YwcVW=}V~Pg*QpcS~<3E@4P~6boivb-rqgo-3C;LNnUeWXs=I- z4WXrUKOFt46dO0C>>l)xV$I!xWT$f|M|_fweR&A4Mu^~_xw=TyeW8(aRv$9uH7KTM z1~AprJ3Psf%X-v9ujozpbf>UwW~Gjp0dY?{J$QzhXPWnQmL<4KF35460V(%qK-Y&* zw304|mso4srxi*Kxl^K0WjoA=Og`VlNB3ag#p5H4tTcLj{rGErJAZ82I4MeIU&gqA zv120ZI{1#eJqHPYWut661DhX>LXT|*r0|lD!MUrwheMnGH37+LAxLdB<^x*fw0haz z@!@V(ShTl8-%%_yw5*{vk>(u*YE_7&5FpT!OPjx>Tfx78E{WV$?~>4QFqvHM?|^;V zy#zT>y2l{RGB&&T2Tf)u(f85Kd_=j5GC^xDVptGAL(M&T^*3PyUNEq&FBvtdKDKM{7&avMk6i?iG6ZU}U(e7TCh%{kj+{v zWyG%r$#?O)iKBF1^}p9qwpX@(qoW@T!{aswPzJ1i5?skC^3>P(E{d~~R_1Xn zx5&%B#_XaVTght~MIw^ndLxe7#mvs>sB3$`a*aP9uC`Y9E4K7s&9b@vEZaO*zpxFtJ_$#6G!(WniqH9Xsnk-skz$f2NxlzwRb4lAsZgspAllEcwh@w znllpYWJR7#e~cAtWcKCXtg{ot+w+?Zx18c%sWl*Ovk**fY{OtXw;cqn!j25wnnDBQ z_@EhLPzS`}vAxgE6ytj-vqw>yy@~MFpN`ocN~2PA5t6>+D^R@GslhmaAzu=dlJK7a zDhF4dp@>>WDhygDk+`j-l~1DSccZCPLeOBfm~iVfXEURCpmibD?7c>YwcS;um()U0 zblR14gyHJ0WI;wvhQJL#edjU1wo3U>%=aU%rngh^x*eU@*c*>7hU%n=x=HwT$9pF| z+u!Y9{kL@6mm>sZ7ZTazILfXE<7w@KFeX83Hu-pC$IVda7{YE$gkC0t3nW$Pguk-)LZxO1OW$sX3~xevY& zz#mzO>hRR-zudAHuYW7{A0LZOwJyBX60|sr2q7Y5SY;eRsVbuautXREKg;sj1lWew zGE^Du2k|GO&-5H&_JsjMAUB0xBzaf$g^zLz;e)#T&gev2Ojm@ROAn3eJkUGaoa;y* zO?lMgFbZkGGY%o8I(v4FQk2!I1NcOv6xv)Fi)Y#YnQLz{?7W~o}{vzS;G;aygEd_^zgmWF_i zW%+!9YBMRF2p0I7X5{yFd|O8hQ5_oN$(Hk^XmT4C#-hx~!xH(s%9*W*!h1pg*4hs? zDReof*t$O9)GtRGS*zUnh3(nfD|2IReS7}QY$z==(zJ-==dT8XBk_uNfD=a)A7tT- z;FHO#0vI7Bo}x(yg<#{rP!s?hH|0ss`gkr!XH#;W56}#2_C~<&2~$X!8%`QIfUncZ zm0W+A#{s{eaj>vuw=5#VnjQ0o@drFC%N6rLRTAh{sWeG8S(%1fmu8FA9&zr>p5L(Y zkESd>BF2xBRjT6^3nX28IFnJs{aZWPWQVNA>b-zmjK7R@(uuWnz;OqZ(&zx>Xfrc$ z4GF14eI0yt03_GROlJe(#|A3HkvY5wA?{&Qjzi<;*s)%6M+n=219qyb6F?~B$EE!+ zB)(E(v$e*=4lYk+YZ6ubj~5l{2geazq z=Lcz~OhGFKI7eA z)*92i^soJufn$F_{0qho2hr%9WpRnJ-f>uN{OR*erA4$L_Rocll{#lxD{v}dS5nU` z-|y^JY*vzfR%%(yy+Y$+*5BE_9>=ZC@@{LxoCAwPMTGXV&S{L1E!aXprcPerb81Wd z^S%iT=86x0zI6fdp_DUdnMBhauIrkF=vUW;F=V@ zx$%wcGa4aPJ8jvt&pG=W3-;Y^xk920^M`klF_?Mgp5yy)^T3@fmnBI)= z@O((l?Yr?=Zn1-c6VQxJaAy#d;xi_N9F)}1EU~ida=6pca?P6HZVUqwd_Ev7hCzvWi0l5zEinIQ?wwg`ehjNKxjaVLDA~zK1pO z07n*%fi7KY{V+PQMT%CQN;!J;j>|3uIWB(Y0Xh>8-h62v9~SMGfuUDcicQuZO^j+m z8#|M@tR)t)AWD_Ynj7kr(=W{FXQrM-GpdCKv#=KDrth+5up+5_P2s^DabY4uMee=I zAbD|NQB`eNeNCh20Ib*wD7Q&w4U;o=t=X<0Mi8^ea(Lq3)%bGYf@;~j44ZNt*vzIp zay`NYe^kK32GE}grj5RWp=n$G? zNderlhZ}_Iwhc(OY|?pVQ%_S5-X z3Oi;@%#LPy1qYL_{mC09plZwO{igL~6U!W?iPlrR|2A8}_I~*4F?++} z{}hLPd$5I8&a&s0M4=Cepemm-8FH{fKS`Z>ady8d&m4V++;r#!{ z|EzE6V3+?c|5l$omPE+IAND@!?CgX-HQuPh5F~$5ATTz(DR45J3lO*i1hd; z5`?lgUm9lSaU9)4SaK{(EOVM2Upx*FCZ$jmM^R(AU=rHUJ0|awTL@n@e>pC9mI&i! z`Ly)T_dWD34(y!}Lw=3_oq78b+2old(VI0DJ}8!-AM7!a$FxYWT2%k$`(a`as}Mzz ztE#ENi>s0-ZtbW0Yq|9yc#2uO(J)|D6t~qAXB*;{KxQZjimG|7Wljb0+?MxJt}hz( zbTGB^(jm`d)Jj{2t400r?n^tq`{X63cSV>l+naibj)%5Vz|8Lf#wQcv!_qD8rI9kqDeMTjSC8f`FTkENzEHrj7%r^0t}1@>|AQ|WUZCdjI9-G>f;)y zL?3`lo)%#HIUHY|%5_40_lJ@X6oGw{@x&HEM75!I6&e;E;xeGaNt>-_{M+JR`_a=D z8BO}bNUmD^cl>K_`X&8ADc#XFLo|d>d_NQINNSSn)OyRh+Cmh%=p|?!N7SzY+kQ!F z!*k~)tq;%jb?lzSw_XYxzaQ3I^*%1YyY=@gzP$B!!>YGF5z{@!D--iq8(om8JUrG`1I7s%S0 zi9uUyu=T#xnJ*iySXx3YaJ=FYbI@K|%P11L53$QTX7mC|+x3M|yxOS{e@0FXR|lR`YX?2sg8V^FT8k<0}4$^SsM&@-JoBMW|!V5cGpw_Q<8BNx2Xt_G6zSsuPL z7ZGlJ$h}Bzz>{)CQ_R4aIS)Swf}iXfa6sCmlWis%XR1p`FcEon3f^m9r+ua1-_1=N z{%|z2fZ!s4gf8>_#CpX{tZ@2D%VNneYga8?vi0gzTtG&ki($KGA&_?eLc+j*1RkW) z%Lp$gBgspN9Ys0!_19>~_{e{6psu=9#1U zT~+cdIQYga*FpUp5_2}@`aWH?(G#SDUsBh^3~cddVm3){L3$=(g4P5>Gs$zoZ1)>@-@0U9uiV0V`UUvmUO-9T!cPe3dJW*BN+ZyS4dMNyG_7y1)|{ZDaA${vY{k z27AS(?*yKnmDFh9Qi}f%gBc~$?7OO6t;-F~qAb=>&Y~??sF@@-%8NhyS`-HhQc_Rv zSbt(}Uw@VsXc!O^67#_XLDU;g>&}nDYHfXDHp0&bvjDj7t zSvW{{F%jyT6XNR(fM{o>;2M~D>uYO;qJ@a{aBywR4W?T;_8ho#A*Y5avkP^wGQ^`3 zA5i#v<4I5<*=E$<_t0ix65vyr`l9gZI6`)iL*K(*$J0MrrRkYqbCU0tF{&<$>pDofj1fBy5ITY4^k zTIsRc_Kl4{@uixU-c92lM^gX<8wa8g@}Y=yVKSMM3`&J64H3Rd-ijQ3-&MFZK?y&O zwDqUqK9US!Y7RuZN^ZL;#v?_Ep|EMedi}{LSaUA=i(Z@6PK$PoD;1*inA}p$We)k0 zLvYPFJ!H;owplqkvSHBTBT@31ejRA6Wm=0ootZ@5uJ03!(1-EC4ASJb$ zoWy43t9yau9qy|=%H<8iocN{EzqefW9OJ(>;VYQ@uKWTYb`)iH)9&4v{zyJwsOEeS zYBSN_37y&LSl~F2H+F_9pNiQ#%hB>RR zP7HnyI7ZTIn1`bnR!ft9(KM`NVivNrvm*|Z+k<^|yTDQ#-+n9BB z7i+E0t?7B|>v?O~`g+xx4qH?G=26%B$wnfJlR0aGskL{O;=LbhtNceztjX1%ia+XD zfuyAHh?vBMZ+|NOW*>sM`X{^h-isgy*b-h4DI5{t4Z{W-@eo2f$>8Up0roeMHQsU-BsjHiIR}kF$F2E#=;!k{JhU;`ZLkFa|r} zYIe{8Yw`k53_OzlBJj3f@VtHw1L&3hWepD%c_fV!xGqg9%f~WtpQ2r4 zj4y{ONX})x-a}O7W=yen!?@d4Omwh5e60VaN6si$M??r8970jazR8wA@!i*2vTmd^ z8azMYWph*PK$$A_v9zvlxMCKr!B%k;Zp`uy#W z$99;DdGhn$|6cr&`E@(`laS}>hU`YXVP>>@s^}WsRRbLb`Jp(7l-XnAyaD#1%Wz*o zhK_0=7FV&sK7Xlx%lC6jvxq+9=C#~L#Z!0CWeB)n`Sgo(P_`p}WE&n|p_ZJ1q7xE9 zOw@N(XOkJu0h&KOr2mPGTWRqfr_?BKv9~y~ zKzr|5(n6YfNp7@h=~f#yYwhB}Uq?6NALDzcc<^d+#u@gMvQ<3To}5hwDS;xtwmUzz zu(a6SIC0f)g(I#>3}|_OZAbh&&hC{1c?Vi-=Ux#%2B^F4CSQeb^gX~*3NF1?lL{c0 z{;ZR(ppXbEt`mQZmy|Lg$=dAuALg6$$mNnR3unb>TPhr^%_}+>OU^aImh}Lcg=M;& zsF>RDE4jUL|6g`tP&te6i%$R&=txbWheE1MhjFpH5w`K1^}T79h}vb<;A&^pIO zOS))n-@{C5ie^VgRnVr4iMPfXVD;El8Luqcy*O(LYT4mZY5?ON8-aa)Xr51G;y7?E zGuwTgwqu;ple#xCtx}YPcyXW1497Apoe{4#^fCz=A-9-P`nSFg zoLB|hpiseGMteA_2FE>M4So5V>6Udxcr~X3cAApe#JX&a)j8Tv$Z}lS z5+Ys3=sb^g2*!g`>OS_n3$78-@s{uaDPkokvsUV8f^=UtHAlm{8qE@?z9lCKl)t~> zgUN823=|GMl&7s-H$+SpbVDWWo+*$mCm$dzT=SjapV>yNToNLo>b$*pmgn1i*^^p{ zi);oL5{`U6RvagFD7@VPXgpGuL*ZbFC}8 zlmS+^s?%PQy-&?K2o@bNwn;6R@y?7v76z_r{ZA$ggu{aZtRt@Sf3q#>~ZWC#B)5> zZjKy^W7_siG~rlF4sMmjwq%}-2y_MeUFfpjU7TI1b9FGb35Rpu3;%|p0MHQR&xw0} zbFPSOg9AdU;k(CZn$5U_LwL~8Wgp{0yk@Pja85C+rNr-&@j`Ggvw+XzPR%S>{K}Ta9 z(nzF4c(ejKVh&}^X#Vng;TJ_zYcBH(Uu^GqzoAoZ^bpLcIpNKqc^vTvWwswnVNODS zCR^%t?q?NEJP{za^Ruu25oG9Uvc0)*jav3i>$ zI~N19f700T*g{9Z(Q)tYTv)Q~=H$gabzr&;Xf#}m5X+@)AWJajf~7-K=K{!QwT60~ zB2emNB?|sNGIyPeByi$lYi(MK_@0HEvD}(z$iyBLALm&G%5S|VuDGOa?YCtL5o`ob zc9(4awUbd0OSA$ZL03h%6)sL=O$rZpeKl`!(MPZ&uepB@akD?a(FG(h9Okul3bDjuVaLvW^qZSuk*y;L zt-WXpq=3iZBt;23LMhh6%1C=8pn-4GFdO1t{?`b>TB7(dH<9W%)Cp!Lg`v`o&nhc# zt{*EBdIt&JO&Xal;jG4<-+(7S9#L8}@F!>9$InAO|Tv+RZ zQ_!OYTLZ&tLab3eJHn(d(yGwdXjj8!l5bVDL}RoPc&H_ir-cipbBy(0#09@x?N42H z%QL|y@nqoc+|Y?Kvqdp&pwT(vXmwF$Tykd+)6X^}m_@Z@DVEW1+^z8bbicn_92_6L ze$d|hk!wqI)Z7!_9&I0=p6+hJrRiJ|IYhUQtpX~l5^?^j3lJ3#I|bpC3+gYdg$O%QYm zc&+8FOFhtS#0{iuw-hI$Ls!ue#Rq z6+kV$hrY}t*#;Hbdrg_KgpjtR}A$#NwVt3*TJ^0iK zikW`UU^%)GsMe5~znYZFP}hLXZ5m~Su%(`L33}6{)F1w}>O}(|Yk5Ou-wzEF$4srP zg?Lm;Q_mdD+2v2ERN#EEZ>yCkg`sd)ZCROG7wu}M%Sbgfv@fGGTT2!ZF0N1NU;;t!U+pvJ-HbgGy7#P?yb2BG0lf?wkqbb7G&XJQsvp)fJ5r{&WXt zi4~Z%UuhP+gzByLI&?wz$v`_{_FY2G^P2Utly?^tSf-6tOkD=}%7V?)LKP%qI7TrwYd|vBExrxRa)#xT{)@xq#8-=xq5>hhUL2aDFEMsNEJSu%X z6P3etlYLbjk?RlQ5f%3VjJEd7VepFKsCjm1ue!)-&~~-5NL%k-c6;0V``UQD8eegJ zttPVHGt5ku4TKh1Ovaa*y4u$m>RdCNQTs6!9X#Lg`2Qb zrUyHx`|ox??7jc6bNv43;JCY^xSxC7eJ-g@nX;P^?h8y3)J)3j^>4sE>Gpb(xThL` zA2=ZVLtLoMkbxE@U7%XxKV1)@SOSdJ#BX8MlN9Y0-|FBa6K=zciyFH)cah=dN%_S* zip#8Rxue@7X2I;rJYT1ygG{jNy2g~^@4Kf*`$w;TE~F@k)!+e9g)tp{(q1o}ckqbu z+UF`ZcsQBrTPP1)pP$9>U_)p=K0)ANKCLs)_$>~a-~8a0mnGnh@4H08Z#Z4rxyUGB;Z$L6fIj^b-K|BB0k`k9qe%@yrY z=-E1uD*q>KXjT|Mkr2gxWKQCP95R$_QUKicviSCGqxwHWm^S@la3OFuEUu?}T4vIQ z;{S+X$VX<>5U;-!=a`t5otmeg8G@m@($lZ3ou(b?+Id3$>qa0R zf(Jm}#zNQam>)llI~LPSInOC3{{y?8ekhE69?PORvHNzu4lt9X#!EcIqo8y_)N)#B zmlT>LBnQOGvZgg_IcCakt%ewuk{m03dqG}*36PG<|H$uHDDfYSv*xjaI=md4>5iy$yIXnZ2g5H((9{;tvtNjDIi7LWS%VPH_XUcItqyBs5K(O8Oahn{ ze_Ws8LoK%f=6>pc%Lc-zXiIrCb-b={?|>R%^nrqpNnsOid}HE7HDk!c;V|w$w^}_H z*p+@h-OuqbsB}$*Ti$}C*XH#UmCwn$RWty$?Pc zq1+3xO%VQ#7;Z$>azbvz7KtX|Wn#i=*lHGAOrCL)OcNppy#$3z0hR=tLHjqNvlJ>b z_;bS6GBQow&17Xw#T@HBG$GEc?S89a*fwfmw?jsiZKE-DzXvP-jG4H%+bhzR@NkTW zpt)~EC~ng6`|}p%%{G#ykG`$JilwTnnYePDH9$5|EIc>t20yZ1G*|30OX`JsZ43y)0 zyuDCMc#=@Hz|To0joLrYm0d9=hqAfEunkUM>Y-iC^cjSi)Ch!3$dFW>Wsnij^ttjn zXq8XM44lj-iM_o2bu7t@sY}C$Er?&&e-AmUk{*Y46ZO#a#jYdvYqn9x69+sVb>8n4 z58NkMb)u(4W&xW&w)PKqD_;)Bvdjq4yWze#$A&WvF|rUB2X z>AWzm5~S0zvs=Qe zN>y_3FcS{X@I-K9t_M%R-|~WFrltI%ve`po8WmlX=SE2u=HQp!(guh#9<3p+*=)&% zEu>q8Cyz&uu$_cvNE2(#19$$PT5>%dGc?%fylzsmsLQx=kq}5oSxxa%t9Zuo2@Y6r`hr6moaJa0nnV>>sa&fa(5rr7<>F1V*08dgo|Mmo+eh0U8x zlj@Dm=X97N8gvw5QY}J{fpxUR0qrP;-3JW6flK3=^-ob-q>&V5q2+uAvI=1rVitOr z8dN7qbv=DN8(rW)VX=uY!O#1*`cz`GVzIyy*&OYwcJqoa85D0O{6X=yu+t zJebM(C#=OmnM9^O8n=MFFgN8uXihSWGt$bXlv7Mp$)j^%M22NK${LDgWU6G$ z4sbt^jtWFc5P~O$GN|1|Q)nVC$KPl~I)s_B@DPD!@OnG2xvPyHe+#KQ4ZT%5l#7-C zCx=e9&Zf}0AZC;hxS$w<_v9;0VRc74VmzD`y;4?I?pkFQr!G{5&DYe3>LN(=Z0Xt+L&hGVv7NZIP5Q(+*5)YnCP<+85mG3l>0K=dLpn zOY%BjLD(qs_l*bw!$2Q*altVqQ?iPZwQ9`QOoudS$Xmyf#08bJ2vBMyS-V=SE)iO+ z(M%C*bUG@=jjwKl^gCyBR)fkn1g8p!GYBza)PK@C?pGD(vviYMqJUvDAqX3F^eeYf zeV(a;bb|uo!?5`bvRYJ*_WL}O(2`kK&79d~_k{cn3MAQhZ-04J>8)%J=B-x|(*$|R zg-`OQHPo8pEZlL(4M1?`uv7%j<9O1>y&06b7igOd^_$cXCP0un?}(xS0|fsI}fjZrUso3S)ce661H-%pTXVe32*m+nZ7sas;7r<$e;d)TEFz$P@(Di7o=C|{RZr%EXFw20mR1cBmw!KCr9% zVy2}H(`8m^!3 z6-qLi%z%MK&I@O2ttu@${(fpyBV`Pvf}@gLQsp(2f@=|CG{~fE#+AlH+&lfq2kue$ zbrL!Y5ynGyB5Zpi5Bj;!1>+gzY$%}2vRlUYkNUf>PrLoyoe!qxIv-pQ&iovDXgtbF zn!A_$u_O!Xc$|(7JmU+?wR1SzqW_a6i^NOC@5Wft63|TokS6_<656P!k`$EbrR-bw z=|?Nh>2xnYLhy;&teUDS`Ingo@x!@&c7y6FOsjfHI~FN*hndBFor?D5wH7*2yp*Fz z);SLMio#0K#C5{$v0(IUU%(IU_(CaL%)qDw=;Cc zQ7M?TFEQp}ams#eqL>nDF|1Zw-r4!|_Dt)nWZo8>Naq7|^a|J1u;jK9q$Mj@T_05# z0e@B0Y(tPL6%Wpt#e+IR>wCC6^fW6Kzq8tVRYGQ_avW-30jjK#KHk-?I||s?Xdi3~ z(`b6*)59F^6k?Ma#-wbA4k5~Ad9W*OTQ0+ylp78CI;8Q%R$<#nup#7}&nT#x zZ5JT1RTd95E9uX@nB5yI3PS5K`At2`8%EFuMLaN#SC!7A#*6(I+fmImQ*=eWS3NoF zY!s?0(p;SgxqTa{az3bWMXuz z8!$d39JwouQ>t^zOvOeCvgmh3C+G5tuLW7|x5N9MX? z@?v{aSHp3ILJHpbR_{fDCSV9t)iSOvoU$*6?CL6=f_EKq7=~?^UJdCtJATo5e&0&>!pncSZQ_qahFFT0!h~7Y15wc zxmhO{ty|FUTu`33ezS7a?1WX9fo9c;iYF0D(o6X$2RSR(Qi((Z%}HtJ?hz|&f!XoO zRU>YqSxTkxTymL_AC}pkTyr=)Dr!tohP_eClN#Y0R9+VAUL4F?=@nB3#GAqp#csJA zHU=IK-G+hUyo6MUia6K2+@*F&;wYH?of2s{LK;n=wxesl6}R*9&=gPGNiweLC_Log z>GpPvi6$LP=pYeb9^r(yrXWG)ce1a1^WTrRcSRz;YbOj8vsbQXa~WawNkD_I!pp;L z$}F*zCvvZv=`m1LyRDb@j=n`x@U^3&?lO-n*SA5`@ll0Of(Co7-z<$h8IP z6>7_mQK1#TDh%NXsxHpfXfG%eNY!)GCz>6Wkf5m8gjxQjd0&uM?PR`BO~ruSeE+!j zcyC)WKsm@?KO-~47C0F(b3OUSi$-0@s|nHOj--1dz|uzh84a?e?rg@CVy9Y7?xV&V zO+)yG^l5L~4jCsG#ru};T)dypnrUP@ap*2V*6mXd-OqX4cG4(&0yoS%My&^ zh9!!z(nL+4%rD(1G8=J4JF$C&L{|&)AW4N|l7Z%!&^Yvev#T{e>Ik1LFoFJb)LO0s zUcEN^sSZ)#{O1aIk)gm}5YGf>GZe6PKrm9=>*h})uXDL~Yivu>m|&H;Hr=-J0EbzR}ry(j1G5UfNpSFk~(W7~o$ey73Q!ftcei?U&|(tGEJ z3Q%e$2+iQcJ=c~H75a!7%|h7*%F-&G&gg*Q>oN6YFYtH z5Q?zj6j2W-g~^J5b-Du!E%)X1og0krEu2?d^btmbUh-zjrqQ-)8rXjv%?B8?IBg|H zrK*_Enq`{L5I*_`3r=Of{)Q>DRlY`{qL$PG^#posXfP^Ph0bNGd9LURBS>hii&w+< z$t@bo@DPuSA&oK3ZbyrGvu~XCCR6iMkb9|IM*S`&Lwz?W{4wiaTJRq`a1ni56jo_6 zC3p+cl%E@CH^s=?5^?@{d@UHXun%eI)egYvNMLFFRzO?`#Wp#VlWeE;MN3Qo{+;dF zzInnYcjx4YeTKj&9F#g9w5x0sq*S=k(ZuqDtE0;=DHvd}tIP;e_9qS)QN*wr5MTst zoYt$tBuOWUEIi+7Ee0Q-*gETnFX5?gE_7_9k=P`M7VFO+ZGI$6{Huo!3E_`_>ELl6 ze*W+Ot%v{j|9jMhZgDFj@)HDr&&rsXQF82bflyo$`G!z=+iI~{y-c~-RK(6~Bgry; z_>rYp%8G8R{omk<;4Lx0oepy89!%&BS+y8lj6aPP&dJMCYiNr0(f>YNh0gP*?7s=H zaeoqo)^e9Xf+W<+Zbv)HSO6!0>TX9{A)Gc%om@PS#D=m#X9{$Wi)}LxN1q1L&CKsV zJW_(MM@-Zval^J?5o9Zi)?ky!SEo3yI7?-w6bN5)pSxs;-%8v_`$cO~AC_i}xsTrM z$hc9N!pn zQrVX8tdQIL@D|R4$ZkS0r4Ch1e8}PX3Z~?(*-la-)1?3l_bzRkq zN-07{gP+%+&>c5}PdMELM-4nzQK@FfNIM7tWrfu*O8|P1hP>$JW@AHL3mzq4)85cf z0{Uy;%W`e)lMiGF;9qS4S@S`W>COknlDSSm+)Tt%e=jda#%LJMThcz6o(V?ooYbB6 z6!Y!i^uzwnhhG1ba1$T;-PbQSzhS)MQl>j=DziEcy-&O(h zvQqh?62eZ6j5OXxF){S8w4j0HZ20vtA341n4ggl~eMnkVJ^faW`5u?4i;618FS~zz ze|)<0@(-FLe-Og6)MW*06|PpBxaLc%!T6_$sbMJpu>EFt`((o3vyq3E4{*gdKuwoF>m$v8Pg@kAbC-Yy@;pPu_EXq7eA-8Zj_2j4o+AAj3=_P7$O zX{{v*R}1okZ`@%fH5JRM?xNQ2a`Po6bx1%tDuibdvYP2(eo5drMYnn0e$mOzC?yk_hvL?Gt>wte zY>CXD4JYhy=qxBnU|atV>T!%G;&B4BfGpODjrCtE1fc2R17gv$yzRZ zmObxlV!KA`=#&)%W?`KrAkSWd#Hdl)*0mUZ#Q6sEUGZDv4MeVZSa=6TX^{WKF*%%i zd`Fx~2-=F>j4n1Z_c_nwczl>i1{BBbLW)RsRPxjdyS|jjS)Rk49Mba*oc=?d{|=JAs9{n-KXu)NffoMjFhk2osRSRwR?Mi?< zn8@q>-2<>5E}6k~M%S~TLicmllItypXuj!28#GnQvGZZCpF;^LOG`Op-eKc!eAI;4 zWoFyg-4928B4^``h5Vn36kfm6p~zfM+1HvJh^Wps2M4&7HBD>fJ(mTZBgG zCdvg1DrZ;v#b9jjyi$X8<+RQ{!eN-%bB=T5@{_X22S^w4S!}y>K~PE820c(hhYy`6 zCU$T=Q@N){p%``;cCq*n_4rMJMlWN8veWng_~rFOZG5BlC6{tQ?Sd;pym;7~{f_c$ zA#8eRhx)Z5AuPD)+!hb5Cmx4qm2d}1yN1b|xzDb{Gyv%`HwzOTw&1?fXBs)mShsJu zd2Pn^p2mc?V+4Bh=GXCJ-9{(ABJ!G#LEn;I+*k-#8y0)GgRqI8Ts&}Uj(vk`SbM!fn`h$#oW?)DC7pyd(BMxwFRvl1*ka2AK`{$SJakY zb86MM`uChJo4)51*z`T8wWjYmRq1~!)G;k%?`mmPRZc6MlC2o0Q>4LGT zJ4J&#Mmu}%WY2Sjwz7{;vgfCD=+Cl`KV{F)v*#DtGvv3oUF$4fUUqu)z@d$*Pp7d&-J<+Vu+`vt7Elv!vg7nUb?+V4~~hB6{ru2 zgDF!Z5CJb!odz``B!l^~84fihdErWum1ITE3K|(!lb+aEd9D=GwycCkvNZXaScr(} zp(|f1Sz>V1G7*4zVrpJeS;*r`%iw5DM#Jh4>sh=j?p^Sj(c&1){0#-l;w<0Ek){{) zTJr@^v$)&8i6s(E>OV5FxS_>zn#QA^$KT7GS{;l2z$)i%I9&~M!Cgeba?nbppng+&;cWs@|S|Hem13U-$XNQHZtY}$z zfFmKJ=pLYy%L-??B=O|FJw8nexniHaq1 z=$ZjPBRi6r>GM+^%5!pY`>6|4MC(GNBW&1MCr8_FdM*Cp%5QqmdFX&p;Ui9Ya3p4O zV>7qaz54!seDnEGLxnmeoN~vg%X>TxpJ1tc4=pQ4hj7eB=fi!NQR$o6oTY zu~lR-_~A2G0}hCB_tmm3%=4ZTK3VSqfkjs(=vsWslwbi)#EBHhri_SrMR#RJ!&aFW zu8o#G9&0h>JV{s;L*4k1J{`8$=8L5SP7ppNT;R7#F5SmyxpcApshyq9a_BK-03VAo z^m;jysaFUDWe6Om{?)6{iYHZ3c?>geZ!46AXUL?0TML0m^e7}tj@29H333BqHh2ePYu#u`w_U*EDm#M{&7FB2ZNK}F>OhF4afuraklqRosn80|h6*fhLAtKhZF%To>4vgBA$rS9UfB@^YE-~2N2;Br z**0%j+~PJl6pj1)-EcTTWU)C|4l}GC2D{1pf{6DHi^z-37sac#95VIN=0(Efi%xuK zzxcK2S`tqOMc1-!{OWn)r%w1p!7b&NNc`eS_Ou&dJbA%W_{x*SW%BKEIgMJdvDj{&wGLyviM2%XJM zaBMxWM~C2#R?Hu*m_4Rqv0_qV#r_zJks6Do+S=p|wH13Oub~RBTIr60jy-xodo%=i zs*SWghE}vODntl8hQ=#30^>2{?UYsPG33>wqpD+%-grIkc+2duObx)cN?>{n!1Ne^ z*`pWJV*qB4WvT(&Do4N`9hN;hEPISuBl<{;)!Jjq8d1GfqS_t_ zSv&g`QnaS;)8p>JNw?UWn(NxDSKCuX(!uQlHM^t4BOZqx6X?jEp4llIMgWjD8u}C7 z(x2pGUMcDuFy&trND5b1z~s8&CN}lO@B7s9dVXP|0+QKp+EPANCmwgt&+SZ{M6wYl zg^(QZy=!Wf^`WuT_C<9$&DnT^hwy4$Ho__Mb&v;CKtCnQ%J0%AIIZ0cM@}0IR?C2e zU+Wv4Cz(%S`c&2>%$99XhU#WB6=`}{28NBthCr?GQwOs?BP^x`(h9q-Ao8rWt|x3D zWze*T76C+l(~eWomRlbOXH)KDtjJ}p>)W#n5-mfUZTI!8)$u=1{EuzMNwqpJBx<8o zkMXnQQDb!@dvW0-a-mf2(wJAXdt}sla+wKbJl>=&ooH*dA3ZHzx3(Uk1ZX|8-|de5 zq4?Vi%$`sD&zAq`_#b>iW;ZQejNbAsOiQ~IYM?o&?@{U>zIu#3zE#C#_6mV@xW!}i zX(BZOT`}E5@gD_%Za%ksnC54`KGbHCPmNaZ?e_Mrt{6?qmSkgKE6ZJ>X5G@kznkfI zWL$2wIpvWs${sV=I^?4#;z>R-a>Y?d4SAy2xxs6_F%spu zi}wQy%JC4>{D8f-oD<&cc6WA90gAbyyqL_Lm&#nH8%YK_Zvbl&!C4nvN zNz1^NxoThusV<@^I<&~1;f5Bw523q-gAL-jePSkzPUP6>HX zHJs1J`#8x@=HiG2%=_MZC?-a`=MnYcM_MH*y%duyu+vNp77lpJG(mCFCGtQ)sm+c#G|a? zqZ<2`a0A_)S|l28Y6ZlCiE=NhvB zboGf9FeXQ1PqA(By4?{-%G~c{kqfipQX)KZWM+IV64Wi^(ll}Ug0<}kv3U2JlKiMh zEwPfX#~qH+nMs|Q+N~VND9HRgW9*Gm`|^5uf-o-0!EJz7>C1_Hh?zkyOxzMRo_+q4c_BqoLfl~=rmra; zE-k|W6};Mp@4@=FA89!uEXSYx%l=i&y2_+Z{Yk&}Il?mnzZ`1T>%WGjM>nVY9e7WmO>!>872LvV~n1qVnR4fLgr zP#Tx#)r(V=?A=6#>+c^Qf#o20QP-Rsk6)pk_)ElkOM+WqE6$L5uMfy&2A&J|_u@4R z;SE`Z5Z;kj?Ttql!vtBl8nqJd;IN*h)QC2g)l6dE##fu|@kJtI`XcX5&8p}fuehv4 zrx2>gH?33Rv~b=AG0HsDQYm_to?XS>3f2)#LW?!g66E5T(nx3i^7abxU2kSO(PxJ$ zZ39XCJz{hc|>SC_e?OLb}g_{v>qRHa((R9krE$ChImP zkC#ZFz&P^zmB*@hNd0W1#3!pCblTAzWqqA05fCPhq1f0ST8)5kzdG8x&}UX3-f{u9 zizqhMp&|Qkv1Ct*-e+kQFoAa!jZw({6=!+cY((3V=X`oOQpg@AfZ~P0JX*Wo+-0(W zWX=h_hWi*M=!_2b6!JMw)IebqvLx#oG#0R}qA4jhMv0K1SV@*GrsTO$?C6dGCvqwhPm9x%=nIf*f)!S z^gPx06+uIWhq?a;!(petmU2G-*4jSZ_FZr|)USm`fPRx(pkjB(85y!Qg0<~(p3!!? zWVAEW114G{xJs`5y}L6hVnPd4<6St?bz+Jz%DI3`)<9N{eSh+mNJCGW<68^kOwpj( zti|0OA6Z1oGvjRQlLttPx!wGwIpl+Bb(2!}C6~!7m?Pwr$Ac7=he%ldUGzqVaP(f+ zxmWcLHC-_?0!#FwY(QQJ2!2?csYPhMVt~nXT!EQu3|7bxv(jy6TCHRH_tA|GG{`%> z-Oi3IRQrHpt$}MiStsb zDfn;d0UB#=Jhf;#fyeF-TNY>M6vqS$Jw$@zL>3SKRz9U%o|KLm+PO7FPLed~cd;#; zeWrR+5L9OGnpb5?({i|7iTaTJRSXCe#Nd^4FP{6VSnxGHlD<%3258MeZ~vz!`n|W! z-?e=hjYYX+>U|s&*iq>ABTbMsO@nh;hJV}+hN89h%l3?k)_K|Sb0;4M!3kSu!gcD> zk9W6vw`a5OXg4nl3?~?-((5~1kf_5_x4AiO#+uD~nP=e}R=9=|?N(Nz-IAA-g=%vZ zAA*fMeA{;Hp|!tDG=P1DsWmS%&*IjN&HtahcY&{?suusJO@M+t%2QrKfL02$&=;jZ z3r(A(4J2)7(o&#$NODe^LzA4tIVWwyEl{;`5kUbfauv18Lli_*3J8Ma_g#DT+Oy6yg`)TOzyIIobElom`L4D0bN1}l?3s~)A&(kNsm7@(WSNml zd>_Qk6iLU0=z0-J2?AZn;O+>OolOwA&zI}7V&Xbz+?pMXW$}uQC5sAdEERn$1BO_V zIdM-ZiDeLJEJY9kcKJk38&MpWDp6I$lTh{7G*$q_@thuhO=XcmESna7O%K1O)=v*w z{WU$vrnaen)55Rm;n&o*;B)vjJ^Y&5rv6O}zozqx5skdHUM`1!_9AwTIS*sHSBA)Z z6u+cJryUvj{V2Alw9;(L6s_F7=doGyW;VxDDLANB9{x4#YI}eMHawlcXunQyp6yzv`D)`W8CJ{arUh%{3E0V;Y)A zcQV~8FX{4y7um#j3iI*UN|G(!Vh}GgBhmhSd=&D0sxy(3&h#7D^AafOF<_J|k9OCJ zYbeJrGdJ=WZSz%Ax$oc9*)Q+?6g%#*#GMMn!pn~MC)}7od`h%;$u0eSh-RcQN?s)?=}NLm^D@l$ z>A+PceBYueuQ{#AOOsMrZ?eNry}2)Y@t#96S>7U|Ju-)H&06}=a)vg|(P=#59KX$r zS1gl}@?KeHitEaK3_VO0|HtHIeb+D9texrXk9mP1l7rQ1d^)zCM z?Hk+q5UQ^M&S+YmihD?#I+RlICT=;Xgb3Q|7k4aN(#nq`7S=_rP4g+SjkBZ0C!ZMqkoS4I zpR9oJT7G#~{AypwAN-Ta4u(>+oxCDXMjyTcNybVmb3^50^qW3zx<_X0-?}rGE*X$+ zuK$tb^=7S(@%Ip&U+r7s)#i+Cq|WE16A^xf>}y zdhWFM#?f6lPOkYIE3FI7rA;-O)}XPM?IuyMN(x8p$o+M(NDASIQAyMz#wSsa5UK5K zg(ImYRJ!pphK|3!6|dr$yoTqzrQ=2e;a~acGO|b42e?4C)R~@ZnkMtC91=exqZMKP!6&5ylc?x^g=6v2lA2o(s>hCesVzO?_=YT}Pt$qplw%G`cn1fsH zUL(5MfJe^RO>?X|y49{U5bi>xOU04tQc?95SEkh%Tl!H2pPFTOkmcqQwR%;#`ET=A zBRXQis*0J$ASq(;TI1>x=4D#I;&^Vhd{qZ9p?%>Y#`npGPnld!`5w!7h$UXx;R@SZ z4nvFHh-pr$Q1<~%{RGkhNyKIzJ~I_9C)vUzZ{q(1UqhLsZ!UzllI+cgqsiZr%-hr# z?v2M^kSD$xbMY;!TUt=2Ggfwl_Jo*6RtrCjW2F#u0*)mF!kKK_)Z4dG?nd-n)0mu3tvut}aMehSPgUjc zmg+^@82qaNXxcXybyM&EcSiWFdaKcN^E`A9`lUajnY;xZ5jQWpCGJ8%gZ^EtIzr?e z>SrZpjh|FL&h*e&!Ni-thg$9J8aGKksjlf{KRlm}8>XqeukzHR`^*b>J^v|x=eAV& z+g9BPV}>Q^3~gCN>4DDHPE|7KWG<}gtjmPVtnt1P+%k_D26_io-fmL!I-e)G3UkXm z_O&w^D~_r>x0TXc_SaWjBl&AD{@C9wEeF0D@})qQ(~eLWtGYmMP|~yU1JG`Xo0ivj zWr=#aX-~b%?>951TR&15ZtN2;tkdZVvVBo|N2YOU?_dqt6y1VN`8B|dZdmCjw>g>j zsbkJ=ihO>9ey>brOgJT1$sfY-Dvom>z3K2Obw8)%SGddwuQ)8%4aT1(VTMk=jE+Y# zeX^3fU8BDRJso&k5665$82YCrFFKK*ZUwrsSZDIIR-(vW@ z_j`o!jW6=XHkYn294AB?L^N|E*biJ#F9M2l`mFsxyT8f94 z$BU6=O}?L?i?s{l=UPJHa%+8L>5e#EGQg+gv+@=*nOKUK^oU%RXfEoZ`E*iQ5hPM3 z7RwcG_LPPe>Fc9qv5}31tOay#R2&CSKS|n|Dvf?&E57ZbD!J?7k~uYb^yV#O&QxaF zL*}$s+^wOBtdC(aXUX|X$tf23G@8tDGp)jV#aRD!fXu8WuYr+Y@%O$M!j%gBn!{6> z!!{dJFIW0`J#sL;)4 zc)5IdDX=rv3sG7%SFLd&x_QyyWgH||)dX|N&E{&{1TV{f^~J{y<*kdHP?j~upW;};{4K?#YY_jaYzoZ0@&Vdwy04;-N>Pr*gtzL*w?xQ}@N86k=Rh8tlHAh55Y9R0%e65{6}FxJl)i=c za5b-Z;S1C5HWhs&f+B-ub$ik%upHK{u9r~kIdQLyq+q&+tw+1T{k)+@W>J09mYm5V zOKtRQ^~5iO#j$xU?3CFJ^_jK>r^wg=OjeooUYPbY2UGlVyXA32|89kb;x->Bek+GSjNk}S}SUB<^Prp{i* zOQxsKUdAh?XU<;6eeJaCP0ouJjgHQhq(7AtvbcCtKimxKrV(i3#+?MaILGb%9EE$v z^x0HY1KBQ~6iLS;DVkC;H-7?y-PA3#o3@2^)8E+6w@S$ZC!X}-G3d5t-e%=$d75FK zmF0a+eM5ZIPr5#C3)lT=tW}n0VS|qAlH8~a(u-1^f8r!|iJs1s44)GN|1}1AAVL=J zCoe2KD)!c0>)zAx@}efQ`4{1}6;|g;a>hun+az97xpVK)9e9#yRi4Ibi;UGFHCN6R z#y9fW8oM(8CdLftW$|gDBzZ-g<6M;3#&HWzea-7Ec6RZkScONvt(gYsj^s}Viz8%B ze0UX<_&B{P{nb{o)KPl6ZW}4HyoxU%az^bd_C_>z%TC`k5^1XuBM~pR)56f+S#B=q zn^$L6pU=9wjx~$dwD<9`buDvM>7m!f8`o*WXiQ}?DgLg}KtXDrpB^6 z%=g#tJ( zR*m4r+72vR`P&|j;<{rCT@PW|=KkriZfy%bwQo__MJ)5~U;WyO``3WWwzZA8W*lu_ zJHl1r-XxN|fMjiMZSUFv_b0*GIj61gWqZy?t#H|CVe~R+XIlcK5e+?aa01wI%k> zwSD;0MkZ{@sm?jq^@O>Q@LSdnl7&O~Gq`phS>Cxtew3XbQfTI_UA%Vg+9I(S;MDcw zegL1g?8Hf4)RXd)T=6Rsk8X-V7ru4k*S~i9;uGugV{P?NhZS6IRwnKPZ^39s9x9?% zi3dt=-F01ef3}V%OXH&qLv)lc^D?Y&iC1O0Pgm3EF|*|EY0EvC@!c$_>g(f!%6)#u zDe@Cf{?P%t_X7;2Rt(Bxc~QjEsyxpokFvN2{Ns-cO2=6T74e!HR%5arkp`m7>K#Vj zZh4XXU`0}IY~qHPJXFdP*+Wr%X$3DXXO*6RXq829xo)}pOU%9FxlDAr^*Zq~(oJI_ z?;><-dFb1+mOjrjTurjRhtXM?hnVM;3gt4NQgSbRlo!XaL^Yle2&r@C758kjJR;fC z$4f!wi8=s0_K^sbT{`4TO-y9<@DzdsC%#H5TsFB>xK*)CtGGA6hh?%NaLZR}(Aiy^9f{*r|7=mj=m-pVB@@oI3Oa}`rl5^-Lz zQ5vf2T*1&LYKYTHMsptGK;=a*ajqmWk_Q^&^V2M2x%hoNa#G|xTMk(vxmS+ny4Z)w z-S|Nh?}+xL#3T>%2|jD|)O&N{ZcysZdHj4v z)a*-YIhR}M&VrOCW+bJ56LsX)$m7zSahFOdFB*oN*Z~%O#V3ZhQ3S_H^dvQ;Uo(>I zuk)emBmMp%5ji>jotE->DjC7L)uJJG{ql}l8FF*OgNM20adtn?>hqber+2irMIDXu zr?su2d9nK~$7preVW^{yQ=_Pf+d49wo)o`DNr%Z2pu6Fd<=R?YFV8dAx70N(YCmH7 zd>++z#n)bt+^^y*pvj_}LdjUklkI(Zd1jM={s@-!a~CdJ+=~Aljf-2G7rM|0mTmv& z*yz+~P4uzoYtf_8U!$EzO&+yyRR1W^%!*EnhN8=(o1@2~7ouH8O&PUl)BqaUo%`OjT* z^_8Fg)F(f2`NuB)@cHZC`<``c&l*}aSSgpz9O&;`c}9LkPp*6Usi!Pm($T*7q=l_5 zC!Wwezo~KFtYeOzapd%AQ>Pq0Y2smr9&+$I#~-x+e(%_4&$o}=X-w_tQRke!cKF|h zhlkH%XB%1*A6Ks$9v&RVbMVYzKIJg%!ss0yCYWq@*YI%X>BE`W_T9tpT7KH_si!PE zdFhhjVF|r$(eUuX*5Q^|f8y{7%?pN!OT)am!^8D+jz4bptl{Bfj~PB1{mi3g3?IpH zdTcvwYJ8kBd3gAUVWJEkHhkzI6NZWSxPuNH9zLLs=_LJC`uxHqN+56aw>@+fzswi5^zK(r8`}yn_vR}-;f&Fs!E7&)(U&Vec z`}OQkv;UU;5A1(oe~o<%C1fo7-t7CaAId(Hy@|b*eJOi}y_fw=_Osb9VE-ulC)q#4 zejWQw?B8U+hyDBPPq07D{v7*X*`^G8_nN8%$kFQ*t$)wUmz7ymT>CcwMFn!hvPeT}{zo@lrY zo@JPyRa+Ll_%9I}DUW)+Ug9cS3AX7u7q;p7WQwnWC9dlJ%dk|g%HM>yhc)c)!#j8u zn;)n68Cb48b^j+=@<#bpco*-UL$ndauAaqaXA*09Us&=}!ei57zM3!E!w)e;BSa{Au_A&*I1DQ+yMAps~LXKFIKo;Bkh3 z1CRGC{{1<{ufgv`uJL`_R#7woM(nmaSjv~O7l*@JEib{L|B-foB;ncemM&lE^4EyH zEpJO*2M={w{c(;h(_k4gVQF->~?9p=a@b44o&-QeG}buH|6@dS%3}yj)`RC!kjrz4(7A zNAX+sGtgU>^0EQ>Sg(ISdf{5npM@_s{4Mwj!%xB+4Zi|k<(We?mdfQ?!w19H8)oHO zbfaO3?@gX1zDv+s9)xc(_7}pp8NL#}!|>PPyA6x~_jwloe}LZdpWz3M{g}5!(Zh!K zhaWXO1AfA=`2VD5@xK+l<$m}nW4|7L#_%WLXAOS^{=H%G|9Q{i|NZDKBdXfoti4FL z590qAe9-eRn zCmVh@Jl${so@w|!@GQfZ!gCB?1veP}8oa>py>N@+C*U^2&%qsrUxk+$-hs~Aa>M(< zryHIOXARGVdkrsv`wVx&MZ+byVt75g#_&hswT3?juQPlLyx#Bw@cD*+3SVgW5Ael? zUxzms9!qE8a>EC}R~ViKZ#3KhUuAeHe68UX@b!j=;2RBJ0N-Tz3iuYoH^8?U{x*Dv z;fLV64gUjSbNy;uJEIV$H7k+o&i5;cs~4;;Zxve44(l%Yj`dEd&3vO z&l~d;g=2H3BP9e5m*|NS`M=P3a&N$5-j6o)sGp=^>27@SjN(-p9Jq__-J@f z!zaM|8eR_98SaP289o=DVEAHqqT$cNlMR0ro^JR%u#D|BeviYm3_lCcG5iYLVEAo2 zbNw6M7j7|pINWCVc(}vxN$@hmUGQ?l75H?+=fPRS{{hQ91pnP8{l~m#sqa6F{tUy{ z!z&Hn4EMpB{@dW9;XC1q;rrkN&hSs*^@g8<&o}I&9S+i-NL*x>`2QOF zF&uH?wijT!41r}ZK@%K!N0=rg@ZRwDh7X3Rf`VS!D=t|VmV`G2z2!MDr##rVz(gVN za+v>tbAXPA5l3gjyBYoa;I|w82)rk(Y5XKy2Wyzu!joai56Od@;OQLI&%5CTUe6(V z3~n*}8@SD|w8tHuCB4!fFEcFVXSv~*aeq3j`M({B>ohFos|yytWZw&Y*60s~bB3k- z^>|ycpNYPgqohxGF5G9BpHOPNuTAswOb6{JZ z()G!k^?xtIykEdu#|T>-{ObxM+tANXAaSoFj*4v`$pL2|J|_7{~y71#{O6EIKzK|ZT@e~6h&b@C1&U-fzH%7`_ia)bQi*VTPZ9C&KFAUtqaj)V~@MJH_x=c&g$3;Aw^@ z!uI+)2A*m3C&EV?UIrgyxCcJga0Ry4<9p#bM*k7G-tb0vuHhTtd4_L;8(>ZE1MmW) z|0&#T_*wV_!!N-n8m{H!x4`P(F0fqhntunuCmEg$FE)G}+-|r9w)MlQ@G_%c37=wk z4ScHM^Wf7AZ-8xm@>%$FqrVC6G<+xAW%vhhx8bMYEUfAM6WnX`qbU5gKd}>R`xE=Y zwm&fm?lb<)f~CIF{96d0X?QtYGQ1Kl8$JuR_1g#FHAeplc*yYQ;j;|i0{@%gdtqB2 zJ`S%l`e)(y7=8(Uui>q@_}^!EH+Vg)`F9X}zR@2Ef57lO_yWU=;SU<_gfE2Ezao6G z(Z3hI#PG%NrG`HZf5h+&@CI1@`zCz3(SINQ55xZjf86lz;ZGQT6}|#i|F+}i&qkx) z7ygXlL*dUFJ{rE#@B;WMSp7R0zSijT@aGM$hQDC=Joq}pABC@n)xWFY8;$;E_{)ax zhQDI?5%{Zye*xbFtABrnZ!!8BZf@ObcxU+QhU?&O7(N2N4Oah-gYPib`K4F3cEJ*@t1Ul-38jzT8ees$c_=BPXo{)^#b;lCO_ z0e%5i|4xBlHu{zDD~5;QzZ*Uue%0{D;MZXF?;2Plqw%=~9%c9*c(mci;2Oivz_qaY z_g8p~(QkDC^Gk+zg|{<&ApADNQ(!ya8Kt(3qvNn7Jbt?I%NUNzbHu%84$%qlSdOw2 zOeEu>I{%x4>u+M>bmE_kcMjwzzhyrKSlSEq z{|oT-u=;-oe4}R$(IfCp9M%8d!gs^!|LgE~Jd2;Zjblv1QT-ne-v_Jz$HEVK<`6A} zALgk3XW^${^?wL{+OzoiVfYsu)&Gs~GjOe!-3&kLnL~6x{Cke-|IcB$-qrsX;D2}) zKernnMXz&I|M!8#xYo<2z{~xA9nd@Zd09|m7<_;~n6Sp8oL-vRUA`Oyb|+wl9~J7M+zqww9Z z`hPuqpW!>;2VwR9NAQy{|D7Lyfd9*I?IBV0Gg$rK1AYot|8Z8eO+qg^*+<%rOX*L9 z$6%=T8wqH8&l0B0e@I+4yi>5>&DiJQJq@1;?`!yMxX$ng;BkgO3X|jz{%7EchQA0; zHhe2Q-SGF|nTCG}&ocZnJjd`3hgOfr$HNPZem2}Ic33pJv`a)5_r1d zJUr9z+3+mGm%wujUkx`Hz7<|z_#wE(@Y8Uc;TPc!!`mKFU7zj;FE{#W@acx@;jG~$ zaIfJ!+-LY~xM=tixMKKfc#Yv(;kAYzg4Y>-8eVVsMfiNf+mhKA8r~1S*zh!XgW-Dk za>GmDD-7r1jfT&LuQGfIe68WD;p+|G3g2k>A^0Z4Ps6tuei6RS@U~N`>(l+&3M`mij>I2dR(cx9n0sjNvG5gd1_cy=M;5VtB0K9(Xrc z{a*vy`r-mu>I>Ch0dq?!@C~r_{~PeW#{cibb;kZ__yEIyg%32m)wJsSL2rlmL@()) zZ5%v-qw-96BCPQ{0j3HIyd36|4?F;K$pl^pQ{;kw7s1mFe+Hgu?7s@@d5e`323mh&a?6+hl( z7>ows9XP7~y@o}9IlLoBiJQ2;#xNM&3`_YE_hNG|ytCo|f_L#c(fG zwnn%7oFDb8 z084*Hc?g#LRem3=`Gq*T2$uX&{l{R<57B=Hmi$otb+B!(zXnVCMKAleV4L3iVM(v* zABDC5BC?;ubw>Xje4ybM;cregP17=7N_yAb0N7YY+<@!@T3YP0l zc`i&95V#el2n1dR^FMGmAlIY1AAof}QDj5#ETdl!A7}W(@EpS*hvyo;8g4LrBiv+| zpH* zd%ga|y*zIu*B=KLKk1L#>rwjSQvURMlK%Lvh7ZI)DUTZ8NwAhb#L-Mx%b#$1I}W|L zRriZvn?GH!q(`s6GOYEF_$Bez^hy3o{Dn2X691hH^RsIESHoXNd^9}q_(E926W&Oq z^!!Tv(&G)WvD>F{Z}a2xu;hoP|5jMXOXBWMSjS7kKZ13XGb=HKsOn}09BHvX@{ zHvZdkG1>AW>m9Xxi2suRT0cqp(%UY$m-J}-B|qM%{;b2^rgtK2(|a^*)7u1VdL^88 z!|AvPpN`(fXC4 zi~28mS?^>0ll0p2E8*+;75nSZTfQ5%=UdLFJ>NEN^7|3&ZTx->Yx>3i7hoH|(R6ptaj@1WvVM5HVOc-?PFVbs{o~kAFf8kd4>f!{rrtbmt%7|V1=6b!@yolbiq^|+Frf-+y6GrUP z*J$*IqE{BZq_4^7=c88^y`*ox(RZU)7QLiz0Y^D^vY(G$8FcAu;V5wz{SD}qL6^RT z97QktkI`F}^tB<^^u2^$8L>;>Nk+fpoa*(WlD@@8e;9gY#4dg9Mn50Dvgjp!9UL`% zedv`%FXwL=M@`?Q=#@n;05=9FY&4ie19E z9lbK>(wFC``p3~Li(b-qhSC2Oy|U;feJhQAr@0A>UeedcQPVday|U=#{1rKB`c6f! zEP6>_$?L`D{pc-=jos4i@n^B$4g+y3Te>~|8u}fPtNveYkJIgMy1h-euj%$Q-F~Lq z%XItLL;lqfe>s1$rQ5%BdzWtC((PHg{Ytl2>Gmnz9;Mr#bbFI-U()SKy8TGE7wPsP z-5zXG|EKEvbp4*L&(rmHy1q`=&*}O&UH_)*+jRY!u20kTXS%*j*N^G?FkSzp>$`OQ zmafmz^;f#SO4m>6`Y2uhr0bh>{gSRv()CBWzDU;(>H6RvuICEZfnEK! z_IbPj(eNyI4J`GQY+dkLj#@ul1fSzsWM6>San$hcgx_QM=kR+CzY4$4a9u<7{k|sn zeDoULneYXkMfM^1LgW5(@I{8d1AoZyFW?Uw9z*BjVz`!Fwj!M6Q92_B1H zY+eSPdgGAyhVHA9L8vpg)f8~$EyLo#K(arFlhQAN*Yxvi2o#EHv zafWw4vHJccs;cb}^b$W!-&}ZG!%N}qV2QizD`3elwOgI)<$V)&yesdUm~8a&zKJP@ z<$V)V4L=1>GtAGbt&#ZJ^LZMq=T8hPu$&Lc582ki+jCU@AZ*LuRj}l*@U!R-@+^MJ`Lm3uYI_-bn_dZTdn`1(9b2o* z=Pt08Pw{9HY|G~{Fj*YjH^N#z#eNBF^XFZ#mOs(2gl>fh9jQKIg*w8@>RpGkiI0 z^GDLJ`6K!9IrN$za?ZYH7AZ zWPVPC^PTS$P-#^n8kc zZ#BM?eSF1_k+ypDQXVBfvYi5J{Dh0Jy&gqow-0)IO{=6&&zH#FEPYqw-kz_o!uEVg z`gJ~4{7aYTd$E`Eq327kk9Qb;481MiKZkAkmg}Vsdrdz-tG4v{`Xlabe*FWs`LoNS z)#2m4NuCO&96@Ml3$WHvYqL}Q$7o}_2GKh=GUdL&96_u zHorax+x(LAQAaphe&zZfXPBQ=+YPw4<>>*~rsr3%rdQ)^J<$6-6Rgnu{yXj^E_(jA zZ>zq)xj($M(NBdNU~wZ`BRq$rvdHYF;a9BC{5~1?Hv9^_6?%=2F?ByL^7b0uf50|> zu7)*#BtN8lSiTAUSmf&d4%n85hhV*a>aa^+Kfge4+snVfwtQ@NQg!>VCv4kGysX+J zei9eiCB71#rbk%HhmF7VZ^jz?^!-Y?AF0=ixIfg#NAvS|*p^qhAF1&Z`z7eddH*>? zE8#lB>)p-?C@1pT$xA zKMS5?_``4`EdGiASEua1k+Od{W&i7x{XbInyS69u_u~I}xWk9XA(H#eOFT<_<$m*0 zjvD`?v0nyj{9EDWhEIn(VU2$!Wq*Fk{u3$tFQx47PT4;J_xkuq{L|aB=p}Bl%T_-< zx&DOH>lxGQ7yn;hulOSA*ZM}%yE`Y>=7-4aCgUm5Yx&*CiPrksoqzsFd!grlI{sPz z7r4s;)a=mJJZLnUCh@%`l$LQC>4Td+s3k+Wiw;28=+-CSum?(zueh=&QgVM?o&;w`9?AV!!q1Felyt-@`{jBs|fd0ngZDbeL0FC-!@ecGs-vKL%g6*XS^3 zbA!0wJJH`I_WO(ub1F~3GxkmV{{y@V9_PawhL^r$bm%ked@AvUCwToK@MZhO?xh|( z9)28_IzqOS;g{gH7^4EbbpO%rnh?=N@G4lslkGbA8o168bFreY8||)15#0~JG%m^C zC*YogG>3?ASe>-E1TK9}*p zuCkWbXT1I&=+FC8Qa<-Sjr79Lh-Yk5;2C@@M$7Lacqy#;xdMLtg;CLKv3YbZ{OgxT zh4Pdx|5AS6NqODV+kXuEttoHHBjtC~0i(n9_XX@?Ts#@8i=sX^S)`?xe06Su2{6YN~k6bxq=h z`6c#R;~DY){`?=zflhyZPiShbZ$06J`u0T&8#;4*fOc?jFxOqk4Rn=CLj!#)ij`H} z?X4XrcQmyR76x;@rOtr?K8DQq)~mO>9^ppGR5YG_CVMmc3ifl^H?ZHt{vi8L*?-0U0(sJCrhyVX`(jjkCU-e%ja$BY`@avwHh+4T1RYt^Ep zSmMi-&n%TIgR54r89GaHZtn@TZr@V-Ewyv8`5!zrHt2I1 z-dvflb-R_n$?uJ$=Xi_zw(`H`T(N!ptM0bj_mW?=-@1RF4^5x*sjn3eyY`FU`DA|1 zW7m9txOx9IcRn)bsSAI*?*92-|H!rVANtuVpM3Rq=X~L$dG}tj<25&I-0PQDHoblO z!S|duxa$4|t-pHL?C-qm*bjc{(o;Y2vAPRJFFyV5@q_p*+q&U%B_H)Vkz;xnz3!@$ zZ!JD?;fR+lKE_{S{1eA>&&BcoZvUGD|6MsS=3m>QF}{1Xxx<+4WZU+i-Ztm2le!Y~em^eu+dc4p z`MvQ1{?3`cp*A|Vv89QwWys^vw08+5^ElI^I&3D;+Tn5wH@))JT*id|C@Lk#9r$U( zeC5n|%|>Do|Jo;IcTkD3p9oW%toI<@VcY9NNjid%AOAi>dp5PB=N+?rNjX<4FE185 zE4e;@$ncThB^}KznSQ=To#9K%%gdeRDVfeX7dkcTAa#{8*Lu6;`yBay|Jqa|e5R_+WJH=|NTOT#?HL@$u>+o9|qa;lt{D z^}HO_K7W$R`-_#fLdnS%s|?@eJJC_?3qiD^sjqWIRQqxeR61954DosD+Sh_;b!-#0 zt3Q07T>M$c_ofN6Hpp{pin&rHsvQ#~YhtI{2f@l%Fg6H=a^+aGTM!KtV#%ICa%L>p zHwgGXw**}m1TJ@?+HpZZj$kk$a6cy{mtES~H%Qthro;`oRSWo@y=2Ygl&ZsJZB#ow zC6~;NYG($igg0-n#3`EAS9EL^VPz;*Wwbfy0;VmE)HBM6DdBq&cLQZ zv^E4qzR=y;SzZ~{ULHjKooiYK2MFbgAd+ISILG(t2j=lz?5K8Q(3~+?CZMYVugaGy z%>xWKYp)HmmO`P}ob4#o_Z2&%+IQZikreJI#9HLMC@zkC{EhLr+*}i+a!z8I%&^9m zD{_1Xy|XWq?W}ZW@|9dau|6+o%f(!G9<3;%+RK8xr%>w74Hj{f^SWz-u9xqq=Su3= zOF_=J(lgaMnb(bD!RPJ=dpf(x9zH&vk$7e%2Or+ZYKmIP9PnoSnyOYZ6Zd9TQ^|lg zGMlEJ$u!<(J@Zz0CbQ3*HJh%U$sFLDS>ag^Q`eg{J2LhxGxf-*R_3_h%#gS-)A(jq zgent|n>Cvehl-iZqi@#iC{3x%R&Lg6X7EfVF*j>=bTE^-&CQxk@r8)E$(-lr?R+u9 zPUb>4Z|4gVb}~o0dAsE7%e{oyE?>wDa#^QK_sIIBTyw8s1ouga=H9~y`cO#aUc?Cc zQ10a3gzCFfag+NLDP4${%mI(ABXi`2MoJkXEH^h&x)52p(UH=Hh{{cml+Ks;s8()( zq;$SiQYe|6PU(_DCU;6=CH;iV$Y)6Io@~Y@xzp)LuBDY;OV-#{nZpCcICghS# zhi}Hl=N5sJyyBU9YO?z%2JFmC1uP--1w;`(OWx(TA^K~a*Dk90n6+5lNfSl)&gF)<-+CwGcPU4NN)^NfD=t?G zMP$o%HKuAfo%!hyw<4YNOkqGq3)p|wszSgfJ3hXBw?M@fsjxlzrZxm_6|l`oeEbD8c!KfTawMs^oeR8znA2v!3<`4!ga z*-ecY5oDw{TP7CQa-&j1;*xYhS^cM2ET?*-&Pz`rs`)re0aa^Vd-eUSWL0%WWc1bZ zXG!AcA7C{uRG0S}t?>sYdiA)<;9g_k@+ST8m=F2JY3yb>F&)^wL~>b-f846YkVu!&E37Od>{FelXFpbu(2!4 zmFGrunUvYOv{_*w(=}MmRPz0)PsMlZoq-0>u;8MKQ00QF#Lkjp))`Q@a<1^H(*mBSNFrq>Oq@vhh>*Y)0$ z6Wvr*mb=S&=?0YtySurNFk3y6S!Xs&tR!l&Usp^?{L1vK&K6b=^c6a@U4??gZ~RQ7 z&E~ljD{6uEcih=``B50G6bCD9GOL34-Lt*8$dItoqvDUNxTjkFZIy=!8~k|eI1N~4 zgQA-ISUcc?>h8^Tuap)=GUDFlR=TLFYW$(J1+%D3}Z}Pi*us!*KY@5ssVS9hK#)ZC1PNg%mX(^_kQz0c#Cw~wx%6VJF?G-ni zj%se$MA%d+^w%>(f{O!s5*MfB$_oqi1Lf7OpszBTg@gTFxl&M_lTRF3)q>m_yc}~z zqD5j2(0-s=+fW#!8B5vhzta0q>@1aY!4KN`xRD>*@AcBmN%Hac=PEl>a^4HSG@u?y zIXan1oscW{F&*iO16eh%(9b+#o`~Slp=Gad<)lirR8`r6oE?mhZd40J^WhrXad_y%%fescoaag)Jgxa3V6)99EO2z+7 zD?@~4+>)reI|rHyC7CZHl{kDGv>FcNALX#6Oslbs>9Q zWpp#~DxRw}{`5T9B_7?T@_r)}yhtbggvWfPmv?dWaF zy@k~ThG*RcuE(LqQmIgq$n3Uz@TDCa$=Le7d}rD9T~_Q-rEK&A`o*-G6k~VmLi~7P z-(c23Up=`_>RtarOg?d_MkLoqQyj+-`Lz>AkS{*DHOJI7>d8|^RL3_!(EoC}*HfEn z>}0YT)w6uS#$};vvs22w_?nGVmR)pID-oLQHQ7P~v*!baawXp_Dd?>aLCNHGCD+zj zp*tj{Z2dg1VhGdUS(!1tD^Ci$^Zjn5b4o+-v3cOk!F*{*G6`p2Z3>E$WxN-sN_q(K zFV_Z?a^Cu(<`90RF_$g+%i_l;1W&}JH|}T+Qs=d(s=fQjl4=X@aO-73ys4XUrv;^$ z%k?5gnx4-r4{Ay)BjmEieJLYnU!0w<^pLyr6?M0wD`+KAQo;JzjLim3V|Q=COLxcz zsrV)}nk&w7lVq^$jjrQ+Kh;-|6zzG1L8+|ee15YO4CeLaI!h^aOF5`JN_nn5x*?r? zLuchmC+91@5*z%uu;PvK<#xH1K}UKpk(8yXxKjm`P)bZMqQWX~<3uGHoG=JiVZOYW z`5&q(xmZ`CIcIh7(rRSRVBa-fl`XiOD6C+B(>J%T(7jTUxZ$jzcBO!`Ql;PK?4V!j zM)zrh=gtWR$;DvK&+YFC`sRT%xUT7}cIHd&>UF1tNGv@s*t8dVD$@CIkzqchf(tCx z@o6PfI-GW%RAlI0;j>Dq)7U#?&f@4xgFZfsRoX=xf>zFtc8TKJ#}|~lE~~O}zSQ^h zFo1JIMQ`=N|ERKR?`J|nvfQh8y&_TPie9+lQ$a{#v(lVV1;-5rb!4Sfkcp6?Prs>^ zoa(`i!Awp?1IY;;n?0`#x_Go8{Td&Mp{s(fL8iS%=m0))O)zQCm9;O`n(rzB0;#z)bJf#}dtb8aqkTx%tOZ30;!zzVdgrd6o@t`6_u@k9q zBzqP;5p*XrlSRjJaZdVdsER)gD(W`6;~^56Cxd2QDThZv^JIKSi-n_w2AU_Mx$bwt zjgLXnq5Nok>q=b3I=L}V4F2o+;HIhoEO9qdeJk?wKL?{YnwoSx_~~DQE{>?ty*s{f zC4s8c^q@|ADdloOq0-LSN}{zPz6F&e(&+AwZ$B{u%h_3w&oYupx-`eU9z2!m(4TF& zM4pT99O2A0>TxcJ;@Zvdq+I4Eh-;JUns=gMTdmYVx^P{ zQGD~zl%jd@ym_KnbXZE!&OECsznoSsn%9V%T_*-Nn<-=B^W;gvs=APg^2J0Mr(Mf~ zC|{WzT*g;~Rqi^~D>o@E;&j((UQ1&u<;ArfazQ_{iNejNF- zmd2wj6#sctP{eIVxAX(!(*Q{rh-sF{=4iqD%%5jkG!Oq~vE#3~pVdY4{Um zwk0U>lG?00*EHDI7sd{R{a|9E)v>l4bL089pSK22d<0}&4AF0t*;tAH(~Hs;9X$0= zX2FxxtK4&m``yRJE09dCZE9BU?qj@XiT5z>LdE5sfc9BBf?Uc*Rux%UYgFzHEy|P2 z(ov&-RA#Ew-`JUYn%7H_TUyLYYm9%-saVDiZq$a(JNe_ggO~nJP@#lk@&@zc48?0$?TK_bWdU`acJu1RCfDu59-rb2cP0n=O?S0 zItTltqxiW*FCn?4YBwXqc*fbmlTD18%azsnaE<)qea4atUA-ctZ>;w!xxM3R0i!(V zyr8VOa^oU`s~!H`Dck}hs;dyVO zagi{p3ldex2czEc!@*BE6>Z)5c-T(++%4_%HHlu@%!LJ-;2t>-rhUKSlHdn<#N<_O zQ=8cvf{jR)6{`%mro|L z`pm**B3r*P$QswUxvyNwEvS>*c2UhvR|mB_%klgeigzapnNypWm5H{N8-leAC)zs8 z#&5OT_Ji z+&6R+{m(q*wX|$8biT=|mJ@ViaLQWIYPdoPcd*BKWBe;83Cj-FH%LC-C8 zmb9u{^hfVRYDcTc{>dw{?&6OxL~Q^w&l_cE%2a#TpN*d;dY}Kx2=WD7e(qkvq!+!G z7{;Obd^qE8BPoKr>y5g((A~s+GO4~^9YHJ^am>q!ZxT1PUptaq9Nex7I(lJJd2xYB3%w$u|KJbl^vY! zcrkBB!J7R0Xzw8=LEgbQ%UcuX?ls1wqhSG}_Zrcnaz|mo>JaApRh4zqQ(;aFSG&}D zkFo_n@rUsCO@#CVq?DtpY!w{n1RB!Tt*fOne~NgoZGu?pcQ@(NlJC#El6qIQa-N@X z!`Ufgs+_52$_#YP+Xfx2c+Sn>A>L)Xl-S4MONrdYz%5qCe#P5@y=#=hZ0-Kr2SwsQ zx|TS4CD9p2UirulRSq$qwNsEdb3|v34Wf893)$y(4l)VRt*B|;J;Cmgd^5Q_Kz<)Zi%^(-@+AAuX zz8_O@d1byx??x)N=Tug51641ro$o!Mb(YFK+suN0tRGf++!?8A5O!bS-DC@{$h(1Y zvWnj~@7MKIThX0h{Je?Tlf@(g?bNC=z>A}B^q|)ishQnLFAqx8dR5+C7+_e#sw1un z#>jr4vTzj-C&)-}pYx5++~Z^Vcd)zCEPceoR29!s)%R68BXUV>+r{o-sNEutoFZ39rGrGY)(z8 z<`Ry$T5WVlJfhjm>w}q_j~LNt$`^yt5~kl9a$SQfC>-U2TR&0vm7tYswXMK%5|ZpE zO|X;s_SUv$BL0rA1=Dyo{wOmTIpyY{Ezx$N7A-`%Pv1x<)V zIK$G`c&?6TzshlW@Y!@)!|Qqv}#* za9Oz=3u+t48yu2b;v#bIfYt~WyYr>&>Jr|+Pn|L7mKHs(;7%@-@UtpSUEFOfFq^FQ zjyQ$__oi3OlHZ<#qCke)I`wi1dFVo1q&ls zG7~{{OuGxkA#SXwqb^}$`dJ%rp)0Cg5K2#mC4UIo4%Y&f$yEA_Juc&FPfDac{nRZy ztQU$;Cc|>M0Txu{I_0^s$wo0x7O-W5>du*ZIx;MtEessRh4pA!#wx-(6U!c!1Cl{Q zni9vU^U}lRfz3aHjW9OH7=KokmHEcd8(`s+~^O#l^McdZ+PA^R&Q*1bkmz zdI@nIXX47mxvFchC#rcq*u@g;SOOTXt#X+~SC}oi+vi6&*_J8ma=~*{Ob@e4@m>@@ zubdAg?(-^&{Y*y)FT4Ax3?2w(u>`yGO@w+_kvJvr;a0869Zi!U9mL;HakN zKJQyBAjXGVtL}WUR34x*Y*jnzkmj;1k>iQsGBfMAxY)QDU=0dG_o(K(>LBAq#3{&P zBdYri$#s_*;JL|SSB|RtawBb}PGlycxLB4E@vNy)wa7!V>45! z*Wd3`TU8TEcbR0c1~`-*S9xYvQ+e+8z(`ISR>!p`7qfLkbt`VpHEvw5F|Kjd(PHbU zcc@b6%Tp{~P)DrXlKXCkpcQ@QcGJ|0WR&k+nFUMUu$!o^!z!R5~+%Yz#I zO36*C(19d2mHY}``&4dq^ZNLH&O_d;sgxT*pU#`rC6}GwR99rDNvF@xHWQ(N9{i=& z|DF#f;{*g8Bw|2;Xfw5|o>GZZeEQ8tYHCOKxbhy=O!~g}G#23LsVd22%Dsbb9kyKe z)ZZuzDBb0f;Xz$l$NO)Ib?eFwhMe(2+wr{hD!%l%9OFwX{>Y2gSGhGjzFgy8jwOAX z%z#WRh%i&C$h9jP?}1aXGI#2<*dVI8Tb0fMvt-KNpmw7v=!r`np*HfSwno3Ez2uxl z(LpB9CCRQ@ihkfD5(_BmRn=*wG|(-L>1T|YNU(dS@eaoWaW!|3H53t+!z+RUt($f}B|)Jx2X|IkOzS8&smwZ=OYL43wka^|BUYiSKKUHJhwIbGeb5)01H z<7(O?OiXPDjUvJ2`ut*y`|ac2L<_=nW3yUrv_v(3#KuKadQm(JCOx(< z|H!*@Hu!Cu>;b}yE6WW(*7T?hw?XL5a6Mo`r2-$Ivo_@?>NF#*n3HCT6{#|gs#axb z9mGwnt?dX`TI^HpvLK+q$EG8c6lv#XtH)9%;`3kKMI=*u)JD394fG-sUIJG&My&B2 zEcen6{;5w(EFi(QpjHZlyi9>M>l8Kfl1=RTWGu$KU}EPa*x6GnJuMolLA7#>4NF*) zij+db8y9LgvwAIOXre08+pa|>LVDls+Gm{!uPwO#h|s^B-%!tqh-z<4L=97B$do}@ zTDh+z;x*G|&d9i8)5S_y#%eO-Db4fDC-v-hyO?lR@BNvIv@W?nk?^REt58<6W-!xV zUXj5;EiYj4_0asrjt08cMv`%&c1b0sJ0+&EqEW^j?p5Jh>-F@p<}t@8?4}TXFQWGT zNvg9u?daq?n=&9GnKH!TVv)DS_(<_+NIo-d=24kk{~)t|l5BZrjMs{Nwbs1}UZXR4 zN^ewqONdHl=H!`2MYXpk0=ak)xz9bSBl->9tD@TFNr4v$uRW;}V3AD(nb@SaT7u2* z(`lw^u*KFt!^1dG6XhjjtgS_8t11P0`E%4PlWFf*)IOIxy44acp1G7fO$^uSin#Co zOt3>HwE>euGH)`RmivLIt+Q8Dx+`=S_IfI0Jnns0zUo@-Ul|AXq*}%T60_7qs$5wa z)%^P}f@kd=CoHlIhy zd@FvNYT~X4wL97WZG^5}@ZAU}t!i5HJjdZW&3io)eD<U~AIF|l(JtQd8NRLOXe zn(b4+^1eAHCQZK%-jis?P{;g>}2&IT3s(4(d4;8|u&Z?V!srI)~i?ttHWZ+iMG)8pRSxhiVP zugNj%#_7*68O$%OO3F$j~a#IK`YY13S@V2 zRTbs#-j$UK-LoClaV8Us2z-_~N9ArA>>iJmD{O8|%PCj(qui)wVd9TCAzF97KYZDmhMXGzcP}ovTQnKx5pz*0?(bZg>!YWL zxA&;b*>slVuE1@tT3>tI>5OVFecejs)bn8XXc}VafR{S6`865J8_zj2d#7T_h}E=B z57Q>Z`P@gS{qi!S=y-F{bQk(7Qc_u|hf{xjOYaheObOw|6G^k;g;DeY;|12fSN5lB zFXDa|H}tE;jSY)hiR$Q@s_+^Y*DsvkhVft4HokZBrZKQ5?l}1fAQOWcG zU30xjdzO0cJi%jo;ZSPGB5C2{ClJN zm&q{Lt(R&x?qZz2bx14<8Dd7!t0wzalz3v1p*J_?wn>sJkDSTCW4E7mMAxw$481 zCyHOFB9n=iu;SH1@70Ij7QBjY2{h2eE@{KnkGBsIsCO@NsPC7DR5&B@zGCfF43K*R zJhjKeoI3=cREX_7V=MDETp_$i%yf?2Y)+r%c^-f+%MWPck@?^12%~Unzg(7djpt2t8!z2aSzJUou{}2*z zfJwlLN-@V(iZ0w2*G5E#ilLqB;{q5AO`b^%H99 zm=LT@UwlpPvy1o6F*XMpe>huZx=8EPh8D<8HC9{2_gbTxuc=uqz^{eIFX?eHKSD?M z>)5$Wr_tnrTypvzb;+0!v&GJAmt8|bn{e!e(UA4A;AZS=x)a0ZMXm8I!&?#=O}~n3 zCrk;0w9G=+)nmfn$Rv^(=WFfSM4XQUsyd7LG6jx{O2ct1QzuyyLu%-f+)?_QTFC$# z$z;;}dP>$QQ&OXM3u%^0G;ThmQy}A|lVbAHszu<&B;i>qyklOWf+Os!D?)YWGUlJKuJ9p8zN7T-BMUCmbDV zydCH-GjGdcAGKtjSR|xA5qXLGj)_(i+^~_?JaJJZE@Kf+6Il=~4Q3gs8{=EFGG8XX z5Gh`K71G*WS}ix!nYl{xuUIZdwT~oRDED`sK~q)xXq7BKAhHJ%S>qaR*Rw1zs{QV! z!uG+gihJMXgNbh0w5dy5nLtP+Zd$T>4~AP4NRdY z((KRx5n<{)5p@rix=Osv(S+6BQ9tiQhFeTmBz8{Nv8avFej==Q()Q+48F;6qZ5@lF z+S?LoH}k~A=8lwPYE*l-5%uQ#h~Gnrq;X)Cn>qPGmB`JS+?R+33NqGzED@Ob&?j65PM;}?=eHNVoNWik!i<8sgRE^6;Ml~fNWDk~m$ke-6l5SD~`DzU|W z77CY}F7XIXP(g;NecskWq>;Wy-FumwNLGPXOA9@Wd8B`H+c+OuY+V|Zg+#UIk(xMX zDrfOv29?1H=Jc*%7B{LXy;IL)YJQj5!9>+V+trsT(VLfexDgd)dYti%x`qi+8qW>t z%1csq46UW{Arc9mi4kES6WSoR#Rdq6Z9S?}}A|!kaIMw zENafqh2iY*8sgs0F0O;m>~N4Tudk8zrVn{`|@2GrXJ%c-<48$dF^c@MBR?tVsH22 zJ?zd~mJ7Qa=u$z6l-5jO~B9Kro1gP z{auy9YD(Xw8fGluB<^qG)|2gFOtSdUkjG68O+??`EsRG~pHdS+JgLfxyt{uF)!vaw z1{nQb7}cBLWDqQ!>MyBp^44f1a+8$AZXZ7r>grlIUXC@{D4J?KDO1tAtMpsyi%2NM z=N=Z4;RIFPi_ZS8zLj*fX={>Dg0RZe4auXLhKb%g8IP|{#^bi3UD21V$jz&$<~+4# zT-uW5`K|b7)?AeJ{*`J`)NGQ$oXkq*Rald+E?bZ=E5kE~`aDiyl8?fYflZWE)ktS| zcbOCUE47DR!&+s;bD^Eg($*dBJ$0O}Yp8&7%sSL8RI6CPDX$tHaT)SbE#@JvRl7`& zmtmT!;be8l>M1@{so_>j-DQmi2l@t>W7}q`H-g=iQ`BX0th|EH(@ds*cFW7SdZnPa zOC__cIjY?we(+a>asy99vNWyA?i7TwHq8sg4pCLoc(IgJ?h`aBOf$(;C=aE|XuYbN zMVBDHKX$h%_|i?|uG)Pm5%VB61GV~mUkFC3N1f8IYQ4G#R+XocgCCpbGlz)?Cn7es zOT>*ty1u+F<)~ms^L11v9%0oyQ7vYbb+sT&qosp?`2-SqL7tapi%9EWLRw3)K*XP7F9L5(xdKX zGi5mn?>CZ;DhWc+fp>ghAzX`z|_OX5xF$3 zT*+{O2L$@nPUc|z+!t@+tCDhQ$YoLUrz){udbieiODpKEtJi~JCKlnivEcobfT$lb z(y%f#pm}s_YA~5!OqsZMrpR*xWXiQBQ)nca1d|H1da}K{C~x9mlA|p-C9BDl49}KI zK(VrtD7n{BBpGQ-T@Ynf z2jT0fwtU+3>dKqaFpD(6>}xox&zNlU-HG?WEc@f$*Aeau&@ zRGDt>NM^dof|bVRu(Ae|ky-pqFYo7aukO4#QONk0XOX@CJjy&6f;1`uybguyYGveo zr|QNA%q&}C!|R*7f~UK!4sKOm<*@d8PJLW!WHN<5Uh^%fWtGXMV&jfJTS{N-SC_Ys zsHt+io^u$7**_#>!fx)V-C#;ZU$%P{Ey(-V_zaoX+1JhVdS6bSSanYT{6bYsiDp_F zoN~%!nFH+}(gatDzZt}s<2#naXM67(3QgK>)VyO|5H_l?_P&s$mIfZ!@JrHcH-_6z z6>eqJl;5YJ)2<>SLur)xOp!Z(u@wc5*W5;A0bA|pEbDeEt8(--&r>^@=k-!)G3^Z& zG;V;#O5I@X*Ih}*RCPQ#mE0Bij@k)gajprQ8iguU?mW0pDM=sNRmr>+^*o;sZoVg~ zU7rp0u+C5}W{Hf1wVzi5M^#z$p$81~EWLYm8ISKN`RF zTlb#5&tbd!N6*{e+G`JIk7s>rU+u{+x=dTL2Q~}@BSvC5O=b1Ovfv=TnaL6L9)0@E zqE|8JrlikfB(^@wR+GdUHQL3E)VN}nPK0;h6|LCiy5%p;9S;sL*TA)VH-5dJ(`8Fn z`L*5knYzIx8f-B#{oa<-Ph>*ZYjS?|G2a-JlQqyEXe90uImcwoy)Oq~8dFz%RdCL6uWWRFV3a5`)JwJT` zJ4tb8^K(j_?z0RI>kExa^_1YSwtJZjk~(PE#zD>!gND-4rsKOt-1JP$V^oulHu$wy zXJX5O4w-+!p*!i`NCn65w(uQozsHVP6 zuQz9nI(F(}r(bSqMfu58u5nr18K)9A^rI#hjFP!6L8ET?) zT$7S4i1WT%AViHx@rsDc1k~m7cvs&C;Gq|e z=WZLM7{t+@Iu$l^klIrp!89~Juw@`SKIS|iKhtQ^Vh8-I5*EvkozhmO31y}}Z|+Vh z=6`9TL>2hFy3B9VMNi#&Dlnd57c0^9?E)+9l#_iTjUW==2Xse1FGa6s@ zJko2HpZ0adCPB?tqwQb^Z$mX*l_RoeHKpfKkAv;ANkh9 z4Ql#1>?eodWLNg|lRfj_xT|dEDt(An1+)_THlhiU`sSm2-{xMaJ=?CM!?Q|P*<4Av z8){|y=*gW;EyHXN}h4ppt z(H&koFRwd$R>3-NL_^bT{q{gzeHBSvJD-KXF9qKPzHf$Fzb0G3aq1){iA4IR!SUhb z8$%c0Uo`K!!Wq*(kU%{}JI?`kSIo+EjiLF+sLJ*f?q8td$^9)W(_79$Js|>EP}a*<;a3czArR0(Zy9o-I-@I9FaPmCcrz`zuz(7THA_ z92NO`mvly+`yK0L!a)(A#4bJu+&vR}wl0BsiuBvS@h3DrW+CwB!SN)t-D=SkqVJri z;@1_IxS-TiMbS zIb8*gKOOtpBog>T;P}oJ+vLySxXIZxy{8l+{pXJJ{Bd}*M+^8J;P|X{^hcZh0vv}l zn1JqzR&KL{j`y7KJ2Tzpn}yJH7dZZ3rb3(ha+Uk`oVl(E2Q9lh(=+G?li+w}wI{HC zKiLS5Ll&RZlZt4QN5S0>OEqbgH1Jo!@xZcYTKy>S*(Z4U@S(B;3h6Hd$AQZJlQP#+ zq`w{ocaiFp9C9p|<@Io&WZZdqOP9l;1VsLz5I`1Ixt>AdR*k*6MCPdpl2JSy^-LsQ~ zJwfe9^z`?pc1@Cgou)1FGU3f)2PIHXk>}CixUt~lkwiYJ$I6z1f&#KC65HTgt0qKE z9v*f5curu=amR=X`%fd-FG;QAbzR{QfiqabL(^g4?h4Vfd$l2P>VJ1u2+2!Mc1;le z?fp{Y4FBk_NoSP)VI<-8o3@Qv2z<6qHgyHp-iK%w0>3qIXTh6(WgrXDciskv{?3MZ zHt%s{$js^QmED)67`%}=a{5t=?cq9KYw3(U*MmEMy=Oc2$Q1;B^=Y0Sg15ej>}#1*_R)Gc_kIS5RS-WR&!~NWwwpyK%xp(=*_(kL^-{ z&LOVM=cN=v)2GkyJe@sU9tG!vLm9T^DY2d+{SDwSh1vNek-#4YhaFse&o6;P0A@UP z(~rnLr}ylXUeitES%{jh1$Tz0E^Qa;G}x+m`np=4eRT!76F1DHDoVN?9P*|uNuZtr z|2H@kO=6Nrl;q=QyM9=irfZt*WlEw!o`uk~9!aNJ_P8!22?V|y915hpS{UW?&hea_ z;n=fBQ(`?uNv;8h!)Qlqo8Sz?s#E8XJosGK1d-6@Dkmofc4y$vNN;5~A_?ElZqd}S zmhmR#<}AUgGs8tahR$>CFxlYeq@o6XIyl6%&N(gctH2?o+5Rc9o&vuc94eY!QNW)C zhl5rek2}HPpA}c);q$%xP|sivr7R-SNa?63stDOz_4ID9jkRID@0s!mO#b?-sa z`D8u&kR-35br05)v&hOT*`8nU(!mk4U6OS2S66$K;{qh1eNhhQcXcJBM)xA=tgh~C z5aoOU94?pbr#zjB6?-@*Ybi~kw=U3Nsw=oywnJ%Bh&;at4iAfug)c#N4(5~2HI@78v8Ja$NftM6&m3^&Hle55`Lsd?H9XQ-6s12#Gq5nZ} z*iv?R0-Kt=2@WU9b{6m%`m|P85S@zO2+jqExV1U=_%0@W`W-~!$;X4W}1!gCa=rNG5CJN&#^Y2;I;kh#zLRz;Yp0HK zj!bwtoUYUDCsB@L!JVZOYnBsp$~C?nNoY6h5mQkkr>DT3X;aSWzu+)xNbeLH|Cfi* zG?#N>JIxT(Ca_>GDBILLjhdt;UUdJ_HU&ptDW{{t`H>0Gn3Ozt>9F4;!Gf zj?I^JWru=051?mzXe-E*%`$9-uGhH zgx#F|v)jX?&Ta*dc1XF0&M%V&(>Gs1y7&X&Si5m$?&7}%$Ha|SNf+M@?w0NHSU*&z z|GL7S-8th%`NqI8WZU$lTu*_22^Q4@-?3 zsLMTO+9h6Q4AaH6`#5l{(VdUZ2-|igcB^uC1`5evB8jEfmS_&R6UhS$v%%yV&lA&Y z@f3O+IObOSTPm=gqRg*=V?ecq1^jRw`05IaXy-jg`t{)0IJuiEsR;ZzaBP-bmyq!2 zC+~v0p;A|%33R(;^k_F6mdDn;YrRZZ3yUY`UxT}WP&Q7D{45+k>9_F8+PVBv>pw4@ i5NYqq<}Y21s#^i=@XJ>^OKa(bojIyQVLvR{WcEM6)&@EN literal 0 HcmV?d00001 diff --git a/binary/efi/lsiutil.efi b/binary/efi/lsiutil.efi new file mode 100644 index 0000000000000000000000000000000000000000..64eaa98a54371670bde03838e76182053ea0fa60 GIT binary patch literal 642560 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 literal 0 HcmV?d00001 diff --git a/binary/efi/lsiutil32.efi b/binary/efi/lsiutil32.efi new file mode 100644 index 0000000000000000000000000000000000000000..8534328140983bc493a4e04587b73c2e3978eb07 GIT binary patch literal 384992 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 z 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 T$u~$utX%u5<-q^9IPiY}B=XnO literal 0 HcmV?d00001 diff --git a/binary/efi/lsiutil64.efi b/binary/efi/lsiutil64.efi new file mode 100644 index 0000000000000000000000000000000000000000..b1e91947bfd49bae508b08ee551ff81f79602070 GIT binary patch literal 913920 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

sFHe7FI_&S@ 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 F`UiY>r2qf` literal 0 HcmV?d00001 diff --git a/binary/windows/LSIUtil_amd64.exe b/binary/windows/LSIUtil_amd64.exe new file mode 100644 index 0000000000000000000000000000000000000000..8a701fdd9a124e3a695a693a43c3e9d480f3491b GIT binary patch literal 641024 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

    pPY8 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

    obbars8!Il6GHBY(Z7HSY}=u0kQ4{-jM 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 literal 0 HcmV?d00001 diff --git a/binary/windows/LSIUtil_ia64.exe b/binary/windows/LSIUtil_ia64.exe new file mode 100644 index 0000000000000000000000000000000000000000..662a99954d4a683fb338d8de47238784b622a9f8 GIT binary patch literal 888832 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 ^C`{knamu$@%8Tp%wp8@y0vfvBbHa_Y}IOSCii% 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

    PXJ5YW^d2TZPNs_f^xx!%Pb&|8)iTZb zvV?>GZALzezd_^=ZyNGCY>=Z1j-s9v^Sxl7k<|DVE1Em`-aIAR@15-sR>+&2r&OVB z$0zTVcx9|$ZkPC99sD|bmoYT_HBhzJ4@KFZR^ZX$zmw;9c-U5|^etI0Q0c7^4+P(3 zz1}^@@A4(GKS|Li_4!8C(jxM2{)=~XIbRm}vzB(NDDr2_0G?CkzGb#Q$^OQY-=f{w zNV{_r&qfZG)K}jDK5#EW9C|Ug?oLg;)^q(DpG<%Jiw`6J^?JpAT4j{1x}0ypU#!mc zI8T?l{@FnPRyseZb&96$`k@yz|Cq^dv0fDZ0sNe1{yY3l;TNC$*bKeoL|&+E)DMrh zYKXR1eJHpS44gU6&vdp{hGZu*bGBc|g@aN9`K5E?ueAWP8SMQhmtl-zg&G0Yjzf(<&!Ow#4 z#eNIopTe)ac_#ZCRZr6Y^s&gd;Qiufbo@y0llO5E+{|Y(ey&-`H$(R8UH39g#V%s z?H;jqiG7tZu&<&IQ!m(F(?b2@;ol(dQ+JZzkb(c1^QO(?jeLEszd)bIYUnG#C%`ws&pz4uxJuqY zyd!nHj31$Y_vU$(JG(NGt;nm;o(1^N7~huh;ir3!+j4`nw`Q%YkVo?VAB~?rYJBnc zHSsrGC(vis`uU7K561oNBx8t^Sy=C;22h3tRz=IE5jC-jf<;zv}!b6K5w zs9HW`P2vgmuOh24BwkoODEa~G8|M3XR^kV>NC|$z&py=!|29g-1m|CAZ=N5@tJC2B zYc&1}|1PY8p9TFDe+mB%_;pLjuzggVn z9aIJD=kfCBy~_K?4Uq)=?joZO{)hG%TdFt5rtZK8Lq1nk;%OTr${adtaEH0=pxF|h zUhBmQ)&byAPh?NA?pOUgL&E>nx1Yg2iX#Un9GmoZ;pJ9(jGz|xN+)n zfsOk4&}Exq!~CPW%$D{$`+637(J3GOpx{}f%e;rho}H)?Z{Qu|?+E<3t!RxA0$&>_6X3)r|d#THoczFY&(4b8vpi<1U1)dOlqhTkVgRt7>$aeg>!czN&iX zZ*|t+Raj@1lC-N^GmD-2z^=l&ww$Bl_W1ov)#c7h#ns;5UzFt8HI{1r7E;RnJ@-GT z1-WBC;zx%U9q7{Vpi|QeC7D0aoS>e~##`bq^*nl_A?rIM5zodhXz)k7i}r2}zg~D* zxix*^)>5h#sSS`XImZ2d-Nc{Ajg9DAnx2~ZUHU7cPlHzQTl}jk$usynq~iWdUsX%$ z^Ty#n-Ytsr9W9aRwcHOkMLiGkpOkgHI$AiHdQA@kFIV#)IOV%0VFP~>%|HxL9!}-5w{<>ZA>5!jU{Kd(y z&hpF5Y`Y&B249cP_no|-@2Azd$h#JMDV`H|p%<%X`My5L`1YlYPkHWKyFIn@smUeP zPM%}6!yn|lOJpzYVVVEf;a|MBC;Q4R*ROHsx#Wwue|cfMZI2bz$&U5-wsl?A3v%;q zH&ipW$fTjxeA-)B-?{P1CGN3R>S@PE-VOiVp1*R5KQBQ(Mtt~yw{R+Q*`-TV_{j&? zwW$ZCK8v$O^;GA5|E_f%>i&0o9fj?epSwi&*QxG0;GL(w0#RBC(Vx`oYi?Ples_*q z;!tF0i2Pyvx$zr6p#1O63#oE||Fz@yy=RFN&Mow;{NFQQ|H7{(9Dnl4p3#T-{>EjC z&HIhfRUzIdf35*<{DWTtURmj{ChzO~k!Jj=pl@}#BF~r_{0Mq;knhlEyyb$WGF|FP zD0ObRV|@2VdK@0H4|IN$G?D*H|4sY~(^NUkm-m%?Z_oetH6HIHe}nh)N4;O-ee{&&?Sf4qh9mIporzF++}z<1wY0^j04s~$ZcCcbqi z;Wz5R`c@KtMj`?J0t0?(6O8&W-9i1R%ii6_wa<6o9| z$4E`@ALqHpLv~_|`k~MIitiG7WOn^BLHj1-xw9+hS!16|^+Xm{#5AZP59>RtSI*$u z$S?S#Ud!a)Y5xWCK6uX2zp3-ds-n+5%%A7@+eVIhKPmG`Oa57PC-c+#POG~^spke- zE0;KQIye6$$9XqO2xP#A;hWX}X8(+H9x#}XoR5pDXGVAy`^Fagi2M-jx0;OSonzpH z%ws}y*AD{UI=mfw7mVwTw?O|Yd6;^!*aw_%9&DK=AJ3uvJYAn7{sp@yGsF_ z-(J7l@xoJ<+C=JO(Se(dxDZ+9e$KP+YLMqY&CgSM;h|4clTFv+j+;8!K$8NvPT zajEZLZISqiN^t(5ZiT?t9mfd%Y5#@X=UE*hzQK9PlIl=PTjvS?()p+|KUt5~Pq3em zPx1%yfBsh6Q^Z??=X{T>ADJik!NQU)%25ftAieU(j6Y^!Z^k16@5AH+2KbsB1z&A_ zK6LD7QqO>R8u=IabL!FPA^iKM13t_9P6GTIv$-!}e5JW)nf)+E1NAP6x-|NavcH|l zQHhuEL;sZirq$W}Q~E>Bf&aA3tViop>iV^}oW>u?_ezVuNSV;Tde$@h>tXJ9q24O2 zHp^;=ckG4UxQ~GISEldUK8qrM+$BEX8{wzd`X%B8YD!&-eiK?WZ@`ZL&#tKCLwc*0 zg|xqY74^*15}!`6A3I&*{bPg7zxvN+DC0a5V}6wm8J}tJpHj9emLGFM@t5`ts(R+$ zm0p*+jrwRR#Qp~Ltnw#Z)@l2v|FF+-Kh}PZ)ceQ2vO}T|>hEUY8tKhF#R zZ*M#NM~$2_6CcR-5+CqN%%_V(7phl(Z%uN3iu@3Pe+YT2hO4hjz4I&Zcgg*0^(gTH z1N;;F|5Lfu)t6tXc`(S+{d8Pi<6Uj5-x42S5(fVPUnv!}szDDrUcp~&8pyYawZlm%Z_MGw}k4ctP46 zdqDO03k!4hJBSx3llAEJxlzF%Tku7%uUg`Hj(qz&;8Rzd!EcR^r2*iR>W98GKI`)l z>^JZjA1p|H)4HQ#-mSUvLUr<2$(LS`LZ2AlwqmJWllxAI2cS>o44{} z#w!l%^B+R5tJmRg^6%z3eGl@ru=|`De|HgirY59*ztgJ6N8Yt+c+`78ss@~+=%YpQ z%iu5Ezfm_Hbn$<`^Q42V$uRk^{osGK_oKa*v3$$zyS$VVd~L}~zGT5%>n&50$kX}` z=(lSeITG*#ZI863`pxV5R0#a%qdELV%YQl&{a5_i-cXG1%PU2mJuLW|zZ?0X=NrEO ze&Wdf1^DU=NxU}yW9VI(!jELXG<>_#y1w&Acwh3zAPSTEE*uI0-y;Jd`2PvmGgEhp zy&Tp3YyK3fsQ#e;0vR0LB<5_lb7{8p16QV)szDv-|*+*g86j`$4mSNgMj zNH5Cxo$&*+{_x37_$Soldhllmd1-6 z9TEBNJ_J6ZMn^MFMDokjbKF0GQf}LIFuUAZivh2xuRMVhN9a$l-?#L6)ckwMhpg!P z2TU7OuDn^p1AfV?OcZ<7QNGZlBl-MQBro-Tu!@AfLBh;Wp}&OK15?mP!TD>!zluD| zeLSNrV6Z>Z};S`1C*dAM_vB{jbEH zt;QTxr+@5|@x`_pjb!LQmLlH=eznc9tKYyL>KHdpx1oR^+}C z$E;Id<;Upjow+T*N0vf<>0P4l%KZl^3wf>iP3Q37EWFa(9}T>*&!sdG`EOhC=--$9^+%Zh&`NWX@#Maf z*s$mIXSAgPQAIhQrQ%u1*YJMRO}(AG zd4@;6E#ozP0~Xd_w@TRDcUqDAT6B9gg1n=?H|s4} zoTpPaioG&6fc&in>;F9T6s&)io;sY4tm>|}j zR}AQlSU>$wzePXiL_e43v4qCwS^WxOF~|Qk#{0x$HqPLCqkp~+`Y#3F%hG1&2R+OC z#ekkeGx<>7Y(7+d@gVdY)PG-3{!?1=pHxKfp`HCwx_*Bx41L!v;@7e90rEv`Z6EC# z!2hhaoiWknMyQWgZ4>&YsITg^zdpqGA>yw}RX&D3A4Z?|7YaQk2Jl~}gdeKn+QT{O zvr^y6G0V{Zjwtcuq`~|PChazqhdy)LV_r(Hr{O<3Qjc)@j=A$Ixh5XBKgRg} zH1+uv(_Mz`S(EVV;wMk{POHKM`fYhW zuwSh}-W}SiF84?FFB*Nzqde~)l;>3z_r14euRP^5se6o~8olB9=hc&4sn*lbF9iNp zl0~#R#_8(r?dE3U$6@@3Dt`Ap%68kU^RKS&YDIsDOME3BsWLx)_N20YNPRnjr^+99 z!st_R;wcA-M|m)1@PV444*2uB*c*4rdJ=HRUI)_3_>WW1rjvT9Gx3MS6QXZe@ZUf` z{KkMyz0r>(qTS;w$xpI|nP1nGIs^I%v3`ap-$F?}N4NJH&3_y6&kN22lqz%KE%>R_ zaqrui^4hE12XfSUtUUZIX0V>DDeGC?J})2K|1Kjz4{6<>p5H9KHp{z_g>&WIh~%H8 zHjvMnI?43jUf(78RrLYKAYS2_{i+pwqh6oX^OX9f-U}_;KGap*FZzRp{h-GF8v7_| z70C}VUv#lI!LOJr_*OFo-y+ykOysehDJMccmD}FN{zNVGOFM%7WDQ4%Cl<|pz{lK0 z{CXGdod2+{>#J`};Savag&yL@82nVu8@P`$pIFv}fB5^*4^#Hbr^9=Y$Hs{vX>>KRI6Vuf8=pn5wpZMUA4ws#U7? zh0k`{^>_FDxl{kdap!umu`hh2(^e6W^|ZU_?{V@2K^^k1oSlpp`2 z@~;vyUuA8S?+?!Kgmc82U z8G9;=JvCx_kE$N$xN@_+R1JG-cK%L#9)6(L=R6|&wF~;`sGJA9ogD)I%$=-nN_h=> z(eJbWIp8Povw6#Vv{ z5_@U9aE7vLgWUh1^SRq<8zrCnoA5wh5`AagHzOm)Hh`*fpO^iS^JPc&6MAKS!T!Jx z*dIM!tf$k#PjJq%K9DicdW0JJ*}}mWpbZIu>PqE?QRF}w`I|*?d+u)<=A&mZ#%!u{%a#@ zSI;RM4n4Ep#Iv*dNb<+T^T*5z=cU6-yJ3<-KN^4I8vi7pEjnWE;XX5C%(Yb_yF94J z>1%kkOpE@Mw(_aC_oZEfO649UKP_c#O2xB}?6)25AL{V$f}Yfh4MDvcgl>iB`e`3B zwy5^_9QK{?=kbeQcs2S;Q+v^-B9y#W*-}Q&k_o|lU z+xfq3Kg@;9%?|FPkh_Q@?G4~@FQKR4bwGk%wbe|@v$^W|T~pMiWzQQw;TN-4cgKA#)T zsr^qPuc{|qdYt6*eSJnBYMFjT^v!?B4yLH*J(JHT`a=VsCd%UfY{*yeD?eY$Q}l6G zYOboSLFV#anjMhi&8^wQ{jXkCoxW|@_q<2F*@-Dw0{lbPV^edR& z5cxNZhyG^RwmirDC8BTbh`dU^-@HTkca6tX+!lH0Mdl+$ACyV~AB%d$d zKb7-^gX3he&<_>*V1NB&`fH}265n^}_XGF|zR=$$8~t%SW&0leb>&wUm)g1=!GV1e zm3(EFpt7ynQ{>-_fBL)dAATS${joor^?vZ2e1rbE|7$n&(t~`ex5)jJb$K2q9|Zeh zxA=R|pSxA)#YIWGJx6@4W{?`zBk`H~qdzgS2L{D{bq~F$l0DiUW@O&bzG4#v_@a= zz#a_kF>J;_UXO@A#C=uEf@k5+w_+b=PRAM3n2-49pbtp>uHX++Pb&Qb@~t#|#v@A&_)(VpyNrRq zAQ&&f{fPMQf@kQ7pZ!PgCmx=aZ~3RNXQ`Ja^@N;m{98`q0Q&zP!Dsr{{%r68c_UrL zx!++f|G_`#uwOIp`_xf7&{;Die{hB93#G>;KkPpI%l1z4t?XU%$UfYSb5)VugyK*RM|Cm{9%z7N5`a-iHxi5={Sf(K zGM~P}if)BGlJTP($X~0r_Zs>>npMu%g7NP5`xigLebasNerMtcJtU4A zU*yTr<8uf7dd|mNq5g9OXm)2xo$HSns|7!bmrA}G`e9n{C-fop4J?QJ$bfSHr#|-*AHc0e`sP$~kw9;XqF> z-qEW12FWMvebc-F-WUB4dhvia`S_LKedu4)uP^+U`vc(*(lzm~PYZt#dtA3W3^Iql zi+kjJ7x{+i_+j#ED*l@)IujX8#pf*LAssl#T6_^pcV|zPkQYR`iE4&?seDRX^`)!mL4=z z-;ZvZ`kKV|>X)2L{WzvdY0uu_1xa^B`r36Dt(5oqBlbM=UDX!9#o#>5xu0%x_+v;} z${hVZ4fo&v(k~YPUtYZM#&jxTBR|?>(|2^Gp5=V03fOK-yoQIeG5|+@f%t!pg{oE%3|BZ`$t?rU`nt*_o@3cFH z9zXj?=rHyy>nGj^yn=TA*M^?Jw?b$y^NTvm-^DZ8%s<5=E@Uou`Z{$xs8UI{*)2)v!c`2U*QC(*Y$ z3X7GOvQ3-w@)g1FjJeuNd+jB4bv+qJpHde3gS&`lJs$sa;iD{cZ<+ZxCp`Nu<3#0C zgHq}z75Se2&wXUXI8ER?cH^HOKQH5}#cKD=_;OyeNq7r?T*&Z zGREUk&a;&bl4_V54ZGbg&+JA1w%5r2oUW?<3F!*|IQgf6f835tVCAVPInQJv-y|p= z%%^$3a_8{A>OIrrK8?LsF46DDrqlR4>z9i@E%H4Y-Ft?&(D~ps=G&_~+NSSlO<30T zeJN`;zq2a$^{MoyR8O#8Ra!xOMC13g-v7~2C*($a<|Fql#q@erTYsanBT|^+?OEt zi47piylxGDrS3VqJw3Jhb40UldW$g*erNeUfck8Y2gXhlY`_V{|?}?FK%={x? zA)jmk^J|To8<9sVPJ+J(egC_9@(=&IPQe=JpZC#6IZqsq?4iFj&nmSC_-F4^-rH3) zzFg{MlE3Ce$XBZmwNK0a6T&}*zMQp&`p`VbfS(l9w)U;+O>ag&FP$LyfaYB(TSead z#dX9NvgGT0L2ua0>B5pQA5xZ;e4KO??*g|{%flYBOrgxwL}^ImUZ ze8=X-vl-t}`+rD&TjhJ;pM9UD|I#Svjv`ZJNebI=m7erzR#&1#6utKuLwOcUXp4(#20VdnbQ6>i^~tViHO!#_hjIi zR6}QL{>OTz&lLW87x7}ZU*b_>zYuSJ5PVs~v+#qmQWu=#b)?piUrS4e^*t*9{f;Q;8QT)TwL%){0ACeRPuF2{**%B z)bNm(Y(Xu9pnT*n>; zd}&IpQN$0aFY2$RKgox>miqD`{1YuY{%jKO@D1UgJB={s(GCdy9xl!w@Iv&bbo^M1 z)5RZZlK*12 z2>w;Oflt=Lf8y_4&-|0-C6K%1d%0^y;Q!?Y?WJ=KMI;0X}e z5#bMW^0$DG8$~|FY)b!;za{*j#B(z}P7DH{y1D}VY2`CF1NR@@6eR!Zk@WsxVf zFYsL4Ch}x4fi zwLT~Qh7_d~(SPCBU1{-$dBVT-c|=wG81L)+D|I3KyDR-)&`W((_!U39P3K?fe5?BT zLT_cGgul$(X4|@*dQ}_Y|1v+7cu3;A@EiO&a()Sa5a%P=f2kkKA16LJmp?@f>Rl+4 z{dY|9r;gAr8^?O^9|ieZ&G?zq`kwGNcQyH1wqCE!w@URZaw_PL_`(6^FH^&QSSj*q z_`*s@q5bCa3RRNxpsKu%`m4gPof7;hsurDxd@GXwhF%5pUF(-d2G$emE)St+oDt|QTg^@4ok&o`-M*bB3QRMR)1NnC( zf6BkXC10<0o&){%ARk3jLY_W%Nu|TFS`M$(<8z7Pm1=?4RtH`;h&+qmjlC5Yd(##9 z1^#b6CY?1)k|73f?3lpE|%Advl))o(%{Z^@n ze`n+&`YT(+!|S04_+2%wl=IxrAwTo9w@%A_vz#wqG{Ai3yvs*ek2Y*8;ZmyqAnsf`59wgGP|A$i`Q|FLsrBf$po@a!wtm zkmMJkKk4;(k{{PRKfy=k%Xno=@|9^j7}MkH@iaVCep|s`KCXW0U0pSPX#9$LLhyUX z0w1bR_|5fFy$JpFD}O)xSKeVlf4?KX)=b|MKZ5?JDwiG`tjELYE%k}$Pp{X$5&f#u zm-?UrTF#e$oc*=K?8j8^Lpt8syuV&cj(Vj=u)nRqOG&(;%Le;7FZI0I-;$=?9FzK> zsaE#4zWgzx$^Y-QOiR7Us&UE8cq1>XEW0E0RU&^02Os%zE*^?*JbLJpsBbWe$kkpr zEBQ&}A3j6}!uhk=Jf5QIx2OuvzTSZ|g5r0RbBBjhuYFC*=o@4vj#;oks$Rof*0 z+&4|tZEJZj@!!a2jbCvS{!l`!l)U(s^&II$*X$akb$5d)k@GHaq;%^zkAF$&X z{FR)a{#0MxXn7~+*X9)}$YkbI4sR3r6Fp44?ICj&_3uKjWADcfH}3nf<$RlunZWtW zb;4iYFY+P!G4#Eh$fK0Gi}+O=_|%mer2naP(muJBc3b3^YgQQlGp+PLHA;I~)+;xG zlsP~59rRDLxQzPn(*M|3>EGKR-{;XMRoXZgf8a-W_74J&*zmv5?hNtlCPd$kKgM(X zE}re3(mpQwUcHUy>Ywwh(z|)~d*uBON_*-~p0g`>b|TVVk^Dn11U`DNNdBLT{n1@s zAov-3j(p)1j(hL@P8A3DzWqb*VKM~?l5cxCYY^i|?NFz>u2E%2d#_$#EkvC>fv&*>u(%{)v5l>}xsZ_eK6meaDwuFy;F>I&(kworOg|;}_@)9{hrj zGFwESn881#CQRihy`Ro&vfdYhYPO(pPBk;9AC-f$%2wQf0`_=5_i z|7@Th)Aq-^$)}-H&Igs)|F-GZADYR>otpP$6;+-0s0HB#fsq}{{cv^==aWszC@L)1?^J3eNLzo7lJKf78!3gF>eFA6-;eBU{?ewJR6 zqHosJR`iE8tly70+&7sub2p{41I(ahSo8xVWMyG_@S^!ks^9&qua&rOi~XpE_ribR zB?lP8ubg*}anXrO{Fm9kn6fv_?DuEbZ`()?c(>~IYMY_TON`WqypH>Y-8yF_#yr(_pJP~>;uN;A@4kEyxq8$90U&iyyP23@6^}spZ}%5-Ol$) z6|Vr_1RuTgAC-CtMebi8|I&lX@y{QW=WTKxVftsPr+)rT)C*TR{FiECEBGq#=~8*| ze~)eBnf@Kfxy1Yip$|Qun96OZ|C4}+|9;7zQTH?6xB-6a^#tSj@0+C`wUv7RQ-j}} zANVi3g7Gzd%XrQFD;a++XH=C3{M*&>SKDn-&i|@N{0Gac;q&DC@pnFZ= zFLcAmcU$Ba_ho;(A>Zv*CHH?DT_*Sdd|YW)szCm6DvW=q{%Q8V%fAhLbHeD?YWi2m zcYQuI)epRMJ=@NjxmEjjJn-{B=gRj)JMx|UZO$igNvB<%l=`)k2SolFk=Mz;Z%2L? z4CYg?kneto!=W+lKjQxS*Vj67evEt=wzXX*3a#}!?E3;YQi6MvZ^Ny)CB2|QyHgTT{$kn@2)xu8SnKiJn*b0g!k zndJ_9JL~ax>~HYHuAKP4d~+lA0zaF2s8Y&C_jnKGw>+LebDM? z`95+T?Zcu!6jo!ON`0(Huz%y*r;Xk)^{~4@$|3&JFM%A!>W*hj~#^f1Sp#T4p`rBS~Y##SlnBVr&(iFFfd>_=O^}qVS zGfVtd^!eC`nMc0~Kiz{5f-q|_w zZz^6jIPY?|k)Z!uYm2Qf_H7B1?_@@K-lFF_aD%{;X*iv=C&@?9^HGymAYW$I)0lrJ z{_L6cjY&PvBkQZCsZZEhJEBhv%lC8zgfu-4M~OGqgnt)?*nd@`J;2X`tmlvRBZ>a0 zCSLu>(#2Yz_DhPxR+B<+Q{CXJH4=q?tM&&f9oe6L=jTi8-@W2^v6>10E`-NfPaFDu zgMXYr|6bcL@R~TdS=r17AeD;1D{FpI_!H;n{MOQpK4|oYpx4REXXfV(C68HB=VWiW z(|YlSfR1&X`k=fu~C z#ot3d^bGzc!4D&=-w&zAe260db)~}%C*Ml$+Ii+9oyo`-@u%^_e-p=lqw&Lk&%YtB zG(M-Lzdza^jnAL|hT(NiHpb)o$&a%?$P4aw5_+LeiGP0D@U!Ygxz8k%XMVW`y*2O? zKEbsY;*tXD8%^x1#Sne+YRSKchOh+~cYP;=jC){Me3t9!?p! zqoQw7u@Um|_txb+xA7|WM8||V1izbC=-Cj>hm36ZlNbL}++KiT+OOx+^O$*mG+sEV z<@6s!2Od9#e04dW|D^6u*8hTvf8OgbC*NuGRAcZ@z2A;nD)^Ar^Nrl87BuENf9suy z!aIr2hqoeb69O-w*q}#=w`HJ5^3w_$zSAEDU%W^a{=51u#(+<(ih7}uN@M@63G8k1 z6RO0cw>ic~s%?X}dwP7|*v$AAo3#pk5B;(B8u#Pq{bGC>Z(=5%(-@ESLH~@`JfCUt z7X|at?NKi>+UbnW^0%D4U+$mJ`az$; z-z!V!jM>K7^@x7}9AeJFJQwy(r8jPHJ(^Dz6jhE-@RCf}dmKf^!DG2!2? zJnvr}#$J9@_;C|FTcdoB|FXP2H6A`}+k&S6uqtH`%^K7jn>j}sf_ zuJ>quTNHf@eF6HA`J!(n_H_EUDT_F@d@tu?1Agdf`OxZ#zizQ2-A6PTX!cPT1+a#Zqsk07##IGg)rnY#`=a^3w{XyYI!XKsi zFXOdF>A(7Q`oH_KF!eY8liI^WPmKc4f$($Jsbt&a`d4yfvZ24YT0Tq*Jv5EaAan4u z_?x-(G5H$&Wn{5cMZcE)8+lDN)~|>!6kNdv;O)x%C7zKZUwzK}8Gp|Df6w}x=rMZK zctytJee6+Y#`=?d-^5>($gk%9qe1_He}?y`2WI#84fTzuXlveob#ovz7s>mncS>?E|O62J+%RT1T?+!^j_tg>4 zeki1V&=Mv7LO!3I_cyUO)TB#&w3Oi>KY3rdAqAnP#ovr416cm8yVC7&_`bWmefQAY zx&P=@jx@E#cVBanZvWig>Uz#cf^TJ0{1;*DzqtP1H9emB1^DAx#EZJ|Pw>5dAIhTt z@Q2Ua#Qn1Io0rS?qY)xBW#vu&ITc}l`th%> z(D(tw_}QlG2*0!O2crspSvBE{r~SeDwWj}Rj<2kriLW>o>#3p{m7C%#)v)AaR1A~& z=_v6If1e8D?|bgzN{79k^XzJv^T-M94|c5kfj7SZ9znc8MSmvv5@P>oVZN1+a`@NU zGVvM4Q*vKPYHaNnkL z;1=V!@~s~{cBvn&r~|S3M|y94ld9}tK0PX0j+WHsc)Y6Wiu=qbXm|gzckoSWV#Mz8 zk26!{Xii}OHQ$d_>>foX0r5fSMDBafvcAhM-@*68-OP7tfcdEw znO{a-!TB(XV%zGhCwfO8C0|DT2l$`rYdF6-Nj!|_T*mJ4!ZLs06Yt3G0N(Cp*sFQN zm;UR|FyHS&PqEDBSbz2^`uB!tj~aHNe4d%9+db}Hv2UG~tiNy%>-R$z_z-`B=P8r> z4FD?svT@_YXuSOLB*teT@1D!ae1xBk%J$8^Wdi)B9)E`XOl!op zJ&6a!)HB?7Sg^$Y8Itu*a!dz*!Jathr?4MmY65(6A-GKSIpzLzFDajA)!834xd;3s ze#d>98oxFE>HHbq#J?!?*fFWd`I;KK4u5tUeW{tAqyM4#rLYFx2mcNHC2DI1cu$p7 zPd)LU3F29oQ*WgD@+Weu^?I%JFUS|D!(Za6zLoXM{x$IvH3Cml-gP5RXlm$sb+v!iYwBQU{^Iv~ufYF^FT%W5 zDR=#Q$wz;hcKdtaU*|YIY_yir9ufG&bH(@i%hiHUEx4NgXZVFF@goj)!QaN1OoLzW zzSE^9uhRGf{Pgn}$kb?;@7u<|Ci5SAzA<0oW$+8>8vAzQ4dvA)_M@cF|HIz|HG$xf z_*wQH$9ds$AfGnC9}~;ipPKM{8~H)}OzscY`Byp~+!`1BCBAzicm%u}@YeCL;a52i z6ZAj3|DBqC_#^WhD+T<%A8zGI>N$^dLDdNliu_~0Qn&1=uE!I;Idi5n<&3(JM8&m$` z9pHa-Y{h|C@*&{qi2u)BO}udY(0uxZmvEzspjf))BiMg|Hh;}W1zpt zQiw17X_|d3wpjD4o2vIM2RY?4Ad}R26{ZPCJe?ms|tLmu0BP{x_EBaK` z98OXCjP+SgNa!;q@GSt}fWD?y8UR)6BgxUM7bZUi`0Dz2Me$#IA>c(U0R5w2ezD=d z=6(Fv+^21J*XT53$29*={{{Jtz2K*F6VF{yxqr*AEN?{^_UZ^7B%g za&Rr<-*wxIs=?13=HJMN%wITnzenW$6YUSEg+gbXW5>`Bx(KjaEgg|X zUuTH@a%I1`FM;-Q2>+f#yovhpVt@PCo0;n60^hPB_to(d=Z`nAKhtvFSNkiSkjS5+ z@XxxmlT)Hr;bCTf^!;xtLOVXtjT-+=Ree^@+biMMzH#0BC5`*wwx%_!FjZ6ifYdz~ zHS`au_jDtKh`bKyGb8=Wvr>6OIcgGF*{4Jw@&rGEdO=g7kGk>K4UY!CuMw1KaKIl-!$z4uK*tW)druy zfBq%>>3pe2{j^&-Z>#*l&3(&TAIo#Jsn-k5%oihNcD^jDjE_$6DTWP^dFl(i}BQuj3?uR0j$4#HP7~#%ty~R z+rzU9XPJW!xpi-VKhA9$f6A(Vwd6xJ!+-1*!Jn~98~Ee@-|**}CV1MwGw;3u{uCbA z_^0uwe2L%>_erbC#k2T>ecQmF%=OH7>QF`Shj`svZq@ixek1&u{LmZWPZfC91fGH; zbMPm99{jI3N_%}@i#n%jMMHPS>b5!9R~rnO=TvWsh3+KYCi1~bFS8x1mG-eJ?e1XM zJV)V67>c^aDH1;;U&y7W(WE{+|AN25FIL4fW(9m-bcU|C+R$G;W3MokqRihh&lUQv zfgiD>_(6{LXx7ADb1crs>-lzNOzP2OA7*|^){hLnQtX?0qdk@}@$VF@7V{kUOqqYp z*i1ardOBr0LcblVn|z?^wai~lXLbME@xNQoG`{c5nD}F5DV%?$9s0vw_Col}?3f3> zjjfb?S=~Mov=7a;m*(PQC203%+skv?i$Od0Gc@`qe$|Z6Ioi95=Gs&MPX)hs$Y~|s zso_zN%xAxb2iTAD4%XxRPS!hYT!DPm^#Wpw^-gp!-?GM^=m%J@ZxkfH%zBZhv}^dQ zeu2j%?akw{NSpfys9#$v+V`ivnKjd0PjrjJ^R)8zBu>$WYE5C7M`+Sd}_$&>}ND+r#@ff z`=j=2^4z2L`>6dI3)+jb-ygMK!?ZWs6R=4K_!7?z=(ltZ{=o*mj|1nB!*=VtvR+0?&B{|Wk^ z8L!SWzrf!l{{kMDc1n)P%3mi2g{udu$@yb$+Ci#&2ed*^SFLD08ef1m&EdI)_B9U6Wi z>)U^8D2;w4?G60u75vJ`_<7Trf&WjI62HjqzB6pgtJtsaV!jRdzR`N4@;$E3nfaf! zUgm$w?0PeN-#mZWzh?Xyd;bx5;ty6MYr)rGKSFZ8Kbi@1{vUdo-Vxe^e?RwAm0c$7 z16rRk=uh@*mVcya59X`eWf61sXW}6GbD+O!{VOT+am@Z1{UObKcn>|H{*2&zTl<@j)ZGWUdqe-Hd(k2}6{hdma52`=f54&wG($gr6DK zJNxYIlCKix{dht0hu!vVGxh?DqJDw)7o^XI-W>iQ{DJl6&_9p|@V~l=yr^q^IopB0 zbGaREf^j+1X*Rbyvy zzO4W^0UHJ1(m>!UyPucFv@vW*#QjQu8jaW3&URkeGn0-qR4lIl&JO1mfU>-41m zpuf^Z#NP^Hk1EMeuyTyYd5E>tKQul3tKm5ESHB;?zmM-#IdsIGc{zbo@@xrOVKK=0c zu2@d&QzsTdH2UJ5#FsqU=JJ2mtL*jU ze`iDZcl@X`w_W%@`A?kx2=+hfq({5#hi2%hWf=a{k^GJI`95c#oX?p!0Ik_Z9C(R+ zX;W*S`W(`~6T+Wh6@}hsz8C&xwJnesKei@N31>%htWapE{T9WYpvu_?vCQpX0sHtAd)~nfcE0t1;_bMVVx{WH&^kK||vht_$}&t0lV z-PA7Y+iv|?Um+9@om1b@8od+yyUh72ll6JuCEgn=8u*`_9fDu?aesX@YY?9+OMI*P z2+v(30|`s;zk%<{K0yAHXB}Fse1Qk`kyu(*^NWf1$$lIQyucUyA=Do%cTG$Ck?))7 zt<-Lazd_dD3w*1j?v=^+3h+nvA9CPpe|ed28;o=uo}Sw->B5`=QjK^`#Cc1ie+kUGn8Y%*J^pczao8jx~(l zs?6Vw(O+k(F@NTh!2c=uW;NCqRd%^6`M%0uAlwa<2$h=<0nn{ zpDXxW7y4If`gZ7>0Aj{ID-BPI$k%26so!S5oQmjr zMyv2oZN?wE>~q*pH%!;O)=HP)4)%(06)ZE zRh^doZ^Dnv503DIn&AH`?t96aoZs|@PByOg6CXVBVBAobmY;YDe%~*Xw4bUY#r7Jy z{)G6Wl)7!JnRdj#4N9U!+*$_^xsPV0#9Wx`G078`#86%I)D7!ha@+d%=AuYD4EjMJ9L~4 zIIAgiAz&%DGo=LVxT91zxRqa828=H2H)FdPpbK}V(>8Pp1gIJYR#U8)#V#8vtI;pI zw?iqxMZe?1u2K2zFMY6P{jzQfRZ=MMdw`So#j_#TmR^eD7_3|9;!|X}LoCpBz6{e>6YnAGC+RK#$5l z^Y$F_XXzVQVT2uo4FiaebAMkU|K`H?;NQrz53Dd;##?W_b%*&U7@`;U@A9RgN!b|A zraIII6%FUL;h*@q{(O#k%L43EbsYM~n8bdF_5R50s$?jr@$=OO=146lNI zuJZg|j-TQWo%o5jGaY9n>3qt3apFVSl)@gg_K%IN7@w|y|FBo1F;h3r(x32uOEXxh&>eof5b6A z$VZao5$8)WM$ECs#Gd~0IPj}Weg*LeO`1SF!YvQ$sdnh|0O4m=Kz?vc>3~0`Jq-BB zq(>f>aGo9a=hFI@NuyZLZ)s2edKt3IdK+9STpMmEmBQ?JXui(C83*Qzz4E@(x-Oz*=0SCPr-UY$eaLdn z?-OYMgarMB?^iXyPo4Su7``8+@8blo+pjA0f4%+d0O$K%ku!h4p4&fsA3QVsQ-Ck0 z_7%YG^Mia~e7()_Rl1$<9bvT2)gZ^ZFD(E|?qrbEOc{Te(R5nPS@ZLM=k5yYjO?rdB z6IG)396!ZQFJ(8IJKQ)ArNf`xBRoe+u67LlMaaJ_OX$B$``10}VL|9qY5bg@Z2Ffe z$S;Mb^l`jLcHkS(|5rvZK2Gndw2$})@tRJSy)@Gqk{)S(zxzh;r#1g)(O;GFC3yQ~ z&j|U)WFIYfj^MmKYyMYWMfV|2VE!Yk-G-H~Yw>qzbqjw7AYV5AE=zmSf8j;kucwN* zUze|Uw3LrM*i#i6`FIjAHrT1}9nGAj`p7>{F{VplVFLK;-Z;*(kp&{|bLsv}WBhTn zC)Bi$2D(+hCT}u5x-h9Lcn>d~sL94wtsCosOL%*j5Ayv8{~x3I?BU}Pa{t0cuI2ON zaGJE%$>n+W0OXmM+mH_ee{)r0j-Czu$L9z81^$@(-qJ54tLb~|JbU?b>CUPI|CZ}h z5EA^Mk$#8~zgYTrL?-{0-q-Qfv=x{SgFY-*z06~?51fA_iyov8Ov%e0^i{~-u+^LE zR$rr!>qj&b!yXxcXLk@0ZJGz?a3pX_9A4-a>D7vi~XU zB6&+4#&|}Y^5&hBx9sm0US-(jEyGCO%yp1A;ZgW=scRr_)lT@Yb@_oUQrK?VUyq!% zY$-!5-LW2x9)iDAg>JO!v)s=i4?JF?uXY(YF9Z3t(NBVY8I<(g`no)nT|~e557x}r zFm<2}AM0%a5%vUk<r9i&q<@ zGQ|TedPN2BOI8Gb7=O0tDg*wFm5+(>;OB^E#h-4_o9hpQ^LtIu(H|@_=l@Adf6meS zJ?hU^dhRBA7Lb4W$LP=Eo2YN;PXYST*!mGpPw1mLeORYwXbk&*q)+YqkUGfe*{IJ- zKLb634|96}{w~w|;=ZbY^@}dUAK~~qq3``v=HEI=zj68!+5{GoQQyKRFXNv&egBX= zc3S#?>(>(atChZ34?&-Ed%)?}gZqrO_Tzmwx24};?<{>UGERT2pP}E<{Jqqw_k1V{ z5$oBy{p0qb?ytgrrk--p7xwD^GyB*|-$|lx3F`%%H-FFevBLM4v-Do4@KvJkhdF&Q zUrt{}@gN(0%Ornx`sQXheVg@b|JIP#5ldd7ukG>*{RR8=P_$vcxO{T``iJc!#oGgr zmsa`-x(oQPN|0ZRe$jF95acmS`iJBd_lIKnB~SV{lwnk`9v7I_$0#2+8xS=E_dOX# zxIDBg5j1KadUF?_pUL$fZ3QE~!0D+q&TlB`*B;YlRviy5%@$7rU+To)BEQwouGNho z+i!Sl!cMG@Wo3g_9zq%SsoZWrQGs7EMmC6J^8bkM2VCuACJTs1--aIu1NR@WrR1Nce4DZl@15v$UrPwX9@K#bia!kEJ}UeP`?vpeR49=?=HDA+kFkHemd=Cj z#{TflE+yTW7!QE|=F@s4`cH`8l?24^O!Ajm?gE_WRz-S$O;#3f0A?KY^HBT>_eF~4{522T`l#``zv{+28PIIySGepRCW5PV46=*wy!d^4)@^S5Q$ zaes@oKj5i=pKbhx)McjQyvBOuzY~5e`H8K<`B^5X{bN?XL`(lY#wuyLe|92-{)68+ z9mV(|Usd5rrkRv4B``6n;=MejYs}n)_|$>0dxi1%_@X2`I_idgM7{{@`voMgt@z;f z8iIoFwbSyode+miKZX1&+=mt$#C)@qFUS&GCe2IA?03c{Q}`|JXW`>1$CdF-o(ipR zEdDFOpQ9g=mSA6SUm0^{BwBnA7Eds z`wH`rcMZA3lWj4B{8?&`C8TD)-cR3gf8>nvpXdIqqPUK{P5zBNXrIfoLGp?fCG?TO z<3k?A#vuRLFUg8qvA@-ZujJWki-X51%Z)F_v#P3_my7_%qq(AumO*)r1F8>MK z*M$9*$Duz;6hGne%jLVrCf}tGV!yOT?+_U@c*AYH~Q~M&B=2V`VR7p`-I+Eo_im_{z`fb`HI&|msHuI-(*1iz6&Ig z$8#L|?f;oP^YQ#4d8U8B+qG*=b1TqKHehFv;Xhqxq&}Rp69p9bLvd; zoEdnp^33mZvdit_xD_$$)3M=d2T&_6(akX zhV(~tSg!j1cY@o8D<~cq-2nZj@^a}L*8b%^muL^eepu(Pkl29y7ATMzPYFgCJ}2@= zX9es>XL}gVH&mIlwZFQ`P4*i08}V7J=ko&Av)NOZ_x!gvB7py9Pk(*a7kU3`6y?1e zkfbq)HtXvxL{`b3bN?vbaVhTC)HWNN0Jih1;RbvV_Y;O2`mFgqwFLcGI^Vg!9%RmZ zh`XcjKP$eD_Zvf+nL4pz1Ua0Tzj*=S|95nL13_WwOve6XPc2I8hgBZ;kNJ5NocFaU<5rBXQ{(ql$O-Hx5x(sHN8vog z-y`IoSoq4JY|lpkeRY=n{GhR{{Ng0rl>MF}9C}sQkMsP}TAXKhr)YmF_Ce&s=ly`| z=OI7-D{x26S-9&s-%*2oXORxTjXuE5Z5^|juJHMT#x1b9Mz5S9c$Drt%bp8-aQw~L zXM@M1eenahe4>HXL}t|H#^ zu+JxBI@<@lF&>&v?058iY+P*IFHoFu*3Y!m|0iBwkiOY(@l&RyejN3M!~y7sv}iD_ z56HiXB8$1t6bs}(wbZBmJC-=ytbdk3@#Fe>U1Y2#fIsK(&-42o{Qb|)@zVKTmVBA` z`Peq#?>ryz^XJ}r>ptl@!e52sZzu8dN#f^I!0%Ut^NF8V6F);9!Os(fU;j3B6X(~9 z1?)en;uCM;J(bi?o%H4Bd-?b*eB|(+j(z-5I&VBTeir<`bG+decznuvz9>NFhwbe@ z?`*$@{Z5v=oA{-V&$o^E__Y&{W-+gPX>2g!ugla$HJeqmgdt+zZ}}Lk2m@a z=Xg?p+s705cjtKGE%4+EPIv@xAt8v9b^iDg(VOcB;1Bf1&k>Ice8-6|1>f^p_J6d+ zKEs9e;zpJwd(@+nzO6nq$&Px$^d4j4qrlJXx=D7u@%PYQKND8sz7DBd!1=Wd>9^}jh z0oU#D$oHM_cq=^bghyK7!EZU?!4`Psc_&-}oFx|$f2<&Vawq2Zs(|-H(sX`rk2?(h z=wkig59vk8!20@S=l4aAbNoTvCuN@>?vHWK@2C@=YJul|;e^Kl?+lH91ojP*&Pl7` zepQ?&V<+Es{tiYgIOOD~Ail?b0`_~^OK+=>`DCV@{8MwIKJKG5kWZJX+Z+3Qih#4^ zO41)&2w$*=z}HT~*Ga-xlH0=zfY1C*#19qaJm?ST=UIA>rPq~oW4+s$kI^!p`D5VP zx_#5dZq#R`Z#c&nrSVlvKEBOo7+(1Q_GKX`PHQr^u6+^^ZOjWXURd5uU*6sLGPb|U!Wh-+#b8*ct6fA|G_0reG0fk zesVWD=Mw?EN$*yET4LiT+&4)2Jo1=xd`e6EMa|iNMWXTV90I?0?*PB!{OO@rh2PNl zar4R^H|#I`jhl(z4?=(HcXE6AdE)nnh~EPQk9-_(V;|;UjssqQpNRB}Wa*dd260~r z+Qa@mbM_xc|91RTUUTY)NDDmvJ10CyD!4`PsEa&$M;5PrrL^p`fetGb&Q~dloUr*KLdp+snT+8=Gn3k?kdvkoL7I==s zZR2l&rvSI~3+$T_$r69|aQkKomVPIH=hl@Cek*?8Ieu6W;s;syr;?6!?hE*50Cp_d9l7<=-}^M)j7W;`3KQA=I*bHV*MMS{j!*h z^>6upTK`sKSRZ6*Jt4t<58=KDtba#n{adE>cYQnyF&+aU<}^~HFEzsX*KofX%@X*< zdcqLalYbMW_K`2+4(p=Eus#Xa_s_Gzeww4sY3p^PV41FAHj1R zPU{ck*8+~g!C(L2;Py*QYrRP8rxAhnJ4E;3uvBcZCz)}l{>s7r3CTUuatmKEzW$1J z61~JH!7uTa`bo04y!||1-xhCiw#V(U4W9cOCp?Vrk&l4!@$U_n=G>1geBN0f`Nr>B zzcT8qUxNJ-lD$|jaQfHhb5(Ob8N*pWhx$yX^>bn`;Wr9>cD67`_#Gwua($+M3h?TL ztPHcHw+HuKtU`NYAHiXdVDBhi!so;J8|M+OYsTl&&i=yGU(5V^;+LVlvgpDwrDRKe z<&5?Jl-GBEbeKh2>X#tGEJ^EW`}}EqvmXb)6IW{X@hL6eXYjp{r1iD^`zxCGi{9a! z57}du9LIhg?5Pnkw|UiRZ`Fi9%D>Ov0QvG(81jwFw4Uem#`=x&8&7YRPq5TIuSc&L zY2K$VgwIC234?6Nk3#M1+aW&*KkSK_;q>_&(dQuHANqWV>7OI|y-4({a5(JIEcU1X zPm+9u$sRFzn;-EH$Oq(AXNRrzSdQ#bqd&-Ra?&}!6zrj$-=i)369>GNp7!>NpLFW4 z@R{nz=j>f{m$QGe$8T#tPWqHcsj^^8{SvodbM$ceob>pccce$?^k(IRP`m5(=>2o_ z5OZfa>5)YHc6{Vg&hbX6fBj+LJGK_|D(8G8Pgj$^+d}?b5%f?)KLWh`5cvoAHT3NY z(2K_-eF<7`WqJIk)m{Z!#smHMcKo1G&Og9U{L9Yq75+f|=;xjEO8tTQsr#JmLm$6w zJU#JCNL~j?UNbH93ZlLppM|?$ci5B4*Ac%|5aY-F8fk{}IVd9@ySm{|Qh&a(W$$o5 zF=pXESk)JIv!bQpWn8Ojk30f_x0LKUbEl_;)it3Tps-RWp&A2_pT^+Ex6DS6O)7HCFSroW0MKr;>gdKj~TN# zpKI))`x}NXmfRF?+eiEZ{=@l-sxIJtO4xrR(1!K{htQt(#N-9nYqZ{A$S1^p{im@$ zVc&;6^#&J0zl{7D^oOw!WgzC#`|!dd%H>N@?#j;}G`=UlaE^ie)$bxdCa{CK``Ex_ z$0i+{5_r!^f;|f@-hum;!yUqrFN#;U6TdGsdc|NL#uJcm|Iq?B_D682L74m^JEE9r zcDfzo&z*zui-@1A@(Q{SHiPkh7wJl->LUB^uR&g36)%ANxS-GWNYRU&`bxRidA?J5 zKlqRRaB%lBwrgAHdfb5c=|f);fB4p0^WE^j_uwl0w?5Lz{$udV%h<_ni#D}^|Bz3x zYv?CnQHJwZC3>$U@O9Wv)eV14UyJc}vAOq*Go4O-km;lK2F)MeL*7b@o$JYD3p|PY zzwG)w+5!)Fo!^IB;K?1%?*o9dz*g8F)eZYoCV#n&k4JOw>eVnN>RmMe=PDb|6o7%CuH)slsNFEu=5AMWZ{dq|6TB- zIpSImdb8vn=lGIn&u$MgLFfFUfa5(u;7_IZL0O^f)IVVw&wHAm?w|5Ne?RzI^!~Z| ziIsWI`Blz^eYe`%j{AG~{P3RZA=)pVTt@hUJ`Rcp(_#8EEyf>tE!rhYE9>}DGA-?8 z&>jn|f&7HrxId~a;l8@AG|Jx-UV#7Xje5ZU8S-yqH<5f*AWvTuzb`;ORsb#r;GZ*< z=og~+87o3x;5}!`@0y&HUlB6EH{PE=7{Yt6kY@ppF%GGP$#3d7ufIbYv&M^mVbS^e zJUZyaZ><;eg%Ig|CQLcC+dW|SyKa!eKy@d`Zz6$uBRmh&^`S;K~ zIA6O|dbVE^!Ed_MrcPshf%~`9*8TA)duvRZ>`y>7Y|?i50WY&dluwHD9A)-j?5H=K zy3`D($KA@XInfSyl>8r)&hr^E^a@T$l;W{!|1#^<5~_ef8V=Lu+K;uqJuCr|HWuMq;EypTQUGQSGj!P zhc>{&*7?)aGA%oSvNy{le80-=8`i~kz)N&qB`fV(rfoe*_cto{;e29QlJ6TX?@;<4 z#C;67eyeMh*wnehJrulR8vl`7p% zaGW2*d%}NyWRr+x6PN$Aw+J}OxPODwpA}F>dr7KaU^wp?kgWC$VSw7p5L~t3Poh1q zT8A^lHvmss-$&?sllluRwZ5n3nJPyC$NQ!jZ&j#j8uO=cpD5covm+dnw=f$&o5Fgu zN9#N6&(4i6fbXS%HJ^jL{cDcgFCzA0jo(*mI~9FEls59R$UC+CE31E20vzp)*6XvP zRlc!NE?DJwqnxwKpKFveR{5qzIc1eU-zXgl)!zw`?hTvXo~`# zn=frq)9-iJw5-ps3zPpMO7K4nSL#DFe;M9_bTd2b+Ku}DAnO0;LTN%(FLKMhz*iXh zcvd|0fF-|v1@LPmsd1jSz2>9&!Qbeo2_wFQGW09*x6%m8Y+@yp!B6nV)Fl$)5f2?c z`Zc?LPId#XQ9L0nXzXv;b2xw7Q=C-Iup#68kUzrL3)H^&Tn8qdqW0?i2mPe^HJooK zFNr+3j7{F%KK9s$`)@gZza;56{{sEAr#0qK@M*vgnwxFV z%z!2w7gYd)NmXzLPEWqqM(=P6g^2^oX{=!?Zug?Gfg$M>HtSd%ZkfrFF1D%l^WC!#>SY zz6dp0+h$Iv{z^SRLRYp-ZW-u|{>*8AYv(|J&$Z9}gC1H`_R)L?d3&wx zcLk;{+iUSxXYo6*rvp1Kd&DZwr}rhFm!(VV_~}Y1PW+_M-ygKEVd-GbYOkyKF!1MU z+Sl%IOM78zPa*qU7RcWCDIUncPrd0kCqHqbyK*kp&!4_+W}nsGS%Htf5xw6f9jx24 z1r?8Te3ga3NA7CaWBu=7Z?j(HuXLFohkxT*rx?AylnQ&y?OPtE2>GzyPap4@1@(H( z1JM8e0PMK}e}VFMvEIl^9o^GC)hz5ob=>3oaa-X7fX~?%4f?U{RgaSWaLaz!J0&oU z`+VuVm&l zGrG8=Uq2vs3};2(qG`NWW77Rl8v4HzWp8{2@bm#!2gct4d!3?uN=@p6y(W9>t(3|B z3b3!`tqSa8M(9TW(g5tMpX_Vkdf3;*Qo8@cL-w&OEJ6R04*R_wWp7bna-Vvs)DeML zvwMZAa4z~ErTb`opbyRm;XZ?E-5%n8879I$s-^T1bdH5RJlFbUY7@!w91o>avWtLAWf4!l=0pKZ!aJoGHPry*~yc(4+Yzh;LQ)Z|mqJ!e_{ z)sUab`%8%jjik))cPIf4`%dp^xla;)8}^;a+`bnGu3Fz$@qKeVI^snbPsaM5&*vq4 zuLM3|x9_eb;P5xU8bbTeAzubT=Hs1(+aK2D@|(xlhO?u9LnbhvkX!G?d~(91`3BVw zopsmvSPXsJ&J!5k6wNPB-?P)l{2OS0jQoMo27VQ^*ICEk3m6Z6T4z8)dm8py#=Ow) zgJSk>;HSC-_&J;WjX8asKD#KLik@;wmVFoL^SXWDf8zZgz|mi<(O(p{T#0L)WlQKs}@MOZ#!i1OBVbR2K`AtiUz-LsxwIVV2ge|hfgd1 z0sB@Y%!t5i|`Ai65TE!}qtiCCh(013sgG z1D_3l1^NG&Z;kE;FAJQ%Be-uRB(Ai^3m=&1SG|SkfAUy-!$N=1PCs>_g6|)2OZRbl zoT0yp!2K~kAH4r!b_9NQBk}iDqDSqfF~7Nzo85*TfXvZ>SE(CcN5oY8mO{Yh(lVN%R4p%>q6$?owfY+O%oh zFET^+6YXn~AMiZ#iu$wTZgp6jXa~G*KPet4bO4^)1Gu`~qYh&|2>1xC|MIl{V}7L% z_Z9StcOKtQ@B3)7w{N;(AJ=01J5ctjwXRXlh(W+z zqm6P-gntrq5&d|71-gGW?;?8f@+`k^)CK(VGTuW0KjP22{6n5{kiYe!e}gea_8TDV zXPzYcU3#NN`sb0le6pfd-rFb_tn$N+at>wK%M9s5JhM@5u7^!)J)9!AYQg=`FHL({ z-yerXyjdQV0Pynf_)kF=#epZApjNBQo?{E8?8 zAGbEj1(dPhPVLX(GeF}p-_*w$)?+f(W6+}1+fqwQC#Y0mAb?K)1{De5_-_laQOF^iX;-|2;5x{}}W_%%xGVCGd zqq#%9m=Ekxr!sgs?jyo{PB5?m`9GF@#rF#8bz_K}AH zc+m#W0p9#xcWowk&IaF$`8VOrHA?W54W32+ZH@6U_d0^dZE&22EjPb6U8@NmvBA5c zKbmmEwVdEV8yxqOmz(1^g+78SHh2d8E9%*H{UTOswdnUO`D@B^V?7cBzXX_$c+1X1 zvtX>$o-w7xzfyAezDtzy=!)}824zXH^h+G;6`ykDkqbp>KieR$*s^87n*=<#5dLX; zxqC%#R`D0a$&ZNAV+`-B?)sCue2CI_*kQR3^?ec4|LlBP54_(U?ghUi4F>N&9sCl; z1O4C&0{*;+LwQ#JZ2^?+{)vLJ>DM<2NSl??68^;x`(c$TZ%|Kzzic`;~w*=+ENL4^Lb8^GA9R z-~Z+9mp){b+oSJCd_=-B${K%1@%PU07QNKpg^2fKKS_DF{iNBmc3gJ2Ls@l-;(06T z?afQJw3npzLSMG+kFa~Y!YF@F=o8_;BEMsZg(d)3W!f)KVt?{y>=EoIA>Ivmkj@W> zHX>eQJcoFVF4O)%_*VM4dS@>t_b{G6J@{geZ;cw{Ne-c0rUY_&E11Q_q z4+_ff#_zc|0at1Lz{vmCFuULMC=}04yAaQ1Dd4Xw;932(TinMaR4SaTMGtqit+`*S3TI)NbNWiQF_uhSGuB;s z`t|6AuIBgMwU?dauTlQk9~=K2nY!#-TwkbXRlf6jbkhwxF8c?oydZG!_2{=El>|jg#L7Go+Kjkaj z0D2fZkzey&Hck7_lrMl(bl}^31oYDSX+QQ+z`NLEgI~VHjs5FAZKN*{AHser?)ziI zZOQ_=FY<2CM?JLbTAky!D<#e3t?>kkui}1Sw*>j-^a*56IPsg2o%4+*o%`2Gz~37` zYV)Q(GuA`%-{fxcV^6T9zhFy$mDSGmJM^iY-kjgOT%Kkrer~MBdJp?8Jf2SRUwY3+ z3?7Dli-~T$j}v@z^^q;MAIT0SA{`q)#dj_NZ9Hu;j^YE&K{zHeL ze>r{N->Y|qRm7uC?44}G`#i`g4UEve4Oriy{WJ96)TgDYlYS+U)30H_SmD2&@B-j0 z^BwS0Y%}F+k^FUOKZN|tln+7c1LQ-@3~nWVUL+oo*;mN^%(54}7=Q4k7XIh`HS{I? z_v21@#2Qai|3wZv;joAG{S}S$0jDq4YoI4{gPt@1tt&fq`9Fo*<)3fax3KbC=X@$y z%H#Yi-VfJi=zaM(^eYS8kM+OicH8i~Gpthn$Tq^SF9>^v^}4k_s;?&u`8fuB$AQlV zzIU@hy-sh$w`eHHKWo8f9R0K65}cnfR%}PUViEaC7fV-*$X{A51E0u`g}x;HpEw45 zn@PaCl>Z=oyF~O zPC4lv1|0r|#Sfgnoa^KG?_ZAsx(4{J(0yQKSM&agQ=;KAkdDrp`sZEqgN%7oo5mIu zyr-iVdYbxYQSK$@d~hFbgegY||IdLwx|{4__&3-;gZu&ike4Cs9}{c5xJ|U=h5KV8 zY^`EIKACfWlArhG`)$mP_?1TcM_zTQv=i|_@T0M{9r3VPiZ_msKZX4^_+!{_o230V zWmu#94#WcyFG|pUT+BO*cw=A)@i3M4o60W4f8w7-ylwV~Xe`Ta@#LuD>Kg&{lk(gNPiBLS#;P++ma*X!p@K>E4hzX5izrk&48sgc}8PLm$ z|BDP)ov|TNz31;>|GV#+Hzv`3Kj(+~`YrOmx&KH0A%4i8x5`a_Fo-hZ@iCHbtbeJJ z<||1DzhCHZ(|WhLzBf9y{LPkqi)+8BMI-N%u2W}Mx}Vgv#r~);`BxqZ_qWY@cHLsF zzwY-)>sjx-QPf{jMEyI@mNu#*A95eW`1yW=DjpmMd>m_hLI!2~dMAZ4 z{88vvgRj4mC_{ePJLMMy;O|-a1%}YfFEGg;O~4-=^W)^a zPttuZw)K_*xZS@@asP2nzgGU!38(Yc?@b;;{wePXA$J?%<+gmXOiO#2=Kj4(`k3#p zpE>_-#6Q)0LQHPL_>pf_$EOl$X^+nP+Vw?nfm2@usXxsJ{Tb?p{?tp*e_vsDlf9w! zkbte!Ap}JrpXwWs&+=20e`<(Bkk5Vae-wq_++S7Q@Q-4CP zx3&N3h)1zV#YvwC>f7kU*Sl}SC%+F=~QFX;2G z>w!@F)OjbofhDJ-_s`MCmuqPc?^(``?_Jv)X`lMj6TbM~Hz)%ha$Qn_G|jE61Jqs36|J!W~1<-+jbCe$wCR z1w*i}bM{jq|2RbWVsZa)eLX||&K_^chkTm+jt4>iMLV4DKXsGR4`1gTe-iz@E&s51 z`%EJ~5saOt{3YmDFcDMR!!6?t<9jRqV&#V>|I*ohpe25ieAc-htks;~2ZGM;OMqMP zj)A+(SL*CVwKrijD+Ufk%xj2u{79oD(FOt30KSlIh z4R~2;r}GB)QT*ct&1?+{r=tiJ7at;F!kX^ev~pr`B8UV+Q^SeqCezEHR5Ys@s|GLyg!Ps{So}8H2BRx zgbVzp*7>bf{-A$L&pY|M_PclIx8e~eK8mPs;lB(|-8z41tsg-T+(*Ol&(|Ba^O)h= zRyOjvlAv#wt2zJfcuV_nYTvvL{Frze{Ax}Uze z`&aFl+Hm6RB;p-i&Gn2L$hEYWqxRIDq>t$QyY?Hoe{j z{=xjq!qjC2tNn9QSTA+`uN{|t-zqOk;=Y1wJWYRRvC`6?((LaK(K|nH>Xs9Wi?5wR zK1kC)SyK29Cw>Yi9OHkRK0c#MIXMNx=PR}mw%kWR;;w_BRmo4An-URYA<1LHmzJ%yCPX4G>o&I$6fKz{z0Jr-W zwf8x{FYxc{{E78h@-xnOTLy3|UcvnneUTV|KW$ro{Jk?C7^nKx40HEc{tU$@yz19b zu67FkNOmi}XSBZ&ik+NfV+{8#9eEYYd)V_W(2sHv@*@Q9L4Blmion( z`VrLcQXj;4N%W9^*8&exdnxFjF#9jyC-xAvr+$mMN9E0!uTmiW5+r=k{TyRlzwmhU z24Oki*7-_)K9{*0`6PCF6@J;m|G#zePoQNy8NluI=i{-{|C>&H#9Qj`YQaaLrGA+D z=lo&eBhvy8P1gF!5Z zzD@gCBf|Q>-ZG$MMxFd!_%E9O9RJteaK@)HE%4}nJK@O|c;MGgcocA&nd4{P_Fco3 z_27J^AzXiQm$yXwUw9w=EFuGrv^@zCd?*bY3F(N*s80yN> zS?s)I{sS>sf=Qpo&qIc`owT7NEDQR<`~k^k^>(DqM#lRgCoj)*&h7}w zgSs>ieLMS2M&I+Gm>wGM(B1PdDcaIh-8XSA;$s5xuQb62I9ss*-{*s& zrP+Bm0AA$zW&-lJV$vv$FM;-TVVO91JB3ApdtkUqoj!@zz( zRtTbhc?0#Y(fmqL8Xw(9on*)#iwVdli%Gao81oMUUfcz^tb_=E$QR@HRciv?x551A z``Mf5d%91uLhpB|67ZvMy^-4AG9U2#$z@B8N%~%+`*uUpOUv+nq&Eco>|UPf49&=a zVJ7$h4+x;I!I1B+O`z;G5OVFU9>6u)v8|vN@K5-apf9rb(EQkD4ee`x8(OMwCH&@v zkAgn}e;ryH6WgeLnxB5a6+k|{KQzr)6#Z#~?f~-p+5s)JJ#uliZccM|vqzCe#ML{D=Y%3d}KdE))YylsH1bp9YDf}hHFq6~iN1H3}~;PnHZ7Dlmu zPw!7>??l;~7?kerH%#}UVdm=yPa{4_{IbfkXxI?v0iG)Zo)+XKIG>@cm}cc6@t*$t zGbkI9Zw1Z|W>Lob+e?rS+XlEQN%!=tYuroVkG2C|+laCzc$OePwF7X&M7e6B91|3M z+B>3&>Hf4KYs2PFuRhHR6DS*3xU^xdtxccyA$FbakFn8ZTCB~F`bF^x=!+}d+Hkh5 zT}OOe{0`+uCV-DAl)d4t624#K!S{FZ^N#HMsP9TbKHBF29z6=U>6XtO&fcZ0#(5F( ztB@ZL_K%DR<%0$&A9R+^HyB@ZBOkOP{si=PWzoKZ_z2Fs)A>{x@lMl&_>qFWm%4oF zIT!qy5mE5>rMtyIgnd>Hr4gUUee?W%>hd#)M|KA9!}>QdK=c{NzOD8Q zF^l=StbA1TpQilNP(2?N33R%_?hB82E7C)PN@?oCjr|=6-?7 z&mXysM*W)jL-gm4H0q}%=#!8K{BO0Fm7xDdJm6QWoR`4A2?l*#FN^z7cCBx;XNq~0 z-Fxe0pDw)se7X1WGVXgHkxIaa`-ys4tVoKg<~>QuAFD{V^K|v|043?)k$;M%58jXY zSH$;A(hFE>;RpZAD*tPvoUzKYjdIE=|D;h)^7351N*v{$lJq2pi_|8?$9~Jk6YR7H z{~58q|9<29Fv?Pe&WGkbNNs0I1^J>SsbIm=EC4vlzD9ioWpCL!Pg;v`ZwPDY`x3$H-@icc zx$jpHykPr&w$3lSe^VGBc*geqbI$J(3c>kb+xJD}7b=yO^S^+1mZTZ*8$Ul4K^guV z@G&bW9|L_-5}jA6pZ_qhP~`OZA)3YyMwY(Ena3dTcM$F42jzJ)=sB|PW@Rj!en~yr z71Ta_5FetxSovSI=)D!3w;g%hV+b>13FU{WjPFx?eCIUq&&OW?9P}zT`pco*!|S8D zI(@Mf_xkp5-t%O=e~uqR80GUv{RVzBb^O@&ryBhAVx#>C>Nofc^?|RUBVE71Hnufi zB}o1MLVAvu&%j>_^;csz(|mSOf4Co{J{~@w%1<~yaQJTC{-0QILJv#JMZkqJ#|P0P zHZLnq!t|m(lV5hm7y0}$R(qU(*HV9T{MEv=f8lhf8E(XpKtBQz?U`tCcSX~%Zi<#*9u|K zRRSFR_Ylr=uEBg+(JD`4f0UOCC`)BJU!M1@69!{Hx>%gq^b09tjW6xZ0FLsbjq#>X zhP-n84miid@ev0c{0+G2;rK}K{PdN(!(Tf5p>f4my!ewge58G0s$XT`&spIm(pPcX zFLqzHy@2&AIt>60d_^1mD^#ENZ+f`?!+x(?VmA5S{-**X47&k;X!`ZnQ~g;FzK_kr{x_@Kwp*8(d~3%T=bu;E5}Y!@egrxVqdw#ZuZ9B|uMkHW^uc>dRe{?d zO_;>|fDiM)N#vU;G)(%9nIG+x{}qvlc&Ulb?14^{+Zg z^!dHjej50VQhiH)mD&o}dvWE1L=S7fYVehxBW;O~H{D+R5%~F+(rA7Btbj7&<&bY) zpC+ZL3h86$mpZ<9|2o@D^hlvT^bgkuDZ=-h{uw2Bya}IuCPeficu9IKFl*5}(uA8= zVm)eoUxL4t7C60wO?ck3kK}8veJ&4*4W1)=)qtA z@4W)}$g54bkfZi6Um4>$891WSeAO7+Vi5n;_YVz=pM%Zu&py)_5654!^42%y&;Ux zH&q@1u4U4`xd~f+DTz{Kev0fHSe7{=W zGI&CL_Af-?Liy#p9u8qpOzljfzONGF^FLF*Llp2HK3-I><4+2S;T_Z znizw8#Eu1o4ZJ;0Z+;#N_K)Vn>s$7U`h&hgfB37xj}-~+#}E+4d&+2!MSll<7<=g) zVS_0lUeu$#dQW5j9@82Ez8d)l^9xTy9~>k7e2VNZ@1F%ukUsUpAJQenFMM&!eqeoQ zV(-Y}M?+Xa`Yws@;lE%!vpcxFlK(>VNL%!a61+_QLREmgS^jqk`Nb5k$M<1^S0vyg z?|A`3S1K3U^_4pSxMhz_?jJ~quQbL(>rv&UMMt{8PezUNFBCnU7n@s;lnyrfpY=dq z8vWDwc>e{0*X=8vA5$vM^NJb3ArIUhf?wdT!`?9W^~5HyvjaE_IxeZ|5kq_ zpF7ZBnXfl2{m=0gAvovfvVeFS*SDM=b$kVF-*Y&vS1f$;@hZ0OE&UfDc!Qo&eo$1HPBXs|}^h*SF9=Y#r*0In@7bjipre zgrE|=ldu<+t=d7q<03!7ERpzIEQ6#>44X*H00^ zp>MEXYhI4~KeAtIxsRv<{|4`w;rxoq=={4m1bxBx0}O?+B7=P6eL+cwKks>o__-ul z@>18A@yF=BsJZc!4gmiRd_!N8{^rIBS6OBonbxL^X1p;o zaLH25B}1S45MRUnG5Zl8qW2>;AA62@vlwV!2>%QkGV~A5t2O*hR@uSt$E5X>OTGd6 z`mb=ltw`~^^ix>hXm|P%&l@>G`hF7muv(GyFJt@Dos1m|EsY(bc%M2W75j~)wEk1* zd;nwjAzsRI+ETWL;Q7OVS@VsA8}u>o9{d;SKQ(4fhz#c~kbhs^;a4B*Nz!|-`cXIX@d@5j z5-?u;B{Dff_XkEE>ok_d)-Pq7%8@nf(8WRr-5=OZ=jU>iZ=u}RiT(1)UcduG4EgZa z(f;o~i1!P9>h??cc%>x9i@Q=craNN?MYe%G z;9@gH#&)GUMOM?6;`k!oi+mQW+?!axQP`k8`jX!;=Oy` z9*d)l^W_*HD<0?kVSn!o6tLiNRZYmFe7$Rj8&U-00YAkX?FD%I+8vFuf^u6?yfv*F zXN`VZN2m0C?6wBHg7Zdoc>9^)MZhuMkw*Ojoli1Fyg#T70H4}t*DN~Tqkom?vl?X~ zj(ojxoa5US`%|W6K#z-so9X`6W5BnRq5B}&qn)Ws%JOm{!N+qkHbMb^2QJjzH z%!r6r=r;)9zuay%0+v||d6l(A2~LkTg74`9qkX{GIq#wA=LHT&TPn-kkNQRNI-Hls zwh-*QPUrdS{(;E%g9m-)lKme9m;Mm+u<+4AfW1&w}6ng53)F7oQ{fj_~}@?|?tm%>?&e zN&4Yj(hqe0$~s>gJ_NY2o8aLq1IJ%w9mJ2_#IHHSwwB@N0`UwbI{H!~OL=MG^P;7_LeKzo8oiBb4C!i}3w(#y+3^ zsX*g_D*}A-_6!;8XEx! z`Mx^NKM}p20KLp4==myxzE?%k=Te;Xee?+Fqvwd8xhsQszYFw)JptTR0v!Ce8}umu z8|GVqJb`}P-V^-*r!u$iR4$?n{TPG(Y#$W{`TU_jH#F#(1KgsQ?vlg9*{gj4>pm9L zBz+YBWYa$SHMR+B2wZY&;r9ynx!C_~Up?K!@u`ZVn17%E|1BfJU&ZI>A3usWGJ*f8 z;(lttb!Y*yzko-BG~PvbHpWBsF&_Afx@(gBEwz3gr~Z8=gz>O9JMaE5=PysD_SV%( zUc~vEgzGujyS8~OX?o!M|{sXn#tPGd(#G{;p2#u^`PiNA2_e@!UGj|8e{z zo(6u(QU}M+V_2{A^GdbvIPrt~t|LO>VdAH4o^yu{=r+91E%N%*ezB!~kf-Q$7X#3HqY_&Jf>E zCw#Lg%9ua!Z^0v0d3B>4w#rTaHfWWb=b-{9+w>!g_rpKPKTP9uMS1^r`wx3X?**DO zfTy2!VLte2c77`UlM`P>dOuJRfFEmoxfXbi-~cuFEoH%BkMW-%Yl`eV=DXeTsMyz88vAM!cgl$36%DK_0EgE1|EUKVvS$ zKQ$%G>z{9iXN5GCGa~AfKZLt~$4?Od!oLw8od_GQ%>&RU&-O!JZr1P4!^g+_fhkM> zSop>Ltp&1A_z5h{>$l}T#d<38rL1?P9s4sJze4`Tq4}ErH0-VUa{*`fIDfKA8u|-A z&BxYpd;4+NThh;Ud;TKXbJA}(f2?m0As-#zFT~!Wjla164EZE}$lpiyi27%1hiQG( z&_6=)<6oSwRlOLG@guy?4fwYKuhIHRnd0&f|ID&iJ{|3cAm3sBJ;kSnyb627IBSIL zdwD11i}Ch#*E-nuVD9`ww(+=N@2|Gx*Xp0{Yr}ph&POMraW`P`^pNaXQ4EaU<0L>5bo7+$E6KcQwk^z6d#UJz( zFrKc=%T0TmM16;R{7p+f;knSq88OG@3-UtepOm5qe%8bo2HTbc@KE=R~1qL|ci@2}s0yCT? zel9~Ej^e(gQK}yuAEQYUkAt5R#J^>nHKqD1&2U+Gk;=sXe7p%cX^fSXf_N1A82pSc zaXuz<3hxON#Wg6)>$*oQXx zK)%#DMcnVi>0$ZvG#>Z|SK95B9iN3%gP-8fb|+$FzuIVhyk|axzmLylc8$&74}Od8 z^CW-EYF|-ZW#He^Kk)a7ez4ydfBCry(6_DlDdsC|ggj~D`Z0~SSC^N4Bri1$@}d#` z4dOR*67kfwpg`+67v!DS$9&2Ed2#~$NAld@zxCkfa|&Xe|6+FjgFRtq z2ER1?YhTdy7{k&12ehT;wfpP))rNG8&;NZ`Unt@lDV#k*@rc}C<2?+6;!`8r+{=eq zKp!{`ep$^9f7~Sx!ro$krArlK(9if`|KlHP(HPqWeK7JgzBhKZKQ!Hy|3Uy$!+EY= zA&ejp#*g)C2p3vleKm~rwklw~mT={PUqufe!g^pY#z*?clY~C)oMmz1zx8Kra0RK% z>ob4czey^=pOT7iUUB)-tbji`ecSRIuj%L`#*uLu)6Mh^1lz5V1 zy-D;FOgHws)2D5gzyx{x0usXx$` zKJwbxZ|t)0KScWM#;f0dg|YMR#Ya^2=)UWCeBWWOJzT%p*6VT7&yktOj1ceNtaaf& z0CXbgVjsrG&)@k>8V@UMi(yHb|{tRkT`>E^f@&qRq@*8p?{=)I^&20>@ z-q^2*o^2i4gIMG~Livq14X|ui3H)7j6`o(=-2eG{#G2+x4wn^(^3fjlR17n{Qax(o;+;8e)3o1 z3C&m-!v1Uox(+cuRf4r!VBX0PxV`+S05qbS=Xb`!ORFdi2Y6dyM@oK0gNe zj*z`)X~fg;B`}zQ{;|`S+G803{#S_nJEGk&uSxdQkj;*F>EyKDfAbWVK2oIZhy&s>d0L^+7;_UQ2LE~Za*aCh{?hB z>5s9Z`xDHRKws<^UJd;k0KTOf_yhmoei9N80TVx;DPreJwfhD!7s`HC)~{u^ocs8S z`5M5$H-1`5%v_zhck^pgx3BrEO9lMuyDqK6%O%ifF)BeK>h)D-<42ZcOa~+i`pM>k z4chCTH+CUk0PC5mu$#@e;xry+0B(&Z-QKvrgN2l{s8RR>V(-epx^2N*LLVqAm|tsu z#2V<|zKBwysu>+Ut}@XPo^l|kM$Ge6`wly>vK8q zyG@^0@po@2jWXijh&RaC`BRGhkE-2?D-v4J3@~=wYu*R=$OhCm zCuqH#{lW^hJNEQVT97HlB}ctQI&YC(CHLbzgm*3cUorPg820R*F{b2~9PP=nysB!C zGgg#R9`I}C$iK#eVE1LQU<$-A%7|f{|&bJXeWXq&{v=) zu?G0L#=_WtW$Q>D4DfSEJQw^fZ?5}~kmmu&gN%F($P4_vf_MSsU0$J%N#RA%FWi4H zkAl8{_3Uel?^p#@`v)i0?Hy zCX5O3b52LE4P(3{K0p(GnlJ1k{Ts%3wYKoJ%oqAA6xcMF=3w{Ip zQUQ+>{9X%6EV%WI*fe$ytq7sc;-zp@HhOE zIs7rg-(Xi}5b<%05BjvYm+Tq&6BfOBJTgc5@A;<|jx+r;e+GM2_%z0^^7v#1^`XO8 zQ~m<%N$f{3UaZPK1^mmSTOqGC`6$Py&Jck^{uk?*_b;hG{2cMg%&(w-ZTKd*FYkuG%<}uSrDb0p@}2n96-H>}2Tl1Reo9Nn z=suj3$oUiNi3I68_&MrJy(Li2?r1N_1Zb&R1CLow|HLe*u4K7uI9hZFJr( zO8cEz+7H#PfIju*ZiIem#Pgi?AoDQzu~uD8{J4|&@htFPHFO2>V;26^*0YH}*~%tA zVtopJTv6vo4Zenr9}PItPJRrdedxocJjVshHz!g)g9(1rV#JTt|6{7bj|%F8AA#@m z96#o5{8)7IV`&fPN34G>ehlJ#GV)o7zIJ|G`Cj=kh4$?6yxL@gALrUbKF)wqu=p`b z{nz;s`I4+Sb_RYdiil^75I<7f8B>8vejdD!h#Lq7u*z-40`5*Xvui*Fv=;9Nhqz?W@fx=SQd%7WSfq&Qc zPkaI2;8CC#GO$H!+doU+tkI(e{GE0B0{g+%QULU5n5J6$^@oe>m#+4!a^RX}x9wYX z=)JFn)PAM*1??C1-yJ^qkf!*Xt9^x1`@{GKeFi@(Y2asAF5AQO%kKnW82{&hFA>?? zA7dKdyENVpqq!g7Z0rZ%H}~cF@J=$kt1Wm>GJUai(9?{MzvpbmduNXs_d}lSg#D4< z1BE;Tcqspq(q}_T-*rGuQ@*}R8thlFm#r0)=kb((%GZxZ@ok<>Uya`ZeEZMQSLYsK z{=S&Ln)v>C;O~X^D18<5rTWeDps!9ZsL$~KUG&vCYd$__x&Jo!tNyFVH46WR!sjaE z^XJZp&+xx&f;|!Rx_kuu%2W89(0zQ?x6&7|e@L=8rTF6-#8)lZ{7?_$a|Q3s!zhJ# zkaqday&L7RsgJY$i1Ca4*TZ-}9{UOV`&RxV^o1FYcgY12@8Vnqc{C4*?@w@ya?Sig)ZeFgM<`BroXewEPw3i8Gd z=C_DP8ixGL^56@;JPCRVdt_Zd>6`{X)2cUs-)7$W#OF5();Eok4*OVDgS}SiBjCS? zr>*pTxNcAF@|ZqjB%Pe6UlF^)l^s*v!eV}pKeo$@MM|$YnO$E7KDX(-X5I)(g*MjdH{Qqa|quy#{-7a5tvMJ zD*lh@1N3jugND2kJJK_A+<4$7{Q$$K7Hsgd9P4w234Y?AH_80KQ~G*Y|3)2N3ceWc zAoK~~6N!KS&aV#uKE6Hzj==ttuBmO1Pdv@{hX*J!R~^*)Tu&BC+ZwLc-*=R>dG7WnwCJDLvez^I6kGcFF8;2xzQZkiqOK-B<(m3> zthF9xUj)6miRl~ccP?nhYmnD(VEl!C=A!JCa8CaQ`_Ey=rz;tNA`4Yg*`9xP|x&n zWl*GxVEHtk1aY zA70$PHFv49r^8;Z?1}K-#9xEF?Z+GF6r5_FAK0VdPh$H;`*|*Wsg{NRtf{Z4{jWLT zC!V&uE^l_toqGS3{g|0f5MXe=XLFlazw+;ovf$wx-v-+w#) zk;QoJ@==<{Kbw3My`%7-B_GW^FrOc=y}`HVTi;(gj(Cm>8}d=*n@hnzCKuFac>XT( z(G0&=V7K7g6`BX%0Q~#E6@RYXKOeqx_&zIqCvX3c!uPEFc@*O>&Y!LCF?{#8;QJKA zH@Tqx?+RazABKUyCEw43?+g6i-ERfo$@}KRw}9`n!Z-7u2VWE8FAiV%zX879L=(QY zg70i`e*NDSz9#IYS~UZDSA355^F|&o{zrG&0XxY0_9(`KJOulj48EH1=}Qke4=8^l z=-tfj(`2&^N>@*ue?zuPGlR zUW(vsm_=*pOi1lfQ z_qx_Ak|8{r38F@Dq#kPpNXO zr|Beaug~!B1ur!_;RVzLWV$6!y7EpP#^9Z0kNhL3!pv#OuNT0r|VE$LsvW z0Q^&tLOLA*KW*HfM!e7pB@Y7L`Fn6a6hBD>(H_z%&L8s|%e$|*!nW^Y{IIjYkK8n$ zclw(4r$xyH?NxajzSO?C0AJ{g_;Lf=^OGFUnBnv9%NKV;e(0IrW8D8Wy&L7~ z{UJ-Rd{GPr;=a8`Pw@W8XQ2OMc*qwv%NGrKqhQ18@w)aWIU$MU2pa-*Gcso6?TJ(UC(6`r1qnG=y zA-)d#)AYZq@-})=m{9a$o5Ekvi#gPfPV)L;FjMD|`%C-nf!|q-Kkt0vyItM_y}+do zjyHCKh_6!d#xYaVA6;qxr1NqgKP^ki!)%}P=R2tbKlR;Aw4y5!FXZE!jd)Rx5AhI> zL^PoK^Y)sEFP`T3REhZ1=Z#V58}NSs|B2&=MZlbBf1ij7yx*<(WEsYJ13VG$#6#mv z!UglsV?Q82GksI?`RLthz5G6fs-NtqOjyki=Z!YIVZ@`thmZBa|F>444(OYjj~)Dj zX8ca(Q;ql(RG8;aiKkCzHM;}%o5&E1-;iJR(2()aN;~Lse78AY|DL@I3K6Czlhq-d zZx?qCABxR+px5qUoPWc7^Yn+Jg7fhun(sY?arL=~_?gCi%oxGm?CZan4*aW=x{Y`O z069f@^slM&TvYZ%j!%L9f%EF<&X_=Tjz?<73v|{1|48k@{dT~or<3o+`DK01D*og_ z9q}u_ujuvFg!q+*IDQ5EabEli&IjUGP@V`v{y(ccHd~m_|J8X_@hg?@Eg2_yC!bg7 zYw!-Pll{T_5x*kYzl~z0kCl@?d^(fR-vJ-QTd4h@Ec%20 z3Ha#m&zpE3t)0HqAkR>81;L&jzWjfGT&jEljVGKm9`u{anRYzDLFLaeOX* z7R~;*`S~{UO#c`DtP4#U#C~lf3Z7#<97@2hy|Q`?_wNwjo_WZuA}j>*$RzT^1t9W= zqMA;9PAZVO+6w^x%{=^zNmo0F{Bq`8)QiPAz8!<;@=o0M)Msq%3ac`%L;rgk4t~5B zG`_xp|M?rijZEV6U33JPol=M(TP7pU8;JjP9tdA05%0Qz5P!1!f)kxnz_*uG zK1!Z1@qCSNMuY#Rvg7N7_oJ^}`&tV>Wk($KW3-#||8f2OsIN!nSUxL;^9_3j_YYAE z`S}>q!pf`sO*?L1ew+IC_is1=&lUT3Q!zDPO5Z2?)p{vD2Kbk?-Ep#mwG7279N%5k z*?-0T#c0PS#LrZ?|LH%XjF!@XAK6EfD5n{Qk1BVOi_(Mt zBn|sSNKmRX3jPY8IO6x2EE9Hc7lHN%+W-|CiGu<>3Vv-BZ>8gh>*V# z_3afdWc}kW(~dOeqvS*MXXCtHBH+~90(%i;+2d{S>qPsMN!!t$s+_-2NB^yIIJODx zX$$%*Ub}C=_O3_#dTfs8;|>MmFZl3EGd=R*TR?q`aV@^NKZoa!{o(wbYCa6Fa3;7K z_>}>C@i~v)sPSNv0eoD>A6M_n;C=@UBECz{BLC=85AlvkeKq{&rDDCk+CTK9&etiN zFZ&eEFFtkkN5TIGnwMaF&Mkt^s#e>70`_})6o5U4<_Ppx{KEKuE|wD<|C1R){6vLvGFQ6hI30^r z#fE5aS?eskp!P3PIko=c6|QW=tHo%v0WXDr5tHCwcB%o)f0X1>#EjXDKaT^y_Aa4^ zyULu8GBcD-0DA#X)L#R6aEj~axxPv4uhW5FQs?@UgnWWxXmhLnO7vfB_OI$&T;JP! z4(iYHdfcHMt@_A!lJgqizcB%JJoS~hq_Pm~Q zV?5ZCm_8-3KLSB>6Jf^&yzJ0NFR)2szq%$R=!8RUmw%qENJpK%dU(J5;jX9#{s?C>k_FAkCz4JEhghgZrY!T8lu`>&@C;0%749YWvPAmMtd-7LAdlmkGi6Gyk$?$FMFW?FLo;?nH@B)OOr#UhXt`y^eJ)Do# zdN@4A@Id@jeZK5320n0pUNMY#VB||hep50(1^rZinI@uk-->82SvRWlg7ZhkHIs4^-|C&Dq-B1EuRJkS;w1LX7={{i3YpEC>*RS!eE9MO(<6{4bzbyxmco;nBq8L2;=c%Bzdkc?PqK3O zzvwCE_j)W(D@^b|+Y#sl{Cf133!ooAF&G_F--_Pb#v1U`{ahdX0{SA}`*4J3z@HMM z4TE2}3{`cxkIRkO+=LyVK(2f26|^nFe!~8&=6OcWrpuvEo;1g)RBwO9y?%Q&A7iH8 ze#wbL_4eTZZS8qh?Z50*%Vn^{@|)=B4m=zh<@4{-rFU$UZ*-n|z?9my2LBk*0>!R4 z^M~q?+d3Z(&PT0rKFCCTbDyW^F@ma!UGf^z2E4<;#`!u6{%KJS`jAE60{))p3>0bB z1-+^U4p7bw#GvozG~hFBJ3vP|v$$`Lcp1)TmBRfFdj$5EE_!5RF=7pmw&n-@F;`%I z%Jc&A-bfDe-h_t@9#!@O>mG#<)Hw+x!XtAA##8q{`Fw>v@o_%S-^Y1&7dg*wUoX$E zJk(t84A0LQ+TNNE_+L)(6P{1RKBZ{`{(5o$*apAe41b|6OTryFhx2cY8$ZDP#g08! ziw`V`K5Q!fM&2ao<35x_9viWckNJ^0y^PL?%cH$mpIE`W4EmWz{s)WTA90JAebN1-=nrFk5RUnZ-M#s;_I=7o9n3%@F6p_0KQHBjhJ=B$5+*TNrtak;`Im}@$l}` z-~GprgbQO>5A|lcZz~zUrcZ=t^CMK!=1OY*OwV>S_4_2`qexDJe3W2(B6AnyQ91zm zHK+6$?!PC8bH?%$71@81?TK^zCx3%UkD-3->>vufctq`uuU{a|ZQcant{9 zC8YxQTrC3Uf}dEA@_rb_`ud~f+LIAaF9?PQ>;ri%1^$d5);EpzBmjROU(M+IkHcSx z^UCM_2+P;=>}|CrlxdBR_Mq>$Zw2_EJDvMveWV57JdsTWwSRjdPq@rq{rZZY)awi2 zM^$$l^CSJ^_tuPV)>q~hj5oR1cs9!m=&C-x?nuU$4AY15V)Ax;6|8r*(r*KyIL;%} z$6^Zdku!q(HCl~q*q3zV3j*0@dahql=P#_U3?m;V1qP@lf!{%>bs%u45Pmn>406l5BlyJUhaJROggXj7yfZC(nq#y+Jjzb78~QwhdzMzNED<$w-WLU zJ^#T8$d}J?e-ZGT`u+l6Q}D}m-alBma!78PPUCt&NX}NK=IA( zSzGkXKpsQKo$I};u32f*w`bu=-Q_mxyYgWBo?;e}Z;i0el+29rmCZ zwy)r?8tY#lv=8kwJb%95IILrSIm>$U&O0``xJ%Zie=Ght41HlF z3I2INtSG(yt5XN`w1)PozCEi2j^I59@Lx&0Z6Vp-ytcG^k3Etb3XGFh!205p!}|kh z?}?IO+jPB2z-Nc^IT@oEpG=XK%bYDcVLvg=^*;TQ8lUgZN$d~KPg?RO)!|{-1bqls z4X}O(>-YDsI;3II*bbbx`)yWSQQw$V?XjDH7q`cEni6YqzSa6Y-aq&!(4YP0>!<$< zD$PHCbNg^!EMGq1c+;Rc-yWL&9LiOD#jgZnX%RmYWcsbc{^BgGKf9aHUt52WUl8A$ zQuD*Hp8ZqUXA*lxaKd0I6zpCyAJ)7nG z_{zSZ=!Xa2T-`pz`uLGf-cN1z)cdaNFLHkbNWj#?_8#xY;KzzzVE)O*elk6rhu?rV z=zlXF2-@kdK zGye(5FPu+x2>B#skl)vkGKu$ZLZ2#M*}oqimIp3Jd0*o@A`jv_ zbA;E+^9|8tayCNAPnG*!wzmMqZeV%f$wa?ocy{H6Fdo$o*5x0-m+y~Ocj7yLw}S6x zwx2u!{YJsJ#`d&aJAC24tT22*h7^3kpMNv>PVZIl#e2q>Db54WSEH%)YQ(AVc|z>v zLS^(cL`8bE#~$^2cFy9VdWp((u1g8gRsUd@O3 z$wL1zPZKA=9&TuZh8EuVDDPRhIuv)+aFnCZgnJ$lv%DJRg%{UMM+1 z$M6UEbAA2ZJFtO-((id%B9_RZ+;7j{{{2IVx5hrB%DZL-9jo_$?0=T7eVGL0F;#!@ z^KHGWX&=}dhW;kTjb~RTblCS4zLB?SIf_zehyjI^IrT-e?IbI*Uf{=GBi|99J zwFg+S#`vYclEA~Ungl;r8wQPoeB&O5{^RUj z0{af+4d@^BcrWNTGh!XjpYzAEe$z$|)&4|sI^-FPpdWUo(O*pAXLU#@eGL941p2FWdL*OWJ{IAWu~_|FFVGf4>wys`~g( z9Un1&Ki^ONJcq%|K<{{bRGMdBEKP$S`s0zs_-lt7{F9=M^KM3$h3oUTm3; zp|I9Ip2}}frw3~OiN)lf=({j~hA+8+uHJ{c)ci9#{82tU^7*UT>R(!!Y5F&N5}GeBgP$WlJd5{xpigCViSZ%7 z`|=IbKP-CgE%pasthV)^b$!aetR2EaE&XeKplX2Yvq&_6P5!XY24z@Oj8BhEF_d`_GDX)a~<9(bqVz1@;PA=l|{e zZxs7q@BcUEUwCG<**}n^2><9A`#1k1{hP}I5F8kPaK6z$ls+1;mHi*foEIN}`y!3` z6T@dweWM*V{O`B*&-l4`|LOlo|215+?1jF2Bm9LH z;ra*rIR5}1a(cfPsh&bU7cWo%zCs_})HA9N(lq=jN5=OV}y z1^v~862+_;5St5}!G0gB1#E$hLw)`U)J#z?y>&_=ei`~vsCw#(EBgh{rv%^VtEB3e zPk#E2jWl^8`VU=1BUeu!Ms!MwCSP9u569=^2Br_WhsJ2;XX{?+v2z=Oj=}l27MBm= ztKk2!d4KUqR^d6RG6s1@Qrd`+CWsO}%P86iq?iO9rvtx;~Up`jYK1)4+MF4MBe$1z^@I zc?o~I>=@v=@r5KU?|bM(2kYZ8`+yY`s9uL3{~zEj82>WA!TB_meB|iTMm!GWyU?6~ zy-Ud_?q0wH`U~z~R3GiU`)Xgl7Fq*;l>A{$KM4Hs0+Yn+ub&5rH-54HS+<`D?Akzv z&$}C7dA1?H^7__7e^cK!-}iI}aK3utL;BQ8?h5)H$`QW(CRRcINihDESl(`@hqXsA zAIJ;mf*uR_han}y{^J0i5*-{-{{FDt$M(ru!#>=SH`qf-HYs^F2mDQuieErW;0JyX z`yN#K#5{SZjz3W)@B9Y%Ls6Em1<&6NKwk#^h5p%q?|k|g$9bste`a|^&8_V}_S*Ag zu*CM6(u4+mTlw#cd_LVbU@wDy0)0>EC!Q~VK|krM!pxW!Tu#w3;H$GePjM%R{cMAe z5eI#W(WKAcFtJ&{OP||4*eyhA9Q{K!XxLY_Fh0+$Q}}`NZ}EPp{@VA;g#H%EYKRZC z*q=`|UHR`&pGK&AD~~rEGv7k|4AzJ7cz?oKjrF6z6M7DRY{$nUp4K^?T?_g)d5zy6 zDhMB+m499N(_=KzoIjV7&GJn38n*9f${s-+&%)y^PXEMZz(2W1E?FglbUpd-b@jmA zc)yd(qKSMLb^Xs#@J$@X`KyL-o)x}=K0yCg`k(#GIm;n0ed7wb&Kvr&aFuFyhJG# z!2c+pFWBo${FCwBw8e3s{zJZP=%+)wdA_0{?_=ike+%s=wE>L=$~y2g8v#ZzL{k*auym@uyaTew|b6-+K4fz91Eu<<)j|lEW3(gCC;Cg2CDP=ShUv2 z3yiRJotpgTD4*BbVRc?%AFIHA`WcE6;>~Q9uTWE$9W|WC9_;$_>ka$`=et>7@cE_- zF~9cnJ%#c}_HLywKZ1Np)7;+HKwo%h#HXU%Q1&>KyTCEeS4~+N6P-$M&Fdb!ME3< zD?kvxdGhM)|Do`o;miIFz!CVE*Hbdd@=i+C@2VEB=n6tfW*7kznmsHS35zln}&Yi2A0OlVmGXL>dULf<$=nu&r+qP7chdTFM zEx(HWj7?!S1I}ZhA4VSc>kyxp$yyl={$IHf^dn+p!hKGF^G)C3wAax}xfS9g zPi>Y|5tmS3Zc^+uya#63-btCfWox4(P#ybK(5?`ch-5H7vjqN1wA$fCBcA~7uM8tz zY}Fb(O`Vow22{}$^0Okolgr7-V*exYXLj2GXUkE#%}4{kOgfs9k&0GItZ+Z_^UX3e z`4;4H(S`kSn7(y+1AL#|86$>w06qbZ7gFi^M6NSSG5v<^GUg0qR7WTb^fGwN|P|Men-hG+`q!- zSp)F^B?v~)kEdKAA3LFGA$$8q64g~Vue1f*uaQU{@gc4zApfy_Ih4H&`!B+PpKH$0 zaeb2GNfXB>$oA$Y;g1z>eelXxw4)f0;g2Be4EBSzus?p|kRQzR*X}|B>N^{ns=?d})d8c~d7Pl|J%USIbb5`9lI~R$848$XlRi zmH~fhsRQ^Iv4S{{YQAbb#Dg^KrJlQhUNOEw$U?jW;za;j)1Lo+!zkd%@g?rcQZs(< zZ1zjPKf-$yV|Dzk%eQcILRC*eFaUl#fgLm^I#~WgJRe!&-{HT4dWrIqhVz^I&Kp?o zbvQ4vNyQ(w?C$pA*Hsm_fPcVVC$K)8Z%@2$4dNAZiaylkHCJPQv5yZ7Z(skVDd0oM zd;;ILf%99s?lI(OoxBkJQSJFAel+Kc^9Xs+{8~y+iY>eM@c8ZWpry@xk1|(HX~^Pj zIoMAmfYT;6(dt|Fp0s#>RsD8+VSJ3K@lgc)#7{8(IhM2Ki?C1K7hWb6{vjV3=X;t& zeLV7#fqwM&*l*`L?0;9W?jYmr{T1JT=gSL$bC*9%%HFU1ckXv}*hekR=hwiGX+Cdhw*OZ-{>n8;^Wgsi zJ`1+**uaD$;DvlYPqKd!@qp-#{_NUNne|1>2tdB>2$>IaK2O#^UcBIDkU7w62l~m%GWe_8nZEaYHkTKVpCJ!+y;1`#;KmWF7paL>;CV<+6o*58(W%k{*KoH`#~& zZKg-1jZEK1JJ!hcZf}-ubJmyXweM)R;{6F@GwiX!Io@B=*W8_y%x}Cu1JGkuQ~wGA zgK^*B$IbUb(jCCpvIhDin*QysDQySN!|+Qj`3>-JO1wYp-@<&i0bdM(ZJGkDf&B~L zYCVK}4>shNYq7nh7p#7FziB=UYsf8yNY21}_ViyFepN#MG=0qKSM)RleWe(&4Ui@W z^mRV{$9XcTa#I0^;w7u!>mXSSss81qydT_uTYsv3TYsv5v)BjvOteq*m-aF|J<0p^ z7`Km?2VXNKZJ1nE>d0MkG5V)sSTOy!J9gIf2^@?hkH6D8^i%P))(JwfvG^k5i?C?O zH=uXy|Ep?`CsxpR-UK}@b9-TU36N*NOPgi=6!B@@pw|U$0{0uxUZVq`2Q%RRCi>(4 zi&j5%GQ6g>YqM5jFW&p|{mo@92YAszt6y$6x>+ci$WJZ&2)lh454I}!LuA+6<@0v@D12i+ez5!k{gcmEAZNv?^Re|ZlzR~Hsx0OA z&7NWZ`gh?U*mCRe?nHbd^-qv*G;d?!nx&8aQWlPGM14~6=DBI$qy1IXU$4yqe&rOm zSLa9JBm0xboDSAEi(Aou@%UQUkJ5P0h1|nfACl%`{{vx;XV}W;>j>I=BRKC}3f`IF z*%tl-e$G?_|B>VOVCg@_8UXt!Thsz`tJsKHa9^Pp~&5zefQ1QSBdKK4_2lN%)iYywIV}ud4x{$d=H5 zYd9Z~Y2{Bk0(@5EVSoOF_vgp34=&uFGs6c>;qQuK{#|7S9|QY~KZ5_4`flO=Uc!EZ z3cXDqGu8UkdKEsge--+ag2xQ>*;rA_npVR2Rs$X-?FJL_+!Oeo`5VAPttV$ZQin&3 zn*MFI9xQTm67>4V=Z}>}@E&KV_#*Z*@ihD2_hSDLpO$l(zd*mm|3SaeHp0F^6QbY# z^)XGu{T)Bv68u@g3-9e6M!e&`I=mLAcR5Ax&IYepjMt^`DW}f6f>%v6;J>K95cAt& zS~;U+`TO4vuL9HOcYxRAw*jx#`V_q11~24e=6Le|TVCuKpm$xB4Dg%01ByNWs9q(j|QvA>AJkw3l;EwX0Br!?$bd-!h3Vr zZyF76lk08f*Y-_Ve@w}b48Q;3pLbt=EWU{GqsV8%pwuY0RNr&4(!ZMDlI>q42tmIz zP@O11-wG|&Uh5e>GJ^3&2=Q`x9?#J~P#;h5cs)GcO~wGq)%l6m<y6P-rLSWD zXcF=Q;zgSFbA>Mn_IF@plq-Bmu)O4dtNF|kEg7(N*rz>2=oCXGjlu&7g92&MK?%s4 zJ7I4Whgd)E;P~}?AMAymPA0Gu>w!HD`GZ`|6~a4tf{w&S@8J8PkL<#2fKdfM0=+En z+(l!ugQCUn;JT%>V6TBZG>vkLemHn{GQ;*!)gRvW}5fi z(~uuxaVSsq@i9Y;&+DhXj1LL! z73Y%*q02Jr+aA940r|fg1(O3q8Gb{l`{l(G+tFUZ6MtiS;N)K_`y3qqd=Ne%JY7SnsXBd$$oRf7F1 zVHBAju)KDb_!r0v_4$0pR`bE2IFVSd^zDzhpXRP?#X}?BD#`o~_DHY1h&~_5v3}#n zyH90DWfdkARgfe3DkXKDJ}$D)kL}XLG!T z_D<$MkS}=t%3hj>kc{y`f9>I*^yyXCB-;bU@bfKsZW+uqP^fwvES`J`^CIH1Q|;S(ow0AFsLx_(by5CgQ5kJV4 zaGy-KF#ngHm$#{J)xQn;gZbv4oIl@Sv=NW&`{%O@#-C<-Q}3VYBcCVLANP#;6d-R9 z-s`&;@AWZ$<1QBN*JvB*nBSkdpubV{r&Tx}oC2lu$DF<9lQJ?R*TJ4nJLCx;KDZA_ zeWf4$votXV@Uf(=kvPvU-e9Zm7(Ks6!9&L<*6Y)w)_sf!l@X7M`)D}-Yz}|hFa3V_ zPeBH^A-;DzPoM+kJR$WUZ@R_Na5 zQCRbOqRUfjydk*DX)nYfO|zE6-(*M5!B#twwJ$|#oX>#l%+gyr9F2yI;_~P(i%b1K`(k(LAZ^wPI#Mk5AH4$1#k6r>Ja4J|P8X_sIaj+!+{fz*1n|Cnv_Q9%#w_h6GfU^$Yh6mpZLq}BGk*j2hO4?Doh63vP-q5J zrneND0RP6d=$9fE`#*9sqtY{YeR^X1I$D>5e|OYi|KSN6Fu~~ueAM_M%e2G232UM^ z?qOTe{v@}zy6f#VwukqLlZKu~Bb>iXV5IApE39$A97vXoqTe6Mb8z^qjjG9kvo3Sf8Ue6GUNbX58hYaj`O15N-t?y#^1!r z?Zv@iZ8P9mbe7XEAH|j)=~v$wl)rTB>+#~?EB8&&u4ktN@V}Vau`}-IV`y*jd9a6) zbjzWS06(dO@`Eq_Y;)9pn$P3m{NT!N;cP0%LD7G$*yUyO_@=A2$iX}Nk0qp5=K4?0 z4KBBx5wtgP9yjz>9?bE5P`uxB`1t|k-SkX zf#-Z@Z|*02zOIjeE#kcI#Cdm5)$dQq*Y6@3yc6dGhBI}375whb;k?_teg#i={IjPH z{PQIbZbW}5m$w`=wOx@z`d-wFa}mp@F&QZjko zE$V!aMIIUG_AYU7z9%rA4(Wk3xq|(@H@9(%iKg`b|{;lnPiV6O1k)Api{$*L`FN(j`>yK8HJOGmB`;%vh zY;aKcr>njDXw=yUdo}!}c$m3__VxQSHM%ZZjIh0)=Tp>GK87;$H`nv+eehRdNx)CG z*Ww@6l14lgmHhKK^M4)pq1F7<`g?5j{iyLR&fgWs ze4!t6ypI|W{}p_!K}q8*PcG*FHZ!2KePzV*q?{b&gHW1AIujDaD`n^CNg3B@ne#5H z-L-t1cjEW7qp>vTsdFpsqpIR(AhcXgYyM$_J!ZY<=-*$ZFQt=uoMb6b0Y97L_Wx*b zxwqFkD6iu3?>^PrP4Hkvw4-h14#f`2-`5gE72O733b@#>P$>X=NhXB(xS+pBP0LKt z!L?R~R||R>N}40#wG#AvoBE#fP~Q8)2+9YpLj4%%ul!P9bPHXykMVEL${{{<#T>rf z49a^f(8EvaxN3HxRQNfG@p`K#KYzzY`whJ37d1Dlc+%ZVs!Z?GWsqw>yO6D!iK$b2>8(Hf}bp;-=UI?d=%a|=%XFzed~ZZ#otx_ z7AJbNqam4D1AE5_iThnStM91Us_z}n;5}Wrh09NJIm4r^z4~r%ugZD9{QXenv1a?f z4oJ+uCqW}L?XRZ@dJD&VD%vZKApX_w-`;FbF3TmsKS7UT-mj>3`pWyY#Oc!ml8h$S%yAS3p zU*3x-_^WtT!^8YSQ5@VpkwpB32zY3pE(Azav{2Y~g+;Hz8XKVXiS+~dRnAuao;>w# z+;2+`K;M%Qynj~5*Z01(ff9%p{=Y~-_`-3PB?PR|5GA|Oz7#j?omp;r^L=Uq`g}Zf|GeuOIm2_l{l1szZH!UJdh&M7sk)QT=oGZ-cmuO!hmsKm3mE zGiPo8=sUKz&f0$b9otvvZ1dmxj_r$QZ9nvm?K5X>-}komS{wWs|04-nit{^*cyL9( z^vOU6^%iUIX8cYs_j=6D8|06)+Ud^^NT8<%Beg9o{1f`OieI1OcyxUF`ALjePTzq3 z7@rmWhCKxFAmYtAG~sym!_i$k?TN8dc^W(P`u}(8z%dHibW98EyrA0O3;)|m)xYYm z6GUhe>`5s?J`@SO#1H=L9myd76X#_y{VH6O`ZFtua32Jf=G`As^#ikhISSoNUwUJE zsP;ze&H*&PF1`&yS5kspNMalsGw-$u`H|81u#@0#KJZ_bJBWaAt1DrI56 z&cMkl)OXC@xf=4!8Rv_V`M)XFhl(LB{yx%|Y8>A(5?YJnNJqfiCp4Vb)#t89s=?lE zE}8FowZ$)GCyZgkbF+f9$DbUBJ+rix)@OWrj9brmpELn~hlzYF8saB*1X8Xs+dc8@ zn6R}+_Y&yk2PZ(^r^dkH`^fs#62~!St%*<`F$jq7lVBr?URKBsqI}G9Nc?=j1^u#T zU)Cu3)cd62Srev4%V)3GX|Q}LiQ{pU7Y4f$=r8K1_BU&^Vm1a}?Njgb48#vFJpXBp z*1h~L(s!5N=bh+Tdo)Jl;1@y%z3r%A{&SjU&;Fy)DxZ=gh`&0uY_p3jr>?M$xANs;h}9`K6#BkGs@q; zh`VoJ-}ZG6E~966<2}a{5nkUAuWt{puL}F@+&KFCk$A@XDQDu zRz79peEZ{P7AvPMgMhD^e`2w6>u`fUbVfn{%~^9~ji?Smeqnx@iDd^zXl;oKbSujv z#;97q&g+*aAPEHU@{o3t%V~D`t8oqG_h~aW z^+UMr%lxcZLwV%n2kZPgrfna9e`IC^{%WQl3-`w~Cm`QsLa+yTcuN`Q%N^-j%l!5S zNf)*g!D`qCf+QJ+Oxw(LaN}fY?5cuYDeDsT1XhXMn!# z80?=800GIH%JslL8=SbBIypX3YLKsT5bju?5krh=k~eM+nGV&$!j4{CfY6aI%g zM)spU?>CGv!(DR$2l64g?j>HwT!zBQ)qf&SMv~vAzdqCp|HD7!gNVnp=DtN2mH0cB z`?G5ah=lg){we4`)?ZflbN=CD%VbD=`?{cDw@JzgbS;ybif=AnGq%!J^S4aS2bHUE zJgJ(`ly*r&e`EVU;`y>1KL~ibCgKfZxqC)reZFbTSI=F40|A~{_#0|{n(Ol;jqS}$ z4>&(Y1K(+m5U;7?4b}Z`l)(Odmiyij(v-ggrKF2twekAMi^Z6iOUiho2rGX9A9obCR0+kDUfjr1Gt#QU<6#zdAvuk|o~ z9#iW#MgeqkIsU8oNt_oI4|Qp|?r$SYn?t^eG~)lV8N?%req^oDCf57k<)0||2Ka&R zC=1z`?=0qPs`FLVCT!uce^0OGfd7*Fcfa-=;s?1s;@@YP{_=X@?@>ep=WWKD7yo4> z0gs5Y`&K(ZFCqSt;e+>TwM?=;9`2{6qeL99RsC_>d>Z9x%m?d5{33?JAT`dXtpo%h#6MC2`n%M&i3xPW_)~;`-y1flt8Kp( zeMj;9Un~Cu?gJp6sh*!uGX9cwJfh+Yhr()h81HQOr~CKkOtvTdCixxAB*#a(e81iG z??-I~y-MuC_|87Q-;?3^nW}aG^yO*3UuE^7-1oOA`jpm?Pp@+Q*Q2(3X$JIH-H*;3 z-yOD{XHND?`0EGV^(B2b;`6k5@9oHrDeNCjem-Xhte<)k@_2mhkv4dB6j0t%`b(5E z$dGiF^KVr-K8zB_#ti{U2=r{lrY|JRKmSwM_xZl@u9I@`z1~vzxBf>E_)@=LTH1;G zUHpxBz9*XZq2g-4cQ?N=hzM2qJ_-B-*nbW3Kj+Jw^zm!){foxJ(!bv(1K>x9kB7aB z>DLVN2i%XYpLfiEhUVcjO=A2=9Oti|ue*Tz$3QH^m#KIVZ!h2-tL9LSPU`+w*qm^m zF{9@l!FX2B-{QTxlj5Ce9xwXmO?X9d-^@UN`;!);NmKoN-wpOBj&Et=ZyjGP#+L-( z*9L!oz3JxtIw#2ayW*T5D}iQsZ;%2-#Ao6CFT`ho9;x^fIO(WQaJgXozKeo2&KuSJsjb(E|gegg3+fX^`BCqO(y-!AwM z`m1GWCiSFDHs&9oU(xx9a@2hL8{ij)|84*GA{@VuO7rwBb-u%m6Z88_JwGhsTS|odB@X9fbM`#P__gJd$%xQyRP#lAXF=tcsoxI(Kazj2^19!ELfXP3CoevrqrE_)?HcUvzcrPUX9 z)qQpl7Dm@7!`EJnUhz1K!YYoZD^KuT;Dj(*wjbz&{RtykwO~uZzaF~hvZ{vsk}mFQ9tS|G#`F+sWM5|i_5-3l&i-}QUfkD}e7`A%{It)kEW^){HuAs?)6uqZev@w@UX}0n zBL6=4jn!Qae3D-Kh0XZG@W!u5=F!vHtLDftGdzAtF#p|Tn;W1%2M|AudhPxa*$Gty zK|VZQ)L&x%6Ylr= z`R|yhAs&f5++D-{AI#q~Y>vOe{`Xl_f_?`4<@*gIz@KA3{?}Ecc_>eGTp`zEBLG{xE%L;1Bw* z=*a)N5P!T^ZW)?~KQo6F{#;>Zc>D(b1b$Qe@t$Vn( z*|B-gS_kri0KM#eIFiKR1D4JXG}AquO|d?bQS#)Yp9FmfCxIVdLp-1*&?oH8++R`J zITgQ$`6qP5x1$K>1rUb(4SrBx&lK!cn$I7st$T34o}#Z&;#-^D^(udsTfRj5X&3AR z^yuM`B;Fse!Q{|-~e0bN-O{0sii5 zeIMlS#O>vNcY@o~BYgiqbKe$I!J~&JI3FT@(4X)g6X-GQEjge6WX_A$ZopL4j`ZKue5(X z{kQiUBk)IbOfkQ-wJoTB!#JIIh2`fz*S3*c(bw_);`lcKAKI1D!5=1Zet?a|kbN`Y zQCvZRv^{YC)lws}Wu$b3?RAgyeFEh7LVm6x+|R+n)O#JU*R|e%0K5^eoBJW-pJ~UB zx5*R1G!AJv+o%88N~u4Q5UPDU{!KoGc+w<~U(f#od}=SxC$L|00cDTk`SN^v=ocH# z{iOlc*hg6|SL2scl5D~JHezo@ex2OvZ-9T*zOCXjFh2~faXYP$FqPX^1~rM*wv8F+1bnZkbDvG zcqO(MI!9mLEZgi~UU8B5W8AUan1sN}>krv@e@EHFcs;VS0D90f_mv&MC;T9vUaZyw z{lBrlz@M}R_?47BH3;~0!Jl_zCG^?){PA7|-gmJG`pBa1RUp1)9{dc91RN18zpDI8 zK0RmnE`EO6>_Z0ZXQ8Tx_dpVQ0O#{4^85St09VTkK@;7}AC9PebjUY#{)tXt+;D8P zBMExS>)nszrO(3;tn?1!{Bk3KeEiV&CFj#r-v;t?Cvcx(=Nht~9@;Do z@xSnX{aAL78QKs{yvXIn6Cs<@{`k^j{5zU2wG`~%t3xM8ijrXe>3ob<=vdSN6Cvo9$qi-DGGn5KF9ej zy*|(%7klIN(0Loq`L3~>=?nHFh4YQ~ShzkB^c~x@wL$o1b(s(%I0yLv`$y~5eU?rW z{bA2we{zQ&ug0Cd-QeG-Z$+%fI_|#OE!gW{Goc?_#ryOL$Uje`JW_J>Kl|D^7Mt!& z>yYoK2=84cv<&c5pUDzpoDqNIVghi7QozxQTP`6%u@Rh)@k!RFZyNYwqFme#eJcz6 zF{*3G6z-FQD{aTOAE^Cg|GerWCMh|&4FA-rWMX|jyjuCcgPyYAa9!8X0#1xJCht}9 zfK>LeaGK-IDUJK4s4{PVz*GoZ{W;WkxxI6#YOlsu@J2VOa2mUIhW4gvpK7%C{vPXX z(bvZKu-KoW{S5K=f6{30zP@PtWoK+(Q0?z%w72^gojXwMJRy#I|( z6#v8hU&mvANS%Jn%TLYAz>{61xGg}({+he*W}2IM02a1Qc;(vR`p{8YWa7CuquD9(#c|F-2$ z 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%0DPV8&U83 z`(eHW|HxH2=;yQO@AyCBKBm6MdzjSie_sh)*0{bQFLSA-75CgOb$4!+{Wph}ZnnO41U3+W zjz|lI|Li}!lhOV7&Y(K~fbWL$L5&}tV12l>HsZao+3R~Q`n$YNe>VFE!=8-sy=_g4 zeSd7+Pd_H`zQTUM7Yb^gZfQE;WB*M@Gqoc#<16|xB8jhI{VA|Fy16+9dOM8#Zuy7= zEWZCF<+?K97i#{@A49ML0v`u(e{ne8G+1VP3G%h$y!|5A+fCpf@E4ksW8Vzu=k?1T zR_iHSxc`&17yYAq-Jc)q6*&K3j{yJv;-n>!4-llAUJL&ocRTXY!CtWz_6j9WM@xz4 z_3US%??wMOLto#A_tD1LKc|H6ot85C4@R5dUs7fNPVs%f*KTXeX^+w`H)k*@obTXQ zD&NSVc?@5Q^AS3$`1YvoO9~zei0EduUuN({{`YtjjFmndhH`z8CR8YW^4x{EEhrU(7FOQ3gMPKaV}m@B`_Li`s4lHFrTy2|IGV* z%0C%r2+_sqe)!{B2GJMbF9rH9@_MQF`9j`SYl$dnq^Bq!ymS)&%F7;J9^bR6$8DLw zdbIlQ^BqYo;*OwCmtrB-hb$7ROqrpJ+Jt(a&pZB^qQ8Hn0o9Sx??a!wRmd8CKt@)C zZcjd(@U*@g4=Mfx{oQmuIuyu9J%8u^5&ZLN)&H6E)nGHH9)1t^8sC4HhU)lI_=u!? zX0Ip3_&vC3dZl0l`f+0ZU@<@Fj6%bOPw*H1nI#{`{#NaOoPUT{1OClF0RLKr<3p-f zk6zYGSU1Q+ync8OEZ8fLhTt!x%Ek4$<-P9H(9h~6=68jcGX7eX zzpSeFZoV$E7XGnG5;@jCI^U{h*OGbqPjFxPCG@ZKPui6-oW9$N2&p?lNY+2<-YD$j zMGgKD*6|~c!XNdMs4pBQ(?X~9{0W5%ZYlIp8IK!Ba-Ss`hpqTFsa~vv*Mih z8x{Yc*4M>ZQ3!dw-V$FS-VE!_{+`rTQtRDBkcZ1dz(+yR+qcTuwOZmfH9yA3Jgf&i z(XWjoeF-MK%6zSn6>Uo7G$Gpj5|x7L$B_N8T3K+$~n_c-rr-(!61EaOkr+cylY{;5rwRvhu|09BoTG<84Em*cVgcvn@=J!4k`3$tBWcTZ| zrM0?MfPYjs+1=K2dlIr$WS11?RcVvmh0p8z&)Nd|awZtx)g_=myg|)tivG1J>WiDX zr&hyX>&?GEwaer9+TF)aZIp1xdh67#muV~FI}1nPkL56bsjXM~T=);lHP9cxzZ;i8 zrN6f&{6F0_z>n39{S=%E;=K}6%b9|fefoRXh00OPM|7gzzLV<66AgDR-`C{AI8bTtpoOElY56I{C^qAy~rNgz}g6Mqsaie<$9Tk&q^Y{K@Wr zy(UB!{BKHs4gWc3kn78|h4)*ltGq zkcja8Darb9aHdhp^TB5jO-Y(DT4b44X*;eUf%kv9?^vFJ2UV% zI?}Zr`VNKfcG`F?-VgHSQ|#vm^hq)yP=Ao3D6gQI^K4w39lyB$6xxq*{#S0Fq||TW zPoUnnsA{m6fPY3OLxq08A2&Guh2hhRG#D=&4nIRl_a`SiaK3-1Z)Z_c{9+vaHJr}~ zeItwTz69ipW5%|NApxi-HV)13dfRhP``=tCnEk6Sm*PdVAR5VLsN7u#}7cQVDb9+ z^jOmFM}8^%;QSx*{iD!6%i}5k^rF@S{BV7z{mBIJKXqO)_{&%{7yiK9pZBdJaTzAe zw~MCWFC}+mXXjgwqCYCpYUn$L_iTfFn7e#3JWgqrpZ5yq!%YGC=ZIIq{n9>}U1fQ} zr=qW!W9xZ8bG`un5&upT?9avHd(S=IwIy8Lx^52q`8F=F@W;mcB^fcyANM8L4^(?X z*=kK}TP#m%l~JYN!C7zNe_ePFL^er{{hiPhGvNNu%AYBEVLg5o=fC|p-e1CbXX&y| zpYfUan-t~?G;x0>pC4?$`(NpQ^!M~%!Fv8L_b)E3zhCbAr`c>DP3r-`&-XF#%MA2q zY#+2nfsasp1NMXB4+4}_fMyHvN)Coi*<4oiU8k>klqS{Q1S5Fw`xa%KukG<#{1xbH z!cqAlkROqvz>mVePmkcM=Qtnf|3ml_zX$%|GvE*Y0q|?3{NQL42=i9ljpppjYe>>% zUuXt!KHItAKIxYwfqtwUpBhLBC)c0|S9v@ZTM{3`<)xM9cfE=2L zW2gzk!+EEf3vj=}m!#RIo{(B9A7K6wnuqvN^HHf~WS~jJSM&_`x<`*3yAD28^P?T{ zlOKh>YICY6wRkW&g)ePxV&$sjCksK zbfjL6%8gt;JQ)9GK+ed6OpgKJzh55{7*8C;{msi^KSwOpKkB90pFV%I!4IbKjs0A^ z@0k~R?Ytiw@C{ZzNXT%~7WLZ`-8dLtT8fN7wozJ+AY9yKqj32e0_=WTJt}6Cl zS#KDu%QhT1xOn)<%zmv zuyyH&4t#pqlB-6+Zwd!Ky7DpAo|>88L@EOLUA%s_&$~L}`=Sf_YWicBq6=QFod*n$ zkp_I{DR>lo?s4?5jh(t&o8Q2XYVg$g(RmflALF-guR`HG!=Ii!{y#up46l0x^LyTK zu^!>7cRAjZPYmI`X#T1-I!r3x2u{3hpjSPW7tA@pzwE=24(ZQV@h`8-`-Az{y`%a6 zxBTl!OD7yg@h?5PpqYA#i6xY@<8s;`a+;sj_ty+RJJq7iZ{TNBADut)&olhYU;olc zrgx^tR>bGm_QwF9ug94l8`_iL{3LPKhrj{_{YhL;em-8<26^3Uhy4mMm+()6JO+J8 z0Q#j6?6i1~Dg^n!^bB#d|koA)2`)AtEe(L+lX`k>l=DcAE8Y3WaV(8B#a z+qPNo`%s5jHL_>74!2AGfxUb0N;%KbhAq)}KaJJ(7eV-2$%v}=I(0hOImP^d$CE8% z7*CIL|2SaLU+N>Xyer>J9 z9_9X7ztNh~u8^h|+N11bZ^Z2hbV#wijnUyr+{zoXYfF0%%EmeOY?HClrFIL?|h?s6L()U-jc`q!k)OeU=~i?h`n}Hvp7E@?uX(e>+kq`y}Xr7 zAx~_X6We$k^{<283lZIu;>jnmR)yBmrj>JqeTF`?dSX4_<`_OTK9$xXU+FmW?{ZHM z_;uNbzmeW*_qo_o>_1EGKkXLS+cU~PbR-Z*ehRja5$6y0?>|k5Hwu{}xc|s)&r(n%HC}|{o8Zb{zh6b5L0A|-a~)R@ zmiI}f7dMn!(_~T9TSG5(i9m2YwN^*_NH|q`X(>Kp{a6f(I`jQ`s=X?!`t$HxBM14C zQmTyhN$8=c$2)iX!Rhue!cDiIzMq7Bcu_O!Co+>icrWCsAwZA$GlRrBAb;D1Dg31i zMG!xJ1oAo06&=)sY$y}94tp;(nPOewQcWJIm?$sZwv*gkVCfFIA*=2)7QX7Tm+zq4 zyy!CRr602W{NF}`;C|k>h+1p>SHTN%qHt;o`HtZ@rO?r#!Fy!bs*(#>74&*A>AzK8!g?BS|C+!w%4GdjzYXeO0E zhB>TTc%e?wH~tF!5$5L_h;KoVdk^x5sQbRD3(z;H4*sqfPkm1<`@tVndwj$68by2T zi9vRV;qjx%zEUUllh2=!Vg+PnRJREF-uJAZJ|&YRBzj4DQ(EUst?pl`1qWy$6ClF9oYKd||{3;YW0GVp80hdYS+ z&KO9)2h})l0qj7#^9bPg+h@@p`pA`WlaPOE^ONuFBke~Mfh(ZTobclf0(dh>TMm1j zo)bd#2YDXj6?uG$;d|&$p&!Thb2hu981GpA&z4w+j^P@Zota z`SD{?1^l#z?>}6BR^oUe#ZMhRPdkg~s;ht{^T!K%$VUPHx*-Aj_(?P!Mrt%uP>JJ- zDn}QjUnnyEy^|y?`5expqZ3@Vk7RJZO}>x-tIKe_#W?1F*7d=8hxLHdg1khX=bzL{KEJ32hH0Gb?*o`m zt)6j&)vV?g&k@x~wy)Ru$v%dU?G3PJsPll&@1a@eH^un|7zX>&SajD0luFCYpdA?IIG@yA)_uiof=@-F3XV5sp6Z~qPSI|lMC zb>~`x5;7&9<$9o9&jd ze*e5<%%E!j_&XV^Jd{9u8^)IcxxYtS>8A9~Z#ybp*+Blgk67mNC2&0eKUVlTso;6~ z=+^tM3NZfMU}>HF;%&<4kX-@AuV%h)8E#?zg&uqGN33uj??H5$r?0Hf=1NXH6Ua&dU_y6X5^p@%p=0@uHNqd&$h*$nUc!PQ;!M)BMXHT$;;nk$1_K@*3nD+uR3w zJ5j}XjNIoxYn)&9^t&Gk7XNq}UkvYCjNgL3zyQ6SiQgFV(KX^X27PEFeqkR?QB~r- zCD2!lyyJ+cYAr(f-%~Q!AF5>vsm>IjC>?N>3eJ`2g|{y%8hp z{?poiRq~jnuYTt<$ghhlbZva#lN?3=MW*kW^~U<+{$&rI zKt6PyU*q^0j1PPclUca&Zs0TY@AO(H&H0lDmeP`Y+HS@ofWM}mS&4WnhR^=N>(K9| z?@8eOxVAUw6HTx`z6YQGJ50~6sUyC5k1>UOfxi5R^+o=<3d)W6EdLhx+}c zOYgk<1-*y)4ewWl@4a2q{yqwR(jPqyd}noNi}LVLc)yK5BfkLpM;WB+mxDZ>;%6TF zN2>i5Dr<;$@b$^ezd{wY9~pi{&yi^Jy`xLr$L7VtA~Sn=P5o8)&j=AXtC=0k}^sHYptZFhmc zt)cU^3lu-mWEa2xm!xs#7ft~06N>Nt9Q-@}oqO`%)tNun@PUZcy+__=e_y7D_6U!! zKZ@@u`Zlj0>TBy4L|Gr^_4N65@V5!j(=@+R{JK@`f5o3?@oVre#jlO><$PXz1o(AY z%KgYMweVhfDbHUTS*D)``oR0~DNUU(K7ZH={DKXFzZQ8vxcM{oe*^t<|CGV^o$-Tx zd|qIDBXx2%euu&DG&R2x_owjJIerrOde44R{UJYoic)`fk6a-){RiFU2LI*4*J}Iq z70`cRoc;fcU~c|?Hp){tpO8;wERqX61A5H&cmAy1`&T6N(q82EVwqp!{KEcp-u@=! zj~&o|v?~5sYTXL?vIX*0Yhvy_@|adRMlAG!|Khydx!l$vFI%i%LH?HO;a|NS@|%%B z{0aNl5aNq){tL9mdF1EwX8iMbTJ;q4_44f}VK1DQf__A`_X1mM`=xO`S>9>)G{i4q zSjcxl*UTB^6qi;1_ys~toKX+?8s{0yJ4Mv`@8jZ(TB+`5 zOt^p-=kqk% zKRSW@W|@~Q;eXc0D~+u*1>U>+>@^;IPbNDRd|WS$4Cp~u@D;b+4tXi|XWGGr`57_P zch>eZ_m{zW-I=*ki`Do6dO<#94fnH#@n+`td*zSBU!6t%0RL3-0M5IkulLJV4>cbjJ~e*4HBT|Vug_Y~F`R#m>zn6tP-9U<;fL`VQRUo1rVrrXiYWiD zobs>Ya%W=Z{NnjW;{3gZUr7`(|8e}T^~YtLw;9BXkBr^XD{jVp8t>6t`G|-}+?Uwj zjLb2-PvmZ2hx%n)Z?5Z+^Jop~z5WMRNYh-6_a#ckV;}eLKVh@F5cQQ?sM|HZ@$A}G zm@nW@UrkZBt$pY#p!X$9WJGMc{#w61@;xn-xGxmr3u)|r6(7&{ll{1#`0}kyxL*KL ztf!oLZ}RXt{a1^dmqCBx=VwAZe8`DoKNUDW-aZcd2&w!_IRo|=kMl!^N*mCBaXa#7 z*-t|s93<(-x5vB1x8T2y_nz;Jn&L3~iyeo)K3M%f7mb|n{bNeMMB@JPXsDFC0{(7$ z`1=v~4c2Y&!Qb=(K3dL6zeZT-i4?PeY4ud1)kE#Q9D zNjM?>gq+p*{x>bBc84;|ze-=g_tp-y58Agy zX#)U*ecrhb9!MEfqYlOTd9k9ePQ3=cyG$5@{y{h zyErfS{usm#?}=Z4{>6s{=#lPU{NqHiUEg*I1&g!aTg3ht;H|CUM7ur;ZUFlB zraw#d*PLa31&>@;hbIGgA|(y@u$J-o zl>)AbzEQA1pXS=uE&0T73<$h))M@?t;o-TqbZYGXkiG%L!{Cj?Lwx8 z!+sfv0)EZbu8VrDmi#>F;}?GfJw)d~AFJNuQTVlZKeSFTeW6;%ew*xD+dh21El>FC zk#DB7=C^M>#OI~U>wAdTKd_5pj*-8fkRJj5V}-rn?Kr0FP2u3(NkTlv=zH?B5bKYV zy&A2SYxKk(dUE5>K*kyEiL~6U!=Ikzkvcu_KTV3=3w{nnWB%q>YxSLqo>7g7LLXq^ zU%;ESry-@`7$Kj7oHXjBAIu)N}6=fvqx)$Y$q9`fY{1WR83-u{Q*+duRT zaFppX7h?Z-0rvOH@8R|6W`1@t%9tqfJqcqJ`{CQz|DCBdsE2;kbX&@Rr?qq%@)yPe zU`{LYX_YnP)2hOsQwWxaqE)&f2z|y=>O9B!LT}tuh#+T!@bL|MF7QW{C%{iK$Zrn$ z0P|P;ic%=kOxbDyJdN}ee0_HNDB2^w4&wtB>Q?k(05r(g4{n}={Hgx}_=DMvIDZ&k z2lw?=TKV)XfPX*m<+43KTsr+J4e=CjSb)ET`+4qHN$CIf{^FvW@lnmb0CfQPg^%yV zRyY#5FW!gyD1OA}PJa5Hk@JmLc3gzjLi@)~(mg`S6H>*OVE?9KCZWEf?iX6Dg75K6 zJ^17KW!AU6%Jio2$^9Y!$USWThWxDh1HNXxS7(&|Bh@4de}wgOe)7+!cNsK<_qtqd z2>0LTx-{8ZGF3cbR?#ouSNjEBf!*o^`Jt7TdFJe$| zUa&tZ>)&hgtgOPnTj~EhmHiHl^tyfd^16N5X<~a^j`Ka(dH~~{fV|Kd)owsMJ;yiV zBkYHib`|9RWD)*msywW(B_O&8eRGQAse|l~o6BH*Y@GDIzdZEu0EM_rX}%AXP)@lh zH|oc55tDQAJ^UM#y+;HrzCWq?0A7jfP2FE4rwc^LjQs}kRjTW%M2CtGazhs0Q!q97 zLwMYOO9kssS)Pw~%{7wjCiDmYec*Qn9?0{UpTqZWhv8|+SK*#L9|Xf!3cw!4^C__X znl>1HxPL199XwZoA0M73jz8QFGF_RPKWB60opajj1n@`cv-oeozGs2n z6}{nph$Mjx`faw4DE+pzmg(mN%Xdn@?P`UBaFu>L#{AM-1O6yj-ty%~M>GEN5|8aq zaO^-nLUq5hKa4Us-DPb;vV6(&eH8pE6^s;CY>rws^It%6RUu+e#wls-WcjSPDe*qx z{Bk3}99z)|`wQW{45A6qZH+#Sc>M-vB*W|MWsY>WaRK#)&@U*DZH8_@_W$f%cKuo!}o7$RXbk^OK1A zrYcua#tvY4X`26yD|t{~xieAh2Y$T)_&?x&maLDT$0mS&3id)UWLsGC(umhk<9iy$ zcNpIh())HMyndc<2JIuknehNmGE)5yHU1kuJct({&VNP7KZTz7yqdvBl;O$X@aT!N zJnej6orfE+{uYjzq~G4w5WkCmG9vIj{*l=kcUwz+z1|K5|LOl!J1-61-&*D5pZCtE zGM_)+H;_+ZDtKcI(&)1;L_GdJ{cFHyBWxljfBhI~p#I^HGkLLkU7W*Cq>~@O(VvH!mFKde~rKub3iuhdM9c{i{Xv3-s@= zU*T95@jGw5@XFPV{5f+3=WCH}#rYoDpN^^fmu_ZkIWIkuxdZu}pT>R8Tz3=B*D;s6 zrT(oakPkbp-f!5C`Cz@R_AGjBm^!DE)AJTjW^G$`Ie=p5_2J7)}kXND4&mcbXx?dyz-B)>iawCk7 z<5({v5B@+|E*FhMi^*>Gj3;n@aQPtWPzJDd#VN9q*dY&e^2^7pN|7H=$o=k zuVrp;o;XJ1G!FQ?@~3ZxzDmb?^9mnb{C&E_{d+8*#^d_E$o~m_)CM&_g-@xyiub2l z#?hZ%rH$|x`|S@9AI9y&9^C|a@eOL*U>n{bf&NJ2FQHH2{bp27<9$5yUk-s3OOUs8 z1rG&==Zrr&f4r7og4+YXdB(5bKkH{}{(buG`9!I8_(qExiB9dr#zuJq`lk%H)-CJ;Zi5c-+63?X@y-_B_4`rJ@U@mXUQ2!N8b7~$ zt)6624anO5j>PZ0R-Sm;sA|{N`R8!q zFb@A3zj#bj{G$A8lq(pIiX89cvi{O}0Q3|pMY+ES`V)77KOvrOnEe4x2;mv~URfJ5 zGw{buccR`tzn%3bo0iLY*2tzidKEsx=GMh>o^UqO2Q0PU=ndwVg(2!D{pZiZpTJr! zBk_^-*Y*niU!H(|W%XjnQ+N-u+tc3c13vnozft(46yOWz^udRQ4SGX7d6j|v@C}B4 zw^5rdA9dm)0g9Y zsKSi@L5}UmRjnz0jcj81Ez9q9Df_YA6omhQ%1>PljM8Q=!2Xj;Ur5=9;xGa*KI42J zu~gMkXw`D)U=#jfG9TCc(!7*~sKO_Hk z(DYt?qUO)jK;JFH=)W`9U*8X^KlnSWJj35%rOhAd{(F*;|9yPxxSv2D+*)CMH?IC> zw={nFEY>r(y1t(H%9m%kXRHtO!_W`t$TxuZ8Lx-_g!SM4dpLgmC)E07uzsof`Y~yM z-|+i#O1|ZuX8pi_LUgG0aE)N2ec1OOqU`-WRzSrIc!)JbzG`ld9$0_F^T&A%`I_hF z$J;CYy(;rCqSG4f3kX#{`}o7R#U$cm;eSBQHrC%|`YCDf7sLC&;>&n52KPUY>C0)7 zI3Hq1HX#0f`*S!icI@Q*mP3dyr8x30T1Kn+W#p&KW#B)I{1dLh^~h%e`i|}s-QIT2 zuSJDBA-|0r#P`}?Od-D>=jXEfHzIzdne}VPM?Z#qm-mToJ21-qOZW#BbT7Wp-5GWs z57A!atCj;z>1#Zop+GFJ^{~8<@|1tTL=)=+0#8By06lTOrDd>x7CC=L7V>+rmT!me zGgJV+mA<&h_HiXIMd%5BPfqD~^Pp{<=Z3pTmF@@LSdOY3n)WYLb zf&Yo{K!}i!3fP~`72qpIA3L0|+Ma5@%WjgVcL~a6upWV&*bFz*!1L|tJu3ee=vN!Z z_g2OKp5>XA5v<3Qu>bVt(W7{Ok3w;6GR5n;X2|du-imef5l34~8?*%hIH{H4j}e4I zu_oUh3hW0xB<|$*+}noeX3_FKt=r{GOA)o~l0^BoFyF zi1jZr{jz+#!Kh$7Q2C~vmsU5UfA2S(j|zimJQC!AafW9?ga4y!f5ifH7$5xXPUdH? zz@H?~-%o_D5FO^hCP^-GI&$qpwfW*bft3R1XTcI~a9qtVSL2^X ziszpg)~!HsKj0OW?`oLO&-y+;M9RL;^^wG@sHecIc>j4n^G6J=;Xme|F$F)dy+Oer z1pJNbkH601w^O(9e4*p4wJ*0|z7w3!(lU^*!)5;{q_j0a9K>}t1F%@pC$ay3wTct`+=JHKF|BLmJhYk1bIHIAs=d0bC6GD2lk6GaUYq& z+wcs;j<+UY&)k1t^OA-3&98(lfY1I>Kku8fT+L7MXZX|hQMaJsKH=VW9Qol;rSJj# zPXRxXRR1RGa;aQ94?9&pU-dnHf&OONLqf*<6@1P?7xr0jIzCSUUyk_~RsIh8JtE`- z_B5BUzaQZJEy1tT&w<~1&EUV#=kR+K{9Xoq82EvG7V}LXoaW~y+t*C}r$X4wPr^|R z-;@4|5a^oihcG4j^n@}ANG8~S1(p9Yn40I!z$0eo>&$j`rcClgfdErb2} z8Q&rH|A&2G0`ghVGQG#>3Gfdz*QJ()y`QFRthWu?O-clu!atJvyX5r}Ef(&hiXS^S z0Utbw_`Uh?_H#VE8qZbs&Izmr`U9v&1^me$Ptlj6r`Dnd{j*t2 zJvTiGT>w6HzU0^*$@8I>Jl^}zD)AeTPlfZ#xCZ!7tD-0QY1}7N|7W46m9yxnLMxe` zhM1oI{Vep9K9iot{r4zzbboGoLM_KbLEoj$_qYyvp|PhxPZOMvFlV@c&!;Dw>1jLa z-K#(!L7WF;5u52l?&R}CXvnwfZD9IT^AEDW3o$+U<6Cf@!+o%xPZIht&?Bm9@PVGN zJ`@;l%h^rnZ-$=8$O1@irjf#*{EcSGS^VWF^lj>UX9oW`-^s^6#4GT>Y5HPtND%Z3 zI6n>`e^~>4*(yJ6OB(tQMPCJ`KW7K;hsrcRIeWfEwV%}aBiR1e>1yks&odm*7vLWt z&qcmNo9Wl#{J5=-#`3TRdIC70uc_(&&zg@mLIU~06#XjrA&+JrOjtO(4hAZBf?ulf zQB}jI=CHoc(XbxwD8mnV4F2tbjqmm6Q1`F)`gx4~I)?rbs;2aX*q>^=Mto;%#h*F< zgc>iQ6S%c*!T!D-`R6=-e>RlSSIdObXWF=LjIKYR&UeG-CnVPF>%s#MH%a_Ag=mshYpPUPTS^Qtp4!_BG&fR8{|XXE(_<31!pPl3;=92PK6d z3ls=gVOlB%D6(Q--k^v(wQAA6vXv?+6qwQiQFwKgszFh<&|-lCvjL$MkfopmMcDG8 z0gDV!CHC!$TP%=%|9`)GXLfgXCrSN3&%1q+X7-$W?z!ilbMCq4e$1KhU!o55Tg1Mm z?_oCw?X3g)GTivm^F_(O@Wz)e#2?t>34f4af91MQ2)!lSYoQOVi6VLj>X-77^<%$8 zvoorh{K)Y})}NE{P3kG|ldIK{KUf<|a6b?Clk|~)*+0k+qkSw7{%}8~t|4Al@(1hS z03QU+i~RlB!Tk$5?+*vq?O)|ju|9zL?(%xX-%_6vTwjvoqtaiC`mEzFYv;i9SK5zN z>)o$uhzV?ecS`Oz!FXZt{%FyK=SqDm*Pr%FqGzBO1k=Dg>T!9{d$Bq3=HCYCE^=Kn}D}O zul$Ck#%GaWdBkTd-|v<$r*C}#_~76fnD2~T>Xn!L;TPl|2fShZ&dac0YV2kY9@kQ? zzZZq~k^heKezOGUPX^C>L0@pbNbUcx5jd}g`!r#n+KM(|MQ}e2_LpP)Ekssh*-r9X ztk2^7Sna38chry0zeAsJzYUHTMfAfLVO13Vra*dm1d0EW`X5SOi-Rrso!!Dnp84K5 zOT&H{#JBAWyQXC}y)E8pSs>bT(mz_YU7#P*Ct|#l{0Q;~emXFJ!~Xnge!3CAV80dW z13RuhHWbpQ*XZ&&b9td~0phpQ+-H1QJnz%W{!Rw09}ubh6V(sH`K+X7rSK9~f%7@7 zA&veLrVTxj=dlcd{o$6_cq68d;ikc#qP3+OH8Y;BVqb!e7wer@|dy!2N#l zkb(G#=dB#fr^@3Y$-RptveDMYDKG z3}Wl3!26J5Lbp;$*`C3O^sf`Gf@o#@g`+pmOm${PzIR?Gg7r6?H-)|E5#*036dmI| z&cEg4epbwV-x3z$rBzwRqk6|%!YPdxX@UK5I4^?yOF|f#_?;H(BOhXl1yb;b$fl2t ziPK^2^M#lQLKXWrwm{!yeGcReeNVx^^1R?L!*is63iEy{?ZO+@haSUxQ#Aht@h0l) zjIqAS5}*6S5D%OQ{=yyD4~f}#tOxsFR>mjcKHFwzEa|61Q&7L?e+}jF%ce{`pS|7yqibLdO1TVOsP)h=}XLwJyl zwwFL(3n3lxAaZeK`Xa*pw8zBN9eCg2t~B1~vSZ@e7U<*t>*OrN4`T3Z@WC5@k$>itK_+xMezENTt#Z6$ ze~(4~iN1c+udDb2?N|EHO?wkzz-7Lvr0_F8d8-9X5+CES)X zARcsf-YkrxK4_`2THv4QPrHQT7xADs-w0gq4H=wYsQ!@gMibYsNjfI_7s&D1(^pv^ z`tQQ;vi!|E-bkNb*9M(Cd;y=24^sSJ951)7TTG5RNdbXWcu4RNULAE>{zM*1V( zXFG5$zH&zlHoQ6x}FVzrMe7a>f11R7J!S6N~)dx%`9kpWx39Sq998 zq~wyeqeoGL{hx}bimy|lf(H~@Z0f#yx*1j9-}-0 z?~Pq71n+~?AKWCYQoNzYcjOyS5bzfZCrP=w{=P6}Db6b{;CLo#(B9EXsW8J)T#T<*&z3Ck0IrUd{Fa-em1X{=nG1LNh=g@>*My6yrqXPcFT3{tN#C zJuHV`800U-1)qj_?HG zeTW9o-mm!E^BCbdMIZ7Nb6)hr*AZ?LK8XAo-dC|SfPa>6knK%0B6;7_U)({J{lK(~jkbmFJIz^FGSsJQ4Z- z#^|#C#QUt4fxe}E*n#{c`rBD~rJw%XWuTvu@K7h-mpWr-b-qAk0LRrGfJ5}Km$ff` z;Jd%m1{|Rk*1O{k%ujY#!1eHl9aWzMN04+~vPNVKe2O0UYw0?a3>T=LUoCb8#9nu6`gMySn>SCC|bh^e^r& z0>7BQ&Jx}4HJ6{K5`;tl(7(={3VXZl8t@a_3wRIqRztr(?cNt8_1_3TbRGCfMbMr^ zsFnJ0Pji`mz`qfm1iS(7Yx4MgIs58oTf}vV@5U8>vitz77xcgFw~raiQNB0jfAw-N3T-pTP!yxi8fXnsBX19>%$1@BRqhuYJPR4~p4{H}*UsuE_0t74rqj z4}QVE^eNT#X?ExvkjJ<`;k@SB2M_bx@SP`;<#B&f67*$zQ=}*F6VAN3I5G=gQvM4%)cOEC$|(W-Lw=Z_hD-Z< zOXF|yROnM0`9ha|ZVsNiOV53uL%fVyLinM)W9J3X%#{?M}V#t28&Lf=xKM*pQl z$cO3|(BDPVzV$p22ORz!_YsT8%gtrwMR?0EQQjatN&1EP->KejFH)bc=11$~{wgQj zgZIxyJ1_FZ8>ug$|D)Q)u#a#W5jD@>`Pw%h^+|Xk5^?*h9B!k0y}XA^+)=0^hYj)_mwO8XZYNQ^0>xVzBwC8vcKQ-AZ`s0#5NP0au9}yD^ z|5$Zj1@xs0^`$W%i8%|Ob;nC3ukgahATPojY~);2d#rgJueuUPOV%`z+`gXU*IbNW zna(*7VS7H494)Al#&nbA<_x<*+F9X~W^l!4fgJ*30pT+g$ZP?G@%}4-0e41S{qEEZ{_u^T&iBAi=inh{OfEFFx%#a1MdDjW?Akx71xYQ>Kij~^ zMmdhxvi%u6*Jr|rhvakS%nvu8Ti$D_-jKY1SHbz_fc&7H9y^+|s53yh=*Plpj-I&=F%m*Y!s zJ`n`B&v?%lRLILAJRPP# zjPxC(#=~-XI6p*t2Kc_Q6nf-xYxGv$hrs@I<@Iy$mkE3OS#e_XxWtkc6YFUTo(H_8 zCwz@(Z~0$fJe1G6)~yS@|D})k=p}FeumkI5u;dittagBkNG>%{;t6zu-|#? zi~xO!-2?jaJdA_n{9pIrWZL^|x4kF{eXz6h zp}$DE`TU>#1nNr<9*Olk95Pk%Q~E3MU3+(m`fC9npugdK`j4I`o9FrSNP|0`KAG{Neq6(^?$iL=>O8uai0Gp zzYV#ai`YKLCyzoO{hwW7&l%#c9Xy8iKi4M@iErI5?RjBQ9^@bQ!KOTU$o5)tKFR)a z!b|+}V0$XZE6m?M=atXA54fDq7WT9KX*}0=$@qfw^qMYz{5p84e|*M@8RH-1gLG}K zm~|%Si?7B)Q$2f6)dD_H^f$@3{;~PIa(Du8#4GSm@uQcXHci6I<*frAz<<%d6rus} zoc2w3ycf9!)Q|mV@E3;&WkfA{`Ts(uC6$zKol->LY(I{B8@&sFsmuFStXMMS%5 z{QeI3mGZ@Y`73dsQ=}bfy2|*Wf2F_wjU!NBlK7dqad&*YC{$~C{htK9l0M$oTb%FZ z+XitzPYCnV+#R-cM64TP`$VGWf|5ZfKIo#Nqz_037}W`5^_Ty@aH^ ztq9gjlZcXh<6krGizugWqdd-U6z3m8IaQ0e3*ZJ}KKj|Ad2- ze9HMtqrBG1_B*Sdg+8`_;ZR@uC0xok72*D)o;d;Vq?U&Kk>TqQee zu0BR4LZ3;$LCQb3;+TtOOMPt-vwChgRq3O}_6=gCQrWLa&47ONi~00l+#knh+sv9SF#U__!SE#EgW`wO?~45C^hw}Xd;;)x+1?3> zj^&lSS9MZiuV)vV22k`=y9)C*^f7{`{V}F`kNW zJyy)FwhxT2(9hh=+Oy_}!R@~H1B>J*tMS!*L@&-qnsklh^UB#6e+uUVzk4Un1L~1E ztWO|++Z~-J#w8+8OD9p0k0m~k%IC|-w=JanUh(_ymrsE`CNB%XZx7!Pi&-;{I#`Y0 z<@%{#0sV}J?-%LVSvAIaMq@l&Hhy3Y{VcydS;TJ*{|@?bL+rA`_IcC?O0XlU$m=vzE|ou_Z{>-^6ap6hkO^}pUy)Yp=J*?>2+V=G`R zdChGX86XOIwf^iXkA4AgtvQVKEq#78G%GWq`BC3|D31E;V}R!ueQ;9%{S@Gk2g;}Z z{-f|TYuhOgc9+X5t>BQSQA>MV@aaQ+`D|ka~F1y_8GhLY3NI|r`b3ENZx|>q;1Rx z@Dg-4-YMrdp9XwTOoF`ktcxsi#&-DgRRzNJFyePH<%t0QFX64b|A6^i(@HnrQBI%m z2DP8C$=gqetvK*^YCgdF8~O)v9yQmr&=-#tCSDGENc;fs{NPE5*Tye!;ZPIkyM$+6 zVEithmArJ|*AH-gSUx8=@ASv(gty4`RfR9`+!WjWTjYy4zsHxbHz)cu?5(ytq~pB&_$Elc~Nc`yTrx@?9aOLN=Pv#q*VEgd? z7{kraP+n*s)_*`$6GmnGa)4t$wKiJ=`mWR?`@hat|qr8%5t|(8{ehJUW_DlJx`U;@e zB=w=QH_P^Y7x|dRrQ%Cq!mkgxm4h9j*6_`k|AgB@vyu=C&eQCNJt%$?KLY(&81Zod zMvr`NEbOz-9N>r-nQz?uSb%+5KLNZji1V7U@m&G-n?ZRsUrLPk@-eV4&W}EJ<3Fbg z377JS7xP)*4Eh-RMJw|M__N%8j30xZly4^Hw>ODzogwGTdQl%^z{h^qV!lhTe1Y>- z+5XJ7QE!~<`m32M|2aiSxU?UAyqAx|L>~4N6Iieiq*pKPM~wI8>*f3v*xu&d&(L0O zcI^cpGy6Mzlzmj ze`7A%>emk)aLk7&U*30tLSB9}H0M0fPqDm&8!RuP4(`_g7Gq@aFLH!uq89l5hx z{QC_I(wA_t+KcbqcxmBzh!-+|k1dGX@OsV0^YLum27Pbd{we5p5AI)g&cu1`mj2jT zF}1!da)4KkPxaEj<%|BUoWIm+)Gx<})Od^!xi>2Oc>-|cPvFne(Jg2npH=_cF|Yqs zeYs7{4~R8@%l^)k`dbg9za%{K#Grq?$dexPO~@y;`o^C)^J|KpdjCd~_x=saHY6n6 z$T0ure087a4@pnGk0ZnUW%Bll_SkGs`|cNz&%0q|$Y3w&Et%-^jNaK_8S<0HlhTje z4h=hgn6Ba`%!b+ zK&PlLbhb6=u@A%~!%A0-N4a01fAiwUc>nB)CyH6dSLf58T{B(iia){;zyH+D|2VfG z-Y>7uBD`nkS81Qm1^6pFgZ9b%j!|5X0ArBA=h0FO%1CI3`Z@z*ZnI8Rgk-p+bXa76#3Vy7+fiL5gWHDY* z{78J2Pi!u&rzC(6`||43XZ^s>j{!K=TfBHh=%g>(o2cMNteOjc*#G72DHQoJD)^E3 z))%FGW*6m?BR}aPKbf{=etvB7(_P{xO?)-p7RQ6~`i*VP*n1*})4YP(>+_+UI9+YWy*<*NbXoxaYKZ=u*8)gQ6!(t!R*5?}I{Y^oTqh;Qwe z?JxC59Qf!DPu|v?iuD=RkN)t+FCmEE9)`ZB8gC0#kN-)uPcy=>mn0&zS;n4E?JqyS zCvrtN*K?}jdGasg=hS#Fe#ZFydyL;F-;VLyx)1fs@h&;u^LOR)PXMm;u~J_8vy_)n zp)V=oOL?U$t7Iljyu`a7x;8dZ2<@!x>T$``|tm%^wPkynYz69~*dQdv%tp~Abm=B%3$%<)b?c`rLPFNBUq<@&A;tMe;UUOJu186FB(2vQ(Zj{KRP79*i%Vy3KCfJ! zHt-wddRl(0x1Ofjr^*wK^|>3o_$-1Ae`+dlTpL8JE9u`5AyWCAQ;!_2ga5 zZ{VZXcQnn7jY~#WyYX*1e&S)^1Id@4>g4%n=i;k{nXHlbW0mwh^-eWD@@v>%V!w&~ zJ2||6#y3Ap4^-o0{_E{W5s9q<@bwzz!%}`Cxr_3A?-Ar5j$G)rcWnHd4_NC%Gp-_gOihb4fVLpG3 zh#_}}^90E4mcK7VL~ z+L*YrL+jAyVZ7ZK$NdL`=kN24ry0O;AHz4?_!C*60Q$U7GM3x*U;sav$<_D`(d}o# z-%VQK+Vj}1htIJF!&`1a|0j>C#z(#*gZv`+zg$ck3|OUyriHz&ZJ ztQo*Bh&wQUJZeAUr4*klv#f%;kpPV(1xMgYFdM;p%u?g#(Rofyv;|CQhu z{o|_Q{3Q-}W&LWuWqwy!>u@%F({F#VPV`rT_hIBPT6N^U^O^GZLkU4R)_1wSaS_go zi3FbO*E(E}pBXfMS;X%QAwF~d%=j^d=Y}K%r|i{u&wTy7mIdd`&Z+$qB1iZj*N>&W zNVwvE(xn?PUZq)|T%X8ISQ6l$9M)GMZ_VL;-OSzKH`n(`&F638^Q!Ud2g1)mU-y4_ z?OCAYw~y{S{QEncg^<@k_<7(1cb2p7pZ<8UvjRW)jq3Uunze+h|3>?srJscdzG<|s zw`!I!>X?6$?ZGefNahOE*Q#NEE@rB*r`ER9eB+S?cxC(RMF{Vch((q&A0f)m^MYPC z@!!P$H8ERguK(|!Xf(tBZ*$N0l-I9+7x?ivvHvSp!WR>9KGR0h1o2FTye#5N{>%2G z+aa_!`Oq3+=FSTF{hReu_=8Lc`;%0A<3E@Bjr$(tvvDc*8Yp_{DV(1efLGFQifOQ~ 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 literal 0 HcmV?d00001 diff --git a/changes.txt b/changes.txt new file mode 100644 index 0000000..1bd32de --- /dev/null +++ b/changes.txt @@ -0,0 +1,861 @@ +Changes for 1.70: + +Enhancement Request: +- SCGCQ00440706 LSIUTIL Utility modification for New Gen3 Product name labels and fixing for incorrect Gen3 SAS uEFI version reporting. +- SCGCQ00438328 lsiutil - add support for inband expander CLI +- SCGCQ00468538 NetApp functionality to limit LUN Scan +- SCGCQ00467946 LSIUTIL on SPARC support + +Defects : +- SCGCQ00425049 LSIUTIL: EFI BIOS Erase Hang +- SCGCQ00438322 lsiutil 1.69 does not report the correct Device ID information for Gen 3 adapters + +----------------------------------------------------------------------------- + +Changes for 1.69: + +- Added Support for SAS3 Linux Drivers +- Fixed bug were OS names for drives > sdz were not displayed (on Linux) + +----------------------------------------------------------------------------- + +Changes for 1.68: + +- Fix in option 16 output. Added device type decode of STP target and added + fix to make sure undecoded device types will print nothing in the 'type' + field rather than the value from the last successfully decoded device. +- Added support for creating raid volumes on drives greater than 2TB + Modified method docreatevolume2() +- Added support for creating raid volumes with 4k drives on MPI2 and MPI2.5 + controllers. StripSize will be set to zero to let firmware calculate it. +- Modified source file copyright information + +----------------------------------------------------------------------------- + +Changes for 1.67: + +- Updated to MPI2 2.00.XX header files (MPI2.5 rev B). Includes support + for identifying SAS3XXXX devices. MPI2.5 support for DOS and EFI are not + supported at this time. +- Added option 25 for Power Management settings to contain the MPI control + message, get IOUnitPage7, and get/set SasIoUnitPage8. +- Added sub-option 60 (change RAID rate) to the RAID actions menu (option 21) +- Added option 71 to decode Flags and DeviceInfo for SASDevicePage0 + for each device attached to the adapter. +- Modified the Alta programming/display algorithm (Option 58, sub-option 1 & 2) + to allow for 16 character serial number and part numbers (per the spec). + Also added the global flag option to prompt for errors created by a + non-existent SAS Address in the parameter file. (use lsiutil -g to turn it on). +- Fixed SAS Address programming in option 44 to program a sequential address + for each PHY (as opposed to only programming PHY[0]). +- Add support for the LSI SAS3 expander in the following areas: + - Support for resetting the expander (main menu option 20 (diagnostic menu) + -> option 98 (Reset Expander)) + - Support for firmware image signature checking to help validate a firmware + download image matches the correct expander type (main menu option 20 + (diagnostic menu) -> option 20 (Expander firmware download)) + - Support for the SAS3 expander when specifying 'all' as the expander to + update in the expander firmware download option (allows update of all + expanders (of the same type) in a domain at once). + - Support when doing a manufacturing image update via the expander firmware + download option or when using the option to modify expander mfg image + fields (main menu option 20 (diagnostic menu) -> option 27 (Change + SAS2/SAS3 Expander Manufacturing Data Fields)). +- Added WarpDrive recognition +- Added support for new Windows XP driver name. +- Added option 72 to store SC information (MPI2.0-only) + +----------------------------------------------------------------------------- + +Changes for 1.66: + +- Updated to MPI2 2.00.18 header files (MPI2 rev Q). Includes support in + option 67 and 100 for newly refined config pages as well as device ID + recognition updates. +- Added the ability to decode the raw timestamps in option 35 (display HBA + firmware logs) into a readable format. The default behavior is unchanged + from previous releases. Invoke lsiutil with the '-g' flag to enable a + prompt in option 35 for doing the decoding. +- Modified command line argument checking to return appropriate error codes + (EINVAL, ENODEV) for incorrect parameters rather than success. +- Modified doIndentify() for SAS to upload the firmware from the backup region + rather than active. This allows for image verification after firmware + download without first resetting adapter. +- For read/write tests replaced the NCR pattern with a random one. +- added some improvements to SCSI error handling, especially check conditions + to be more generic and catch more errors. +- Updated option 20, sub-option 16 (Issue product-specific SAS IO Unit Control) + to work with SAS GEN2 HBAS. +- For DOS/EFI, fixed the startup error message seen with recent SAS GEN2 HBA + HBA firmware (mpt_receive_data failed, IOCStatus = 0020 (Invalid Action)) +- Improved HBA detection under EFI for some platforms without PCI dual + address cycle support. +- For option 65 (SAS UART Debug Console), changed the default buffer size to + 1MB (on Windows default is now calculated based on the MaxSGList driver + registry parameter). The user is no longer prompted for a buffer size to + allocate by default. To enable the prompt for buffer size invoke lsiutil + with the '-g' flag. +- fixed an issue with displaying hidden RAID devices (in option 8 output) + for inactive volumes +- In option 43 (Diagnostic Buffer actions), updated the ProductSpecific + parameters (debug masks) in the Register option to support 64-bit values + for MPI2. +- In option 21, sub-option 1 (Show Volumes in the RAID actions menu) fixed + interpretation of data scrub to properly indicate whether it is allowed + rather than to mean that it is "in progress". +- Under Linux resolved the warnings to the system log indicating lsiutil + 'tainting' the system due to mmap() slowpath on kernels 2.6.27 and later. +- Fixed an issue with a SAS2308 HBA being reported as a SAS2208. +- For option 20, sub-option 30 (Inject media error in the Diagnostics menu), + improved the error handling and added support for sending WRITE LONG(10) + with WR_UNCOR set which will get translated to ATA WRITE UNCORRECTABLE EXT + for SATA drives. +- Removed menu item 6 (Download SEEPROM) and menu item 7 (Upload SEEPROM) for + SAS products since they were not applicable. + +----------------------------------------------------------------------------- + +Changes for 1.65: + +- For SAS2 HBAs, add support for target IDs greater than 255. Also optimized + option 8 (scan for devices) under Linux and Windows to only scan for devices + in the range of targets the firmware indicates exists based on devhandles. +- Added a -8 command line argument to limit the number of LUNs scanned to 8 + instead of the default of 256. +- Fixed option 42 (Display OS device names) for both Linux and Solaris for + SAS2 HBAs. +- Fixed option 42 (Display OS device names) under Linux when using kernels + 2.6.31 and later. +- Fixed option 42 (Display OS device names) for IR RAID Volumes under Linux. +- Fixed a display bug in the output of 'Show physical disks' (RAID Action menu + item 2). The devhandles for the disk paths should now be output correctly. +- Increased the chip reset delay under DOS and EFI to 50ms (up from 20ms). +- Changed the DOS/EFI driver to correctly use the default descriptor rather + than SCSI IO descriptor for RAID passthrough requests. +- Fixed the NVDATA "wrong board" warning for SAS2 HBAs when downloading + firmware. + +----------------------------------------------------------------------------- + +Changes for 1.64: + +- Updated to MPI2 2.00.13 header files. Includes support in option 67 and + 100 to print the newly defined config pages. Also includes the 2208 + device ID recognition. +- Updated to MPI1 01.05.20 header files. Minor changes only, this has no + functional impact. +- Added a new expert main menu option 65 ("SAS UART Debug Console") which is + available for SAS2 HBAs. Running this option prompts the user for how + large a buffer to reserve for command responses as well as whether they + would like to log the output to a file. After this, the user is given a + '%' prompt to enter commands, mimic'ing the UART console. The user can + type 'exit' to return to the normal lsiutil menu. + Standard '-a' scripting of this console feature is available as well. For + example, the following command line will start lsiutil using the second + HBA port found, start the UART console, and execute the "iop show diag" + and "exit" commands before quitting: + # lsiutil -p 2 -a 65,,,"iop show diag","exit",0 +- Added a few improvements for working with LSI SAS2 expanders (Bobcat): + o Recognize the buffer IDs for bobcat firmware images and manufacturing + data so a warning is no longer printed when updating. + o Enhanced the expander firmware download (diagnostic menu option 20) to + distinguish between LSI SAS1 and SAS2 expanders if the 'all' option + is used to update all expanders in the domain and there is a mix of SAS1 + and SAS2 expanders. In this case, the user is given the option of which + type of expander to perform the update on. NOTE: that there is no + support to differentiate between different platforms within the SAS1 or + SAS2 space. So, for example, if there is a mix of SAS1 expanders that + require different firmware images, the 'all' option will provide no + protection against putting the same firmware image in all the expanders. + o When using expander firmware download (diagnostic menu option 20) to + update the manufacturing image for an LSI SAS2 expander, lsiutil will + fetch the current SAS address, Enclosure Logical ID, and Ethernet MAC + Address from the expander as well as from the image file provided by the + user and then for each field, prompt the user on whether they would like + to use the value in the supplied manufacturing image (the default), + preserve the existing value already in the expander, or override the value + on the spot. + o Added a new expert level menu option 27 under the diagnostic menu + (option 20 from the main menu) called "Change SAS2 Expander Manufacturing + Data Fields". This option will retrieve the current manufacturing data + from the selected LSI SAS2 expander and then display to the user the + current SAS Address, Enclosure Logical ID, and Ethernet MAC Address and + allow the user to enter new values for any of these fields. The new + values are then written back to the expander, to take effect after the + expander is reset. +- updated the chip recognition for all current LSI MPT chips/revisions. +- Fixed event reporting (option 43) for SAS1 HBAs under SPARC Solaris. +- updated the vi settings to reflect use of spaces rather than tabs. +- minor change to the max target calcuation to make it more accurate. +- For option 17 (show expander route tables) added a check for whether + PHY_VACANT was returned and if so print a 'V' instead of a routing + attribute since the actual routing attribute is not available. +- For option 67/100 (Dump all port state) added a check for config pages + returning more than 255 DWORDs. For such config pages, truncate the output + and print a message indicating that the output was truncated. +- miscellaneous formatting and minor display bug fixes +- changed the DOS/EFI MPT driver to register as a BIOS rather than HOST + driver for SAS2 HBAs. This causes the HBA firmware to handle device + registration and events without help from the driver. This change allows + for things like RAID volume re-sync to restart after a drive hotplug. + +----------------------------------------------------------------------------- + +Changes for 1.63: + +- All tabs in the source code have been changed to spaces. For this release + only, *_tabified.c variants of the source code are provided which include + all of the changes since 1.62 except for the tab->space conversion. +- Moved the Solaris binaries to a single directory. lsiutil.sparc is the + SPARC binary and lsiutil.i386 is the X86 binary. +- updated MPI headers to 2.00.11. +- Added support for the magic number change in the SAS gen2 Linux driver. + This means that version mpt2sas-01.255.01.00 or later is required to + work with this release of lsiutil. +- Fixed display current events (option 40) for gen2 SAS HBAs. +- Added new menu option 58 (SAS only) for Alta diagnostics. +- Added support for the lsi_gen2 Windows XP driver. +- Added support for the mpt_sas Solaris gen2 SAS driver. +- Added support in the expander firmware download option to accept 'all' as + a valid value when prompted for the expander to operate on. This will + cause the image to be sent and verified for all expanders in the list. +- Added support in the expander firmware download option to poll for interim + completion statuses when download microcode used as well as include + the additional status if the update fails. +- Added two new expert mode options to the diagnostics menu, + 'Display expander log entries' (option 25), and 'Clear (erase) expander + log entries' (option 26). Currently only gen1 (Yeti) expanders are supported. +- For all SMP requests, now setting 'Allocated Response Length' to 0xFF. +- Added support for the 'Show Volumes' and 'Get Volume State' options for SAS + gen2 IR to display inactive volume reason. +- Fixed a bug when printing Incompatible and Offline Reasons for gen2 SAS IR + phys disks. +- Made changes to routines that use RaidConfigPage0. Fixes segmentation fault + when activating a foreign volume with gen2 SAS HBAs. +- Added a retry mechanism when config page requests return MPI_IOCSTATUS_BUSY. +- Fixed a bug in displaying log entries (option 35) in which one DWORD was + not being displayed. +- In diagnostic menu option 2 (WriteBuffer/ReadBuffer/Compare Test) added + support for all the same patterns that the Write/Read/Compare test (option 4) + supports and added expected/actual printing when miscompares found. +- Fix handling of devices with T10 DIF (EEDP) enabled. +- In doIdentify, don't use the "actual image length" returned by the SCSI + firmware since it is not trustworthy. +- In doDisplayLoggedInDevices, if the port device is not returned when reading + device pages, use the port page to provide the missing information. +- When displaying OS device names under Linux, add use of O_NONBLOCK to the + opens() to avoids hanging in some situations. +- For option 56 (Read/write expander memory), added support for the x12 + expander via support for the ring format LSI SMP. +----------------------------------------------------------------------------- + +Changes for 1.62: + +- Updated to use MPI2 header files 2.0.0.10. This means the minimum + requirements for using this version of lsiutil with gen2 SAS HBAs is + firmware version 00.250.16.00, Windows driver 2.00.00.17 and Linux driver + 00.255.05.00. +- Added support for diagnostic trace buffers (option 43) for gen2 SAS HBAs. +- Fixed a bug with displaying log entries (option 35) for gen2 SAS HBAs. +- Added three new RAID actions (option 21) for gen2 HBAs. Volume consistency + check, Stop volume consistency check, and Online Capacity Expansion. These + are RAID Action menu options 34, 35, and 36 respectively. +- Added support for in-band resetting of bobcat (gen2 SAS) expanders (menu + option 20, sub-option 98). +- For gen2 IR changed coerced size to come from firmware. +- For gen2 changed port->maxTargets to be based on MaxDevhandle+MaxVolumes + rather than MaxTargets. +- Fixed a bug with processing VPD files under EFI. The sscanf() routine in + helper.c was missing support for %c. + +----------------------------------------------------------------------------- + +Changes for 1.61: + +- Update the data structures for bus/target to devhandle mapping to use 32-bit + target and bus IDs. This affects SAS gen2 driver interaction. This release + requires at least version 2.0.0.16 of the LSI_SAS2 Windows driver and version + 00.00.02.19 of the Linux mpt2sas driver. +- Increase timeout for task management requests from 30 to 60 seconds +- Fix a bug that could lead to attempting to double close the log file and + cause a call to free() to fail. +- Fix option 18 for SAS gen2 HBAS (changing the wwn). +- Fix link speed detection for SAS gen2. +- Fixed bug for SAS gen2 that could cause lsiutil to send requests with a + devhandle of 0xffff. + +----------------------------------------------------------------------------- + +Changes for 1.60: + +- fix bug in doDeleteVolume2 for setting the volume dev handle in the RAID + action request. +- Add option to use default settings on volume creation. +- Changed default stripe size to 128K +- fixed a build error that occurred if REGISTER_ACCESS was set to 0 at + compile time. + +----------------------------------------------------------------------------- + +Changes for 1.59: + +- Add code that determines BIOS/FCode compatibility for first MPI 2.0 chips. +- Add "Dump PCI config space". +- Modify code that allows changing SAS persistent entries, to handle changing + a set of mappings from one EnclosureId to another EnclosureId. +- Enhance display of expander routing tables to accommodate the SAS 2.0 + committee changing the opcode for REPORT EXPANDER ROUTE TABLE LIST from + 17h to 22h. +- After displaying diagnostic pages, don't ask about making changes except for + page numbers that are known to be writable. +- Make modifications to the RAID volume creation code to take drive minimums + from config pages, rather than hard-coding them. Also, allow selecting a + stripe size for any volume type except for mirrored (RAID1) volumes. +- Add ability to send QUERY TASK and ABORT TASK to the "Reset target" routine; + this is not the ideal place to put them, but it's the best of the current + alternatives. No allowance is made for specifying the identity of the task + to be queried or aborted; the intent is that these will be used merely to + verify that such requests can be issued (not that they'll be successful). +- Add some missing config pages to "Dump all port state". +- After resetting the chip (DOS/EFI), wait 20 milliseconds before making any + chip accesses, per the MPT specification. + +----------------------------------------------------------------------------- + +Changes for 1.58: + +- Add option 66, "Show SAS discovery errors". +- Fix bug introduced in 1.57 that broke option 13 for SAS. +- Fix bug introduced in 1.56 that made diagnostic buffer actions appear to + fail for Windows, when in fact they had actually succeeded. +- Fix options 8, 13, 16, 18, 33, 35, 44, 68, 80, and 81, to accommodate + differences between MPI 1.x and MPI 2.0 (the new link speed of 6.0 Gbps + being the most prominent one). +- Modify expander firmware download to allow boot records (BufferID 10) to + be headerless. If a header is needed (mode 2), but is not present, add it. + If a header is not needed (mode 6), but is present, remove it. Also fix + verification code to be more robust. +- Fix MPI 2.0 bug that caused duplicate devices to be shown on Windows during + a device scan. + +----------------------------------------------------------------------------- + +Changes for 1.57: + +- Implement RAID actions for MPI 2.0, and implement "Delete hot spare". +- Add Linux support for MPI 2.0. +- Modify NVDATA concatenation code for latest MPI 2.0 firmware changes. +- When downloading expander firmware, if mode is 2, use Write Buffer, but if + mode is 6 or 7, use SES Download Microcode. Before downloading, verify the + image for Buffer IDs 0, 2, and 10. +- For SAS, add "Force full discovery". +- Add "Identify FLASH device". +- Fix more endian problems, by adding code that allows the compiler to detect + them automatically. +- Skip verification after firmware download when the special bridge firmware + (1.18.99) is being used. +- Fix the multi-path detection code (used when creating volumes), which was + reading enclosure pages incorrectly. +- Fix the code that handles metadata size, to use ManufacturingPage4 instead + of IOCPage6 (the former can be modified, while the latter cannot). +- After reading diagnostic pages, allow the data to be modified and the page + written back. + +----------------------------------------------------------------------------- + +Changes for 1.56: + +- Implement -k flag to suppress the "select a device" mechanism for many + diagnostic functions, and instead allow directly entering bus and target + numbers. +- Fix the -h (help) display, which got broken when paging was implemented. +- Add some routines to help debug expanders (read/write expander memory, + read/write expander ISTWI devices, expander firmware download, expander + reset). +- Implement all of the diagnostic buffer actions for Solaris (a new driver is + required). Also, when any diagnostic buffer action fails, display detailed + information if it's available. +- Don't try to verify a firmware download for SAS if only a bootloader image + is active; the required "firmware upload" support is not implemented. +- Fix endian issues in various places. +- Fix the code that was trying to detect multi-pathed disks when creating RAID + volumes; it was not correctly determining whether two enclosures were in fact + the same enclosure. +- In the "Log Sense" and "Diagnostic Page" tests, make the buffer larger, and + check for the device returning more data than requested. +- When working with RAID physical disks, consistently use the physical disk + count that is in IOCPage3, vs. the one in IOCPage2. +- Add path information to the display of RAID physical disks, whenever there + is more than one path. +- Enhance "Scan for devices" to also show (hidden) RAID physical disks. +- Fix the Solaris code that determines device names, to handle SCSI Enclosure + Services (SES) devices, and to handle SAS disks with long GUID-based names. +- For "Send SMP request", if the handle entered is 0, prompt for SAS WWID and + physical port to be entered manually. +- Fix bug in "Send SCSI CDB" that caused loss of detailed failure information + (including SCSI status and, if there was a Check Condition, any sense data). +- More MPI 2.0 work: add a real list of supported devices, fix the expander + routing table display code, fix the SATA Clear Affiliation code, fix SCSI I/O + reply handling to correctly obtain sense data. +- Fix a bug in the EFI implementation of scanf(): %n did not work correctly. + +----------------------------------------------------------------------------- + +Changes for 1.55: + +- Extend paged output in menus to cover all output in all circumstances. +- Make the maximum number of devices shown in menus compile-time configurable, + with the default remaining at 99. +- Add the ability to turn off MPT register access at compile time, since this + causes crashes on some Linux standalone platforms. +- Accommodate more differences between MPI 1.5 and MPI 2.0 (in SCSI I/O replies + and event handling). Also, for MPI 2.0, use the BTDH IOCTL to get the driver + mapping between bus/target and device handle. +- When the -g flag is used, ask if the fwdiagtool header should be added when + doing diagnostic buffer reads. +- Have options 15, 17, and 20 automatically bring the port online under DOS and + EFI. +- Expand the PCI information printed to include the segment number. +- Add verification after firmware downloads (read the image back, and compare + with what was written). +- When creating RAID volumes, correctly enforce rules about mixing SAS and + SATA drives, and SSD and non-SSD drives. Also, use the metadata size that + is specified in IOC Page 6. +- Fix code that implements setting the volume name (string length check was + wrong, and volume addressing was wrong). +- When deleting a the last volume, delete any hot spares that remain; otherwise + those physical disks are left stranded. +- For Solaris, use an IOCTL to get the driver name and version. Use that same + IOCTL to get PCI information; only if that fails should the "reg" property be + used to get PCI information. +- When dumping config pages, dump SAS Expander Page 1 correctly (there is one + page per expander phy), and fix its name (it was called "SASDevicePage1"!). +- Implement the new changes for MPI 2.0 NVDATA concatenation. Add IOC Page 8, + BIOS Page 4, and Driver Mapping Page 0. +- Add MPI 2.0 support to the DOS/EFI driver. +- Add "Read Buffer (for firmware upload)" to allow reading back device or + expander firmware and saving into a file. + +----------------------------------------------------------------------------- + +Changes for 1.54: + +- Fix concatenation bug that caused invalid SAS firmware files to be generated +- Catch error if no file name is entered for option 15, suboption 8 +- Add ability to issue product-specific SAS IO Unit Control and Diag Data + Upload requests +- When modifying SAS IO Unit settings, if "all phys" is selected, the default + should be to preserve existing settings per phy, rather than overwrite with + new settings +- Handle self-configuring expanders when displaying expander route tables +- When setting a volume name, use the new RAID action +- Change the display of PCI location information to include the segment number +- Allow SMP requests and responses to be up to 1024 bytes (per the SAS spec) +- Fix problem where the maximum target allowed is less than expected, so some + targets can be missed in a scan +- Add preliminary parsing of MPI 2.0 NVDATA + +----------------------------------------------------------------------------- + +Changes for 1.53: + +- Add initial support for MPI 2.0 +- Add -q switch, to query files for version information +- Add -g switch, to guarantee asking of questions that otherwise would be + suppressed (such as the bus number, when there's only one bus); this makes + it easier to script lsiutil from Perl +- Rework the way that ports are found under Solaris, to eliminate what are + sometimes lengthy delays waiting for prtconf to run -- the new code uses + the devinfo library to directly walk the device tree +- Fix memory leaks when using the -j switch (ports not selected were not + being closed), and when using options 18 or 44 +- Add "Set SAS phy offline/online" +- Add ability to save persistent mappings to a file, then later restore them +- Add "Diagnostic Page Test", which reads any SCSI diagnostic pages +- Add code to enable or disable the read or write caches in SCSI devices +- Fix incomplete implementation of "Force firmware to fault (with C0FFEE)" +- Add verification of internal FCode checksum +- Add verification of PCIR image length +- Extend "Inject/Repair media error" test so that it works for SATA devices +- When downloading drive firmware, set default mode to 5 for SATA devices +- Fix bug in "Show physical disks" that assumed physdisk numbers were dense +- Detect multi-pathed disks when creating RAID volumes, and suppress their + inclusion in the device list +- Add code to allow binary files to be written when dumping chip locations + (the -g switch must be used for force the question) +- Fix an endian bug when dumping chip locations below 0x10000000 +- Modified SAS phy/link reset code to ask for a device handle, so that remote + phys or links (i.e., on expanders) can be reset +- For DOS/EFI, avoid issuing Port Enable if possible, since that request can + take a long time to complete +- Change method of checking for "context reply" after SCSI request passthrough + under Windows, from looking for a specific MsgContext value, to looking for + the reply's MsgLength being zero +- Add retries under Linux if an IOCTL fails with EAGAIN +- Increase size of DOS/EFI scratch buffer to 1 MB (from 64 KB) to accommodate + large drive firmware downloads +- When exiting on DOS/EFI, don't reset a port that was not brought online + +----------------------------------------------------------------------------- + +Changes for 1.52: + +- Make changes required to allow an EBC version for EFI +- Make changes required to allow native 64-bit IA64 and AMD64 versions + for Windows +- Modify Linux workarounds for IOC_INIT (needed to write Manufacturing + config pages) +- For Solaris, modify findPorts() to first use "prtconf -D", and then as + a fallback, use /etc/path_to_inst, so that working ports can be more + accurately identified +- Fix several big-endian bugs in the RAID-related options +- Don't print a stripe size for IM volumes (it's not valid like it is for + IME and IS volumes) +- Add support for a few new FC Management toolbox functions +- Rewrite getOsDeviceName() for Solaris, so that FCA devices are handled + as well as SCSA devices +- Fix an off-by-one message when complaining about incorrect VPD end tags +- Enhance SAS NVDATA parser to handle version 2D +- Support NPIV for FC by adding a -v switch (to identify which virtual + port to masquerade as) + +----------------------------------------------------------------------------- + +Changes for 1.51: + +- Add date/time stamp when logging to lsiutil.log +- Add "SEP (SCSI Enclosure Processor) Test" +- Add "FC management tools" +- Add "Force firmware to fault (with C0FFEE)" for SAS +- Add "Report LUNs Test" +- Fix dumping of memory regions to work with FC919/FC929 +- Increase chunk size for firmware download/upload, for DOS only +- Allow Sun's mpt driver to work (for Solaris) +- Fix endian bugs in firmware download when checking for 1MB/2MB issues +- Dump enclosure pages when displaying attached devices for SAS +- Add checks for maximum physical disks in a volume +- When creating a volume, allow user to specify "no initial sync" +- Display FC WWNs and SAS WWID as part of -i (aka option 68) +- Add FC949E A2, 53C1030T A2, SAS1064E B3, SAS1068E B3, and 1078 C2 chips + +----------------------------------------------------------------------------- + +Changes for 1.50: + +- Rearrange some source files to allow easier building on Windows + and Solaris +- Add ability to set individual bits, bytes, words, when modifying config + pages (e.g., when prompted for a value, type "bit3=1", or "bits7:4=2", + or "byte2=17") +- Add "Show expander routing tables" +- Add "Disable/Enable drive firmware update mode" to RAID actions +- Add "Display Log entries" and "Clear (erase) Log entries" +- Add "Upload FLASH section" +- Add "Display version information" +- Add "Display/Program chip VPD information" +- Add back deleting of persistent entries for SAS, and add "Change + Bus/Target of a existing mapping" +- Add code to firmware download that handles the SAS phase 8 to phase 8 + bridge firmware image (version 1.18.99) +- When erasing the BIOS, fill with FF rather than 00 to match the FLASH + erase pattern +- Add ability to control booting under EFI for "Change FC Port settings" +- Modify "Change WWID" code to allow for variable-sized config page +- Under DOS or EFI, after any RAID action, sleep for 5 seconds to allow + drive metadata to be updated (if necessary) +- Use the Memory Move toolbox tool to allow "Dump chip memory regions" to + be able to dump tightly-couple memory for SAS and FC +- Beef up the display of SAS control settings in "Dump all port state" +- Display IOCLogInfo value for any RAID action request that fails +- Enhance concatenation to handle NVDATA versions 25, 28, 29, and 2B +- Properly return Check Condition Sense Data under DOS and EFI +- Switch DOS code to use memory space instead of I/O space, whenever + possible + +----------------------------------------------------------------------------- + +Changes for 1.49: + +- Fix build issues with latest SLES10/RHEL5 drivers +- Add -j to allow selecting just FC, SCSI or SAS ports +- Add doWaitForResync (RAID action) +- Add doRemoveSasDevice +- Fix -b and -r to obey -p, -0, and -1 +- Fix port and driver naming under Windows StorPort drivers +- Add 1 MB to 2 MB migration code for SAS (phase 9), DOS and EFI only +- Fix doCreateVolume to obey volume member limits +- Remove all tabs from output, replace with spaces +- Add parsing of NVDATA version 28 + +----------------------------------------------------------------------------- + +Changes for 1.48: + +- Add -w, -ww, and -www flags to capture debug output +- Add -x flag to concatenate SAS firmware and NVDATA files +- Switch from using PortType as a selector, to ProductIdType +- For DOS and EFI, make sure port is ready for each new option +- For ports stuck in reset, don't prompt for a firmware file unless and + until the port is selected +- For EFI, do a firmware upload to handle FWDLB cases (no FLASH) +- Add paged menu mode +- Move "Beacon on/off" to be FC-specific +- Add "Erase non-volatile adapter storage" +- Add "Diagnostic Buffer actions" +- Add "Program manufacturing information" for FC and SAS +- Add "Set personal WWNN/WWPN" for FC +- Add "Send SCSI CDB" +- Remove most persistence actions for SAS, as they no longer are supported + by firmware +- Add "Inject/Repair media error" +- Add "Set/Clear write protect" +- When downloading SAS firmware, make sure the attached NVDATA is correct + for the port's board type +- Fix SAS firmware validity checking to correctly detect wrong chip type + and wrong chip revision +- Allow setting/clearing Native Command Queue Disable and SATA Write Cache + Disable for SAS +- Allow "Read/Write/Verify Logical Blocks" to touch individual volume + members, just like "Inject/Repair media error" +- Fix incorrect ordering of LBA High/Middle/Low parts in "Send SATA + request" +- Add dumping of VPD data (Manufacturing Page 1), if non-zero, to board + info display +- Fix incorrect defaulting of FC's HostSCSIID (15 is no longer correct) +- Fix EFI code to truncate files properly +- Fix EFI code to use I/O space properly, if required (1030/1030T) +- Fix DOS code to not enable chip interrupts (caused a hang while exiting + on some platforms) + +----------------------------------------------------------------------------- + +Changes for 1.47: + +- Add support for EFI +- Add a workaround for older Linux mptbase drivers (fix IOC_INIT failing) +- Add doWriteLogicalBlocks and doVerifyLogicalBlocks +- Add generic SATA passthrough +- Allow -b (showBoardInfo) in combination with any other arguments +- Increase range of Initiator Device Timeout value, by using the + supported scale factor (x16) if necessary +- Allow setting the Device Missing Report Delay and Device Missing + I/O Delay values +- Fix a bug in configuring wide ports +- Add support for RAID Volumes of size > 2 TB +- Add missing config pages to doPortStateDump (-d) + +----------------------------------------------------------------------------- + +Changes for 1.46: + +- Add -0 and -1 options, to skip IOC numbers 0 and 1, for certain + operations (so, lsiutil -1 99 would only reset each chip once) +- Enhance display to show IOC number (same as PCI function number) +- Check to see if the firmware is in Operational state before trying the + first MPT command, to avoid causing a chip reset if the firmware is in + Fault state (if so, option 99 will perform a chip reset, if desired) +- Fix code that obtains MPT register addresses for Linux (was broken for + some systems with 2.6 kernels) +- Fix code that displays operating system device names for Linux (was + displaying incorrect names for some SAS and FC devices whose SCSI + bus/target numbers were not equal to their MPT bus/target numbers) +- Move code that enables MPT register access inside the loops for options + 51 and 52, so that access continues to work even if the chip is reset +- Add display of IOCFactsReply and PortFactsReply to port state that is + dumped by -d, and only display FC Port Page 3 pages that are valid + +----------------------------------------------------------------------------- + +Changes for 1.45: + +- Fixed get2bytes/get3bytes/get4bytes macros to properly truncate +- Fixed formats for 64-bit integers when printed (Windows is different) +- Added doDriveFirmwareDownload +- Added doDisplaySfpPages +- Added doDefaultPhyRegsSettings +- Extended event displaying to Linux and Solaris +- Added some control over port configuration in doSasIoUnitSettings +- Reworked getOsDeviceName slightly for Linux and Solaris +- Fixed bug in doPortStateSummary which reversed Yes and No for + SSP Initiator Enabled and SSP Target Enabled displays +- Added support for FC949E A1 +- Fixed Linux version of doMptCommand to correctly gather Sense Data + +----------------------------------------------------------------------------- + +Changes for 1.44: + +- Upgrade to 1.05.13 MPI headers +- Add doReadLogicalBlocks and doDisplayOsDeviceNames +- Add EEDP support +- Add an optional duration to the monitor frequency (-m f,d) +- Add "reset port" option to all submenus too +- Don't send quiesce/unquiesce RAID actions to SAS IR (not supported) +- Don't coerce RAID volume size if it's small (less than 1 GB) +- Add SAS1068E B1 as a known device + +----------------------------------------------------------------------------- + +Changes for 1.43: + +- Add Clear ACA (option 24) +- Fix a Linux buffer overrun that caused only the first port to be + discovered for some architectures +- Fix ManufacturingPage2 checksum offset for FC949E +- Guard against divide-by-zero when displaying volume resync percent +- Prevent a target from being chosen twice when creating a volume +- Add the flag that deletes PhysDisks when deleting a Volume +- Fix a DOS bug (internal buffer corruption) by rearranging the order + of operations when starting a new command -- bring the chip online + first, before loading the scratch buffers +- Correctly set RequestDataLength to NOT include the CRC bytes, when + sending hand-built SMP Passthrough commands +- Add a hardware workaround for the FC949E to the Firmware Download Boot + code for DOS +- Fix Adapter Reset for SAS1078 (DOS only) + +----------------------------------------------------------------------------- + +Changes for 1.42: + +- Add Log Sense Test +- Add SATA SMART Read Test +- Add Create Hot Spare +- Add Send SMP Request +- Add support for the 1078 +- Change number of LUNs probed to 64 for FC and SAS (leave SCSI alone) +- In doFcPortSettings, preserve original HardALPA setting if user quits +- Fix endian issue when creating volumes (default settings were incorrect + for SPARC and PowerPC) +- Fix typo in doPhysDiskSettings that used the wrong Action value +- Ignore IOC Page 3 in doShowNonDefaultSettings +- Ignore LOG pages in doRestoreDefaultSettings +- Fix DOS MPT driver to not poll the Doorbell while DMA is active + +----------------------------------------------------------------------------- + +Changes for 1.41: + +- Fix build errors on some Linux systems +- Filter out bad "what" strings (any of the first 4 characters are bogus) +- Fix missing 50/51/52/53 from main menu on Linux systems +- Add checking for 1064 A3 SAS firmware images +- Use current config page data if non-volatile data is invalid +- Add "Read Default Write NVRAM" to "Test configuration page actions" +- Resolve SAS firmware hang by not reading LOG page types +- Remove IO Unit Page 3 from "Restore default settings" + +----------------------------------------------------------------------------- + +Changes for 1.40: + +- Added MPT and chip register access for Linux +- Added doShowNonDefaultSettings and doRestoreDefaultSettings +- Fixed commands to consistently check for errors +- Added check for overflow of volume size when creating a volume +- Fixed "free" calls in doDisplayCurrentEvents +- Added retries around Windows IOCTL calls, to handle BUSY status +- Added warning message if any Linux IOCTL call is rejected +- Added speed/width negotiation to DOS driver for SCSI +- Added a watchdog timer routine to DOS driver to catch faults +- Fixed firmware download boot for 929X in DOS driver + +----------------------------------------------------------------------------- + +Changes for 1.39: + +- Add DOS support +- Add 949E support +- Add MPT register access and chip register access +- Move diag_targets[99] from stack storage to global storage +- Add Read Block Limits (like Read Capacity but for tapes) +- Initialize memory after allocation, always +- When menu options are picked from -a, don't print the menu itself +- When showing current firmware version, print both hex and decimal +- Fix bug in displaying phy error counters that nearly always hid errors +- Allow 2-member IS volumes (previously, 2-member volumes were always IM) +- Zero errno (the last error that occurred) prior to each syscall +- Fixed bug that made "lsiutil -e" (or "lsiutil -u") just exit + +----------------------------------------------------------------------------- + +Changes for 1.38: + +- Update to latest header files, 1.05.10 +- Display chip rev as well as chip name +- Add Display Phy Counters and Clear Phy Counters +- Make display of firmware version be accurate, always +- Add Trigger Analyzer with Echo + +----------------------------------------------------------------------------- + +Changes for 1.37: + +- Fixed all mallocs that did not have frees +- Added Read Capacity and Mode Page tests +- Added -n (companion to -y) to answer questions automatically +- In Identify, print current running firmware version as well as FLASH + versions +- If mptscsih is not loaded, quit (from Scan for Devices) early +- Increase metadata size for SAS IR volumes + +----------------------------------------------------------------------------- + +Changes for 1.36: + +- Simplify menus using "expert mode", which is enabled with -e on the + command line, or by typing "e" at any menu prompt +- Add display of transfer statistics for FC (-m, for "monitor") +- Allow -h to print help even if no ports found +- Fix firmware download and config page reads for old versions of MPT (1.00) +- Allow easier erasing of BIOS/FCode images +- Add an explicit error message for Linux if a SCSI I/O fails due to the + mptscsih driver not being loaded + +----------------------------------------------------------------------------- + +Changes for 1.35: + +- Check for new Windows split-driver names (lsi_fc, lsi_scsi, lsi_sas) +- Display all "what" strings that are found +- Add SATA Clear Affiliation test +- Add ability to monitor current events (Linux only so far) + +----------------------------------------------------------------------------- + +Changes for 1.34: + +- Add -b option, which gets board info (from manufacturing config pages) +- Add SATA Identify Drive test +- Fix bug in -p where ranges didn't quite work right +- Add routine to get the length of a variable config page, and use it +- Add warning for trying to use an old FC929X firmware image on an FC929XL +- When setting FC devices persistent, set SCAN_ID and SCAN_LUNS flags too +- Add display of what phys are connected to what, in Display Attached Devices +- Remove all knowledge of EEDP for now + +----------------------------------------------------------------------------- + +Changes for 1.33: + +- On Linux, try "modprobe mptctl" and "mknod /dev/mptctl c 10 220" if + IOCTLs don't work +- Fix bug when manually setting SAS persistence +- Add additional checking to distinguish 929X from 929XL + +----------------------------------------------------------------------------- + +Changes for 1.32: + +- Added coercion of disk size when making an IR volume + +----------------------------------------------------------------------------- + +Changes for 1.31: + +- Added -a to allow arguments to be entered on the command line +- Added Beacon on/off +- Detected Sun FCode for 1030 (and hopefully for 1064 too) +- Fixed bug when manually entering more than one SAS persistent address +- Fixed bug when underrun occurs but some data is transferred (NOT an error!) + diff --git a/source/Makefile_Linux b/source/Makefile_Linux new file mode 100755 index 0000000..543d9d4 --- /dev/null +++ b/source/Makefile_Linux @@ -0,0 +1,3 @@ +lsiutil: lsiutil.c + gcc -Wall -O lsiutil.c -o lsiutil + cp -p lsiutil /usr/bin diff --git a/source/Makefile_Solaris b/source/Makefile_Solaris new file mode 100755 index 0000000..06b60fa --- /dev/null +++ b/source/Makefile_Solaris @@ -0,0 +1,3 @@ +lsiutil: lsiutil.c + gcc -Wall -O lsiutil.c -o lsiutil -D__sparc__ -ldevinfo + cp -p lsiutil /usr/bin diff --git a/source/Makefile_Windows b/source/Makefile_Windows new file mode 100755 index 0000000..d724a25 --- /dev/null +++ b/source/Makefile_Windows @@ -0,0 +1,2 @@ +lsiutil: lsiutil.c + gcc -Wall -O lsiutil.c -o lsiutil.exe -DWIN32 diff --git a/source/getopt.c b/source/getopt.c new file mode 100755 index 0000000..5fefd36 --- /dev/null +++ b/source/getopt.c @@ -0,0 +1,108 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ +#include "inc/getopt.h" + +/* This function gets the next option letter from the console input. + It is supposed to be equivalent to the UNIX getopt function. + Options are preceeded by a dash, currently a slash is not allowed. + Multiple options after one dash are valid, and arguments after + the option with a colon between are supported.*/ + +/* Common varibles. */ + +int opterr = 1, /* error messages printed? default: yes */ + optind = 1, /* index into parent argv vector */ + optopt; /* character checked for validity */ + +char *optarg; /* argument associated with option */ + +#define EMSG "" + +char *progname; /* may also be defined elsewhere */ + + +static void +error(char *pch) /* error message routine */ +{ + if (!opterr) + return; /* without printing */ + + fprintf(stderr, "%s: %s: %c\n", + ((NULL != progname) ? progname : "getopt"), pch, optopt); +} + + +int +getopt(int argc, char *argv[], char *ostr) +{ + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + progname = argv[0]; + + if (!*place) + { /* update scanning pointer */ + if (optind >= argc || + (*(place = argv[optind]) != '-' && + *(place = argv[optind]) != '/') || + !*++place) + { + return EOF; + } + if (*place == '-') + { /* found "--"; ignore; (end of options) */ + ++optind; + return EOF; + } + } + + /* option letter okay? */ + optopt = (int)*place; + ++place; + oli = strchr(ostr, optopt); + if ((optopt == (int)':') || + !(oli = strchr(ostr, optopt))) + { + if (!*place) + ++optind; + + error("illegal option"); + return BADCH; + } + + if (*++oli != ':') /* Check for argument after option */ + { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } + else + { /* need an argument */ + if (*place) + optarg = place; /* no white space */ + else + if (argc <= ++optind) + { /* no arg */ + place = EMSG; + error("option requires an argument"); + return BADCH; + } + else + optarg = argv[optind]; /* white space */ + place = EMSG; + ++optind; + } + return optopt; /* return option letter */ +} + +/* vi: set sw=4 ts=4 sts=4 et :iv */ diff --git a/source/helper.c b/source/helper.c new file mode 100755 index 0000000..b84b852 --- /dev/null +++ b/source/helper.c @@ -0,0 +1,1241 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ +/* + * helper -- EFI helper routines commonly found in a CRTL + * + * Written by Stephen F. Shirron, September 15, 2006 + */ + +EFI_STATUS last_efi_status; +int errno; +int optind; +char *optarg; + +EFI_HANDLE gImageHandle; + +EFI_LOADED_IMAGE *gLoadedImage; + +EFI_EVENT gSleepEvent; + +size_t strlen(const char *s) +{ + const char *c = s; + + while (*c++); + + return c - s - 1; +} + +char *strcpy(char *s1, const char *s2) +{ + char *c1 = s1; + const char *c2 = s2; + + while (*c1++ = *c2++); + + return s1; +} + +char *strncpy(char *s1, const char *s2, size_t n) +{ + unsigned char *c1 = s1; + const char *c2 = s2; + size_t t = 0; + + while (t++ < n && (*c1++ = *c2++)); + while (t++ < n) *c1++ = 0; + + return s1; +} + +char *strcat(char *s1, const char *s2) +{ + char *c1 = s1; + const char *c2 = s2; + + while (*c1) c1++; + while (*c1++ = *c2++); + + return s1; +} + +char *strncat(char *s1, const char *s2, size_t n) +{ + char *c1 = s1; + const char *c2 = s2; + size_t t; + + while (*c1) c1++; + t = 0; + while (t++ < n && (*c1++ = *c2++)); + if (t >= n && *(c1-1)) *c1 = 0; + + return s1; +} + +char *strchr(const char *s1, int t) +{ + while (*s1) if (*s1++ == t) return (char *)--s1; + return NULL; +} + +int strcmp(const char *s1, const char *s2) +{ + while (*s1 && *s1 == *s2) s1++, s2++; + if (*s1 < *s2) return -1; + if (*s1 > *s2) return 1; + return 0; +} + +int strncmp(const char *s1, const char *s2, size_t n) +{ + while (n && *s1 && *s1 == *s2) n--, s1++, s2++; + if (n == 0) return 0; + if (*s1 < *s2) return -1; + if (*s1 > *s2) return 1; + return 0; +} + +int toupper(int c) +{ + if (c >= 'a' && c <= 'z') return c - 'a' + 'A'; + return c; +} + +int tolower(int c) +{ + if (c >= 'A' && c <= 'Z') return c - 'A' + 'a'; + return c; +} + +int strcasecmp(const char *s1, const char *s2) +{ + while (*s1 && tolower(*s1) == tolower(*s2)) s1++, s2++; + if (tolower(*s1) < tolower(*s2)) return -1; + if (tolower(*s1) > tolower(*s2)) return 1; + return 0; +} + +int strncasecmp(const char *s1, const char *s2, size_t n) +{ + while (n && *s1 && tolower(*s1) == tolower(*s2)) n--, s1++, s2++; + if (n == 0) return 0; + if (tolower(*s1) < tolower(*s2)) return -1; + if (tolower(*s1) > tolower(*s2)) return 1; + return 0; +} + +void *memset(void *s, int t, size_t n) +{ + char *c = s; + + while (n) n--, *c++ = t; + return s; +} + +void *memcpy(void *s2, const void *s1, size_t n) +{ + const char *c1 = s1; + char *c2 = s2; + + while (n) n--, *c2++ = *c1++; + return s2; +} + +int memcmp(const void *s1, const void *s2, size_t n) +{ + const char *c1 = s1; + const char *c2 = s2; + + while (n && *c1 == *c2) n--, c1++, c2++; + if (n == 0) return 0; + if (*c1 < *c2) return -1; + if (*c1 > *c2) return 1; + return 0; +} + +void bzero(void *s, size_t n) +{ + char *c = s; + + while (n) + { + *c++ = 0; + n--; + } +} + +void bcopy(const void *s1, void *s2, size_t n) +{ + const char *c1 = s1; + char *c2 = s2; + + while (n) + { + *c2++ = *c1++; + n--; + } +} + +int isdigit(int c) +{ + if (c >= '0' && c <= '9') return 1; + return 0; +} + +int isxdigit(int c) +{ + if (c >= '0' && c <= '9') return 1; + if (c >= 'a' && c <= 'f') return 1; + if (c >= 'A' && c <= 'F') return 1; + return 0; +} + +int isalpha(int c) +{ + if (c >= 'a' && c <= 'z') return 1; + if (c >= 'A' && c <= 'Z') return 1; + return 0; +} + +int isalnum(int c) +{ + if (c >= '0' && c <= '9') return 1; + if (c >= 'a' && c <= 'z') return 1; + if (c >= 'A' && c <= 'Z') return 1; + return 0; +} + +int isprint(int c) +{ + if (c >= ' ' && c <= '~') return 1; + return 0; +} + +void *malloc(size_t size) +{ + return AllocatePool(size); +} + +void *realloc(void *oldp, size_t size) +{ + void *newp = malloc(size); + + memcpy(newp, oldp, size); + + free(oldp); + + return newp; +} + +void free(void *p) +{ + FreePool(p); +} + +static void convert_unicode_ascii(const CHAR16 *s1, char *s2, int n) +{ + int i; + char c; + + for (i = 0; i < n; i++) + { + c = (char)*s1++; + *s2++ = c; + + if (c == 0) + break; + } +} + +static int convert_dtoi(const char *s, int *r, int w) +{ + int n = 0; + char c; + + *r = 0; + while (isdigit(c = *s++)) + { + *r *= 10; + *r += c - '0'; + n++; + if (n == w) + return n; + } + + return n; +} + +static int convert_xtoi(const char *s, int *r, int w) +{ + int n = 0; + char c; + + *r = 0; + while (isxdigit(c = *s++)) + { + *r *= 16; + if (isdigit(c)) + *r += c - '0'; + else + *r += tolower(c) - 'a' + 10; + n++; + if (n == w) + return n; + } + + return n; +} + +static int convert_itod(char *s, int64_t r) +{ + char c; + char buffer[32]; + int i; + int n = 0; + int negative = 0; + + if (r < 0) + { + r = -r; + *s++ = '-'; + negative = 1; + } + + do + { + c = (char)(r % 10); + r /= 10; + buffer[n] = c + '0'; + n++; + } + while (r); + + for (i = 0; i < n; i++) + s[i] = buffer[n - i - 1]; + + s[n] = 0; + + return n + negative; +} + +static int convert_itox(char *s, uint64_t r) +{ + char c; + char buffer[32]; + int i; + int n = 0; + uint64_t r0 = r; + + do + { + c = (char)(r % 16); + r /= 16; + if (c < 10) + buffer[n] = c + '0'; + else + buffer[n] = c + 'a' - 10; + n++; + } + while (r); + + for (i = 0; i < n; i++) + s[i] = buffer[n - i - 1]; + + s[n] = 0; + + return n; +} + +char *fgets(char *s, int size, FILE *stream) +{ + CHAR16 buffer[256]; + + if (stream == stdin) + { + Input(NULL, buffer, sizeof buffer / 2); + convert_unicode_ascii(buffer, s, size); + APrint("\n"); + + return s; + } + + printf("fgets from a file not implemented yet!\n"); + + return NULL; +} + +int sscanf(const char *s, const char *format, ...) +{ + va_list args; + char c; + int n = 0; + int w; + char *as; + int *ad; + int *ax; + int t; + const char *b; + + va_start(args, format); + + b = s; + while ((c = *format++)) + { + while (*s == ' ') + *s++; + if (c == '%') + { + c = *format++; + w = 0; + if (isdigit(c)) + { + format += convert_dtoi(--format, &w, 0); + c = *format++; + } + if (!c) + break; + switch (c) + { + case 's': + if (!*s) + break; + as = va_arg(args, char *); + while ((c = *s)) + { + s++; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + break; + *as++ = c; + } + *as = 0; + n++; + break; + case 'c': + if (!*s) + break; + as = va_arg(args, char *); + *as = *s++; + n++; + break; + case 'd': + if (!*s) + break; + ad = va_arg(args, int *); + t = convert_dtoi(s, ad, w); + if (t) + { + s += t; + n++; + } + break; + case 'x': + if (!*s) + break; + ax = va_arg(args, int *); + t = convert_xtoi(s, ax, w); + if (t) + { + s += t; + n++; + } + break; + case 'n': + ad = va_arg(args, int *); + *ad = (int)(s - b); + break; + } + } + else if (c != ' ') + { + if (*s++ != c) + break; + } + } + + va_end(args); + + return n; +} + +int vsprintf(char *s1, const char *format, va_list args) +{ + char c; + char *s; + char s2[256]; + char b[32]; + int len; + int n = 0; + int t = 0; + int i; + int w; + char ac; + char *as; + int64_t ad; + int64_t ax; +#if !EFIEBC + double af; +#endif + int left; + char pad; + int minw; + int maxw; + int longint; + + if (!s1) + s = s2; + else + s = s1; + + while ((c = *format++)) + { + if (c == '%') + { + c = *format++; + left = 0; + pad = ' '; + minw = 1; + maxw = 100; + longint = 0; + if (c == '-') + { + left = 1; + c = *format++; + } + if (c == '0') + { + pad = '0'; + c = *format++; + } + if (isdigit(c)) + { + format += convert_dtoi(--format, &minw, 0); + c = *format++; + } + if (c == '.') + { + c = *format++; + if (isdigit(c)) + { + format += convert_dtoi(--format, &maxw, 0); + c = *format++; + } + } + if (c == 'l') + { + c = *format++; + if (c == 'l') + c = *format++; + longint = 1; + } + if (!c) + break; + switch (c) + { + case 'c': + ac = (char)va_arg(args, int); + b[0] = ac; + b[1] = 0; + as = b; + break; + case 's': + as = va_arg(args, char *); + break; + case 'd': + if (longint) + ad = (int64_t)va_arg(args, int64_t); + else + ad = (int)va_arg(args, int); + convert_itod(b, ad); + as = b; + break; + case 'x': + if (longint) + ax = (uint64_t)va_arg(args, uint64_t); + else + ax = (unsigned int)va_arg(args, unsigned int); + convert_itox(b, ax); + as = b; + break; + case 'X': + if (longint) + ax = (uint64_t)va_arg(args, uint64_t); + else + ax = (unsigned int)va_arg(args, unsigned int); + convert_itox(b, ax); + for (i = 0; i < (int)strlen(b); i++) + b[i] = toupper(b[i]); + as = b; + break; + case 'p': + ax = (uint64_t)va_arg(args, void *); + convert_itox(b, ax); + as = b; + break; +#if !EFIEBC + case 'f': + af = (double)va_arg(args, double); + for (i = 0, ax = 1; i < maxw; i++, ax *= 10); + ad = (int64_t)(af * ax + 0.5); + convert_itod(b, ad); + if (maxw) + { + len = (int)strlen(b); + if (len < maxw + 1) + { + for (i = maxw + 1; i > maxw - len; i--) + b[i] = b[i-maxw-1+len]; + for (i = 0; i < maxw + 1 - len; i++) + b[i] = '0'; + len = maxw + 1; + } + for (i = len + 1; i > len - maxw; i--) + b[i] = b[i-1]; + b[i] = '.'; + } + as = b; + maxw = 100; + break; +#endif + default: + s[n++] = c; + as = NULL; + minw = 0; + break; + } + if (minw) + { + len = (int)strlen(as); + if (as != b) + { + if (len > maxw) + len = maxw; + } + w = minw - len; + if (!left && w > 0) + { + memset(s + n, pad, w); + n += w; + } + memcpy(s + n, as, len); + n += len; + if (left && w > 0) + { + memset(s + n, pad, w); + n += w; + } + } + } + else + { + s[n++] = c; + } + if (c == '\n' && !s1) + { + s[n] = 0; + t += n; + + if (n) + APrint("%a", s); + + n = 0; + } + } + + s[n] = 0; + t += n; + + if (n && !s1) + APrint("%a", s); + + return n; +} + +#if sfs +int printf(const char *format, ...) +{ + va_list args; + int n; + + va_start(args, format); + + n = vsprintf(NULL, format, args); + + va_end(args); + + return n; +} +#endif + +int sprintf(char *s, const char *format, ...) +{ + va_list args; + int n; + + va_start(args, format); + + n = vsprintf(s, format, args); + + va_end(args); + + return n; +} + +#define MAX_HANDLES 32 + +EFI_FILE_HANDLE gFileHandles[MAX_HANDLES]; + +FILE *fopen(const char *name, const char *mode) +{ + int flags; + int fd; + + if (strchr(mode, 'r')) + flags = O_RDONLY; + else if (strchr(mode, 'w')) + flags = O_RDWR | O_CREAT | O_TRUNC; + else if (strchr(mode, 'a')) + flags = O_RDWR | O_CREAT; + + fd = open(name, flags); + if (fd < 0) + return NULL; + + return (FILE *)fd; +} + +int fclose(FILE *stream) +{ + return close((int)stream); +} + +#if sfs +int fprintf(FILE *stream, const char *format, ...) +{ + va_list args; + char *s; + char s2[256]; + int n; + + if (stream == stdout || stream == stderr) + s = NULL; + else + s = s2; + + va_start(args, format); + + n = vsprintf(s, format, args); + + va_end(args); + + if (s) + n = write((int)stream, s, n); + + return n; +} +#endif + +int fflush(FILE *stream) +{ + EFI_FILE_HANDLE file; + EFI_STATUS status; + int fd = (int)stream; + + if (fd < 4) + return -1; + fd -= 4; + if (fd > MAX_HANDLES) + return -1; + + file = gFileHandles[fd]; + if (!file) + return -1; + + status = file->Flush(file); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("Flush failed!\n"); + } + + return 0; +} + +int fputs(const char *s, FILE *stream) +{ + int n; + + n = (int)strlen(s); + if (stream == stdout || stream == stderr) + APrint("%a", s); + else + write((int)stream, s, n); + + return n; +} + +int fputc(int c, FILE *stream) +{ + if (stream == stdout || stream == stderr) + APrint("%c", (UINTN)c); + else + write((int)stream, (void *)&c, 1); + + return 1; +} + +int open(const char *name, int flags, ...) +{ + EFI_FILE_IO_INTERFACE *fileIo; + EFI_FILE_HANDLE root; + EFI_FILE_HANDLE file; + EFI_FILE_INFO *info; + EFI_GUID SimpleFileSystemProtocol = SIMPLE_FILE_SYSTEM_PROTOCOL; + EFI_STATUS status; + CHAR16 *path; + CHAR16 filename[128]; + UINTN i; + UINT64 mode; + int fd; + + for (fd = 0; fd < MAX_HANDLES; fd++) + if (!gFileHandles[fd]) + break; + if (fd == MAX_HANDLES) + return -1; + + if (*name == '.' || (isalnum(*name) && !strchr(name, ':'))) + { + path = DevicePathToStr(gLoadedImage->FilePath); + +// APrint("loaded image = <%s>\n", path); + + for (i = StrLen(path) - 1; i > 0; i--) + if (path[i] == L'/') + break; + // if the path contains "/." at the end, remove it + if (i >= 2 && path[i-2] == '/' && path[i-1] == '.') + i -= 2; + // if the path doesn't end with "\", add one + if (!(i >= 1 && path[i-1] == '\\')) + path[i++] = '\\'; + // throw away the rest of the string + path[i] = 0; + StrCpy(filename, path); + + FreePool(path); + } else + filename[0] = 0; + + for (i = StrLen(filename); *name; i++) + filename[i] = (CHAR16)*name++; + filename[i] = 0; + +// APrint("filename = <%s>\n", filename); + + status = BS->HandleProtocol(gLoadedImage->DeviceHandle, + &SimpleFileSystemProtocol, &fileIo); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("HandleProtocol(SimpleFileSystem) failed!\n"); + return -1; + } + + status = fileIo->OpenVolume(fileIo, &root); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("OpenVolume failed!\n"); + return -1; + } + + mode = EFI_FILE_MODE_READ; + if (flags & O_RDWR) + mode |= EFI_FILE_MODE_WRITE; + if (flags & O_CREAT) + mode |= EFI_FILE_MODE_CREATE; + + status = root->Open(root, &file, filename, mode, 0); + if (EFI_ERROR(status)) + { + last_efi_status = status; + APrint("Open of <%s> failed!\n", filename); + return -1; + } + + if (flags & O_CREAT) + { + info = LibFileInfo(file); + if (info) + { + if (flags & O_TRUNC) + { + info->FileSize = 0; + info->PhysicalSize = 0; + status = file->SetInfo(file, &GenericFileInfo, (UINTN)info->Size, info); + if (EFI_ERROR(status)) + { + last_efi_status = status; + APrint("SetInfo of <%s> failed!\n", filename); + } + } + else + { + status = file->SetPosition(file, info->FileSize); + if (EFI_ERROR(status)) + { + last_efi_status = status; + APrint("SetPosition of <%s> failed!\n", filename); + } + } + + FreePool(info); + } + } + + gFileHandles[fd] = file; + + fd += 4; + + return fd; +} + +int close(int fd) +{ + EFI_FILE_HANDLE file; + EFI_STATUS status; + + if (fd < 4) + return -1; + fd -= 4; + if (fd > MAX_HANDLES) + return -1; + + file = gFileHandles[fd]; + if (!file) + return -1; + + status = file->Close(file); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("Close failed!\n"); + } + + return 0; +} + +ssize_t read(int fd, void *buf, size_t count) +{ + EFI_FILE_HANDLE file; + EFI_STATUS status; + UINTN size = count; + + if (fd < 4) + return -1; + fd -= 4; + if (fd > MAX_HANDLES) + return -1; + + file = gFileHandles[fd]; + if (!file) + return -1; + + status = file->Read(file, &size, buf); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("Read failed!\n"); + return -1; + } + + return (ssize_t)size; +} + +ssize_t write(int fd, const void *buf, size_t count) +{ + EFI_FILE_HANDLE file; + EFI_STATUS status; + UINTN size = count; + + if (fd < 4) + return -1; + fd -= 4; + if (fd > MAX_HANDLES) + return -1; + + file = gFileHandles[fd]; + if (!file) + return -1; + + status = file->Write(file, &size, (void *)buf); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("Write failed!\n"); + return -1; + } + + return (ssize_t)size; +} + +int fstat(int fd, struct stat *buf) +{ + EFI_FILE_HANDLE file; + EFI_FILE_INFO *info; + + if (fd < 4) + return -1; + fd -= 4; + if (fd > MAX_HANDLES) + return -1; + + file = gFileHandles[fd]; + if (!file) + return -1; + + info = LibFileInfo(file); + if (!info) + { + printf("GetInfo failed!\n"); + return -1; + } + + buf->st_size = (size_t)info->FileSize; + + FreePool(info); + + return 0; +} + +static int rand_seed = 152L; + +int rand(void) +{ + rand_seed = rand_seed * 69069L + 1; + + return ((rand_seed >> 16) + (rand_seed << 16)); +} + +void perror(const char *s) +{ + if (s && *s) + APrint("%a: ", s); + APrint("%r\n", last_efi_status); +} + +static int dpm[] = { + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 +}; + +#ifndef DISABLE_TIMEOUTS +time_t time(time_t *t) +{ + EFI_TIME et; + time_t local_t; + int days; + + RT->GetTime(&et, NULL); + + days = dpm[et.Month - 1] + et.Day - 1; + + if (et.Year >= 1970) + { + days += (et.Year - 1970) * 365; + + // all modulo-4 years since 1970 are leap years, up until 2100 + days += (et.Year - 1969) / 4; + } + + local_t = ((days * 24 + et.Hour) * 60 + et.Minute) * 60 + et.Second; + if (t) + *t = local_t; + + return local_t; +} +#endif + +static const char *day_name[] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; + +static const char *mon_name[] = { + "Mar", "Apr", "May", "Jun", "Jul", "Aug", + "Sep", "Oct", "Nov", "Dec", "Jan", "Feb" +}; + +static const int days_per[12] = { + 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 +}; + +static char ctime_result[26]; + +char *ctime(const time_t *seconds) +{ + int f, k, m, D, C, d; // going to use Zeller's Rule to derive the weekday + int days, leap, year, month, day, hours, mins, secs, t; + + days = *seconds / 86400; + t = days; + year = 1970; + // if it's already past 2004, get that out of the way quick + if (t >= 12418) + { + t -= 12418; + year += 34; + } + for (; ; year++) + { + // this simple rule is good until 2100 + leap = (year % 4) == 0; + if (t < 365 + leap) + break; + t -= 365 + leap; + } + month = 0; + // if it's already past June, get that out of the way quick + if (t >= 181 + leap) + { + t -= 181 + leap; + month += 6; + } + for (; ; month++) + { + if (t < days_per[month]) + break; + t -= days_per[month]; + if (month == 1) + { + if (t < leap) + break; + t -= leap; + } + } + day = t + 1; + t = *seconds - days * 86400; + hours = t / 3600; + t -= hours * 3600; + mins = t / 60; + t -= mins * 60; + secs = t; + + k = day; + m = month - 1; + D = year % 100; + C = year / 100; + + if (m < 1) + { + m += 12; + D -= 1; + } + + f = k + (13*m-1)/5 + D + D/4 + C/4 - 2*C; + + d = f % 7; + if (d < 0) + d += 7; + + sprintf(ctime_result, "%.3s %.3s%3d %02d:%02d:%02d %d\n", + day_name[d], mon_name[m-1], + day, hours, mins, secs, year); + + return ctime_result; +} + +VOID EfiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +{ + EFI_TIME et; + EFI_STATUS status; + int i; + int argc; + char **argv; + int n; + + InitializeShellApplication(ImageHandle, SystemTable); + + gImageHandle = ImageHandle; + + status = BS->HandleProtocol(gImageHandle, &LoadedImageProtocol, &gLoadedImage); + if (EFI_ERROR(status)) + { + last_efi_status = status; + printf("HandleProtocol(LoadedImage) failed!\n"); + gLoadedImage = NULL; + } + + status = BS->CreateEvent(EVT_TIMER, 0, NULL, NULL, &gSleepEvent); + if (EFI_ERROR(status)) + gSleepEvent = NULL; + + RT->GetTime(&et, NULL); + if (et.Year % 4 == 0 && et.Year % 100 != 0 && et.Year % 400 == 0) + dpm[3]++; + + argc = (int)SI->Argc; + argv = malloc(sizeof argv * argc); + + for (i = 0; i < argc; i++) + { + n = (int)StrLen(SI->Argv[i]) + 1; + argv[i] = malloc(n); + convert_unicode_ascii(SI->Argv[i], argv[i], n); + } + + main(argc, argv); +} + +void exit(int status) +{ + if (gSleepEvent) + BS->CloseEvent(gSleepEvent); + + if (status == 0) + BS->Exit(gImageHandle, EFI_SUCCESS, 0, NULL); + else + BS->Exit(gImageHandle, EFIERR_OEM(status), 0, NULL); +} + +unsigned int sleep(unsigned int seconds) +{ + UINTN unused; + + if (gSleepEvent) + { + BS->SetTimer(gSleepEvent, TimerRelative, seconds * 10000000); + BS->WaitForEvent(1, &gSleepEvent, &unused); + } + else + { + BS->Stall(seconds * 1000000); + } + + return 0; +} + +void mdelay(int milliseconds) +{ + BS->Stall(milliseconds * 1000); +} + +void udelay(int microseconds) +{ + BS->Stall(microseconds); +} + +int _fltused; + +#include "getopt.c" + +/* vi: set sw=4 ts=4 sts=4 et :iv */ diff --git a/source/inc/ata.h b/source/inc/ata.h new file mode 100755 index 0000000..7781f3e --- /dev/null +++ b/source/inc/ata.h @@ -0,0 +1,869 @@ +/*************************************************************************** + * * + * Copyright 2003 LSI Logic Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Logic. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Logic Corporation. * + * * + *************************************************************************** + * + * Name: ATA.H + * Title: ATA and SATA Device structures and definitions + * Programmer: ---------------- + * Creation Date: February 26, 2002 + * + * Version History + * --------------- + * + * Last Updated + * ------------- + * Version %version: 24 % + * Date Updated %date_modified: % + * Programmer %created_by: mfry % + * + * Date Who Description + * -------- --- ------------------------------------------------------- + * 02/26/02 GWK Initial version + * 01/24/03 GWK Updated for SAS 1064 + * 08/20/08 KAM updated for SDM big endian platform and gcc bitfields + * + * + * Description + * ------------ + * This include file contains generic ATA and SATA structures and definitions. + * + *------------------------------------------------------------------------- + */ + +/* If this header file has not been included yet */ +#ifndef ATA_H_SOURCE +#define ATA_H_SOURCE + + + +/* Status Register Bit Definitions */ +#define ATA_STATUS_ERR (0x01) +#define ATA_STATUS_DRQ (0x08) +#define ATA_STATUS_CMD_DEP (0x10) +#define ATA_STATUS_DF (0x20) +#define ATA_STATUS_DRDY (0x40) +#define ATA_STATUS_BSY (0x80) +#define ATA_STATUS_ERR_DF (ATA_STATUS_ERR | ATA_STATUS_DF) +/* Atapi Status Register Bit Definitions */ +#define ATAPI_STATUS_CHK (0x01) +#define ATAPI_STATUS_DRQ (0x08) +#define ATAPI_STATUS_SERV (0x10) +#define ATAPI_STATUS_DMRD (0x20) +#define ATAPI_STATUS_DRDY (0x40) +#define ATAPI_STATUS_BSY (0x80) + +/* Atapi Interrupt Reason Register Bit Definitions */ +#define ATAPI_INTERRUPT_REASON_CD (0x01) +#define ATAPI_INTERRUPT_REASON_IO (0x02) +#define ATAPI_INTERRUPT_REASON_REL (0x04) +#define ATAPI_INTERRUPT_REASON_TAG_SHIFT (3) +#define ATAPI_INTERRUPT_REASON_TAG_MASK (0xF8) + +/* Error Register Bit Definitions */ +#define ATA_ERR_ICRC (0x80) /* ultra DMA CRC */ +#define ATA_ERR_UNC (0x40) /* uncorrectable error */ +#define ATA_ERR_WP (0x40) /* write-protect bit */ +#define ATA_ERR_MC (0x20) /* media changed */ +#define ATA_ERR_IDNF (0x10) /* id not found */ +#define ATA_ERR_MCR (0x08) /* media change requested */ +#define ATA_ERR_ABRT (0x04) /* aborted command */ +#define ATA_ERR_NM (0x02) /* no media present */ + +/* Atapi Error Register Bit Definitions */ +#define ATAPI_ERR_ILI (0x01) +#define ATAPI_ERR_EOM (0x02) +#define ATAPI_ERR_ABRT (0x04) +#define ATAPI_ERR_SENSE_KEY_SHIFT (3) +#define ATAPI_ERR_SENSE_KEY_TAG_MASK (0xF8) + +/* Device & Device/Head Register Bit Definitions */ +#define ATA_DEVICE_LBA (0x40) + +/* Device Control Register Bit Definitions */ +#define ATA_DEVICE_CONTROL_SRST (0x04) +#define ATA_DEVICE_CONTROL_NIEN (0x02) + +/* + * define the ATA command set + */ +#define ATA_CMD_CHECK_POWER_MODE 0xE5 +#define ATA_CMD_DEVICE_CONFIGURATION 0xB1 +#define ATA_CMD_DOWNLOAD_MICROCODE 0x92 +#define ATA_CMD_EXECUTE_DEVICE_DIAGNOSTIC 0x90 +#define ATA_CMD_FLUSH_CACHE 0xE7 +#define ATA_CMD_FLUSH_CACHE_EXT 0xEA +#define ATA_CMD_GET_MEDIA_STATUS 0xDA +#define ATA_CMD_IDENTIFY_DEVICE 0xEC +#define ATA_CMD_IDENTIFY_PACKET_DEVICE 0xA1 +#define ATA_CMD_IDLE 0xE3 +#define ATA_CMD_IDLE_IMMEDIATE 0xE1 +#define ATA_CMD_INITIALIZE_DEVICE_PARAMETERS 0x91 +#define ATA_CMD_MEDIA_EJECT 0xED +#define ATA_CMD_MEDIA_LOCK 0xDE +#define ATA_CMD_MEDIA_UNLOCK 0xDF +#define ATA_CMD_NATIVE_MAX_ADDRESS 0xF8 +#define ATA_CMD_NATIVE_MAX_ADDRESS_EXT 0x27 +#define ATA_CMD_NOP 0x00 +#define ATA_CMD_PACKET 0xA0 +#define ATA_CMD_READ_BUFFER 0xE4 +#define ATA_CMD_READ_DMA 0xC8 +#define ATA_CMD_READ_DMA_EXT 0x25 +#define ATA_CMD_READ_DMA_QUEUED 0xC7 +#define ATA_CMD_READ_DMA_QUEUED_EXT 0x26 +#define ATA_CMD_READ_FPDMA_QUEUED 0x60 +#define ATA_CMD_READ_MULTIPLE 0xC4 +#define ATA_CMD_READ_MULTIPLE_EXT 0x29 +#define ATA_CMD_READ_LOG_EXT 0x2F +#define ATA_CMD_READ_SECTORS 0x20 +#define ATA_CMD_READ_SECTORS_EXT 0x24 +#define ATA_CMD_READ_LONG 0x22 /* Obsoleted in ATA-4 */ +#define ATA_CMD_READ_VERIFY_SECTORS 0x40 +#define ATA_CMD_READ_VERIFY_SECTORS_EXT 0x42 +#define ATA_CMD_SECURITY_DISABLE_PASSWORD 0xF6 +#define ATA_CMD_SECURITY_ERASE_PREPARE 0xF3 +#define ATA_CMD_SECURITY_ERASE_UNIT 0xF4 +#define ATA_CMD_SECURITY_FREEZE_LOCK 0xF5 +#define ATA_CMD_SECURITY_SET_PASSWORD 0xF1 +#define ATA_CMD_SECURITY_UNLOCK 0xF2 +#define ATA_CMD_SEEK 0x70 +#define ATA_CMD_SET_FEATURES 0xEF +#define ATA_CMD_SET_MAX 0xF9 +#define ATA_CMD_SET_MAX_EXT 0x37 +#define ATA_CMD_SET_MULTIPLE_MODE 0xC6 +#define ATA_CMD_SLEEP 0xE6 +#define ATA_CMD_SMART 0xB0 +#define ATA_CMD_SMART_READ_DATA 0xD0 +#define ATA_CMD_SMART_ENABLE_DISABLE_AUTOSAVE 0xD2 +#define ATA_CMD_SMART_SAVE_ATTRIBUTE_VALUES 0xD3 +#define ATA_CMD_SMART_EXECUTE_OFFLINE_IMMEDIATE 0xD4 +#define ATA_CMD_SMART_READ_LOG 0xD5 +#define ATA_CMD_SMART_WRITE_LOG 0xD6 +#define ATA_CMD_SMART_ENABLE_OPERATIONS 0xD8 +#define ATA_CMD_SMART_DISABLE_OPERATIONS 0xD9 +#define ATA_CMD_SMART_RETURN_STATUS 0xDA +#define ATA_CMD_STANDBY 0xE2 +#define ATA_CMD_STANDBY_IMMEDIATE 0xE0 +#define ATA_CMD_WRITE_BUFFER 0xE8 +#define ATA_CMD_WRITE_DMA 0xCA +#define ATA_CMD_WRITE_DMA_EXT 0x35 +#define ATA_CMD_WRITE_DMA_QUEUED 0xCC +#define ATA_CMD_WRITE_DMA_QUEUED_EXT 0x36 +#define ATA_CMD_WRITE_FPDMA_QUEUED 0x61 +#define ATA_CMD_WRITE_MULTIPLE 0xC5 +#define ATA_CMD_WRITE_MULTIPLE_EXT 0x39 +#define ATA_CMD_WRITE_SECTORS 0x30 +#define ATA_CMD_WRITE_SECTORS_EXT 0x34 +#define ATA_CMD_WRITE_LONG 0x32 /* Obsoleted in ATA-4 */ + + +/* + * define SET_FEATURES sub-commands + */ +#define ATA_CMD_SF_SET_TRANSFER_MODE 0x03 +#define ATA_CMD_SF_WRITE_CACHE_ENABLE 0x02 +#define ATA_CMD_SF_WRITE_CACHE_DISABLE 0x82 +#define ATA_CMD_SF_ENABLE_READ_LOOK_AHEAD 0xAA +#define ATA_CMD_SF_DISABLE_READ_LOOK_AHEAD 0x55 +#define ATA_CMD_SF_ENABLE_REVERT_PWR_ON_DFLTS 0xCC +#define ATA_CMD_SF_DISABLE_REVERT_PWR_ON_DFLTS 0x66 +#define ATA_CMD_SF_ENABLE_SATA_FEATURE 0x10 +#define ATA_CMD_SF_DISABLE_SATA_FEATURE 0x90 + +#define SATA_CMD_SF_NON_ZERO_BUFF_OFST_IN_DMA_SETUP_FIS 0x01 +#define SATA_CMD_SF_DMA_SETUP_FIS_AUTO_ACTV_OPTIMIZATION 0x02 +#define SATA_CMD_SF_GUARANTEED_IN_ORDER_DATA_DELIVERY 0x04 +#define SATA_CMD_SF_ASYNC_NOTIFICATION 0x05 +#define SATA_CMD_SF_SOFTWARE_SETTINGS_PRESERVATION 0x06 + + +/* Transfer mode settings for SET_FEATURES command */ +#define PIO_DEFAULT 0x0 +#define PIO_MODE3 0xB +#define PIO_MODE4 0xC + +#define MDMA_MODE0 0x20 +#define MDMA_MODE1 0x21 +#define MDMA_MODE2 0x22 + +#define UDMA_MODE0 0x40 +#define UDMA_MODE1 0x41 +#define UDMA_MODE2 0x42 +#define UDMA_MODE3 0x43 +#define UDMA_MODE4 0x44 +#define UDMA_MODE5 0x45 +#define UDMA_MODE6 0x46 + +/* Error register definitions for the EXECUTE DEVICE DIAGNOSTIC command */ +#define ATA_ERROR_DIAGNOSTIC_CODE_DEVICE0_PASSED 0x01 + +/* These signatures are left in the task file registers after an + * EXECUTE DEVICE DIAGNOSTIC command, and at a few other times + */ +#define COMMAND_BLOCK_SIGNATURE_ATAPI (0x00EB1401) +#define SECTOR_COUNT_SIGNATURE_ATAPI (0x01) +#define COMMAND_BLOCK_SIGNATURE_ATA (0x00000001) +#define SECTOR_COUNT_SIGNATURE_ATA (0x01) + + +/* CHECK POWER MODE results in Sector Count register */ +#define ATA_CHECK_POWER_MODE_STANDBY (0x00) +#define ATA_CHECK_POWER_MODE_IDLE (0x80) +#define ATA_CHECK_POWER_MODE_ACTIVE_OR_IDLE (0xFF) + +/* DOWNLOAD MICROCODE SUB COMMANDS */ +#define ATA_DNLD_MIC_CODE_IMMED_TEMP (0x01) +#define ATA_DNLD_MIC_CODE_IMMED_FUTURE (0x07) + +/* + * define typical IDE timeout values + * + * GES 02/09/01: These values will need some tweaking!! + */ +#define ATA_TIMEOUT_GEN 30 /* generic timeout is 30 seconds */ +#define ATA_TIMEOUT_IDENTIFY 2 /* timeout for IDENTIFY commands */ +#define ATA_TIMEOUT_READ_BUFFER 2 /* timeout for read buffer */ +#define ATA_TIMEOUT_DIAG 5 /* timeout for diagnostics command */ +#define ATA_TIMEOUT_STANDBY_IDLE 30 /* timeout for start/stop unit commands */ +#define ATA_TIMEOUT_FLUSH_CACHE 30 /* cache flush timeout */ +#define ATA_TIMEOUT_CHECK_POWER 2 /* timeout for CHECK POWER MODE */ +#define ATA_TIMEOUT_DOWNLOAD_MICROCODE 120 /* wait up to 2 minute */ + + +/* + * define the IDENTIFY DEVICE structure + */ +typedef struct _ATA_IDENTIFY_DEVICE_DATA +{ + U16 GeneralConfiguration; /* 0 */ + U16 LogicalCylinders; /* 1 */ + U16 SpecificConfiguration; /* 2 */ + U16 LogicalHeads; /* 3 */ + U16 Retired4to5[2]; /* 4-5 */ + U16 LogicalSectorsPerLogicalTrack; /* 6 */ + U16 Reserved7to8[2]; /* 7-8 */ + U16 Retired3; /* 9 */ + U16 SerialNumber[10]; /* 10-19 */ + U16 Retired20to21[2]; /* 20-21 */ + U16 Obsolete22; /* 22 */ + U16 FirmwareRevision[4]; /* 23-26 */ + U16 ModelNumber[20]; /* 27-46*/ + U16 MaxMultipleSize; /* 47 */ + U16 Reserved48; /* 48 */ + U16 Capabilities[2]; /* 49-50 */ + U16 Obsolete51to52[2]; /* 51-52 */ + U16 ValidWords; /* 53 */ + U16 CurrentLogicalCylinders; /* 54 */ + U16 CurrentLogicalHeads; /* 55 */ + U16 CurrentLogicalSectorsPerTrack; /* 56 */ + U16 CurrentCapacityInSectors[2]; /* 57-58 */ + U16 CurrentMultipleSize; /* 59 */ + U16 TotalUserSectors[2]; /* 60-61 */ + U16 Obsolete62; /* 62 */ + U16 MultiwordDmaMode; /* 63 */ + U16 PioModesSupported; /* 64 */ + U16 MinimumMultiwordDmaTransferCycleTime; /* 65 */ + U16 ManufacturerRecommendedMultiwordDmaTransferCycleTime; /* 66 */ + U16 MinumumPioTransferCycleTimeWithoutFlowControl; /* 67 */ + U16 MinumumPioTransferCycleTimeWithFlowControl; /* 68 */ + U16 Reserved69to70[2]; /* 69-70 */ + U16 Reserved71to74[4]; /* 71-74 */ + U16 QueueDepth; /* 75 */ + U16 SerialATACapabilities; /* 76 */ + U16 Reserved77; /* 77 */ + U16 SerialFeaturesSupported[2]; /* 78-79 */ + U16 MajorVersionNumber; /* 80 */ + U16 MinorVersionNumber; /* 81 */ + U16 CommandSetsSupported[3]; /* 82-84 */ + U16 CommandSetsEnabled[2]; /* 85-86 */ + U16 CommandSetDefaults; /* 87 */ + U16 UltraDmaModes; /* 88 */ + U16 TimeForSecurityErase; /* 89 */ + U16 TimeForEnahncedSecurityErase; /* 90 */ + U16 CurrentAdvancedPowerManagementValue; /* 91 */ + U16 MasterPasswordRevisionCode; /* 92 */ + U16 HardwareResetResult; /* 93 */ + U16 AcousticManagement; /* 94 */ /* GWK Reserved in ATA-5 */ + U16 Reserved95to99[5]; /* 95-99 */ + U16 MaximumLBAfor48bitAddressing[4]; /* 100-103 */ /* GWK Reserved in ATA-5 */ + U16 Reserved104to107[4]; /* 104-107 */ + U16 WorldWideName[4]; /* 108-111 */ + U16 Reserved112to126[15]; /* 112-126 */ + U16 RemovableMediaStatusNotification; /* 127 */ + U16 SecurityStatus; /* 128 */ + U16 VendorSpecific[31]; /* 129-159 */ + U16 CFApowerMode; /* 160 */ + U16 Reserved161to175[15]; /* 161-175 */ + U16 Reserves176to254[79]; /* 176-254 */ + U16 IntegrityWord; /* 255 */ +} ATA_IDENTIFY_DEVICE_DATA, *PTR_ATA_IDENTIFY_DEVICE_DATA; + +#define ATA_IDENTIFY_DATA_FIRMWARE_REVISION_LENGTH_IN_BYTES 8 +#define ATA_IDENTIFY_DATA_MODEL_NUMBER_LENGTH_IN_BYTES 40 +#define ATA_IDENTIFY_DATA_SERIAL_NUMBER_LENGTH_IN_BYTES 20 + +#define ATA_IDENTIFY_DATA_MAJOR_VERSION_ATA_ATAPI_7 (0x0080) +#define ATA_IDENTIFY_DATA_MAJOR_VERSION_ATA_ATAPI_8 (0x0100) + +#define ATA_IDENTIFY_DATA_COMMAND_SET_DEFAULT_WWN (0x0100) +#define ATA_IDENTIFY_DATA_WRITE_CACHE_ENABLED (0x0020) +#define ATA_IDENTIFY_DATA_LOOK_AHEAD_ENABLED (0x0040) +#define ATA_IDENTIFY_DATA_SMART_FEATURE_ENABLED (0x0001) +#define ATA_IDENTIFY_DATA_SATA_SUP_FEAT_SFT_SET_PRES (0x0040) + +/* + * define the IDENTIFY PACKET DEVICE structure for ATAPI + */ +typedef struct _ATA_IDENTIFY_PACKET_DEVICE_DATA +{ + U16 GeneralConfiguration; /* 0 */ + U16 Reserved01; /* 1 */ + U16 UniqueConfiguration; /* 2 */ + U16 Reserved03to09[7]; /* 3-9 */ + U16 SerialNumber[10]; /* 10-19 */ + U16 Retired20to22[3]; /* 20-22 */ + U16 FirmwareRevision[4]; /* 23-26 */ + U16 ModelNumber[20]; /* 27-46*/ + U16 Reserved47to48[2]; /* 47-48 */ + U16 Capabilities[2]; /* 49-50 */ + U16 Obsolete51to52[2]; /* 51-52 */ + U16 ValidWords; /* 53 */ + U16 Reserved54to62[9]; /* 54-62 */ + U16 MultiwordDmaMode; /* 63 */ + U16 PioModesSupported; /* 64 */ + U16 MinimumMultiwordDmaTransferCycleTime; /* 65 */ + U16 ManufacturerRecommendedMultiwordDmaTransferCycleTime; /* 66 */ + U16 MinumumPioTransferCycleTimeWithoutFlowControl; /* 67 */ + U16 MinumumPioTransferCycleTimeWithFlowControl; /* 68 */ + U16 Reserved69to70[2]; /* 69-70 */ + U16 TypicalTimePacketCmdToBusRelease; /* 71 */ + U16 TypicalTimeServiceToBSYCleared; /* 72 */ + U16 Reserved73to74[2]; /* 73-74 */ + U16 QueueDepth; /* 75 */ + U16 SerialATACapabilities; /* 76 */ + U16 Reserved77to79[3]; /* 77-79 */ + U16 MajorVersionNumber; /* 80 */ + U16 MinorVersionNumber; /* 81 */ + U16 CommandSetsSupported[3]; /* 82-84 */ + U16 CommandSetsEnabled[2]; /* 85-86 */ + U16 CommandSetDefaults; /* 87 */ + U16 UltraDmaModes; /* 88 */ + U16 Reserved89to92[4]; /* 89-92 */ + U16 HardwareResetResult; /* 93 */ + U16 AcousticManagement; /* 94 */ /* GWK Reserved in ATA-5 */ + U16 Reserved95to124[30]; /* 95-124 */ + U16 AtapeByteCount0Behavior; /* 125 */ + U16 Obsolete126; /* 126 */ + U16 RemovableMediaStatusNotification; /* 127 */ + U16 SecurityStatus; /* 128 */ + U16 VendorSpecific129to159[31]; /* 129-159 */ + U16 ReservedForCFA160to175[16]; /* 160-175 */ + U16 Reserved176to254[79]; /* 176-254 */ + U16 IntegrityWord; /* 255 */ +} ATA_IDENTIFY_PACKET_DEVICE_DATA, *PTR_ATA_IDENTIFY_PACKET_DEVICE_DATA; + +#define ATA_IDENTIFY_PACKET_DATA_FIRMWARE_REVISION_LENGTH_IN_BYTES 8 +#define ATA_IDENTIFY_PACKET_DATA_MODEL_NUMBER_LENGTH_IN_BYTES 40 +#define ATA_IDENTIFY_PACKET_DATA_SERIAL_NUMBER_LENGTH_IN_BYTES 20 + + + + +/******************************************************************************/ +/* */ +/* S A T A S P E C I F I C D E F I N I T I O N S */ +/* */ +/******************************************************************************/ + +/* FIS Types */ +#define FIS_TYPE_REGISTER_HOST_TO_DEVICE 0x27 +#define FIS_TYPE_REGISTER_DEVICE_TO_HOST 0x34 +#define FIS_TYPE_SET_DEVICE_BITS_DEVICE_TO_HOST 0xA1 +#define FIS_TYPE_DMA_ACTIVATE_DEVICE_TO_HOST 0x39 +#define FIS_TYPE_DMA_SETUP_BIDIRECTIONAL 0x41 +#define FIS_TYPE_BIST_ACTIVATE_BIDIRECTIONAL 0x58 +#define FIS_TYPE_PIO_SETUP_DEVICE_TO_HOST 0x5F +#define FIS_TYPE_DATA_BIDIRECTIONAL 0x46 + +/* FIS Command/Control Bit Definitions */ +#define FIS_COMMAND_CONTROL_COMMAND 0x1 +#define FIS_COMMAND_CONTROL_CONTROL 0x0 + +/* FIS Interrupt Bit Definitions */ +#define FIS_INTERRUPT_TRUE 0x1 +#define FIS_INTERRUPT_FALSE 0x0 + +/* FIS Direction Bit Definitions */ +#define FIS_DIRECTION_TRANSMITTER_TO_RECEIVER 0x1 +#define FIS_DIRECTION_RECEIVER_TO_TRANSMITTER 0x0 + +/* + * This is the mapping of how the various fields in the host to device FIS are used + * for CHS, LBA28-bit,and LBA48-bit modes. Use the union on the register FIS + * types to select. + * + * + * CHS LBA28 LBAEXP48 + * --- ----- -------- + * 0x00 U8 FISType; U8 FISType; U8 FISType; + * 0x01 U32 Reserved01Bits0to6 :7; U32 Reserved01Bits0to6 :7; U32 Reserved01Bits0to6 :7; + * U32 CommandBit :1; U32 CommandBit :1; U32 CommandBit :1; + * 0x02 U8 Command; U8 Command; U8 Command; + * 0x03 U8 Features; U8 Features; U8 Features; + * 0x04 U8 SectorNumber; U8 LBALow_0_7; U8 LBALow_0_7; + * 0x05 U8 CylLow; U8 LBAMid_8_15; U8 LBAMid_8_15; + * 0x06 U8 CylHigh; U8 LBAHigh_16_23; U8 LBAHigh_16_23; + * 0x07 U8 DeviceHead; U8 DeviceAndLBA24_27; U8 Device; + * 0x08 U8 SectorNumberExp; U8 SectorNumberExp; U8 LBALowExp_24_31; + * 0x09 U8 CylLowExp; U8 CylLowExp; U8 LBAMidExp_32_39; + * 0x0A U8 CylHighExp; U8 CylHighExp; U8 LBAHighExp_40_47; + * 0x0B U8 FeaturesExp; U8 FeaturesExp; U8 FeaturesExp; + * 0x0C U8 SectorCount; U8 SectorCount; U8 SectorCount0_7; + * 0x0D U8 SectorCountExp; U8 SectorCountExp; U8 SectorCountExp8_15; + * 0x0E U8 Reserved0E; U8 Reserved0E; U8 Reserved0E; + * 0x0F U8 Control; U8 Control; U8 Control; + * 0x10 U32 Reserved10to14; U32 Reserved10to14; U32 Reserved10to14; + */ + +/* + * SATA Register - Host To Device FIS for CHS addressing + */ +typedef struct _REGISTER_HOST_TO_DEVICE_FIS_CHS +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 CommandBit :1; /* 0x01 */ + U8 Reserved01Bits0to6 :7; +#else /* little endian */ + U8 Reserved01Bits0to6 :7; /* 0x01 */ + U8 CommandBit :1; +#endif + U8 Command; /* 0x02 */ + U8 Features; /* 0x03 */ + U8 SectorNumber; /* 0x04 */ + U8 CylLow; /* 0x05 */ + U8 CylHigh; /* 0x06 */ + U8 DeviceHead; /* 0x07 */ + U8 SectorNumberExp; /* 0x08 */ + U8 CylLowExp; /* 0x09 */ + U8 CylHighExp; /* 0x0A */ + U8 FeaturesExp; /* 0x0B */ + U8 SectorCount; /* 0x0C */ + U8 SectorCountExp; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Control; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_HOST_TO_DEVICE_FIS_CHS, *PTR_REGISTER_HOST_TO_DEVICE_FIS_CHS; + +/* + * SATA Register - Host To Device FIS for LBA 28-bit addressing + */ +typedef struct _REGISTER_HOST_TO_DEVICE_FIS_LBA28 +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 CommandBit :1; /* 0x01 */ + U8 Reserved01Bits0to6 :7; +#else /* little endian */ + U8 Reserved01Bits0to6 :7; /* 0x01 */ + U8 CommandBit :1; +#endif + U8 Command; /* 0x02 */ + U8 Features; /* 0x03 */ + U8 LBALow_0_7; /* 0x04 */ + U8 LBAMid_8_15; /* 0x05 */ + U8 LBAHigh_16_23; /* 0x06 */ + U8 DeviceAndLBA24_27; /* 0x07 */ + U8 SectorNumberExp; /* 0x08 */ + U8 CylLowExp; /* 0x09 */ + U8 CylHighExp; /* 0x0A */ + U8 FeaturesExp; /* 0x0B */ + U8 SectorCount; /* 0x0C */ + U8 SectorCountExp; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Control; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_HOST_TO_DEVICE_FIS_LBA28, *PTR_REGISTER_HOST_TO_DEVICE_FIS_LBA28; + +/* + * SATA Register - Host To Device FIS for LBA 48-bit addressing + */ +typedef struct _REGISTER_HOST_TO_DEVICE_FIS_LBA48 +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 CommandBit :1; /* 0x01 */ + U8 Reserved01Bits0to6 :7; +#else /* little endian */ + U8 Reserved01Bits0to6 :7; /* 0x01 */ + U8 CommandBit :1; +#endif + U8 Command; /* 0x02 */ + U8 Features; /* 0x03 */ + U8 LBALow_0_7; /* 0x04 */ + U8 LBAMid_8_15; /* 0x05 */ + U8 LBAHigh_16_23; /* 0x06 */ + U8 Device; /* 0x07 */ + U8 LBALowExp_24_31; /* 0x08 */ + U8 LBAMidExp_32_39; /* 0x09 */ + U8 LBAHighExp_40_47; /* 0x0A */ + U8 FeaturesExp; /* 0x0B */ + U8 SectorCount0_7; /* 0x0C */ + U8 SectorCountExp8_15; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Control; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_HOST_TO_DEVICE_FIS_LBA48, *PTR_REGISTER_HOST_TO_DEVICE_FIS_LBA48; + +/* + * SATA Register - Host To Device FIS for Packet (ATAPI) Commands + */ +typedef struct REGISTER_HOST_TO_DEVICE_FIS_PACKET +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 CommandBit :1; /* 0x01 */ + U8 Reserved01Bits0to6 :7; +#else /* little endian */ + U8 Reserved01Bits0to6 :7; /* 0x01 */ + U8 CommandBit :1; +#endif + U8 Command; /* 0x02 */ + U8 Features; /* 0x03 */ + U8 LBALow_0_7; /* 0x04 */ + U8 ByteCountLow; /* 0x05 */ + U8 ByteCountHigh; /* 0x06 */ + U8 DeviceSelect; /* 0x07 */ + U8 LBALowExp_24_31; /* 0x08 */ + U8 LBAMidExp_32_39; /* 0x09 */ + U8 LBAHighExp_40_47; /* 0x0A */ + U8 FeaturesExp; /* 0x0B */ + U8 SectorCount0_7; /* 0x0C */ + U8 SectorCountExp8_15; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Control; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_HOST_TO_DEVICE_FIS_PACKET, *PTR_REGISTER_HOST_TO_DEVICE_FIS_PACKET; + +/* + * SATA Register - Host To Device FIS + */ +typedef union _REGISTER_HOST_TO_DEVICE_FIS +{ + REGISTER_HOST_TO_DEVICE_FIS_CHS Chs; + REGISTER_HOST_TO_DEVICE_FIS_LBA28 Lba28; + REGISTER_HOST_TO_DEVICE_FIS_LBA48 Lba48; + REGISTER_HOST_TO_DEVICE_FIS_PACKET Packet; +} REGISTER_HOST_TO_DEVICE_FIS, *PTR_REGISTER_HOST_TO_DEVICE_FIS; + + +/* + * SATA Register - Device To Host FIS for Chs addressing + */ +typedef struct _REGISTER_DEVICE_TO_HOST_FIS_CHS +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bit7 :1; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bits0to5 :6; +#else /* little endian */ + U8 Reserved01Bits0to5 :6; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bit7 :1; +#endif + U8 Status; /* 0x02 */ + U8 Error; /* 0x03 */ + U8 SectorNumber; /* 0x04 */ + U8 CylLow; /* 0x05 */ + U8 CylHigh; /* 0x06 */ + U8 DeviceHead; /* 0x07 */ + U8 SectorNumberExp; /* 0x08 */ + U8 CylLowExp; /* 0x09 */ + U8 CylHighExp; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U8 SectorCount; /* 0x0C */ + U8 SectorCountExp; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Reseved0F; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_DEVICE_TO_HOST_FIS_CHS, *PTR_REGISTER_DEVICE_TO_HOST_FIS_CHS; + +/* + * SATA Register - Device To Host FIS for LBA 28-bit + */ +typedef struct _REGISTER_DEVICE_TO_HOST_FIS_LBA28 +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bit7 :1; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bits0to5 :6; +#else /* little endian */ + U8 Reserved01Bits0to5 :6; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bit7 :1; +#endif + U8 Status; /* 0x02 */ + U8 Error; /* 0x03 */ + U8 LBALow_0_7; /* 0x04 */ + U8 LBAMid_8_15; /* 0x05 */ + U8 LBAHigh_16_23; /* 0x06 */ + U8 DeviceAndLBA24_27; /* 0x07 */ + U8 SectorNumberExp; /* 0x08 */ + U8 CylLowExp; /* 0x09 */ + U8 CylHighExp; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U8 SectorCount; /* 0x0C */ + U8 SectorCountExp; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Reseved0F; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_DEVICE_TO_HOST_FIS_LBA28, *PTR_REGISTER_DEVICE_TO_HOST_FIS_LBA28; + +/* + * SATA Register - Device To Host FIS for LBA 48-bit + */ +typedef struct _REGISTER_DEVICE_TO_HOST_FIS_LBA48 +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bit7 :1; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bits0to5 :6; +#else /* little endian */ + U8 Reserved01Bits0to5 :6; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bit7 :1; +#endif + U8 Status; /* 0x02 */ + U8 Error; /* 0x03 */ + U8 LBALow_0_7; /* 0x04 */ + U8 LBAMid_8_15; /* 0x05 */ + U8 LBAHigh_16_23; /* 0x06 */ + U8 Device; /* 0x07 */ + U8 LBALowExp_24_31; /* 0x08 */ + U8 LBAMidExp_32_39; /* 0x09 */ + U8 LBAHighExp_40_47; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U8 SectorCount0_7; /* 0x0C */ + U8 SectorCountExp8_15; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Reseved0F; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_DEVICE_TO_HOST_FIS_LBA48, *PTR_REGISTER_DEVICE_TO_HOST_FIS_LBA48; + +/* + * SATA Register - Device To Host FIS for Packet (ATAPI) Commands + */ +typedef struct _REGISTER_DEVICE_TO_HOST_FIS_PACKET +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bit7 :1; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bits0to5 :6; +#else /* little endian */ + U8 Reserved01Bits0to5 :6; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bit7 :1; +#endif + U8 AtapiStatus; /* 0x02 */ + U8 Error; /* 0x03 */ + U8 LBALow_0_7; /* 0x04 */ + U8 ByteCountLow; /* 0x05 */ + U8 ByteCountHigh; /* 0x06 */ + U8 DeviceSelect; /* 0x07 */ + U8 LBALowExp_24_31; /* 0x08 */ + U8 LBAMidExp_32_39; /* 0x09 */ + U8 LBAHighExp_40_47; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U8 InterruptReason; /* 0x0C */ + U8 SectorCountExp8_15; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 Reseved0F; /* 0x0F */ + U32 Reserved10to14; /* 0x10 */ +} REGISTER_DEVICE_TO_HOST_FIS_PACKET, *PTR_REGISTER_DEVICE_TO_HOST_FIS_PACKET; + +/* + * SATA Register - Device To Host FIS + */ +typedef union _REGISTER_DEVICE_TO_HOST_FIS +{ + REGISTER_DEVICE_TO_HOST_FIS_CHS Chs; + REGISTER_DEVICE_TO_HOST_FIS_LBA28 Lba28; + REGISTER_DEVICE_TO_HOST_FIS_LBA48 Lba48; + REGISTER_DEVICE_TO_HOST_FIS_PACKET Packet; +} REGISTER_DEVICE_TO_HOST_FIS, *PTR_REGISTER_DEVICE_TO_HOST_FIS; + +/* + * SATA Set Device Bits - Device To Host FIS + */ +typedef struct _SET_DEVICE_BITS_DEVICE_TO_HOST_FIS +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Notification :1; /* 0x01 */ + U8 Interrupt :1; + U8 Reserved01Bits0to5 :6; + U8 Reserved02Bit7 :1; /* 0x02 */ + U8 StatusHi :3; + U8 Reserved02Bit3 :1; + U8 StatusLo :3; +#else /* little endian */ + U8 Reserved01Bits0to5 :6; /* 0x01 */ + U8 Interrupt :1; + U8 Notification :1; + U8 StatusLo :3; /* 0x02 */ + U8 Reserved02Bit3 :1; + U8 StatusHi :3; + U8 Reserved02Bit7 :1; +#endif + U8 Error; /* 0x03 */ + U32 SActive; /* 0x04 */ +} SET_DEVICE_BITS_DEVICE_TO_HOST_FIS, *PTR_SET_DEVICE_BITS_DEVICE_TO_HOST_FIS; + +/* + * SATA DMA Activate - Device To Host FIS + */ +typedef struct _DMA_ACTIVATE_DEVICE_TO_HOST_FIS +{ + U8 FISType; /* 0x00 */ + U8 Reserved01; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 Reserved03; /* 0x03 */ +} DMA_ACTIVATE_DEVICE_TO_HOST_FIS, *PTR_DMA_ACTIVATE_DEVICE_TO_HOST_FIS; + +/* + * SATA DMA Setup (Bi-directional) FIS + */ +typedef struct _DMA_SETUP_FIS +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bit7 :1; /* 0x01 */ + U8 Interrupt :1; + U8 Direction :1; + U8 Reserved01Bits0to4 :5; +#else /* little endian */ + U8 Reserved01Bits0to4 :5; /* 0x01 */ + U8 Direction :1; + U8 Interrupt :1; + U8 Reserved01Bit7 :1; +#endif + U8 Reserved02; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 DMABufferIdentifierLow; /* 0x04 */ + U32 DMABufferIdentifierHigh; /* 0x08 */ + U32 Reserved0Cto0F; /* 0x0C */ + U32 DMABufferOffset; /* 0x10 */ + U32 DMATransferCount; /* 0x14 */ + U32 Reserved18; /* 0x18 */ +} DMA_SETUP_FIS, *PTR_DMA_SETUP_FIS; + +/* + * SATA BIST Activate FIS - I don't believe we suppor this ? + */ + +/* + * SATA PIO Setup - Device To Host FIS + */ +typedef struct _PIO_SETUP_DEVICE_TO_HOST_FIS +{ + U8 FISType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bit7 :1; /* 0x01 */ + U8 Interrupt :1; + U8 Direction :1; + U8 Reserved01Bits0to4 :5; +#else /* little endian */ + U8 Reserved01Bits0to4 :5; /* 0x01 */ + U8 Direction :1; + U8 Interrupt :1; + U8 Reserved01Bit7 :1; +#endif + U8 Status; /* 0x02 */ + U8 Error; /* 0x03 */ + U8 SectorNumber; /* 0x04 */ + U8 CylLow; /* 0x05 */ + U8 CylHigh; /* 0x06 */ + U8 DeviceHead; /* 0x07 */ + U8 SectorNumberExp; /* 0x08 */ + U8 CylLowExp; /* 0x09 */ + U8 CylHighExp; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U8 SectorCount; /* 0x0C */ + U8 SectorCountExp; /* 0x0D */ + U8 Reserved0E; /* 0x0E */ + U8 E_Status; /* 0x0F */ + U16 TransferCount; /* 0x10 */ + U16 Reserved12to13; /* 0x12 */ +} PIO_SETUP_DEVICE_TO_HOST_FIS, *PTR_PIO_SETUP_DEVICE_TO_HOST_FIS; + +/* PIO Setup Direction Bit */ +#define PIO_SETUP_DIRECTION_HOST_TO_DEVICE (0) +#define PIO_SETUP_DIRECTION_DEVICE_TO_HOST (1) + +/* + * SATA Data - (Bi-directional) FIS + */ +typedef struct _DATA_FIS +{ + U8 FISType; /* 0x00 */ + U8 Reserved01; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 Data[1]; /* 0x04 */ + /* Note the data is variable in length */ +} DATA_FIS, *PTR_DATA_FIS; + +/* This is a union of all the SATA FIS's */ +typedef union _PL_SATA_FIS_UNION +{ + REGISTER_HOST_TO_DEVICE_FIS HtoDFIS; + REGISTER_DEVICE_TO_HOST_FIS DtoHFIS; + SET_DEVICE_BITS_DEVICE_TO_HOST_FIS SetDeviceDtoHFIS; + DMA_ACTIVATE_DEVICE_TO_HOST_FIS DmaActivateDtoHFIS; + DMA_SETUP_FIS DmaSetupFIS; + PIO_SETUP_DEVICE_TO_HOST_FIS PioSetupDtoHFIS; + DATA_FIS DataFIS; +} PL_SATA_FIS_UNION, * PTR_PL_SATA_FIS_UNION; + + +typedef struct _READ_LOG_EXT_PAGE_10_DATA +{ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 NQ :1; /* 0x00 */ + U8 Reserved00Bit5to6 :2; + U8 Tag :5; +#else /* little endian */ + U8 Tag :5; /* 0x00 */ + U8 Reserved00Bit5to6 :2; + U8 NQ :1; +#endif + U8 Reserved01; /* 0x01 */ + U8 Status; /* 0x02 */ + U8 Error; /* 0x03 */ + U8 SectorNumber; /* 0x04 */ + U8 CylinderLow; /* 0x05 */ + U8 CylinderHigh; /* 0x06 */ + U8 DevHead; /* 0x07 */ + U8 SectorNumberExp; /* 0x08 */ + U8 CylinderLowExp; /* 0x09 */ + U8 CylinderHighExp; /* 0x0A */ + U8 Reserved11; /* 0x0B */ + U8 SectorCount; /* 0x0C */ + U8 SectorCountExp; /* 0x0D */ + U8 Reserved14to511[1]; /* 0x0E */ +} READ_LOG_EXT_PAGE_10_DATA, *PTR_READ_LOG_EXT_PAGE_10_DATA; + + +#endif /* End of #if ATA_H_SOURCE */ + diff --git a/source/inc/devioctl.h b/source/inc/devioctl.h new file mode 100755 index 0000000..b879826 --- /dev/null +++ b/source/inc/devioctl.h @@ -0,0 +1,145 @@ +/*++ BUILD Version: 0004 // Increment this if a change has global effects + +Copyright (c) 1992-1999 Microsoft Corporation + +Module Name: + + devioctl.h + +Abstract: + + This module contains + +Author: + + Andre Vachon (andreva) 21-Feb-1992 + + +Revision History: + + +--*/ + +// begin_winioctl + +#ifndef _DEVIOCTL_ +#define _DEVIOCTL_ + +// begin_ntddk begin_wdm begin_nthal begin_ntifs +// +// Define the various device type values. Note that values used by Microsoft +// Corporation are in the range 0-32767, and 32768-65535 are reserved for use +// by customers. +// + +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A + +// +// Macro definition for defining IOCTL and FSCTL function control codes. Note +// that function codes 0-2047 are reserved for Microsoft Corporation, and +// 2048-4095 are reserved for customers. +// + +#define CTL_CODE( DeviceType, Function, Method, Access ) ( \ + ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ +) + +// +// Macro to extract device type out of the device io control code +// +#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0xffff0000)) >> 16) + +// +// Define the method codes for how buffers are passed for I/O and FS controls +// + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 + +// +// Define the access check value for any access +// +// +// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in +// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these +// constants *MUST* always be in sync. +// +// +// FILE_SPECIAL_ACCESS is checked by the NT I/O system the same as FILE_ANY_ACCESS. +// The file systems, however, may add additional access checks for I/O and FS controls +// that use this value. +// + + +#define FILE_ANY_ACCESS 0 +#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) +#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe +#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe + +// end_ntddk end_wdm end_nthal end_ntifs + +#endif // _DEVIOCTL_ + +// end_winioctl + diff --git a/source/inc/dmi_ioctl.h b/source/inc/dmi_ioctl.h new file mode 100755 index 0000000..f897cf6 --- /dev/null +++ b/source/inc/dmi_ioctl.h @@ -0,0 +1,443 @@ +#ifndef _DMI_IOCTL_H_ +#define _DMI_IOCTL_H_ + +/*************************************************************************** + * * + * Copyright 1998 LSI Logic Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Logic. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Logic Corporation. * + * * + ***************************************************************************/ + +/* Name: DMI_IOCTL.H + * Title: Solaris O/S Character mode IOCTL definitions + * Programmer: Russell A. Johnson + * Creation Date: May 26, 1998 + * + * Version History + * --------------- + * + * Date Who? Description + * -------- ---- ------------------------------------------------------- +#BeginRevision + * 05/17/00 RAJ Added bus mode support for fibre channel devices. + * 12/19/99 RAJ Added new flags for scsi-3 options. + * 11/09/98 RAJ Changed copyright notice to LSI Logic. +#EndRevision + * Version 4.02.01 + * 07/22/98 RAJ Added some more data to the DMI data structure. This + * includes the PCI bus number, device number, and function + * number. Also added a major version number for the data + * structure. That version number indicates major changes. + * When it changes then the entire data format may have + * changed. See the comments below for more details. +#EndRevision + * Version 4.00.04 + * 05/26/98 RAJ Initial version. +#EndRevision + * +#BeginDescription + * + * This file contains the Solaris 2.6 character mode driver interface + * definitions needed in order to provide IOCTL's for our SCSI HBA driver. + * +#EndDescription + * + *------------------------------------------------------------------------- + */ + +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * HEADER FILE DEPENDANCIES + *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * This file is dependent on the following files: + * + * SALIOS.H - type defintions UINT8, UINT16, UINT32, UINT64 + */ + +/* The following data is for our character mode ioctl interface. Per the + * Solaris standard mechanism, we define SYMIOCTL as a unique number in the + * upper 8 bits and a command value in the lower 8 bits. + */ +#define SYMIOCTL ('H' << 8) +#define SYMIOCTL_GET_DMI_DATA (SYMIOCTL | 1) +#define SYMIOCTL_GET_TIMERS (SYMIOCTL | 2) +#define SYMIOCTL_UPDATE_FLASH (SYMIOCTL | 3) +#define SYMIOCTL_RESET_ADAPTER (SYMIOCTL | 4) +#define SYMIOCTL_GET_PROPERTY (SYMIOCTL | 5) +#define SYMIOCTL_PASS_THRU (SYMIOCTL | 6) +#define SYMIOCTL_REG_ACCESS (SYMIOCTL | 7) +#define SYMIOCTL_EVENT_QUERY (SYMIOCTL | 8) +#define SYMIOCTL_EVENT_ENABLE (SYMIOCTL | 9) +#define SYMIOCTL_EVENT_REPORT (SYMIOCTL | 10) +#define SYMIOCTL_GET_PCI_INFO (SYMIOCTL | 11) +#define SYMIOCTL_BTDH_MAPPING (SYMIOCTL | 12) +#define SYMIOCTL_DIAG_ACTION (SYMIOCTL | 13) +#define SYMIOCTL_PASS_THRU_TIMEOUT (SYMIOCTL | 14) + +/* The following are our ioctl() return status values. If everything went + * well, we return good status. If the buffer length sent to us is too short + * we return a status to tell the user. + */ +#define SYMIOCTL_STATUS_GOOD 0 +#define SYMIOCTL_STATUS_LEN_TOO_SHORT 1 + +/* The data structures defined in this file are marked with a data structure + * length and data structure version. The length value is the first value in + * the structure and is used to make sure the buffer is large enough for + * communication between the driver and the application. The version number is + * a major version number. If the data structure changes and only has a new + * element appended, then the version number will remain the same but the + * length will increase. If the data structure changes in any other way, such + * as re-arranging all of its elements, then the version number will increase. + * + * The following macro defines the current version number of the data + * structure. + */ +#define SYMHI_DMI_DATA_VERSION 1 + +/* The following is the SYMIOCTL_GET_DMI_DATA data structure. This data + * structure is setup so that we hopefully are properly aligned for both 32-bit + * and 64-bit mode applications. + * + * StructureLength - This value is the amount of data the caller has allocated + * for the structure when they first call us. After we have filled in the + * structure, this indicates the length our data structure is. + * + * MajorVersion - This value is used by the driver to tell the application what + * version of the data structure is being provided. It only changes if the + * data ordering of the data below is changed. + * + * MinSyncPeriodNs - This is the minimum period in nano-seconds (ns) that we + * will negotiate for on this adapter. The smaller value the faster + * synchronous speed except if this value is zero then asynchronous transfers + * is all we support. + * + * MaxWidth - This value indicates the maximum width this bus can be used as. + * If the PciDeviceId indicates a width capability of 16 devices and this is + * set to 8 devices then the PCI Subsystem ID value has limited our use of this + * adapter to 8 devices. This value also indicates the number of valid + * elements in the DevSpeed[] and DevWidth[] array's. + * + * HostScsiId - This is the host adapter SCSI ID being used by this adapter. + * + * PciBusNumber - The number of the PCI bus this adapter is on. If for some + * reason the driver is unable to determine the bus number, device number, or + * function number, these values will be set to 0xFF. + * + * PciDeviceNumber - The PCI device number for this device. + * + * PciFunctionNumber - The PCI function number for this device. + * + * PciDeviceId - This is the PCI device ID from PCI configuration space for + * this adapter. + * + * PciRevision - This is the PCI revision value from PCI configuration space + * for this adapter. + * + * HwBusMode - This value indicates the mode the bus is currently in. See the + * SYM_HW_BUS_MODE_xx macros. + * + * DevSpeed - This array is indexed by the target ID and indicates the + * currently negotiated synchronous speed in nano-seconds (ns). A value of + * zero ns indicates asynchronous mode. + * + * DevWidth - This array is indexed by the target ID and indicates the + * currently negotiated width in bits. A value of 8 indicates narrow mode, a + * value of 16 indicates wide. + * + * DriverVersion - This is an ascii null-terminated string indicating the + * version of this driver. + * + * DevFlags - This array is indexed by the target ID and indicates the + * currently negotiated options such as DT and async protection capabilities. + */ +#pragma pack(1) +typedef struct _SYMHI_DMI_DATA +{ /* Offset */ + UINT32 StructureLength; /* 0x00..0x03 */ + UINT32 Reserved1; /* 0x04..0x07 */ + UINT32 MajorVersion; /* 0x08..0x0B */ + UINT16 MinSyncPeriodNs; /* 0x0C..0x0D */ + UINT8 MaxWidth; /* 0x0E */ + UINT8 HostScsiId; /* 0x0F */ + UINT8 PciBusNumber; /* 0x10 */ + UINT8 PciDeviceNumber; /* 0x11 */ + UINT8 PciFunctionNumber; /* 0x12 */ + UINT8 Reserved2; /* 0x13 */ + UINT16 PciDeviceId; /* 0x14..0x15 */ + UINT8 PciRevision; /* 0x16 */ + UINT8 HwBusMode; /* 0x17 */ + UINT8 Reserved3[8]; /* 0x18..0x1F */ +#if defined TARGET_MPTx + /* MPI adapters can have many more devices per SCSI bus than non-MPI + * adapters. + */ + UINT16 DevSpeed[256]; /* 0x20..0x21F */ + UINT8 DevWidth[256]; /* 0x220..0x31F */ + UINT32 DevFlags[256]; /* 0x320..0x71F */ + char DriverVersion[80]; /* 0x720..0x76F */ +#elif defined TARGET_HIHW || defined TARGET_SRHW + UINT16 DevSpeed[16]; /* 0x20..0x3F */ + UINT8 DevWidth[16]; /* 0x40..0x4F */ + char DriverVersion[80]; /* 0x50..0x9F */ + UINT32 DevFlags[16]; /* 0xA0..0xDF */ +#else +#error "Unknown hardware type" +#endif /* defined TARGET_xxx */ +} SYMHI_DMI_DATA, * PTR_SYMHI_DMI_DATA; +#pragma pack() + +/* The following are definitions for the value of HwBusMode in the + * SYMHI_DMI_DATA data structure. + * + * SYM_HW_BUS_MODE_UNKNOWN - The bus mode is not known yet + * SYM_HW_BUS_MODE_SINGLE - The bus is in single ended mode + * SYM_HW_BUS_MODE_HVD - The bus is in high voltage differential mode + * SYM_HW_BUS_MODE_LVD - The bus is in low voltage differential mode + * SYM_HW_BUS_MODE_FC - The bus is a fibre channel bus + */ +#define SYM_HW_BUS_MODE_UNKNOWN (0x00) +#define SYM_HW_BUS_MODE_SINGLE (0x01) +#define SYM_HW_BUS_MODE_HVD (0x02) +#define SYM_HW_BUS_MODE_LVD (0x03) +#define SYM_HW_BUS_MODE_FC (0x04) + +/* The following are definitions for the DevFlags[] array. Each bit is set + * only when the feature is currently in use for the given device. + * + * SYM_DEV_DT - Set when Dual Transfers (ie. dual edge clock in use) enabled + * SYM_DEV_ASYNC_PROT - Set when asynchronous phase protection is enabled + */ +#define SYM_DEV_DT (0x00000001) +#define SYM_DEV_ASYNC_PROT (0x00000002) + +#pragma pack(1) +typedef struct _SYM_UPDATE_FLASH +{ + UINT64 PtrBuffer; + UINT32 ImageChecksum; + UINT32 ImageOffset; + UINT32 ImageSize; + UINT32 ImageType; +} SYM_UPDATE_FLASH, * PTR_SYM_UPDATE_FLASH; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_GET_PROPERTY +{ + UINT64 PtrName; + UINT64 PtrBuffer; + UINT32 NameLen; + UINT32 BufferLen; + UINT32 PropertyLen; +} SYM_GET_PROPERTY, * PTR_SYM_GET_PROPERTY; +#pragma pack() + +#define SYM_PASS_THRU_NONE 0 +#define SYM_PASS_THRU_READ 1 +#define SYM_PASS_THRU_WRITE 2 +#define SYM_PASS_THRU_BOTH 3 + +#pragma pack(1) +typedef struct _SYM_PASS_THRU +{ + UINT64 PtrRequest; + UINT64 PtrReply; + UINT64 PtrData; + UINT32 RequestSize; + UINT32 ReplySize; + UINT32 DataSize; + UINT32 DataDirection; + UINT64 PtrDataOut; + UINT32 DataOutSize; +} SYM_PASS_THRU, * PTR_SYM_PASS_THRU; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_PASS_THRU_TIMEOUT +{ + UINT64 PtrRequest; + UINT64 PtrReply; + UINT64 PtrData; + UINT32 RequestSize; + UINT32 ReplySize; + UINT32 DataSize; + UINT32 DataDirection; + UINT64 PtrDataOut; + UINT32 DataOutSize; + UINT32 Timeout; +} SYM_PASS_THRU_TIMEOUT, * PTR_SYM_PASS_THRU_TIMEOUT; +#pragma pack() + +#define REG_IO_READ 1 +#define REG_IO_WRITE 2 +#define REG_MEM_READ 3 +#define REG_MEM_WRITE 4 + +#pragma pack(1) +typedef struct _SYM_REG_ACCESS +{ + UINT32 Command; + UINT32 RegOffset; + UINT32 RegData; +} SYM_REG_ACCESS, * PTR_SYM_REG_ACCESS; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_EVENT_QUERY +{ + UINT32 Entries; + UINT32 Types; +} SYM_EVENT_QUERY, * PTR_SYM_EVENT_QUERY; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_EVENT_ENABLE +{ + UINT32 Types; +} SYM_EVENT_ENABLE, * PTR_SYM_EVENT_ENABLE; +#pragma pack() + +#if defined TARGET_MPT2 +#define EVENT_ENTRY_NUM 48 +#else +#define EVENT_ENTRY_NUM 2 +#endif + +#pragma pack(1) +typedef struct _SYM_EVENT_ENTRY +{ + UINT32 Type; + UINT32 Number; + UINT32 Data[EVENT_ENTRY_NUM]; +} SYM_EVENT_ENTRY, * PTR_SYM_EVENT_ENTRY; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_EVENT_REPORT +{ + UINT32 Size; + SYM_EVENT_ENTRY Events[1]; +} SYM_EVENT_REPORT, * PTR_SYM_EVENT_REPORT; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_PCI_INFO +{ + UINT32 BusNumber; + UINT8 DeviceNumber; + UINT8 FunctionNumber; + UINT16 InterruptVector; + UINT8 PciHeader[256]; +} SYM_PCI_INFO, * PTR_SYM_PCI_INFO; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_BTDH_MAPPING +{ + UINT16 TargetID; + UINT16 Bus; + UINT16 DevHandle; + UINT16 Reserved; +} SYM_BTDH_MAPPING, * PTR_SYM_BTDH_MAPPING; +#pragma pack() + +#pragma pack(1) +typedef struct _SYM_DIAG_ACTION +{ + UINT32 Action; + UINT32 Length; + UINT64 PtrDiagAction; + UINT32 ReturnCode; +} SYM_DIAG_ACTION, * PTR_SYM_DIAG_ACTION; +#pragma pack() + +#define FW_DIAGNOSTIC_BUFFER_COUNT (3) +#define FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) + +#define MPI_FW_DIAG_NEW (0x806E6577) + +#define MPI_FW_DIAG_TYPE_REGISTER (0x00000001) +#define MPI_FW_DIAG_TYPE_UNREGISTER (0x00000002) +#define MPI_FW_DIAG_TYPE_QUERY (0x00000003) +#define MPI_FW_DIAG_TYPE_READ_BUFFER (0x00000004) +#define MPI_FW_DIAG_TYPE_RELEASE (0x00000005) + +#define MPI_FW_DIAG_INVALID_UID (0x00000000) + +#define MPI_FW_DIAG_ERROR_SUCCESS (0x00000000) +#define MPI_FW_DIAG_ERROR_FAILURE (0x00000001) +#define MPI_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) +#define MPI_FW_DIAG_ERROR_POST_FAILED (0x00000010) +#define MPI_FW_DIAG_ERROR_INVALID_UID (0x00000011) +#define MPI_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) +#define MPI_FW_DIAG_ERROR_NO_BUFFER (0x00000013) +#define MPI_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) + +#pragma pack(1) +typedef struct _MPI_FW_DIAG_REGISTER +{ + UINT8 TraceLevel; + UINT8 BufferType; + UINT16 Flags; + UINT32 ExtendedType; + UINT32 ProductSpecific[4]; + UINT32 RequestedBufferSize; + UINT32 UniqueId; +} MPI_FW_DIAG_REGISTER, * PTR_MPI_FW_DIAG_REGISTER; +#pragma pack() + +#pragma pack(1) +typedef struct _MPI_FW_DIAG_UNREGISTER +{ + UINT32 UniqueId; +} MPI_FW_DIAG_UNREGISTER, * PTR_MPI_FW_DIAG_UNREGISTER; +#pragma pack() + +#define MPI_FW_DIAG_FLAG_APP_OWNED (0x0001) +#define MPI_FW_DIAG_FLAG_BUFFER_VALID (0x0002) +#define MPI_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) + +#pragma pack(1) +typedef struct _MPI_FW_DIAG_QUERY +{ + UINT8 TraceLevel; + UINT8 BufferType; + UINT16 Flags; + UINT32 ExtendedType; + UINT32 ProductSpecific[4]; + UINT32 TotalBufferSize; + UINT32 DriverAddedBufferSize; + UINT32 UniqueId; +} MPI_FW_DIAG_QUERY, * PTR_MPI_FW_DIAG_QUERY; +#pragma pack() + +#pragma pack(1) +typedef struct _MPI_FW_DIAG_RELEASE +{ + UINT32 UniqueId; +} MPI_FW_DIAG_RELEASE, * PTR_MPI_FW_DIAG_RELEASE; +#pragma pack() + +#define MPI_FW_DIAG_FLAG_REREGISTER (0x0001) +#define MPI_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) + +#pragma pack(1) +typedef struct _MPI_FW_DIAG_READ_BUFFER +{ + UINT8 Status; + UINT8 Reserved; + UINT16 Flags; + UINT32 StartingOffset; + UINT32 BytesToRead; + UINT32 UniqueId; + UINT32 DataBuffer[1]; +} MPI_FW_DIAG_READ_BUFFER, * PTR_MPI_FW_DIAG_READ_BUFFER; +#pragma pack() + +#endif diff --git a/source/inc/getopt.h b/source/inc/getopt.h new file mode 100755 index 0000000..0d3c6e2 --- /dev/null +++ b/source/inc/getopt.h @@ -0,0 +1,32 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ + +#if !EFI +#include +#include +#include +#endif + +#ifndef _GETOPT_ +#define _GETOPT_ + +int getopt(int argc, char *argv[], char *optstring); + +extern char *optarg; /* returned arg to go with this option */ +extern int optind; /* index to next argv element to process */ +extern int opterr; /* should error messages be printed? */ +extern int optopt; + +#define BADCH ('?') + +#endif /* _GETOPT */ diff --git a/source/inc/helper.h b/source/inc/helper.h new file mode 100755 index 0000000..ae6043d --- /dev/null +++ b/source/inc/helper.h @@ -0,0 +1,146 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ + +#if EFIEBC +#define EFI_SPECIFICATION_VERSION 0x0001000A +#define TIANO_RELEASE_VERSION 0x00080006 +#include "efibind.h" +#include "efitypes.h" +#include "eficommon.h" +#include "efiapi.h" +#include "efierror.h" +#include "efistdarg.h" +#include "efishelllib.h" +#define DevicePathToStr LibDevicePathToStr +#define LibFileInfo LibGetFileInfo +#define GenericFileInfo gEfiFileInfoGuid +#define InitializeShellApplication LibInitializeShellApplication +#define LoadedImageProtocol gEfiLoadedImageProtocolGuid +#define EFIERR_OEM(x) EFIERR(x+1000) +#define EFI_LOADED_IMAGE EFI_LOADED_IMAGE_PROTOCOL +#define EFI_FILE_IO_INTERFACE EFI_SIMPLE_FILE_SYSTEM_PROTOCOL +#define SIMPLE_FILE_SYSTEM_PROTOCOL EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID +#define EVT_TIMER EFI_EVENT_TIMER +#define va_start VA_START +#define va_arg VA_ARG +#define va_end VA_END +#define va_list VA_LIST +#else +#include "efi.h" +#include "efilib.h" +#include "efistdarg.h" +#include "shell.h" +#endif +#if EFI32 +typedef unsigned int size_t; +#endif +// ctype.h +int isalnum(int c); +int isalpha(int c); +int isascii(int c); +int isblank(int c); +int iscntrl(int c); +int isdigit(int c); +int isgraph(int c); +int islower(int c); +int isprint(int c); +int ispunct(int c); +int isspace(int c); +int isupper(int c); +int isxdigit(int c); +int toupper(int c); +int tolower(int c); +// errno.h +extern int errno; +#define EFAULT 14 +#define ENODEV 19 +#define EINVAL 22 + +// fcntl.h +#define O_RDONLY 00 +#define O_WRONLY 01 +#define O_RDWR 02 +#define O_CREAT 0100 /* not fcntl */ +#define O_TRUNC 01000 /* not fcntl */ +// sttdef.h +#define offsetof(s, m) (size_t)(&(((s *)0)->m)) +// stdio.h +#define EOF 0 +typedef void * FILE; +#define stdin (void *)1 +#define stdout (void *)2 +#define stderr (void *)3 +int fgetc(FILE *stream); +char *fgets(char *s, int size, FILE *stream); +int getc(FILE *stream); +int getchar(void); +char *gets(char *s); +int ungetc(int c, FILE *stream); +int vsprintf(char *s, const char *format, va_list args); +int printf(const char *format, ...); +int fprintf(FILE *stream, const char *format, ...); +int sprintf(char *str, const char *format, ...); +int scanf(const char *format, ...); +int fscanf(FILE *stream, const char *format, ...); +int sscanf(const char *str, const char *format, ...); +FILE *fopen(const char *path, const char *mode); +int fclose(FILE *stream); +int fputs(const char *s, FILE *stream); +int fputc(int c, FILE *stream); +void perror(const char *s); +int fflush(FILE *stream); +// stdlib.h +void *malloc(size_t size); +void free(void *ptr); +void *realloc(void *ptr, size_t size); +void exit(int status); +int rand(void); +// string.h +void *memset(void *s, int c, size_t n); +void *memcpy(void *dest, const void *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); +char *strcpy(char *dest, const char *src); +char *strncpy(char *dest, const char *src, size_t n); +int strcmp(const char *s1, const char *s2); +int strncmp(const char *s1, const char *s2, size_t n); +size_t strlen(const char *s); +char *strcat(char *dest, const char *src); +char *strncat(char *dest, const char *src, size_t n); +char *strchr(const char *s, int c); +char *strrchr(const char *s, int c); +// strings.h +int strcasecmp(const char *s1, const char *s2); +int strncasecmp(const char *s1, const char *s2, size_t n); +void bzero(void *s, size_t n); +void bcopy(const void *src, void *dest, size_t n); +// sys/stat.h +typedef size_t off_t; +struct stat { + off_t st_size; /* total size, in bytes */ +}; +int stat(const char *file_name, struct stat *buf); +int fstat(int filedes, struct stat *buf); +// time.h +typedef unsigned long time_t; +time_t time(time_t *t); +char *ctime(const time_t *t); +void mdelay(int milliseconds); +void udelay(int microseconds); +// unistd.h +typedef int ssize_t; +typedef int mode_t; +unsigned int sleep(unsigned int seconds); +int open(const char *pathname, int flags, ...); +int close(int fd); +ssize_t read(int fd, void *buf, size_t count); +ssize_t write(int fd, const void *buf, size_t count); diff --git a/source/inc/mpt2sas_ctl.h b/source/inc/mpt2sas_ctl.h new file mode 100755 index 0000000..ba87fb4 --- /dev/null +++ b/source/inc/mpt2sas_ctl.h @@ -0,0 +1,398 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ + +#ifndef MPT2SAS_CTL_H_INCLUDED +#define MPT2SAS_CTL_H_INCLUDED + +#ifdef __KERNEL__ +#include +#endif + +/** + * NOTE + * FWDOWNLOAD - PR is let me know if we need to implement this + * DIAGBUFFER - PR said hold off + */ + +/** + * HACK - changeme (MPT_MINOR = 220 ) + */ +#ifndef MPT2SAS_MINOR +#define MPT2SAS_MINOR (MPT_MINOR + 1) +#endif +#define MPT2SAS_DEV_NAME "mpt2ctl" +#define MPT2_MAGIC_NUMBER 'L' +#define MPT2_IOCTL_DEFAULT_TIMEOUT (10) /* in seconds */ + +/** + * IOCTL opcodes + */ +#define MPT2IOCINFO _IOWR(MPT2_MAGIC_NUMBER, 17, \ + struct mpt2_ioctl_iocinfo) +#define MPT2COMMAND _IOWR(MPT2_MAGIC_NUMBER, 20, \ + struct mpt2_ioctl_command) +#ifdef CONFIG_COMPAT +#define MPT2COMMAND32 _IOWR(MPT2_MAGIC_NUMBER, 20, \ + struct mpt2_ioctl_command32) +#endif +#define MPT2EVENTQUERY _IOWR(MPT2_MAGIC_NUMBER, 21, \ + struct mpt2_ioctl_eventquery) +#define MPT2EVENTENABLE _IOWR(MPT2_MAGIC_NUMBER, 22, \ + struct mpt2_ioctl_eventenable) +#define MPT2EVENTREPORT _IOWR(MPT2_MAGIC_NUMBER, 23, \ + struct mpt2_ioctl_eventreport) +#define MPT2HARDRESET _IOWR(MPT2_MAGIC_NUMBER, 24, \ + struct mpt2_ioctl_diag_reset) +#define MPT2BTDHMAPPING _IOWR(MPT2_MAGIC_NUMBER, 31, \ + struct mpt2_ioctl_btdh_mapping) + +/* diag buffer support */ +#define MPT2DIAGREGISTER _IOWR(MPT2_MAGIC_NUMBER, 26, \ + struct mpt2_diag_register) +#define MPT2DIAGRELEASE _IOWR(MPT2_MAGIC_NUMBER, 27, \ + struct mpt2_diag_release) +#define MPT2DIAGUNREGISTER _IOWR(MPT2_MAGIC_NUMBER, 28, \ + struct mpt2_diag_unregister) +#define MPT2DIAGQUERY _IOWR(MPT2_MAGIC_NUMBER, 29, \ + struct mpt2_diag_query) +#define MPT2DIAGREADBUFFER _IOWR(MPT2_MAGIC_NUMBER, 30, \ + struct mpt2_diag_read_buffer) + +/** + * struct mpt2_ioctl_header - main header structure + * @ioc_number - IOC unit number + * @port_number - IOC port number + * @max_data_size - maximum number bytes to transfer on read + */ +struct mpt2_ioctl_header { + uint32_t ioc_number; + uint32_t port_number; + uint32_t max_data_size; +}; + +/** + * struct mpt2_ioctl_diag_reset - diagnostic reset + * @hdr - generic header + */ +struct mpt2_ioctl_diag_reset { + struct mpt2_ioctl_header hdr; +}; + + +/** + * struct mpt2_ioctl_pci_info - pci device info + * @device - pci device id + * @function - pci function id + * @bus - pci bus id + * @segment_id - pci segment id + */ +struct mpt2_ioctl_pci_info { + union { + struct { + uint32_t device:5; + uint32_t function:3; + uint32_t bus:24; + } bits; + uint32_t word; + } u; + uint32_t segment_id; +}; + + +#define MPT2_IOCTL_INTERFACE_SCSI (0x00) +#define MPT2_IOCTL_INTERFACE_FC (0x01) +#define MPT2_IOCTL_INTERFACE_FC_IP (0x02) +#define MPT2_IOCTL_INTERFACE_SAS (0x03) +#define MPT2_IOCTL_INTERFACE_SAS2 (0x04) +#define MPT2_IOCTL_VERSION_LENGTH (32) + +/** + * struct mpt2_ioctl_iocinfo - generic controller info + * @hdr - generic header + * @adapter_type - type of adapter (spi, fc, sas) + * @port_number - port number + * @pci_id - PCI Id + * @hw_rev - hardware revision + * @sub_system_device - PCI subsystem Device ID + * @sub_system_vendor - PCI subsystem Vendor ID + * @rsvd0 - reserved + * @firmware_version - firmware version + * @bios_version - BIOS version + * @driver_version - driver version - 32 ASCII characters + * @rsvd1 - reserved + * @scsi_id - scsi id of adapter 0 + * @rsvd2 - reserved + * @pci_information - pci info (2nd revision) + */ +struct mpt2_ioctl_iocinfo { + struct mpt2_ioctl_header hdr; + uint32_t adapter_type; + uint32_t port_number; + uint32_t pci_id; + uint32_t hw_rev; + uint32_t subsystem_device; + uint32_t subsystem_vendor; + uint32_t rsvd0; + uint32_t firmware_version; + uint32_t bios_version; + uint8_t driver_version[MPT2_IOCTL_VERSION_LENGTH]; + uint8_t rsvd1; + uint8_t scsi_id; + uint16_t rsvd2; + struct mpt2_ioctl_pci_info pci_information; +}; + + +/* number of event log entries */ +#define MPT2SAS_CTL_EVENT_LOG_SIZE (50) + +/** + * struct mpt2_ioctl_eventquery - query event count and type + * @hdr - generic header + * @event_entries - number of events returned by get_event_report + * @rsvd - reserved + * @event_types - type of events currently being captured + */ +struct mpt2_ioctl_eventquery { + struct mpt2_ioctl_header hdr; + uint16_t event_entries; + uint16_t rsvd; + uint32_t event_types[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS]; +}; + +/** + * struct mpt2_ioctl_eventenable - enable/disable event capturing + * @hdr - generic header + * @event_types - toggle off/on type of events to be captured + */ +struct mpt2_ioctl_eventenable { + struct mpt2_ioctl_header hdr; + uint32_t event_types[4]; +}; + +#define MPT2_EVENT_DATA_SIZE (192) +/** + * struct MPT2_IOCTL_EVENTS - + * @event - the event that was reported + * @context - unique value for each event assigned by driver + * @data - event data returned in fw reply message + */ +struct MPT2_IOCTL_EVENTS { + uint32_t event; + uint32_t context; + uint8_t data[MPT2_EVENT_DATA_SIZE]; +}; + +/** + * struct mpt2_ioctl_eventreport - returing event log + * @hdr - generic header + * @event_data - (see struct MPT2_IOCTL_EVENTS) + */ +struct mpt2_ioctl_eventreport { + struct mpt2_ioctl_header hdr; + struct MPT2_IOCTL_EVENTS event_data[1]; +}; + +/** + * struct mpt2_ioctl_command - generic mpt firmware passthru ioclt + * @hdr - generic header + * @timeout - command timeout in seconds. (if zero then use driver default + * value). + * @reply_frame_buf_ptr - reply location + * @data_in_buf_ptr - destination for read + * @data_out_buf_ptr - data source for write + * @sense_data_ptr - sense data location + * @max_reply_bytes - maximum number of reply bytes to be sent to app. + * @data_in_size - number bytes for data transfer in (read) + * @data_out_size - number bytes for data transfer out (write) + * @max_sense_bytes - maximum number of bytes for auto sense buffers + * @data_sge_offset - offset in words from the start of the request message to + * the first SGL + * @mf[1]; + */ +struct mpt2_ioctl_command { + struct mpt2_ioctl_header hdr; + uint32_t timeout; + void __user *reply_frame_buf_ptr; + void __user *data_in_buf_ptr; + void __user *data_out_buf_ptr; + void __user *sense_data_ptr; + uint32_t max_reply_bytes; + uint32_t data_in_size; + uint32_t data_out_size; + uint32_t max_sense_bytes; + uint32_t data_sge_offset; + uint8_t mf[1]; +}; + +#ifdef CONFIG_COMPAT +struct mpt2_ioctl_command32 { + struct mpt2_ioctl_header hdr; + uint32_t timeout; + uint32_t reply_frame_buf_ptr; + uint32_t data_in_buf_ptr; + uint32_t data_out_buf_ptr; + uint32_t sense_data_ptr; + uint32_t max_reply_bytes; + uint32_t data_in_size; + uint32_t data_out_size; + uint32_t max_sense_bytes; + uint32_t data_sge_offset; + uint8_t mf[1]; +}; +#endif + +/** + * struct mpt2_ioctl_btdh_mapping - mapping info + * @hdr - generic header + * @id - target device identification number + * @bus - SCSI bus number that the target device exists on + * @handle - device handle for the target device + * @rsvd - reserved + * + * To obtain a bus/id the application sets + * handle to valid handle, and bus/id to 0xFFFF. + * + * To obtain the device handle the application sets + * bus/id valid value, and the handle to 0xFFFF. + */ +struct mpt2_ioctl_btdh_mapping { + struct mpt2_ioctl_header hdr; + uint32_t id; + uint32_t bus; + uint16_t handle; + uint16_t rsvd; +}; + + +/* status bits for ioc->diag_buffer_status */ +#define MPT2_DIAG_BUFFER_IS_REGISTERED (0x01) +#define MPT2_DIAG_BUFFER_IS_RELEASED (0x02) +#define MPT2_DIAG_BUFFER_IS_DIAG_RESET (0x04) + +/* application flags for mpt2_diag_register, mpt2_diag_query */ +#define MPT2_APP_FLAGS_APP_OWNED (0x0001) +#define MPT2_APP_FLAGS_BUFFER_VALID (0x0002) +#define MPT2_APP_FLAGS_FW_BUFFER_ACCESS (0x0004) + +/* flags for mpt2_diag_read_buffer */ +#define MPT2_FLAGS_REREGISTER (0x0001) + +#define MPT2_PRODUCT_SPECIFIC_DWORDS 23 + +/** + * struct mpt2_diag_register - application register with driver + * @hdr - generic header + * @reserved - + * @buffer_type - specifies either TRACE or SNAPSHOT + * @application_flags - misc flags + * @diagnostic_flags - specifies flags affecting command processing + * @product_specific - product specific information + * @requested_buffer_size - buffers size in bytes + * @unique_id - tag specified by application that is used to signal ownership + * of the buffer. + * + * This will allow the driver to setup any required buffers that will be + * needed by firmware to communicate with the driver. + */ +struct mpt2_diag_register { + struct mpt2_ioctl_header hdr; + uint8_t reserved; + uint8_t buffer_type; + uint16_t application_flags; + uint32_t diagnostic_flags; + uint32_t product_specific[MPT2_PRODUCT_SPECIFIC_DWORDS]; + uint32_t requested_buffer_size; + uint32_t unique_id; +}; + +/** + * struct mpt2_diag_unregister - application unregister with driver + * @hdr - generic header + * @unique_id - tag uniquely identifies the buffer to be unregistered + * + * This will allow the driver to cleanup any memory allocated for diag + * messages and to free up any resources. + */ +struct mpt2_diag_unregister { + struct mpt2_ioctl_header hdr; + uint32_t unique_id; +}; + +/** + * struct mpt2_diag_query - query relevant info associated with diag buffers + * @hdr - generic header + * @reserved - + * @buffer_type - specifies either TRACE or SNAPSHOT + * @application_flags - misc flags + * @diagnostic_flags - specifies flags affecting command processing + * @product_specific - product specific information + * @total_buffer_size - diag buffer size in bytes + * @driver_added_buffer_size - size of extra space appended to end of buffer + * @unique_id - unique id associated with this buffer. + * + * The application will send only buffer_type and unique_id. Driver will + * inspect unique_id first, if valid, fill in all the info. If unique_id is + * 0x00, the driver will return info specified by Buffer Type. + */ +struct mpt2_diag_query { + struct mpt2_ioctl_header hdr; + uint8_t reserved; + uint8_t buffer_type; + uint16_t application_flags; + uint32_t diagnostic_flags; + uint32_t product_specific[MPT2_PRODUCT_SPECIFIC_DWORDS]; + uint32_t total_buffer_size; + uint32_t driver_added_buffer_size; + uint32_t unique_id; +}; + +/** + * struct mpt2_diag_release - request to send Diag Release Message to firmware + * @hdr - generic header + * @unique_id - tag uniquely identifies the buffer to be released + * + * This allows ownership of the specified buffer to returned to the driver, + * allowing an application to read the buffer without fear that firmware is + * overwritting information in the buffer. + */ +struct mpt2_diag_release { + struct mpt2_ioctl_header hdr; + uint32_t unique_id; +}; + +/** + * struct mpt2_diag_read_buffer - request for copy of the diag buffer + * @hdr - generic header + * @status - + * @reserved - + * @flags - misc flags + * @starting_offset - starting offset within drivers buffer where to start + * reading data at into the specified application buffer + * @bytes_to_read - number of bytes to copy from the drivers buffer into the + * application buffer starting at starting_offset. + * @unique_id - unique id associated with this buffer. + * @diagnostic_data - data payload + */ +struct mpt2_diag_read_buffer { + struct mpt2_ioctl_header hdr; + uint8_t status; + uint8_t reserved; + uint16_t flags; + uint32_t starting_offset; + uint32_t bytes_to_read; + uint32_t unique_id; + uint32_t diagnostic_data[1]; +}; + +#endif /* MPT2SAS_CTL_H_INCLUDED */ diff --git a/source/inc/mptctl.h b/source/inc/mptctl.h new file mode 100755 index 0000000..1765698 --- /dev/null +++ b/source/inc/mptctl.h @@ -0,0 +1,567 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ + +#ifndef MPTCTL_H_INCLUDED +#define MPTCTL_H_INCLUDED +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + +#include "linux/version.h" +#include "../lsi/mpi_ioc.h" + + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * + */ +#define MPT_MISCDEV_BASENAME "mptctl" +#define MPT_MISCDEV_PATHNAME "/dev/" MPT_MISCDEV_BASENAME +#define MPT_CSMI_DESCRIPTION "LSI Logic Corporation: Fusion MPT Driver " MPT_LINUX_VERSION_COMMON + +#define MPT_PRODUCT_LENGTH 12 + +/* + * Generic MPT Control IOCTLs and structures + */ +#define MPT_MAGIC_NUMBER 'm' + +#define MPTRWPERF _IOWR(MPT_MAGIC_NUMBER,0,struct mpt_raw_r_w) + +#define MPTFWDOWNLOAD _IOWR(MPT_MAGIC_NUMBER,15,struct mpt_fw_xfer) +#define MPTFWDOWNLOADBOOT _IOWR(MPT_MAGIC_NUMBER,16,struct mpt_fw_xfer) +#define MPTCOMMAND _IOWR(MPT_MAGIC_NUMBER,20,struct mpt_ioctl_command) + +#if defined(__KERNEL__) && defined(MPT_CONFIG_COMPAT) +#define MPTFWDOWNLOAD32 _IOWR(MPT_MAGIC_NUMBER,15,struct mpt_fw_xfer32) +#define MPTCOMMAND32 _IOWR(MPT_MAGIC_NUMBER,20,struct mpt_ioctl_command32) +#endif + +#define MPTIOCINFO _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo) +#define MPTIOCINFO1 _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo_rev0) +#define MPTIOCINFO2 _IOWR(MPT_MAGIC_NUMBER,17,struct mpt_ioctl_iocinfo_rev1) +#define MPTTARGETINFO _IOWR(MPT_MAGIC_NUMBER,18,struct mpt_ioctl_targetinfo) +#define MPTTEST _IOWR(MPT_MAGIC_NUMBER,19,struct mpt_ioctl_test) +#define MPTEVENTQUERY _IOWR(MPT_MAGIC_NUMBER,21,struct mpt_ioctl_eventquery) +#define MPTEVENTENABLE _IOWR(MPT_MAGIC_NUMBER,22,struct mpt_ioctl_eventenable) +#define MPTEVENTREPORT _IOWR(MPT_MAGIC_NUMBER,23,struct mpt_ioctl_eventreport) +#define MPTHARDRESET _IOWR(MPT_MAGIC_NUMBER,24,struct mpt_ioctl_diag_reset) +#define MPTFWREPLACE _IOWR(MPT_MAGIC_NUMBER,25,struct mpt_ioctl_replace_fw) +#define MPTDIAGREGISTER _IOWR(MPT_MAGIC_NUMBER,26,mpt_diag_register_t) +#define MPTDIAGRELEASE _IOWR(MPT_MAGIC_NUMBER,27,mpt_diag_release_t) +#define MPTDIAGUNREGISTER _IOWR(MPT_MAGIC_NUMBER,28,mpt_diag_unregister_t) +#define MPTDIAGQUERY _IOWR(MPT_MAGIC_NUMBER,29,mpt_diag_query_t) +#define MPTDIAGREADBUFFER _IOWR(MPT_MAGIC_NUMBER,30,mpt_diag_read_buffer_t) +#define MPTHBAPCIINFO _IOWR(MPT_MAGIC_NUMBER,31,struct mpt_ioctl_hbapciinfo) +#define MPTDIAGRESET _IOWR(MPT_MAGIC_NUMBER,32,struct mpt_ioctl_diag_reset) + +/* + * SPARC PLATFORM REMARKS: + * IOCTL data structures that contain pointers + * will have different sizes in the driver and applications + * (as the app. will not use 8-byte pointers). + * Apps should use MPTFWDOWNLOAD and MPTCOMMAND. + * The driver will convert data from + * mpt_fw_xfer32 (mpt_ioctl_command32) to mpt_fw_xfer (mpt_ioctl_command) + * internally. + * + * If data structures change size, must handle as in IOCGETINFO. + */ +struct mpt_fw_xfer { + unsigned int iocnum; /* IOC unit number */ + unsigned int fwlen; + void *bufp; /* Pointer to firmware buffer */ +}; + +#if defined(__KERNEL__) && defined(MPT_CONFIG_COMPAT) +struct mpt_fw_xfer32 { + unsigned int iocnum; + unsigned int fwlen; + U32 bufp; +}; +#endif /*}*/ + +/* + * IOCTL header structure. + * iocnum - must be defined. + * port - must be defined for all IOCTL commands other than MPTIOCINFO + * maxDataSize - ignored on MPTCOMMAND commands + * - ignored on MPTFWREPLACE commands + * - on query commands, reports the maximum number of bytes to be returned + * to the host driver (count includes the header). + * That is, set to sizeof(struct mpt_ioctl_iocinfo) for fixed sized commands. + * Set to sizeof(struct mpt_ioctl_targetinfo) + datasize for variable + * sized commands. (MPTTARGETINFO, MPTEVENTREPORT) + */ +typedef struct _mpt_ioctl_header { + unsigned int iocnum; /* IOC unit number */ + unsigned int port; /* IOC port number */ + int maxDataSize; /* Maximum Num. bytes to transfer on read */ +} mpt_ioctl_header; + +/* + * Issue a diagnostic reset + */ +struct mpt_ioctl_diag_reset { + mpt_ioctl_header hdr; +}; + + +/* + * PCI bus/device/function information structure. + */ +struct mpt_ioctl_pci_info { + union { + struct { + unsigned int deviceNumber : 5; + unsigned int functionNumber : 3; + unsigned int busNumber : 24; + } bits; + unsigned int asUlong; + } u; +}; + +struct mpt_ioctl_pci_info2 { + union { + struct { + unsigned int deviceNumber : 5; + unsigned int functionNumber : 3; + unsigned int busNumber : 24; + } bits; + unsigned int asUlong; + } u; + int segmentID; +}; + +/* + * Adapter Information Page + * Read only. + * Data starts at offset 0xC + */ +#define MPT_IOCTL_INTERFACE_SCSI (0x00) +#define MPT_IOCTL_INTERFACE_FC (0x01) +#define MPT_IOCTL_INTERFACE_SAS (0x03) +#define MPT_IOCTL_VERSION_LENGTH (32) + +struct mpt_ioctl_iocinfo { + mpt_ioctl_header hdr; + int adapterType; /* SCSI or FCP */ + int port; /* port number */ + int pciId; /* PCI Id. */ + int hwRev; /* hardware revision */ + int subSystemDevice; /* PCI subsystem Device ID */ + int subSystemVendor; /* PCI subsystem Vendor ID */ + int numDevices; /* number of devices */ + int FWVersion; /* FW Version (integer) */ + int BIOSVersion; /* BIOS Version (integer) */ + char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ + char busChangeEvent; + char hostId; + char rsvd[2]; + struct mpt_ioctl_pci_info2 pciInfo; /* Added Rev 2 */ +}; + +struct mpt_ioctl_iocinfo_rev1 { + mpt_ioctl_header hdr; + int adapterType; /* SCSI or FCP */ + int port; /* port number */ + int pciId; /* PCI Id. */ + int hwRev; /* hardware revision */ + int subSystemDevice; /* PCI subsystem Device ID */ + int subSystemVendor; /* PCI subsystem Vendor ID */ + int numDevices; /* number of devices */ + int FWVersion; /* FW Version (integer) */ + int BIOSVersion; /* BIOS Version (integer) */ + char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ + char busChangeEvent; + char hostId; + char rsvd[2]; + struct mpt_ioctl_pci_info pciInfo; /* Added Rev 1 */ +}; + +/* Original structure, must always accept these + * IOCTLs. 4 byte pads can occur based on arch with + * above structure. Wish to re-align, but cannot. + */ +struct mpt_ioctl_iocinfo_rev0 { + mpt_ioctl_header hdr; + int adapterType; /* SCSI or FCP */ + int port; /* port number */ + int pciId; /* PCI Id. */ + int hwRev; /* hardware revision */ + int subSystemDevice; /* PCI subsystem Device ID */ + int subSystemVendor; /* PCI subsystem Vendor ID */ + int numDevices; /* number of devices */ + int FWVersion; /* FW Version (integer) */ + int BIOSVersion; /* BIOS Version (integer) */ + char driverVersion[MPT_IOCTL_VERSION_LENGTH]; /* Driver Version (string) */ + char busChangeEvent; + char hostId; + char rsvd[2]; +}; + +/* + * Device Information Page + * Report the number of, and ids of, all targets + * on this IOC. The ids array is a packed structure + * of the known targetInfo. + * bits 31-24: reserved + * 23-16: LUN + * 15- 8: Bus Number + * 7- 0: Target ID + */ +struct mpt_ioctl_targetinfo { + mpt_ioctl_header hdr; + int numDevices; /* Num targets on this ioc */ + int targetInfo[1]; +}; + + +/* + * Event reporting IOCTL's. These IOCTL's will + * use the following defines: + */ +struct mpt_ioctl_eventquery { + mpt_ioctl_header hdr; + unsigned short eventEntries; + unsigned short reserved; + unsigned int eventTypes; +}; + +struct mpt_ioctl_eventenable { + mpt_ioctl_header hdr; + unsigned int eventTypes; +}; + +#ifndef __KERNEL__ +typedef struct { + uint event; + uint eventContext; + uint data[2]; +} MPT_IOCTL_EVENTS; +#endif + +struct mpt_ioctl_eventreport { + mpt_ioctl_header hdr; + MPT_IOCTL_EVENTS eventData[1]; +}; + +#define MPT_MAX_NAME 32 +struct mpt_ioctl_test { + mpt_ioctl_header hdr; + U8 name[MPT_MAX_NAME]; + int chip_type; + U8 product [MPT_PRODUCT_LENGTH]; +}; + +/* Replace the FW image cached in host driver memory + * newImageSize - image size in bytes + * newImage - first byte of the new image + */ +typedef struct mpt_ioctl_replace_fw { + mpt_ioctl_header hdr; + int newImageSize; + U8 newImage[1]; +} mpt_ioctl_replace_fw_t; + + +struct mpt_ioctl_mptpciinfo { + U8 iocNumber; + U8 iocState; + U8 revisionID; + U8 reserved1; + U16 vendorID; + U16 deviceID; + U16 subSystemVendorID; + U16 subSystemID; +}; + + +struct mpt_ioctl_hbapciinfo { + mpt_ioctl_header hdr; + U8 totalIOC; + U8 reserved[3]; + struct mpt_ioctl_mptpciinfo hbapciinfo[18]; +}; + + +/* General MPT Pass through data structure + * + * iocnum + * timeout - in seconds, command timeout. If 0, set by driver to + * default value. + * replyFrameBufPtr - reply location + * dataInBufPtr - destination for read + * dataOutBufPtr - data source for write + * senseDataPtr - sense data location + * maxReplyBytes - maximum number of reply bytes to be sent to app. + * dataInSize - num bytes for data transfer in (read) + * dataOutSize - num bytes for data transfer out (write) + * dataSgeOffset - offset in words from the start of the request message + * to the first SGL + * MF[1]; + * + * Remark: Some config pages have bi-directional transfer, + * both a read and a write. The basic structure allows for + * a bidirectional set up. Normal messages will have one or + * both of these buffers NULL. + */ +struct mpt_ioctl_command { + mpt_ioctl_header hdr; + int timeout; /* optional (seconds) */ + char *replyFrameBufPtr; + char *dataInBufPtr; + char *dataOutBufPtr; + char *senseDataPtr; + int maxReplyBytes; + int dataInSize; + int dataOutSize; + int maxSenseBytes; + int dataSgeOffset; + char MF[1]; +}; + +/* + * SPARC PLATFORM: See earlier remark. + */ +#if defined(__KERNEL__) && defined(MPT_CONFIG_COMPAT) +struct mpt_ioctl_command32 { + mpt_ioctl_header hdr; + int timeout; + U32 replyFrameBufPtr; + U32 dataInBufPtr; + U32 dataOutBufPtr; + U32 senseDataPtr; + int maxReplyBytes; + int dataInSize; + int dataOutSize; + int maxSenseBytes; + int dataSgeOffset; + char MF[1]; +}; +#endif /*}*/ + + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ +/* + * HP Specific IOCTL Defines and Structures + */ + +#define CPQFCTS_IOC_MAGIC 'Z' +#define HP_IOC_MAGIC 'Z' +#define HP_GETHOSTINFO _IOR(HP_IOC_MAGIC, 20, hp_host_info_t) +#define HP_GETHOSTINFO1 _IOR(HP_IOC_MAGIC, 20, hp_host_info_rev0_t) +#define HP_GETTARGETINFO _IOR(HP_IOC_MAGIC, 21, hp_target_info_t) + +/* All HP IOCTLs must include this header + */ +typedef struct _hp_header { + unsigned int iocnum; + unsigned int host; + unsigned int channel; + unsigned int id; + unsigned int lun; +} hp_header_t; + +/* + * Header: + * iocnum required (input) + * host ignored + * channe ignored + * id ignored + * lun ignored + */ +typedef struct _hp_host_info { + hp_header_t hdr; + U16 vendor; + U16 device; + U16 subsystem_vendor; + U16 subsystem_id; + U8 devfn; + U8 bus; + ushort host_no; /* SCSI Host number, if scsi driver not loaded*/ + U8 fw_version[16]; /* string */ + U8 serial_number[24]; /* string */ + U32 ioc_status; + U32 bus_phys_width; + U32 base_io_addr; + U32 rsvd; + unsigned int hard_resets; /* driver initiated resets */ + unsigned int soft_resets; /* ioc, external resets */ + unsigned int timeouts; /* num timeouts */ +} hp_host_info_t; + +/* replace ulongs with uints, need to preserve backwards + * compatibility. + */ +typedef struct _hp_host_info_rev0 { + hp_header_t hdr; + U16 vendor; + U16 device; + U16 subsystem_vendor; + U16 subsystem_id; + U8 devfn; + U8 bus; + ushort host_no; /* SCSI Host number, if scsi driver not loaded*/ + U8 fw_version[16]; /* string */ + U8 serial_number[24]; /* string */ + U32 ioc_status; + U32 bus_phys_width; + U32 base_io_addr; + U32 rsvd; + unsigned long hard_resets; /* driver initiated resets */ + unsigned long soft_resets; /* ioc, external resets */ + unsigned long timeouts; /* num timeouts */ +} hp_host_info_rev0_t; + +/* + * Header: + * iocnum required (input) + * host required + * channel required (bus number) + * id required + * lun ignored + * + * All error values between 0 and 0xFFFF in size. + */ +typedef struct _hp_target_info { + hp_header_t hdr; + U32 parity_errors; + U32 phase_errors; + U32 select_timeouts; + U32 message_rejects; + U32 negotiated_speed; + U8 negotiated_width; + U8 rsvd[7]; /* 8 byte alignment */ +} hp_target_info_t; + +#define HP_STATUS_OTHER 1 +#define HP_STATUS_OK 2 +#define HP_STATUS_FAILED 3 + +#define HP_BUS_WIDTH_UNK 1 +#define HP_BUS_WIDTH_8 2 +#define HP_BUS_WIDTH_16 3 +#define HP_BUS_WIDTH_32 4 + +#define HP_DEV_SPEED_ASYNC 2 +#define HP_DEV_SPEED_FAST 3 +#define HP_DEV_SPEED_ULTRA 4 +#define HP_DEV_SPEED_ULTRA2 5 +#define HP_DEV_SPEED_ULTRA160 6 +#define HP_DEV_SPEED_SCSI1 7 +#define HP_DEV_SPEED_ULTRA320 8 + +/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ + +#define MPI_FW_DIAG_IOCTL (0x80646961) // dia +#define MPI_FW_DIAG_TYPE_REGISTER (0x00000001) +#define MPI_FW_DIAG_TYPE_UNREGISTER (0x00000002) +#define MPI_FW_DIAG_TYPE_QUERY (0x00000003) +#define MPI_FW_DIAG_TYPE_READ_BUFFER (0x00000004) +#define MPI_FW_DIAG_TYPE_RELEASE (0x00000005) + +#define MPI_FW_DIAG_INVALID_UID (0x00000000) +#define FW_DIAGNOSTIC_BUFFER_COUNT (3) +#define FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) + +#define MPI_FW_DIAG_ERROR_SUCCESS (0x00000000) +#define MPI_FW_DIAG_ERROR_FAILURE (0x00000001) +#define MPI_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) +#define MPI_FW_DIAG_ERROR_POST_FAILED (0x00000010) +#define MPI_FW_DIAG_ERROR_INVALID_UID (0x00000011) +#define MPI_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) +#define MPI_FW_DIAG_ERROR_NO_BUFFER (0x00000013) +#define MPI_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) + +#define MPT_DIAG_CAPABILITY(bufftype) (MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER << bufftype) + +typedef struct _MPI_FW_DIAG_REGISTER +{ + U8 TraceLevel; + U8 BufferType; + U16 Flags; + U32 ExtendedType; + U32 ProductSpecific[4]; + U32 RequestedBufferSize; + U32 UniqueId; +} MPI_FW_DIAG_REGISTER, *PTR_MPI_FW_DIAG_REGISTER; + +typedef struct _mpt_diag_register { + mpt_ioctl_header hdr; + MPI_FW_DIAG_REGISTER data; +} mpt_diag_register_t; + +typedef struct _MPI_FW_DIAG_UNREGISTER +{ + U32 UniqueId; +} MPI_FW_DIAG_UNREGISTER, *PTR_MPI_FW_DIAG_UNREGISTER; + +typedef struct _mpt_diag_unregister { + mpt_ioctl_header hdr; + MPI_FW_DIAG_UNREGISTER data; +} mpt_diag_unregister_t; + +#define MPI_FW_DIAG_FLAG_APP_OWNED (0x0001) +#define MPI_FW_DIAG_FLAG_BUFFER_VALID (0x0002) +#define MPI_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) + +typedef struct _MPI_FW_DIAG_QUERY +{ + U8 TraceLevel; + U8 BufferType; + U16 Flags; + U32 ExtendedType; + U32 ProductSpecific[4]; + U32 DataSize; + U32 DriverAddedBufferSize; + U32 UniqueId; +} MPI_FW_DIAG_QUERY, *PTR_MPI_FW_DIAG_QUERY; + +typedef struct _mpt_diag_query { + mpt_ioctl_header hdr; + MPI_FW_DIAG_QUERY data; +} mpt_diag_query_t; + +typedef struct _MPI_FW_DIAG_RELEASE +{ + U32 UniqueId; +} MPI_FW_DIAG_RELEASE, *PTR_MPI_FW_DIAG_RELEASE; + +typedef struct _mpt_diag_release { + mpt_ioctl_header hdr; + MPI_FW_DIAG_RELEASE data; +} mpt_diag_release_t; + +#define MPI_FW_DIAG_FLAG_REREGISTER (0x0001) + +typedef struct _MPI_FW_DIAG_READ_BUFFER +{ + U8 Status; + U8 Reserved; + U16 Flags; + U32 StartingOffset; + U32 BytesToRead; + U32 UniqueId; + U32 DiagnosticData[1]; +} MPI_FW_DIAG_READ_BUFFER, *PTR_MPI_FW_DIAG_READ_BUFFER; + +typedef struct _mpt_diag_read_buffer { + mpt_ioctl_header hdr; + MPI_FW_DIAG_READ_BUFFER data; +} mpt_diag_read_buffer_t; + +typedef struct _mpt_FWDownload_MF { + FWDownload_t FWMessage; + U32 SGL_Word; +} mpt_FWDownload_MF_t; + +#endif diff --git a/source/inc/mptsas_ioctl.h b/source/inc/mptsas_ioctl.h new file mode 100755 index 0000000..46760d8 --- /dev/null +++ b/source/inc/mptsas_ioctl.h @@ -0,0 +1,260 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + +/* + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright 1998 LSI Logic Corporation. All rights reserved. + * + * This file is confidential and a trade secret of LSI Logic. 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 it may describe, in whole, or in part, without the specific + * written consent of LSI Logic Corporation. + */ + +#ifndef _MPTSAS_IOCTL_H +#define _MPTSAS_IOCTL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define MPTIOCTL ('I' << 8) +#define MPTIOCTL_GET_ADAPTER_DATA (MPTIOCTL | 1) +#define MPTIOCTL_UPDATE_FLASH (MPTIOCTL | 2) +#define MPTIOCTL_RESET_ADAPTER (MPTIOCTL | 3) +#define MPTIOCTL_PASS_THRU (MPTIOCTL | 4) +#define MPTIOCTL_EVENT_QUERY (MPTIOCTL | 5) +#define MPTIOCTL_EVENT_ENABLE (MPTIOCTL | 6) +#define MPTIOCTL_EVENT_REPORT (MPTIOCTL | 7) +#define MPTIOCTL_GET_PCI_INFO (MPTIOCTL | 8) +#define MPTIOCTL_DIAG_ACTION (MPTIOCTL | 9) + +/* + * The following are our ioctl() return status values. If everything went + * well, we return good status. If the buffer length sent to us is too short + * we return a status to tell the user. + */ +#define MPTIOCTL_STATUS_GOOD 0 +#define MPTIOCTL_STATUS_LEN_TOO_SHORT 1 + +/* + * The following is the MPTIOCTL_GET_ADAPTER_DATA data structure. This data + * structure is setup so that we hopefully are properly aligned for both + * 32-bit and 64-bit mode applications. + * + * Adapter Type - Value = 4 = SCSI Protocol through SAS-2 adapter + * + * MPI Port Number - The PCI Function number for this device + * + * PCI Device HW Id - The PCI device number for this device + * + */ +#define MPTIOCTL_ADAPTER_TYPE_SAS2 4 +typedef struct mptsas_adapter_data +{ + uint32_t StructureLength; + uint32_t AdapterType; + uint32_t MpiPortNumber; + uint32_t PCIDeviceHwId; + uint32_t PCIDeviceHwRev; + uint32_t SubSystemId; + uint32_t SubsystemVendorId; + uint32_t Reserved1; + uint32_t MpiFirmwareVersion; + uint32_t BiosVersion; + uint8_t DriverVersion[32]; + uint8_t Reserved2; + uint8_t ScsiId; + uint16_t Reserved3; + uint32_t PciInformation; + uint32_t PciSegmentId; +} mptsas_adapter_data_t; + + +typedef struct mptsas_update_flash +{ + uint64_t PtrBuffer; + uint32_t ImageChecksum; + uint32_t ImageOffset; + uint32_t ImageSize; + uint32_t ImageType; +} mptsas_update_flash_t; + + +#define MPTSAS_PASS_THRU_DIRECTION_NONE 0 +#define MPTSAS_PASS_THRU_DIRECTION_READ 1 +#define MPTSAS_PASS_THRU_DIRECTION_WRITE 2 +#define MPTSAS_PASS_THRU_DIRECTION_BOTH 3 + +typedef struct mptsas_pass_thru +{ + uint64_t PtrRequest; + uint64_t PtrReply; + uint64_t PtrData; + uint32_t RequestSize; + uint32_t ReplySize; + uint32_t DataSize; + uint32_t DataDirection; + uint64_t PtrDataOut; + uint32_t DataOutSize; + uint32_t Timeout; +} mptsas_pass_thru_t; + + +/* + * Event queue defines + */ +#define MPTSAS_EVENT_QUEUE_SIZE (50) /* Max Events stored in driver */ +#define MPTSAS_MAX_EVENT_DATA_LENGTH (48) /* Size of each event in Dwords */ + +typedef struct mptsas_event_query +{ + uint16_t Entries; + uint16_t Reserved; + uint32_t Types[4]; +} mptsas_event_query_t; + +typedef struct mptsas_event_enable +{ + uint32_t Types[4]; +} mptsas_event_enable_t; + +/* + * Event record entry for ioctl. + */ +typedef struct mptsas_event_entry +{ + uint32_t Type; + uint32_t Number; + uint32_t Data[MPTSAS_MAX_EVENT_DATA_LENGTH]; +} mptsas_event_entry_t; + +typedef struct mptsas_event_report +{ + uint32_t Size; + mptsas_event_entry_t Events[1]; +} mptsas_event_report_t; + + +typedef struct mptsas_pci_info +{ + uint32_t BusNumber; + uint8_t DeviceNumber; + uint8_t FunctionNumber; + uint16_t InterruptVector; + uint8_t PciHeader[256]; +} mptsas_pci_info_t; + + +typedef struct mptsas_diag_action +{ + uint32_t Action; + uint32_t Length; + uint64_t PtrDiagAction; + uint32_t ReturnCode; +} mptsas_diag_action_t; + +#define MPTSAS_FW_DIAGNOSTIC_BUFFER_COUNT (3) +#define MPTSAS_FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) + +#define MPTSAS_FW_DIAG_NEW (0x806E6577) + +#define MPTSAS_FW_DIAG_TYPE_REGISTER (0x00000001) +#define MPTSAS_FW_DIAG_TYPE_UNREGISTER (0x00000002) +#define MPTSAS_FW_DIAG_TYPE_QUERY (0x00000003) +#define MPTSAS_FW_DIAG_TYPE_READ_BUFFER (0x00000004) +#define MPTSAS_FW_DIAG_TYPE_RELEASE (0x00000005) + +#define MPTSAS_FW_DIAG_INVALID_UID (0x00000000) + +#define MPTSAS_FW_DIAG_ERROR_SUCCESS (0x00000000) +#define MPTSAS_FW_DIAG_ERROR_FAILURE (0x00000001) +#define MPTSAS_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000002) +#define MPTSAS_FW_DIAG_ERROR_POST_FAILED (0x00000010) +#define MPTSAS_FW_DIAG_ERROR_INVALID_UID (0x00000011) +#define MPTSAS_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) +#define MPTSAS_FW_DIAG_ERROR_NO_BUFFER (0x00000013) +#define MPTSAS_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) + + +typedef struct mptsas_fw_diag_register +{ + uint8_t Reserved1; + uint8_t BufferType; + uint16_t ApplicationFlags; + uint32_t DiagnosticFlags; + uint32_t ProductSpecific[23]; + uint32_t RequestedBufferSize; + uint32_t UniqueId; +} mptsas_fw_diag_register_t; + +typedef struct mptsas_fw_diag_unregister +{ + uint32_t UniqueId; +} mptsas_fw_diag_unregister_t; + +#define MPTSAS_FW_DIAG_FLAG_APP_OWNED (0x0001) +#define MPTSAS_FW_DIAG_FLAG_BUFFER_VALID (0x0002) +#define MPTSAS_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) + +typedef struct mptsas_fw_diag_query +{ + uint8_t Reserved1; + uint8_t BufferType; + uint16_t ApplicationFlags; + uint32_t DiagnosticFlags; + uint32_t ProductSpecific[23]; + uint32_t TotalBufferSize; + uint32_t DriverAddedBufferSize; + uint32_t UniqueId; +} mptsas_fw_diag_query_t; + +typedef struct mptsas_fw_diag_release +{ + uint32_t UniqueId; +} mptsas_fw_diag_release; + +#define MPTSAS_FW_DIAG_FLAG_REREGISTER (0x0001) +#define MPTSAS_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) + +typedef struct mptsas_diag_read_buffer +{ + uint8_t Status; + uint8_t Reserved; + uint16_t Flags; + uint32_t StartingOffset; + uint32_t BytesToRead; + uint32_t UniqueId; + uint32_t DataBuffer[1]; +} mptsas_diag_read_buffer_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _MPTSAS_IOCTL_H */ diff --git a/source/inc/ntddscsi.h b/source/inc/ntddscsi.h new file mode 100755 index 0000000..81a390a --- /dev/null +++ b/source/inc/ntddscsi.h @@ -0,0 +1,313 @@ +/*++ BUILD Version: 0001 // Increment this if a change has global effects + +Copyright (c) 1990-1999 Microsoft Corporation + +Module Name: + + ntddscsi.h + +Abstract: + + This is the include file that defines all constants and types for + accessing the SCSI port adapters. + +Author: + + Jeff Havens + +Revision History: + +--*/ + + +// +// Interface GUIDs +// +// need these GUIDs outside conditional includes so that user can +// #include in precompiled header +// #include in a single source file +// #include in that source file a second time to instantiate the GUIDs +// +#ifdef DEFINE_GUID +// +// Make sure FAR is defined... +// +#ifndef FAR +#ifdef _WIN32 +#define FAR +#else +#define FAR _far +#endif +#endif + +DEFINE_GUID(ScsiRawInterfaceGuid, 0x53f56309L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +DEFINE_GUID(WmiScsiAddressGuid, 0x53f5630fL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); +#endif + +#ifndef _NTDDSCSIH_ +#define _NTDDSCSIH_ + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Device Name - this string is the name of the device. It is the name +// that should be passed to NtOpenFile when accessing the device. +// +// Note: For devices that support multiple units, it should be suffixed +// with the Ascii representation of the unit number. +// + +#define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER + +#define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort" + + +// +// NtDeviceIoControlFile IoControlCode values for this device. +// +// Warning: Remember that the low two bits of the code specify how the +// buffers are passed to the driver! +// + +#define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_SCSI_FREE_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_IDE_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +// +// Define the SCSI pass through structure. +// + +typedef struct _SCSI_PASS_THROUGH { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + ULONG_PTR DataBufferOffset; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH; + +// +// Define the SCSI pass through direct structure. +// + +typedef struct _SCSI_PASS_THROUGH_DIRECT { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + PVOID DataBuffer; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; + + +// +// Define the SCSI pass through direct structure for Win64 (thunking). +// +#if defined(_WIN64) +typedef struct _SCSI_PASS_THROUGH32 { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + ULONG32 DataBufferOffset; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}SCSI_PASS_THROUGH32, *PSCSI_PASS_THROUGH32; + +// +// Define the SCSI pass through direct structure. +// + +typedef struct _SCSI_PASS_THROUGH_DIRECT32 { + USHORT Length; + UCHAR ScsiStatus; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + UCHAR CdbLength; + UCHAR SenseInfoLength; + UCHAR DataIn; + ULONG DataTransferLength; + ULONG TimeOutValue; + VOID * POINTER_32 DataBuffer; + ULONG SenseInfoOffset; + UCHAR Cdb[16]; +}SCSI_PASS_THROUGH_DIRECT32, *PSCSI_PASS_THROUGH_DIRECT32; + +#endif + +// +// Define SCSI information. +// Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL. +// + +typedef struct _SCSI_BUS_DATA { + UCHAR NumberOfLogicalUnits; + UCHAR InitiatorBusId; + ULONG InquiryDataOffset; +}SCSI_BUS_DATA, *PSCSI_BUS_DATA; + +// +// Define SCSI adapter bus information structure.. +// Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL. +// + +typedef struct _SCSI_ADAPTER_BUS_INFO { + UCHAR NumberOfBuses; + SCSI_BUS_DATA BusData[1]; +} SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO; + +// +// Define SCSI adapter bus information. +// Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL. +// + +typedef struct _SCSI_INQUIRY_DATA { + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; + BOOLEAN DeviceClaimed; + ULONG InquiryDataLength; + ULONG NextInquiryDataOffset; + UCHAR InquiryData[1]; +}SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA; + +// +// Define header for I/O control SRB. +// + +typedef struct _SRB_IO_CONTROL { + ULONG HeaderLength; + UCHAR Signature[8]; + ULONG Timeout; + ULONG ControlCode; + ULONG ReturnCode; + ULONG Length; +} SRB_IO_CONTROL, *PSRB_IO_CONTROL; + +// +// SCSI port driver capabilities structure. +// + +typedef struct _IO_SCSI_CAPABILITIES { + + // + // Length of this structure + // + + ULONG Length; + + // + // Maximum transfer size in single SRB + // + + ULONG MaximumTransferLength; + + // + // Maximum number of physical pages per data buffer + // + + ULONG MaximumPhysicalPages; + + // + // Async calls from port to class + // + + ULONG SupportedAsynchronousEvents; + + // + // Alignment mask for data transfers. + // + + ULONG AlignmentMask; + + // + // Supports tagged queuing + // + + BOOLEAN TaggedQueuing; + + // + // Host adapter scans down for bios devices. + // + + BOOLEAN AdapterScansDown; + + // + // The host adapter uses programmed I/O. + // + + BOOLEAN AdapterUsesPio; + +} IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES; + +typedef struct _SCSI_ADDRESS { + ULONG Length; + UCHAR PortNumber; + UCHAR PathId; + UCHAR TargetId; + UCHAR Lun; +}SCSI_ADDRESS, *PSCSI_ADDRESS; + +// +// Define structure for returning crash dump pointers. +// + +struct _ADAPTER_OBJECT; + +typedef struct _DUMP_POINTERS { + struct _ADAPTER_OBJECT *AdapterObject; + PVOID MappedRegisterBase; + PVOID DumpData; + PVOID CommonBufferVa; + LARGE_INTEGER CommonBufferPa; + ULONG CommonBufferSize; + BOOLEAN AllocateCommonBuffers; + BOOLEAN UseDiskDump; + UCHAR Spare1[2]; + PVOID DeviceObject; +} DUMP_POINTERS, *PDUMP_POINTERS; + +// +// Define values for pass-through DataIn field. +// + +#define SCSI_IOCTL_DATA_OUT 0 +#define SCSI_IOCTL_DATA_IN 1 +#define SCSI_IOCTL_DATA_UNSPECIFIED 2 + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/source/inc/sas.h b/source/inc/sas.h new file mode 100755 index 0000000..a7297ca --- /dev/null +++ b/source/inc/sas.h @@ -0,0 +1,1886 @@ +/*************************************************************************** + * * + * Copyright 2008 LSI Logic Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Logic. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Logic Corporation. * + * * + *************************************************************************** + * + * Name: SAS.H + * Title: SAS Protocol Structures and Definitions + * Programmer: ------------- + * Creation Date: January 20, 2003 + * + * Version History + * --------------- + * + * Last Updated + * ------------- + * Version %version: 52 % + * Date Updated %date_modified: % + * Programmer %created_by: mjwang % + * + * Date Who Description + * -------- --- ------------------------------------------------------- + * 01/20/03 GWK Initial version + * 10/24/04 BDB Updated to SAS 1.1 Revision 6 + * 08/20/08 KAM updated for SDM big endian platform and gcc bitfields + * 12/09/08 RTS updated to SAS 2.0 Revision 15 + * + * + * Description + * ------------ + * This include file contains SAS protocol structures and definitions. This + * file only should include structures and definitions specific to SAS. SCSI + * CDBs used in SAS belong in scsi.h. + * + * NOTE: This version is current as of version 2.0 Rev 15 of the SAS specification. + * + * NOTE: This file is dependant on ata.h, so include ata.h before sas.h. + * + *------------------------------------------------------------------------- + */ + +/* If this header file has not been included yet */ +#ifndef SAS_H_SOURCE +#define SAS_H_SOURCE + +/* None of the frames defined included CRC. The HW deals with + * CRC and we can't access it. + */ + + +/******************************************************************************/ +/* */ +/* S A S A D D R E S S D E F I N I T I O N S */ +/* */ +/******************************************************************************/ + +/* + * SAS Address (full 8 byte WWID) + * This structure is in little endian, so a SAS address of 0x50(MSB) 08 05 EF FF FF 80 00(LSB) + * would show up here as High = 0xEF050850, Low = 0x0080FFFF + */ +#if 1 //KAM +#define SAS_WWID_LENGTH (8) +typedef union _SAS_ADDRESS +{ + U8 WWID[SAS_WWID_LENGTH]; /* 0x00 */ + struct + { + U32 High; + U32 Low; + }Word; + +} SAS_ADDRESS, *PTR_SAS_ADDRESS; +#endif + +/******************************************************************************/ +/* */ +/* S A S L U N D E F I N I T I O N */ +/* */ +/******************************************************************************/ +typedef union _SAS_LOGICAL_UNIT +{ + U8 Byte[8]; + U16 LevelAddressing[4]; + U32 Dword[2]; + struct { + U8 Reserved1; + U8 Lun; + U8 Reserved2[6]; + } SingleLevel; +} SAS_LOGICAL_UNIT, *PTR_SAS_LOGICAL_UNIT; + +/* SAS Device Type field */ +#define SAS_DEVICE_TYPE_END_DEVICE (0x01) +#define SAS_DEVICE_TYPE_EDGE_EXPANDER (0x02) +#define SAS_DEVICE_TYPE_FANOUT_EXPANDER (0x03) + + +/******************************************************************************/ +/* */ +/* S S P F R A M E D E F I N I T I O N S */ +/* */ +/******************************************************************************/ + +/* + * COMMAND Information Unit + */ +#define SAS_COMMAND_IU_CDB_LENGTH (16) +typedef struct _COMMAND_IU +{ + SAS_LOGICAL_UNIT LogicalUnitNumber; /* 0x00 */ + U8 Reserved08; /* 0x08 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 EnableFirstBurst :1; /* 0x09 */ + U8 Reserved09Bits3to6 :4; + U8 TaskAttribute :3; + U8 Reserved0A; /* 0x0A */ + U8 AdditionalCDBLength :6; /* 0x0B */ + U8 Reserved0BBits0to1 :2; +#else /* little endian */ + U8 TaskAttribute :3; /* 0x09 */ + U8 Reserved09Bits3to6 :4; + U8 EnableFirstBurst :1; + U8 Reserved0A; /* 0x0A */ + U8 Reserved0BBits0to1 :2; /* 0x0B */ + U8 AdditionalCDBLength :6; +#endif + U8 CDB[SAS_COMMAND_IU_CDB_LENGTH]; /* 0x0C */ + U32 AdditionalCDBBytes[1]; /* 0x1C */ + /* Note: AdditionalCDBBytes is variable and may really be 0 to 0x3F dwords */ +} COMMAND_IU, *PTR_COMMAND_IU; + +/* Task Attribute field */ +#define SSP_COMMAND_IU_TASK_ATTRIBUTE_SIMPLE (0x0) +#define SSP_COMMAND_IU_TASK_ATTRIBUTE_HEAD_OF_QUEUE (0x1) +#define SSP_COMMAND_IU_TASK_ATTRIBUTE_ORDERED (0x2) +#define SSP_COMMAND_IU_TASK_ATTRIBUTE_ACA (0x4) + +/* + * TASK Information Unit + */ +typedef struct _TASK_IU +{ + SAS_LOGICAL_UNIT LogicalUnitNumber; /* 0x00 */ + U8 Reserved08; /* 0x08 */ + U8 Reserved09; /* 0x09 */ + U8 TaskManagementFunction; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U16 TagOfTaskToBeManaged; /* 0x0C */ + U8 Reserved0Eto1B[14]; /* 0x0E */ +} TASK_IU, *PTR_TASK_IU; + +/* Task Management Function field */ +#define SSP_TASK_IU_TASK_MANAGEMENT_FUNCTION_ABORT_TASK (0x01) +#define SSP_TASK_IU_TASK_MANAGEMENT_FUNCTION_ABORT_TASK_SET (0x02) +#define SSP_TASK_IU_TASK_MANAGEMENT_FUNCTION_CLEAR_TASK_SET (0x04) +#define SSP_TASK_IU_TASK_MANAGEMENT_FUNCTION_LOGICAL_UNIT_RESET (0x08) +#define SSP_TASK_IU_TASK_MANAGEMENT_FUNCTION_CLEAR_ACA (0x40) +#define SSP_TASK_IU_TASK_MANAGEMENT_FUNCTION_QUERY_TASK (0x80) + +/* + * XFER_RDY Information Unit + */ +typedef struct _XFER_RDY_IU +{ + U32 RequestedOffset; /* 0x00 */ + U32 WriteDataLength; /* 0x04 */ + U8 Reserved08to0B[4]; /* 0x08 */ +} XFER_RDY_IU, *PTR_XFER_RDY_IU; + +/* + * DATA Information Unit + */ +typedef struct _DATA_IU +{ + U8 Data[1]; /* 0x00 - ?? */ + /* Note the data length is variable */ +} DATA_IU, *PTR_DATA_IU; + +/* + * RESPONSE Data field + */ +typedef struct _RESPONSE_DATA +{ + U8 Reserved00; /* 0x00 */ + U8 Reserved01; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 ResponseCode; /* 0x03 */ +} RESPONSE_DATA, *PTR_RESPONSE_DATA; + +/* Response Code field */ +#define SSP_RESPONSE_CODE_NO_FAILURE (0x00) +#define SSP_RESPONSE_CODE_TASK_MGMT_FUNCTION_COMPLETE (0x00) +#define SSP_RESPONSE_CODE_INVALID_FRAME (0x02) +#define SSP_RESPONSE_CODE_TASK_MGMT_FUNCTION_NOT_SUPPORTED (0x04) +#define SSP_RESPONSE_CODE_TASK_MGMT_FUNCTION_FAILED (0x05) +#define SSP_RESPONSE_CODE_TASK_MGMT_FUNCTION_SUCCEEDED (0x08) +#define SSP_RESPONSE_CODE_INVALID_LOGICAL_UNIT_NUMBER (0x09) + +/* + * RESPONSE Information Unit + */ +typedef struct _RESPONSE_IU +{ + U8 Reserved00to09[10]; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved0ABits2to7 :6; + U8 DataPres :2; /* 0x0A */ +#else /* little endian */ + U8 DataPres :2; /* 0x0A */ + U8 Reserved0ABits2to7 :6; +#endif + U8 Status; /* 0x0B */ + U32 Reserved0Cto0F; /* 0x0C */ + U32 SenseDataListLength; /* 0x10 */ + U32 ResponseDataListLength; /* 0x14 */ + union + { + RESPONSE_DATA ResponseData; + U8 SenseData[1]; + /* Note sense data length is variable */ + } ResponseOrSenseData; +} RESPONSE_IU, *PTR_RESPONSE_IU; + +/* DataPres field */ +#define SSP_RESPONSE_IU_DATAPRES_NO_DATA (0x00) +#define SSP_RESPONSE_IU_DATAPRES_RESPONSE_DATA (0x01) +#define SSP_RESPONSE_IU_DATAPRES_SENSE_DATA (0x02) + +/* + * Union of all IUs + */ +typedef union _SAS_IU +{ + COMMAND_IU CommandIU; + TASK_IU TaskIU; + XFER_RDY_IU XferRdyIU; + DATA_IU DataIU; + RESPONSE_IU ResponseIU; +} SAS_IU, *PTR_SAS_IU; + +/******************************************************************************/ +/* */ +/* S T P F R A M E D E F I N I T I O N S */ +/* */ +/******************************************************************************/ + +/* STP frames are identical to SATA FIS's, so these are defined in ata.h */ + + +/******************************************************************************/ +/* */ +/* S M P F R A M E D E F I N I T I O N S */ +/* */ +/******************************************************************************/ + +/* + * SMP Request + */ +typedef struct _SMP_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U8 AdditionalRequestBytes[1]; /* 0x04 */ + /* Note AdditionalRequestBytes is of variable length based on function */ +} SMP_REQUEST, *PTR_SMP_REQUEST; + +/* SMP Frame Types */ +#define SMP_FRAME_TYPE_SMP_REQUEST (0x40) +#define SMP_FRAME_TYPE_SMP_RESPONSE (0x41) + +/* SMP Functions */ +#define SMP_FUNCTION_REPORT_GENERAL (0x00) +#define SMP_FUNCTION_REPORT_MANUFACTURER_INFORMATION (0x01) +#define SMP_FUNCTION_READ_GPIO (0x02) +#define SMP_FUNCTION_REPORT_SELF_CONFIG_STATUS (0x03) +#define SMP_FUNCTION_DISCOVER (0x10) +#define SMP_FUNCTION_REPORT_PHY_ERROR_LOG (0x11) +#define SMP_FUNCTION_REPORT_PHY_SATA (0x12) +#define SMP_FUNCTION_REPORT_ROUTE_INFORMATION (0x13) +#define SMP_FUNCTION_REPORT_EXP_ROUTE_TABLE (0x17) +#define SMP_FUNCTION_WRITE_GPIO (0x82) +#define SMP_FUNCTION_CONFIGURE_ROUTE_INFORMATION (0x90) +#define SMP_FUNCTION_PHY_CONTROL (0x91) +/* These are vendor unique functions for LSI expanders */ +#define SMP_FUNCTION_RING_WRITE_N_REGISTERS (0xC0) +#define SMP_FUNCTION_RING_READ_N_REGISTERS (0x40) +#define SMP_FUNCTION_ICL_DISCOVER (0x41) + +#define SMP_FUNCTION_AHB_WRITE_N_REGISTERS (0xC2) +#define SMP_FUNCTION_AHB_READ_N_REGISTERS (0x42) + +/* These are for SGPIO use */ +#define SMP_FUNCTION_READ_GPIO_REGISTERS (0x02) +#define SMP_FUNCTION_WRITE_GPIO_REGISTERS (0x82) + +/* Zoning SMPs */ +#define SMP_FUNCTION_CONFIGURE_ZONE_PHY (0x8a) +#define SMP_FUNCTION_CONFIGURE_ZONE_PERMISSION (0x8b) +#define SMP_FUNCTION_REPORT_ZONE_PERMISSION (0x04) +#define SMP_FUNCTION_ENABLE_DISABLE_ZONING (0x81) +#define SMP_FUNCTION_ZONE_ACTIVATE (0x87) +#define SMP_FUNCTION_ZONE_LOCK (0x86) +#define SMP_FUNCTION_ZONE_UNLOCK (0x88) +#define SMP_FUNCTION_CONFIGURE_ZONE_MANAGER_PASSWORD (0x89) + +/* + * SMP Response + */ +typedef struct _SMP_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U8 AdditionalResponseBytes[1]; /* 0x04 */ + /* Note AdditionalResponseBytes is of variable length based on function */ +} SMP_RESPONSE, *PTR_SMP_RESPONSE; + +/* SMP Function Result field */ +#define SMP_RESPONSE_FUNCTION_RESULT_ACCEPTED (0x00) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_SMP_FUNCTION (0x01) +#define SMP_RESPONSE_FUNCTION_RESULT_SMP_FUNCTION_FAILED (0x02) +#define SMP_RESPONSE_FUNCTION_RESULT_INVALID_REQUEST_LENGTH (0x03) +#define SMP_RESPONSE_FUNCTION_RESULT_INVALID_EXP_CHANGE_COUNT (0x04) +#define SMP_RESPONSE_FUNCTION_RESULT_BUSY (0x05) +#define SMP_RESPONSE_FUNCTION_RESULT_INCOMPLETE_DESCRIPTOR_LIST (0x06) + +#define SMP_RESPONSE_FUNCTION_RESULT_PHY_DOES_NOT_EXIST (0x10) +#define SMP_RESPONSE_FUNCTION_RESULT_INDEX_DOES_NOT_EXIST (0x11) +#define SMP_RESPONSE_FUNCTION_RESULT_PHY_DOES_NOT_SUPPORT_SATA (0x12) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_OPERATION (0x13) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_TEST_FUNCTION (0x14) +#define SMP_RESPONSE_FUNCTION_RESULT_PHY_TEST_FUNCTION_IN_PROG (0x15) +#define SMP_RESPONSE_FUNCTION_RESULT_PHY_VACANT (0x16) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_EVENT_SOURCE (0x17) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_DESCRIPTOR_TYPE (0x18) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_FILTER (0x19) +#define SMP_RESPONSE_FUNCTION_RESULT_AFFILIATION_VIOLATION (0x1a) + +#define SMP_RESPONSE_FUNCTION_RESULT_SMP_ZONE_VIOLATION (0x20) +#define SMP_RESPONSE_FUNCTION_RESULT_NO_MANAGEMENT_ACCESS_RIGHTS (0x21) +#define SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_ENABLE_DISABLE_ZONING_VALUE (0x22) +#define SMP_RESPONSE_FUNCTION_RESULT_ZONE_LOCK_VIOLATION (0x23) +#define SMP_RESPONSE_FUNCTION_RESULT_NOT_ACTIVATED (0x24) +#define SMP_RESPONSE_FUNCTION_RESULT_ZONE_GROUP_OUT_OF_RANGE (0x25) +#define SMP_RESPONSE_FUNCTION_RESULT_NO_PHYSICAL_PRESENCE (0x26) +#define SMP_RESPONSE_FUNCTION_RESULT_SAVING_NOT_SUPPORTED (0x27) +#define SMP_RESPONSE_FUNCTION_RESULT_SOURCE_ZONE_GROUP_DOES_NOT_EXIST (0x28) +#define SMP_RESPONSE_FUNCTION_RESULT_DISABLED_PASSWORD_NOT_SUPPORTED (0x29) + + +/* + * SMP Report General request + */ +typedef struct _SMP_REPORT_GENERAL_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ +} SMP_REPORT_GENERAL_REQUEST, *PTR_SMP_REPORT_GENERAL_REQUEST; + +/* + * SMP Report General response + */ +typedef struct _SMP_REPORT_GENERAL_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 ExpanderRouteIndexes; /* 0x06 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 LongResponse :1; + U8 Reserved08 :7; /* 0x08 */ +#else + U8 Reserved08 :7; + U8 LongResponse :1; /* 0x08 */ +#endif + U8 NumberOfPhys; /* 0x09 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 TableToTableSup :1; /* 0x0A */ + U8 ZoneConfiguring :1; + U8 SelfConfiguring :1; + U8 StpContinueAWT :1; + U8 OpenRejectRetrySupported :1; + U8 ConfiguresOthers :1; + U8 Configuring :1; + U8 ConfigurableRouteTable :1; +#else /* little endian */ + U8 ConfigurableRouteTable :1; /* 0x0A */ + U8 Configuring :1; + U8 ConfiguresOthers :1; + U8 OpenRejectRetrySupported :1; + U8 StpContinueAWT :1; + U8 SelfConfiguring :1; + U8 ZoneConfiguring :1; + U8 TableToTableSup :1; +#endif + U8 Reserved0B; /* 0x0B */ + SAS_ADDRESS EnclosureLogicalIdentifier; /* 0x0C */ + U8 Reserved14to1B[8]; /* 0x14 */ + U16 Reserved1C; /* 0x1c */ + U16 StpBusInactivityTimeLimit; /* 0x1e */ + U16 StpMaxConnectTimeLimit; /* 0x20 */ + U16 StpNexusLossTime; /* 0x22 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 NoOfZoneGroups :2; /* 0x24 */ + U8 Reserved24 :1; + U8 ZoneLocked :1; + U8 PhysPresenceSupported :1; + U8 PhysPresenceAsserted :1; + U8 ZoningSupported :1; + U8 ZoningEnabled :1; +#else /* little endian */ + U8 ZoningEnabled :1; /* 0x24 */ + U8 ZoningSupported :1; + U8 PhysPresenceAsserted :1; + U8 PhysPresenceSupported :1; + U8 ZoneLocked :1; + U8 Reserved24 :1; + U8 NoOfZoneGroups :2; +#endif +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved25 :3; /* 0x25 */ + U8 Saving :1; + U8 SavingZoneMgrPasswdSupported :1; + U8 SavingZonePhyInfoSupported :1; + U8 SavingZonePermTableSupported :1; + U8 SavingZoningEnabledSupported :1; +#else /* little endian */ + U8 SavingZoningEnabledSupported :1; /* 0x25 */ + U8 SavingZonePermTableSupported :1; + U8 SavingZonePhyInfoSupported :1; + U8 SavingZoneMgrPasswdSupported :1; + U8 Saving :1; + U8 Reserved25 :3; +#endif + U16 MaxRoutedSasAddresses; /* 0x26 */ + SAS_ADDRESS ActiveZoneManager; /* 0x28 */ + U16 ZoneLockInactiveTime; /* 0x30 */ + U16 Reserved32; /* 0x32 */ + U8 Reserved34; /* 0x34 */ + U8 FirstEnclosureConnectorIndex; /* 0x35 */ + U8 EnclosureConnectorIndexes; /* 0x36 */ + U8 Reserved37; /* 0x37 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ReducedFunctionality :1; /* 0x38 */ + U8 Reserved38 :7; +#else /* little endian */ + U8 Reserved38 :7; /* 0x38 */ + U8 ReducedFunctionality :1; +#endif + U8 TimeToReducedFunc; /* 0x39 */ + U8 InitTimeReducedFunc; /* 0x3a */ + U8 MaxReducedFuncTime; /* 0x3b */ + + U16 LastSelfConfigStatus; /* 0x3c - 0x3d */ + U16 MaxStoredSelfConfigStatus; /* 0x3e - 0x3f */ + U16 LastPhyEventDesc; /* 0x40 - 0x41 */ + U16 MaxStoredPhyEventDesc; /* 0x43 - 0x42 */ + U16 STPRejectLimit; /* 0x44 - 0x45 */ + U16 Reserved47; /* 0x47 - 0x46 */ + U32 CRC; +} SMP_REPORT_GENERAL_RESPONSE, *PTR_SMP_REPORT_GENERAL_RESPONSE; + +/* + * SMP Report Manufacturer Information request + */ +typedef struct _SMP_REPORT_MANUFACTURER_INFO_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ +} SMP_REPORT_MANUFACTURER_INFO_REQUEST, *PTR_SMP_REPORT_MANUFACTURER_INFO_REQUEST; + +/* + * SMP Report Manufacturer Information response + */ +#define VEND_ID_LEN (8) +#define PROD_ID_LEN (16) + +#define PROD_REV_LEN (4) + +#define VEND_SPEC_LEN (8) +#define COMP_VEND_ID_LEN (8) + +typedef struct _SMP_REPORT_MANUFACTURER_INFO_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 - 0x05 */ + U16 Reserved06; /* 0x06 - 0x07 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved0ABits1to7 :7; /* 0x08 */ + U8 SAS11Format :1; +#else /* little endian */ + U8 SAS11Format :1; /* 0x08 */ + U8 Reserved0ABits1to7 :7; +#endif + U8 Reserved09; /* 0x09 */ + U8 Reserved0A; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U8 VendorIdentification[VEND_ID_LEN]; /* 0x0C */ + U8 ProductIdentification[PROD_ID_LEN]; /* 0x14 */ + U8 ProductRevisionLevel[PROD_REV_LEN]; /* 0x24 */ + U8 ComponentVendorId[COMP_VEND_ID_LEN];/* 0x28 */ + U16 ComponentId; /* 0x30 */ + U8 ComponentRevisionId; /* 0x32 */ + U8 Reserved51; /* 0x33 */ + union + { + struct + { + U8 VuX12TruncatedEnclosureId[5]; /* 0x34 */ + U8 OEMVendorUnique57to50[3]; /* 0x39 */ + }Enclosure; + U8 VendorSpecific[VEND_SPEC_LEN]; /* 0x34 */ + }u; + U32 CRC; +} SMP_REPORT_MANUFACTURER_INFO_RESPONSE, *PTR_SMP_REPORT_MANUFACTURER_INFO_RESPONSE; + + +/* + * SMP Report Self-Configuration request + */ +typedef struct _SMP_REPORT_SELF_CONFIG_STATUS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 Reserved04to05; /* 0x04 - 0x05 */ + U16 StartingStatusIndex; /* 0x06 - 0x07 */ +} SMP_REPORT_SELF_CONFIG_STATUS_REQUEST, *PTR_SMP_REPORT_SELF_CONFIG_STATUS_REQUEST; + + +/* + * SMP Report Self-Configuration response descriptor + */ +typedef struct _SMP_REPORT_SELF_CONFIG_STATUS_DESCRIPTOR +{ + U8 StatusType; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01Bits1to7 :7; /* 0x01 */ + U8 Final :1; +#else /* little endian */ + U8 Final :1; /* 0x01 */ + U8 Reserved01Bits1to7 :7; +#endif + U8 Reserved02; /* 0x02 */ + U8 PhyIdentifier; /* 0x03 */ + U32 Reserved04to07; /* 0x04 - 0x07 */ + SAS_ADDRESS SASAddress; /* 0x08 - 0x0f */ +} SMP_REPORT_SELF_CONFIG_STATUS_DESCRIPTOR, *PTR_SMP_REPORT_SELF_CONFIG_STATUS_DESCRIPTOR; + + +/* + * SMP Report Self-Configuration response + */ +typedef struct _SMP_REPORT_SELF_CONFIG_STATUS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 - 0x05 */ + U16 StartingStatusIndex; /* 0x06 - 0x07 */ + U16 TotalNumStatusDescriptors; /* 0x08 - 0x09 */ + U16 LastStatusIndex; /* 0x0a - 0x0b */ + U8 StatusDescriptorLength; /* 0x0c */ + U8 Reserved0D; /* 0x0d */ + U16 Reserved0Eto0F; /* 0x0e - 0x0f */ + U16 Reserved10to11; /* 0x10 - 0x11 */ + U8 Reserved12; /* 0x12 */ + U8 NumberStatusDescriptors; /* 0x13 */ + SMP_REPORT_SELF_CONFIG_STATUS_DESCRIPTOR StatusDescriptors[1]; /* 0x14... */ +} SMP_REPORT_SELF_CONFIG_STATUS_RESPONSE, *PTR_SMP_REPORT_SELF_CONFIG_STATUS_RESPONSE; + + +/* + * SMP Discover request + */ +typedef struct _SMP_DISCOVER_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U32 Reserved04to07; /* 0x04 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved08 :7; /* 0x08 */ + U8 NoZoneMask :1; +#else /* little endian */ + U8 NoZoneMask :1; /* 0x08 */ + U8 Reserved08 :7; +#endif + U8 PhyIdentifier; /* 0x09 */ + U16 Reserved0Ato0B; /* 0x0A */ +} SMP_DISCOVER_REQUEST, *PTR_SMP_DISCOVER_REQUEST; + +/* + * SMP Discover response + */ + + +// If type = 20h - 23h then this format is valid +typedef struct _SMP_X12_VU_SLOT_DISCOVER_REPSONSE +{ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ConnectorFieldsValid :2; + U8 ConnectorType :6; +#else /* little endian */ + U8 ConnectorType :6; + U8 ConnectorFieldsValid :2; +#endif + U8 ConnectorElementIndex; +} SMP_X12_VU_SLOT_DISCOVER_REPSONSE, * PTR_SMP_X12_VU_SLOT_DISCOVER_REPSONSE; + +// if type != 20h - 23h then this format is valid +typedef struct _SMP_X12_VU_DISCOVER_REPSONSE +{ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ConnectorFieldsValid :2; + U8 ConnectorType :6; + U8 ConnectorElementIndex :4; + U8 ConnectorPhysicalLink :4; +#else /* little endian */ + U8 ConnectorType :6; + U8 ConnectorFieldsValid :2; + U8 ConnectorPhysicalLink :4; + U8 ConnectorElementIndex :4; +#endif +} SMP_X12_VU_DISCOVER_REPSONSE, * PTR_SMP_X12_VU_DISCOVER_REPSONSE; + +typedef struct _SMP_DISCOVER_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 Reserved06; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 Reserved0A; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved0CBit7 :1; /* 0x0C */ + U8 AttachedDeviceType :3; + U8 AttachedReason :4; + U8 Reserved0DBits4to7 :4; /* 0x0D */ + U8 NegotiatedPhysLinkRate :4; + U8 Reserved0EBits4to7 :4; /* 0x0E */ + U8 AttachedSSPInitiator :1; + U8 AttachedSTPInitiator :1; + U8 AttachedSMPInitiator :1; + U8 AttachedSATAHost :1; + U8 AttachedSATAPortSelector :1; /* 0x0F */ + U8 Reserved0FBits4to6 :3; + U8 AttachedSSPTarget :1; + U8 AttachedSTPTarget :1; + U8 AttachedSMPTarget :1; + U8 AttachedSATATarget :1; +#else /* little endian */ + U8 AttachedReason :4; /* 0x0C */ + U8 AttachedDeviceType :3; + U8 Reserved0CBit7 :1; + U8 NegotiatedPhysLinkRate :4; /* 0x0D */ + U8 Reserved0DBits4to7 :4; + U8 AttachedSATAHost :1; /* 0x0E */ + U8 AttachedSMPInitiator :1; + U8 AttachedSTPInitiator :1; + U8 AttachedSSPInitiator :1; + U8 Reserved0EBits4to7 :4; + U8 AttachedSATATarget :1; /* 0x0F */ + U8 AttachedSMPTarget :1; + U8 AttachedSTPTarget :1; + U8 AttachedSSPTarget :1; + U8 Reserved0FBits4to6 :3; + U8 AttachedSATAPortSelector :1; +#endif + SAS_ADDRESS SASAddress; /* 0x10 */ + SAS_ADDRESS AttachedSASAddress; /* 0x18 */ + U8 AttachedPhyIdentifier; /* 0x20 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved21Bits3to7 :5; /* 0x21 */ + U8 AttachedInsideZpsdsPersistent :1; + U8 AttachedRequestedInsideZpsds :1; + U8 AttachedBreakReplyCapable :1; +#else /* little endian */ + U8 AttachedBreakReplyCapable :1; /* 0x21 */ + U8 AttachedRequestedInsideZpsds :1; + U8 AttachedInsideZpsdsPersistent :1; + U8 Reserved21Bits3to7 :5; +#endif + U8 Reserved22; /* 0x22 */ + U8 Reserved23; /* 0x23 */ + U32 Reserved24to27; /* 0x24 - 0x27 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ProgMinPhysLinkRate :4; /* 0x28 */ + U8 HardwareMinPhysLinkRate :4; + U8 ProgMaxPhysLinkRate :4; /* 0x29 */ + U8 HardwareMaxPhysLinkRate :4; + U8 PhyChangeCount; /* 0x2A */ + U8 VirtualPhy :1; /* 0x2B */ + U8 Reserved2BBits4to6 :3; + U8 PartialPathTimeoutValue :4; + U8 Reserved2CBits4to7 :4; /* 0x2C */ + U8 RoutingAttribute :4; + U8 Reserved2DBit7 :1; /* 0x2D */ + U8 ConnectorType :7; +#else /* little endian */ + U8 HardwareMinPhysLinkRate :4; /* 0x28 */ + U8 ProgMinPhysLinkRate :4; + U8 HardwareMaxPhysLinkRate :4; /* 0x29 */ + U8 ProgMaxPhysLinkRate :4; + U8 PhyChangeCount; /* 0x2A */ + U8 PartialPathTimeoutValue :4; /* 0x2B */ + U8 Reserved2BBits4to6 :3; + U8 VirtualPhy :1; + U8 RoutingAttribute :4; /* 0x2C */ + U8 Reserved2CBits4to7 :4; + U8 ConnectorType :7; /* 0x2D */ + U8 Reserved2DBit7 :1; +#endif + U8 ConnectorElementIndex; /* 0x2E */ + U8 ConnectorPhysicalLink; /* 0x2F */ + U8 Reserved30; /* 0x30 */ + U8 Reserved31; /* 0x31 */ + union + { + SMP_X12_VU_DISCOVER_REPSONSE VuX12Connector; /* 0x32 */ + SMP_X12_VU_SLOT_DISCOVER_REPSONSE VuX12Slot; + U16 VendorSpecific; /* 0x32 */ + } u; + SAS_ADDRESS AttachedDeviceName; /* 0x34 - 3B*/ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved3cBit7 :1; /* 0x3c */ + U8 ReqInsideZpsdsByExp :1; + U8 InsideZpsdsPersistent :1; + U8 RequestedInsideZpsds :1; + U8 Reserved3cBit3 :1; + U8 ZoneGroupPersistent :1; + U8 InsideZpsds :1; + U8 ZoningEnabled :1; +#else /* little endian */ + U8 ZoningEnabled :1; /* 0x3c */ + U8 InsideZpsds :1; + U8 ZoneGroupPersistent :1; + U8 Reserved3cBit3 :1; + U8 RequestedInsideZpsds :1; + U8 InsideZpsdsPersistent :1; + U8 ReqInsideZpsdsByExp :1; + U8 Reserved3cBit7 :1; +#endif + U16 Reserved3d; /* 0x3d */ + U8 ZoneGroup; /* 0x3f */ + U8 SelfConfigurationStatus; /* 0x40 */ + U8 SelfConfigLevelsCompleted; /* 0x41 */ + U16 Reserved42; /* 0x42 */ + SAS_ADDRESS SelfConfigSasAddress; /* 0x44 */ + U32 ProgrammedPhyCapabilities; /* 0x4C - 0x4F */ + U32 CurrentPhyCapabilities; /* 0x50 - 0x53 */ + U32 AttachedPhyCapabilities; /* 0x54 - 0x57 */ + U32 Reserved58; /* 0x58 - 0x5B */ + U16 Reserved5C; /* 0x5C - 0x5D */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reason :4; /* 0x5E */ + U8 NegotiatedPhysicalLinkRate :4; + + U8 Reserved5FBits2to7 :6; /* 0x5F */ + U8 NegotiatedSSC :1; + U8 HardwareMuxingSupported :1; + + U8 Reserved60Bits6to7 :2; /* 0x60 Bits 6 - 7 */ + U8 DefaultInsideZpsdsPersistent :1; /* 0x60 Bit 5 */ + U8 DefaultRequestedInsideZpsds :1; /* 0x60 Bit 4 */ + U8 Reserved60Bit3 :1; /* 0x60 Bit 3 */ + U8 DefaultZoneGroupPersistent :1; /* 0x60 Bit 2 */ + U8 Reserved60Bit1 :1; /* 0x60 Bit 1 */ + U8 DefaultZoningEnabled :1; /* 0x60 Bit 0 */ +#else /* little endian */ + U8 NegotiatedPhysicalLinkRate :4; /* 0x5E */ + U8 Reason :4; + + U8 HardwareMuxingSupported :1; /* 0x5F */ + U8 NegotiatedSSC :1; + U8 Reserved5FBits2to7 :6; + + U8 DefaultZoningEnabled :1; /* 0x60 Bit 0 */ + U8 Reserved60Bit1 :1; /* 0x60 Bit 1 */ + U8 DefaultZoneGroupPersistent :1; /* 0x60 Bit 2 */ + U8 Reserved60Bit3 :1; /* 0x60 Bit 3 */ + U8 DefaultRequestedInsideZpsds :1; /* 0x60 Bit 4 */ + U8 DefaultInsideZpsdsPersistent :1; /* 0x60 Bit 5 */ + U8 Reserved60Bits6to7 :2; /* 0x60 Bits 6 - 7 */ +#endif + U8 Reserved61; /* 0x61 */ + U8 Reserved62; /* 0x62 */ + U8 DefaultZoneGroup; /* 0x63 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved64Bits6to7 :2; /* 0x64 Bits 6 - 7 */ + U8 SavedInsideZpsdsPersistent :1; /* 0x64 Bit 5 */ + U8 SavedRequestedInsideZpsds :1; /* 0x64 Bit 4 */ + U8 Reserved64Bit3 :1; /* 0x64 Bit 3 */ + U8 SavedZoneGroupPersistent :1; /* 0x64 Bit 2 */ + U8 Reserved64Bit1 :1; /* 0x64 Bit 1 */ + U8 SavedZoningEnabled :1; /* 0x64 Bit 0 */ +#else /* little endian */ + U8 SavedZoningEnabled :1; /* 0x64 Bit 0 */ + U8 Reserved64Bit1 :1; /* 0x64 Bit 1 */ + U8 SavedZoneGroupPersistent :1; /* 0x64 Bit 2 */ + U8 Reserved64Bit3 :1; /* 0x64 Bit 3 */ + U8 SavedRequestedInsideZpsds :1; /* 0x64 Bit 4 */ + U8 SavedInsideZpsdsPersistent :1; /* 0x64 Bit 5 */ + U8 Reserved64Bits6to7 :2; /* 0x64 Bits 6 - 7 */ +#endif + U8 Reserved65; /* 0x65 */ + U8 Reserved66; /* 0x66 */ + U8 SavedZoneGroup; /* 0x67 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved68Bits6to7 :2; /* 0x68 Bits 6 - 7 */ + U8 ShadowInsideZpsdsPersistent :1; /* 0x68 Bit 5 */ + U8 ShadowRequestedInsideZpsds :1; /* 0x68 Bit 4 */ + U8 Reserved68Bit3 :1; /* 0x68 Bit 3 */ + U8 ShadowZoneGroupPersistent :1; /* 0x68 Bit 2 */ + U8 Reserved68Bit0to1 :2; /* 0x68 Bits 0 -1 */ +#else /* little endian */ + U8 Reserved68Bit0to1 :2; /* 0x68 Bits 0 -1 */ + U8 ShadowZoneGroupPersistent :1; /* 0x68 Bit 2 */ + U8 Reserved68Bit3 :1; /* 0x68 Bit 3 */ + U8 ShadowRequestedInsideZpsds :1; /* 0x68 Bit 4 */ + U8 ShadowInsideZpsdsPersistent :1; /* 0x68 Bit 5 */ + U8 Reserved68Bits6to7 :2; /* 0x68 Bits 6 - 7 */ +#endif + U8 Reserved69; /* 0x69 */ + U8 Reserved6A; /* 0x6A */ + U8 ShadowZoneGroup; /* 0x6B */ + U8 DeviceSlotNumber; /* 0x6C */ + U8 GroupNumber; /* 0x6D */ + U16 PathToEnclosure[3]; /* 0x6E */ + U32 CRC; +} SMP_DISCOVER_RESPONSE, *PTR_SMP_DISCOVER_RESPONSE; + +/* Discover attached device types */ +#define SMP_DISCOVER_ATTACHED_DEVICE_TYPE_NO_DEVICES_ATTACHED (0x0) +#define SMP_DISCOVER_ATTACHED_DEVICE_TYPE_END_DEVICE_ONLY (0x1) +#define SMP_DISCOVER_ATTACHED_DEVICE_TYPE_EDGE_EXPANDER (0x2) +#define SMP_DISCOVER_ATTACHED_DEVICE_TYPE_FANOUT_EXPANDER (0x3) + +/* Discover negotiated physical link rate */ +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_UNKNOWN_RATE (0x0) +#define SMP_NEG_PHYS_LINK_RATE_PHY_DISABLED (0x1) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_SPEED_NEG_FAILED (0x2) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_IN_SATA_SPINUP_HOLD (0x3) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_PORT_SELECTOR (0x4) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_RESET_IN_PROGRESS (0x5) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_AT_1_5_GBPS (0x8) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_AT_3_0_GBPS (0x9) +#define SMP_NEG_PHYS_LINK_RATE_PHY_ENABLED_AT_6_0_GBPS (0xA) + +/* Discover hardware and programmed physical link rates */ +#define SMP_DISCOVER_PHYSICAL_LINK_RATE_NOT_PROGRAMMABLE (0x0) +#define SMP_DISCOVER_PHYSICAL_LINK_RATE_1_5_GBPS (0x8) +#define SMP_DISCOVER_PHYSICAL_LINK_RATE_3_0_GBPS (0x9) +#define SMP_DISCOVER_PHYSICAL_LINK_RATE_6_0_GBPS (0xA) + +/* Discover routing attributes */ +#define SMP_DISCOVER_ROUTING_ATTRIBUTE_DIRECT_ROUTING (0x0) +#define SMP_DISCOVER_ROUTING_ATTRIBUTE_SUBTRACTIVE_ROUTING (0x1) +#define SMP_DISCOVER_ROUTING_ATTRIBUTE_TABLE_ROUTING (0x2) + +#define SMP_DISCOVER_CONNECTOR_FIELDS_VALID (0x2) +/* Valid Connector Types*/ +#define SMP_DISCOVER_CONNECTOR_TYPE_UNKNOWN (0X00) +#define SMP_DISCOVER_CONNECTOR_TYPE_SAS_EXTERNAL (0X01) +#define SMP_DISCOVER_CONNECTOR_TYPE_SAS_INTERNAL (0X10) +#define SMP_DISCOVER_CONNECTOR_TYPE_SAS_BACKPLANE_RECEPTACLE (0X20) +#define SMP_DISCOVER_CONNECTOR_TYPE_SATA_HOST_PLUG (0X21) +#define SMP_DISCOVER_CONNECTOR_TYPE_SAS_PLUG (0X22) +#define SMP_DISCOVER_CONNECTOR_TYPE_SATA_DEVICE_PLUG (0X23) + + +/* + * SMP Report Phy Error Log request + */ +typedef struct _SMP_REPORT_PHY_ERROR_LOG_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U32 Reserved04to07; /* 0x04 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U16 Reserved0Ato0B; /* 0x0A */ +} SMP_REPORT_PHY_ERROR_LOG_REQUEST, *PTR_SMP_REPORT_PHY_ERROR_LOG_REQUEST; + +/* + * SMP Report Phy Error Log response + */ +typedef struct _SMP_REPORT_PHY_ERROR_LOG_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 Reserved06; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 Reserved0A; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ + U32 InvalidDwordCount; /* 0x0C */ + U32 RunningDisparityErrorCount; /* 0x10 */ + U32 LossOfDwordSynchronizationCount; /* 0x14 */ + U32 PhyResetProblemCount; /* 0x18 */ + U32 CRC; +} SMP_REPORT_PHY_ERROR_LOG_RESPONSE, *PTR_SMP_REPORT_PHY_ERROR_LOG_RESPONSE; + +/* + * SMP Report Phy SATA request + */ +typedef struct _SMP_REPORT_PHY_SATA_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U32 Reserved04to07; /* 0x04 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 AffiliationContext; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ +} SMP_REPORT_PHY_SATA_REQUEST, *PTR_SMP_REPORT_PHY_SATA_REQUEST; + +/* + * SMP Report Phy SATA response + */ +typedef struct _SMP_REPORT_PHY_SATA_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 Reserved06; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 Reserved0A; /* 0x0A */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved0BBits3to7 :5; /* 0x0B */ + U8 StpITNexusLossOccurred :1; + U8 AffiliationsSupported :1; + U8 AffiliationValid :1; +#else /* little endian */ + U8 AffiliationValid :1; /* 0x0B */ + U8 AffiliationsSupported :1; + U8 StpITNexusLossOccurred :1; + U8 Reserved0BBits3to7 :5; +#endif + U32 Reserved0Cto0F; /* 0x0C */ + SAS_ADDRESS STPSASAddress; /* 0x10 */ + REGISTER_DEVICE_TO_HOST_FIS RegisterDeviceToHostFIS; /* 0x18 */ /* Defined in ata.h */ + U32 Reserved2Cto2F; /* 0x2C */ + SAS_ADDRESS AffiliatedSTPInitiatorSASAddress; /* 0x30 */ + SAS_ADDRESS StpITNexusLossSASAddress; /* 0x38 - 0x3F */ + U8 Reserved46; /* 0x40 */ + U8 AffiliationContext; /* 0x41 */ + U8 CurrentAffiliationContexts; /* 0x42 */ + U8 MaximumAffiliationContexts; /* 0x43 */ + U32 CRC; +} SMP_REPORT_PHY_SATA_RESPONSE, *PTR_SMP_REPORT_PHY_SATA_RESPONSE; + +/* + * SMP Report Route Information request + */ +typedef struct _SMP_REPORT_ROUTE_INFO_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 Reserved04to05; /* 0x04 */ + U16 ExpanderRouteIndex; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U16 Reserved0Ato0B; /* 0x0A */ +} SMP_REPORT_ROUTE_INFO_REQUEST, *PTR_SMP_REPORT_ROUTE_INFO_REQUEST; + +/* + * SMP Report Route Information response + */ +typedef struct _SMP_REPORT_ROUTE_INFO_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 ExpanderRouteIndex; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 Reserved0A; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 RouteEntryDisabled :1; /* 0x0C */ + U8 Reserved0CBits0to6 :7; +#else /* little endian */ + U8 Reserved0CBits0to6 :7; /* 0x0C */ + U8 RouteEntryDisabled :1; +#endif + U8 Reserved0Dto0F[3]; /* 0x0D */ + SAS_ADDRESS RoutedSASAddress; /* 0x10 */ + U8 Reserved18to23[12]; /* 0x18 */ + U32 Reserved24to27; /* 0x24 */ + U32 CRC; +} SMP_REPORT_ROUTE_INFO_RESPONSE, *PTR_SMP_REPORT_ROUTE_INFO_RESPONSE; + +/* + * SMP Configure Route Information request + */ +typedef struct _SMP_CONFIGURE_ROUTE_INFO_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 ExpanderRouteIndex; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U16 Reserved0Aand0B; /* 0x0A */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 DisableRouteEntry :1; /* 0x0C */ + U8 Reserved0CBits0to6 :7; +#else /* little endian */ + U8 Reserved0CBits0to6 :7; /* 0x0C */ + U8 DisableRouteEntry :1; +#endif + U8 Reserved0Dto0F[3]; /* 0x0D */ + SAS_ADDRESS RoutedSASAddress; /* 0x10 */ + U8 Reserved18to23[12]; /* 0x18 */ + U32 Reserved24to27; /* 0x24 */ +} SMP_CONFIGURE_ROUTE_INFO_REQUEST, *PTR_SMP_CONFIGURE_ROUTE_INFO_REQUEST; + +/* + * SMP Configure Route Information response + */ + +typedef struct _SMP_CONFIGURE_ROUTE_INFO_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_CONFIGURE_ROUTE_INFO_RESPONSE, *PTR_SMP_CONFIGURE_ROUTE_INFO_RESPONSE; + +/* + * SMP Report Expander Route Table request + */ +typedef struct _SMP_REPORT_EXP_ROUTE_TABLE_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U32 Reserved04to07; /* 0x04 */ + U16 MaxNumDescriptors; /* 0x08 */ + U16 StartingRoutedSASAddressIdx; /* 0x0A */ + U32 Reserved0Cto0F; /* 0x0C */ + U16 Reserved10and11; /* 0x10 */ + U8 Reserved12; /* 0x12 */ + U8 StartingPhyId; /* 0x13 */ + U32 Reserved14to17; /* 0x14 */ + U32 Reserved18to1B; /* 0x18 */ +} SMP_REPORT_EXP_ROUTE_TABLE_REQUEST, *PTR_SMP_REPORT_EXP_ROUTE_TABLE_REQUEST; + +#define SMP_REPORT_EXP_ROUTE_TABLE_REQUEST_LENGTH (0x06) + +typedef struct _SMP_REPORT_EXP_ROUTE_TABLE_DESCRIPTOR +{ + SAS_ADDRESS RoutedSASAddress; /* 0x00 */ + U32 PhyBitMapBit16to47; /* 0x08 */ + U16 PhyBitMapBit0to15; /* 0x0C */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ZoneGroupValid :1; /* 0x0E */ + U8 Reserved0EBit0to6 :7; +#else + U8 Reserved0EBit0to6 :7; /* 0x0E */ + U8 ZoneGroupValid :1; +#endif + U8 ZoneGroup; /* 0x0F */ +} SMP_REPORT_EXP_ROUTE_TABLE_DESCRIPTOR, *PTR_SMP_REPORT_EXP_ROUTE_TABLE_DESCRIPTOR; + +/* + * SMP Report Expander Route Table response + */ +typedef struct _SMP_REPORT_EXP_ROUTE_TABLE_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 ExpRouteTableChangeCnt; /* 0x06 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved08Bit4to7 :4; /* 0x08 */ + U8 SelfConfiguring :1; + U8 ZoneConfiguring :1; + U8 Configuring :1; + U8 Reserved08Bit0 :1; +#else + U8 Reserved08Bit0 :1; /* 0x08 */ + U8 Configuring :1; + U8 ZoneConfiguring :1; + U8 SelfConfiguring :1; + U8 Reserved08Bit4to7 :4; +#endif + U8 Reserved09; /* 0x09 */ + U8 ExpanderRouteTableDescriptorLength; /* 0x0A */ + U8 NumDescriptors; /* 0x0B */ + U16 FirstRoutedSASAddrIdx; /* 0x0C */ + U16 LastRoutedSASAddrIdx; /* 0x0E */ + U16 Reserved10and11; /* 0x10 */ + U8 Reserved12; /* 0x12 */ + U8 StartingPhyIdentifier; /* 0x13 */ + U32 Reserved20to23; /* 0x14 */ + U32 Reserved24to27; /* 0x18 */ + U32 Reserved28to31; /* 0x1c */ + SMP_REPORT_EXP_ROUTE_TABLE_DESCRIPTOR ExpRouteTableDesc[1]; /* 0x20 */ +}SMP_REPORT_EXP_ROUTE_TABLE_RESPONSE, *PTR_SMP_REPORT_EXP_ROUTE_TABLE_RESPONSE; + +/* This define was calculated by taking the maximum response size of 1024 + * subtracting the non-descriptor response size of 32 bytes and dividing + * by the descriptor size + */ +#define MAX_REPORT_EXP_ROUTE_TABLE_DESCRIPTOR (1024 - 32)/sizeof(SMP_REPORT_EXP_ROUTE_TABLE_DESCRIPTOR) + +/* + * SMP Phy Control request + */ +typedef struct _SMP_PHY_CONTROL_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 Reserved06to07; /* 0x06 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 PhyOperation; /* 0x0A */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved0BBits1to7 :7; /* 0x0B */ + U8 UpdatePartialPathTimeoutValue :1; +#else /* little endian */ + U8 UpdatePartialPathTimeoutValue :1; /* 0x0B */ + U8 Reserved0BBits1to7 :7; +#endif + + U32 Reserved0C; /* 0x0C - 0x0F */ + U32 Reserved10; /* 0x10 - 0x13 */ + U32 Reserved14; /* 0x14 - 0x17 */ + SAS_ADDRESS AttachedDeviceName; /* 0x18 - 0x1F */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ProgMinPhysLinkRate :4; /* 0x20 */ + U8 Reserved20Bits0to3 :4; + U8 ProgMaxPhysLinkRate :4; /* 0x21 */ + U8 Reserved21Bits0to3 :4; + U16 Reserved22to23; /* 0x22 */ + U8 Reserved24Bits4to7 :4; /* 0x24 */ + U8 PartialPathTimeoutValue :4; +#else /* little endian */ + U8 Reserved20Bits0to3 :4; /* 0x20 */ + U8 ProgMinPhysLinkRate :4; + U8 Reserved21Bits0to3 :4; /* 0x21 */ + U8 ProgMaxPhysLinkRate :4; + U16 Reserved22to23; /* 0x22 */ + U8 PartialPathTimeoutValue :4; /* 0x24 */ + U8 Reserved24Bits4to7 :4; +#endif + U8 Reserved25; /* 0x25 */ + U16 Reserved26and27; /* 0x26 */ +} SMP_PHY_CONTROL_REQUEST, *PTR_SMP_PHY_CONTROL_REQUEST; + +/* Phy Control Phy operation field */ +#define SMP_PHY_CONTROL_PHY_OPERATION_NOP (0x00) +#define SMP_PHY_CONTROL_PHY_OPERATION_LINK_RESET (0x01) +#define SMP_PHY_CONTROL_PHY_OPERATION_HARD_RESET (0x02) +#define SMP_PHY_CONTROL_PHY_OPERATION_DISABLE (0x03) +#define SMP_PHY_CONTROL_PHY_OPERATION_CLEAR_ERROR_LOG (0x05) +#define SMP_PHY_CONTROL_PHY_OPERATION_CLEAR_AFFILIATION (0x06) +#define SMP_PHY_CONTROL_TRANSMIT_SATA_PORT_SEL_SIGNAL (0x07) + +/* Phy Control programmed physical link rates */ +#define SMP_PHY_CONTROL_PHYSICAL_LINK_RATE_DONT_CHANGE (0x0) +#define SMP_PHY_CONTROL_PHYSICAL_LINK_RATE_1_5_GBPS (0x8) +#define SMP_PHY_CONTROL_PHYSICAL_LINK_RATE_3_0_GBPS (0x9) + +/* + * SMP Phy Control response + */ + +typedef struct _SMP_PHY_CONTROL_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_PHY_CONTROL_RESPONSE, *PTR_SMP_PHY_CONTROL_RESPONSE; + + +/* set allowable vendor unique write size to maximum - SDE12 EDS shows + * granularity as double dwords, but just treat as dwords here + */ +#define MAX_SMP_REGISTERS (254) + + +/* + * This section contains generic SGPIO R/W SMP commands + */ + +typedef struct _SMP_READ_N_GPIO_REGISTERS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 RegisterType; /* 0x02 */ + U8 RegisterIndex; /* 0x03 */ + U8 RegisterCount; /* 0x04 */ + U8 Reserved05[3]; /* 0x05 */ +} SMP_READ_N_GPIO_REGISTERS_REQUEST, *PTR_SMP_READ_N_GPIO_REGISTERS_REQUEST; + +typedef struct _SMP_READ_N_GPIO_REGISTERS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 ReadData[1]; /* 0x08-... */ + /* Note this field can actually be up to MAX_SMP_REGISTERS dwords long */ +} SMP_READ_N_GPIO_REGISTERS_RESPONSE, *PTR_SMP_READ_N_GPIO_REGISTERS_RESPONSE; + +typedef struct _SMP_WRITE_N_GPIO_REGISTERS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 RegisterType; /* 0x02 */ + U8 RegisterIndex; /* 0x03 */ + U8 RegisterCount; /* 0x04 */ + U8 Reserved05[3]; /* 0x05 */ + U32 WriteData[1]; /* 0x08-... */ + /* Note this field can actually be up to MAX_SMP_REGISTERS dwords long */ +} SMP_WRITE_N_GPIO_REGISTERS_REQUEST, *PTR_SMP_WRITE_N_GPIO_REGISTERS_REQUEST; + +typedef struct _SMP_WRITE_N_REGISTERS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 CRC; +} SMP_WRITE_N_GPIO_REGISTERS_RESPONSE, *PTR_SMP_WRITE_N_GPIO_REGISTERS_RESPONSE; + +/* This section contains vendor unique SMP commands for the LSI expander */ + +#define LSI_AHB_WRITE_N_BYTE_WRITE (0x08000000) +#define LSI_AHB_WRITE_N_ADDR_MASK (0xf7ffffff) + +typedef struct _SMP_LSI_AHB_WRITE_N_REGISTERS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 N; /* 0x03 */ + U32 StartAddr; /* 0x04 - 0x07 */ + U32 WriteData[1]; /* 0x08-... */ +} SMP_LSI_AHB_WRITE_N_REGISTERS_REQUEST, *PTR_SMP_LSI_AHB_WRITE_N_REGISTERS_REQUEST; + +typedef struct _SMP_LSI_AHB_WRITE_N_REGISTERS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 CRC; +} SMP_LSI_AHB_WRITE_N_REGISTERS_RESPONSE, *PTR_SMP_LSI_AHB_WRITE_N_REGISTERS_RESPONSE; + +typedef struct _SMP_LSI_AHB_READ_N_REGISTERS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 N; /* 0x03 */ + U32 StartAddr; /* 0x04 - 0x07 */ +} SMP_LSI_AHB_READ_N_REGISTERS_REQUEST, *PTR_SMP_LSI_AHB_READ_N_REGISTERS_REQUEST; + +typedef struct _SMP_LSI_AHB_READ_N_REGISTERS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 ReadData[1]; /* 0x04-... */ +} SMP_LSI_AHB_READ_N_REGISTERS_RESPONSE, *PTR_SMP_LSI_AHB_READ_N_REGISTERS_RESPONSE; + +typedef struct _SMP_LSIX12_WRITE_N_REGISTERS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 N; /* 0x03 */ + U16 StartAdr; /* 0x04 */ + U8 StartByteEnables; /* 0x06 */ + U8 EndByteEnables; /* 0x07 */ + U32 WriteData[2]; /* 0x08-... */ + /* Note this field can actually be up to MAX_SMP_REGISTERS dwords long */ +} SMP_LSIX12_WRITE_N_REGISTERS_REQUEST, *PTR_SMP_LSIX12_WRITE_N_REGISTERS_REQUEST; + +typedef struct _SMP_LSIX12_WRITE_N_REGISTERS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 CRC; +} SMP_LSIX12_WRITE_N_REGISTERS_RESPONSE, *PTR_SMP_LSIX12_WRITE_N_REGISTERS_RESPONSE; + +typedef struct _SMP_LSIX12_READ_N_REGISTERS_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 Reserved02; /* 0x02 */ + U8 N; /* 0x03 */ + U16 StartAdr; /* 0x04 */ + U16 Reserved06and07; /* 0x06 */ + +} SMP_LSIX12_READ_N_REGISTERS_REQUEST, *PTR_SMP_LSIX12_READ_N_REGISTERS_REQUEST; + +typedef struct _SMP_LSIX12_READ_N_REGISTERS_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 ReadData[1]; /* 0x04-... */ + /* Note this field can actually be up to MAX_SMP_REGISTERS dwords long */ +} SMP_LSIX12_READ_N_REGISTERS_RESPONSE, *PTR_SMP_LSIX12_READ_N_REGISTERS_RESPONSE; + + +#define SMP_SGPIO_REGISTER_TYPE_CFG (0) +#define SMP_SGPIO_REGISTER_TYPE_RX (1) +#define SMP_SGPIO_REGISTER_TYPE_RX_GP (2) +#define SMP_SGPIO_REGISTER_TYPE_TX (3) +#define SMP_SGPIO_REGISTER_TYPE_TX_GP (4) + +/* + * SMP ICL Discover request + */ +typedef struct _SMP_ICL_DISCOVER_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U16 Reserved02and03; /* 0x02 */ + U32 Ignored04to07; /* 0x04 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 Ignored0A; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ +} SMP_ICL_DISCOVER_REQUEST, *PTR_SMP_ICL_DISCOVER_REQUEST; + +/* + * SMP ICL Discover response + */ + +typedef struct _SMP_ICL_DISCOVER_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 Reserved03; /* 0x03 */ + U32 Ignored04to07; /* 0x04 */ + U8 Reserved08; /* 0x08 */ + U8 PhyIdentifier; /* 0x09 */ + U8 Ignored0A; /* 0x0A */ + U8 Reserved0B; /* 0x0B */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved0CBit7 :1; /* 0x0C */ + U8 AttachedDeviceType :3; + U8 Ignored0CBits0to3 :4; + U8 Reserved0DBits4to7 :4; /* 0x0D */ + U8 NegotiatedPhysLinkRate :4; + U8 Reserved0EBits4to7 :4; /* 0x0E */ + U8 AttachedSSPInitiator :1; + U8 AttachedSTPInitiator :1; + U8 AttachedSMPInitiator :1; + U8 AttachedSATAHost :1; + U8 Reserved0FBits4to7 :4; /* 0x0F */ + U8 AttachedSSPTarget :1; + U8 AttachedSTPTarget :1; + U8 AttachedSMPTarget :1; + U8 AttachedSATATarget :1; + SAS_ADDRESS SASAddress; /* 0x10 */ + SAS_ADDRESS AttachedSASAddress; /* 0x18 */ + U8 AttachedPhyIdentifier; /* 0x20 */ + U8 Reserved21to27[7]; /* 0x21 */ + U8 ProgMinPhysLinkRate :4; /* 0x28 */ + U8 HardwareMinPhysLinkRate :4; + U8 ProgMaxPhysLinkRate :4; /* 0x29 */ + U8 HardwareMaxPhysLinkRate :4; + U8 PhyChangeCount; /* 0x2A */ + U8 VirtualPhy :1; /* 0x2B */ + U8 Reserved2BBits4to6 :3; + U8 PartialPathTimeoutValue :4; + U8 Reserved2CBits4to7 :4; /* 0x2C */ + U8 RoutingAttribute :4; + U8 Reserved2DBit7 :1; /* 0x2D */ + U8 ConnectorType :7; +#else /* little endian */ + U8 Ignored0CBits0to3 :4; /* 0x0C */ + U8 AttachedDeviceType :3; + U8 Reserved0CBit7 :1; + U8 NegotiatedPhysLinkRate :4; /* 0x0D */ + U8 Reserved0DBits4to7 :4; + U8 AttachedSATAHost :1; /* 0x0E */ + U8 AttachedSMPInitiator :1; + U8 AttachedSTPInitiator :1; + U8 AttachedSSPInitiator :1; + U8 Reserved0EBits4to7 :4; + U8 AttachedSATATarget :1; /* 0x0F */ + U8 AttachedSMPTarget :1; + U8 AttachedSTPTarget :1; + U8 AttachedSSPTarget :1; + U8 Reserved0FBits4to7 :4; + SAS_ADDRESS SASAddress; /* 0x10 */ + SAS_ADDRESS AttachedSASAddress; /* 0x18 */ + U8 AttachedPhyIdentifier; /* 0x20 */ + U8 Reserved21to27[7]; /* 0x21 */ + U8 HardwareMinPhysLinkRate :4; /* 0x28 */ + U8 ProgMinPhysLinkRate :4; + U8 HardwareMaxPhysLinkRate :4; /* 0x29 */ + U8 ProgMaxPhysLinkRate :4; + U8 PhyChangeCount; /* 0x2A */ + U8 PartialPathTimeoutValue :4; /* 0x2B */ + U8 Reserved2BBits4to6 :3; + U8 VirtualPhy :1; + U8 RoutingAttribute :4; /* 0x2C */ + U8 Reserved2CBits4to7 :4; + U8 ConnectorType :7; /* 0x2D */ + U8 Reserved2DBit7 :1; +#endif + + U8 ConnectorElementIndex; + U8 ConnectorPhysicalLink; + U16 Reserved30to31; + + /* Vendor Unique */ + union + { + SMP_X12_VU_DISCOVER_REPSONSE VuX12Connector; /* 0x32 */ + SMP_X12_VU_SLOT_DISCOVER_REPSONSE VuX12Slot; + U16 VendorSpecific; /* 0x32 */ + }u; + U32 CRC; + +} SMP_ICL_DISCOVER_RESPONSE, *PTR_SMP_ICL_DISCOVER_RESPONSE; + +/* + * SMP Configure Zone Phy request + */ +typedef struct _SMP_CONFIGURE_ZONE_PHY_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ZonePhyConfigDescriptorLength :6; /* 0x06 */ + U8 Save :2; /* 0x06 */ +#else /* little endian */ + U8 Save :2; /* 0x06 */ + U8 ZonePhyConfigDescriptorLength :6; /* 0x06 */ +#endif + U8 NumberOfZonePhyEntries; /* 0x07 */ + /* note: zone phy entry data follows... */ +} SMP_CONFIGURE_ZONE_PHY_REQUEST, *PTR_SMP_CONFIGURE_ZONE_PHY_REQUEST; + +typedef struct _SMP_ZONE_PHY_CONFIG_DESCRIPTOR +{ + U8 PhyIdentifier; /* 0x00 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved01a :2; /* 0x01 */ + U8 InsideZpsdsPersistent :1; + U8 ReqInsideZpsds :1; + U8 Reserved01b :1; + U8 ZoneGroupPersistent :1; + U8 Reserved01 :2; +#else /* little endian */ + U8 Reserved01 :2; /* 0x01 */ + U8 ZoneGroupPersistent :1; + U8 Reserved01b :1; + U8 ReqInsideZpsds :1; + U8 InsideZpsdsPersistent :1; + U8 Reserved01a :2; +#endif + U8 Reserved02; /* 0x02 */ + U8 ZoneGroup; /* 0x03 */ +} SMP_ZONE_PHY_CONFIG_DESCRIPTOR, *PTR_SMP_ZONE_PHY_CONFIG_DESCRIPTOR; + +/* + * SMP Configure Zone Phy response + */ + +typedef struct _SMP_CONFIGURE_ZONE_PHY_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_CONFIGURE_ZONE_PHY_RESPONSE, *PTR_SMP_CONFIGURE_ZONE_PHY_RESPONSE; + +/* + * SMP Configure Zone Permission request + */ +typedef struct _SMP_CONFIGURE_ZONE_PERMISSION_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U8 StartSrcZoneGroup; /* 0x06 */ + U8 NumberOfZoneDescr; /* 0x07 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 NumberOfZoneGroups :2; /* 0x08 */ + U8 Reserved07 :4; + U8 Save :2; +#else /* little endian */ + U8 Save :2; /* 0x08 */ + U8 Reserved07 :4; + U8 NumberOfZoneGroups :2; +#endif + U8 ZonePermCfgDescLen; /* 0x09 */ + U16 Reserved0Ato0B; /* 0x0A - 0x0B */ + U32 Reserved0Cto0F; /* 0x0C - 0x0F */ + /* note: zone permission data follows... */ +} SMP_CONFIGURE_ZONE_PERMISSION_REQUEST, *PTR_SMP_CONFIGURE_ZONE_PERMISSION_REQUEST; + +typedef struct _SMP_ZONE_PERMISSION_DESCRIPTOR +{ + U8 PermBits[32]; +} SMP_ZONE_PERMISSION_DESCRIPTOR, *PTR_SMP_ZONE_PERMISSION_DESCRIPTOR; + +typedef struct _SMP_ZONE_PERMISSION_DESCRIPTOR_YETI +{ + U8 PermBits[16]; +} SMP_ZONE_PERMISSION_DESCRIPTOR_YETI, *PTR_SMP_ZONE_PERMISSION_DESCRIPTOR_YETI; + +/* + * SMP Configure Zone Phy response + */ + +typedef struct _SMP_CONFIGURE_ZONE_PERMISSION_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_CONFIGURE_ZONE_PERMISSION_RESPONSE, *PTR_SMP_CONFIGURE_ZONE_PERMISSION_RESPONSE; + +/* + * SMP Report Zone Permission request + */ +typedef struct _SMP_REPORT_ZONE_PERMISSION_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved04 :6; /* 0x04 */ + U8 ReportType :2; +#else /* little endian */ + U8 ReportType :2; /* 0x04 */ + U8 Reserved04 :6; +#endif + U8 Reserved05; /* 0x05 */ + U8 StartSrcZoneGroup; /* 0x06 */ + U8 MaxNumberOfZoneDescr; /* 0x07 */ +} SMP_REPORT_ZONE_PERMISSION_REQUEST, *PTR_SMP_REPORT_ZONE_PERMISSION_REQUEST; + +/* + * SMP Report Zone Permission Response + */ + +typedef struct _SMP_REPORT_ZONE_PERMISSION_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 ZoneLocked :1; /* 0x06 */ + U8 Reserved06 :5; + U8 ReportType :2; + + U8 NumberOfZoneGroups :2; /* 0x07 Bits 6 - 7 */ + U8 Reserved07Bit0to5 :6; /* 0x07 Bits 0 - 5 */ + +#else /* little endian */ + U8 ReportType :2; /* 0x06 */ + U8 Reserved06 :5; + U8 ZoneLocked :1; + + U8 Reserved07Bit0to5 :6; /* 0x07 Bits 0 - 5 */ + U8 NumberOfZoneGroups :2; /* 0x07 Bits 6 - 7 */ +#endif + U32 Reserved08; /* 0x08 */ + U8 Reserved0c; /* 0x0c */ + U8 ZonePermissionDescriptorLength; /* 0x0d */ + U8 StartSrcZoneGroup; /* 0x0e */ + U8 NumberZonePermissionDescr; /* 0x0f */ + /* zone permission descriptors start here ... */ +} SMP_REPORT_ZONE_PERMISSION_RESPONSE, *PTR_SMP_REPORT_ZONE_PERMISSION_RESPONSE; + +/* + * SMP Enable / Disable Zoning request + */ +typedef struct _SMP_ENABLE_DISABLE_ZONING_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved06 :6; /* 0x06 */ + U8 Save :2; +#else /* little endian */ + U8 Save :2; /* 0x06 */ + U8 Reserved06 :6; +#endif + U8 Reserved07; /* 0x07 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved08 :6; /* 0x08 */ + U8 EnableDisableZoning :2; +#else /* little endian */ + U8 EnableDisableZoning :2; /* 0x08 */ + U8 Reserved08 :6; +#endif + U8 Reserved09; /* 0x09 */ + U16 Reserved0a; /* 0x0a */ +} SMP_ENABLE_DISABLE_ZONING_REQUEST, *PTR_SMP_ENABLE_DISABLE_ZONING_REQUEST; + +#define SMP_ENABLE_NO_CHANGE (0x00) +#define SMP_ENABLE_ENABLE (0x01) +#define SMP_ENABLE_DISABLE (0x02) +#define SMP_ENABLE_DISABLE_RESERVED (0x03) + +/* + * SMP Enable / Disable Zoning response + */ + +typedef struct _SMP_ENABLE_DISABLE_ZONING_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_ENABLE_DISABLE_ZONING_RESPONSE, *PTR_SMP_ENABLE_DISABLE_ZONING_RESPONSE; + +/* + * SMP Zone Activate request + */ +typedef struct _SMP_ZONE_ACTIVATE_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 Reserved06; /* 0x06 */ +} SMP_ZONE_ACTIVATE_REQUEST, *PTR_SMP_ZONE_ACTIVATE_REQUEST; + +/* + * SMP Zone Activate response + */ + +typedef struct _SMP_ZONE_ACTIVATE_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_ZONE_ACTIVATE_RESPONSE, *PTR_SMP_ZONE_ACTIVATE_RESPONSE; + + +/* + * SMP Configure Zone Manager Password request */ + +#define SMP_ZONE_PASSWORD_LEN (32) + +typedef struct _SMP_CONFIGURE_ZONE_MANAGER_PASSWORD_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved06 :6; /* 0x06 */ + U8 Save :2; +#else /* little endian */ + U8 Save :2; /* 0x06 */ + U8 Reserved06 :6; +#endif + U8 Reserved07; /* 0x07 */ + U8 ZoneManagerPassword[SMP_ZONE_PASSWORD_LEN]; /* 0x08 - 0x27 */ + U8 NewZoneManagerPassword[SMP_ZONE_PASSWORD_LEN]; /* 0x28 - 0x47 */ + +} SMP_CONFIGURE_ZONE_MANAGER_PASSWORD_REQUEST, *PTR_SMP_CONFIGURE_ZONE_MANAGER_PASSWORD_REQUEST; + +/* + * SMP Configure Zone Manager Password response */ + +typedef struct _SMP_CONFIGURE_ZONE_MANAGER_PASSWORD_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_CONFIGURE_ZONE_MANAGER_PASSWORD_RESPONSE, *PTR_SMP_CONFIGURE_ZONE_MANAGER_PASSWORD_RESPONSE; + + +/* + * SMP Zone Lock request + */ + +typedef struct _SMP_ZONE_LOCK_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 ExpanderChangeCount; /* 0x04 */ + U16 ZoneLockInactivityTimeLimit; /* 0x06 */ + U8 ZonePassword[SMP_ZONE_PASSWORD_LEN];/* 0x08 */ +} SMP_ZONE_LOCK_REQUEST, *PTR_SMP_ZONE_LOCK_REQUEST; + +/* + * SMP Zone Lock response + */ +typedef struct _SMP_ZONE_LOCK_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 Reserved04; /* 0x04 */ + SAS_ADDRESS ActiveZoneManager; /* 0x08 */ + U32 CRC; +} SMP_ZONE_LOCK_RESPONSE, *PTR_SMP_ZONE_LOCK_RESPONSE; + +/* + * SMP Zone Unlock request + */ +typedef struct _SMP_ZONE_UNLOCK_REQUEST +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 ResponseLength; /* 0x02 */ + U8 RequestLength; /* 0x03 */ + U16 Reserved04; /* 0x04 */ +#if defined( __LSIUTIL_BIG_ENDIAN__ ) + U8 Reserved06 :7; /* 0x06 */ + U8 ActivateRequired :1; +#else /* little endian */ + U8 ActivateRequired :1; /* 0x06 */ + U8 Reserved06 :7; +#endif + U8 Reserved07; /* 0x07 */ +} SMP_ZONE_UNLOCK_REQUEST, *PTR_SMP_ZONE_UNLOCK_REQUEST; + +/* + * SMP Zone Unlock response + */ +typedef struct _SMP_ZONE_UNLOCK_RESPONSE +{ + U8 SMPFrameType; /* 0x00 */ + U8 Function; /* 0x01 */ + U8 FunctionResult; /* 0x02 */ + U8 ResponseLength; /* 0x03 */ + U32 CRC; +} SMP_ZONE_UNLOCK_RESPONSE, *PTR_SMP_ZONE_UNLOCK_RESPONSE; + +/* Union of all the SMP Request Frames */ +typedef union _SMP_REQUEST_UNION +{ + SMP_REQUEST SMPRequestGeneric; + SMP_REPORT_GENERAL_REQUEST SMPReportGeneralRequest; + SMP_REPORT_MANUFACTURER_INFO_REQUEST SMPReportManufacturerInfoRequest; + SMP_REPORT_SELF_CONFIG_STATUS_REQUEST SMPReportSelfConfigStatusRequest; + SMP_DISCOVER_REQUEST SMPDiscoverRequest; + SMP_REPORT_PHY_ERROR_LOG_REQUEST SMPReportPhyErrorLogRequest; + SMP_REPORT_PHY_SATA_REQUEST SMPReportPhySataRequest; + SMP_REPORT_ROUTE_INFO_REQUEST SMPReportRouteInfoRequest; + SMP_CONFIGURE_ROUTE_INFO_REQUEST SMPConfigureRouteInfoRequest; + SMP_REPORT_EXP_ROUTE_TABLE_REQUEST SMPReportExpRouteTableRequest; + SMP_PHY_CONTROL_REQUEST SMPPhyControlRequest; + /* These are generic SGPIO Register R/W */ + SMP_WRITE_N_GPIO_REGISTERS_REQUEST SMPWriteNGpioRegistersRequest; + SMP_READ_N_GPIO_REGISTERS_REQUEST SMPReadNGpioRegistersRequest; + /* These are vendor unique for Sasquatch expander */ + SMP_LSIX12_WRITE_N_REGISTERS_REQUEST SMPLsiX12WriteNRegistersRequest; + SMP_LSIX12_READ_N_REGISTERS_REQUEST SMPLsiX12ReadNRegistersRequest; + SMP_ICL_DISCOVER_REQUEST SMPIclDiscoverRequest; + SMP_LSI_AHB_WRITE_N_REGISTERS_REQUEST SMPLsiAhbWriteNRegistersRequest; + SMP_LSI_AHB_READ_N_REGISTERS_REQUEST SMPLsiAhbReadNRegistersRequest; + /* Zoning Requests */ + SMP_CONFIGURE_ZONE_PHY_REQUEST SMPConfigureZonePhyRequest; + SMP_CONFIGURE_ZONE_PERMISSION_REQUEST SMPConfigureZonePermissionRequest; + SMP_REPORT_ZONE_PERMISSION_REQUEST SMPReportZonePermissionRequest; + SMP_ENABLE_DISABLE_ZONING_REQUEST SMPEnableDisableZoningRequest; + SMP_ZONE_ACTIVATE_REQUEST SMPZoneActivateRequest; + SMP_ZONE_LOCK_REQUEST SMPZoneLockRequest; + SMP_ZONE_UNLOCK_REQUEST SMPZoneUnlockRequest; +} SMP_REQUEST_UNION, * PTR_SMP_REQUEST_UNION; + +/* Union of all the SMP Response Frames */ +typedef union _SMP_RESPONSE_UNION +{ + SMP_RESPONSE SMPResponseGeneric; + SMP_REPORT_GENERAL_RESPONSE SMPReportGeneralResponse; + SMP_REPORT_MANUFACTURER_INFO_RESPONSE SMPReportManufacturerInfoResponse; + SMP_REPORT_SELF_CONFIG_STATUS_RESPONSE SMPReportSelfConfigStatusResponse; + SMP_DISCOVER_RESPONSE SMPDiscoverResponse; + SMP_REPORT_PHY_ERROR_LOG_RESPONSE SMPReportPhyErrorLogResponse; + SMP_REPORT_PHY_SATA_RESPONSE SMPReportPhySataResponse; + SMP_REPORT_ROUTE_INFO_RESPONSE SMPReportRouteInfoResponse; + SMP_CONFIGURE_ROUTE_INFO_RESPONSE SMPConfigureRouteInfoResponse; + SMP_REPORT_EXP_ROUTE_TABLE_RESPONSE SMPReportExpRouteTableResponse; + SMP_PHY_CONTROL_RESPONSE SMPPhyControlResponse; + /* These are vendor unique for Sasquatch expander */ + SMP_WRITE_N_GPIO_REGISTERS_RESPONSE SMPWriteNGpioRegistersResponse; + SMP_READ_N_GPIO_REGISTERS_RESPONSE SMPReadNGpioRegistersResponse; + /* These are vendor unique for Sasquatch expander */ + SMP_LSIX12_WRITE_N_REGISTERS_RESPONSE SMPLsiX12WriteNRegistersResponse; + SMP_LSIX12_READ_N_REGISTERS_RESPONSE SMPLsiX12ReadNRegistersResponse; + SMP_ICL_DISCOVER_RESPONSE SMPIclDiscoverResponse; + SMP_LSI_AHB_WRITE_N_REGISTERS_RESPONSE SMPLsiAhbWriteNRegistersResponse; + SMP_LSI_AHB_READ_N_REGISTERS_RESPONSE SMPLsiAhbReadNRegistersResponse; + /* Zoning */ + SMP_CONFIGURE_ZONE_PHY_RESPONSE SMPConfigureZonePhyResponse; + SMP_CONFIGURE_ZONE_PERMISSION_RESPONSE SMPConfigureZonePermissionResponse; + SMP_REPORT_ZONE_PERMISSION_RESPONSE SMPReportZonePermissionResponse; + SMP_ENABLE_DISABLE_ZONING_RESPONSE SMPEnableDisableZoningResponse; + SMP_ZONE_ACTIVATE_RESPONSE SMPZoneActivateResponse; + SMP_ZONE_LOCK_RESPONSE SMPZoneLockResponse; + SMP_ZONE_UNLOCK_RESPONSE SMPZoneUnlockResponse; +} SMP_RESPONSE_UNION, * PTR_SMP_RESPONSE_UNION; + +#endif /* End of #ifndef SAS_H_SOURCE */ + diff --git a/source/inc/sym_dmi.h b/source/inc/sym_dmi.h new file mode 100755 index 0000000..a4cfa80 --- /dev/null +++ b/source/inc/sym_dmi.h @@ -0,0 +1,268 @@ +/* FILE: sym_dmi.h - MPT/Fusion Driver IOCTL Support header file +* +************************************************************************* +* * +* Copyright 2001 LSI Logic. All rights reserved. * +* * +* This file is confidential and a trade secret of LSI Logic. * +* 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 LSI Logic. * +* * +************************************************************************/ + +/*+++HDR + * + * Version History + * --------------- + * + * Date Who? Description + * -------- ---- ------------------------------------------------------- + * 03/20/00 SAM Initial version + * 02/14/01 SCH Added Domain Validation + * 05/14/01 SCH Added MPI Event logging + * 07/09/01 SCH Changed MAX_VERSION_STRING from 80 to 32 + * 01/02/02 SCH Added MPI diagnostic reset IOCTL + * 10/30/03 SCH Added InBand IOCTL support + * 03/24/04 BJH Added Diagnostic IOCTL support + * 09/10/08 SCH Added ADAPTER_TYPE_SAS2 define + * 10/20/08 SCH Modified diag buffer structures for Gen2 +---*/ + +#ifndef SYM_DMI_H +#define SYM_DMI_H + +#define VERSION_SIZE 4 +#define MAX_VERSION_STRING 32 + +// support for MPI messages via an application or service IOCTL + +#define MPI_MSG_IOCTL 0x806D7069 // mpi +#define DATA_FROM_APP 0x01 +#define SCSI_IO 0x4000 +#define DUAL_SGLS 0x8000 + +typedef struct _IOCTL_DETAILS { + U16 Dir; // data xfer direction + U16 MsgSize; // size in 32 bit words + U32 DataSize; // data xfer size in bytes + U32 FormattedMsg[1]; +} IOCTL_DETAILS, *pIOCTL_DETAILS; + + +// support for host driver info / MPI event logging IOCTL + +#define DRVR_INFO_IOCTL 0x8043494D // CIM + +/* Adapter Types */ +#define ADAPTER_TYPE_SCSI 0 +#define ADAPTER_TYPE_SCSI_OVER_FC 1 +#define ADAPTER_TYPE_IP_OVER_FC 2 +#define ADAPTER_TYPE_SAS 3 +#define ADAPTER_TYPE_SAS2 4 + +/* Page Codes */ +#define ADAPTER_INFO_PAGE 1 +#define PCI_CONFIG_SPACE_PAGE 3 +#define EVENT_QUERY 10 +#define EVENT_ENABLE 11 +#define GET_EVENTS 12 + +/* Event Queue Defines */ +#define EVENT_QUEUE_SIZE 50 +#define MAX_EVENT_DATA_LENGTH 48 + +// structure to hold PCI bus/device/function information +typedef struct _MPI_PCI_INFO { + union { + struct { + ULONG DeviceNumber:5; + ULONG FunctionNumber:3; + ULONG BusNumber:24; + } bits; + ULONG AsULONG; + } u; +} MPI_PCI_INFO, *PMPI_PCI_INFO; + +// Adapter Info structure +typedef struct _DRVR_ADAPTER_INFO_OUT +{ + int AdapterType; + int MpiPortNumber; + int PciDeviceId; + int PciDeviceHwRev; + int SubSystem; + int SubSystemVendorId; + int NumDevicesAttached; + int MpiVersion; + U32 BiosVersion; + char DriverVersion[MAX_VERSION_STRING]; + BOOLEAN BusChangeEvent; + U8 HostId; + U16 Reserved1; + MPI_PCI_INFO PciInfo; + U32 PciSegmentId; +} DRVR_ADAPTER_INFO_OUT, *PTR_DRVR_ADAPTER_INFO_OUT; + +typedef struct _DRVR_INFO_SRB +{ + SRB_IO_CONTROL Sic; + int PageCode; // [IN] + char PageVersion[VERSION_SIZE]; // [OUT] + DRVR_ADAPTER_INFO_OUT AdapterPageOut; +} DRVR_INFO_SRB, *PTR_DRVR_INFO_SRB; + +typedef struct _PCI_CONFIG_SPACE_SRB +{ + SRB_IO_CONTROL Sic; + int PageCode; // [IN] + char PageVersion[VERSION_SIZE]; // [OUT] + U32 reserved[3]; + U8 PciConfigSpace[256]; +} PCI_CONFIG_SPACE_SRB, *PTR_PCI_CONFIG_SPACE_SRB; + +// support for MPI Event Queue + +typedef struct _MPI_EVENTS_SRB +{ + SRB_IO_CONTROL Sic; + int PageCode; // [IN] + char PageVersion[VERSION_SIZE]; // [OUT] + U32 EventData[1]; // page code dependent +} MPI_EVENTS_SRB, *PTR_MPI_EVENTS_SRB; + +typedef struct _MPI_EVENTS_QUEUE +{ + U32 EventType; // from reply frame + U32 EventNumber; // from DevExt->EventNum + U32 EventData[MAX_EVENT_DATA_LENGTH]; // from reply frame +} MPI_EVENTS_QUEUE, *PTR_MPI_EVENTS_QUEUE; + +// support for MPI Diagnostic Reset IOCTL + +#define MPI_DIAG_RESET 0x80727374 // rst + +typedef struct _MPI_DIAG_RESET_SRB +{ + SRB_IO_CONTROL Sic; + U32 NewImageSize; // replacement image size + U32 NewFWImage[1]; // new FW image to save +} MPI_DIAG_RESET_SRB, *PTR_MPI_DIAG_RESET_SRB; +// A NewImageSize of 0 indicates that no new FW image is being downloaded + +// MPI register reae/write access IOCTL +#define MPI_REG_ACCESS 0x80771959 // magic number +#define REG_IO_READ 1 +#define REG_IO_WRITE 2 +#define REG_MEM_READ 3 +#define REG_MEM_WRITE 4 + +typedef struct _MPI_REG_ACCESS_SRB +{ + SRB_IO_CONTROL Sic; + U32 Command; // command (read/write) + U32 RegOffset; // register offset + U32 RegData; // register data +} MPI_REG_ACCESS_SRB, *PTR_MPI_REG_ACCESS_SRB; + +// support for bus/target - DevHandle mapping IOCTL +// application can suppy bus/target and get devHandle or +// supply devHandle and get bus/target + +#define MPI_BTDH_MAPPING 0x804D4150 // MAP + +typedef struct _MPI_BTDH_MAP_SRB +{ + SRB_IO_CONTROL Sic; + U32 TargetID; // target ID + U32 Bus; // bus + U16 DevHandle; // device handle + U16 Reserved; +} MPI_BTDH_MAP_SRB, *PTR_MPI_BTDH_MAP_SRB; + + + +#define MPI_FW_DIAG_IOCTL (0x80646961) // dia +#define MPI_FW_DIAG_NEW (0x806E6577) // new +#define MPI_FW_DIAG_TYPE_REGISTER (0x00000001) +#define MPI_FW_DIAG_TYPE_UNREGISTER (0x00000002) +#define MPI_FW_DIAG_TYPE_QUERY (0x00000003) +#define MPI_FW_DIAG_TYPE_READ_BUFFER (0x00000004) +#define MPI_FW_DIAG_TYPE_RELEASE (0x00000005) + +#define MPI_FW_DIAG_INVALID_UID (0x00000000) +#define FW_DIAGNOSTIC_BUFFER_COUNT (3) +#define FW_DIAGNOSTIC_UID_NOT_FOUND (0xFF) + +#define MPI_FW_DIAG_ERROR_SUCCESS (0x00000000) +#define MPI_FW_DIAG_ERROR_FAILURE (0x00000001) +#define MPI_FW_DIAG_ERROR_INVALID_PARAMETER (0x00000003) +#define MPI_FW_DIAG_ERROR_POST_FAILED (0x00000010) +#define MPI_FW_DIAG_ERROR_INVALID_UID (0x00000011) +#define MPI_FW_DIAG_ERROR_RELEASE_FAILED (0x00000012) +#define MPI_FW_DIAG_ERROR_NO_BUFFER (0x00000013) +#define MPI_FW_DIAG_ERROR_ALREADY_RELEASED (0x00000014) + +typedef struct _MPI_FW_DIAG_IOCTL_SRB +{ + SRB_IO_CONTROL Sic; + U32 MpiDiagType; + U8 PageVersion[4]; + U32 MpiDiagData[1]; +} MPI_FW_DIAG_IOCTL_SRB, *PTR_MPI_FW_DIAG_IOCTL_SRB; + +/* diag register for gen 1 */ +typedef struct _MPI_FW_DIAG_REGISTER +{ + U8 TraceLevel; + U8 BufferType; + U16 Flags; + U32 ExtendedType; + U32 ProductSpecific[4]; + U32 RequestedBufferSize; + U32 UniqueId; +} MPI_FW_DIAG_REGISTER, *PTR_MPI_FW_DIAG_REGISTER; + +typedef struct _MPI_FW_DIAG_UNREGISTER +{ + U32 UniqueId; +} MPI_FW_DIAG_UNREGISTER, *PTR_MPI_FW_DIAG_UNREGISTER; + +#define MPI_FW_DIAG_FLAG_APP_OWNED (0x0001) +#define MPI_FW_DIAG_FLAG_BUFFER_VALID (0x0002) +#define MPI_FW_DIAG_FLAG_FW_BUFFER_ACCESS (0x0004) + +/* diag query for gen 1 */ +typedef struct _MPI_FW_DIAG_QUERY +{ + U8 TraceLevel; + U8 BufferType; + U16 Flags; + U32 ExtendedType; + U32 ProductSpecific[4]; + U32 TotalBufferSize; + U32 DriverAddedBufferSize; + U32 UniqueId; +} MPI_FW_DIAG_QUERY, *PTR_MPI_FW_DIAG_QUERY; + +typedef struct _MPI_FW_DIAG_RELEASE +{ + U32 UniqueId; +} MPI_FW_DIAG_RELEASE, *PTR_MPI_FW_DIAG_RELEASE; + +#define MPI_FW_DIAG_FLAG_REREGISTER (0x0001) +#define MPI_FW_DIAG_FLAG_FORCE_RELEASE (0x0002) + +typedef struct _MPI_FW_DIAG_READ_BUFFER +{ + U8 Status; + U8 Reserved; + U16 Flags; + U32 StartingOffset; + U32 BytesToRead; + U32 UniqueId; + U32 DataBuffer[1]; +} MPI_FW_DIAG_READ_BUFFER, *PTR_MPI_FW_DIAG_READ_BUFFER; + +#endif diff --git a/source/lsi/mpi.h b/source/lsi/mpi.h new file mode 100755 index 0000000..d5e9f67 --- /dev/null +++ b/source/lsi/mpi.h @@ -0,0 +1,800 @@ +/* + * Copyright (c) 2000-2008 LSI Corporation. + * + * + * Name: mpi.h + * Title: MPI Message independent structures and definitions + * Creation Date: July 27, 2000 + * + * mpi.h Version: 01.05.17 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-08-00 00.10.01 Original release for 0.10 spec dated 4/26/2000. + * 05-24-00 00.10.02 Added MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH definition. + * 06-06-00 01.00.01 Update MPI_VERSION_MAJOR and MPI_VERSION_MINOR. + * 06-22-00 01.00.02 Added MPI_IOCSTATUS_LAN_ definitions. + * Removed LAN_SUSPEND function definition. + * Added MPI_MSGFLAGS_CONTINUATION_REPLY definition. + * 06-30-00 01.00.03 Added MPI_CONTEXT_REPLY_TYPE_LAN definition. + * Added MPI_GET/SET_CONTEXT_REPLY_TYPE macros. + * 07-27-00 01.00.04 Added MPI_FAULT_ definitions. + * Removed MPI_IOCSTATUS_MSG/DATA_XFER_ERROR definitions. + * Added MPI_IOCSTATUS_INTERNAL_ERROR definition. + * Added MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH. + * 11-02-00 01.01.01 Original release for post 1.0 work. + * 12-04-00 01.01.02 Added new function codes. + * 01-09-01 01.01.03 Added more definitions to the system interface section + * Added MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT. + * 01-25-01 01.01.04 Changed MPI_VERSION_MINOR from 0x00 to 0x01. + * 02-20-01 01.01.05 Started using MPI_POINTER. + * Fixed value for MPI_DIAG_RW_ENABLE. + * Added defines for MPI_DIAG_PREVENT_IOC_BOOT and + * MPI_DIAG_CLEAR_FLASH_BAD_SIG. + * Obsoleted MPI_IOCSTATUS_TARGET_FC_ defines. + * 02-27-01 01.01.06 Removed MPI_HOST_INDEX_REGISTER define. + * Added function codes for RAID. + * 04-09-01 01.01.07 Added alternate define for MPI_DOORBELL_ACTIVE, + * MPI_DOORBELL_USED, to better match the spec. + * 08-08-01 01.02.01 Original release for v1.2 work. + * Changed MPI_VERSION_MINOR from 0x01 to 0x02. + * Added define MPI_FUNCTION_TOOLBOX. + * 09-28-01 01.02.02 New function code MPI_SCSI_ENCLOSURE_PROCESSOR. + * 11-01-01 01.02.03 Changed name to MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR. + * 03-14-02 01.02.04 Added MPI_HEADER_VERSION_ defines. + * 05-31-02 01.02.05 Bumped MPI_HEADER_VERSION_UNIT. + * 07-12-02 01.02.06 Added define for MPI_FUNCTION_MAILBOX. + * 09-16-02 01.02.07 Bumped value for MPI_HEADER_VERSION_UNIT. + * 11-15-02 01.02.08 Added define MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX and + * obsoleted define MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX. + * 04-01-03 01.02.09 New IOCStatus code: MPI_IOCSTATUS_FC_EXCHANGE_CANCELED + * 06-26-03 01.02.10 Bumped MPI_HEADER_VERSION_UNIT value. + * 01-16-04 01.02.11 Added define for MPI_IOCLOGINFO_TYPE_SHIFT. + * 04-29-04 01.02.12 Added function codes for MPI_FUNCTION_DIAG_BUFFER_POST + * and MPI_FUNCTION_DIAG_RELEASE. + * Added MPI_IOCSTATUS_DIAGNOSTIC_RELEASED define. + * Bumped MPI_HEADER_VERSION_UNIT value. + * 05-11-04 01.03.01 Bumped MPI_VERSION_MINOR for MPI v1.3. + * Added codes for Inband. + * 08-19-04 01.05.01 Added defines for Host Buffer Access Control doorbell. + * Added define for offset of High Priority Request Queue. + * Added new function codes and new IOCStatus codes. + * Added a IOCLogInfo type of SAS. + * 12-07-04 01.05.02 Bumped MPI_HEADER_VERSION_UNIT. + * 12-09-04 01.05.03 Bumped MPI_HEADER_VERSION_UNIT. + * 01-15-05 01.05.04 Bumped MPI_HEADER_VERSION_UNIT. + * 02-09-05 01.05.05 Bumped MPI_HEADER_VERSION_UNIT. + * 02-22-05 01.05.06 Bumped MPI_HEADER_VERSION_UNIT. + * 03-11-05 01.05.07 Removed function codes for SCSI IO 32 and + * TargetAssistExtended requests. + * Removed EEDP IOCStatus codes. + * 06-24-05 01.05.08 Added function codes for SCSI IO 32 and + * TargetAssistExtended requests. + * Added EEDP IOCStatus codes. + * 08-03-05 01.05.09 Bumped MPI_HEADER_VERSION_UNIT. + * 08-30-05 01.05.10 Added 2 new IOCStatus codes for Target. + * 03-27-06 01.05.11 Bumped MPI_HEADER_VERSION_UNIT. + * 10-11-06 01.05.12 Bumped MPI_HEADER_VERSION_UNIT. + * 05-24-07 01.05.13 Bumped MPI_HEADER_VERSION_UNIT. + * 08-07-07 01.05.14 Bumped MPI_HEADER_VERSION_UNIT. + * 01-15-08 01.05.15 Bumped MPI_HEADER_VERSION_UNIT. + * 03-28-08 01.05.16 Bumped MPI_HEADER_VERSION_UNIT. + * 07-11-08 01.05.17 Bumped MPI_HEADER_VERSION_UNIT. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_H +#define MPI_H + + +/***************************************************************************** +* +* M P I V e r s i o n D e f i n i t i o n s +* +*****************************************************************************/ + +#define MPI_VERSION_MAJOR (0x01) +#define MPI_VERSION_MINOR (0x05) +#define MPI_VERSION_MAJOR_MASK (0xFF00) +#define MPI_VERSION_MAJOR_SHIFT (8) +#define MPI_VERSION_MINOR_MASK (0x00FF) +#define MPI_VERSION_MINOR_SHIFT (0) +#define MPI_VERSION ((MPI_VERSION_MAJOR << MPI_VERSION_MAJOR_SHIFT) | \ + MPI_VERSION_MINOR) + +#define MPI_VERSION_01_00 (0x0100) +#define MPI_VERSION_01_01 (0x0101) +#define MPI_VERSION_01_02 (0x0102) +#define MPI_VERSION_01_03 (0x0103) +#define MPI_VERSION_01_05 (0x0105) +/* Note: The major versions of 0xe0 through 0xff are reserved */ + +/* versioning for this MPI header set */ +#define MPI_HEADER_VERSION_UNIT (0x14) +#define MPI_HEADER_VERSION_DEV (0x00) +#define MPI_HEADER_VERSION_UNIT_MASK (0xFF00) +#define MPI_HEADER_VERSION_UNIT_SHIFT (8) +#define MPI_HEADER_VERSION_DEV_MASK (0x00FF) +#define MPI_HEADER_VERSION_DEV_SHIFT (0) +#define MPI_HEADER_VERSION ((MPI_HEADER_VERSION_UNIT << 8) | MPI_HEADER_VERSION_DEV) + +/***************************************************************************** +* +* I O C S t a t e D e f i n i t i o n s +* +*****************************************************************************/ + +#define MPI_IOC_STATE_RESET (0x00000000) +#define MPI_IOC_STATE_READY (0x10000000) +#define MPI_IOC_STATE_OPERATIONAL (0x20000000) +#define MPI_IOC_STATE_FAULT (0x40000000) + +#define MPI_IOC_STATE_MASK (0xF0000000) +#define MPI_IOC_STATE_SHIFT (28) + +/* Fault state codes (product independent range 0x8000-0xFFFF) */ + +#define MPI_FAULT_REQUEST_MESSAGE_PCI_PARITY_ERROR (0x8111) +#define MPI_FAULT_REQUEST_MESSAGE_PCI_BUS_FAULT (0x8112) +#define MPI_FAULT_REPLY_MESSAGE_PCI_PARITY_ERROR (0x8113) +#define MPI_FAULT_REPLY_MESSAGE_PCI_BUS_FAULT (0x8114) +#define MPI_FAULT_DATA_SEND_PCI_PARITY_ERROR (0x8115) +#define MPI_FAULT_DATA_SEND_PCI_BUS_FAULT (0x8116) +#define MPI_FAULT_DATA_RECEIVE_PCI_PARITY_ERROR (0x8117) +#define MPI_FAULT_DATA_RECEIVE_PCI_BUS_FAULT (0x8118) + + +/***************************************************************************** +* +* P C I S y s t e m I n t e r f a c e R e g i s t e r s +* +*****************************************************************************/ + +/* + * Defines for working with the System Doorbell register. + * Values for doorbell function codes are included in the section that defines + * all the function codes (further on in this file). + */ +#define MPI_DOORBELL_OFFSET (0x00000000) +#define MPI_DOORBELL_ACTIVE (0x08000000) /* DoorbellUsed */ +#define MPI_DOORBELL_USED (MPI_DOORBELL_ACTIVE) +#define MPI_DOORBELL_ACTIVE_SHIFT (27) +#define MPI_DOORBELL_WHO_INIT_MASK (0x07000000) +#define MPI_DOORBELL_WHO_INIT_SHIFT (24) +#define MPI_DOORBELL_FUNCTION_MASK (0xFF000000) +#define MPI_DOORBELL_FUNCTION_SHIFT (24) +#define MPI_DOORBELL_ADD_DWORDS_MASK (0x00FF0000) +#define MPI_DOORBELL_ADD_DWORDS_SHIFT (16) +#define MPI_DOORBELL_DATA_MASK (0x0000FFFF) +#define MPI_DOORBELL_FUNCTION_SPECIFIC_MASK (0x0000FFFF) + +/* values for Host Buffer Access Control doorbell function */ +#define MPI_DB_HPBAC_VALUE_MASK (0x0000F000) +#define MPI_DB_HPBAC_ENABLE_ACCESS (0x01) +#define MPI_DB_HPBAC_DISABLE_ACCESS (0x02) +#define MPI_DB_HPBAC_FREE_BUFFER (0x03) + + +#define MPI_WRITE_SEQUENCE_OFFSET (0x00000004) +#define MPI_WRSEQ_KEY_VALUE_MASK (0x0000000F) +#define MPI_WRSEQ_1ST_KEY_VALUE (0x04) +#define MPI_WRSEQ_2ND_KEY_VALUE (0x0B) +#define MPI_WRSEQ_3RD_KEY_VALUE (0x02) +#define MPI_WRSEQ_4TH_KEY_VALUE (0x07) +#define MPI_WRSEQ_5TH_KEY_VALUE (0x0D) + +#define MPI_DIAGNOSTIC_OFFSET (0x00000008) +#define MPI_DIAG_CLEAR_FLASH_BAD_SIG (0x00000400) +#define MPI_DIAG_PREVENT_IOC_BOOT (0x00000200) +#define MPI_DIAG_DRWE (0x00000080) +#define MPI_DIAG_FLASH_BAD_SIG (0x00000040) +#define MPI_DIAG_RESET_HISTORY (0x00000020) +#define MPI_DIAG_RW_ENABLE (0x00000010) +#define MPI_DIAG_RESET_ADAPTER (0x00000004) +#define MPI_DIAG_DISABLE_ARM (0x00000002) +#define MPI_DIAG_MEM_ENABLE (0x00000001) + +#define MPI_TEST_BASE_ADDRESS_OFFSET (0x0000000C) + +#define MPI_DIAG_RW_DATA_OFFSET (0x00000010) + +#define MPI_DIAG_RW_ADDRESS_OFFSET (0x00000014) + +#define MPI_HOST_INTERRUPT_STATUS_OFFSET (0x00000030) +#define MPI_HIS_IOP_DOORBELL_STATUS (0x80000000) +#define MPI_HIS_REPLY_MESSAGE_INTERRUPT (0x00000008) +#define MPI_HIS_DOORBELL_INTERRUPT (0x00000001) + +#define MPI_HOST_INTERRUPT_MASK_OFFSET (0x00000034) +#define MPI_HIM_RIM (0x00000008) +#define MPI_HIM_DIM (0x00000001) + +#define MPI_REQUEST_QUEUE_OFFSET (0x00000040) +#define MPI_REQUEST_POST_FIFO_OFFSET (0x00000040) + +#define MPI_REPLY_QUEUE_OFFSET (0x00000044) +#define MPI_REPLY_POST_FIFO_OFFSET (0x00000044) +#define MPI_REPLY_FREE_FIFO_OFFSET (0x00000044) + +#define MPI_HI_PRI_REQUEST_QUEUE_OFFSET (0x00000048) + + + +/***************************************************************************** +* +* M e s s a g e F r a m e D e s c r i p t o r s +* +*****************************************************************************/ + +#define MPI_REQ_MF_DESCRIPTOR_NB_MASK (0x00000003) +#define MPI_REQ_MF_DESCRIPTOR_F_BIT (0x00000004) +#define MPI_REQ_MF_DESCRIPTOR_ADDRESS_MASK (0xFFFFFFF8) + +#define MPI_ADDRESS_REPLY_A_BIT (0x80000000) +#define MPI_ADDRESS_REPLY_ADDRESS_MASK (0x7FFFFFFF) + +#define MPI_CONTEXT_REPLY_A_BIT (0x80000000) +#define MPI_CONTEXT_REPLY_TYPE_MASK (0x60000000) +#define MPI_CONTEXT_REPLY_TYPE_SCSI_INIT (0x00) +#define MPI_CONTEXT_REPLY_TYPE_SCSI_TARGET (0x01) +#define MPI_CONTEXT_REPLY_TYPE_LAN (0x02) +#define MPI_CONTEXT_REPLY_TYPE_SHIFT (29) +#define MPI_CONTEXT_REPLY_CONTEXT_MASK (0x1FFFFFFF) + + +/****************************************************************************/ +/* Context Reply macros */ +/****************************************************************************/ + +#define MPI_GET_CONTEXT_REPLY_TYPE(x) (((x) & MPI_CONTEXT_REPLY_TYPE_MASK) \ + >> MPI_CONTEXT_REPLY_TYPE_SHIFT) + +#define MPI_SET_CONTEXT_REPLY_TYPE(x, typ) \ + ((x) = ((x) & ~MPI_CONTEXT_REPLY_TYPE_MASK) | \ + (((typ) << MPI_CONTEXT_REPLY_TYPE_SHIFT) & \ + MPI_CONTEXT_REPLY_TYPE_MASK)) + + +/***************************************************************************** +* +* M e s s a g e F u n c t i o n s +* 0x80 -> 0x8F reserved for private message use per product +* +* +*****************************************************************************/ + +#define MPI_FUNCTION_SCSI_IO_REQUEST (0x00) +#define MPI_FUNCTION_SCSI_TASK_MGMT (0x01) +#define MPI_FUNCTION_IOC_INIT (0x02) +#define MPI_FUNCTION_IOC_FACTS (0x03) +#define MPI_FUNCTION_CONFIG (0x04) +#define MPI_FUNCTION_PORT_FACTS (0x05) +#define MPI_FUNCTION_PORT_ENABLE (0x06) +#define MPI_FUNCTION_EVENT_NOTIFICATION (0x07) +#define MPI_FUNCTION_EVENT_ACK (0x08) +#define MPI_FUNCTION_FW_DOWNLOAD (0x09) +#define MPI_FUNCTION_TARGET_CMD_BUFFER_POST (0x0A) +#define MPI_FUNCTION_TARGET_ASSIST (0x0B) +#define MPI_FUNCTION_TARGET_STATUS_SEND (0x0C) +#define MPI_FUNCTION_TARGET_MODE_ABORT (0x0D) +#define MPI_FUNCTION_FC_LINK_SRVC_BUF_POST (0x0E) +#define MPI_FUNCTION_FC_LINK_SRVC_RSP (0x0F) +#define MPI_FUNCTION_FC_EX_LINK_SRVC_SEND (0x10) +#define MPI_FUNCTION_FC_ABORT (0x11) +#define MPI_FUNCTION_FW_UPLOAD (0x12) +#define MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND (0x13) +#define MPI_FUNCTION_FC_PRIMITIVE_SEND (0x14) + +#define MPI_FUNCTION_RAID_ACTION (0x15) +#define MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH (0x16) + +#define MPI_FUNCTION_TOOLBOX (0x17) + +#define MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR (0x18) + +#define MPI_FUNCTION_MAILBOX (0x19) + +#define MPI_FUNCTION_SMP_PASSTHROUGH (0x1A) +#define MPI_FUNCTION_SAS_IO_UNIT_CONTROL (0x1B) +#define MPI_FUNCTION_SATA_PASSTHROUGH (0x1C) + +#define MPI_FUNCTION_DIAG_BUFFER_POST (0x1D) +#define MPI_FUNCTION_DIAG_RELEASE (0x1E) + +#define MPI_FUNCTION_SCSI_IO_32 (0x1F) + +#define MPI_FUNCTION_LAN_SEND (0x20) +#define MPI_FUNCTION_LAN_RECEIVE (0x21) +#define MPI_FUNCTION_LAN_RESET (0x22) + +#define MPI_FUNCTION_TARGET_ASSIST_EXTENDED (0x23) +#define MPI_FUNCTION_TARGET_CMD_BUF_BASE_POST (0x24) +#define MPI_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) + +#define MPI_FUNCTION_INBAND_BUFFER_POST (0x28) +#define MPI_FUNCTION_INBAND_SEND (0x29) +#define MPI_FUNCTION_INBAND_RSP (0x2A) +#define MPI_FUNCTION_INBAND_ABORT (0x2B) + +#define MPI_FUNCTION_IOC_MESSAGE_UNIT_RESET (0x40) +#define MPI_FUNCTION_IO_UNIT_RESET (0x41) +#define MPI_FUNCTION_HANDSHAKE (0x42) +#define MPI_FUNCTION_REPLY_FRAME_REMOVAL (0x43) +#define MPI_FUNCTION_HOST_PAGEBUF_ACCESS_CONTROL (0x44) + + +/* standard version format */ +typedef struct _MPI_VERSION_STRUCT +{ + U8 Dev; /* 00h */ + U8 Unit; /* 01h */ + U8 Minor; /* 02h */ + U8 Major; /* 03h */ +} MPI_VERSION_STRUCT, MPI_POINTER PTR_MPI_VERSION_STRUCT, + MpiVersionStruct_t, MPI_POINTER pMpiVersionStruct; + +typedef union _MPI_VERSION_FORMAT +{ + MPI_VERSION_STRUCT Struct; + U32 Word; +} MPI_VERSION_FORMAT, MPI_POINTER PTR_MPI_VERSION_FORMAT, + MpiVersionFormat_t, MPI_POINTER pMpiVersionFormat_t; + + +/***************************************************************************** +* +* S c a t t e r G a t h e r E l e m e n t s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Simple element structures */ +/****************************************************************************/ + +typedef struct _SGE_SIMPLE32 +{ + U32 FlagsLength; + U32 Address; +} SGE_SIMPLE32, MPI_POINTER PTR_SGE_SIMPLE32, + SGESimple32_t, MPI_POINTER pSGESimple32_t; + +typedef struct _SGE_SIMPLE64 +{ + U32 FlagsLength; + U64 Address; +} SGE_SIMPLE64, MPI_POINTER PTR_SGE_SIMPLE64, + SGESimple64_t, MPI_POINTER pSGESimple64_t; + +typedef struct _SGE_SIMPLE_UNION +{ + U32 FlagsLength; + union + { + U32 Address32; + U64 Address64; + }u; +} SGE_SIMPLE_UNION, MPI_POINTER PTR_SGE_SIMPLE_UNION, + SGESimpleUnion_t, MPI_POINTER pSGESimpleUnion_t; + +/****************************************************************************/ +/* Chain element structures */ +/****************************************************************************/ + +typedef struct _SGE_CHAIN32 +{ + U16 Length; + U8 NextChainOffset; + U8 Flags; + U32 Address; +} SGE_CHAIN32, MPI_POINTER PTR_SGE_CHAIN32, + SGEChain32_t, MPI_POINTER pSGEChain32_t; + +typedef struct _SGE_CHAIN64 +{ + U16 Length; + U8 NextChainOffset; + U8 Flags; + U64 Address; +} SGE_CHAIN64, MPI_POINTER PTR_SGE_CHAIN64, + SGEChain64_t, MPI_POINTER pSGEChain64_t; + +typedef struct _SGE_CHAIN_UNION +{ + U16 Length; + U8 NextChainOffset; + U8 Flags; + union + { + U32 Address32; + U64 Address64; + }u; +} SGE_CHAIN_UNION, MPI_POINTER PTR_SGE_CHAIN_UNION, + SGEChainUnion_t, MPI_POINTER pSGEChainUnion_t; + +/****************************************************************************/ +/* Transaction Context element */ +/****************************************************************************/ + +typedef struct _SGE_TRANSACTION32 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[1]; + U32 TransactionDetails[1]; +} SGE_TRANSACTION32, MPI_POINTER PTR_SGE_TRANSACTION32, + SGETransaction32_t, MPI_POINTER pSGETransaction32_t; + +typedef struct _SGE_TRANSACTION64 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[2]; + U32 TransactionDetails[1]; +} SGE_TRANSACTION64, MPI_POINTER PTR_SGE_TRANSACTION64, + SGETransaction64_t, MPI_POINTER pSGETransaction64_t; + +typedef struct _SGE_TRANSACTION96 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[3]; + U32 TransactionDetails[1]; +} SGE_TRANSACTION96, MPI_POINTER PTR_SGE_TRANSACTION96, + SGETransaction96_t, MPI_POINTER pSGETransaction96_t; + +typedef struct _SGE_TRANSACTION128 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[4]; + U32 TransactionDetails[1]; +} SGE_TRANSACTION128, MPI_POINTER PTR_SGE_TRANSACTION128, + SGETransaction_t128, MPI_POINTER pSGETransaction_t128; + +typedef struct _SGE_TRANSACTION_UNION +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + union + { + U32 TransactionContext32[1]; + U32 TransactionContext64[2]; + U32 TransactionContext96[3]; + U32 TransactionContext128[4]; + }u; + U32 TransactionDetails[1]; +} SGE_TRANSACTION_UNION, MPI_POINTER PTR_SGE_TRANSACTION_UNION, + SGETransactionUnion_t, MPI_POINTER pSGETransactionUnion_t; + + +/****************************************************************************/ +/* SGE IO types union for IO SGL's */ +/****************************************************************************/ + +typedef struct _SGE_IO_UNION +{ + union + { + SGE_SIMPLE_UNION Simple; + SGE_CHAIN_UNION Chain; + } u; +} SGE_IO_UNION, MPI_POINTER PTR_SGE_IO_UNION, + SGEIOUnion_t, MPI_POINTER pSGEIOUnion_t; + +/****************************************************************************/ +/* SGE union for SGL's with Simple and Transaction elements */ +/****************************************************************************/ + +typedef struct _SGE_TRANS_SIMPLE_UNION +{ + union + { + SGE_SIMPLE_UNION Simple; + SGE_TRANSACTION_UNION Transaction; + } u; +} SGE_TRANS_SIMPLE_UNION, MPI_POINTER PTR_SGE_TRANS_SIMPLE_UNION, + SGETransSimpleUnion_t, MPI_POINTER pSGETransSimpleUnion_t; + +/****************************************************************************/ +/* All SGE types union */ +/****************************************************************************/ + +typedef struct _SGE_MPI_UNION +{ + union + { + SGE_SIMPLE_UNION Simple; + SGE_CHAIN_UNION Chain; + SGE_TRANSACTION_UNION Transaction; + } u; +} SGE_MPI_UNION, MPI_POINTER PTR_SGE_MPI_UNION, + MPI_SGE_UNION_t, MPI_POINTER pMPI_SGE_UNION_t, + SGEAllUnion_t, MPI_POINTER pSGEAllUnion_t; + + +/****************************************************************************/ +/* SGE field definition and masks */ +/****************************************************************************/ + +/* Flags field bit definitions */ + +#define MPI_SGE_FLAGS_LAST_ELEMENT (0x80) +#define MPI_SGE_FLAGS_END_OF_BUFFER (0x40) +#define MPI_SGE_FLAGS_ELEMENT_TYPE_MASK (0x30) +#define MPI_SGE_FLAGS_LOCAL_ADDRESS (0x08) +#define MPI_SGE_FLAGS_DIRECTION (0x04) +#define MPI_SGE_FLAGS_ADDRESS_SIZE (0x02) +#define MPI_SGE_FLAGS_END_OF_LIST (0x01) + +#define MPI_SGE_FLAGS_SHIFT (24) + +#define MPI_SGE_LENGTH_MASK (0x00FFFFFF) +#define MPI_SGE_CHAIN_LENGTH_MASK (0x0000FFFF) + +/* Element Type */ + +#define MPI_SGE_FLAGS_TRANSACTION_ELEMENT (0x00) +#define MPI_SGE_FLAGS_SIMPLE_ELEMENT (0x10) +#define MPI_SGE_FLAGS_CHAIN_ELEMENT (0x30) +#define MPI_SGE_FLAGS_ELEMENT_MASK (0x30) + +/* Address location */ + +#define MPI_SGE_FLAGS_SYSTEM_ADDRESS (0x00) + +/* Direction */ + +#define MPI_SGE_FLAGS_IOC_TO_HOST (0x00) +#define MPI_SGE_FLAGS_HOST_TO_IOC (0x04) + +/* Address Size */ + +#define MPI_SGE_FLAGS_32_BIT_ADDRESSING (0x00) +#define MPI_SGE_FLAGS_64_BIT_ADDRESSING (0x02) + +/* Context Size */ + +#define MPI_SGE_FLAGS_32_BIT_CONTEXT (0x00) +#define MPI_SGE_FLAGS_64_BIT_CONTEXT (0x02) +#define MPI_SGE_FLAGS_96_BIT_CONTEXT (0x04) +#define MPI_SGE_FLAGS_128_BIT_CONTEXT (0x06) + +#define MPI_SGE_CHAIN_OFFSET_MASK (0x00FF0000) +#define MPI_SGE_CHAIN_OFFSET_SHIFT (16) + + +/****************************************************************************/ +/* SGE operation Macros */ +/****************************************************************************/ + + /* SIMPLE FlagsLength manipulations... */ +#define MPI_SGE_SET_FLAGS(f) ((U32)(f) << MPI_SGE_FLAGS_SHIFT) +#define MPI_SGE_GET_FLAGS(fl) (((fl) & ~MPI_SGE_LENGTH_MASK) >> MPI_SGE_FLAGS_SHIFT) +#define MPI_SGE_LENGTH(fl) ((fl) & MPI_SGE_LENGTH_MASK) +#define MPI_SGE_CHAIN_LENGTH(fl) ((fl) & MPI_SGE_CHAIN_LENGTH_MASK) + +#define MPI_SGE_SET_FLAGS_LENGTH(f,l) (MPI_SGE_SET_FLAGS(f) | MPI_SGE_LENGTH(l)) + +#define MPI_pSGE_GET_FLAGS(psg) MPI_SGE_GET_FLAGS((psg)->FlagsLength) +#define MPI_pSGE_GET_LENGTH(psg) MPI_SGE_LENGTH((psg)->FlagsLength) +#define MPI_pSGE_SET_FLAGS_LENGTH(psg,f,l) (psg)->FlagsLength = MPI_SGE_SET_FLAGS_LENGTH(f,l) + /* CAUTION - The following are READ-MODIFY-WRITE! */ +#define MPI_pSGE_SET_FLAGS(psg,f) (psg)->FlagsLength |= MPI_SGE_SET_FLAGS(f) +#define MPI_pSGE_SET_LENGTH(psg,l) (psg)->FlagsLength |= MPI_SGE_LENGTH(l) + +#define MPI_GET_CHAIN_OFFSET(x) ((x&MPI_SGE_CHAIN_OFFSET_MASK)>>MPI_SGE_CHAIN_OFFSET_SHIFT) + + + +/***************************************************************************** +* +* S t a n d a r d M e s s a g e S t r u c t u r e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Standard message request header for all request messages */ +/****************************************************************************/ + +typedef struct _MSG_REQUEST_HEADER +{ + U8 Reserved[2]; /* function specific */ + U8 ChainOffset; + U8 Function; + U8 Reserved1[3]; /* function specific */ + U8 MsgFlags; + U32 MsgContext; +} MSG_REQUEST_HEADER, MPI_POINTER PTR_MSG_REQUEST_HEADER, + MPIHeader_t, MPI_POINTER pMPIHeader_t; + + +/****************************************************************************/ +/* Default Reply */ +/****************************************************************************/ + +typedef struct _MSG_DEFAULT_REPLY +{ + U8 Reserved[2]; /* function specific */ + U8 MsgLength; + U8 Function; + U8 Reserved1[3]; /* function specific */ + U8 MsgFlags; + U32 MsgContext; + U8 Reserved2[2]; /* function specific */ + U16 IOCStatus; + U32 IOCLogInfo; +} MSG_DEFAULT_REPLY, MPI_POINTER PTR_MSG_DEFAULT_REPLY, + MPIDefaultReply_t, MPI_POINTER pMPIDefaultReply_t; + + +/* MsgFlags definition for all replies */ + +#define MPI_MSGFLAGS_CONTINUATION_REPLY (0x80) + + +/***************************************************************************** +* +* I O C S t a t u s V a l u e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Common IOCStatus values for all replies */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_SUCCESS (0x0000) +#define MPI_IOCSTATUS_INVALID_FUNCTION (0x0001) +#define MPI_IOCSTATUS_BUSY (0x0002) +#define MPI_IOCSTATUS_INVALID_SGL (0x0003) +#define MPI_IOCSTATUS_INTERNAL_ERROR (0x0004) +#define MPI_IOCSTATUS_RESERVED (0x0005) +#define MPI_IOCSTATUS_INSUFFICIENT_RESOURCES (0x0006) +#define MPI_IOCSTATUS_INVALID_FIELD (0x0007) +#define MPI_IOCSTATUS_INVALID_STATE (0x0008) +#define MPI_IOCSTATUS_OP_STATE_NOT_SUPPORTED (0x0009) + +/****************************************************************************/ +/* Config IOCStatus values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_CONFIG_INVALID_ACTION (0x0020) +#define MPI_IOCSTATUS_CONFIG_INVALID_TYPE (0x0021) +#define MPI_IOCSTATUS_CONFIG_INVALID_PAGE (0x0022) +#define MPI_IOCSTATUS_CONFIG_INVALID_DATA (0x0023) +#define MPI_IOCSTATUS_CONFIG_NO_DEFAULTS (0x0024) +#define MPI_IOCSTATUS_CONFIG_CANT_COMMIT (0x0025) + +/****************************************************************************/ +/* SCSIIO Reply (SPI & FCP) initiator values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_SCSI_RECOVERED_ERROR (0x0040) +#define MPI_IOCSTATUS_SCSI_INVALID_BUS (0x0041) +#define MPI_IOCSTATUS_SCSI_INVALID_TARGETID (0x0042) +#define MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE (0x0043) +#define MPI_IOCSTATUS_SCSI_DATA_OVERRUN (0x0044) +#define MPI_IOCSTATUS_SCSI_DATA_UNDERRUN (0x0045) +#define MPI_IOCSTATUS_SCSI_IO_DATA_ERROR (0x0046) +#define MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR (0x0047) +#define MPI_IOCSTATUS_SCSI_TASK_TERMINATED (0x0048) +#define MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH (0x0049) +#define MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED (0x004A) +#define MPI_IOCSTATUS_SCSI_IOC_TERMINATED (0x004B) +#define MPI_IOCSTATUS_SCSI_EXT_TERMINATED (0x004C) + +/****************************************************************************/ +/* For use by SCSI Initiator and SCSI Target end-to-end data protection */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_EEDP_GUARD_ERROR (0x004D) +#define MPI_IOCSTATUS_EEDP_REF_TAG_ERROR (0x004E) +#define MPI_IOCSTATUS_EEDP_APP_TAG_ERROR (0x004F) + + +/****************************************************************************/ +/* SCSI Target values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_TARGET_PRIORITY_IO (0x0060) +#define MPI_IOCSTATUS_TARGET_INVALID_PORT (0x0061) +#define MPI_IOCSTATUS_TARGET_INVALID_IOCINDEX (0x0062) /* obsolete name */ +#define MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX (0x0062) +#define MPI_IOCSTATUS_TARGET_ABORTED (0x0063) +#define MPI_IOCSTATUS_TARGET_NO_CONN_RETRYABLE (0x0064) +#define MPI_IOCSTATUS_TARGET_NO_CONNECTION (0x0065) +#define MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH (0x006A) +#define MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT (0x006B) +#define MPI_IOCSTATUS_TARGET_DATA_OFFSET_ERROR (0x006D) +#define MPI_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA (0x006E) +#define MPI_IOCSTATUS_TARGET_IU_TOO_SHORT (0x006F) +#define MPI_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT (0x0070) +#define MPI_IOCSTATUS_TARGET_NAK_RECEIVED (0x0071) + +/****************************************************************************/ +/* Additional FCP target values (obsolete) */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_TARGET_FC_ABORTED (0x0066) /* obsolete */ +#define MPI_IOCSTATUS_TARGET_FC_RX_ID_INVALID (0x0067) /* obsolete */ +#define MPI_IOCSTATUS_TARGET_FC_DID_INVALID (0x0068) /* obsolete */ +#define MPI_IOCSTATUS_TARGET_FC_NODE_LOGGED_OUT (0x0069) /* obsolete */ + +/****************************************************************************/ +/* Fibre Channel Direct Access values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_FC_ABORTED (0x0066) +#define MPI_IOCSTATUS_FC_RX_ID_INVALID (0x0067) +#define MPI_IOCSTATUS_FC_DID_INVALID (0x0068) +#define MPI_IOCSTATUS_FC_NODE_LOGGED_OUT (0x0069) +#define MPI_IOCSTATUS_FC_EXCHANGE_CANCELED (0x006C) + +/****************************************************************************/ +/* LAN values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_LAN_DEVICE_NOT_FOUND (0x0080) +#define MPI_IOCSTATUS_LAN_DEVICE_FAILURE (0x0081) +#define MPI_IOCSTATUS_LAN_TRANSMIT_ERROR (0x0082) +#define MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED (0x0083) +#define MPI_IOCSTATUS_LAN_RECEIVE_ERROR (0x0084) +#define MPI_IOCSTATUS_LAN_RECEIVE_ABORTED (0x0085) +#define MPI_IOCSTATUS_LAN_PARTIAL_PACKET (0x0086) +#define MPI_IOCSTATUS_LAN_CANCELED (0x0087) + +/****************************************************************************/ +/* Serial Attached SCSI values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED (0x0090) +#define MPI_IOCSTATUS_SAS_SMP_DATA_OVERRUN (0x0091) + +/****************************************************************************/ +/* Inband values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_INBAND_ABORTED (0x0098) +#define MPI_IOCSTATUS_INBAND_NO_CONNECTION (0x0099) + +/****************************************************************************/ +/* Diagnostic Tools values */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_DIAGNOSTIC_RELEASED (0x00A0) + + +/****************************************************************************/ +/* IOCStatus flag to indicate that log info is available */ +/****************************************************************************/ + +#define MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE (0x8000) +#define MPI_IOCSTATUS_MASK (0x7FFF) + +/****************************************************************************/ +/* LogInfo Types */ +/****************************************************************************/ + +#define MPI_IOCLOGINFO_TYPE_MASK (0xF0000000) +#define MPI_IOCLOGINFO_TYPE_SHIFT (28) +#define MPI_IOCLOGINFO_TYPE_NONE (0x0) +#define MPI_IOCLOGINFO_TYPE_SCSI (0x1) +#define MPI_IOCLOGINFO_TYPE_FC (0x2) +#define MPI_IOCLOGINFO_TYPE_SAS (0x3) +#define MPI_IOCLOGINFO_TYPE_ISCSI (0x4) +#define MPI_IOCLOGINFO_LOG_DATA_MASK (0x0FFFFFFF) + + +#endif diff --git a/source/lsi/mpi2.h b/source/lsi/mpi2.h new file mode 100755 index 0000000..55b3557 --- /dev/null +++ b/source/lsi/mpi2.h @@ -0,0 +1,1200 @@ +/* + * Copyright (c) 2000-2011 LSI Corporation. + * + * + * Name: mpi2.h + * Title: MPI Message independent structures and definitions + * including System Interface Register Set and + * scatter/gather formats. + * Creation Date: June 21, 2006 + * + * mpi2.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-04-07 02.00.01 Bumped MPI2_HEADER_VERSION_UNIT. + * 06-26-07 02.00.02 Bumped MPI2_HEADER_VERSION_UNIT. + * 08-31-07 02.00.03 Bumped MPI2_HEADER_VERSION_UNIT. + * Moved ReplyPostHostIndex register to offset 0x6C of the + * MPI2_SYSTEM_INTERFACE_REGS and modified the define for + * MPI2_REPLY_POST_HOST_INDEX_OFFSET. + * Added union of request descriptors. + * Added union of reply descriptors. + * 10-31-07 02.00.04 Bumped MPI2_HEADER_VERSION_UNIT. + * Added define for MPI2_VERSION_02_00. + * Fixed the size of the FunctionDependent5 field in the + * MPI2_DEFAULT_REPLY structure. + * 12-18-07 02.00.05 Bumped MPI2_HEADER_VERSION_UNIT. + * Removed the MPI-defined Fault Codes and extended the + * product specific codes up to 0xEFFF. + * Added a sixth key value for the WriteSequence register + * and changed the flush value to 0x0. + * Added message function codes for Diagnostic Buffer Post + * and Diagnsotic Release. + * New IOCStatus define: MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED + * Moved MPI2_VERSION_UNION from mpi2_ioc.h. + * 02-29-08 02.00.06 Bumped MPI2_HEADER_VERSION_UNIT. + * 03-03-08 02.00.07 Bumped MPI2_HEADER_VERSION_UNIT. + * 05-21-08 02.00.08 Bumped MPI2_HEADER_VERSION_UNIT. + * Added #defines for marking a reply descriptor as unused. + * 06-27-08 02.00.09 Bumped MPI2_HEADER_VERSION_UNIT. + * 10-02-08 02.00.10 Bumped MPI2_HEADER_VERSION_UNIT. + * Moved LUN field defines from mpi2_init.h. + * 01-19-09 02.00.11 Bumped MPI2_HEADER_VERSION_UNIT. + * 05-06-09 02.00.12 Bumped MPI2_HEADER_VERSION_UNIT. + * In all request and reply descriptors, replaced VF_ID + * field with MSIxIndex field. + * Removed DevHandle field from + * MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR and made those + * bytes reserved. + * Added RAID Accelerator functionality. + * 07-30-09 02.00.13 Bumped MPI2_HEADER_VERSION_UNIT. + * 10-28-09 02.00.14 Bumped MPI2_HEADER_VERSION_UNIT. + * Added MSI-x index mask and shift for Reply Post Host + * Index register. + * Added function code for Host Based Discovery Action. + * 02-10-10 02.00.15 Bumped MPI2_HEADER_VERSION_UNIT. + * Added define for MPI2_FUNCTION_PWR_MGMT_CONTROL. + * Added defines for product-specific range of message + * function codes, 0xF0 to 0xFF. + * 05-12-10 02.00.16 Bumped MPI2_HEADER_VERSION_UNIT. + * Added alternative defines for the SGE Direction bit. + * 08-11-10 02.00.17 Bumped MPI2_HEADER_VERSION_UNIT. + * 11-10-10 02.00.18 Bumped MPI2_HEADER_VERSION_UNIT. + * Added MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR define. + * 02-23-11 02.00.19 Bumped MPI2_HEADER_VERSION_UNIT. + * Added MPI2_FUNCTION_SEND_HOST_MESSAGE. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_H +#define MPI2_H + + +/***************************************************************************** +* +* MPI Version Definitions +* +*****************************************************************************/ + +#define MPI2_VERSION_MAJOR_MASK (0xFF00) +#define MPI2_VERSION_MAJOR_SHIFT (8) +#define MPI2_VERSION_MINOR_MASK (0x00FF) +#define MPI2_VERSION_MINOR_SHIFT (0) + +/* major version for all MPI v2.x */ +#define MPI2_VERSION_MAJOR (0x02) + +/* minor version for MPI v2.0 compatible products */ +#define MPI2_VERSION_MINOR (0x00) +#define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \ + MPI2_VERSION_MINOR) +#define MPI2_VERSION_02_00 (0x0200) + + +/* minor version for MPI v2.5 compatible products */ +#define MPI25_VERSION_MINOR (0x05) +#define MPI25_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \ + MPI25_VERSION_MINOR) +#define MPI2_VERSION_02_05 (0x0205) + + +/* Unit and Dev versioning for this MPI header set */ +#define MPI2_HEADER_VERSION_UNIT (0x13) +#define MPI2_HEADER_VERSION_DEV (0x00) +#define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00) +#define MPI2_HEADER_VERSION_UNIT_SHIFT (8) +#define MPI2_HEADER_VERSION_DEV_MASK (0x00FF) +#define MPI2_HEADER_VERSION_DEV_SHIFT (0) +#define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) | MPI2_HEADER_VERSION_DEV) + + +/***************************************************************************** +* +* IOC State Definitions +* +*****************************************************************************/ + +#define MPI2_IOC_STATE_RESET (0x00000000) +#define MPI2_IOC_STATE_READY (0x10000000) +#define MPI2_IOC_STATE_OPERATIONAL (0x20000000) +#define MPI2_IOC_STATE_FAULT (0x40000000) + +#define MPI2_IOC_STATE_MASK (0xF0000000) +#define MPI2_IOC_STATE_SHIFT (28) + +/* Fault state range for prodcut specific codes */ +#define MPI2_FAULT_PRODUCT_SPECIFIC_MIN (0x0000) +#define MPI2_FAULT_PRODUCT_SPECIFIC_MAX (0xEFFF) + + +/***************************************************************************** +* +* System Interface Register Definitions +* +*****************************************************************************/ + +typedef volatile struct _MPI2_SYSTEM_INTERFACE_REGS +{ + U32 Doorbell; /* 0x00 */ + U32 WriteSequence; /* 0x04 */ + U32 HostDiagnostic; /* 0x08 */ + U32 Reserved1; /* 0x0C */ + U32 DiagRWData; /* 0x10 */ + U32 DiagRWAddressLow; /* 0x14 */ + U32 DiagRWAddressHigh; /* 0x18 */ + U32 Reserved2[5]; /* 0x1C */ + U32 HostInterruptStatus; /* 0x30 */ + U32 HostInterruptMask; /* 0x34 */ + U32 DCRData; /* 0x38 */ + U32 DCRAddress; /* 0x3C */ + U32 Reserved3[2]; /* 0x40 */ + U32 ReplyFreeHostIndex; /* 0x48 */ + U32 Reserved4[8]; /* 0x4C */ + U32 ReplyPostHostIndex; /* 0x6C */ + U32 Reserved5; /* 0x70 */ + U32 HCBSize; /* 0x74 */ + U32 HCBAddressLow; /* 0x78 */ + U32 HCBAddressHigh; /* 0x7C */ + U32 Reserved6[16]; /* 0x80 */ + U32 RequestDescriptorPostLow; /* 0xC0 */ + U32 RequestDescriptorPostHigh; /* 0xC4 */ + U32 Reserved7[14]; /* 0xC8 */ +} MPI2_SYSTEM_INTERFACE_REGS, MPI2_POINTER PTR_MPI2_SYSTEM_INTERFACE_REGS, + Mpi2SystemInterfaceRegs_t, MPI2_POINTER pMpi2SystemInterfaceRegs_t; + +/* + * Defines for working with the Doorbell register. + */ +#define MPI2_DOORBELL_OFFSET (0x00000000) + +/* IOC --> System values */ +#define MPI2_DOORBELL_USED (0x08000000) +#define MPI2_DOORBELL_WHO_INIT_MASK (0x07000000) +#define MPI2_DOORBELL_WHO_INIT_SHIFT (24) +#define MPI2_DOORBELL_FAULT_CODE_MASK (0x0000FFFF) +#define MPI2_DOORBELL_DATA_MASK (0x0000FFFF) + +/* System --> IOC values */ +#define MPI2_DOORBELL_FUNCTION_MASK (0xFF000000) +#define MPI2_DOORBELL_FUNCTION_SHIFT (24) +#define MPI2_DOORBELL_ADD_DWORDS_MASK (0x00FF0000) +#define MPI2_DOORBELL_ADD_DWORDS_SHIFT (16) + + +/* + * Defines for the WriteSequence register + */ +#define MPI2_WRITE_SEQUENCE_OFFSET (0x00000004) +#define MPI2_WRSEQ_KEY_VALUE_MASK (0x0000000F) +#define MPI2_WRSEQ_FLUSH_KEY_VALUE (0x0) +#define MPI2_WRSEQ_1ST_KEY_VALUE (0xF) +#define MPI2_WRSEQ_2ND_KEY_VALUE (0x4) +#define MPI2_WRSEQ_3RD_KEY_VALUE (0xB) +#define MPI2_WRSEQ_4TH_KEY_VALUE (0x2) +#define MPI2_WRSEQ_5TH_KEY_VALUE (0x7) +#define MPI2_WRSEQ_6TH_KEY_VALUE (0xD) + +/* + * Defines for the HostDiagnostic register + */ +#define MPI2_HOST_DIAGNOSTIC_OFFSET (0x00000008) + +#define MPI2_DIAG_BOOT_DEVICE_SELECT_MASK (0x00001800) +#define MPI2_DIAG_BOOT_DEVICE_SELECT_DEFAULT (0x00000000) +#define MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW (0x00000800) + +#define MPI2_DIAG_CLEAR_FLASH_BAD_SIG (0x00000400) +#define MPI2_DIAG_FORCE_HCB_ON_RESET (0x00000200) +#define MPI2_DIAG_HCB_MODE (0x00000100) +#define MPI2_DIAG_DIAG_WRITE_ENABLE (0x00000080) +#define MPI2_DIAG_FLASH_BAD_SIG (0x00000040) +#define MPI2_DIAG_RESET_HISTORY (0x00000020) +#define MPI2_DIAG_DIAG_RW_ENABLE (0x00000010) +#define MPI2_DIAG_RESET_ADAPTER (0x00000004) +#define MPI2_DIAG_HOLD_IOC_RESET (0x00000002) + +/* + * Offsets for DiagRWData and address + */ +#define MPI2_DIAG_RW_DATA_OFFSET (0x00000010) +#define MPI2_DIAG_RW_ADDRESS_LOW_OFFSET (0x00000014) +#define MPI2_DIAG_RW_ADDRESS_HIGH_OFFSET (0x00000018) + +/* + * Defines for the HostInterruptStatus register + */ +#define MPI2_HOST_INTERRUPT_STATUS_OFFSET (0x00000030) +#define MPI2_HIS_SYS2IOC_DB_STATUS (0x80000000) +#define MPI2_HIS_IOP_DOORBELL_STATUS MPI2_HIS_SYS2IOC_DB_STATUS +#define MPI2_HIS_RESET_IRQ_STATUS (0x40000000) +#define MPI2_HIS_REPLY_DESCRIPTOR_INTERRUPT (0x00000008) +#define MPI2_HIS_IOC2SYS_DB_STATUS (0x00000001) +#define MPI2_HIS_DOORBELL_INTERRUPT MPI2_HIS_IOC2SYS_DB_STATUS + +/* + * Defines for the HostInterruptMask register + */ +#define MPI2_HOST_INTERRUPT_MASK_OFFSET (0x00000034) +#define MPI2_HIM_RESET_IRQ_MASK (0x40000000) +#define MPI2_HIM_REPLY_INT_MASK (0x00000008) +#define MPI2_HIM_RIM MPI2_HIM_REPLY_INT_MASK +#define MPI2_HIM_IOC2SYS_DB_MASK (0x00000001) +#define MPI2_HIM_DIM MPI2_HIM_IOC2SYS_DB_MASK + +/* + * Offsets for DCRData and address + */ +#define MPI2_DCR_DATA_OFFSET (0x00000038) +#define MPI2_DCR_ADDRESS_OFFSET (0x0000003C) + +/* + * Offset for the Reply Free Queue + */ +#define MPI2_REPLY_FREE_HOST_INDEX_OFFSET (0x00000048) + +/* + * Defines for the Reply Descriptor Post Queue + */ +#define MPI2_REPLY_POST_HOST_INDEX_OFFSET (0x0000006C) +#define MPI2_REPLY_POST_HOST_INDEX_MASK (0x00FFFFFF) +#define MPI2_RPHI_MSIX_INDEX_MASK (0xFF000000) +#define MPI2_RPHI_MSIX_INDEX_SHIFT (24) + +/* + * Defines for the HCBSize and address + */ +#define MPI2_HCB_SIZE_OFFSET (0x00000074) +#define MPI2_HCB_SIZE_SIZE_MASK (0xFFFFF000) +#define MPI2_HCB_SIZE_HCB_ENABLE (0x00000001) + +#define MPI2_HCB_ADDRESS_LOW_OFFSET (0x00000078) +#define MPI2_HCB_ADDRESS_HIGH_OFFSET (0x0000007C) + +/* + * Offsets for the Request Queue + */ +#define MPI2_REQUEST_DESCRIPTOR_POST_LOW_OFFSET (0x000000C0) +#define MPI2_REQUEST_DESCRIPTOR_POST_HIGH_OFFSET (0x000000C4) + + +/***************************************************************************** +* +* Message Descriptors +* +*****************************************************************************/ + +/* Request Descriptors */ + +/* Default Request Descriptor */ +typedef struct _MPI2_DEFAULT_REQUEST_DESCRIPTOR +{ + U8 RequestFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U16 LMID; /* 0x04 */ + U16 DescriptorTypeDependent; /* 0x06 */ +} MPI2_DEFAULT_REQUEST_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_DEFAULT_REQUEST_DESCRIPTOR, + Mpi2DefaultRequestDescriptor_t, MPI2_POINTER pMpi2DefaultRequestDescriptor_t; + +/* defines for the RequestFlags field */ +#define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK (0x0E) +#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO (0x00) +#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET (0x02) +#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (0x06) +#define MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE (0x08) +#define MPI2_REQ_DESCRIPT_FLAGS_RAID_ACCELERATOR (0x0A) +#define MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO (0x0C) + +#define MPI2_REQ_DESCRIPT_FLAGS_IOC_FIFO_MARKER (0x01) + + +/* High Priority Request Descriptor */ +typedef struct _MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR +{ + U8 RequestFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U16 LMID; /* 0x04 */ + U16 Reserved1; /* 0x06 */ +} MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR, + Mpi2HighPriorityRequestDescriptor_t, + MPI2_POINTER pMpi2HighPriorityRequestDescriptor_t; + + +/* SCSI IO Request Descriptor */ +typedef struct _MPI2_SCSI_IO_REQUEST_DESCRIPTOR +{ + U8 RequestFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U16 LMID; /* 0x04 */ + U16 DevHandle; /* 0x06 */ +} MPI2_SCSI_IO_REQUEST_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_SCSI_IO_REQUEST_DESCRIPTOR, + Mpi2SCSIIORequestDescriptor_t, MPI2_POINTER pMpi2SCSIIORequestDescriptor_t; + + +/* SCSI Target Request Descriptor */ +typedef struct _MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR +{ + U8 RequestFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U16 LMID; /* 0x04 */ + U16 IoIndex; /* 0x06 */ +} MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR, + Mpi2SCSITargetRequestDescriptor_t, + MPI2_POINTER pMpi2SCSITargetRequestDescriptor_t; + + +/* RAID Accelerator Request Descriptor */ +typedef struct _MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR +{ + U8 RequestFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U16 LMID; /* 0x04 */ + U16 Reserved; /* 0x06 */ +} MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR, + Mpi2RAIDAcceleratorRequestDescriptor_t, + MPI2_POINTER pMpi2RAIDAcceleratorRequestDescriptor_t; + + +/* Fast Path SCSI IO Request Descriptor */ +typedef MPI2_SCSI_IO_REQUEST_DESCRIPTOR + MPI25_FP_SCSI_IO_REQUEST_DESCRIPTOR, + MPI2_POINTER PTR_MPI25_FP_SCSI_IO_REQUEST_DESCRIPTOR, + Mpi25FastPathSCSIIORequestDescriptor_t, + MPI2_POINTER pMpi25FastPathSCSIIORequestDescriptor_t; + + +/* union of Request Descriptors */ +typedef union _MPI2_REQUEST_DESCRIPTOR_UNION +{ + MPI2_DEFAULT_REQUEST_DESCRIPTOR Default; + MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR HighPriority; + MPI2_SCSI_IO_REQUEST_DESCRIPTOR SCSIIO; + MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR SCSITarget; + MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR RAIDAccelerator; + MPI25_FP_SCSI_IO_REQUEST_DESCRIPTOR FastPathSCSIIO; + U64 Words; +} MPI2_REQUEST_DESCRIPTOR_UNION, MPI2_POINTER PTR_MPI2_REQUEST_DESCRIPTOR_UNION, + Mpi2RequestDescriptorUnion_t, MPI2_POINTER pMpi2RequestDescriptorUnion_t; + + +/* Reply Descriptors */ + +/* Default Reply Descriptor */ +typedef struct _MPI2_DEFAULT_REPLY_DESCRIPTOR +{ + U8 ReplyFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 DescriptorTypeDependent1; /* 0x02 */ + U32 DescriptorTypeDependent2; /* 0x04 */ +} MPI2_DEFAULT_REPLY_DESCRIPTOR, MPI2_POINTER PTR_MPI2_DEFAULT_REPLY_DESCRIPTOR, + Mpi2DefaultReplyDescriptor_t, MPI2_POINTER pMpi2DefaultReplyDescriptor_t; + +/* defines for the ReplyFlags field */ +#define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK (0x0F) +#define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS (0x00) +#define MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY (0x01) +#define MPI2_RPY_DESCRIPT_FLAGS_TARGETASSIST_SUCCESS (0x02) +#define MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER (0x03) +#define MPI2_RPY_DESCRIPT_FLAGS_RAID_ACCELERATOR_SUCCESS (0x05) +#define MPI25_RPY_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO_SUCCESS (0x06) +#define MPI2_RPY_DESCRIPT_FLAGS_UNUSED (0x0F) + +/* values for marking a reply descriptor as unused */ +#define MPI2_RPY_DESCRIPT_UNUSED_WORD0_MARK (0xFFFFFFFF) +#define MPI2_RPY_DESCRIPT_UNUSED_WORD1_MARK (0xFFFFFFFF) + +/* Address Reply Descriptor */ +typedef struct _MPI2_ADDRESS_REPLY_DESCRIPTOR +{ + U8 ReplyFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U32 ReplyFrameAddress; /* 0x04 */ +} MPI2_ADDRESS_REPLY_DESCRIPTOR, MPI2_POINTER PTR_MPI2_ADDRESS_REPLY_DESCRIPTOR, + Mpi2AddressReplyDescriptor_t, MPI2_POINTER pMpi2AddressReplyDescriptor_t; + +#define MPI2_ADDRESS_REPLY_SMID_INVALID (0x00) + + +/* SCSI IO Success Reply Descriptor */ +typedef struct _MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR +{ + U8 ReplyFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U16 TaskTag; /* 0x04 */ + U16 Reserved1; /* 0x06 */ +} MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR, + Mpi2SCSIIOSuccessReplyDescriptor_t, + MPI2_POINTER pMpi2SCSIIOSuccessReplyDescriptor_t; + + +/* TargetAssist Success Reply Descriptor */ +typedef struct _MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR +{ + U8 ReplyFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U8 SequenceNumber; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 IoIndex; /* 0x06 */ +} MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR, + Mpi2TargetAssistSuccessReplyDescriptor_t, + MPI2_POINTER pMpi2TargetAssistSuccessReplyDescriptor_t; + + +/* Target Command Buffer Reply Descriptor */ +typedef struct _MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR +{ + U8 ReplyFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U8 VP_ID; /* 0x02 */ + U8 Flags; /* 0x03 */ + U16 InitiatorDevHandle; /* 0x04 */ + U16 IoIndex; /* 0x06 */ +} MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR, + Mpi2TargetCommandBufferReplyDescriptor_t, + MPI2_POINTER pMpi2TargetCommandBufferReplyDescriptor_t; + +/* defines for Flags field */ +#define MPI2_RPY_DESCRIPT_TCB_FLAGS_PHYNUM_MASK (0x3F) + + +/* RAID Accelerator Success Reply Descriptor */ +typedef struct _MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR +{ + U8 ReplyFlags; /* 0x00 */ + U8 MSIxIndex; /* 0x01 */ + U16 SMID; /* 0x02 */ + U32 Reserved; /* 0x04 */ +} MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR, + MPI2_POINTER PTR_MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR, + Mpi2RAIDAcceleratorSuccessReplyDescriptor_t, + MPI2_POINTER pMpi2RAIDAcceleratorSuccessReplyDescriptor_t; + + +/* Fast Path SCSI IO Success Reply Descriptor */ +typedef MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR + MPI25_FP_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR, + MPI2_POINTER PTR_MPI25_FP_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR, + Mpi25FastPathSCSIIOSuccessReplyDescriptor_t, + MPI2_POINTER pMpi25FastPathSCSIIOSuccessReplyDescriptor_t; + + +/* union of Reply Descriptors */ +typedef union _MPI2_REPLY_DESCRIPTORS_UNION +{ + MPI2_DEFAULT_REPLY_DESCRIPTOR Default; + MPI2_ADDRESS_REPLY_DESCRIPTOR AddressReply; + MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR SCSIIOSuccess; + MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR TargetAssistSuccess; + MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR TargetCommandBuffer; + MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR RAIDAcceleratorSuccess; + MPI25_FP_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR FastPathSCSIIOSuccess; + U64 Words; +} MPI2_REPLY_DESCRIPTORS_UNION, MPI2_POINTER PTR_MPI2_REPLY_DESCRIPTORS_UNION, + Mpi2ReplyDescriptorsUnion_t, MPI2_POINTER pMpi2ReplyDescriptorsUnion_t; + + + +/***************************************************************************** +* +* Message Functions +* +*****************************************************************************/ + +#define MPI2_FUNCTION_SCSI_IO_REQUEST (0x00) /* SCSI IO */ +#define MPI2_FUNCTION_SCSI_TASK_MGMT (0x01) /* SCSI Task Management */ +#define MPI2_FUNCTION_IOC_INIT (0x02) /* IOC Init */ +#define MPI2_FUNCTION_IOC_FACTS (0x03) /* IOC Facts */ +#define MPI2_FUNCTION_CONFIG (0x04) /* Configuration */ +#define MPI2_FUNCTION_PORT_FACTS (0x05) /* Port Facts */ +#define MPI2_FUNCTION_PORT_ENABLE (0x06) /* Port Enable */ +#define MPI2_FUNCTION_EVENT_NOTIFICATION (0x07) /* Event Notification */ +#define MPI2_FUNCTION_EVENT_ACK (0x08) /* Event Acknowledge */ +#define MPI2_FUNCTION_FW_DOWNLOAD (0x09) /* FW Download */ +#define MPI2_FUNCTION_TARGET_ASSIST (0x0B) /* Target Assist */ +#define MPI2_FUNCTION_TARGET_STATUS_SEND (0x0C) /* Target Status Send */ +#define MPI2_FUNCTION_TARGET_MODE_ABORT (0x0D) /* Target Mode Abort */ +#define MPI2_FUNCTION_FW_UPLOAD (0x12) /* FW Upload */ +#define MPI2_FUNCTION_RAID_ACTION (0x15) /* RAID Action */ +#define MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH (0x16) /* SCSI IO RAID Passthrough */ +#define MPI2_FUNCTION_TOOLBOX (0x17) /* Toolbox */ +#define MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR (0x18) /* SCSI Enclosure Processor */ +#define MPI2_FUNCTION_SMP_PASSTHROUGH (0x1A) /* SMP Passthrough */ +#define MPI2_FUNCTION_SAS_IO_UNIT_CONTROL (0x1B) /* SAS IO Unit Control */ +#define MPI2_FUNCTION_SATA_PASSTHROUGH (0x1C) /* SATA Passthrough */ +#define MPI2_FUNCTION_DIAG_BUFFER_POST (0x1D) /* Diagnostic Buffer Post */ +#define MPI2_FUNCTION_DIAG_RELEASE (0x1E) /* Diagnostic Release */ +#define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST (0x24) /* Target Command Buffer Post Base */ +#define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST (0x25) /* Target Command Buffer Post List */ +#define MPI2_FUNCTION_RAID_ACCELERATOR (0x2C) /* RAID Accelerator */ +#define MPI2_FUNCTION_HOST_BASED_DISCOVERY_ACTION (0x2F) /* Host Based Discovery Action */ +#define MPI2_FUNCTION_PWR_MGMT_CONTROL (0x30) /* Power Management Control */ +#define MPI2_FUNCTION_SEND_HOST_MESSAGE (0x31) /* Send Host Message */ +#define MPI2_FUNCTION_MIN_PRODUCT_SPECIFIC (0xF0) /* beginning of product-specific range */ +#define MPI2_FUNCTION_MAX_PRODUCT_SPECIFIC (0xFF) /* end of product-specific range */ + + + +/* Doorbell functions */ +#define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET (0x40) +#define MPI2_FUNCTION_HANDSHAKE (0x42) + + +/***************************************************************************** +* +* IOC Status Values +* +*****************************************************************************/ + +/* mask for IOCStatus status value */ +#define MPI2_IOCSTATUS_MASK (0x7FFF) + +/**************************************************************************** +* Common IOCStatus values for all replies +****************************************************************************/ + +#define MPI2_IOCSTATUS_SUCCESS (0x0000) +#define MPI2_IOCSTATUS_INVALID_FUNCTION (0x0001) +#define MPI2_IOCSTATUS_BUSY (0x0002) +#define MPI2_IOCSTATUS_INVALID_SGL (0x0003) +#define MPI2_IOCSTATUS_INTERNAL_ERROR (0x0004) +#define MPI2_IOCSTATUS_INVALID_VPID (0x0005) +#define MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES (0x0006) +#define MPI2_IOCSTATUS_INVALID_FIELD (0x0007) +#define MPI2_IOCSTATUS_INVALID_STATE (0x0008) +#define MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED (0x0009) + +/**************************************************************************** +* Config IOCStatus values +****************************************************************************/ + +#define MPI2_IOCSTATUS_CONFIG_INVALID_ACTION (0x0020) +#define MPI2_IOCSTATUS_CONFIG_INVALID_TYPE (0x0021) +#define MPI2_IOCSTATUS_CONFIG_INVALID_PAGE (0x0022) +#define MPI2_IOCSTATUS_CONFIG_INVALID_DATA (0x0023) +#define MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS (0x0024) +#define MPI2_IOCSTATUS_CONFIG_CANT_COMMIT (0x0025) + +/**************************************************************************** +* SCSI IO Reply +****************************************************************************/ + +#define MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR (0x0040) +#define MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE (0x0042) +#define MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE (0x0043) +#define MPI2_IOCSTATUS_SCSI_DATA_OVERRUN (0x0044) +#define MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN (0x0045) +#define MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR (0x0046) +#define MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR (0x0047) +#define MPI2_IOCSTATUS_SCSI_TASK_TERMINATED (0x0048) +#define MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH (0x0049) +#define MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED (0x004A) +#define MPI2_IOCSTATUS_SCSI_IOC_TERMINATED (0x004B) +#define MPI2_IOCSTATUS_SCSI_EXT_TERMINATED (0x004C) + +/**************************************************************************** +* For use by SCSI Initiator and SCSI Target end-to-end data protection +****************************************************************************/ + +#define MPI2_IOCSTATUS_EEDP_GUARD_ERROR (0x004D) +#define MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR (0x004E) +#define MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR (0x004F) + +/**************************************************************************** +* SCSI Target values +****************************************************************************/ + +#define MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX (0x0062) +#define MPI2_IOCSTATUS_TARGET_ABORTED (0x0063) +#define MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE (0x0064) +#define MPI2_IOCSTATUS_TARGET_NO_CONNECTION (0x0065) +#define MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH (0x006A) +#define MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR (0x006D) +#define MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA (0x006E) +#define MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT (0x006F) +#define MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT (0x0070) +#define MPI2_IOCSTATUS_TARGET_NAK_RECEIVED (0x0071) + +/**************************************************************************** +* Serial Attached SCSI values +****************************************************************************/ + +#define MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED (0x0090) +#define MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN (0x0091) + +/**************************************************************************** +* Diagnostic Buffer Post / Diagnostic Release values +****************************************************************************/ + +#define MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED (0x00A0) + +/**************************************************************************** +* RAID Accelerator values +****************************************************************************/ + +#define MPI2_IOCSTATUS_RAID_ACCEL_ERROR (0x00B0) + +/**************************************************************************** +* IOCStatus flag to indicate that log info is available +****************************************************************************/ + +#define MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE (0x8000) + +/**************************************************************************** +* IOCLogInfo Types +****************************************************************************/ + +#define MPI2_IOCLOGINFO_TYPE_MASK (0xF0000000) +#define MPI2_IOCLOGINFO_TYPE_SHIFT (28) +#define MPI2_IOCLOGINFO_TYPE_NONE (0x0) +#define MPI2_IOCLOGINFO_TYPE_SCSI (0x1) +#define MPI2_IOCLOGINFO_TYPE_FC (0x2) +#define MPI2_IOCLOGINFO_TYPE_SAS (0x3) +#define MPI2_IOCLOGINFO_TYPE_ISCSI (0x4) +#define MPI2_IOCLOGINFO_LOG_DATA_MASK (0x0FFFFFFF) + + +/***************************************************************************** +* +* Standard Message Structures +* +*****************************************************************************/ + +/**************************************************************************** +* Request Message Header for all request messages +****************************************************************************/ + +typedef struct _MPI2_REQUEST_HEADER +{ + U16 FunctionDependent1; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 FunctionDependent2; /* 0x04 */ + U8 FunctionDependent3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ +} MPI2_REQUEST_HEADER, MPI2_POINTER PTR_MPI2_REQUEST_HEADER, + MPI2RequestHeader_t, MPI2_POINTER pMPI2RequestHeader_t; + + +/**************************************************************************** +* Default Reply +****************************************************************************/ + +typedef struct _MPI2_DEFAULT_REPLY +{ + U16 FunctionDependent1; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 FunctionDependent2; /* 0x04 */ + U8 FunctionDependent3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U16 FunctionDependent5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_DEFAULT_REPLY, MPI2_POINTER PTR_MPI2_DEFAULT_REPLY, + MPI2DefaultReply_t, MPI2_POINTER pMPI2DefaultReply_t; + + +/* common version structure/union used in messages and configuration pages */ + +typedef struct _MPI2_VERSION_STRUCT +{ + U8 Dev; /* 0x00 */ + U8 Unit; /* 0x01 */ + U8 Minor; /* 0x02 */ + U8 Major; /* 0x03 */ +} MPI2_VERSION_STRUCT; + +typedef union _MPI2_VERSION_UNION +{ + MPI2_VERSION_STRUCT Struct; + U32 Word; +} MPI2_VERSION_UNION; + + +/* LUN field defines, common to many structures */ +#define MPI2_LUN_FIRST_LEVEL_ADDRESSING (0x0000FFFF) +#define MPI2_LUN_SECOND_LEVEL_ADDRESSING (0xFFFF0000) +#define MPI2_LUN_THIRD_LEVEL_ADDRESSING (0x0000FFFF) +#define MPI2_LUN_FOURTH_LEVEL_ADDRESSING (0xFFFF0000) +#define MPI2_LUN_LEVEL_1_WORD (0xFF00) +#define MPI2_LUN_LEVEL_1_DWORD (0x0000FF00) + + +/***************************************************************************** +* +* Fusion-MPT MPI Scatter Gather Elements +* +*****************************************************************************/ + +/**************************************************************************** +* MPI Simple Element structures +****************************************************************************/ + +typedef struct _MPI2_SGE_SIMPLE32 +{ + U32 FlagsLength; + U32 Address; +} MPI2_SGE_SIMPLE32, MPI2_POINTER PTR_MPI2_SGE_SIMPLE32, + Mpi2SGESimple32_t, MPI2_POINTER pMpi2SGESimple32_t; + +typedef struct _MPI2_SGE_SIMPLE64 +{ + U32 FlagsLength; + U64 Address; +} MPI2_SGE_SIMPLE64, MPI2_POINTER PTR_MPI2_SGE_SIMPLE64, + Mpi2SGESimple64_t, MPI2_POINTER pMpi2SGESimple64_t; + +typedef struct _MPI2_SGE_SIMPLE_UNION +{ + U32 FlagsLength; + union + { + U32 Address32; + U64 Address64; + } u; +} MPI2_SGE_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_SGE_SIMPLE_UNION, + Mpi2SGESimpleUnion_t, MPI2_POINTER pMpi2SGESimpleUnion_t; + + +/**************************************************************************** +* MPI Chain Element structures - for MPI v2.0 products only +****************************************************************************/ + +typedef struct _MPI2_SGE_CHAIN32 +{ + U16 Length; + U8 NextChainOffset; + U8 Flags; + U32 Address; +} MPI2_SGE_CHAIN32, MPI2_POINTER PTR_MPI2_SGE_CHAIN32, + Mpi2SGEChain32_t, MPI2_POINTER pMpi2SGEChain32_t; + +typedef struct _MPI2_SGE_CHAIN64 +{ + U16 Length; + U8 NextChainOffset; + U8 Flags; + U64 Address; +} MPI2_SGE_CHAIN64, MPI2_POINTER PTR_MPI2_SGE_CHAIN64, + Mpi2SGEChain64_t, MPI2_POINTER pMpi2SGEChain64_t; + +typedef struct _MPI2_SGE_CHAIN_UNION +{ + U16 Length; + U8 NextChainOffset; + U8 Flags; + union + { + U32 Address32; + U64 Address64; + } u; +} MPI2_SGE_CHAIN_UNION, MPI2_POINTER PTR_MPI2_SGE_CHAIN_UNION, + Mpi2SGEChainUnion_t, MPI2_POINTER pMpi2SGEChainUnion_t; + + +/**************************************************************************** +* MPI Transaction Context Element structures - for MPI v2.0 products only +****************************************************************************/ + +typedef struct _MPI2_SGE_TRANSACTION32 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[1]; + U32 TransactionDetails[1]; +} MPI2_SGE_TRANSACTION32, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION32, + Mpi2SGETransaction32_t, MPI2_POINTER pMpi2SGETransaction32_t; + +typedef struct _MPI2_SGE_TRANSACTION64 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[2]; + U32 TransactionDetails[1]; +} MPI2_SGE_TRANSACTION64, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION64, + Mpi2SGETransaction64_t, MPI2_POINTER pMpi2SGETransaction64_t; + +typedef struct _MPI2_SGE_TRANSACTION96 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[3]; + U32 TransactionDetails[1]; +} MPI2_SGE_TRANSACTION96, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION96, + Mpi2SGETransaction96_t, MPI2_POINTER pMpi2SGETransaction96_t; + +typedef struct _MPI2_SGE_TRANSACTION128 +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + U32 TransactionContext[4]; + U32 TransactionDetails[1]; +} MPI2_SGE_TRANSACTION128, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION128, + Mpi2SGETransaction_t128, MPI2_POINTER pMpi2SGETransaction_t128; + +typedef struct _MPI2_SGE_TRANSACTION_UNION +{ + U8 Reserved; + U8 ContextSize; + U8 DetailsLength; + U8 Flags; + union + { + U32 TransactionContext32[1]; + U32 TransactionContext64[2]; + U32 TransactionContext96[3]; + U32 TransactionContext128[4]; + } u; + U32 TransactionDetails[1]; +} MPI2_SGE_TRANSACTION_UNION, MPI2_POINTER PTR_MPI2_SGE_TRANSACTION_UNION, + Mpi2SGETransactionUnion_t, MPI2_POINTER pMpi2SGETransactionUnion_t; + + +/**************************************************************************** +* MPI SGE union for IO SGL's - for MPI v2.0 products only +****************************************************************************/ + +typedef struct _MPI2_MPI_SGE_IO_UNION +{ + union + { + MPI2_SGE_SIMPLE_UNION Simple; + MPI2_SGE_CHAIN_UNION Chain; + } u; +} MPI2_MPI_SGE_IO_UNION, MPI2_POINTER PTR_MPI2_MPI_SGE_IO_UNION, + Mpi2MpiSGEIOUnion_t, MPI2_POINTER pMpi2MpiSGEIOUnion_t; + + +/**************************************************************************** +* MPI SGE union for SGL's with Simple and Transaction elements - for MPI v2.0 products only +****************************************************************************/ + +typedef struct _MPI2_SGE_TRANS_SIMPLE_UNION +{ + union + { + MPI2_SGE_SIMPLE_UNION Simple; + MPI2_SGE_TRANSACTION_UNION Transaction; + } u; +} MPI2_SGE_TRANS_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_SGE_TRANS_SIMPLE_UNION, + Mpi2SGETransSimpleUnion_t, MPI2_POINTER pMpi2SGETransSimpleUnion_t; + + +/**************************************************************************** +* All MPI SGE types union +****************************************************************************/ + +typedef struct _MPI2_MPI_SGE_UNION +{ + union + { + MPI2_SGE_SIMPLE_UNION Simple; + MPI2_SGE_CHAIN_UNION Chain; + MPI2_SGE_TRANSACTION_UNION Transaction; + } u; +} MPI2_MPI_SGE_UNION, MPI2_POINTER PTR_MPI2_MPI_SGE_UNION, + Mpi2MpiSgeUnion_t, MPI2_POINTER pMpi2MpiSgeUnion_t; + + +/**************************************************************************** +* MPI SGE field definition and masks +****************************************************************************/ + +/* Flags field bit definitions */ + +#define MPI2_SGE_FLAGS_LAST_ELEMENT (0x80) +#define MPI2_SGE_FLAGS_END_OF_BUFFER (0x40) +#define MPI2_SGE_FLAGS_ELEMENT_TYPE_MASK (0x30) +#define MPI2_SGE_FLAGS_LOCAL_ADDRESS (0x08) +#define MPI2_SGE_FLAGS_DIRECTION (0x04) +#define MPI2_SGE_FLAGS_ADDRESS_SIZE (0x02) +#define MPI2_SGE_FLAGS_END_OF_LIST (0x01) + +#define MPI2_SGE_FLAGS_SHIFT (24) + +#define MPI2_SGE_LENGTH_MASK (0x00FFFFFF) +#define MPI2_SGE_CHAIN_LENGTH_MASK (0x0000FFFF) + +/* Element Type */ + +#define MPI2_SGE_FLAGS_TRANSACTION_ELEMENT (0x00) /* for MPI v2.0 products only */ +#define MPI2_SGE_FLAGS_SIMPLE_ELEMENT (0x10) +#define MPI2_SGE_FLAGS_CHAIN_ELEMENT (0x30) /* for MPI v2.0 products only */ +#define MPI2_SGE_FLAGS_ELEMENT_MASK (0x30) + +/* Address location */ + +#define MPI2_SGE_FLAGS_SYSTEM_ADDRESS (0x00) + +/* Direction */ + +#define MPI2_SGE_FLAGS_IOC_TO_HOST (0x00) +#define MPI2_SGE_FLAGS_HOST_TO_IOC (0x04) + +#define MPI2_SGE_FLAGS_DEST (MPI2_SGE_FLAGS_IOC_TO_HOST) +#define MPI2_SGE_FLAGS_SOURCE (MPI2_SGE_FLAGS_HOST_TO_IOC) + +/* Address Size */ + +#define MPI2_SGE_FLAGS_32_BIT_ADDRESSING (0x00) +#define MPI2_SGE_FLAGS_64_BIT_ADDRESSING (0x02) + +/* Context Size */ + +#define MPI2_SGE_FLAGS_32_BIT_CONTEXT (0x00) +#define MPI2_SGE_FLAGS_64_BIT_CONTEXT (0x02) +#define MPI2_SGE_FLAGS_96_BIT_CONTEXT (0x04) +#define MPI2_SGE_FLAGS_128_BIT_CONTEXT (0x06) + +#define MPI2_SGE_CHAIN_OFFSET_MASK (0x00FF0000) +#define MPI2_SGE_CHAIN_OFFSET_SHIFT (16) + +/**************************************************************************** +* MPI SGE operation Macros +****************************************************************************/ + +/* SIMPLE FlagsLength manipulations... */ +#define MPI2_SGE_SET_FLAGS(f) ((U32)(f) << MPI2_SGE_FLAGS_SHIFT) +#define MPI2_SGE_GET_FLAGS(f) (((f) & ~MPI2_SGE_LENGTH_MASK) >> MPI2_SGE_FLAGS_SHIFT) +#define MPI2_SGE_LENGTH(f) ((f) & MPI2_SGE_LENGTH_MASK) +#define MPI2_SGE_CHAIN_LENGTH(f) ((f) & MPI2_SGE_CHAIN_LENGTH_MASK) + +#define MPI2_SGE_SET_FLAGS_LENGTH(f,l) (MPI2_SGE_SET_FLAGS(f) | MPI2_SGE_LENGTH(l)) + +#define MPI2_pSGE_GET_FLAGS(psg) MPI2_SGE_GET_FLAGS((psg)->FlagsLength) +#define MPI2_pSGE_GET_LENGTH(psg) MPI2_SGE_LENGTH((psg)->FlagsLength) +#define MPI2_pSGE_SET_FLAGS_LENGTH(psg,f,l) (psg)->FlagsLength = MPI2_SGE_SET_FLAGS_LENGTH(f,l) + +/* CAUTION - The following are READ-MODIFY-WRITE! */ +#define MPI2_pSGE_SET_FLAGS(psg,f) (psg)->FlagsLength |= MPI2_SGE_SET_FLAGS(f) +#define MPI2_pSGE_SET_LENGTH(psg,l) (psg)->FlagsLength |= MPI2_SGE_LENGTH(l) + +#define MPI2_GET_CHAIN_OFFSET(x) ((x & MPI2_SGE_CHAIN_OFFSET_MASK) >> MPI2_SGE_CHAIN_OFFSET_SHIFT) + + +/***************************************************************************** +* +* Fusion-MPT IEEE Scatter Gather Elements +* +*****************************************************************************/ + +/**************************************************************************** +* IEEE Simple Element structures +****************************************************************************/ + +/* MPI2_IEEE_SGE_SIMPLE32 is for MPI v2.0 products only */ +typedef struct _MPI2_IEEE_SGE_SIMPLE32 +{ + U32 Address; + U32 FlagsLength; +} MPI2_IEEE_SGE_SIMPLE32, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE32, + Mpi2IeeeSgeSimple32_t, MPI2_POINTER pMpi2IeeeSgeSimple32_t; + +typedef struct _MPI2_IEEE_SGE_SIMPLE64 +{ + U64 Address; + U32 Length; + U16 Reserved1; + U8 Reserved2; + U8 Flags; +} MPI2_IEEE_SGE_SIMPLE64, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE64, + Mpi2IeeeSgeSimple64_t, MPI2_POINTER pMpi2IeeeSgeSimple64_t; + +typedef union _MPI2_IEEE_SGE_SIMPLE_UNION +{ + MPI2_IEEE_SGE_SIMPLE32 Simple32; + MPI2_IEEE_SGE_SIMPLE64 Simple64; +} MPI2_IEEE_SGE_SIMPLE_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_SIMPLE_UNION, + Mpi2IeeeSgeSimpleUnion_t, MPI2_POINTER pMpi2IeeeSgeSimpleUnion_t; + + +/**************************************************************************** +* IEEE Chain Element structures +****************************************************************************/ + +/* MPI2_IEEE_SGE_CHAIN32 is for MPI v2.0 products only */ +typedef MPI2_IEEE_SGE_SIMPLE32 MPI2_IEEE_SGE_CHAIN32; + +/* MPI2_IEEE_SGE_CHAIN64 is for MPI v2.0 products only */ +typedef MPI2_IEEE_SGE_SIMPLE64 MPI2_IEEE_SGE_CHAIN64; + +typedef union _MPI2_IEEE_SGE_CHAIN_UNION +{ + MPI2_IEEE_SGE_CHAIN32 Chain32; + MPI2_IEEE_SGE_CHAIN64 Chain64; +} MPI2_IEEE_SGE_CHAIN_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_CHAIN_UNION, + Mpi2IeeeSgeChainUnion_t, MPI2_POINTER pMpi2IeeeSgeChainUnion_t; + +/* MPI25_IEEE_SGE_CHAIN64 is for MPI v2.5 products only */ +typedef struct _MPI25_IEEE_SGE_CHAIN64 +{ + U64 Address; + U32 Length; + U16 Reserved1; + U8 NextChainOffset; + U8 Flags; +} MPI25_IEEE_SGE_CHAIN64, MPI2_POINTER PTR_MPI25_IEEE_SGE_CHAIN64, + Mpi25IeeeSgeChain64_t, MPI2_POINTER pMpi25IeeeSgeChain64_t; + + +/**************************************************************************** +* All IEEE SGE types union +****************************************************************************/ + +/* MPI2_IEEE_SGE_UNION is for MPI v2.0 products only */ +typedef struct _MPI2_IEEE_SGE_UNION +{ + union + { + MPI2_IEEE_SGE_SIMPLE_UNION Simple; + MPI2_IEEE_SGE_CHAIN_UNION Chain; + } u; +} MPI2_IEEE_SGE_UNION, MPI2_POINTER PTR_MPI2_IEEE_SGE_UNION, + Mpi2IeeeSgeUnion_t, MPI2_POINTER pMpi2IeeeSgeUnion_t; + + +/**************************************************************************** +* IEEE SGE union for IO SGL's +****************************************************************************/ + +typedef union _MPI25_SGE_IO_UNION +{ + MPI2_IEEE_SGE_SIMPLE64 IeeeSimple; + MPI25_IEEE_SGE_CHAIN64 IeeeChain; +} MPI25_SGE_IO_UNION, MPI2_POINTER PTR_MPI25_SGE_IO_UNION, + Mpi25SGEIOUnion_t, MPI2_POINTER pMpi25SGEIOUnion_t; + + +/**************************************************************************** +* IEEE SGE field definitions and masks +****************************************************************************/ + +/* Flags field bit definitions */ + +#define MPI2_IEEE_SGE_FLAGS_ELEMENT_TYPE_MASK (0x80) +#define MPI25_IEEE_SGE_FLAGS_END_OF_LIST (0x40) + +#define MPI2_IEEE32_SGE_FLAGS_SHIFT (24) + +#define MPI2_IEEE32_SGE_LENGTH_MASK (0x00FFFFFF) + +/* Element Type */ + +#define MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT (0x00) +#define MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT (0x80) + +/* Data Location Address Space */ + +#define MPI2_IEEE_SGE_FLAGS_ADDR_MASK (0x03) +#define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR (0x00) /* IEEE Simple Element only */ +#define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR (0x01) /* IEEE Simple Element only */ +#define MPI2_IEEE_SGE_FLAGS_IOCPLB_ADDR (0x02) +#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03) /* IEEE Simple Element only */ +#define MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR (0x03) /* IEEE Chain Element only */ + +/**************************************************************************** +* IEEE SGE operation Macros +****************************************************************************/ + +/* SIMPLE FlagsLength manipulations... */ +#define MPI2_IEEE32_SGE_SET_FLAGS(f) ((U32)(f) << MPI2_IEEE32_SGE_FLAGS_SHIFT) +#define MPI2_IEEE32_SGE_GET_FLAGS(f) (((f) & ~MPI2_IEEE32_SGE_LENGTH_MASK) >> MPI2_IEEE32_SGE_FLAGS_SHIFT) +#define MPI2_IEEE32_SGE_LENGTH(f) ((f) & MPI2_IEEE32_SGE_LENGTH_MASK) + +#define MPI2_IEEE32_SGE_SET_FLAGS_LENGTH(f, l) (MPI2_IEEE32_SGE_SET_FLAGS(f) | MPI2_IEEE32_SGE_LENGTH(l)) + +#define MPI2_IEEE32_pSGE_GET_FLAGS(psg) MPI2_IEEE32_SGE_GET_FLAGS((psg)->FlagsLength) +#define MPI2_IEEE32_pSGE_GET_LENGTH(psg) MPI2_IEEE32_SGE_LENGTH((psg)->FlagsLength) +#define MPI2_IEEE32_pSGE_SET_FLAGS_LENGTH(psg,f,l) (psg)->FlagsLength = MPI2_IEEE32_SGE_SET_FLAGS_LENGTH(f,l) + +/* CAUTION - The following are READ-MODIFY-WRITE! */ +#define MPI2_IEEE32_pSGE_SET_FLAGS(psg,f) (psg)->FlagsLength |= MPI2_IEEE32_SGE_SET_FLAGS(f) +#define MPI2_IEEE32_pSGE_SET_LENGTH(psg,l) (psg)->FlagsLength |= MPI2_IEEE32_SGE_LENGTH(l) + + + + +/***************************************************************************** +* +* Fusion-MPT MPI/IEEE Scatter Gather Unions +* +*****************************************************************************/ + +typedef union _MPI2_SIMPLE_SGE_UNION +{ + MPI2_SGE_SIMPLE_UNION MpiSimple; + MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple; +} MPI2_SIMPLE_SGE_UNION, MPI2_POINTER PTR_MPI2_SIMPLE_SGE_UNION, + Mpi2SimpleSgeUntion_t, MPI2_POINTER pMpi2SimpleSgeUntion_t; + + +typedef union _MPI2_SGE_IO_UNION +{ + MPI2_SGE_SIMPLE_UNION MpiSimple; + MPI2_SGE_CHAIN_UNION MpiChain; + MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple; + MPI2_IEEE_SGE_CHAIN_UNION IeeeChain; +} MPI2_SGE_IO_UNION, MPI2_POINTER PTR_MPI2_SGE_IO_UNION, + Mpi2SGEIOUnion_t, MPI2_POINTER pMpi2SGEIOUnion_t; + + +/**************************************************************************** +* +* Values for SGLFlags field, used in many request messages with an SGL +* +****************************************************************************/ + +/* values for MPI SGL Data Location Address Space subfield */ +#define MPI2_SGLFLAGS_ADDRESS_SPACE_MASK (0x0C) +#define MPI2_SGLFLAGS_SYSTEM_ADDRESS_SPACE (0x00) +#define MPI2_SGLFLAGS_IOCDDR_ADDRESS_SPACE (0x04) +#define MPI2_SGLFLAGS_IOCPLB_ADDRESS_SPACE (0x08) +#define MPI2_SGLFLAGS_IOCPLBNTA_ADDRESS_SPACE (0x0C) +/* values for SGL Type subfield */ +#define MPI2_SGLFLAGS_SGL_TYPE_MASK (0x03) +#define MPI2_SGLFLAGS_SGL_TYPE_MPI (0x00) +#define MPI2_SGLFLAGS_SGL_TYPE_IEEE32 (0x01) +#define MPI2_SGLFLAGS_SGL_TYPE_IEEE64 (0x02) + + +#endif + diff --git a/source/lsi/mpi2_cnfg.h b/source/lsi/mpi2_cnfg.h new file mode 100755 index 0000000..5396fad --- /dev/null +++ b/source/lsi/mpi2_cnfg.h @@ -0,0 +1,3071 @@ +/* + * Copyright (c) 2000-2011 LSI Corporation. + * + * + * Name: mpi2_cnfg.h + * Title: MPI Configuration messages and pages + * Creation Date: November 10, 2006 + * + * mpi2_cnfg.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-04-07 02.00.01 Added defines for SAS IO Unit Page 2 PhyFlags. + * Added Manufacturing Page 11. + * Added MPI2_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE + * define. + * 06-26-07 02.00.02 Adding generic structure for product-specific + * Manufacturing pages: MPI2_CONFIG_PAGE_MANUFACTURING_PS. + * Rework of BIOS Page 2 configuration page. + * Fixed MPI2_BIOSPAGE2_BOOT_DEVICE to be a union of the + * forms. + * Added configuration pages IOC Page 8 and Driver + * Persistent Mapping Page 0. + * 08-31-07 02.00.03 Modified configuration pages dealing with Integrated + * RAID (Manufacturing Page 4, RAID Volume Pages 0 and 1, + * RAID Physical Disk Pages 0 and 1, RAID Configuration + * Page 0). + * Added new value for AccessStatus field of SAS Device + * Page 0 (_SATA_NEEDS_INITIALIZATION). + * 10-31-07 02.00.04 Added missing SEPDevHandle field to + * MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0. + * 12-18-07 02.00.05 Modified IO Unit Page 0 to use 32-bit version fields for + * NVDATA. + * Modified IOC Page 7 to use masks and added field for + * SASBroadcastPrimitiveMasks. + * Added MPI2_CONFIG_PAGE_BIOS_4. + * Added MPI2_CONFIG_PAGE_LOG_0. + * 02-29-08 02.00.06 Modified various names to make them 32-character unique. + * Added SAS Device IDs. + * Updated Integrated RAID configuration pages including + * Manufacturing Page 4, IOC Page 6, and RAID Configuration + * Page 0. + * 05-21-08 02.00.07 Added define MPI2_MANPAGE4_MIX_SSD_SAS_SATA. + * Added define MPI2_MANPAGE4_PHYSDISK_128MB_COERCION. + * Fixed define MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING. + * Added missing MaxNumRoutedSasAddresses field to + * MPI2_CONFIG_PAGE_EXPANDER_0. + * Added SAS Port Page 0. + * Modified structure layout for + * MPI2_CONFIG_PAGE_DRIVER_MAPPING_0. + * 06-27-08 02.00.08 Changed MPI2_CONFIG_PAGE_RD_PDISK_1 to use + * MPI2_RAID_PHYS_DISK1_PATH_MAX to size the array. + * 10-02-08 02.00.09 Changed MPI2_RAID_PGAD_CONFIGNUM_MASK from 0x0000FFFF + * to 0x000000FF. + * Added two new values for the Physical Disk Coercion Size + * bits in the Flags field of Manufacturing Page 4. + * Added product-specific Manufacturing pages 16 to 31. + * Modified Flags bits for controlling write cache on SATA + * drives in IO Unit Page 1. + * Added new bit to AdditionalControlFlags of SAS IO Unit + * Page 1 to control Invalid Topology Correction. + * Added additional defines for RAID Volume Page 0 + * VolumeStatusFlags field. + * Modified meaning of RAID Volume Page 0 VolumeSettings + * define for auto-configure of hot-swap drives. + * Added SupportedPhysDisks field to RAID Volume Page 1 and + * added related defines. + * Added PhysDiskAttributes field (and related defines) to + * RAID Physical Disk Page 0. + * Added MPI2_SAS_PHYINFO_PHY_VACANT define. + * Added three new DiscoveryStatus bits for SAS IO Unit + * Page 0 and SAS Expander Page 0. + * Removed multiplexing information from SAS IO Unit pages. + * Added BootDeviceWaitTime field to SAS IO Unit Page 4. + * Removed Zone Address Resolved bit from PhyInfo and from + * Expander Page 0 Flags field. + * Added two new AccessStatus values to SAS Device Page 0 + * for indicating routing problems. Added 3 reserved words + * to this page. + * 01-19-09 02.00.10 Fixed defines for GPIOVal field of IO Unit Page 3. + * Inserted missing reserved field into structure for IOC + * Page 6. + * Added more pending task bits to RAID Volume Page 0 + * VolumeStatusFlags defines. + * Added MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED define. + * Added a new DiscoveryStatus bit for SAS IO Unit Page 0 + * and SAS Expander Page 0 to flag a downstream initiator + * when in simplified routing mode. + * Removed SATA Init Failure defines for DiscoveryStatus + * fields of SAS IO Unit Page 0 and SAS Expander Page 0. + * Added MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED define. + * Added PortGroups, DmaGroup, and ControlGroup fields to + * SAS Device Page 0. + * 05-06-09 02.00.11 Added structures and defines for IO Unit Page 5 and IO + * Unit Page 6. + * Added expander reduced functionality data to SAS + * Expander Page 0. + * Added SAS PHY Page 2 and SAS PHY Page 3. + * 07-30-09 02.00.12 Added IO Unit Page 7. + * Added new device ids. + * Added SAS IO Unit Page 5. + * Added partial and slumber power management capable flags + * to SAS Device Page 0 Flags field. + * Added PhyInfo defines for power condition. + * Added Ethernet configuration pages. + * 10-28-09 02.00.13 Added MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY. + * Added SAS PHY Page 4 structure and defines. + * 02-10-10 02.00.14 Modified the comments for the configuration page + * structures that contain an array of data. The host + * should use the "count" field in the page data (e.g. the + * NumPhys field) to determine the number of valid elements + * in the array. + * Added/modified some MPI2_MFGPAGE_DEVID_SAS defines. + * Added PowerManagementCapabilities to IO Unit Page 7. + * Added PortWidthModGroup field to + * MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS. + * Added MPI2_CONFIG_PAGE_SASIOUNIT_6 and related defines. + * Added MPI2_CONFIG_PAGE_SASIOUNIT_7 and related defines. + * Added MPI2_CONFIG_PAGE_SASIOUNIT_8 and related defines. + * 05-12-10 02.00.15 Added MPI2_RAIDVOL0_STATUS_FLAG_VOL_NOT_CONSISTENT + * define. + * Added MPI2_PHYSDISK0_INCOMPATIBLE_MEDIA_TYPE define. + * Added MPI2_SAS_NEG_LINK_RATE_UNSUPPORTED_PHY define. + * 08-11-10 02.00.16 Removed IO Unit Page 1 device path (multi-pathing) + * defines. + * 11-10-10 02.00.17 Added ReceptacleID field (replacing Reserved1) to + * MPI2_MANPAGE7_CONNECTOR_INFO and reworked defines for + * the Pinout field. + * Added BoardTemperature and BoardTemperatureUnits fields + * to MPI2_CONFIG_PAGE_IO_UNIT_7. + * Added MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING define + * and MPI2_CONFIG_PAGE_EXT_MAN_PS structure. + * 02-23-11 02.00.18 Added ProxyVF_ID field to MPI2_CONFIG_REQUEST. + * Added IO Unit Page 8, IO Unit Page 9, + * and IO Unit Page 10. + * Added SASNotifyPrimitiveMasks field to + * MPI2_CONFIG_PAGE_IOC_7. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_CNFG_H +#define MPI2_CNFG_H + +/***************************************************************************** +* Configuration Page Header and defines +*****************************************************************************/ + +/* Config Page Header */ +typedef struct _MPI2_CONFIG_PAGE_HEADER +{ + U8 PageVersion; /* 0x00 */ + U8 PageLength; /* 0x01 */ + U8 PageNumber; /* 0x02 */ + U8 PageType; /* 0x03 */ +} MPI2_CONFIG_PAGE_HEADER, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_HEADER, + Mpi2ConfigPageHeader_t, MPI2_POINTER pMpi2ConfigPageHeader_t; + +typedef union _MPI2_CONFIG_PAGE_HEADER_UNION +{ + MPI2_CONFIG_PAGE_HEADER Struct; + U8 Bytes[4]; + U16 Word16[2]; + U32 Word32; +} MPI2_CONFIG_PAGE_HEADER_UNION, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_HEADER_UNION, + Mpi2ConfigPageHeaderUnion, MPI2_POINTER pMpi2ConfigPageHeaderUnion; + +/* Extended Config Page Header */ +typedef struct _MPI2_CONFIG_EXTENDED_PAGE_HEADER +{ + U8 PageVersion; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 PageNumber; /* 0x02 */ + U8 PageType; /* 0x03 */ + U16 ExtPageLength; /* 0x04 */ + U8 ExtPageType; /* 0x06 */ + U8 Reserved2; /* 0x07 */ +} MPI2_CONFIG_EXTENDED_PAGE_HEADER, + MPI2_POINTER PTR_MPI2_CONFIG_EXTENDED_PAGE_HEADER, + Mpi2ConfigExtendedPageHeader_t, MPI2_POINTER pMpi2ConfigExtendedPageHeader_t; + +typedef union _MPI2_CONFIG_EXT_PAGE_HEADER_UNION +{ + MPI2_CONFIG_PAGE_HEADER Struct; + MPI2_CONFIG_EXTENDED_PAGE_HEADER Ext; + U8 Bytes[8]; + U16 Word16[4]; + U32 Word32[2]; +} MPI2_CONFIG_EXT_PAGE_HEADER_UNION, MPI2_POINTER PTR_MPI2_CONFIG_EXT_PAGE_HEADER_UNION, + Mpi2ConfigPageExtendedHeaderUnion, MPI2_POINTER pMpi2ConfigPageExtendedHeaderUnion; + + +/* PageType field values */ +#define MPI2_CONFIG_PAGEATTR_READ_ONLY (0x00) +#define MPI2_CONFIG_PAGEATTR_CHANGEABLE (0x10) +#define MPI2_CONFIG_PAGEATTR_PERSISTENT (0x20) +#define MPI2_CONFIG_PAGEATTR_MASK (0xF0) + +#define MPI2_CONFIG_PAGETYPE_IO_UNIT (0x00) +#define MPI2_CONFIG_PAGETYPE_IOC (0x01) +#define MPI2_CONFIG_PAGETYPE_BIOS (0x02) +#define MPI2_CONFIG_PAGETYPE_RAID_VOLUME (0x08) +#define MPI2_CONFIG_PAGETYPE_MANUFACTURING (0x09) +#define MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK (0x0A) +#define MPI2_CONFIG_PAGETYPE_EXTENDED (0x0F) +#define MPI2_CONFIG_PAGETYPE_MASK (0x0F) + +#define MPI2_CONFIG_TYPENUM_MASK (0x0FFF) + + +/* ExtPageType field values */ +#define MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT (0x10) +#define MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER (0x11) +#define MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE (0x12) +#define MPI2_CONFIG_EXTPAGETYPE_SAS_PHY (0x13) +#define MPI2_CONFIG_EXTPAGETYPE_LOG (0x14) +#define MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE (0x15) +#define MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG (0x16) +#define MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING (0x17) +#define MPI2_CONFIG_EXTPAGETYPE_SAS_PORT (0x18) +#define MPI2_CONFIG_EXTPAGETYPE_ETHERNET (0x19) +#define MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING (0x1A) + + +/***************************************************************************** +* PageAddress defines +*****************************************************************************/ + +/* RAID Volume PageAddress format */ +#define MPI2_RAID_VOLUME_PGAD_FORM_MASK (0xF0000000) +#define MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) +#define MPI2_RAID_VOLUME_PGAD_FORM_HANDLE (0x10000000) + +#define MPI2_RAID_VOLUME_PGAD_HANDLE_MASK (0x0000FFFF) + + +/* RAID Physical Disk PageAddress format */ +#define MPI2_PHYSDISK_PGAD_FORM_MASK (0xF0000000) +#define MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM (0x00000000) +#define MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM (0x10000000) +#define MPI2_PHYSDISK_PGAD_FORM_DEVHANDLE (0x20000000) + +#define MPI2_PHYSDISK_PGAD_PHYSDISKNUM_MASK (0x000000FF) +#define MPI2_PHYSDISK_PGAD_DEVHANDLE_MASK (0x0000FFFF) + + +/* SAS Expander PageAddress format */ +#define MPI2_SAS_EXPAND_PGAD_FORM_MASK (0xF0000000) +#define MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL (0x00000000) +#define MPI2_SAS_EXPAND_PGAD_FORM_HNDL_PHY_NUM (0x10000000) +#define MPI2_SAS_EXPAND_PGAD_FORM_HNDL (0x20000000) + +#define MPI2_SAS_EXPAND_PGAD_HANDLE_MASK (0x0000FFFF) +#define MPI2_SAS_EXPAND_PGAD_PHYNUM_MASK (0x00FF0000) +#define MPI2_SAS_EXPAND_PGAD_PHYNUM_SHIFT (16) + + +/* SAS Device PageAddress format */ +#define MPI2_SAS_DEVICE_PGAD_FORM_MASK (0xF0000000) +#define MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) +#define MPI2_SAS_DEVICE_PGAD_FORM_HANDLE (0x20000000) + +#define MPI2_SAS_DEVICE_PGAD_HANDLE_MASK (0x0000FFFF) + + +/* SAS PHY PageAddress format */ +#define MPI2_SAS_PHY_PGAD_FORM_MASK (0xF0000000) +#define MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER (0x00000000) +#define MPI2_SAS_PHY_PGAD_FORM_PHY_TBL_INDEX (0x10000000) + +#define MPI2_SAS_PHY_PGAD_PHY_NUMBER_MASK (0x000000FF) +#define MPI2_SAS_PHY_PGAD_PHY_TBL_INDEX_MASK (0x0000FFFF) + + +/* SAS Port PageAddress format */ +#define MPI2_SASPORT_PGAD_FORM_MASK (0xF0000000) +#define MPI2_SASPORT_PGAD_FORM_GET_NEXT_PORT (0x00000000) +#define MPI2_SASPORT_PGAD_FORM_PORT_NUM (0x10000000) + +#define MPI2_SASPORT_PGAD_PORTNUMBER_MASK (0x00000FFF) + + +/* SAS Enclosure PageAddress format */ +#define MPI2_SAS_ENCLOS_PGAD_FORM_MASK (0xF0000000) +#define MPI2_SAS_ENCLOS_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) +#define MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE (0x10000000) + +#define MPI2_SAS_ENCLOS_PGAD_HANDLE_MASK (0x0000FFFF) + + +/* RAID Configuration PageAddress format */ +#define MPI2_RAID_PGAD_FORM_MASK (0xF0000000) +#define MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM (0x00000000) +#define MPI2_RAID_PGAD_FORM_CONFIGNUM (0x10000000) +#define MPI2_RAID_PGAD_FORM_ACTIVE_CONFIG (0x20000000) + +#define MPI2_RAID_PGAD_CONFIGNUM_MASK (0x000000FF) + + +/* Driver Persistent Mapping PageAddress format */ +#define MPI2_DPM_PGAD_FORM_MASK (0xF0000000) +#define MPI2_DPM_PGAD_FORM_ENTRY_RANGE (0x00000000) + +#define MPI2_DPM_PGAD_ENTRY_COUNT_MASK (0x0FFF0000) +#define MPI2_DPM_PGAD_ENTRY_COUNT_SHIFT (16) +#define MPI2_DPM_PGAD_START_ENTRY_MASK (0x0000FFFF) + + +/* Ethernet PageAddress format */ +#define MPI2_ETHERNET_PGAD_FORM_MASK (0xF0000000) +#define MPI2_ETHERNET_PGAD_FORM_IF_NUM (0x00000000) + +#define MPI2_ETHERNET_PGAD_IF_NUMBER_MASK (0x000000FF) + + + +/**************************************************************************** +* Configuration messages +****************************************************************************/ + +/* Configuration Request Message */ +typedef struct _MPI2_CONFIG_REQUEST +{ + U8 Action; /* 0x00 */ + U8 SGLFlags; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 ExtPageLength; /* 0x04 */ + U8 ExtPageType; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U8 Reserved2; /* 0x0C */ + U8 ProxyVF_ID; /* 0x0D */ + U16 Reserved4; /* 0x0E */ + U32 Reserved3; /* 0x10 */ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x14 */ + U32 PageAddress; /* 0x18 */ + MPI2_SGE_IO_UNION PageBufferSGE; /* 0x1C */ +} MPI2_CONFIG_REQUEST, MPI2_POINTER PTR_MPI2_CONFIG_REQUEST, + Mpi2ConfigRequest_t, MPI2_POINTER pMpi2ConfigRequest_t; + +/* values for the Action field */ +#define MPI2_CONFIG_ACTION_PAGE_HEADER (0x00) +#define MPI2_CONFIG_ACTION_PAGE_READ_CURRENT (0x01) +#define MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT (0x02) +#define MPI2_CONFIG_ACTION_PAGE_DEFAULT (0x03) +#define MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM (0x04) +#define MPI2_CONFIG_ACTION_PAGE_READ_DEFAULT (0x05) +#define MPI2_CONFIG_ACTION_PAGE_READ_NVRAM (0x06) +#define MPI2_CONFIG_ACTION_PAGE_GET_CHANGEABLE (0x07) + +/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */ + + +/* Config Reply Message */ +typedef struct _MPI2_CONFIG_REPLY +{ + U8 Action; /* 0x00 */ + U8 SGLFlags; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 ExtPageLength; /* 0x04 */ + U8 ExtPageType; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U16 Reserved2; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x14 */ +} MPI2_CONFIG_REPLY, MPI2_POINTER PTR_MPI2_CONFIG_REPLY, + Mpi2ConfigReply_t, MPI2_POINTER pMpi2ConfigReply_t; + + + +/***************************************************************************** +* +* C o n f i g u r a t i o n P a g e s +* +*****************************************************************************/ + +/**************************************************************************** +* Manufacturing Config pages +****************************************************************************/ + +#define MPI2_MFGPAGE_VENDORID_LSI (0x1000) + +/* MPI v2.0 SAS products */ +#define MPI2_MFGPAGE_DEVID_SAS2004 (0x0070) +#define MPI2_MFGPAGE_DEVID_SAS2008 (0x0072) +#define MPI2_MFGPAGE_DEVID_SAS2108_1 (0x0074) +#define MPI2_MFGPAGE_DEVID_SAS2108_2 (0x0076) +#define MPI2_MFGPAGE_DEVID_SAS2108_3 (0x0077) +#define MPI2_MFGPAGE_DEVID_SAS2116_1 (0x0064) +#define MPI2_MFGPAGE_DEVID_SAS2116_2 (0x0065) + +#define MPI2_MFGPAGE_DEVID_SSS6200 (0x007E) + +#define MPI2_MFGPAGE_DEVID_SAS2208_1 (0x0080) +#define MPI2_MFGPAGE_DEVID_SAS2208_2 (0x0081) +#define MPI2_MFGPAGE_DEVID_SAS2208_3 (0x0082) +#define MPI2_MFGPAGE_DEVID_SAS2208_4 (0x0083) +#define MPI2_MFGPAGE_DEVID_SAS2208_5 (0x0084) +#define MPI2_MFGPAGE_DEVID_SAS2208_6 (0x0085) +#define MPI2_MFGPAGE_DEVID_SAS2308_1 (0x0086) +#define MPI2_MFGPAGE_DEVID_SAS2308_2 (0x0087) +#define MPI2_MFGPAGE_DEVID_SAS2308_3 (0x006E) + +/* MPI v2.5 SAS products */ +#define MPI25_MFGPAGE_DEVID_SAS3004 (0x0096) +#define MPI25_MFGPAGE_DEVID_SAS3008 (0x0097) +#define MPI25_MFGPAGE_DEVID_SAS3108_1 (0x0090) +#define MPI25_MFGPAGE_DEVID_SAS3108_2 (0x0091) +#define MPI25_MFGPAGE_DEVID_SAS3108_5 (0x0094) +#define MPI25_MFGPAGE_DEVID_SAS3108_6 (0x0095) + + + + +/* Manufacturing Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_MAN_0 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 ChipName[16]; /* 0x04 */ + U8 ChipRevision[8]; /* 0x14 */ + U8 BoardName[16]; /* 0x1C */ + U8 BoardAssembly[16]; /* 0x2C */ + U8 BoardTracerNumber[16]; /* 0x3C */ +} MPI2_CONFIG_PAGE_MAN_0, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_0, + Mpi2ManufacturingPage0_t, MPI2_POINTER pMpi2ManufacturingPage0_t; + +#define MPI2_MANUFACTURING0_PAGEVERSION (0x00) + + +/* Manufacturing Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_MAN_1 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 VPD[256]; /* 0x04 */ +} MPI2_CONFIG_PAGE_MAN_1, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_1, + Mpi2ManufacturingPage1_t, MPI2_POINTER pMpi2ManufacturingPage1_t; + +#define MPI2_MANUFACTURING1_PAGEVERSION (0x00) + + +typedef struct _MPI2_CHIP_REVISION_ID +{ + U16 DeviceID; /* 0x00 */ + U8 PCIRevisionID; /* 0x02 */ + U8 Reserved; /* 0x03 */ +} MPI2_CHIP_REVISION_ID, MPI2_POINTER PTR_MPI2_CHIP_REVISION_ID, + Mpi2ChipRevisionId_t, MPI2_POINTER pMpi2ChipRevisionId_t; + + +/* Manufacturing Page 2 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS +#define MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_MAN_2 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + MPI2_CHIP_REVISION_ID ChipId; /* 0x04 */ + U32 HwSettings[MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS];/* 0x08 */ +} MPI2_CONFIG_PAGE_MAN_2, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_2, + Mpi2ManufacturingPage2_t, MPI2_POINTER pMpi2ManufacturingPage2_t; + +#define MPI2_MANUFACTURING2_PAGEVERSION (0x00) + + +/* Manufacturing Page 3 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI2_MAN_PAGE_3_INFO_WORDS +#define MPI2_MAN_PAGE_3_INFO_WORDS (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_MAN_3 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + MPI2_CHIP_REVISION_ID ChipId; /* 0x04 */ + U32 Info[MPI2_MAN_PAGE_3_INFO_WORDS];/* 0x08 */ +} MPI2_CONFIG_PAGE_MAN_3, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_3, + Mpi2ManufacturingPage3_t, MPI2_POINTER pMpi2ManufacturingPage3_t; + +#define MPI2_MANUFACTURING3_PAGEVERSION (0x00) + + +/* Manufacturing Page 4 */ + +typedef struct _MPI2_MANPAGE4_PWR_SAVE_SETTINGS +{ + U8 PowerSaveFlags; /* 0x00 */ + U8 InternalOperationsSleepTime; /* 0x01 */ + U8 InternalOperationsRunTime; /* 0x02 */ + U8 HostIdleTime; /* 0x03 */ +} MPI2_MANPAGE4_PWR_SAVE_SETTINGS, + MPI2_POINTER PTR_MPI2_MANPAGE4_PWR_SAVE_SETTINGS, + Mpi2ManPage4PwrSaveSettings_t, MPI2_POINTER pMpi2ManPage4PwrSaveSettings_t; + +/* defines for the PowerSaveFlags field */ +#define MPI2_MANPAGE4_MASK_POWERSAVE_MODE (0x03) +#define MPI2_MANPAGE4_POWERSAVE_MODE_DISABLED (0x00) +#define MPI2_MANPAGE4_CUSTOM_POWERSAVE_MODE (0x01) +#define MPI2_MANPAGE4_FULL_POWERSAVE_MODE (0x02) + +typedef struct _MPI2_CONFIG_PAGE_MAN_4 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Flags; /* 0x08 */ + U8 InquirySize; /* 0x0C */ + U8 Reserved2; /* 0x0D */ + U16 Reserved3; /* 0x0E */ + U8 InquiryData[56]; /* 0x10 */ + U32 RAID0VolumeSettings; /* 0x48 */ + U32 RAID1EVolumeSettings; /* 0x4C */ + U32 RAID1VolumeSettings; /* 0x50 */ + U32 RAID10VolumeSettings; /* 0x54 */ + U32 Reserved4; /* 0x58 */ + U32 Reserved5; /* 0x5C */ + MPI2_MANPAGE4_PWR_SAVE_SETTINGS PowerSaveSettings; /* 0x60 */ + U8 MaxOCEDisks; /* 0x64 */ + U8 ResyncRate; /* 0x65 */ + U16 DataScrubDuration; /* 0x66 */ + U8 MaxHotSpares; /* 0x68 */ + U8 MaxPhysDisksPerVol; /* 0x69 */ + U8 MaxPhysDisks; /* 0x6A */ + U8 MaxVolumes; /* 0x6B */ +} MPI2_CONFIG_PAGE_MAN_4, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_4, + Mpi2ManufacturingPage4_t, MPI2_POINTER pMpi2ManufacturingPage4_t; + +#define MPI2_MANUFACTURING4_PAGEVERSION (0x0A) + +/* Manufacturing Page 4 Flags field */ +#define MPI2_MANPAGE4_METADATA_SIZE_MASK (0x00030000) +#define MPI2_MANPAGE4_METADATA_512MB (0x00000000) + +#define MPI2_MANPAGE4_MIX_SSD_SAS_SATA (0x00008000) +#define MPI2_MANPAGE4_MIX_SSD_AND_NON_SSD (0x00004000) +#define MPI2_MANPAGE4_HIDE_PHYSDISK_NON_IR (0x00002000) + +#define MPI2_MANPAGE4_MASK_PHYSDISK_COERCION (0x00001C00) +#define MPI2_MANPAGE4_PHYSDISK_COERCION_1GB (0x00000000) +#define MPI2_MANPAGE4_PHYSDISK_128MB_COERCION (0x00000400) +#define MPI2_MANPAGE4_PHYSDISK_ADAPTIVE_COERCION (0x00000800) +#define MPI2_MANPAGE4_PHYSDISK_ZERO_COERCION (0x00000C00) + +#define MPI2_MANPAGE4_MASK_BAD_BLOCK_MARKING (0x00000300) +#define MPI2_MANPAGE4_DEFAULT_BAD_BLOCK_MARKING (0x00000000) +#define MPI2_MANPAGE4_TABLE_BAD_BLOCK_MARKING (0x00000100) +#define MPI2_MANPAGE4_WRITE_LONG_BAD_BLOCK_MARKING (0x00000200) + +#define MPI2_MANPAGE4_FORCE_OFFLINE_FAILOVER (0x00000080) +#define MPI2_MANPAGE4_RAID10_DISABLE (0x00000040) +#define MPI2_MANPAGE4_RAID1E_DISABLE (0x00000020) +#define MPI2_MANPAGE4_RAID1_DISABLE (0x00000010) +#define MPI2_MANPAGE4_RAID0_DISABLE (0x00000008) +#define MPI2_MANPAGE4_IR_MODEPAGE8_DISABLE (0x00000004) +#define MPI2_MANPAGE4_IM_RESYNC_CACHE_ENABLE (0x00000002) +#define MPI2_MANPAGE4_IR_NO_MIX_SAS_SATA (0x00000001) + + +/* Manufacturing Page 5 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_MAN_PAGE_5_PHY_ENTRIES +#define MPI2_MAN_PAGE_5_PHY_ENTRIES (1) +#endif + +typedef struct _MPI2_MANUFACTURING5_ENTRY +{ + U64 WWID; /* 0x00 */ + U64 DeviceName; /* 0x08 */ +} MPI2_MANUFACTURING5_ENTRY, MPI2_POINTER PTR_MPI2_MANUFACTURING5_ENTRY, + Mpi2Manufacturing5Entry_t, MPI2_POINTER pMpi2Manufacturing5Entry_t; + +typedef struct _MPI2_CONFIG_PAGE_MAN_5 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 NumPhys; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + U32 Reserved3; /* 0x08 */ + U32 Reserved4; /* 0x0C */ + MPI2_MANUFACTURING5_ENTRY Phy[MPI2_MAN_PAGE_5_PHY_ENTRIES];/* 0x08 */ +} MPI2_CONFIG_PAGE_MAN_5, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_5, + Mpi2ManufacturingPage5_t, MPI2_POINTER pMpi2ManufacturingPage5_t; + +#define MPI2_MANUFACTURING5_PAGEVERSION (0x03) + + +/* Manufacturing Page 6 */ + +typedef struct _MPI2_CONFIG_PAGE_MAN_6 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 ProductSpecificInfo;/* 0x04 */ +} MPI2_CONFIG_PAGE_MAN_6, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_6, + Mpi2ManufacturingPage6_t, MPI2_POINTER pMpi2ManufacturingPage6_t; + +#define MPI2_MANUFACTURING6_PAGEVERSION (0x00) + + +/* Manufacturing Page 7 */ + +typedef struct _MPI2_MANPAGE7_CONNECTOR_INFO +{ + U32 Pinout; /* 0x00 */ + U8 Connector[16]; /* 0x04 */ + U8 Location; /* 0x14 */ + U8 ReceptacleID; /* 0x15 */ + U16 Slot; /* 0x16 */ + U32 Reserved2; /* 0x18 */ +} MPI2_MANPAGE7_CONNECTOR_INFO, MPI2_POINTER PTR_MPI2_MANPAGE7_CONNECTOR_INFO, + Mpi2ManPage7ConnectorInfo_t, MPI2_POINTER pMpi2ManPage7ConnectorInfo_t; + +/* defines for the Pinout field */ +#define MPI2_MANPAGE7_PINOUT_LANE_MASK (0x0000FF00) +#define MPI2_MANPAGE7_PINOUT_LANE_SHIFT (8) + +#define MPI2_MANPAGE7_PINOUT_TYPE_MASK (0x000000FF) +#define MPI2_MANPAGE7_PINOUT_TYPE_UNKNOWN (0x00) +#define MPI2_MANPAGE7_PINOUT_SATA_SINGLE (0x01) +#define MPI2_MANPAGE7_PINOUT_SFF_8482 (0x02) +#define MPI2_MANPAGE7_PINOUT_SFF_8486 (0x03) +#define MPI2_MANPAGE7_PINOUT_SFF_8484 (0x04) +#define MPI2_MANPAGE7_PINOUT_SFF_8087 (0x05) +#define MPI2_MANPAGE7_PINOUT_SFF_8643_4I (0x06) +#define MPI2_MANPAGE7_PINOUT_SFF_8643_8I (0x07) +#define MPI2_MANPAGE7_PINOUT_SFF_8470 (0x08) +#define MPI2_MANPAGE7_PINOUT_SFF_8088 (0x09) +#define MPI2_MANPAGE7_PINOUT_SFF_8644_4X (0x0A) +#define MPI2_MANPAGE7_PINOUT_SFF_8644_8X (0x0B) +#define MPI2_MANPAGE7_PINOUT_SFF_8644_16X (0x0C) +#define MPI2_MANPAGE7_PINOUT_SFF_8436 (0x0D) + +/* defines for the Location field */ +#define MPI2_MANPAGE7_LOCATION_UNKNOWN (0x01) +#define MPI2_MANPAGE7_LOCATION_INTERNAL (0x02) +#define MPI2_MANPAGE7_LOCATION_EXTERNAL (0x04) +#define MPI2_MANPAGE7_LOCATION_SWITCHABLE (0x08) +#define MPI2_MANPAGE7_LOCATION_AUTO (0x10) +#define MPI2_MANPAGE7_LOCATION_NOT_PRESENT (0x20) +#define MPI2_MANPAGE7_LOCATION_NOT_CONNECTED (0x80) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_MANPAGE7_CONNECTOR_INFO_MAX +#define MPI2_MANPAGE7_CONNECTOR_INFO_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_MAN_7 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Reserved2; /* 0x08 */ + U32 Flags; /* 0x0C */ + U8 EnclosureName[16]; /* 0x10 */ + U8 NumPhys; /* 0x20 */ + U8 Reserved3; /* 0x21 */ + U16 Reserved4; /* 0x22 */ + MPI2_MANPAGE7_CONNECTOR_INFO ConnectorInfo[MPI2_MANPAGE7_CONNECTOR_INFO_MAX]; /* 0x24 */ +} MPI2_CONFIG_PAGE_MAN_7, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_7, + Mpi2ManufacturingPage7_t, MPI2_POINTER pMpi2ManufacturingPage7_t; + +#define MPI2_MANUFACTURING7_PAGEVERSION (0x01) + +/* defines for the Flags field */ +#define MPI2_MANPAGE7_FLAG_USE_SLOT_INFO (0x00000001) + + +/* + * Generic structure to use for product-specific manufacturing pages + * (currently Manufacturing Page 8 through Manufacturing Page 31). + */ + +typedef struct _MPI2_CONFIG_PAGE_MAN_PS +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 ProductSpecificInfo;/* 0x04 */ +} MPI2_CONFIG_PAGE_MAN_PS, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_PS, + Mpi2ManufacturingPagePS_t, MPI2_POINTER pMpi2ManufacturingPagePS_t; + +#define MPI2_MANUFACTURING8_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING9_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING10_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING11_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING12_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING13_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING14_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING15_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING16_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING17_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING18_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING19_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING20_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING21_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING22_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING23_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING24_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING25_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING26_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING27_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING28_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING29_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING30_PAGEVERSION (0x00) +#define MPI2_MANUFACTURING31_PAGEVERSION (0x00) + + +/**************************************************************************** +* IO Unit Config Pages +****************************************************************************/ + +/* IO Unit Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_0 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U64 UniqueValue; /* 0x04 */ + MPI2_VERSION_UNION NvdataVersionDefault; /* 0x08 */ + MPI2_VERSION_UNION NvdataVersionPersistent; /* 0x0A */ +} MPI2_CONFIG_PAGE_IO_UNIT_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_0, + Mpi2IOUnitPage0_t, MPI2_POINTER pMpi2IOUnitPage0_t; + +#define MPI2_IOUNITPAGE0_PAGEVERSION (0x02) + + +/* IO Unit Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_1 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Flags; /* 0x04 */ +} MPI2_CONFIG_PAGE_IO_UNIT_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_1, + Mpi2IOUnitPage1_t, MPI2_POINTER pMpi2IOUnitPage1_t; + +#define MPI2_IOUNITPAGE1_PAGEVERSION (0x04) + +/* IO Unit Page 1 Flags defines */ +#define MPI25_IOUNITPAGE1_NEW_DEVICE_FAST_PATH_DISABLE (0x00002000) +#define MPI25_IOUNITPAGE1_DISABLE_FAST_PATH (0x00001000) +#define MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY (0x00000800) +#define MPI2_IOUNITPAGE1_MASK_SATA_WRITE_CACHE (0x00000600) +#define MPI2_IOUNITPAGE1_SATA_WRITE_CACHE_SHIFT (9) +#define MPI2_IOUNITPAGE1_ENABLE_SATA_WRITE_CACHE (0x00000000) +#define MPI2_IOUNITPAGE1_DISABLE_SATA_WRITE_CACHE (0x00000200) +#define MPI2_IOUNITPAGE1_UNCHANGED_SATA_WRITE_CACHE (0x00000400) +#define MPI2_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE (0x00000100) +#define MPI2_IOUNITPAGE1_DISABLE_IR (0x00000040) +#define MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING (0x00000020) +#define MPI2_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID (0x00000004) + + +/* IO Unit Page 3 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for GPIOCount at runtime. + */ +#ifndef MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX +#define MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_3 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 GPIOCount; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + U16 GPIOVal[MPI2_IO_UNIT_PAGE_3_GPIO_VAL_MAX];/* 0x08 */ +} MPI2_CONFIG_PAGE_IO_UNIT_3, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_3, + Mpi2IOUnitPage3_t, MPI2_POINTER pMpi2IOUnitPage3_t; + +#define MPI2_IOUNITPAGE3_PAGEVERSION (0x01) + +/* defines for IO Unit Page 3 GPIOVal field */ +#define MPI2_IOUNITPAGE3_GPIO_FUNCTION_MASK (0xFFFC) +#define MPI2_IOUNITPAGE3_GPIO_FUNCTION_SHIFT (2) +#define MPI2_IOUNITPAGE3_GPIO_SETTING_OFF (0x0000) +#define MPI2_IOUNITPAGE3_GPIO_SETTING_ON (0x0001) + + +/* IO Unit Page 5 */ + +/* + * Upper layer code (drivers, utilities, etc.) should leave this define set to + * one and check the value returned for NumDmaEngines at runtime. + */ +#ifndef MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES +#define MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_5 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U64 RaidAcceleratorBufferBaseAddress; /* 0x04 */ + U64 RaidAcceleratorBufferSize; /* 0x0C */ + U64 RaidAcceleratorControlBaseAddress; /* 0x14 */ + U8 RAControlSize; /* 0x1C */ + U8 NumDmaEngines; /* 0x1D */ + U8 RAMinControlSize; /* 0x1E */ + U8 RAMaxControlSize; /* 0x1F */ + U32 Reserved1; /* 0x20 */ + U32 Reserved2; /* 0x24 */ + U32 Reserved3; /* 0x28 */ + U32 DmaEngineCapabilities[MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES]; /* 0x2C */ +} MPI2_CONFIG_PAGE_IO_UNIT_5, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_5, + Mpi2IOUnitPage5_t, MPI2_POINTER pMpi2IOUnitPage5_t; + +#define MPI2_IOUNITPAGE5_PAGEVERSION (0x00) + +/* defines for IO Unit Page 5 DmaEngineCapabilities field */ +#define MPI2_IOUNITPAGE5_DMA_CAP_MASK_MAX_REQUESTS (0xFF00) +#define MPI2_IOUNITPAGE5_DMA_CAP_SHIFT_MAX_REQUESTS (16) + +#define MPI2_IOUNITPAGE5_DMA_CAP_EEDP (0x0008) +#define MPI2_IOUNITPAGE5_DMA_CAP_PARITY_GENERATION (0x0004) +#define MPI2_IOUNITPAGE5_DMA_CAP_HASHING (0x0002) +#define MPI2_IOUNITPAGE5_DMA_CAP_ENCRYPTION (0x0001) + + +/* IO Unit Page 6 */ + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_6 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U16 Flags; /* 0x04 */ + U8 RAHostControlSize; /* 0x06 */ + U8 Reserved0; /* 0x07 */ + U64 RaidAcceleratorHostControlBaseAddress; /* 0x08 */ + U32 Reserved1; /* 0x10 */ + U32 Reserved2; /* 0x14 */ + U32 Reserved3; /* 0x18 */ +} MPI2_CONFIG_PAGE_IO_UNIT_6, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_6, + Mpi2IOUnitPage6_t, MPI2_POINTER pMpi2IOUnitPage6_t; + +#define MPI2_IOUNITPAGE6_PAGEVERSION (0x00) + +/* defines for IO Unit Page 6 Flags field */ +#define MPI2_IOUNITPAGE6_FLAGS_ENABLE_RAID_ACCELERATOR (0x0001) + + +/* IO Unit Page 7 */ + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_7 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 CurrentPowerMode; /* 0x04 */ /* reserved in MPI 2.0 */ + U8 PreviousPowerMode; /* 0x05 */ /* reserved in MPI 2.0 */ + U8 PCIeWidth; /* 0x06 */ + U8 PCIeSpeed; /* 0x07 */ + U32 ProcessorState; /* 0x08 */ + U32 PowerManagementCapabilities; /* 0x0C */ + U16 IOCTemperature; /* 0x10 */ + U8 IOCTemperatureUnits; /* 0x12 */ + U8 IOCSpeed; /* 0x13 */ + U16 BoardTemperature; /* 0x14 */ + U8 BoardTemperatureUnits; /* 0x16 */ + U8 Reserved3; /* 0x17 */ +} MPI2_CONFIG_PAGE_IO_UNIT_7, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_7, + Mpi2IOUnitPage7_t, MPI2_POINTER pMpi2IOUnitPage7_t; + +#define MPI2_IOUNITPAGE7_PAGEVERSION (0x02) + +/* defines for IO Unit Page 7 CurrentPowerMode and PreviousPowerMode fields */ +#define MPI25_IOUNITPAGE7_PM_INIT_MASK (0xC0) +#define MPI25_IOUNITPAGE7_PM_INIT_UNAVAILABLE (0x00) +#define MPI25_IOUNITPAGE7_PM_INIT_HOST (0x40) +#define MPI25_IOUNITPAGE7_PM_INIT_IO_UNIT (0x80) +#define MPI25_IOUNITPAGE7_PM_INIT_PCIE_DPA (0xC0) + +#define MPI25_IOUNITPAGE7_PM_MODE_MASK (0x07) +#define MPI25_IOUNITPAGE7_PM_MODE_UNAVAILABLE (0x00) +#define MPI25_IOUNITPAGE7_PM_MODE_UNKNOWN (0x01) +#define MPI25_IOUNITPAGE7_PM_MODE_FULL_POWER (0x04) +#define MPI25_IOUNITPAGE7_PM_MODE_REDUCED_POWER (0x05) +#define MPI25_IOUNITPAGE7_PM_MODE_STANDBY (0x06) + + +/* defines for IO Unit Page 7 PCIeWidth field */ +#define MPI2_IOUNITPAGE7_PCIE_WIDTH_X1 (0x01) +#define MPI2_IOUNITPAGE7_PCIE_WIDTH_X2 (0x02) +#define MPI2_IOUNITPAGE7_PCIE_WIDTH_X4 (0x04) +#define MPI2_IOUNITPAGE7_PCIE_WIDTH_X8 (0x08) + +/* defines for IO Unit Page 7 PCIeSpeed field */ +#define MPI2_IOUNITPAGE7_PCIE_SPEED_2_5_GBPS (0x00) +#define MPI2_IOUNITPAGE7_PCIE_SPEED_5_0_GBPS (0x01) +#define MPI2_IOUNITPAGE7_PCIE_SPEED_8_0_GBPS (0x02) + +/* defines for IO Unit Page 7 ProcessorState field */ +#define MPI2_IOUNITPAGE7_PSTATE_MASK_SECOND (0x0000000F) +#define MPI2_IOUNITPAGE7_PSTATE_SHIFT_SECOND (0) + +#define MPI2_IOUNITPAGE7_PSTATE_NOT_PRESENT (0x00) +#define MPI2_IOUNITPAGE7_PSTATE_DISABLED (0x01) +#define MPI2_IOUNITPAGE7_PSTATE_ENABLED (0x02) + +/* defines for IO Unit Page 7 PowerManagementCapabilities field */ +#define MPI25_IOUNITPAGE7_PMCAP_DPA_FULL_PWR_MODE (0x00400000) +#define MPI25_IOUNITPAGE7_PMCAP_DPA_REDUCED_PWR_MODE (0x00200000) +#define MPI25_IOUNITPAGE7_PMCAP_DPA_STANDBY_MODE (0x00100000) +#define MPI25_IOUNITPAGE7_PMCAP_HOST_FULL_PWR_MODE (0x00040000) +#define MPI25_IOUNITPAGE7_PMCAP_HOST_REDUCED_PWR_MODE (0x00020000) +#define MPI25_IOUNITPAGE7_PMCAP_HOST_STANDBY_MODE (0x00010000) +#define MPI25_IOUNITPAGE7_PMCAP_IO_FULL_PWR_MODE (0x00004000) +#define MPI25_IOUNITPAGE7_PMCAP_IO_REDUCED_PWR_MODE (0x00002000) +#define MPI25_IOUNITPAGE7_PMCAP_IO_STANDBY_MODE (0x00001000) +#define MPI2_IOUNITPAGE7_PMCAP_HOST_12_5_PCT_IOCSPEED (0x00000400) +#define MPI2_IOUNITPAGE7_PMCAP_HOST_25_0_PCT_IOCSPEED (0x00000200) +#define MPI2_IOUNITPAGE7_PMCAP_HOST_50_0_PCT_IOCSPEED (0x00000100) +#define MPI25_IOUNITPAGE7_PMCAP_IO_12_5_PCT_IOCSPEED (0x00000040) +#define MPI25_IOUNITPAGE7_PMCAP_IO_25_0_PCT_IOCSPEED (0x00000020) +#define MPI25_IOUNITPAGE7_PMCAP_IO_50_0_PCT_IOCSPEED (0x00000010) +#define MPI2_IOUNITPAGE7_PMCAP_HOST_WIDTH_CHANGE_PCIE (0x00000008) +#define MPI2_IOUNITPAGE7_PMCAP_HOST_SPEED_CHANGE_PCIE (0x00000004) +#define MPI25_IOUNITPAGE7_PMCAP_IO_WIDTH_CHANGE_PCIE (0x00000002) +#define MPI25_IOUNITPAGE7_PMCAP_IO_SPEED_CHANGE_PCIE (0x00000001) + +/* obsolete names for the PowerManagementCapabilities bits (above) */ +#define MPI2_IOUNITPAGE7_PMCAP_12_5_PCT_IOCSPEED (0x00000400) +#define MPI2_IOUNITPAGE7_PMCAP_25_0_PCT_IOCSPEED (0x00000200) +#define MPI2_IOUNITPAGE7_PMCAP_50_0_PCT_IOCSPEED (0x00000100) +#define MPI2_IOUNITPAGE7_PMCAP_PCIE_WIDTH_CHANGE (0x00000008) +#define MPI2_IOUNITPAGE7_PMCAP_PCIE_SPEED_CHANGE (0x00000004) + + +/* defines for IO Unit Page 7 IOCTemperatureUnits field */ +#define MPI2_IOUNITPAGE7_IOC_TEMP_NOT_PRESENT (0x00) +#define MPI2_IOUNITPAGE7_IOC_TEMP_FAHRENHEIT (0x01) +#define MPI2_IOUNITPAGE7_IOC_TEMP_CELSIUS (0x02) + +/* defines for IO Unit Page 7 IOCSpeed field */ +#define MPI2_IOUNITPAGE7_IOC_SPEED_FULL (0x01) +#define MPI2_IOUNITPAGE7_IOC_SPEED_HALF (0x02) +#define MPI2_IOUNITPAGE7_IOC_SPEED_QUARTER (0x04) +#define MPI2_IOUNITPAGE7_IOC_SPEED_EIGHTH (0x08) + +/* defines for IO Unit Page 7 BoardTemperatureUnits field */ +#define MPI2_IOUNITPAGE7_BOARD_TEMP_NOT_PRESENT (0x00) +#define MPI2_IOUNITPAGE7_BOARD_TEMP_FAHRENHEIT (0x01) +#define MPI2_IOUNITPAGE7_BOARD_TEMP_CELSIUS (0x02) + + +/* IO Unit Page 8 */ + +#define MPI2_IOUNIT8_NUM_THRESHOLDS (4) + +typedef struct _MPI2_IOUNIT8_SENSOR +{ + U16 Flags; /* 0x00 */ + U16 Reserved1; /* 0x02 */ + U16 Threshold[MPI2_IOUNIT8_NUM_THRESHOLDS]; /* 0x04 */ + U32 Reserved2; /* 0x0C */ + U32 Reserved3; /* 0x10 */ + U32 Reserved4; /* 0x14 */ +} MPI2_IOUNIT8_SENSOR, MPI2_POINTER PTR_MPI2_IOUNIT8_SENSOR, + Mpi2IOUnit8Sensor_t, MPI2_POINTER pMpi2IOUnit8Sensor_t; + +/* defines for IO Unit Page 8 Sensor Flags field */ +#define MPI2_IOUNIT8_SENSOR_FLAGS_T3_ENABLE (0x0008) +#define MPI2_IOUNIT8_SENSOR_FLAGS_T2_ENABLE (0x0004) +#define MPI2_IOUNIT8_SENSOR_FLAGS_T1_ENABLE (0x0002) +#define MPI2_IOUNIT8_SENSOR_FLAGS_T0_ENABLE (0x0001) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumSensors at runtime. + */ +#ifndef MPI2_IOUNITPAGE8_SENSOR_ENTRIES +#define MPI2_IOUNITPAGE8_SENSOR_ENTRIES (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_8 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Reserved2; /* 0x08 */ + U8 NumSensors; /* 0x0C */ + U8 PollingInterval; /* 0x0D */ + U16 Reserved3; /* 0x0E */ + MPI2_IOUNIT8_SENSOR Sensor[MPI2_IOUNITPAGE8_SENSOR_ENTRIES];/* 0x10 */ +} MPI2_CONFIG_PAGE_IO_UNIT_8, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_8, + Mpi2IOUnitPage8_t, MPI2_POINTER pMpi2IOUnitPage8_t; + +#define MPI2_IOUNITPAGE8_PAGEVERSION (0x00) + + +/* IO Unit Page 9 */ + +typedef struct _MPI2_IOUNIT9_SENSOR +{ + U16 CurrentTemperature; /* 0x00 */ + U16 Reserved1; /* 0x02 */ + U8 Flags; /* 0x04 */ + U8 Reserved2; /* 0x05 */ + U16 Reserved3; /* 0x06 */ + U32 Reserved4; /* 0x08 */ + U32 Reserved5; /* 0x0C */ +} MPI2_IOUNIT9_SENSOR, MPI2_POINTER PTR_MPI2_IOUNIT9_SENSOR, + Mpi2IOUnit9Sensor_t, MPI2_POINTER pMpi2IOUnit9Sensor_t; + +/* defines for IO Unit Page 9 Sensor Flags field */ +#define MPI2_IOUNIT9_SENSOR_FLAGS_TEMP_VALID (0x01) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumSensors at runtime. + */ +#ifndef MPI2_IOUNITPAGE9_SENSOR_ENTRIES +#define MPI2_IOUNITPAGE9_SENSOR_ENTRIES (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_9 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Reserved2; /* 0x08 */ + U8 NumSensors; /* 0x0C */ + U8 Reserved4; /* 0x0D */ + U16 Reserved3; /* 0x0E */ + MPI2_IOUNIT9_SENSOR Sensor[MPI2_IOUNITPAGE9_SENSOR_ENTRIES];/* 0x10 */ +} MPI2_CONFIG_PAGE_IO_UNIT_9, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_9, + Mpi2IOUnitPage9_t, MPI2_POINTER pMpi2IOUnitPage9_t; + +#define MPI2_IOUNITPAGE9_PAGEVERSION (0x00) + + +/* IO Unit Page 10 */ + +typedef struct _MPI2_IOUNIT10_FUNCTION +{ + U8 CreditPercent; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ +} MPI2_IOUNIT10_FUNCTION, MPI2_POINTER PTR_MPI2_IOUNIT10_FUNCTION, + Mpi2IOUnit10Function_t, MPI2_POINTER pMpi2IOUnit10Function_t; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumFunctions at runtime. + */ +#ifndef MPI2_IOUNITPAGE10_FUNCTION_ENTRIES +#define MPI2_IOUNITPAGE10_FUNCTION_ENTRIES (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_10 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 NumSensors; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + U32 Reserved3; /* 0x08 */ + U16 Reserved4; /* 0x0C */ + MPI2_IOUNIT10_FUNCTION Function[MPI2_IOUNITPAGE10_FUNCTION_ENTRIES]; /* 0x10 */ +} MPI2_CONFIG_PAGE_IO_UNIT_10, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IO_UNIT_10, + Mpi2IOUnitPage10_t, MPI2_POINTER pMpi2IOUnitPage10_t; + +#define MPI2_IOUNITPAGE10_PAGEVERSION (0x00) + + + +/**************************************************************************** +* IOC Config Pages +****************************************************************************/ + +/* IOC Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_IOC_0 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Reserved2; /* 0x08 */ + U16 VendorID; /* 0x0C */ + U16 DeviceID; /* 0x0E */ + U8 RevisionID; /* 0x10 */ + U8 Reserved3; /* 0x11 */ + U16 Reserved4; /* 0x12 */ + U32 ClassCode; /* 0x14 */ + U16 SubsystemVendorID; /* 0x18 */ + U16 SubsystemID; /* 0x1A */ +} MPI2_CONFIG_PAGE_IOC_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_0, + Mpi2IOCPage0_t, MPI2_POINTER pMpi2IOCPage0_t; + +#define MPI2_IOCPAGE0_PAGEVERSION (0x02) + + +/* IOC Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_IOC_1 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Flags; /* 0x04 */ + U32 CoalescingTimeout; /* 0x08 */ + U8 CoalescingDepth; /* 0x0C */ + U8 PCISlotNum; /* 0x0D */ + U8 PCIBusNum; /* 0x0E */ + U8 PCIDomainSegment; /* 0x0F */ + U32 Reserved1; /* 0x10 */ + U32 Reserved2; /* 0x14 */ +} MPI2_CONFIG_PAGE_IOC_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_1, + Mpi2IOCPage1_t, MPI2_POINTER pMpi2IOCPage1_t; + +#define MPI2_IOCPAGE1_PAGEVERSION (0x05) + +/* defines for IOC Page 1 Flags field */ +#define MPI2_IOCPAGE1_REPLY_COALESCING (0x00000001) + +#define MPI2_IOCPAGE1_PCISLOTNUM_UNKNOWN (0xFF) +#define MPI2_IOCPAGE1_PCIBUSNUM_UNKNOWN (0xFF) +#define MPI2_IOCPAGE1_PCIDOMAIN_UNKNOWN (0xFF) + +/* IOC Page 6 */ + +typedef struct _MPI2_CONFIG_PAGE_IOC_6 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 CapabilitiesFlags; /* 0x04 */ + U8 MaxDrivesRAID0; /* 0x08 */ + U8 MaxDrivesRAID1; /* 0x09 */ + U8 MaxDrivesRAID1E; /* 0x0A */ + U8 MaxDrivesRAID10; /* 0x0B */ + U8 MinDrivesRAID0; /* 0x0C */ + U8 MinDrivesRAID1; /* 0x0D */ + U8 MinDrivesRAID1E; /* 0x0E */ + U8 MinDrivesRAID10; /* 0x0F */ + U32 Reserved1; /* 0x10 */ + U8 MaxGlobalHotSpares; /* 0x14 */ + U8 MaxPhysDisks; /* 0x15 */ + U8 MaxVolumes; /* 0x16 */ + U8 MaxConfigs; /* 0x17 */ + U8 MaxOCEDisks; /* 0x18 */ + U8 Reserved2; /* 0x19 */ + U16 Reserved3; /* 0x1A */ + U32 SupportedStripeSizeMapRAID0; /* 0x1C */ + U32 SupportedStripeSizeMapRAID1E; /* 0x20 */ + U32 SupportedStripeSizeMapRAID10; /* 0x24 */ + U32 Reserved4; /* 0x28 */ + U32 Reserved5; /* 0x2C */ + U16 DefaultMetadataSize; /* 0x30 */ + U16 Reserved6; /* 0x32 */ + U16 MaxBadBlockTableEntries; /* 0x34 */ + U16 Reserved7; /* 0x36 */ + U32 IRNvsramVersion; /* 0x38 */ +} MPI2_CONFIG_PAGE_IOC_6, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_6, + Mpi2IOCPage6_t, MPI2_POINTER pMpi2IOCPage6_t; + +#define MPI2_IOCPAGE6_PAGEVERSION (0x04) + +/* defines for IOC Page 6 CapabilitiesFlags */ +#define MPI2_IOCPAGE6_CAP_FLAGS_RAID10_SUPPORT (0x00000010) +#define MPI2_IOCPAGE6_CAP_FLAGS_RAID1_SUPPORT (0x00000008) +#define MPI2_IOCPAGE6_CAP_FLAGS_RAID1E_SUPPORT (0x00000004) +#define MPI2_IOCPAGE6_CAP_FLAGS_RAID0_SUPPORT (0x00000002) +#define MPI2_IOCPAGE6_CAP_FLAGS_GLOBAL_HOT_SPARE (0x00000001) + + +/* IOC Page 7 */ + +#define MPI2_IOCPAGE7_EVENTMASK_WORDS (4) + +typedef struct _MPI2_CONFIG_PAGE_IOC_7 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 EventMasks[MPI2_IOCPAGE7_EVENTMASK_WORDS];/* 0x08 */ + U16 SASBroadcastPrimitiveMasks; /* 0x18 */ + U16 SASNotifyPrimitiveMasks; /* 0x1A */ + U32 Reserved3; /* 0x1C */ +} MPI2_CONFIG_PAGE_IOC_7, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_7, + Mpi2IOCPage7_t, MPI2_POINTER pMpi2IOCPage7_t; + +#define MPI2_IOCPAGE7_PAGEVERSION (0x02) + + +/* IOC Page 8 */ + +typedef struct _MPI2_CONFIG_PAGE_IOC_8 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 NumDevsPerEnclosure; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + U16 MaxPersistentEntries; /* 0x08 */ + U16 MaxNumPhysicalMappedIDs; /* 0x0A */ + U16 Flags; /* 0x0C */ + U16 Reserved3; /* 0x0E */ + U16 IRVolumeMappingFlags; /* 0x10 */ + U16 Reserved4; /* 0x12 */ + U32 Reserved5; /* 0x14 */ +} MPI2_CONFIG_PAGE_IOC_8, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_IOC_8, + Mpi2IOCPage8_t, MPI2_POINTER pMpi2IOCPage8_t; + +#define MPI2_IOCPAGE8_PAGEVERSION (0x00) + +/* defines for IOC Page 8 Flags field */ +#define MPI2_IOCPAGE8_FLAGS_DA_START_SLOT_1 (0x00000020) +#define MPI2_IOCPAGE8_FLAGS_RESERVED_TARGETID_0 (0x00000010) + +#define MPI2_IOCPAGE8_FLAGS_MASK_MAPPING_MODE (0x0000000E) +#define MPI2_IOCPAGE8_FLAGS_DEVICE_PERSISTENCE_MAPPING (0x00000000) +#define MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING (0x00000002) + +#define MPI2_IOCPAGE8_FLAGS_DISABLE_PERSISTENT_MAPPING (0x00000001) +#define MPI2_IOCPAGE8_FLAGS_ENABLE_PERSISTENT_MAPPING (0x00000000) + +/* defines for IOC Page 8 IRVolumeMappingFlags */ +#define MPI2_IOCPAGE8_IRFLAGS_MASK_VOLUME_MAPPING_MODE (0x00000003) +#define MPI2_IOCPAGE8_IRFLAGS_LOW_VOLUME_MAPPING (0x00000000) +#define MPI2_IOCPAGE8_IRFLAGS_HIGH_VOLUME_MAPPING (0x00000001) + + +/**************************************************************************** +* BIOS Config Pages +****************************************************************************/ + +/* BIOS Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_BIOS_1 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 BiosOptions; /* 0x04 */ + U32 IOCSettings; /* 0x08 */ + U32 Reserved1; /* 0x0C */ + U32 DeviceSettings; /* 0x10 */ + U16 NumberOfDevices; /* 0x14 */ + U16 Reserved2; /* 0x16 */ + U16 IOTimeoutBlockDevicesNonRM; /* 0x18 */ + U16 IOTimeoutSequential; /* 0x1A */ + U16 IOTimeoutOther; /* 0x1C */ + U16 IOTimeoutBlockDevicesRM; /* 0x1E */ +} MPI2_CONFIG_PAGE_BIOS_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_1, + Mpi2BiosPage1_t, MPI2_POINTER pMpi2BiosPage1_t; + +#define MPI2_BIOSPAGE1_PAGEVERSION (0x04) + +/* values for BIOS Page 1 BiosOptions field */ +#define MPI2_BIOSPAGE1_OPTIONS_DISABLE_BIOS (0x00000001) + +/* values for BIOS Page 1 IOCSettings field */ +#define MPI2_BIOSPAGE1_IOCSET_MASK_BOOT_PREFERENCE (0x00030000) +#define MPI2_BIOSPAGE1_IOCSET_ENCLOSURE_SLOT_BOOT (0x00000000) +#define MPI2_BIOSPAGE1_IOCSET_SAS_ADDRESS_BOOT (0x00010000) + +#define MPI2_BIOSPAGE1_IOCSET_MASK_RM_SETTING (0x000000C0) +#define MPI2_BIOSPAGE1_IOCSET_NONE_RM_SETTING (0x00000000) +#define MPI2_BIOSPAGE1_IOCSET_BOOT_RM_SETTING (0x00000040) +#define MPI2_BIOSPAGE1_IOCSET_MEDIA_RM_SETTING (0x00000080) + +#define MPI2_BIOSPAGE1_IOCSET_MASK_ADAPTER_SUPPORT (0x00000030) +#define MPI2_BIOSPAGE1_IOCSET_NO_SUPPORT (0x00000000) +#define MPI2_BIOSPAGE1_IOCSET_BIOS_SUPPORT (0x00000010) +#define MPI2_BIOSPAGE1_IOCSET_OS_SUPPORT (0x00000020) +#define MPI2_BIOSPAGE1_IOCSET_ALL_SUPPORT (0x00000030) + +#define MPI2_BIOSPAGE1_IOCSET_ALTERNATE_CHS (0x00000008) + +/* values for BIOS Page 1 DeviceSettings field */ +#define MPI2_BIOSPAGE1_DEVSET_DISABLE_SMART_POLLING (0x00000010) +#define MPI2_BIOSPAGE1_DEVSET_DISABLE_SEQ_LUN (0x00000008) +#define MPI2_BIOSPAGE1_DEVSET_DISABLE_RM_LUN (0x00000004) +#define MPI2_BIOSPAGE1_DEVSET_DISABLE_NON_RM_LUN (0x00000002) +#define MPI2_BIOSPAGE1_DEVSET_DISABLE_OTHER_LUN (0x00000001) + + +/* BIOS Page 2 */ + +typedef struct _MPI2_BOOT_DEVICE_ADAPTER_ORDER +{ + U32 Reserved1; /* 0x00 */ + U32 Reserved2; /* 0x04 */ + U32 Reserved3; /* 0x08 */ + U32 Reserved4; /* 0x0C */ + U32 Reserved5; /* 0x10 */ + U32 Reserved6; /* 0x14 */ +} MPI2_BOOT_DEVICE_ADAPTER_ORDER, + MPI2_POINTER PTR_MPI2_BOOT_DEVICE_ADAPTER_ORDER, + Mpi2BootDeviceAdapterOrder_t, MPI2_POINTER pMpi2BootDeviceAdapterOrder_t; + +typedef struct _MPI2_BOOT_DEVICE_SAS_WWID +{ + U64 SASAddress; /* 0x00 */ + U8 LUN[8]; /* 0x08 */ + U32 Reserved1; /* 0x10 */ + U32 Reserved2; /* 0x14 */ +} MPI2_BOOT_DEVICE_SAS_WWID, MPI2_POINTER PTR_MPI2_BOOT_DEVICE_SAS_WWID, + Mpi2BootDeviceSasWwid_t, MPI2_POINTER pMpi2BootDeviceSasWwid_t; + +typedef struct _MPI2_BOOT_DEVICE_ENCLOSURE_SLOT +{ + U64 EnclosureLogicalID; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U32 Reserved2; /* 0x0C */ + U16 SlotNumber; /* 0x10 */ + U16 Reserved3; /* 0x12 */ + U32 Reserved4; /* 0x14 */ +} MPI2_BOOT_DEVICE_ENCLOSURE_SLOT, + MPI2_POINTER PTR_MPI2_BOOT_DEVICE_ENCLOSURE_SLOT, + Mpi2BootDeviceEnclosureSlot_t, MPI2_POINTER pMpi2BootDeviceEnclosureSlot_t; + +typedef struct _MPI2_BOOT_DEVICE_DEVICE_NAME +{ + U64 DeviceName; /* 0x00 */ + U8 LUN[8]; /* 0x08 */ + U32 Reserved1; /* 0x10 */ + U32 Reserved2; /* 0x14 */ +} MPI2_BOOT_DEVICE_DEVICE_NAME, MPI2_POINTER PTR_MPI2_BOOT_DEVICE_DEVICE_NAME, + Mpi2BootDeviceDeviceName_t, MPI2_POINTER pMpi2BootDeviceDeviceName_t; + +typedef union _MPI2_MPI2_BIOSPAGE2_BOOT_DEVICE +{ + MPI2_BOOT_DEVICE_ADAPTER_ORDER AdapterOrder; + MPI2_BOOT_DEVICE_SAS_WWID SasWwid; + MPI2_BOOT_DEVICE_ENCLOSURE_SLOT EnclosureSlot; + MPI2_BOOT_DEVICE_DEVICE_NAME DeviceName; +} MPI2_BIOSPAGE2_BOOT_DEVICE, MPI2_POINTER PTR_MPI2_BIOSPAGE2_BOOT_DEVICE, + Mpi2BiosPage2BootDevice_t, MPI2_POINTER pMpi2BiosPage2BootDevice_t; + +typedef struct _MPI2_CONFIG_PAGE_BIOS_2 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Reserved2; /* 0x08 */ + U32 Reserved3; /* 0x0C */ + U32 Reserved4; /* 0x10 */ + U32 Reserved5; /* 0x14 */ + U32 Reserved6; /* 0x18 */ + U8 ReqBootDeviceForm; /* 0x1C */ + U8 Reserved7; /* 0x1D */ + U16 Reserved8; /* 0x1E */ + MPI2_BIOSPAGE2_BOOT_DEVICE RequestedBootDevice; /* 0x20 */ + U8 ReqAltBootDeviceForm; /* 0x38 */ + U8 Reserved9; /* 0x39 */ + U16 Reserved10; /* 0x3A */ + MPI2_BIOSPAGE2_BOOT_DEVICE RequestedAltBootDevice; /* 0x3C */ + U8 CurrentBootDeviceForm; /* 0x58 */ + U8 Reserved11; /* 0x59 */ + U16 Reserved12; /* 0x5A */ + MPI2_BIOSPAGE2_BOOT_DEVICE CurrentBootDevice; /* 0x58 */ +} MPI2_CONFIG_PAGE_BIOS_2, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_2, + Mpi2BiosPage2_t, MPI2_POINTER pMpi2BiosPage2_t; + +#define MPI2_BIOSPAGE2_PAGEVERSION (0x04) + +/* values for BIOS Page 2 BootDeviceForm fields */ +#define MPI2_BIOSPAGE2_FORM_MASK (0x0F) +#define MPI2_BIOSPAGE2_FORM_NO_DEVICE_SPECIFIED (0x00) +#define MPI2_BIOSPAGE2_FORM_SAS_WWID (0x05) +#define MPI2_BIOSPAGE2_FORM_ENCLOSURE_SLOT (0x06) +#define MPI2_BIOSPAGE2_FORM_DEVICE_NAME (0x07) + + +/* BIOS Page 3 */ + +typedef struct _MPI2_ADAPTER_INFO +{ + U8 PciBusNumber; /* 0x00 */ + U8 PciDeviceAndFunctionNumber; /* 0x01 */ + U16 AdapterFlags; /* 0x02 */ +} MPI2_ADAPTER_INFO, MPI2_POINTER PTR_MPI2_ADAPTER_INFO, + Mpi2AdapterInfo_t, MPI2_POINTER pMpi2AdapterInfo_t; + +#define MPI2_ADAPTER_INFO_FLAGS_EMBEDDED (0x0001) +#define MPI2_ADAPTER_INFO_FLAGS_INIT_STATUS (0x0002) + +typedef struct _MPI2_CONFIG_PAGE_BIOS_3 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U32 GlobalFlags; /* 0x04 */ + U32 BiosVersion; /* 0x08 */ + MPI2_ADAPTER_INFO AdapterOrder[4]; /* 0x0C */ + U32 Reserved1; /* 0x1C */ +} MPI2_CONFIG_PAGE_BIOS_3, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_3, + Mpi2BiosPage3_t, MPI2_POINTER pMpi2BiosPage3_t; + +#define MPI2_BIOSPAGE3_PAGEVERSION (0x00) + +/* values for BIOS Page 3 GlobalFlags */ +#define MPI2_BIOSPAGE3_FLAGS_PAUSE_ON_ERROR (0x00000002) +#define MPI2_BIOSPAGE3_FLAGS_VERBOSE_ENABLE (0x00000004) +#define MPI2_BIOSPAGE3_FLAGS_HOOK_INT_40_DISABLE (0x00000010) + +#define MPI2_BIOSPAGE3_FLAGS_DEV_LIST_DISPLAY_MASK (0x000000E0) +#define MPI2_BIOSPAGE3_FLAGS_INSTALLED_DEV_DISPLAY (0x00000000) +#define MPI2_BIOSPAGE3_FLAGS_ADAPTER_DISPLAY (0x00000020) +#define MPI2_BIOSPAGE3_FLAGS_ADAPTER_DEV_DISPLAY (0x00000040) + + +/* BIOS Page 4 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_BIOS_PAGE_4_PHY_ENTRIES +#define MPI2_BIOS_PAGE_4_PHY_ENTRIES (1) +#endif + +typedef struct _MPI2_BIOS4_ENTRY +{ + U64 ReassignmentWWID; /* 0x00 */ + U64 ReassignmentDeviceName; /* 0x08 */ +} MPI2_BIOS4_ENTRY, MPI2_POINTER PTR_MPI2_BIOS4_ENTRY, + Mpi2MBios4Entry_t, MPI2_POINTER pMpi2Bios4Entry_t; + +typedef struct _MPI2_CONFIG_PAGE_BIOS_4 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 NumPhys; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + MPI2_BIOS4_ENTRY Phy[MPI2_BIOS_PAGE_4_PHY_ENTRIES]; /* 0x08 */ +} MPI2_CONFIG_PAGE_BIOS_4, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_BIOS_4, + Mpi2BiosPage4_t, MPI2_POINTER pMpi2BiosPage4_t; + +#define MPI2_BIOSPAGE4_PAGEVERSION (0x01) + + +/**************************************************************************** +* RAID Volume Config Pages +****************************************************************************/ + +/* RAID Volume Page 0 */ + +typedef struct _MPI2_RAIDVOL0_PHYS_DISK +{ + U8 RAIDSetNum; /* 0x00 */ + U8 PhysDiskMap; /* 0x01 */ + U8 PhysDiskNum; /* 0x02 */ + U8 Reserved; /* 0x03 */ +} MPI2_RAIDVOL0_PHYS_DISK, MPI2_POINTER PTR_MPI2_RAIDVOL0_PHYS_DISK, + Mpi2RaidVol0PhysDisk_t, MPI2_POINTER pMpi2RaidVol0PhysDisk_t; + +/* defines for the PhysDiskMap field */ +#define MPI2_RAIDVOL0_PHYSDISK_PRIMARY (0x01) +#define MPI2_RAIDVOL0_PHYSDISK_SECONDARY (0x02) + +typedef struct _MPI2_RAIDVOL0_SETTINGS +{ + U16 Settings; /* 0x00 */ + U8 HotSparePool; /* 0x01 */ + U8 Reserved; /* 0x02 */ +} MPI2_RAIDVOL0_SETTINGS, MPI2_POINTER PTR_MPI2_RAIDVOL0_SETTINGS, + Mpi2RaidVol0Settings_t, MPI2_POINTER pMpi2RaidVol0Settings_t; + +/* RAID Volume Page 0 HotSparePool defines, also used in RAID Physical Disk */ +#define MPI2_RAID_HOT_SPARE_POOL_0 (0x01) +#define MPI2_RAID_HOT_SPARE_POOL_1 (0x02) +#define MPI2_RAID_HOT_SPARE_POOL_2 (0x04) +#define MPI2_RAID_HOT_SPARE_POOL_3 (0x08) +#define MPI2_RAID_HOT_SPARE_POOL_4 (0x10) +#define MPI2_RAID_HOT_SPARE_POOL_5 (0x20) +#define MPI2_RAID_HOT_SPARE_POOL_6 (0x40) +#define MPI2_RAID_HOT_SPARE_POOL_7 (0x80) + +/* RAID Volume Page 0 VolumeSettings defines */ +#define MPI2_RAIDVOL0_SETTING_USE_PRODUCT_ID_SUFFIX (0x0008) +#define MPI2_RAIDVOL0_SETTING_AUTO_CONFIG_HSWAP_DISABLE (0x0004) + +#define MPI2_RAIDVOL0_SETTING_MASK_WRITE_CACHING (0x0003) +#define MPI2_RAIDVOL0_SETTING_UNCHANGED (0x0000) +#define MPI2_RAIDVOL0_SETTING_DISABLE_WRITE_CACHING (0x0001) +#define MPI2_RAIDVOL0_SETTING_ENABLE_WRITE_CACHING (0x0002) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhysDisks at runtime. + */ +#ifndef MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX +#define MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_RAID_VOL_0 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U16 DevHandle; /* 0x04 */ + U8 VolumeState; /* 0x06 */ + U8 VolumeType; /* 0x07 */ + U32 VolumeStatusFlags; /* 0x08 */ + MPI2_RAIDVOL0_SETTINGS VolumeSettings; /* 0x0C */ + U64 MaxLBA; /* 0x10 */ + U32 StripeSize; /* 0x18 */ + U16 BlockSize; /* 0x1C */ + U16 Reserved1; /* 0x1E */ + U8 SupportedPhysDisks; /* 0x20 */ + U8 ResyncRate; /* 0x21 */ + U16 DataScrubDuration; /* 0x22 */ + U8 NumPhysDisks; /* 0x24 */ + U8 Reserved2; /* 0x25 */ + U8 Reserved3; /* 0x26 */ + U8 InactiveStatus; /* 0x27 */ + MPI2_RAIDVOL0_PHYS_DISK PhysDisk[MPI2_RAID_VOL_PAGE_0_PHYSDISK_MAX]; /* 0x28 */ +} MPI2_CONFIG_PAGE_RAID_VOL_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RAID_VOL_0, + Mpi2RaidVolPage0_t, MPI2_POINTER pMpi2RaidVolPage0_t; + +#define MPI2_RAIDVOLPAGE0_PAGEVERSION (0x0A) + +/* values for RAID VolumeState */ +#define MPI2_RAID_VOL_STATE_MISSING (0x00) +#define MPI2_RAID_VOL_STATE_FAILED (0x01) +#define MPI2_RAID_VOL_STATE_INITIALIZING (0x02) +#define MPI2_RAID_VOL_STATE_ONLINE (0x03) +#define MPI2_RAID_VOL_STATE_DEGRADED (0x04) +#define MPI2_RAID_VOL_STATE_OPTIMAL (0x05) + +/* values for RAID VolumeType */ +#define MPI2_RAID_VOL_TYPE_RAID0 (0x00) +#define MPI2_RAID_VOL_TYPE_RAID1E (0x01) +#define MPI2_RAID_VOL_TYPE_RAID1 (0x02) +#define MPI2_RAID_VOL_TYPE_RAID10 (0x05) +#define MPI2_RAID_VOL_TYPE_UNKNOWN (0xFF) + +/* values for RAID Volume Page 0 VolumeStatusFlags field */ +#define MPI2_RAIDVOL0_STATUS_FLAG_PENDING_RESYNC (0x02000000) +#define MPI2_RAIDVOL0_STATUS_FLAG_BACKG_INIT_PENDING (0x01000000) +#define MPI2_RAIDVOL0_STATUS_FLAG_MDC_PENDING (0x00800000) +#define MPI2_RAIDVOL0_STATUS_FLAG_USER_CONSIST_PENDING (0x00400000) +#define MPI2_RAIDVOL0_STATUS_FLAG_MAKE_DATA_CONSISTENT (0x00200000) +#define MPI2_RAIDVOL0_STATUS_FLAG_DATA_SCRUB (0x00100000) +#define MPI2_RAIDVOL0_STATUS_FLAG_CONSISTENCY_CHECK (0x00080000) +#define MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION (0x00040000) +#define MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT (0x00020000) +#define MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS (0x00010000) +#define MPI2_RAIDVOL0_STATUS_FLAG_VOL_NOT_CONSISTENT (0x00000080) +#define MPI2_RAIDVOL0_STATUS_FLAG_OCE_ALLOWED (0x00000040) +#define MPI2_RAIDVOL0_STATUS_FLAG_BGI_COMPLETE (0x00000020) +#define MPI2_RAIDVOL0_STATUS_FLAG_1E_OFFSET_MIRROR (0x00000000) +#define MPI2_RAIDVOL0_STATUS_FLAG_1E_ADJACENT_MIRROR (0x00000010) +#define MPI2_RAIDVOL0_STATUS_FLAG_BAD_BLOCK_TABLE_FULL (0x00000008) +#define MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE (0x00000004) +#define MPI2_RAIDVOL0_STATUS_FLAG_QUIESCED (0x00000002) +#define MPI2_RAIDVOL0_STATUS_FLAG_ENABLED (0x00000001) + +/* values for RAID Volume Page 0 SupportedPhysDisks field */ +#define MPI2_RAIDVOL0_SUPPORT_SOLID_STATE_DISKS (0x08) +#define MPI2_RAIDVOL0_SUPPORT_HARD_DISKS (0x04) +#define MPI2_RAIDVOL0_SUPPORT_SAS_PROTOCOL (0x02) +#define MPI2_RAIDVOL0_SUPPORT_SATA_PROTOCOL (0x01) + +/* values for RAID Volume Page 0 InactiveStatus field */ +#define MPI2_RAIDVOLPAGE0_UNKNOWN_INACTIVE (0x00) +#define MPI2_RAIDVOLPAGE0_STALE_METADATA_INACTIVE (0x01) +#define MPI2_RAIDVOLPAGE0_FOREIGN_VOLUME_INACTIVE (0x02) +#define MPI2_RAIDVOLPAGE0_INSUFFICIENT_RESOURCE_INACTIVE (0x03) +#define MPI2_RAIDVOLPAGE0_CLONE_VOLUME_INACTIVE (0x04) +#define MPI2_RAIDVOLPAGE0_INSUFFICIENT_METADATA_INACTIVE (0x05) +#define MPI2_RAIDVOLPAGE0_PREVIOUSLY_DELETED (0x06) + + +/* RAID Volume Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_RAID_VOL_1 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U16 DevHandle; /* 0x04 */ + U16 Reserved0; /* 0x06 */ + U8 GUID[24]; /* 0x08 */ + U8 Name[16]; /* 0x20 */ + U64 WWID; /* 0x30 */ + U32 Reserved1; /* 0x38 */ + U32 Reserved2; /* 0x3C */ +} MPI2_CONFIG_PAGE_RAID_VOL_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RAID_VOL_1, + Mpi2RaidVolPage1_t, MPI2_POINTER pMpi2RaidVolPage1_t; + +#define MPI2_RAIDVOLPAGE1_PAGEVERSION (0x03) + + +/**************************************************************************** +* RAID Physical Disk Config Pages +****************************************************************************/ + +/* RAID Physical Disk Page 0 */ + +typedef struct _MPI2_RAIDPHYSDISK0_SETTINGS +{ + U16 Reserved1; /* 0x00 */ + U8 HotSparePool; /* 0x02 */ + U8 Reserved2; /* 0x03 */ +} MPI2_RAIDPHYSDISK0_SETTINGS, MPI2_POINTER PTR_MPI2_RAIDPHYSDISK0_SETTINGS, + Mpi2RaidPhysDisk0Settings_t, MPI2_POINTER pMpi2RaidPhysDisk0Settings_t; + +/* use MPI2_RAID_HOT_SPARE_POOL_ defines for the HotSparePool field */ + +typedef struct _MPI2_RAIDPHYSDISK0_INQUIRY_DATA +{ + U8 VendorID[8]; /* 0x00 */ + U8 ProductID[16]; /* 0x08 */ + U8 ProductRevLevel[4]; /* 0x18 */ + U8 SerialNum[32]; /* 0x1C */ +} MPI2_RAIDPHYSDISK0_INQUIRY_DATA, + MPI2_POINTER PTR_MPI2_RAIDPHYSDISK0_INQUIRY_DATA, + Mpi2RaidPhysDisk0InquiryData_t, MPI2_POINTER pMpi2RaidPhysDisk0InquiryData_t; + +typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_0 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U16 DevHandle; /* 0x04 */ + U8 Reserved1; /* 0x06 */ + U8 PhysDiskNum; /* 0x07 */ + MPI2_RAIDPHYSDISK0_SETTINGS PhysDiskSettings; /* 0x08 */ + U32 Reserved2; /* 0x0C */ + MPI2_RAIDPHYSDISK0_INQUIRY_DATA InquiryData; /* 0x10 */ + U32 Reserved3; /* 0x4C */ + U8 PhysDiskState; /* 0x50 */ + U8 OfflineReason; /* 0x51 */ + U8 IncompatibleReason; /* 0x52 */ + U8 PhysDiskAttributes; /* 0x53 */ + U32 PhysDiskStatusFlags; /* 0x54 */ + U64 DeviceMaxLBA; /* 0x58 */ + U64 HostMaxLBA; /* 0x60 */ + U64 CoercedMaxLBA; /* 0x68 */ + U16 BlockSize; /* 0x70 */ + U16 Reserved5; /* 0x72 */ + U32 Reserved6; /* 0x74 */ +} MPI2_CONFIG_PAGE_RD_PDISK_0, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RD_PDISK_0, + Mpi2RaidPhysDiskPage0_t, MPI2_POINTER pMpi2RaidPhysDiskPage0_t; + +#define MPI2_RAIDPHYSDISKPAGE0_PAGEVERSION (0x05) + +/* PhysDiskState defines */ +#define MPI2_RAID_PD_STATE_NOT_CONFIGURED (0x00) +#define MPI2_RAID_PD_STATE_NOT_COMPATIBLE (0x01) +#define MPI2_RAID_PD_STATE_OFFLINE (0x02) +#define MPI2_RAID_PD_STATE_ONLINE (0x03) +#define MPI2_RAID_PD_STATE_HOT_SPARE (0x04) +#define MPI2_RAID_PD_STATE_DEGRADED (0x05) +#define MPI2_RAID_PD_STATE_REBUILDING (0x06) +#define MPI2_RAID_PD_STATE_OPTIMAL (0x07) + +/* OfflineReason defines */ +#define MPI2_PHYSDISK0_ONLINE (0x00) +#define MPI2_PHYSDISK0_OFFLINE_MISSING (0x01) +#define MPI2_PHYSDISK0_OFFLINE_FAILED (0x03) +#define MPI2_PHYSDISK0_OFFLINE_INITIALIZING (0x04) +#define MPI2_PHYSDISK0_OFFLINE_REQUESTED (0x05) +#define MPI2_PHYSDISK0_OFFLINE_FAILED_REQUESTED (0x06) +#define MPI2_PHYSDISK0_OFFLINE_OTHER (0xFF) + +/* IncompatibleReason defines */ +#define MPI2_PHYSDISK0_COMPATIBLE (0x00) +#define MPI2_PHYSDISK0_INCOMPATIBLE_PROTOCOL (0x01) +#define MPI2_PHYSDISK0_INCOMPATIBLE_BLOCKSIZE (0x02) +#define MPI2_PHYSDISK0_INCOMPATIBLE_MAX_LBA (0x03) +#define MPI2_PHYSDISK0_INCOMPATIBLE_SATA_EXTENDED_CMD (0x04) +#define MPI2_PHYSDISK0_INCOMPATIBLE_REMOVEABLE_MEDIA (0x05) +#define MPI2_PHYSDISK0_INCOMPATIBLE_MEDIA_TYPE (0x06) +#define MPI2_PHYSDISK0_INCOMPATIBLE_UNKNOWN (0xFF) + +/* PhysDiskAttributes defines */ +#define MPI2_PHYSDISK0_ATTRIB_MEDIA_MASK (0x0C) +#define MPI2_PHYSDISK0_ATTRIB_SOLID_STATE_DRIVE (0x08) +#define MPI2_PHYSDISK0_ATTRIB_HARD_DISK_DRIVE (0x04) + +#define MPI2_PHYSDISK0_ATTRIB_PROTOCOL_MASK (0x03) +#define MPI2_PHYSDISK0_ATTRIB_SAS_PROTOCOL (0x02) +#define MPI2_PHYSDISK0_ATTRIB_SATA_PROTOCOL (0x01) + +/* PhysDiskStatusFlags defines */ +#define MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED (0x00000040) +#define MPI2_PHYSDISK0_STATUS_FLAG_OCE_TARGET (0x00000020) +#define MPI2_PHYSDISK0_STATUS_FLAG_WRITE_CACHE_ENABLED (0x00000010) +#define MPI2_PHYSDISK0_STATUS_FLAG_OPTIMAL_PREVIOUS (0x00000000) +#define MPI2_PHYSDISK0_STATUS_FLAG_NOT_OPTIMAL_PREVIOUS (0x00000008) +#define MPI2_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME (0x00000004) +#define MPI2_PHYSDISK0_STATUS_FLAG_QUIESCED (0x00000002) +#define MPI2_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC (0x00000001) + + +/* RAID Physical Disk Page 1 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhysDiskPaths at runtime. + */ +#ifndef MPI2_RAID_PHYS_DISK1_PATH_MAX +#define MPI2_RAID_PHYS_DISK1_PATH_MAX (1) +#endif + +typedef struct _MPI2_RAIDPHYSDISK1_PATH +{ + U16 DevHandle; /* 0x00 */ + U16 Reserved1; /* 0x02 */ + U64 WWID; /* 0x04 */ + U64 OwnerWWID; /* 0x0C */ + U8 OwnerIdentifier; /* 0x14 */ + U8 Reserved2; /* 0x15 */ + U16 Flags; /* 0x16 */ +} MPI2_RAIDPHYSDISK1_PATH, MPI2_POINTER PTR_MPI2_RAIDPHYSDISK1_PATH, + Mpi2RaidPhysDisk1Path_t, MPI2_POINTER pMpi2RaidPhysDisk1Path_t; + +/* RAID Physical Disk Page 1 Physical Disk Path Flags field defines */ +#define MPI2_RAID_PHYSDISK1_FLAG_PRIMARY (0x0004) +#define MPI2_RAID_PHYSDISK1_FLAG_BROKEN (0x0002) +#define MPI2_RAID_PHYSDISK1_FLAG_INVALID (0x0001) + +typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_1 +{ + MPI2_CONFIG_PAGE_HEADER Header; /* 0x00 */ + U8 NumPhysDiskPaths; /* 0x04 */ + U8 PhysDiskNum; /* 0x05 */ + U16 Reserved1; /* 0x06 */ + U32 Reserved2; /* 0x08 */ + MPI2_RAIDPHYSDISK1_PATH PhysicalDiskPath[MPI2_RAID_PHYS_DISK1_PATH_MAX];/* 0x0C */ +} MPI2_CONFIG_PAGE_RD_PDISK_1, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RD_PDISK_1, + Mpi2RaidPhysDiskPage1_t, MPI2_POINTER pMpi2RaidPhysDiskPage1_t; + +#define MPI2_RAIDPHYSDISKPAGE1_PAGEVERSION (0x02) + + +/**************************************************************************** +* values for fields used by several types of SAS Config Pages +****************************************************************************/ + +/* values for NegotiatedLinkRates fields */ +#define MPI2_SAS_NEG_LINK_RATE_MASK_LOGICAL (0xF0) +#define MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL (4) +#define MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL (0x0F) +/* link rates used for Negotiated Physical and Logical Link Rate */ +#define MPI2_SAS_NEG_LINK_RATE_UNKNOWN_LINK_RATE (0x00) +#define MPI2_SAS_NEG_LINK_RATE_PHY_DISABLED (0x01) +#define MPI2_SAS_NEG_LINK_RATE_NEGOTIATION_FAILED (0x02) +#define MPI2_SAS_NEG_LINK_RATE_SATA_OOB_COMPLETE (0x03) +#define MPI2_SAS_NEG_LINK_RATE_PORT_SELECTOR (0x04) +#define MPI2_SAS_NEG_LINK_RATE_SMP_RESET_IN_PROGRESS (0x05) +#define MPI2_SAS_NEG_LINK_RATE_UNSUPPORTED_PHY (0x06) +#define MPI2_SAS_NEG_LINK_RATE_1_5 (0x08) +#define MPI2_SAS_NEG_LINK_RATE_3_0 (0x09) +#define MPI2_SAS_NEG_LINK_RATE_6_0 (0x0A) +#define MPI25_SAS_NEG_LINK_RATE_12_0 (0x0B) + + +/* values for AttachedPhyInfo fields */ +#define MPI2_SAS_APHYINFO_INSIDE_ZPSDS_PERSISTENT (0x00000040) +#define MPI2_SAS_APHYINFO_REQUESTED_INSIDE_ZPSDS (0x00000020) +#define MPI2_SAS_APHYINFO_BREAK_REPLY_CAPABLE (0x00000010) + +#define MPI2_SAS_APHYINFO_REASON_MASK (0x0000000F) +#define MPI2_SAS_APHYINFO_REASON_UNKNOWN (0x00000000) +#define MPI2_SAS_APHYINFO_REASON_POWER_ON (0x00000001) +#define MPI2_SAS_APHYINFO_REASON_HARD_RESET (0x00000002) +#define MPI2_SAS_APHYINFO_REASON_SMP_PHY_CONTROL (0x00000003) +#define MPI2_SAS_APHYINFO_REASON_LOSS_OF_SYNC (0x00000004) +#define MPI2_SAS_APHYINFO_REASON_MULTIPLEXING_SEQ (0x00000005) +#define MPI2_SAS_APHYINFO_REASON_IT_NEXUS_LOSS_TIMER (0x00000006) +#define MPI2_SAS_APHYINFO_REASON_BREAK_TIMEOUT (0x00000007) +#define MPI2_SAS_APHYINFO_REASON_PHY_TEST_STOPPED (0x00000008) + + +/* values for PhyInfo fields */ +#define MPI2_SAS_PHYINFO_PHY_VACANT (0x80000000) + +#define MPI2_SAS_PHYINFO_PHY_POWER_CONDITION_MASK (0x18000000) +#define MPI2_SAS_PHYINFO_SHIFT_PHY_POWER_CONDITION (27) +#define MPI2_SAS_PHYINFO_PHY_POWER_ACTIVE (0x00000000) +#define MPI2_SAS_PHYINFO_PHY_POWER_PARTIAL (0x08000000) +#define MPI2_SAS_PHYINFO_PHY_POWER_SLUMBER (0x10000000) + +#define MPI2_SAS_PHYINFO_CHANGED_REQ_INSIDE_ZPSDS (0x04000000) +#define MPI2_SAS_PHYINFO_INSIDE_ZPSDS_PERSISTENT (0x02000000) +#define MPI2_SAS_PHYINFO_REQ_INSIDE_ZPSDS (0x01000000) +#define MPI2_SAS_PHYINFO_ZONE_GROUP_PERSISTENT (0x00400000) +#define MPI2_SAS_PHYINFO_INSIDE_ZPSDS (0x00200000) +#define MPI2_SAS_PHYINFO_ZONING_ENABLED (0x00100000) + +#define MPI2_SAS_PHYINFO_REASON_MASK (0x000F0000) +#define MPI2_SAS_PHYINFO_REASON_UNKNOWN (0x00000000) +#define MPI2_SAS_PHYINFO_REASON_POWER_ON (0x00010000) +#define MPI2_SAS_PHYINFO_REASON_HARD_RESET (0x00020000) +#define MPI2_SAS_PHYINFO_REASON_SMP_PHY_CONTROL (0x00030000) +#define MPI2_SAS_PHYINFO_REASON_LOSS_OF_SYNC (0x00040000) +#define MPI2_SAS_PHYINFO_REASON_MULTIPLEXING_SEQ (0x00050000) +#define MPI2_SAS_PHYINFO_REASON_IT_NEXUS_LOSS_TIMER (0x00060000) +#define MPI2_SAS_PHYINFO_REASON_BREAK_TIMEOUT (0x00070000) +#define MPI2_SAS_PHYINFO_REASON_PHY_TEST_STOPPED (0x00080000) + +#define MPI2_SAS_PHYINFO_MULTIPLEXING_SUPPORTED (0x00008000) +#define MPI2_SAS_PHYINFO_SATA_PORT_ACTIVE (0x00004000) +#define MPI2_SAS_PHYINFO_SATA_PORT_SELECTOR_PRESENT (0x00002000) +#define MPI2_SAS_PHYINFO_VIRTUAL_PHY (0x00001000) + +#define MPI2_SAS_PHYINFO_MASK_PARTIAL_PATHWAY_TIME (0x00000F00) +#define MPI2_SAS_PHYINFO_SHIFT_PARTIAL_PATHWAY_TIME (8) + +#define MPI2_SAS_PHYINFO_MASK_ROUTING_ATTRIBUTE (0x000000F0) +#define MPI2_SAS_PHYINFO_DIRECT_ROUTING (0x00000000) +#define MPI2_SAS_PHYINFO_SUBTRACTIVE_ROUTING (0x00000010) +#define MPI2_SAS_PHYINFO_TABLE_ROUTING (0x00000020) + + +/* values for SAS ProgrammedLinkRate fields */ +#define MPI2_SAS_PRATE_MAX_RATE_MASK (0xF0) +#define MPI2_SAS_PRATE_MAX_RATE_NOT_PROGRAMMABLE (0x00) +#define MPI2_SAS_PRATE_MAX_RATE_1_5 (0x80) +#define MPI2_SAS_PRATE_MAX_RATE_3_0 (0x90) +#define MPI2_SAS_PRATE_MAX_RATE_6_0 (0xA0) +#define MPI2_SAS_PRATE_MIN_RATE_MASK (0x0F) +#define MPI2_SAS_PRATE_MIN_RATE_NOT_PROGRAMMABLE (0x00) +#define MPI2_SAS_PRATE_MIN_RATE_1_5 (0x08) +#define MPI2_SAS_PRATE_MIN_RATE_3_0 (0x09) +#define MPI2_SAS_PRATE_MIN_RATE_6_0 (0x0A) +#define MPI25_SAS_PRATE_MIN_RATE_12_0 (0x0B) + + +/* values for SAS HwLinkRate fields */ +#define MPI2_SAS_HWRATE_MAX_RATE_MASK (0xF0) +#define MPI2_SAS_HWRATE_MAX_RATE_1_5 (0x80) +#define MPI2_SAS_HWRATE_MAX_RATE_3_0 (0x90) +#define MPI2_SAS_HWRATE_MAX_RATE_6_0 (0xA0) +#define MPI2_SAS_HWRATE_MIN_RATE_MASK (0x0F) +#define MPI2_SAS_HWRATE_MIN_RATE_1_5 (0x08) +#define MPI2_SAS_HWRATE_MIN_RATE_3_0 (0x09) +#define MPI2_SAS_HWRATE_MIN_RATE_6_0 (0x0A) +#define MPI25_SAS_HWRATE_MIN_RATE_12_0 (0x0B) + + + +/**************************************************************************** +* SAS IO Unit Config Pages +****************************************************************************/ + +/* SAS IO Unit Page 0 */ + +typedef struct _MPI2_SAS_IO_UNIT0_PHY_DATA +{ + U8 Port; /* 0x00 */ + U8 PortFlags; /* 0x01 */ + U8 PhyFlags; /* 0x02 */ + U8 NegotiatedLinkRate; /* 0x03 */ + U32 ControllerPhyDeviceInfo;/* 0x04 */ + U16 AttachedDevHandle; /* 0x08 */ + U16 ControllerDevHandle; /* 0x0A */ + U32 DiscoveryStatus; /* 0x0C */ + U32 Reserved; /* 0x10 */ +} MPI2_SAS_IO_UNIT0_PHY_DATA, MPI2_POINTER PTR_MPI2_SAS_IO_UNIT0_PHY_DATA, + Mpi2SasIOUnit0PhyData_t, MPI2_POINTER pMpi2SasIOUnit0PhyData_t; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_SAS_IOUNIT0_PHY_MAX +#define MPI2_SAS_IOUNIT0_PHY_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U8 NumPhys; /* 0x0C */ + U8 Reserved2; /* 0x0D */ + U16 Reserved3; /* 0x0E */ + MPI2_SAS_IO_UNIT0_PHY_DATA PhyData[MPI2_SAS_IOUNIT0_PHY_MAX]; /* 0x10 */ +} MPI2_CONFIG_PAGE_SASIOUNIT_0, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_0, + Mpi2SasIOUnitPage0_t, MPI2_POINTER pMpi2SasIOUnitPage0_t; + +#define MPI2_SASIOUNITPAGE0_PAGEVERSION (0x05) + +/* values for SAS IO Unit Page 0 PortFlags */ +#define MPI2_SASIOUNIT0_PORTFLAGS_DISCOVERY_IN_PROGRESS (0x08) +#define MPI2_SASIOUNIT0_PORTFLAGS_AUTO_PORT_CONFIG (0x01) + +/* values for SAS IO Unit Page 0 PhyFlags */ +#define MPI2_SASIOUNIT0_PHYFLAGS_ZONING_ENABLED (0x10) +#define MPI2_SASIOUNIT0_PHYFLAGS_PHY_DISABLED (0x08) + +/* use MPI2_SAS_NEG_LINK_RATE_ defines for the NegotiatedLinkRate field */ + +/* see mpi2_sas.h for values for SAS IO Unit Page 0 ControllerPhyDeviceInfo values */ + +/* values for SAS IO Unit Page 0 DiscoveryStatus */ +#define MPI2_SASIOUNIT0_DS_MAX_ENCLOSURES_EXCEED (0x80000000) +#define MPI2_SASIOUNIT0_DS_MAX_EXPANDERS_EXCEED (0x40000000) +#define MPI2_SASIOUNIT0_DS_MAX_DEVICES_EXCEED (0x20000000) +#define MPI2_SASIOUNIT0_DS_MAX_TOPO_PHYS_EXCEED (0x10000000) +#define MPI2_SASIOUNIT0_DS_DOWNSTREAM_INITIATOR (0x08000000) +#define MPI2_SASIOUNIT0_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE (0x00008000) +#define MPI2_SASIOUNIT0_DS_EXP_MULTI_SUBTRACTIVE (0x00004000) +#define MPI2_SASIOUNIT0_DS_MULTI_PORT_DOMAIN (0x00002000) +#define MPI2_SASIOUNIT0_DS_TABLE_TO_SUBTRACTIVE_LINK (0x00001000) +#define MPI2_SASIOUNIT0_DS_UNSUPPORTED_DEVICE (0x00000800) +#define MPI2_SASIOUNIT0_DS_TABLE_LINK (0x00000400) +#define MPI2_SASIOUNIT0_DS_SUBTRACTIVE_LINK (0x00000200) +#define MPI2_SASIOUNIT0_DS_SMP_CRC_ERROR (0x00000100) +#define MPI2_SASIOUNIT0_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI2_SASIOUNIT0_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI2_SASIOUNIT0_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI2_SASIOUNIT0_DS_SMP_TIMEOUT (0x00000010) +#define MPI2_SASIOUNIT0_DS_MULTIPLE_PORTS (0x00000004) +#define MPI2_SASIOUNIT0_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI2_SASIOUNIT0_DS_LOOP_DETECTED (0x00000001) + + +/* SAS IO Unit Page 1 */ + +typedef struct _MPI2_SAS_IO_UNIT1_PHY_DATA +{ + U8 Port; /* 0x00 */ + U8 PortFlags; /* 0x01 */ + U8 PhyFlags; /* 0x02 */ + U8 MaxMinLinkRate; /* 0x03 */ + U32 ControllerPhyDeviceInfo; /* 0x04 */ + U16 MaxTargetPortConnectTime; /* 0x08 */ + U16 Reserved1; /* 0x0A */ +} MPI2_SAS_IO_UNIT1_PHY_DATA, MPI2_POINTER PTR_MPI2_SAS_IO_UNIT1_PHY_DATA, + Mpi2SasIOUnit1PhyData_t, MPI2_POINTER pMpi2SasIOUnit1PhyData_t; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_SAS_IOUNIT1_PHY_MAX +#define MPI2_SAS_IOUNIT1_PHY_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_1 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U16 ControlFlags; /* 0x08 */ + U16 SASNarrowMaxQueueDepth; /* 0x0A */ + U16 AdditionalControlFlags; /* 0x0C */ + U16 SASWideMaxQueueDepth; /* 0x0E */ + U8 NumPhys; /* 0x10 */ + U8 SATAMaxQDepth; /* 0x11 */ + U8 ReportDeviceMissingDelay; /* 0x12 */ + U8 IODeviceMissingDelay; /* 0x13 */ + MPI2_SAS_IO_UNIT1_PHY_DATA PhyData[MPI2_SAS_IOUNIT1_PHY_MAX]; /* 0x14 */ +} MPI2_CONFIG_PAGE_SASIOUNIT_1, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_1, + Mpi2SasIOUnitPage1_t, MPI2_POINTER pMpi2SasIOUnitPage1_t; + +#define MPI2_SASIOUNITPAGE1_PAGEVERSION (0x09) + +/* values for SAS IO Unit Page 1 ControlFlags */ +#define MPI2_SASIOUNIT1_CONTROL_DEVICE_SELF_TEST (0x8000) +#define MPI2_SASIOUNIT1_CONTROL_SATA_3_0_MAX (0x4000) +#define MPI2_SASIOUNIT1_CONTROL_SATA_1_5_MAX (0x2000) +#define MPI2_SASIOUNIT1_CONTROL_SATA_SW_PRESERVE (0x1000) + +#define MPI2_SASIOUNIT1_CONTROL_MASK_DEV_SUPPORT (0x0600) +#define MPI2_SASIOUNIT1_CONTROL_SHIFT_DEV_SUPPORT (9) +#define MPI2_SASIOUNIT1_CONTROL_DEV_SUPPORT_BOTH (0x0) +#define MPI2_SASIOUNIT1_CONTROL_DEV_SAS_SUPPORT (0x1) +#define MPI2_SASIOUNIT1_CONTROL_DEV_SATA_SUPPORT (0x2) + +#define MPI2_SASIOUNIT1_CONTROL_SATA_48BIT_LBA_REQUIRED (0x0080) +#define MPI2_SASIOUNIT1_CONTROL_SATA_SMART_REQUIRED (0x0040) +#define MPI2_SASIOUNIT1_CONTROL_SATA_NCQ_REQUIRED (0x0020) +#define MPI2_SASIOUNIT1_CONTROL_SATA_FUA_REQUIRED (0x0010) +#define MPI2_SASIOUNIT1_CONTROL_TABLE_SUBTRACTIVE_ILLEGAL (0x0008) +#define MPI2_SASIOUNIT1_CONTROL_SUBTRACTIVE_ILLEGAL (0x0004) +#define MPI2_SASIOUNIT1_CONTROL_FIRST_LVL_DISC_ONLY (0x0002) +#define MPI2_SASIOUNIT1_CONTROL_CLEAR_AFFILIATION (0x0001) + +/* values for SAS IO Unit Page 1 AdditionalControlFlags */ +#define MPI2_SASIOUNIT1_ACONTROL_MULTI_PORT_DOMAIN_ILLEGAL (0x0080) +#define MPI2_SASIOUNIT1_ACONTROL_SATA_ASYNCHROUNOUS_NOTIFICATION (0x0040) +#define MPI2_SASIOUNIT1_ACONTROL_INVALID_TOPOLOGY_CORRECTION (0x0020) +#define MPI2_SASIOUNIT1_ACONTROL_PORT_ENABLE_ONLY_SATA_LINK_RESET (0x0010) +#define MPI2_SASIOUNIT1_ACONTROL_OTHER_AFFILIATION_SATA_LINK_RESET (0x0008) +#define MPI2_SASIOUNIT1_ACONTROL_SELF_AFFILIATION_SATA_LINK_RESET (0x0004) +#define MPI2_SASIOUNIT1_ACONTROL_NO_AFFILIATION_SATA_LINK_RESET (0x0002) +#define MPI2_SASIOUNIT1_ACONTROL_ALLOW_TABLE_TO_TABLE (0x0001) + +/* defines for SAS IO Unit Page 1 ReportDeviceMissingDelay */ +#define MPI2_SASIOUNIT1_REPORT_MISSING_TIMEOUT_MASK (0x7F) +#define MPI2_SASIOUNIT1_REPORT_MISSING_UNIT_16 (0x80) + +/* values for SAS IO Unit Page 1 PortFlags */ +#define MPI2_SASIOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG (0x01) + +/* values for SAS IO Unit Page 1 PhyFlags */ +#define MPI2_SASIOUNIT1_PHYFLAGS_ZONING_ENABLE (0x10) +#define MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE (0x08) + +/* values for SAS IO Unit Page 1 MaxMinLinkRate */ +#define MPI2_SASIOUNIT1_MAX_RATE_MASK (0xF0) +#define MPI2_SASIOUNIT1_MAX_RATE_1_5 (0x80) +#define MPI2_SASIOUNIT1_MAX_RATE_3_0 (0x90) +#define MPI2_SASIOUNIT1_MAX_RATE_6_0 (0xA0) +#define MPI25_SASIOUNIT1_MAX_RATE_12_0 (0xB0) +#define MPI2_SASIOUNIT1_MIN_RATE_MASK (0x0F) +#define MPI2_SASIOUNIT1_MIN_RATE_1_5 (0x08) +#define MPI2_SASIOUNIT1_MIN_RATE_3_0 (0x09) +#define MPI2_SASIOUNIT1_MIN_RATE_6_0 (0x0A) +#define MPI25_SASIOUNIT1_MIN_RATE_12_0 (0x0B) + +/* see mpi2_sas.h for values for SAS IO Unit Page 1 ControllerPhyDeviceInfo values */ + + +/* SAS IO Unit Page 4 */ + +typedef struct _MPI2_SAS_IOUNIT4_SPINUP_GROUP +{ + U8 MaxTargetSpinup; /* 0x00 */ + U8 SpinupDelay; /* 0x01 */ + U16 Reserved1; /* 0x02 */ +} MPI2_SAS_IOUNIT4_SPINUP_GROUP, MPI2_POINTER PTR_MPI2_SAS_IOUNIT4_SPINUP_GROUP, + Mpi2SasIOUnit4SpinupGroup_t, MPI2_POINTER pMpi2SasIOUnit4SpinupGroup_t; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_SAS_IOUNIT4_PHY_MAX +#define MPI2_SAS_IOUNIT4_PHY_MAX (4) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_4 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + MPI2_SAS_IOUNIT4_SPINUP_GROUP SpinupGroupParameters[4]; /* 0x08 */ + U32 Reserved1; /* 0x18 */ + U32 Reserved2; /* 0x1C */ + U32 Reserved3; /* 0x20 */ + U8 BootDeviceWaitTime; /* 0x24 */ + U8 Reserved4; /* 0x25 */ + U16 Reserved5; /* 0x26 */ + U8 NumPhys; /* 0x28 */ + U8 PEInitialSpinupDelay; /* 0x29 */ + U8 PEReplyDelay; /* 0x2A */ + U8 Flags; /* 0x2B */ + U8 PHY[MPI2_SAS_IOUNIT4_PHY_MAX]; /* 0x2C */ +} MPI2_CONFIG_PAGE_SASIOUNIT_4, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_4, + Mpi2SasIOUnitPage4_t, MPI2_POINTER pMpi2SasIOUnitPage4_t; + +#define MPI2_SASIOUNITPAGE4_PAGEVERSION (0x02) + +/* defines for Flags field */ +#define MPI2_SASIOUNIT4_FLAGS_AUTO_PORTENABLE (0x01) + +/* defines for PHY field */ +#define MPI2_SASIOUNIT4_PHY_SPINUP_GROUP_MASK (0x03) + + +/* SAS IO Unit Page 5 */ + +typedef struct _MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS +{ + U8 ControlFlags; /* 0x00 */ + U8 PortWidthModGroup; /* 0x01 */ + U16 InactivityTimerExponent; /* 0x02 */ + U8 SATAPartialTimeout; /* 0x04 */ + U8 Reserved2; /* 0x05 */ + U8 SATASlumberTimeout; /* 0x06 */ + U8 Reserved3; /* 0x07 */ + U8 SASPartialTimeout; /* 0x08 */ + U8 Reserved4; /* 0x09 */ + U8 SASSlumberTimeout; /* 0x0A */ + U8 Reserved5; /* 0x0B */ +} MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS, + MPI2_POINTER PTR_MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS, + Mpi2SasIOUnit5PhyPmSettings_t, MPI2_POINTER pMpi2SasIOUnit5PhyPmSettings_t; + +/* defines for ControlFlags field */ +#define MPI2_SASIOUNIT5_CONTROL_SAS_SLUMBER_ENABLE (0x08) +#define MPI2_SASIOUNIT5_CONTROL_SAS_PARTIAL_ENABLE (0x04) +#define MPI2_SASIOUNIT5_CONTROL_SATA_SLUMBER_ENABLE (0x02) +#define MPI2_SASIOUNIT5_CONTROL_SATA_PARTIAL_ENABLE (0x01) + +/* defines for PortWidthModeGroup field */ +#define MPI2_SASIOUNIT5_PWMG_DISABLE (0xFF) + +/* defines for InactivityTimerExponent field */ +#define MPI2_SASIOUNIT5_ITE_MASK_SAS_SLUMBER (0x7000) +#define MPI2_SASIOUNIT5_ITE_SHIFT_SAS_SLUMBER (12) +#define MPI2_SASIOUNIT5_ITE_MASK_SAS_PARTIAL (0x0700) +#define MPI2_SASIOUNIT5_ITE_SHIFT_SAS_PARTIAL (8) +#define MPI2_SASIOUNIT5_ITE_MASK_SATA_SLUMBER (0x0070) +#define MPI2_SASIOUNIT5_ITE_SHIFT_SATA_SLUMBER (4) +#define MPI2_SASIOUNIT5_ITE_MASK_SATA_PARTIAL (0x0007) +#define MPI2_SASIOUNIT5_ITE_SHIFT_SATA_PARTIAL (0) + +#define MPI2_SASIOUNIT5_ITE_TEN_SECONDS (7) +#define MPI2_SASIOUNIT5_ITE_ONE_SECOND (6) +#define MPI2_SASIOUNIT5_ITE_HUNDRED_MILLISECONDS (5) +#define MPI2_SASIOUNIT5_ITE_TEN_MILLISECONDS (4) +#define MPI2_SASIOUNIT5_ITE_ONE_MILLISECOND (3) +#define MPI2_SASIOUNIT5_ITE_HUNDRED_MICROSECONDS (2) +#define MPI2_SASIOUNIT5_ITE_TEN_MICROSECONDS (1) +#define MPI2_SASIOUNIT5_ITE_ONE_MICROSECOND (0) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhys at runtime. + */ +#ifndef MPI2_SAS_IOUNIT5_PHY_MAX +#define MPI2_SAS_IOUNIT5_PHY_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_5 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 NumPhys; /* 0x08 */ + U8 Reserved1; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U32 Reserved3; /* 0x0C */ + MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS SASPhyPowerManagementSettings[MPI2_SAS_IOUNIT5_PHY_MAX]; /* 0x10 */ +} MPI2_CONFIG_PAGE_SASIOUNIT_5, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_5, + Mpi2SasIOUnitPage5_t, MPI2_POINTER pMpi2SasIOUnitPage5_t; + +#define MPI2_SASIOUNITPAGE5_PAGEVERSION (0x01) + + +/* SAS IO Unit Page 6 */ + +typedef struct _MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS +{ + U8 CurrentStatus; /* 0x00 */ + U8 CurrentModulation; /* 0x01 */ + U8 CurrentUtilization; /* 0x02 */ + U8 Reserved1; /* 0x03 */ + U32 Reserved2; /* 0x04 */ +} MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS, + MPI2_POINTER PTR_MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS, + Mpi2SasIOUnit6PortWidthModGroupStatus_t, + MPI2_POINTER pMpi2SasIOUnit6PortWidthModGroupStatus_t; + +/* defines for CurrentStatus field */ +#define MPI2_SASIOUNIT6_STATUS_UNAVAILABLE (0x00) +#define MPI2_SASIOUNIT6_STATUS_UNCONFIGURED (0x01) +#define MPI2_SASIOUNIT6_STATUS_INVALID_CONFIG (0x02) +#define MPI2_SASIOUNIT6_STATUS_LINK_DOWN (0x03) +#define MPI2_SASIOUNIT6_STATUS_OBSERVATION_ONLY (0x04) +#define MPI2_SASIOUNIT6_STATUS_INACTIVE (0x05) +#define MPI2_SASIOUNIT6_STATUS_ACTIVE_IOUNIT (0x06) +#define MPI2_SASIOUNIT6_STATUS_ACTIVE_HOST (0x07) + +/* defines for CurrentModulation field */ +#define MPI2_SASIOUNIT6_MODULATION_25_PERCENT (0x00) +#define MPI2_SASIOUNIT6_MODULATION_50_PERCENT (0x01) +#define MPI2_SASIOUNIT6_MODULATION_75_PERCENT (0x02) +#define MPI2_SASIOUNIT6_MODULATION_100_PERCENT (0x03) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumGroups at runtime. + */ +#ifndef MPI2_SAS_IOUNIT6_GROUP_MAX +#define MPI2_SAS_IOUNIT6_GROUP_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_6 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U32 Reserved2; /* 0x0C */ + U8 NumGroups; /* 0x10 */ + U8 Reserved3; /* 0x11 */ + U16 Reserved4; /* 0x12 */ + MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS + PortWidthModulationGroupStatus[MPI2_SAS_IOUNIT6_GROUP_MAX]; /* 0x14 */ +} MPI2_CONFIG_PAGE_SASIOUNIT_6, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_6, + Mpi2SasIOUnitPage6_t, MPI2_POINTER pMpi2SasIOUnitPage6_t; + +#define MPI2_SASIOUNITPAGE6_PAGEVERSION (0x00) + + +/* SAS IO Unit Page 7 */ + +typedef struct _MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS +{ + U8 Flags; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U8 Threshold75Pct; /* 0x04 */ + U8 Threshold50Pct; /* 0x05 */ + U8 Threshold25Pct; /* 0x06 */ + U8 Reserved3; /* 0x07 */ +} MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS, + MPI2_POINTER PTR_MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS, + Mpi2SasIOUnit7PortWidthModGroupSettings_t, + MPI2_POINTER pMpi2SasIOUnit7PortWidthModGroupSettings_t; + +/* defines for Flags field */ +#define MPI2_SASIOUNIT7_FLAGS_ENABLE_PORT_WIDTH_MODULATION (0x01) + + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumGroups at runtime. + */ +#ifndef MPI2_SAS_IOUNIT7_GROUP_MAX +#define MPI2_SAS_IOUNIT7_GROUP_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_7 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 SamplingInterval; /* 0x08 */ + U8 WindowLength; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U32 Reserved2; /* 0x0C */ + U32 Reserved3; /* 0x10 */ + U8 NumGroups; /* 0x14 */ + U8 Reserved4; /* 0x15 */ + U16 Reserved5; /* 0x16 */ + MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS + PortWidthModulationGroupSettings[MPI2_SAS_IOUNIT7_GROUP_MAX]; /* 0x18 */ +} MPI2_CONFIG_PAGE_SASIOUNIT_7, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_7, + Mpi2SasIOUnitPage7_t, MPI2_POINTER pMpi2SasIOUnitPage7_t; + +#define MPI2_SASIOUNITPAGE7_PAGEVERSION (0x00) + + +/* SAS IO Unit Page 8 */ + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_8 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U32 PowerManagementCapabilities; /* 0x0C */ + U8 TxRxSleepStatus; /* 0x10 */ /* reserved in MPI 2.0 */ + U8 Reserved2; /* 0x11 */ + U16 Reserved3; /* 0x12 */ +} MPI2_CONFIG_PAGE_SASIOUNIT_8, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT_8, + Mpi2SasIOUnitPage8_t, MPI2_POINTER pMpi2SasIOUnitPage8_t; + +#define MPI2_SASIOUNITPAGE8_PAGEVERSION (0x00) + +/* defines for PowerManagementCapabilities field */ +#define MPI2_SASIOUNIT8_PM_HOST_PORT_WIDTH_MOD (0x00001000) +#define MPI2_SASIOUNIT8_PM_HOST_SAS_SLUMBER_MODE (0x00000800) +#define MPI2_SASIOUNIT8_PM_HOST_SAS_PARTIAL_MODE (0x00000400) +#define MPI2_SASIOUNIT8_PM_HOST_SATA_SLUMBER_MODE (0x00000200) +#define MPI2_SASIOUNIT8_PM_HOST_SATA_PARTIAL_MODE (0x00000100) +#define MPI2_SASIOUNIT8_PM_IOUNIT_PORT_WIDTH_MOD (0x00000010) +#define MPI2_SASIOUNIT8_PM_IOUNIT_SAS_SLUMBER_MODE (0x00000008) +#define MPI2_SASIOUNIT8_PM_IOUNIT_SAS_PARTIAL_MODE (0x00000004) +#define MPI2_SASIOUNIT8_PM_IOUNIT_SATA_SLUMBER_MODE (0x00000002) +#define MPI2_SASIOUNIT8_PM_IOUNIT_SATA_PARTIAL_MODE (0x00000001) + +/* defines for TxRxSleepStatus field */ +#define MPI25_SASIOUNIT8_TXRXSLEEP_UNSUPPORTED (0x00) +#define MPI25_SASIOUNIT8_TXRXSLEEP_DISENGAGED (0x01) +#define MPI25_SASIOUNIT8_TXRXSLEEP_ACTIVE (0x02) +#define MPI25_SASIOUNIT8_TXRXSLEEP_SHUTDOWN (0x03) + + + +/* SAS IO Unit Page 16 */ + +typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT16 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U64 TimeStamp; /* 0x08 */ + U32 Reserved1; /* 0x10 */ + U32 Reserved2; /* 0x14 */ + U32 FastPathPendedRequests; /* 0x18 */ + U32 FastPathUnPendedRequests; /* 0x1C */ + U32 FastPathHostRequestStarts; /* 0x20 */ + U32 FastPathFirmwareRequestStarts; /* 0x24 */ + U32 FastPathHostCompletions; /* 0x28 */ + U32 FastPathFirmwareCompletions; /* 0x2C */ + U32 NonFastPathRequestStarts; /* 0x30 */ + U32 NonFastPathHostCompletions; /* 0x30 */ +} MPI2_CONFIG_PAGE_SASIOUNIT16, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SASIOUNIT16, + Mpi2SasIOUnitPage16_t, MPI2_POINTER pMpi2SasIOUnitPage16_t; + +#define MPI2_SASIOUNITPAGE16_PAGEVERSION (0x00) + + +/**************************************************************************** +* SAS Expander Config Pages +****************************************************************************/ + +/* SAS Expander Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_EXPANDER_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 PhysicalPort; /* 0x08 */ + U8 ReportGenLength; /* 0x09 */ + U16 EnclosureHandle; /* 0x0A */ + U64 SASAddress; /* 0x0C */ + U32 DiscoveryStatus; /* 0x14 */ + U16 DevHandle; /* 0x18 */ + U16 ParentDevHandle; /* 0x1A */ + U16 ExpanderChangeCount; /* 0x1C */ + U16 ExpanderRouteIndexes; /* 0x1E */ + U8 NumPhys; /* 0x20 */ + U8 SASLevel; /* 0x21 */ + U16 Flags; /* 0x22 */ + U16 STPBusInactivityTimeLimit; /* 0x24 */ + U16 STPMaxConnectTimeLimit; /* 0x26 */ + U16 STP_SMP_NexusLossTime; /* 0x28 */ + U16 MaxNumRoutedSasAddresses; /* 0x2A */ + U64 ActiveZoneManagerSASAddress;/* 0x2C */ + U16 ZoneLockInactivityLimit; /* 0x34 */ + U16 Reserved1; /* 0x36 */ + U8 TimeToReducedFunc; /* 0x38 */ + U8 InitialTimeToReducedFunc; /* 0x39 */ + U8 MaxReducedFuncTime; /* 0x3A */ + U8 Reserved2; /* 0x3B */ +} MPI2_CONFIG_PAGE_EXPANDER_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_EXPANDER_0, + Mpi2ExpanderPage0_t, MPI2_POINTER pMpi2ExpanderPage0_t; + +#define MPI2_SASEXPANDER0_PAGEVERSION (0x06) + +/* values for SAS Expander Page 0 DiscoveryStatus field */ +#define MPI2_SAS_EXPANDER0_DS_MAX_ENCLOSURES_EXCEED (0x80000000) +#define MPI2_SAS_EXPANDER0_DS_MAX_EXPANDERS_EXCEED (0x40000000) +#define MPI2_SAS_EXPANDER0_DS_MAX_DEVICES_EXCEED (0x20000000) +#define MPI2_SAS_EXPANDER0_DS_MAX_TOPO_PHYS_EXCEED (0x10000000) +#define MPI2_SAS_EXPANDER0_DS_DOWNSTREAM_INITIATOR (0x08000000) +#define MPI2_SAS_EXPANDER0_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE (0x00008000) +#define MPI2_SAS_EXPANDER0_DS_EXP_MULTI_SUBTRACTIVE (0x00004000) +#define MPI2_SAS_EXPANDER0_DS_MULTI_PORT_DOMAIN (0x00002000) +#define MPI2_SAS_EXPANDER0_DS_TABLE_TO_SUBTRACTIVE_LINK (0x00001000) +#define MPI2_SAS_EXPANDER0_DS_UNSUPPORTED_DEVICE (0x00000800) +#define MPI2_SAS_EXPANDER0_DS_TABLE_LINK (0x00000400) +#define MPI2_SAS_EXPANDER0_DS_SUBTRACTIVE_LINK (0x00000200) +#define MPI2_SAS_EXPANDER0_DS_SMP_CRC_ERROR (0x00000100) +#define MPI2_SAS_EXPANDER0_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI2_SAS_EXPANDER0_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI2_SAS_EXPANDER0_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI2_SAS_EXPANDER0_DS_SMP_TIMEOUT (0x00000010) +#define MPI2_SAS_EXPANDER0_DS_MULTIPLE_PORTS (0x00000004) +#define MPI2_SAS_EXPANDER0_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI2_SAS_EXPANDER0_DS_LOOP_DETECTED (0x00000001) + +/* values for SAS Expander Page 0 Flags field */ +#define MPI2_SAS_EXPANDER0_FLAGS_REDUCED_FUNCTIONALITY (0x2000) +#define MPI2_SAS_EXPANDER0_FLAGS_ZONE_LOCKED (0x1000) +#define MPI2_SAS_EXPANDER0_FLAGS_SUPPORTED_PHYSICAL_PRES (0x0800) +#define MPI2_SAS_EXPANDER0_FLAGS_ASSERTED_PHYSICAL_PRES (0x0400) +#define MPI2_SAS_EXPANDER0_FLAGS_ZONING_SUPPORT (0x0200) +#define MPI2_SAS_EXPANDER0_FLAGS_ENABLED_ZONING (0x0100) +#define MPI2_SAS_EXPANDER0_FLAGS_TABLE_TO_TABLE_SUPPORT (0x0080) +#define MPI2_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE (0x0010) +#define MPI2_SAS_EXPANDER0_FLAGS_OTHERS_CONFIG (0x0004) +#define MPI2_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS (0x0002) +#define MPI2_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG (0x0001) + + +/* SAS Expander Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_EXPANDER_1 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 PhysicalPort; /* 0x08 */ + U8 Reserved1; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U8 NumPhys; /* 0x0C */ + U8 Phy; /* 0x0D */ + U16 NumTableEntriesProgrammed; /* 0x0E */ + U8 ProgrammedLinkRate; /* 0x10 */ + U8 HwLinkRate; /* 0x11 */ + U16 AttachedDevHandle; /* 0x12 */ + U32 PhyInfo; /* 0x14 */ + U32 AttachedDeviceInfo; /* 0x18 */ + U16 ExpanderDevHandle; /* 0x1C */ + U8 ChangeCount; /* 0x1E */ + U8 NegotiatedLinkRate; /* 0x1F */ + U8 PhyIdentifier; /* 0x20 */ + U8 AttachedPhyIdentifier; /* 0x21 */ + U8 Reserved3; /* 0x22 */ + U8 DiscoveryInfo; /* 0x23 */ + U32 AttachedPhyInfo; /* 0x24 */ + U8 ZoneGroup; /* 0x28 */ + U8 SelfConfigStatus; /* 0x29 */ + U16 Reserved4; /* 0x2A */ +} MPI2_CONFIG_PAGE_EXPANDER_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_EXPANDER_1, + Mpi2ExpanderPage1_t, MPI2_POINTER pMpi2ExpanderPage1_t; + +#define MPI2_SASEXPANDER1_PAGEVERSION (0x02) + +/* use MPI2_SAS_PRATE_ defines for the ProgrammedLinkRate field */ + +/* use MPI2_SAS_HWRATE_ defines for the HwLinkRate field */ + +/* use MPI2_SAS_PHYINFO_ for the PhyInfo field */ + +/* see mpi2_sas.h for the MPI2_SAS_DEVICE_INFO_ defines used for the AttachedDeviceInfo field */ + +/* use MPI2_SAS_NEG_LINK_RATE_ defines for the NegotiatedLinkRate field */ + +/* use MPI2_SAS_APHYINFO_ defines for AttachedPhyInfo field */ + +/* values for SAS Expander Page 1 DiscoveryInfo field */ +#define MPI2_SAS_EXPANDER1_DISCINFO_BAD_PHY_DISABLED (0x04) +#define MPI2_SAS_EXPANDER1_DISCINFO_LINK_STATUS_CHANGE (0x02) +#define MPI2_SAS_EXPANDER1_DISCINFO_NO_ROUTING_ENTRIES (0x01) + + +/**************************************************************************** +* SAS Device Config Pages +****************************************************************************/ + +/* SAS Device Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_DEV_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U16 Slot; /* 0x08 */ + U16 EnclosureHandle; /* 0x0A */ + U64 SASAddress; /* 0x0C */ + U16 ParentDevHandle; /* 0x14 */ + U8 PhyNum; /* 0x16 */ + U8 AccessStatus; /* 0x17 */ + U16 DevHandle; /* 0x18 */ + U8 AttachedPhyIdentifier; /* 0x1A */ + U8 ZoneGroup; /* 0x1B */ + U32 DeviceInfo; /* 0x1C */ + U16 Flags; /* 0x20 */ + U8 PhysicalPort; /* 0x22 */ + U8 MaxPortConnections; /* 0x23 */ + U64 DeviceName; /* 0x24 */ + U8 PortGroups; /* 0x2C */ + U8 DmaGroup; /* 0x2D */ + U8 ControlGroup; /* 0x2E */ + U8 Reserved1; /* 0x2F */ + U32 Reserved2; /* 0x30 */ + U32 Reserved3; /* 0x34 */ +} MPI2_CONFIG_PAGE_SAS_DEV_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_DEV_0, + Mpi2SasDevicePage0_t, MPI2_POINTER pMpi2SasDevicePage0_t; + +#define MPI2_SASDEVICE0_PAGEVERSION (0x08) + +/* values for SAS Device Page 0 AccessStatus field */ +#define MPI2_SAS_DEVICE0_ASTATUS_NO_ERRORS (0x00) +#define MPI2_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED (0x01) +#define MPI2_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED (0x02) +#define MPI2_SAS_DEVICE0_ASTATUS_SATA_AFFILIATION_CONFLICT (0x03) +#define MPI2_SAS_DEVICE0_ASTATUS_SATA_NEEDS_INITIALIZATION (0x04) +#define MPI2_SAS_DEVICE0_ASTATUS_ROUTE_NOT_ADDRESSABLE (0x05) +#define MPI2_SAS_DEVICE0_ASTATUS_SMP_ERROR_NOT_ADDRESSABLE (0x06) +#define MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED (0x07) +/* specific values for SATA Init failures */ +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_UNKNOWN (0x10) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_AFFILIATION_CONFLICT (0x11) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_DIAG (0x12) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_IDENTIFICATION (0x13) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_CHECK_POWER (0x14) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_PIO_SN (0x15) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_MDMA_SN (0x16) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_UDMA_SN (0x17) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_ZONING_VIOLATION (0x18) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_NOT_ADDRESSABLE (0x19) +#define MPI2_SAS_DEVICE0_ASTATUS_SIF_MAX (0x1F) + +/* see mpi2_sas.h for values for SAS Device Page 0 DeviceInfo values */ + +/* values for SAS Device Page 0 Flags field */ +#define MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH (0x4000) +#define MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE (0x2000) +#define MPI2_SAS_DEVICE0_FLAGS_SLUMBER_PM_CAPABLE (0x1000) +#define MPI2_SAS_DEVICE0_FLAGS_PARTIAL_PM_CAPABLE (0x0800) +#define MPI2_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY (0x0400) +#define MPI2_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE (0x0200) +#define MPI2_SAS_DEVICE0_FLAGS_UNSUPPORTED_DEVICE (0x0100) +#define MPI2_SAS_DEVICE0_FLAGS_SATA_48BIT_LBA_SUPPORTED (0x0080) +#define MPI2_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED (0x0040) +#define MPI2_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED (0x0020) +#define MPI2_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED (0x0010) +#define MPI2_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH (0x0008) +#define MPI2_SAS_DEVICE0_FLAGS_DEVICE_PRESENT (0x0001) + + +/* SAS Device Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_DEV_1 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U64 SASAddress; /* 0x0C */ + U32 Reserved2; /* 0x14 */ + U16 DevHandle; /* 0x18 */ + U16 Reserved3; /* 0x1A */ + U8 InitialRegDeviceFIS[20];/* 0x1C */ +} MPI2_CONFIG_PAGE_SAS_DEV_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_DEV_1, + Mpi2SasDevicePage1_t, MPI2_POINTER pMpi2SasDevicePage1_t; + +#define MPI2_SASDEVICE1_PAGEVERSION (0x01) + + +/**************************************************************************** +* SAS PHY Config Pages +****************************************************************************/ + +/* SAS PHY Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U16 OwnerDevHandle; /* 0x08 */ + U16 Reserved1; /* 0x0A */ + U16 AttachedDevHandle; /* 0x0C */ + U8 AttachedPhyIdentifier; /* 0x0E */ + U8 Reserved2; /* 0x0F */ + U32 AttachedPhyInfo; /* 0x10 */ + U8 ProgrammedLinkRate; /* 0x14 */ + U8 HwLinkRate; /* 0x15 */ + U8 ChangeCount; /* 0x16 */ + U8 Flags; /* 0x17 */ + U32 PhyInfo; /* 0x18 */ + U8 NegotiatedLinkRate; /* 0x1C */ + U8 Reserved3; /* 0x1D */ + U16 Reserved4; /* 0x1E */ +} MPI2_CONFIG_PAGE_SAS_PHY_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_0, + Mpi2SasPhyPage0_t, MPI2_POINTER pMpi2SasPhyPage0_t; + +#define MPI2_SASPHY0_PAGEVERSION (0x03) + +/* use MPI2_SAS_PRATE_ defines for the ProgrammedLinkRate field */ + +/* use MPI2_SAS_HWRATE_ defines for the HwLinkRate field */ + +/* values for SAS PHY Page 0 Flags field */ +#define MPI2_SAS_PHY0_FLAGS_SGPIO_DIRECT_ATTACH_ENC (0x01) + +/* use MPI2_SAS_APHYINFO_ defines for AttachedPhyInfo field */ + +/* use MPI2_SAS_NEG_LINK_RATE_ defines for the NegotiatedLinkRate field */ + +/* use MPI2_SAS_PHYINFO_ for the PhyInfo field */ + + +/* SAS PHY Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_1 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U32 InvalidDwordCount; /* 0x0C */ + U32 RunningDisparityErrorCount; /* 0x10 */ + U32 LossDwordSynchCount; /* 0x14 */ + U32 PhyResetProblemCount; /* 0x18 */ +} MPI2_CONFIG_PAGE_SAS_PHY_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_1, + Mpi2SasPhyPage1_t, MPI2_POINTER pMpi2SasPhyPage1_t; + +#define MPI2_SASPHY1_PAGEVERSION (0x01) + + +/* SAS PHY Page 2 */ + +typedef struct _MPI2_SASPHY2_PHY_EVENT +{ + U8 PhyEventCode; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U32 PhyEventInfo; /* 0x04 */ +} MPI2_SASPHY2_PHY_EVENT, MPI2_POINTER PTR_MPI2_SASPHY2_PHY_EVENT, + Mpi2SasPhy2PhyEvent_t, MPI2_POINTER pMpi2SasPhy2PhyEvent_t; + +/* use MPI2_SASPHY3_EVENT_CODE_ for the PhyEventCode field */ + + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhyEvents at runtime. + */ +#ifndef MPI2_SASPHY2_PHY_EVENT_MAX +#define MPI2_SASPHY2_PHY_EVENT_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_2 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U8 NumPhyEvents; /* 0x0C */ + U8 Reserved2; /* 0x0D */ + U16 Reserved3; /* 0x0E */ + MPI2_SASPHY2_PHY_EVENT PhyEvent[MPI2_SASPHY2_PHY_EVENT_MAX]; /* 0x10 */ +} MPI2_CONFIG_PAGE_SAS_PHY_2, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_2, + Mpi2SasPhyPage2_t, MPI2_POINTER pMpi2SasPhyPage2_t; + +#define MPI2_SASPHY2_PAGEVERSION (0x00) + + +/* SAS PHY Page 3 */ + +typedef struct _MPI2_SASPHY3_PHY_EVENT_CONFIG +{ + U8 PhyEventCode; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U8 CounterType; /* 0x04 */ + U8 ThresholdWindow; /* 0x05 */ + U8 TimeUnits; /* 0x06 */ + U8 Reserved3; /* 0x07 */ + U32 EventThreshold; /* 0x08 */ + U16 ThresholdFlags; /* 0x0C */ + U16 Reserved4; /* 0x0E */ +} MPI2_SASPHY3_PHY_EVENT_CONFIG, MPI2_POINTER PTR_MPI2_SASPHY3_PHY_EVENT_CONFIG, + Mpi2SasPhy3PhyEventConfig_t, MPI2_POINTER pMpi2SasPhy3PhyEventConfig_t; + +/* values for PhyEventCode field */ +#define MPI2_SASPHY3_EVENT_CODE_NO_EVENT (0x00) +#define MPI2_SASPHY3_EVENT_CODE_INVALID_DWORD (0x01) +#define MPI2_SASPHY3_EVENT_CODE_RUNNING_DISPARITY_ERROR (0x02) +#define MPI2_SASPHY3_EVENT_CODE_LOSS_DWORD_SYNC (0x03) +#define MPI2_SASPHY3_EVENT_CODE_PHY_RESET_PROBLEM (0x04) +#define MPI2_SASPHY3_EVENT_CODE_ELASTICITY_BUF_OVERFLOW (0x05) +#define MPI2_SASPHY3_EVENT_CODE_RX_ERROR (0x06) +#define MPI2_SASPHY3_EVENT_CODE_RX_ADDR_FRAME_ERROR (0x20) +#define MPI2_SASPHY3_EVENT_CODE_TX_AC_OPEN_REJECT (0x21) +#define MPI2_SASPHY3_EVENT_CODE_RX_AC_OPEN_REJECT (0x22) +#define MPI2_SASPHY3_EVENT_CODE_TX_RC_OPEN_REJECT (0x23) +#define MPI2_SASPHY3_EVENT_CODE_RX_RC_OPEN_REJECT (0x24) +#define MPI2_SASPHY3_EVENT_CODE_RX_AIP_PARTIAL_WAITING_ON (0x25) +#define MPI2_SASPHY3_EVENT_CODE_RX_AIP_CONNECT_WAITING_ON (0x26) +#define MPI2_SASPHY3_EVENT_CODE_TX_BREAK (0x27) +#define MPI2_SASPHY3_EVENT_CODE_RX_BREAK (0x28) +#define MPI2_SASPHY3_EVENT_CODE_BREAK_TIMEOUT (0x29) +#define MPI2_SASPHY3_EVENT_CODE_CONNECTION (0x2A) +#define MPI2_SASPHY3_EVENT_CODE_PEAKTX_PATHWAY_BLOCKED (0x2B) +#define MPI2_SASPHY3_EVENT_CODE_PEAKTX_ARB_WAIT_TIME (0x2C) +#define MPI2_SASPHY3_EVENT_CODE_PEAK_ARB_WAIT_TIME (0x2D) +#define MPI2_SASPHY3_EVENT_CODE_PEAK_CONNECT_TIME (0x2E) +#define MPI2_SASPHY3_EVENT_CODE_TX_SSP_FRAMES (0x40) +#define MPI2_SASPHY3_EVENT_CODE_RX_SSP_FRAMES (0x41) +#define MPI2_SASPHY3_EVENT_CODE_TX_SSP_ERROR_FRAMES (0x42) +#define MPI2_SASPHY3_EVENT_CODE_RX_SSP_ERROR_FRAMES (0x43) +#define MPI2_SASPHY3_EVENT_CODE_TX_CREDIT_BLOCKED (0x44) +#define MPI2_SASPHY3_EVENT_CODE_RX_CREDIT_BLOCKED (0x45) +#define MPI2_SASPHY3_EVENT_CODE_TX_SATA_FRAMES (0x50) +#define MPI2_SASPHY3_EVENT_CODE_RX_SATA_FRAMES (0x51) +#define MPI2_SASPHY3_EVENT_CODE_SATA_OVERFLOW (0x52) +#define MPI2_SASPHY3_EVENT_CODE_TX_SMP_FRAMES (0x60) +#define MPI2_SASPHY3_EVENT_CODE_RX_SMP_FRAMES (0x61) +#define MPI2_SASPHY3_EVENT_CODE_RX_SMP_ERROR_FRAMES (0x63) +#define MPI2_SASPHY3_EVENT_CODE_HOTPLUG_TIMEOUT (0xD0) +#define MPI2_SASPHY3_EVENT_CODE_MISALIGNED_MUX_PRIMITIVE (0xD1) +#define MPI2_SASPHY3_EVENT_CODE_RX_AIP (0xD2) + +/* values for the CounterType field */ +#define MPI2_SASPHY3_COUNTER_TYPE_WRAPPING (0x00) +#define MPI2_SASPHY3_COUNTER_TYPE_SATURATING (0x01) +#define MPI2_SASPHY3_COUNTER_TYPE_PEAK_VALUE (0x02) + +/* values for the TimeUnits field */ +#define MPI2_SASPHY3_TIME_UNITS_10_MICROSECONDS (0x00) +#define MPI2_SASPHY3_TIME_UNITS_100_MICROSECONDS (0x01) +#define MPI2_SASPHY3_TIME_UNITS_1_MILLISECOND (0x02) +#define MPI2_SASPHY3_TIME_UNITS_10_MILLISECONDS (0x03) + +/* values for the ThresholdFlags field */ +#define MPI2_SASPHY3_TFLAGS_PHY_RESET (0x0002) +#define MPI2_SASPHY3_TFLAGS_EVENT_NOTIFY (0x0001) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumPhyEvents at runtime. + */ +#ifndef MPI2_SASPHY3_PHY_EVENT_MAX +#define MPI2_SASPHY3_PHY_EVENT_MAX (1) +#endif + +typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_3 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U8 NumPhyEvents; /* 0x0C */ + U8 Reserved2; /* 0x0D */ + U16 Reserved3; /* 0x0E */ + MPI2_SASPHY3_PHY_EVENT_CONFIG PhyEventConfig[MPI2_SASPHY3_PHY_EVENT_MAX]; /* 0x10 */ +} MPI2_CONFIG_PAGE_SAS_PHY_3, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_3, + Mpi2SasPhyPage3_t, MPI2_POINTER pMpi2SasPhyPage3_t; + +#define MPI2_SASPHY3_PAGEVERSION (0x00) + + +/* SAS PHY Page 4 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_4 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U16 Reserved1; /* 0x08 */ + U8 Reserved2; /* 0x0A */ + U8 Flags; /* 0x0B */ + U8 InitialFrame[28]; /* 0x0C */ +} MPI2_CONFIG_PAGE_SAS_PHY_4, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PHY_4, + Mpi2SasPhyPage4_t, MPI2_POINTER pMpi2SasPhyPage4_t; + +#define MPI2_SASPHY4_PAGEVERSION (0x00) + +/* values for the Flags field */ +#define MPI2_SASPHY4_FLAGS_FRAME_VALID (0x02) +#define MPI2_SASPHY4_FLAGS_SATA_FRAME (0x01) + + + + +/**************************************************************************** +* SAS Port Config Pages +****************************************************************************/ + +/* SAS Port Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_PORT_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 PortNumber; /* 0x08 */ + U8 PhysicalPort; /* 0x09 */ + U8 PortWidth; /* 0x0A */ + U8 PhysicalPortWidth; /* 0x0B */ + U8 ZoneGroup; /* 0x0C */ + U8 Reserved1; /* 0x0D */ + U16 Reserved2; /* 0x0E */ + U64 SASAddress; /* 0x10 */ + U32 DeviceInfo; /* 0x18 */ + U32 Reserved3; /* 0x1C */ + U32 Reserved4; /* 0x20 */ +} MPI2_CONFIG_PAGE_SAS_PORT_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_PORT_0, + Mpi2SasPortPage0_t, MPI2_POINTER pMpi2SasPortPage0_t; + +#define MPI2_SASPORT0_PAGEVERSION (0x00) + +/* see mpi2_sas.h for values for SAS Port Page 0 DeviceInfo values */ + + +/**************************************************************************** +* SAS Enclosure Config Pages +****************************************************************************/ + +/* SAS Enclosure Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U64 EnclosureLogicalID; /* 0x0C */ + U16 Flags; /* 0x14 */ + U16 EnclosureHandle; /* 0x16 */ + U16 NumSlots; /* 0x18 */ + U16 StartSlot; /* 0x1A */ + U16 Reserved2; /* 0x1C */ + U16 SEPDevHandle; /* 0x1E */ + U32 Reserved3; /* 0x20 */ + U32 Reserved4; /* 0x24 */ +} MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0, + Mpi2SasEnclosurePage0_t, MPI2_POINTER pMpi2SasEnclosurePage0_t; + +#define MPI2_SASENCLOSURE0_PAGEVERSION (0x03) + +/* values for SAS Enclosure Page 0 Flags field */ +#define MPI2_SAS_ENCLS0_FLAGS_MNG_MASK (0x000F) +#define MPI2_SAS_ENCLS0_FLAGS_MNG_UNKNOWN (0x0000) +#define MPI2_SAS_ENCLS0_FLAGS_MNG_IOC_SES (0x0001) +#define MPI2_SAS_ENCLS0_FLAGS_MNG_IOC_SGPIO (0x0002) +#define MPI2_SAS_ENCLS0_FLAGS_MNG_EXP_SGPIO (0x0003) +#define MPI2_SAS_ENCLS0_FLAGS_MNG_SES_ENCLOSURE (0x0004) +#define MPI2_SAS_ENCLS0_FLAGS_MNG_IOC_GPIO (0x0005) + + +/**************************************************************************** +* Log Config Page +****************************************************************************/ + +/* Log Page 0 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumLogEntries at runtime. + */ +#ifndef MPI2_LOG_0_NUM_LOG_ENTRIES +#define MPI2_LOG_0_NUM_LOG_ENTRIES (1) +#endif + +#define MPI2_LOG_0_LOG_DATA_LENGTH (0x1C) + +typedef struct _MPI2_LOG_0_ENTRY +{ + U64 TimeStamp; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U16 LogSequence; /* 0x0C */ + U16 LogEntryQualifier; /* 0x0E */ + U8 VP_ID; /* 0x10 */ + U8 VF_ID; /* 0x11 */ + U16 Reserved2; /* 0x12 */ + U8 LogData[MPI2_LOG_0_LOG_DATA_LENGTH];/* 0x14 */ +} MPI2_LOG_0_ENTRY, MPI2_POINTER PTR_MPI2_LOG_0_ENTRY, + Mpi2Log0Entry_t, MPI2_POINTER pMpi2Log0Entry_t; + +/* values for Log Page 0 LogEntry LogEntryQualifier field */ +#define MPI2_LOG_0_ENTRY_QUAL_ENTRY_UNUSED (0x0000) +#define MPI2_LOG_0_ENTRY_QUAL_POWER_ON_RESET (0x0001) +#define MPI2_LOG_0_ENTRY_QUAL_TIMESTAMP_UPDATE (0x0002) +#define MPI2_LOG_0_ENTRY_QUAL_MIN_IMPLEMENT_SPEC (0x8000) +#define MPI2_LOG_0_ENTRY_QUAL_MAX_IMPLEMENT_SPEC (0xFFFF) + +typedef struct _MPI2_CONFIG_PAGE_LOG_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U32 Reserved2; /* 0x0C */ + U16 NumLogEntries; /* 0x10 */ + U16 Reserved3; /* 0x12 */ + MPI2_LOG_0_ENTRY LogEntry[MPI2_LOG_0_NUM_LOG_ENTRIES]; /* 0x14 */ +} MPI2_CONFIG_PAGE_LOG_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_LOG_0, + Mpi2LogPage0_t, MPI2_POINTER pMpi2LogPage0_t; + +#define MPI2_LOG_0_PAGEVERSION (0x02) + + +/**************************************************************************** +* RAID Config Page +****************************************************************************/ + +/* RAID Page 0 */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check the value returned for NumElements at runtime. + */ +#ifndef MPI2_RAIDCONFIG0_MAX_ELEMENTS +#define MPI2_RAIDCONFIG0_MAX_ELEMENTS (1) +#endif + +typedef struct _MPI2_RAIDCONFIG0_CONFIG_ELEMENT +{ + U16 ElementFlags; /* 0x00 */ + U16 VolDevHandle; /* 0x02 */ + U8 HotSparePool; /* 0x04 */ + U8 PhysDiskNum; /* 0x05 */ + U16 PhysDiskDevHandle; /* 0x06 */ +} MPI2_RAIDCONFIG0_CONFIG_ELEMENT, + MPI2_POINTER PTR_MPI2_RAIDCONFIG0_CONFIG_ELEMENT, + Mpi2RaidConfig0ConfigElement_t, MPI2_POINTER pMpi2RaidConfig0ConfigElement_t; + +/* values for the ElementFlags field */ +#define MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE (0x000F) +#define MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT (0x0000) +#define MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT (0x0001) +#define MPI2_RAIDCONFIG0_EFLAGS_HOT_SPARE_ELEMENT (0x0002) +#define MPI2_RAIDCONFIG0_EFLAGS_OCE_ELEMENT (0x0003) + + +typedef struct _MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 NumHotSpares; /* 0x08 */ + U8 NumPhysDisks; /* 0x09 */ + U8 NumVolumes; /* 0x0A */ + U8 ConfigNum; /* 0x0B */ + U32 Flags; /* 0x0C */ + U8 ConfigGUID[24]; /* 0x10 */ + U32 Reserved1; /* 0x28 */ + U8 NumElements; /* 0x2C */ + U8 Reserved2; /* 0x2D */ + U16 Reserved3; /* 0x2E */ + MPI2_RAIDCONFIG0_CONFIG_ELEMENT ConfigElement[MPI2_RAIDCONFIG0_MAX_ELEMENTS]; /* 0x30 */ +} MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0, + Mpi2RaidConfigurationPage0_t, MPI2_POINTER pMpi2RaidConfigurationPage0_t; + +#define MPI2_RAIDCONFIG0_PAGEVERSION (0x00) + +/* values for RAID Configuration Page 0 Flags field */ +#define MPI2_RAIDCONFIG0_FLAG_FOREIGN_CONFIG (0x00000001) + + +/**************************************************************************** +* Driver Persistent Mapping Config Pages +****************************************************************************/ + +/* Driver Persistent Mapping Page 0 */ + +typedef struct _MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY +{ + U64 PhysicalIdentifier; /* 0x00 */ + U16 MappingInformation; /* 0x08 */ + U16 DeviceIndex; /* 0x0A */ + U32 PhysicalBitsMapping; /* 0x0C */ + U32 Reserved1; /* 0x10 */ +} MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY, + Mpi2DriverMap0Entry_t, MPI2_POINTER pMpi2DriverMap0Entry_t; + +typedef struct _MPI2_CONFIG_PAGE_DRIVER_MAPPING_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + MPI2_CONFIG_PAGE_DRIVER_MAP0_ENTRY Entry; /* 0x08 */ +} MPI2_CONFIG_PAGE_DRIVER_MAPPING_0, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_DRIVER_MAPPING_0, + Mpi2DriverMappingPage0_t, MPI2_POINTER pMpi2DriverMappingPage0_t; + +#define MPI2_DRIVERMAPPING0_PAGEVERSION (0x00) + +/* values for Driver Persistent Mapping Page 0 MappingInformation field */ +#define MPI2_DRVMAP0_MAPINFO_SLOT_MASK (0x07F0) +#define MPI2_DRVMAP0_MAPINFO_SLOT_SHIFT (4) +#define MPI2_DRVMAP0_MAPINFO_MISSING_MASK (0x000F) + + +/**************************************************************************** +* Ethernet Config Pages +****************************************************************************/ + +/* Ethernet Page 0 */ + +/* IP address (union of IPv4 and IPv6) */ +typedef union _MPI2_ETHERNET_IP_ADDR +{ + U32 IPv4Addr; + U32 IPv6Addr[4]; +} MPI2_ETHERNET_IP_ADDR, MPI2_POINTER PTR_MPI2_ETHERNET_IP_ADDR, + Mpi2EthernetIpAddr_t, MPI2_POINTER pMpi2EthernetIpAddr_t; + +#define MPI2_ETHERNET_HOST_NAME_LENGTH (32) + +typedef struct _MPI2_CONFIG_PAGE_ETHERNET_0 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U8 NumInterfaces; /* 0x08 */ + U8 Reserved0; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U32 Status; /* 0x0C */ + U8 MediaState; /* 0x10 */ + U8 Reserved2; /* 0x11 */ + U16 Reserved3; /* 0x12 */ + U8 MacAddress[6]; /* 0x14 */ + U8 Reserved4; /* 0x1A */ + U8 Reserved5; /* 0x1B */ + MPI2_ETHERNET_IP_ADDR IpAddress; /* 0x1C */ + MPI2_ETHERNET_IP_ADDR SubnetMask; /* 0x2C */ + MPI2_ETHERNET_IP_ADDR GatewayIpAddress; /* 0x3C */ + MPI2_ETHERNET_IP_ADDR DNS1IpAddress; /* 0x4C */ + MPI2_ETHERNET_IP_ADDR DNS2IpAddress; /* 0x5C */ + MPI2_ETHERNET_IP_ADDR DhcpIpAddress; /* 0x6C */ + U8 HostName[MPI2_ETHERNET_HOST_NAME_LENGTH];/* 0x7C */ +} MPI2_CONFIG_PAGE_ETHERNET_0, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_ETHERNET_0, + Mpi2EthernetPage0_t, MPI2_POINTER pMpi2EthernetPage0_t; + +#define MPI2_ETHERNETPAGE0_PAGEVERSION (0x00) + +/* values for Ethernet Page 0 Status field */ +#define MPI2_ETHPG0_STATUS_IPV6_CAPABLE (0x80000000) +#define MPI2_ETHPG0_STATUS_IPV4_CAPABLE (0x40000000) +#define MPI2_ETHPG0_STATUS_CONSOLE_CONNECTED (0x20000000) +#define MPI2_ETHPG0_STATUS_DEFAULT_IF (0x00000100) +#define MPI2_ETHPG0_STATUS_FW_DWNLD_ENABLED (0x00000080) +#define MPI2_ETHPG0_STATUS_TELNET_ENABLED (0x00000040) +#define MPI2_ETHPG0_STATUS_SSH2_ENABLED (0x00000020) +#define MPI2_ETHPG0_STATUS_DHCP_CLIENT_ENABLED (0x00000010) +#define MPI2_ETHPG0_STATUS_IPV6_ENABLED (0x00000008) +#define MPI2_ETHPG0_STATUS_IPV4_ENABLED (0x00000004) +#define MPI2_ETHPG0_STATUS_IPV6_ADDRESSES (0x00000002) +#define MPI2_ETHPG0_STATUS_ETH_IF_ENABLED (0x00000001) + +/* values for Ethernet Page 0 MediaState field */ +#define MPI2_ETHPG0_MS_DUPLEX_MASK (0x80) +#define MPI2_ETHPG0_MS_HALF_DUPLEX (0x00) +#define MPI2_ETHPG0_MS_FULL_DUPLEX (0x80) + +#define MPI2_ETHPG0_MS_CONNECT_SPEED_MASK (0x07) +#define MPI2_ETHPG0_MS_NOT_CONNECTED (0x00) +#define MPI2_ETHPG0_MS_10MBIT (0x01) +#define MPI2_ETHPG0_MS_100MBIT (0x02) +#define MPI2_ETHPG0_MS_1GBIT (0x03) + + +/* Ethernet Page 1 */ + +typedef struct _MPI2_CONFIG_PAGE_ETHERNET_1 +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 Reserved0; /* 0x08 */ + U32 Flags; /* 0x0C */ + U8 MediaState; /* 0x10 */ + U8 Reserved1; /* 0x11 */ + U16 Reserved2; /* 0x12 */ + U8 MacAddress[6]; /* 0x14 */ + U8 Reserved3; /* 0x1A */ + U8 Reserved4; /* 0x1B */ + MPI2_ETHERNET_IP_ADDR StaticIpAddress; /* 0x1C */ + MPI2_ETHERNET_IP_ADDR StaticSubnetMask; /* 0x2C */ + MPI2_ETHERNET_IP_ADDR StaticGatewayIpAddress; /* 0x3C */ + MPI2_ETHERNET_IP_ADDR StaticDNS1IpAddress; /* 0x4C */ + MPI2_ETHERNET_IP_ADDR StaticDNS2IpAddress; /* 0x5C */ + U32 Reserved5; /* 0x6C */ + U32 Reserved6; /* 0x70 */ + U32 Reserved7; /* 0x74 */ + U32 Reserved8; /* 0x78 */ + U8 HostName[MPI2_ETHERNET_HOST_NAME_LENGTH];/* 0x7C */ +} MPI2_CONFIG_PAGE_ETHERNET_1, MPI2_POINTER PTR_MPI2_CONFIG_PAGE_ETHERNET_1, + Mpi2EthernetPage1_t, MPI2_POINTER pMpi2EthernetPage1_t; + +#define MPI2_ETHERNETPAGE1_PAGEVERSION (0x00) + +/* values for Ethernet Page 1 Flags field */ +#define MPI2_ETHPG1_FLAG_SET_DEFAULT_IF (0x00000100) +#define MPI2_ETHPG1_FLAG_ENABLE_FW_DOWNLOAD (0x00000080) +#define MPI2_ETHPG1_FLAG_ENABLE_TELNET (0x00000040) +#define MPI2_ETHPG1_FLAG_ENABLE_SSH2 (0x00000020) +#define MPI2_ETHPG1_FLAG_ENABLE_DHCP_CLIENT (0x00000010) +#define MPI2_ETHPG1_FLAG_ENABLE_IPV6 (0x00000008) +#define MPI2_ETHPG1_FLAG_ENABLE_IPV4 (0x00000004) +#define MPI2_ETHPG1_FLAG_USE_IPV6_ADDRESSES (0x00000002) +#define MPI2_ETHPG1_FLAG_ENABLE_ETH_IF (0x00000001) + +/* values for Ethernet Page 1 MediaState field */ +#define MPI2_ETHPG1_MS_DUPLEX_MASK (0x80) +#define MPI2_ETHPG1_MS_HALF_DUPLEX (0x00) +#define MPI2_ETHPG1_MS_FULL_DUPLEX (0x80) + +#define MPI2_ETHPG1_MS_DATA_RATE_MASK (0x07) +#define MPI2_ETHPG1_MS_DATA_RATE_AUTO (0x00) +#define MPI2_ETHPG1_MS_DATA_RATE_10MBIT (0x01) +#define MPI2_ETHPG1_MS_DATA_RATE_100MBIT (0x02) +#define MPI2_ETHPG1_MS_DATA_RATE_1GBIT (0x03) + + +/**************************************************************************** +* Extended Manufacturing Config Pages +****************************************************************************/ + +/* + * Generic structure to use for product-specific extended manufacturing pages + * (currently Extended Manufacturing Page 40 through Extended Manufacturing + * Page 60). + */ + +typedef struct _MPI2_CONFIG_PAGE_EXT_MAN_PS +{ + MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /* 0x00 */ + U32 ProductSpecificInfo; /* 0x08 */ +} MPI2_CONFIG_PAGE_EXT_MAN_PS, + MPI2_POINTER PTR_MPI2_CONFIG_PAGE_EXT_MAN_PS, + Mpi2ExtManufacturingPagePS_t, MPI2_POINTER pMpi2ExtManufacturingPagePS_t; + +/* PageVersion should be provided by product-specific code */ + +#endif + diff --git a/source/lsi/mpi2_hbd.h b/source/lsi/mpi2_hbd.h new file mode 100755 index 0000000..137d67f --- /dev/null +++ b/source/lsi/mpi2_hbd.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2009-2010 LSI Corporation. + * + * + * Name: mpi2_hbd.h + * Title: MPI Host Based Discovery messages and structures + * Creation Date: October 21, 2009 + * + * mpi2_hbd.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 10-28-09 02.00.00 Initial version. + * 08-11-10 02.00.01 Removed PortGroups, DmaGroup, and ControlGroup from + * HBD Action request, replaced by AdditionalInfo field. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_HBD_H +#define MPI2_HBD_H + +/**************************************************************************** +* Host Based Discovery Action messages +****************************************************************************/ + +/* Host Based Discovery Action Request Message */ +typedef struct _MPI2_HBD_ACTION_REQUEST +{ + U8 Operation; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 DevHandle; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U32 Reserved4; /* 0x0C */ + U64 SASAddress; /* 0x10 */ + U32 Reserved5; /* 0x18 */ + U32 HbdDeviceInfo; /* 0x1C */ + U16 ParentDevHandle; /* 0x20 */ + U16 MaxQDepth; /* 0x22 */ + U8 FirstPhyIdentifier; /* 0x24 */ + U8 Port; /* 0x25 */ + U8 MaxConnections; /* 0x26 */ + U8 MaxRate; /* 0x27 */ + U32 AdditionalInfo; /* 0x28 */ + U16 InitialAWT; /* 0x2C */ + U16 Reserved7; /* 0x2E */ + U32 Reserved8; /* 0x30 */ +} MPI2_HBD_ACTION_REQUEST, MPI2_POINTER PTR_MPI2_HBD_ACTION_REQUEST, + Mpi2HbdActionRequest_t, MPI2_POINTER pMpi2HbdActionRequest_t; + +/* values for the Operation field */ +#define MPI2_HBD_OP_ADD_DEVICE (0x01) +#define MPI2_HBD_OP_REMOVE_DEVICE (0x02) +#define MPI2_HBD_OP_UPDATE_DEVICE (0x03) + +/* values for the HbdDeviceInfo field */ +#define MPI2_HBD_DEVICE_INFO_VIRTUAL_DEVICE (0x00004000) +#define MPI2_HBD_DEVICE_INFO_ATAPI_DEVICE (0x00002000) +#define MPI2_HBD_DEVICE_INFO_DIRECT_ATTACH (0x00000800) +#define MPI2_HBD_DEVICE_INFO_SSP_TARGET (0x00000400) +#define MPI2_HBD_DEVICE_INFO_STP_TARGET (0x00000200) +#define MPI2_HBD_DEVICE_INFO_SMP_TARGET (0x00000100) +#define MPI2_HBD_DEVICE_INFO_SATA_DEVICE (0x00000080) +#define MPI2_HBD_DEVICE_INFO_SSP_INITIATOR (0x00000040) +#define MPI2_HBD_DEVICE_INFO_STP_INITIATOR (0x00000020) +#define MPI2_HBD_DEVICE_INFO_SMP_INITIATOR (0x00000010) +#define MPI2_HBD_DEVICE_INFO_SATA_HOST (0x00000008) + +#define MPI2_HBD_DEVICE_INFO_MASK_DEVICE_TYPE (0x00000007) +#define MPI2_HBD_DEVICE_INFO_NO_DEVICE (0x00000000) +#define MPI2_HBD_DEVICE_INFO_END_DEVICE (0x00000001) +#define MPI2_HBD_DEVICE_INFO_EDGE_EXPANDER (0x00000002) +#define MPI2_HBD_DEVICE_INFO_FANOUT_EXPANDER (0x00000003) + +/* values for the MaxRate field */ +#define MPI2_HBD_MAX_RATE_MASK (0x0F) +#define MPI2_HBD_MAX_RATE_1_5 (0x08) +#define MPI2_HBD_MAX_RATE_3_0 (0x09) +#define MPI2_HBD_MAX_RATE_6_0 (0x0A) +#define MPI25_HBD_MAX_RATE_12_0 (0x0B) + + +/* Host Based Discovery Action Reply Message */ +typedef struct _MPI2_HBD_ACTION_REPLY +{ + U8 Operation; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 DevHandle; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_HBD_ACTION_REPLY, MPI2_POINTER PTR_MPI2_HBD_ACTION_REPLY, + Mpi2HbdActionReply_t, MPI2_POINTER pMpi2HbdActionReply_t; + + +#endif + + diff --git a/source/lsi/mpi2_history.txt b/source/lsi/mpi2_history.txt new file mode 100755 index 0000000..91e06d4 --- /dev/null +++ b/source/lsi/mpi2_history.txt @@ -0,0 +1,460 @@ + ============================== + Fusion-MPT MPI 2.0 Header File Change History + ============================== + + Copyright (c) 2000-2011 LSI Corporation. + + --------------------------------------- + Header Set Release Version: 02.00.19 + Header Set Release Date: 02-23-11 + --------------------------------------- + + Filename Current version Prior version + ---------- --------------- ------------- + mpi2.h 02.00.19 02.00.18 + mpi2_cnfg.h 02.00.18 02.00.17 + mpi2_init.h 02.00.11 02.00.11 + mpi2_ioc.h 02.00.17 02.00.16 + mpi2_raid.h 02.00.05 02.00.05 + mpi2_sas.h 02.00.05 02.00.05 + mpi2_targ.h 02.00.04 02.00.04 + mpi2_tool.h 02.00.06 02.00.06 + mpi2_type.h 02.00.00 02.00.00 + mpi2_ra.h 02.00.00 02.00.00 + mpi2_hbd.h 02.00.01 02.00.01 + mpi2_history.txt 02.00.19 02.00.18 + + + * Date Version Description + * -------- -------- ------------------------------------------------------ + +mpi2.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-04-07 02.00.01 Bumped MPI2_HEADER_VERSION_UNIT. + * 06-26-07 02.00.02 Bumped MPI2_HEADER_VERSION_UNIT. + * 08-31-07 02.00.03 Bumped MPI2_HEADER_VERSION_UNIT. + * Moved ReplyPostHostIndex register to offset 0x6C of the + * MPI2_SYSTEM_INTERFACE_REGS and modified the define for + * MPI2_REPLY_POST_HOST_INDEX_OFFSET. + * Added union of request descriptors. + * Added union of reply descriptors. + * 10-31-07 02.00.04 Bumped MPI2_HEADER_VERSION_UNIT. + * Added define for MPI2_VERSION_02_00. + * Fixed the size of the FunctionDependent5 field in the + * MPI2_DEFAULT_REPLY structure. + * 12-18-07 02.00.05 Bumped MPI2_HEADER_VERSION_UNIT. + * Removed the MPI-defined Fault Codes and extended the + * product specific codes up to 0xEFFF. + * Added a sixth key value for the WriteSequence register + * and changed the flush value to 0x0. + * Added message function codes for Diagnostic Buffer Post + * and Diagnsotic Release. + * New IOCStatus define: MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED + * Moved MPI2_VERSION_UNION from mpi2_ioc.h. + * 02-29-08 02.00.06 Bumped MPI2_HEADER_VERSION_UNIT. + * 03-03-08 02.00.07 Bumped MPI2_HEADER_VERSION_UNIT. + * 05-21-08 02.00.08 Bumped MPI2_HEADER_VERSION_UNIT. + * Added #defines for marking a reply descriptor as unused. + * 06-27-08 02.00.09 Bumped MPI2_HEADER_VERSION_UNIT. + * 10-02-08 02.00.10 Bumped MPI2_HEADER_VERSION_UNIT. + * Moved LUN field defines from mpi2_init.h. + * 01-19-09 02.00.11 Bumped MPI2_HEADER_VERSION_UNIT. + * 05-06-09 02.00.12 Bumped MPI2_HEADER_VERSION_UNIT. + * In all request and reply descriptors, replaced VF_ID + * field with MSIxIndex field. + * Removed DevHandle field from + * MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR and made those + * bytes reserved. + * Added RAID Accelerator functionality. + * 07-30-09 02.00.13 Bumped MPI2_HEADER_VERSION_UNIT. + * 10-28-09 02.00.14 Bumped MPI2_HEADER_VERSION_UNIT. + * Added MSI-x index mask and shift for Reply Post Host + * Index register. + * Added function code for Host Based Discovery Action. + * 02-10-10 02.00.15 Bumped MPI2_HEADER_VERSION_UNIT. + * Added define for MPI2_FUNCTION_PWR_MGMT_CONTROL. + * Added defines for product-specific range of message + * function codes, 0xF0 to 0xFF. + * 05-12-10 02.00.16 Bumped MPI2_HEADER_VERSION_UNIT. + * Added alternative defines for the SGE Direction bit. + * 08-11-10 02.00.17 Bumped MPI2_HEADER_VERSION_UNIT. + * 11-10-10 02.00.18 Bumped MPI2_HEADER_VERSION_UNIT. + * Added MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR define. + * 02-23-11 02.00.19 Bumped MPI2_HEADER_VERSION_UNIT. + * Added MPI2_FUNCTION_SEND_HOST_MESSAGE. + * -------------------------------------------------------------------------- + +mpi2_cnfg.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-04-07 02.00.01 Added defines for SAS IO Unit Page 2 PhyFlags. + * Added Manufacturing Page 11. + * Added MPI2_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE + * define. + * 06-26-07 02.00.02 Adding generic structure for product-specific + * Manufacturing pages: MPI2_CONFIG_PAGE_MANUFACTURING_PS. + * Rework of BIOS Page 2 configuration page. + * Fixed MPI2_BIOSPAGE2_BOOT_DEVICE to be a union of the + * forms. + * Added configuration pages IOC Page 8 and Driver + * Persistent Mapping Page 0. + * 08-31-07 02.00.03 Modified configuration pages dealing with Integrated + * RAID (Manufacturing Page 4, RAID Volume Pages 0 and 1, + * RAID Physical Disk Pages 0 and 1, RAID Configuration + * Page 0). + * Added new value for AccessStatus field of SAS Device + * Page 0 (_SATA_NEEDS_INITIALIZATION). + * 10-31-07 02.00.04 Added missing SEPDevHandle field to + * MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0. + * 12-18-07 02.00.05 Modified IO Unit Page 0 to use 32-bit version fields for + * NVDATA. + * Modified IOC Page 7 to use masks and added field for + * SASBroadcastPrimitiveMasks. + * Added MPI2_CONFIG_PAGE_BIOS_4. + * Added MPI2_CONFIG_PAGE_LOG_0. + * 02-29-08 02.00.06 Modified various names to make them 32-character unique. + * Added SAS Device IDs. + * Updated Integrated RAID configuration pages including + * Manufacturing Page 4, IOC Page 6, and RAID Configuration + * Page 0. + * 05-21-08 02.00.07 Added define MPI2_MANPAGE4_MIX_SSD_SAS_SATA. + * Added define MPI2_MANPAGE4_PHYSDISK_128MB_COERCION. + * Fixed define MPI2_IOCPAGE8_FLAGS_ENCLOSURE_SLOT_MAPPING. + * Added missing MaxNumRoutedSasAddresses field to + * MPI2_CONFIG_PAGE_EXPANDER_0. + * Added SAS Port Page 0. + * Modified structure layout for + * MPI2_CONFIG_PAGE_DRIVER_MAPPING_0. + * 06-27-08 02.00.08 Changed MPI2_CONFIG_PAGE_RD_PDISK_1 to use + * MPI2_RAID_PHYS_DISK1_PATH_MAX to size the array. + * 10-02-08 02.00.09 Changed MPI2_RAID_PGAD_CONFIGNUM_MASK from 0x0000FFFF + * to 0x000000FF. + * Added two new values for the Physical Disk Coercion Size + * bits in the Flags field of Manufacturing Page 4. + * Added product-specific Manufacturing pages 16 to 31. + * Modified Flags bits for controlling write cache on SATA + * drives in IO Unit Page 1. + * Added new bit to AdditionalControlFlags of SAS IO Unit + * Page 1 to control Invalid Topology Correction. + * Added SupportedPhysDisks field to RAID Volume Page 1 and + * added related defines. + * Added additional defines for RAID Volume Page 0 + * VolumeStatusFlags field. + * Modified meaning of RAID Volume Page 0 VolumeSettings + * define for auto-configure of hot-swap drives. + * Added PhysDiskAttributes field (and related defines) to + * RAID Physical Disk Page 0. + * Added MPI2_SAS_PHYINFO_PHY_VACANT define. + * Added three new DiscoveryStatus bits for SAS IO Unit + * Page 0 and SAS Expander Page 0. + * Removed multiplexing information from SAS IO Unit pages. + * Added BootDeviceWaitTime field to SAS IO Unit Page 4. + * Removed Zone Address Resolved bit from PhyInfo and from + * Expander Page 0 Flags field. + * Added two new AccessStatus values to SAS Device Page 0 + * for indicating routing problems. Added 3 reserved words + * to this page. + * 01-19-09 02.00.10 Fixed defines for GPIOVal field of IO Unit Page 3. + * Inserted missing reserved field into structure for IOC + * Page 6. + * Added more pending task bits to RAID Volume Page 0 + * VolumeStatusFlags defines. + * Added MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED define. + * Added a new DiscoveryStatus bit for SAS IO Unit Page 0 + * and SAS Expander Page 0 to flag a downstream initiator + * when in simplified routing mode. + * Removed SATA Init Failure defines for DiscoveryStatus + * fields of SAS IO Unit Page 0 and SAS Expander Page 0. + * Added MPI2_SAS_DEVICE0_ASTATUS_DEVICE_BLOCKED define. + * Added PortGroups, DmaGroup, and ControlGroup fields to + * SAS Device Page 0. + * 05-06-09 02.00.11 Added structures and defines for IO Unit Page 5 and IO + * Unit Page 6. + * Added expander reduced functionality data to SAS + * Expander Page 0. + * Added SAS PHY Page 2 and SAS PHY Page 3. + * 07-30-09 02.00.12 Added IO Unit Page 7. + * Added new device ids. + * Added SAS IO Unit Page 5. + * Added partial and slumber power management capable flags + * to SAS Device Page 0 Flags field. + * Added PhyInfo defines for power condition. + * Added Ethernet configuration pages. + * 10-28-09 02.00.13 Added MPI2_IOUNITPAGE1_ENABLE_HOST_BASED_DISCOVERY. + * Added SAS PHY Page 4 structure and defines. + * 02-10-10 02.00.14 Modified the comments for the configuration page + * structures that contain an array of data. The host + * should use the "count" field in the page data (e.g. the + * NumPhys field) to determine the number of valid elements + * in the array. + * Added/modified some MPI2_MFGPAGE_DEVID_SAS defines. + * Added PowerManagementCapabilities to IO Unit Page 7. + * Added PortWidthModGroup field to + * MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS. + * Added MPI2_CONFIG_PAGE_SASIOUNIT_6 and related defines. + * Added MPI2_CONFIG_PAGE_SASIOUNIT_7 and related defines. + * Added MPI2_CONFIG_PAGE_SASIOUNIT_8 and related defines. + * 05-12-10 02.00.15 Added MPI2_RAIDVOL0_STATUS_FLAG_VOL_NOT_CONSISTENT + * define. + * Added MPI2_PHYSDISK0_INCOMPATIBLE_MEDIA_TYPE define. + * Added MPI2_SAS_NEG_LINK_RATE_UNSUPPORTED_PHY define. + * 08-11-10 02.00.16 Removed IO Unit Page 1 device path (multi-pathing) + * defines. + * 11-10-10 02.00.17 Added ReceptacleID field (replacing Reserved1) to + * MPI2_MANPAGE7_CONNECTOR_INFO and reworked defines for + * the Pinout field. + * Added BoardTemperature and BoardTemperatureUnits fields + * to MPI2_CONFIG_PAGE_IO_UNIT_7. + * Added MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING define + * and MPI2_CONFIG_PAGE_EXT_MAN_PS structure. + * 02-23-11 02.00.18 Added ProxyVF_ID field to MPI2_CONFIG_REQUEST. + * Added IO Unit Page 8, IO Unit Page 9, + * and IO Unit Page 10. + * Added SASNotifyPrimitiveMasks field to + * MPI2_CONFIG_PAGE_IOC_7. + * -------------------------------------------------------------------------- + +mpi2_init.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 10-31-07 02.00.01 Fixed name for pMpi2SCSITaskManagementRequest_t. + * 12-18-07 02.00.02 Modified Task Management Target Reset Method defines. + * 02-29-08 02.00.03 Added Query Task Set and Query Unit Attention. + * 03-03-08 02.00.04 Fixed name of struct _MPI2_SCSI_TASK_MANAGE_REPLY. + * 05-21-08 02.00.05 Fixed typo in name of Mpi2SepRequest_t. + * 10-02-08 02.00.06 Removed Untagged and No Disconnect values from SCSI IO + * Control field Task Attribute flags. + * Moved LUN field defines to mpi2.h becasue they are + * common to many structures. + * 05-06-09 02.00.07 Changed task management type of Query Unit Attention to + * Query Asynchronous Event. + * Defined two new bits in the SlotStatus field of the SCSI + * Enclosure Processor Request and Reply. + * 10-28-09 02.00.08 Added defines for decoding the ResponseInfo bytes for + * both SCSI IO Error Reply and SCSI Task Management Reply. + * Added ResponseInfo field to MPI2_SCSI_TASK_MANAGE_REPLY. + * Added MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG define. + * 02-10-10 02.00.09 Removed unused structure that had "#if 0" around it. + * 05-12-10 02.00.10 Added optional vendor-unique region to SCSI IO Request. + * 11-10-10 02.00.11 Added MPI2_SCSIIO_NUM_SGLOFFSETS define. + * -------------------------------------------------------------------------- + +mpi2_ioc.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-04-07 02.00.01 In IOCFacts Reply structure, renamed MaxDevices to + * MaxTargets. + * Added TotalImageSize field to FWDownload Request. + * Added reserved words to FWUpload Request. + * 06-26-07 02.00.02 Added IR Configuration Change List Event. + * 08-31-07 02.00.03 Removed SystemReplyQueueDepth field from the IOCInit + * request and replaced it with + * ReplyDescriptorPostQueueDepth and ReplyFreeQueueDepth. + * Replaced the MinReplyQueueDepth field of the IOCFacts + * reply with MaxReplyDescriptorPostQueueDepth. + * Added MPI2_RDPQ_DEPTH_MIN define to specify the minimum + * depth for the Reply Descriptor Post Queue. + * Added SASAddress field to Initiator Device Table + * Overflow Event data. + * 10-31-07 02.00.04 Added ReasonCode MPI2_EVENT_SAS_INIT_RC_NOT_RESPONDING + * for SAS Initiator Device Status Change Event data. + * Modified Reason Code defines for SAS Topology Change + * List Event data, including adding a bit for PHY Vacant + * status, and adding a mask for the Reason Code. + * Added define for + * MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING. + * Added define for MPI2_EXT_IMAGE_TYPE_MEGARAID. + * 12-18-07 02.00.05 Added Boot Status defines for the IOCExceptions field of + * the IOCFacts Reply. + * Removed MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. + * Moved MPI2_VERSION_UNION to mpi2.h. + * Changed MPI2_EVENT_NOTIFICATION_REQUEST to use masks + * instead of enables, and added SASBroadcastPrimitiveMasks + * field. + * Added Log Entry Added Event and related structure. + * 02-29-08 02.00.06 Added define MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID. + * Removed define MPI2_IOCFACTS_PROTOCOL_SMP_TARGET. + * Added MaxVolumes and MaxPersistentEntries fields to + * IOCFacts reply. + * Added ProtocalFlags and IOCCapabilities fields to + * MPI2_FW_IMAGE_HEADER. + * Removed MPI2_PORTENABLE_FLAGS_ENABLE_SINGLE_PORT. + * 03-03-08 02.00.07 Fixed MPI2_FW_IMAGE_HEADER by changing Reserved26 to + * a U16 (from a U32). + * Removed extra 's' from EventMasks name. + * 06-27-08 02.00.08 Fixed an offset in a comment. + * 10-02-08 02.00.09 Removed SystemReplyFrameSize from MPI2_IOC_INIT_REQUEST. + * Removed CurReplyFrameSize from MPI2_IOC_FACTS_REPLY and + * renamed MinReplyFrameSize to ReplyFrameSize. + * Added MPI2_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAX. + * Added two new RAIDOperation values for Integrated RAID + * Operations Status Event data. + * Added four new IR Configuration Change List Event data + * ReasonCode values. + * Added two new ReasonCode defines for SAS Device Status + * Change Event data. + * Added three new DiscoveryStatus bits for the SAS + * Discovery event data. + * Added Multiplexing Status Change bit to the PhyStatus + * field of the SAS Topology Change List event data. + * Removed define for MPI2_INIT_IMAGE_BOOTFLAGS_XMEMCOPY. + * BootFlags are now product-specific. + * Added defines for the indivdual signature bytes + * for MPI2_INIT_IMAGE_FOOTER. + * 01-19-09 02.00.10 Added MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY define. + * Added MPI2_EVENT_SAS_DISC_DS_DOWNSTREAM_INITIATOR + * define. + * Added MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE + * define. + * Removed MPI2_EVENT_SAS_DISC_DS_SATA_INIT_FAILURE define. + * 05-06-09 02.00.11 Added MPI2_IOCFACTS_CAPABILITY_RAID_ACCELERATOR define. + * Added MPI2_IOCFACTS_CAPABILITY_MSI_X_INDEX define. + * Added two new reason codes for SAS Device Status Change + * Event. + * Added new event: SAS PHY Counter. + * 07-30-09 02.00.12 Added GPIO Interrupt event define and structure. + * Added MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. + * Added new product id family for 2208. + * 10-28-09 02.00.13 Added HostMSIxVectors field to MPI2_IOC_INIT_REQUEST. + * Added MaxMSIxVectors field to MPI2_IOC_FACTS_REPLY. + * Added MinDevHandle field to MPI2_IOC_FACTS_REPLY. + * Added MPI2_IOCFACTS_CAPABILITY_HOST_BASED_DISCOVERY. + * Added MPI2_EVENT_HOST_BASED_DISCOVERY_PHY define. + * Added MPI2_EVENT_SAS_TOPO_ES_NO_EXPANDER define. + * Added Host Based Discovery Phy Event data. + * Added defines for ProductID Product field + * (MPI2_FW_HEADER_PID_). + * Modified values for SAS ProductID Family + * (MPI2_FW_HEADER_PID_FAMILY_). + * 02-10-10 02.00.14 Added SAS Quiesce Event structure and defines. + * Added PowerManagementControl Request structures and + * defines. + * 05-12-10 02.00.15 Marked Task Set Full Event as obsolete. + * Added MPI2_EVENT_SAS_TOPO_LR_UNSUPPORTED_PHY define. + * 11-10-10 02.00.16 Added MPI2_FW_DOWNLOAD_ITYPE_MIN_PRODUCT_SPECIFIC. + * 02-23-11 02.00.17 Added SAS NOTIFY Primitive event, and added + * SASNotifyPrimitiveMasks field to + * MPI2_EVENT_NOTIFICATION_REQUEST. + * Added Temperature Threshold Event. + * Added Host Message Event. + * Added Send Host Message request and reply. + * -------------------------------------------------------------------------- + +mpi2_raid.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 08-31-07 02.00.01 Modifications to RAID Action request and reply, + * including the Actions and ActionData. + * 02-29-08 02.00.02 Added MPI2_RAID_ACTION_ADATA_DISABL_FULL_REBUILD. + * 05-21-08 02.00.03 Added MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS so that + * the PhysDisk array in MPI2_RAID_VOLUME_CREATION_STRUCT + * can be sized by the build environment. + * 07-30-09 02.00.04 Added proper define for the Use Default Settings bit of + * VolumeCreationFlags and marked the old one as obsolete. + * 05-12-10 02.00.05 Added MPI2_RAID_VOL_FLAGS_OP_MDC define. + * -------------------------------------------------------------------------- + +mpi2_sas.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-26-07 02.00.01 Added Clear All Persistent Operation to SAS IO Unit + * Control Request. + * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control + * Request. + * 10-28-09 02.00.03 Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST + * to MPI2_SGE_IO_UNION since it supports chained SGLs. + * 05-12-10 02.00.04 Modified some comments. + * 08-11-10 02.00.05 Added NCQ operations to SAS IO Unit Control. + * -------------------------------------------------------------------------- + +mpi2_targ.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 08-31-07 02.00.01 Added Command Buffer Data Location Address Space bits to + * BufferPostFlags field of CommandBufferPostBase Request. + * 02-29-08 02.00.02 Modified various names to make them 32-character unique. + * 10-02-08 02.00.03 Removed NextCmdBufferOffset from + * MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST. + * Target Status Send Request only takes a single SGE for + * response data. + * 02-10-10 02.00.04 Added comment to MPI2_TARGET_SSP_RSP_IU structure. + * -------------------------------------------------------------------------- + +mpi2_tool.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 12-18-07 02.00.01 Added Diagnostic Buffer Post and Diagnostic Release + * structures and defines. + * 02-29-08 02.00.02 Modified various names to make them 32-character unique. + * 05-06-09 02.00.03 Added ISTWI Read Write Tool and Diagnostic CLI Tool. + * 07-30-09 02.00.04 Added ExtendedType field to DiagnosticBufferPost request + * and reply messages. + * Added MPI2_DIAG_BUF_TYPE_EXTENDED. + * Incremented MPI2_DIAG_BUF_TYPE_COUNT. + * 05-12-10 02.00.05 Added Diagnostic Data Upload tool. + * 08-11-10 02.00.06 Added defines that were missing for Diagnostic Buffer + * Post Request. + * -------------------------------------------------------------------------- + +mpi2_type.h + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * -------------------------------------------------------------------------- + +mpi2_ra.h + * 05-06-09 02.00.00 Initial version. + * -------------------------------------------------------------------------- + +mpi2_hbd.h + * 10-28-09 02.00.00 Initial version. + * 08-11-10 02.00.01 Removed PortGroups, DmaGroup, and ControlGroup from + * HBD Action request, replaced by AdditionalInfo field. + * -------------------------------------------------------------------------- + + +mpi2_history.txt Parts list history + +Filename 02.00.19 02.00.18 +---------- -------- -------- +mpi2.h 02.00.19 02.00.18 +mpi2_cnfg.h 02.00.18 02.00.17 +mpi2_init.h 02.00.11 02.00.11 +mpi2_ioc.h 02.00.17 02.00.16 +mpi2_raid.h 02.00.05 02.00.05 +mpi2_sas.h 02.00.05 02.00.05 +mpi2_targ.h 02.00.04 02.00.04 +mpi2_tool.h 02.00.06 02.00.06 +mpi2_type.h 02.00.00 02.00.00 +mpi2_ra.h 02.00.00 02.00.00 +mpi2_hbd.h 02.00.01 02.00.01 + +Filename 02.00.17 02.00.16 02.00.15 02.00.14 02.00.13 02.00.12 +---------- -------- -------- -------- -------- -------- -------- +mpi2.h 02.00.17 02.00.16 02.00.15 02.00.14 02.00.13 02.00.12 +mpi2_cnfg.h 02.00.16 02.00.15 02.00.14 02.00.13 02.00.12 02.00.11 +mpi2_init.h 02.00.10 02.00.10 02.00.09 02.00.08 02.00.07 02.00.07 +mpi2_ioc.h 02.00.15 02.00.15 02.00.14 02.00.13 02.00.12 02.00.11 +mpi2_raid.h 02.00.05 02.00.05 02.00.04 02.00.04 02.00.04 02.00.03 +mpi2_sas.h 02.00.05 02.00.04 02.00.03 02.00.03 02.00.02 02.00.02 +mpi2_targ.h 02.00.04 02.00.04 02.00.04 02.00.03 02.00.03 02.00.03 +mpi2_tool.h 02.00.06 02.00.05 02.00.04 02.00.04 02.00.04 02.00.03 +mpi2_type.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 +mpi2_ra.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 +mpi2_hbd.h 02.00.01 02.00.00 02.00.00 02.00.00 + +Filename 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 +---------- -------- -------- -------- -------- -------- -------- +mpi2.h 02.00.11 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 +mpi2_cnfg.h 02.00.10 02.00.09 02.00.08 02.00.07 02.00.06 02.00.06 +mpi2_init.h 02.00.06 02.00.06 02.00.05 02.00.05 02.00.04 02.00.03 +mpi2_ioc.h 02.00.10 02.00.09 02.00.08 02.00.07 02.00.07 02.00.06 +mpi2_raid.h 02.00.03 02.00.03 02.00.03 02.00.03 02.00.02 02.00.02 +mpi2_sas.h 02.00.02 02.00.02 02.00.01 02.00.01 02.00.01 02.00.01 +mpi2_targ.h 02.00.03 02.00.03 02.00.02 02.00.02 02.00.02 02.00.02 +mpi2_tool.h 02.00.02 02.00.02 02.00.02 02.00.02 02.00.02 02.00.02 +mpi2_type.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 + +Filename 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 +---------- -------- -------- -------- -------- -------- -------- +mpi2.h 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 +mpi2_cnfg.h 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 +mpi2_init.h 02.00.02 02.00.01 02.00.00 02.00.00 02.00.00 02.00.00 +mpi2_ioc.h 02.00.05 02.00.04 02.00.03 02.00.02 02.00.01 02.00.00 +mpi2_raid.h 02.00.01 02.00.01 02.00.01 02.00.00 02.00.00 02.00.00 +mpi2_sas.h 02.00.01 02.00.01 02.00.01 02.00.01 02.00.00 02.00.00 +mpi2_targ.h 02.00.01 02.00.01 02.00.01 02.00.00 02.00.00 02.00.00 +mpi2_tool.h 02.00.01 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 +mpi2_type.h 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 02.00.00 + diff --git a/source/lsi/mpi2_init.h b/source/lsi/mpi2_init.h new file mode 100755 index 0000000..25671d8 --- /dev/null +++ b/source/lsi/mpi2_init.h @@ -0,0 +1,571 @@ +/* + * Copyright (c) 2000-2010 LSI Corporation. + * + * + * Name: mpi2_init.h + * Title: MPI SCSI initiator mode messages and structures + * Creation Date: June 23, 2006 + * + * mpi2_init.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 10-31-07 02.00.01 Fixed name for pMpi2SCSITaskManagementRequest_t. + * 12-18-07 02.00.02 Modified Task Management Target Reset Method defines. + * 02-29-08 02.00.03 Added Query Task Set and Query Unit Attention. + * 03-03-08 02.00.04 Fixed name of struct _MPI2_SCSI_TASK_MANAGE_REPLY. + * 05-21-08 02.00.05 Fixed typo in name of Mpi2SepRequest_t. + * 10-02-08 02.00.06 Removed Untagged and No Disconnect values from SCSI IO + * Control field Task Attribute flags. + * Moved LUN field defines to mpi2.h becasue they are + * common to many structures. + * 05-06-09 02.00.07 Changed task management type of Query Unit Attention to + * Query Asynchronous Event. + * Defined two new bits in the SlotStatus field of the SCSI + * Enclosure Processor Request and Reply. + * 10-28-09 02.00.08 Added defines for decoding the ResponseInfo bytes for + * both SCSI IO Error Reply and SCSI Task Management Reply. + * Added ResponseInfo field to MPI2_SCSI_TASK_MANAGE_REPLY. + * Added MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG define. + * 02-10-10 02.00.09 Removed unused structure that had "#if 0" around it. + * 05-12-10 02.00.10 Added optional vendor-unique region to SCSI IO Request. + * 11-10-10 02.00.11 Added MPI2_SCSIIO_NUM_SGLOFFSETS define. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_INIT_H +#define MPI2_INIT_H + +/***************************************************************************** +* +* SCSI Initiator Messages +* +*****************************************************************************/ + +/**************************************************************************** +* SCSI IO messages and associated structures +****************************************************************************/ + +typedef struct _MPI2_SCSI_IO_CDB_EEDP32 +{ + U8 CDB[20]; /* 0x00 */ + U32 PrimaryReferenceTag; /* 0x14 */ + U16 PrimaryApplicationTag; /* 0x18 */ + U16 PrimaryApplicationTagMask; /* 0x1A */ + U32 TransferLength; /* 0x1C */ +} MPI2_SCSI_IO_CDB_EEDP32, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_EEDP32, + Mpi2ScsiIoCdbEedp32_t, MPI2_POINTER pMpi2ScsiIoCdbEedp32_t; + +/* MPI v2.0 CDB field */ +typedef union _MPI2_SCSI_IO_CDB_UNION +{ + U8 CDB32[32]; + MPI2_SCSI_IO_CDB_EEDP32 EEDP32; + MPI2_SGE_SIMPLE_UNION SGE; +} MPI2_SCSI_IO_CDB_UNION, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_UNION, + Mpi2ScsiIoCdb_t, MPI2_POINTER pMpi2ScsiIoCdb_t; + +/* MPI v2.0 SCSI IO Request Message */ +typedef struct _MPI2_SCSI_IO_REQUEST +{ + U16 DevHandle; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U32 SenseBufferLowAddress; /* 0x0C */ + U16 SGLFlags; /* 0x10 */ + U8 SenseBufferLength; /* 0x12 */ + U8 Reserved4; /* 0x13 */ + U8 SGLOffset0; /* 0x14 */ + U8 SGLOffset1; /* 0x15 */ + U8 SGLOffset2; /* 0x16 */ + U8 SGLOffset3; /* 0x17 */ + U32 SkipCount; /* 0x18 */ + U32 DataLength; /* 0x1C */ + U32 BidirectionalDataLength; /* 0x20 */ + U16 IoFlags; /* 0x24 */ + U16 EEDPFlags; /* 0x26 */ + U32 EEDPBlockSize; /* 0x28 */ + U32 SecondaryReferenceTag; /* 0x2C */ + U16 SecondaryApplicationTag; /* 0x30 */ + U16 ApplicationTagTranslationMask; /* 0x32 */ + U8 LUN[8]; /* 0x34 */ + U32 Control; /* 0x3C */ + MPI2_SCSI_IO_CDB_UNION CDB; /* 0x40 */ + +#ifdef MPI2_SCSI_IO_VENDOR_UNIQUE_REGION /* typically this is left undefined */ + MPI2_SCSI_IO_VENDOR_UNIQUE VendorRegion; +#endif + + MPI2_SGE_IO_UNION SGL; /* 0x60 */ + +} MPI2_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI2_SCSI_IO_REQUEST, + Mpi2SCSIIORequest_t, MPI2_POINTER pMpi2SCSIIORequest_t; + +/* SCSI IO MsgFlags bits */ + +/* MsgFlags for SenseBufferAddressSpace */ +#define MPI2_SCSIIO_MSGFLAGS_MASK_SENSE_ADDR (0x0C) +#define MPI2_SCSIIO_MSGFLAGS_SYSTEM_SENSE_ADDR (0x00) +#define MPI2_SCSIIO_MSGFLAGS_IOCDDR_SENSE_ADDR (0x04) +#define MPI2_SCSIIO_MSGFLAGS_IOCPLB_SENSE_ADDR (0x08) +#define MPI2_SCSIIO_MSGFLAGS_IOCPLBNTA_SENSE_ADDR (0x0C) + +/* SCSI IO SGLFlags bits */ + +/* base values for Data Location Address Space */ +#define MPI2_SCSIIO_SGLFLAGS_ADDR_MASK (0x0C) +#define MPI2_SCSIIO_SGLFLAGS_SYSTEM_ADDR (0x00) +#define MPI2_SCSIIO_SGLFLAGS_IOCDDR_ADDR (0x04) +#define MPI2_SCSIIO_SGLFLAGS_IOCPLB_ADDR (0x08) +#define MPI2_SCSIIO_SGLFLAGS_IOCPLBNTA_ADDR (0x0C) + +/* base values for Type */ +#define MPI2_SCSIIO_SGLFLAGS_TYPE_MASK (0x03) +#define MPI2_SCSIIO_SGLFLAGS_TYPE_MPI (0x00) +#define MPI2_SCSIIO_SGLFLAGS_TYPE_IEEE32 (0x01) +#define MPI2_SCSIIO_SGLFLAGS_TYPE_IEEE64 (0x02) + +/* shift values for each sub-field */ +#define MPI2_SCSIIO_SGLFLAGS_SGL3_SHIFT (12) +#define MPI2_SCSIIO_SGLFLAGS_SGL2_SHIFT (8) +#define MPI2_SCSIIO_SGLFLAGS_SGL1_SHIFT (4) +#define MPI2_SCSIIO_SGLFLAGS_SGL0_SHIFT (0) + +/* number of SGLOffset fields */ +#define MPI2_SCSIIO_NUM_SGLOFFSETS (4) + +/* SCSI IO IoFlags bits */ + +/* Large CDB Address Space */ +#define MPI2_SCSIIO_CDB_ADDR_MASK (0x6000) +#define MPI2_SCSIIO_CDB_ADDR_SYSTEM (0x0000) +#define MPI2_SCSIIO_CDB_ADDR_IOCDDR (0x2000) +#define MPI2_SCSIIO_CDB_ADDR_IOCPLB (0x4000) +#define MPI2_SCSIIO_CDB_ADDR_IOCPLBNTA (0x6000) + +#define MPI2_SCSIIO_IOFLAGS_LARGE_CDB (0x1000) +#define MPI2_SCSIIO_IOFLAGS_BIDIRECTIONAL (0x0800) +#define MPI2_SCSIIO_IOFLAGS_MULTICAST (0x0400) +#define MPI2_SCSIIO_IOFLAGS_CMD_DETERMINES_DATA_DIR (0x0200) +#define MPI2_SCSIIO_IOFLAGS_CDBLENGTH_MASK (0x01FF) + +/* SCSI IO EEDPFlags bits */ + +#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG (0x8000) +#define MPI2_SCSIIO_EEDPFLAGS_INC_SEC_REFTAG (0x4000) +#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_APPTAG (0x2000) +#define MPI2_SCSIIO_EEDPFLAGS_INC_SEC_APPTAG (0x1000) + +#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG (0x0400) +#define MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG (0x0200) +#define MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD (0x0100) + +#define MPI2_SCSIIO_EEDPFLAGS_PASSTHRU_REFTAG (0x0008) + +#define MPI2_SCSIIO_EEDPFLAGS_MASK_OP (0x0007) +#define MPI2_SCSIIO_EEDPFLAGS_NOOP_OP (0x0000) +#define MPI2_SCSIIO_EEDPFLAGS_CHECK_OP (0x0001) +#define MPI2_SCSIIO_EEDPFLAGS_STRIP_OP (0x0002) +#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP (0x0003) +#define MPI2_SCSIIO_EEDPFLAGS_INSERT_OP (0x0004) +#define MPI2_SCSIIO_EEDPFLAGS_REPLACE_OP (0x0006) +#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REGEN_OP (0x0007) + +/* SCSI IO LUN fields: use MPI2_LUN_ from mpi2.h */ + +/* SCSI IO Control bits */ +#define MPI2_SCSIIO_CONTROL_ADDCDBLEN_MASK (0xFC000000) +#define MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT (26) + +#define MPI2_SCSIIO_CONTROL_DATADIRECTION_MASK (0x03000000) +#define MPI2_SCSIIO_CONTROL_NODATATRANSFER (0x00000000) +#define MPI2_SCSIIO_CONTROL_WRITE (0x01000000) +#define MPI2_SCSIIO_CONTROL_READ (0x02000000) +#define MPI2_SCSIIO_CONTROL_BIDIRECTIONAL (0x03000000) + +#define MPI2_SCSIIO_CONTROL_TASKPRI_MASK (0x00007800) +#define MPI2_SCSIIO_CONTROL_TASKPRI_SHIFT (11) + +#define MPI2_SCSIIO_CONTROL_TASKATTRIBUTE_MASK (0x00000700) +#define MPI2_SCSIIO_CONTROL_SIMPLEQ (0x00000000) +#define MPI2_SCSIIO_CONTROL_HEADOFQ (0x00000100) +#define MPI2_SCSIIO_CONTROL_ORDEREDQ (0x00000200) +#define MPI2_SCSIIO_CONTROL_ACAQ (0x00000400) + +#define MPI2_SCSIIO_CONTROL_TLR_MASK (0x000000C0) +#define MPI2_SCSIIO_CONTROL_NO_TLR (0x00000000) +#define MPI2_SCSIIO_CONTROL_TLR_ON (0x00000040) +#define MPI2_SCSIIO_CONTROL_TLR_OFF (0x00000080) + + +/* MPI v2.5 CDB field */ +typedef union _MPI25_SCSI_IO_CDB_UNION +{ + U8 CDB32[32]; + MPI2_SCSI_IO_CDB_EEDP32 EEDP32; + MPI2_IEEE_SGE_SIMPLE64 SGE; +} MPI25_SCSI_IO_CDB_UNION, MPI2_POINTER PTR_MPI25_SCSI_IO_CDB_UNION, + Mpi25ScsiIoCdb_t, MPI2_POINTER pMpi25ScsiIoCdb_t; + +/* MPI v2.5 SCSI IO Request Message */ +typedef struct _MPI25_SCSI_IO_REQUEST +{ + U16 DevHandle; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U32 SenseBufferLowAddress; /* 0x0C */ + U8 DMAFlags; /* 0x10 */ + U8 Reserved5; /* 0x11 */ + U8 SenseBufferLength; /* 0x12 */ + U8 Reserved4; /* 0x13 */ + U8 SGLOffset0; /* 0x14 */ + U8 SGLOffset1; /* 0x15 */ + U8 SGLOffset2; /* 0x16 */ + U8 SGLOffset3; /* 0x17 */ + U32 SkipCount; /* 0x18 */ + U32 DataLength; /* 0x1C */ + U32 BidirectionalDataLength; /* 0x20 */ + U16 IoFlags; /* 0x24 */ + U16 EEDPFlags; /* 0x26 */ + U16 EEDPBlockSize; /* 0x28 */ + U16 Reserved6; /* 0x2A */ + U32 SecondaryReferenceTag; /* 0x2C */ + U16 SecondaryApplicationTag; /* 0x30 */ + U16 ApplicationTagTranslationMask; /* 0x32 */ + U8 LUN[8]; /* 0x34 */ + U32 Control; /* 0x3C */ + MPI25_SCSI_IO_CDB_UNION CDB; /* 0x40 */ + +#ifdef MPI25_SCSI_IO_VENDOR_UNIQUE_REGION /* typically this is left undefined */ + MPI25_SCSI_IO_VENDOR_UNIQUE VendorRegion; +#endif + + MPI25_SGE_IO_UNION SGL; /* 0x60 */ + +} MPI25_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI25_SCSI_IO_REQUEST, + Mpi25SCSIIORequest_t, MPI2_POINTER pMpi25SCSIIORequest_t; + +/* use MPI2_SCSIIO_MSGFLAGS_ defines for the MsgFlags field */ + +/* Defines for the DMAFlags field + * Each setting affects 4 SGLS, from SGL0 to SGL3. + * D = Data + * C = Cache DIF + * I = Interleaved + * H = Host DIF + */ +#define MPI25_SCSIIO_DMAFLAGS_OP_MASK (0x0F) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_D_D_D (0x00) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_D_D_C (0x01) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_D_D_I (0x02) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_D_C_C (0x03) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_D_C_I (0x04) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_D_I_I (0x05) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_C_C_C (0x06) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_C_C_I (0x07) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_C_I_I (0x08) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_I_I_I (0x09) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_H_D_D (0x0A) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_H_D_C (0x0B) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_H_D_I (0x0C) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_H_C_C (0x0D) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_H_C_I (0x0E) +#define MPI25_SCSIIO_DMAFLAGS_OP_D_H_I_I (0x0F) + +/* number of SGLOffset fields */ +#define MPI25_SCSIIO_NUM_SGLOFFSETS (4) + +/* defines for the IoFlags field */ +#define MPI25_SCSIIO_IOFLAGS_IO_PATH_MASK (0xC000) +#define MPI25_SCSIIO_IOFLAGS_NORMAL_PATH (0x0000) +#define MPI25_SCSIIO_IOFLAGS_FAST_PATH (0x4000) + +#define MPI25_SCSIIO_IOFLAGS_LARGE_CDB (0x1000) +#define MPI25_SCSIIO_IOFLAGS_BIDIRECTIONAL (0x0800) +#define MPI25_SCSIIO_IOFLAGS_CMD_DETERMINES_DATA_DIR (0x0200) +#define MPI25_SCSIIO_IOFLAGS_CDBLENGTH_MASK (0x01FF) + +/* MPI v2.5 defines for the EEDPFlags bits */ +/* use MPI2_SCSIIO_EEDPFLAGS_ defines for the other EEDPFlags bits */ +#define MPI25_SCSIIO_EEDPFLAGS_ESCAPE_MODE_MASK (0x00C0) +#define MPI25_SCSIIO_EEDPFLAGS_COMPATIBLE_MODE (0x0000) +#define MPI25_SCSIIO_EEDPFLAGS_DO_NOT_DISABLE_MODE (0x0040) +#define MPI25_SCSIIO_EEDPFLAGS_APPTAG_DISABLE_MODE (0x0080) +#define MPI25_SCSIIO_EEDPFLAGS_APPTAG_REFTAG_DISABLE_MODE (0x00C0) + +#define MPI25_SCSIIO_EEDPFLAGS_HOST_GUARD_METHOD_MASK (0x0030) +#define MPI25_SCSIIO_EEDPFLAGS_T10_CRC_HOST_GUARD (0x0000) +#define MPI25_SCSIIO_EEDPFLAGS_IP_CHKSUM_HOST_GUARD (0x0010) + +/* use MPI2_LUN_ defines from mpi2.h for the LUN field */ + +/* use MPI2_SCSIIO_CONTROL_ defines for the Control field */ + + +/* NOTE: The SCSI IO Reply is the same for MPI 2.0 and MPI 2.5, so + * MPI2_SCSI_IO_REPLY is used for both. + */ + +/* SCSI IO Error Reply Message */ +typedef struct _MPI2_SCSI_IO_REPLY +{ + U16 DevHandle; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U8 SCSIStatus; /* 0x0C */ + U8 SCSIState; /* 0x0D */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 TransferCount; /* 0x14 */ + U32 SenseCount; /* 0x18 */ + U32 ResponseInfo; /* 0x1C */ + U16 TaskTag; /* 0x20 */ + U16 Reserved4; /* 0x22 */ + U32 BidirectionalTransferCount; /* 0x24 */ + U32 Reserved5; /* 0x28 */ + U32 Reserved6; /* 0x2C */ +} MPI2_SCSI_IO_REPLY, MPI2_POINTER PTR_MPI2_SCSI_IO_REPLY, + Mpi2SCSIIOReply_t, MPI2_POINTER pMpi2SCSIIOReply_t; + +/* SCSI IO Reply SCSIStatus values (SAM-4 status codes) */ + +#define MPI2_SCSI_STATUS_GOOD (0x00) +#define MPI2_SCSI_STATUS_CHECK_CONDITION (0x02) +#define MPI2_SCSI_STATUS_CONDITION_MET (0x04) +#define MPI2_SCSI_STATUS_BUSY (0x08) +#define MPI2_SCSI_STATUS_INTERMEDIATE (0x10) +#define MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET (0x14) +#define MPI2_SCSI_STATUS_RESERVATION_CONFLICT (0x18) +#define MPI2_SCSI_STATUS_COMMAND_TERMINATED (0x22) /* obsolete */ +#define MPI2_SCSI_STATUS_TASK_SET_FULL (0x28) +#define MPI2_SCSI_STATUS_ACA_ACTIVE (0x30) +#define MPI2_SCSI_STATUS_TASK_ABORTED (0x40) + +/* SCSI IO Reply SCSIState flags */ + +#define MPI2_SCSI_STATE_RESPONSE_INFO_VALID (0x10) +#define MPI2_SCSI_STATE_TERMINATED (0x08) +#define MPI2_SCSI_STATE_NO_SCSI_STATUS (0x04) +#define MPI2_SCSI_STATE_AUTOSENSE_FAILED (0x02) +#define MPI2_SCSI_STATE_AUTOSENSE_VALID (0x01) + +/* masks and shifts for the ResponseInfo field */ + +#define MPI2_SCSI_RI_MASK_REASONCODE (0x000000FF) +#define MPI2_SCSI_RI_SHIFT_REASONCODE (0) + +#define MPI2_SCSI_TASKTAG_UNKNOWN (0xFFFF) + + +/**************************************************************************** +* SCSI Task Management messages +****************************************************************************/ + +/* SCSI Task Management Request Message */ +typedef struct _MPI2_SCSI_TASK_MANAGE_REQUEST +{ + U16 DevHandle; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U8 Reserved1; /* 0x04 */ + U8 TaskType; /* 0x05 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U8 LUN[8]; /* 0x0C */ + U32 Reserved4[7]; /* 0x14 */ + U16 TaskMID; /* 0x30 */ + U16 Reserved5; /* 0x32 */ +} MPI2_SCSI_TASK_MANAGE_REQUEST, + MPI2_POINTER PTR_MPI2_SCSI_TASK_MANAGE_REQUEST, + Mpi2SCSITaskManagementRequest_t, + MPI2_POINTER pMpi2SCSITaskManagementRequest_t; + +/* TaskType values */ + +#define MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK (0x01) +#define MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET (0x02) +#define MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET (0x03) +#define MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05) +#define MPI2_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06) +#define MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07) +#define MPI2_SCSITASKMGMT_TASKTYPE_CLR_ACA (0x08) +#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_TASK_SET (0x09) +#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_ASYNC_EVENT (0x0A) + +/* obsolete TaskType name */ +#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_UNIT_ATTENTION (MPI2_SCSITASKMGMT_TASKTYPE_QRY_ASYNC_EVENT) + +/* MsgFlags bits */ + +#define MPI2_SCSITASKMGMT_MSGFLAGS_MASK_TARGET_RESET (0x18) +#define MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET (0x00) +#define MPI2_SCSITASKMGMT_MSGFLAGS_NEXUS_RESET_SRST (0x08) +#define MPI2_SCSITASKMGMT_MSGFLAGS_SAS_HARD_LINK_RESET (0x10) + +#define MPI2_SCSITASKMGMT_MSGFLAGS_DO_NOT_SEND_TASK_IU (0x01) + + + +/* SCSI Task Management Reply Message */ +typedef struct _MPI2_SCSI_TASK_MANAGE_REPLY +{ + U16 DevHandle; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U8 ResponseCode; /* 0x04 */ + U8 TaskType; /* 0x05 */ + U8 Reserved1; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U16 Reserved3; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 TerminationCount; /* 0x14 */ + U32 ResponseInfo; /* 0x18 */ +} MPI2_SCSI_TASK_MANAGE_REPLY, + MPI2_POINTER PTR_MPI2_SCSI_TASK_MANAGE_REPLY, + Mpi2SCSITaskManagementReply_t, MPI2_POINTER pMpi2SCSIManagementReply_t; + +/* ResponseCode values */ + +#define MPI2_SCSITASKMGMT_RSP_TM_COMPLETE (0x00) +#define MPI2_SCSITASKMGMT_RSP_INVALID_FRAME (0x02) +#define MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED (0x04) +#define MPI2_SCSITASKMGMT_RSP_TM_FAILED (0x05) +#define MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08) +#define MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09) +#define MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG (0x0A) +#define MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80) + +/* masks and shifts for the ResponseInfo field */ + +#define MPI2_SCSITASKMGMT_RI_MASK_REASONCODE (0x000000FF) +#define MPI2_SCSITASKMGMT_RI_SHIFT_REASONCODE (0) +#define MPI2_SCSITASKMGMT_RI_MASK_ARI2 (0x0000FF00) +#define MPI2_SCSITASKMGMT_RI_SHIFT_ARI2 (8) +#define MPI2_SCSITASKMGMT_RI_MASK_ARI1 (0x00FF0000) +#define MPI2_SCSITASKMGMT_RI_SHIFT_ARI1 (16) +#define MPI2_SCSITASKMGMT_RI_MASK_ARI0 (0xFF000000) +#define MPI2_SCSITASKMGMT_RI_SHIFT_ARI0 (24) + + +/**************************************************************************** +* SCSI Enclosure Processor messages +****************************************************************************/ + +/* SCSI Enclosure Processor Request Message */ +typedef struct _MPI2_SEP_REQUEST +{ + U16 DevHandle; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U8 Action; /* 0x04 */ + U8 Flags; /* 0x05 */ + U8 Reserved1; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U32 SlotStatus; /* 0x0C */ + U32 Reserved3; /* 0x10 */ + U32 Reserved4; /* 0x14 */ + U32 Reserved5; /* 0x18 */ + U16 Slot; /* 0x1C */ + U16 EnclosureHandle; /* 0x1E */ +} MPI2_SEP_REQUEST, MPI2_POINTER PTR_MPI2_SEP_REQUEST, + Mpi2SepRequest_t, MPI2_POINTER pMpi2SepRequest_t; + +/* Action defines */ +#define MPI2_SEP_REQ_ACTION_WRITE_STATUS (0x00) +#define MPI2_SEP_REQ_ACTION_READ_STATUS (0x01) + +/* Flags defines */ +#define MPI2_SEP_REQ_FLAGS_DEVHANDLE_ADDRESS (0x00) +#define MPI2_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS (0x01) + +/* SlotStatus defines */ +#define MPI2_SEP_REQ_SLOTSTATUS_REQUEST_REMOVE (0x00040000) +#define MPI2_SEP_REQ_SLOTSTATUS_IDENTIFY_REQUEST (0x00020000) +#define MPI2_SEP_REQ_SLOTSTATUS_REBUILD_STOPPED (0x00000200) +#define MPI2_SEP_REQ_SLOTSTATUS_HOT_SPARE (0x00000100) +#define MPI2_SEP_REQ_SLOTSTATUS_UNCONFIGURED (0x00000080) +#define MPI2_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT (0x00000040) +#define MPI2_SEP_REQ_SLOTSTATUS_IN_CRITICAL_ARRAY (0x00000010) +#define MPI2_SEP_REQ_SLOTSTATUS_IN_FAILED_ARRAY (0x00000008) +#define MPI2_SEP_REQ_SLOTSTATUS_DEV_REBUILDING (0x00000004) +#define MPI2_SEP_REQ_SLOTSTATUS_DEV_FAULTY (0x00000002) +#define MPI2_SEP_REQ_SLOTSTATUS_NO_ERROR (0x00000001) + + +/* SCSI Enclosure Processor Reply Message */ +typedef struct _MPI2_SEP_REPLY +{ + U16 DevHandle; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U8 Action; /* 0x04 */ + U8 Flags; /* 0x05 */ + U8 Reserved1; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U16 Reserved3; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 SlotStatus; /* 0x14 */ + U32 Reserved4; /* 0x18 */ + U16 Slot; /* 0x1C */ + U16 EnclosureHandle; /* 0x1E */ +} MPI2_SEP_REPLY, MPI2_POINTER PTR_MPI2_SEP_REPLY, + Mpi2SepReply_t, MPI2_POINTER pMpi2SepReply_t; + +/* SlotStatus defines */ +#define MPI2_SEP_REPLY_SLOTSTATUS_REMOVE_READY (0x00040000) +#define MPI2_SEP_REPLY_SLOTSTATUS_IDENTIFY_REQUEST (0x00020000) +#define MPI2_SEP_REPLY_SLOTSTATUS_REBUILD_STOPPED (0x00000200) +#define MPI2_SEP_REPLY_SLOTSTATUS_HOT_SPARE (0x00000100) +#define MPI2_SEP_REPLY_SLOTSTATUS_UNCONFIGURED (0x00000080) +#define MPI2_SEP_REPLY_SLOTSTATUS_PREDICTED_FAULT (0x00000040) +#define MPI2_SEP_REPLY_SLOTSTATUS_IN_CRITICAL_ARRAY (0x00000010) +#define MPI2_SEP_REPLY_SLOTSTATUS_IN_FAILED_ARRAY (0x00000008) +#define MPI2_SEP_REPLY_SLOTSTATUS_DEV_REBUILDING (0x00000004) +#define MPI2_SEP_REPLY_SLOTSTATUS_DEV_FAULTY (0x00000002) +#define MPI2_SEP_REPLY_SLOTSTATUS_NO_ERROR (0x00000001) + + +#endif + + diff --git a/source/lsi/mpi2_ioc.h b/source/lsi/mpi2_ioc.h new file mode 100755 index 0000000..b37fe03 --- /dev/null +++ b/source/lsi/mpi2_ioc.h @@ -0,0 +1,1721 @@ +/* + * Copyright (c) 2000-2011 LSI Corporation. + * + * + * Name: mpi2_ioc.h + * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages + * Creation Date: October 11, 2006 + * + * mpi2_ioc.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-04-07 02.00.01 In IOCFacts Reply structure, renamed MaxDevices to + * MaxTargets. + * Added TotalImageSize field to FWDownload Request. + * Added reserved words to FWUpload Request. + * 06-26-07 02.00.02 Added IR Configuration Change List Event. + * 08-31-07 02.00.03 Removed SystemReplyQueueDepth field from the IOCInit + * request and replaced it with + * ReplyDescriptorPostQueueDepth and ReplyFreeQueueDepth. + * Replaced the MinReplyQueueDepth field of the IOCFacts + * reply with MaxReplyDescriptorPostQueueDepth. + * Added MPI2_RDPQ_DEPTH_MIN define to specify the minimum + * depth for the Reply Descriptor Post Queue. + * Added SASAddress field to Initiator Device Table + * Overflow Event data. + * 10-31-07 02.00.04 Added ReasonCode MPI2_EVENT_SAS_INIT_RC_NOT_RESPONDING + * for SAS Initiator Device Status Change Event data. + * Modified Reason Code defines for SAS Topology Change + * List Event data, including adding a bit for PHY Vacant + * status, and adding a mask for the Reason Code. + * Added define for + * MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING. + * Added define for MPI2_EXT_IMAGE_TYPE_MEGARAID. + * 12-18-07 02.00.05 Added Boot Status defines for the IOCExceptions field of + * the IOCFacts Reply. + * Removed MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. + * Moved MPI2_VERSION_UNION to mpi2.h. + * Changed MPI2_EVENT_NOTIFICATION_REQUEST to use masks + * instead of enables, and added SASBroadcastPrimitiveMasks + * field. + * Added Log Entry Added Event and related structure. + * 02-29-08 02.00.06 Added define MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID. + * Removed define MPI2_IOCFACTS_PROTOCOL_SMP_TARGET. + * Added MaxVolumes and MaxPersistentEntries fields to + * IOCFacts reply. + * Added ProtocalFlags and IOCCapabilities fields to + * MPI2_FW_IMAGE_HEADER. + * Removed MPI2_PORTENABLE_FLAGS_ENABLE_SINGLE_PORT. + * 03-03-08 02.00.07 Fixed MPI2_FW_IMAGE_HEADER by changing Reserved26 to + * a U16 (from a U32). + * Removed extra 's' from EventMasks name. + * 06-27-08 02.00.08 Fixed an offset in a comment. + * 10-02-08 02.00.09 Removed SystemReplyFrameSize from MPI2_IOC_INIT_REQUEST. + * Removed CurReplyFrameSize from MPI2_IOC_FACTS_REPLY and + * renamed MinReplyFrameSize to ReplyFrameSize. + * Added MPI2_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAX. + * Added two new RAIDOperation values for Integrated RAID + * Operations Status Event data. + * Added four new IR Configuration Change List Event data + * ReasonCode values. + * Added two new ReasonCode defines for SAS Device Status + * Change Event data. + * Added three new DiscoveryStatus bits for the SAS + * Discovery event data. + * Added Multiplexing Status Change bit to the PhyStatus + * field of the SAS Topology Change List event data. + * Removed define for MPI2_INIT_IMAGE_BOOTFLAGS_XMEMCOPY. + * BootFlags are now product-specific. + * Added defines for the indivdual signature bytes + * for MPI2_INIT_IMAGE_FOOTER. + * 01-19-09 02.00.10 Added MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY define. + * Added MPI2_EVENT_SAS_DISC_DS_DOWNSTREAM_INITIATOR + * define. + * Added MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE + * define. + * Removed MPI2_EVENT_SAS_DISC_DS_SATA_INIT_FAILURE define. + * 05-06-09 02.00.11 Added MPI2_IOCFACTS_CAPABILITY_RAID_ACCELERATOR define. + * Added MPI2_IOCFACTS_CAPABILITY_MSI_X_INDEX define. + * Added two new reason codes for SAS Device Status Change + * Event. + * Added new event: SAS PHY Counter. + * 07-30-09 02.00.12 Added GPIO Interrupt event define and structure. + * Added MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER define. + * Added new product id family for 2208. + * 10-28-09 02.00.13 Added HostMSIxVectors field to MPI2_IOC_INIT_REQUEST. + * Added MaxMSIxVectors field to MPI2_IOC_FACTS_REPLY. + * Added MinDevHandle field to MPI2_IOC_FACTS_REPLY. + * Added MPI2_IOCFACTS_CAPABILITY_HOST_BASED_DISCOVERY. + * Added MPI2_EVENT_HOST_BASED_DISCOVERY_PHY define. + * Added MPI2_EVENT_SAS_TOPO_ES_NO_EXPANDER define. + * Added Host Based Discovery Phy Event data. + * Added defines for ProductID Product field + * (MPI2_FW_HEADER_PID_). + * Modified values for SAS ProductID Family + * (MPI2_FW_HEADER_PID_FAMILY_). + * 02-10-10 02.00.14 Added SAS Quiesce Event structure and defines. + * Added PowerManagementControl Request structures and + * defines. + * 05-12-10 02.00.15 Marked Task Set Full Event as obsolete. + * Added MPI2_EVENT_SAS_TOPO_LR_UNSUPPORTED_PHY define. + * 11-10-10 02.00.16 Added MPI2_FW_DOWNLOAD_ITYPE_MIN_PRODUCT_SPECIFIC. + * 02-23-11 02.00.17 Added SAS NOTIFY Primitive event, and added + * SASNotifyPrimitiveMasks field to + * MPI2_EVENT_NOTIFICATION_REQUEST. + * Added Temperature Threshold Event. + * Added Host Message Event. + * Added Send Host Message request and reply. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_IOC_H +#define MPI2_IOC_H + +/***************************************************************************** +* +* IOC Messages +* +*****************************************************************************/ + +/**************************************************************************** +* IOCInit message +****************************************************************************/ + +/* IOCInit Request message */ +typedef struct _MPI2_IOC_INIT_REQUEST +{ + U8 WhoInit; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 MsgVersion; /* 0x0C */ + U16 HeaderVersion; /* 0x0E */ + U32 Reserved5; /* 0x10 */ + U16 Reserved6; /* 0x14 */ + U8 Reserved7; /* 0x16 */ + U8 HostMSIxVectors; /* 0x17 */ + U16 Reserved8; /* 0x18 */ + U16 SystemRequestFrameSize; /* 0x1A */ + U16 ReplyDescriptorPostQueueDepth; /* 0x1C */ + U16 ReplyFreeQueueDepth; /* 0x1E */ + U32 SenseBufferAddressHigh; /* 0x20 */ + U32 SystemReplyAddressHigh; /* 0x24 */ + U64 SystemRequestFrameBaseAddress; /* 0x28 */ + U64 ReplyDescriptorPostQueueAddress;/* 0x30 */ + U64 ReplyFreeQueueAddress; /* 0x38 */ + U64 TimeStamp; /* 0x40 */ +} MPI2_IOC_INIT_REQUEST, MPI2_POINTER PTR_MPI2_IOC_INIT_REQUEST, + Mpi2IOCInitRequest_t, MPI2_POINTER pMpi2IOCInitRequest_t; + +/* WhoInit values */ +#define MPI2_WHOINIT_NOT_INITIALIZED (0x00) +#define MPI2_WHOINIT_SYSTEM_BIOS (0x01) +#define MPI2_WHOINIT_ROM_BIOS (0x02) +#define MPI2_WHOINIT_PCI_PEER (0x03) +#define MPI2_WHOINIT_HOST_DRIVER (0x04) +#define MPI2_WHOINIT_MANUFACTURER (0x05) + +/* MsgVersion */ +#define MPI2_IOCINIT_MSGVERSION_MAJOR_MASK (0xFF00) +#define MPI2_IOCINIT_MSGVERSION_MAJOR_SHIFT (8) +#define MPI2_IOCINIT_MSGVERSION_MINOR_MASK (0x00FF) +#define MPI2_IOCINIT_MSGVERSION_MINOR_SHIFT (0) + +/* HeaderVersion */ +#define MPI2_IOCINIT_HDRVERSION_UNIT_MASK (0xFF00) +#define MPI2_IOCINIT_HDRVERSION_UNIT_SHIFT (8) +#define MPI2_IOCINIT_HDRVERSION_DEV_MASK (0x00FF) +#define MPI2_IOCINIT_HDRVERSION_DEV_SHIFT (0) + +/* minimum depth for the Reply Descriptor Post Queue */ +#define MPI2_RDPQ_DEPTH_MIN (16) + + +/* IOCInit Reply message */ +typedef struct _MPI2_IOC_INIT_REPLY +{ + U8 WhoInit; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_IOC_INIT_REPLY, MPI2_POINTER PTR_MPI2_IOC_INIT_REPLY, + Mpi2IOCInitReply_t, MPI2_POINTER pMpi2IOCInitReply_t; + + +/**************************************************************************** +* IOCFacts message +****************************************************************************/ + +/* IOCFacts Request message */ +typedef struct _MPI2_IOC_FACTS_REQUEST +{ + U16 Reserved1; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ +} MPI2_IOC_FACTS_REQUEST, MPI2_POINTER PTR_MPI2_IOC_FACTS_REQUEST, + Mpi2IOCFactsRequest_t, MPI2_POINTER pMpi2IOCFactsRequest_t; + + +/* IOCFacts Reply message */ +typedef struct _MPI2_IOC_FACTS_REPLY +{ + U16 MsgVersion; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 HeaderVersion; /* 0x04 */ + U8 IOCNumber; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U16 IOCExceptions; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U8 MaxChainDepth; /* 0x14 */ + U8 WhoInit; /* 0x15 */ + U8 NumberOfPorts; /* 0x16 */ + U8 MaxMSIxVectors; /* 0x17 */ + U16 RequestCredit; /* 0x18 */ + U16 ProductID; /* 0x1A */ + U32 IOCCapabilities; /* 0x1C */ + MPI2_VERSION_UNION FWVersion; /* 0x20 */ + U16 IOCRequestFrameSize; /* 0x24 */ + U16 IOCMaxChainSegmentSize; /* 0x26 */ /* MPI 2.5 only; Reserved in MPI 2.0 */ + U16 MaxInitiators; /* 0x28 */ + U16 MaxTargets; /* 0x2A */ + U16 MaxSasExpanders; /* 0x2C */ + U16 MaxEnclosures; /* 0x2E */ + U16 ProtocolFlags; /* 0x30 */ + U16 HighPriorityCredit; /* 0x32 */ + U16 MaxReplyDescriptorPostQueueDepth; /* 0x34 */ + U8 ReplyFrameSize; /* 0x36 */ + U8 MaxVolumes; /* 0x37 */ + U16 MaxDevHandle; /* 0x38 */ + U16 MaxPersistentEntries; /* 0x3A */ + U16 MinDevHandle; /* 0x3C */ + U16 Reserved4; /* 0x3E */ +} MPI2_IOC_FACTS_REPLY, MPI2_POINTER PTR_MPI2_IOC_FACTS_REPLY, + Mpi2IOCFactsReply_t, MPI2_POINTER pMpi2IOCFactsReply_t; + +/* MsgVersion */ +#define MPI2_IOCFACTS_MSGVERSION_MAJOR_MASK (0xFF00) +#define MPI2_IOCFACTS_MSGVERSION_MAJOR_SHIFT (8) +#define MPI2_IOCFACTS_MSGVERSION_MINOR_MASK (0x00FF) +#define MPI2_IOCFACTS_MSGVERSION_MINOR_SHIFT (0) + +/* HeaderVersion */ +#define MPI2_IOCFACTS_HDRVERSION_UNIT_MASK (0xFF00) +#define MPI2_IOCFACTS_HDRVERSION_UNIT_SHIFT (8) +#define MPI2_IOCFACTS_HDRVERSION_DEV_MASK (0x00FF) +#define MPI2_IOCFACTS_HDRVERSION_DEV_SHIFT (0) + +/* IOCExceptions */ +#define MPI2_IOCFACTS_EXCEPT_IR_FOREIGN_CONFIG_MAX (0x0100) + +#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_MASK (0x00E0) +#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_GOOD (0x0000) +#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_BACKUP (0x0020) +#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_RESTORED (0x0040) +#define MPI2_IOCFACTS_EXCEPT_BOOTSTAT_CORRUPT_BACKUP (0x0060) + +#define MPI2_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED (0x0010) +#define MPI2_IOCFACTS_EXCEPT_MANUFACT_CHECKSUM_FAIL (0x0008) +#define MPI2_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL (0x0004) +#define MPI2_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID (0x0002) +#define MPI2_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL (0x0001) + +/* defines for WhoInit field are after the IOCInit Request */ + +/* ProductID field uses MPI2_FW_HEADER_PID_ */ + +/* IOCCapabilities */ +#define MPI25_IOCFACTS_CAPABILITY_FAST_PATH_CAPABLE (0x00020000) +#define MPI2_IOCFACTS_CAPABILITY_HOST_BASED_DISCOVERY (0x00010000) +#define MPI2_IOCFACTS_CAPABILITY_MSI_X_INDEX (0x00008000) +#define MPI2_IOCFACTS_CAPABILITY_RAID_ACCELERATOR (0x00004000) +#define MPI2_IOCFACTS_CAPABILITY_EVENT_REPLAY (0x00002000) +#define MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID (0x00001000) +#define MPI2_IOCFACTS_CAPABILITY_TLR (0x00000800) +#define MPI2_IOCFACTS_CAPABILITY_MULTICAST (0x00000100) +#define MPI2_IOCFACTS_CAPABILITY_BIDIRECTIONAL_TARGET (0x00000080) +#define MPI2_IOCFACTS_CAPABILITY_EEDP (0x00000040) +#define MPI2_IOCFACTS_CAPABILITY_EXTENDED_BUFFER (0x00000020) +#define MPI2_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER (0x00000010) +#define MPI2_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER (0x00000008) +#define MPI2_IOCFACTS_CAPABILITY_TASK_SET_FULL_HANDLING (0x00000004) + +/* ProtocolFlags */ +#define MPI2_IOCFACTS_PROTOCOL_SCSI_TARGET (0x0001) +#define MPI2_IOCFACTS_PROTOCOL_SCSI_INITIATOR (0x0002) + + +/**************************************************************************** +* PortFacts message +****************************************************************************/ + +/* PortFacts Request message */ +typedef struct _MPI2_PORT_FACTS_REQUEST +{ + U16 Reserved1; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 PortNumber; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ +} MPI2_PORT_FACTS_REQUEST, MPI2_POINTER PTR_MPI2_PORT_FACTS_REQUEST, + Mpi2PortFactsRequest_t, MPI2_POINTER pMpi2PortFactsRequest_t; + +/* PortFacts Reply message */ +typedef struct _MPI2_PORT_FACTS_REPLY +{ + U16 Reserved1; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 PortNumber; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U8 Reserved5; /* 0x14 */ + U8 PortType; /* 0x15 */ + U16 Reserved6; /* 0x16 */ + U16 MaxPostedCmdBuffers; /* 0x18 */ + U16 Reserved7; /* 0x1A */ +} MPI2_PORT_FACTS_REPLY, MPI2_POINTER PTR_MPI2_PORT_FACTS_REPLY, + Mpi2PortFactsReply_t, MPI2_POINTER pMpi2PortFactsReply_t; + +/* PortType values */ +#define MPI2_PORTFACTS_PORTTYPE_INACTIVE (0x00) +#define MPI2_PORTFACTS_PORTTYPE_FC (0x10) +#define MPI2_PORTFACTS_PORTTYPE_ISCSI (0x20) +#define MPI2_PORTFACTS_PORTTYPE_SAS_PHYSICAL (0x30) +#define MPI2_PORTFACTS_PORTTYPE_SAS_VIRTUAL (0x31) + + +/**************************************************************************** +* PortEnable message +****************************************************************************/ + +/* PortEnable Request message */ +typedef struct _MPI2_PORT_ENABLE_REQUEST +{ + U16 Reserved1; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U8 Reserved2; /* 0x04 */ + U8 PortFlags; /* 0x05 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ +} MPI2_PORT_ENABLE_REQUEST, MPI2_POINTER PTR_MPI2_PORT_ENABLE_REQUEST, + Mpi2PortEnableRequest_t, MPI2_POINTER pMpi2PortEnableRequest_t; + + +/* PortEnable Reply message */ +typedef struct _MPI2_PORT_ENABLE_REPLY +{ + U16 Reserved1; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U8 Reserved2; /* 0x04 */ + U8 PortFlags; /* 0x05 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_PORT_ENABLE_REPLY, MPI2_POINTER PTR_MPI2_PORT_ENABLE_REPLY, + Mpi2PortEnableReply_t, MPI2_POINTER pMpi2PortEnableReply_t; + + +/**************************************************************************** +* EventNotification message +****************************************************************************/ + +/* EventNotification Request message */ +#define MPI2_EVENT_NOTIFY_EVENTMASK_WORDS (4) + +typedef struct _MPI2_EVENT_NOTIFICATION_REQUEST +{ + U16 Reserved1; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 Reserved5; /* 0x0C */ + U32 Reserved6; /* 0x10 */ + U32 EventMasks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];/* 0x14 */ + U16 SASBroadcastPrimitiveMasks; /* 0x24 */ + U16 SASNotifyPrimitiveMasks; /* 0x26 */ + U32 Reserved8; /* 0x28 */ +} MPI2_EVENT_NOTIFICATION_REQUEST, + MPI2_POINTER PTR_MPI2_EVENT_NOTIFICATION_REQUEST, + Mpi2EventNotificationRequest_t, MPI2_POINTER pMpi2EventNotificationRequest_t; + + +/* EventNotification Reply message */ +typedef struct _MPI2_EVENT_NOTIFICATION_REPLY +{ + U16 EventDataLength; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 AckRequired; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U16 Reserved3; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U16 Event; /* 0x14 */ + U16 Reserved4; /* 0x16 */ + U32 EventContext; /* 0x18 */ + U32 EventData[1]; /* 0x1C */ +} MPI2_EVENT_NOTIFICATION_REPLY, MPI2_POINTER PTR_MPI2_EVENT_NOTIFICATION_REPLY, + Mpi2EventNotificationReply_t, MPI2_POINTER pMpi2EventNotificationReply_t; + +/* AckRequired */ +#define MPI2_EVENT_NOTIFICATION_ACK_NOT_REQUIRED (0x00) +#define MPI2_EVENT_NOTIFICATION_ACK_REQUIRED (0x01) + +/* Event */ +#define MPI2_EVENT_LOG_DATA (0x0001) +#define MPI2_EVENT_STATE_CHANGE (0x0002) +#define MPI2_EVENT_HARD_RESET_RECEIVED (0x0005) +#define MPI2_EVENT_EVENT_CHANGE (0x000A) +#define MPI2_EVENT_TASK_SET_FULL (0x000E) /* obsolete */ +#define MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE (0x000F) +#define MPI2_EVENT_IR_OPERATION_STATUS (0x0014) +#define MPI2_EVENT_SAS_DISCOVERY (0x0016) +#define MPI2_EVENT_SAS_BROADCAST_PRIMITIVE (0x0017) +#define MPI2_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE (0x0018) +#define MPI2_EVENT_SAS_INIT_TABLE_OVERFLOW (0x0019) +#define MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST (0x001C) +#define MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE (0x001D) +#define MPI2_EVENT_IR_VOLUME (0x001E) +#define MPI2_EVENT_IR_PHYSICAL_DISK (0x001F) +#define MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST (0x0020) +#define MPI2_EVENT_LOG_ENTRY_ADDED (0x0021) +#define MPI2_EVENT_SAS_PHY_COUNTER (0x0022) +#define MPI2_EVENT_GPIO_INTERRUPT (0x0023) +#define MPI2_EVENT_HOST_BASED_DISCOVERY_PHY (0x0024) +#define MPI2_EVENT_SAS_QUIESCE (0x0025) +#define MPI2_EVENT_SAS_NOTIFY_PRIMITIVE (0x0026) +#define MPI2_EVENT_TEMP_THRESHOLD (0x0027) +#define MPI2_EVENT_HOST_MESSAGE (0x0028) + + +/* Log Entry Added Event data */ + +/* the following structure matches MPI2_LOG_0_ENTRY in mpi2_cnfg.h */ +#define MPI2_EVENT_DATA_LOG_DATA_LENGTH (0x1C) + +typedef struct _MPI2_EVENT_DATA_LOG_ENTRY_ADDED +{ + U64 TimeStamp; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U16 LogSequence; /* 0x0C */ + U16 LogEntryQualifier; /* 0x0E */ + U8 VP_ID; /* 0x10 */ + U8 VF_ID; /* 0x11 */ + U16 Reserved2; /* 0x12 */ + U8 LogData[MPI2_EVENT_DATA_LOG_DATA_LENGTH];/* 0x14 */ +} MPI2_EVENT_DATA_LOG_ENTRY_ADDED, + MPI2_POINTER PTR_MPI2_EVENT_DATA_LOG_ENTRY_ADDED, + Mpi2EventDataLogEntryAdded_t, MPI2_POINTER pMpi2EventDataLogEntryAdded_t; + + +/* GPIO Interrupt Event data */ + +typedef struct _MPI2_EVENT_DATA_GPIO_INTERRUPT +{ + U8 GPIONum; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ +} MPI2_EVENT_DATA_GPIO_INTERRUPT, + MPI2_POINTER PTR_MPI2_EVENT_DATA_GPIO_INTERRUPT, + Mpi2EventDataGpioInterrupt_t, MPI2_POINTER pMpi2EventDataGpioInterrupt_t; + + +/* Temperature Threshold Event data */ + +typedef struct _MPI2_EVENT_DATA_TEMPERATURE +{ + U16 Status; /* 0x00 */ + U8 SensorNum; /* 0x02 */ + U8 Reserved1; /* 0x03 */ + U16 CurrentTemperature; /* 0x04 */ + U16 Reserved2; /* 0x06 */ + U32 Reserved3; /* 0x08 */ + U32 Reserved4; /* 0x0C */ +} MPI2_EVENT_DATA_TEMPERATURE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_TEMPERATURE, + Mpi2EventDataTemperature_t, MPI2_POINTER pMpi2EventDataTemperature_t; + +/* Temperature Threshold Event data Status bits */ +#define MPI2_EVENT_TEMPERATURE3_EXCEEDED (0x0008) +#define MPI2_EVENT_TEMPERATURE2_EXCEEDED (0x0004) +#define MPI2_EVENT_TEMPERATURE1_EXCEEDED (0x0002) +#define MPI2_EVENT_TEMPERATURE0_EXCEEDED (0x0001) + + +/* Host Message Event data */ + +typedef struct _MPI2_EVENT_DATA_HOST_MESSAGE +{ + U8 SourceVF_ID; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U32 Reserved3; /* 0x04 */ + U32 HostData[1]; /* 0x08 */ +} MPI2_EVENT_DATA_HOST_MESSAGE, MPI2_POINTER PTR_MPI2_EVENT_DATA_HOST_MESSAGE, + Mpi2EventDataHostMessage_t, MPI2_POINTER pMpi2EventDataHostMessage_t; + + +/* Hard Reset Received Event data */ + +typedef struct _MPI2_EVENT_DATA_HARD_RESET_RECEIVED +{ + U8 Reserved1; /* 0x00 */ + U8 Port; /* 0x01 */ + U16 Reserved2; /* 0x02 */ +} MPI2_EVENT_DATA_HARD_RESET_RECEIVED, + MPI2_POINTER PTR_MPI2_EVENT_DATA_HARD_RESET_RECEIVED, + Mpi2EventDataHardResetReceived_t, + MPI2_POINTER pMpi2EventDataHardResetReceived_t; + + +/* Task Set Full Event data */ +/* this event is obsolete */ + +typedef struct _MPI2_EVENT_DATA_TASK_SET_FULL +{ + U16 DevHandle; /* 0x00 */ + U16 CurrentDepth; /* 0x02 */ +} MPI2_EVENT_DATA_TASK_SET_FULL, MPI2_POINTER PTR_MPI2_EVENT_DATA_TASK_SET_FULL, + Mpi2EventDataTaskSetFull_t, MPI2_POINTER pMpi2EventDataTaskSetFull_t; + + +/* SAS Device Status Change Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE +{ + U16 TaskTag; /* 0x00 */ + U8 ReasonCode; /* 0x02 */ + U8 Reserved1; /* 0x03 */ + U8 ASC; /* 0x04 */ + U8 ASCQ; /* 0x05 */ + U16 DevHandle; /* 0x06 */ + U32 Reserved2; /* 0x08 */ + U64 SASAddress; /* 0x0C */ + U8 LUN[8]; /* 0x14 */ +} MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, + Mpi2EventDataSasDeviceStatusChange_t, + MPI2_POINTER pMpi2EventDataSasDeviceStatusChange_t; + +/* SAS Device Status Change Event data ReasonCode values */ +#define MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA (0x05) +#define MPI2_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED (0x07) +#define MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET (0x08) +#define MPI2_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL (0x09) +#define MPI2_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL (0x0A) +#define MPI2_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL (0x0B) +#define MPI2_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL (0x0C) +#define MPI2_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION (0x0D) +#define MPI2_EVENT_SAS_DEV_STAT_RC_CMP_INTERNAL_DEV_RESET (0x0E) +#define MPI2_EVENT_SAS_DEV_STAT_RC_CMP_TASK_ABORT_INTERNAL (0x0F) +#define MPI2_EVENT_SAS_DEV_STAT_RC_SATA_INIT_FAILURE (0x10) +#define MPI2_EVENT_SAS_DEV_STAT_RC_EXPANDER_REDUCED_FUNCTIONALITY (0x11) +#define MPI2_EVENT_SAS_DEV_STAT_RC_CMP_EXPANDER_REDUCED_FUNCTIONALITY (0x12) + + +/* Integrated RAID Operation Status Event data */ + +typedef struct _MPI2_EVENT_DATA_IR_OPERATION_STATUS +{ + U16 VolDevHandle; /* 0x00 */ + U16 Reserved1; /* 0x02 */ + U8 RAIDOperation; /* 0x04 */ + U8 PercentComplete; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + U32 Resereved3; /* 0x08 */ +} MPI2_EVENT_DATA_IR_OPERATION_STATUS, + MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_OPERATION_STATUS, + Mpi2EventDataIrOperationStatus_t, + MPI2_POINTER pMpi2EventDataIrOperationStatus_t; + +/* Integrated RAID Operation Status Event data RAIDOperation values */ +#define MPI2_EVENT_IR_RAIDOP_RESYNC (0x00) +#define MPI2_EVENT_IR_RAIDOP_ONLINE_CAP_EXPANSION (0x01) +#define MPI2_EVENT_IR_RAIDOP_CONSISTENCY_CHECK (0x02) +#define MPI2_EVENT_IR_RAIDOP_BACKGROUND_INIT (0x03) +#define MPI2_EVENT_IR_RAIDOP_MAKE_DATA_CONSISTENT (0x04) + + +/* Integrated RAID Volume Event data */ + +typedef struct _MPI2_EVENT_DATA_IR_VOLUME +{ + U16 VolDevHandle; /* 0x00 */ + U8 ReasonCode; /* 0x02 */ + U8 Reserved1; /* 0x03 */ + U32 NewValue; /* 0x04 */ + U32 PreviousValue; /* 0x08 */ +} MPI2_EVENT_DATA_IR_VOLUME, MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_VOLUME, + Mpi2EventDataIrVolume_t, MPI2_POINTER pMpi2EventDataIrVolume_t; + +/* Integrated RAID Volume Event data ReasonCode values */ +#define MPI2_EVENT_IR_VOLUME_RC_SETTINGS_CHANGED (0x01) +#define MPI2_EVENT_IR_VOLUME_RC_STATUS_FLAGS_CHANGED (0x02) +#define MPI2_EVENT_IR_VOLUME_RC_STATE_CHANGED (0x03) + + +/* Integrated RAID Physical Disk Event data */ + +typedef struct _MPI2_EVENT_DATA_IR_PHYSICAL_DISK +{ + U16 Reserved1; /* 0x00 */ + U8 ReasonCode; /* 0x02 */ + U8 PhysDiskNum; /* 0x03 */ + U16 PhysDiskDevHandle; /* 0x04 */ + U16 Reserved2; /* 0x06 */ + U16 Slot; /* 0x08 */ + U16 EnclosureHandle; /* 0x0A */ + U32 NewValue; /* 0x0C */ + U32 PreviousValue; /* 0x10 */ +} MPI2_EVENT_DATA_IR_PHYSICAL_DISK, + MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_PHYSICAL_DISK, + Mpi2EventDataIrPhysicalDisk_t, MPI2_POINTER pMpi2EventDataIrPhysicalDisk_t; + +/* Integrated RAID Physical Disk Event data ReasonCode values */ +#define MPI2_EVENT_IR_PHYSDISK_RC_SETTINGS_CHANGED (0x01) +#define MPI2_EVENT_IR_PHYSDISK_RC_STATUS_FLAGS_CHANGED (0x02) +#define MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED (0x03) + + +/* Integrated RAID Configuration Change List Event data */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check NumElements at runtime. + */ +#ifndef MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT +#define MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT (1) +#endif + +typedef struct _MPI2_EVENT_IR_CONFIG_ELEMENT +{ + U16 ElementFlags; /* 0x00 */ + U16 VolDevHandle; /* 0x02 */ + U8 ReasonCode; /* 0x04 */ + U8 PhysDiskNum; /* 0x05 */ + U16 PhysDiskDevHandle; /* 0x06 */ +} MPI2_EVENT_IR_CONFIG_ELEMENT, MPI2_POINTER PTR_MPI2_EVENT_IR_CONFIG_ELEMENT, + Mpi2EventIrConfigElement_t, MPI2_POINTER pMpi2EventIrConfigElement_t; + +/* IR Configuration Change List Event data ElementFlags values */ +#define MPI2_EVENT_IR_CHANGE_EFLAGS_ELEMENT_TYPE_MASK (0x000F) +#define MPI2_EVENT_IR_CHANGE_EFLAGS_VOLUME_ELEMENT (0x0000) +#define MPI2_EVENT_IR_CHANGE_EFLAGS_VOLPHYSDISK_ELEMENT (0x0001) +#define MPI2_EVENT_IR_CHANGE_EFLAGS_HOTSPARE_ELEMENT (0x0002) + +/* IR Configuration Change List Event data ReasonCode values */ +#define MPI2_EVENT_IR_CHANGE_RC_ADDED (0x01) +#define MPI2_EVENT_IR_CHANGE_RC_REMOVED (0x02) +#define MPI2_EVENT_IR_CHANGE_RC_NO_CHANGE (0x03) +#define MPI2_EVENT_IR_CHANGE_RC_HIDE (0x04) +#define MPI2_EVENT_IR_CHANGE_RC_UNHIDE (0x05) +#define MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED (0x06) +#define MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED (0x07) +#define MPI2_EVENT_IR_CHANGE_RC_PD_CREATED (0x08) +#define MPI2_EVENT_IR_CHANGE_RC_PD_DELETED (0x09) + +typedef struct _MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST +{ + U8 NumElements; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 Reserved2; /* 0x02 */ + U8 ConfigNum; /* 0x03 */ + U32 Flags; /* 0x04 */ + MPI2_EVENT_IR_CONFIG_ELEMENT ConfigElement[MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT]; /* 0x08 */ +} MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST, + MPI2_POINTER PTR_MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST, + Mpi2EventDataIrConfigChangeList_t, + MPI2_POINTER pMpi2EventDataIrConfigChangeList_t; + +/* IR Configuration Change List Event data Flags values */ +#define MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG (0x00000001) + + +/* SAS Discovery Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_DISCOVERY +{ + U8 Flags; /* 0x00 */ + U8 ReasonCode; /* 0x01 */ + U8 PhysicalPort; /* 0x02 */ + U8 Reserved1; /* 0x03 */ + U32 DiscoveryStatus; /* 0x04 */ +} MPI2_EVENT_DATA_SAS_DISCOVERY, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_DISCOVERY, + Mpi2EventDataSasDiscovery_t, MPI2_POINTER pMpi2EventDataSasDiscovery_t; + +/* SAS Discovery Event data Flags values */ +#define MPI2_EVENT_SAS_DISC_DEVICE_CHANGE (0x02) +#define MPI2_EVENT_SAS_DISC_IN_PROGRESS (0x01) + +/* SAS Discovery Event data ReasonCode values */ +#define MPI2_EVENT_SAS_DISC_RC_STARTED (0x01) +#define MPI2_EVENT_SAS_DISC_RC_COMPLETED (0x02) + +/* SAS Discovery Event data DiscoveryStatus values */ +#define MPI2_EVENT_SAS_DISC_DS_MAX_ENCLOSURES_EXCEED (0x80000000) +#define MPI2_EVENT_SAS_DISC_DS_MAX_EXPANDERS_EXCEED (0x40000000) +#define MPI2_EVENT_SAS_DISC_DS_MAX_DEVICES_EXCEED (0x20000000) +#define MPI2_EVENT_SAS_DISC_DS_MAX_TOPO_PHYS_EXCEED (0x10000000) +#define MPI2_EVENT_SAS_DISC_DS_DOWNSTREAM_INITIATOR (0x08000000) +#define MPI2_EVENT_SAS_DISC_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE (0x00008000) +#define MPI2_EVENT_SAS_DISC_DS_EXP_MULTI_SUBTRACTIVE (0x00004000) +#define MPI2_EVENT_SAS_DISC_DS_MULTI_PORT_DOMAIN (0x00002000) +#define MPI2_EVENT_SAS_DISC_DS_TABLE_TO_SUBTRACTIVE_LINK (0x00001000) +#define MPI2_EVENT_SAS_DISC_DS_UNSUPPORTED_DEVICE (0x00000800) +#define MPI2_EVENT_SAS_DISC_DS_TABLE_LINK (0x00000400) +#define MPI2_EVENT_SAS_DISC_DS_SUBTRACTIVE_LINK (0x00000200) +#define MPI2_EVENT_SAS_DISC_DS_SMP_CRC_ERROR (0x00000100) +#define MPI2_EVENT_SAS_DISC_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI2_EVENT_SAS_DISC_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI2_EVENT_SAS_DISC_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI2_EVENT_SAS_DISC_DS_SMP_TIMEOUT (0x00000010) +#define MPI2_EVENT_SAS_DISC_DS_MULTIPLE_PORTS (0x00000004) +#define MPI2_EVENT_SAS_DISC_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI2_EVENT_SAS_DISC_DS_LOOP_DETECTED (0x00000001) + + +/* SAS Broadcast Primitive Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE +{ + U8 PhyNum; /* 0x00 */ + U8 Port; /* 0x01 */ + U8 PortWidth; /* 0x02 */ + U8 Primitive; /* 0x03 */ +} MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE, + Mpi2EventDataSasBroadcastPrimitive_t, + MPI2_POINTER pMpi2EventDataSasBroadcastPrimitive_t; + +/* defines for the Primitive field */ +#define MPI2_EVENT_PRIMITIVE_CHANGE (0x01) +#define MPI2_EVENT_PRIMITIVE_SES (0x02) +#define MPI2_EVENT_PRIMITIVE_EXPANDER (0x03) +#define MPI2_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT (0x04) +#define MPI2_EVENT_PRIMITIVE_RESERVED3 (0x05) +#define MPI2_EVENT_PRIMITIVE_RESERVED4 (0x06) +#define MPI2_EVENT_PRIMITIVE_CHANGE0_RESERVED (0x07) +#define MPI2_EVENT_PRIMITIVE_CHANGE1_RESERVED (0x08) + + +/* SAS Notify Primitive Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_NOTIFY_PRIMITIVE +{ + U8 PhyNum; /* 0x00 */ + U8 Port; /* 0x01 */ + U8 Reserved1; /* 0x02 */ + U8 Primitive; /* 0x03 */ +} MPI2_EVENT_DATA_SAS_NOTIFY_PRIMITIVE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_NOTIFY_PRIMITIVE, + Mpi2EventDataSasNotifyPrimitive_t, + MPI2_POINTER pMpi2EventDataSasNotifyPrimitive_t; + +/* defines for the Primitive field */ +#define MPI2_EVENT_NOTIFY_ENABLE_SPINUP (0x01) +#define MPI2_EVENT_NOTIFY_POWER_LOSS_EXPECTED (0x02) +#define MPI2_EVENT_NOTIFY_RESERVED1 (0x03) +#define MPI2_EVENT_NOTIFY_RESERVED2 (0x04) + + +/* SAS Initiator Device Status Change Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE +{ + U8 ReasonCode; /* 0x00 */ + U8 PhysicalPort; /* 0x01 */ + U16 DevHandle; /* 0x02 */ + U64 SASAddress; /* 0x04 */ +} MPI2_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, + Mpi2EventDataSasInitDevStatusChange_t, + MPI2_POINTER pMpi2EventDataSasInitDevStatusChange_t; + +/* SAS Initiator Device Status Change event ReasonCode values */ +#define MPI2_EVENT_SAS_INIT_RC_ADDED (0x01) +#define MPI2_EVENT_SAS_INIT_RC_NOT_RESPONDING (0x02) + + +/* SAS Initiator Device Table Overflow Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW +{ + U16 MaxInit; /* 0x00 */ + U16 CurrentInit; /* 0x02 */ + U64 SASAddress; /* 0x04 */ +} MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, + Mpi2EventDataSasInitTableOverflow_t, + MPI2_POINTER pMpi2EventDataSasInitTableOverflow_t; + + +/* SAS Topology Change List Event data */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check NumEntries at runtime. + */ +#ifndef MPI2_EVENT_SAS_TOPO_PHY_COUNT +#define MPI2_EVENT_SAS_TOPO_PHY_COUNT (1) +#endif + +typedef struct _MPI2_EVENT_SAS_TOPO_PHY_ENTRY +{ + U16 AttachedDevHandle; /* 0x00 */ + U8 LinkRate; /* 0x02 */ + U8 PhyStatus; /* 0x03 */ +} MPI2_EVENT_SAS_TOPO_PHY_ENTRY, MPI2_POINTER PTR_MPI2_EVENT_SAS_TOPO_PHY_ENTRY, + Mpi2EventSasTopoPhyEntry_t, MPI2_POINTER pMpi2EventSasTopoPhyEntry_t; + +typedef struct _MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST +{ + U16 EnclosureHandle; /* 0x00 */ + U16 ExpanderDevHandle; /* 0x02 */ + U8 NumPhys; /* 0x04 */ + U8 Reserved1; /* 0x05 */ + U16 Reserved2; /* 0x06 */ + U8 NumEntries; /* 0x08 */ + U8 StartPhyNum; /* 0x09 */ + U8 ExpStatus; /* 0x0A */ + U8 PhysicalPort; /* 0x0B */ + MPI2_EVENT_SAS_TOPO_PHY_ENTRY PHY[MPI2_EVENT_SAS_TOPO_PHY_COUNT]; /* 0x0C*/ +} MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST, + Mpi2EventDataSasTopologyChangeList_t, + MPI2_POINTER pMpi2EventDataSasTopologyChangeList_t; + +/* values for the ExpStatus field */ +#define MPI2_EVENT_SAS_TOPO_ES_NO_EXPANDER (0x00) +#define MPI2_EVENT_SAS_TOPO_ES_ADDED (0x01) +#define MPI2_EVENT_SAS_TOPO_ES_NOT_RESPONDING (0x02) +#define MPI2_EVENT_SAS_TOPO_ES_RESPONDING (0x03) +#define MPI2_EVENT_SAS_TOPO_ES_DELAY_NOT_RESPONDING (0x04) + +/* defines for the LinkRate field */ +#define MPI2_EVENT_SAS_TOPO_LR_CURRENT_MASK (0xF0) +#define MPI2_EVENT_SAS_TOPO_LR_CURRENT_SHIFT (4) +#define MPI2_EVENT_SAS_TOPO_LR_PREV_MASK (0x0F) +#define MPI2_EVENT_SAS_TOPO_LR_PREV_SHIFT (0) + +#define MPI2_EVENT_SAS_TOPO_LR_UNKNOWN_LINK_RATE (0x00) +#define MPI2_EVENT_SAS_TOPO_LR_PHY_DISABLED (0x01) +#define MPI2_EVENT_SAS_TOPO_LR_NEGOTIATION_FAILED (0x02) +#define MPI2_EVENT_SAS_TOPO_LR_SATA_OOB_COMPLETE (0x03) +#define MPI2_EVENT_SAS_TOPO_LR_PORT_SELECTOR (0x04) +#define MPI2_EVENT_SAS_TOPO_LR_SMP_RESET_IN_PROGRESS (0x05) +#define MPI2_EVENT_SAS_TOPO_LR_UNSUPPORTED_PHY (0x06) +#define MPI2_EVENT_SAS_TOPO_LR_RATE_1_5 (0x08) +#define MPI2_EVENT_SAS_TOPO_LR_RATE_3_0 (0x09) +#define MPI2_EVENT_SAS_TOPO_LR_RATE_6_0 (0x0A) +#define MPI25_EVENT_SAS_TOPO_LR_RATE_12_0 (0x0B) + +/* values for the PhyStatus field */ +#define MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT (0x80) +#define MPI2_EVENT_SAS_TOPO_PS_MULTIPLEX_CHANGE (0x10) +/* values for the PhyStatus ReasonCode sub-field */ +#define MPI2_EVENT_SAS_TOPO_RC_MASK (0x0F) +#define MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED (0x01) +#define MPI2_EVENT_SAS_TOPO_RC_TARG_NOT_RESPONDING (0x02) +#define MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED (0x03) +#define MPI2_EVENT_SAS_TOPO_RC_NO_CHANGE (0x04) +#define MPI2_EVENT_SAS_TOPO_RC_DELAY_NOT_RESPONDING (0x05) + + +/* SAS Enclosure Device Status Change Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE +{ + U16 EnclosureHandle; /* 0x00 */ + U8 ReasonCode; /* 0x02 */ + U8 PhysicalPort; /* 0x03 */ + U64 EnclosureLogicalID; /* 0x04 */ + U16 NumSlots; /* 0x0C */ + U16 StartSlot; /* 0x0E */ + U32 PhyBits; /* 0x10 */ +} MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE, + Mpi2EventDataSasEnclDevStatusChange_t, + MPI2_POINTER pMpi2EventDataSasEnclDevStatusChange_t; + +/* SAS Enclosure Device Status Change event ReasonCode values */ +#define MPI2_EVENT_SAS_ENCL_RC_ADDED (0x01) +#define MPI2_EVENT_SAS_ENCL_RC_NOT_RESPONDING (0x02) + + +/* SAS PHY Counter Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_PHY_COUNTER +{ + U64 TimeStamp; /* 0x00 */ + U32 Reserved1; /* 0x08 */ + U8 PhyEventCode; /* 0x0C */ + U8 PhyNum; /* 0x0D */ + U16 Reserved2; /* 0x0E */ + U32 PhyEventInfo; /* 0x10 */ + U8 CounterType; /* 0x14 */ + U8 ThresholdWindow; /* 0x15 */ + U8 TimeUnits; /* 0x16 */ + U8 Reserved3; /* 0x17 */ + U32 EventThreshold; /* 0x18 */ + U16 ThresholdFlags; /* 0x1C */ + U16 Reserved4; /* 0x1E */ +} MPI2_EVENT_DATA_SAS_PHY_COUNTER, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_PHY_COUNTER, + Mpi2EventDataSasPhyCounter_t, MPI2_POINTER pMpi2EventDataSasPhyCounter_t; + +/* use MPI2_SASPHY3_EVENT_CODE_ values from mpi2_cnfg.h for the PhyEventCode field */ + +/* use MPI2_SASPHY3_COUNTER_TYPE_ values from mpi2_cnfg.h for the CounterType field */ + +/* use MPI2_SASPHY3_TIME_UNITS_ values from mpi2_cnfg.h for the TimeUnits field */ + +/* use MPI2_SASPHY3_TFLAGS_ values from mpi2_cnfg.h for the ThresholdFlags field */ + + +/* SAS Quiesce Event data */ + +typedef struct _MPI2_EVENT_DATA_SAS_QUIESCE +{ + U8 ReasonCode; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U32 Reserved3; /* 0x04 */ +} MPI2_EVENT_DATA_SAS_QUIESCE, + MPI2_POINTER PTR_MPI2_EVENT_DATA_SAS_QUIESCE, + Mpi2EventDataSasQuiesce_t, MPI2_POINTER pMpi2EventDataSasQuiesce_t; + +/* SAS Quiesce Event data ReasonCode values */ +#define MPI2_EVENT_SAS_QUIESCE_RC_STARTED (0x01) +#define MPI2_EVENT_SAS_QUIESCE_RC_COMPLETED (0x02) + + +/* Host Based Discovery Phy Event data */ + +typedef struct _MPI2_EVENT_HBD_PHY_SAS +{ + U8 Flags; /* 0x00 */ + U8 NegotiatedLinkRate; /* 0x01 */ + U8 PhyNum; /* 0x02 */ + U8 PhysicalPort; /* 0x03 */ + U32 Reserved1; /* 0x04 */ + U8 InitialFrame[28]; /* 0x08 */ +} MPI2_EVENT_HBD_PHY_SAS, MPI2_POINTER PTR_MPI2_EVENT_HBD_PHY_SAS, + Mpi2EventHbdPhySas_t, MPI2_POINTER pMpi2EventHbdPhySas_t; + +/* values for the Flags field */ +#define MPI2_EVENT_HBD_SAS_FLAGS_FRAME_VALID (0x02) +#define MPI2_EVENT_HBD_SAS_FLAGS_SATA_FRAME (0x01) + +/* use MPI2_SAS_NEG_LINK_RATE_ defines from mpi2_cnfg.h for the NegotiatedLinkRate field */ + +typedef union _MPI2_EVENT_HBD_DESCRIPTOR +{ + MPI2_EVENT_HBD_PHY_SAS Sas; +} MPI2_EVENT_HBD_DESCRIPTOR, MPI2_POINTER PTR_MPI2_EVENT_HBD_DESCRIPTOR, + Mpi2EventHbdDescriptor_t, MPI2_POINTER pMpi2EventHbdDescriptor_t; + +typedef struct _MPI2_EVENT_DATA_HBD_PHY +{ + U8 DescriptorType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U32 Reserved3; /* 0x04 */ + MPI2_EVENT_HBD_DESCRIPTOR Descriptor; /* 0x08 */ +} MPI2_EVENT_DATA_HBD_PHY, MPI2_POINTER PTR_MPI2_EVENT_DATA_HBD_PHY, + Mpi2EventDataHbdPhy_t, MPI2_POINTER pMpi2EventDataMpi2EventDataHbdPhy_t; + +/* values for the DescriptorType field */ +#define MPI2_EVENT_HBD_DT_SAS (0x01) + + + +/**************************************************************************** +* EventAck message +****************************************************************************/ + +/* EventAck Request message */ +typedef struct _MPI2_EVENT_ACK_REQUEST +{ + U16 Reserved1; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Event; /* 0x0C */ + U16 Reserved5; /* 0x0E */ + U32 EventContext; /* 0x10 */ +} MPI2_EVENT_ACK_REQUEST, MPI2_POINTER PTR_MPI2_EVENT_ACK_REQUEST, + Mpi2EventAckRequest_t, MPI2_POINTER pMpi2EventAckRequest_t; + + +/* EventAck Reply message */ +typedef struct _MPI2_EVENT_ACK_REPLY +{ + U16 Reserved1; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_EVENT_ACK_REPLY, MPI2_POINTER PTR_MPI2_EVENT_ACK_REPLY, + Mpi2EventAckReply_t, MPI2_POINTER pMpi2EventAckReply_t; + + +/**************************************************************************** +* SendHostMessage message +****************************************************************************/ + +/* SendHostMessage Request message */ +typedef struct _MPI2_SEND_HOST_MESSAGE_REQUEST +{ + U16 HostDataLength; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U8 Reserved4; /* 0x0C */ + U8 DestVF_ID; /* 0x0D */ + U16 Reserved5; /* 0x0E */ + U32 Reserved6; /* 0x10 */ + U32 Reserved7; /* 0x14 */ + U32 Reserved8; /* 0x18 */ + U32 Reserved9; /* 0x1C */ + U32 Reserved10; /* 0x20 */ + U32 HostData[1]; /* 0x24 */ +} MPI2_SEND_HOST_MESSAGE_REQUEST, + MPI2_POINTER PTR_MPI2_SEND_HOST_MESSAGE_REQUEST, + Mpi2SendHostMessageRequest_t, MPI2_POINTER pMpi2SendHostMessageRequest_t; + + +/* SendHostMessage Reply message */ +typedef struct _MPI2_SEND_HOST_MESSAGE_REPLY +{ + U16 HostDataLength; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_SEND_HOST_MESSAGE_REPLY, MPI2_POINTER PTR_MPI2_SEND_HOST_MESSAGE_REPLY, + Mpi2SendHostMessageReply_t, MPI2_POINTER pMpi2SendHostMessageReply_t; + + +/**************************************************************************** +* FWDownload message +****************************************************************************/ + +/* MPI v2.0 FWDownload Request message */ +typedef struct _MPI2_FW_DOWNLOAD_REQUEST +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 TotalImageSize; /* 0x0C */ + U32 Reserved5; /* 0x10 */ + MPI2_MPI_SGE_UNION SGL; /* 0x14 */ +} MPI2_FW_DOWNLOAD_REQUEST, MPI2_POINTER PTR_MPI2_FW_DOWNLOAD_REQUEST, + Mpi2FWDownloadRequest, MPI2_POINTER pMpi2FWDownloadRequest; + +#define MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT (0x01) + +#define MPI2_FW_DOWNLOAD_ITYPE_FW (0x01) +#define MPI2_FW_DOWNLOAD_ITYPE_BIOS (0x02) +#define MPI2_FW_DOWNLOAD_ITYPE_MANUFACTURING (0x06) +#define MPI2_FW_DOWNLOAD_ITYPE_CONFIG_1 (0x07) +#define MPI2_FW_DOWNLOAD_ITYPE_CONFIG_2 (0x08) +#define MPI2_FW_DOWNLOAD_ITYPE_MEGARAID (0x09) +#define MPI2_FW_DOWNLOAD_ITYPE_COMPLETE (0x0A) +#define MPI2_FW_DOWNLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B) +#define MPI2_FW_DOWNLOAD_ITYPE_MIN_PRODUCT_SPECIFIC (0xF0) + +/* MPI v2.0 FWDownload TransactionContext Element */ +typedef struct _MPI2_FW_DOWNLOAD_TCSGE +{ + U8 Reserved1; /* 0x00 */ + U8 ContextSize; /* 0x01 */ + U8 DetailsLength; /* 0x02 */ + U8 Flags; /* 0x03 */ + U32 Reserved2; /* 0x04 */ + U32 ImageOffset; /* 0x08 */ + U32 ImageSize; /* 0x0C */ +} MPI2_FW_DOWNLOAD_TCSGE, MPI2_POINTER PTR_MPI2_FW_DOWNLOAD_TCSGE, + Mpi2FWDownloadTCSGE_t, MPI2_POINTER pMpi2FWDownloadTCSGE_t; + + +/* MPI v2.5 FWDownload Request message */ +typedef struct _MPI25_FW_DOWNLOAD_REQUEST +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 TotalImageSize; /* 0x0C */ + U32 Reserved5; /* 0x10 */ + U32 Reserved6; /* 0x14 */ + U32 ImageOffset; /* 0x18 */ + U32 ImageSize; /* 0x1C */ + MPI25_SGE_IO_UNION SGL; /* 0x20 */ +} MPI25_FW_DOWNLOAD_REQUEST, MPI2_POINTER PTR_MPI25_FW_DOWNLOAD_REQUEST, + Mpi25FWDownloadRequest, MPI2_POINTER pMpi25FWDownloadRequest; + + +/* FWDownload Reply message */ +typedef struct _MPI2_FW_DOWNLOAD_REPLY +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_FW_DOWNLOAD_REPLY, MPI2_POINTER PTR_MPI2_FW_DOWNLOAD_REPLY, + Mpi2FWDownloadReply_t, MPI2_POINTER pMpi2FWDownloadReply_t; + + +/**************************************************************************** +* FWUpload message +****************************************************************************/ + +/* MPI v2.0 FWUpload Request message */ +typedef struct _MPI2_FW_UPLOAD_REQUEST +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 Reserved5; /* 0x0C */ + U32 Reserved6; /* 0x10 */ + MPI2_MPI_SGE_UNION SGL; /* 0x14 */ +} MPI2_FW_UPLOAD_REQUEST, MPI2_POINTER PTR_MPI2_FW_UPLOAD_REQUEST, + Mpi2FWUploadRequest_t, MPI2_POINTER pMpi2FWUploadRequest_t; + +#define MPI2_FW_UPLOAD_ITYPE_FW_CURRENT (0x00) +#define MPI2_FW_UPLOAD_ITYPE_FW_FLASH (0x01) +#define MPI2_FW_UPLOAD_ITYPE_BIOS_FLASH (0x02) +#define MPI2_FW_UPLOAD_ITYPE_FW_BACKUP (0x05) +#define MPI2_FW_UPLOAD_ITYPE_MANUFACTURING (0x06) +#define MPI2_FW_UPLOAD_ITYPE_CONFIG_1 (0x07) +#define MPI2_FW_UPLOAD_ITYPE_CONFIG_2 (0x08) +#define MPI2_FW_UPLOAD_ITYPE_MEGARAID (0x09) +#define MPI2_FW_UPLOAD_ITYPE_COMPLETE (0x0A) +#define MPI2_FW_UPLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B) + +/* MPI v2.0 FWUpload TransactionContext Element */ +typedef struct _MPI2_FW_UPLOAD_TCSGE +{ + U8 Reserved1; /* 0x00 */ + U8 ContextSize; /* 0x01 */ + U8 DetailsLength; /* 0x02 */ + U8 Flags; /* 0x03 */ + U32 Reserved2; /* 0x04 */ + U32 ImageOffset; /* 0x08 */ + U32 ImageSize; /* 0x0C */ +} MPI2_FW_UPLOAD_TCSGE, MPI2_POINTER PTR_MPI2_FW_UPLOAD_TCSGE, + Mpi2FWUploadTCSGE_t, MPI2_POINTER pMpi2FWUploadTCSGE_t; + + +/* MPI v2.5 FWUpload Request message */ +typedef struct _MPI25_FW_UPLOAD_REQUEST +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 Reserved5; /* 0x0C */ + U32 Reserved6; /* 0x10 */ + U32 Reserved7; /* 0x14 */ + U32 ImageOffset; /* 0x18 */ + U32 ImageSize; /* 0x1C */ + MPI25_SGE_IO_UNION SGL; /* 0x20 */ +} MPI25_FW_UPLOAD_REQUEST, MPI2_POINTER PTR_MPI25_FW_UPLOAD_REQUEST, + Mpi25FWUploadRequest_t, MPI2_POINTER pMpi25FWUploadRequest_t; + + +/* FWUpload Reply message */ +typedef struct _MPI2_FW_UPLOAD_REPLY +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 ActualImageSize; /* 0x14 */ +} MPI2_FW_UPLOAD_REPLY, MPI2_POINTER PTR_MPI2_FW_UPLOAD_REPLY, + Mpi2FWUploadReply_t, MPI2_POINTER pMPi2FWUploadReply_t; + + +/* FW Image Header */ +typedef struct _MPI2_FW_IMAGE_HEADER +{ + U32 Signature; /* 0x00 */ + U32 Signature0; /* 0x04 */ + U32 Signature1; /* 0x08 */ + U32 Signature2; /* 0x0C */ + MPI2_VERSION_UNION MPIVersion; /* 0x10 */ + MPI2_VERSION_UNION FWVersion; /* 0x14 */ + MPI2_VERSION_UNION NVDATAVersion; /* 0x18 */ + MPI2_VERSION_UNION PackageVersion; /* 0x1C */ + U16 VendorID; /* 0x20 */ + U16 ProductID; /* 0x22 */ + U16 ProtocolFlags; /* 0x24 */ + U16 Reserved26; /* 0x26 */ + U32 IOCCapabilities; /* 0x28 */ + U32 ImageSize; /* 0x2C */ + U32 NextImageHeaderOffset; /* 0x30 */ + U32 Checksum; /* 0x34 */ + U32 Reserved38; /* 0x38 */ + U32 Reserved3C; /* 0x3C */ + U32 Reserved40; /* 0x40 */ + U32 Reserved44; /* 0x44 */ + U32 Reserved48; /* 0x48 */ + U32 Reserved4C; /* 0x4C */ + U32 Reserved50; /* 0x50 */ + U32 Reserved54; /* 0x54 */ + U32 Reserved58; /* 0x58 */ + U32 Reserved5C; /* 0x5C */ + U32 Reserved60; /* 0x60 */ + U32 FirmwareVersionNameWhat; /* 0x64 */ + U8 FirmwareVersionName[32]; /* 0x68 */ + U32 VendorNameWhat; /* 0x88 */ + U8 VendorName[32]; /* 0x8C */ + U32 PackageNameWhat; /* 0x88 */ + U8 PackageName[32]; /* 0x8C */ + U32 ReservedD0; /* 0xD0 */ + U32 ReservedD4; /* 0xD4 */ + U32 ReservedD8; /* 0xD8 */ + U32 ReservedDC; /* 0xDC */ + U32 ReservedE0; /* 0xE0 */ + U32 ReservedE4; /* 0xE4 */ + U32 ReservedE8; /* 0xE8 */ + U32 ReservedEC; /* 0xEC */ + U32 ReservedF0; /* 0xF0 */ + U32 ReservedF4; /* 0xF4 */ + U32 ReservedF8; /* 0xF8 */ + U32 ReservedFC; /* 0xFC */ +} MPI2_FW_IMAGE_HEADER, MPI2_POINTER PTR_MPI2_FW_IMAGE_HEADER, + Mpi2FWImageHeader_t, MPI2_POINTER pMpi2FWImageHeader_t; + +/* Signature field */ +#define MPI2_FW_HEADER_SIGNATURE_OFFSET (0x00) +#define MPI2_FW_HEADER_SIGNATURE_MASK (0xFF000000) +#define MPI2_FW_HEADER_SIGNATURE (0xEA000000) + +/* Signature0 field */ +#define MPI2_FW_HEADER_SIGNATURE0_OFFSET (0x04) +#define MPI2_FW_HEADER_SIGNATURE0 (0x5AFAA55A) + +/* Signature1 field */ +#define MPI2_FW_HEADER_SIGNATURE1_OFFSET (0x08) +#define MPI2_FW_HEADER_SIGNATURE1 (0xA55AFAA5) + +/* Signature2 field */ +#define MPI2_FW_HEADER_SIGNATURE2_OFFSET (0x0C) +#define MPI2_FW_HEADER_SIGNATURE2 (0x5AA55AFA) + + +/* defines for using the ProductID field */ +#define MPI2_FW_HEADER_PID_TYPE_MASK (0xF000) +#define MPI2_FW_HEADER_PID_TYPE_SAS (0x2000) + +#define MPI2_FW_HEADER_PID_PROD_MASK (0x0F00) +#define MPI2_FW_HEADER_PID_PROD_A (0x0000) +#define MPI2_FW_HEADER_PID_PROD_TARGET_INITIATOR_SCSI (0x0200) +#define MPI2_FW_HEADER_PID_PROD_IR_SCSI (0x0700) + + +#define MPI2_FW_HEADER_PID_FAMILY_MASK (0x00FF) +/* SAS ProductID Family bits */ +#define MPI2_FW_HEADER_PID_FAMILY_2108_SAS (0x0013) +#define MPI2_FW_HEADER_PID_FAMILY_2208_SAS (0x0014) +#define MPI25_FW_HEADER_PID_FAMILY_3108_SAS (0x0021) + +/* use MPI2_IOCFACTS_PROTOCOL_ defines for ProtocolFlags field */ + +/* use MPI2_IOCFACTS_CAPABILITY_ defines for IOCCapabilities field */ + + +#define MPI2_FW_HEADER_IMAGESIZE_OFFSET (0x2C) +#define MPI2_FW_HEADER_NEXTIMAGE_OFFSET (0x30) +#define MPI2_FW_HEADER_VERNMHWAT_OFFSET (0x64) + +#define MPI2_FW_HEADER_WHAT_SIGNATURE (0x29232840) + +#define MPI2_FW_HEADER_SIZE (0x100) + + +/* Extended Image Header */ +typedef struct _MPI2_EXT_IMAGE_HEADER + +{ + U8 ImageType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U32 Checksum; /* 0x04 */ + U32 ImageSize; /* 0x08 */ + U32 NextImageHeaderOffset; /* 0x0C */ + U32 PackageVersion; /* 0x10 */ + U32 Reserved3; /* 0x14 */ + U32 Reserved4; /* 0x18 */ + U32 Reserved5; /* 0x1C */ + U8 IdentifyString[32]; /* 0x20 */ +} MPI2_EXT_IMAGE_HEADER, MPI2_POINTER PTR_MPI2_EXT_IMAGE_HEADER, + Mpi2ExtImageHeader_t, MPI2_POINTER pMpi2ExtImageHeader_t; + +/* useful offsets */ +#define MPI2_EXT_IMAGE_IMAGETYPE_OFFSET (0x00) +#define MPI2_EXT_IMAGE_IMAGESIZE_OFFSET (0x08) +#define MPI2_EXT_IMAGE_NEXTIMAGE_OFFSET (0x0C) + +#define MPI2_EXT_IMAGE_HEADER_SIZE (0x40) + +/* defines for the ImageType field */ +#define MPI2_EXT_IMAGE_TYPE_UNSPECIFIED (0x00) +#define MPI2_EXT_IMAGE_TYPE_FW (0x01) +#define MPI2_EXT_IMAGE_TYPE_NVDATA (0x03) +#define MPI2_EXT_IMAGE_TYPE_BOOTLOADER (0x04) +#define MPI2_EXT_IMAGE_TYPE_INITIALIZATION (0x05) +#define MPI2_EXT_IMAGE_TYPE_FLASH_LAYOUT (0x06) +#define MPI2_EXT_IMAGE_TYPE_SUPPORTED_DEVICES (0x07) +#define MPI2_EXT_IMAGE_TYPE_MEGARAID (0x08) + +#define MPI2_EXT_IMAGE_TYPE_MAX (MPI2_EXT_IMAGE_TYPE_MEGARAID) + + + +/* FLASH Layout Extended Image Data */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check RegionsPerLayout at runtime. + */ +#ifndef MPI2_FLASH_NUMBER_OF_REGIONS +#define MPI2_FLASH_NUMBER_OF_REGIONS (1) +#endif + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check NumberOfLayouts at runtime. + */ +#ifndef MPI2_FLASH_NUMBER_OF_LAYOUTS +#define MPI2_FLASH_NUMBER_OF_LAYOUTS (1) +#endif + +typedef struct _MPI2_FLASH_REGION +{ + U8 RegionType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 Reserved2; /* 0x02 */ + U32 RegionOffset; /* 0x04 */ + U32 RegionSize; /* 0x08 */ + U32 Reserved3; /* 0x0C */ +} MPI2_FLASH_REGION, MPI2_POINTER PTR_MPI2_FLASH_REGION, + Mpi2FlashRegion_t, MPI2_POINTER pMpi2FlashRegion_t; + +typedef struct _MPI2_FLASH_LAYOUT +{ + U32 FlashSize; /* 0x00 */ + U32 Reserved1; /* 0x04 */ + U32 Reserved2; /* 0x08 */ + U32 Reserved3; /* 0x0C */ + MPI2_FLASH_REGION Region[MPI2_FLASH_NUMBER_OF_REGIONS];/* 0x10 */ +} MPI2_FLASH_LAYOUT, MPI2_POINTER PTR_MPI2_FLASH_LAYOUT, + Mpi2FlashLayout_t, MPI2_POINTER pMpi2FlashLayout_t; + +typedef struct _MPI2_FLASH_LAYOUT_DATA +{ + U8 ImageRevision; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 SizeOfRegion; /* 0x02 */ + U8 Reserved2; /* 0x03 */ + U16 NumberOfLayouts; /* 0x04 */ + U16 RegionsPerLayout; /* 0x06 */ + U16 MinimumSectorAlignment; /* 0x08 */ + U16 Reserved3; /* 0x0A */ + U32 Reserved4; /* 0x0C */ + MPI2_FLASH_LAYOUT Layout[MPI2_FLASH_NUMBER_OF_LAYOUTS];/* 0x10 */ +} MPI2_FLASH_LAYOUT_DATA, MPI2_POINTER PTR_MPI2_FLASH_LAYOUT_DATA, + Mpi2FlashLayoutData_t, MPI2_POINTER pMpi2FlashLayoutData_t; + +/* defines for the RegionType field */ +#define MPI2_FLASH_REGION_UNUSED (0x00) +#define MPI2_FLASH_REGION_FIRMWARE (0x01) +#define MPI2_FLASH_REGION_BIOS (0x02) +#define MPI2_FLASH_REGION_NVDATA (0x03) +#define MPI2_FLASH_REGION_FIRMWARE_BACKUP (0x05) +#define MPI2_FLASH_REGION_MFG_INFORMATION (0x06) +#define MPI2_FLASH_REGION_CONFIG_1 (0x07) +#define MPI2_FLASH_REGION_CONFIG_2 (0x08) +#define MPI2_FLASH_REGION_MEGARAID (0x09) +#define MPI2_FLASH_REGION_INIT (0x0A) + +/* ImageRevision */ +#define MPI2_FLASH_LAYOUT_IMAGE_REVISION (0x00) + + + +/* Supported Devices Extended Image Data */ + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check NumberOfDevices at runtime. + */ +#ifndef MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES +#define MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES (1) +#endif + +typedef struct _MPI2_SUPPORTED_DEVICE +{ + U16 DeviceID; /* 0x00 */ + U16 VendorID; /* 0x02 */ + U16 DeviceIDMask; /* 0x04 */ + U16 Reserved1; /* 0x06 */ + U8 LowPCIRev; /* 0x08 */ + U8 HighPCIRev; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U32 Reserved3; /* 0x0C */ +} MPI2_SUPPORTED_DEVICE, MPI2_POINTER PTR_MPI2_SUPPORTED_DEVICE, + Mpi2SupportedDevice_t, MPI2_POINTER pMpi2SupportedDevice_t; + +typedef struct _MPI2_SUPPORTED_DEVICES_DATA +{ + U8 ImageRevision; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 NumberOfDevices; /* 0x02 */ + U8 Reserved2; /* 0x03 */ + U32 Reserved3; /* 0x04 */ + MPI2_SUPPORTED_DEVICE SupportedDevice[MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES]; /* 0x08 */ +} MPI2_SUPPORTED_DEVICES_DATA, MPI2_POINTER PTR_MPI2_SUPPORTED_DEVICES_DATA, + Mpi2SupportedDevicesData_t, MPI2_POINTER pMpi2SupportedDevicesData_t; + +/* ImageRevision */ +#define MPI2_SUPPORTED_DEVICES_IMAGE_REVISION (0x00) + + +/* Init Extended Image Data */ + +typedef struct _MPI2_INIT_IMAGE_FOOTER + +{ + U32 BootFlags; /* 0x00 */ + U32 ImageSize; /* 0x04 */ + U32 Signature0; /* 0x08 */ + U32 Signature1; /* 0x0C */ + U32 Signature2; /* 0x10 */ + U32 ResetVector; /* 0x14 */ +} MPI2_INIT_IMAGE_FOOTER, MPI2_POINTER PTR_MPI2_INIT_IMAGE_FOOTER, + Mpi2InitImageFooter_t, MPI2_POINTER pMpi2InitImageFooter_t; + +/* defines for the BootFlags field */ +#define MPI2_INIT_IMAGE_BOOTFLAGS_OFFSET (0x00) + +/* defines for the ImageSize field */ +#define MPI2_INIT_IMAGE_IMAGESIZE_OFFSET (0x04) + +/* defines for the Signature0 field */ +#define MPI2_INIT_IMAGE_SIGNATURE0_OFFSET (0x08) +#define MPI2_INIT_IMAGE_SIGNATURE0 (0x5AA55AEA) + +/* defines for the Signature1 field */ +#define MPI2_INIT_IMAGE_SIGNATURE1_OFFSET (0x0C) +#define MPI2_INIT_IMAGE_SIGNATURE1 (0xA55AEAA5) + +/* defines for the Signature2 field */ +#define MPI2_INIT_IMAGE_SIGNATURE2_OFFSET (0x10) +#define MPI2_INIT_IMAGE_SIGNATURE2 (0x5AEAA55A) + +/* Signature fields as individual bytes */ +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_0 (0xEA) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_1 (0x5A) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_2 (0xA5) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_3 (0x5A) + +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_4 (0xA5) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_5 (0xEA) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_6 (0x5A) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_7 (0xA5) + +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_8 (0x5A) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_9 (0xA5) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_A (0xEA) +#define MPI2_INIT_IMAGE_SIGNATURE_BYTE_B (0x5A) + +/* defines for the ResetVector field */ +#define MPI2_INIT_IMAGE_RESETVECTOR_OFFSET (0x14) + + +/**************************************************************************** +* PowerManagementControl message +****************************************************************************/ + +/* PowerManagementControl Request message */ +typedef struct _MPI2_PWR_MGMT_CONTROL_REQUEST +{ + U8 Feature; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U8 Parameter1; /* 0x0C */ + U8 Parameter2; /* 0x0D */ + U8 Parameter3; /* 0x0E */ + U8 Parameter4; /* 0x0F */ + U32 Reserved5; /* 0x10 */ + U32 Reserved6; /* 0x14 */ +} MPI2_PWR_MGMT_CONTROL_REQUEST, MPI2_POINTER PTR_MPI2_PWR_MGMT_CONTROL_REQUEST, + Mpi2PwrMgmtControlRequest_t, MPI2_POINTER pMpi2PwrMgmtControlRequest_t; + +/* defines for the Feature field */ +#define MPI2_PM_CONTROL_FEATURE_DA_PHY_POWER_COND (0x01) +#define MPI2_PM_CONTROL_FEATURE_PORT_WIDTH_MODULATION (0x02) +#define MPI2_PM_CONTROL_FEATURE_PCIE_LINK (0x03) +#define MPI2_PM_CONTROL_FEATURE_IOC_SPEED (0x04) +#define MPI2_PM_CONTROL_FEATURE_GLOBAL_PWR_MGMT_MODE (0x05) /* reserved in MPI 2.0 */ +#define MPI2_PM_CONTROL_FEATURE_MIN_PRODUCT_SPECIFIC (0x80) +#define MPI2_PM_CONTROL_FEATURE_MAX_PRODUCT_SPECIFIC (0xFF) + +/* parameter usage for the MPI2_PM_CONTROL_FEATURE_DA_PHY_POWER_COND Feature */ +/* Parameter1 contains a PHY number */ +/* Parameter2 indicates power condition action using these defines */ +#define MPI2_PM_CONTROL_PARAM2_PARTIAL (0x01) +#define MPI2_PM_CONTROL_PARAM2_SLUMBER (0x02) +#define MPI2_PM_CONTROL_PARAM2_EXIT_PWR_MGMT (0x03) +/* Parameter3 and Parameter4 are reserved */ + +/* parameter usage for the MPI2_PM_CONTROL_FEATURE_PORT_WIDTH_MODULATION Feature */ +/* Parameter1 contains SAS port width modulation group number */ +/* Parameter2 indicates IOC action using these defines */ +#define MPI2_PM_CONTROL_PARAM2_REQUEST_OWNERSHIP (0x01) +#define MPI2_PM_CONTROL_PARAM2_CHANGE_MODULATION (0x02) +#define MPI2_PM_CONTROL_PARAM2_RELINQUISH_OWNERSHIP (0x03) +/* Parameter3 indicates desired modulation level using these defines */ +#define MPI2_PM_CONTROL_PARAM3_25_PERCENT (0x00) +#define MPI2_PM_CONTROL_PARAM3_50_PERCENT (0x01) +#define MPI2_PM_CONTROL_PARAM3_75_PERCENT (0x02) +#define MPI2_PM_CONTROL_PARAM3_100_PERCENT (0x03) +/* Parameter4 is reserved */ + +/* parameter usage for the MPI2_PM_CONTROL_FEATURE_PCIE_LINK Feature */ +/* Parameter1 indicates desired PCIe link speed using these defines */ +#define MPI2_PM_CONTROL_PARAM1_PCIE_2_5_GBPS (0x00) +#define MPI2_PM_CONTROL_PARAM1_PCIE_5_0_GBPS (0x01) +#define MPI2_PM_CONTROL_PARAM1_PCIE_8_0_GBPS (0x02) +/* Parameter2 indicates desired PCIe link width using these defines */ +#define MPI2_PM_CONTROL_PARAM2_WIDTH_X1 (0x01) +#define MPI2_PM_CONTROL_PARAM2_WIDTH_X2 (0x02) +#define MPI2_PM_CONTROL_PARAM2_WIDTH_X4 (0x04) +#define MPI2_PM_CONTROL_PARAM2_WIDTH_X8 (0x08) +/* Parameter3 and Parameter4 are reserved */ + +/* parameter usage for the MPI2_PM_CONTROL_FEATURE_IOC_SPEED Feature */ +/* Parameter1 indicates desired IOC hardware clock speed using these defines */ +#define MPI2_PM_CONTROL_PARAM1_FULL_IOC_SPEED (0x01) +#define MPI2_PM_CONTROL_PARAM1_HALF_IOC_SPEED (0x02) +#define MPI2_PM_CONTROL_PARAM1_QUARTER_IOC_SPEED (0x04) +#define MPI2_PM_CONTROL_PARAM1_EIGHTH_IOC_SPEED (0x08) +/* Parameter2, Parameter3, and Parameter4 are reserved */ + +/* parameter usage for the MPI2_PM_CONTROL_FEATURE_GLOBAL_PWR_MGMT_MODE Feature */ +/* Parameter1 indicates host action regarding global power management mode */ +#define MPI2_PM_CONTROL_PARAM1_TAKE_CONTROL (0x01) +#define MPI2_PM_CONTROL_PARAM1_CHANGE_GLOBAL_MODE (0x02) +#define MPI2_PM_CONTROL_PARAM1_RELEASE_CONTROL (0x03) +/* Parameter2 indicates the requested global power management mode */ +#define MPI2_PM_CONTROL_PARAM2_FULL_PWR_PERF (0x01) +#define MPI2_PM_CONTROL_PARAM2_REDUCED_PWR_PERF (0x08) +#define MPI2_PM_CONTROL_PARAM2_STANDBY (0x40) +/* Parameter3 and Parameter4 are reserved */ + + +/* PowerManagementControl Reply message */ +typedef struct _MPI2_PWR_MGMT_CONTROL_REPLY +{ + U8 Feature; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_PWR_MGMT_CONTROL_REPLY, MPI2_POINTER PTR_MPI2_PWR_MGMT_CONTROL_REPLY, + Mpi2PwrMgmtControlReply_t, MPI2_POINTER pMpi2PwrMgmtControlReply_t; + + +#endif + diff --git a/source/lsi/mpi2_ra.h b/source/lsi/mpi2_ra.h new file mode 100755 index 0000000..d88cfd2 --- /dev/null +++ b/source/lsi/mpi2_ra.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2009 LSI Corporation. + * + * + * Name: mpi2_ra.h + * Title: MPI RAID Accelerator messages and structures + * Creation Date: April 13, 2009 + * + * mpi2_ra.h Version: 02.00.00 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-06-09 02.00.00 Initial version. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_RA_H +#define MPI2_RA_H + +/* generic structure for RAID Accelerator Control Block */ +typedef struct _MPI2_RAID_ACCELERATOR_CONTROL_BLOCK +{ + U32 Reserved[8]; /* 0x00 */ + U32 RaidAcceleratorCDB[1]; /* 0x20 */ +} MPI2_RAID_ACCELERATOR_CONTROL_BLOCK, + MPI2_POINTER PTR_MPI2_RAID_ACCELERATOR_CONTROL_BLOCK, + Mpi2RAIDAcceleratorControlBlock_t, + MPI2_POINTER pMpi2RAIDAcceleratorControlBlock_t; + + +/****************************************************************************** +* +* RAID Accelerator Messages +* +*******************************************************************************/ + +/* RAID Accelerator Request Message */ +typedef struct _MPI2_RAID_ACCELERATOR_REQUEST +{ + U16 Reserved0; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U64 RaidAcceleratorControlBlockAddress; /* 0x0C */ + U8 DmaEngineNumber; /* 0x14 */ + U8 Reserved4; /* 0x15 */ + U16 Reserved5; /* 0x16 */ + U32 Reserved6; /* 0x18 */ + U32 Reserved7; /* 0x1C */ + U32 Reserved8; /* 0x20 */ +} MPI2_RAID_ACCELERATOR_REQUEST, MPI2_POINTER PTR_MPI2_RAID_ACCELERATOR_REQUEST, + Mpi2RAIDAcceleratorRequest_t, MPI2_POINTER pMpi2RAIDAcceleratorRequest_t; + + +/* RAID Accelerator Error Reply Message */ +typedef struct _MPI2_RAID_ACCELERATOR_REPLY +{ + U16 Reserved0; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 ProductSpecificData[3]; /* 0x14 */ +} MPI2_RAID_ACCELERATOR_REPLY, MPI2_POINTER PTR_MPI2_RAID_ACCELERATOR_REPLY, + Mpi2RAIDAcceleratorReply_t, MPI2_POINTER pMpi2RAIDAcceleratorReply_t; + + +#endif + + diff --git a/source/lsi/mpi2_raid.h b/source/lsi/mpi2_raid.h new file mode 100755 index 0000000..d33dd6b --- /dev/null +++ b/source/lsi/mpi2_raid.h @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2000-2010 LSI Corporation. + * + * + * Name: mpi2_raid.h + * Title: MPI Integrated RAID messages and structures + * Creation Date: April 26, 2007 + * + * mpi2_raid.h Version: 02.00.05 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 08-31-07 02.00.01 Modifications to RAID Action request and reply, + * including the Actions and ActionData. + * 02-29-08 02.00.02 Added MPI2_RAID_ACTION_ADATA_DISABL_FULL_REBUILD. + * 05-21-08 02.00.03 Added MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS so that + * the PhysDisk array in MPI2_RAID_VOLUME_CREATION_STRUCT + * can be sized by the build environment. + * 07-30-09 02.00.04 Added proper define for the Use Default Settings bit of + * VolumeCreationFlags and marked the old one as obsolete. + * 05-12-10 02.00.05 Added MPI2_RAID_VOL_FLAGS_OP_MDC define. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_RAID_H +#define MPI2_RAID_H + +/***************************************************************************** +* +* Integrated RAID Messages +* +*****************************************************************************/ + +/**************************************************************************** +* RAID Action messages +****************************************************************************/ + +/* ActionDataWord defines for use with MPI2_RAID_ACTION_DELETE_VOLUME action */ +#define MPI2_RAID_ACTION_ADATA_KEEP_LBA0 (0x00000000) +#define MPI2_RAID_ACTION_ADATA_ZERO_LBA0 (0x00000001) + +/* use MPI2_RAIDVOL0_SETTING_ defines from mpi2_cnfg.h for MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE action */ + +/* ActionDataWord defines for use with MPI2_RAID_ACTION_DISABLE_ALL_VOLUMES action */ +#define MPI2_RAID_ACTION_ADATA_DISABL_FULL_REBUILD (0x00000001) + +/* ActionDataWord for MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE Action */ +typedef struct _MPI2_RAID_ACTION_RATE_DATA +{ + U8 RateToChange; /* 0x00 */ + U8 RateOrMode; /* 0x01 */ + U16 DataScrubDuration; /* 0x02 */ +} MPI2_RAID_ACTION_RATE_DATA, MPI2_POINTER PTR_MPI2_RAID_ACTION_RATE_DATA, + Mpi2RaidActionRateData_t, MPI2_POINTER pMpi2RaidActionRateData_t; + +#define MPI2_RAID_ACTION_SET_RATE_RESYNC (0x00) +#define MPI2_RAID_ACTION_SET_RATE_DATA_SCRUB (0x01) +#define MPI2_RAID_ACTION_SET_RATE_POWERSAVE_MODE (0x02) + +/* ActionDataWord for MPI2_RAID_ACTION_START_RAID_FUNCTION Action */ +typedef struct _MPI2_RAID_ACTION_START_RAID_FUNCTION +{ + U8 RAIDFunction; /* 0x00 */ + U8 Flags; /* 0x01 */ + U16 Reserved1; /* 0x02 */ +} MPI2_RAID_ACTION_START_RAID_FUNCTION, + MPI2_POINTER PTR_MPI2_RAID_ACTION_START_RAID_FUNCTION, + Mpi2RaidActionStartRaidFunction_t, + MPI2_POINTER pMpi2RaidActionStartRaidFunction_t; + +/* defines for the RAIDFunction field */ +#define MPI2_RAID_ACTION_START_BACKGROUND_INIT (0x00) +#define MPI2_RAID_ACTION_START_ONLINE_CAP_EXPANSION (0x01) +#define MPI2_RAID_ACTION_START_CONSISTENCY_CHECK (0x02) + +/* defines for the Flags field */ +#define MPI2_RAID_ACTION_START_NEW (0x00) +#define MPI2_RAID_ACTION_START_RESUME (0x01) + +/* ActionDataWord for MPI2_RAID_ACTION_STOP_RAID_FUNCTION Action */ +typedef struct _MPI2_RAID_ACTION_STOP_RAID_FUNCTION +{ + U8 RAIDFunction; /* 0x00 */ + U8 Flags; /* 0x01 */ + U16 Reserved1; /* 0x02 */ +} MPI2_RAID_ACTION_STOP_RAID_FUNCTION, + MPI2_POINTER PTR_MPI2_RAID_ACTION_STOP_RAID_FUNCTION, + Mpi2RaidActionStopRaidFunction_t, + MPI2_POINTER pMpi2RaidActionStopRaidFunction_t; + +/* defines for the RAIDFunction field */ +#define MPI2_RAID_ACTION_STOP_BACKGROUND_INIT (0x00) +#define MPI2_RAID_ACTION_STOP_ONLINE_CAP_EXPANSION (0x01) +#define MPI2_RAID_ACTION_STOP_CONSISTENCY_CHECK (0x02) + +/* defines for the Flags field */ +#define MPI2_RAID_ACTION_STOP_ABORT (0x00) +#define MPI2_RAID_ACTION_STOP_PAUSE (0x01) + +/* ActionDataWord for MPI2_RAID_ACTION_CREATE_HOT_SPARE Action */ +typedef struct _MPI2_RAID_ACTION_HOT_SPARE +{ + U8 HotSparePool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 DevHandle; /* 0x02 */ +} MPI2_RAID_ACTION_HOT_SPARE, MPI2_POINTER PTR_MPI2_RAID_ACTION_HOT_SPARE, + Mpi2RaidActionHotSpare_t, MPI2_POINTER pMpi2RaidActionHotSpare_t; + +/* ActionDataWord for MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE Action */ +typedef struct _MPI2_RAID_ACTION_FW_UPDATE_MODE +{ + U8 Flags; /* 0x00 */ + U8 DeviceFirmwareUpdateModeTimeout; /* 0x01 */ + U16 Reserved1; /* 0x02 */ +} MPI2_RAID_ACTION_FW_UPDATE_MODE, + MPI2_POINTER PTR_MPI2_RAID_ACTION_FW_UPDATE_MODE, + Mpi2RaidActionFwUpdateMode_t, MPI2_POINTER pMpi2RaidActionFwUpdateMode_t; + +/* ActionDataWord defines for use with MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE action */ +#define MPI2_RAID_ACTION_ADATA_DISABLE_FW_UPDATE (0x00) +#define MPI2_RAID_ACTION_ADATA_ENABLE_FW_UPDATE (0x01) + +typedef union _MPI2_RAID_ACTION_DATA +{ + U32 Word; + MPI2_RAID_ACTION_RATE_DATA Rates; + MPI2_RAID_ACTION_START_RAID_FUNCTION StartRaidFunction; + MPI2_RAID_ACTION_STOP_RAID_FUNCTION StopRaidFunction; + MPI2_RAID_ACTION_HOT_SPARE HotSpare; + MPI2_RAID_ACTION_FW_UPDATE_MODE FwUpdateMode; +} MPI2_RAID_ACTION_DATA, MPI2_POINTER PTR_MPI2_RAID_ACTION_DATA, + Mpi2RaidActionData_t, MPI2_POINTER pMpi2RaidActionData_t; + + +/* RAID Action Request Message */ +typedef struct _MPI2_RAID_ACTION_REQUEST +{ + U8 Action; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 VolDevHandle; /* 0x04 */ + U8 PhysDiskNum; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U32 Reserved3; /* 0x0C */ + MPI2_RAID_ACTION_DATA ActionDataWord; /* 0x10 */ + MPI2_SGE_SIMPLE_UNION ActionDataSGE; /* 0x14 */ +} MPI2_RAID_ACTION_REQUEST, MPI2_POINTER PTR_MPI2_RAID_ACTION_REQUEST, + Mpi2RaidActionRequest_t, MPI2_POINTER pMpi2RaidActionRequest_t; + +/* RAID Action request Action values */ + +#define MPI2_RAID_ACTION_INDICATOR_STRUCT (0x01) +#define MPI2_RAID_ACTION_CREATE_VOLUME (0x02) +#define MPI2_RAID_ACTION_DELETE_VOLUME (0x03) +#define MPI2_RAID_ACTION_DISABLE_ALL_VOLUMES (0x04) +#define MPI2_RAID_ACTION_ENABLE_ALL_VOLUMES (0x05) +#define MPI2_RAID_ACTION_PHYSDISK_OFFLINE (0x0A) +#define MPI2_RAID_ACTION_PHYSDISK_ONLINE (0x0B) +#define MPI2_RAID_ACTION_FAIL_PHYSDISK (0x0F) +#define MPI2_RAID_ACTION_ACTIVATE_VOLUME (0x11) +#define MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE (0x15) +#define MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE (0x17) +#define MPI2_RAID_ACTION_SET_VOLUME_NAME (0x18) +#define MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE (0x19) +#define MPI2_RAID_ACTION_ENABLE_FAILED_VOLUME (0x1C) +#define MPI2_RAID_ACTION_CREATE_HOT_SPARE (0x1D) +#define MPI2_RAID_ACTION_DELETE_HOT_SPARE (0x1E) +#define MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED (0x20) +#define MPI2_RAID_ACTION_START_RAID_FUNCTION (0x21) +#define MPI2_RAID_ACTION_STOP_RAID_FUNCTION (0x22) + + +/* RAID Volume Creation Structure */ + +/* + * The following define can be customized for the targeted product. + */ +#ifndef MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS +#define MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS (1) +#endif + +typedef struct _MPI2_RAID_VOLUME_PHYSDISK +{ + U8 RAIDSetNum; /* 0x00 */ + U8 PhysDiskMap; /* 0x01 */ + U16 PhysDiskDevHandle; /* 0x02 */ +} MPI2_RAID_VOLUME_PHYSDISK, MPI2_POINTER PTR_MPI2_RAID_VOLUME_PHYSDISK, + Mpi2RaidVolumePhysDisk_t, MPI2_POINTER pMpi2RaidVolumePhysDisk_t; + +/* defines for the PhysDiskMap field */ +#define MPI2_RAIDACTION_PHYSDISK_PRIMARY (0x01) +#define MPI2_RAIDACTION_PHYSDISK_SECONDARY (0x02) + +typedef struct _MPI2_RAID_VOLUME_CREATION_STRUCT +{ + U8 NumPhysDisks; /* 0x00 */ + U8 VolumeType; /* 0x01 */ + U16 Reserved1; /* 0x02 */ + U32 VolumeCreationFlags; /* 0x04 */ + U32 VolumeSettings; /* 0x08 */ + U8 Reserved2; /* 0x0C */ + U8 ResyncRate; /* 0x0D */ + U16 DataScrubDuration; /* 0x0E */ + U64 VolumeMaxLBA; /* 0x10 */ + U32 StripeSize; /* 0x18 */ + U8 Name[16]; /* 0x1C */ + MPI2_RAID_VOLUME_PHYSDISK PhysDisk[MPI2_RAID_VOL_CREATION_NUM_PHYSDISKS];/* 0x2C */ +} MPI2_RAID_VOLUME_CREATION_STRUCT, + MPI2_POINTER PTR_MPI2_RAID_VOLUME_CREATION_STRUCT, + Mpi2RaidVolumeCreationStruct_t, MPI2_POINTER pMpi2RaidVolumeCreationStruct_t; + +/* use MPI2_RAID_VOL_TYPE_ defines from mpi2_cnfg.h for VolumeType */ + +/* defines for the VolumeCreationFlags field */ +#define MPI2_RAID_VOL_CREATION_DEFAULT_SETTINGS (0x80000000) +#define MPI2_RAID_VOL_CREATION_BACKGROUND_INIT (0x00000004) /* MPI 2.0 only */ +#define MPI2_RAID_VOL_CREATION_LOW_LEVEL_INIT (0x00000002) +#define MPI2_RAID_VOL_CREATION_MIGRATE_DATA (0x00000001) +/* The following is an obsolete define. + * It must be shifted left 24 bits in order to set the proper bit. + */ +#define MPI2_RAID_VOL_CREATION_USE_DEFAULT_SETTINGS (0x80) + + +/* RAID Online Capacity Expansion Structure */ + +typedef struct _MPI2_RAID_ONLINE_CAPACITY_EXPANSION +{ + U32 Flags; /* 0x00 */ + U16 DevHandle0; /* 0x04 */ + U16 Reserved1; /* 0x06 */ + U16 DevHandle1; /* 0x08 */ + U16 Reserved2; /* 0x0A */ +} MPI2_RAID_ONLINE_CAPACITY_EXPANSION, + MPI2_POINTER PTR_MPI2_RAID_ONLINE_CAPACITY_EXPANSION, + Mpi2RaidOnlineCapacityExpansion_t, + MPI2_POINTER pMpi2RaidOnlineCapacityExpansion_t; + + +/* RAID Volume Indicator Structure */ + +typedef struct _MPI2_RAID_VOL_INDICATOR +{ + U64 TotalBlocks; /* 0x00 */ + U64 BlocksRemaining; /* 0x08 */ + U32 Flags; /* 0x10 */ +} MPI2_RAID_VOL_INDICATOR, MPI2_POINTER PTR_MPI2_RAID_VOL_INDICATOR, + Mpi2RaidVolIndicator_t, MPI2_POINTER pMpi2RaidVolIndicator_t; + +/* defines for RAID Volume Indicator Flags field */ +#define MPI2_RAID_VOL_FLAGS_OP_MASK (0x0000000F) +#define MPI2_RAID_VOL_FLAGS_OP_BACKGROUND_INIT (0x00000000) +#define MPI2_RAID_VOL_FLAGS_OP_ONLINE_CAP_EXPANSION (0x00000001) +#define MPI2_RAID_VOL_FLAGS_OP_CONSISTENCY_CHECK (0x00000002) +#define MPI2_RAID_VOL_FLAGS_OP_RESYNC (0x00000003) +#define MPI2_RAID_VOL_FLAGS_OP_MDC (0x00000004) + + +/* RAID Action Reply ActionData union */ +typedef union _MPI2_RAID_ACTION_REPLY_DATA +{ + U32 Word[5]; + MPI2_RAID_VOL_INDICATOR RaidVolumeIndicator; + U16 VolDevHandle; + U8 VolumeState; + U8 PhysDiskNum; +} MPI2_RAID_ACTION_REPLY_DATA, MPI2_POINTER PTR_MPI2_RAID_ACTION_REPLY_DATA, + Mpi2RaidActionReplyData_t, MPI2_POINTER pMpi2RaidActionReplyData_t; + +/* use MPI2_RAIDVOL0_SETTING_ defines from mpi2_cnfg.h for MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE action */ + + +/* RAID Action Reply Message */ +typedef struct _MPI2_RAID_ACTION_REPLY +{ + U8 Action; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 VolDevHandle; /* 0x04 */ + U8 PhysDiskNum; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U16 Reserved3; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + MPI2_RAID_ACTION_REPLY_DATA ActionData; /* 0x14 */ +} MPI2_RAID_ACTION_REPLY, MPI2_POINTER PTR_MPI2_RAID_ACTION_REPLY, + Mpi2RaidActionReply_t, MPI2_POINTER pMpi2RaidActionReply_t; + + +#endif + diff --git a/source/lsi/mpi2_sas.h b/source/lsi/mpi2_sas.h new file mode 100755 index 0000000..d2482be --- /dev/null +++ b/source/lsi/mpi2_sas.h @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2000-2010 LSI Corporation. + * + * + * Name: mpi2_sas.h + * Title: MPI Serial Attached SCSI structures and definitions + * Creation Date: February 9, 2007 + * + * mpi2_sas.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 06-26-07 02.00.01 Added Clear All Persistent Operation to SAS IO Unit + * Control Request. + * 10-02-08 02.00.02 Added Set IOC Parameter Operation to SAS IO Unit Control + * Request. + * 10-28-09 02.00.03 Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST + * to MPI2_SGE_IO_UNION since it supports chained SGLs. + * 05-12-10 02.00.04 Modified some comments. + * 08-11-10 02.00.05 Added NCQ operations to SAS IO Unit Control. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_SAS_H +#define MPI2_SAS_H + +/* + * Values for SASStatus. + */ +#define MPI2_SASSTATUS_SUCCESS (0x00) +#define MPI2_SASSTATUS_UNKNOWN_ERROR (0x01) +#define MPI2_SASSTATUS_INVALID_FRAME (0x02) +#define MPI2_SASSTATUS_UTC_BAD_DEST (0x03) +#define MPI2_SASSTATUS_UTC_BREAK_RECEIVED (0x04) +#define MPI2_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED (0x05) +#define MPI2_SASSTATUS_UTC_PORT_LAYER_REQUEST (0x06) +#define MPI2_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED (0x07) +#define MPI2_SASSTATUS_UTC_STP_RESOURCES_BUSY (0x08) +#define MPI2_SASSTATUS_UTC_WRONG_DESTINATION (0x09) +#define MPI2_SASSTATUS_SHORT_INFORMATION_UNIT (0x0A) +#define MPI2_SASSTATUS_LONG_INFORMATION_UNIT (0x0B) +#define MPI2_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA (0x0C) +#define MPI2_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR (0x0D) +#define MPI2_SASSTATUS_XFER_RDY_NOT_EXPECTED (0x0E) +#define MPI2_SASSTATUS_DATA_INCORRECT_DATA_LENGTH (0x0F) +#define MPI2_SASSTATUS_DATA_TOO_MUCH_READ_DATA (0x10) +#define MPI2_SASSTATUS_DATA_OFFSET_ERROR (0x11) +#define MPI2_SASSTATUS_SDSF_NAK_RECEIVED (0x12) +#define MPI2_SASSTATUS_SDSF_CONNECTION_FAILED (0x13) +#define MPI2_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT (0x14) + + +/* + * Values for the SAS DeviceInfo field used in SAS Device Status Change Event + * data and SAS Configuration pages. + */ +#define MPI2_SAS_DEVICE_INFO_SEP (0x00004000) +#define MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE (0x00002000) +#define MPI2_SAS_DEVICE_INFO_LSI_DEVICE (0x00001000) +#define MPI2_SAS_DEVICE_INFO_DIRECT_ATTACH (0x00000800) +#define MPI2_SAS_DEVICE_INFO_SSP_TARGET (0x00000400) +#define MPI2_SAS_DEVICE_INFO_STP_TARGET (0x00000200) +#define MPI2_SAS_DEVICE_INFO_SMP_TARGET (0x00000100) +#define MPI2_SAS_DEVICE_INFO_SATA_DEVICE (0x00000080) +#define MPI2_SAS_DEVICE_INFO_SSP_INITIATOR (0x00000040) +#define MPI2_SAS_DEVICE_INFO_STP_INITIATOR (0x00000020) +#define MPI2_SAS_DEVICE_INFO_SMP_INITIATOR (0x00000010) +#define MPI2_SAS_DEVICE_INFO_SATA_HOST (0x00000008) + +#define MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE (0x00000007) +#define MPI2_SAS_DEVICE_INFO_NO_DEVICE (0x00000000) +#define MPI2_SAS_DEVICE_INFO_END_DEVICE (0x00000001) +#define MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER (0x00000002) +#define MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER (0x00000003) + + +/***************************************************************************** +* +* SAS Messages +* +*****************************************************************************/ + +/**************************************************************************** +* SMP Passthrough messages +****************************************************************************/ + +/* SMP Passthrough Request Message */ +typedef struct _MPI2_SMP_PASSTHROUGH_REQUEST +{ + U8 PassthroughFlags; /* 0x00 */ + U8 PhysicalPort; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 RequestDataLength; /* 0x04 */ + U8 SGLFlags; /* 0x06 */ /* MPI v2.0 only. Reserved on MPI v2.5. */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U32 Reserved2; /* 0x0C */ + U64 SASAddress; /* 0x10 */ + U32 Reserved3; /* 0x18 */ + U32 Reserved4; /* 0x1C */ + MPI2_SIMPLE_SGE_UNION SGL; /* 0x20 */ /* MPI v2.5: IEEE Simple 64 elements only */ +} MPI2_SMP_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SMP_PASSTHROUGH_REQUEST, + Mpi2SmpPassthroughRequest_t, MPI2_POINTER pMpi2SmpPassthroughRequest_t; + +/* values for PassthroughFlags field */ +#define MPI2_SMP_PT_REQ_PT_FLAGS_IMMEDIATE (0x80) + +/* MPI v2.0: use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */ + + +/* SMP Passthrough Reply Message */ +typedef struct _MPI2_SMP_PASSTHROUGH_REPLY +{ + U8 PassthroughFlags; /* 0x00 */ + U8 PhysicalPort; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 ResponseDataLength; /* 0x04 */ + U8 SGLFlags; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U8 Reserved2; /* 0x0C */ + U8 SASStatus; /* 0x0D */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 Reserved3; /* 0x14 */ + U8 ResponseData[4]; /* 0x18 */ +} MPI2_SMP_PASSTHROUGH_REPLY, MPI2_POINTER PTR_MPI2_SMP_PASSTHROUGH_REPLY, + Mpi2SmpPassthroughReply_t, MPI2_POINTER pMpi2SmpPassthroughReply_t; + +/* values for PassthroughFlags field */ +#define MPI2_SMP_PT_REPLY_PT_FLAGS_IMMEDIATE (0x80) + +/* values for SASStatus field are at the top of this file */ + + +/**************************************************************************** +* SATA Passthrough messages +****************************************************************************/ + +/* SATA Passthrough Request Message */ +typedef struct _MPI2_SATA_PASSTHROUGH_REQUEST +{ + U16 DevHandle; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 PassthroughFlags; /* 0x04 */ + U8 SGLFlags; /* 0x06 */ /* MPI v2.0 only. Reserved on MPI v2.5. */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U32 Reserved2; /* 0x0C */ + U32 Reserved3; /* 0x10 */ + U32 Reserved4; /* 0x14 */ + U32 DataLength; /* 0x18 */ + U8 CommandFIS[20]; /* 0x1C */ + MPI2_SGE_IO_UNION SGL; /* 0x30 */ /* MPI v2.5: IEEE 64 elements only */ +} MPI2_SATA_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REQUEST, + Mpi2SataPassthroughRequest_t, MPI2_POINTER pMpi2SataPassthroughRequest_t; + +/* values for PassthroughFlags field */ +#define MPI2_SATA_PT_REQ_PT_FLAGS_EXECUTE_DIAG (0x0100) +#define MPI2_SATA_PT_REQ_PT_FLAGS_DMA (0x0020) +#define MPI2_SATA_PT_REQ_PT_FLAGS_PIO (0x0010) +#define MPI2_SATA_PT_REQ_PT_FLAGS_UNSPECIFIED_VU (0x0004) +#define MPI2_SATA_PT_REQ_PT_FLAGS_WRITE (0x0002) +#define MPI2_SATA_PT_REQ_PT_FLAGS_READ (0x0001) + +/* MPI v2.0: use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */ + + +/* SATA Passthrough Reply Message */ +typedef struct _MPI2_SATA_PASSTHROUGH_REPLY +{ + U16 DevHandle; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 PassthroughFlags; /* 0x04 */ + U8 SGLFlags; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved1; /* 0x0A */ + U8 Reserved2; /* 0x0C */ + U8 SASStatus; /* 0x0D */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U8 StatusFIS[20]; /* 0x14 */ + U32 StatusControlRegisters; /* 0x28 */ + U32 TransferCount; /* 0x2C */ +} MPI2_SATA_PASSTHROUGH_REPLY, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REPLY, + Mpi2SataPassthroughReply_t, MPI2_POINTER pMpi2SataPassthroughReply_t; + +/* values for SASStatus field are at the top of this file */ + + +/**************************************************************************** +* SAS IO Unit Control messages +****************************************************************************/ + +/* SAS IO Unit Control Request Message */ +typedef struct _MPI2_SAS_IOUNIT_CONTROL_REQUEST +{ + U8 Operation; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 DevHandle; /* 0x04 */ + U8 IOCParameter; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U8 PhyNum; /* 0x0E */ + U8 PrimFlags; /* 0x0F */ + U32 Primitive; /* 0x10 */ + U8 LookupMethod; /* 0x14 */ + U8 Reserved5; /* 0x15 */ + U16 SlotNumber; /* 0x16 */ + U64 LookupAddress; /* 0x18 */ + U32 IOCParameterValue; /* 0x20 */ + U32 Reserved7; /* 0x24 */ + U32 Reserved8; /* 0x28 */ +} MPI2_SAS_IOUNIT_CONTROL_REQUEST, + MPI2_POINTER PTR_MPI2_SAS_IOUNIT_CONTROL_REQUEST, + Mpi2SasIoUnitControlRequest_t, MPI2_POINTER pMpi2SasIoUnitControlRequest_t; + +/* values for the Operation field */ +#define MPI2_SAS_OP_CLEAR_ALL_PERSISTENT (0x02) +#define MPI2_SAS_OP_PHY_LINK_RESET (0x06) +#define MPI2_SAS_OP_PHY_HARD_RESET (0x07) +#define MPI2_SAS_OP_PHY_CLEAR_ERROR_LOG (0x08) +#define MPI2_SAS_OP_SEND_PRIMITIVE (0x0A) +#define MPI2_SAS_OP_FORCE_FULL_DISCOVERY (0x0B) +#define MPI2_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL (0x0C) +#define MPI2_SAS_OP_REMOVE_DEVICE (0x0D) +#define MPI2_SAS_OP_LOOKUP_MAPPING (0x0E) +#define MPI2_SAS_OP_SET_IOC_PARAMETER (0x0F) +#define MPI25_SAS_OP_ENABLE_FP_DEVICE (0x10) +#define MPI25_SAS_OP_DISABLE_FP_DEVICE (0x11) +#define MPI25_SAS_OP_ENABLE_FP_ALL (0x12) +#define MPI25_SAS_OP_DISABLE_FP_ALL (0x13) +#define MPI2_SAS_OP_DEV_ENABLE_NCQ (0x14) +#define MPI2_SAS_OP_DEV_DISABLE_NCQ (0x15) +#define MPI2_SAS_OP_PRODUCT_SPECIFIC_MIN (0x80) + +/* values for the PrimFlags field */ +#define MPI2_SAS_PRIMFLAGS_SINGLE (0x08) +#define MPI2_SAS_PRIMFLAGS_TRIPLE (0x02) +#define MPI2_SAS_PRIMFLAGS_REDUNDANT (0x01) + +/* values for the LookupMethod field */ +#define MPI2_SAS_LOOKUP_METHOD_SAS_ADDRESS (0x01) +#define MPI2_SAS_LOOKUP_METHOD_SAS_ENCLOSURE_SLOT (0x02) +#define MPI2_SAS_LOOKUP_METHOD_SAS_DEVICE_NAME (0x03) + + +/* SAS IO Unit Control Reply Message */ +typedef struct _MPI2_SAS_IOUNIT_CONTROL_REPLY +{ + U8 Operation; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 DevHandle; /* 0x04 */ + U8 IOCParameter; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_SAS_IOUNIT_CONTROL_REPLY, + MPI2_POINTER PTR_MPI2_SAS_IOUNIT_CONTROL_REPLY, + Mpi2SasIoUnitControlReply_t, MPI2_POINTER pMpi2SasIoUnitControlReply_t; + + +#endif + + diff --git a/source/lsi/mpi2_targ.h b/source/lsi/mpi2_targ.h new file mode 100755 index 0000000..42afc66 --- /dev/null +++ b/source/lsi/mpi2_targ.h @@ -0,0 +1,560 @@ +/* + * Copyright (c) 2000-2010 LSI Corporation. + * + * + * Name: mpi2_targ.h + * Title: MPI Target mode messages and structures + * Creation Date: September 8, 2006 + * + * mpi2_targ.h Version: 02.00.xx + * + * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25 + * prefix are for use only on MPI v2.5 products, and must not be used + * with MPI v2.0 products. Unless otherwise noted, names beginning with + * MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products. + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 08-31-07 02.00.01 Added Command Buffer Data Location Address Space bits to + * BufferPostFlags field of CommandBufferPostBase Request. + * 02-29-08 02.00.02 Modified various names to make them 32-character unique. + * 10-02-08 02.00.03 Removed NextCmdBufferOffset from + * MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST. + * Target Status Send Request only takes a single SGE for + * response data. + * 02-10-10 02.00.04 Added comment to MPI2_TARGET_SSP_RSP_IU structure. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_TARG_H +#define MPI2_TARG_H + + +/****************************************************************************** +* +* SCSI Target Messages +* +*******************************************************************************/ + +/**************************************************************************** +* Target Command Buffer Post Base Request +****************************************************************************/ + +typedef struct _MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST +{ + U8 BufferPostFlags; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 TotalCmdBuffers; /* 0x04 */ + U8 Reserved; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U32 Reserved3; /* 0x0C */ + U16 CmdBufferLength; /* 0x10 */ + U16 Reserved4; /* 0x12 */ + U32 BaseAddressLow; /* 0x14 */ + U32 BaseAddressHigh; /* 0x18 */ +} MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST, + MPI2_POINTER PTR_MPI2_TARGET_CMD_BUF_POST_BASE_REQUEST, + Mpi2TargetCmdBufferPostBaseRequest_t, + MPI2_POINTER pMpi2TargetCmdBufferPostBaseRequest_t; + +/* values for the BufferPostflags field */ +#define MPI2_CMD_BUF_POST_BASE_ADDRESS_SPACE_MASK (0x0C) +#define MPI2_CMD_BUF_POST_BASE_SYSTEM_ADDRESS_SPACE (0x00) +#define MPI2_CMD_BUF_POST_BASE_IOCDDR_ADDRESS_SPACE (0x04) +#define MPI2_CMD_BUF_POST_BASE_IOCPLB_ADDRESS_SPACE (0x08) +#define MPI2_CMD_BUF_POST_BASE_IOCPLBNTA_ADDRESS_SPACE (0x0C) + +#define MPI2_CMD_BUF_POST_BASE_FLAGS_AUTO_POST_ALL (0x01) + + +/**************************************************************************** +* Target Command Buffer Post List Request +****************************************************************************/ + +typedef struct _MPI2_TARGET_CMD_BUF_POST_LIST_REQUEST +{ + U16 Reserved; /* 0x00 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 CmdBufferCount; /* 0x04 */ + U8 Reserved1; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved2; /* 0x0A */ + U32 Reserved3; /* 0x0C */ + U16 IoIndex[2]; /* 0x10 */ +} MPI2_TARGET_CMD_BUF_POST_LIST_REQUEST, + MPI2_POINTER PTR_MPI2_TARGET_CMD_BUF_POST_LIST_REQUEST, + Mpi2TargetCmdBufferPostListRequest_t, + MPI2_POINTER pMpi2TargetCmdBufferPostListRequest_t; + +/**************************************************************************** +* Target Command Buffer Post Base List Reply +****************************************************************************/ + +typedef struct _MPI2_TARGET_BUF_POST_BASE_LIST_REPLY +{ + U8 Flags; /* 0x00 */ + U8 Reserved; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U16 IoIndex; /* 0x14 */ + U16 Reserved5; /* 0x16 */ + U32 Reserved6; /* 0x18 */ +} MPI2_TARGET_BUF_POST_BASE_LIST_REPLY, + MPI2_POINTER PTR_MPI2_TARGET_BUF_POST_BASE_LIST_REPLY, + Mpi2TargetCmdBufferPostBaseListReply_t, + MPI2_POINTER pMpi2TargetCmdBufferPostBaseListReply_t; + +/* Flags defines */ +#define MPI2_CMD_BUF_POST_REPLY_IOINDEX_VALID (0x01) + + +/**************************************************************************** +* Command Buffer Formats (with 16 byte CDB) +****************************************************************************/ + +typedef struct _MPI2_TARGET_SSP_CMD_BUFFER +{ + U8 FrameType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 InitiatorConnectionTag; /* 0x02 */ + U32 HashedSourceSASAddress; /* 0x04 */ + U16 Reserved2; /* 0x08 */ + U16 Flags; /* 0x0A */ + U32 Reserved3; /* 0x0C */ + U16 Tag; /* 0x10 */ + U16 TargetPortTransferTag; /* 0x12 */ + U32 DataOffset; /* 0x14 */ + /* COMMAND information unit starts here */ + U8 LogicalUnitNumber[8]; /* 0x18 */ + U8 Reserved4; /* 0x20 */ + U8 TaskAttribute; /* lower 3 bits */ /* 0x21 */ + U8 Reserved5; /* 0x22 */ + U8 AdditionalCDBLength; /* upper 5 bits */ /* 0x23 */ + U8 CDB[16]; /* 0x24 */ + /* Additional CDB bytes extend past the CDB field */ +} MPI2_TARGET_SSP_CMD_BUFFER, MPI2_POINTER PTR_MPI2_TARGET_SSP_CMD_BUFFER, + Mpi2TargetSspCmdBuffer, MPI2_POINTER pMp2iTargetSspCmdBuffer; + +typedef struct _MPI2_TARGET_SSP_TASK_BUFFER +{ + U8 FrameType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U16 InitiatorConnectionTag; /* 0x02 */ + U32 HashedSourceSASAddress; /* 0x04 */ + U16 Reserved2; /* 0x08 */ + U16 Flags; /* 0x0A */ + U32 Reserved3; /* 0x0C */ + U16 Tag; /* 0x10 */ + U16 TargetPortTransferTag; /* 0x12 */ + U32 DataOffset; /* 0x14 */ + /* TASK information unit starts here */ + U8 LogicalUnitNumber[8]; /* 0x18 */ + U16 Reserved4; /* 0x20 */ + U8 TaskManagementFunction; /* 0x22 */ + U8 Reserved5; /* 0x23 */ + U16 ManagedTaskTag; /* 0x24 */ + U16 Reserved6; /* 0x26 */ + U32 Reserved7; /* 0x28 */ + U32 Reserved8; /* 0x2C */ + U32 Reserved9; /* 0x30 */ +} MPI2_TARGET_SSP_TASK_BUFFER, MPI2_POINTER PTR_MPI2_TARGET_SSP_TASK_BUFFER, + Mpi2TargetSspTaskBuffer, MPI2_POINTER pMpi2TargetSspTaskBuffer; + +/* mask and shift for HashedSourceSASAddress field */ +#define MPI2_TARGET_HASHED_SAS_ADDRESS_MASK (0xFFFFFF00) +#define MPI2_TARGET_HASHED_SAS_ADDRESS_SHIFT (8) + + +/**************************************************************************** +* MPI v2.0 Target Assist Request +****************************************************************************/ + +typedef struct _MPI2_TARGET_ASSIST_REQUEST +{ + U8 Reserved1; /* 0x00 */ + U8 TargetAssistFlags; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 QueueTag; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 IoIndex; /* 0x0C */ + U16 InitiatorConnectionTag; /* 0x0E */ + U16 SGLFlags; /* 0x10 */ + U8 SequenceNumber; /* 0x12 */ + U8 Reserved4; /* 0x13 */ + U8 SGLOffset0; /* 0x14 */ + U8 SGLOffset1; /* 0x15 */ + U8 SGLOffset2; /* 0x16 */ + U8 SGLOffset3; /* 0x17 */ + U32 SkipCount; /* 0x18 */ + U32 DataLength; /* 0x1C */ + U32 BidirectionalDataLength; /* 0x20 */ + U16 IoFlags; /* 0x24 */ + U16 EEDPFlags; /* 0x26 */ + U32 EEDPBlockSize; /* 0x28 */ + U32 SecondaryReferenceTag; /* 0x2C */ + U16 SecondaryApplicationTag; /* 0x30 */ + U16 ApplicationTagTranslationMask; /* 0x32 */ + U32 PrimaryReferenceTag; /* 0x34 */ + U16 PrimaryApplicationTag; /* 0x38 */ + U16 PrimaryApplicationTagMask; /* 0x3A */ + U32 RelativeOffset; /* 0x3C */ + U32 Reserved5; /* 0x40 */ + U32 Reserved6; /* 0x44 */ + U32 Reserved7; /* 0x48 */ + U32 Reserved8; /* 0x4C */ + MPI2_SGE_IO_UNION SGL[1]; /* 0x50 */ +} MPI2_TARGET_ASSIST_REQUEST, MPI2_POINTER PTR_MPI2_TARGET_ASSIST_REQUEST, + Mpi2TargetAssistRequest_t, MPI2_POINTER pMpi2TargetAssistRequest_t; + +/* Target Assist TargetAssistFlags bits */ + +#define MPI2_TARGET_ASSIST_FLAGS_REPOST_CMD_BUFFER (0x80) +#define MPI2_TARGET_ASSIST_FLAGS_TLR (0x10) +#define MPI2_TARGET_ASSIST_FLAGS_RETRANSMIT (0x04) +#define MPI2_TARGET_ASSIST_FLAGS_AUTO_STATUS (0x02) +#define MPI2_TARGET_ASSIST_FLAGS_DATA_DIRECTION (0x01) + +/* Target Assist SGLFlags bits */ + +/* base values for Data Location Address Space */ +#define MPI2_TARGET_ASSIST_SGLFLAGS_ADDR_MASK (0x0C) +#define MPI2_TARGET_ASSIST_SGLFLAGS_SYSTEM_ADDR (0x00) +#define MPI2_TARGET_ASSIST_SGLFLAGS_IOCDDR_ADDR (0x04) +#define MPI2_TARGET_ASSIST_SGLFLAGS_IOCPLB_ADDR (0x08) +#define MPI2_TARGET_ASSIST_SGLFLAGS_PLBNTA_ADDR (0x0C) + +/* base values for Type */ +#define MPI2_TARGET_ASSIST_SGLFLAGS_TYPE_MASK (0x03) +#define MPI2_TARGET_ASSIST_SGLFLAGS_MPI_TYPE (0x00) +#define MPI2_TARGET_ASSIST_SGLFLAGS_32IEEE_TYPE (0x01) +#define MPI2_TARGET_ASSIST_SGLFLAGS_64IEEE_TYPE (0x02) + +/* shift values for each sub-field */ +#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL3_SHIFT (12) +#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL2_SHIFT (8) +#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL1_SHIFT (4) +#define MPI2_TARGET_ASSIST_SGLFLAGS_SGL0_SHIFT (0) + +/* Target Assist IoFlags bits */ + +#define MPI2_TARGET_ASSIST_IOFLAGS_BIDIRECTIONAL (0x0800) +#define MPI2_TARGET_ASSIST_IOFLAGS_MULTICAST (0x0400) +#define MPI2_TARGET_ASSIST_IOFLAGS_RECEIVE_FIRST (0x0200) + +/* Target Assist EEDPFlags bits */ + +#define MPI2_TA_EEDPFLAGS_INC_PRI_REFTAG (0x8000) +#define MPI2_TA_EEDPFLAGS_INC_SEC_REFTAG (0x4000) +#define MPI2_TA_EEDPFLAGS_INC_PRI_APPTAG (0x2000) +#define MPI2_TA_EEDPFLAGS_INC_SEC_APPTAG (0x1000) + +#define MPI2_TA_EEDPFLAGS_CHECK_REFTAG (0x0400) +#define MPI2_TA_EEDPFLAGS_CHECK_APPTAG (0x0200) +#define MPI2_TA_EEDPFLAGS_CHECK_GUARD (0x0100) + +#define MPI2_TA_EEDPFLAGS_PASSTHRU_REFTAG (0x0008) + +#define MPI2_TA_EEDPFLAGS_MASK_OP (0x0007) +#define MPI2_TA_EEDPFLAGS_NOOP_OP (0x0000) +#define MPI2_TA_EEDPFLAGS_CHECK_OP (0x0001) +#define MPI2_TA_EEDPFLAGS_STRIP_OP (0x0002) +#define MPI2_TA_EEDPFLAGS_CHECK_REMOVE_OP (0x0003) +#define MPI2_TA_EEDPFLAGS_INSERT_OP (0x0004) +#define MPI2_TA_EEDPFLAGS_REPLACE_OP (0x0006) +#define MPI2_TA_EEDPFLAGS_CHECK_REGEN_OP (0x0007) + + +/**************************************************************************** +* MPI v2.5 Target Assist Request +****************************************************************************/ + +typedef struct _MPI25_TARGET_ASSIST_REQUEST +{ + U8 Reserved1; /* 0x00 */ + U8 TargetAssistFlags; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 QueueTag; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 IoIndex; /* 0x0C */ + U16 InitiatorConnectionTag; /* 0x0E */ + U8 DMAFlags; /* 0x10 */ + U8 Reserved9; /* 0x11 */ + U8 SequenceNumber; /* 0x12 */ + U8 Reserved4; /* 0x13 */ + U8 SGLOffset0; /* 0x14 */ + U8 SGLOffset1; /* 0x15 */ + U8 SGLOffset2; /* 0x16 */ + U8 SGLOffset3; /* 0x17 */ + U32 SkipCount; /* 0x18 */ + U32 DataLength; /* 0x1C */ + U32 BidirectionalDataLength; /* 0x20 */ + U16 IoFlags; /* 0x24 */ + U16 EEDPFlags; /* 0x26 */ + U16 EEDPBlockSize; /* 0x28 */ + U16 Reserved10; /* 0x2A */ + U32 SecondaryReferenceTag; /* 0x2C */ + U16 SecondaryApplicationTag; /* 0x30 */ + U16 ApplicationTagTranslationMask; /* 0x32 */ + U32 PrimaryReferenceTag; /* 0x34 */ + U16 PrimaryApplicationTag; /* 0x38 */ + U16 PrimaryApplicationTagMask; /* 0x3A */ + U32 RelativeOffset; /* 0x3C */ + U32 Reserved5; /* 0x40 */ + U32 Reserved6; /* 0x44 */ + U32 Reserved7; /* 0x48 */ + U32 Reserved8; /* 0x4C */ + MPI25_SGE_IO_UNION SGL; /* 0x50 */ +} MPI25_TARGET_ASSIST_REQUEST, MPI2_POINTER PTR_MPI25_TARGET_ASSIST_REQUEST, + Mpi25TargetAssistRequest_t, MPI2_POINTER pMpi25TargetAssistRequest_t; + +/* use MPI2_TARGET_ASSIST_FLAGS_ defines for the Flags field */ + +/* Defines for the DMAFlags field + * Each setting affects 4 SGLS, from SGL0 to SGL3. + * D = Data + * C = Cache DIF + * I = Interleaved + * H = Host DIF + */ +#define MPI25_TA_DMAFLAGS_OP_MASK (0x0F) +#define MPI25_TA_DMAFLAGS_OP_D_D_D_D (0x00) +#define MPI25_TA_DMAFLAGS_OP_D_D_D_C (0x01) +#define MPI25_TA_DMAFLAGS_OP_D_D_D_I (0x02) +#define MPI25_TA_DMAFLAGS_OP_D_D_C_C (0x03) +#define MPI25_TA_DMAFLAGS_OP_D_D_C_I (0x04) +#define MPI25_TA_DMAFLAGS_OP_D_D_I_I (0x05) +#define MPI25_TA_DMAFLAGS_OP_D_C_C_C (0x06) +#define MPI25_TA_DMAFLAGS_OP_D_C_C_I (0x07) +#define MPI25_TA_DMAFLAGS_OP_D_C_I_I (0x08) +#define MPI25_TA_DMAFLAGS_OP_D_I_I_I (0x09) +#define MPI25_TA_DMAFLAGS_OP_D_H_D_D (0x0A) +#define MPI25_TA_DMAFLAGS_OP_D_H_D_C (0x0B) +#define MPI25_TA_DMAFLAGS_OP_D_H_D_I (0x0C) +#define MPI25_TA_DMAFLAGS_OP_D_H_C_C (0x0D) +#define MPI25_TA_DMAFLAGS_OP_D_H_C_I (0x0E) +#define MPI25_TA_DMAFLAGS_OP_D_H_I_I (0x0F) + +/* defines for the IoFlags field */ +#define MPI25_TARGET_ASSIST_IOFLAGS_BIDIRECTIONAL (0x0800) +#define MPI25_TARGET_ASSIST_IOFLAGS_RECEIVE_FIRST (0x0200) + +/* defines for the EEDPFlags field */ +#define MPI25_TA_EEDPFLAGS_INC_PRI_REFTAG (0x8000) +#define MPI25_TA_EEDPFLAGS_INC_SEC_REFTAG (0x4000) +#define MPI25_TA_EEDPFLAGS_INC_PRI_APPTAG (0x2000) +#define MPI25_TA_EEDPFLAGS_INC_SEC_APPTAG (0x1000) + +#define MPI25_TA_EEDPFLAGS_CHECK_REFTAG (0x0400) +#define MPI25_TA_EEDPFLAGS_CHECK_APPTAG (0x0200) +#define MPI25_TA_EEDPFLAGS_CHECK_GUARD (0x0100) + +#define MPI25_TA_EEDPFLAGS_ESCAPE_MODE_MASK (0x00C0) +#define MPI25_TA_EEDPFLAGS_COMPATIBLE_MODE (0x0000) +#define MPI25_TA_EEDPFLAGS_DO_NOT_DISABLE_MODE (0x0040) +#define MPI25_TA_EEDPFLAGS_APPTAG_DISABLE_MODE (0x0080) +#define MPI25_TA_EEDPFLAGS_APPTAG_REFTAG_DISABLE_MODE (0x00C0) + +#define MPI25_TA_EEDPFLAGS_HOST_GUARD_METHOD_MASK (0x0030) +#define MPI25_TA_EEDPFLAGS_T10_CRC_HOST_GUARD (0x0000) +#define MPI25_TA_EEDPFLAGS_IP_CHKSUM_HOST_GUARD (0x0010) + +#define MPI25_TA_EEDPFLAGS_PASSTHRU_REFTAG (0x0008) + +#define MPI25_TA_EEDPFLAGS_MASK_OP (0x0007) +#define MPI25_TA_EEDPFLAGS_NOOP_OP (0x0000) +#define MPI25_TA_EEDPFLAGS_CHECK_OP (0x0001) +#define MPI25_TA_EEDPFLAGS_STRIP_OP (0x0002) +#define MPI25_TA_EEDPFLAGS_CHECK_REMOVE_OP (0x0003) +#define MPI25_TA_EEDPFLAGS_INSERT_OP (0x0004) +#define MPI25_TA_EEDPFLAGS_REPLACE_OP (0x0006) +#define MPI25_TA_EEDPFLAGS_CHECK_REGEN_OP (0x0007) + + +/**************************************************************************** +* Target Status Send Request +****************************************************************************/ + +typedef struct _MPI2_TARGET_STATUS_SEND_REQUEST +{ + U8 Reserved1; /* 0x00 */ + U8 StatusFlags; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 QueueTag; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 IoIndex; /* 0x0C */ + U16 InitiatorConnectionTag; /* 0x0E */ + U16 SGLFlags; /* 0x10 */ /* MPI v2.0 only. Reserved on MPI v2.5. */ + U16 Reserved4; /* 0x12 */ + U8 SGLOffset0; /* 0x14 */ + U8 Reserved5; /* 0x15 */ + U16 Reserved6; /* 0x16 */ + U32 Reserved7; /* 0x18 */ + U32 Reserved8; /* 0x1C */ + MPI2_SIMPLE_SGE_UNION StatusDataSGE; /* 0x20 */ /* MPI v2.5: This must be an IEEE Simple Element 64. */ +} MPI2_TARGET_STATUS_SEND_REQUEST, + MPI2_POINTER PTR_MPI2_TARGET_STATUS_SEND_REQUEST, + Mpi2TargetStatusSendRequest_t, MPI2_POINTER pMpi2TargetStatusSendRequest_t; + +/* Target Status Send StatusFlags bits */ + +#define MPI2_TSS_FLAGS_REPOST_CMD_BUFFER (0x80) +#define MPI2_TSS_FLAGS_RETRANSMIT (0x04) +#define MPI2_TSS_FLAGS_AUTO_GOOD_STATUS (0x01) + +/* Target Status Send SGLFlags bits - MPI v2.0 only */ +/* Data Location Address Space */ +#define MPI2_TSS_SGLFLAGS_ADDR_MASK (0x0C) +#define MPI2_TSS_SGLFLAGS_SYSTEM_ADDR (0x00) +#define MPI2_TSS_SGLFLAGS_IOCDDR_ADDR (0x04) +#define MPI2_TSS_SGLFLAGS_IOCPLB_ADDR (0x08) +#define MPI2_TSS_SGLFLAGS_IOCPLBNTA_ADDR (0x0C) +/* Type */ +#define MPI2_TSS_SGLFLAGS_TYPE_MASK (0x03) +#define MPI2_TSS_SGLFLAGS_MPI_TYPE (0x00) +#define MPI2_TSS_SGLFLAGS_IEEE32_TYPE (0x01) +#define MPI2_TSS_SGLFLAGS_IEEE64_TYPE (0x02) + + + +/* + * NOTE: The SSP status IU is big-endian. When used on a little-endian system, + * this structure properly orders the bytes. + */ +typedef struct _MPI2_TARGET_SSP_RSP_IU +{ + U32 Reserved0[6]; /* reserved for SSP header */ /* 0x00 */ + + /* start of RESPONSE information unit */ + U32 Reserved1; /* 0x18 */ + U32 Reserved2; /* 0x1C */ + U16 Reserved3; /* 0x20 */ + U8 DataPres; /* lower 2 bits */ /* 0x22 */ + U8 Status; /* 0x23 */ + U32 Reserved4; /* 0x24 */ + U32 SenseDataLength; /* 0x28 */ + U32 ResponseDataLength; /* 0x2C */ + + /* start of Response or Sense Data (size may vary dynamically) */ + U8 ResponseSenseData[4]; /* 0x30 */ +} MPI2_TARGET_SSP_RSP_IU, MPI2_POINTER PTR_MPI2_TARGET_SSP_RSP_IU, + Mpi2TargetSspRspIu_t, MPI2_POINTER pMpi2TargetSspRspIu_t; + + +/**************************************************************************** +* Target Standard Reply - used with Target Assist or Target Status Send +****************************************************************************/ + +typedef struct _MPI2_TARGET_STANDARD_REPLY +{ + U16 Reserved; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U16 IoIndex; /* 0x14 */ + U16 Reserved5; /* 0x16 */ + U32 TransferCount; /* 0x18 */ + U32 BidirectionalTransferCount; /* 0x1C */ +} MPI2_TARGET_STANDARD_REPLY, MPI2_POINTER PTR_MPI2_TARGET_STANDARD_REPLY, + Mpi2TargetErrorReply_t, MPI2_POINTER pMpi2TargetErrorReply_t; + + +/**************************************************************************** +* Target Mode Abort Request +****************************************************************************/ + +typedef struct _MPI2_TARGET_MODE_ABORT_REQUEST +{ + U8 AbortType; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 IoIndexToAbort; /* 0x0C */ + U16 Reserved6; /* 0x0E */ + U32 MidToAbort; /* 0x10 */ +} MPI2_TARGET_MODE_ABORT, MPI2_POINTER PTR_MPI2_TARGET_MODE_ABORT, + Mpi2TargetModeAbort_t, MPI2_POINTER pMpi2TargetModeAbort_t; + +/* Target Mode Abort AbortType values */ + +#define MPI2_TARGET_MODE_ABORT_ALL_CMD_BUFFERS (0x00) +#define MPI2_TARGET_MODE_ABORT_ALL_IO (0x01) +#define MPI2_TARGET_MODE_ABORT_EXACT_IO (0x02) +#define MPI2_TARGET_MODE_ABORT_EXACT_IO_REQUEST (0x03) +#define MPI2_TARGET_MODE_ABORT_IO_REQUEST_AND_IO (0x04) + + +/**************************************************************************** +* Target Mode Abort Reply +****************************************************************************/ + +typedef struct _MPI2_TARGET_MODE_ABORT_REPLY +{ + U16 Reserved; /* 0x00 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved1; /* 0x04 */ + U8 Reserved2; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved3; /* 0x0A */ + U16 Reserved4; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 AbortCount; /* 0x14 */ +} MPI2_TARGET_MODE_ABORT_REPLY, MPI2_POINTER PTR_MPI2_TARGET_MODE_ABORT_REPLY, + Mpi2TargetModeAbortReply_t, MPI2_POINTER pMpi2TargetModeAbortReply_t; + + +#endif + diff --git a/source/lsi/mpi2_tool.h b/source/lsi/mpi2_tool.h new file mode 100755 index 0000000..41c546e --- /dev/null +++ b/source/lsi/mpi2_tool.h @@ -0,0 +1,438 @@ +/* + * Copyright (c) 2000-2010 LSI Corporation. + * + * + * Name: mpi2_tool.h + * Title: MPI diagnostic tool structures and definitions + * Creation Date: March 26, 2007 + * + * mpi2_tool.h Version: 02.00.06 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * 12-18-07 02.00.01 Added Diagnostic Buffer Post and Diagnostic Release + * structures and defines. + * 02-29-08 02.00.02 Modified various names to make them 32-character unique. + * 05-06-09 02.00.03 Added ISTWI Read Write Tool and Diagnostic CLI Tool. + * 07-30-09 02.00.04 Added ExtendedType field to DiagnosticBufferPost request + * and reply messages. + * Added MPI2_DIAG_BUF_TYPE_EXTENDED. + * Incremented MPI2_DIAG_BUF_TYPE_COUNT. + * 05-12-10 02.00.05 Added Diagnostic Data Upload tool. + * 08-11-10 02.00.06 Added defines that were missing for Diagnostic Buffer + * Post Request. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_TOOL_H +#define MPI2_TOOL_H + +/***************************************************************************** +* +* Toolbox Messages +* +*****************************************************************************/ + +/* defines for the Tools */ +#define MPI2_TOOLBOX_CLEAN_TOOL (0x00) +#define MPI2_TOOLBOX_MEMORY_MOVE_TOOL (0x01) +#define MPI2_TOOLBOX_DIAG_DATA_UPLOAD_TOOL (0x02) +#define MPI2_TOOLBOX_ISTWI_READ_WRITE_TOOL (0x03) +#define MPI2_TOOLBOX_BEACON_TOOL (0x05) +#define MPI2_TOOLBOX_DIAGNOSTIC_CLI_TOOL (0x06) + + +/**************************************************************************** +* Toolbox reply +****************************************************************************/ + +typedef struct _MPI2_TOOLBOX_REPLY +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_TOOLBOX_REPLY, MPI2_POINTER PTR_MPI2_TOOLBOX_REPLY, + Mpi2ToolboxReply_t, MPI2_POINTER pMpi2ToolboxReply_t; + + +/**************************************************************************** +* Toolbox Clean Tool request +****************************************************************************/ + +typedef struct _MPI2_TOOLBOX_CLEAN_REQUEST +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 Flags; /* 0x0C */ + } MPI2_TOOLBOX_CLEAN_REQUEST, MPI2_POINTER PTR_MPI2_TOOLBOX_CLEAN_REQUEST, + Mpi2ToolboxCleanRequest_t, MPI2_POINTER pMpi2ToolboxCleanRequest_t; + +/* values for the Flags field */ +#define MPI2_TOOLBOX_CLEAN_BOOT_SERVICES (0x80000000) +#define MPI2_TOOLBOX_CLEAN_PERSIST_MANUFACT_PAGES (0x40000000) +#define MPI2_TOOLBOX_CLEAN_OTHER_PERSIST_PAGES (0x20000000) +#define MPI2_TOOLBOX_CLEAN_FW_CURRENT (0x10000000) +#define MPI2_TOOLBOX_CLEAN_FW_BACKUP (0x08000000) +#define MPI2_TOOLBOX_CLEAN_MEGARAID (0x02000000) +#define MPI2_TOOLBOX_CLEAN_INITIALIZATION (0x01000000) +#define MPI2_TOOLBOX_CLEAN_FLASH (0x00000004) +#define MPI2_TOOLBOX_CLEAN_SEEPROM (0x00000002) +#define MPI2_TOOLBOX_CLEAN_NVSRAM (0x00000001) + + +/**************************************************************************** +* Toolbox Memory Move request +****************************************************************************/ + +typedef struct _MPI2_TOOLBOX_MEM_MOVE_REQUEST +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + MPI2_SGE_SIMPLE_UNION SGL; /* 0x0C */ +} MPI2_TOOLBOX_MEM_MOVE_REQUEST, MPI2_POINTER PTR_MPI2_TOOLBOX_MEM_MOVE_REQUEST, + Mpi2ToolboxMemMoveRequest_t, MPI2_POINTER pMpi2ToolboxMemMoveRequest_t; + + +/**************************************************************************** +* Toolbox Diagnostic Data Upload request +****************************************************************************/ + +typedef struct _MPI2_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U8 SGLFlags; /* 0x0C */ + U8 Reserved5; /* 0x0D */ + U16 Reserved6; /* 0x0E */ + U32 Flags; /* 0x10 */ + U32 DataLength; /* 0x14 */ + MPI2_SGE_SIMPLE_UNION SGL; /* 0x18 */ +} MPI2_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST, + MPI2_POINTER PTR_MPI2_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST, + Mpi2ToolboxDiagDataUploadRequest_t, + MPI2_POINTER pMpi2ToolboxDiagDataUploadRequest_t; + +/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */ + + +typedef struct _MPI2_DIAG_DATA_UPLOAD_HEADER +{ + U32 DiagDataLength; /* 00h */ + U8 FormatCode; /* 04h */ + U8 Reserved1; /* 05h */ + U16 Reserved2; /* 06h */ +} MPI2_DIAG_DATA_UPLOAD_HEADER, MPI2_POINTER PTR_MPI2_DIAG_DATA_UPLOAD_HEADER, + Mpi2DiagDataUploadHeader_t, MPI2_POINTER pMpi2DiagDataUploadHeader_t; + + +/**************************************************************************** +* Toolbox ISTWI Read Write Tool +****************************************************************************/ + +/* Toolbox ISTWI Read Write Tool request message */ +typedef struct _MPI2_TOOLBOX_ISTWI_READ_WRITE_REQUEST +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U32 Reserved5; /* 0x0C */ + U32 Reserved6; /* 0x10 */ + U8 DevIndex; /* 0x14 */ + U8 Action; /* 0x15 */ + U8 SGLFlags; /* 0x16 */ + U8 Reserved7; /* 0x17 */ + U16 TxDataLength; /* 0x18 */ + U16 RxDataLength; /* 0x1A */ + U32 Reserved8; /* 0x1C */ + U32 Reserved9; /* 0x20 */ + U32 Reserved10; /* 0x24 */ + U32 Reserved11; /* 0x28 */ + U32 Reserved12; /* 0x2C */ + MPI2_SGE_SIMPLE_UNION SGL; /* 0x30 */ +} MPI2_TOOLBOX_ISTWI_READ_WRITE_REQUEST, + MPI2_POINTER PTR_MPI2_TOOLBOX_ISTWI_READ_WRITE_REQUEST, + Mpi2ToolboxIstwiReadWriteRequest_t, + MPI2_POINTER pMpi2ToolboxIstwiReadWriteRequest_t; + +/* values for the Action field */ +#define MPI2_TOOL_ISTWI_ACTION_READ_DATA (0x01) +#define MPI2_TOOL_ISTWI_ACTION_WRITE_DATA (0x02) +#define MPI2_TOOL_ISTWI_ACTION_SEQUENCE (0x03) +#define MPI2_TOOL_ISTWI_ACTION_RESERVE_BUS (0x10) +#define MPI2_TOOL_ISTWI_ACTION_RELEASE_BUS (0x11) +#define MPI2_TOOL_ISTWI_ACTION_RESET (0x12) + +/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */ + + +/* Toolbox ISTWI Read Write Tool reply message */ +typedef struct _MPI2_TOOLBOX_ISTWI_REPLY +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U8 DevIndex; /* 0x14 */ + U8 Action; /* 0x15 */ + U8 IstwiStatus; /* 0x16 */ + U8 Reserved6; /* 0x17 */ + U16 TxDataCount; /* 0x18 */ + U16 RxDataCount; /* 0x1A */ +} MPI2_TOOLBOX_ISTWI_REPLY, MPI2_POINTER PTR_MPI2_TOOLBOX_ISTWI_REPLY, + Mpi2ToolboxIstwiReply_t, MPI2_POINTER pMpi2ToolboxIstwiReply_t; + + +/**************************************************************************** +* Toolbox Beacon Tool request +****************************************************************************/ + +typedef struct _MPI2_TOOLBOX_BEACON_REQUEST +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U8 Reserved5; /* 0x0C */ + U8 PhysicalPort; /* 0x0D */ + U8 Reserved6; /* 0x0E */ + U8 Flags; /* 0x0F */ +} MPI2_TOOLBOX_BEACON_REQUEST, MPI2_POINTER PTR_MPI2_TOOLBOX_BEACON_REQUEST, + Mpi2ToolboxBeaconRequest_t, MPI2_POINTER pMpi2ToolboxBeaconRequest_t; + +/* values for the Flags field */ +#define MPI2_TOOLBOX_FLAGS_BEACONMODE_OFF (0x00) +#define MPI2_TOOLBOX_FLAGS_BEACONMODE_ON (0x01) + + +/**************************************************************************** +* Toolbox Diagnostic CLI Tool +****************************************************************************/ + +#define MPI2_TOOLBOX_DIAG_CLI_CMD_LENGTH (0x5C) + +/* Toolbox Diagnostic CLI Tool request message */ +typedef struct _MPI2_TOOLBOX_DIAGNOSTIC_CLI_REQUEST +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U8 SGLFlags; /* 0x0C */ + U8 Reserved5; /* 0x0D */ + U16 Reserved6; /* 0x0E */ + U32 DataLength; /* 0x10 */ + U8 DiagnosticCliCommand[MPI2_TOOLBOX_DIAG_CLI_CMD_LENGTH]; /* 0x14 */ + MPI2_SGE_SIMPLE_UNION SGL; /* 0x70 */ +} MPI2_TOOLBOX_DIAGNOSTIC_CLI_REQUEST, + MPI2_POINTER PTR_MPI2_TOOLBOX_DIAGNOSTIC_CLI_REQUEST, + Mpi2ToolboxDiagnosticCliRequest_t, + MPI2_POINTER pMpi2ToolboxDiagnosticCliRequest_t; + +/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */ + + +/* Toolbox Diagnostic CLI Tool reply message */ +typedef struct _MPI2_TOOLBOX_DIAGNOSTIC_CLI_REPLY +{ + U8 Tool; /* 0x00 */ + U8 Reserved1; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 ReturnedDataLength; /* 0x14 */ +} MPI2_TOOLBOX_DIAGNOSTIC_CLI_REPLY, + MPI2_POINTER PTR_MPI2_TOOLBOX_DIAG_CLI_REPLY, + Mpi2ToolboxDiagnosticCliReply_t, + MPI2_POINTER pMpi2ToolboxDiagnosticCliReply_t; + + +/***************************************************************************** +* +* Diagnostic Buffer Messages +* +*****************************************************************************/ + + +/**************************************************************************** +* Diagnostic Buffer Post request +****************************************************************************/ + +typedef struct _MPI2_DIAG_BUFFER_POST_REQUEST +{ + U8 ExtendedType; /* 0x00 */ + U8 BufferType; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U64 BufferAddress; /* 0x0C */ + U32 BufferLength; /* 0x14 */ + U32 Reserved5; /* 0x18 */ + U32 Reserved6; /* 0x1C */ + U32 Flags; /* 0x20 */ + U32 ProductSpecific[23]; /* 0x24 */ +} MPI2_DIAG_BUFFER_POST_REQUEST, MPI2_POINTER PTR_MPI2_DIAG_BUFFER_POST_REQUEST, + Mpi2DiagBufferPostRequest_t, MPI2_POINTER pMpi2DiagBufferPostRequest_t; + +/* values for the ExtendedType field */ +#define MPI2_DIAG_EXTENDED_TYPE_UTILIZATION (0x02) + +/* values for the BufferType field */ +#define MPI2_DIAG_BUF_TYPE_TRACE (0x00) +#define MPI2_DIAG_BUF_TYPE_SNAPSHOT (0x01) +#define MPI2_DIAG_BUF_TYPE_EXTENDED (0x02) +/* count of the number of buffer types */ +#define MPI2_DIAG_BUF_TYPE_COUNT (0x03) + +/* values for the Flags field */ +#define MPI2_DIAG_BUF_FLAG_RELEASE_ON_FULL (0x00000002) /* for MPI v2.0 products only */ +#define MPI2_DIAG_BUF_FLAG_IMMEDIATE_RELEASE (0x00000001) + + +/**************************************************************************** +* Diagnostic Buffer Post reply +****************************************************************************/ + +typedef struct _MPI2_DIAG_BUFFER_POST_REPLY +{ + U8 ExtendedType; /* 0x00 */ + U8 BufferType; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ + U32 TransferLength; /* 0x14 */ +} MPI2_DIAG_BUFFER_POST_REPLY, MPI2_POINTER PTR_MPI2_DIAG_BUFFER_POST_REPLY, + Mpi2DiagBufferPostReply_t, MPI2_POINTER pMpi2DiagBufferPostReply_t; + + +/**************************************************************************** +* Diagnostic Release request +****************************************************************************/ + +typedef struct _MPI2_DIAG_RELEASE_REQUEST +{ + U8 Reserved1; /* 0x00 */ + U8 BufferType; /* 0x01 */ + U8 ChainOffset; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ +} MPI2_DIAG_RELEASE_REQUEST, MPI2_POINTER PTR_MPI2_DIAG_RELEASE_REQUEST, + Mpi2DiagReleaseRequest_t, MPI2_POINTER pMpi2DiagReleaseRequest_t; + + +/**************************************************************************** +* Diagnostic Buffer Post reply +****************************************************************************/ + +typedef struct _MPI2_DIAG_RELEASE_REPLY +{ + U8 Reserved1; /* 0x00 */ + U8 BufferType; /* 0x01 */ + U8 MsgLength; /* 0x02 */ + U8 Function; /* 0x03 */ + U16 Reserved2; /* 0x04 */ + U8 Reserved3; /* 0x06 */ + U8 MsgFlags; /* 0x07 */ + U8 VP_ID; /* 0x08 */ + U8 VF_ID; /* 0x09 */ + U16 Reserved4; /* 0x0A */ + U16 Reserved5; /* 0x0C */ + U16 IOCStatus; /* 0x0E */ + U32 IOCLogInfo; /* 0x10 */ +} MPI2_DIAG_RELEASE_REPLY, MPI2_POINTER PTR_MPI2_DIAG_RELEASE_REPLY, + Mpi2DiagReleaseReply_t, MPI2_POINTER pMpi2DiagReleaseReply_t; + + +#endif + diff --git a/source/lsi/mpi2_type.h b/source/lsi/mpi2_type.h new file mode 100755 index 0000000..12dc94e --- /dev/null +++ b/source/lsi/mpi2_type.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2000-2007 LSI Corporation. + * + * + * Name: mpi2_type.h + * Title: MPI basic type definitions + * Creation Date: August 16, 2006 + * + * mpi2_type.h Version: 02.00.00 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 04-30-07 02.00.00 Corresponds to Fusion-MPT MPI Specification Rev A. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI2_TYPE_H +#define MPI2_TYPE_H + + +/******************************************************************************* + * Define MPI2_POINTER if it hasn't already been defined. By default + * MPI2_POINTER is defined to be a near pointer. MPI2_POINTER can be defined as + * a far pointer by defining MPI2_POINTER as "far *" before this header file is + * included. + */ +#ifndef MPI2_POINTER +#define MPI2_POINTER * +#endif + +/* the basic types may have already been included by mpi_type.h */ +#ifndef MPI_TYPE_H +/***************************************************************************** +* +* Basic Types +* +*****************************************************************************/ + +typedef signed char S8; +typedef unsigned char U8; +typedef signed short S16; +typedef unsigned short U16; + + +#if defined(unix) || defined(__arm) || defined(ALPHA) || defined(__PPC__) || defined(__ppc) + + typedef signed int S32; + typedef unsigned int U32; + +#else + + typedef signed long S32; + typedef unsigned long U32; + +#endif + + +typedef struct _S64 +{ + U32 Low; + S32 High; +} S64; + +typedef struct _U64 +{ + U32 Low; + U32 High; +} U64; + + +/***************************************************************************** +* +* Pointer Types +* +*****************************************************************************/ + +typedef S8 *PS8; +typedef U8 *PU8; +typedef S16 *PS16; +typedef U16 *PU16; +typedef S32 *PS32; +typedef U32 *PU32; +typedef S64 *PS64; +typedef U64 *PU64; + +#endif + +#endif + diff --git a/source/lsi/mpi_cnfg.h b/source/lsi/mpi_cnfg.h new file mode 100755 index 0000000..1621d04 --- /dev/null +++ b/source/lsi/mpi_cnfg.h @@ -0,0 +1,3129 @@ +/* + * Copyright (c) 2000-2008 LSI Corporation. + * + * + * Name: mpi_cnfg.h + * Title: MPI Config message, structures, and Pages + * Creation Date: July 27, 2000 + * + * mpi_cnfg.h Version: 01.05.19 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-08-00 00.10.01 Original release for 0.10 spec dated 4/26/2000. + * 06-06-00 01.00.01 Update version number for 1.0 release. + * 06-08-00 01.00.02 Added _PAGEVERSION definitions for all pages. + * Added FcPhLowestVersion, FcPhHighestVersion, Reserved2 + * fields to FC_DEVICE_0 page, updated the page version. + * Changed _FREE_RUNNING_CLOCK to _PACING_TRANSFERS in + * SCSI_PORT_0, SCSI_DEVICE_0 and SCSI_DEVICE_1 pages + * and updated the page versions. + * Added _RESPONSE_ID_MASK definition to SCSI_PORT_1 + * page and updated the page version. + * Added Information field and _INFO_PARAMS_NEGOTIATED + * definitionto SCSI_DEVICE_0 page. + * 06-22-00 01.00.03 Removed batch controls from LAN_0 page and updated the + * page version. + * Added BucketsRemaining to LAN_1 page, redefined the + * state values, and updated the page version. + * Revised bus width definitions in SCSI_PORT_0, + * SCSI_DEVICE_0 and SCSI_DEVICE_1 pages. + * 06-30-00 01.00.04 Added MaxReplySize to LAN_1 page and updated the page + * version. + * Moved FC_DEVICE_0 PageAddress description to spec. + * 07-27-00 01.00.05 Corrected the SubsystemVendorID and SubsystemID field + * widths in IOC_0 page and updated the page version. + * 11-02-00 01.01.01 Original release for post 1.0 work + * Added Manufacturing pages, IO Unit Page 2, SCSI SPI + * Port Page 2, FC Port Page 4, FC Port Page 5 + * 11-15-00 01.01.02 Interim changes to match proposals + * 12-04-00 01.01.03 Config page changes to match MPI rev 1.00.01. + * 12-05-00 01.01.04 Modified config page actions. + * 01-09-01 01.01.05 Added defines for page address formats. + * Data size for Manufacturing pages 2 and 3 no longer + * defined here. + * Io Unit Page 2 size is fixed at 4 adapters and some + * flags were changed. + * SCSI Port Page 2 Device Settings modified. + * New fields added to FC Port Page 0 and some flags + * cleaned up. + * Removed impedance flash from FC Port Page 1. + * Added FC Port pages 6 and 7. + * 01-25-01 01.01.06 Added MaxInitiators field to FcPortPage0. + * 01-29-01 01.01.07 Changed some defines to make them 32 character unique. + * Added some LinkType defines for FcPortPage0. + * 02-20-01 01.01.08 Started using MPI_POINTER. + * 02-27-01 01.01.09 Replaced MPI_CONFIG_PAGETYPE_SCSI_LUN with + * MPI_CONFIG_PAGETYPE_RAID_VOLUME. + * Added definitions and structures for IOC Page 2 and + * RAID Volume Page 2. + * 03-27-01 01.01.10 Added CONFIG_PAGE_FC_PORT_8 and CONFIG_PAGE_FC_PORT_9. + * CONFIG_PAGE_FC_PORT_3 now supports persistent by DID. + * Added VendorId and ProductRevLevel fields to + * RAIDVOL2_IM_PHYS_ID struct. + * Modified values for MPI_FCPORTPAGE0_FLAGS_ATTACH_ + * defines to make them compatible to MPI version 1.0. + * Added structure offset comments. + * 04-09-01 01.01.11 Added some new defines for the PageAddress field and + * removed some obsolete ones. + * Added IO Unit Page 3. + * Modified defines for Scsi Port Page 2. + * Modified RAID Volume Pages. + * 08-08-01 01.02.01 Original release for v1.2 work. + * Added SepID and SepBus to RVP2 IMPhysicalDisk struct. + * Added defines for the SEP bits in RVP2 VolumeSettings. + * Modified the DeviceSettings field in RVP2 to use the + * proper structure. + * Added defines for SES, SAF-TE, and cross channel for + * IOCPage2 CapabilitiesFlags. + * Removed define for MPI_IOUNITPAGE2_FLAGS_RAID_DISABLE. + * Removed define for + * MPI_SCSIPORTPAGE2_PORT_FLAGS_PARITY_ENABLE. + * Added define for MPI_CONFIG_PAGEATTR_RO_PERSISTENT. + * 08-29-01 01.02.02 Fixed value for MPI_MANUFACTPAGE_DEVID_53C1035. + * Added defines for MPI_FCPORTPAGE1_FLAGS_HARD_ALPA_ONLY + * and MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY. + * Removed MPI_SCSIPORTPAGE0_CAP_PACING_TRANSFERS, + * MPI_SCSIDEVPAGE0_NP_PACING_TRANSFERS, and + * MPI_SCSIDEVPAGE1_RP_PACING_TRANSFERS, and + * MPI_SCSIDEVPAGE1_CONF_PPR_ALLOWED. + * Added defines for MPI_SCSIDEVPAGE1_CONF_WDTR_DISALLOWED + * and MPI_SCSIDEVPAGE1_CONF_SDTR_DISALLOWED. + * Added OnBusTimerValue to CONFIG_PAGE_SCSI_PORT_1. + * Added rejected bits to SCSI Device Page 0 Information. + * Increased size of ALPA array in FC Port Page 2 by one + * and removed a one byte reserved field. + * 09-28-01 01.02.03 Swapped NegWireSpeedLow and NegWireSpeedLow in + * CONFIG_PAGE_LAN_1 to match preferred 64-bit ordering. + * Added structures for Manufacturing Page 4, IO Unit + * Page 3, IOC Page 3, IOC Page 4, RAID Volume Page 0, and + * RAID PhysDisk Page 0. + * 10-04-01 01.02.04 Added define for MPI_CONFIG_PAGETYPE_RAID_PHYSDISK. + * Modified some of the new defines to make them 32 + * character unique. + * Modified how variable length pages (arrays) are defined. + * Added generic defines for hot spare pools and RAID + * volume types. + * 11-01-01 01.02.05 Added define for MPI_IOUNITPAGE1_DISABLE_IR. + * 03-14-02 01.02.06 Added PCISlotNum field to CONFIG_PAGE_IOC_1 along with + * related define, and bumped the page version define. + * 05-31-02 01.02.07 Added a Flags field to CONFIG_PAGE_IOC_2_RAID_VOL in a + * reserved byte and added a define. + * Added define for + * MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE. + * Added new config page: CONFIG_PAGE_IOC_5. + * Added MaxAliases, MaxHardAliases, and NumCurrentAliases + * fields to CONFIG_PAGE_FC_PORT_0. + * Added AltConnector and NumRequestedAliases fields to + * CONFIG_PAGE_FC_PORT_1. + * Added new config page: CONFIG_PAGE_FC_PORT_10. + * 07-12-02 01.02.08 Added more MPI_MANUFACTPAGE_DEVID_ defines. + * Added additional MPI_SCSIDEVPAGE0_NP_ defines. + * Added more MPI_SCSIDEVPAGE1_RP_ defines. + * Added define for + * MPI_SCSIDEVPAGE1_CONF_EXTENDED_PARAMS_ENABLE. + * Added new config page: CONFIG_PAGE_SCSI_DEVICE_3. + * Modified MPI_FCPORTPAGE5_FLAGS_ defines. + * 09-16-02 01.02.09 Added MPI_SCSIDEVPAGE1_CONF_FORCE_PPR_MSG define. + * 11-15-02 01.02.10 Added ConnectedID defines for CONFIG_PAGE_SCSI_PORT_0. + * Added more Flags defines for CONFIG_PAGE_FC_PORT_1. + * Added more Flags defines for CONFIG_PAGE_FC_DEVICE_0. + * 04-01-03 01.02.11 Added RR_TOV field and additional Flags defines for + * CONFIG_PAGE_FC_PORT_1. + * Added define MPI_FCPORTPAGE5_FLAGS_DISABLE to disable + * an alias. + * Added more device id defines. + * 06-26-03 01.02.12 Added MPI_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID define. + * Added TargetConfig and IDConfig fields to + * CONFIG_PAGE_SCSI_PORT_1. + * Added more PortFlags defines for CONFIG_PAGE_SCSI_PORT_2 + * to control DV. + * Added more Flags defines for CONFIG_PAGE_FC_PORT_1. + * In CONFIG_PAGE_FC_DEVICE_0, replaced Reserved1 field + * with ADISCHardALPA. + * Added MPI_FC_DEVICE_PAGE0_PROT_FCP_RETRY define. + * 01-16-04 01.02.13 Added InitiatorDeviceTimeout and InitiatorIoPendTimeout + * fields and related defines to CONFIG_PAGE_FC_PORT_1. + * Added define for + * MPI_FCPORTPAGE1_FLAGS_SOFT_ALPA_FALLBACK. + * Added new fields to the substructures of + * CONFIG_PAGE_FC_PORT_10. + * 04-29-04 01.02.14 Added define for IDP bit for CONFIG_PAGE_SCSI_PORT_0, + * CONFIG_PAGE_SCSI_DEVICE_0, and + * CONFIG_PAGE_SCSI_DEVICE_1. Also bumped Page Version for + * these pages. + * 05-11-04 01.03.01 Added structure for CONFIG_PAGE_INBAND_0. + * 08-19-04 01.05.01 Modified MSG_CONFIG request to support extended config + * pages. + * Added a new structure for extended config page header. + * Added new extended config pages types and structures for + * SAS IO Unit, SAS Expander, SAS Device, and SAS PHY. + * Replaced a reserved byte in CONFIG_PAGE_MANUFACTURING_4 + * to add a Flags field. + * Two new Manufacturing config pages (5 and 6). + * Two new bits defined for IO Unit Page 1 Flags field. + * Modified CONFIG_PAGE_IO_UNIT_2 to add three new fields + * to specify the BIOS boot device. + * Four new Flags bits defined for IO Unit Page 2. + * Added IO Unit Page 4. + * Added EEDP Flags settings to IOC Page 1. + * Added new BIOS Page 1 config page. + * 10-05-04 01.05.02 Added define for + * MPI_IOCPAGE1_INITIATOR_CONTEXT_REPLY_DISABLE. + * Added new Flags field to CONFIG_PAGE_MANUFACTURING_5 and + * associated defines. + * Added more defines for SAS IO Unit Page 0 + * DiscoveryStatus field. + * Added define for MPI_SAS_IOUNIT0_DS_SUBTRACTIVE_LINK + * and MPI_SAS_IOUNIT0_DS_TABLE_LINK. + * Added defines for Physical Mapping Modes to SAS IO Unit + * Page 2. + * Added define for + * MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH. + * 10-27-04 01.05.03 Added defines for new SAS PHY page addressing mode. + * Added defines for MaxTargetSpinUp to BIOS Page 1. + * Added 5 new ControlFlags defines for SAS IO Unit + * Page 1. + * Added MaxNumPhysicalMappedIDs field to SAS IO Unit + * Page 2. + * Added AccessStatus field to SAS Device Page 0 and added + * new Flags bits for supported SATA features. + * 12-07-04 01.05.04 Added config page structures for BIOS Page 2, RAID + * Volume Page 1, and RAID Physical Disk Page 1. + * Replaced IO Unit Page 1 BootTargetID,BootBus, and + * BootAdapterNum with reserved field. + * Added DataScrubRate and ResyncRate to RAID Volume + * Page 0. + * Added MPI_SAS_IOUNIT2_FLAGS_RESERVE_ID_0_FOR_BOOT + * define. + * 12-09-04 01.05.05 Added Target Mode Large CDB Enable to FC Port Page 1 + * Flags field. + * Added Auto Port Config flag define for SAS IOUNIT + * Page 1 ControlFlags. + * Added Disabled bad Phy define to Expander Page 1 + * Discovery Info field. + * Added SAS/SATA device support to SAS IOUnit Page 1 + * ControlFlags. + * Added Unsupported device to SAS Dev Page 0 Flags field + * Added disable use SATA Hash Address for SAS IOUNIT + * page 1 in ControlFields. + * 01-15-05 01.05.06 Added defaults for data scrub rate and resync rate to + * Manufacturing Page 4. + * Added new defines for BIOS Page 1 IOCSettings field. + * Added ExtDiskIdentifier field to RAID Physical Disk + * Page 0. + * Added new defines for SAS IO Unit Page 1 ControlFlags + * and to SAS Device Page 0 Flags to control SATA devices. + * Added defines and structures for the new Log Page 0, a + * new type of configuration page. + * 02-09-05 01.05.07 Added InactiveStatus field to RAID Volume Page 0. + * Added WWID field to RAID Volume Page 1. + * Added PhysicalPort field to SAS Expander pages 0 and 1. + * 03-11-05 01.05.08 Removed the EEDP flags from IOC Page 1. + * Added Enclosure/Slot boot device format to BIOS Page 2. + * New status value for RAID Volume Page 0 VolumeStatus + * (VolumeState subfield). + * New value for RAID Physical Page 0 InactiveStatus. + * Added Inactive Volume Member flag RAID Physical Disk + * Page 0 PhysDiskStatus field. + * New physical mapping mode in SAS IO Unit Page 2. + * Added CONFIG_PAGE_SAS_ENCLOSURE_0. + * Added Slot and Enclosure fields to SAS Device Page 0. + * 06-24-05 01.05.09 Added EEDP defines to IOC Page 1. + * Added more RAID type defines to IOC Page 2. + * Added Port Enable Delay settings to BIOS Page 1. + * Added Bad Block Table Full define to RAID Volume Page 0. + * Added Previous State defines to RAID Physical Disk + * Page 0. + * Added Max Sata Targets define for DiscoveryStatus field + * of SAS IO Unit Page 0. + * Added Device Self Test to Control Flags of SAS IO Unit + * Page 1. + * Added Direct Attach Starting Slot Number define for SAS + * IO Unit Page 2. + * Added new fields in SAS Device Page 2 for enclosure + * mapping. + * Added OwnerDevHandle and Flags field to SAS PHY Page 0. + * Added IOC GPIO Flags define to SAS Enclosure Page 0. + * Fixed the value for MPI_SAS_IOUNIT1_CONTROL_DEV_SATA_SUPPORT. + * 08-03-05 01.05.10 Removed ISDataScrubRate and ISResyncRate from + * Manufacturing Page 4. + * Added MPI_IOUNITPAGE1_SATA_WRITE_CACHE_DISABLE bit. + * Added NumDevsPerEnclosure field to SAS IO Unit page 2. + * Added MPI_SAS_IOUNIT2_FLAGS_HOST_ASSIGNED_PHYS_MAP + * define. + * Added EnclosureHandle field to SAS Expander page 0. + * Removed redundant NumTableEntriesProg field from SAS + * Expander Page 1. + * 08-30-05 01.05.11 Added DeviceID for FC949E and changed the DeviceID for + * SAS1078. + * Added more defines for Manufacturing Page 4 Flags field. + * Added more defines for IOCSettings and added + * ExpanderSpinup field to Bios Page 1. + * Added postpone SATA Init bit to SAS IO Unit Page 1 + * ControlFlags. + * Changed LogEntry format for Log Page 0. + * 03-27-06 01.05.12 Added two new Flags defines for Manufacturing Page 4. + * Added Manufacturing Page 7. + * Added MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING. + * Added IOC Page 6. + * Added PrevBootDeviceForm field to CONFIG_PAGE_BIOS_2. + * Added MaxLBAHigh field to RAID Volume Page 0. + * Added Nvdata version fields to SAS IO Unit Page 0. + * Added AdditionalControlFlags, MaxTargetPortConnectTime, + * ReportDeviceMissingDelay, and IODeviceMissingDelay + * fields to SAS IO Unit Page 1. + * 10-11-06 01.05.13 Added NumForceWWID field and ForceWWID array to + * Manufacturing Page 5. + * Added Manufacturing pages 8 through 10. + * Added defines for supported metadata size bits in + * CapabilitiesFlags field of IOC Page 6. + * Added defines for metadata size bits in VolumeSettings + * field of RAID Volume Page 0. + * Added SATA Link Reset settings, Enable SATA Asynchronous + * Notification bit, and HideNonZeroAttachedPhyIdentifiers + * bit to AdditionalControlFlags field of SAS IO Unit + * Page 1. + * Added defines for Enclosure Devices Unmapped and + * Device Limit Exceeded bits in Status field of SAS IO + * Unit Page 2. + * Added more AccessStatus values for SAS Device Page 0. + * Added bit for SATA Asynchronous Notification Support in + * Flags field of SAS Device Page 0. + * 02-28-07 01.05.14 Added ExtFlags field to Manufacturing Page 4. + * Added Disable SMART Polling for CapabilitiesFlags of + * IOC Page 6. + * Added Disable SMART Polling to DeviceSettings of BIOS + * Page 1. + * Added Multi-Port Domain bit for DiscoveryStatus field + * of SAS IO Unit Page. + * Added Multi-Port Domain Illegal flag for SAS IO Unit + * Page 1 AdditionalControlFlags field. + * 05-24-07 01.05.15 Added Hide Physical Disks with Non-Integrated RAID + * Metadata bit to Manufacturing Page 4 ExtFlags field. + * Added Internal Connector to End Device Present bit to + * Expander Page 0 Flags field. + * Fixed define for + * MPI_SAS_EXPANDER1_DISCINFO_BAD_PHY_DISABLED. + * 08-07-07 01.05.16 Added MPI_IOCPAGE6_CAP_FLAGS_MULTIPORT_DRIVE_SUPPORT + * define. + * Added BIOS Page 4 structure. + * Added MPI_RAID_PHYS_DISK1_PATH_MAX define for RAID + * Physcial Disk Page 1. + * 01-15-07 01.05.17 Added additional bit defines for ExtFlags field of + * Manufacturing Page 4. + * Added Solid State Drives Supported bit to IOC Page 6 + * Capabilities Flags. + * Added new value for AccessStatus field of SAS Device + * Page 0 (_SATA_NEEDS_INITIALIZATION). + * 03-28-08 01.05.18 Defined new bits in Manufacturing Page 4 ExtFlags field + * to control coercion size and the mixing of SAS and SATA + * SSD drives. + * 07-11-08 01.05.19 Added defines MPI_MANPAGE4_EXTFLAGS_RAID0_SINGLE_DRIVE + * and MPI_MANPAGE4_EXTFLAGS_SSD_SCRUB_DISABLE for ExtFlags + * field of Manufacturing Page 4. + * Added defines for a new bit in BIOS Page 1 BiosOptions + * field to control adapter scan order. + * Added BootDeviceWaitTime field to SAS IO Unit Page 2. + * Added MPI_SAS_PHY0_PHYINFO_PHY_VACANT for use in PhyInfo + * field of SAS Expander Page 1. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_CNFG_H +#define MPI_CNFG_H + + +/***************************************************************************** +* +* C o n f i g M e s s a g e a n d S t r u c t u r e s +* +*****************************************************************************/ + +typedef struct _CONFIG_PAGE_HEADER +{ + U8 PageVersion; /* 00h */ + U8 PageLength; /* 01h */ + U8 PageNumber; /* 02h */ + U8 PageType; /* 03h */ +} CONFIG_PAGE_HEADER, MPI_POINTER PTR_CONFIG_PAGE_HEADER, + ConfigPageHeader_t, MPI_POINTER pConfigPageHeader_t; + +typedef union _CONFIG_PAGE_HEADER_UNION +{ + ConfigPageHeader_t Struct; + U8 Bytes[4]; + U16 Word16[2]; + U32 Word32; +} ConfigPageHeaderUnion, MPI_POINTER pConfigPageHeaderUnion, + CONFIG_PAGE_HEADER_UNION, MPI_POINTER PTR_CONFIG_PAGE_HEADER_UNION; + +typedef struct _CONFIG_EXTENDED_PAGE_HEADER +{ + U8 PageVersion; /* 00h */ + U8 Reserved1; /* 01h */ + U8 PageNumber; /* 02h */ + U8 PageType; /* 03h */ + U16 ExtPageLength; /* 04h */ + U8 ExtPageType; /* 06h */ + U8 Reserved2; /* 07h */ +} CONFIG_EXTENDED_PAGE_HEADER, MPI_POINTER PTR_CONFIG_EXTENDED_PAGE_HEADER, + ConfigExtendedPageHeader_t, MPI_POINTER pConfigExtendedPageHeader_t; + + + +/**************************************************************************** +* PageType field values +****************************************************************************/ +#define MPI_CONFIG_PAGEATTR_READ_ONLY (0x00) +#define MPI_CONFIG_PAGEATTR_CHANGEABLE (0x10) +#define MPI_CONFIG_PAGEATTR_PERSISTENT (0x20) +#define MPI_CONFIG_PAGEATTR_RO_PERSISTENT (0x30) +#define MPI_CONFIG_PAGEATTR_MASK (0xF0) + +#define MPI_CONFIG_PAGETYPE_IO_UNIT (0x00) +#define MPI_CONFIG_PAGETYPE_IOC (0x01) +#define MPI_CONFIG_PAGETYPE_BIOS (0x02) +#define MPI_CONFIG_PAGETYPE_SCSI_PORT (0x03) +#define MPI_CONFIG_PAGETYPE_SCSI_DEVICE (0x04) +#define MPI_CONFIG_PAGETYPE_FC_PORT (0x05) +#define MPI_CONFIG_PAGETYPE_FC_DEVICE (0x06) +#define MPI_CONFIG_PAGETYPE_LAN (0x07) +#define MPI_CONFIG_PAGETYPE_RAID_VOLUME (0x08) +#define MPI_CONFIG_PAGETYPE_MANUFACTURING (0x09) +#define MPI_CONFIG_PAGETYPE_RAID_PHYSDISK (0x0A) +#define MPI_CONFIG_PAGETYPE_INBAND (0x0B) +#define MPI_CONFIG_PAGETYPE_EXTENDED (0x0F) +#define MPI_CONFIG_PAGETYPE_MASK (0x0F) + +#define MPI_CONFIG_TYPENUM_MASK (0x0FFF) + + +/**************************************************************************** +* ExtPageType field values +****************************************************************************/ +#define MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT (0x10) +#define MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER (0x11) +#define MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE (0x12) +#define MPI_CONFIG_EXTPAGETYPE_SAS_PHY (0x13) +#define MPI_CONFIG_EXTPAGETYPE_LOG (0x14) +#define MPI_CONFIG_EXTPAGETYPE_ENCLOSURE (0x15) + + +/**************************************************************************** +* PageAddress field values +****************************************************************************/ +#define MPI_SCSI_PORT_PGAD_PORT_MASK (0x000000FF) + +#define MPI_SCSI_DEVICE_FORM_MASK (0xF0000000) +#define MPI_SCSI_DEVICE_FORM_BUS_TID (0x00000000) +#define MPI_SCSI_DEVICE_TARGET_ID_MASK (0x000000FF) +#define MPI_SCSI_DEVICE_TARGET_ID_SHIFT (0) +#define MPI_SCSI_DEVICE_BUS_MASK (0x0000FF00) +#define MPI_SCSI_DEVICE_BUS_SHIFT (8) +#define MPI_SCSI_DEVICE_FORM_TARGET_MODE (0x10000000) +#define MPI_SCSI_DEVICE_TM_RESPOND_ID_MASK (0x000000FF) +#define MPI_SCSI_DEVICE_TM_RESPOND_ID_SHIFT (0) +#define MPI_SCSI_DEVICE_TM_BUS_MASK (0x0000FF00) +#define MPI_SCSI_DEVICE_TM_BUS_SHIFT (8) +#define MPI_SCSI_DEVICE_TM_INIT_ID_MASK (0x00FF0000) +#define MPI_SCSI_DEVICE_TM_INIT_ID_SHIFT (16) + +#define MPI_FC_PORT_PGAD_PORT_MASK (0xF0000000) +#define MPI_FC_PORT_PGAD_PORT_SHIFT (28) +#define MPI_FC_PORT_PGAD_FORM_MASK (0x0F000000) +#define MPI_FC_PORT_PGAD_FORM_INDEX (0x01000000) +#define MPI_FC_PORT_PGAD_INDEX_MASK (0x0000FFFF) +#define MPI_FC_PORT_PGAD_INDEX_SHIFT (0) + +#define MPI_FC_DEVICE_PGAD_PORT_MASK (0xF0000000) +#define MPI_FC_DEVICE_PGAD_PORT_SHIFT (28) +#define MPI_FC_DEVICE_PGAD_FORM_MASK (0x0F000000) +#define MPI_FC_DEVICE_PGAD_FORM_NEXT_DID (0x00000000) +#define MPI_FC_DEVICE_PGAD_ND_PORT_MASK (0xF0000000) +#define MPI_FC_DEVICE_PGAD_ND_PORT_SHIFT (28) +#define MPI_FC_DEVICE_PGAD_ND_DID_MASK (0x00FFFFFF) +#define MPI_FC_DEVICE_PGAD_ND_DID_SHIFT (0) +#define MPI_FC_DEVICE_PGAD_FORM_BUS_TID (0x01000000) +#define MPI_FC_DEVICE_PGAD_BT_BUS_MASK (0x0000FF00) +#define MPI_FC_DEVICE_PGAD_BT_BUS_SHIFT (8) +#define MPI_FC_DEVICE_PGAD_BT_TID_MASK (0x000000FF) +#define MPI_FC_DEVICE_PGAD_BT_TID_SHIFT (0) + +#define MPI_PHYSDISK_PGAD_PHYSDISKNUM_MASK (0x000000FF) +#define MPI_PHYSDISK_PGAD_PHYSDISKNUM_SHIFT (0) + +#define MPI_SAS_EXPAND_PGAD_FORM_MASK (0xF0000000) +#define MPI_SAS_EXPAND_PGAD_FORM_SHIFT (28) +#define MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) +#define MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM (0x00000001) +#define MPI_SAS_EXPAND_PGAD_FORM_HANDLE (0x00000002) +#define MPI_SAS_EXPAND_PGAD_GNH_MASK_HANDLE (0x0000FFFF) +#define MPI_SAS_EXPAND_PGAD_GNH_SHIFT_HANDLE (0) +#define MPI_SAS_EXPAND_PGAD_HPN_MASK_PHY (0x00FF0000) +#define MPI_SAS_EXPAND_PGAD_HPN_SHIFT_PHY (16) +#define MPI_SAS_EXPAND_PGAD_HPN_MASK_HANDLE (0x0000FFFF) +#define MPI_SAS_EXPAND_PGAD_HPN_SHIFT_HANDLE (0) +#define MPI_SAS_EXPAND_PGAD_H_MASK_HANDLE (0x0000FFFF) +#define MPI_SAS_EXPAND_PGAD_H_SHIFT_HANDLE (0) + +#define MPI_SAS_DEVICE_PGAD_FORM_MASK (0xF0000000) +#define MPI_SAS_DEVICE_PGAD_FORM_SHIFT (28) +#define MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) +#define MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID (0x00000001) +#define MPI_SAS_DEVICE_PGAD_FORM_HANDLE (0x00000002) +#define MPI_SAS_DEVICE_PGAD_GNH_HANDLE_MASK (0x0000FFFF) +#define MPI_SAS_DEVICE_PGAD_GNH_HANDLE_SHIFT (0) +#define MPI_SAS_DEVICE_PGAD_BT_BUS_MASK (0x0000FF00) +#define MPI_SAS_DEVICE_PGAD_BT_BUS_SHIFT (8) +#define MPI_SAS_DEVICE_PGAD_BT_TID_MASK (0x000000FF) +#define MPI_SAS_DEVICE_PGAD_BT_TID_SHIFT (0) +#define MPI_SAS_DEVICE_PGAD_H_HANDLE_MASK (0x0000FFFF) +#define MPI_SAS_DEVICE_PGAD_H_HANDLE_SHIFT (0) + +#define MPI_SAS_PHY_PGAD_FORM_MASK (0xF0000000) +#define MPI_SAS_PHY_PGAD_FORM_SHIFT (28) +#define MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER (0x0) +#define MPI_SAS_PHY_PGAD_FORM_PHY_TBL_INDEX (0x1) +#define MPI_SAS_PHY_PGAD_PHY_NUMBER_MASK (0x000000FF) +#define MPI_SAS_PHY_PGAD_PHY_NUMBER_SHIFT (0) +#define MPI_SAS_PHY_PGAD_PHY_TBL_INDEX_MASK (0x0000FFFF) +#define MPI_SAS_PHY_PGAD_PHY_TBL_INDEX_SHIFT (0) + +#define MPI_SAS_ENCLOS_PGAD_FORM_MASK (0xF0000000) +#define MPI_SAS_ENCLOS_PGAD_FORM_SHIFT (28) +#define MPI_SAS_ENCLOS_PGAD_FORM_GET_NEXT_HANDLE (0x00000000) +#define MPI_SAS_ENCLOS_PGAD_FORM_HANDLE (0x00000001) +#define MPI_SAS_ENCLOS_PGAD_GNH_HANDLE_MASK (0x0000FFFF) +#define MPI_SAS_ENCLOS_PGAD_GNH_HANDLE_SHIFT (0) +#define MPI_SAS_ENCLOS_PGAD_H_HANDLE_MASK (0x0000FFFF) +#define MPI_SAS_ENCLOS_PGAD_H_HANDLE_SHIFT (0) + + + +/**************************************************************************** +* Config Request Message +****************************************************************************/ +typedef struct _MSG_CONFIG +{ + U8 Action; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 ExtPageLength; /* 04h */ + U8 ExtPageType; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Reserved2[8]; /* 0Ch */ + CONFIG_PAGE_HEADER Header; /* 14h */ + U32 PageAddress; /* 18h */ + SGE_IO_UNION PageBufferSGE; /* 1Ch */ +} MSG_CONFIG, MPI_POINTER PTR_MSG_CONFIG, + Config_t, MPI_POINTER pConfig_t; + + +/**************************************************************************** +* Action field values +****************************************************************************/ +#define MPI_CONFIG_ACTION_PAGE_HEADER (0x00) +#define MPI_CONFIG_ACTION_PAGE_READ_CURRENT (0x01) +#define MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT (0x02) +#define MPI_CONFIG_ACTION_PAGE_DEFAULT (0x03) +#define MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM (0x04) +#define MPI_CONFIG_ACTION_PAGE_READ_DEFAULT (0x05) +#define MPI_CONFIG_ACTION_PAGE_READ_NVRAM (0x06) + + +/* Config Reply Message */ +typedef struct _MSG_CONFIG_REPLY +{ + U8 Action; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 ExtPageLength; /* 04h */ + U8 ExtPageType; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Reserved2[2]; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + CONFIG_PAGE_HEADER Header; /* 14h */ +} MSG_CONFIG_REPLY, MPI_POINTER PTR_MSG_CONFIG_REPLY, + ConfigReply_t, MPI_POINTER pConfigReply_t; + + + +/***************************************************************************** +* +* C o n f i g u r a t i o n P a g e s +* +*****************************************************************************/ + +/**************************************************************************** +* Manufacturing Config pages +****************************************************************************/ +#define MPI_MANUFACTPAGE_VENDORID_LSILOGIC (0x1000) +/* Fibre Channel */ +#define MPI_MANUFACTPAGE_DEVICEID_FC909 (0x0621) +#define MPI_MANUFACTPAGE_DEVICEID_FC919 (0x0624) +#define MPI_MANUFACTPAGE_DEVICEID_FC929 (0x0622) +#define MPI_MANUFACTPAGE_DEVICEID_FC919X (0x0628) +#define MPI_MANUFACTPAGE_DEVICEID_FC929X (0x0626) +#define MPI_MANUFACTPAGE_DEVICEID_FC939X (0x0642) +#define MPI_MANUFACTPAGE_DEVICEID_FC949X (0x0640) +#define MPI_MANUFACTPAGE_DEVICEID_FC949E (0x0646) +/* SCSI */ +#define MPI_MANUFACTPAGE_DEVID_53C1030 (0x0030) +#define MPI_MANUFACTPAGE_DEVID_53C1030ZC (0x0031) +#define MPI_MANUFACTPAGE_DEVID_1030_53C1035 (0x0032) +#define MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035 (0x0033) +#define MPI_MANUFACTPAGE_DEVID_53C1035 (0x0040) +#define MPI_MANUFACTPAGE_DEVID_53C1035ZC (0x0041) +/* SAS */ +#define MPI_MANUFACTPAGE_DEVID_SAS1064 (0x0050) +#define MPI_MANUFACTPAGE_DEVID_SAS1064A (0x005C) +#define MPI_MANUFACTPAGE_DEVID_SAS1064E (0x0056) +#define MPI_MANUFACTPAGE_DEVID_SAS1066 (0x005E) +#define MPI_MANUFACTPAGE_DEVID_SAS1066E (0x005A) +#define MPI_MANUFACTPAGE_DEVID_SAS1068 (0x0054) +#define MPI_MANUFACTPAGE_DEVID_SAS1068E (0x0058) +#define MPI_MANUFACTPAGE_DEVID_SAS1078 (0x0062) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 ChipName[16]; /* 04h */ + U8 ChipRevision[8]; /* 14h */ + U8 BoardName[16]; /* 1Ch */ + U8 BoardAssembly[16]; /* 2Ch */ + U8 BoardTracerNumber[16]; /* 3Ch */ + +} CONFIG_PAGE_MANUFACTURING_0, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_0, + ManufacturingPage0_t, MPI_POINTER pManufacturingPage0_t; + +#define MPI_MANUFACTURING0_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 VPD[256]; /* 04h */ +} CONFIG_PAGE_MANUFACTURING_1, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_1, + ManufacturingPage1_t, MPI_POINTER pManufacturingPage1_t; + +#define MPI_MANUFACTURING1_PAGEVERSION (0x00) + + +typedef struct _MPI_CHIP_REVISION_ID +{ + U16 DeviceID; /* 00h */ + U8 PCIRevisionID; /* 02h */ + U8 Reserved; /* 03h */ +} MPI_CHIP_REVISION_ID, MPI_POINTER PTR_MPI_CHIP_REVISION_ID, + MpiChipRevisionId_t, MPI_POINTER pMpiChipRevisionId_t; + + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_MAN_PAGE_2_HW_SETTINGS_WORDS +#define MPI_MAN_PAGE_2_HW_SETTINGS_WORDS (1) +#endif + +typedef struct _CONFIG_PAGE_MANUFACTURING_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + MPI_CHIP_REVISION_ID ChipId; /* 04h */ + U32 HwSettings[MPI_MAN_PAGE_2_HW_SETTINGS_WORDS];/* 08h */ +} CONFIG_PAGE_MANUFACTURING_2, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_2, + ManufacturingPage2_t, MPI_POINTER pManufacturingPage2_t; + +#define MPI_MANUFACTURING2_PAGEVERSION (0x00) + + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_MAN_PAGE_3_INFO_WORDS +#define MPI_MAN_PAGE_3_INFO_WORDS (1) +#endif + +typedef struct _CONFIG_PAGE_MANUFACTURING_3 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + MPI_CHIP_REVISION_ID ChipId; /* 04h */ + U32 Info[MPI_MAN_PAGE_3_INFO_WORDS];/* 08h */ +} CONFIG_PAGE_MANUFACTURING_3, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_3, + ManufacturingPage3_t, MPI_POINTER pManufacturingPage3_t; + +#define MPI_MANUFACTURING3_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_4 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 04h */ + U8 InfoOffset0; /* 08h */ + U8 InfoSize0; /* 09h */ + U8 InfoOffset1; /* 0Ah */ + U8 InfoSize1; /* 0Bh */ + U8 InquirySize; /* 0Ch */ + U8 Flags; /* 0Dh */ + U16 ExtFlags; /* 0Eh */ + U8 InquiryData[56]; /* 10h */ + U32 ISVolumeSettings; /* 48h */ + U32 IMEVolumeSettings; /* 4Ch */ + U32 IMVolumeSettings; /* 50h */ + U32 Reserved3; /* 54h */ + U32 Reserved4; /* 58h */ + U32 Reserved5; /* 5Ch */ + U8 IMEDataScrubRate; /* 60h */ + U8 IMEResyncRate; /* 61h */ + U16 Reserved6; /* 62h */ + U8 IMDataScrubRate; /* 64h */ + U8 IMResyncRate; /* 65h */ + U16 Reserved7; /* 66h */ + U32 Reserved8; /* 68h */ + U32 Reserved9; /* 6Ch */ +} CONFIG_PAGE_MANUFACTURING_4, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_4, + ManufacturingPage4_t, MPI_POINTER pManufacturingPage4_t; + +#define MPI_MANUFACTURING4_PAGEVERSION (0x05) + +/* defines for the Flags field */ +#define MPI_MANPAGE4_FORCE_BAD_BLOCK_TABLE (0x80) +#define MPI_MANPAGE4_FORCE_OFFLINE_FAILOVER (0x40) +#define MPI_MANPAGE4_IME_DISABLE (0x20) +#define MPI_MANPAGE4_IM_DISABLE (0x10) +#define MPI_MANPAGE4_IS_DISABLE (0x08) +#define MPI_MANPAGE4_IR_MODEPAGE8_DISABLE (0x04) +#define MPI_MANPAGE4_IM_RESYNC_CACHE_ENABLE (0x02) +#define MPI_MANPAGE4_IR_NO_MIX_SAS_SATA (0x01) + +/* defines for the ExtFlags field */ +#define MPI_MANPAGE4_EXTFLAGS_RAID0_SINGLE_DRIVE (0x0400) +#define MPI_MANPAGE4_EXTFLAGS_SSD_SCRUB_DISABLE (0x0200) +#define MPI_MANPAGE4_EXTFLAGS_MASK_COERCION_SIZE (0x0180) +#define MPI_MANPAGE4_EXTFLAGS_SHIFT_COERCION_SIZE (7) +#define MPI_MANPAGE4_EXTFLAGS_1GB_COERCION_SIZE (0) +#define MPI_MANPAGE4_EXTFLAGS_128MB_COERCION_SIZE (1) + +#define MPI_MANPAGE4_EXTFLAGS_NO_MIX_SSD_SAS_SATA (0x0040) +#define MPI_MANPAGE4_EXTFLAGS_MIX_SSD_AND_NON_SSD (0x0020) +#define MPI_MANPAGE4_EXTFLAGS_DUAL_PORT_SUPPORT (0x0010) +#define MPI_MANPAGE4_EXTFLAGS_HIDE_NON_IR_METADATA (0x0008) +#define MPI_MANPAGE4_EXTFLAGS_SAS_CACHE_DISABLE (0x0004) +#define MPI_MANPAGE4_EXTFLAGS_SATA_CACHE_DISABLE (0x0002) +#define MPI_MANPAGE4_EXTFLAGS_LEGACY_MODE (0x0001) + + +#ifndef MPI_MANPAGE5_NUM_FORCEWWID +#define MPI_MANPAGE5_NUM_FORCEWWID (1) +#endif + +typedef struct _CONFIG_PAGE_MANUFACTURING_5 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U64 BaseWWID; /* 04h */ + U8 Flags; /* 0Ch */ + U8 NumForceWWID; /* 0Dh */ + U16 Reserved2; /* 0Eh */ + U32 Reserved3; /* 10h */ + U32 Reserved4; /* 14h */ + U64 ForceWWID[MPI_MANPAGE5_NUM_FORCEWWID]; /* 18h */ +} CONFIG_PAGE_MANUFACTURING_5, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_5, + ManufacturingPage5_t, MPI_POINTER pManufacturingPage5_t; + +#define MPI_MANUFACTURING5_PAGEVERSION (0x02) + +/* defines for the Flags field */ +#define MPI_MANPAGE5_TWO_WWID_PER_PHY (0x01) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_6 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 ProductSpecificInfo;/* 04h */ +} CONFIG_PAGE_MANUFACTURING_6, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_6, + ManufacturingPage6_t, MPI_POINTER pManufacturingPage6_t; + +#define MPI_MANUFACTURING6_PAGEVERSION (0x00) + + +typedef struct _MPI_MANPAGE7_CONNECTOR_INFO +{ + U32 Pinout; /* 00h */ + U8 Connector[16]; /* 04h */ + U8 Location; /* 14h */ + U8 Reserved1; /* 15h */ + U16 Slot; /* 16h */ + U32 Reserved2; /* 18h */ +} MPI_MANPAGE7_CONNECTOR_INFO, MPI_POINTER PTR_MPI_MANPAGE7_CONNECTOR_INFO, + MpiManPage7ConnectorInfo_t, MPI_POINTER pMpiManPage7ConnectorInfo_t; + +/* defines for the Pinout field */ +#define MPI_MANPAGE7_PINOUT_SFF_8484_L4 (0x00080000) +#define MPI_MANPAGE7_PINOUT_SFF_8484_L3 (0x00040000) +#define MPI_MANPAGE7_PINOUT_SFF_8484_L2 (0x00020000) +#define MPI_MANPAGE7_PINOUT_SFF_8484_L1 (0x00010000) +#define MPI_MANPAGE7_PINOUT_SFF_8470_L4 (0x00000800) +#define MPI_MANPAGE7_PINOUT_SFF_8470_L3 (0x00000400) +#define MPI_MANPAGE7_PINOUT_SFF_8470_L2 (0x00000200) +#define MPI_MANPAGE7_PINOUT_SFF_8470_L1 (0x00000100) +#define MPI_MANPAGE7_PINOUT_SFF_8482 (0x00000002) +#define MPI_MANPAGE7_PINOUT_CONNECTION_UNKNOWN (0x00000001) + +/* defines for the Location field */ +#define MPI_MANPAGE7_LOCATION_UNKNOWN (0x01) +#define MPI_MANPAGE7_LOCATION_INTERNAL (0x02) +#define MPI_MANPAGE7_LOCATION_EXTERNAL (0x04) +#define MPI_MANPAGE7_LOCATION_SWITCHABLE (0x08) +#define MPI_MANPAGE7_LOCATION_AUTO (0x10) +#define MPI_MANPAGE7_LOCATION_NOT_PRESENT (0x20) +#define MPI_MANPAGE7_LOCATION_NOT_CONNECTED (0x80) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check NumPhys at runtime. + */ +#ifndef MPI_MANPAGE7_CONNECTOR_INFO_MAX +#define MPI_MANPAGE7_CONNECTOR_INFO_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_MANUFACTURING_7 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 04h */ + U32 Reserved2; /* 08h */ + U32 Flags; /* 0Ch */ + U8 EnclosureName[16]; /* 10h */ + U8 NumPhys; /* 20h */ + U8 Reserved3; /* 21h */ + U16 Reserved4; /* 22h */ + MPI_MANPAGE7_CONNECTOR_INFO ConnectorInfo[MPI_MANPAGE7_CONNECTOR_INFO_MAX]; /* 24h */ +} CONFIG_PAGE_MANUFACTURING_7, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_7, + ManufacturingPage7_t, MPI_POINTER pManufacturingPage7_t; + +#define MPI_MANUFACTURING7_PAGEVERSION (0x00) + +/* defines for the Flags field */ +#define MPI_MANPAGE7_FLAG_USE_SLOT_INFO (0x00000001) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_8 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 ProductSpecificInfo;/* 04h */ +} CONFIG_PAGE_MANUFACTURING_8, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_8, + ManufacturingPage8_t, MPI_POINTER pManufacturingPage8_t; + +#define MPI_MANUFACTURING8_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_9 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 ProductSpecificInfo;/* 04h */ +} CONFIG_PAGE_MANUFACTURING_9, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_9, + ManufacturingPage9_t, MPI_POINTER pManufacturingPage9_t; + +#define MPI_MANUFACTURING9_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_MANUFACTURING_10 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 ProductSpecificInfo;/* 04h */ +} CONFIG_PAGE_MANUFACTURING_10, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_10, + ManufacturingPage10_t, MPI_POINTER pManufacturingPage10_t; + +#define MPI_MANUFACTURING10_PAGEVERSION (0x00) + + +/**************************************************************************** +* IO Unit Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_IO_UNIT_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U64 UniqueValue; /* 04h */ +} CONFIG_PAGE_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_0, + IOUnitPage0_t, MPI_POINTER pIOUnitPage0_t; + +#define MPI_IOUNITPAGE0_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_IO_UNIT_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Flags; /* 04h */ +} CONFIG_PAGE_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_1, + IOUnitPage1_t, MPI_POINTER pIOUnitPage1_t; + +#define MPI_IOUNITPAGE1_PAGEVERSION (0x02) + +/* IO Unit Page 1 Flags defines */ +#define MPI_IOUNITPAGE1_MULTI_FUNCTION (0x00000000) +#define MPI_IOUNITPAGE1_SINGLE_FUNCTION (0x00000001) +#define MPI_IOUNITPAGE1_MULTI_PATHING (0x00000002) +#define MPI_IOUNITPAGE1_SINGLE_PATHING (0x00000000) +#define MPI_IOUNITPAGE1_IR_USE_STATIC_VOLUME_ID (0x00000004) +#define MPI_IOUNITPAGE1_DISABLE_QUEUE_FULL_HANDLING (0x00000020) +#define MPI_IOUNITPAGE1_DISABLE_IR (0x00000040) +#define MPI_IOUNITPAGE1_FORCE_32 (0x00000080) +#define MPI_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE (0x00000100) +#define MPI_IOUNITPAGE1_SATA_WRITE_CACHE_DISABLE (0x00000200) + +typedef struct _MPI_ADAPTER_INFO +{ + U8 PciBusNumber; /* 00h */ + U8 PciDeviceAndFunctionNumber; /* 01h */ + U16 AdapterFlags; /* 02h */ +} MPI_ADAPTER_INFO, MPI_POINTER PTR_MPI_ADAPTER_INFO, + MpiAdapterInfo_t, MPI_POINTER pMpiAdapterInfo_t; + +#define MPI_ADAPTER_INFO_FLAGS_EMBEDDED (0x0001) +#define MPI_ADAPTER_INFO_FLAGS_INIT_STATUS (0x0002) + +typedef struct _CONFIG_PAGE_IO_UNIT_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Flags; /* 04h */ + U32 BiosVersion; /* 08h */ + MPI_ADAPTER_INFO AdapterOrder[4]; /* 0Ch */ + U32 Reserved1; /* 1Ch */ +} CONFIG_PAGE_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_2, + IOUnitPage2_t, MPI_POINTER pIOUnitPage2_t; + +#define MPI_IOUNITPAGE2_PAGEVERSION (0x02) + +#define MPI_IOUNITPAGE2_FLAGS_PAUSE_ON_ERROR (0x00000002) +#define MPI_IOUNITPAGE2_FLAGS_VERBOSE_ENABLE (0x00000004) +#define MPI_IOUNITPAGE2_FLAGS_COLOR_VIDEO_DISABLE (0x00000008) +#define MPI_IOUNITPAGE2_FLAGS_DONT_HOOK_INT_40 (0x00000010) + +#define MPI_IOUNITPAGE2_FLAGS_DEV_LIST_DISPLAY_MASK (0x000000E0) +#define MPI_IOUNITPAGE2_FLAGS_INSTALLED_DEV_DISPLAY (0x00000000) +#define MPI_IOUNITPAGE2_FLAGS_ADAPTER_DISPLAY (0x00000020) +#define MPI_IOUNITPAGE2_FLAGS_ADAPTER_DEV_DISPLAY (0x00000040) + + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX +#define MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_IO_UNIT_3 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 GPIOCount; /* 04h */ + U8 Reserved1; /* 05h */ + U16 Reserved2; /* 06h */ + U16 GPIOVal[MPI_IO_UNIT_PAGE_3_GPIO_VAL_MAX]; /* 08h */ +} CONFIG_PAGE_IO_UNIT_3, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_3, + IOUnitPage3_t, MPI_POINTER pIOUnitPage3_t; + +#define MPI_IOUNITPAGE3_PAGEVERSION (0x01) + +#define MPI_IOUNITPAGE3_GPIO_FUNCTION_MASK (0xFC) +#define MPI_IOUNITPAGE3_GPIO_FUNCTION_SHIFT (2) +#define MPI_IOUNITPAGE3_GPIO_SETTING_OFF (0x00) +#define MPI_IOUNITPAGE3_GPIO_SETTING_ON (0x01) + + +typedef struct _CONFIG_PAGE_IO_UNIT_4 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 04h */ + SGE_SIMPLE_UNION FWImageSGE; /* 08h */ +} CONFIG_PAGE_IO_UNIT_4, MPI_POINTER PTR_CONFIG_PAGE_IO_UNIT_4, + IOUnitPage4_t, MPI_POINTER pIOUnitPage4_t; + +#define MPI_IOUNITPAGE4_PAGEVERSION (0x00) + + +/**************************************************************************** +* IOC Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_IOC_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 TotalNVStore; /* 04h */ + U32 FreeNVStore; /* 08h */ + U16 VendorID; /* 0Ch */ + U16 DeviceID; /* 0Eh */ + U8 RevisionID; /* 10h */ + U8 Reserved[3]; /* 11h */ + U32 ClassCode; /* 14h */ + U16 SubsystemVendorID; /* 18h */ + U16 SubsystemID; /* 1Ah */ +} CONFIG_PAGE_IOC_0, MPI_POINTER PTR_CONFIG_PAGE_IOC_0, + IOCPage0_t, MPI_POINTER pIOCPage0_t; + +#define MPI_IOCPAGE0_PAGEVERSION (0x01) + + +typedef struct _CONFIG_PAGE_IOC_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Flags; /* 04h */ + U32 CoalescingTimeout; /* 08h */ + U8 CoalescingDepth; /* 0Ch */ + U8 PCISlotNum; /* 0Dh */ + U8 Reserved[2]; /* 0Eh */ +} CONFIG_PAGE_IOC_1, MPI_POINTER PTR_CONFIG_PAGE_IOC_1, + IOCPage1_t, MPI_POINTER pIOCPage1_t; + +#define MPI_IOCPAGE1_PAGEVERSION (0x03) + +/* defines for the Flags field */ +#define MPI_IOCPAGE1_EEDP_MODE_MASK (0x07000000) +#define MPI_IOCPAGE1_EEDP_MODE_OFF (0x00000000) +#define MPI_IOCPAGE1_EEDP_MODE_T10 (0x01000000) +#define MPI_IOCPAGE1_EEDP_MODE_LSI_1 (0x02000000) +#define MPI_IOCPAGE1_INITIATOR_CONTEXT_REPLY_DISABLE (0x00000010) +#define MPI_IOCPAGE1_REPLY_COALESCING (0x00000001) + +#define MPI_IOCPAGE1_PCISLOTNUM_UNKNOWN (0xFF) + + +typedef struct _CONFIG_PAGE_IOC_2_RAID_VOL +{ + U8 VolumeID; /* 00h */ + U8 VolumeBus; /* 01h */ + U8 VolumeIOC; /* 02h */ + U8 VolumePageNumber; /* 03h */ + U8 VolumeType; /* 04h */ + U8 Flags; /* 05h */ + U16 Reserved3; /* 06h */ +} CONFIG_PAGE_IOC_2_RAID_VOL, MPI_POINTER PTR_CONFIG_PAGE_IOC_2_RAID_VOL, + ConfigPageIoc2RaidVol_t, MPI_POINTER pConfigPageIoc2RaidVol_t; + +/* IOC Page 2 Volume RAID Type values, also used in RAID Volume pages */ + +#define MPI_RAID_VOL_TYPE_IS (0x00) +#define MPI_RAID_VOL_TYPE_IME (0x01) +#define MPI_RAID_VOL_TYPE_IM (0x02) +#define MPI_RAID_VOL_TYPE_RAID_5 (0x03) +#define MPI_RAID_VOL_TYPE_RAID_6 (0x04) +#define MPI_RAID_VOL_TYPE_RAID_10 (0x05) +#define MPI_RAID_VOL_TYPE_RAID_50 (0x06) +#define MPI_RAID_VOL_TYPE_UNKNOWN (0xFF) + +/* IOC Page 2 Volume Flags values */ + +#define MPI_IOCPAGE2_FLAG_VOLUME_INACTIVE (0x08) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_IOC_PAGE_2_RAID_VOLUME_MAX +#define MPI_IOC_PAGE_2_RAID_VOLUME_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_IOC_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 CapabilitiesFlags; /* 04h */ + U8 NumActiveVolumes; /* 08h */ + U8 MaxVolumes; /* 09h */ + U8 NumActivePhysDisks; /* 0Ah */ + U8 MaxPhysDisks; /* 0Bh */ + CONFIG_PAGE_IOC_2_RAID_VOL RaidVolume[MPI_IOC_PAGE_2_RAID_VOLUME_MAX];/* 0Ch */ +} CONFIG_PAGE_IOC_2, MPI_POINTER PTR_CONFIG_PAGE_IOC_2, + IOCPage2_t, MPI_POINTER pIOCPage2_t; + +#define MPI_IOCPAGE2_PAGEVERSION (0x04) + +/* IOC Page 2 Capabilities flags */ + +#define MPI_IOCPAGE2_CAP_FLAGS_IS_SUPPORT (0x00000001) +#define MPI_IOCPAGE2_CAP_FLAGS_IME_SUPPORT (0x00000002) +#define MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT (0x00000004) +#define MPI_IOCPAGE2_CAP_FLAGS_RAID_5_SUPPORT (0x00000008) +#define MPI_IOCPAGE2_CAP_FLAGS_RAID_6_SUPPORT (0x00000010) +#define MPI_IOCPAGE2_CAP_FLAGS_RAID_10_SUPPORT (0x00000020) +#define MPI_IOCPAGE2_CAP_FLAGS_RAID_50_SUPPORT (0x00000040) +#define MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING (0x10000000) +#define MPI_IOCPAGE2_CAP_FLAGS_SES_SUPPORT (0x20000000) +#define MPI_IOCPAGE2_CAP_FLAGS_SAFTE_SUPPORT (0x40000000) +#define MPI_IOCPAGE2_CAP_FLAGS_CROSS_CHANNEL_SUPPORT (0x80000000) + + +typedef struct _IOC_3_PHYS_DISK +{ + U8 PhysDiskID; /* 00h */ + U8 PhysDiskBus; /* 01h */ + U8 PhysDiskIOC; /* 02h */ + U8 PhysDiskNum; /* 03h */ +} IOC_3_PHYS_DISK, MPI_POINTER PTR_IOC_3_PHYS_DISK, + Ioc3PhysDisk_t, MPI_POINTER pIoc3PhysDisk_t; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_IOC_PAGE_3_PHYSDISK_MAX +#define MPI_IOC_PAGE_3_PHYSDISK_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_IOC_3 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 NumPhysDisks; /* 04h */ + U8 Reserved1; /* 05h */ + U16 Reserved2; /* 06h */ + IOC_3_PHYS_DISK PhysDisk[MPI_IOC_PAGE_3_PHYSDISK_MAX]; /* 08h */ +} CONFIG_PAGE_IOC_3, MPI_POINTER PTR_CONFIG_PAGE_IOC_3, + IOCPage3_t, MPI_POINTER pIOCPage3_t; + +#define MPI_IOCPAGE3_PAGEVERSION (0x00) + + +typedef struct _IOC_4_SEP +{ + U8 SEPTargetID; /* 00h */ + U8 SEPBus; /* 01h */ + U16 Reserved; /* 02h */ +} IOC_4_SEP, MPI_POINTER PTR_IOC_4_SEP, + Ioc4Sep_t, MPI_POINTER pIoc4Sep_t; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_IOC_PAGE_4_SEP_MAX +#define MPI_IOC_PAGE_4_SEP_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_IOC_4 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 ActiveSEP; /* 04h */ + U8 MaxSEP; /* 05h */ + U16 Reserved1; /* 06h */ + IOC_4_SEP SEP[MPI_IOC_PAGE_4_SEP_MAX]; /* 08h */ +} CONFIG_PAGE_IOC_4, MPI_POINTER PTR_CONFIG_PAGE_IOC_4, + IOCPage4_t, MPI_POINTER pIOCPage4_t; + +#define MPI_IOCPAGE4_PAGEVERSION (0x00) + + +typedef struct _IOC_5_HOT_SPARE +{ + U8 PhysDiskNum; /* 00h */ + U8 Reserved; /* 01h */ + U8 HotSparePool; /* 02h */ + U8 Flags; /* 03h */ +} IOC_5_HOT_SPARE, MPI_POINTER PTR_IOC_5_HOT_SPARE, + Ioc5HotSpare_t, MPI_POINTER pIoc5HotSpare_t; + +/* IOC Page 5 HotSpare Flags */ +#define MPI_IOC_PAGE_5_HOT_SPARE_ACTIVE (0x01) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_IOC_PAGE_5_HOT_SPARE_MAX +#define MPI_IOC_PAGE_5_HOT_SPARE_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_IOC_5 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 04h */ + U8 NumHotSpares; /* 08h */ + U8 Reserved2; /* 09h */ + U16 Reserved3; /* 0Ah */ + IOC_5_HOT_SPARE HotSpare[MPI_IOC_PAGE_5_HOT_SPARE_MAX]; /* 0Ch */ +} CONFIG_PAGE_IOC_5, MPI_POINTER PTR_CONFIG_PAGE_IOC_5, + IOCPage5_t, MPI_POINTER pIOCPage5_t; + +#define MPI_IOCPAGE5_PAGEVERSION (0x00) + +typedef struct _CONFIG_PAGE_IOC_6 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 CapabilitiesFlags; /* 04h */ + U8 MaxDrivesIS; /* 08h */ + U8 MaxDrivesIM; /* 09h */ + U8 MaxDrivesIME; /* 0Ah */ + U8 Reserved1; /* 0Bh */ + U8 MinDrivesIS; /* 0Ch */ + U8 MinDrivesIM; /* 0Dh */ + U8 MinDrivesIME; /* 0Eh */ + U8 Reserved2; /* 0Fh */ + U8 MaxGlobalHotSpares; /* 10h */ + U8 Reserved3; /* 11h */ + U16 Reserved4; /* 12h */ + U32 Reserved5; /* 14h */ + U32 SupportedStripeSizeMapIS; /* 18h */ + U32 SupportedStripeSizeMapIME; /* 1Ch */ + U32 Reserved6; /* 20h */ + U8 MetadataSize; /* 24h */ + U8 Reserved7; /* 25h */ + U16 Reserved8; /* 26h */ + U16 MaxBadBlockTableEntries; /* 28h */ + U16 Reserved9; /* 2Ah */ + U16 IRNvsramUsage; /* 2Ch */ + U16 Reserved10; /* 2Eh */ + U32 IRNvsramVersion; /* 30h */ + U32 Reserved11; /* 34h */ + U32 Reserved12; /* 38h */ +} CONFIG_PAGE_IOC_6, MPI_POINTER PTR_CONFIG_PAGE_IOC_6, + IOCPage6_t, MPI_POINTER pIOCPage6_t; + +#define MPI_IOCPAGE6_PAGEVERSION (0x01) + +/* IOC Page 6 Capabilities Flags */ + +#define MPI_IOCPAGE6_CAP_FLAGS_SSD_SUPPORT (0x00000020) +#define MPI_IOCPAGE6_CAP_FLAGS_MULTIPORT_DRIVE_SUPPORT (0x00000010) +#define MPI_IOCPAGE6_CAP_FLAGS_DISABLE_SMART_POLLING (0x00000008) + +#define MPI_IOCPAGE6_CAP_FLAGS_MASK_METADATA_SIZE (0x00000006) +#define MPI_IOCPAGE6_CAP_FLAGS_64MB_METADATA_SIZE (0x00000000) +#define MPI_IOCPAGE6_CAP_FLAGS_512MB_METADATA_SIZE (0x00000002) + +#define MPI_IOCPAGE6_CAP_FLAGS_GLOBAL_HOT_SPARE (0x00000001) + + +/**************************************************************************** +* BIOS Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_BIOS_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 BiosOptions; /* 04h */ + U32 IOCSettings; /* 08h */ + U32 Reserved1; /* 0Ch */ + U32 DeviceSettings; /* 10h */ + U16 NumberOfDevices; /* 14h */ + U8 ExpanderSpinup; /* 16h */ + U8 Reserved2; /* 17h */ + U16 IOTimeoutBlockDevicesNonRM; /* 18h */ + U16 IOTimeoutSequential; /* 1Ah */ + U16 IOTimeoutOther; /* 1Ch */ + U16 IOTimeoutBlockDevicesRM; /* 1Eh */ +} CONFIG_PAGE_BIOS_1, MPI_POINTER PTR_CONFIG_PAGE_BIOS_1, + BIOSPage1_t, MPI_POINTER pBIOSPage1_t; + +#define MPI_BIOSPAGE1_PAGEVERSION (0x03) + +/* values for the BiosOptions field */ +#define MPI_BIOSPAGE1_OPTIONS_SPI_ENABLE (0x00000400) +#define MPI_BIOSPAGE1_OPTIONS_FC_ENABLE (0x00000200) +#define MPI_BIOSPAGE1_OPTIONS_SAS_ENABLE (0x00000100) + +#define MPI_BIOSPAGE1_OPTIONS_SCAN_HIGH_TO_LOW (0x00000002) +#define MPI_BIOSPAGE1_OPTIONS_SCAN_LOW_TO_HIGH (0x00000000) + +#define MPI_BIOSPAGE1_OPTIONS_DISABLE_BIOS (0x00000001) + +/* values for the IOCSettings field */ +#define MPI_BIOSPAGE1_IOCSET_MASK_INITIAL_SPINUP_DELAY (0x0F000000) +#define MPI_BIOSPAGE1_IOCSET_SHIFT_INITIAL_SPINUP_DELAY (24) + +#define MPI_BIOSPAGE1_IOCSET_MASK_PORT_ENABLE_DELAY (0x00F00000) +#define MPI_BIOSPAGE1_IOCSET_SHIFT_PORT_ENABLE_DELAY (20) + +#define MPI_BIOSPAGE1_IOCSET_AUTO_PORT_ENABLE (0x00080000) +#define MPI_BIOSPAGE1_IOCSET_DIRECT_ATTACH_SPINUP_MODE (0x00040000) + +#define MPI_BIOSPAGE1_IOCSET_MASK_BOOT_PREFERENCE (0x00030000) +#define MPI_BIOSPAGE1_IOCSET_ENCLOSURE_SLOT_BOOT (0x00000000) +#define MPI_BIOSPAGE1_IOCSET_SAS_ADDRESS_BOOT (0x00010000) + +#define MPI_BIOSPAGE1_IOCSET_MASK_MAX_TARGET_SPIN_UP (0x0000F000) +#define MPI_BIOSPAGE1_IOCSET_SHIFT_MAX_TARGET_SPIN_UP (12) + +#define MPI_BIOSPAGE1_IOCSET_MASK_SPINUP_DELAY (0x00000F00) +#define MPI_BIOSPAGE1_IOCSET_SHIFT_SPINUP_DELAY (8) + +#define MPI_BIOSPAGE1_IOCSET_MASK_RM_SETTING (0x000000C0) +#define MPI_BIOSPAGE1_IOCSET_NONE_RM_SETTING (0x00000000) +#define MPI_BIOSPAGE1_IOCSET_BOOT_RM_SETTING (0x00000040) +#define MPI_BIOSPAGE1_IOCSET_MEDIA_RM_SETTING (0x00000080) + +#define MPI_BIOSPAGE1_IOCSET_MASK_ADAPTER_SUPPORT (0x00000030) +#define MPI_BIOSPAGE1_IOCSET_NO_SUPPORT (0x00000000) +#define MPI_BIOSPAGE1_IOCSET_BIOS_SUPPORT (0x00000010) +#define MPI_BIOSPAGE1_IOCSET_OS_SUPPORT (0x00000020) +#define MPI_BIOSPAGE1_IOCSET_ALL_SUPPORT (0x00000030) + +#define MPI_BIOSPAGE1_IOCSET_ALTERNATE_CHS (0x00000008) + +/* values for the DeviceSettings field */ +#define MPI_BIOSPAGE1_DEVSET_DISABLE_SMART_POLLING (0x00000010) +#define MPI_BIOSPAGE1_DEVSET_DISABLE_SEQ_LUN (0x00000008) +#define MPI_BIOSPAGE1_DEVSET_DISABLE_RM_LUN (0x00000004) +#define MPI_BIOSPAGE1_DEVSET_DISABLE_NON_RM_LUN (0x00000002) +#define MPI_BIOSPAGE1_DEVSET_DISABLE_OTHER_LUN (0x00000001) + +/* defines for the ExpanderSpinup field */ +#define MPI_BIOSPAGE1_EXPSPINUP_MASK_MAX_TARGET (0xF0) +#define MPI_BIOSPAGE1_EXPSPINUP_SHIFT_MAX_TARGET (4) +#define MPI_BIOSPAGE1_EXPSPINUP_MASK_DELAY (0x0F) + +typedef struct _MPI_BOOT_DEVICE_ADAPTER_ORDER +{ + U32 Reserved1; /* 00h */ + U32 Reserved2; /* 04h */ + U32 Reserved3; /* 08h */ + U32 Reserved4; /* 0Ch */ + U32 Reserved5; /* 10h */ + U32 Reserved6; /* 14h */ + U32 Reserved7; /* 18h */ + U32 Reserved8; /* 1Ch */ + U32 Reserved9; /* 20h */ + U32 Reserved10; /* 24h */ + U32 Reserved11; /* 28h */ + U32 Reserved12; /* 2Ch */ + U32 Reserved13; /* 30h */ + U32 Reserved14; /* 34h */ + U32 Reserved15; /* 38h */ + U32 Reserved16; /* 3Ch */ + U32 Reserved17; /* 40h */ +} MPI_BOOT_DEVICE_ADAPTER_ORDER, MPI_POINTER PTR_MPI_BOOT_DEVICE_ADAPTER_ORDER; + +typedef struct _MPI_BOOT_DEVICE_ADAPTER_NUMBER +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 AdapterNumber; /* 02h */ + U8 Reserved1; /* 03h */ + U32 Reserved2; /* 04h */ + U32 Reserved3; /* 08h */ + U32 Reserved4; /* 0Ch */ + U8 LUN[8]; /* 10h */ + U32 Reserved5; /* 18h */ + U32 Reserved6; /* 1Ch */ + U32 Reserved7; /* 20h */ + U32 Reserved8; /* 24h */ + U32 Reserved9; /* 28h */ + U32 Reserved10; /* 2Ch */ + U32 Reserved11; /* 30h */ + U32 Reserved12; /* 34h */ + U32 Reserved13; /* 38h */ + U32 Reserved14; /* 3Ch */ + U32 Reserved15; /* 40h */ +} MPI_BOOT_DEVICE_ADAPTER_NUMBER, MPI_POINTER PTR_MPI_BOOT_DEVICE_ADAPTER_NUMBER; + +typedef struct _MPI_BOOT_DEVICE_PCI_ADDRESS +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U16 PCIAddress; /* 02h */ + U32 Reserved1; /* 04h */ + U32 Reserved2; /* 08h */ + U32 Reserved3; /* 0Ch */ + U8 LUN[8]; /* 10h */ + U32 Reserved4; /* 18h */ + U32 Reserved5; /* 1Ch */ + U32 Reserved6; /* 20h */ + U32 Reserved7; /* 24h */ + U32 Reserved8; /* 28h */ + U32 Reserved9; /* 2Ch */ + U32 Reserved10; /* 30h */ + U32 Reserved11; /* 34h */ + U32 Reserved12; /* 38h */ + U32 Reserved13; /* 3Ch */ + U32 Reserved14; /* 40h */ +} MPI_BOOT_DEVICE_PCI_ADDRESS, MPI_POINTER PTR_MPI_BOOT_DEVICE_PCI_ADDRESS; + +typedef struct _MPI_BOOT_DEVICE_SLOT_NUMBER +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 PCISlotNumber; /* 02h */ + U8 Reserved1; /* 03h */ + U32 Reserved2; /* 04h */ + U32 Reserved3; /* 08h */ + U32 Reserved4; /* 0Ch */ + U8 LUN[8]; /* 10h */ + U32 Reserved5; /* 18h */ + U32 Reserved6; /* 1Ch */ + U32 Reserved7; /* 20h */ + U32 Reserved8; /* 24h */ + U32 Reserved9; /* 28h */ + U32 Reserved10; /* 2Ch */ + U32 Reserved11; /* 30h */ + U32 Reserved12; /* 34h */ + U32 Reserved13; /* 38h */ + U32 Reserved14; /* 3Ch */ + U32 Reserved15; /* 40h */ +} MPI_BOOT_DEVICE_PCI_SLOT_NUMBER, MPI_POINTER PTR_MPI_BOOT_DEVICE_PCI_SLOT_NUMBER; + +typedef struct _MPI_BOOT_DEVICE_FC_WWN +{ + U64 WWPN; /* 00h */ + U32 Reserved1; /* 08h */ + U32 Reserved2; /* 0Ch */ + U8 LUN[8]; /* 10h */ + U32 Reserved3; /* 18h */ + U32 Reserved4; /* 1Ch */ + U32 Reserved5; /* 20h */ + U32 Reserved6; /* 24h */ + U32 Reserved7; /* 28h */ + U32 Reserved8; /* 2Ch */ + U32 Reserved9; /* 30h */ + U32 Reserved10; /* 34h */ + U32 Reserved11; /* 38h */ + U32 Reserved12; /* 3Ch */ + U32 Reserved13; /* 40h */ +} MPI_BOOT_DEVICE_FC_WWN, MPI_POINTER PTR_MPI_BOOT_DEVICE_FC_WWN; + +typedef struct _MPI_BOOT_DEVICE_SAS_WWN +{ + U64 SASAddress; /* 00h */ + U32 Reserved1; /* 08h */ + U32 Reserved2; /* 0Ch */ + U8 LUN[8]; /* 10h */ + U32 Reserved3; /* 18h */ + U32 Reserved4; /* 1Ch */ + U32 Reserved5; /* 20h */ + U32 Reserved6; /* 24h */ + U32 Reserved7; /* 28h */ + U32 Reserved8; /* 2Ch */ + U32 Reserved9; /* 30h */ + U32 Reserved10; /* 34h */ + U32 Reserved11; /* 38h */ + U32 Reserved12; /* 3Ch */ + U32 Reserved13; /* 40h */ +} MPI_BOOT_DEVICE_SAS_WWN, MPI_POINTER PTR_MPI_BOOT_DEVICE_SAS_WWN; + +typedef struct _MPI_BOOT_DEVICE_ENCLOSURE_SLOT +{ + U64 EnclosureLogicalID; /* 00h */ + U32 Reserved1; /* 08h */ + U32 Reserved2; /* 0Ch */ + U8 LUN[8]; /* 10h */ + U16 SlotNumber; /* 18h */ + U16 Reserved3; /* 1Ah */ + U32 Reserved4; /* 1Ch */ + U32 Reserved5; /* 20h */ + U32 Reserved6; /* 24h */ + U32 Reserved7; /* 28h */ + U32 Reserved8; /* 2Ch */ + U32 Reserved9; /* 30h */ + U32 Reserved10; /* 34h */ + U32 Reserved11; /* 38h */ + U32 Reserved12; /* 3Ch */ + U32 Reserved13; /* 40h */ +} MPI_BOOT_DEVICE_ENCLOSURE_SLOT, + MPI_POINTER PTR_MPI_BOOT_DEVICE_ENCLOSURE_SLOT; + +typedef union _MPI_BIOSPAGE2_BOOT_DEVICE +{ + MPI_BOOT_DEVICE_ADAPTER_ORDER AdapterOrder; + MPI_BOOT_DEVICE_ADAPTER_NUMBER AdapterNumber; + MPI_BOOT_DEVICE_PCI_ADDRESS PCIAddress; + MPI_BOOT_DEVICE_PCI_SLOT_NUMBER PCISlotNumber; + MPI_BOOT_DEVICE_FC_WWN FcWwn; + MPI_BOOT_DEVICE_SAS_WWN SasWwn; + MPI_BOOT_DEVICE_ENCLOSURE_SLOT EnclosureSlot; +} MPI_BIOSPAGE2_BOOT_DEVICE, MPI_POINTER PTR_MPI_BIOSPAGE2_BOOT_DEVICE; + +typedef struct _CONFIG_PAGE_BIOS_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 04h */ + U32 Reserved2; /* 08h */ + U32 Reserved3; /* 0Ch */ + U32 Reserved4; /* 10h */ + U32 Reserved5; /* 14h */ + U32 Reserved6; /* 18h */ + U8 BootDeviceForm; /* 1Ch */ + U8 PrevBootDeviceForm; /* 1Ch */ + U16 Reserved8; /* 1Eh */ + MPI_BIOSPAGE2_BOOT_DEVICE BootDevice; /* 20h */ +} CONFIG_PAGE_BIOS_2, MPI_POINTER PTR_CONFIG_PAGE_BIOS_2, + BIOSPage2_t, MPI_POINTER pBIOSPage2_t; + +#define MPI_BIOSPAGE2_PAGEVERSION (0x02) + +#define MPI_BIOSPAGE2_FORM_MASK (0x0F) +#define MPI_BIOSPAGE2_FORM_ADAPTER_ORDER (0x00) +#define MPI_BIOSPAGE2_FORM_ADAPTER_NUMBER (0x01) +#define MPI_BIOSPAGE2_FORM_PCI_ADDRESS (0x02) +#define MPI_BIOSPAGE2_FORM_PCI_SLOT_NUMBER (0x03) +#define MPI_BIOSPAGE2_FORM_FC_WWN (0x04) +#define MPI_BIOSPAGE2_FORM_SAS_WWN (0x05) +#define MPI_BIOSPAGE2_FORM_ENCLOSURE_SLOT (0x06) + +typedef struct _CONFIG_PAGE_BIOS_4 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U64 ReassignmentBaseWWID; /* 04h */ +} CONFIG_PAGE_BIOS_4, MPI_POINTER PTR_CONFIG_PAGE_BIOS_4, + BIOSPage4_t, MPI_POINTER pBIOSPage4_t; + +#define MPI_BIOSPAGE4_PAGEVERSION (0x00) + + +/**************************************************************************** +* SCSI Port Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_SCSI_PORT_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Capabilities; /* 04h */ + U32 PhysicalInterface; /* 08h */ +} CONFIG_PAGE_SCSI_PORT_0, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_0, + SCSIPortPage0_t, MPI_POINTER pSCSIPortPage0_t; + +#define MPI_SCSIPORTPAGE0_PAGEVERSION (0x02) + +#define MPI_SCSIPORTPAGE0_CAP_IU (0x00000001) +#define MPI_SCSIPORTPAGE0_CAP_DT (0x00000002) +#define MPI_SCSIPORTPAGE0_CAP_QAS (0x00000004) +#define MPI_SCSIPORTPAGE0_CAP_MIN_SYNC_PERIOD_MASK (0x0000FF00) +#define MPI_SCSIPORTPAGE0_SYNC_ASYNC (0x00) +#define MPI_SCSIPORTPAGE0_SYNC_5 (0x32) +#define MPI_SCSIPORTPAGE0_SYNC_10 (0x19) +#define MPI_SCSIPORTPAGE0_SYNC_20 (0x0C) +#define MPI_SCSIPORTPAGE0_SYNC_33_33 (0x0B) +#define MPI_SCSIPORTPAGE0_SYNC_40 (0x0A) +#define MPI_SCSIPORTPAGE0_SYNC_80 (0x09) +#define MPI_SCSIPORTPAGE0_SYNC_160 (0x08) +#define MPI_SCSIPORTPAGE0_SYNC_UNKNOWN (0xFF) + +#define MPI_SCSIPORTPAGE0_CAP_SHIFT_MIN_SYNC_PERIOD (8) +#define MPI_SCSIPORTPAGE0_CAP_GET_MIN_SYNC_PERIOD(Cap) \ + ( ((Cap) & MPI_SCSIPORTPAGE0_CAP_MIN_SYNC_PERIOD_MASK) \ + >> MPI_SCSIPORTPAGE0_CAP_SHIFT_MIN_SYNC_PERIOD \ + ) +#define MPI_SCSIPORTPAGE0_CAP_MAX_SYNC_OFFSET_MASK (0x00FF0000) +#define MPI_SCSIPORTPAGE0_CAP_SHIFT_MAX_SYNC_OFFSET (16) +#define MPI_SCSIPORTPAGE0_CAP_GET_MAX_SYNC_OFFSET(Cap) \ + ( ((Cap) & MPI_SCSIPORTPAGE0_CAP_MAX_SYNC_OFFSET_MASK) \ + >> MPI_SCSIPORTPAGE0_CAP_SHIFT_MAX_SYNC_OFFSET \ + ) +#define MPI_SCSIPORTPAGE0_CAP_IDP (0x08000000) +#define MPI_SCSIPORTPAGE0_CAP_WIDE (0x20000000) +#define MPI_SCSIPORTPAGE0_CAP_AIP (0x80000000) + +#define MPI_SCSIPORTPAGE0_PHY_SIGNAL_TYPE_MASK (0x00000003) +#define MPI_SCSIPORTPAGE0_PHY_SIGNAL_HVD (0x01) +#define MPI_SCSIPORTPAGE0_PHY_SIGNAL_SE (0x02) +#define MPI_SCSIPORTPAGE0_PHY_SIGNAL_LVD (0x03) +#define MPI_SCSIPORTPAGE0_PHY_MASK_CONNECTED_ID (0xFF000000) +#define MPI_SCSIPORTPAGE0_PHY_SHIFT_CONNECTED_ID (24) +#define MPI_SCSIPORTPAGE0_PHY_BUS_FREE_CONNECTED_ID (0xFE) +#define MPI_SCSIPORTPAGE0_PHY_UNKNOWN_CONNECTED_ID (0xFF) + + +typedef struct _CONFIG_PAGE_SCSI_PORT_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Configuration; /* 04h */ + U32 OnBusTimerValue; /* 08h */ + U8 TargetConfig; /* 0Ch */ + U8 Reserved1; /* 0Dh */ + U16 IDConfig; /* 0Eh */ +} CONFIG_PAGE_SCSI_PORT_1, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_1, + SCSIPortPage1_t, MPI_POINTER pSCSIPortPage1_t; + +#define MPI_SCSIPORTPAGE1_PAGEVERSION (0x03) + +/* Configuration values */ +#define MPI_SCSIPORTPAGE1_CFG_PORT_SCSI_ID_MASK (0x000000FF) +#define MPI_SCSIPORTPAGE1_CFG_PORT_RESPONSE_ID_MASK (0xFFFF0000) +#define MPI_SCSIPORTPAGE1_CFG_SHIFT_PORT_RESPONSE_ID (16) + +/* TargetConfig values */ +#define MPI_SCSIPORTPAGE1_TARGCONFIG_TARG_ONLY (0x01) +#define MPI_SCSIPORTPAGE1_TARGCONFIG_INIT_TARG (0x02) + + +typedef struct _MPI_DEVICE_INFO +{ + U8 Timeout; /* 00h */ + U8 SyncFactor; /* 01h */ + U16 DeviceFlags; /* 02h */ +} MPI_DEVICE_INFO, MPI_POINTER PTR_MPI_DEVICE_INFO, + MpiDeviceInfo_t, MPI_POINTER pMpiDeviceInfo_t; + +typedef struct _CONFIG_PAGE_SCSI_PORT_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 PortFlags; /* 04h */ + U32 PortSettings; /* 08h */ + MPI_DEVICE_INFO DeviceSettings[16]; /* 0Ch */ +} CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_PORT_2, + SCSIPortPage2_t, MPI_POINTER pSCSIPortPage2_t; + +#define MPI_SCSIPORTPAGE2_PAGEVERSION (0x02) + +/* PortFlags values */ +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_SCAN_HIGH_TO_LOW (0x00000001) +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET (0x00000004) +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_ALTERNATE_CHS (0x00000008) +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_TERMINATION_DISABLE (0x00000010) + +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_DV_MASK (0x00000060) +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_FULL_DV (0x00000000) +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_BASIC_DV_ONLY (0x00000020) +#define MPI_SCSIPORTPAGE2_PORT_FLAGS_OFF_DV (0x00000060) + + +/* PortSettings values */ +#define MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK (0x0000000F) +#define MPI_SCSIPORTPAGE2_PORT_MASK_INIT_HBA (0x00000030) +#define MPI_SCSIPORTPAGE2_PORT_DISABLE_INIT_HBA (0x00000000) +#define MPI_SCSIPORTPAGE2_PORT_BIOS_INIT_HBA (0x00000010) +#define MPI_SCSIPORTPAGE2_PORT_OS_INIT_HBA (0x00000020) +#define MPI_SCSIPORTPAGE2_PORT_BIOS_OS_INIT_HBA (0x00000030) +#define MPI_SCSIPORTPAGE2_PORT_REMOVABLE_MEDIA (0x000000C0) +#define MPI_SCSIPORTPAGE2_PORT_RM_NONE (0x00000000) +#define MPI_SCSIPORTPAGE2_PORT_RM_BOOT_ONLY (0x00000040) +#define MPI_SCSIPORTPAGE2_PORT_RM_WITH_MEDIA (0x00000080) +#define MPI_SCSIPORTPAGE2_PORT_SPINUP_DELAY_MASK (0x00000F00) +#define MPI_SCSIPORTPAGE2_PORT_SHIFT_SPINUP_DELAY (8) +#define MPI_SCSIPORTPAGE2_PORT_MASK_NEGO_MASTER_SETTINGS (0x00003000) +#define MPI_SCSIPORTPAGE2_PORT_NEGO_MASTER_SETTINGS (0x00000000) +#define MPI_SCSIPORTPAGE2_PORT_NONE_MASTER_SETTINGS (0x00001000) +#define MPI_SCSIPORTPAGE2_PORT_ALL_MASTER_SETTINGS (0x00003000) + +#define MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE (0x0001) +#define MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE (0x0002) +#define MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE (0x0004) +#define MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE (0x0008) +#define MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE (0x0010) +#define MPI_SCSIPORTPAGE2_DEVICE_BOOT_CHOICE (0x0020) + + +/**************************************************************************** +* SCSI Target Device Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_SCSI_DEVICE_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 NegotiatedParameters; /* 04h */ + U32 Information; /* 08h */ +} CONFIG_PAGE_SCSI_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_0, + SCSIDevicePage0_t, MPI_POINTER pSCSIDevicePage0_t; + +#define MPI_SCSIDEVPAGE0_PAGEVERSION (0x04) + +#define MPI_SCSIDEVPAGE0_NP_IU (0x00000001) +#define MPI_SCSIDEVPAGE0_NP_DT (0x00000002) +#define MPI_SCSIDEVPAGE0_NP_QAS (0x00000004) +#define MPI_SCSIDEVPAGE0_NP_HOLD_MCS (0x00000008) +#define MPI_SCSIDEVPAGE0_NP_WR_FLOW (0x00000010) +#define MPI_SCSIDEVPAGE0_NP_RD_STRM (0x00000020) +#define MPI_SCSIDEVPAGE0_NP_RTI (0x00000040) +#define MPI_SCSIDEVPAGE0_NP_PCOMP_EN (0x00000080) +#define MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK (0x0000FF00) +#define MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_PERIOD (8) +#define MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK (0x00FF0000) +#define MPI_SCSIDEVPAGE0_NP_SHIFT_SYNC_OFFSET (16) +#define MPI_SCSIDEVPAGE0_NP_IDP (0x08000000) +#define MPI_SCSIDEVPAGE0_NP_WIDE (0x20000000) +#define MPI_SCSIDEVPAGE0_NP_AIP (0x80000000) + +#define MPI_SCSIDEVPAGE0_INFO_PARAMS_NEGOTIATED (0x00000001) +#define MPI_SCSIDEVPAGE0_INFO_SDTR_REJECTED (0x00000002) +#define MPI_SCSIDEVPAGE0_INFO_WDTR_REJECTED (0x00000004) +#define MPI_SCSIDEVPAGE0_INFO_PPR_REJECTED (0x00000008) + + +typedef struct _CONFIG_PAGE_SCSI_DEVICE_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 RequestedParameters; /* 04h */ + U32 Reserved; /* 08h */ + U32 Configuration; /* 0Ch */ +} CONFIG_PAGE_SCSI_DEVICE_1, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_1, + SCSIDevicePage1_t, MPI_POINTER pSCSIDevicePage1_t; + +#define MPI_SCSIDEVPAGE1_PAGEVERSION (0x05) + +#define MPI_SCSIDEVPAGE1_RP_IU (0x00000001) +#define MPI_SCSIDEVPAGE1_RP_DT (0x00000002) +#define MPI_SCSIDEVPAGE1_RP_QAS (0x00000004) +#define MPI_SCSIDEVPAGE1_RP_HOLD_MCS (0x00000008) +#define MPI_SCSIDEVPAGE1_RP_WR_FLOW (0x00000010) +#define MPI_SCSIDEVPAGE1_RP_RD_STRM (0x00000020) +#define MPI_SCSIDEVPAGE1_RP_RTI (0x00000040) +#define MPI_SCSIDEVPAGE1_RP_PCOMP_EN (0x00000080) +#define MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK (0x0000FF00) +#define MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD (8) +#define MPI_SCSIDEVPAGE1_RP_MAX_SYNC_OFFSET_MASK (0x00FF0000) +#define MPI_SCSIDEVPAGE1_RP_SHIFT_MAX_SYNC_OFFSET (16) +#define MPI_SCSIDEVPAGE1_RP_IDP (0x08000000) +#define MPI_SCSIDEVPAGE1_RP_WIDE (0x20000000) +#define MPI_SCSIDEVPAGE1_RP_AIP (0x80000000) + +#define MPI_SCSIDEVPAGE1_CONF_WDTR_DISALLOWED (0x00000002) +#define MPI_SCSIDEVPAGE1_CONF_SDTR_DISALLOWED (0x00000004) +#define MPI_SCSIDEVPAGE1_CONF_EXTENDED_PARAMS_ENABLE (0x00000008) +#define MPI_SCSIDEVPAGE1_CONF_FORCE_PPR_MSG (0x00000010) + + +typedef struct _CONFIG_PAGE_SCSI_DEVICE_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 DomainValidation; /* 04h */ + U32 ParityPipeSelect; /* 08h */ + U32 DataPipeSelect; /* 0Ch */ +} CONFIG_PAGE_SCSI_DEVICE_2, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_2, + SCSIDevicePage2_t, MPI_POINTER pSCSIDevicePage2_t; + +#define MPI_SCSIDEVPAGE2_PAGEVERSION (0x01) + +#define MPI_SCSIDEVPAGE2_DV_ISI_ENABLE (0x00000010) +#define MPI_SCSIDEVPAGE2_DV_SECONDARY_DRIVER_ENABLE (0x00000020) +#define MPI_SCSIDEVPAGE2_DV_SLEW_RATE_CTRL (0x00000380) +#define MPI_SCSIDEVPAGE2_DV_PRIM_DRIVE_STR_CTRL (0x00001C00) +#define MPI_SCSIDEVPAGE2_DV_SECOND_DRIVE_STR_CTRL (0x0000E000) +#define MPI_SCSIDEVPAGE2_DV_XCLKH_ST (0x10000000) +#define MPI_SCSIDEVPAGE2_DV_XCLKS_ST (0x20000000) +#define MPI_SCSIDEVPAGE2_DV_XCLKH_DT (0x40000000) +#define MPI_SCSIDEVPAGE2_DV_XCLKS_DT (0x80000000) + +#define MPI_SCSIDEVPAGE2_PPS_PPS_MASK (0x00000003) + +#define MPI_SCSIDEVPAGE2_DPS_BIT_0_PL_SELECT_MASK (0x00000003) +#define MPI_SCSIDEVPAGE2_DPS_BIT_1_PL_SELECT_MASK (0x0000000C) +#define MPI_SCSIDEVPAGE2_DPS_BIT_2_PL_SELECT_MASK (0x00000030) +#define MPI_SCSIDEVPAGE2_DPS_BIT_3_PL_SELECT_MASK (0x000000C0) +#define MPI_SCSIDEVPAGE2_DPS_BIT_4_PL_SELECT_MASK (0x00000300) +#define MPI_SCSIDEVPAGE2_DPS_BIT_5_PL_SELECT_MASK (0x00000C00) +#define MPI_SCSIDEVPAGE2_DPS_BIT_6_PL_SELECT_MASK (0x00003000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_7_PL_SELECT_MASK (0x0000C000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_8_PL_SELECT_MASK (0x00030000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_9_PL_SELECT_MASK (0x000C0000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_10_PL_SELECT_MASK (0x00300000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_11_PL_SELECT_MASK (0x00C00000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_12_PL_SELECT_MASK (0x03000000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_13_PL_SELECT_MASK (0x0C000000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_14_PL_SELECT_MASK (0x30000000) +#define MPI_SCSIDEVPAGE2_DPS_BIT_15_PL_SELECT_MASK (0xC0000000) + + +typedef struct _CONFIG_PAGE_SCSI_DEVICE_3 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U16 MsgRejectCount; /* 04h */ + U16 PhaseErrorCount; /* 06h */ + U16 ParityErrorCount; /* 08h */ + U16 Reserved; /* 0Ah */ +} CONFIG_PAGE_SCSI_DEVICE_3, MPI_POINTER PTR_CONFIG_PAGE_SCSI_DEVICE_3, + SCSIDevicePage3_t, MPI_POINTER pSCSIDevicePage3_t; + +#define MPI_SCSIDEVPAGE3_PAGEVERSION (0x00) + +#define MPI_SCSIDEVPAGE3_MAX_COUNTER (0xFFFE) +#define MPI_SCSIDEVPAGE3_UNSUPPORTED_COUNTER (0xFFFF) + + +/**************************************************************************** +* FC Port Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_FC_PORT_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Flags; /* 04h */ + U8 MPIPortNumber; /* 08h */ + U8 LinkType; /* 09h */ + U8 PortState; /* 0Ah */ + U8 Reserved; /* 0Bh */ + U32 PortIdentifier; /* 0Ch */ + U64 WWNN; /* 10h */ + U64 WWPN; /* 18h */ + U32 SupportedServiceClass; /* 20h */ + U32 SupportedSpeeds; /* 24h */ + U32 CurrentSpeed; /* 28h */ + U32 MaxFrameSize; /* 2Ch */ + U64 FabricWWNN; /* 30h */ + U64 FabricWWPN; /* 38h */ + U32 DiscoveredPortsCount; /* 40h */ + U32 MaxInitiators; /* 44h */ + U8 MaxAliasesSupported; /* 48h */ + U8 MaxHardAliasesSupported; /* 49h */ + U8 NumCurrentAliases; /* 4Ah */ + U8 Reserved1; /* 4Bh */ +} CONFIG_PAGE_FC_PORT_0, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_0, + FCPortPage0_t, MPI_POINTER pFCPortPage0_t; + +#define MPI_FCPORTPAGE0_PAGEVERSION (0x02) + +#define MPI_FCPORTPAGE0_FLAGS_PROT_MASK (0x0000000F) +#define MPI_FCPORTPAGE0_FLAGS_PROT_FCP_INIT (MPI_PORTFACTS_PROTOCOL_INITIATOR) +#define MPI_FCPORTPAGE0_FLAGS_PROT_FCP_TARG (MPI_PORTFACTS_PROTOCOL_TARGET) +#define MPI_FCPORTPAGE0_FLAGS_PROT_LAN (MPI_PORTFACTS_PROTOCOL_LAN) +#define MPI_FCPORTPAGE0_FLAGS_PROT_LOGBUSADDR (MPI_PORTFACTS_PROTOCOL_LOGBUSADDR) + +#define MPI_FCPORTPAGE0_FLAGS_ALIAS_ALPA_SUPPORTED (0x00000010) +#define MPI_FCPORTPAGE0_FLAGS_ALIAS_WWN_SUPPORTED (0x00000020) +#define MPI_FCPORTPAGE0_FLAGS_FABRIC_WWN_VALID (0x00000040) + +#define MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK (0x00000F00) +#define MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT (0x00000000) +#define MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT (0x00000100) +#define MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP (0x00000200) +#define MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT (0x00000400) +#define MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP (0x00000800) + +#define MPI_FCPORTPAGE0_LTYPE_RESERVED (0x00) +#define MPI_FCPORTPAGE0_LTYPE_OTHER (0x01) +#define MPI_FCPORTPAGE0_LTYPE_UNKNOWN (0x02) +#define MPI_FCPORTPAGE0_LTYPE_COPPER (0x03) +#define MPI_FCPORTPAGE0_LTYPE_SINGLE_1300 (0x04) +#define MPI_FCPORTPAGE0_LTYPE_SINGLE_1500 (0x05) +#define MPI_FCPORTPAGE0_LTYPE_50_LASER_MULTI (0x06) +#define MPI_FCPORTPAGE0_LTYPE_50_LED_MULTI (0x07) +#define MPI_FCPORTPAGE0_LTYPE_62_LASER_MULTI (0x08) +#define MPI_FCPORTPAGE0_LTYPE_62_LED_MULTI (0x09) +#define MPI_FCPORTPAGE0_LTYPE_MULTI_LONG_WAVE (0x0A) +#define MPI_FCPORTPAGE0_LTYPE_MULTI_SHORT_WAVE (0x0B) +#define MPI_FCPORTPAGE0_LTYPE_LASER_SHORT_WAVE (0x0C) +#define MPI_FCPORTPAGE0_LTYPE_LED_SHORT_WAVE (0x0D) +#define MPI_FCPORTPAGE0_LTYPE_1300_LONG_WAVE (0x0E) +#define MPI_FCPORTPAGE0_LTYPE_1500_LONG_WAVE (0x0F) + +#define MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN (0x01) /*(SNIA)HBA_PORTSTATE_UNKNOWN 1 Unknown */ +#define MPI_FCPORTPAGE0_PORTSTATE_ONLINE (0x02) /*(SNIA)HBA_PORTSTATE_ONLINE 2 Operational */ +#define MPI_FCPORTPAGE0_PORTSTATE_OFFLINE (0x03) /*(SNIA)HBA_PORTSTATE_OFFLINE 3 User Offline */ +#define MPI_FCPORTPAGE0_PORTSTATE_BYPASSED (0x04) /*(SNIA)HBA_PORTSTATE_BYPASSED 4 Bypassed */ +#define MPI_FCPORTPAGE0_PORTSTATE_DIAGNOST (0x05) /*(SNIA)HBA_PORTSTATE_DIAGNOSTICS 5 In diagnostics mode */ +#define MPI_FCPORTPAGE0_PORTSTATE_LINKDOWN (0x06) /*(SNIA)HBA_PORTSTATE_LINKDOWN 6 Link Down */ +#define MPI_FCPORTPAGE0_PORTSTATE_ERROR (0x07) /*(SNIA)HBA_PORTSTATE_ERROR 7 Port Error */ +#define MPI_FCPORTPAGE0_PORTSTATE_LOOPBACK (0x08) /*(SNIA)HBA_PORTSTATE_LOOPBACK 8 Loopback */ + +#define MPI_FCPORTPAGE0_SUPPORT_CLASS_1 (0x00000001) +#define MPI_FCPORTPAGE0_SUPPORT_CLASS_2 (0x00000002) +#define MPI_FCPORTPAGE0_SUPPORT_CLASS_3 (0x00000004) + +#define MPI_FCPORTPAGE0_SUPPORT_SPEED_UKNOWN (0x00000000) /* (SNIA)HBA_PORTSPEED_UNKNOWN 0 Unknown - transceiver incapable of reporting */ +#define MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED (0x00000001) /* (SNIA)HBA_PORTSPEED_1GBIT 1 1 GBit/sec */ +#define MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED (0x00000002) /* (SNIA)HBA_PORTSPEED_2GBIT 2 2 GBit/sec */ +#define MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED (0x00000004) /* (SNIA)HBA_PORTSPEED_10GBIT 4 10 GBit/sec */ +#define MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED (0x00000008) /* (SNIA)HBA_PORTSPEED_4GBIT 8 4 GBit/sec */ + +#define MPI_FCPORTPAGE0_CURRENT_SPEED_UKNOWN MPI_FCPORTPAGE0_SUPPORT_SPEED_UKNOWN +#define MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED +#define MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED +#define MPI_FCPORTPAGE0_CURRENT_SPEED_10GBIT MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED +#define MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED +#define MPI_FCPORTPAGE0_CURRENT_SPEED_NOT_NEGOTIATED (0x00008000) /* (SNIA)HBA_PORTSPEED_NOT_NEGOTIATED (1<<15) Speed not established */ + + +typedef struct _CONFIG_PAGE_FC_PORT_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Flags; /* 04h */ + U64 NoSEEPROMWWNN; /* 08h */ + U64 NoSEEPROMWWPN; /* 10h */ + U8 HardALPA; /* 18h */ + U8 LinkConfig; /* 19h */ + U8 TopologyConfig; /* 1Ah */ + U8 AltConnector; /* 1Bh */ + U8 NumRequestedAliases; /* 1Ch */ + U8 RR_TOV; /* 1Dh */ + U8 InitiatorDeviceTimeout; /* 1Eh */ + U8 InitiatorIoPendTimeout; /* 1Fh */ +} CONFIG_PAGE_FC_PORT_1, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_1, + FCPortPage1_t, MPI_POINTER pFCPortPage1_t; + +#define MPI_FCPORTPAGE1_PAGEVERSION (0x06) + +#define MPI_FCPORTPAGE1_FLAGS_EXT_FCP_STATUS_EN (0x08000000) +#define MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY (0x04000000) +#define MPI_FCPORTPAGE1_FLAGS_FORCE_USE_NOSEEPROM_WWNS (0x02000000) +#define MPI_FCPORTPAGE1_FLAGS_VERBOSE_RESCAN_EVENTS (0x01000000) +#define MPI_FCPORTPAGE1_FLAGS_TARGET_MODE_OXID (0x00800000) +#define MPI_FCPORTPAGE1_FLAGS_PORT_OFFLINE (0x00400000) +#define MPI_FCPORTPAGE1_FLAGS_SOFT_ALPA_FALLBACK (0x00200000) +#define MPI_FCPORTPAGE1_FLAGS_TARGET_LARGE_CDB_ENABLE (0x00000080) +#define MPI_FCPORTPAGE1_FLAGS_MASK_RR_TOV_UNITS (0x00000070) +#define MPI_FCPORTPAGE1_FLAGS_SUPPRESS_PROT_REG (0x00000008) +#define MPI_FCPORTPAGE1_FLAGS_PLOGI_ON_LOGO (0x00000004) +#define MPI_FCPORTPAGE1_FLAGS_MAINTAIN_LOGINS (0x00000002) +#define MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID (0x00000001) +#define MPI_FCPORTPAGE1_FLAGS_SORT_BY_WWN (0x00000000) + +#define MPI_FCPORTPAGE1_FLAGS_PROT_MASK (0xF0000000) +#define MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT (28) +#define MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT ((U32)MPI_PORTFACTS_PROTOCOL_INITIATOR << MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT) +#define MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG ((U32)MPI_PORTFACTS_PROTOCOL_TARGET << MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT) +#define MPI_FCPORTPAGE1_FLAGS_PROT_LAN ((U32)MPI_PORTFACTS_PROTOCOL_LAN << MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT) +#define MPI_FCPORTPAGE1_FLAGS_PROT_LOGBUSADDR ((U32)MPI_PORTFACTS_PROTOCOL_LOGBUSADDR << MPI_FCPORTPAGE1_FLAGS_PROT_SHIFT) + +#define MPI_FCPORTPAGE1_FLAGS_NONE_RR_TOV_UNITS (0x00000000) +#define MPI_FCPORTPAGE1_FLAGS_THOUSANDTH_RR_TOV_UNITS (0x00000010) +#define MPI_FCPORTPAGE1_FLAGS_TENTH_RR_TOV_UNITS (0x00000030) +#define MPI_FCPORTPAGE1_FLAGS_TEN_RR_TOV_UNITS (0x00000050) + +#define MPI_FCPORTPAGE1_HARD_ALPA_NOT_USED (0xFF) + +#define MPI_FCPORTPAGE1_LCONFIG_SPEED_MASK (0x0F) +#define MPI_FCPORTPAGE1_LCONFIG_SPEED_1GIG (0x00) +#define MPI_FCPORTPAGE1_LCONFIG_SPEED_2GIG (0x01) +#define MPI_FCPORTPAGE1_LCONFIG_SPEED_4GIG (0x02) +#define MPI_FCPORTPAGE1_LCONFIG_SPEED_10GIG (0x03) +#define MPI_FCPORTPAGE1_LCONFIG_SPEED_AUTO (0x0F) + +#define MPI_FCPORTPAGE1_TOPOLOGY_MASK (0x0F) +#define MPI_FCPORTPAGE1_TOPOLOGY_NLPORT (0x01) +#define MPI_FCPORTPAGE1_TOPOLOGY_NPORT (0x02) +#define MPI_FCPORTPAGE1_TOPOLOGY_AUTO (0x0F) + +#define MPI_FCPORTPAGE1_ALT_CONN_UNKNOWN (0x00) + +#define MPI_FCPORTPAGE1_INITIATOR_DEV_TIMEOUT_MASK (0x7F) +#define MPI_FCPORTPAGE1_INITIATOR_DEV_UNIT_16 (0x80) + + +typedef struct _CONFIG_PAGE_FC_PORT_2 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 NumberActive; /* 04h */ + U8 ALPA[127]; /* 05h */ +} CONFIG_PAGE_FC_PORT_2, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_2, + FCPortPage2_t, MPI_POINTER pFCPortPage2_t; + +#define MPI_FCPORTPAGE2_PAGEVERSION (0x01) + + +typedef struct _WWN_FORMAT +{ + U64 WWNN; /* 00h */ + U64 WWPN; /* 08h */ +} WWN_FORMAT, MPI_POINTER PTR_WWN_FORMAT, + WWNFormat, MPI_POINTER pWWNFormat; + +typedef union _FC_PORT_PERSISTENT_PHYSICAL_ID +{ + WWN_FORMAT WWN; + U32 Did; +} FC_PORT_PERSISTENT_PHYSICAL_ID, MPI_POINTER PTR_FC_PORT_PERSISTENT_PHYSICAL_ID, + PersistentPhysicalId_t, MPI_POINTER pPersistentPhysicalId_t; + +typedef struct _FC_PORT_PERSISTENT +{ + FC_PORT_PERSISTENT_PHYSICAL_ID PhysicalIdentifier; /* 00h */ + U8 TargetID; /* 10h */ + U8 Bus; /* 11h */ + U16 Flags; /* 12h */ +} FC_PORT_PERSISTENT, MPI_POINTER PTR_FC_PORT_PERSISTENT, + PersistentData_t, MPI_POINTER pPersistentData_t; + +#define MPI_PERSISTENT_FLAGS_SHIFT (16) +#define MPI_PERSISTENT_FLAGS_ENTRY_VALID (0x0001) +#define MPI_PERSISTENT_FLAGS_SCAN_ID (0x0002) +#define MPI_PERSISTENT_FLAGS_SCAN_LUNS (0x0004) +#define MPI_PERSISTENT_FLAGS_BOOT_DEVICE (0x0008) +#define MPI_PERSISTENT_FLAGS_BY_DID (0x0080) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_FC_PORT_PAGE_3_ENTRY_MAX +#define MPI_FC_PORT_PAGE_3_ENTRY_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_FC_PORT_3 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + FC_PORT_PERSISTENT Entry[MPI_FC_PORT_PAGE_3_ENTRY_MAX]; /* 04h */ +} CONFIG_PAGE_FC_PORT_3, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_3, + FCPortPage3_t, MPI_POINTER pFCPortPage3_t; + +#define MPI_FCPORTPAGE3_PAGEVERSION (0x01) + + +typedef struct _CONFIG_PAGE_FC_PORT_4 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 PortFlags; /* 04h */ + U32 PortSettings; /* 08h */ +} CONFIG_PAGE_FC_PORT_4, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_4, + FCPortPage4_t, MPI_POINTER pFCPortPage4_t; + +#define MPI_FCPORTPAGE4_PAGEVERSION (0x00) + +#define MPI_FCPORTPAGE4_PORT_FLAGS_ALTERNATE_CHS (0x00000008) + +#define MPI_FCPORTPAGE4_PORT_MASK_INIT_HBA (0x00000030) +#define MPI_FCPORTPAGE4_PORT_DISABLE_INIT_HBA (0x00000000) +#define MPI_FCPORTPAGE4_PORT_BIOS_INIT_HBA (0x00000010) +#define MPI_FCPORTPAGE4_PORT_OS_INIT_HBA (0x00000020) +#define MPI_FCPORTPAGE4_PORT_BIOS_OS_INIT_HBA (0x00000030) +#define MPI_FCPORTPAGE4_PORT_REMOVABLE_MEDIA (0x000000C0) +#define MPI_FCPORTPAGE4_PORT_SPINUP_DELAY_MASK (0x00000F00) + + +typedef struct _CONFIG_PAGE_FC_PORT_5_ALIAS_INFO +{ + U8 Flags; /* 00h */ + U8 AliasAlpa; /* 01h */ + U16 DomainArea; /* 02h */ + U64 AliasWWNN; /* 04h */ + U64 AliasWWPN; /* 0Ch */ +} CONFIG_PAGE_FC_PORT_5_ALIAS_INFO, + MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_5_ALIAS_INFO, + FcPortPage5AliasInfo_t, MPI_POINTER pFcPortPage5AliasInfo_t; + +typedef struct _CONFIG_PAGE_FC_PORT_5 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + CONFIG_PAGE_FC_PORT_5_ALIAS_INFO AliasInfo; /* 04h */ +} CONFIG_PAGE_FC_PORT_5, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_5, + FCPortPage5_t, MPI_POINTER pFCPortPage5_t; + +#define MPI_FCPORTPAGE5_PAGEVERSION (0x02) + +#define MPI_FCPORTPAGE5_FLAGS_ALPA_ACQUIRED (0x01) +#define MPI_FCPORTPAGE5_FLAGS_HARD_ALPA (0x02) +#define MPI_FCPORTPAGE5_FLAGS_HARD_WWNN (0x04) +#define MPI_FCPORTPAGE5_FLAGS_HARD_WWPN (0x08) +#define MPI_FCPORTPAGE5_FLAGS_DISABLE (0x10) + +typedef struct _CONFIG_PAGE_FC_PORT_6 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved; /* 04h */ + U64 TimeSinceReset; /* 08h */ + U64 TxFrames; /* 10h */ + U64 RxFrames; /* 18h */ + U64 TxWords; /* 20h */ + U64 RxWords; /* 28h */ + U64 LipCount; /* 30h */ + U64 NosCount; /* 38h */ + U64 ErrorFrames; /* 40h */ + U64 DumpedFrames; /* 48h */ + U64 LinkFailureCount; /* 50h */ + U64 LossOfSyncCount; /* 58h */ + U64 LossOfSignalCount; /* 60h */ + U64 PrimativeSeqErrCount; /* 68h */ + U64 InvalidTxWordCount; /* 70h */ + U64 InvalidCrcCount; /* 78h */ + U64 FcpInitiatorIoCount; /* 80h */ +} CONFIG_PAGE_FC_PORT_6, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_6, + FCPortPage6_t, MPI_POINTER pFCPortPage6_t; + +#define MPI_FCPORTPAGE6_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_FC_PORT_7 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved; /* 04h */ + U8 PortSymbolicName[256]; /* 08h */ +} CONFIG_PAGE_FC_PORT_7, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_7, + FCPortPage7_t, MPI_POINTER pFCPortPage7_t; + +#define MPI_FCPORTPAGE7_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_FC_PORT_8 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 BitVector[8]; /* 04h */ +} CONFIG_PAGE_FC_PORT_8, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_8, + FCPortPage8_t, MPI_POINTER pFCPortPage8_t; + +#define MPI_FCPORTPAGE8_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_FC_PORT_9 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U32 Reserved; /* 04h */ + U64 GlobalWWPN; /* 08h */ + U64 GlobalWWNN; /* 10h */ + U32 UnitType; /* 18h */ + U32 PhysicalPortNumber; /* 1Ch */ + U32 NumAttachedNodes; /* 20h */ + U16 IPVersion; /* 24h */ + U16 UDPPortNumber; /* 26h */ + U8 IPAddress[16]; /* 28h */ + U16 Reserved1; /* 38h */ + U16 TopologyDiscoveryFlags; /* 3Ah */ +} CONFIG_PAGE_FC_PORT_9, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_9, + FCPortPage9_t, MPI_POINTER pFCPortPage9_t; + +#define MPI_FCPORTPAGE9_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA +{ + U8 Id; /* 10h */ + U8 ExtId; /* 11h */ + U8 Connector; /* 12h */ + U8 Transceiver[8]; /* 13h */ + U8 Encoding; /* 1Bh */ + U8 BitRate_100mbs; /* 1Ch */ + U8 Reserved1; /* 1Dh */ + U8 Length9u_km; /* 1Eh */ + U8 Length9u_100m; /* 1Fh */ + U8 Length50u_10m; /* 20h */ + U8 Length62p5u_10m; /* 21h */ + U8 LengthCopper_m; /* 22h */ + U8 Reseverved2; /* 22h */ + U8 VendorName[16]; /* 24h */ + U8 Reserved3; /* 34h */ + U8 VendorOUI[3]; /* 35h */ + U8 VendorPN[16]; /* 38h */ + U8 VendorRev[4]; /* 48h */ + U16 Wavelength; /* 4Ch */ + U8 Reserved4; /* 4Eh */ + U8 CC_BASE; /* 4Fh */ +} CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA, + MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA, + FCPortPage10BaseSfpData_t, MPI_POINTER pFCPortPage10BaseSfpData_t; + +#define MPI_FCPORT10_BASE_ID_UNKNOWN (0x00) +#define MPI_FCPORT10_BASE_ID_GBIC (0x01) +#define MPI_FCPORT10_BASE_ID_FIXED (0x02) +#define MPI_FCPORT10_BASE_ID_SFP (0x03) +#define MPI_FCPORT10_BASE_ID_SFP_MIN (0x04) +#define MPI_FCPORT10_BASE_ID_SFP_MAX (0x7F) +#define MPI_FCPORT10_BASE_ID_VEND_SPEC_MASK (0x80) + +#define MPI_FCPORT10_BASE_EXTID_UNKNOWN (0x00) +#define MPI_FCPORT10_BASE_EXTID_MODDEF1 (0x01) +#define MPI_FCPORT10_BASE_EXTID_MODDEF2 (0x02) +#define MPI_FCPORT10_BASE_EXTID_MODDEF3 (0x03) +#define MPI_FCPORT10_BASE_EXTID_SEEPROM (0x04) +#define MPI_FCPORT10_BASE_EXTID_MODDEF5 (0x05) +#define MPI_FCPORT10_BASE_EXTID_MODDEF6 (0x06) +#define MPI_FCPORT10_BASE_EXTID_MODDEF7 (0x07) +#define MPI_FCPORT10_BASE_EXTID_VNDSPC_MASK (0x80) + +#define MPI_FCPORT10_BASE_CONN_UNKNOWN (0x00) +#define MPI_FCPORT10_BASE_CONN_SC (0x01) +#define MPI_FCPORT10_BASE_CONN_COPPER1 (0x02) +#define MPI_FCPORT10_BASE_CONN_COPPER2 (0x03) +#define MPI_FCPORT10_BASE_CONN_BNC_TNC (0x04) +#define MPI_FCPORT10_BASE_CONN_COAXIAL (0x05) +#define MPI_FCPORT10_BASE_CONN_FIBERJACK (0x06) +#define MPI_FCPORT10_BASE_CONN_LC (0x07) +#define MPI_FCPORT10_BASE_CONN_MT_RJ (0x08) +#define MPI_FCPORT10_BASE_CONN_MU (0x09) +#define MPI_FCPORT10_BASE_CONN_SG (0x0A) +#define MPI_FCPORT10_BASE_CONN_OPT_PIGT (0x0B) +#define MPI_FCPORT10_BASE_CONN_RSV1_MIN (0x0C) +#define MPI_FCPORT10_BASE_CONN_RSV1_MAX (0x1F) +#define MPI_FCPORT10_BASE_CONN_HSSDC_II (0x20) +#define MPI_FCPORT10_BASE_CONN_CPR_PIGT (0x21) +#define MPI_FCPORT10_BASE_CONN_RSV2_MIN (0x22) +#define MPI_FCPORT10_BASE_CONN_RSV2_MAX (0x7F) +#define MPI_FCPORT10_BASE_CONN_VNDSPC_MASK (0x80) + +#define MPI_FCPORT10_BASE_ENCODE_UNSPEC (0x00) +#define MPI_FCPORT10_BASE_ENCODE_8B10B (0x01) +#define MPI_FCPORT10_BASE_ENCODE_4B5B (0x02) +#define MPI_FCPORT10_BASE_ENCODE_NRZ (0x03) +#define MPI_FCPORT10_BASE_ENCODE_MANCHESTER (0x04) + + +typedef struct _CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA +{ + U8 Options[2]; /* 50h */ + U8 BitRateMax; /* 52h */ + U8 BitRateMin; /* 53h */ + U8 VendorSN[16]; /* 54h */ + U8 DateCode[8]; /* 64h */ + U8 DiagMonitoringType; /* 6Ch */ + U8 EnhancedOptions; /* 6Dh */ + U8 SFF8472Compliance; /* 6Eh */ + U8 CC_EXT; /* 6Fh */ +} CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA, + MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA, + FCPortPage10ExtendedSfpData_t, MPI_POINTER pFCPortPage10ExtendedSfpData_t; + +#define MPI_FCPORT10_EXT_OPTION1_RATESEL (0x20) +#define MPI_FCPORT10_EXT_OPTION1_TX_DISABLE (0x10) +#define MPI_FCPORT10_EXT_OPTION1_TX_FAULT (0x08) +#define MPI_FCPORT10_EXT_OPTION1_LOS_INVERT (0x04) +#define MPI_FCPORT10_EXT_OPTION1_LOS (0x02) + + +typedef struct _CONFIG_PAGE_FC_PORT_10 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 Flags; /* 04h */ + U8 Reserved1; /* 05h */ + U16 Reserved2; /* 06h */ + U32 HwConfig1; /* 08h */ + U32 HwConfig2; /* 0Ch */ + CONFIG_PAGE_FC_PORT_10_BASE_SFP_DATA Base; /* 10h */ + CONFIG_PAGE_FC_PORT_10_EXTENDED_SFP_DATA Extended; /* 50h */ + U8 VendorSpecific[32]; /* 70h */ +} CONFIG_PAGE_FC_PORT_10, MPI_POINTER PTR_CONFIG_PAGE_FC_PORT_10, + FCPortPage10_t, MPI_POINTER pFCPortPage10_t; + +#define MPI_FCPORTPAGE10_PAGEVERSION (0x01) + +/* standard MODDEF pin definitions (from GBIC spec.) */ +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_MASK (0x00000007) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF2 (0x00000001) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF1 (0x00000002) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF0 (0x00000004) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_NOGBIC (0x00000007) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_CPR_IEEE_CX (0x00000006) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_COPPER (0x00000005) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_OPTICAL_LW (0x00000004) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_SEEPROM (0x00000003) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_SW_OPTICAL (0x00000002) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_LX_IEEE_OPT_LW (0x00000001) +#define MPI_FCPORTPAGE10_FLAGS_MODDEF_SX_IEEE_OPT_SW (0x00000000) + +#define MPI_FCPORTPAGE10_FLAGS_CC_BASE_OK (0x00000010) +#define MPI_FCPORTPAGE10_FLAGS_CC_EXT_OK (0x00000020) + + +/**************************************************************************** +* FC Device Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_FC_DEVICE_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U64 WWNN; /* 04h */ + U64 WWPN; /* 0Ch */ + U32 PortIdentifier; /* 14h */ + U8 Protocol; /* 18h */ + U8 Flags; /* 19h */ + U16 BBCredit; /* 1Ah */ + U16 MaxRxFrameSize; /* 1Ch */ + U8 ADISCHardALPA; /* 1Eh */ + U8 PortNumber; /* 1Fh */ + U8 FcPhLowestVersion; /* 20h */ + U8 FcPhHighestVersion; /* 21h */ + U8 CurrentTargetID; /* 22h */ + U8 CurrentBus; /* 23h */ +} CONFIG_PAGE_FC_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_FC_DEVICE_0, + FCDevicePage0_t, MPI_POINTER pFCDevicePage0_t; + +#define MPI_FC_DEVICE_PAGE0_PAGEVERSION (0x03) + +#define MPI_FC_DEVICE_PAGE0_FLAGS_TARGETID_BUS_VALID (0x01) +#define MPI_FC_DEVICE_PAGE0_FLAGS_PLOGI_INVALID (0x02) +#define MPI_FC_DEVICE_PAGE0_FLAGS_PRLI_INVALID (0x04) + +#define MPI_FC_DEVICE_PAGE0_PROT_IP (0x01) +#define MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET (0x02) +#define MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR (0x04) +#define MPI_FC_DEVICE_PAGE0_PROT_FCP_RETRY (0x08) + +#define MPI_FC_DEVICE_PAGE0_PGAD_PORT_MASK (MPI_FC_DEVICE_PGAD_PORT_MASK) +#define MPI_FC_DEVICE_PAGE0_PGAD_FORM_MASK (MPI_FC_DEVICE_PGAD_FORM_MASK) +#define MPI_FC_DEVICE_PAGE0_PGAD_FORM_NEXT_DID (MPI_FC_DEVICE_PGAD_FORM_NEXT_DID) +#define MPI_FC_DEVICE_PAGE0_PGAD_FORM_BUS_TID (MPI_FC_DEVICE_PGAD_FORM_BUS_TID) +#define MPI_FC_DEVICE_PAGE0_PGAD_DID_MASK (MPI_FC_DEVICE_PGAD_ND_DID_MASK) +#define MPI_FC_DEVICE_PAGE0_PGAD_BUS_MASK (MPI_FC_DEVICE_PGAD_BT_BUS_MASK) +#define MPI_FC_DEVICE_PAGE0_PGAD_BUS_SHIFT (MPI_FC_DEVICE_PGAD_BT_BUS_SHIFT) +#define MPI_FC_DEVICE_PAGE0_PGAD_TID_MASK (MPI_FC_DEVICE_PGAD_BT_TID_MASK) + +#define MPI_FC_DEVICE_PAGE0_HARD_ALPA_UNKNOWN (0xFF) + +/**************************************************************************** +* RAID Volume Config Pages +****************************************************************************/ + +typedef struct _RAID_VOL0_PHYS_DISK +{ + U16 Reserved; /* 00h */ + U8 PhysDiskMap; /* 02h */ + U8 PhysDiskNum; /* 03h */ +} RAID_VOL0_PHYS_DISK, MPI_POINTER PTR_RAID_VOL0_PHYS_DISK, + RaidVol0PhysDisk_t, MPI_POINTER pRaidVol0PhysDisk_t; + +#define MPI_RAIDVOL0_PHYSDISK_PRIMARY (0x01) +#define MPI_RAIDVOL0_PHYSDISK_SECONDARY (0x02) + +typedef struct _RAID_VOL0_STATUS +{ + U8 Flags; /* 00h */ + U8 State; /* 01h */ + U16 Reserved; /* 02h */ +} RAID_VOL0_STATUS, MPI_POINTER PTR_RAID_VOL0_STATUS, + RaidVol0Status_t, MPI_POINTER pRaidVol0Status_t; + +/* RAID Volume Page 0 VolumeStatus defines */ +#define MPI_RAIDVOL0_STATUS_FLAG_ENABLED (0x01) +#define MPI_RAIDVOL0_STATUS_FLAG_QUIESCED (0x02) +#define MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS (0x04) +#define MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE (0x08) +#define MPI_RAIDVOL0_STATUS_FLAG_BAD_BLOCK_TABLE_FULL (0x10) + +#define MPI_RAIDVOL0_STATUS_STATE_OPTIMAL (0x00) +#define MPI_RAIDVOL0_STATUS_STATE_DEGRADED (0x01) +#define MPI_RAIDVOL0_STATUS_STATE_FAILED (0x02) +#define MPI_RAIDVOL0_STATUS_STATE_MISSING (0x03) + +typedef struct _RAID_VOL0_SETTINGS +{ + U16 Settings; /* 00h */ + U8 HotSparePool; /* 01h */ /* MPI_RAID_HOT_SPARE_POOL_ */ + U8 Reserved; /* 02h */ +} RAID_VOL0_SETTINGS, MPI_POINTER PTR_RAID_VOL0_SETTINGS, + RaidVol0Settings, MPI_POINTER pRaidVol0Settings; + +/* RAID Volume Page 0 VolumeSettings defines */ +#define MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE (0x0001) +#define MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART (0x0002) +#define MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE (0x0004) +#define MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC (0x0008) +#define MPI_RAIDVOL0_SETTING_FAST_DATA_SCRUBBING_0102 (0x0020) /* obsolete */ + +#define MPI_RAIDVOL0_SETTING_MASK_METADATA_SIZE (0x00C0) +#define MPI_RAIDVOL0_SETTING_64MB_METADATA_SIZE (0x0000) +#define MPI_RAIDVOL0_SETTING_512MB_METADATA_SIZE (0x0040) + +#define MPI_RAIDVOL0_SETTING_USE_PRODUCT_ID_SUFFIX (0x0010) +#define MPI_RAIDVOL0_SETTING_USE_DEFAULTS (0x8000) + +/* RAID Volume Page 0 HotSparePool defines, also used in RAID Physical Disk */ +#define MPI_RAID_HOT_SPARE_POOL_0 (0x01) +#define MPI_RAID_HOT_SPARE_POOL_1 (0x02) +#define MPI_RAID_HOT_SPARE_POOL_2 (0x04) +#define MPI_RAID_HOT_SPARE_POOL_3 (0x08) +#define MPI_RAID_HOT_SPARE_POOL_4 (0x10) +#define MPI_RAID_HOT_SPARE_POOL_5 (0x20) +#define MPI_RAID_HOT_SPARE_POOL_6 (0x40) +#define MPI_RAID_HOT_SPARE_POOL_7 (0x80) + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX +#define MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_RAID_VOL_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 VolumeID; /* 04h */ + U8 VolumeBus; /* 05h */ + U8 VolumeIOC; /* 06h */ + U8 VolumeType; /* 07h */ /* MPI_RAID_VOL_TYPE_ */ + RAID_VOL0_STATUS VolumeStatus; /* 08h */ + RAID_VOL0_SETTINGS VolumeSettings; /* 0Ch */ + U32 MaxLBA; /* 10h */ + U32 MaxLBAHigh; /* 14h */ + U32 StripeSize; /* 18h */ + U32 Reserved2; /* 1Ch */ + U32 Reserved3; /* 20h */ + U8 NumPhysDisks; /* 24h */ + U8 DataScrubRate; /* 25h */ + U8 ResyncRate; /* 26h */ + U8 InactiveStatus; /* 27h */ + RAID_VOL0_PHYS_DISK PhysDisk[MPI_RAID_VOL_PAGE_0_PHYSDISK_MAX];/* 28h */ +} CONFIG_PAGE_RAID_VOL_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_0, + RaidVolumePage0_t, MPI_POINTER pRaidVolumePage0_t; + +#define MPI_RAIDVOLPAGE0_PAGEVERSION (0x07) + +/* values for RAID Volume Page 0 InactiveStatus field */ +#define MPI_RAIDVOLPAGE0_UNKNOWN_INACTIVE (0x00) +#define MPI_RAIDVOLPAGE0_STALE_METADATA_INACTIVE (0x01) +#define MPI_RAIDVOLPAGE0_FOREIGN_VOLUME_INACTIVE (0x02) +#define MPI_RAIDVOLPAGE0_INSUFFICIENT_RESOURCE_INACTIVE (0x03) +#define MPI_RAIDVOLPAGE0_CLONE_VOLUME_INACTIVE (0x04) +#define MPI_RAIDVOLPAGE0_INSUFFICIENT_METADATA_INACTIVE (0x05) +#define MPI_RAIDVOLPAGE0_PREVIOUSLY_DELETED (0x06) + + +typedef struct _CONFIG_PAGE_RAID_VOL_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 VolumeID; /* 04h */ + U8 VolumeBus; /* 05h */ + U8 VolumeIOC; /* 06h */ + U8 Reserved0; /* 07h */ + U8 GUID[24]; /* 08h */ + U8 Name[32]; /* 20h */ + U64 WWID; /* 40h */ + U32 Reserved1; /* 48h */ + U32 Reserved2; /* 4Ch */ +} CONFIG_PAGE_RAID_VOL_1, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_1, + RaidVolumePage1_t, MPI_POINTER pRaidVolumePage1_t; + +#define MPI_RAIDVOLPAGE1_PAGEVERSION (0x01) + + +/**************************************************************************** +* RAID Physical Disk Config Pages +****************************************************************************/ + +typedef struct _RAID_PHYS_DISK0_ERROR_DATA +{ + U8 ErrorCdbByte; /* 00h */ + U8 ErrorSenseKey; /* 01h */ + U16 Reserved; /* 02h */ + U16 ErrorCount; /* 04h */ + U8 ErrorASC; /* 06h */ + U8 ErrorASCQ; /* 07h */ + U16 SmartCount; /* 08h */ + U8 SmartASC; /* 0Ah */ + U8 SmartASCQ; /* 0Bh */ +} RAID_PHYS_DISK0_ERROR_DATA, MPI_POINTER PTR_RAID_PHYS_DISK0_ERROR_DATA, + RaidPhysDisk0ErrorData_t, MPI_POINTER pRaidPhysDisk0ErrorData_t; + +typedef struct _RAID_PHYS_DISK_INQUIRY_DATA +{ + U8 VendorID[8]; /* 00h */ + U8 ProductID[16]; /* 08h */ + U8 ProductRevLevel[4]; /* 18h */ + U8 Info[32]; /* 1Ch */ +} RAID_PHYS_DISK0_INQUIRY_DATA, MPI_POINTER PTR_RAID_PHYS_DISK0_INQUIRY_DATA, + RaidPhysDisk0InquiryData, MPI_POINTER pRaidPhysDisk0InquiryData; + +typedef struct _RAID_PHYS_DISK0_SETTINGS +{ + U8 SepID; /* 00h */ + U8 SepBus; /* 01h */ + U8 HotSparePool; /* 02h */ /* MPI_RAID_HOT_SPARE_POOL_ */ + U8 PhysDiskSettings; /* 03h */ +} RAID_PHYS_DISK0_SETTINGS, MPI_POINTER PTR_RAID_PHYS_DISK0_SETTINGS, + RaidPhysDiskSettings_t, MPI_POINTER pRaidPhysDiskSettings_t; + +typedef struct _RAID_PHYS_DISK0_STATUS +{ + U8 Flags; /* 00h */ + U8 State; /* 01h */ + U16 Reserved; /* 02h */ +} RAID_PHYS_DISK0_STATUS, MPI_POINTER PTR_RAID_PHYS_DISK0_STATUS, + RaidPhysDiskStatus_t, MPI_POINTER pRaidPhysDiskStatus_t; + +/* RAID Physical Disk PhysDiskStatus flags */ + +#define MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC (0x01) +#define MPI_PHYSDISK0_STATUS_FLAG_QUIESCED (0x02) +#define MPI_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME (0x04) +#define MPI_PHYSDISK0_STATUS_FLAG_OPTIMAL_PREVIOUS (0x00) +#define MPI_PHYSDISK0_STATUS_FLAG_NOT_OPTIMAL_PREVIOUS (0x08) + +#define MPI_PHYSDISK0_STATUS_ONLINE (0x00) +#define MPI_PHYSDISK0_STATUS_MISSING (0x01) +#define MPI_PHYSDISK0_STATUS_NOT_COMPATIBLE (0x02) +#define MPI_PHYSDISK0_STATUS_FAILED (0x03) +#define MPI_PHYSDISK0_STATUS_INITIALIZING (0x04) +#define MPI_PHYSDISK0_STATUS_OFFLINE_REQUESTED (0x05) +#define MPI_PHYSDISK0_STATUS_FAILED_REQUESTED (0x06) +#define MPI_PHYSDISK0_STATUS_OTHER_OFFLINE (0xFF) + +typedef struct _CONFIG_PAGE_RAID_PHYS_DISK_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 PhysDiskID; /* 04h */ + U8 PhysDiskBus; /* 05h */ + U8 PhysDiskIOC; /* 06h */ + U8 PhysDiskNum; /* 07h */ + RAID_PHYS_DISK0_SETTINGS PhysDiskSettings; /* 08h */ + U32 Reserved1; /* 0Ch */ + U8 ExtDiskIdentifier[8]; /* 10h */ + U8 DiskIdentifier[16]; /* 18h */ + RAID_PHYS_DISK0_INQUIRY_DATA InquiryData; /* 28h */ + RAID_PHYS_DISK0_STATUS PhysDiskStatus; /* 64h */ + U32 MaxLBA; /* 68h */ + RAID_PHYS_DISK0_ERROR_DATA ErrorData; /* 6Ch */ +} CONFIG_PAGE_RAID_PHYS_DISK_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_PHYS_DISK_0, + RaidPhysDiskPage0_t, MPI_POINTER pRaidPhysDiskPage0_t; + +#define MPI_RAIDPHYSDISKPAGE0_PAGEVERSION (0x02) + + +typedef struct _RAID_PHYS_DISK1_PATH +{ + U8 PhysDiskID; /* 00h */ + U8 PhysDiskBus; /* 01h */ + U16 Reserved1; /* 02h */ + U64 WWID; /* 04h */ + U64 OwnerWWID; /* 0Ch */ + U8 OwnerIdentifier; /* 14h */ + U8 Reserved2; /* 15h */ + U16 Flags; /* 16h */ +} RAID_PHYS_DISK1_PATH, MPI_POINTER PTR_RAID_PHYS_DISK1_PATH, + RaidPhysDisk1Path_t, MPI_POINTER pRaidPhysDisk1Path_t; + +/* RAID Physical Disk Page 1 Flags field defines */ +#define MPI_RAID_PHYSDISK1_FLAG_BROKEN (0x0002) +#define MPI_RAID_PHYSDISK1_FLAG_INVALID (0x0001) + + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength or NumPhysDiskPaths at runtime. + */ +#ifndef MPI_RAID_PHYS_DISK1_PATH_MAX +#define MPI_RAID_PHYS_DISK1_PATH_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_RAID_PHYS_DISK_1 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + U8 NumPhysDiskPaths; /* 04h */ + U8 PhysDiskNum; /* 05h */ + U16 Reserved2; /* 06h */ + U32 Reserved1; /* 08h */ + RAID_PHYS_DISK1_PATH Path[MPI_RAID_PHYS_DISK1_PATH_MAX];/* 0Ch */ +} CONFIG_PAGE_RAID_PHYS_DISK_1, MPI_POINTER PTR_CONFIG_PAGE_RAID_PHYS_DISK_1, + RaidPhysDiskPage1_t, MPI_POINTER pRaidPhysDiskPage1_t; + +#define MPI_RAIDPHYSDISKPAGE1_PAGEVERSION (0x00) + + +/**************************************************************************** +* LAN Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_LAN_0 +{ + ConfigPageHeader_t Header; /* 00h */ + U16 TxRxModes; /* 04h */ + U16 Reserved; /* 06h */ + U32 PacketPrePad; /* 08h */ +} CONFIG_PAGE_LAN_0, MPI_POINTER PTR_CONFIG_PAGE_LAN_0, + LANPage0_t, MPI_POINTER pLANPage0_t; + +#define MPI_LAN_PAGE0_PAGEVERSION (0x01) + +#define MPI_LAN_PAGE0_RETURN_LOOPBACK (0x0000) +#define MPI_LAN_PAGE0_SUPPRESS_LOOPBACK (0x0001) +#define MPI_LAN_PAGE0_LOOPBACK_MASK (0x0001) + +typedef struct _CONFIG_PAGE_LAN_1 +{ + ConfigPageHeader_t Header; /* 00h */ + U16 Reserved; /* 04h */ + U8 CurrentDeviceState; /* 06h */ + U8 Reserved1; /* 07h */ + U32 MinPacketSize; /* 08h */ + U32 MaxPacketSize; /* 0Ch */ + U32 HardwareAddressLow; /* 10h */ + U32 HardwareAddressHigh; /* 14h */ + U32 MaxWireSpeedLow; /* 18h */ + U32 MaxWireSpeedHigh; /* 1Ch */ + U32 BucketsRemaining; /* 20h */ + U32 MaxReplySize; /* 24h */ + U32 NegWireSpeedLow; /* 28h */ + U32 NegWireSpeedHigh; /* 2Ch */ +} CONFIG_PAGE_LAN_1, MPI_POINTER PTR_CONFIG_PAGE_LAN_1, + LANPage1_t, MPI_POINTER pLANPage1_t; + +#define MPI_LAN_PAGE1_PAGEVERSION (0x03) + +#define MPI_LAN_PAGE1_DEV_STATE_RESET (0x00) +#define MPI_LAN_PAGE1_DEV_STATE_OPERATIONAL (0x01) + + +/**************************************************************************** +* Inband Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_INBAND_0 +{ + CONFIG_PAGE_HEADER Header; /* 00h */ + MPI_VERSION_FORMAT InbandVersion; /* 04h */ + U16 MaximumBuffers; /* 08h */ + U16 Reserved1; /* 0Ah */ +} CONFIG_PAGE_INBAND_0, MPI_POINTER PTR_CONFIG_PAGE_INBAND_0, + InbandPage0_t, MPI_POINTER pInbandPage0_t; + +#define MPI_INBAND_PAGEVERSION (0x00) + + + +/**************************************************************************** +* SAS IO Unit Config Pages +****************************************************************************/ + +typedef struct _MPI_SAS_IO_UNIT0_PHY_DATA +{ + U8 Port; /* 00h */ + U8 PortFlags; /* 01h */ + U8 PhyFlags; /* 02h */ + U8 NegotiatedLinkRate; /* 03h */ + U32 ControllerPhyDeviceInfo;/* 04h */ + U16 AttachedDeviceHandle; /* 08h */ + U16 ControllerDevHandle; /* 0Ah */ + U32 DiscoveryStatus; /* 0Ch */ +} MPI_SAS_IO_UNIT0_PHY_DATA, MPI_POINTER PTR_MPI_SAS_IO_UNIT0_PHY_DATA, + SasIOUnit0PhyData, MPI_POINTER pSasIOUnit0PhyData; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_SAS_IOUNIT0_PHY_MAX +#define MPI_SAS_IOUNIT0_PHY_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_SAS_IO_UNIT_0 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U16 NvdataVersionDefault; /* 08h */ + U16 NvdataVersionPersistent; /* 0Ah */ + U8 NumPhys; /* 0Ch */ + U8 Reserved2; /* 0Dh */ + U16 Reserved3; /* 0Eh */ + MPI_SAS_IO_UNIT0_PHY_DATA PhyData[MPI_SAS_IOUNIT0_PHY_MAX]; /* 10h */ +} CONFIG_PAGE_SAS_IO_UNIT_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_0, + SasIOUnitPage0_t, MPI_POINTER pSasIOUnitPage0_t; + +#define MPI_SASIOUNITPAGE0_PAGEVERSION (0x04) + +/* values for SAS IO Unit Page 0 PortFlags */ +#define MPI_SAS_IOUNIT0_PORT_FLAGS_DISCOVERY_IN_PROGRESS (0x08) +#define MPI_SAS_IOUNIT0_PORT_FLAGS_0_TARGET_IOC_NUM (0x00) +#define MPI_SAS_IOUNIT0_PORT_FLAGS_1_TARGET_IOC_NUM (0x04) +#define MPI_SAS_IOUNIT0_PORT_FLAGS_AUTO_PORT_CONFIG (0x01) + +/* values for SAS IO Unit Page 0 PhyFlags */ +#define MPI_SAS_IOUNIT0_PHY_FLAGS_PHY_DISABLED (0x04) +#define MPI_SAS_IOUNIT0_PHY_FLAGS_TX_INVERT (0x02) +#define MPI_SAS_IOUNIT0_PHY_FLAGS_RX_INVERT (0x01) + +/* values for SAS IO Unit Page 0 NegotiatedLinkRate */ +#define MPI_SAS_IOUNIT0_RATE_UNKNOWN (0x00) +#define MPI_SAS_IOUNIT0_RATE_PHY_DISABLED (0x01) +#define MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION (0x02) +#define MPI_SAS_IOUNIT0_RATE_SATA_OOB_COMPLETE (0x03) +#define MPI_SAS_IOUNIT0_RATE_1_5 (0x08) +#define MPI_SAS_IOUNIT0_RATE_3_0 (0x09) + +/* see mpi_sas.h for values for SAS IO Unit Page 0 ControllerPhyDeviceInfo values */ + +/* values for SAS IO Unit Page 0 DiscoveryStatus */ +#define MPI_SAS_IOUNIT0_DS_LOOP_DETECTED (0x00000001) +#define MPI_SAS_IOUNIT0_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI_SAS_IOUNIT0_DS_MULTIPLE_PORTS (0x00000004) +#define MPI_SAS_IOUNIT0_DS_EXPANDER_ERR (0x00000008) +#define MPI_SAS_IOUNIT0_DS_SMP_TIMEOUT (0x00000010) +#define MPI_SAS_IOUNIT0_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI_SAS_IOUNIT0_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI_SAS_IOUNIT0_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI_SAS_IOUNIT0_DS_SMP_CRC_ERROR (0x00000100) +#define MPI_SAS_IOUNIT0_DS_SUBTRACTIVE_LINK (0x00000200) +#define MPI_SAS_IOUNIT0_DS_TABLE_LINK (0x00000400) +#define MPI_SAS_IOUNIT0_DS_UNSUPPORTED_DEVICE (0x00000800) +#define MPI_SAS_IOUNIT0_DS_MAX_SATA_TARGETS (0x00001000) +#define MPI_SAS_IOUNIT0_DS_MULTI_PORT_DOMAIN (0x00002000) + + +typedef struct _MPI_SAS_IO_UNIT1_PHY_DATA +{ + U8 Port; /* 00h */ + U8 PortFlags; /* 01h */ + U8 PhyFlags; /* 02h */ + U8 MaxMinLinkRate; /* 03h */ + U32 ControllerPhyDeviceInfo; /* 04h */ + U16 MaxTargetPortConnectTime; /* 08h */ + U16 Reserved1; /* 0Ah */ +} MPI_SAS_IO_UNIT1_PHY_DATA, MPI_POINTER PTR_MPI_SAS_IO_UNIT1_PHY_DATA, + SasIOUnit1PhyData, MPI_POINTER pSasIOUnit1PhyData; + +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check Header.PageLength at runtime. + */ +#ifndef MPI_SAS_IOUNIT1_PHY_MAX +#define MPI_SAS_IOUNIT1_PHY_MAX (1) +#endif + +typedef struct _CONFIG_PAGE_SAS_IO_UNIT_1 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U16 ControlFlags; /* 08h */ + U16 MaxNumSATATargets; /* 0Ah */ + U16 AdditionalControlFlags; /* 0Ch */ + U16 Reserved1; /* 0Eh */ + U8 NumPhys; /* 10h */ + U8 SATAMaxQDepth; /* 11h */ + U8 ReportDeviceMissingDelay; /* 12h */ + U8 IODeviceMissingDelay; /* 13h */ + MPI_SAS_IO_UNIT1_PHY_DATA PhyData[MPI_SAS_IOUNIT1_PHY_MAX]; /* 14h */ +} CONFIG_PAGE_SAS_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_1, + SasIOUnitPage1_t, MPI_POINTER pSasIOUnitPage1_t; + +#define MPI_SASIOUNITPAGE1_PAGEVERSION (0x07) + +/* values for SAS IO Unit Page 1 ControlFlags */ +#define MPI_SAS_IOUNIT1_CONTROL_DEVICE_SELF_TEST (0x8000) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_3_0_MAX (0x4000) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_1_5_MAX (0x2000) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_SW_PRESERVE (0x1000) +#define MPI_SAS_IOUNIT1_CONTROL_DISABLE_SAS_HASH (0x0800) + +#define MPI_SAS_IOUNIT1_CONTROL_MASK_DEV_SUPPORT (0x0600) +#define MPI_SAS_IOUNIT1_CONTROL_SHIFT_DEV_SUPPORT (9) +#define MPI_SAS_IOUNIT1_CONTROL_DEV_SUPPORT_BOTH (0x00) +#define MPI_SAS_IOUNIT1_CONTROL_DEV_SAS_SUPPORT (0x01) +#define MPI_SAS_IOUNIT1_CONTROL_DEV_SATA_SUPPORT (0x02) + +#define MPI_SAS_IOUNIT1_CONTROL_POSTPONE_SATA_INIT (0x0100) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_48BIT_LBA_REQUIRED (0x0080) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_SMART_REQUIRED (0x0040) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_NCQ_REQUIRED (0x0020) +#define MPI_SAS_IOUNIT1_CONTROL_SATA_FUA_REQUIRED (0x0010) +#define MPI_SAS_IOUNIT1_CONTROL_PHY_ENABLE_ORDER_HIGH (0x0008) +#define MPI_SAS_IOUNIT1_CONTROL_SUBTRACTIVE_ILLEGAL (0x0004) +#define MPI_SAS_IOUNIT1_CONTROL_FIRST_LVL_DISC_ONLY (0x0002) +#define MPI_SAS_IOUNIT1_CONTROL_CLEAR_AFFILIATION (0x0001) + +/* values for SAS IO Unit Page 1 AdditionalControlFlags */ +#define MPI_SAS_IOUNIT1_ACONTROL_MULTI_PORT_DOMAIN_ILLEGAL (0x0080) +#define MPI_SAS_IOUNIT1_ACONTROL_SATA_ASYNCHROUNOUS_NOTIFICATION (0x0040) +#define MPI_SAS_IOUNIT1_ACONTROL_HIDE_NONZERO_ATTACHED_PHY_IDENT (0x0020) +#define MPI_SAS_IOUNIT1_ACONTROL_PORT_ENABLE_ONLY_SATA_LINK_RESET (0x0010) +#define MPI_SAS_IOUNIT1_ACONTROL_OTHER_AFFILIATION_SATA_LINK_RESET (0x0008) +#define MPI_SAS_IOUNIT1_ACONTROL_SELF_AFFILIATION_SATA_LINK_RESET (0x0004) +#define MPI_SAS_IOUNIT1_ACONTROL_NO_AFFILIATION_SATA_LINK_RESET (0x0002) +#define MPI_SAS_IOUNIT1_ACONTROL_ALLOW_TABLE_TO_TABLE (0x0001) + +/* defines for SAS IO Unit Page 1 ReportDeviceMissingDelay */ +#define MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK (0x7F) +#define MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16 (0x80) + +/* values for SAS IO Unit Page 1 PortFlags */ +#define MPI_SAS_IOUNIT1_PORT_FLAGS_0_TARGET_IOC_NUM (0x00) +#define MPI_SAS_IOUNIT1_PORT_FLAGS_1_TARGET_IOC_NUM (0x04) +#define MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG (0x01) + +/* values for SAS IO Unit Page 0 PhyFlags */ +#define MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE (0x04) +#define MPI_SAS_IOUNIT1_PHY_FLAGS_TX_INVERT (0x02) +#define MPI_SAS_IOUNIT1_PHY_FLAGS_RX_INVERT (0x01) + +/* values for SAS IO Unit Page 0 MaxMinLinkRate */ +#define MPI_SAS_IOUNIT1_MAX_RATE_MASK (0xF0) +#define MPI_SAS_IOUNIT1_MAX_RATE_1_5 (0x80) +#define MPI_SAS_IOUNIT1_MAX_RATE_3_0 (0x90) +#define MPI_SAS_IOUNIT1_MIN_RATE_MASK (0x0F) +#define MPI_SAS_IOUNIT1_MIN_RATE_1_5 (0x08) +#define MPI_SAS_IOUNIT1_MIN_RATE_3_0 (0x09) + +/* see mpi_sas.h for values for SAS IO Unit Page 1 ControllerPhyDeviceInfo values */ + + +typedef struct _CONFIG_PAGE_SAS_IO_UNIT_2 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U8 NumDevsPerEnclosure; /* 08h */ + U8 BootDeviceWaitTime; /* 09h */ + U16 Reserved2; /* 0Ah */ + U16 MaxPersistentIDs; /* 0Ch */ + U16 NumPersistentIDsUsed; /* 0Eh */ + U8 Status; /* 10h */ + U8 Flags; /* 11h */ + U16 MaxNumPhysicalMappedIDs;/* 12h */ +} CONFIG_PAGE_SAS_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_2, + SasIOUnitPage2_t, MPI_POINTER pSasIOUnitPage2_t; + +#define MPI_SASIOUNITPAGE2_PAGEVERSION (0x07) + +/* values for SAS IO Unit Page 2 Status field */ +#define MPI_SAS_IOUNIT2_STATUS_DEVICE_LIMIT_EXCEEDED (0x08) +#define MPI_SAS_IOUNIT2_STATUS_ENCLOSURE_DEVICES_UNMAPPED (0x04) +#define MPI_SAS_IOUNIT2_STATUS_DISABLED_PERSISTENT_MAPPINGS (0x02) +#define MPI_SAS_IOUNIT2_STATUS_FULL_PERSISTENT_MAPPINGS (0x01) + +/* values for SAS IO Unit Page 2 Flags field */ +#define MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS (0x01) +/* Physical Mapping Modes */ +#define MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE (0x0E) +#define MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE (1) +#define MPI_SAS_IOUNIT2_FLAGS_NO_PHYS_MAP (0x00) +#define MPI_SAS_IOUNIT2_FLAGS_DIRECT_ATTACH_PHYS_MAP (0x01) +#define MPI_SAS_IOUNIT2_FLAGS_ENCLOSURE_SLOT_PHYS_MAP (0x02) +#define MPI_SAS_IOUNIT2_FLAGS_HOST_ASSIGNED_PHYS_MAP (0x07) + +#define MPI_SAS_IOUNIT2_FLAGS_RESERVE_ID_0_FOR_BOOT (0x10) +#define MPI_SAS_IOUNIT2_FLAGS_DA_STARTING_SLOT (0x20) + + +typedef struct _CONFIG_PAGE_SAS_IO_UNIT_3 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 08h */ + U32 MaxInvalidDwordCount; /* 0Ch */ + U32 InvalidDwordCountTime; /* 10h */ + U32 MaxRunningDisparityErrorCount; /* 14h */ + U32 RunningDisparityErrorTime; /* 18h */ + U32 MaxLossDwordSynchCount; /* 1Ch */ + U32 LossDwordSynchCountTime; /* 20h */ + U32 MaxPhyResetProblemCount; /* 24h */ + U32 PhyResetProblemTime; /* 28h */ +} CONFIG_PAGE_SAS_IO_UNIT_3, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_3, + SasIOUnitPage3_t, MPI_POINTER pSasIOUnitPage3_t; + +#define MPI_SASIOUNITPAGE3_PAGEVERSION (0x00) + + +/**************************************************************************** +* SAS Expander Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_SAS_EXPANDER_0 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U8 PhysicalPort; /* 08h */ + U8 Reserved1; /* 09h */ + U16 EnclosureHandle; /* 0Ah */ + U64 SASAddress; /* 0Ch */ + U32 DiscoveryStatus; /* 14h */ + U16 DevHandle; /* 18h */ + U16 ParentDevHandle; /* 1Ah */ + U16 ExpanderChangeCount; /* 1Ch */ + U16 ExpanderRouteIndexes; /* 1Eh */ + U8 NumPhys; /* 20h */ + U8 SASLevel; /* 21h */ + U8 Flags; /* 22h */ + U8 Reserved3; /* 23h */ +} CONFIG_PAGE_SAS_EXPANDER_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_EXPANDER_0, + SasExpanderPage0_t, MPI_POINTER pSasExpanderPage0_t; + +#define MPI_SASEXPANDER0_PAGEVERSION (0x03) + +/* values for SAS Expander Page 0 DiscoveryStatus field */ +#define MPI_SAS_EXPANDER0_DS_LOOP_DETECTED (0x00000001) +#define MPI_SAS_EXPANDER0_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI_SAS_EXPANDER0_DS_MULTIPLE_PORTS (0x00000004) +#define MPI_SAS_EXPANDER0_DS_EXPANDER_ERR (0x00000008) +#define MPI_SAS_EXPANDER0_DS_SMP_TIMEOUT (0x00000010) +#define MPI_SAS_EXPANDER0_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI_SAS_EXPANDER0_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI_SAS_EXPANDER0_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI_SAS_EXPANDER0_DS_SMP_CRC_ERROR (0x00000100) +#define MPI_SAS_EXPANDER0_DS_SUBTRACTIVE_LINK (0x00000200) +#define MPI_SAS_EXPANDER0_DS_TABLE_LINK (0x00000400) +#define MPI_SAS_EXPANDER0_DS_UNSUPPORTED_DEVICE (0x00000800) + +/* values for SAS Expander Page 0 Flags field */ +#define MPI_SAS_EXPANDER0_FLAGS_CONNECTOR_END_DEVICE (0x04) +#define MPI_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG (0x02) +#define MPI_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS (0x01) + + +typedef struct _CONFIG_PAGE_SAS_EXPANDER_1 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U8 PhysicalPort; /* 08h */ + U8 Reserved1; /* 09h */ + U16 Reserved2; /* 0Ah */ + U8 NumPhys; /* 0Ch */ + U8 Phy; /* 0Dh */ + U16 NumTableEntriesProgrammed; /* 0Eh */ + U8 ProgrammedLinkRate; /* 10h */ + U8 HwLinkRate; /* 11h */ + U16 AttachedDevHandle; /* 12h */ + U32 PhyInfo; /* 14h */ + U32 AttachedDeviceInfo; /* 18h */ + U16 OwnerDevHandle; /* 1Ch */ + U8 ChangeCount; /* 1Eh */ + U8 NegotiatedLinkRate; /* 1Fh */ + U8 PhyIdentifier; /* 20h */ + U8 AttachedPhyIdentifier; /* 21h */ + U8 Reserved3; /* 22h */ + U8 DiscoveryInfo; /* 23h */ + U32 Reserved4; /* 24h */ +} CONFIG_PAGE_SAS_EXPANDER_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_EXPANDER_1, + SasExpanderPage1_t, MPI_POINTER pSasExpanderPage1_t; + +#define MPI_SASEXPANDER1_PAGEVERSION (0x01) + +/* use MPI_SAS_PHY0_PRATE_ defines for ProgrammedLinkRate */ + +/* use MPI_SAS_PHY0_HWRATE_ defines for HwLinkRate */ + +/* use MPI_SAS_PHY0_PHYINFO_ defines for PhyInfo */ + +/* see mpi_sas.h for values for SAS Expander Page 1 AttachedDeviceInfo values */ + +/* values for SAS Expander Page 1 DiscoveryInfo field */ +#define MPI_SAS_EXPANDER1_DISCINFO_BAD_PHY_DISABLED (0x04) +#define MPI_SAS_EXPANDER1_DISCINFO_LINK_STATUS_CHANGE (0x02) +#define MPI_SAS_EXPANDER1_DISCINFO_NO_ROUTING_ENTRIES (0x01) + +/* values for SAS Expander Page 1 NegotiatedLinkRate field */ +#define MPI_SAS_EXPANDER1_NEG_RATE_UNKNOWN (0x00) +#define MPI_SAS_EXPANDER1_NEG_RATE_PHY_DISABLED (0x01) +#define MPI_SAS_EXPANDER1_NEG_RATE_FAILED_NEGOTIATION (0x02) +#define MPI_SAS_EXPANDER1_NEG_RATE_SATA_OOB_COMPLETE (0x03) +#define MPI_SAS_EXPANDER1_NEG_RATE_1_5 (0x08) +#define MPI_SAS_EXPANDER1_NEG_RATE_3_0 (0x09) + + +/**************************************************************************** +* SAS Device Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_SAS_DEVICE_0 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U16 Slot; /* 08h */ + U16 EnclosureHandle; /* 0Ah */ + U64 SASAddress; /* 0Ch */ + U16 ParentDevHandle; /* 14h */ + U8 PhyNum; /* 16h */ + U8 AccessStatus; /* 17h */ + U16 DevHandle; /* 18h */ + U8 TargetID; /* 1Ah */ + U8 Bus; /* 1Bh */ + U32 DeviceInfo; /* 1Ch */ + U16 Flags; /* 20h */ + U8 PhysicalPort; /* 22h */ + U8 Reserved2; /* 23h */ +} CONFIG_PAGE_SAS_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_0, + SasDevicePage0_t, MPI_POINTER pSasDevicePage0_t; + +#define MPI_SASDEVICE0_PAGEVERSION (0x05) + +/* values for SAS Device Page 0 AccessStatus field */ +#define MPI_SAS_DEVICE0_ASTATUS_NO_ERRORS (0x00) +#define MPI_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED (0x01) +#define MPI_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED (0x02) +#define MPI_SAS_DEVICE0_ASTATUS_SATA_AFFILIATION_CONFLICT (0x03) +#define MPI_SAS_DEVICE0_ASTATUS_SATA_NEEDS_INITIALIZATION (0x04) +/* specific values for SATA Init failures */ +#define MPI_SAS_DEVICE0_ASTATUS_SIF_UNKNOWN (0x10) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_AFFILIATION_CONFLICT (0x11) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_DIAG (0x12) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_IDENTIFICATION (0x13) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_CHECK_POWER (0x14) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_PIO_SN (0x15) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_MDMA_SN (0x16) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_UDMA_SN (0x17) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_ZONING_VIOLATION (0x18) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_NOT_ADDRESSABLE (0x19) +#define MPI_SAS_DEVICE0_ASTATUS_SIF_MAX (0x1F) + +/* values for SAS Device Page 0 Flags field */ +#define MPI_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY (0x0400) +#define MPI_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE (0x0200) +#define MPI_SAS_DEVICE0_FLAGS_UNSUPPORTED_DEVICE (0x0100) +#define MPI_SAS_DEVICE0_FLAGS_SATA_48BIT_LBA_SUPPORTED (0x0080) +#define MPI_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED (0x0040) +#define MPI_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED (0x0020) +#define MPI_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED (0x0010) +#define MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH (0x0008) +#define MPI_SAS_DEVICE0_FLAGS_MAPPING_PERSISTENT (0x0004) +#define MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED (0x0002) +#define MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT (0x0001) + +/* see mpi_sas.h for values for SAS Device Page 0 DeviceInfo values */ + + +typedef struct _CONFIG_PAGE_SAS_DEVICE_1 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 08h */ + U64 SASAddress; /* 0Ch */ + U32 Reserved2; /* 14h */ + U16 DevHandle; /* 18h */ + U8 TargetID; /* 1Ah */ + U8 Bus; /* 1Bh */ + U8 InitialRegDeviceFIS[20];/* 1Ch */ +} CONFIG_PAGE_SAS_DEVICE_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_1, + SasDevicePage1_t, MPI_POINTER pSasDevicePage1_t; + +#define MPI_SASDEVICE1_PAGEVERSION (0x00) + + +typedef struct _CONFIG_PAGE_SAS_DEVICE_2 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U64 PhysicalIdentifier; /* 08h */ + U32 EnclosureMapping; /* 10h */ +} CONFIG_PAGE_SAS_DEVICE_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_2, + SasDevicePage2_t, MPI_POINTER pSasDevicePage2_t; + +#define MPI_SASDEVICE2_PAGEVERSION (0x01) + +/* defines for SAS Device Page 2 EnclosureMapping field */ +#define MPI_SASDEVICE2_ENC_MAP_MASK_MISSING_COUNT (0x0000000F) +#define MPI_SASDEVICE2_ENC_MAP_SHIFT_MISSING_COUNT (0) +#define MPI_SASDEVICE2_ENC_MAP_MASK_NUM_SLOTS (0x000007F0) +#define MPI_SASDEVICE2_ENC_MAP_SHIFT_NUM_SLOTS (4) +#define MPI_SASDEVICE2_ENC_MAP_MASK_START_INDEX (0x001FF800) +#define MPI_SASDEVICE2_ENC_MAP_SHIFT_START_INDEX (11) + + +/**************************************************************************** +* SAS PHY Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_SAS_PHY_0 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U16 OwnerDevHandle; /* 08h */ + U16 Reserved1; /* 0Ah */ + U64 SASAddress; /* 0Ch */ + U16 AttachedDevHandle; /* 14h */ + U8 AttachedPhyIdentifier; /* 16h */ + U8 Reserved2; /* 17h */ + U32 AttachedDeviceInfo; /* 18h */ + U8 ProgrammedLinkRate; /* 1Ch */ + U8 HwLinkRate; /* 1Dh */ + U8 ChangeCount; /* 1Eh */ + U8 Flags; /* 1Fh */ + U32 PhyInfo; /* 20h */ +} CONFIG_PAGE_SAS_PHY_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_PHY_0, + SasPhyPage0_t, MPI_POINTER pSasPhyPage0_t; + +#define MPI_SASPHY0_PAGEVERSION (0x01) + +/* values for SAS PHY Page 0 ProgrammedLinkRate field */ +#define MPI_SAS_PHY0_PRATE_MAX_RATE_MASK (0xF0) +#define MPI_SAS_PHY0_PRATE_MAX_RATE_NOT_PROGRAMMABLE (0x00) +#define MPI_SAS_PHY0_PRATE_MAX_RATE_1_5 (0x80) +#define MPI_SAS_PHY0_PRATE_MAX_RATE_3_0 (0x90) +#define MPI_SAS_PHY0_PRATE_MIN_RATE_MASK (0x0F) +#define MPI_SAS_PHY0_PRATE_MIN_RATE_NOT_PROGRAMMABLE (0x00) +#define MPI_SAS_PHY0_PRATE_MIN_RATE_1_5 (0x08) +#define MPI_SAS_PHY0_PRATE_MIN_RATE_3_0 (0x09) + +/* values for SAS PHY Page 0 HwLinkRate field */ +#define MPI_SAS_PHY0_HWRATE_MAX_RATE_MASK (0xF0) +#define MPI_SAS_PHY0_HWRATE_MAX_RATE_1_5 (0x80) +#define MPI_SAS_PHY0_HWRATE_MAX_RATE_3_0 (0x90) +#define MPI_SAS_PHY0_HWRATE_MIN_RATE_MASK (0x0F) +#define MPI_SAS_PHY0_HWRATE_MIN_RATE_1_5 (0x08) +#define MPI_SAS_PHY0_HWRATE_MIN_RATE_3_0 (0x09) + +/* values for SAS PHY Page 0 Flags field */ +#define MPI_SAS_PHY0_FLAGS_SGPIO_DIRECT_ATTACH_ENC (0x01) + +/* values for SAS PHY Page 0 PhyInfo field */ +#define MPI_SAS_PHY0_PHYINFO_PHY_VACANT (0x80000000) +#define MPI_SAS_PHY0_PHYINFO_SATA_PORT_ACTIVE (0x00004000) +#define MPI_SAS_PHY0_PHYINFO_SATA_PORT_SELECTOR (0x00002000) +#define MPI_SAS_PHY0_PHYINFO_VIRTUAL_PHY (0x00001000) + +#define MPI_SAS_PHY0_PHYINFO_MASK_PARTIAL_PATHWAY_TIME (0x00000F00) +#define MPI_SAS_PHY0_PHYINFO_SHIFT_PARTIAL_PATHWAY_TIME (8) + +#define MPI_SAS_PHY0_PHYINFO_MASK_ROUTING_ATTRIBUTE (0x000000F0) +#define MPI_SAS_PHY0_PHYINFO_DIRECT_ROUTING (0x00000000) +#define MPI_SAS_PHY0_PHYINFO_SUBTRACTIVE_ROUTING (0x00000010) +#define MPI_SAS_PHY0_PHYINFO_TABLE_ROUTING (0x00000020) + +#define MPI_SAS_PHY0_PHYINFO_MASK_LINK_RATE (0x0000000F) +#define MPI_SAS_PHY0_PHYINFO_UNKNOWN_LINK_RATE (0x00000000) +#define MPI_SAS_PHY0_PHYINFO_PHY_DISABLED (0x00000001) +#define MPI_SAS_PHY0_PHYINFO_NEGOTIATION_FAILED (0x00000002) +#define MPI_SAS_PHY0_PHYINFO_SATA_OOB_COMPLETE (0x00000003) +#define MPI_SAS_PHY0_PHYINFO_RATE_1_5 (0x00000008) +#define MPI_SAS_PHY0_PHYINFO_RATE_3_0 (0x00000009) + + +typedef struct _CONFIG_PAGE_SAS_PHY_1 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 08h */ + U32 InvalidDwordCount; /* 0Ch */ + U32 RunningDisparityErrorCount; /* 10h */ + U32 LossDwordSynchCount; /* 14h */ + U32 PhyResetProblemCount; /* 18h */ +} CONFIG_PAGE_SAS_PHY_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_PHY_1, + SasPhyPage1_t, MPI_POINTER pSasPhyPage1_t; + +#define MPI_SASPHY1_PAGEVERSION (0x00) + + +/**************************************************************************** +* SAS Enclosure Config Pages +****************************************************************************/ + +typedef struct _CONFIG_PAGE_SAS_ENCLOSURE_0 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 08h */ + U64 EnclosureLogicalID; /* 0Ch */ + U16 Flags; /* 14h */ + U16 EnclosureHandle; /* 16h */ + U16 NumSlots; /* 18h */ + U16 StartSlot; /* 1Ah */ + U8 StartTargetID; /* 1Ch */ + U8 StartBus; /* 1Dh */ + U8 SEPTargetID; /* 1Eh */ + U8 SEPBus; /* 1Fh */ + U32 Reserved2; /* 20h */ + U32 Reserved3; /* 24h */ +} CONFIG_PAGE_SAS_ENCLOSURE_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_ENCLOSURE_0, + SasEnclosurePage0_t, MPI_POINTER pSasEnclosurePage0_t; + +#define MPI_SASENCLOSURE0_PAGEVERSION (0x01) + +/* values for SAS Enclosure Page 0 Flags field */ +#define MPI_SAS_ENCLS0_FLAGS_SEP_BUS_ID_VALID (0x0020) +#define MPI_SAS_ENCLS0_FLAGS_START_BUS_ID_VALID (0x0010) + +#define MPI_SAS_ENCLS0_FLAGS_MNG_MASK (0x000F) +#define MPI_SAS_ENCLS0_FLAGS_MNG_UNKNOWN (0x0000) +#define MPI_SAS_ENCLS0_FLAGS_MNG_IOC_SES (0x0001) +#define MPI_SAS_ENCLS0_FLAGS_MNG_IOC_SGPIO (0x0002) +#define MPI_SAS_ENCLS0_FLAGS_MNG_EXP_SGPIO (0x0003) +#define MPI_SAS_ENCLS0_FLAGS_MNG_SES_ENCLOSURE (0x0004) +#define MPI_SAS_ENCLS0_FLAGS_MNG_IOC_GPIO (0x0005) + + +/**************************************************************************** +* Log Config Pages +****************************************************************************/ +/* + * Host code (drivers, BIOS, utilities, etc.) should leave this define set to + * one and check NumLogEntries at runtime. + */ +#ifndef MPI_LOG_0_NUM_LOG_ENTRIES +#define MPI_LOG_0_NUM_LOG_ENTRIES (1) +#endif + +#define MPI_LOG_0_LOG_DATA_LENGTH (0x1C) + +typedef struct _MPI_LOG_0_ENTRY +{ + U32 TimeStamp; /* 00h */ + U32 Reserved1; /* 04h */ + U16 LogSequence; /* 08h */ + U16 LogEntryQualifier; /* 0Ah */ + U8 LogData[MPI_LOG_0_LOG_DATA_LENGTH]; /* 0Ch */ +} MPI_LOG_0_ENTRY, MPI_POINTER PTR_MPI_LOG_0_ENTRY, + MpiLog0Entry_t, MPI_POINTER pMpiLog0Entry_t; + +/* values for Log Page 0 LogEntry LogEntryQualifier field */ +#define MPI_LOG_0_ENTRY_QUAL_ENTRY_UNUSED (0x0000) +#define MPI_LOG_0_ENTRY_QUAL_POWER_ON_RESET (0x0001) + +typedef struct _CONFIG_PAGE_LOG_0 +{ + CONFIG_EXTENDED_PAGE_HEADER Header; /* 00h */ + U32 Reserved1; /* 08h */ + U32 Reserved2; /* 0Ch */ + U16 NumLogEntries; /* 10h */ + U16 Reserved3; /* 12h */ + MPI_LOG_0_ENTRY LogEntry[MPI_LOG_0_NUM_LOG_ENTRIES]; /* 14h */ +} CONFIG_PAGE_LOG_0, MPI_POINTER PTR_CONFIG_PAGE_LOG_0, + LogPage0_t, MPI_POINTER pLogPage0_t; + +#define MPI_LOG_0_PAGEVERSION (0x01) + + +#endif + diff --git a/source/lsi/mpi_fc.h b/source/lsi/mpi_fc.h new file mode 100755 index 0000000..9acd920 --- /dev/null +++ b/source/lsi/mpi_fc.h @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2000-2008 LSI Corporation. + * + * + * Name: mpi_fc.h + * Title: MPI Fibre Channel messages and structures + * Creation Date: June 12, 2000 + * + * mpi_fc.h Version: 01.05.01 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-08-00 00.10.01 Original release for 0.10 spec dated 4/26/2000. + * 06-06-00 01.00.01 Update version number for 1.0 release. + * 06-12-00 01.00.02 Added _MSG_FC_ABORT_REPLY structure. + * 11-02-00 01.01.01 Original release for post 1.0 work + * 12-04-00 01.01.02 Added messages for Common Transport Send and + * Primitive Send. + * 01-09-01 01.01.03 Modifed some of the new flags to have an MPI prefix + * and modified the FcPrimitiveSend flags. + * 01-25-01 01.01.04 Move InitiatorIndex in LinkServiceRsp reply to a larger + * field. + * Added FC_ABORT_TYPE_CT_SEND_REQUEST and + * FC_ABORT_TYPE_EXLINKSEND_REQUEST for FcAbort request. + * Added MPI_FC_PRIM_SEND_FLAGS_STOP_SEND. + * 02-20-01 01.01.05 Started using MPI_POINTER. + * 03-27-01 01.01.06 Added Flags field to MSG_LINK_SERVICE_BUFFER_POST_REPLY + * and defined MPI_LS_BUF_POST_REPLY_FLAG_NO_RSP_NEEDED. + * Added MPI_FC_PRIM_SEND_FLAGS_RESET_LINK define. + * Added structure offset comments. + * 04-09-01 01.01.07 Added RspLength field to MSG_LINK_SERVICE_RSP_REQUEST. + * 08-08-01 01.02.01 Original release for v1.2 work. + * 09-28-01 01.02.02 Change name of reserved field in + * MSG_LINK_SERVICE_RSP_REPLY. + * 05-31-02 01.02.03 Adding AliasIndex to FC Direct Access requests. + * 01-16-04 01.02.04 Added define for MPI_FC_PRIM_SEND_FLAGS_ML_RESET_LINK. + * 05-11-04 01.03.01 Original release for MPI v1.3. + * 08-19-04 01.05.01 Original release for MPI v1.5. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_FC_H +#define MPI_FC_H + + +/***************************************************************************** +* +* F C D i r e c t A c c e s s M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Link Service Buffer Post messages */ +/****************************************************************************/ + +typedef struct _MSG_LINK_SERVICE_BUFFER_POST_REQUEST +{ + U8 BufferPostFlags; /* 00h */ + U8 BufferCount; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved; /* 04h */ + U8 Reserved1; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + SGE_TRANS_SIMPLE_UNION SGL; +} MSG_LINK_SERVICE_BUFFER_POST_REQUEST, + MPI_POINTER PTR_MSG_LINK_SERVICE_BUFFER_POST_REQUEST, + LinkServiceBufferPostRequest_t, MPI_POINTER pLinkServiceBufferPostRequest_t; + +#define LINK_SERVICE_BUFFER_POST_FLAGS_PORT_MASK (0x01) + +typedef struct _WWNFORMAT +{ + U32 PortNameHigh; /* 00h */ + U32 PortNameLow; /* 04h */ + U32 NodeNameHigh; /* 08h */ + U32 NodeNameLow; /* 0Ch */ +} WWNFORMAT, + WwnFormat_t; + +/* Link Service Buffer Post Reply */ +typedef struct _MSG_LINK_SERVICE_BUFFER_POST_REPLY +{ + U8 Flags; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 PortNumber; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 TransferLength; /* 14h */ + U32 TransactionContext; /* 18h */ + U32 Rctl_Did; /* 1Ch */ + U32 Csctl_Sid; /* 20h */ + U32 Type_Fctl; /* 24h */ + U16 SeqCnt; /* 28h */ + U8 Dfctl; /* 2Ah */ + U8 SeqId; /* 2Bh */ + U16 Rxid; /* 2Ch */ + U16 Oxid; /* 2Eh */ + U32 Parameter; /* 30h */ + WWNFORMAT Wwn; /* 34h */ +} MSG_LINK_SERVICE_BUFFER_POST_REPLY, MPI_POINTER PTR_MSG_LINK_SERVICE_BUFFER_POST_REPLY, + LinkServiceBufferPostReply_t, MPI_POINTER pLinkServiceBufferPostReply_t; + +#define MPI_LS_BUF_POST_REPLY_FLAG_NO_RSP_NEEDED (0x80) + +#define MPI_FC_DID_MASK (0x00FFFFFF) +#define MPI_FC_DID_SHIFT (0) +#define MPI_FC_RCTL_MASK (0xFF000000) +#define MPI_FC_RCTL_SHIFT (24) +#define MPI_FC_SID_MASK (0x00FFFFFF) +#define MPI_FC_SID_SHIFT (0) +#define MPI_FC_CSCTL_MASK (0xFF000000) +#define MPI_FC_CSCTL_SHIFT (24) +#define MPI_FC_FCTL_MASK (0x00FFFFFF) +#define MPI_FC_FCTL_SHIFT (0) +#define MPI_FC_TYPE_MASK (0xFF000000) +#define MPI_FC_TYPE_SHIFT (24) + +/* obsolete name for the above */ +#define FCP_TARGET_DID_MASK (0x00FFFFFF) +#define FCP_TARGET_DID_SHIFT (0) +#define FCP_TARGET_RCTL_MASK (0xFF000000) +#define FCP_TARGET_RCTL_SHIFT (24) +#define FCP_TARGET_SID_MASK (0x00FFFFFF) +#define FCP_TARGET_SID_SHIFT (0) +#define FCP_TARGET_CSCTL_MASK (0xFF000000) +#define FCP_TARGET_CSCTL_SHIFT (24) +#define FCP_TARGET_FCTL_MASK (0x00FFFFFF) +#define FCP_TARGET_FCTL_SHIFT (0) +#define FCP_TARGET_TYPE_MASK (0xFF000000) +#define FCP_TARGET_TYPE_SHIFT (24) + + +/****************************************************************************/ +/* Link Service Response messages */ +/****************************************************************************/ + +typedef struct _MSG_LINK_SERVICE_RSP_REQUEST +{ + U8 RspFlags; /* 00h */ + U8 RspLength; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Rctl_Did; /* 0Ch */ + U32 Csctl_Sid; /* 10h */ + U32 Type_Fctl; /* 14h */ + U16 SeqCnt; /* 18h */ + U8 Dfctl; /* 1Ah */ + U8 SeqId; /* 1Bh */ + U16 Rxid; /* 1Ch */ + U16 Oxid; /* 1Eh */ + U32 Parameter; /* 20h */ + SGE_SIMPLE_UNION SGL; /* 24h */ +} MSG_LINK_SERVICE_RSP_REQUEST, MPI_POINTER PTR_MSG_LINK_SERVICE_RSP_REQUEST, + LinkServiceRspRequest_t, MPI_POINTER pLinkServiceRspRequest_t; + +#define LINK_SERVICE_RSP_FLAGS_IMMEDIATE (0x80) +#define LINK_SERVICE_RSP_FLAGS_PORT_MASK (0x01) + + +/* Link Service Response Reply */ +typedef struct _MSG_LINK_SERVICE_RSP_REPLY +{ + U16 Reserved; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved_0100_InitiatorIndex; /* 06h */ /* obsolete InitiatorIndex */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 InitiatorIndex; /* 14h */ +} MSG_LINK_SERVICE_RSP_REPLY, MPI_POINTER PTR_MSG_LINK_SERVICE_RSP_REPLY, + LinkServiceRspReply_t, MPI_POINTER pLinkServiceRspReply_t; + + +/****************************************************************************/ +/* Extended Link Service Send messages */ +/****************************************************************************/ + +typedef struct _MSG_EXLINK_SERVICE_SEND_REQUEST +{ + U8 SendFlags; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U32 MsgFlags_Did; /* 04h */ + U32 MsgContext; /* 08h */ + U32 ElsCommandCode; /* 0Ch */ + SGE_SIMPLE_UNION SGL; /* 10h */ +} MSG_EXLINK_SERVICE_SEND_REQUEST, MPI_POINTER PTR_MSG_EXLINK_SERVICE_SEND_REQUEST, + ExLinkServiceSendRequest_t, MPI_POINTER pExLinkServiceSendRequest_t; + +#define EX_LINK_SERVICE_SEND_DID_MASK (0x00FFFFFF) +#define EX_LINK_SERVICE_SEND_DID_SHIFT (0) +#define EX_LINK_SERVICE_SEND_MSGFLAGS_MASK (0xFF000000) +#define EX_LINK_SERVICE_SEND_MSGFLAGS_SHIFT (24) + + +/* Extended Link Service Send Reply */ +typedef struct _MSG_EXLINK_SERVICE_SEND_REPLY +{ + U8 Reserved; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 ResponseLength; /* 14h */ +} MSG_EXLINK_SERVICE_SEND_REPLY, MPI_POINTER PTR_MSG_EXLINK_SERVICE_SEND_REPLY, + ExLinkServiceSendReply_t, MPI_POINTER pExLinkServiceSendReply_t; + +/****************************************************************************/ +/* FC Abort messages */ +/****************************************************************************/ + +typedef struct _MSG_FC_ABORT_REQUEST +{ + U8 AbortFlags; /* 00h */ + U8 AbortType; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 TransactionContextToAbort; /* 0Ch */ +} MSG_FC_ABORT_REQUEST, MPI_POINTER PTR_MSG_FC_ABORT_REQUEST, + FcAbortRequest_t, MPI_POINTER pFcAbortRequest_t; + +#define FC_ABORT_FLAG_PORT_MASK (0x01) + +#define FC_ABORT_TYPE_ALL_FC_BUFFERS (0x00) +#define FC_ABORT_TYPE_EXACT_FC_BUFFER (0x01) +#define FC_ABORT_TYPE_CT_SEND_REQUEST (0x02) +#define FC_ABORT_TYPE_EXLINKSEND_REQUEST (0x03) + +/* FC Abort Reply */ +typedef struct _MSG_FC_ABORT_REPLY +{ + U16 Reserved; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_FC_ABORT_REPLY, MPI_POINTER PTR_MSG_FC_ABORT_REPLY, + FcAbortReply_t, MPI_POINTER pFcAbortReply_t; + + +/****************************************************************************/ +/* FC Common Transport Send messages */ +/****************************************************************************/ + +typedef struct _MSG_FC_COMMON_TRANSPORT_SEND_REQUEST +{ + U8 SendFlags; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U32 MsgFlags_Did; /* 04h */ + U32 MsgContext; /* 08h */ + U16 CTCommandCode; /* 0Ch */ + U8 FsType; /* 0Eh */ + U8 Reserved1; /* 0Fh */ + SGE_SIMPLE_UNION SGL; /* 10h */ +} MSG_FC_COMMON_TRANSPORT_SEND_REQUEST, + MPI_POINTER PTR_MSG_FC_COMMON_TRANSPORT_SEND_REQUEST, + FcCommonTransportSendRequest_t, MPI_POINTER pFcCommonTransportSendRequest_t; + +#define MPI_FC_CT_SEND_DID_MASK (0x00FFFFFF) +#define MPI_FC_CT_SEND_DID_SHIFT (0) +#define MPI_FC_CT_SEND_MSGFLAGS_MASK (0xFF000000) +#define MPI_FC_CT_SEND_MSGFLAGS_SHIFT (24) + + +/* FC Common Transport Send Reply */ +typedef struct _MSG_FC_COMMON_TRANSPORT_SEND_REPLY +{ + U8 Reserved; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 ResponseLength; /* 14h */ +} MSG_FC_COMMON_TRANSPORT_SEND_REPLY, MPI_POINTER PTR_MSG_FC_COMMON_TRANSPORT_SEND_REPLY, + FcCommonTransportSendReply_t, MPI_POINTER pFcCommonTransportSendReply_t; + + +/****************************************************************************/ +/* FC Primitive Send messages */ +/****************************************************************************/ + +typedef struct _MSG_FC_PRIMITIVE_SEND_REQUEST +{ + U8 SendFlags; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 FcPrimitive[4]; /* 0Ch */ +} MSG_FC_PRIMITIVE_SEND_REQUEST, MPI_POINTER PTR_MSG_FC_PRIMITIVE_SEND_REQUEST, + FcPrimitiveSendRequest_t, MPI_POINTER pFcPrimitiveSendRequest_t; + +#define MPI_FC_PRIM_SEND_FLAGS_PORT_MASK (0x01) +#define MPI_FC_PRIM_SEND_FLAGS_ML_RESET_LINK (0x02) +#define MPI_FC_PRIM_SEND_FLAGS_RESET_LINK (0x04) +#define MPI_FC_PRIM_SEND_FLAGS_STOP_SEND (0x08) +#define MPI_FC_PRIM_SEND_FLAGS_SEND_ONCE (0x10) +#define MPI_FC_PRIM_SEND_FLAGS_SEND_AROUND (0x20) +#define MPI_FC_PRIM_SEND_FLAGS_UNTIL_FULL (0x40) +#define MPI_FC_PRIM_SEND_FLAGS_FOREVER (0x80) + +/* FC Primitive Send Reply */ +typedef struct _MSG_FC_PRIMITIVE_SEND_REPLY +{ + U8 SendFlags; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_FC_PRIMITIVE_SEND_REPLY, MPI_POINTER PTR_MSG_FC_PRIMITIVE_SEND_REPLY, + FcPrimitiveSendReply_t, MPI_POINTER pFcPrimitiveSendReply_t; + +#endif + diff --git a/source/lsi/mpi_init.h b/source/lsi/mpi_init.h new file mode 100755 index 0000000..7d2ec74 --- /dev/null +++ b/source/lsi/mpi_init.h @@ -0,0 +1,580 @@ +/* + * Copyright (c) 2000-2008 LSI Corporation. + * + * + * Name: mpi_init.h + * Title: MPI initiator mode messages and structures + * Creation Date: June 8, 2000 + * + * mpi_init.h Version: 01.05.09 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-08-00 00.10.01 Original release for 0.10 spec dated 4/26/2000. + * 05-24-00 00.10.02 Added SenseBufferLength to _MSG_SCSI_IO_REPLY. + * 06-06-00 01.00.01 Update version number for 1.0 release. + * 06-08-00 01.00.02 Added MPI_SCSI_RSP_INFO_ definitions. + * 11-02-00 01.01.01 Original release for post 1.0 work. + * 12-04-00 01.01.02 Added MPI_SCSIIO_CONTROL_NO_DISCONNECT. + * 02-20-01 01.01.03 Started using MPI_POINTER. + * 03-27-01 01.01.04 Added structure offset comments. + * 04-10-01 01.01.05 Added new MsgFlag for MSG_SCSI_TASK_MGMT. + * 08-08-01 01.02.01 Original release for v1.2 work. + * 08-29-01 01.02.02 Added MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET. + * Added MPI_SCSI_STATE_QUEUE_TAG_REJECTED for + * MSG_SCSI_IO_REPLY. + * 09-28-01 01.02.03 Added structures and defines for SCSI Enclosure + * Processor messages. + * 10-04-01 01.02.04 Added defines for SEP request Action field. + * 05-31-02 01.02.05 Added MPI_SCSIIO_MSGFLGS_CMD_DETERMINES_DATA_DIR define + * for SCSI IO requests. + * 11-15-02 01.02.06 Added special extended SCSI Status defines for FCP. + * 06-26-03 01.02.07 Added MPI_SCSI_STATUS_FCPEXT_UNASSIGNED define. + * 05-11-04 01.03.01 Original release for MPI v1.3. + * 08-19-04 01.05.01 Added MsgFlags defines for EEDP to SCSI IO request. + * Added new word to MSG_SCSI_IO_REPLY to add TaskTag field + * and a reserved U16. + * Added new MSG_SCSI_IO32_REQUEST structure. + * Added a TaskType of Clear Task Set to SCSI + * Task Management request. + * 12-07-04 01.05.02 Added support for Task Management Query Task. + * 01-15-05 01.05.03 Modified SCSI Enclosure Processor Request to support + * WWID addressing. + * 03-11-05 01.05.04 Removed EEDP flags from SCSI IO Request. + * Removed SCSI IO 32 Request. + * Modified SCSI Enclosure Processor Request and Reply to + * support Enclosure/Slot addressing rather than WWID + * addressing. + * 06-24-05 01.05.05 Added SCSI IO 32 structures and defines. + * Added four new defines for SEP SlotStatus. + * 08-03-05 01.05.06 Fixed some MPI_SCSIIO32_MSGFLGS_ defines to make them + * unique in the first 32 characters. + * 03-27-06 01.05.07 Added Task Management type of Clear ACA. + * 10-11-06 01.05.08 Shortened define for Task Management type of Clear ACA. + * 02-28-07 01.05.09 Defined two new MsgFlags bits for SCSI Task Management + * Request: Do Not Send Task IU and Soft Reset Option. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_INIT_H +#define MPI_INIT_H + + +/***************************************************************************** +* +* S C S I I n i t i a t o r M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* SCSI IO messages and associated structures */ +/****************************************************************************/ + +typedef struct _MSG_SCSI_IO_REQUEST +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 CDBLength; /* 04h */ + U8 SenseBufferLength; /* 05h */ + U8 AliasIndex; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 LUN[8]; /* 0Ch */ + U32 Control; /* 14h */ + U8 CDB[16]; /* 18h */ + U32 DataLength; /* 28h */ + U32 SenseBufferLowAddr; /* 2Ch */ + SGE_IO_UNION SGL; /* 30h */ +} MSG_SCSI_IO_REQUEST, MPI_POINTER PTR_MSG_SCSI_IO_REQUEST, + SCSIIORequest_t, MPI_POINTER pSCSIIORequest_t; + + +/* SCSI IO MsgFlags bits */ + +#define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH (0x01) +#define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32 (0x00) +#define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64 (0x01) + +#define MPI_SCSIIO_MSGFLGS_SENSE_LOCATION (0x02) +#define MPI_SCSIIO_MSGFLGS_SENSE_LOC_HOST (0x00) +#define MPI_SCSIIO_MSGFLGS_SENSE_LOC_IOC (0x02) + +#define MPI_SCSIIO_MSGFLGS_CMD_DETERMINES_DATA_DIR (0x04) + +/* SCSI IO LUN fields */ + +#define MPI_SCSIIO_LUN_FIRST_LEVEL_ADDRESSING (0x0000FFFF) +#define MPI_SCSIIO_LUN_SECOND_LEVEL_ADDRESSING (0xFFFF0000) +#define MPI_SCSIIO_LUN_THIRD_LEVEL_ADDRESSING (0x0000FFFF) +#define MPI_SCSIIO_LUN_FOURTH_LEVEL_ADDRESSING (0xFFFF0000) +#define MPI_SCSIIO_LUN_LEVEL_1_WORD (0xFF00) +#define MPI_SCSIIO_LUN_LEVEL_1_DWORD (0x0000FF00) + +/* SCSI IO Control bits */ + +#define MPI_SCSIIO_CONTROL_DATADIRECTION_MASK (0x03000000) +#define MPI_SCSIIO_CONTROL_NODATATRANSFER (0x00000000) +#define MPI_SCSIIO_CONTROL_WRITE (0x01000000) +#define MPI_SCSIIO_CONTROL_READ (0x02000000) + +#define MPI_SCSIIO_CONTROL_ADDCDBLEN_MASK (0x3C000000) +#define MPI_SCSIIO_CONTROL_ADDCDBLEN_SHIFT (26) + +#define MPI_SCSIIO_CONTROL_TASKATTRIBUTE_MASK (0x00000700) +#define MPI_SCSIIO_CONTROL_SIMPLEQ (0x00000000) +#define MPI_SCSIIO_CONTROL_HEADOFQ (0x00000100) +#define MPI_SCSIIO_CONTROL_ORDEREDQ (0x00000200) +#define MPI_SCSIIO_CONTROL_ACAQ (0x00000400) +#define MPI_SCSIIO_CONTROL_UNTAGGED (0x00000500) +#define MPI_SCSIIO_CONTROL_NO_DISCONNECT (0x00000700) + +#define MPI_SCSIIO_CONTROL_TASKMANAGE_MASK (0x00FF0000) +#define MPI_SCSIIO_CONTROL_OBSOLETE (0x00800000) +#define MPI_SCSIIO_CONTROL_CLEAR_ACA_RSV (0x00400000) +#define MPI_SCSIIO_CONTROL_TARGET_RESET (0x00200000) +#define MPI_SCSIIO_CONTROL_LUN_RESET_RSV (0x00100000) +#define MPI_SCSIIO_CONTROL_RESERVED (0x00080000) +#define MPI_SCSIIO_CONTROL_CLR_TASK_SET_RSV (0x00040000) +#define MPI_SCSIIO_CONTROL_ABORT_TASK_SET (0x00020000) +#define MPI_SCSIIO_CONTROL_RESERVED2 (0x00010000) + + +/* SCSI IO reply structure */ +typedef struct _MSG_SCSI_IO_REPLY +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 CDBLength; /* 04h */ + U8 SenseBufferLength; /* 05h */ + U8 AliasIndex; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 SCSIStatus; /* 0Ch */ + U8 SCSIState; /* 0Dh */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 TransferCount; /* 14h */ + U32 SenseCount; /* 18h */ + U32 ResponseInfo; /* 1Ch */ + U16 TaskTag; /* 20h */ + U16 Reserved1; /* 22h */ +} MSG_SCSI_IO_REPLY, MPI_POINTER PTR_MSG_SCSI_IO_REPLY, + SCSIIOReply_t, MPI_POINTER pSCSIIOReply_t; + + +/* SCSI IO Reply SCSIStatus values (SAM-2 status codes) */ + +#define MPI_SCSI_STATUS_SUCCESS (0x00) +#define MPI_SCSI_STATUS_CHECK_CONDITION (0x02) +#define MPI_SCSI_STATUS_CONDITION_MET (0x04) +#define MPI_SCSI_STATUS_BUSY (0x08) +#define MPI_SCSI_STATUS_INTERMEDIATE (0x10) +#define MPI_SCSI_STATUS_INTERMEDIATE_CONDMET (0x14) +#define MPI_SCSI_STATUS_RESERVATION_CONFLICT (0x18) +#define MPI_SCSI_STATUS_COMMAND_TERMINATED (0x22) +#define MPI_SCSI_STATUS_TASK_SET_FULL (0x28) +#define MPI_SCSI_STATUS_ACA_ACTIVE (0x30) + +#define MPI_SCSI_STATUS_FCPEXT_DEVICE_LOGGED_OUT (0x80) +#define MPI_SCSI_STATUS_FCPEXT_NO_LINK (0x81) +#define MPI_SCSI_STATUS_FCPEXT_UNASSIGNED (0x82) + + +/* SCSI IO Reply SCSIState values */ + +#define MPI_SCSI_STATE_AUTOSENSE_VALID (0x01) +#define MPI_SCSI_STATE_AUTOSENSE_FAILED (0x02) +#define MPI_SCSI_STATE_NO_SCSI_STATUS (0x04) +#define MPI_SCSI_STATE_TERMINATED (0x08) +#define MPI_SCSI_STATE_RESPONSE_INFO_VALID (0x10) +#define MPI_SCSI_STATE_QUEUE_TAG_REJECTED (0x20) + +/* SCSI IO Reply ResponseInfo values */ +/* (FCP-1 RSP_CODE values and SPI-3 Packetized Failure codes) */ + +#define MPI_SCSI_RSP_INFO_FUNCTION_COMPLETE (0x00000000) +#define MPI_SCSI_RSP_INFO_FCP_BURST_LEN_ERROR (0x01000000) +#define MPI_SCSI_RSP_INFO_CMND_FIELDS_INVALID (0x02000000) +#define MPI_SCSI_RSP_INFO_FCP_DATA_RO_ERROR (0x03000000) +#define MPI_SCSI_RSP_INFO_TASK_MGMT_UNSUPPORTED (0x04000000) +#define MPI_SCSI_RSP_INFO_TASK_MGMT_FAILED (0x05000000) +#define MPI_SCSI_RSP_INFO_SPI_LQ_INVALID_TYPE (0x06000000) + +#define MPI_SCSI_TASKTAG_UNKNOWN (0xFFFF) + + +/****************************************************************************/ +/* SCSI IO 32 messages and associated structures */ +/****************************************************************************/ + +typedef struct +{ + U8 CDB[20]; /* 00h */ + U32 PrimaryReferenceTag; /* 14h */ + U16 PrimaryApplicationTag; /* 18h */ + U16 PrimaryApplicationTagMask; /* 1Ah */ + U32 TransferLength; /* 1Ch */ +} MPI_SCSI_IO32_CDB_EEDP32, MPI_POINTER PTR_MPI_SCSI_IO32_CDB_EEDP32, + MpiScsiIo32CdbEedp32_t, MPI_POINTER pMpiScsiIo32CdbEedp32_t; + +typedef struct +{ + U8 CDB[16]; /* 00h */ + U32 DataLength; /* 10h */ + U32 PrimaryReferenceTag; /* 14h */ + U16 PrimaryApplicationTag; /* 18h */ + U16 PrimaryApplicationTagMask; /* 1Ah */ + U32 TransferLength; /* 1Ch */ +} MPI_SCSI_IO32_CDB_EEDP16, MPI_POINTER PTR_MPI_SCSI_IO32_CDB_EEDP16, + MpiScsiIo32CdbEedp16_t, MPI_POINTER pMpiScsiIo32CdbEedp16_t; + +typedef union +{ + U8 CDB32[32]; + MPI_SCSI_IO32_CDB_EEDP32 EEDP32; + MPI_SCSI_IO32_CDB_EEDP16 EEDP16; + SGE_SIMPLE_UNION SGE; +} MPI_SCSI_IO32_CDB_UNION, MPI_POINTER PTR_MPI_SCSI_IO32_CDB_UNION, + MpiScsiIo32Cdb_t, MPI_POINTER pMpiScsiIo32Cdb_t; + +typedef struct +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U16 Reserved1; /* 02h */ + U32 Reserved2; /* 04h */ +} MPI_SCSI_IO32_BUS_TARGET_ID_FORM, MPI_POINTER PTR_MPI_SCSI_IO32_BUS_TARGET_ID_FORM, + MpiScsiIo32BusTargetIdForm_t, MPI_POINTER pMpiScsiIo32BusTargetIdForm_t; + +typedef union +{ + MPI_SCSI_IO32_BUS_TARGET_ID_FORM SCSIID; + U64 WWID; +} MPI_SCSI_IO32_ADDRESS, MPI_POINTER PTR_MPI_SCSI_IO32_ADDRESS, + MpiScsiIo32Address_t, MPI_POINTER pMpiScsiIo32Address_t; + +typedef struct _MSG_SCSI_IO32_REQUEST +{ + U8 Port; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 CDBLength; /* 04h */ + U8 SenseBufferLength; /* 05h */ + U8 Flags; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 LUN[8]; /* 0Ch */ + U32 Control; /* 14h */ + MPI_SCSI_IO32_CDB_UNION CDB; /* 18h */ + U32 DataLength; /* 38h */ + U32 BidirectionalDataLength; /* 3Ch */ + U32 SecondaryReferenceTag; /* 40h */ + U16 SecondaryApplicationTag; /* 44h */ + U16 Reserved2; /* 46h */ + U16 EEDPFlags; /* 48h */ + U16 ApplicationTagTranslationMask; /* 4Ah */ + U32 EEDPBlockSize; /* 4Ch */ + MPI_SCSI_IO32_ADDRESS DeviceAddress; /* 50h */ + U8 SGLOffset0; /* 58h */ + U8 SGLOffset1; /* 59h */ + U8 SGLOffset2; /* 5Ah */ + U8 SGLOffset3; /* 5Bh */ + U32 Reserved3; /* 5Ch */ + U32 Reserved4; /* 60h */ + U32 SenseBufferLowAddr; /* 64h */ + SGE_IO_UNION SGL; /* 68h */ +} MSG_SCSI_IO32_REQUEST, MPI_POINTER PTR_MSG_SCSI_IO32_REQUEST, + SCSIIO32Request_t, MPI_POINTER pSCSIIO32Request_t; + +/* SCSI IO 32 MsgFlags bits */ +#define MPI_SCSIIO32_MSGFLGS_SENSE_WIDTH (0x01) +#define MPI_SCSIIO32_MSGFLGS_32_SENSE_WIDTH (0x00) +#define MPI_SCSIIO32_MSGFLGS_64_SENSE_WIDTH (0x01) + +#define MPI_SCSIIO32_MSGFLGS_SENSE_LOCATION (0x02) +#define MPI_SCSIIO32_MSGFLGS_SENSE_LOC_HOST (0x00) +#define MPI_SCSIIO32_MSGFLGS_SENSE_LOC_IOC (0x02) + +#define MPI_SCSIIO32_MSGFLGS_CMD_DETERMINES_DATA_DIR (0x04) +#define MPI_SCSIIO32_MSGFLGS_SGL_OFFSETS_CHAINS (0x08) +#define MPI_SCSIIO32_MSGFLGS_MULTICAST (0x10) +#define MPI_SCSIIO32_MSGFLGS_BIDIRECTIONAL (0x20) +#define MPI_SCSIIO32_MSGFLGS_LARGE_CDB (0x40) + +/* SCSI IO 32 Flags bits */ +#define MPI_SCSIIO32_FLAGS_FORM_MASK (0x03) +#define MPI_SCSIIO32_FLAGS_FORM_SCSIID (0x00) +#define MPI_SCSIIO32_FLAGS_FORM_WWID (0x01) + +/* SCSI IO 32 LUN fields */ +#define MPI_SCSIIO32_LUN_FIRST_LEVEL_ADDRESSING (0x0000FFFF) +#define MPI_SCSIIO32_LUN_SECOND_LEVEL_ADDRESSING (0xFFFF0000) +#define MPI_SCSIIO32_LUN_THIRD_LEVEL_ADDRESSING (0x0000FFFF) +#define MPI_SCSIIO32_LUN_FOURTH_LEVEL_ADDRESSING (0xFFFF0000) +#define MPI_SCSIIO32_LUN_LEVEL_1_WORD (0xFF00) +#define MPI_SCSIIO32_LUN_LEVEL_1_DWORD (0x0000FF00) + +/* SCSI IO 32 Control bits */ +#define MPI_SCSIIO32_CONTROL_DATADIRECTION_MASK (0x03000000) +#define MPI_SCSIIO32_CONTROL_NODATATRANSFER (0x00000000) +#define MPI_SCSIIO32_CONTROL_WRITE (0x01000000) +#define MPI_SCSIIO32_CONTROL_READ (0x02000000) +#define MPI_SCSIIO32_CONTROL_BIDIRECTIONAL (0x03000000) + +#define MPI_SCSIIO32_CONTROL_ADDCDBLEN_MASK (0xFC000000) +#define MPI_SCSIIO32_CONTROL_ADDCDBLEN_SHIFT (26) + +#define MPI_SCSIIO32_CONTROL_TASKATTRIBUTE_MASK (0x00000700) +#define MPI_SCSIIO32_CONTROL_SIMPLEQ (0x00000000) +#define MPI_SCSIIO32_CONTROL_HEADOFQ (0x00000100) +#define MPI_SCSIIO32_CONTROL_ORDEREDQ (0x00000200) +#define MPI_SCSIIO32_CONTROL_ACAQ (0x00000400) +#define MPI_SCSIIO32_CONTROL_UNTAGGED (0x00000500) +#define MPI_SCSIIO32_CONTROL_NO_DISCONNECT (0x00000700) + +#define MPI_SCSIIO32_CONTROL_TASKMANAGE_MASK (0x00FF0000) +#define MPI_SCSIIO32_CONTROL_OBSOLETE (0x00800000) +#define MPI_SCSIIO32_CONTROL_CLEAR_ACA_RSV (0x00400000) +#define MPI_SCSIIO32_CONTROL_TARGET_RESET (0x00200000) +#define MPI_SCSIIO32_CONTROL_LUN_RESET_RSV (0x00100000) +#define MPI_SCSIIO32_CONTROL_RESERVED (0x00080000) +#define MPI_SCSIIO32_CONTROL_CLR_TASK_SET_RSV (0x00040000) +#define MPI_SCSIIO32_CONTROL_ABORT_TASK_SET (0x00020000) +#define MPI_SCSIIO32_CONTROL_RESERVED2 (0x00010000) + +/* SCSI IO 32 EEDPFlags */ +#define MPI_SCSIIO32_EEDPFLAGS_MASK_OP (0x0007) +#define MPI_SCSIIO32_EEDPFLAGS_NOOP_OP (0x0000) +#define MPI_SCSIIO32_EEDPFLAGS_CHK_OP (0x0001) +#define MPI_SCSIIO32_EEDPFLAGS_STRIP_OP (0x0002) +#define MPI_SCSIIO32_EEDPFLAGS_CHKRM_OP (0x0003) +#define MPI_SCSIIO32_EEDPFLAGS_INSERT_OP (0x0004) +#define MPI_SCSIIO32_EEDPFLAGS_REPLACE_OP (0x0006) +#define MPI_SCSIIO32_EEDPFLAGS_CHKREGEN_OP (0x0007) + +#define MPI_SCSIIO32_EEDPFLAGS_PASS_REF_TAG (0x0008) +#define MPI_SCSIIO32_EEDPFLAGS_8_9THS_MODE (0x0010) + +#define MPI_SCSIIO32_EEDPFLAGS_T10_CHK_MASK (0x0700) +#define MPI_SCSIIO32_EEDPFLAGS_T10_CHK_GUARD (0x0100) +#define MPI_SCSIIO32_EEDPFLAGS_T10_CHK_REFTAG (0x0200) +#define MPI_SCSIIO32_EEDPFLAGS_T10_CHK_LBATAG (0x0400) +#define MPI_SCSIIO32_EEDPFLAGS_T10_CHK_SHIFT (8) + +#define MPI_SCSIIO32_EEDPFLAGS_INC_SEC_APPTAG (0x1000) +#define MPI_SCSIIO32_EEDPFLAGS_INC_PRI_APPTAG (0x2000) +#define MPI_SCSIIO32_EEDPFLAGS_INC_SEC_REFTAG (0x4000) +#define MPI_SCSIIO32_EEDPFLAGS_INC_PRI_REFTAG (0x8000) + + +/* SCSIIO32 IO reply structure */ +typedef struct _MSG_SCSIIO32_IO_REPLY +{ + U8 Port; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 CDBLength; /* 04h */ + U8 SenseBufferLength; /* 05h */ + U8 Flags; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 SCSIStatus; /* 0Ch */ + U8 SCSIState; /* 0Dh */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 TransferCount; /* 14h */ + U32 SenseCount; /* 18h */ + U32 ResponseInfo; /* 1Ch */ + U16 TaskTag; /* 20h */ + U16 Reserved2; /* 22h */ + U32 BidirectionalTransferCount; /* 24h */ +} MSG_SCSIIO32_IO_REPLY, MPI_POINTER PTR_MSG_SCSIIO32_IO_REPLY, + SCSIIO32Reply_t, MPI_POINTER pSCSIIO32Reply_t; + + +/****************************************************************************/ +/* SCSI Task Management messages */ +/****************************************************************************/ + +typedef struct _MSG_SCSI_TASK_MGMT +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved; /* 04h */ + U8 TaskType; /* 05h */ + U8 AliasIndex; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 LUN[8]; /* 0Ch */ + U32 Reserved2[7]; /* 14h */ + U32 TaskMsgContext; /* 30h */ +} MSG_SCSI_TASK_MGMT, MPI_POINTER PTR_SCSI_TASK_MGMT, + SCSITaskMgmt_t, MPI_POINTER pSCSITaskMgmt_t; + +/* TaskType values */ + +#define MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK (0x01) +#define MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET (0x02) +#define MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET (0x03) +#define MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS (0x04) +#define MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05) +#define MPI_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06) +#define MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07) +#define MPI_SCSITASKMGMT_TASKTYPE_CLR_ACA (0x08) + +/* MsgFlags bits */ +#define MPI_SCSITASKMGMT_MSGFLAGS_DO_NOT_SEND_TASK_IU (0x01) + +#define MPI_SCSITASKMGMT_MSGFLAGS_TARGET_RESET_OPTION (0x00) +#define MPI_SCSITASKMGMT_MSGFLAGS_LIP_RESET_OPTION (0x02) +#define MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION (0x04) + +#define MPI_SCSITASKMGMT_MSGFLAGS_SOFT_RESET_OPTION (0x08) + +/* SCSI Task Management Reply */ +typedef struct _MSG_SCSI_TASK_MGMT_REPLY +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 ResponseCode; /* 04h */ + U8 TaskType; /* 05h */ + U8 AliasIndex; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Reserved2[2]; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 TerminationCount; /* 14h */ +} MSG_SCSI_TASK_MGMT_REPLY, MPI_POINTER PTR_MSG_SCSI_TASK_MGMT_REPLY, + SCSITaskMgmtReply_t, MPI_POINTER pSCSITaskMgmtReply_t; + +/* ResponseCode values */ +#define MPI_SCSITASKMGMT_RSP_TM_COMPLETE (0x00) +#define MPI_SCSITASKMGMT_RSP_INVALID_FRAME (0x02) +#define MPI_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED (0x04) +#define MPI_SCSITASKMGMT_RSP_TM_FAILED (0x05) +#define MPI_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08) +#define MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09) +#define MPI_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80) + + +/****************************************************************************/ +/* SCSI Enclosure Processor messages */ +/****************************************************************************/ + +typedef struct _MSG_SEP_REQUEST +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Action; /* 04h */ + U8 Flags; /* 05h */ + U8 Reserved1; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 SlotStatus; /* 0Ch */ + U32 Reserved2; /* 10h */ + U32 Reserved3; /* 14h */ + U32 Reserved4; /* 18h */ + U16 Slot; /* 1Ch */ + U16 EnclosureHandle; /* 1Eh */ +} MSG_SEP_REQUEST, MPI_POINTER PTR_MSG_SEP_REQUEST, + SEPRequest_t, MPI_POINTER pSEPRequest_t; + +/* Action defines */ +#define MPI_SEP_REQ_ACTION_WRITE_STATUS (0x00) +#define MPI_SEP_REQ_ACTION_READ_STATUS (0x01) + +/* Flags defines */ +#define MPI_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS (0x01) +#define MPI_SEP_REQ_FLAGS_BUS_TARGETID_ADDRESS (0x00) + +/* SlotStatus bits for MSG_SEP_REQUEST */ +#define MPI_SEP_REQ_SLOTSTATUS_NO_ERROR (0x00000001) +#define MPI_SEP_REQ_SLOTSTATUS_DEV_FAULTY (0x00000002) +#define MPI_SEP_REQ_SLOTSTATUS_DEV_REBUILDING (0x00000004) +#define MPI_SEP_REQ_SLOTSTATUS_IN_FAILED_ARRAY (0x00000008) +#define MPI_SEP_REQ_SLOTSTATUS_IN_CRITICAL_ARRAY (0x00000010) +#define MPI_SEP_REQ_SLOTSTATUS_PARITY_CHECK (0x00000020) +#define MPI_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT (0x00000040) +#define MPI_SEP_REQ_SLOTSTATUS_UNCONFIGURED (0x00000080) +#define MPI_SEP_REQ_SLOTSTATUS_HOT_SPARE (0x00000100) +#define MPI_SEP_REQ_SLOTSTATUS_REBUILD_STOPPED (0x00000200) +#define MPI_SEP_REQ_SLOTSTATUS_REQ_CONSISTENCY_CHECK (0x00001000) +#define MPI_SEP_REQ_SLOTSTATUS_DISABLE (0x00002000) +#define MPI_SEP_REQ_SLOTSTATUS_REQ_RESERVED_DEVICE (0x00004000) +#define MPI_SEP_REQ_SLOTSTATUS_IDENTIFY_REQUEST (0x00020000) +#define MPI_SEP_REQ_SLOTSTATUS_REQUEST_REMOVE (0x00040000) +#define MPI_SEP_REQ_SLOTSTATUS_REQUEST_INSERT (0x00080000) +#define MPI_SEP_REQ_SLOTSTATUS_DO_NOT_MOVE (0x00400000) +#define MPI_SEP_REQ_SLOTSTATUS_ACTIVE (0x00800000) +#define MPI_SEP_REQ_SLOTSTATUS_B_ENABLE_BYPASS (0x04000000) +#define MPI_SEP_REQ_SLOTSTATUS_A_ENABLE_BYPASS (0x08000000) +#define MPI_SEP_REQ_SLOTSTATUS_DEV_OFF (0x10000000) +#define MPI_SEP_REQ_SLOTSTATUS_SWAP_RESET (0x80000000) + + +typedef struct _MSG_SEP_REPLY +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Action; /* 04h */ + U8 Reserved1; /* 05h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 SlotStatus; /* 14h */ + U32 Reserved4; /* 18h */ + U16 Slot; /* 1Ch */ + U16 EnclosureHandle; /* 1Eh */ +} MSG_SEP_REPLY, MPI_POINTER PTR_MSG_SEP_REPLY, + SEPReply_t, MPI_POINTER pSEPReply_t; + +/* SlotStatus bits for MSG_SEP_REPLY */ +#define MPI_SEP_REPLY_SLOTSTATUS_NO_ERROR (0x00000001) +#define MPI_SEP_REPLY_SLOTSTATUS_DEV_FAULTY (0x00000002) +#define MPI_SEP_REPLY_SLOTSTATUS_DEV_REBUILDING (0x00000004) +#define MPI_SEP_REPLY_SLOTSTATUS_IN_FAILED_ARRAY (0x00000008) +#define MPI_SEP_REPLY_SLOTSTATUS_IN_CRITICAL_ARRAY (0x00000010) +#define MPI_SEP_REPLY_SLOTSTATUS_PARITY_CHECK (0x00000020) +#define MPI_SEP_REPLY_SLOTSTATUS_PREDICTED_FAULT (0x00000040) +#define MPI_SEP_REPLY_SLOTSTATUS_UNCONFIGURED (0x00000080) +#define MPI_SEP_REPLY_SLOTSTATUS_HOT_SPARE (0x00000100) +#define MPI_SEP_REPLY_SLOTSTATUS_REBUILD_STOPPED (0x00000200) +#define MPI_SEP_REPLY_SLOTSTATUS_CONSISTENCY_CHECK (0x00001000) +#define MPI_SEP_REPLY_SLOTSTATUS_DISABLE (0x00002000) +#define MPI_SEP_REPLY_SLOTSTATUS_RESERVED_DEVICE (0x00004000) +#define MPI_SEP_REPLY_SLOTSTATUS_REPORT (0x00010000) +#define MPI_SEP_REPLY_SLOTSTATUS_IDENTIFY_REQUEST (0x00020000) +#define MPI_SEP_REPLY_SLOTSTATUS_REMOVE_READY (0x00040000) +#define MPI_SEP_REPLY_SLOTSTATUS_INSERT_READY (0x00080000) +#define MPI_SEP_REPLY_SLOTSTATUS_DO_NOT_REMOVE (0x00400000) +#define MPI_SEP_REPLY_SLOTSTATUS_ACTIVE (0x00800000) +#define MPI_SEP_REPLY_SLOTSTATUS_B_BYPASS_ENABLED (0x01000000) +#define MPI_SEP_REPLY_SLOTSTATUS_A_BYPASS_ENABLED (0x02000000) +#define MPI_SEP_REPLY_SLOTSTATUS_B_ENABLE_BYPASS (0x04000000) +#define MPI_SEP_REPLY_SLOTSTATUS_A_ENABLE_BYPASS (0x08000000) +#define MPI_SEP_REPLY_SLOTSTATUS_DEV_OFF (0x10000000) +#define MPI_SEP_REPLY_SLOTSTATUS_FAULT_SENSED (0x40000000) +#define MPI_SEP_REPLY_SLOTSTATUS_SWAPPED (0x80000000) + +#endif diff --git a/source/lsi/mpi_ioc.h b/source/lsi/mpi_ioc.h new file mode 100755 index 0000000..fc561fe --- /dev/null +++ b/source/lsi/mpi_ioc.h @@ -0,0 +1,1206 @@ +/* + * Copyright (c) 2000-2008 LSI Corporation. + * + * + * Name: mpi_ioc.h + * Title: MPI IOC, Port, Event, FW Download, and FW Upload messages + * Creation Date: August 11, 2000 + * + * mpi_ioc.h Version: 01.05.16 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-08-00 00.10.01 Original release for 0.10 spec dated 4/26/2000. + * 05-24-00 00.10.02 Added _MSG_IOC_INIT_REPLY structure. + * 06-06-00 01.00.01 Added CurReplyFrameSize field to _MSG_IOC_FACTS_REPLY. + * 06-12-00 01.00.02 Added _MSG_PORT_ENABLE_REPLY structure. + * Added _MSG_EVENT_ACK_REPLY structure. + * Added _MSG_FW_DOWNLOAD_REPLY structure. + * Added _MSG_TOOLBOX_REPLY structure. + * 06-30-00 01.00.03 Added MaxLanBuckets to _PORT_FACT_REPLY structure. + * 07-27-00 01.00.04 Added _EVENT_DATA structure definitions for _SCSI, + * _LINK_STATUS, _LOOP_STATE and _LOGOUT. + * 08-11-00 01.00.05 Switched positions of MsgLength and Function fields in + * _MSG_EVENT_ACK_REPLY structure to match specification. + * 11-02-00 01.01.01 Original release for post 1.0 work. + * Added a value for Manufacturer to WhoInit. + * 12-04-00 01.01.02 Modified IOCFacts reply, added FWUpload messages, and + * removed toolbox message. + * 01-09-01 01.01.03 Added event enabled and disabled defines. + * Added structures for FwHeader and DataHeader. + * Added ImageType to FwUpload reply. + * 02-20-01 01.01.04 Started using MPI_POINTER. + * 02-27-01 01.01.05 Added event for RAID status change and its event data. + * Added IocNumber field to MSG_IOC_FACTS_REPLY. + * 03-27-01 01.01.06 Added defines for ProductId field of MPI_FW_HEADER. + * Added structure offset comments. + * 04-09-01 01.01.07 Added structure EVENT_DATA_EVENT_CHANGE. + * 08-08-01 01.02.01 Original release for v1.2 work. + * New format for FWVersion and ProductId in + * MSG_IOC_FACTS_REPLY and MPI_FW_HEADER. + * 08-31-01 01.02.02 Addded event MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE and + * related structure and defines. + * Added event MPI_EVENT_ON_BUS_TIMER_EXPIRED. + * Added MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE. + * Replaced a reserved field in MSG_IOC_FACTS_REPLY with + * IOCExceptions and changed DataImageSize to reserved. + * Added MPI_FW_DOWNLOAD_ITYPE_NVSTORE_DATA and + * MPI_FW_UPLOAD_ITYPE_NVDATA. + * 09-28-01 01.02.03 Modified Event Data for Integrated RAID. + * 11-01-01 01.02.04 Added defines for MPI_EXT_IMAGE_HEADER ImageType field. + * 03-14-02 01.02.05 Added HeaderVersion field to MSG_IOC_FACTS_REPLY. + * 05-31-02 01.02.06 Added define for + * MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID. + * Added AliasIndex to EVENT_DATA_LOGOUT structure. + * 04-01-03 01.02.07 Added defines for MPI_FW_HEADER_SIGNATURE_. + * 06-26-03 01.02.08 Added new values to the product family defines. + * 04-29-04 01.02.09 Added IOCCapabilities field to MSG_IOC_FACTS_REPLY and + * added related defines. + * 05-11-04 01.03.01 Original release for MPI v1.3. + * 08-19-04 01.05.01 Added four new fields to MSG_IOC_INIT. + * Added three new fields to MSG_IOC_FACTS_REPLY. + * Defined four new bits for the IOCCapabilities field of + * the IOCFacts reply. + * Added two new PortTypes for the PortFacts reply. + * Added six new events along with their EventData + * structures. + * Added a new MsgFlag to the FwDownload request to + * indicate last segment. + * Defined a new image type of boot loader. + * Added FW family codes for SAS product families. + * 10-05-04 01.05.02 Added ReplyFifoHostSignalingAddr field to + * MSG_IOC_FACTS_REPLY. + * 12-07-04 01.05.03 Added more defines for SAS Discovery Error event. + * 12-09-04 01.05.04 Added Unsupported device to SAS Device event. + * 01-15-05 01.05.05 Added event data for SAS SES Event. + * 02-09-05 01.05.06 Added MPI_FW_UPLOAD_ITYPE_FW_BACKUP define. + * 02-22-05 01.05.07 Added Host Page Buffer Persistent flag to IOC Facts + * Reply and IOC Init Request. + * 03-11-05 01.05.08 Added family code for 1068E family. + * Removed IOCFacts Reply EEDP Capability bit. + * 06-24-05 01.05.09 Added 5 new IOCFacts Reply IOCCapabilities bits. + * Added Max SATA Targets to SAS Discovery Error event. + * 08-30-05 01.05.10 Added 4 new events and their event data structures. + * Added new ReasonCode value for SAS Device Status Change + * event. + * Added new family code for FC949E. + * 03-27-06 01.05.11 Added MPI_IOCFACTS_CAPABILITY_TLR. + * Added additional Reason Codes and more event data fields + * to EVENT_DATA_SAS_DEVICE_STATUS_CHANGE. + * Added EVENT_DATA_SAS_BROADCAST_PRIMITIVE structure and + * new event. + * Added MPI_EVENT_SAS_SMP_ERROR and event data structure. + * Added MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE and event + * data structure. + * Added MPI_EVENT_SAS_INIT_TABLE_OVERFLOW and event + * data structure. + * Added MPI_EXT_IMAGE_TYPE_INITIALIZATION. + * 10-11-06 01.05.12 Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED. + * Added MaxInitiators field to PortFacts reply. + * Added SAS Device Status Change ReasonCode for + * asynchronous notificaiton. + * Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event + * data structure. + * Added new ImageType values for FWDownload and FWUpload + * requests. + * 02-28-07 01.05.13 Added MPI_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT for SAS + * Broadcast Event Data (replacing _RESERVED2). + * For Discovery Error Event Data DiscoveryStatus field, + * replaced _MULTPL_PATHS with _UNSUPPORTED_DEVICE and + * added _MULTI_PORT_DOMAIN. + * 05-24-07 01.05.14 Added Common Boot Block type to FWDownload Request. + * Added Common Boot Block type to FWUpload Request. + * 08-07-07 01.05.15 Added MPI_EVENT_SAS_INIT_RC_REMOVED define. + * Added MPI_EVENT_IR2_RC_DUAL_PORT_ADDED and + * MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED for IR2 event data. + * Added SASAddress field to SAS Initiator Device Table + * Overflow event data structure. + * 03-28-08 01.05.16 Added two new ReasonCode values to SAS Device Status + * Change Event data to indicate completion of internally + * generated task management. + * Added MPI_EVENT_DSCVRY_ERR_DS_SATA_INIT_FAILURE define. + * Added MPI_EVENT_SAS_INIT_RC_INACCESSIBLE define. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_IOC_H +#define MPI_IOC_H + + +/***************************************************************************** +* +* I O C M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* IOCInit message */ +/****************************************************************************/ + +typedef struct _MSG_IOC_INIT +{ + U8 WhoInit; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Flags; /* 04h */ + U8 MaxDevices; /* 05h */ + U8 MaxBuses; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 ReplyFrameSize; /* 0Ch */ + U8 Reserved1[2]; /* 0Eh */ + U32 HostMfaHighAddr; /* 10h */ + U32 SenseBufferHighAddr; /* 14h */ + U32 ReplyFifoHostSignalingAddr; /* 18h */ + SGE_SIMPLE_UNION HostPageBufferSGE; /* 1Ch */ + U16 MsgVersion; /* 28h */ + U16 HeaderVersion; /* 2Ah */ +} MSG_IOC_INIT, MPI_POINTER PTR_MSG_IOC_INIT, + IOCInit_t, MPI_POINTER pIOCInit_t; + +/* WhoInit values */ +#define MPI_WHOINIT_NO_ONE (0x00) +#define MPI_WHOINIT_SYSTEM_BIOS (0x01) +#define MPI_WHOINIT_ROM_BIOS (0x02) +#define MPI_WHOINIT_PCI_PEER (0x03) +#define MPI_WHOINIT_HOST_DRIVER (0x04) +#define MPI_WHOINIT_MANUFACTURER (0x05) + +/* Flags values */ +#define MPI_IOCINIT_FLAGS_HOST_PAGE_BUFFER_PERSISTENT (0x04) +#define MPI_IOCINIT_FLAGS_REPLY_FIFO_HOST_SIGNAL (0x02) +#define MPI_IOCINIT_FLAGS_DISCARD_FW_IMAGE (0x01) + +/* MsgVersion */ +#define MPI_IOCINIT_MSGVERSION_MAJOR_MASK (0xFF00) +#define MPI_IOCINIT_MSGVERSION_MAJOR_SHIFT (8) +#define MPI_IOCINIT_MSGVERSION_MINOR_MASK (0x00FF) +#define MPI_IOCINIT_MSGVERSION_MINOR_SHIFT (0) + +/* HeaderVersion */ +#define MPI_IOCINIT_HEADERVERSION_UNIT_MASK (0xFF00) +#define MPI_IOCINIT_HEADERVERSION_UNIT_SHIFT (8) +#define MPI_IOCINIT_HEADERVERSION_DEV_MASK (0x00FF) +#define MPI_IOCINIT_HEADERVERSION_DEV_SHIFT (0) + + +typedef struct _MSG_IOC_INIT_REPLY +{ + U8 WhoInit; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Flags; /* 04h */ + U8 MaxDevices; /* 05h */ + U8 MaxBuses; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_IOC_INIT_REPLY, MPI_POINTER PTR_MSG_IOC_INIT_REPLY, + IOCInitReply_t, MPI_POINTER pIOCInitReply_t; + + + +/****************************************************************************/ +/* IOC Facts message */ +/****************************************************************************/ + +typedef struct _MSG_IOC_FACTS +{ + U8 Reserved[2]; /* 00h */ + U8 ChainOffset; /* 01h */ + U8 Function; /* 02h */ + U8 Reserved1[3]; /* 03h */ + U8 MsgFlags; /* 04h */ + U32 MsgContext; /* 08h */ +} MSG_IOC_FACTS, MPI_POINTER PTR_IOC_FACTS, + IOCFacts_t, MPI_POINTER pIOCFacts_t; + +typedef struct _MPI_FW_VERSION_STRUCT +{ + U8 Dev; /* 00h */ + U8 Unit; /* 01h */ + U8 Minor; /* 02h */ + U8 Major; /* 03h */ +} MPI_FW_VERSION_STRUCT; + +typedef union _MPI_FW_VERSION +{ + MPI_FW_VERSION_STRUCT Struct; + U32 Word; +} MPI_FW_VERSION; + +/* IOC Facts Reply */ +typedef struct _MSG_IOC_FACTS_REPLY +{ + U16 MsgVersion; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 HeaderVersion; /* 04h */ + U8 IOCNumber; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 IOCExceptions; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U8 MaxChainDepth; /* 14h */ + U8 WhoInit; /* 15h */ + U8 BlockSize; /* 16h */ + U8 Flags; /* 17h */ + U16 ReplyQueueDepth; /* 18h */ + U16 RequestFrameSize; /* 1Ah */ + U16 Reserved_0101_FWVersion; /* 1Ch */ /* obsolete 16-bit FWVersion */ + U16 ProductID; /* 1Eh */ + U32 CurrentHostMfaHighAddr; /* 20h */ + U16 GlobalCredits; /* 24h */ + U8 NumberOfPorts; /* 26h */ + U8 EventState; /* 27h */ + U32 CurrentSenseBufferHighAddr; /* 28h */ + U16 CurReplyFrameSize; /* 2Ch */ + U8 MaxDevices; /* 2Eh */ + U8 MaxBuses; /* 2Fh */ + U32 FWImageSize; /* 30h */ + U32 IOCCapabilities; /* 34h */ + MPI_FW_VERSION FWVersion; /* 38h */ + U16 HighPriorityQueueDepth; /* 3Ch */ + U16 Reserved2; /* 3Eh */ + SGE_SIMPLE_UNION HostPageBufferSGE; /* 40h */ + U32 ReplyFifoHostSignalingAddr; /* 4Ch */ +} MSG_IOC_FACTS_REPLY, MPI_POINTER PTR_MSG_IOC_FACTS_REPLY, + IOCFactsReply_t, MPI_POINTER pIOCFactsReply_t; + +#define MPI_IOCFACTS_MSGVERSION_MAJOR_MASK (0xFF00) +#define MPI_IOCFACTS_MSGVERSION_MAJOR_SHIFT (8) +#define MPI_IOCFACTS_MSGVERSION_MINOR_MASK (0x00FF) +#define MPI_IOCFACTS_MSGVERSION_MINOR_SHIFT (0) + +#define MPI_IOCFACTS_HDRVERSION_UNIT_MASK (0xFF00) +#define MPI_IOCFACTS_HDRVERSION_UNIT_SHIFT (8) +#define MPI_IOCFACTS_HDRVERSION_DEV_MASK (0x00FF) +#define MPI_IOCFACTS_HDRVERSION_DEV_SHIFT (0) + +#define MPI_IOCFACTS_EXCEPT_CONFIG_CHECKSUM_FAIL (0x0001) +#define MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID (0x0002) +#define MPI_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL (0x0004) +#define MPI_IOCFACTS_EXCEPT_PERSISTENT_TABLE_FULL (0x0008) +#define MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED (0x0010) + +#define MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT (0x01) +#define MPI_IOCFACTS_FLAGS_REPLY_FIFO_HOST_SIGNAL (0x02) +#define MPI_IOCFACTS_FLAGS_HOST_PAGE_BUFFER_PERSISTENT (0x04) + +#define MPI_IOCFACTS_EVENTSTATE_DISABLED (0x00) +#define MPI_IOCFACTS_EVENTSTATE_ENABLED (0x01) + +#define MPI_IOCFACTS_CAPABILITY_HIGH_PRI_Q (0x00000001) +#define MPI_IOCFACTS_CAPABILITY_REPLY_HOST_SIGNAL (0x00000002) +#define MPI_IOCFACTS_CAPABILITY_QUEUE_FULL_HANDLING (0x00000004) +#define MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER (0x00000008) +#define MPI_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER (0x00000010) +#define MPI_IOCFACTS_CAPABILITY_EXTENDED_BUFFER (0x00000020) +#define MPI_IOCFACTS_CAPABILITY_EEDP (0x00000040) +#define MPI_IOCFACTS_CAPABILITY_BIDIRECTIONAL (0x00000080) +#define MPI_IOCFACTS_CAPABILITY_MULTICAST (0x00000100) +#define MPI_IOCFACTS_CAPABILITY_SCSIIO32 (0x00000200) +#define MPI_IOCFACTS_CAPABILITY_NO_SCSIIO16 (0x00000400) +#define MPI_IOCFACTS_CAPABILITY_TLR (0x00000800) + + +/***************************************************************************** +* +* P o r t M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Port Facts message and Reply */ +/****************************************************************************/ + +typedef struct _MSG_PORT_FACTS +{ + U8 Reserved[2]; /* 00h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[2]; /* 04h */ + U8 PortNumber; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ +} MSG_PORT_FACTS, MPI_POINTER PTR_MSG_PORT_FACTS, + PortFacts_t, MPI_POINTER pPortFacts_t; + +typedef struct _MSG_PORT_FACTS_REPLY +{ + U16 Reserved; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 PortNumber; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U8 Reserved3; /* 14h */ + U8 PortType; /* 15h */ + U16 MaxDevices; /* 16h */ + U16 PortSCSIID; /* 18h */ + U16 ProtocolFlags; /* 1Ah */ + U16 MaxPostedCmdBuffers; /* 1Ch */ + U16 MaxPersistentIDs; /* 1Eh */ + U16 MaxLanBuckets; /* 20h */ + U8 MaxInitiators; /* 22h */ + U8 Reserved4; /* 23h */ + U32 Reserved5; /* 24h */ +} MSG_PORT_FACTS_REPLY, MPI_POINTER PTR_MSG_PORT_FACTS_REPLY, + PortFactsReply_t, MPI_POINTER pPortFactsReply_t; + + +/* PortTypes values */ + +#define MPI_PORTFACTS_PORTTYPE_INACTIVE (0x00) +#define MPI_PORTFACTS_PORTTYPE_SCSI (0x01) +#define MPI_PORTFACTS_PORTTYPE_FC (0x10) +#define MPI_PORTFACTS_PORTTYPE_ISCSI (0x20) +#define MPI_PORTFACTS_PORTTYPE_SAS (0x30) + +/* ProtocolFlags values */ + +#define MPI_PORTFACTS_PROTOCOL_LOGBUSADDR (0x01) +#define MPI_PORTFACTS_PROTOCOL_LAN (0x02) +#define MPI_PORTFACTS_PROTOCOL_TARGET (0x04) +#define MPI_PORTFACTS_PROTOCOL_INITIATOR (0x08) + + +/****************************************************************************/ +/* Port Enable Message */ +/****************************************************************************/ + +typedef struct _MSG_PORT_ENABLE +{ + U8 Reserved[2]; /* 00h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[2]; /* 04h */ + U8 PortNumber; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ +} MSG_PORT_ENABLE, MPI_POINTER PTR_MSG_PORT_ENABLE, + PortEnable_t, MPI_POINTER pPortEnable_t; + +typedef struct _MSG_PORT_ENABLE_REPLY +{ + U8 Reserved[2]; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[2]; /* 04h */ + U8 PortNumber; /* 05h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_PORT_ENABLE_REPLY, MPI_POINTER PTR_MSG_PORT_ENABLE_REPLY, + PortEnableReply_t, MPI_POINTER pPortEnableReply_t; + + +/***************************************************************************** +* +* E v e n t M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Event Notification messages */ +/****************************************************************************/ + +typedef struct _MSG_EVENT_NOTIFY +{ + U8 Switch; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ +} MSG_EVENT_NOTIFY, MPI_POINTER PTR_MSG_EVENT_NOTIFY, + EventNotification_t, MPI_POINTER pEventNotification_t; + +/* Event Notification Reply */ + +typedef struct _MSG_EVENT_NOTIFY_REPLY +{ + U16 EventDataLength; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[2]; /* 04h */ + U8 AckRequired; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Reserved2[2]; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 Event; /* 14h */ + U32 EventContext; /* 18h */ + U32 Data[1]; /* 1Ch */ +} MSG_EVENT_NOTIFY_REPLY, MPI_POINTER PTR_MSG_EVENT_NOTIFY_REPLY, + EventNotificationReply_t, MPI_POINTER pEventNotificationReply_t; + +/* Event Acknowledge */ + +typedef struct _MSG_EVENT_ACK +{ + U8 Reserved[2]; /* 00h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Event; /* 0Ch */ + U32 EventContext; /* 10h */ +} MSG_EVENT_ACK, MPI_POINTER PTR_MSG_EVENT_ACK, + EventAck_t, MPI_POINTER pEventAck_t; + +typedef struct _MSG_EVENT_ACK_REPLY +{ + U8 Reserved[2]; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_EVENT_ACK_REPLY, MPI_POINTER PTR_MSG_EVENT_ACK_REPLY, + EventAckReply_t, MPI_POINTER pEventAckReply_t; + +/* Switch */ + +#define MPI_EVENT_NOTIFICATION_SWITCH_OFF (0x00) +#define MPI_EVENT_NOTIFICATION_SWITCH_ON (0x01) + +/* Event */ + +#define MPI_EVENT_NONE (0x00000000) +#define MPI_EVENT_LOG_DATA (0x00000001) +#define MPI_EVENT_STATE_CHANGE (0x00000002) +#define MPI_EVENT_UNIT_ATTENTION (0x00000003) +#define MPI_EVENT_IOC_BUS_RESET (0x00000004) +#define MPI_EVENT_EXT_BUS_RESET (0x00000005) +#define MPI_EVENT_RESCAN (0x00000006) +#define MPI_EVENT_LINK_STATUS_CHANGE (0x00000007) +#define MPI_EVENT_LOOP_STATE_CHANGE (0x00000008) +#define MPI_EVENT_LOGOUT (0x00000009) +#define MPI_EVENT_EVENT_CHANGE (0x0000000A) +#define MPI_EVENT_INTEGRATED_RAID (0x0000000B) +#define MPI_EVENT_SCSI_DEVICE_STATUS_CHANGE (0x0000000C) +#define MPI_EVENT_ON_BUS_TIMER_EXPIRED (0x0000000D) +#define MPI_EVENT_QUEUE_FULL (0x0000000E) +#define MPI_EVENT_SAS_DEVICE_STATUS_CHANGE (0x0000000F) +#define MPI_EVENT_SAS_SES (0x00000010) +#define MPI_EVENT_PERSISTENT_TABLE_FULL (0x00000011) +#define MPI_EVENT_SAS_PHY_LINK_STATUS (0x00000012) +#define MPI_EVENT_SAS_DISCOVERY_ERROR (0x00000013) +#define MPI_EVENT_IR_RESYNC_UPDATE (0x00000014) +#define MPI_EVENT_IR2 (0x00000015) +#define MPI_EVENT_SAS_DISCOVERY (0x00000016) +#define MPI_EVENT_SAS_BROADCAST_PRIMITIVE (0x00000017) +#define MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE (0x00000018) +#define MPI_EVENT_SAS_INIT_TABLE_OVERFLOW (0x00000019) +#define MPI_EVENT_SAS_SMP_ERROR (0x0000001A) +#define MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE (0x0000001B) +#define MPI_EVENT_LOG_ENTRY_ADDED (0x00000021) + +/* AckRequired field values */ + +#define MPI_EVENT_NOTIFICATION_ACK_NOT_REQUIRED (0x00) +#define MPI_EVENT_NOTIFICATION_ACK_REQUIRED (0x01) + +/* EventChange Event data */ + +typedef struct _EVENT_DATA_EVENT_CHANGE +{ + U8 EventState; /* 00h */ + U8 Reserved; /* 01h */ + U16 Reserved1; /* 02h */ +} EVENT_DATA_EVENT_CHANGE, MPI_POINTER PTR_EVENT_DATA_EVENT_CHANGE, + EventDataEventChange_t, MPI_POINTER pEventDataEventChange_t; + +/* LogEntryAdded Event data */ + +/* this structure matches MPI_LOG_0_ENTRY in mpi_cnfg.h */ +#define MPI_EVENT_DATA_LOG_ENTRY_DATA_LENGTH (0x1C) +typedef struct _EVENT_DATA_LOG_ENTRY +{ + U32 TimeStamp; /* 00h */ + U32 Reserved1; /* 04h */ + U16 LogSequence; /* 08h */ + U16 LogEntryQualifier; /* 0Ah */ + U8 LogData[MPI_EVENT_DATA_LOG_ENTRY_DATA_LENGTH]; /* 0Ch */ +} EVENT_DATA_LOG_ENTRY, MPI_POINTER PTR_EVENT_DATA_LOG_ENTRY, + MpiEventDataLogEntry_t, MPI_POINTER pMpiEventDataLogEntry_t; + +typedef struct _EVENT_DATA_LOG_ENTRY_ADDED +{ + U16 LogSequence; /* 00h */ + U16 Reserved1; /* 02h */ + U32 Reserved2; /* 04h */ + EVENT_DATA_LOG_ENTRY LogEntry; /* 08h */ +} EVENT_DATA_LOG_ENTRY_ADDED, MPI_POINTER PTR_EVENT_DATA_LOG_ENTRY_ADDED, + MpiEventDataLogEntryAdded_t, MPI_POINTER pMpiEventDataLogEntryAdded_t; + +/* SCSI Event data for Port, Bus and Device forms */ + +typedef struct _EVENT_DATA_SCSI +{ + U8 TargetID; /* 00h */ + U8 BusPort; /* 01h */ + U16 Reserved; /* 02h */ +} EVENT_DATA_SCSI, MPI_POINTER PTR_EVENT_DATA_SCSI, + EventDataScsi_t, MPI_POINTER pEventDataScsi_t; + +/* SCSI Device Status Change Event data */ + +typedef struct _EVENT_DATA_SCSI_DEVICE_STATUS_CHANGE +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ReasonCode; /* 02h */ + U8 LUN; /* 03h */ + U8 ASC; /* 04h */ + U8 ASCQ; /* 05h */ + U16 Reserved; /* 06h */ +} EVENT_DATA_SCSI_DEVICE_STATUS_CHANGE, + MPI_POINTER PTR_EVENT_DATA_SCSI_DEVICE_STATUS_CHANGE, + MpiEventDataScsiDeviceStatusChange_t, + MPI_POINTER pMpiEventDataScsiDeviceStatusChange_t; + +/* MPI SCSI Device Status Change Event data ReasonCode values */ +#define MPI_EVENT_SCSI_DEV_STAT_RC_ADDED (0x03) +#define MPI_EVENT_SCSI_DEV_STAT_RC_NOT_RESPONDING (0x04) +#define MPI_EVENT_SCSI_DEV_STAT_RC_SMART_DATA (0x05) + +/* SAS Device Status Change Event data */ + +typedef struct _EVENT_DATA_SAS_DEVICE_STATUS_CHANGE +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ReasonCode; /* 02h */ + U8 Reserved; /* 03h */ + U8 ASC; /* 04h */ + U8 ASCQ; /* 05h */ + U16 DevHandle; /* 06h */ + U32 DeviceInfo; /* 08h */ + U16 ParentDevHandle; /* 0Ch */ + U8 PhyNum; /* 0Eh */ + U8 Reserved1; /* 0Fh */ + U64 SASAddress; /* 10h */ + U8 LUN[8]; /* 18h */ + U16 TaskTag; /* 20h */ + U16 Reserved2; /* 22h */ +} EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, + MPI_POINTER PTR_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE, + MpiEventDataSasDeviceStatusChange_t, + MPI_POINTER pMpiEventDataSasDeviceStatusChange_t; + +/* MPI SAS Device Status Change Event data ReasonCode values */ +#define MPI_EVENT_SAS_DEV_STAT_RC_ADDED (0x03) +#define MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING (0x04) +#define MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA (0x05) +#define MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED (0x06) +#define MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED (0x07) +#define MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET (0x08) +#define MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL (0x09) +#define MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL (0x0A) +#define MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL (0x0B) +#define MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL (0x0C) +#define MPI_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION (0x0D) +#define MPI_EVENT_SAS_DEV_STAT_RC_CMPL_INTERNAL_DEV_RESET (0x0E) +#define MPI_EVENT_SAS_DEV_STAT_RC_CMPL_TASK_ABORT_INTERNAL (0x0F) + + +/* SCSI Event data for Queue Full event */ + +typedef struct _EVENT_DATA_QUEUE_FULL +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U16 CurrentDepth; /* 02h */ +} EVENT_DATA_QUEUE_FULL, MPI_POINTER PTR_EVENT_DATA_QUEUE_FULL, + EventDataQueueFull_t, MPI_POINTER pEventDataQueueFull_t; + +/* MPI Integrated RAID Event data */ + +typedef struct _EVENT_DATA_RAID +{ + U8 VolumeID; /* 00h */ + U8 VolumeBus; /* 01h */ + U8 ReasonCode; /* 02h */ + U8 PhysDiskNum; /* 03h */ + U8 ASC; /* 04h */ + U8 ASCQ; /* 05h */ + U16 Reserved; /* 06h */ + U32 SettingsStatus; /* 08h */ +} EVENT_DATA_RAID, MPI_POINTER PTR_EVENT_DATA_RAID, + MpiEventDataRaid_t, MPI_POINTER pMpiEventDataRaid_t; + +/* MPI Integrated RAID Event data ReasonCode values */ +#define MPI_EVENT_RAID_RC_VOLUME_CREATED (0x00) +#define MPI_EVENT_RAID_RC_VOLUME_DELETED (0x01) +#define MPI_EVENT_RAID_RC_VOLUME_SETTINGS_CHANGED (0x02) +#define MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED (0x03) +#define MPI_EVENT_RAID_RC_VOLUME_PHYSDISK_CHANGED (0x04) +#define MPI_EVENT_RAID_RC_PHYSDISK_CREATED (0x05) +#define MPI_EVENT_RAID_RC_PHYSDISK_DELETED (0x06) +#define MPI_EVENT_RAID_RC_PHYSDISK_SETTINGS_CHANGED (0x07) +#define MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED (0x08) +#define MPI_EVENT_RAID_RC_DOMAIN_VAL_NEEDED (0x09) +#define MPI_EVENT_RAID_RC_SMART_DATA (0x0A) +#define MPI_EVENT_RAID_RC_REPLACE_ACTION_STARTED (0x0B) + + +/* MPI Integrated RAID Resync Update Event data */ + +typedef struct _MPI_EVENT_DATA_IR_RESYNC_UPDATE +{ + U8 VolumeID; /* 00h */ + U8 VolumeBus; /* 01h */ + U8 ResyncComplete; /* 02h */ + U8 Reserved1; /* 03h */ + U32 Reserved2; /* 04h */ +} MPI_EVENT_DATA_IR_RESYNC_UPDATE, + MPI_POINTER PTR_MPI_EVENT_DATA_IR_RESYNC_UPDATE, + MpiEventDataIrResyncUpdate_t, MPI_POINTER pMpiEventDataIrResyncUpdate_t; + +/* MPI IR2 Event data */ + +/* MPI_LD_STATE or MPI_PD_STATE */ +typedef struct _IR2_STATE_CHANGED +{ + U16 PreviousState; /* 00h */ + U16 NewState; /* 02h */ +} IR2_STATE_CHANGED, MPI_POINTER PTR_IR2_STATE_CHANGED; + +typedef struct _IR2_PD_INFO +{ + U16 DeviceHandle; /* 00h */ + U8 TruncEnclosureHandle; /* 02h */ + U8 TruncatedSlot; /* 03h */ +} IR2_PD_INFO, MPI_POINTER PTR_IR2_PD_INFO; + +typedef union _MPI_IR2_RC_EVENT_DATA +{ + IR2_STATE_CHANGED StateChanged; + U32 Lba; + IR2_PD_INFO PdInfo; +} MPI_IR2_RC_EVENT_DATA, MPI_POINTER PTR_MPI_IR2_RC_EVENT_DATA; + +typedef struct _MPI_EVENT_DATA_IR2 +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ReasonCode; /* 02h */ + U8 PhysDiskNum; /* 03h */ + MPI_IR2_RC_EVENT_DATA IR2EventData; /* 04h */ +} MPI_EVENT_DATA_IR2, MPI_POINTER PTR_MPI_EVENT_DATA_IR2, + MpiEventDataIR2_t, MPI_POINTER pMpiEventDataIR2_t; + +/* MPI IR2 Event data ReasonCode values */ +#define MPI_EVENT_IR2_RC_LD_STATE_CHANGED (0x01) +#define MPI_EVENT_IR2_RC_PD_STATE_CHANGED (0x02) +#define MPI_EVENT_IR2_RC_BAD_BLOCK_TABLE_FULL (0x03) +#define MPI_EVENT_IR2_RC_PD_INSERTED (0x04) +#define MPI_EVENT_IR2_RC_PD_REMOVED (0x05) +#define MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED (0x06) +#define MPI_EVENT_IR2_RC_REBUILD_MEDIUM_ERROR (0x07) +#define MPI_EVENT_IR2_RC_DUAL_PORT_ADDED (0x08) +#define MPI_EVENT_IR2_RC_DUAL_PORT_REMOVED (0x09) + +/* defines for logical disk states */ +#define MPI_LD_STATE_OPTIMAL (0x00) +#define MPI_LD_STATE_DEGRADED (0x01) +#define MPI_LD_STATE_FAILED (0x02) +#define MPI_LD_STATE_MISSING (0x03) +#define MPI_LD_STATE_OFFLINE (0x04) + +/* defines for physical disk states */ +#define MPI_PD_STATE_ONLINE (0x00) +#define MPI_PD_STATE_MISSING (0x01) +#define MPI_PD_STATE_NOT_COMPATIBLE (0x02) +#define MPI_PD_STATE_FAILED (0x03) +#define MPI_PD_STATE_INITIALIZING (0x04) +#define MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST (0x05) +#define MPI_PD_STATE_FAILED_AT_HOST_REQUEST (0x06) +#define MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON (0xFF) + +/* MPI Link Status Change Event data */ + +typedef struct _EVENT_DATA_LINK_STATUS +{ + U8 State; /* 00h */ + U8 Reserved; /* 01h */ + U16 Reserved1; /* 02h */ + U8 Reserved2; /* 04h */ + U8 Port; /* 05h */ + U16 Reserved3; /* 06h */ +} EVENT_DATA_LINK_STATUS, MPI_POINTER PTR_EVENT_DATA_LINK_STATUS, + EventDataLinkStatus_t, MPI_POINTER pEventDataLinkStatus_t; + +#define MPI_EVENT_LINK_STATUS_FAILURE (0x00000000) +#define MPI_EVENT_LINK_STATUS_ACTIVE (0x00000001) + +/* MPI Loop State Change Event data */ + +typedef struct _EVENT_DATA_LOOP_STATE +{ + U8 Character4; /* 00h */ + U8 Character3; /* 01h */ + U8 Type; /* 02h */ + U8 Reserved; /* 03h */ + U8 Reserved1; /* 04h */ + U8 Port; /* 05h */ + U16 Reserved2; /* 06h */ +} EVENT_DATA_LOOP_STATE, MPI_POINTER PTR_EVENT_DATA_LOOP_STATE, + EventDataLoopState_t, MPI_POINTER pEventDataLoopState_t; + +#define MPI_EVENT_LOOP_STATE_CHANGE_LIP (0x0001) +#define MPI_EVENT_LOOP_STATE_CHANGE_LPE (0x0002) +#define MPI_EVENT_LOOP_STATE_CHANGE_LPB (0x0003) + +/* MPI LOGOUT Event data */ + +typedef struct _EVENT_DATA_LOGOUT +{ + U32 NPortID; /* 00h */ + U8 AliasIndex; /* 04h */ + U8 Port; /* 05h */ + U16 Reserved1; /* 06h */ +} EVENT_DATA_LOGOUT, MPI_POINTER PTR_EVENT_DATA_LOGOUT, + EventDataLogout_t, MPI_POINTER pEventDataLogout_t; + +#define MPI_EVENT_LOGOUT_ALL_ALIASES (0xFF) + +/* SAS SES Event data */ + +typedef struct _EVENT_DATA_SAS_SES +{ + U8 PhyNum; /* 00h */ + U8 Port; /* 01h */ + U8 PortWidth; /* 02h */ + U8 Reserved1; /* 04h */ +} EVENT_DATA_SAS_SES, MPI_POINTER PTR_EVENT_DATA_SAS_SES, + MpiEventDataSasSes_t, MPI_POINTER pMpiEventDataSasSes_t; + +/* SAS Broadcast Primitive Event data */ + +typedef struct _EVENT_DATA_SAS_BROADCAST_PRIMITIVE +{ + U8 PhyNum; /* 00h */ + U8 Port; /* 01h */ + U8 PortWidth; /* 02h */ + U8 Primitive; /* 04h */ +} EVENT_DATA_SAS_BROADCAST_PRIMITIVE, + MPI_POINTER PTR_EVENT_DATA_SAS_BROADCAST_PRIMITIVE, + MpiEventDataSasBroadcastPrimitive_t, + MPI_POINTER pMpiEventDataSasBroadcastPrimitive_t; + +#define MPI_EVENT_PRIMITIVE_CHANGE (0x01) +#define MPI_EVENT_PRIMITIVE_EXPANDER (0x03) +#define MPI_EVENT_PRIMITIVE_ASYNCHRONOUS_EVENT (0x04) +#define MPI_EVENT_PRIMITIVE_RESERVED3 (0x05) +#define MPI_EVENT_PRIMITIVE_RESERVED4 (0x06) +#define MPI_EVENT_PRIMITIVE_CHANGE0_RESERVED (0x07) +#define MPI_EVENT_PRIMITIVE_CHANGE1_RESERVED (0x08) + +/* SAS Phy Link Status Event data */ + +typedef struct _EVENT_DATA_SAS_PHY_LINK_STATUS +{ + U8 PhyNum; /* 00h */ + U8 LinkRates; /* 01h */ + U16 DevHandle; /* 02h */ + U64 SASAddress; /* 04h */ +} EVENT_DATA_SAS_PHY_LINK_STATUS, MPI_POINTER PTR_EVENT_DATA_SAS_PHY_LINK_STATUS, + MpiEventDataSasPhyLinkStatus_t, MPI_POINTER pMpiEventDataSasPhyLinkStatus_t; + +/* defines for the LinkRates field of the SAS PHY Link Status event */ +#define MPI_EVENT_SAS_PLS_LR_CURRENT_MASK (0xF0) +#define MPI_EVENT_SAS_PLS_LR_CURRENT_SHIFT (4) +#define MPI_EVENT_SAS_PLS_LR_PREVIOUS_MASK (0x0F) +#define MPI_EVENT_SAS_PLS_LR_PREVIOUS_SHIFT (0) +#define MPI_EVENT_SAS_PLS_LR_RATE_UNKNOWN (0x00) +#define MPI_EVENT_SAS_PLS_LR_RATE_PHY_DISABLED (0x01) +#define MPI_EVENT_SAS_PLS_LR_RATE_FAILED_SPEED_NEGOTIATION (0x02) +#define MPI_EVENT_SAS_PLS_LR_RATE_SATA_OOB_COMPLETE (0x03) +#define MPI_EVENT_SAS_PLS_LR_RATE_1_5 (0x08) +#define MPI_EVENT_SAS_PLS_LR_RATE_3_0 (0x09) + +/* SAS Discovery Event data */ + +typedef struct _EVENT_DATA_SAS_DISCOVERY +{ + U32 DiscoveryStatus; /* 00h */ + U32 Reserved1; /* 04h */ +} EVENT_DATA_SAS_DISCOVERY, MPI_POINTER PTR_EVENT_DATA_SAS_DISCOVERY, + EventDataSasDiscovery_t, MPI_POINTER pEventDataSasDiscovery_t; + +#define MPI_EVENT_SAS_DSCVRY_COMPLETE (0x00000000) +#define MPI_EVENT_SAS_DSCVRY_IN_PROGRESS (0x00000001) +#define MPI_EVENT_SAS_DSCVRY_PHY_BITS_MASK (0xFFFF0000) +#define MPI_EVENT_SAS_DSCVRY_PHY_BITS_SHIFT (16) + +/* SAS Discovery Errror Event data */ + +typedef struct _EVENT_DATA_DISCOVERY_ERROR +{ + U32 DiscoveryStatus; /* 00h */ + U8 Port; /* 04h */ + U8 Reserved1; /* 05h */ + U16 Reserved2; /* 06h */ +} EVENT_DATA_DISCOVERY_ERROR, MPI_POINTER PTR_EVENT_DATA_DISCOVERY_ERROR, + EventDataDiscoveryError_t, MPI_POINTER pEventDataDiscoveryError_t; + +#define MPI_EVENT_DSCVRY_ERR_DS_LOOP_DETECTED (0x00000001) +#define MPI_EVENT_DSCVRY_ERR_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI_EVENT_DSCVRY_ERR_DS_MULTIPLE_PORTS (0x00000004) +#define MPI_EVENT_DSCVRY_ERR_DS_EXPANDER_ERR (0x00000008) +#define MPI_EVENT_DSCVRY_ERR_DS_SMP_TIMEOUT (0x00000010) +#define MPI_EVENT_DSCVRY_ERR_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI_EVENT_DSCVRY_ERR_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI_EVENT_DSCVRY_ERR_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI_EVENT_DSCVRY_ERR_DS_SMP_CRC_ERROR (0x00000100) +#define MPI_EVENT_DSCVRY_ERR_DS_MULTPL_SUBTRACTIVE (0x00000200) +#define MPI_EVENT_DSCVRY_ERR_DS_TABLE_TO_TABLE (0x00000400) +#define MPI_EVENT_DSCVRY_ERR_DS_UNSUPPORTED_DEVICE (0x00000800) +#define MPI_EVENT_DSCVRY_ERR_DS_MAX_SATA_TARGETS (0x00001000) +#define MPI_EVENT_DSCVRY_ERR_DS_MULTI_PORT_DOMAIN (0x00002000) +#define MPI_EVENT_DSCVRY_ERR_DS_SATA_INIT_FAILURE (0x00004000) + +/* SAS SMP Error Event data */ + +typedef struct _EVENT_DATA_SAS_SMP_ERROR +{ + U8 Status; /* 00h */ + U8 Port; /* 01h */ + U8 SMPFunctionResult; /* 02h */ + U8 Reserved1; /* 03h */ + U64 SASAddress; /* 04h */ +} EVENT_DATA_SAS_SMP_ERROR, MPI_POINTER PTR_EVENT_DATA_SAS_SMP_ERROR, + MpiEventDataSasSmpError_t, MPI_POINTER pMpiEventDataSasSmpError_t; + +/* defines for the Status field of the SAS SMP Error event */ +#define MPI_EVENT_SAS_SMP_FUNCTION_RESULT_VALID (0x00) +#define MPI_EVENT_SAS_SMP_CRC_ERROR (0x01) +#define MPI_EVENT_SAS_SMP_TIMEOUT (0x02) +#define MPI_EVENT_SAS_SMP_NO_DESTINATION (0x03) +#define MPI_EVENT_SAS_SMP_BAD_DESTINATION (0x04) + +/* SAS Initiator Device Status Change Event data */ + +typedef struct _EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE +{ + U8 ReasonCode; /* 00h */ + U8 Port; /* 01h */ + U16 DevHandle; /* 02h */ + U64 SASAddress; /* 04h */ +} EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, + MPI_POINTER PTR_EVENT_DATA_SAS_INIT_DEV_STATUS_CHANGE, + MpiEventDataSasInitDevStatusChange_t, + MPI_POINTER pMpiEventDataSasInitDevStatusChange_t; + +/* defines for the ReasonCode field of the SAS Initiator Device Status Change event */ +#define MPI_EVENT_SAS_INIT_RC_ADDED (0x01) +#define MPI_EVENT_SAS_INIT_RC_REMOVED (0x02) +#define MPI_EVENT_SAS_INIT_RC_INACCESSIBLE (0x03) + +/* SAS Initiator Device Table Overflow Event data */ + +typedef struct _EVENT_DATA_SAS_INIT_TABLE_OVERFLOW +{ + U8 MaxInit; /* 00h */ + U8 CurrentInit; /* 01h */ + U16 Reserved1; /* 02h */ + U64 SASAddress; /* 04h */ +} EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, + MPI_POINTER PTR_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW, + MpiEventDataSasInitTableOverflow_t, + MPI_POINTER pMpiEventDataSasInitTableOverflow_t; + +/* SAS Expander Status Change Event data */ + +typedef struct _EVENT_DATA_SAS_EXPANDER_STATUS_CHANGE +{ + U8 ReasonCode; /* 00h */ + U8 Reserved1; /* 01h */ + U16 Reserved2; /* 02h */ + U8 PhysicalPort; /* 04h */ + U8 Reserved3; /* 05h */ + U16 EnclosureHandle; /* 06h */ + U64 SASAddress; /* 08h */ + U32 DiscoveryStatus; /* 10h */ + U16 DevHandle; /* 14h */ + U16 ParentDevHandle; /* 16h */ + U16 ExpanderChangeCount; /* 18h */ + U16 ExpanderRouteIndexes; /* 1Ah */ + U8 NumPhys; /* 1Ch */ + U8 SASLevel; /* 1Dh */ + U8 Flags; /* 1Eh */ + U8 Reserved4; /* 1Fh */ +} EVENT_DATA_SAS_EXPANDER_STATUS_CHANGE, + MPI_POINTER PTR_EVENT_DATA_SAS_EXPANDER_STATUS_CHANGE, + MpiEventDataSasExpanderStatusChange_t, + MPI_POINTER pMpiEventDataSasExpanderStatusChange_t; + +/* values for ReasonCode field of SAS Expander Status Change Event data */ +#define MPI_EVENT_SAS_EXP_RC_ADDED (0x00) +#define MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING (0x01) + +/* values for DiscoveryStatus field of SAS Expander Status Change Event data */ +#define MPI_EVENT_SAS_EXP_DS_LOOP_DETECTED (0x00000001) +#define MPI_EVENT_SAS_EXP_DS_UNADDRESSABLE_DEVICE (0x00000002) +#define MPI_EVENT_SAS_EXP_DS_MULTIPLE_PORTS (0x00000004) +#define MPI_EVENT_SAS_EXP_DS_EXPANDER_ERR (0x00000008) +#define MPI_EVENT_SAS_EXP_DS_SMP_TIMEOUT (0x00000010) +#define MPI_EVENT_SAS_EXP_DS_OUT_ROUTE_ENTRIES (0x00000020) +#define MPI_EVENT_SAS_EXP_DS_INDEX_NOT_EXIST (0x00000040) +#define MPI_EVENT_SAS_EXP_DS_SMP_FUNCTION_FAILED (0x00000080) +#define MPI_EVENT_SAS_EXP_DS_SMP_CRC_ERROR (0x00000100) +#define MPI_EVENT_SAS_EXP_DS_SUBTRACTIVE_LINK (0x00000200) +#define MPI_EVENT_SAS_EXP_DS_TABLE_LINK (0x00000400) +#define MPI_EVENT_SAS_EXP_DS_UNSUPPORTED_DEVICE (0x00000800) + +/* values for Flags field of SAS Expander Status Change Event data */ +#define MPI_EVENT_SAS_EXP_FLAGS_ROUTE_TABLE_CONFIG (0x02) +#define MPI_EVENT_SAS_EXP_FLAGS_CONFIG_IN_PROGRESS (0x01) + + + +/***************************************************************************** +* +* F i r m w a r e L o a d M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Firmware Download message and associated structures */ +/****************************************************************************/ + +typedef struct _MSG_FW_DOWNLOAD +{ + U8 ImageType; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + SGE_MPI_UNION SGL; /* 0Ch */ +} MSG_FW_DOWNLOAD, MPI_POINTER PTR_MSG_FW_DOWNLOAD, + FWDownload_t, MPI_POINTER pFWDownload_t; + +#define MPI_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT (0x01) + +#define MPI_FW_DOWNLOAD_ITYPE_RESERVED (0x00) +#define MPI_FW_DOWNLOAD_ITYPE_FW (0x01) +#define MPI_FW_DOWNLOAD_ITYPE_BIOS (0x02) +#define MPI_FW_DOWNLOAD_ITYPE_NVDATA (0x03) +#define MPI_FW_DOWNLOAD_ITYPE_BOOTLOADER (0x04) +#define MPI_FW_DOWNLOAD_ITYPE_MANUFACTURING (0x06) +#define MPI_FW_DOWNLOAD_ITYPE_CONFIG_1 (0x07) +#define MPI_FW_DOWNLOAD_ITYPE_CONFIG_2 (0x08) +#define MPI_FW_DOWNLOAD_ITYPE_MEGARAID (0x09) +#define MPI_FW_DOWNLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B) + + +typedef struct _FWDownloadTCSGE +{ + U8 Reserved; /* 00h */ + U8 ContextSize; /* 01h */ + U8 DetailsLength; /* 02h */ + U8 Flags; /* 03h */ + U32 Reserved_0100_Checksum; /* 04h */ /* obsolete Checksum */ + U32 ImageOffset; /* 08h */ + U32 ImageSize; /* 0Ch */ +} FW_DOWNLOAD_TCSGE, MPI_POINTER PTR_FW_DOWNLOAD_TCSGE, + FWDownloadTCSGE_t, MPI_POINTER pFWDownloadTCSGE_t; + +/* Firmware Download reply */ +typedef struct _MSG_FW_DOWNLOAD_REPLY +{ + U8 ImageType; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_FW_DOWNLOAD_REPLY, MPI_POINTER PTR_MSG_FW_DOWNLOAD_REPLY, + FWDownloadReply_t, MPI_POINTER pFWDownloadReply_t; + + +/****************************************************************************/ +/* Firmware Upload message and associated structures */ +/****************************************************************************/ + +typedef struct _MSG_FW_UPLOAD +{ + U8 ImageType; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + SGE_MPI_UNION SGL; /* 0Ch */ +} MSG_FW_UPLOAD, MPI_POINTER PTR_MSG_FW_UPLOAD, + FWUpload_t, MPI_POINTER pFWUpload_t; + +#define MPI_FW_UPLOAD_ITYPE_FW_IOC_MEM (0x00) +#define MPI_FW_UPLOAD_ITYPE_FW_FLASH (0x01) +#define MPI_FW_UPLOAD_ITYPE_BIOS_FLASH (0x02) +#define MPI_FW_UPLOAD_ITYPE_NVDATA (0x03) +#define MPI_FW_UPLOAD_ITYPE_BOOTLOADER (0x04) +#define MPI_FW_UPLOAD_ITYPE_FW_BACKUP (0x05) +#define MPI_FW_UPLOAD_ITYPE_MANUFACTURING (0x06) +#define MPI_FW_UPLOAD_ITYPE_CONFIG_1 (0x07) +#define MPI_FW_UPLOAD_ITYPE_CONFIG_2 (0x08) +#define MPI_FW_UPLOAD_ITYPE_MEGARAID (0x09) +#define MPI_FW_UPLOAD_ITYPE_COMPLETE (0x0A) +#define MPI_FW_UPLOAD_ITYPE_COMMON_BOOT_BLOCK (0x0B) + +typedef struct _FWUploadTCSGE +{ + U8 Reserved; /* 00h */ + U8 ContextSize; /* 01h */ + U8 DetailsLength; /* 02h */ + U8 Flags; /* 03h */ + U32 Reserved1; /* 04h */ + U32 ImageOffset; /* 08h */ + U32 ImageSize; /* 0Ch */ +} FW_UPLOAD_TCSGE, MPI_POINTER PTR_FW_UPLOAD_TCSGE, + FWUploadTCSGE_t, MPI_POINTER pFWUploadTCSGE_t; + +/* Firmware Upload reply */ +typedef struct _MSG_FW_UPLOAD_REPLY +{ + U8 ImageType; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 Reserved1[3]; /* 04h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved2; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 ActualImageSize; /* 14h */ +} MSG_FW_UPLOAD_REPLY, MPI_POINTER PTR_MSG_FW_UPLOAD_REPLY, + FWUploadReply_t, MPI_POINTER pFWUploadReply_t; + + +typedef struct _MPI_FW_HEADER +{ + U32 ArmBranchInstruction0; /* 00h */ + U32 Signature0; /* 04h */ + U32 Signature1; /* 08h */ + U32 Signature2; /* 0Ch */ + U32 ArmBranchInstruction1; /* 10h */ + U32 ArmBranchInstruction2; /* 14h */ + U32 Reserved; /* 18h */ + U32 Checksum; /* 1Ch */ + U16 VendorId; /* 20h */ + U16 ProductId; /* 22h */ + MPI_FW_VERSION FWVersion; /* 24h */ + U32 SeqCodeVersion; /* 28h */ + U32 ImageSize; /* 2Ch */ + U32 NextImageHeaderOffset; /* 30h */ + U32 LoadStartAddress; /* 34h */ + U32 IopResetVectorValue; /* 38h */ + U32 IopResetRegAddr; /* 3Ch */ + U32 VersionNameWhat; /* 40h */ + U8 VersionName[32]; /* 44h */ + U32 VendorNameWhat; /* 64h */ + U8 VendorName[32]; /* 68h */ +} MPI_FW_HEADER, MPI_POINTER PTR_MPI_FW_HEADER, + MpiFwHeader_t, MPI_POINTER pMpiFwHeader_t; + +#define MPI_FW_HEADER_WHAT_SIGNATURE (0x29232840) + +/* defines for using the ProductId field */ +#define MPI_FW_HEADER_PID_TYPE_MASK (0xF000) +#define MPI_FW_HEADER_PID_TYPE_SCSI (0x0000) +#define MPI_FW_HEADER_PID_TYPE_FC (0x1000) +#define MPI_FW_HEADER_PID_TYPE_SAS (0x2000) + +#define MPI_FW_HEADER_SIGNATURE_0 (0x5AEAA55A) +#define MPI_FW_HEADER_SIGNATURE_1 (0xA55AEAA5) +#define MPI_FW_HEADER_SIGNATURE_2 (0x5AA55AEA) + +#define MPI_FW_HEADER_PID_PROD_MASK (0x0F00) +#define MPI_FW_HEADER_PID_PROD_INITIATOR_SCSI (0x0100) +#define MPI_FW_HEADER_PID_PROD_TARGET_INITIATOR_SCSI (0x0200) +#define MPI_FW_HEADER_PID_PROD_TARGET_SCSI (0x0300) +#define MPI_FW_HEADER_PID_PROD_IM_SCSI (0x0400) +#define MPI_FW_HEADER_PID_PROD_IS_SCSI (0x0500) +#define MPI_FW_HEADER_PID_PROD_CTX_SCSI (0x0600) +#define MPI_FW_HEADER_PID_PROD_IR_SCSI (0x0700) + +#define MPI_FW_HEADER_PID_FAMILY_MASK (0x00FF) +/* SCSI */ +#define MPI_FW_HEADER_PID_FAMILY_1030A0_SCSI (0x0001) +#define MPI_FW_HEADER_PID_FAMILY_1030B0_SCSI (0x0002) +#define MPI_FW_HEADER_PID_FAMILY_1030B1_SCSI (0x0003) +#define MPI_FW_HEADER_PID_FAMILY_1030C0_SCSI (0x0004) +#define MPI_FW_HEADER_PID_FAMILY_1020A0_SCSI (0x0005) +#define MPI_FW_HEADER_PID_FAMILY_1020B0_SCSI (0x0006) +#define MPI_FW_HEADER_PID_FAMILY_1020B1_SCSI (0x0007) +#define MPI_FW_HEADER_PID_FAMILY_1020C0_SCSI (0x0008) +#define MPI_FW_HEADER_PID_FAMILY_1035A0_SCSI (0x0009) +#define MPI_FW_HEADER_PID_FAMILY_1035B0_SCSI (0x000A) +#define MPI_FW_HEADER_PID_FAMILY_1030TA0_SCSI (0x000B) +#define MPI_FW_HEADER_PID_FAMILY_1020TA0_SCSI (0x000C) +/* Fibre Channel */ +#define MPI_FW_HEADER_PID_FAMILY_909_FC (0x0000) +#define MPI_FW_HEADER_PID_FAMILY_919_FC (0x0001) /* 919 and 929 */ +#define MPI_FW_HEADER_PID_FAMILY_919X_FC (0x0002) /* 919X and 929X */ +#define MPI_FW_HEADER_PID_FAMILY_919XL_FC (0x0003) /* 919XL and 929XL */ +#define MPI_FW_HEADER_PID_FAMILY_939X_FC (0x0004) /* 939X and 949X */ +#define MPI_FW_HEADER_PID_FAMILY_959_FC (0x0005) +#define MPI_FW_HEADER_PID_FAMILY_949E_FC (0x0006) +/* SAS */ +#define MPI_FW_HEADER_PID_FAMILY_1064_SAS (0x0001) +#define MPI_FW_HEADER_PID_FAMILY_1068_SAS (0x0002) +#define MPI_FW_HEADER_PID_FAMILY_1078_SAS (0x0003) +#define MPI_FW_HEADER_PID_FAMILY_106xE_SAS (0x0004) /* 1068E, 1066E, and 1064E */ + +typedef struct _MPI_EXT_IMAGE_HEADER +{ + U8 ImageType; /* 00h */ + U8 Reserved; /* 01h */ + U16 Reserved1; /* 02h */ + U32 Checksum; /* 04h */ + U32 ImageSize; /* 08h */ + U32 NextImageHeaderOffset; /* 0Ch */ + U32 LoadStartAddress; /* 10h */ + U32 Reserved2; /* 14h */ +} MPI_EXT_IMAGE_HEADER, MPI_POINTER PTR_MPI_EXT_IMAGE_HEADER, + MpiExtImageHeader_t, MPI_POINTER pMpiExtImageHeader_t; + +/* defines for the ImageType field */ +#define MPI_EXT_IMAGE_TYPE_UNSPECIFIED (0x00) +#define MPI_EXT_IMAGE_TYPE_FW (0x01) +#define MPI_EXT_IMAGE_TYPE_NVDATA (0x03) +#define MPI_EXT_IMAGE_TYPE_BOOTLOADER (0x04) +#define MPI_EXT_IMAGE_TYPE_INITIALIZATION (0x05) + +#endif diff --git a/source/lsi/mpi_raid.h b/source/lsi/mpi_raid.h new file mode 100755 index 0000000..df91c41 --- /dev/null +++ b/source/lsi/mpi_raid.h @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2001-2008 LSI Corporation. + * + * + * Name: mpi_raid.h + * Title: MPI RAID message and structures + * Creation Date: February 27, 2001 + * + * mpi_raid.h Version: 01.05.05 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 02-27-01 01.01.01 Original release for this file. + * 03-27-01 01.01.02 Added structure offset comments. + * 08-08-01 01.02.01 Original release for v1.2 work. + * 09-28-01 01.02.02 Major rework for MPI v1.2 Integrated RAID changes. + * 10-04-01 01.02.03 Added ActionData defines for + * MPI_RAID_ACTION_DELETE_VOLUME action. + * 11-01-01 01.02.04 Added define for MPI_RAID_ACTION_ADATA_DO_NOT_SYNC. + * 03-14-02 01.02.05 Added define for MPI_RAID_ACTION_ADATA_LOW_LEVEL_INIT. + * 05-07-02 01.02.06 Added define for MPI_RAID_ACTION_ACTIVATE_VOLUME, + * MPI_RAID_ACTION_INACTIVATE_VOLUME, and + * MPI_RAID_ACTION_ADATA_INACTIVATE_ALL. + * 07-12-02 01.02.07 Added structures for Mailbox request and reply. + * 11-15-02 01.02.08 Added missing MsgContext field to MSG_MAILBOX_REQUEST. + * 04-01-03 01.02.09 New action data option flag for + * MPI_RAID_ACTION_DELETE_VOLUME. + * 05-11-04 01.03.01 Original release for MPI v1.3. + * 08-19-04 01.05.01 Original release for MPI v1.5. + * 01-15-05 01.05.02 Added defines for the two new RAID Actions for + * _SET_RESYNC_RATE and _SET_DATA_SCRUB_RATE. + * 02-28-07 01.05.03 Added new RAID Action, Device FW Update Mode, and + * associated defines. + * 08-07-07 01.05.04 Added Disable Full Rebuild bit to the ActionDataWord + * for the RAID Action MPI_RAID_ACTION_DISABLE_VOLUME. + * 01-15-08 01.05.05 Added define for MPI_RAID_ACTION_SET_VOLUME_NAME. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_RAID_H +#define MPI_RAID_H + + +/****************************************************************************** +* +* R A I D M e s s a g e s +* +*******************************************************************************/ + + +/****************************************************************************/ +/* RAID Action Request */ +/****************************************************************************/ + +typedef struct _MSG_RAID_ACTION +{ + U8 Action; /* 00h */ + U8 Reserved1; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 VolumeID; /* 04h */ + U8 VolumeBus; /* 05h */ + U8 PhysDiskNum; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Reserved2; /* 0Ch */ + U32 ActionDataWord; /* 10h */ + SGE_SIMPLE_UNION ActionDataSGE; /* 14h */ +} MSG_RAID_ACTION_REQUEST, MPI_POINTER PTR_MSG_RAID_ACTION_REQUEST, + MpiRaidActionRequest_t , MPI_POINTER pMpiRaidActionRequest_t; + + +/* RAID Action request Action values */ + +#define MPI_RAID_ACTION_STATUS (0x00) +#define MPI_RAID_ACTION_INDICATOR_STRUCT (0x01) +#define MPI_RAID_ACTION_CREATE_VOLUME (0x02) +#define MPI_RAID_ACTION_DELETE_VOLUME (0x03) +#define MPI_RAID_ACTION_DISABLE_VOLUME (0x04) +#define MPI_RAID_ACTION_ENABLE_VOLUME (0x05) +#define MPI_RAID_ACTION_QUIESCE_PHYS_IO (0x06) +#define MPI_RAID_ACTION_ENABLE_PHYS_IO (0x07) +#define MPI_RAID_ACTION_CHANGE_VOLUME_SETTINGS (0x08) +#define MPI_RAID_ACTION_PHYSDISK_OFFLINE (0x0A) +#define MPI_RAID_ACTION_PHYSDISK_ONLINE (0x0B) +#define MPI_RAID_ACTION_CHANGE_PHYSDISK_SETTINGS (0x0C) +#define MPI_RAID_ACTION_CREATE_PHYSDISK (0x0D) +#define MPI_RAID_ACTION_DELETE_PHYSDISK (0x0E) +#define MPI_RAID_ACTION_FAIL_PHYSDISK (0x0F) +#define MPI_RAID_ACTION_REPLACE_PHYSDISK (0x10) +#define MPI_RAID_ACTION_ACTIVATE_VOLUME (0x11) +#define MPI_RAID_ACTION_INACTIVATE_VOLUME (0x12) +#define MPI_RAID_ACTION_SET_RESYNC_RATE (0x13) +#define MPI_RAID_ACTION_SET_DATA_SCRUB_RATE (0x14) +#define MPI_RAID_ACTION_DEVICE_FW_UPDATE_MODE (0x15) +#define MPI_RAID_ACTION_SET_VOLUME_NAME (0x16) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_CREATE_VOLUME action */ +#define MPI_RAID_ACTION_ADATA_DO_NOT_SYNC (0x00000001) +#define MPI_RAID_ACTION_ADATA_LOW_LEVEL_INIT (0x00000002) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_DELETE_VOLUME action */ +#define MPI_RAID_ACTION_ADATA_KEEP_PHYS_DISKS (0x00000000) +#define MPI_RAID_ACTION_ADATA_DEL_PHYS_DISKS (0x00000001) + +#define MPI_RAID_ACTION_ADATA_KEEP_LBA0 (0x00000000) +#define MPI_RAID_ACTION_ADATA_ZERO_LBA0 (0x00000002) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_DISABLE_VOLUME action */ +#define MPI_RAID_ACTION_ADATA_DISABLE_FULL_REBUILD (0x00000001) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_ACTIVATE_VOLUME action */ +#define MPI_RAID_ACTION_ADATA_INACTIVATE_ALL (0x00000001) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_SET_RESYNC_RATE action */ +#define MPI_RAID_ACTION_ADATA_RESYNC_RATE_MASK (0x000000FF) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_SET_DATA_SCRUB_RATE action */ +#define MPI_RAID_ACTION_ADATA_DATA_SCRUB_RATE_MASK (0x000000FF) + +/* ActionDataWord defines for use with MPI_RAID_ACTION_DEVICE_FW_UPDATE_MODE action */ +#define MPI_RAID_ACTION_ADATA_ENABLE_FW_UPDATE (0x00000001) +#define MPI_RAID_ACTION_ADATA_MASK_FW_UPDATE_TIMEOUT (0x0000FF00) +#define MPI_RAID_ACTION_ADATA_SHIFT_FW_UPDATE_TIMEOUT (8) + + +/* RAID Action reply message */ + +typedef struct _MSG_RAID_ACTION_REPLY +{ + U8 Action; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 VolumeID; /* 04h */ + U8 VolumeBus; /* 05h */ + U8 PhysDiskNum; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 ActionStatus; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 VolumeStatus; /* 14h */ + U32 ActionData; /* 18h */ +} MSG_RAID_ACTION_REPLY, MPI_POINTER PTR_MSG_RAID_ACTION_REPLY, + MpiRaidActionReply_t, MPI_POINTER pMpiRaidActionReply_t; + + +/* RAID Volume reply ActionStatus values */ + +#define MPI_RAID_ACTION_ASTATUS_SUCCESS (0x0000) +#define MPI_RAID_ACTION_ASTATUS_INVALID_ACTION (0x0001) +#define MPI_RAID_ACTION_ASTATUS_FAILURE (0x0002) +#define MPI_RAID_ACTION_ASTATUS_IN_PROGRESS (0x0003) + + +/* RAID Volume reply RAID Volume Indicator structure */ + +typedef struct _MPI_RAID_VOL_INDICATOR +{ + U64 TotalBlocks; /* 00h */ + U64 BlocksRemaining; /* 08h */ +} MPI_RAID_VOL_INDICATOR, MPI_POINTER PTR_MPI_RAID_VOL_INDICATOR, + MpiRaidVolIndicator_t, MPI_POINTER pMpiRaidVolIndicator_t; + + +/****************************************************************************/ +/* SCSI IO RAID Passthrough Request */ +/****************************************************************************/ + +typedef struct _MSG_SCSI_IO_RAID_PT_REQUEST +{ + U8 PhysDiskNum; /* 00h */ + U8 Reserved1; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U8 CDBLength; /* 04h */ + U8 SenseBufferLength; /* 05h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 LUN[8]; /* 0Ch */ + U32 Control; /* 14h */ + U8 CDB[16]; /* 18h */ + U32 DataLength; /* 28h */ + U32 SenseBufferLowAddr; /* 2Ch */ + SGE_IO_UNION SGL; /* 30h */ +} MSG_SCSI_IO_RAID_PT_REQUEST, MPI_POINTER PTR_MSG_SCSI_IO_RAID_PT_REQUEST, + SCSIIORaidPassthroughRequest_t, MPI_POINTER pSCSIIORaidPassthroughRequest_t; + + +/* SCSI IO RAID Passthrough reply structure */ + +typedef struct _MSG_SCSI_IO_RAID_PT_REPLY +{ + U8 PhysDiskNum; /* 00h */ + U8 Reserved1; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U8 CDBLength; /* 04h */ + U8 SenseBufferLength; /* 05h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 SCSIStatus; /* 0Ch */ + U8 SCSIState; /* 0Dh */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 TransferCount; /* 14h */ + U32 SenseCount; /* 18h */ + U32 ResponseInfo; /* 1Ch */ +} MSG_SCSI_IO_RAID_PT_REPLY, MPI_POINTER PTR_MSG_SCSI_IO_RAID_PT_REPLY, + SCSIIORaidPassthroughReply_t, MPI_POINTER pSCSIIORaidPassthroughReply_t; + + +/****************************************************************************/ +/* Mailbox reqeust structure */ +/****************************************************************************/ + +typedef struct _MSG_MAILBOX_REQUEST +{ + U16 Reserved1; + U8 ChainOffset; + U8 Function; + U16 Reserved2; + U8 Reserved3; + U8 MsgFlags; + U32 MsgContext; + U8 Command[10]; + U16 Reserved4; + SGE_IO_UNION SGL; +} MSG_MAILBOX_REQUEST, MPI_POINTER PTR_MSG_MAILBOX_REQUEST, + MailboxRequest_t, MPI_POINTER pMailboxRequest_t; + + +/* Mailbox reply structure */ +typedef struct _MSG_MAILBOX_REPLY +{ + U16 Reserved1; /* 00h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved2; /* 04h */ + U8 Reserved3; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 MailboxStatus; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 Reserved4; /* 14h */ +} MSG_MAILBOX_REPLY, MPI_POINTER PTR_MSG_MAILBOX_REPLY, + MailboxReply_t, MPI_POINTER pMailboxReply_t; + +#endif + + + diff --git a/source/lsi/mpi_sas.h b/source/lsi/mpi_sas.h new file mode 100755 index 0000000..1f0e63f --- /dev/null +++ b/source/lsi/mpi_sas.h @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2004-2008 LSI Corporation. + * + * + * Name: mpi_sas.h + * Title: MPI Serial Attached SCSI structures and definitions + * Creation Date: August 19, 2004 + * + * mpi_sas.h Version: 01.05.05 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 08-19-04 01.05.01 Original release. + * 08-30-05 01.05.02 Added DeviceInfo bit for SEP. + * Added PrimFlags and Primitive field to SAS IO Unit + * Control request, and added a new operation code. + * 03-27-06 01.05.03 Added Force Full Discovery, Transmit Port Select Signal, + * and Remove Device operations to SAS IO Unit Control. + * Added DevHandle field to SAS IO Unit Control request and + * reply. + * 10-11-06 01.05.04 Fixed the name of a define for Operation field of SAS IO + * Unit Control request. + * 01-15-08 01.05.05 Added support for MPI_SAS_OP_SET_IOC_PARAMETER, + * including adding IOCParameter and IOCParameter value + * fields to SAS IO Unit Control Request. + * Added MPI_SAS_DEVICE_INFO_PRODUCT_SPECIFIC define. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_SAS_H +#define MPI_SAS_H + + +/* + * Values for SASStatus. + */ +#define MPI_SASSTATUS_SUCCESS (0x00) +#define MPI_SASSTATUS_UNKNOWN_ERROR (0x01) +#define MPI_SASSTATUS_INVALID_FRAME (0x02) +#define MPI_SASSTATUS_UTC_BAD_DEST (0x03) +#define MPI_SASSTATUS_UTC_BREAK_RECEIVED (0x04) +#define MPI_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED (0x05) +#define MPI_SASSTATUS_UTC_PORT_LAYER_REQUEST (0x06) +#define MPI_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED (0x07) +#define MPI_SASSTATUS_UTC_STP_RESOURCES_BUSY (0x08) +#define MPI_SASSTATUS_UTC_WRONG_DESTINATION (0x09) +#define MPI_SASSTATUS_SHORT_INFORMATION_UNIT (0x0A) +#define MPI_SASSTATUS_LONG_INFORMATION_UNIT (0x0B) +#define MPI_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA (0x0C) +#define MPI_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR (0x0D) +#define MPI_SASSTATUS_XFER_RDY_NOT_EXPECTED (0x0E) +#define MPI_SASSTATUS_DATA_INCORRECT_DATA_LENGTH (0x0F) +#define MPI_SASSTATUS_DATA_TOO_MUCH_READ_DATA (0x10) +#define MPI_SASSTATUS_DATA_OFFSET_ERROR (0x11) +#define MPI_SASSTATUS_SDSF_NAK_RECEIVED (0x12) +#define MPI_SASSTATUS_SDSF_CONNECTION_FAILED (0x13) +#define MPI_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT (0x14) + + +/* + * Values for the SAS DeviceInfo field used in SAS Device Status Change Event + * data and SAS IO Unit Configuration pages. + */ +#define MPI_SAS_DEVICE_INFO_PRODUCT_SPECIFIC (0xF0000000) + +#define MPI_SAS_DEVICE_INFO_SEP (0x00004000) +#define MPI_SAS_DEVICE_INFO_ATAPI_DEVICE (0x00002000) +#define MPI_SAS_DEVICE_INFO_LSI_DEVICE (0x00001000) +#define MPI_SAS_DEVICE_INFO_DIRECT_ATTACH (0x00000800) +#define MPI_SAS_DEVICE_INFO_SSP_TARGET (0x00000400) +#define MPI_SAS_DEVICE_INFO_STP_TARGET (0x00000200) +#define MPI_SAS_DEVICE_INFO_SMP_TARGET (0x00000100) +#define MPI_SAS_DEVICE_INFO_SATA_DEVICE (0x00000080) +#define MPI_SAS_DEVICE_INFO_SSP_INITIATOR (0x00000040) +#define MPI_SAS_DEVICE_INFO_STP_INITIATOR (0x00000020) +#define MPI_SAS_DEVICE_INFO_SMP_INITIATOR (0x00000010) +#define MPI_SAS_DEVICE_INFO_SATA_HOST (0x00000008) + +#define MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE (0x00000007) +#define MPI_SAS_DEVICE_INFO_NO_DEVICE (0x00000000) +#define MPI_SAS_DEVICE_INFO_END_DEVICE (0x00000001) +#define MPI_SAS_DEVICE_INFO_EDGE_EXPANDER (0x00000002) +#define MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER (0x00000003) + + + +/***************************************************************************** +* +* S e r i a l A t t a c h e d S C S I M e s s a g e s +* +*****************************************************************************/ + +/****************************************************************************/ +/* Serial Management Protocol Passthrough Request */ +/****************************************************************************/ + +typedef struct _MSG_SMP_PASSTHROUGH_REQUEST +{ + U8 PassthroughFlags; /* 00h */ + U8 PhysicalPort; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 RequestDataLength; /* 04h */ + U8 ConnectionRate; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Reserved1; /* 0Ch */ + U64 SASAddress; /* 10h */ + U32 Reserved2; /* 18h */ + U32 Reserved3; /* 1Ch */ + SGE_SIMPLE_UNION SGL; /* 20h */ +} MSG_SMP_PASSTHROUGH_REQUEST, MPI_POINTER PTR_MSG_SMP_PASSTHROUGH_REQUEST, + SmpPassthroughRequest_t, MPI_POINTER pSmpPassthroughRequest_t; + +/* values for PassthroughFlags field */ +#define MPI_SMP_PT_REQ_PT_FLAGS_IMMEDIATE (0x80) + +/* values for ConnectionRate field */ +#define MPI_SMP_PT_REQ_CONNECT_RATE_NEGOTIATED (0x00) +#define MPI_SMP_PT_REQ_CONNECT_RATE_1_5 (0x08) +#define MPI_SMP_PT_REQ_CONNECT_RATE_3_0 (0x09) + + +/* Serial Management Protocol Passthrough Reply */ +typedef struct _MSG_SMP_PASSTHROUGH_REPLY +{ + U8 PassthroughFlags; /* 00h */ + U8 PhysicalPort; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 ResponseDataLength; /* 04h */ + U8 Reserved1; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Reserved2; /* 0Ch */ + U8 SASStatus; /* 0Dh */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 Reserved3; /* 14h */ + U8 ResponseData[4]; /* 18h */ +} MSG_SMP_PASSTHROUGH_REPLY, MPI_POINTER PTR_MSG_SMP_PASSTHROUGH_REPLY, + SmpPassthroughReply_t, MPI_POINTER pSmpPassthroughReply_t; + +#define MPI_SMP_PT_REPLY_PT_FLAGS_IMMEDIATE (0x80) + + +/****************************************************************************/ +/* SATA Passthrough Request */ +/****************************************************************************/ + +typedef struct _MSG_SATA_PASSTHROUGH_REQUEST +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 PassthroughFlags; /* 04h */ + U8 ConnectionRate; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Reserved1; /* 0Ch */ + U32 Reserved2; /* 10h */ + U32 Reserved3; /* 14h */ + U32 DataLength; /* 18h */ + U8 CommandFIS[20]; /* 1Ch */ + SGE_SIMPLE_UNION SGL; /* 30h */ +} MSG_SATA_PASSTHROUGH_REQUEST, MPI_POINTER PTR_MSG_SATA_PASSTHROUGH_REQUEST, + SataPassthroughRequest_t, MPI_POINTER pSataPassthroughRequest_t; + +/* values for PassthroughFlags field */ +#define MPI_SATA_PT_REQ_PT_FLAGS_RESET_DEVICE (0x0200) +#define MPI_SATA_PT_REQ_PT_FLAGS_EXECUTE_DIAG (0x0100) +#define MPI_SATA_PT_REQ_PT_FLAGS_DMA_QUEUED (0x0080) +#define MPI_SATA_PT_REQ_PT_FLAGS_PACKET_COMMAND (0x0040) +#define MPI_SATA_PT_REQ_PT_FLAGS_DMA (0x0020) +#define MPI_SATA_PT_REQ_PT_FLAGS_PIO (0x0010) +#define MPI_SATA_PT_REQ_PT_FLAGS_UNSPECIFIED_VU (0x0004) +#define MPI_SATA_PT_REQ_PT_FLAGS_WRITE (0x0002) +#define MPI_SATA_PT_REQ_PT_FLAGS_READ (0x0001) + +/* values for ConnectionRate field */ +#define MPI_SATA_PT_REQ_CONNECT_RATE_NEGOTIATED (0x00) +#define MPI_SATA_PT_REQ_CONNECT_RATE_1_5 (0x08) +#define MPI_SATA_PT_REQ_CONNECT_RATE_3_0 (0x09) + + +/* SATA Passthrough Reply */ +typedef struct _MSG_SATA_PASSTHROUGH_REPLY +{ + U8 TargetID; /* 00h */ + U8 Bus; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 PassthroughFlags; /* 04h */ + U8 Reserved1; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Reserved2; /* 0Ch */ + U8 SASStatus; /* 0Dh */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U8 StatusFIS[20]; /* 14h */ + U32 StatusControlRegisters; /* 28h */ + U32 TransferCount; /* 2Ch */ +} MSG_SATA_PASSTHROUGH_REPLY, MPI_POINTER PTR_MSG_SATA_PASSTHROUGH_REPLY, + SataPassthroughReply_t, MPI_POINTER pSataPassthroughReply_t; + + + + +/****************************************************************************/ +/* SAS IO Unit Control Request */ +/****************************************************************************/ + +typedef struct _MSG_SAS_IOUNIT_CONTROL_REQUEST +{ + U8 Operation; /* 00h */ + U8 Reserved1; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 DevHandle; /* 04h */ + U8 IOCParameter; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 TargetID; /* 0Ch */ + U8 Bus; /* 0Dh */ + U8 PhyNum; /* 0Eh */ + U8 PrimFlags; /* 0Fh */ + U32 Primitive; /* 10h */ + U64 SASAddress; /* 14h */ + U32 IOCParameterValue; /* 1Ch */ +} MSG_SAS_IOUNIT_CONTROL_REQUEST, MPI_POINTER PTR_MSG_SAS_IOUNIT_CONTROL_REQUEST, + SasIoUnitControlRequest_t, MPI_POINTER pSasIoUnitControlRequest_t; + +/* values for the Operation field */ +#define MPI_SAS_OP_CLEAR_NOT_PRESENT (0x01) +#define MPI_SAS_OP_CLEAR_ALL_PERSISTENT (0x02) +#define MPI_SAS_OP_PHY_LINK_RESET (0x06) +#define MPI_SAS_OP_PHY_HARD_RESET (0x07) +#define MPI_SAS_OP_PHY_CLEAR_ERROR_LOG (0x08) +#define MPI_SAS_OP_MAP_CURRENT (0x09) +#define MPI_SAS_OP_SEND_PRIMITIVE (0x0A) +#define MPI_SAS_OP_FORCE_FULL_DISCOVERY (0x0B) +#define MPI_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL (0x0C) +#define MPI_SAS_OP_TRANSMIT_REMOVE_DEVICE (0x0D) /* obsolete name */ +#define MPI_SAS_OP_REMOVE_DEVICE (0x0D) +#define MPI_SAS_OP_SET_IOC_PARAMETER (0x0E) +#define MPI_SAS_OP_PRODUCT_SPECIFIC_MIN (0x80) + +/* values for the PrimFlags field */ +#define MPI_SAS_PRIMFLAGS_SINGLE (0x08) +#define MPI_SAS_PRIMFLAGS_TRIPLE (0x02) +#define MPI_SAS_PRIMFLAGS_REDUNDANT (0x01) + + +/* SAS IO Unit Control Reply */ +typedef struct _MSG_SAS_IOUNIT_CONTROL_REPLY +{ + U8 Operation; /* 00h */ + U8 Reserved1; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 DevHandle; /* 04h */ + U8 IOCParameter; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved4; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_SAS_IOUNIT_CONTROL_REPLY, MPI_POINTER PTR_MSG_SAS_IOUNIT_CONTROL_REPLY, + SasIoUnitControlReply_t, MPI_POINTER pSasIoUnitControlReply_t; + +#endif + + diff --git a/source/lsi/mpi_tool.h b/source/lsi/mpi_tool.h new file mode 100755 index 0000000..1d8e37b --- /dev/null +++ b/source/lsi/mpi_tool.h @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2001-2008 LSI Corporation. + * + * + * Name: mpi_tool.h + * Title: MPI Toolbox structures and definitions + * Creation Date: July 30, 2001 + * + * mpi_tool.h Version: 01.05.03 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 08-08-01 01.02.01 Original release. + * 08-29-01 01.02.02 Added DIAG_DATA_UPLOAD_HEADER and related defines. + * 01-16-04 01.02.03 Added defines and structures for new tools + *. MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL and + * MPI_TOOLBOX_FC_MANAGEMENT_TOOL. + * 04-29-04 01.02.04 Added message structures for Diagnostic Buffer Post and + * Diagnostic Release requests and replies. + * 05-11-04 01.03.01 Original release for MPI v1.3. + * 08-19-04 01.05.01 Original release for MPI v1.5. + * 10-06-04 01.05.02 Added define for MPI_DIAG_BUF_TYPE_COUNT. + * 02-09-05 01.05.03 Added frame size option to FC management tool. + * Added Beacon tool to the Toolbox. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_TOOL_H +#define MPI_TOOL_H + +#define MPI_TOOLBOX_CLEAN_TOOL (0x00) +#define MPI_TOOLBOX_MEMORY_MOVE_TOOL (0x01) +#define MPI_TOOLBOX_DIAG_DATA_UPLOAD_TOOL (0x02) +#define MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL (0x03) +#define MPI_TOOLBOX_FC_MANAGEMENT_TOOL (0x04) +#define MPI_TOOLBOX_BEACON_TOOL (0x05) + + +/****************************************************************************/ +/* Toolbox reply */ +/****************************************************************************/ + +typedef struct _MSG_TOOLBOX_REPLY +{ + U8 Tool; /* 00h */ + U8 Reserved; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_TOOLBOX_REPLY, MPI_POINTER PTR_MSG_TOOLBOX_REPLY, + ToolboxReply_t, MPI_POINTER pToolboxReply_t; + + +/****************************************************************************/ +/* Toolbox Clean Tool request */ +/****************************************************************************/ + +typedef struct _MSG_TOOLBOX_CLEAN_REQUEST +{ + U8 Tool; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Flags; /* 0Ch */ +} MSG_TOOLBOX_CLEAN_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_CLEAN_REQUEST, + ToolboxCleanRequest_t, MPI_POINTER pToolboxCleanRequest_t; + +#define MPI_TOOLBOX_CLEAN_NVSRAM (0x00000001) +#define MPI_TOOLBOX_CLEAN_SEEPROM (0x00000002) +#define MPI_TOOLBOX_CLEAN_FLASH (0x00000004) +#define MPI_TOOLBOX_CLEAN_BOOTLOADER (0x04000000) +#define MPI_TOOLBOX_CLEAN_FW_BACKUP (0x08000000) +#define MPI_TOOLBOX_CLEAN_FW_CURRENT (0x10000000) +#define MPI_TOOLBOX_CLEAN_OTHER_PERSIST_PAGES (0x20000000) +#define MPI_TOOLBOX_CLEAN_PERSIST_MANUFACT_PAGES (0x40000000) +#define MPI_TOOLBOX_CLEAN_BOOT_SERVICES (0x80000000) + + +/****************************************************************************/ +/* Toolbox Memory Move request */ +/****************************************************************************/ + +typedef struct _MSG_TOOLBOX_MEM_MOVE_REQUEST +{ + U8 Tool; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + SGE_SIMPLE_UNION SGL; /* 0Ch */ +} MSG_TOOLBOX_MEM_MOVE_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_MEM_MOVE_REQUEST, + ToolboxMemMoveRequest_t, MPI_POINTER pToolboxMemMoveRequest_t; + + +/****************************************************************************/ +/* Toolbox Diagnostic Data Upload request */ +/****************************************************************************/ + +typedef struct _MSG_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST +{ + U8 Tool; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 Flags; /* 0Ch */ + U32 Reserved3; /* 10h */ + SGE_SIMPLE_UNION SGL; /* 14h */ +} MSG_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_DIAG_DATA_UPLOAD_REQUEST, + ToolboxDiagDataUploadRequest_t, MPI_POINTER pToolboxDiagDataUploadRequest_t; + +typedef struct _DIAG_DATA_UPLOAD_HEADER +{ + U32 DiagDataLength; /* 00h */ + U8 FormatCode; /* 04h */ + U8 Reserved; /* 05h */ + U16 Reserved1; /* 06h */ +} DIAG_DATA_UPLOAD_HEADER, MPI_POINTER PTR_DIAG_DATA_UPLOAD_HEADER, + DiagDataUploadHeader_t, MPI_POINTER pDiagDataUploadHeader_t; + +#define MPI_TB_DIAG_FORMAT_SCSI_PRINTF_1 (0x01) +#define MPI_TB_DIAG_FORMAT_SCSI_2 (0x02) +#define MPI_TB_DIAG_FORMAT_SCSI_3 (0x03) +#define MPI_TB_DIAG_FORMAT_FC_TRACE_1 (0x04) + + +/****************************************************************************/ +/* Toolbox ISTWI Read Write request */ +/****************************************************************************/ + +typedef struct _MSG_TOOLBOX_ISTWI_READ_WRITE_REQUEST +{ + U8 Tool; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Flags; /* 0Ch */ + U8 BusNum; /* 0Dh */ + U16 Reserved3; /* 0Eh */ + U8 NumAddressBytes; /* 10h */ + U8 Reserved4; /* 11h */ + U16 DataLength; /* 12h */ + U8 DeviceAddr; /* 14h */ + U8 Addr1; /* 15h */ + U8 Addr2; /* 16h */ + U8 Addr3; /* 17h */ + U32 Reserved5; /* 18h */ + SGE_SIMPLE_UNION SGL; /* 1Ch */ +} MSG_TOOLBOX_ISTWI_READ_WRITE_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_ISTWI_READ_WRITE_REQUEST, + ToolboxIstwiReadWriteRequest_t, MPI_POINTER pToolboxIstwiReadWriteRequest_t; + +#define MPI_TB_ISTWI_FLAGS_WRITE (0x00) +#define MPI_TB_ISTWI_FLAGS_READ (0x01) + + +/****************************************************************************/ +/* Toolbox FC Management request */ +/****************************************************************************/ + +/* ActionInfo for Bus and TargetId */ +typedef struct _MPI_TB_FC_MANAGE_BUS_TID_AI +{ + U16 Reserved; /* 00h */ + U8 Bus; /* 02h */ + U8 TargetId; /* 03h */ +} MPI_TB_FC_MANAGE_BUS_TID_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_BUS_TID_AI, + MpiTbFcManageBusTidAi_t, MPI_POINTER pMpiTbFcManageBusTidAi_t; + +/* ActionInfo for port identifier */ +typedef struct _MPI_TB_FC_MANAGE_PID_AI +{ + U32 PortIdentifier; /* 00h */ +} MPI_TB_FC_MANAGE_PID_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_PID_AI, + MpiTbFcManagePidAi_t, MPI_POINTER pMpiTbFcManagePidAi_t; + +/* ActionInfo for set max frame size */ +typedef struct _MPI_TB_FC_MANAGE_FRAME_SIZE_AI +{ + U16 FrameSize; /* 00h */ + U8 PortNum; /* 02h */ + U8 Reserved1; /* 03h */ +} MPI_TB_FC_MANAGE_FRAME_SIZE_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_FRAME_SIZE_AI, + MpiTbFcManageFrameSizeAi_t, MPI_POINTER pMpiTbFcManageFrameSizeAi_t; + +/* ActionInfo for set login parameters */ +typedef struct _MPI_TB_FC_MANAGE_LOGIN_PARAMS_AI +{ + U8 Count; /* 00h */ + U8 Period; /* 01h */ + U8 PortNum; /* 02h */ + U8 Reserved1; /* 03h */ + U8 FlogiBurst; /* 04h */ + U8 FlogiExchanges; /* 05h */ + U8 PlogiBurst; /* 06h */ + U8 PlogiExchanges; /* 07h */ +} MPI_TB_FC_MANAGE_LOGIN_PARAMS_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_LOGIN_PARAMS_AI, + MpiTbFcManageLoginParamsAi_t, MPI_POINTER pMpiTbFcManageLoginParamsAi_t; + +/* ActionInfo for create virtual port */ +typedef struct _MPI_TB_FC_MANAGE_CREATE_VP_AI +{ + U32 PortIdentifier; /* 00h */ + U64 WWNN; /* 04h */ + U64 WWPN; /* 0Ch */ +} MPI_TB_FC_MANAGE_CREATE_VP_AI, MPI_POINTER PTR_MPI_TB_FC_MANAGE_CREATE_VP_AI, + MpiTbFcManageCreateVpAi_t, MPI_POINTER pMpiTbFcManageCreateVp_t; + +/* union of ActionInfo */ +typedef union _MPI_TB_FC_MANAGE_AI_UNION +{ + MPI_TB_FC_MANAGE_BUS_TID_AI BusTid; + MPI_TB_FC_MANAGE_PID_AI Port; + MPI_TB_FC_MANAGE_FRAME_SIZE_AI FrameSize; + MPI_TB_FC_MANAGE_LOGIN_PARAMS_AI LoginParams; + MPI_TB_FC_MANAGE_CREATE_VP_AI CreateVp; +} MPI_TB_FC_MANAGE_AI_UNION, MPI_POINTER PTR_MPI_TB_FC_MANAGE_AI_UNION, + MpiTbFcManageAiUnion_t, MPI_POINTER pMpiTbFcManageAiUnion_t; + +typedef struct _MSG_TOOLBOX_FC_MANAGE_REQUEST +{ + U8 Tool; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 Action; /* 0Ch */ + U8 Flags; /* 0Dh */ + U16 Reserved4; /* 0Eh */ + MPI_TB_FC_MANAGE_AI_UNION ActionInfo; /* 10h */ +} MSG_TOOLBOX_FC_MANAGE_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_FC_MANAGE_REQUEST, + ToolboxFcManageRequest_t, MPI_POINTER pToolboxFcManageRequest_t; + +/* defines for the Action field */ +#define MPI_TB_FC_MANAGE_ACTION_DISC_ALL (0x00) +#define MPI_TB_FC_MANAGE_ACTION_DISC_PID (0x01) +#define MPI_TB_FC_MANAGE_ACTION_DISC_BUS_TID (0x02) +#define MPI_TB_FC_MANAGE_ACTION_SET_MAX_FRAME_SIZE (0x03) +#define MPI_TB_FC_MANAGE_ACTION_LOGOUT_PID (0x04) +#define MPI_TB_FC_MANAGE_ACTION_LOGOUT_BUS_TID (0x05) +#define MPI_TB_FC_MANAGE_ACTION_SET_LOGIN_PARAMS (0x06) +#define MPI_TB_FC_MANAGE_ACTION_GET_LOGIN_PARAMS (0x07) +#define MPI_TB_FC_MANAGE_ACTION_CREATE_VP (0x08) +#define MPI_TB_FC_MANAGE_ACTION_DELETE_VP (0x09) + +/* defines for the Flags field */ +#define MPI_TB_FC_MANAGE_FLAGS_KEEP_LOGGED_OUT (0x01) +#define MPI_TB_FC_MANAGE_FLAGS_AUTO_RETRY (0x02) + +typedef struct _MSG_TOOLBOX_FC_MANAGE_REPLY +{ + U8 Tool; /* 00h */ + U8 AliasIndex; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved3; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 Reserved4[3]; /* 14h */ + MPI_TB_FC_MANAGE_AI_UNION ActionInfo; /* 20h */ +} MSG_TOOLBOX_FC_MANAGE_REPLY, MPI_POINTER PTR_MSG_TOOLBOX_FC_MANAGE_REPLY, + ToolboxFcManageReply_t, MPI_POINTER pToolboxFcManageReply_t; + + +/****************************************************************************/ +/* Toolbox Beacon Tool request */ +/****************************************************************************/ + +typedef struct _MSG_TOOLBOX_BEACON_REQUEST +{ + U8 Tool; /* 00h */ + U8 Reserved; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U8 ConnectNum; /* 0Ch */ + U8 PortNum; /* 0Dh */ + U8 Reserved3; /* 0Eh */ + U8 Flags; /* 0Fh */ +} MSG_TOOLBOX_BEACON_REQUEST, MPI_POINTER PTR_MSG_TOOLBOX_BEACON_REQUEST, + ToolboxBeaconRequest_t, MPI_POINTER pToolboxBeaconRequest_t; + +#define MPI_TOOLBOX_FLAGS_BEACON_MODE_OFF (0x00) +#define MPI_TOOLBOX_FLAGS_BEACON_MODE_ON (0x01) + + +/****************************************************************************/ +/* Diagnostic Buffer Post request */ +/****************************************************************************/ + +typedef struct _MSG_DIAG_BUFFER_POST_REQUEST +{ + U8 TraceLevel; /* 00h */ + U8 BufferType; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved1; /* 04h */ + U8 Reserved2; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U32 ExtendedType; /* 0Ch */ + U32 BufferLength; /* 10h */ + U32 ProductSpecific[4]; /* 14h */ + U32 Reserved3; /* 24h */ + U64 BufferAddress; /* 28h */ +} MSG_DIAG_BUFFER_POST_REQUEST, MPI_POINTER PTR_MSG_DIAG_BUFFER_POST_REQUEST, + DiagBufferPostRequest_t, MPI_POINTER pDiagBufferPostRequest_t; + +#define MPI_DIAG_BUF_TYPE_TRACE (0x00) +#define MPI_DIAG_BUF_TYPE_SNAPSHOT (0x01) +#define MPI_DIAG_BUF_TYPE_EXTENDED (0x02) +/* count of the number of buffer types */ +#define MPI_DIAG_BUF_TYPE_COUNT (0x03) + +#define MPI_DIAG_EXTENDED_QTAG (0x00000001) + + +/* Diagnostic Buffer Post reply */ +typedef struct _MSG_DIAG_BUFFER_POST_REPLY +{ + U8 Reserved1; /* 00h */ + U8 BufferType; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved2; /* 04h */ + U8 Reserved3; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved4; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ + U32 TransferLength; /* 14h */ +} MSG_DIAG_BUFFER_POST_REPLY, MPI_POINTER PTR_MSG_DIAG_BUFFER_POST_REPLY, + DiagBufferPostReply_t, MPI_POINTER pDiagBufferPostReply_t; + + +/****************************************************************************/ +/* Diagnostic Release request */ +/****************************************************************************/ + +typedef struct _MSG_DIAG_RELEASE_REQUEST +{ + U8 Reserved1; /* 00h */ + U8 BufferType; /* 01h */ + U8 ChainOffset; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved2; /* 04h */ + U8 Reserved3; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ +} MSG_DIAG_RELEASE_REQUEST, MPI_POINTER PTR_MSG_DIAG_RELEASE_REQUEST, + DiagReleaseRequest_t, MPI_POINTER pDiagReleaseRequest_t; + + +/* Diagnostic Release reply */ +typedef struct _MSG_DIAG_RELEASE_REPLY +{ + U8 Reserved1; /* 00h */ + U8 BufferType; /* 01h */ + U8 MsgLength; /* 02h */ + U8 Function; /* 03h */ + U16 Reserved2; /* 04h */ + U8 Reserved3; /* 06h */ + U8 MsgFlags; /* 07h */ + U32 MsgContext; /* 08h */ + U16 Reserved4; /* 0Ch */ + U16 IOCStatus; /* 0Eh */ + U32 IOCLogInfo; /* 10h */ +} MSG_DIAG_RELEASE_REPLY, MPI_POINTER PTR_MSG_DIAG_RELEASE_REPLY, + DiagReleaseReply_t, MPI_POINTER pDiagReleaseReply_t; + + +#endif + + diff --git a/source/lsi/mpi_type.h b/source/lsi/mpi_type.h new file mode 100755 index 0000000..6e71c00 --- /dev/null +++ b/source/lsi/mpi_type.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2000-2008 LSI Corporation. + * + * + * Name: mpi_type.h + * Title: MPI Basic type definitions + * Creation Date: June 6, 2000 + * + * mpi_type.h Version: 01.05.02 + * + * Version History + * --------------- + * + * Date Version Description + * -------- -------- ------------------------------------------------------ + * 05-08-00 00.10.01 Original release for 0.10 spec dated 4/26/2000. + * 06-06-00 01.00.01 Update version number for 1.0 release. + * 11-02-00 01.01.01 Original release for post 1.0 work + * 02-20-01 01.01.02 Added define and ifdef for MPI_POINTER. + * 08-08-01 01.02.01 Original release for v1.2 work. + * 05-11-04 01.03.01 Original release for MPI v1.3. + * 08-19-04 01.05.01 Original release for MPI v1.5. + * 08-30-05 01.05.02 Added PowerPC option to #ifdef's. + * -------------------------------------------------------------------------- + */ + +#ifndef MPI_TYPE_H +#define MPI_TYPE_H + + +/******************************************************************************* + * Define MPI_POINTER if it hasn't already been defined. By default MPI_POINTER + * is defined to be a near pointer. MPI_POINTER can be defined as a far pointer + * by defining MPI_POINTER as "far *" before this header file is included. + */ +#ifndef MPI_POINTER +#define MPI_POINTER * +#endif + + +/***************************************************************************** +* +* B a s i c T y p e s +* +*****************************************************************************/ + +typedef signed char S8; +typedef unsigned char U8; +typedef signed short S16; +typedef unsigned short U16; + + +#if defined(unix) || defined(__arm) || defined(ALPHA) || defined(__PPC__) || defined(__ppc) + + typedef signed int S32; + typedef unsigned int U32; + +#else + + typedef signed long S32; + typedef unsigned long U32; + +#endif + + +typedef struct _S64 +{ + U32 Low; + S32 High; +} S64; + +typedef struct _U64 +{ + U32 Low; + U32 High; +} U64; + + +/****************************************************************************/ +/* Pointers */ +/****************************************************************************/ + +typedef S8 *PS8; +typedef U8 *PU8; +typedef S16 *PS16; +typedef U16 *PU16; +typedef S32 *PS32; +typedef U32 *PU32; +typedef S64 *PS64; +typedef U64 *PU64; + + +#endif + diff --git a/source/lsiutil.c b/source/lsiutil.c new file mode 100755 index 0000000..04f6c8b --- /dev/null +++ b/source/lsiutil.c @@ -0,0 +1,43217 @@ +/*************************************************************************** + * * + * Copyright (c) 2002-2013 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** + * LSIUtil -- configuration utility for MPT adapters (FC, SCSI, and SAS/SATA) + * + * Written by Stephen F. Shirron, October 11, 2002 +*/ + +#define LSIUTIL_VERSION "Version 1.72, Sep 09, 2014" + + +char what[] = "@(#)LSI Logic MPT Configuration Utility, " LSIUTIL_VERSION; + +/* SAS3108 FPGA-specific defines*/ +#define SAS3108_FPGA_WORKAROUND (1) +#define SAS3108_FPGA_VENDORID (0x702) + + +#ifndef MAX_DEVICES +#define MAX_DEVICES 99 +#endif + + +#ifndef REGISTER_ACCESS +#define REGISTER_ACCESS 1 +#endif + + +#ifndef VERIFY_ENDIANNESS +#define VERIFY_ENDIANNESS 0 +#endif + + +#if !EFI +#include +#if WIN32 +#include +#else +#define _cdecl +#endif +#include +#include +#include +#include +#include +#include +#if WIN32 +#include +#include "inc/devioctl.h" +#include +#include +#ifdef _CONSOLE +#pragma warning(disable:4242) +#include "inc/getopt.h" +#define sleep(x) _sleep(x*1000) +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#if !_WIN64 +typedef unsigned long ULONG_PTR; +#endif +#define stricmp _stricmp +#define strnicmp _strnicmp +#define open _open +#define close _close +#define read _read +#define write _write +#define stat _stat +#define fstat _fstat +#define INT64_FMT "I64" +#else +#define INT64_FMT "ll" +#include +#include +int optopt; +int optind; +#endif +#define strcasecmp stricmp +#define strncasecmp strnicmp +#include "inc/ntddscsi.h" +/* MINGW is a little different from the DDK */ +#if __MINGW32__ +#define offsetof(type,member) ((size_t)&((type *)0)->member) +#define sleep(x) Sleep(x*1000) +#endif +#endif +#if __linux__ || __sparc__ || __irix__ || __alpha__ +#include +#include +#include +#include +#include +#include +#include +#define FALSE 0 +#define TRUE 1 +typedef int HANDLE; +#define O_BINARY 0 +#define min(x,y) ((int)(x) < (int)(y) ? (x) : (y)) +#define max(x,y) ((int)(x) > (int)(y) ? (x) : (y)) +#define INT64_FMT "ll" +#endif +#if __linux__ +#include +#ifndef offsetof +#define offsetof(type,member) ((size_t)&((type *)0)->member) +#endif +#define TotalBufferSize DataSize +#define DataBuffer DiagnosticData +#include +#if i386 +#include +#endif +#define LINUX_MOD_DEVICETABLE_H +#include +#include +#define REG_IO_READ 1 +#define REG_IO_WRITE 2 +#define REG_MEM_READ 3 +#define REG_MEM_WRITE 4 +#define REG_DIAG_READ 5 +#define REG_DIAG_WRITE 6 +#define REG_DIAG_WRITE_BYTE 7 +#endif +#if __sparc__ +#include +#include +#include +#include +typedef struct +{ + caddr_t client; + caddr_t phci; + caddr_t addr; + uint_t buf_elem; + void *ret_buf; + uint_t *ret_elem; +} sv_iocdata_t; +#define SCSI_VHCI_GET_CLIENT_NAME (('x' << 8) + 0x03) +#define NAME_MAX MAXNAMLEN +#define getmajor(x) (((x)>>NBITSMINOR)&MAXMAJ) +#define getminor(x) ((x)&MAXMIN) +#define MINOR2INST(x) ((x)>>6) +#endif +#if DOS +#include +#include +#include +#include +#include +#include +#include +#include "inc/getopt.h" +#define FALSE 0 +#define TRUE 1 +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +typedef unsigned int PHYSICAL_ADDRESS; +typedef unsigned int mpt_bus_addr_t; +typedef struct mpt_adap *HANDLE; +#define strcasecmp stricmp +#define strncasecmp strnicmp +#define DELAY(n) mpt_delay(adap, n) +#define REG_IO_READ 1 +#define REG_IO_WRITE 2 +#define REG_MEM_READ 3 +#define REG_MEM_WRITE 4 +#define REG_DIAG_READ 5 +#define REG_DIAG_WRITE 6 +#define REG_DIAG_WRITE_BYTE 7 +#define INT64_FMT "I64" +#endif +#endif +#if EFI +#if EFIEBC +#pragma warning(disable:175) +#endif +#define _cdecl +#include "helper.h" +#include "getopt.h" +#define O_BINARY 0 +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +typedef EFI_PHYSICAL_ADDRESS mpt_bus_addr_t; +typedef struct mpt_adap *HANDLE; +#define min(x,y) ((int)(x) < (int)(y) ? (x) : (y)) +#define max(x,y) ((int)(x) > (int)(y) ? (x) : (y)) +#define DELAY(n) mpt_delay(adap, n) +#define REG_IO_READ 1 +#define REG_IO_WRITE 2 +#define REG_MEM_READ 3 +#define REG_MEM_WRITE 4 +#define REG_DIAG_READ 5 +#define REG_DIAG_WRITE 6 +#define REG_DIAG_WRITE_BYTE 7 +#define INT64_FMT "ll" +extern EFI_HANDLE gImageHandle; +extern EFI_LOADED_IMAGE *gLoadedImage; +#endif +#if DOS || EFI +#define CHUNK_SIZE 0x10000 +#else +#define CHUNK_SIZE 0x4000 +#endif + + +typedef unsigned char U8; +typedef unsigned short U16; +typedef unsigned int U32; +typedef struct { U32 Low; U32 High; } U64; +#define MPI_POINTER * +#define MPI2_POINTER * + + +#if VERIFY_ENDIANNESS +typedef U16 * _U16; +typedef U32 * _U32; +typedef struct { _U32 Low; _U32 High; } _U64; +#else +typedef U16 _U16; +typedef U32 _U32; +typedef U64 _U64; +#endif + + +#if VERIFY_ENDIANNESS +#define U16 _U16 +#define U32 _U32 +#define U64 _U64 +#endif +#if WIN32 || __linux__ || __sparc__ || DOS || EFI +#pragma pack(1) +#include "lsi/mpi.h" +#include "lsi/mpi_ioc.h" +#include "lsi/mpi_cnfg.h" +#include "lsi/mpi_init.h" +#include "lsi/mpi_fc.h" +#include "lsi/mpi_sas.h" +#include "lsi/mpi_raid.h" +#include "lsi/mpi_tool.h" +#include "lsi/mpi2.h" +#include "lsi/mpi2_ioc.h" +#include "lsi/mpi2_cnfg.h" +#include "lsi/mpi2_init.h" +#include "lsi/mpi2_sas.h" +#include "lsi/mpi2_raid.h" +#include "lsi/mpi2_tool.h" +#pragma pack() +#endif +#if VERIFY_ENDIANNESS +#undef U16 +#undef U32 +#undef U64 +#endif + + +#if WIN32 +#include "inc/sym_dmi.h" +#define ISSUE_BUS_RESET 0x800000FF +typedef struct +{ + SRB_IO_CONTROL Sic; + UCHAR Buf[8+128+1024]; +} SRB_BUFFER; +typedef struct +{ + SRB_IO_CONTROL Sic; + ULONG DiagType; + UCHAR PageVersion[4]; + UCHAR Buf[64+32768]; +} SRB_DIAG_BUFFER; +#endif +#if __linux__ +#ifndef __user +#define __user +#endif +typedef unsigned long long uint64_t; +typedef U8 u8; +typedef U16 u16; +typedef U32 u32; +#include "inc/mptctl.h" +typedef U8 uint8_t; +typedef U16 uint16_t; +typedef U32 uint32_t; +#include "inc/mpt2sas_ctl.h" +#define IOCTL_NAME "/dev/" MPT_MISCDEV_BASENAME +#define IOCTL_NAME2 "/dev/" MPT2SAS_DEV_NAME +#define IOCTL_NAME3 "/dev/mpt3ctl" +#ifdef MPI_FW_DIAG_IOCTL +#define LINUX_DIAG 1 +typedef struct +{ + struct mpt2_ioctl_header hdr; + unsigned char buf[64+32768]; +} IOCTL_DIAG_BUFFER; +#endif +#endif +#if __sparc__ +#define TARGET_MPTx +typedef uint8_t UINT8; +typedef uint16_t UINT16; +typedef uint32_t UINT32; +typedef uint64_t UINT64; +#include "inc/dmi_ioctl.h" +#include "inc/mptsas_ioctl.h" +#endif +#if __irix__ +#define MPI_POINTER * +typedef uint8_t U8; +typedef uint16_t U16; +typedef uint32_t U32; +typedef struct +{ + U32 Low; + U32 High; +} mpiU64; +#pragma pack(1) +#define U64 mpiU64 +#include "mpi.h" +#include "mpi_ioc.h" +#include "mpi_cnfg.h" +#include "mpi_init.h" +#include "mpi_fc.h" +#include "mpi_sas.h" +#include "mpi_raid.h" +#include "mpi_tool.h" +#pragma pack(0) +#undef U64 +#define TARGET_MPT +typedef uint8_t UINT8; +typedef uint16_t UINT16; +typedef uint32_t UINT32; +typedef uint64_t UINT64; +#include "dmi_ioctl.h" +#include +#endif +#if __alpha__ +typedef unsigned __int64 uint64_t; +#define MPI_POINTER * +typedef unsigned char U8; +typedef unsigned short U16; +typedef unsigned int U32; +typedef unsigned long U64; +typedef struct +{ + U32 Low; + U32 High; +} mpiU64; +#pragma pack(1) +#define U64 mpiU64 +#include "mpi.h" +#include "mpi_ioc.h" +#include "mpi_cnfg.h" +#include "mpi_init.h" +#include "mpi_fc.h" +#include "mpi_sas.h" +#include "mpi_raid.h" +#include "mpi_tool.h" +#pragma pack(0) +#undef U64 +typedef U8 u8; +typedef U16 u16; +typedef U32 u32; +typedef U64 u64; +#include "mptctl.h" +#endif +#if DOS +#include "pcidefs.h" +#include "pcilib.h" +#include "dpmilib.h" +#endif + + +#if !VERIFY_ENDIANNESS +#define printf printfPaged +#define fprintf fprintfPaged +#endif + + +#undef __LSIUTIL_BIG_ENDIAN__ +#define swap16(x) \ + ((((U16)(x)>>8)&0xff) | \ + (((U16)(x)&0xff)<<8)) +#define swap32(x) \ + ((((U32)(x)>>24)&0xff) | \ + ((((U32)(x)>>16)&0xff)<<8) | \ + ((((U32)(x)>>8)&0xff)<<16) | \ + (((U32)(x)&0xff)<<24)) +#if WIN32 || __alpha__ || DOS || EFI +#define get16(x) (x) +#define get32(x) (x) +#define set16(x) (x) +#define set32(x) (x) +#define get16x(x) (x) +#define get32x(x) (x) +#define set16x(x) (x) +#define set32x(x) (x) +#define get16x_be(x) swap16(x) +#define get32x_be(x) swap32(x) +#define set16x_be(x) swap16(x) +#define set32x_be(x) swap32(x) +#endif +#if __linux__ +#include +#include +#if __BYTE_ORDER == __BIG_ENDIAN +#include +#define __LSIUTIL_BIG_ENDIAN__ 1 +#endif +#if __BYTE_ORDER == __LITTLE_ENDIAN +#include +#endif +#define get16(x) __le16_to_cpu(x) +#define get32(x) __le32_to_cpu(x) +#define set16(x) __cpu_to_le16(x) +#define set32(x) __cpu_to_le32(x) +#define get16x(x) __le16_to_cpu(x) +#define get32x(x) __le32_to_cpu(x) +#define set16x(x) __cpu_to_le16(x) +#define set32x(x) __cpu_to_le32(x) +#define get16x_be(x) __be16_to_cpu(x) +#define get32x_be(x) __be32_to_cpu(x) +#define set16x_be(x) __cpu_to_be16(x) +#define set32x_be(x) __cpu_to_be32(x) +#endif +#if __sparc__ || __irix__ +#if i386 +#define get16(x) (x) +#define get32(x) (x) +#define set16(x) (x) +#define set32(x) (x) +#define get16x(x) (x) +#define get32x(x) (x) +#define set16x(x) (x) +#define set32x(x) (x) +#define get16x_be(x) swap16(x) +#define get32x_be(x) swap32(x) +#define set16x_be(x) swap16(x) +#define set32x_be(x) swap32(x) +#else +#define get16(x) swap16(x) +#define get32(x) swap32(x) +#define set16(x) swap16(x) +#define set32(x) swap32(x) +#define get16x(x) swap16(x) +#define get32x(x) swap32(x) +#define set16x(x) swap16(x) +#define set32x(x) swap32(x) +#define get16x_be(x) (x) +#define get32x_be(x) (x) +#define set16x_be(x) (x) +#define set32x_be(x) (x) +#define __LSIUTIL_BIG_ENDIAN__ 1 +#endif +#endif +#define get64(x) (((uint64_t)get32x(((U32 *)&(x))[1])<<32) | get32x(((U32 *)&(x))[0])) +#define get64x(x) (((uint64_t)get32x(((U32 *)&(x))[1])<<32) | get32x(((U32 *)&(x))[0])) + + +/* These need to be included after the __LSIUTIL_BIG_ENDIAN__ define as they rely on it */ +#include "inc/ata.h" +#include "inc/sas.h" + + +#if VERIFY_ENDIANNESS +#undef get16 +#undef get32 +#undef set16 +#undef set32 +U16 get16(U16 *x) { return 0; } +U32 get32(U32 *x) { return 0; } +U16 *set16(int x) { return NULL; } +U32 *set32(int x) { return NULL; } +#endif + + +#define get2bytes(x, y) (((x[y] << 8) + x[y+1]) & 0xffff) +#define get3bytes(x, y) (((x[y] << 16) + (x[y+1] << 8) + x[y+2]) & 0xffffff) +#define get4bytes(x, y) (((x[y] << 24) + (x[y+1] << 16) + (x[y+2] << 8) + x[y+3]) & 0xffffffff) +#define get8bytes(x, y) (((uint64_t)get4bytes(x, y) << 32) + get4bytes(x, y+4)) +#define put2bytes(x, y, z) \ + x[y] = (U8)((z) >> 8); \ + x[y+1] = (U8)(z) +#define put3bytes(x, y, z) \ + x[y] = (U8)((z) >> 16); \ + x[y+1] = (U8)((z) >> 8); \ + x[y+2] = (U8)(z) +#define put4bytes(x, y, z) \ + x[y] = (U8)((z) >> 24); \ + x[y+1] = (U8)((z) >> 16); \ + x[y+2] = (U8)((z) >> 8); \ + x[y+3] = (U8)(z) + + +#if REGISTER_ACCESS +#define readl(addr, data) \ + { \ + U32 temp; \ + if (doReadRegister(port, MPI_##addr##_OFFSET, &temp) != 1) \ + { \ + printf("Failed to read register!\n"); \ + return 0; \ + } \ + data = temp; \ + } + + +#define writel(addr, data) \ + { \ + U32 temp = data; \ + if (doWriteRegister(port, MPI_##addr##_OFFSET, &temp) != 1) \ + { \ + printf("Failed to write register!\n"); \ + return 0; \ + } \ + } +#endif + + +#define IO_TIME 20 +#define RESET_TIME 60 +#define SHORT_TIME 10 +#define LONG_TIME 120 + + +#define BOBCAT_FW_HEADER_SIGNATURE_0 ( 0xB0EABCA7 ) +#define BOBCAT_FW_HEADER_SIGNATURE_1 ( 0xB0BCEAA7 ) +#define BOBCAT_FW_HEADER_SIGNATURE_2 ( 0xB0BCA7EA ) + +#define COBRA_FW_HEADER_SIGNATURE_0 ( 0xC0EABAA0 ) +#define COBRA_FW_HEADER_SIGNATURE_1 ( 0xC0BAEAA0 ) +#define COBRA_FW_HEADER_SIGNATURE_2 ( 0xC0BAA0EA ) + + +#define ALLOCATED_RESP_LEN 0xff + + +#if DEBUG_MALLOC_FREE + +int my_mallocs; +int my_frees; + + +int _cdecl main(int argc, char *argv[]) +{ + int t; + int _cdecl my_main(int argc, char *argv[]); + + my_mallocs = 0; + my_frees = 0; + + t = my_main(argc, argv); + + if (my_mallocs != my_frees) + printf("mallocs = %d, frees = %d\n", my_mallocs, my_frees); + + return t; +} + + +void *my_malloc(size_t x) +{ + my_mallocs++; + return malloc(x); +} + + +void my_free(void *x) +{ + my_frees++; + free(x); +} + + +#define main my_main +#define malloc my_malloc +#define free my_free + +#endif + + +#define NUM_PORTS 64 + + +typedef struct +{ + U8 signature[4]; + _U16 vendorId; + _U16 deviceId; + U8 reserved1[2]; + _U16 pcirLength; + U8 pcirRevision; + U8 classCode[3]; + _U16 imageLength; + _U16 imageRevision; + U8 type; + U8 indicator; + U8 reserved2[2]; +} PCIR; + + +typedef struct +{ + int portNumber; + char portName[16]; +#if WIN32 + char driverName[32]; +#endif +#if __sparc__ + char pathName[PATH_MAX]; + U32 portPhyMap[32]; +#endif + HANDLE fileHandle; + int ioctlValue; + int iocNumber; + int hostNumber; + int mptVersion; + int fwVersion; + int whoInit; + U16 deviceIdRaw; + U16 deviceId; + U8 revisionId; + U16 productId; + int pidType; + U32 capabilities; + U8 flags; + U32 fwImageSize; + char *chipName; + char *chipNameRev; + char *pciType; + U32 seqCodeVersion; + int payOff; + int portType; + int maxPersistentIds; + int maxBuses; + int minTargets; + int maxTargets; + int maxLuns; + int maxDevHandle; + int numPhys; + int hostScsiId; + int protocolFlags; + int lastEvent; +#if LINUX_DIAG + int diagBufferSizes[MPI_DIAG_BUF_TYPE_COUNT]; +#endif +#if __linux__ + off_t ioPhys; + off_t memPhys; + U32 *memVirt; + off_t diagPhys; + U32 *diagVirt; +#endif + int notOperational; + int pciSegment; + int pciBus; + int pciDevice; + int pciFunction; + int raidPassthru; + int raidBus; + int raidTarget; + int raidPhysdisk; + int fastpathCapable; + U16 ioc_status; // Currently only updated during (get|set)ConfigPage() +} MPT_PORT; + + +typedef struct +{ + SCSIIOReply_t reply; + U8 sense[32]; +} SCSI_REPLY; + + +typedef struct +{ + Mpi2SCSIIOReply_t reply; + U8 sense[32]; +} SCSI_REPLY2; + + +typedef struct +{ + int slot; + int encl_id_l; + int encl_id_h; +} PATH; + + +typedef struct +{ + int bus; + int target; + int lun; + PATH path; + int mode; + unsigned int size; + uint64_t size64; + int eedp; +} DIAG_TARGET; + + +#define EXPANDER_TYPE_LSI_GEN1_YETI 1 +#define EXPANDER_TYPE_LSI_GEN1_X12 2 +#define EXPANDER_TYPE_LSI_GEN2_BOBCAT 3 +#define EXPANDER_TYPE_LSI_GEN3_COBRA 4 +#define EXPANDER_TYPE_3RD_PARTY 8 +#define EXPANDER_TYPE_UNKNOWN 9 + +typedef struct +{ + int bus; + int target; + int handle; + _U64 sas_address; + U8 physical_port; + int expanderType; +} EXP_TARGET; + + +typedef struct +{ + int type; + int number; + int data[2]; +} EVENT; + + +typedef struct +{ + int type; + int number; + int data[48]; +} EVENT2; + + +typedef struct +{ + _U32 Size; + _U32 DiagVersion; + U8 BufferType; + U8 Reserved[3]; + _U32 Reserved1; + _U32 Reserved2; + _U32 Reserved3; +} DIAG_BUFFER_START; + + +typedef struct +{ + _U32 Size; + _U16 Type; + U8 Version; + U8 Reserved; + _U32 CapabilitiesFlags; + _U32 FWVersion; + _U16 ProductId; + _U16 Reserved1; +} DIAG_HEADER_FIRM_IDENTIFICATION; + + +typedef struct +{ + _U32 Size; + _U16 Type; + U8 Version; + U8 Reserved; + U8 HostInfo[256]; +} DIAG_HEADER_HOST_IDENTIFICATION; + + +/* diag register for gen 2 */ +typedef struct _MPI2_FW_DIAG_REGISTER +{ + U8 Reserved; + U8 BufferType; + U16 AppFlags; + U32 DiagFlags; + U32 ProductSpecific[23]; + U32 RequestedBufferSize; + U32 UniqueId; +} MPI2_FW_DIAG_REGISTER, *PTR_MPI2_FW_DIAG_REGISTER; + + +/* diag query for gen 2 */ +typedef struct _MPI2_FW_DIAG_QUERY +{ + U8 Reserved; + U8 BufferType; + U16 AppFlags; + U32 DiagFlags; + U32 ProductSpecific[23]; + U32 TotalBufferSize; + U32 DriverAddedBufferSize; + U32 UniqueId; +} MPI2_FW_DIAG_QUERY, *PTR_MPI2_FW_DIAG_QUERY; + + +#if WIN32 +#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE +#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) + + +typedef struct _STORAGE_ADAPTER_DESCRIPTOR { + ULONG Version; + ULONG Size; + ULONG MaximumTransferLength; + ULONG MaximumPhysicalPages; + ULONG AlignmentMask; + BOOLEAN AdapterUsesPio; + BOOLEAN AdapterScansDown; + BOOLEAN CommandQueueing; + BOOLEAN AcceleratedTransfer; + UCHAR BusType; + USHORT BusMajorVersion; + USHORT BusMinorVersion; +} STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR; + + +typedef enum _STORAGE_PROPERTY_ID { + StorageDeviceProperty = 0, + StorageAdapterProperty, + StorageDeviceIdProperty, + StorageDeviceUniqueIdProperty, + StorageDeviceWriteCacheProperty, + StorageMiniportProperty, + StorageAccessAlignmentProperty, + StorageDeviceSeekPenaltyProperty, + StorageDeviceTrimProperty, + StorageDeviceWriteAggregationProperty +} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID; + + +typedef enum _STORAGE_QUERY_TYPE { + PropertyStandardQuery = 0, + PropertyExistsQuery, + PropertyMaskQuery, + PropertyQueryMaxDefined +} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; + + +typedef struct _STORAGE_PROPERTY_QUERY { + STORAGE_PROPERTY_ID PropertyId; + STORAGE_QUERY_TYPE QueryType; + UCHAR AdditionalParameters[1]; +} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; +#endif //WIN32 + + +MPT_PORT *mptPorts[NUM_PORTS]; + + +DIAG_TARGET diag_targets[MAX_DEVICES]; +EXP_TARGET exp_targets[MAX_DEVICES]; + + +MPT_PORT *mappedPort; +int mappedBus; +int mappedTarget; +int mappedDevHandle; +int mappedValue; + + +#if __sparc__ +int scsi_vhci_fd; + + +typedef struct +{ + char name[NAME_MAX]; + char link[PATH_MAX]; +} NAME_LINK; + + +NAME_LINK *dev_rdsk_cache; +int dev_rdsk_count = 0; +NAME_LINK *dev_rmt_cache; +int dev_rmt_count = 0; +NAME_LINK *dev_es_cache; +int dev_es_count = 0; + + +int device_caches_initialized = 0; +#endif + + +char *args; +char *argsCurr; + + +char *fileNames[3]; +int numFileNames; +int yesFlag; +int noFlag; +int xFlag; +int gFlag; +int qFlag; +int kFlag; + + +int wFlag; +FILE *logFile; + + +int tagType; + + +int expert; +int paged; +int lines; + + +void *osDeviceState = NULL; + + +int iocMask = 0; + + +int maxLuns = 256; + + +#if __linux__ +int workaroundsTried = FALSE; +int oldMptBaseDetected = 0; +int newMptBaseDetected = 0; +#endif + + +int diagReturnCode = 0; + + +#if __linux__ || __alpha__ +HANDLE globalFileHandle; +HANDLE globalFileHandle2; +HANDLE globalFileHandle3; +#endif + + +#define JUST_FC 1 +#define JUST_SCSI 2 +#define JUST_SAS 4 +#define JUST_ALL (JUST_FC | JUST_SCSI | JUST_SAS) + +int just = 0; + + +int virtInit = 0; + + +char logPrefixBuffer[64]; +char pagedBuffer[1024]; + + +#if WIN32 +U32 gRetDataLen = 0; +#endif + + +#define MPI1 if (mpi1) +#define MPI2 if (mpi2) +#define MPI20 if (mpi20) +#define MPI25 if (mpi25) +#define EXP if (expert) + +#define FLASH_RESET_INTEL 0xff +#define FLASH_RESET_AMD 0xf0 +#define FLASH_IDENTIFY 0x90 +#define FLASH_CFI_QUERY 0x98 + + +// MPI2 2.0.10 header file retired CurReplyFrameSize field +// in IOC Facts reply. Define OldReplyFrameSize to use as +// backward compatible reference +#define OldReplyFrameSize IOCMaxChainSegmentSize + + +/* user command line arguments */ +typedef struct +{ + int portNums[NUM_PORTS]; /* port numbers specified */ + int numPortNums; /* number of port numbers specified */ + int boardInfo; /* board info wanted */ + int scan; /* boolean */ + int info; /* boolean */ + int dump; /* boolean */ + char linkspeed; /* desired link speed ('a', '1', '2', or '4') */ + char topology; /* desired topology ('a', '1', or '2') */ + int reset; /* boolean for chip reset */ + int linkReset; /* boolean for link reset */ + int linkResetFlag; /* boolean for link reset type */ + int coalescing; /* boolean */ + int ic_depth; /* desired interrupt coalescing depth */ + int ic_timeout; /* desired interrupt coalescing timeout */ + int monitorInterval; /* desired monitoring interval */ + int monitorDuration; /* desired monitoring duration */ +} CMNDLINE_ARGS; + + +unsigned char LoopIdToAlpa[126] = +{ + 0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda, 0xd9, 0xd6, /* 0 to 9 */ + 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce, 0xcd, 0xcc, 0xcb, 0xca, /* 10 to 19 */ + 0xc9, 0xc7, 0xc6, 0xc5, 0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, /* 20 to 29 */ + 0xb4, 0xb3, 0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, /* 30 to 39 */ + 0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b, 0x98, 0x97, /* 40 to 49 */ + 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81, 0x80, 0x7c, 0x7a, 0x79, /* 50 to 59 */ + 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, /* 60 to 69 */ + 0x6a, 0x69, 0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56, /* 70 to 79 */ + 0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, /* 80 to 89 */ + 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c, 0x3a, 0x39, 0x36, 0x35, /* 90 to 99 */ + 0x34, 0x33, 0x32, 0x31, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, /* 100 to 109 */ + 0x27, 0x26, 0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17, /* 110 to 119 */ + 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01 /* 120 to 125 */ +}; + + +unsigned char AlpaToLoopId[256] = +{ + 0x7e, 0x7d, 0x7c, 0xff, 0x7b, 0xff, 0xff, 0xff, /* 0x00 to 0x07 */ + 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, /* 0x08 to 0x0f */ + 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, /* 0x10 to 0x17 */ + 0x76, 0xff, 0xff, 0x75, 0xff, 0x74, 0x73, 0x72, /* 0x18 to 0x1f */ + 0xff, 0xff, 0xff, 0x71, 0xff, 0x70, 0x6f, 0x6e, /* 0x20 to 0x27 */ + 0xff, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0xff, /* 0x28 to 0x2f */ + 0xff, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0xff, /* 0x30 to 0x37 */ + 0xff, 0x61, 0x60, 0xff, 0x5f, 0xff, 0xff, 0xff, /* 0x38 to 0x3f */ + 0xff, 0xff, 0xff, 0x5e, 0xff, 0x5d, 0x5c, 0x5b, /* 0x40 to 0x47 */ + 0xff, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55, 0xff, /* 0x48 to 0x4f */ + 0xff, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 0xff, /* 0x50 to 0x57 */ + 0xff, 0x4e, 0x4d, 0xff, 0x4c, 0xff, 0xff, 0xff, /* 0x58 to 0x5f */ + 0xff, 0xff, 0xff, 0x4b, 0xff, 0x4a, 0x49, 0x48, /* 0x60 to 0x67 */ + 0xff, 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0xff, /* 0x68 to 0x6f */ + 0xff, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0xff, /* 0x70 to 0x77 */ + 0xff, 0x3b, 0x3a, 0xff, 0x39, 0xff, 0xff, 0xff, /* 0x78 to 0x7f */ + 0x38, 0x37, 0x36, 0xff, 0x35, 0xff, 0xff, 0xff, /* 0x80 to 0x87 */ + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, /* 0x88 to 0x8f */ + 0x32, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, /* 0x90 to 0x97 */ + 0x30, 0xff, 0xff, 0x2f, 0xff, 0x2e, 0x2d, 0x2c, /* 0x98 to 0x9f */ + 0xff, 0xff, 0xff, 0x2b, 0xff, 0x2a, 0x29, 0x28, /* 0xa0 to 0xa7 */ + 0xff, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0xff, /* 0xa8 to 0xaf */ + 0xff, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0xff, /* 0xb0 to 0xb7 */ + 0xff, 0x1b, 0x1a, 0xff, 0x19, 0xff, 0xff, 0xff, /* 0xb8 to 0xbf */ + 0xff, 0xff, 0xff, 0x18, 0xff, 0x17, 0x16, 0x15, /* 0xc0 to 0xc7 */ + 0xff, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0xff, /* 0xc8 to 0xcf */ + 0xff, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0xff, /* 0xd0 to 0xd7 */ + 0xff, 0x08, 0x07, 0xff, 0x06, 0xff, 0xff, 0xff, /* 0xd8 to 0xdf */ + 0x05, 0x04, 0x03, 0xff, 0x02, 0xff, 0xff, 0xff, /* 0xe0 to 0xe7 */ + 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, /* 0xe8 to 0xef */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0 to 0xf7 */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff /* 0xf8 to 0xff */ +}; + + +void outputPaged(FILE *fp, char *buffer); +int printfPaged(const char *format, ...); +int fprintfPaged(FILE *fp, const char *format, ...); +char *logPrefix(MPT_PORT *port); +#if __sparc__ +int getNodeInfo(di_node_t node, void *arg); +#endif +int checkReady(MPT_PORT *port); +int checkOperational(MPT_PORT *port, int flag); +int bringOnline(MPT_PORT *port); +int findPorts(void); +int closePorts(int numPorts); +int closePort(MPT_PORT *port); +int getFileName(char *buf, int len, FILE *file, char *fileString, int fileType); +int getString(char *buf, int len, FILE *file); +int getStringFromArgs(char *buf, int len, FILE *file); +int getYesNoAnswer(int defvalue); +int getNumberAnswer(int low, int high, int defvalue); +int getNumberAnswerHex(int low, int high, int defvalue); +int getHexNumberAnswer(U32 *value); +int getHexDoubleNumberAnswer(U32 *value1, U32 *value2); +int parseHexNumberChange(U32 *value); +int readFile(char *name, unsigned char **outBuf, int *outLen); +int queryFile(char *name); +int printWhatString(char *type, unsigned char *buf, int len); +int getCompatible(int deviceId, int type); +int checkCompatible(int deviceId1, int deviceId2, int type); +int doPort(MPT_PORT *port); +int doPortOption(MPT_PORT *port, int option); +int doIdentify(MPT_PORT *port); +int doFirmwareDownload(MPT_PORT *port); +int doFirmwareUpload(MPT_PORT *port); +int doBiosFcodeDownload(MPT_PORT *port); +int doBiosFcodeUpload(MPT_PORT *port, unsigned char **outBuf, int *outLen, int type); +int verifyBiosFcodeImage(MPT_PORT *port, unsigned char *buf, int len, int type); +int splitBiosImage(MPT_PORT *port, unsigned char **buf1, int *len1, unsigned char **buf2, int *len2); +int fixupBiosFcodeImage(MPT_PORT *port, unsigned char *buf, int len, int last); +int doSeepromDownload(MPT_PORT *port); +int doSeepromUpload(MPT_PORT *port); +int doScanForDevices(MPT_PORT *port, int flag); +int doScanForLuns(MPT_PORT *port, int flag , int option); +int doConfigPage(MPT_PORT *port); +int doInterruptCoalescingValues(MPT_PORT *port, int timeout, int depth); +int doIocSettings(MPT_PORT *port); +int doScsiInitiatorSettings(MPT_PORT *port); +char *syncToMt(int sync); +char *syncToMb(int sync, int wide); +int doScsiTargetSettings(MPT_PORT *port); +int doFcLinkSpeedValue(MPT_PORT *port, int t); +int doFcTopologyValue(MPT_PORT *port, int t); +int doFcPortOffline(MPT_PORT *port); +int doFcPortOnline(MPT_PORT *port); +int doFcTopologyNLPort(MPT_PORT *port); +int doFcTopologyNPort(MPT_PORT *port); +int doFcSpecialMode(MPT_PORT *port, int enable, int permanent); +int doFcPortSettings(MPT_PORT *port); +int doFcChangeWwn(MPT_PORT *port); +int doSasPhyOnOffline(MPT_PORT *port, int onoff); +int doSasIoUnitSettings(MPT_PORT *port); +int doSasChangeWwid(MPT_PORT *port, int checkZero); +int doIoUnitSettings(MPT_PORT *port); +int doFcPersistentMappings(MPT_PORT *port, int command); +int doSasPersistentMappings(MPT_PORT *port, int command); +int doDisplayLoggedInDevices(MPT_PORT *port); +int doDisplayAttachedDevices(MPT_PORT *port); +int showSasDiscoveryErrors(MPT_PORT *port); +int doShowPortAliases(MPT_PORT *port); +int doShowExpanderRoutingTables(MPT_PORT *port); +int doTestConfigPageActions(MPT_PORT *port); +int selectDevice(MPT_PORT *port, int *dev_bus, int *dev_target); +int selectDeviceRWMedia(MPT_PORT *port); +int selectDeviceRWBuffer(MPT_PORT *port); +int getExpanderType(int componentId, U8 *componentVendorId, U8 *vendorId); +char *printExpanderType(int expanderType); +int selectExpander(MPT_PORT *port, int *ses_bus, int *ses_target, U8 *phys_port, _U64 *sas_addr, int *expanderType); +int doDiagnostics(MPT_PORT *port, int command); +void generatePattern(int pattern, void *buf, int len); +void format64bitDecimal(uint64_t number, char *buf, int len); +int doInquiryTest(MPT_PORT *port); +int doWriteBufferReadBufferCompareTest(MPT_PORT *port); +int getEedpMode(MPT_PORT *port, int eedp); +int doReadTest(MPT_PORT *port); +int doWriteReadCompareTest(MPT_PORT *port); +int doWriteTest(MPT_PORT *port); +int doReadCompareTest(MPT_PORT *port); +int doTestUnitReadyTest(MPT_PORT *port); +int doLogSenseTest(MPT_PORT *port); +int doReadCapacityTest(MPT_PORT *port); +int doModePageTest(MPT_PORT *port); +int doEchoTest(MPT_PORT *port); +int doReadLinkErrorStatusTest(MPT_PORT *port); +int doDisplayPortCounters(MPT_PORT *port); +int doClearPortCounters(MPT_PORT *port); +int doTriggerAnalyzerWithEcho(MPT_PORT *port); +int isSata(MPT_PORT *port, int bus, int target); +int isSsd(MPT_PORT *port, int bus, int target); +int getPath(MPT_PORT *port, int bus, int target, PATH *path); +int getParent(MPT_PORT *port, int bus, int target, int *parent); +int isRaidPhysDisk(MPT_PORT *port, int bus, int target, int *physdisk); +int isRaidPhysDisk2(MPT_PORT *port, int bus, int target, int *physdisk); +int doReadLogicalBlocks(MPT_PORT *port); +int doWriteLogicalBlocks(MPT_PORT *port); +int doVerifyLogicalBlocks(MPT_PORT *port); +int doDiagnosticPageTest(MPT_PORT *port); +int doInjectRepairMediaError(MPT_PORT *port, int inject); +int doSoftwareWriteProtect(MPT_PORT *port, int flag); +int doReadWriteCache(MPT_PORT *port, int flag); +int doDisplayPhyCounters(MPT_PORT *port); +int doClearPhyCounters(MPT_PORT *port); +int doSataIdentifyDeviceTest(MPT_PORT *port); +int doSataClearAffiliationTest(MPT_PORT *port); +int doSataSmartReadTest(MPT_PORT *port); +int doSepTest(MPT_PORT *port); +int doProdSpecSasIoUnitControl(MPT_PORT *port); +int doProdSpecSasIoUnitControl2(MPT_PORT *port); +int doDiagDataUpload(MPT_PORT *port); +int doReportLunsTest(MPT_PORT *port); +int doDriveFirmwareDownload(MPT_PORT *port); +int doSesDownloadMicrocode(MPT_PORT *port, int bus, int target, int lun, + int mode, int id, int offset, int size, unsigned char *buf, int len); +int doExpanderChangeMfgDataFields(MPT_PORT *port); +int doExpanderGetSetMfgDataFields(MPT_PORT *port, int bus, int target, U64 *sasAddr, U64 *enclLogId, U8 *macAddr); +int doExpanderFirmwareDownload(MPT_PORT *port); +int doReadBufferFirmwareUpload(MPT_PORT *port); +int doRaidActions(MPT_PORT *port, int command); +int selectVolume(MPT_PORT *port, IOCPage2_t *IOCPage2, int *volumeOut); +int doShowVolumes(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3); +int doShowPhysDisks(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3); +int doGetVolumeState(MPT_PORT *port, IOCPage2_t *IOCPage2); +int doWaitForResync(MPT_PORT *port, IOCPage2_t *IOCPage2); +int doModifyVolume(MPT_PORT *port, IOCPage2_t *IOCPage2, int action, char *string); +int doCreateVolume(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3); +int doDeleteVolume(MPT_PORT *port, IOCPage2_t *IOCPage2); +int doVolumeSettings(MPT_PORT *port, IOCPage2_t *IOCPage2); +int doVolumeName(MPT_PORT *port, IOCPage2_t *IOCPage2); +int doDriveFirmwareUpdateMode(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3, int flag); +int doModifyPhysDisk(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3, int action, char *string); +int doCreatePhysDisk(MPT_PORT *port, IOCPage2_t *IOCPage2); +int doPhysDiskSettings(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3); +int doCreateHotSpare(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3); +int doDeleteHotSpare(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3); +int showHiddenDevices(MPT_PORT *port); +int doRaidActions2(MPT_PORT *port, int command); +int selectVolume2(MPT_PORT *port, int *volumeOut, int *handleOut); +void doShowVolumeState2(int volume, int volState, int volFlag, int useVolume); +int doShowVolumes2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6); +int doShowPhysDisks2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6); +int doGetVolumeState2(MPT_PORT *port); +int doWaitForResync2(MPT_PORT *port); +int doModifyVolume2(MPT_PORT *port, int action, char *string); +int doCreateVolume2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6); +int doDeleteVolume2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6); +int doVolumeSettings2(MPT_PORT *port); +int doVolumeName2(MPT_PORT *port); +int doVolumeIRCC2(MPT_PORT *port); +int doVolumeStopIRCC2(MPT_PORT *port); +int doVolumeOCE(MPT_PORT *port); +int doDriveFirmwareUpdateMode2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6, int flag); +int doModifyPhysDisk2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6, int action, char *string); +int doCreateHotSpare2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6); +int doDeleteHotSpare2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6); +int showHiddenDevices2(MPT_PORT *port); +int getRaidCounts(MPT_PORT *port, int activeOnly, int *numVolumes, int *numPhysDisks, int *numHotSpares); +int getRaidConfig(MPT_PORT *port, int elementType, int devHandle, int physDiskNum, Mpi2RaidConfigurationPage0_t **RaidConfigPage0); +int doResetBus(MPT_PORT *port); +int doResetTarget(MPT_PORT *port); +int doClearAca(MPT_PORT *port); +int doBeacon(MPT_PORT *port, int on_off); +int doDisplaySfpPages(MPT_PORT *port); +int doClean(MPT_PORT *port); +int doFcManagementTools(MPT_PORT *port); +int doRemoveSasDevice(MPT_PORT *port); +int doDisplayLogEntries(MPT_PORT *port); +int doClearLogEntries(MPT_PORT *port); +int doSasForceFullDiscovery(MPT_PORT *port); +int doFirmwareDownloadBoot(MPT_PORT *port); +int eventQuery(MPT_PORT *port, int *entries, int *types); +int eventEnable(MPT_PORT *port, int *types); +int eventReport(MPT_PORT *port, int entries, EVENT2 *events); +int doDisplayCurrentEvents(MPT_PORT *port); +int doDisplayTransferStatistics(MPT_PORT *port); +int doDisplayTransferStatisticsAll(int numPorts, MPT_PORT *ports[], int interval, int duration); +int isRaidVolume(MPT_PORT *port, int bus, int target); +int isRaidVolume2(MPT_PORT *port, int bus, int target); +void convertBusTarget(MPT_PORT *port, int *bus, int *target, int lun); +#if __sparc__ +void cachePathLinks(char *prefix, char *suffix, NAME_LINK **cacheOut, int *countOut); +int findPathLink(MPT_PORT *port, char *prefix, NAME_LINK *cache, int count, char *path, char *buf); +int getPortPhyMap(MPT_PORT *port); +#endif +int getOsDeviceName(MPT_PORT *port, int bus, int target, int lun, char *buf, int len, int type); +int doDisplayOsDeviceNames(MPT_PORT *port); +int diagBufferAction(MPT_PORT *port, int action, void *buf, int size); +int diagBufferAction2(MPT_PORT *port, int action, void *buf, int size); +int diagBufferRegister(MPT_PORT *port, int type, int id, int size); +int diagBufferRegister2(MPT_PORT *port, int type, int id, int size); +int diagBufferUnregister(MPT_PORT *port, int id); +int diagBufferQuery(MPT_PORT *port, int type, int id, int *flags, int *size); +int diagBufferQuery2(MPT_PORT *port, int type, int id, int *flags, int *size); +int diagBufferReadBuffer(MPT_PORT *port, int id, char *name, int file, int *sizeIn, int header); +int diagBufferRelease(MPT_PORT *port, int type, int id); +int doDiagBuffer(MPT_PORT *port); +int doFlashUpload(MPT_PORT *port); +int doDisplayVersionInfo(MPT_PORT *port); +void showVpdData(MPT_PORT *port, ManufacturingPage1_t *ManufacturingPage1); +int doDisplayVpdInfo(MPT_PORT *port); +int doProgramVpdInfo(MPT_PORT *port); +int doReadChipMemoryRegions(MPT_PORT *port, U32 addr, U32 *buf, int num); +int doWriteChipMemoryRegions(MPT_PORT *port, U32 addr, U32 *buf, int num); +int doDumpRegisters(MPT_PORT *port); +int doEnableDiagAccess(MPT_PORT *port, U32 *diagOrig); +int readLocalMemory(MPT_PORT *port, U32 addr, U32 *data, U32 temp); +int doDumpChipMemoryRegions(MPT_PORT *port); +int doReadModifyChipMemoryLocations(MPT_PORT *port); +int doDumpFcTraceBuffer(MPT_PORT *port); +int doForceFirmwareFault(MPT_PORT *port); +int doReadWriteExpanderMemory(MPT_PORT *port); +int doReadWriteExpanderIstwiDevice(MPT_PORT *port); +int doResetExpander(MPT_PORT *port); +int sendResetExpander(MPT_PORT *port, U8 physical_port, _U64 sas_address, U32 addr, U32 data); +int setFlashWrite(MPT_PORT *port, U32 flash_csr, U32 flash_csr_wr_en, int on); +U32 readFlash(MPT_PORT *port, U32 flash_add, int offset); +int writeFlash(MPT_PORT *port, U32 flash_add, int offset, U32 data); +void resetFlash(MPT_PORT *port, U32 flash_csr, U32 flash_csr_wr_en, U32 flash_add, int intel); +int doFlashInfo(MPT_PORT *port); +int doReadRegister(MPT_PORT *port, U32 offset, U32 *data); +int doWriteRegister(MPT_PORT *port, U32 offset, U32 *data); +int doReadWriteRegister(MPT_PORT *port, U32 offset, U32 *data, int command); +int doDumpPciConfigSpace(MPT_PORT *port); +int doShowNonDefaultSettings(MPT_PORT *port); +int doRestoreDefaultSettings(MPT_PORT *port); +int doDefaultPhyRegsSettings(MPT_PORT *port); +int doFcChangePersonalWwn(MPT_PORT *port); +int doGIEL(MPT_PORT *port); +int doGID_FT(MPT_PORT *port); +int doGA_NXT(MPT_PORT *port); +int doExLinkServiceSend(MPT_PORT *port); +int doResetFcLink(MPT_PORT *port, int flag); +int doScsiCdb(MPT_PORT *port); +int doSataPassthroughSend(MPT_PORT *port); +int doSmpPassthroughSend(MPT_PORT *port); +int doResetSasLink(MPT_PORT *port, int flag); +int doDumpPortState(MPT_PORT *port, int flag); +int doPortStateSummary(MPT_PORT *port); +int getChipName(MPT_PORT *port); +int getPortInfo(MPT_PORT *port); +int getPortInfo2(MPT_PORT *port); +int updatePortInfo(MPT_PORT *port); +int updatePortInfo2(MPT_PORT *port); +int getBoardInfo(MPT_PORT *port); +int showBoardInfo(MPT_PORT *port, int flag); +int dumpFcDevicePages(MPT_PORT *port); +int dumpSasDevicePages(MPT_PORT *port); +int showPortInfo(MPT_PORT *port); +int showPortInfoHeader(MPT_PORT *port); +int getDeviceInfo(MPT_PORT *port, int bus, int target, char *buf, int len); +int getDeviceInfoHeader(MPT_PORT *port, char *buf, int len); +int getIocFacts(MPT_PORT *port, IOCFactsReply_t *rep); +int getIocFacts2(MPT_PORT *port, Mpi2IOCFactsReply_t *rep); +int getPortFacts(MPT_PORT *port, PortFactsReply_t *rep); +int getPortFacts2(MPT_PORT *port, Mpi2PortFactsReply_t *rep); +int doConfigPageRequest(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut); +int getConfigPageHeader(MPT_PORT *port, int type, int number, int address, ConfigReply_t *repOut); +int getConfigPageLength(MPT_PORT *port, int type, int number, int address, int *length); +int getConfigPageAction(MPT_PORT *port, int action, int type, int number, int address, void *page, int pageSize); +int getConfigPage(MPT_PORT *port, int type, int number, int address, void *page, int pageSize); +void *getConfigPageActionAlloc(MPT_PORT *port, int action, int type, int number, int address, int *length); +void *getConfigPageAlloc(MPT_PORT *port, int type, int number, int address, int *length); +int setConfigPageAction(MPT_PORT *port, int action, int type, int number, int address, void *page, int pageSize); +int setConfigPage(MPT_PORT *port, int type, int number, int address, void *page, int pageSize); +int showConfigPage(MPT_PORT *port, char *string, void *page, int length); +int getProperty(MPT_PORT *port, char *name, char *buf, int bufLen); +void setName(MPT_PORT *port, int bus, int target, void *req); +int setMaxBusTarget(MPT_PORT *port); +int mapDevHandleToBusTarget(MPT_PORT *port, int dev_handle, int *bus, int *target); +int mapBusTargetToDevHandle(MPT_PORT *port, int bus, int target, int *dev_handle); +int mapBTDH(MPT_PORT *port, int *bus, int *target, int *dev_handle); +int mapOsToHwTarget(MPT_PORT *port, int target); +int doTestUnitReady(MPT_PORT *port, int bus, int target, int lun); +int doInquiry(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len); +int doInquiryVpdPage(MPT_PORT *port, int bus, int target, int lun, int page, unsigned char *buf, int len); +int doLogSense(MPT_PORT *port, int bus, int target, int lun, int page, int pc, unsigned char *buf, int len); +int doLogSelect(MPT_PORT *port, int bus, int target, int lun, int pc, int save, unsigned char *buf, int len); +int doReadBlockLimits(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len); +int doReadCapacity(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len); +int doReadCapacity16(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len); +int doModeSense(MPT_PORT *port, int bus, int target, int lun, int page, int control, int dbd, unsigned char *buf, int len); +int doModeSelect(MPT_PORT *port, int bus, int target, int lun, int save, unsigned char *buf, int len); +int doReadBuffer(MPT_PORT *port, int bus, int target, int lun, int mode, unsigned char *buf, int len); +int doWriteBuffer(MPT_PORT *port, int bus, int target, int lun, int mode, unsigned char *buf, int len); +int doReadBufferFull(MPT_PORT *port, int bus, int target, int lun, int mode, int id, int offset, unsigned char *buf, int len); +int doWriteBufferFull(MPT_PORT *port, int bus, int target, int lun, int mode, int id, int offset, unsigned char *buf, int len); +int doRead(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len); +int doWrite(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len); +int doVerify(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len); +int doRead32(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len); +int doWrite32(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len); +int doReadLong(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len, int *resid); +int doWriteLong(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len, int *resid); +int doReportLuns(MPT_PORT *port, int bus, int target, unsigned char *buf, int len); +int doReceiveDiagnosticResults(MPT_PORT *port, int bus, int target, int lun, int page, unsigned char *buf, int len); +int doSendDiagnostic(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len); +int doScsiIo(MPT_PORT *port, int bus, int target, int raid, void *req, int reqSize, SCSI_REPLY *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut); +int doReadLongSata(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len); +int doWriteLongSata(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len); +int doFwDownload(MPT_PORT *port, int type, unsigned char *buf, int len, int offset); +int doFwUpload(MPT_PORT *port, int type, unsigned char *buf, int len, int offset, int *outLen); +int doIocInit(MPT_PORT *port, int WhoInit); +char *translateSmpFunctionResult(int functionResult); +int doSmpReportMfg(MPT_PORT *port, _U64 SASAddress, U8 physicalPort, PTR_SMP_REPORT_MANUFACTURER_INFO_RESPONSE smpResp, int *respDataLenth); +int doSmpPassthrough(MPT_PORT *port, U8 smpPort, _U64 smpAddr, void *smpReq, int smpReqSize, void *smpRsp, int smpRspSize, int *respDataLength); +int doResetPort(MPT_PORT *port); +void doLogMptCommandReq(MPT_PORT *port, void *req, int reqSize); +void doLogMptCommandRep(MPT_PORT *port, void *rep, int repSize, int status); +void logMptCommandReq(MPT_PORT *port, void *req, int reqSize); +void logMptCommandRep(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, int status); +int doMptCommand(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut); +int doMptCommandCheck(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut); +char *translateIocStatus(int ioc_status); +void displayByteData(unsigned char *buf, int len); +void dumpMemory(void *buf, int len, char *string); +void dumpMemoryWide(void *buf, int len, char *string); +void initT10Crc(void); +unsigned int genT10Crc(unsigned char *buf); +unsigned int genLbCrc(unsigned char *buf, int len); +int checkRemoveT10(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len); +int checkRemoveLb(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len, int do_crc); +int insertT10(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len); +int insertLb(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len, int do_crc); +void waitForFile(char *name); +char *skipLine(char *buf); +void removeLine(char *buf); +int getNamedItem(MPT_PORT *port, char *name, char *buf, int type, void *address); +int updateConfigPage(MPT_PORT *port, char *string, void *page); +int doWriteFcManufacturingInfo(MPT_PORT *port); +int doWriteSasManufacturingInfo(MPT_PORT *port); +int concatenateSasFirmwareNvdata(void); +char *getSasProductId(char *nvdata); +int selectAltaDevice(MPT_PORT *port, int *dev_bus, int *dev_target); +int doAltaDiagnostics(MPT_PORT *port, int command); +int doAltaProgramManufacturingInfo(MPT_PORT *port); +int doAltaDisplayManufacturingInfo(MPT_PORT *port); +int doResetAlta(MPT_PORT *port); +char *translateExpanderEventCode(int code); +int decodeExpanderLogEntries(FILE *file, unsigned char *buf, int length); +int doDisplayExpanderLogEntries(MPT_PORT *port); +int doClearExpanderLogEntries(MPT_PORT *port); +int doUartDebugConsole(MPT_PORT *port); +int getAdapterPropertiesMaxPages(MPT_PORT *port, int *maxPages); +int doSendPowerManagementControlMPI(MPT_PORT *port); +int doIoUnit7Settings(MPT_PORT *port); +int doSasIoUnit8Settings(MPT_PORT *port); +int dumpSasDevicePage0sLong(MPT_PORT *port); +int doExpanderUart(MPT_PORT *port); + + +#if LSIINTERNAL +#include "internal/sc.c" +#endif + + +#if DOS || EFI +#include "mpt.c" +#undef mpi1 +#undef mpi2 +#undef mpi20 +#undef mpi25 +#endif + + +#define mpi1 (port->mptVersion < MPI2_VERSION_02_00) +#define mpi2 (port->mptVersion >= MPI2_VERSION_02_00) +#define mpi20 ((port->mptVersion >= MPI2_VERSION_02_00) && (port->mptVersion < MPI2_VERSION_02_05)) +#define mpi25 (port->mptVersion >= MPI2_VERSION_02_05) + + +void +outputPaged(FILE *fp, char *buffer) +{ + char buf[16]; + char c; + + fputs(buffer, fp); + + if (paged && fp == stdout) + { + while ((c = *buffer++) != '\0') + { + if (c == '\n') + lines++; + } + + if (lines >= paged) + { + fputs("--more, hit RETURN--", stdout); + if (fgets(buf, sizeof buf, stdin)); + lines = 0; + } + } +} + + +int +printfPaged(const char *format, ...) +{ + va_list args; + int n; + + va_start(args, format); + + n = vsprintf(pagedBuffer, format, args); + + va_end(args); + + outputPaged(stdout, pagedBuffer); + + return n; +} + + +int +fprintfPaged(FILE *fp, const char *format, ...) +{ + va_list args; + int n; + + va_start(args, format); + + n = vsprintf(pagedBuffer, format, args); + + va_end(args); + + outputPaged(fp, pagedBuffer); + + return n; +} + + +char * +logPrefix(MPT_PORT *port) +{ + time_t now; + + time(&now); + if (port) + sprintf(logPrefixBuffer, "%s %s", ctime(&now), port->portName); + else + sprintf(logPrefixBuffer, "%s", ctime(&now)); + if (logPrefixBuffer[8] == ' ') + logPrefixBuffer[8] = '0'; + if (port) + logPrefixBuffer[24]= ':'; + else + logPrefixBuffer[24]= '\0'; + + return logPrefixBuffer; +} + + +int _cdecl +main(int argc, char *argv[]) +{ + int portNumber; + MPT_PORT *port; + int numPorts; + int i; + int arg; + CMNDLINE_ARGS cargs; + char *pArg; + char *type; + int n; + int t; + extern int optind; + extern int optopt; + +#if DOS + setvbuf(stdout, NULL, _IONBF, 0); +#endif + + memset(mptPorts, 0, sizeof mptPorts); + + initT10Crc(); + + args = NULL; + argsCurr = NULL; + + pArg = NULL; + + numFileNames = 0; + yesFlag = FALSE; + noFlag = FALSE; + xFlag = FALSE; + gFlag = FALSE; + qFlag = FALSE; + kFlag = FALSE; + + wFlag = 0; + logFile = NULL; + + tagType = MPI_SCSIIO_CONTROL_SIMPLEQ; + + expert = FALSE; + paged = 0; + + memset(&cargs, 0, sizeof(CMNDLINE_ARGS)); + + printf("\nLSI Logic MPT Configuration Utility, %s\n", LSIUTIL_VERSION); + + if (argc > 1) + { + while ((arg = getopt(argc, argv, "?a:bc:def:ghij:kl:m:np:qrst:uv:wxyz018")) != EOF) + { + switch (arg) + { + case '?': + if (optopt) + { + optopt = 0; + break; + } + + case 'h': + printf( +"\nHelp Usage\n" +"Invoking lsiutil with no arguments will start an interactive session.\n\n" +" -e Turn on Expert Mode (more menu options).\n" +" -w, -ww, -www Log internal operations to lsiutil.log, for debug.\n" +" -y Answer yes to yes/no questions whose default is yes.\n" +" -n Answer no to yes/no questions whose default is no.\n" +" -j type[,type] Include just ports of type 'type' (FC, SCSI, SAS).\n" +" -x Concatenate SAS firmware and NVDATA files.\n\n"); + printf( +"Display Options\n" +"usage: lsiutil [ -p portNumber ] [ -u ][ -s ] [ -d ] [ -i ] [ -b ]\n" +" -p portNumber Specify the port number to operate on.\n" +" If not specified, all ports are used.\n" +" -u Use untagged, rather than tagged, SCSI commands.\n" +" -s Scan for and display all targets.\n" +" -d Dump all config pages.\n" +" -i Display port settings.\n" +" -b Show board manufacturing information.\n" +" -m freq[,time] Monitor port performance, updating the display\n" +" every 'freq' seconds, for 'time' seconds.\n\n"); + printf( +"Examples:\n" +"1. to display the port settings and targets for port 1:\n" +" lsiutil -p 1 -i -s\n" +"2. to display the targets found on all known ports:\n" +" lsiutil -s\n\n"); + printf( +"Operational Options\n" +"usage: lsiutil -p portNumber [ -l linkSpeed ] [ -t topology ]\n" +" [ -c timeout,depth ] [ -r ]\n" +" -p portNumber Specify the port number to operate on.\n" +" Required parameter for operational options.\n" +" -l linkSpeed Set link speed. Valid options for linkSpeed are:\n" +" 'a' Auto link speed negotiation\n" +" '1' Force 1Gb link speed\n" +" '2' Force 2Gb link speed\n" +" '4' Force 4Gb link speed\n"); + printf( +" -t topology Set topology. Valid options for topology are:\n" +" 'a' Auto topology negotiation\n" +" '1' Force NL_Port topology\n" +" '2' Force N_Port topology\n" +" -c timeout,depth Set interrupt coalescing values.\n" +" Timeout is a value in microseconds between\n" +" 1 and 1000. Depth is a value between 1 and 128.\n" +" Setting either or both values to zero will\n" +" disable interrupt coalescing for that port.\n" +" -r Perform a chip reset on the given port.\n" +" -z Perform an FC link reset on the given port.\n"); + printf( +"NOTE: In order for linkSpeed, topology, or interrupt coalescing\n" +" settings to take effect, a chip reset is necessary.\n\n" +"Examples:\n" +"1. to force linkspeed to 1Gb on port 2:\n" +" lsiutil -p 2 -l 1\n" +"2. to set interrupt coalescing to a timeout of 200ms with\n" +" a depth of 9 and to force N_Port topology on port 1:\n" +" lsiutil -p 1 -c 200,9 -t 2\n\n" +); + return 0; + + case 'a': + args = optarg; + break; + + case 'b': + cargs.boardInfo = TRUE; + break; + + case 'c': + if (sscanf(optarg, "%d,%d", &cargs.ic_timeout, &cargs.ic_depth) != 2) + { + printf("ERROR: Invalid argument %s for interrupt coalescing.\n", optarg); + printf("Must specify two decimal numbers -- timeout,depth\n"); + return EINVAL; + } + else + { + if (cargs.ic_timeout < 0) + cargs.ic_timeout = 0; + if (cargs.ic_timeout > 1000) + cargs.ic_timeout = 1000; + if (cargs.ic_depth < 0) + cargs.ic_depth = 0; + if (cargs.ic_depth > 128) + cargs.ic_depth = 128; + + cargs.coalescing = TRUE; + } + break; + + case 'd': + cargs.dump = TRUE; + break; + + case 'e': + expert = TRUE; + break; + + case 'f': + while (TRUE) + { + if (numFileNames < 3) + { + fileNames[numFileNames++] = optarg; + } + else + { + printf("ERROR: At most, three filenames may be supplied\n"); + return EINVAL; + } + + optarg = strchr(optarg, ','); + if (optarg) + *optarg++ = '\0'; + else + break; + } + break; + + case 'g': + gFlag = TRUE; + break; + + case 'i': + cargs.info = TRUE; + break; + + case 'j': + while (TRUE) + { + type = optarg; + if (type == NULL) + break; + optarg = strchr(optarg, ','); + if (optarg) + *optarg++ = '\0'; + if (strcasecmp(type, "good") == 0) + just |= JUST_ALL; + else if (strcasecmp(type, "fc") == 0) + just |= JUST_FC; + else if (strcasecmp(type, "scsi") == 0) + just |= JUST_SCSI; + else if (strcasecmp(type, "sas") == 0) + just |= JUST_SAS; + else + { + printf("ERROR: Invalid type %s.\n", type); + printf("Valid types are FC, SCSI, and SAS\n"); + return EINVAL; + } + } + break; + + case 'k': + kFlag = TRUE; + break; + + case 'l': + if (*optarg == 'a' || *optarg == '1' || *optarg == '2' || *optarg == '4') + cargs.linkspeed = *optarg; + else + { + printf("ERROR: Invalid link speed %s.\n", optarg); + printf("Valid link speeds are: 'a' for Auto, '1', '2', or '4' for 1Gb, 2Gb, or 4Gb\n"); + return EINVAL; + } + break; + + case 'm': + cargs.monitorDuration = 0; + if (sscanf(optarg, "%d,%d", &cargs.monitorInterval, &cargs.monitorDuration) != 2 && + sscanf(optarg, "%d", &cargs.monitorInterval) != 1) + { + printf("ERROR: Invalid argument %s for monitoring interval (and duration).\n", optarg); + printf("Must specify a decimal number and optionally a second decimal number\n"); + return EINVAL; + } + else + { + if (cargs.monitorInterval < 0) + cargs.monitorInterval = 0; + if (cargs.monitorDuration < 0) + cargs.monitorDuration = 0; + } + break; + + case 'n': + noFlag = TRUE; + break; + + case 'p': + pArg = optarg; + break; + + case 'q': + qFlag = TRUE; + break; + + case 'r': + cargs.reset = TRUE; + break; + + case 's': + cargs.scan = TRUE; + break; + + case 't': + if (*optarg == 'a' || *optarg == '1' || *optarg == '2') + cargs.topology = *optarg; + else + { + printf("ERROR: Invalid topology %s.\n", optarg); + printf("Valid topologys are: 'a' for Auto, '1' for NL_Port, or '2' for N_Port\n"); + return EINVAL; + } + break; + + case 'u': + tagType = MPI_SCSIIO_CONTROL_UNTAGGED; + break; + + case 'v': + if (sscanf(optarg, "%d", &virtInit) != 1) + { + printf("ERROR: Invalid argument %s for virtual initiator.\n", optarg); + printf("Must specify a decimal number\n"); + return EINVAL; + } + break; + + case 'w': + wFlag++; + break; + + case 'x': + xFlag = TRUE; + break; + + case 'y': + yesFlag = TRUE; + break; + + case 'z': + cargs.linkReset = TRUE; + cargs.linkResetFlag = FALSE; + break; + + case '0': + iocMask |= (1<<0); + break; + + case '1': + iocMask |= (1<<1); + break; + + case '8': + maxLuns = 8; + break; + + default: + return EINVAL; + } + } + + if (wFlag) + { + logFile = fopen("lsiutil.log", "a"); + if (logFile) + { + fprintf(logFile, "%s: Logging started at level %d\n", logPrefix(NULL), wFlag); + } + else + { + printf("Open failure for file lsiutil.log!\n"); + perror("Error is"); + logFile = stderr; + } + } + + if (xFlag) + { + if (pArg || args || cargs.info || cargs.scan || cargs.dump || cargs.boardInfo || + cargs.linkspeed || cargs.topology || cargs.coalescing || cargs.reset || cargs.linkReset || + cargs.monitorInterval || iocMask) + { + printf("-x can be mixed with -f, -n, and -y, only\n"); + return EINVAL; + } + + if (numFileNames == 0) + { + if (optind == argc - 3) + { + while (optind < argc) + fileNames[numFileNames++] = argv[optind++]; + } + + else if (optind < argc) + { + optarg = argv[optind++]; + + while (TRUE) + { + if (numFileNames < 3) + { + fileNames[numFileNames++] = optarg; + } + else + { + printf("ERROR: At most, three filenames may be supplied\n"); + return EINVAL; + } + + optarg = strchr(optarg, ','); + if (optarg) + *optarg++ = '\0'; + else + break; + } + } + } + + while (optind < argc) + printf("%s: invalid argument -- %s\n", argv[0], argv[optind++]); + + printf("\n"); + concatenateSasFirmwareNvdata(); + return 0; + } + + if (qFlag) + { + char *name; + + if (pArg || args || cargs.info || cargs.scan || cargs.dump || cargs.boardInfo || + cargs.linkspeed || cargs.topology || cargs.coalescing || cargs.reset || cargs.linkReset || + cargs.monitorInterval || iocMask) + { + printf("-q can be mixed with -f only\n"); + return EINVAL; + } + + if (numFileNames == 0) + { + while (optind < argc) + { + optarg = argv[optind++]; + + while (TRUE) + { + name = optarg; + optarg = strchr(optarg, ','); + if (optarg) + *optarg++ = '\0'; + + queryFile(name); + + if (!optarg) + break; + } + } + } + else + { + while (optind < argc) + printf("%s: invalid argument -- %s\n", argv[0], argv[optind++]); + + for (i = 0; i < numFileNames; i++) + { + queryFile(fileNames[i]); + } + } + + return 0; + } + + numPorts = findPorts(); + + printf("\n%d MPT Port%s found\n", numPorts, numPorts == 1 ? "" : "s"); + + if (pArg) + { + optarg = pArg; + + if (numPorts) + { + t = 0; + while (sscanf(optarg, "%d%n", &i, &n) >= 1) + { + if (i <= 0) + { + cargs.numPortNums = 0; + break; + } + if (t == 1) + { + if (i < cargs.portNums[cargs.numPortNums - 1]) + { + cargs.numPortNums = 0; + break; + } + while (i > cargs.portNums[cargs.numPortNums - 1]) + { + t = cargs.portNums[cargs.numPortNums - 1] + 1; + if (t <= numPorts && cargs.numPortNums < NUM_PORTS) + { + cargs.portNums[cargs.numPortNums] = t; + cargs.numPortNums++; + } + else + break; + } + t = 0; + } + else + { + if (i <= numPorts && cargs.numPortNums < NUM_PORTS) + { + cargs.portNums[cargs.numPortNums] = i; + cargs.numPortNums++; + } + } + if (optarg[n] == '\0') + { + optarg += n; + break; + } + else if (optarg[n] == ',') + { + optarg += n + 1; + } + else if (optarg[n] == '-' && t == 0) + { + optarg += n + 1; + t = 1; + } + else + { + cargs.numPortNums = 0; + break; + } + } + if (optarg[0] != '\0') + cargs.numPortNums = 0; + if (cargs.numPortNums == 0) + { + printf("ERROR: No such port. Valid ports are:\n"); + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + closePorts(numPorts); + return ENODEV; + } + } + } + + if (cargs.monitorInterval) + { + if (args || cargs.info || cargs.scan || cargs.dump || cargs.boardInfo || + cargs.linkspeed || cargs.topology || cargs.coalescing || cargs.reset || cargs.linkReset || + optind < argc) + { + printf("WARNING: -m being ignored (other options given)\n"); + } + else + { + if (numPorts) + { + MPT_PORT *ports[NUM_PORTS]; + + memset(ports, 0, sizeof ports); + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + ports[cargs.portNums[i]] = mptPorts[cargs.portNums[i] - 1]; + } + } + else + { + for (i = 0; i < numPorts; i++) + { + ports[i] = mptPorts[i]; + } + } + doDisplayTransferStatisticsAll(NUM_PORTS, ports, cargs.monitorInterval, cargs.monitorDuration); + closePorts(numPorts); + return 0; + } + } + } + + if ((cargs.info || cargs.scan || cargs.dump || cargs.boardInfo) && + (cargs.linkspeed || cargs.topology || cargs.coalescing || cargs.reset || cargs.linkReset)) + { + printf("ERROR: -s -i -d and -b (display options) can't be mixed\n"); + printf("with -l -t and -c (set options) or -r and -z (reset options)\n"); + closePorts(numPorts); + return EINVAL; + } + + if (cargs.info || cargs.scan || cargs.dump) + { + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + + printf("\n==============================================================================\n"); + if (port->notOperational) + { + printf("\n%-16s\n", port->portName); + continue; + } + + printf("\n%-16s LSI Logic %-12s MPT %03x Firmware %08x IOC %x\n", + port->portName, port->chipNameRev, port->mptVersion, port->fwVersion, port->iocNumber); + + if (cargs.info || cargs.dump) + { + printf("\n"); + showBoardInfo(port, 1); + } + + t = !cargs.info; + + if (cargs.info) + { + printf("\n"); + doPortStateSummary(port); + } + + if (cargs.scan) + { + printf("\n"); + doScanForDevices(port, t); + } + + if (cargs.dump) + { + if (t) + printf("\n"); + doDumpPortState(port, t); + } + } + } + else if (numPorts) + { + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + + printf("\n==============================================================================\n"); + if (port->notOperational) + { + printf("\n%-16s\n", port->portName); + continue; + } + + printf("\n%-16s LSI Logic %-12s MPT %03x Firmware %08x IOC %x\n", + port->portName, port->chipNameRev, port->mptVersion, port->fwVersion, port->iocNumber); + + if (cargs.info || cargs.dump) + { + printf("\n"); + showBoardInfo(port, 1); + } + + t = !cargs.info; + + if (cargs.info) + { + printf("\n"); + doPortStateSummary(port); + } + + if (cargs.scan) + { + printf("\n"); + doScanForDevices(port, t); + } + + if (cargs.dump) + { + if (t) + printf("\n"); + doDumpPortState(port, t); + } + } + } + } + else if (cargs.boardInfo) + { + if (numPorts) + { + printf("\nPort Name Seg/Bus/Dev Board Name Board Assembly Board Tracer\n"); + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + if (port->notOperational) + continue; + if (iocMask & (1 << port->iocNumber)) + continue; + showBoardInfo(port, 0); + } + } + else + { + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + continue; + if (port->iocNumber) + continue; + showBoardInfo(port, 0); + } + } + } + } + + if (cargs.linkspeed) + { + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + if (port->notOperational) + continue; + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + switch (cargs.linkspeed) + { + default: + case 'a': t = MPI_FCPORTPAGE1_LCONFIG_SPEED_AUTO; type = "Auto"; break; + case '1': t = MPI_FCPORTPAGE1_LCONFIG_SPEED_1GIG; type = "1 Gb"; break; + case '2': t = MPI_FCPORTPAGE1_LCONFIG_SPEED_2GIG; type = "2 Gb"; break; + case '4': t = MPI_FCPORTPAGE1_LCONFIG_SPEED_4GIG; type = "4 Gb"; break; + } + printf("Setting link speed to %s on port %d\n", type, cargs.portNums[i]); + doFcLinkSpeedValue(port, t); + } + else + { + printf("ERROR: Link speed supported only on FC ports.\n"); + } + } + } + else if (numPorts) + { + printf("ERROR: Must specify a port to set link speed. Valid ports are:\n"); + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + closePorts(numPorts); + return ENODEV; + } + } + + if (cargs.topology) + { + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + if (port->notOperational) + continue; + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + switch (cargs.topology) + { + default: + case 'a': t = MPI_FCPORTPAGE1_TOPOLOGY_AUTO; type = "Auto"; break; + case '1': t = MPI_FCPORTPAGE1_TOPOLOGY_NLPORT; type = "NL_Port"; break; + case '2': t = MPI_FCPORTPAGE1_TOPOLOGY_NPORT; type = "N_Port"; break; + } + printf("Setting topology to %s on port %d\n", type, cargs.portNums[i]); + doFcTopologyValue(port, t); + } + else + { + printf("ERROR: Topology change supported only on FC ports.\n"); + } + } + } + else if (numPorts) + { + printf("ERROR: Must specify a port to set topology. Valid ports are:\n"); + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + closePorts(numPorts); + return ENODEV; + } + } + + if (cargs.coalescing) + { + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + if (port->notOperational) + continue; + + if (cargs.ic_timeout != 0 && cargs.ic_depth != 0) + { + printf("Setting interrupt coalescing to timeout of %d microseconds\n", + cargs.ic_timeout); + printf("with depth of %d on port %d\n", cargs.ic_depth, cargs.portNums[i]); + } + else + printf("Disabling interrupt coalescing on port %d\n", cargs.portNums[i]); + + doInterruptCoalescingValues(port, cargs.ic_timeout, cargs.ic_depth); + } + } + else if (numPorts) + { + printf("ERROR: Must specify a port to set interrupt coalescing. Valid ports are:\n"); + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + closePorts(numPorts); + return ENODEV; + } + } + + if (cargs.reset) + { + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + if (iocMask & (1 << port->iocNumber)) + continue; + doResetPort(port); + } + } + else if (numPorts) + { + printf("ERROR: Must specify a port to reset. Valid ports are:\n"); + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + closePorts(numPorts); + return ENODEV; + } + } + + if (cargs.linkReset) + { + if (cargs.numPortNums) + { + for (i = 0; i < cargs.numPortNums; i++) + { + port = mptPorts[cargs.portNums[i] - 1]; + if (port->notOperational) + continue; + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doResetFcLink(port, cargs.linkResetFlag); + } + else + { + printf("ERROR: Link reset supported only on FC ports.\n"); + } + } + } + else if (numPorts) + { + printf("ERROR: Must specify a port to reset. Valid ports are:\n"); + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + closePorts(numPorts); + return ENODEV; + } + } + + if (cargs.info || cargs.scan || cargs.dump || cargs.boardInfo || + cargs.linkspeed || cargs.topology || cargs.coalescing || cargs.reset || cargs.linkReset) + { + closePorts(numPorts); + return 0; + } + + if (cargs.numPortNums) + { + if (optind < argc) + { + while (optind < argc) + { + if (sscanf(argv[optind], "%d", &t) == 1) + { + for (i = 0; i < cargs.numPortNums; i++) + { + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + + port = mptPorts[cargs.portNums[i] - 1]; + updatePortInfo(port); + + if (port->notOperational) + printf("%2d. %-16s\n", cargs.portNums[i], port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + cargs.portNums[i], port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + + argsCurr = args; + doPortOption(port, t); + } + } + else + printf("\n%s: invalid argument -- %s\n", argv[0], argv[optind]); + optind++; + } + } + else + { + iocMask = 0; + + for (i = 0; i < cargs.numPortNums; i++) + { + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + + port = mptPorts[cargs.portNums[i] - 1]; + updatePortInfo(port); + + if (port->notOperational) + printf("%2d. %-16s\n", cargs.portNums[i], port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + cargs.portNums[i], port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + + argsCurr = args; + doPort(port); + } + } + + closePorts(numPorts); + return 0; + } + else if (numPorts) + { + if (optind < argc) + { + while (optind < argc) + { + if (sscanf(argv[optind], "%d", &t) == 1) + { + for (i = 0; i < numPorts; i++) + { + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + + port = mptPorts[i]; + updatePortInfo(port); + + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + + argsCurr = args; + doPortOption(port, t); + } + } + else + printf("\n%s: invalid argument -- %s\n", argv[0], argv[optind]); + optind++; + } + + closePorts(numPorts); + return 0; + } + } + } + else + { + if (wFlag) + { + logFile = fopen("lsiutil.log", "a"); + if (logFile) + { + fprintf(logFile, "%s: Logging started at level %d\n", logPrefix(NULL), wFlag); + } + else + { + printf("Open failure for file lsiutil.log!\n"); + perror("Error is"); + logFile = stderr; + } + } + + numPorts = findPorts(); + + printf("\n%d MPT Port%s found\n", numPorts, numPorts == 1 ? "" : "s"); + } + + if (numPorts) + { + iocMask = 0; + + while (TRUE) + { + printf("\n Port Name Chip Vendor/Type/Rev MPT Rev Firmware Rev IOC\n"); + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + updatePortInfo(port); + + if (port->notOperational) + printf("%2d. %-16s\n", i+1, port->portName); + else + printf("%2d. %-16s LSI Logic %-12s %03x %08x %x\n", + i+1, port->portName, port->chipNameRev, + port->mptVersion, port->fwVersion, port->iocNumber); + } + + printf("\nSelect a device: [1-%d or 0 to quit] ", numPorts); + portNumber = getNumberAnswer(0, numPorts, -1); + + if (portNumber < 0) + continue; + + if (portNumber == 0) + break; + + doPort(mptPorts[portNumber-1]); + } + } + + closePorts(numPorts); + + return 0; +} + + +#if __sparc__ +int +getNodeInfo(di_node_t node, void *arg) +{ + int *numPorts = (int *)arg; + char *driverName; + char *pathName; + int portNumber; + char path[PATH_MAX]; + HANDLE fileHandle; + MPT_PORT *port; + + driverName = di_driver_name(node); + pathName = di_devfs_path(node); + portNumber = di_instance(node); + if (driverName != NULL && pathName != NULL && portNumber >= 0) + { + if (strcasecmp("itmpt", driverName) == 0 || + strcasecmp("itmptfc", driverName) == 0 || + strcasecmp("lsimpt", driverName) == 0 || + strcasecmp("mpt", driverName) == 0 || + strcasecmp("mpt_sas", driverName) == 0 || + strcasecmp("lsc", driverName) == 0) + { + sprintf(path, "/devices%s:devctl", pathName); + + if ((fileHandle = open(path, O_RDWR)) >= 0) + { + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->hostNumber = -1; + port->fileHandle = fileHandle; + + if (strcasecmp("mpt_sas", driverName) == 0 || strcasecmp("lsc", driverName) == 0 ) + { + /* since the global 'mpi2' is based on mptVersion, seed it with an MPI2 base value + * so it can be used until we get the real value from IOCFacts + */ + port->mptVersion = MPI2_VERSION_02_00; + port->ioctlValue = MPTIOCTL_PASS_THRU; + } + else + port->ioctlValue = SYMIOCTL_PASS_THRU_TIMEOUT; + + sprintf(port->portName, "%s%d", driverName, portNumber); + if (strstr(driverName, "fc")) + sprintf(port->pathName, "%s/fp@0,0", pathName); + else + sprintf(port->pathName, "%s", pathName); + + if (getPortInfo(port) == 1) + { + mptPorts[(*numPorts)++] = port; + } + else + { + close(fileHandle); + free(port); + } + } + } + } + + return DI_WALK_CONTINUE; +} +#endif + + +int +checkReady(MPT_PORT *port) +{ +#if DOS || EFI + HANDLE adap = port->fileHandle; + int t; + + if (mpt_verify_ready(adap) || mpt_verify_operational(adap)) + { + return 1; + } + + mpt_stop(adap, TRUE); + + if (adap->ioc_online == TRUE) + { + adap->ioc_online = mpt_verify_operational(adap); + + if (adap->ioc_online == TRUE) + { + return 1; + } + + t = mpt_get_doorbell(adap); + + printf("\n%s is not in Operational state! Doorbell is %08x\n", + port->portName, t); + if (wFlag) + fprintf(logFile, "%s: Firmware State is not Operational! Doorbell is %08x\n", + logPrefix(port), t); + + return 0; + } + + if (mpt_verify_ready(adap) || mpt_verify_operational(adap)) + { + return 1; + } + + t = mpt_get_state(adap); + + printf("\n%s (%s) is in %s state, Doorbell is %08x\n", + port->portName, port->chipNameRev, + t == MPI_IOC_STATE_RESET ? "RESET" : + t == MPI_IOC_STATE_FAULT ? "FAULT" : + "UNKNOWN", mpt_get_doorbell(adap)); + + return 0; +#else + return 1; +#endif +} + + +int +checkOperational(MPT_PORT *port, int flag) +{ +#if REGISTER_ACCESS +#if WIN32 || __linux__ || __sparc__ + U32 data; + + if (doReadRegister(port, MPI_DOORBELL_OFFSET, &data) == 1) + { + if ((data & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_OPERATIONAL) + { + if (!port->notOperational) + { + port->notOperational = 1; + printf("\n%s is not in Operational state! Doorbell is %08x\n", + port->portName, data); + if (wFlag) + fprintf(logFile, "%s: Firmware State is not Operational! Doorbell is %08x\n", + logPrefix(port), data); + } + + return 0; + } + + port->notOperational = 0; + } + + return 1; +#endif +#if DOS || EFI + HANDLE adap = port->fileHandle; + + if (flag) + return mpt_verify_operational(adap); + + return 1; +#endif +#else + return 1; +#endif +} + + +int +bringOnline(MPT_PORT *port) +{ +#if DOS || EFI + if (port->fileHandle->bootloader == TRUE) + { + return 0; + } + + if (port->fileHandle->ioc_online != TRUE) + { + port->fileHandle->port_enable_needed = TRUE; + + port->fileHandle->ioc_online = mpt_restart(port->fileHandle); + } + else if (port->fileHandle->port_online == FALSE) + { + port->fileHandle->port_online = mpt_port_online(port->fileHandle); + } +#endif + + return 1; +} + + +int +findPorts(void) +{ +#if WIN32 + int status; + HKEY hKeyScsi; + HKEY hKeyPort; + const LPSTR NamesKey = TEXT("HARDWARE\\DEVICEMAP\\Scsi"); + DWORD portIndex; + DWORD portNameSize; + DWORD valueType; + DWORD driverNameSize; + char portName[16]; + char driverName[16]; + char fileName[16]; + FILETIME lastWriteTime; + int portNumber; + HANDLE fileHandle; + MPT_PORT *port; + int numPorts; + + status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NamesKey, 0L, KEY_READ, &hKeyScsi); + + // if can't open this registry key, there are no scsi drivers installed + if (status != ERROR_SUCCESS) + { + printf("Couldn't get Scsi key from registry\n"); + return 0; + } + + // enumerate all SCSI ports under the Scsi key + portIndex = 0; + numPorts = 0; + while (TRUE) + { + portNameSize = sizeof portName; + status = RegEnumKeyEx(hKeyScsi, portIndex++, portName, + &portNameSize, NULL, NULL, NULL, &lastWriteTime); + + if (status != ERROR_SUCCESS) + break; + + // open this port key to check the driver name + status = RegOpenKeyEx(hKeyScsi, portName, 0L, KEY_READ, &hKeyPort); + + if (status == ERROR_SUCCESS) + { + driverNameSize = sizeof driverName; + status = RegQueryValueEx(hKeyPort, "Driver", NULL, &valueType, + driverName, &driverNameSize); + + if (status == ERROR_SUCCESS) + { + if (strcasecmp("symmpi", driverName) == 0 || + strcasecmp("lsimpt", driverName) == 0 || + strcasecmp("lsi_fc", driverName) == 0 || + strcasecmp("lsi_scsi", driverName) == 0 || + strcasecmp("lsi_sas", driverName) == 0 || + strcasecmp("lsi_sas2", driverName) == 0 || + strcasecmp("lsi_sas3", driverName) == 0 || + strcasecmp("lsi_gen2", driverName) == 0 || + strcasecmp("sas2xp86", driverName) == 0 || // new name for lsi_gen2 + strcasecmp("lsi_sss", driverName) == 0 || + strcasecmp("dcssp", driverName) == 0) + { + portNumber = atoi(&portName[10]); + sprintf(fileName, "\\\\.\\Scsi%d:", portNumber); + fileHandle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (fileHandle != INVALID_HANDLE_VALUE) + { + port = malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->fileHandle = fileHandle; + port->ioctlValue = IOCTL_SCSI_MINIPORT; + sprintf(port->portName, "Scsi Port %d", portNumber); + sprintf(fileName, "Scsi%d:", portNumber); + QueryDosDevice(fileName, port->driverName, sizeof port->driverName); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + port->ioctlValue |= 0x2000; + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + CloseHandle(fileHandle); + free(port); + } + } + } + } + } + + // close SCSI port key + RegCloseKey(hKeyPort); + } + } + + // close Scsi key + RegCloseKey(hKeyScsi); + + for (portNumber = 0; portNumber < 32; portNumber++) + { + sprintf(fileName, "\\\\.\\DcsMPT%d", portNumber); + fileHandle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (fileHandle != INVALID_HANDLE_VALUE) + { + port = malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->fileHandle = fileHandle; + port->ioctlValue = IOCTL_SCSI_MINIPORT; + sprintf(port->portName, "DcsMPT%d", portNumber); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + CloseHandle(fileHandle); + free(port); + } + } + } + + for (portNumber = 0; portNumber < 32; portNumber++) + { + sprintf(fileName, "\\\\.\\MPTstm%d", portNumber); + fileHandle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (fileHandle != INVALID_HANDLE_VALUE) + { + port = malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->fileHandle = fileHandle; + port->ioctlValue = IOCTL_SCSI_MINIPORT; + sprintf(port->portName, "MPTstm%d", portNumber); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + CloseHandle(fileHandle); + free(port); + } + } + } + + for (portNumber = 0; portNumber < 32; portNumber++) + { + sprintf(fileName, "\\\\.\\MPTstm%02x", portNumber); + fileHandle = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + if (fileHandle != INVALID_HANDLE_VALUE) + { + port = malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->fileHandle = fileHandle; + port->ioctlValue = IOCTL_SCSI_MINIPORT; + sprintf(port->portName, "MPTstm%02x", portNumber); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + CloseHandle(fileHandle); + free(port); + } + } + } +#endif +#if __linux__ + int numPorts; + int status; + HANDLE fileHandle; + HANDLE fileHandle2; + HANDLE fileHandle3; + FILE *portFile; + char portName[64]; + int portNumber; + char pathName[PATH_MAX]; + MPT_PORT *port; + struct mpt_ioctl_eventquery eventquery; + struct mpt2_ioctl_eventquery eventquery2; + struct mpt_ioctl_iocinfo *iocinfo; + struct mpt_ioctl_iocinfo_rev1 *iocinfo2; + int domain = 0; + int bus = 0; + int device = 0; + int function = 0; + HANDLE pciHandle; + unsigned char config[64]; + char *p; + char *q; + char iocEntry[64]; + FILE *iocFile; + int i; + U16 deviceIdRaw; + U16 deviceId; +#if REGISTER_ACCESS + char resource[64]; + uint64_t t, ts; + off_t bar0; + off_t bar1; + off_t bar2; + size_t bar0size; + size_t bar1size; + size_t bar2size; + char portName1[64]; + char portName2[64]; + HANDLE pciHandle1; + HANDLE pciHandle2; +#endif + + if ((fileHandle = open(IOCTL_NAME, O_RDWR)) < 0) + { + if (system("/sbin/modprobe mptctl")); + if ((fileHandle = open(IOCTL_NAME, O_RDWR)) < 0) + { + if (system("/bin/mknod /dev/mptctl c 10 220")); + fileHandle = open(IOCTL_NAME, O_RDWR); + } + } + + fileHandle2 = open(IOCTL_NAME2, O_RDWR); + fileHandle3 = open(IOCTL_NAME3, O_RDWR); + + if (fileHandle < 0 && fileHandle2 < 0 && fileHandle3 < 0) + { + printf("Couldn't open " IOCTL_NAME " or " IOCTL_NAME2 " or " IOCTL_NAME3 "!\n"); + return 0; + } + + globalFileHandle = fileHandle; + globalFileHandle2 = fileHandle2; + globalFileHandle3 = fileHandle3; + + memset(&eventquery, 0, sizeof eventquery); + eventquery.hdr.maxDataSize = sizeof eventquery; + + memset(&eventquery2, 0, sizeof eventquery2); + eventquery2.hdr.max_data_size = sizeof eventquery2; + + iocinfo = (struct mpt_ioctl_iocinfo *)malloc(sizeof *iocinfo); + memset(iocinfo, 0, sizeof *iocinfo); + iocinfo->hdr.maxDataSize = sizeof *iocinfo; + + iocinfo2 = (struct mpt_ioctl_iocinfo_rev1 *)malloc(sizeof *iocinfo2); + memset(iocinfo2, 0, sizeof *iocinfo2); + iocinfo2->hdr.maxDataSize = sizeof *iocinfo2; + + numPorts = 0; + fileHandle = globalFileHandle; + if (fileHandle < 0) + fileHandle = globalFileHandle2; + if (fileHandle < 0) + fileHandle = globalFileHandle3; +probe_again: + for (portNumber = 0; portNumber < NUM_PORTS; portNumber++) + { + sprintf(portName, "/proc/mpt/ioc%d", portNumber); + portFile = fopen(portName, "r"); + if (portFile == NULL) + sprintf(portName, "ioc%d", portNumber); + else + fclose(portFile); + + eventquery.hdr.iocnum = portNumber; + eventquery2.hdr.ioc_number = portNumber; + + if ( (fileHandle == globalFileHandle2) || (fileHandle == globalFileHandle3) ) + status = ioctl(fileHandle, MPT2EVENTQUERY, &eventquery2); + else + status = ioctl(fileHandle, MPTEVENTQUERY, &eventquery); + + if (status == 0) + { + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + /* since the global 'mpi2' is based on mptVersion, seed it with an MPI2 base value + * so it can be used until we get the real value from IOCFacts + */ + if ( (fileHandle == globalFileHandle2) || (fileHandle == globalFileHandle3) ) + port->mptVersion = MPI2_VERSION_02_00; + + port->portNumber = portNumber; + port->hostNumber = -1; + port->fileHandle = fileHandle; + strcpy(port->portName, portName); + + for (i = 0; i < 32; i++) + { + if (mpi2) + { + sprintf(pathName, "/sys/class/scsi_host/host%d/proc_name", i); + iocFile = fopen(pathName, "r"); + if (!iocFile) + continue; + p = fgets(iocEntry, sizeof iocEntry, iocFile); + fclose(iocFile); + if (!p) + continue; + if (strncmp(p, "mpt2sas", 7)) + continue; + sprintf(pathName, "/sys/class/scsi_host/host%d/unique_id", i); + iocFile = fopen(pathName, "r"); + if (!iocFile) + continue; + p = fgets(iocEntry, sizeof iocEntry, iocFile); + fclose(iocFile); + if (!p) + continue; + } + else + { + sprintf(pathName, "/proc/scsi/mptscsih/%d", i); + iocFile = fopen(pathName, "r"); + if (!iocFile) + { + sprintf(pathName, "/proc/scsi/mptfc/%d", i); + iocFile = fopen(pathName, "r"); + } + if (!iocFile) + { + sprintf(pathName, "/proc/scsi/mptsas/%d", i); + iocFile = fopen(pathName, "r"); + } + if (!iocFile) + { + sprintf(pathName, "/proc/scsi/mptspi/%d", i); + iocFile = fopen(pathName, "r"); + } + if (!iocFile) + continue; + p = fgets(iocEntry, sizeof iocEntry, iocFile); + fclose(iocFile); + if (!p) + continue; + p = strstr(iocEntry, "ioc"); + if (!p) + continue; + p += 3; + q = strstr(p, ":"); + if (!q) + continue; + q[0] = '\0'; + } + if (portNumber == atoi(p)) + { + port->hostNumber = i; + break; + } + } + + iocinfo->hdr.iocnum = portNumber; + + if (mpi2) + status = ioctl(fileHandle, MPT2IOCINFO, iocinfo); + else + status = ioctl(fileHandle, MPTIOCINFO, iocinfo); + + if (status == 0) + { + domain = iocinfo->pciInfo.segmentID; + bus = iocinfo->pciInfo.u.bits.busNumber; + device = iocinfo->pciInfo.u.bits.deviceNumber; + function = iocinfo->pciInfo.u.bits.functionNumber; + } + else + { + iocinfo2->hdr.iocnum = portNumber; + + status = ioctl(fileHandle, MPTIOCINFO2, iocinfo2); + + if (status == 0) + { + domain = 0; + bus = iocinfo->pciInfo.u.bits.busNumber; + device = iocinfo->pciInfo.u.bits.deviceNumber; + function = iocinfo->pciInfo.u.bits.functionNumber; + } + } + + if (status == 0) + { + sprintf(portName, "/proc/bus/pci/%04x:%02x/%02x.%d", + domain, bus, device, function); + + pciHandle = open(portName, O_RDWR); + + if (pciHandle < 0) + { + sprintf(portName, "/proc/bus/pci/%02x/%02x.%d", + bus, device, function); + + pciHandle = open(portName, O_RDWR); + } + + if (pciHandle >= 0) + { + if (read(pciHandle, config, sizeof config) == sizeof config) + { + deviceIdRaw = get16x(*(U16 *)&config[2]); + + /* the following three want to be set to the device ID that doesnt include ZC*/ + if ( (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1030ZC) || + (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035) || + (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1035ZC)) + { + deviceId = deviceIdRaw & ~1; + } + else + { + deviceId = deviceIdRaw; + } + + port->deviceId = deviceId; + port->deviceIdRaw = deviceIdRaw; + +#if REGISTER_ACCESS + sprintf(portName, "/sys/bus/pci/devices/%04x:%02x:%02x.%d/resource", + domain, bus, device, function); + + portFile = fopen(portName, "r"); + + if (portFile == NULL) + { + sprintf(portName, "/sys/bus/pci/devices/%02x:%02x.%d/resource", + bus, device, function); + + portFile = fopen(portName, "r"); + } + + if (portFile) + { + bar0 = 0; + bar1 = 0; + bar2 = 0; + bar0size = 0; + bar1size = 0; + bar2size = 0; + + if (fgets(resource, sizeof resource, portFile)) + { + if (sscanf(resource, "%llx %llx", &t, &ts) == 2) + { + if (deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + bar1 = t; + bar1size = ts - t + 1; + } + else + { + bar0 = t; + bar0size = ts - t + 1; + } + } + if (fgets(resource, sizeof resource, portFile)) + { + if (sscanf(resource, "%llx %llx", &t, &ts) == 2) + { + if (deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + bar0 = t; + bar0size = ts - t + 1; + } + else + { + bar1 = t; + bar1size = ts - t + 1; + } + } + if (fgets(resource, sizeof resource, portFile)) + { + if (fgets(resource, sizeof resource, portFile)) + { + if (sscanf(resource, "%llx %llx", &t, &ts) == 2) + { + bar2 = t; + bar2size = ts - t + 1; + } + } + } + } + } + + fclose(portFile); + } + else + { + if (deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + bar1 = get64x( config[0x10]) & ~0xF; + bar0 = get32x(*(U32 *)&config[0x18]) & ~0xF; + } + else + { + bar0 = get32x(*(U32 *)&config[0x10]) & ~0xF; + bar1 = get64x( config[0x14]) & ~0xF; + } + bar2 = get64x( config[0x1c]) & ~0xF; + bar0size = 256; + bar1size = 256; + bar2size = 65536; + } + + port->ioPhys = bar0; + port->memPhys = bar1; + port->diagPhys = bar2; + + ioctl(pciHandle, PCIIOC_MMAP_IS_MEM); + + if (deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + sprintf(portName1, "%s0", portName); + else + sprintf(portName1, "%s1", portName); + sprintf(portName2, "%s3", portName); + + pciHandle1 = open(portName1, O_RDWR); + if (pciHandle1) + { + errno = 0; + port->memVirt = mmap(NULL, bar1size, PROT_READ | PROT_WRITE, + MAP_SHARED, pciHandle1, 0); + if (errno) + port->memVirt = NULL; + } + + if (!port->memVirt && bar1 && bar1size) + { + errno = 0; + port->memVirt = mmap(NULL, bar1size, PROT_READ | PROT_WRITE, + MAP_SHARED, pciHandle, bar1); + if (errno) + port->memVirt = NULL; + } + + if (!port->memVirt) + port->memPhys = 0; + + pciHandle2 = open(portName2, O_RDWR); + if (pciHandle2) + { + errno = 0; + port->diagVirt = mmap(NULL, bar2size, PROT_READ | PROT_WRITE, + MAP_SHARED, pciHandle2, 0); + if (errno) + port->diagVirt = NULL; + } + + if (!port->diagVirt && bar2 && bar2size) + { + errno = 0; + port->diagVirt = mmap(NULL, bar2size, PROT_READ | PROT_WRITE, + MAP_SHARED, pciHandle, bar2); + if (errno) + port->diagVirt = NULL; + } + + if (!port->diagVirt) + port->diagPhys = 0; + +#if i386 + if (deviceId == MPI_MANUFACTPAGE_DEVID_53C1030) + { + iopl(3); + + if (!(config[0x04] & 1)) + { + config[0x04] |= 1; + lseek(pciHandle, 0x04, SEEK_SET); + write(pciHandle, config + 0x04, 1); + } + } +#endif +#endif + } + } + } + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + + } + else + { + free(port); + } + } + } + if (fileHandle == globalFileHandle) + { + fileHandle = globalFileHandle2; + if (fileHandle >= 0) + goto probe_again; + } + if (fileHandle == globalFileHandle2) + { + fileHandle = globalFileHandle3; + if (fileHandle >= 0) + goto probe_again; + } + + free(iocinfo); + free(iocinfo2); + + if (numPorts == 0) + { + if (globalFileHandle >= 0) + close(globalFileHandle); + if (globalFileHandle2 >= 0) + close(globalFileHandle2); + if (globalFileHandle3 >= 0) + close(globalFileHandle3); + } +#endif +#if __sparc__ + int numPorts; + FILE *pathFile; + char pathEntry[PATH_MAX]; + char *o; + char *p; + char *q; + char path[PATH_MAX]; + HANDLE fileHandle; + int portNumber; + MPT_PORT *port; + int i; + int j; + int n; + DIR *dirp; + struct dirent *direntp; + char pathName[PATH_MAX]; + char linkName[PATH_MAX]; + struct stat stat; + di_node_t root_node; + + numPorts = 0; + + root_node = di_init("/", DINFOSUBTREE); + + if (root_node != DI_NODE_NIL) + { + di_walk_node(root_node, DI_WALK_CLDFIRST, &numPorts, getNodeInfo); + + di_fini(root_node); + } + + if (numPorts == 0) + { + pathFile = fopen("/etc/path_to_inst", "r"); + if (pathFile == NULL) + { + printf("Couldn't open /etc/path_to_inst!\n"); + perror("Error is"); + return 0; + } + + while (fgets(pathEntry, sizeof pathEntry, pathFile) != NULL) + { + if ((o = strstr(pathEntry, "\"itmpt\"")) == NULL && + (o = strstr(pathEntry, "\"itmptfc\"")) == NULL && + (o = strstr(pathEntry, "\"mpt\"")) == NULL) + continue; + + p = strchr(pathEntry, (int)'"'); + if (p == NULL) + continue; + p += 1; + if (strncmp(p, "/node@", 6) == 0) + { + p += 6; + p = strchr(p, '/'); + if (p == NULL) + continue; + } + q = strchr(p, '"'); + if (q == NULL) + continue; + *q = '\0'; + q += 1; + + portNumber = atoi(q); + o += 1; + q = strchr(o, '"'); + *q = '\0'; + + sprintf(path, "/devices%s:devctl", p); + if ((fileHandle = open(path, O_RDWR)) < 0) + continue; + + if (fstat(fileHandle, &stat) < 0) + continue; + + if (portNumber != MINOR2INST(getminor(stat.st_rdev))) + continue; + + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->hostNumber = -1; + port->fileHandle = fileHandle; + port->ioctlValue = SYMIOCTL_PASS_THRU_TIMEOUT; + sprintf(port->portName, "%s%d", o, portNumber); + if (strstr(o, "fc")) + sprintf(port->pathName, "%s/fp@0,0", p); + else + sprintf(port->pathName, "%s", p); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + close(fileHandle); + free(port); + } + } + + fclose(pathFile); + } + + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + + dirp = opendir("/dev/cfg/"); + while (dirp) + { + direntp = readdir(dirp); + if (!direntp) + break; + strcpy(pathName, "/dev/cfg/"); + strcat(pathName, direntp->d_name); + n = readlink(pathName, linkName, sizeof linkName); + if (n <= 0) + continue; + linkName[n] = '\0'; + p = strstr(linkName, "/devices"); + if (!p) + continue; + p += 8; + q = strrchr(p, ':'); + if (q) + *q = '\0'; + if (strcmp(port->pathName, p) == 0) + { + port->hostNumber = atoi(direntp->d_name + 1); + break; + } + } + if (dirp) + closedir(dirp); + } + + for (i = 0; i < numPorts - 1; i++) + { + for (j = i + 1; j < numPorts; j++) + { + if (strcmp(mptPorts[i]->portName, mptPorts[j]->portName) > 0) + { + port = mptPorts[i]; + mptPorts[i] = mptPorts[j]; + mptPorts[j] = port; + } + } + } +#endif +#if __irix__ + int numPorts; + HANDLE fileHandle; + char portName[24]; + int portNumber; + MPT_PORT *port; + + numPorts = 0; + for (portNumber = 0; portNumber < NUM_PORTS; portNumber++) + { + sprintf(portName, "/hw/scsi_ctlr/%d/bus", portNumber); + if ((fileHandle = open(portName, O_RDWR)) < 0) + continue; + + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->fileHandle = fileHandle; + sprintf(port->portName, "scsi_ctlr%d", portNumber); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + free(port); + } + } +#endif +#if __alpha__ + int numPorts; + HANDLE fileHandle; + int portNumber; + MPT_PORT *port; + + if ((fileHandle = open("/dev/itmpt", O_RDWR)) < 0) + { + printf("Couldn't open /dev/itmpt!\n"); + perror("Error is"); + return 0; + } + + globalFileHandle = fileHandle; + + numPorts = 0; + for (portNumber = 0; portNumber < 8; portNumber++) + { + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = portNumber; + port->fileHandle = fileHandle; + sprintf(port->portName, "itmpt%d", portNumber); + + if (getPortInfo(port) == 1) + { + mptPorts[numPorts++] = port; + } + else + { + free(port); + } + } + + if (numPorts == 0) + close(fileHandle); +#endif +#if DOS + int numPorts; + HANDLE adap; + MPT_PORT *port; + U8 pciMajorRevision; + U8 pciMinorRevision; + U8 maxPciBusNumber; + U8 busNumber; + U8 deviceNumber; + U8 functionNumber; + U8 deviceFunction; + U16 vendorId; + U16 deviceIdRaw; + U16 deviceId; + U8 command; + int io; + int mem; + int diagmem; + int t; + + if (PciIsBiosPresent(&pciMajorRevision, &pciMinorRevision, &maxPciBusNumber) != 1) + { + printf("\nThe PCI System BIOS is not present!\n"); + return 0; + } + + numPorts = 0; + for (busNumber = 0; busNumber <= maxPciBusNumber; busNumber++) + { + for (deviceNumber = 0; deviceNumber < 32; deviceNumber++) + { + for (functionNumber = 0; functionNumber < 8; functionNumber++) + { + deviceFunction = (deviceNumber << 3) | functionNumber; + + // have to do this twice for some PCI BIOS implementations! + + vendorId = PciReadConfigWord(busNumber, deviceFunction, PCI_CONFIG_VENDOR_ID); + deviceIdRaw = PciReadConfigWord(busNumber, deviceFunction, PCI_CONFIG_DEVICE_ID); + + vendorId = PciReadConfigWord(busNumber, deviceFunction, PCI_CONFIG_VENDOR_ID); + deviceIdRaw = PciReadConfigWord(busNumber, deviceFunction, PCI_CONFIG_DEVICE_ID); + + if (vendorId != MPI_MANUFACTPAGE_VENDORID_LSILOGIC) + break; + + /* the following three want to be set to the device ID that doesnt include ZC*/ + if ( (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1030ZC) || + (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035) || + (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1035ZC)) + { + deviceId = deviceIdRaw & ~1; + } + else + { + deviceId = deviceIdRaw; + } + + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC909 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC939X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949E || + deviceId == MPI_MANUFACTPAGE_DEVID_53C1030 || + deviceId == MPI_MANUFACTPAGE_DEVID_1030_53C1035 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1064 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1064E || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1066 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1066E || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1068 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1068E || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2004 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2008 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2108_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2108_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2108_3 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2116_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2116_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_3 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_4 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_5 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_6 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2308_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2308_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2308_3 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3004 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3008 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_1 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_2 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_5 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_6 || + deviceId == MPI2_MFGPAGE_DEVID_SSS6200 ) + { + adap = malloc(sizeof *adap); + + memset(adap, 0, sizeof *adap); + + if (deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + io = PCI_CONFIG0_BASE_ADDRESS2; + mem = PCI_CONFIG0_BASE_ADDRESS0; + diagmem = PCI_CONFIG0_BASE_ADDRESS3; + } + else + { + io = PCI_CONFIG0_BASE_ADDRESS0; + mem = PCI_CONFIG0_BASE_ADDRESS1; + diagmem = PCI_CONFIG0_BASE_ADDRESS3; + } + + if (deviceId != MPI_MANUFACTPAGE_DEVID_53C1030) + { + io = mem; // no need to use I/O space, so don't (it's safer not to) + } + + adap->bus_number = busNumber; + adap->device_function = deviceFunction; + adap->revision_id = PciReadConfigByte(busNumber, deviceFunction, + PCI_CONFIG_REVISION_ID); + adap->io = io; + adap->mem = mem; + adap->diagmem = diagmem; + + adap->io_addr = PciReadConfigDword(busNumber, deviceFunction, io) & ~0xF; + adap->mem_addr = PciReadConfigDword(busNumber, deviceFunction, mem) & ~0xF; + PciWriteConfigDword(busNumber, deviceFunction, mem, 0xFFFFFFFF); + adap->mem_size = ~(PciReadConfigDword(busNumber, deviceFunction, mem) & ~0xF) + 1; + PciWriteConfigDword(busNumber, deviceFunction, mem, adap->mem_addr); + adap->mem_virt = MapPhysicalToLinear(adap->mem_addr, adap->mem_size); + adap->diagmem_addr = PciReadConfigDword(busNumber, deviceFunction, diagmem) & ~0xF; + PciWriteConfigDword(busNumber, deviceFunction, diagmem, 0xFFFFFFFF); + adap->diagmem_size = ~(PciReadConfigDword(busNumber, deviceFunction, diagmem) & ~0xF) + 1; + PciWriteConfigDword(busNumber, deviceFunction, diagmem, adap->diagmem_addr); + adap->diagmem_virt = MapPhysicalToLinear(adap->diagmem_addr, adap->diagmem_size); + + PtrAllocateContiguousMemory(sizeof(mpt_shared_t), &adap->shared_contig_mem); + + command = PciReadConfigByte(busNumber, deviceFunction, PCI_CONFIG_COMMAND); + command |= PCI_COMMAND_IO; + command |= PCI_COMMAND_MEMORY; + command |= PCI_COMMAND_BUS_MASTER; + PciWriteConfigByte(busNumber, deviceFunction, PCI_CONFIG_COMMAND, command); + + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = (busNumber << 8) | deviceFunction; + port->fileHandle = adap; + sprintf(port->portName, "%02x/%02x/%d", busNumber, deviceNumber, functionNumber); + + adap->port = port; + adap->name = port->portName; + adap->vendor_id = vendorId; + adap->device_id = deviceId; + adap->shared = adap->shared_contig_mem.PtrContiguous; + adap->shared_ba = adap->shared_contig_mem.PhyPtrContiguous; + adap->max_targets = 256; + adap->restart_needed = FALSE; + adap->bus_reset_needed = FALSE; + + memset(adap->shared, 0, sizeof(mpt_shared_t)); + + port->deviceIdRaw = deviceIdRaw; + port->deviceId = deviceId; + port->revisionId = adap->revision_id; + port->iocNumber = functionNumber; + getChipName(port); + + if (functionNumber == 1) + { + MPT_PORT *partner_port = mptPorts[numPorts - 1]; + HANDLE partner_adap = partner_port->fileHandle; + + adap->partner_adap = partner_adap; + partner_adap->partner_adap = adap; + + adap->fw_image = partner_adap->fw_image; + } + + if (mpt_verify_enabled(adap) && + (mpt_verify_ready(adap) || mpt_verify_operational(adap))) + { + getPortInfo(port); + } + else + { + t = mpt_get_state(adap); + + printf("\n%s (%s) is in %s state, Doorbell is %08x\n", + port->portName, port->chipNameRev, + t == MPI_IOC_STATE_RESET ? "RESET" : + t == MPI_IOC_STATE_FAULT ? "FAULT" : + "UNKNOWN", mpt_get_doorbell(adap)); + } + + mptPorts[numPorts++] = port; + } + else + break; + } + } + } +#endif +#if EFI + EFI_DEVICE_PATH_PROTOCOL *ourDevicePath; + EFI_DEVICE_PATH_PROTOCOL *pciDevicePath; + EFI_STATUS status; + EFI_HANDLE handle; + EFI_HANDLE *handles; + UINTN numHandles; + EFI_PCI_IO_PROTOCOL *pciIo; + PCI_TYPE00 pci; + int i; + int numPorts; + HANDLE adap; + MPT_PORT *port; + UINTN segmentNumber; + UINTN busNumber; + UINTN deviceNumber; + UINTN functionNumber; + U8 deviceFunction; + U16 vendorId; + U16 deviceIdRaw; + U16 deviceId; + int io; + int mem; + int diagmem; + U32 bar; + U32 data; + UINTN buffer_size; + void *buffer; + mpt_bus_addr_t buffer_dma; + void *buffer_mapping; + U32 actualImageLen; + int t; + + status = BS->HandleProtocol(gLoadedImage->DeviceHandle, + &gEfiDevicePathProtocolGuid, &ourDevicePath); + if (EFI_ERROR(status)) + return 0; + + status = BS->LocateHandleBuffer(ByProtocol, &gEfiPciIoProtocolGuid, + NULL, &numHandles, &handles); + if (EFI_ERROR(status)) + return 0; + + numPorts = 0; + for (i = 0; i < (int)numHandles; i++) + { + handle = handles[i]; + + status = BS->OpenProtocol(handle, &gEfiPciIoProtocolGuid, + &pciIo, gImageHandle, handle, + EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL); + if (EFI_ERROR(status)) + continue; + + status = pciIo->Pci.Read(pciIo, EfiPciIoWidthUint8, 0, + sizeof pci, &pci); + if (EFI_ERROR(status)) + { + BS->CloseProtocol(handle, &gEfiPciIoProtocolGuid, gImageHandle, handle); + continue; + } + + vendorId = pci.Hdr.VendorId; + deviceIdRaw = pci.Hdr.DeviceId; + /* the following three want to be set to the device ID that doesnt include ZC*/ + if ( (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1030ZC) || + (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035) || + (deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1035ZC)) + { + deviceId = deviceIdRaw & ~1; + } + else + { + deviceId = deviceIdRaw; + } + + + status = BS->HandleProtocol(handle, &gEfiDevicePathProtocolGuid, &pciDevicePath); + if (EFI_ERROR(status)) + { + BS->CloseProtocol(handle, &gEfiPciIoProtocolGuid, gImageHandle, handle); + continue; + } + + if (vendorId != MPI_MANUFACTPAGE_VENDORID_LSILOGIC) + { + BS->CloseProtocol(handle, &gEfiPciIoProtocolGuid, gImageHandle, handle); + continue; + } + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC909 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC939X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949E || + deviceId == MPI_MANUFACTPAGE_DEVID_53C1030 || + deviceId == MPI_MANUFACTPAGE_DEVID_1030_53C1035 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1064 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1064E || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1066 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1066E || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1068 || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1068E || + deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2004 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2008 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2108_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2108_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2108_3 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2116_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2116_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_3 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_4 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_5 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2208_6 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2308_1 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2308_2 || + deviceId == MPI2_MFGPAGE_DEVID_SAS2308_3 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3004 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3008 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_1 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_2 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_5 || + deviceId == MPI25_MFGPAGE_DEVID_SAS3108_6 || + deviceId == MPI2_MFGPAGE_DEVID_SSS6200 ) + { + adap = malloc(sizeof *adap); + + memset(adap, 0, sizeof *adap); + + if (deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + io = 2; + mem = 0; + diagmem = 3; + } + else + { + io = 0; + mem = 1; + diagmem = 3; + } + + if (deviceId != MPI_MANUFACTPAGE_DEVID_53C1030) + { + io = mem; // no need to use I/O space, so don't (it's safer not to) + } + + pciIo->GetLocation(pciIo, &segmentNumber, &busNumber, &deviceNumber, &functionNumber); + + deviceFunction = ((U8)deviceNumber << 3) | (U8)functionNumber; + + adap->handle = handle; + adap->pci_io = pciIo; + + adap->segment_number = (U8)segmentNumber; + adap->bus_number = (U8)busNumber; + adap->device_function = deviceFunction; + adap->revision_id = pci.Hdr.RevisionID; + adap->io = io; + adap->mem = mem; + adap->diagmem = diagmem; + + data = 0xFFFFFFFF; + pciIo->Pci.Read(pciIo, EfiPciIoWidthUint32, 0x10 + diagmem * 4, 1, &bar); + pciIo->Pci.Write(pciIo, EfiPciIoWidthUint32, 0x10 + diagmem * 4, 1, &data); + pciIo->Pci.Read(pciIo, EfiPciIoWidthUint32, 0x10 + diagmem * 4, 1, &data); + pciIo->Pci.Write(pciIo, EfiPciIoWidthUint32, 0x10 + diagmem * 4, 1, &bar); + + adap->diagmem_size = ~(data & ~0xF) + 1; + + status = pciIo->Attributes(pciIo, EfiPciIoAttributeOperationEnable, + EFI_PCI_IO_ATTRIBUTE_IO | + EFI_PCI_IO_ATTRIBUTE_MEMORY | + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER | + EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE, NULL); + + if (status == EFI_UNSUPPORTED) + { + status = pciIo->Attributes(pciIo, EfiPciIoAttributeOperationEnable, + EFI_PCI_IO_ATTRIBUTE_IO | + EFI_PCI_IO_ATTRIBUTE_MEMORY | + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER, NULL); + } + + if (EFI_ERROR(status)) + { + BS->CloseProtocol(handle, &gEfiPciIoProtocolGuid, gImageHandle, handle); + continue; + } + + status = pciIo->AllocateBuffer(pciIo, 0, EfiBootServicesData, + EFI_SIZE_TO_PAGES(sizeof(mpt_shared_t)), &buffer, 0); + if (EFI_ERROR(status)) + { + BS->CloseProtocol(handle, &gEfiPciIoProtocolGuid, gImageHandle, handle); + continue; + } + + buffer_size = sizeof(mpt_shared_t); + if (pciIo->Map) + { + status = pciIo->Map(pciIo, EfiPciIoOperationBusMasterCommonBuffer, + buffer, &buffer_size, &buffer_dma, &buffer_mapping); + } + else + { + buffer_dma = (mpt_bus_addr_t)buffer; + buffer_mapping = NULL; + } + + adap->buffer_mapping = buffer_mapping; + + port = (MPT_PORT *)malloc(sizeof *port); + + memset(port, 0, sizeof *port); + + port->portNumber = ((U8)segmentNumber << 16) | ((U8)busNumber << 8) | deviceFunction; + port->fileHandle = adap; + sprintf(port->portName, "%02x/%02x/%02x/%d", segmentNumber, busNumber, deviceNumber, functionNumber); + + adap->port = port; + adap->name = port->portName; + adap->vendor_id = vendorId; + adap->device_id = deviceId; + adap->shared = buffer; + adap->shared_ba = buffer_dma; + adap->max_targets = 256; + adap->restart_needed = FALSE; + adap->bus_reset_needed = FALSE; + + memset(adap->shared, 0, sizeof(mpt_shared_t)); + + port->deviceIdRaw = deviceIdRaw; + port->deviceId = deviceId; + port->revisionId = adap->revision_id; + port->iocNumber = (U8)functionNumber; + getChipName(port); + + if (functionNumber == 1) + { + MPT_PORT *partner_port = mptPorts[numPorts - 1]; + HANDLE partner_adap = partner_port->fileHandle; + + adap->partner_adap = partner_adap; + partner_adap->partner_adap = adap; + + adap->fw_image = partner_adap->fw_image; + adap->loaddevice = partner_adap->loaddevice; + } + + if (memcmp(pciDevicePath, ourDevicePath, 12+6) == 0) + { + adap->loaddevice = TRUE; + if (adap->partner_adap) + adap->partner_adap->loaddevice = TRUE; + } + + if (mpt_verify_enabled(adap) && + (mpt_verify_ready(adap) || mpt_verify_operational(adap))) + { + getPortInfo(port); + + if (port->flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT) + { + if (adap->fw_image == NULL && port->fwImageSize != 0) + { + buffer = malloc(port->fwImageSize); + + if (doFwUpload(port, MPI_FW_UPLOAD_ITYPE_FW_IOC_MEM, + buffer, port->fwImageSize, 0, &actualImageLen) == 1) + { + adap->fw_image = buffer; + adap->fw_image_size = actualImageLen; + + if (actualImageLen != port->fwImageSize) + printf("\nFW_UPLOAD of IOC_MEM returned %d bytes (expected %d bytes)\n", + actualImageLen, port->fwImageSize); + } + else + { + printf("\nFW_UPLOAD of IOC_MEM failed!\n"); + free(buffer); + } + } + } + } + else + { + t = mpt_get_state(adap); + + printf("\n%s (%s) is in %s state, Doorbell is %08x\n", + port->portName, port->chipNameRev, + t == MPI_IOC_STATE_RESET ? "RESET" : + t == MPI_IOC_STATE_FAULT ? "FAULT" : + "UNKNOWN", mpt_get_doorbell(adap)); + } + + mptPorts[numPorts++] = port; + } + } + + if (numHandles) + FreePool(handles); +#endif + + if (just) + { + int i; + int j; + + for (i = 0, j = 0; i < numPorts; i++) + { + port = mptPorts[i]; + mptPorts[j] = port; + + if (port->mptVersion == 0) + continue; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (just & JUST_FC) + { + j++; + continue; + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + if (just & JUST_SCSI) + { + j++; + continue; + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (just & JUST_SAS) + { + j++; + continue; + } + } + + closePort(port); + } + + numPorts = j; + } + + return numPorts; +} + + +int +closePorts(int numPorts) +{ + MPT_PORT *port; + int i; + + for (i = 0; i < numPorts; i++) + { + port = mptPorts[i]; + + if (port) + closePort(port); + } + +#if __linux__ || __alpha__ + if (globalFileHandle >= 0) + close(globalFileHandle); + if (globalFileHandle2 >= 0) + close(globalFileHandle2); +#endif + + if (osDeviceState) + free(osDeviceState); + +#if __sparc__ + if (scsi_vhci_fd >= 0) + close(scsi_vhci_fd); + + if (dev_rdsk_count) + free(dev_rdsk_cache); + + if (dev_rmt_count) + free(dev_rmt_cache); + + if (dev_es_count) + free(dev_es_cache); +#endif + + if (logFile) + { + fprintf(logFile, "%s: Logging ended\n", logPrefix(NULL)); + fclose(logFile); + } + + return 1; +} + + +int +closePort(MPT_PORT *port) +{ +#if DOS || EFI + HANDLE adap; +#endif + +#if WIN32 + CloseHandle(port->fileHandle); +#endif +#if __sparc__ || __irix__ + close(port->fileHandle); +#endif +#if DOS + adap = port->fileHandle; + + mpt_stop(adap, FALSE); + if (adap->fw_image != NULL && adap->fw_image_size != 0) + free(adap->fw_image); + UnmapPhysicalToLinear(adap->mem_addr); + UnmapPhysicalToLinear(adap->diagmem_addr); + FreeContiguousMemory(adap->shared_contig_mem.PtrFree); + free(adap); +#endif +#if EFI + adap = port->fileHandle; + + if (adap->disconnected == TRUE || adap->loaddevice == FALSE || + ((port->flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT) && adap->fw_image != NULL)) + { + adap->loaddevice = FALSE; + mpt_stop(adap, FALSE); + } + if (adap->fw_image != NULL && adap->fw_image_size != 0) + free(adap->fw_image); + if (adap->pci_io->Unmap && adap->buffer_mapping) + adap->pci_io->Unmap(adap->pci_io, adap->buffer_mapping); + adap->pci_io->FreeBuffer(adap->pci_io, EFI_SIZE_TO_PAGES(sizeof(mpt_shared_t)), adap->shared); + BS->CloseProtocol(adap->handle, &gEfiPciIoProtocolGuid, gImageHandle, adap->handle); + if (adap->disconnected == TRUE) + BS->ConnectController(adap->handle, NULL, NULL, TRUE); + free(adap); +#endif + free(port->chipName); + free(port->chipNameRev); + free(port); + + return 1; +} + + +int +getFileName(char *buf, int len, FILE *file, char *fileString, int fileType) +{ + int n; + + if (numFileNames > fileType && strcmp(fileNames[fileType], "?") != 0) + { + strncpy(buf, fileNames[fileType], len); + } + else + { + printf("Enter %s filename: ", fileString); + + if (fgets(buf, len, file) == NULL) + exit(0); + } + + if (file == stdin) + lines = 0; + + buf[len - 1] = '\0'; + n = (int)strlen(buf); + + while (n != 0 && (buf[n-1] == ' ' || buf[n-1] == '\n')) + buf[--n] = '\0'; + + return n; +} + + +int +getString(char *buf, int len, FILE *file) +{ + int n; + + if (fgets(buf, len, file) == NULL) + exit(0); + + if (file == stdin) + lines = 0; + + buf[len - 1] = '\0'; + n = (int)strlen(buf); + + while (n != 0 && (buf[n-1] == ' ' || buf[n-1] == '\n')) + buf[--n] = '\0'; + + return n; +} + + +int +getStringFromArgs(char *buf, int len, FILE *file) +{ + int n; + char c; + + if (argsCurr == NULL) + return getString(buf, len, file); + + n = 0; + while (TRUE) + { + c = argsCurr[n]; + + if (c == '\0' || c == ',') + break; + + if (n < len - 1) + buf[n++] = c; + } + buf[n] = '\0'; + + if (c == '\0') + argsCurr = NULL; + else + argsCurr += n + 1; + + printf("%s\n", buf); + + return n; +} + + +int +getYesNoAnswer(int defvalue) +{ + char buf[64]; + int n; + + n = getStringFromArgs(buf, sizeof buf, stdin); + + if (n == 0) + return defvalue; + + if (strncasecmp(buf, "no", n) == 0) + return 0; + + if (strncasecmp(buf, "yes", n) == 0) + return 1; + + return defvalue; +} + + +int +getNumberAnswer(int low, int high, int defvalue) +{ + char buf[64]; + int i; + int n; + int answer; + + while (TRUE) + { + n = getStringFromArgs(buf, sizeof buf, stdin); + + if (n == 0) + return defvalue; + + if (defvalue == -999) + { + if (strncasecmp(buf, "expert", n) == 0) + { + if (expert) + printf("\nDisabled expert mode in menus\n"); + else + printf("\nEnabled expert mode in menus\n"); + expert = !expert; + return defvalue; + } + + if (strncasecmp(buf, "paged", n) == 0) + { + if (paged) + { + printf("\nDisabled paged mode\n"); + paged = 0; + } + else + { + printf("\nEnabled paged mode, 24 lines\n"); + paged = 22; + } + return 999; + } + + if (sscanf(buf, "p%d", &i) == 1) + { + if (i >= 4) + { + printf("\nEnabled paged mode, %d lines\n", i); + paged = i - 2; + } + else + { + printf("\nDisabled paged mode\n"); + paged = 0; + } + return 999; + } + + if (strncasecmp(buf, "wwwwwwww", n) == 0) + { + if (wFlag) + { + wFlag = 0; + printf("\nDisabled logging\n"); + fprintf(logFile, "%s: Logging ended\n", logPrefix(NULL)); + fclose(logFile); + logFile = NULL; + } + else + { + wFlag = n; + printf("\nEnabled logging (level %d)\n", wFlag); + logFile = fopen("lsiutil.log", "a"); + if (logFile) + { + fprintf(logFile, "%s: Logging started at level %d\n", logPrefix(NULL), wFlag); + } + else + { + printf("Open failure for file lsiutil.log!\n"); + perror("Error is"); + logFile = stderr; + } + } + return 999; + } + + if (strncasecmp(buf, "g", n) == 0) + { + gFlag = !gFlag; + return 999; + } + + if (strncasecmp(buf, "k", n) == 0) + { + kFlag = !kFlag; + return 999; + } + } + else if (defvalue == -888) + { + if (strncasecmp(buf, "all", n) == 0) + { + return 888; + } + } + + for (i = 0; i < n; i++) + if (!isdigit((int)buf[i])) + break; + + if (i == n) + { + if (sscanf(buf, "%d", &answer) == 1) + if (answer >= low && answer <= high) + return answer; + } + + printf("Invalid answer, try again: "); + } +} + + +int +getNumberAnswerHex(int low, int high, int defvalue) +{ + char buf[64]; + int i; + int n; + int answer; + + while (TRUE) + { + n = getStringFromArgs(buf, sizeof buf, stdin); + + if (n == 0) + return defvalue; + + for (i = 0; i < n; i++) + if (!isxdigit((int)buf[i])) + break; + + if (i == n) + { + if (sscanf(buf, "%x", &answer) == 1) + if (answer >= low && answer <= high) + return answer; + } + + printf("Invalid answer, try again: "); + } +} + + +int +getHexNumberAnswer(U32 *value) +{ + char buf[64]; + int i; + int n; + U32 answer; + + while (TRUE) + { + n = getStringFromArgs(buf, sizeof buf, stdin); + + if (n == 0) + return 0; + + for (i = 0; i < n; i++) + if (!isxdigit((int)buf[i])) + break; + + if (i == n) + { + if (sscanf(buf, "%x", &answer) == 1) + { + *value = answer; + return 1; + } + } + + printf("Invalid answer, try again: "); + } +} + + +int +getHexDoubleNumberAnswer(U32 *value1, U32 *value2) +{ + char buf[64]; + int i; + int n; + U32 answer1; + U32 answer2; + + while (TRUE) + { + n = getStringFromArgs(buf, sizeof buf, stdin); + + if (n == 0) + return 0; + + if (n == 16) + { + for (i = 0; i < n; i++) + if (!isxdigit((int)buf[i])) + break; + + if (i == n) + { + if (sscanf(buf, "%8x%8x", &answer1, &answer2) == 2) + { + *value1 = answer1; + *value2 = answer2; + return 1; + } + } + } + + printf("Invalid answer, try again: "); + } +} + + +int +parseHexNumberChange(U32 *value) +{ + char buf[64]; + int i; + int j; + int k; + int n; + U32 answer; + int skip; + U32 shift = 0; + U32 mask = 0xffffffff; + U32 oldvalue; + U32 newvalue; + + while (TRUE) + { + skip = 0; + shift = 0; + mask = 0xffffffff; + + n = getStringFromArgs(buf, sizeof buf, stdin); + + if (n == 0) + return 0; + + if (sscanf(buf, "word%d=%n", &i, &k) == 1) + { + if (i <= 1) + { + skip = k; + shift = i * 16; + mask = 0xffff; + } + } + else if (sscanf(buf, "byte%d=%n", &i, &k) == 1) + { + if (i <= 3) + { + skip = k; + shift = i * 8; + mask = 0xff; + } + } + else if (sscanf(buf, "bit%d=%n", &i, &k) == 1) + { + if (i <= 31) + { + skip = k; + shift = i; + mask = 0x1; + } + } + else if (sscanf(buf, "bits%d:%d=%n", &i, &j, &k) == 2) + { + if (i <= 31 && i >= j) + { + skip = k; + shift = j; + mask = 0xffffffff >> (31 - i + j); + } + } + + for (i = skip; i < n; i++) + if (!isxdigit((int)buf[i])) + break; + + if (i == n) + { + if (sscanf(buf + skip, "%x", &answer) == 1) + { + if ((answer & mask) == answer) + { + oldvalue = *value; + newvalue = (oldvalue & ~(mask << shift)) | (answer << shift); + if (skip) + printf("Old value was %08x, new value is %08x\n", oldvalue, newvalue); + *value = newvalue; + return 1; + } + } + } + + printf("Invalid answer, try again: "); + } +} + + +int +readFile(char *name, unsigned char **outBuf, int *outLen) +{ + int file; + struct stat stat; + unsigned char *buf = NULL; + int len; + int t; + + file = open(name, O_RDONLY | O_BINARY); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + + t = fstat(file, &stat); + if (t < 0) + { + printf("Couldn't get size of file %s\n", name); + perror("Error is"); + close(file); + return 0; + } + + len = (int)stat.st_size; + + buf = (unsigned char *)malloc(len + 1); + + t = read(file, buf, len); + if (t != len) + { + printf("Read failed for file %s\n", name); + perror("Error is"); + free(buf); + close(file); + return 0; + } + + close(file); + + *outBuf = buf; + *outLen = len; + + buf[len] = 0; + + return 1; +} + + +int +queryFile(char *name) +{ + unsigned char *imageBuf = NULL; + int imageLen; + MpiFwHeader_t *fwHeader; + U32 checksum; + int i; + + if (readFile(name, &imageBuf, &imageLen) == 1) + { + + printf("\nQuerying file %s...\n", name); + + printWhatString("This", imageBuf, imageLen); + + fwHeader = (pMpiFwHeader_t)imageBuf; + + if ((get32(fwHeader->Signature0) == MPI_FW_HEADER_SIGNATURE_0 && + get32(fwHeader->Signature1) == MPI_FW_HEADER_SIGNATURE_1 && + get32(fwHeader->Signature2) == MPI_FW_HEADER_SIGNATURE_2) || + (get32(fwHeader->Signature0) == MPI2_FW_HEADER_SIGNATURE0 && + get32(fwHeader->Signature1) == MPI2_FW_HEADER_SIGNATURE1 && + get32(fwHeader->Signature2) == MPI2_FW_HEADER_SIGNATURE2)) + { + checksum = 0; + for (i = 0; i < imageLen / 4; i++) + checksum += get32x(((U32 *)imageBuf)[i]); + + if (checksum != 0) + printf("\nThis image's checksum (%08x) is invalid!\n", checksum); + } + + free(imageBuf); + } + + return 1; +} + + +int +printWhatString(char *type, unsigned char *buf, int len) +{ + int i; + int j; + char c = 0; + + for (i = 0; i < len - 3; i++) + if (buf[i] == '@' && buf[i+1] == '(' && buf[i+2] == '#' && buf[i+3] == ')') + break; + + if (i >= len - 3) + { + if (buf[1] == 0xaa && buf[0] == 0x55) + { + PCIR *pcir; + int n; + unsigned short rev, rev1; + + n = (buf[0x19]<<8) + buf[0x18]; + + if (n + (int)sizeof *pcir < len) + { + pcir = (PCIR *)(buf + n); + + if (pcir->signature[0] == 'P' && + pcir->signature[1] == 'C' && + pcir->signature[2] == 'I' && + pcir->signature[3] == 'R') + { + if (pcir->type == 1) /* maybe Sun FCode? */ + { + for (i = 0; i < len; i++) + if (buf[i] == 0x12 && buf[i+2] == 'L' && buf[i+3] == 'S' && buf[i+4] == 'I') + break; + + if (i < len) + { + j = i + buf[i+1] + 2; + + c = buf[j]; + + buf[j] = '\0'; + + printf("%s image's version is %s\n", type, buf + i + 2); + + buf[j] = c; + + return len; + } + } + if (pcir->type == 3 && + buf[5] == 0x0e && buf[4] == 0xf1) /* "efi", how cute */ + { + /* SAS2 stored EFI version in 16 bits of imageRevision */ + /* SAS3 stored EFI version in imageRevision and reserved field, similar to Legacy BIOS */ + /* this is to allow a 32-bit version string */ + + if ((pcir->deviceId == MPI25_MFGPAGE_DEVID_SAS3004) || /* SAS3 Controllers */ + (pcir->deviceId == MPI25_MFGPAGE_DEVID_SAS3008) || + (pcir->deviceId == MPI25_MFGPAGE_DEVID_SAS3108_1) || + (pcir->deviceId == MPI25_MFGPAGE_DEVID_SAS3108_2) || + (pcir->deviceId == MPI25_MFGPAGE_DEVID_SAS3108_5) || + (pcir->deviceId == MPI25_MFGPAGE_DEVID_SAS3108_6)) + { + rev = get16(pcir->imageRevision); + rev1 = get16(get2bytes(pcir->reserved2, 0)); + printf("%s image's version is %d.%02d.%02d.%02d\n", type, + (rev >> 8) & 0xff , rev & 0xff, (rev1 >> 8) & 0xff, rev1 & 0xff); + } + else /* everything else */ + { + rev = get16(pcir->imageRevision); + printf("%s image's version is %d.%02d.%02d.%02d\n", type, + (rev >> 13) & 0x7, (rev >> 8) & 0x1f, (rev >> 4) & 0xf, (rev >> 0) & 0xf); + } + } + } + } + } + return 0; + } + + for (j = i + 4; j < len; j++) + { + if ((c = buf[j]) == '\0' || c == '"' || c == '>' || c == '\n') + break; + } + + buf[j] = '\0'; + + printf("%s image's version is %s\n", type, buf + i + 4); + + buf[j] = c; + + for (i = j; i < len - 3; i++) + if (buf[i] == '@' && buf[i+1] == '(' && buf[i+2] == '#' && buf[i+3] == ')') + { + for (j = i + 4; j < len; j++) + { + if ((c = buf[j]) == '\0' || c == '"' || c == '>' || c == '\n') + break; + if (j < i + 8) + { + if (!isprint((int)c)) + { + i = j; + break; + } + } + else if (c == ' ') + { + if (buf[j-3] == ' ' && buf[j-2] == ' ' && buf[j-1] == ' ') + { + j -= 3; + break; + } + } + } + if (i == j) + continue; + + buf[j] = '\0'; + + if (strcmp((char *)buf + i + 4, "QRY") != 0) + printf(" %s\n", buf + i + 4); + + buf[j] = c; + + i = j; + } + + return len; +} + + +int +getCompatible(int deviceId, int type) +{ + switch (deviceId & ~1) + { + case MPI_MANUFACTPAGE_DEVICEID_FC909: return 1; break; + case MPI_MANUFACTPAGE_DEVICEID_FC919: return 2; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929: return 2; break; + case MPI_MANUFACTPAGE_DEVICEID_FC919X: return 2; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929X: return 2; break; + case MPI_MANUFACTPAGE_DEVICEID_FC939X: return 2; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949X: return 2; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949E: return 2; break; + case MPI_MANUFACTPAGE_DEVID_53C1030: return 3; break; + case MPI_MANUFACTPAGE_DEVID_1030_53C1035: return 3; break; + case MPI_MANUFACTPAGE_DEVID_SAS1064: return 4; break; + case MPI_MANUFACTPAGE_DEVID_SAS1064E: return 4; break; + case MPI_MANUFACTPAGE_DEVID_SAS1066: return 4; break; + case MPI_MANUFACTPAGE_DEVID_SAS1066E: return 4; break; + case MPI_MANUFACTPAGE_DEVID_SAS1068: return 4; break; + case MPI_MANUFACTPAGE_DEVID_SAS1068E: return 4; break; + case MPI_MANUFACTPAGE_DEVID_SAS1078: return 4; break; + case MPI2_MFGPAGE_DEVID_SAS2004: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2008: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2108_1: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2108_2: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2108_3: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2116_1: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2116_2: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2208_1: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2208_2: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2208_3: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2208_4: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2208_5: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2208_6: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2308_1: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2308_2: return 5; break; + case MPI2_MFGPAGE_DEVID_SAS2308_3: return 5; break; + case MPI2_MFGPAGE_DEVID_SSS6200: return 5; break; + case MPI25_MFGPAGE_DEVID_SAS3004: return 6; break; + case MPI25_MFGPAGE_DEVID_SAS3008: return 6; break; + case MPI25_MFGPAGE_DEVID_SAS3108_1: return 6; break; + case MPI25_MFGPAGE_DEVID_SAS3108_2: return 6; break; + case MPI25_MFGPAGE_DEVID_SAS3108_5: return 6; break; + case MPI25_MFGPAGE_DEVID_SAS3108_6: return 6; break; + } + + return deviceId + 100; +} + + +int +checkCompatible(int deviceId1, int deviceId2, int type) +{ + int id1; + int id2; + + id1 = getCompatible(deviceId1, type); + id2 = getCompatible(deviceId2, type); + + if (type == 3) + { + /* everything is compatible (one image serves all) */ + return 1; + } + + return id1 == id2; +} + + +int +doPort(MPT_PORT *port) +{ + int ready; + int option; + + ready = checkReady(port); + + printf("\n"); + option = argsCurr == NULL ? -1 : 0; + while (TRUE) + { + if (!ready || port->notOperational) + { +#if (WIN32 || __linux__ || __sparc__ || DOS || EFI) && REGISTER_ACCESS + printf("50. Dump MPT registers\n"); + printf("51. Dump chip memory regions\n"); + printf("52. Read/modify chip memory locations\n"); + printf("54. Identify FLASH device\n"); +#endif + printf("99. Reset port\n"); + printf("\n"); + + option = 0; + } + + if (option < 0) + { + printf(" 1. Identify firmware, BIOS, and/or FCode\n"); + printf(" 2. Download firmware (update the FLASH)\n"); +EXP printf(" 3. Upload firmware\n"); + printf(" 4. Download/erase BIOS and/or FCode (update the FLASH)\n"); +EXP printf(" 5. Upload BIOS and/or FCode\n"); + + if (port->pidType != MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf(" 6. Download SEEPROM\n"); +EXP printf(" 7. Upload SEEPROM\n"); + } + printf(" 8. Scan for devices\n"); + printf(" 801. Scan for 1 LUN\n"); +EXP printf(" 802. Scan for 2 LUN's\n"); +EXP printf(" 803. Scan for 3 LUN's\n"); +EXP printf(" 804. Scan for 4 LUN's\n"); +EXP printf(" 805. Scan for 5 LUN's\n"); +EXP printf(" 806. Scan for 6 LUN's\n"); +EXP printf(" 807. Scan for 7 LUN's\n"); +EXP printf(" 808. Scan for 8 LUN's\n"); +EXP printf(" 809. Scan for 9 LUN's\n"); + printf(" 810. Scan for 10 LUN's\n"); +EXP printf(" 9. Read/change configuration pages\n"); + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC939X: + case MPI_MANUFACTPAGE_DEVICEID_FC949X: + case MPI_MANUFACTPAGE_DEVICEID_FC949E: + printf("10. Change IOC settings (interrupt coalescing, EEDP)\n"); + break; + default: + printf("10. Change IOC settings (interrupt coalescing)\n"); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + printf("11. Change SCSI Initiator settings\n"); + printf("12. Change SCSI Target settings\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf("13. Change FC Port settings\n"); +EXP printf("14. Change IO Unit settings (multi-pathing)\n"); +EXP printf("15. Change persistent mappings\n"); + printf("16. Display logged-in devices\n"); +EXP printf("17. Show port aliases\n"); +#if DOS || EFI + printf("18. Change FC WWNN/WWPN\n"); +#else +EXP printf("18. Change FC WWNN/WWPN\n"); +#endif + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + printf("13. Change SAS IO Unit settings\n"); +EXP printf("14. Change IO Unit settings (multi-pathing, queuing, caching)\n"); +EXP MPI1 printf("15. Change persistent mappings\n"); + printf("16. Display attached devices\n"); +EXP printf("17. Show expander routing tables\n"); +#if DOS || EFI + printf("18. Change SAS WWID\n"); +#else +EXP printf("18. Change SAS WWID\n"); +#endif + } +EXP printf("19. Test configuration page actions\n"); + printf("20. Diagnostics\n"); + printf("21. RAID actions\n"); + MPI1 printf("22. Reset bus\n"); + printf("23. Reset target\n"); +EXP printf("24. Clear ACA\n"); +EXP MPI2 printf("25. Power Management Control\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf("30. Beacon on\n"); + printf("31. Beacon off\n"); +EXP printf("32. Display SFP pages\n"); + } +EXP printf("33. Erase non-volatile adapter storage\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("34. FC management tools\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("34. Remove device from initiator table\n"); +EXP printf("35. Display HBA firmware Log entries\n"); +EXP printf("36. Clear (erase) HBA firmware Log entries\n"); +EXP printf("37. Force full discovery\n"); + } +#if DOS || EFI + printf("39. Force firmware download boot\n"); +#endif +#if WIN32 || __linux__ || __sparc__ +EXP printf("40. Display current events\n"); +#endif + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("41. Display transfer statistics\n"); + } +#if WIN32 || __linux__ || __sparc__ + printf("42. Display operating system names for devices\n"); +#endif +#if WIN32 || LINUX_DIAG || __sparc__ + if (port->capabilities & (MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER | + MPI_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER)) + { + printf("43. Diagnostic Buffer actions\n"); + } +#endif + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("44. Program manufacturing information\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("44. Program manufacturing information\n"); + printf("45. Concatenate SAS firmware and NVDATA files\n"); + } +EXP printf("46. Upload FLASH section\n"); +EXP printf("47. Display version information\n"); +EXP printf("48. Display chip VPD information\n"); +EXP printf("49. Program chip VPD information\n"); +#if (WIN32 || __linux__ || __sparc__ || DOS || EFI) && REGISTER_ACCESS +EXP printf("50. Dump MPT registers\n"); +EXP printf("51. Dump chip memory regions\n"); +EXP printf("52. Read/modify chip memory locations\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("53. Dump FC trace buffer\n"); + } +EXP printf("54. Identify FLASH device\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("55. Force firmware to fault (with C0FFEE)\n"); +EXP printf("56. Read/write expander memory\n"); +EXP printf("57. Read/write expander ISTWI device\n"); + } +#endif + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("58. Alta diagnostics\n"); + } + + printf("59. Dump PCI config space\n"); + printf("60. Show non-default settings\n"); + printf("61. Restore default settings\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("62. Update default PhyRegs settings\n"); +EXP printf("63. Set personal WWNN/WWPN\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("64. SAS Expander UART Console\n"); +EXP MPI2 printf("65. SAS UART Debug Console\n"); + printf("66. Show SAS discovery errors\n"); + } +EXP printf("67. Dump all port state\n"); +EXP printf("68. Show port state summary\n"); + printf("69. Show board manufacturing information\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC || + port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("70. Dump all device pages\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP MPI2 printf("71. Dump all SAS device page 0's\n"); +#if LSIINTERNAL +EXP MPI20 printf("72. Store SC Information\n"); +#endif + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("80. Set port offline\n"); +EXP printf("81. Set port online\n"); +EXP printf("82. Set port to NL_Port\n"); +EXP printf("83. Set port to N_Port\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("80. Set SAS phy offline\n"); +EXP printf("81. Set SAS phy online\n"); + } +EXP printf("90. Send SCSI CDB\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("93. Send GIEL\n"); +EXP printf("94. Send GID_FT\n"); +EXP printf("95. Send GA_NXT\n"); +EXP printf("96. Send ELS request\n"); +EXP printf("97. Reset FC link, Maintain Logins\n"); + printf("98. Reset FC link\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("95. Send SATA request\n"); +EXP printf("96. Send SMP request\n"); + printf("97. Reset SAS link, HARD RESET\n"); + printf("98. Reset SAS link\n"); + } + printf("99. Reset port\n"); + if (expert) + printf(" e Disable expert mode in menus\n"); + else + printf(" e Enable expert mode in menus\n"); + if (paged) + printf(" p Disable paged mode\n"); + else + printf(" p Enable paged mode\n"); + if (wFlag) + printf(" w Disable logging\n"); + else + printf(" w Enable logging\n"); + printf("\n"); + } + + printf("Main menu, select an option: [1-99 or e/p/w or 0 to quit] "); + option = getNumberAnswer(0, 999, -999); + if (option < 0 || option == 999) + { + printf("\n"); + continue; + } + + if (option == 0) + break; + + doPortOption(port, option); + + printf("\n"); + } + + return 1; +} + + +int +doPortOption(MPT_PORT *port, int option) +{ + int ready; + int t; + + ready = checkReady(port); + + if (option == 0 || option == 111) + return 1; + + printf("\n"); + + if (iocMask & (1 << port->iocNumber)) + { + switch (option) + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 14: + case 33: + case 39: + case 44: + case 48: + case 49: + case 51: + case 52: + case 54: + case 53: + case 55: + case 62: + case 99: + printf("Option %d skipped for %s\n", option, port->portName); + return 1; + } + } + + if (!ready || port->notOperational) + { + switch (option) + { +#if (WIN32 || __linux__ || __sparc__ || DOS || EFI) && REGISTER_ACCESS + case 50: + doDumpRegisters(port); + break; + case 51: + doDumpChipMemoryRegions(port); + break; + case 52: + doReadModifyChipMemoryLocations(port); + break; + case 54: + doFlashInfo(port); + break; +#endif + case 99: + doResetPort(port); + break; + default: + printf("Invalid selection!\n"); + break; + } + + return 1; + } + + updatePortInfo(port); + + switch (option) + { + case 1: + doIdentify(port); + break; + case 2: + doFirmwareDownload(port); + break; + case 3: + doFirmwareUpload(port); + break; + case 4: + doBiosFcodeDownload(port); + break; + case 5: + doBiosFcodeUpload(port, NULL, NULL, 0); + break; + case 6: + if (port->pidType != MPI_FW_HEADER_PID_TYPE_SAS) + { + doSeepromDownload(port); + break; + } + printf("Invalid selection!\n"); + break; + case 7: + if (port->pidType != MPI_FW_HEADER_PID_TYPE_SAS) + { + doSeepromUpload(port); + break; + } + printf("Invalid selection!\n"); + break; + case 8: + doScanForDevices(port, 1); + break; + case 801: + doScanForLuns(port, 1 , option); + break; + case 802: + doScanForLuns(port, 1 , option); + break; + case 803: + doScanForLuns(port, 1 , option); + break; + case 804: + doScanForLuns(port, 1 , option); + break; + case 805: + doScanForLuns(port, 1 , option); + break; + case 806: + doScanForLuns(port, 1 , option); + break; + case 807: + doScanForLuns(port, 1 , option); + break; + case 808: + doScanForLuns(port, 1 , option); + break; + case 809: + doScanForLuns(port, 1 , option); + break; + case 810: + doScanForLuns(port, 1 , option); + break; + case 9: + doConfigPage(port); + break; + case 10: + doIocSettings(port); + break; + case 11: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + doScsiInitiatorSettings(port); + break; + } + printf("Invalid selection!\n"); + break; + case 12: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + doScsiTargetSettings(port); + break; + } + printf("Invalid selection!\n"); + break; + case 13: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcPortSettings(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSasIoUnitSettings(port); + break; + } + printf("Invalid selection!\n"); + break; + case 14: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC || + port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doIoUnitSettings(port); + break; + } + printf("Invalid selection!\n"); + break; + case 15: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC || + port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + option = argsCurr == NULL ? -1 : 0; + while (TRUE) + { + if (option < 0) + { + printf(" 1. Show persistent mappings\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf(" 2. Automatically add persistent mappings for ALL targets\n"); +EXP printf(" 3. Automatically add persistent mappings for SOME targets\n"); + printf(" 4. Delete persistent mappings for ALL targets\n"); +EXP printf(" 5. Delete persistent mappings for SOME targets\n"); +EXP printf(" 6. Manually add persistent mappings for targets\n"); +EXP printf(" 7. Automatically add persistent mappings for ALL LoopIDs\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf(" 4. Delete persistent mappings for ALL targets\n"); +EXP printf(" 5. Delete persistent mappings for SOME targets\n"); + printf(" 6. Change Bus/Target or EnclosureId of an existing mapping\n"); + printf(" 7. Save persistent mappings to a file\n"); + printf(" 8. Load persistent mappings from a file\n"); + printf("10. Clear all persistent mappings\n"); + printf("11. Clear all non-present persistent mappings\n"); + printf("12. Change (enable/disable) persistence\n"); + } + printf("99. Reset port\n"); + if (expert) + printf(" e Disable expert mode in menus\n"); + else + printf(" e Enable expert mode in menus\n"); + if (paged) + printf(" p Disable paged mode\n"); + else + printf(" p Enable paged mode\n"); + if (wFlag) + printf(" w Disable logging\n"); + else + printf(" w Enable logging\n"); + printf("\n"); + } + + printf("Persistence menu, select an option: [1-99 or e/p/w or 0 to quit] "); + option = getNumberAnswer(0, 99, -999); + if (option < 0 || option == 999) + { + printf("\n"); + continue; + } + + if (option == 0) + break; + + printf("\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (option <= 7) + { + doFcPersistentMappings(port, option); + } + else if (option == 99) + { + doResetPort(port); + } + else + { + printf("Invalid selection!\n"); + } + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS && mpi1) + { + if (option == 1 || (option >= 4 && option <= 8) || (option >= 10 && option <= 12)) + { + doSasPersistentMappings(port, option); + } + else if (option == 99) + { + doResetPort(port); + } + else + { + printf("Invalid selection!\n"); + } + } + printf("\n"); + } + option = -1; + break; + } + printf("Invalid selection!\n"); + break; + case 16: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doDisplayLoggedInDevices(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doDisplayAttachedDevices(port); + break; + } + printf("Invalid selection!\n"); + break; + case 17: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doShowPortAliases(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doShowExpanderRoutingTables(port); + break; + } + printf("Invalid selection!\n"); + break; + case 18: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcChangeWwn(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSasChangeWwid(port, 0); + break; + } + printf("Invalid selection!\n"); + break; + case 19: + doTestConfigPageActions(port); + break; + case 20: + option = argsCurr == NULL ? -1 : 0; + while (TRUE) + { + if (option < 0) + { + printf(" 1. Inquiry Test\n"); + printf(" 2. WriteBuffer/ReadBuffer/Compare Test\n"); + printf(" 3. Read Test\n"); + printf(" 4. Write/Read/Compare Test\n"); +EXP printf(" 5. Write Test\n"); +EXP printf(" 6. Read/Compare Test\n"); +#if 0 +EXP printf(" 7. Test Unit Ready Test\n"); +#else +EXP printf(" 7. Log Sense Test\n"); +#endif + printf(" 8. Read Capacity / Read Block Limits Test\n"); +EXP printf(" 9. Mode Page Test\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf("10. Echo ELS Test\n"); +EXP printf("11. Read Link Error Status ELS Test\n"); + printf("12. Display port counters\n"); + printf("13. Clear port counters\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("10. SATA Identify Device Test\n"); +EXP printf("11. SATA Clear Affiliation Test\n"); + printf("12. Display phy counters\n"); + printf("13. Clear phy counters\n"); + printf("14. SATA SMART Read Test\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI || + port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + printf("15. SEP (SCSI Enclosure Processor) Test\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("16. Issue product-specific SAS IO Unit Control\n"); + } +EXP printf("17. Diag data upload\n"); + printf("18. Report LUNs Test\n"); + printf("19. Drive firmware download\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { +EXP printf("20. Trigger FC Analyzer With Echo ELS\n"); + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + printf("20. Expander firmware download\n"); + } + printf("21. Read Logical Blocks\n"); +EXP printf("22. Write Logical Blocks\n"); +EXP printf("23. Verify Logical Blocks\n"); +EXP printf("24. Read Buffer (for firmware upload)\n"); +EXP printf("25. Display Expander Log entries\n"); +EXP printf("26. Clear (erase) Expander Log entries\n"); +EXP printf("27. Change SAS2/SAS3 Expander Manufacturing Data Fields\n"); +EXP printf("29. Diagnostic Page Test\n"); +EXP printf("30. Inject media error\n"); +EXP printf("31. Repair media error\n"); +EXP printf("32. Set software write protect\n"); +EXP printf("33. Clear software write protect\n"); +EXP printf("34. Enable read cache\n"); +EXP printf("35. Disable read cache\n"); +EXP printf("36. Enable write cache\n"); +EXP printf("37. Disable write cache\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP printf("98. Reset expander\n"); + } + printf("99. Reset port\n"); + if (expert) + printf(" e Disable expert mode in menus\n"); + else + printf(" e Enable expert mode in menus\n"); + if (paged) + printf(" p Disable paged mode\n"); + else + printf(" p Enable paged mode\n"); + if (wFlag) + printf(" w Disable logging\n"); + else + printf(" w Enable logging\n"); + printf("\n"); + } + + printf("Diagnostics menu, select an option: [1-99 or e/p/w or 0 to quit] "); + option = getNumberAnswer(0, 99, -999); + if (option < 0 || option == 999) + { + printf("\n"); + continue; + } + + if (option == 0) + break; + + printf("\n"); + if (option == 99) + doResetPort(port); + else + doDiagnostics(port, option); + printf("\n"); + } + option = -1; + break; + case 21: + option = argsCurr == NULL ? -1 : 0; + while (TRUE) + { + if (option < 0) + { + printf(" 1. Show volumes\n"); + printf(" 2. Show physical disks\n"); + printf(" 3. Get volume state\n"); + printf(" 4. Wait for volume resync to complete\n"); +EXP printf("10. Disable all volumes\n"); +EXP printf("11. Enable all volumes\n"); +EXP MPI1 printf("12. Inactivate volume\n"); +EXP printf("13. Activate volume\n"); +EXP printf("20. Offline physical disk\n"); +EXP printf("21. Online physical disk\n"); +EXP printf("22. Fail physical disk\n"); + MPI1 printf("23. Replace physical disk\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { +EXP MPI1 printf("24. Quiesce physical disk I/Os\n"); +EXP MPI1 printf("25. Unquiesce physical disk I/Os\n"); + } + printf("26. Disable drive firmware update mode\n"); + printf("27. Enable drive firmware update mode\n"); + printf("30. Create volume\n"); + printf("31. Delete volume\n"); + printf("32. Change volume settings\n"); + printf("33. Change volume name\n"); + MPI2 printf("34. Volume consistency check\n"); + MPI2 printf("35. Stop volume consistency check\n"); + MPI2 printf("36. Online Capacity Expansion\n"); +// MPI1 printf("40. Create physical disk\n"); +EXP MPI1 printf("41. Delete physical disk\n"); +EXP MPI1 printf("42. Change physical disk settings\n"); + printf("50. Create hot spare\n"); + printf("51. Delete hot spare\n"); +EXP MPI2 printf("60. Change RAID rate\n"); + printf("99. Reset port\n"); + if (expert) + printf(" e Disable expert mode in menus\n"); + else + printf(" e Enable expert mode in menus\n"); + if (paged) + printf(" p Disable paged mode\n"); + else + printf(" p Enable paged mode\n"); + if (wFlag) + printf(" w Disable logging\n"); + else + printf(" w Enable logging\n"); + printf("\n"); + } + + printf("RAID actions menu, select an option: [1-99 or e/p/w or 0 to quit] "); + option = getNumberAnswer(0, 99, -999); + if (option < 0 || option == 999) + { + printf("\n"); + continue; + } + + if (option == 0) + break; + + printf("\n"); + if (option == 99) + doResetPort(port); + else + doRaidActions(port, option); + printf("\n"); + } + option = -1; + break; + case 22: + if (mpi1) + { + doResetBus(port); + break; + } + printf("Invalid selection!\n"); + break; + case 23: + doResetTarget(port); + break; + case 24: + doClearAca(port); + break; + case 25: + // Power Management Control + option = argsCurr == NULL ? -1 : 0; + while (TRUE) + { + if (option < 0) + { + printf(" 1. Send Power Management Control MPI message\n"); + printf(" 2. Display IOUnit7 Config Page\n"); + printf(" 3. Get/Set SASIoUnit8 Config Page\n"); + printf("\n"); + } + + printf("Power Management actions menu, select an option: [1-99 or e/p/w or 0 to quit] "); + option = getNumberAnswer(0, 99, -999); + if (option < 0 || option == 999) + { + printf("\n"); + continue; + } + + if (option == 0) + break; + + printf("\n"); + switch (option) + { + case 1: + doSendPowerManagementControlMPI(port); + break; + case 2: + doIoUnit7Settings(port); + break; + case 3: + doSasIoUnit8Settings(port); + break; + } + printf("\n"); + } + option = -1; + break; + case 30: + doBeacon(port, 1); + break; + case 31: + doBeacon(port, 0); + break; + case 32: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doDisplaySfpPages(port); + break; + } + printf("Invalid selection!\n"); + break; + case 33: + doClean(port); + break; + case 34: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcManagementTools(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doRemoveSasDevice(port); + break; + } + printf("Invalid selection!\n"); + break; + case 35: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doDisplayLogEntries(port); + break; + } + printf("Invalid selection!\n"); + break; + case 36: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doClearLogEntries(port); + break; + } + printf("Invalid selection!\n"); + break; + case 37: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSasForceFullDiscovery(port); + break; + } + printf("Invalid selection!\n"); + break; +#if DOS || EFI + case 39: + doFirmwareDownloadBoot(port); + break; +#endif +#if WIN32 || __linux__ || __sparc__ + case 40: + doDisplayCurrentEvents(port); + break; +#endif + case 41: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doDisplayTransferStatistics(port); + break; + } + printf("Invalid selection!\n"); + break; +#if WIN32 || __linux__ || __sparc__ + case 42: + doDisplayOsDeviceNames(port); + break; +#endif +#if WIN32 || LINUX_DIAG || __sparc__ + case 43: + if (port->capabilities & (MPI_IOCFACTS_CAPABILITY_DIAG_TRACE_BUFFER | + MPI_IOCFACTS_CAPABILITY_SNAPSHOT_BUFFER)) + { + doDiagBuffer(port); + break; + } + printf("Invalid selection!\n"); + break; +#endif + case 44: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + t = doWriteFcManufacturingInfo(port); + if (wFlag) + fprintf(logFile, "%s: Program Manufacturing Information: %s\n", + logPrefix(port), t ? "PASS" : "FAIL"); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + t = doWriteSasManufacturingInfo(port); + if (wFlag) + fprintf(logFile, "%s: Program Manufacturing Information: %s\n", + logPrefix(port), t ? "PASS" : "FAIL"); + break; + } + printf("Invalid selection!\n"); + break; + case 45: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + concatenateSasFirmwareNvdata(); + break; + } + printf("Invalid selection!\n"); + break; + case 46: + doFlashUpload(port); + break; + case 47: + doDisplayVersionInfo(port); + break; + case 48: + doDisplayVpdInfo(port); + break; + case 49: + t = doProgramVpdInfo(port); + if (wFlag) + fprintf(logFile, "%s: Program VPD Information: %s\n", + logPrefix(port), t ? "PASS" : "FAIL"); + break; +#if (WIN32 || __linux__ || __sparc__ || DOS || EFI) && REGISTER_ACCESS + case 50: + doDumpRegisters(port); + break; + case 51: + doDumpChipMemoryRegions(port); + break; + case 52: + doReadModifyChipMemoryLocations(port); + break; + case 53: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doDumpFcTraceBuffer(port); + break; + } + printf("Invalid selection!\n"); + break; + case 54: + doFlashInfo(port); + break; + case 55: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doForceFirmwareFault(port); + break; + } + printf("Invalid selection!\n"); + break; +#endif + case 56: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doReadWriteExpanderMemory(port); + break; + } + printf("Invalid selection!\n"); + break; + case 57: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doReadWriteExpanderIstwiDevice(port); + break; + } + printf("Invalid selection!\n"); + break; + case 58: + option = argsCurr == NULL ? -1 : 0; + while (TRUE) + { + if (option < 0) + { + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + printf(" 1. Program manufacturing information\n"); + printf(" 2. Display manufacturing information\n"); + printf(" 3. Reset Alta\n"); + } + if (expert) + printf(" e Disable expert mode in menus\n"); + else + printf(" e Enable expert mode in menus\n"); + if (paged) + printf(" p Disable paged mode\n"); + else + printf(" p Enable paged mode\n"); + if (wFlag) + printf(" w Disable logging\n"); + else + printf(" w Enable logging\n"); + printf("\n"); + } + + printf("Alta diagnostics menu, select an option: [1-99 or e/p/w or 0 to quit] "); + option = getNumberAnswer(0, 99, -999); + if (option < 0 || option == 999) + { + printf("\n"); + continue; + } + + if (option == 0) + break; + + printf("\n"); + doAltaDiagnostics(port, option); + printf("\n"); + } + option = -1; + break; + case 59: + doDumpPciConfigSpace(port); + break; + case 60: + doShowNonDefaultSettings(port); + break; + case 61: + doRestoreDefaultSettings(port); + break; + case 62: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doDefaultPhyRegsSettings(port); + break; + } + printf("Invalid selection!\n"); + break; + case 63: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcChangePersonalWwn(port); + break; + } + printf("Invalid selection!\n"); + break; + case 64: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doExpanderUart(port); + break; + } + printf("Invalid selection!\n"); + break; + case 65: + if (mpi2 && port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doUartDebugConsole(port); + break; + } + printf("Invalid selection!\n"); + break; + case 66: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + showSasDiscoveryErrors(port); + break; + } + printf("Invalid selection!\n"); + break; + case 67: + doDumpPortState(port, 1); + break; + case 68: + doPortStateSummary(port); + break; + case 69: + showBoardInfo(port, 1); + break; + case 70: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + dumpFcDevicePages(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + dumpSasDevicePages(port); + break; + } + printf("Invalid selection!\n"); + break; + case 71: + if (mpi2 && port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + dumpSasDevicePage0sLong(port); + break; + } + printf("Invalid selection!\n"); + break; + case 72: +#if LSIINTERNAL + if (mpi2 && port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSCProgram(port); + break; + } +#endif + printf("Invalid selection!\n"); + break; + case 80: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcPortOffline(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSasPhyOnOffline(port, 0); + break; + } + printf("Invalid selection!\n"); + break; + case 81: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcPortOnline(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSasPhyOnOffline(port, 1); + break; + } + printf("Invalid selection!\n"); + break; + case 82: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcTopologyNLPort(port); + break; + } + printf("Invalid selection!\n"); + break; + case 83: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcTopologyNPort(port); + break; + } + printf("Invalid selection!\n"); + break; + case 86: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcSpecialMode(port, 1, 0); + break; + } + printf("Invalid selection!\n"); + break; + case 87: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcSpecialMode(port, 0, 0); + break; + } + printf("Invalid selection!\n"); + break; + case 88: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcSpecialMode(port, 1, 1); + break; + } + printf("Invalid selection!\n"); + break; + case 89: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doFcSpecialMode(port, 0, 1); + break; + } + printf("Invalid selection!\n"); + break; + case 90: + doScsiCdb(port); + break; + case 93: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doGIEL(port); + break; + } + printf("Invalid selection!\n"); + break; + case 94: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doGID_FT(port); + break; + } + printf("Invalid selection!\n"); + break; + case 95: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doGA_NXT(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSataPassthroughSend(port); + break; + } + printf("Invalid selection!\n"); + break; + case 96: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doExLinkServiceSend(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSmpPassthroughSend(port); + break; + } + printf("Invalid selection!\n"); + break; + case 97: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doResetFcLink(port, 1); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doResetSasLink(port, 1); + break; + } + printf("Invalid selection!\n"); + break; + case 98: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doResetFcLink(port, 0); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doResetSasLink(port, 0); + break; + } + printf("Invalid selection!\n"); + break; + case 99: + doResetPort(port); + break; + case 100: + doDumpPortState(port, 1); + break; + case 101: + doPortStateSummary(port); + break; + case 102: + showBoardInfo(port, 1); + break; + default: + printf("Invalid selection!\n"); + break; + } + + return 1; +} + + +int +doIdentify(MPT_PORT *port) +{ + unsigned char *imageBuf; + int imageLen; + int actualImageLen; + int offset; + unsigned char *buf; + int len; + int i; + int n; + PCIR *pcir; + char *type; + + i = port->fwVersion; + if (port->mptVersion < MPI_VERSION_01_02) + { + printf("Current active firmware version is %08x (%d.%02d.%02d)\n", + i, (i >> 12) & 0xf, (i >> 8) & 0xf, i & 0xff); + } + else + { + if (i & 0xff) + { + printf("Current active firmware version is %08x (%d.%02d.%02d.%02d)\n", + i, (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff); + } + else + { + printf("Current active firmware version is %08x (%d.%02d.%02d)\n", + i, (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff); + } + } + + imageLen = 0x10000; + imageBuf = (unsigned char *)malloc(imageLen); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + i = MPI_FW_UPLOAD_ITYPE_FW_BACKUP; + else + i = MPI_FW_UPLOAD_ITYPE_FW_FLASH; + + if (doFwUpload(port, i, imageBuf, imageLen, 0, &actualImageLen) == 1) + { + printWhatString("Firmware", imageBuf, imageLen); + } + + offset = 0; + while (offset < 0x80000) + { + if (doFwUpload(port, MPI_FW_UPLOAD_ITYPE_BIOS_FLASH, imageBuf, imageLen, offset, &actualImageLen) != 1) + break; + + if (port->pidType != MPI_FW_HEADER_PID_TYPE_SCSI) + { + if (offset >= actualImageLen) + break; + } + + for (i = 0; i < imageLen; i += 512) + { + buf = imageBuf + i; + + n = (buf[0x01]<<8) + buf[0x00]; + if (n != 0xaa55) + continue; + + n = (buf[0x19]<<8) + buf[0x18]; + + if (i + n + (int)sizeof *pcir > imageLen) + { + // not all of the image is in the buffer, so quit now and read more of the image + break; + } + + pcir = (PCIR *)(buf + n); + + if (pcir->signature[0] != 'P' || + pcir->signature[1] != 'C' || + pcir->signature[2] != 'I' || + pcir->signature[3] != 'R') + { + printf("Image's PCIR signature is invalid!\n"); + type = "Unknown"; + len = 512; + } + else + { + len = get16(pcir->imageLength) * 512; + if (i + len > imageLen) + { + // not all of the image is in the buffer, so quit now and read more of the image + if (len > imageLen) + { + free(imageBuf); + imageLen = len; + imageBuf = (unsigned char *)malloc(len); + } + break; + } + + switch (pcir->type) + { + case 0: type = "x86 BIOS"; break; + case 1: type = "FCode"; break; + case 3: type = "EFI BIOS"; break; + default: type = "Unknown"; break; + } + + if (pcir->type == 255) + { + if (buf[4] == 'L' && buf[5] == 'S' && buf[6] == 'I' && buf[7] == 'L' && buf[0x34] == 0x02) + type = NULL; + } + + if (pcir->indicator & 0x80) + { + // last image, so make sure we quit after this + i += 0x80000; + } + } + + if (type) + printWhatString(type, buf, len); + i += len - 512; + } + + offset += i; + } + + free(imageBuf); + + return 1; +} + + +int +doFirmwareDownload(MPT_PORT *port) +{ + ManufacturingPage0_t ManufacturingPage0; + char name[256]; + unsigned char *imageBuf = NULL; + int imageLen; + int len; + int n; + int warn = 0; + MpiFwHeader_t *fwHeader; + MpiExtImageHeader_t *fwExtImageHeader; + Mpi2ExtImageHeader_t *fwExtImageHeader2; + Mpi2SupportedDevicesData_t *fwSupportedDevices; + U32 fwNextImage; + int i; + U32 t; + U32 checksum; + char *productId; + int cur2MB; + int new2MB; + U32 buf0[16]; +#if REGISTER_ACCESS + U32 buf1[16]; + U32 buf2[16]; + U32 buf4[16]; + U32 zeros[16]; + int romSize; +#endif +#if DOS || EFI + HANDLE adap = port->fileHandle; + int mustExit = 0; +#endif + unsigned char *imageBufUpload; + int imageLenUpload; + int actualImageLenUpload; + int offset; + int type; + int skip_verify = 0; + + n = getFileName(name, sizeof name, stdin, "firmware", 0); + if (n > 0) + { + if (readFile(name, &imageBuf, &imageLen) != 1) + return 0; + } + else + { + printf("Image won't be downloaded\n"); + return 1; + } + + printWhatString("Firmware", imageBuf, imageLen); + + checksum = 0; + for (i = 0; i < imageLen / 4; i++) + checksum += get32x(((U32 *)imageBuf)[i]); + + if (checksum != 0) + { + if (!warn) + printf("\n"); + printf("Image's checksum is invalid!\n"); + printf(" The image appears to be corrupted, proceed with caution\n"); + warn = 1; + } + + if (port->mptVersion > MPI_VERSION_01_00) + { + fwHeader = (pMpiFwHeader_t)imageBuf; + + if (get16(fwHeader->VendorId) != MPI_MANUFACTPAGE_VENDORID_LSILOGIC) + { + if (!warn) + printf("\n"); + printf("Image's Vendor ID appears to be wrong!\n"); + printf(" Current hardware Vendor ID is %04x\n", MPI_MANUFACTPAGE_VENDORID_LSILOGIC); + printf(" Image's hardware Vendor ID is %04x\n", get16(fwHeader->VendorId)); + warn = 1; + } + + if (get16(fwHeader->ProductId) != port->productId) + { + if (!warn) + printf("\n"); + printf("Image's Product ID appears to be wrong!\n"); + printf(" Current firmware Product ID is %04x\n", port->productId); + printf(" Image's firmware Product ID is %04x\n", get16(fwHeader->ProductId)); + warn = 1; + } + + len = get32(fwHeader->ImageSize); + fwNextImage = get32(fwHeader->NextImageHeaderOffset); + while (fwNextImage != 0) + { + if (fwNextImage > imageLen - sizeof *fwExtImageHeader) + { + if (!warn) + printf("\n"); + printf("Image's NextImageHeaderOffset field is invalid!\n"); + printf(" The image appears to be corrupted, proceed with caution\n"); + warn = 1; + break; + } + + fwExtImageHeader = (pMpiExtImageHeader_t)(imageBuf + fwNextImage); + fwExtImageHeader2 = (pMpi2ExtImageHeader_t)fwExtImageHeader; + + if (fwExtImageHeader->ImageType == MPI_EXT_IMAGE_TYPE_NVDATA) + { + if (get32(fwExtImageHeader->ImageSize) <= sizeof *fwExtImageHeader) + { + if (!warn) + printf("\n"); + printf("Image's attached NVDATA is invalid!\n"); + printf(" Using this image is likely to cause pain and suffering\n"); + warn = 1; + } + else if (mpi1) + { + productId = getSasProductId(mpi2 ? (char *)(fwExtImageHeader2 + 1) + : (char *)(fwExtImageHeader + 1)); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, + &ManufacturingPage0, sizeof ManufacturingPage0) == 1) + { + if (strcmp(productId, (char *)ManufacturingPage0.BoardName) != 0) + { + if (!warn) + printf("\n"); + printf("Image's attached NVDATA appears to be for the wrong board!\n"); + printf(" Current Board Name is %-16s\n", ManufacturingPage0.BoardName); + printf(" Image's Board Name is %-16s\n", productId); + warn = 1; + } + } + } + } + + if (fwExtImageHeader->ImageType == MPI2_EXT_IMAGE_TYPE_SUPPORTED_DEVICES) + { + fwSupportedDevices = (pMpi2SupportedDevicesData_t)(fwExtImageHeader2 + 1); + + for (i = 0; i < fwSupportedDevices->NumberOfDevices; i++) + { + t = port->deviceIdRaw & ~get16(fwSupportedDevices->SupportedDevice[i].DeviceIDMask); + if (t == get16(fwSupportedDevices->SupportedDevice[i].DeviceID) && + port->revisionId >= fwSupportedDevices->SupportedDevice[i].LowPCIRev && + port->revisionId <= fwSupportedDevices->SupportedDevice[i].HighPCIRev) + { + break; + } + } + + if (i == fwSupportedDevices->NumberOfDevices) + { + if (!warn) + printf("\n"); + printf("Image's Supported Device List appears to be wrong!\n"); + printf(" Current hardware Device ID is %04x, Revision ID is %02x\n", + port->deviceIdRaw, port->revisionId); + for (i = 0; i < fwSupportedDevices->NumberOfDevices; i++) + { + if (fwSupportedDevices->SupportedDevice[i].LowPCIRev == + fwSupportedDevices->SupportedDevice[i].HighPCIRev) + { + printf(" Image's hardware Device ID is %04x, Revision ID is %02x\n", + get16(fwSupportedDevices->SupportedDevice[i].DeviceID), + fwSupportedDevices->SupportedDevice[i].LowPCIRev); + } + else + { + printf(" Image's hardware Device ID is %04x, Revision ID is %02x to %02x\n", + get16(fwSupportedDevices->SupportedDevice[i].DeviceID), + fwSupportedDevices->SupportedDevice[i].LowPCIRev, + fwSupportedDevices->SupportedDevice[i].HighPCIRev); + } + } + warn = 1; + } + } + + len += get32(fwExtImageHeader->ImageSize); + fwNextImage = get32(fwExtImageHeader->NextImageHeaderOffset); + } + + if (len != imageLen) + { + if (!warn) + printf("\n"); + printf("Image's length is invalid!\n"); + printf(" The image appears to be corrupted, proceed with caution\n"); + warn = 1; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + t = get16(fwHeader->ProductId); + + if ((port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919X || + port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929X) && + port->revisionId >= 0x80 && + t == (MPI_FW_HEADER_PID_TYPE_FC|MPI_FW_HEADER_PID_FAMILY_919X_FC)) + { + t = get32(fwHeader->FWVersion.Word); + + if (t < 0x0102090d) + { + if (!warn) + printf("\n"); + printf("Image is for FC929X, port is FC929XL, image is not compatible!\n"); + warn = 1; + } + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS && mpi1) + { + t = get32(fwHeader->SeqCodeVersion); + + if (t != port->seqCodeVersion) + { + if (!warn) + printf("\n"); + printf("Image is for %X, port is %X, image is not compatible!\n", t, port->seqCodeVersion); + warn = 1; + } + +#if DOS || EFI + if (adap->bootloader) + cur2MB = get32x(((U32 *)adap->fw_image)[5]) & 1; + else +#endif + if (doFwUpload(port, MPI_FW_UPLOAD_ITYPE_FW_FLASH, (unsigned char *)buf0, sizeof buf0, 0, &i) == 1) + cur2MB = get32x(buf0[5]) & 1; + else + cur2MB = 0; + + new2MB = get32x(((U32 *)imageBuf)[5]) & 1; + + if (cur2MB != new2MB) + { + if (new2MB) + { +#if REGISTER_ACCESS + doReadChipMemoryRegions(port, 0x3e000000, buf0, sizeof buf0 / 4); + doReadChipMemoryRegions(port, 0x3e100000, buf1, sizeof buf1 / 4); + doReadChipMemoryRegions(port, 0x3e200000, buf2, sizeof buf2 / 4); + doReadChipMemoryRegions(port, 0x3e400000, buf4, sizeof buf4 / 4); + memset(zeros, 0, sizeof zeros); + + if (memcmp(buf0, zeros, sizeof buf0) == 0) + romSize = 0; + else if (memcmp(buf0, buf1, sizeof buf0) == 0) + romSize = 1; + else if (memcmp(buf0, buf2, sizeof buf0) == 0) + romSize = 2; + else if (memcmp(buf0, buf4, sizeof buf0) == 0) + romSize = 4; + else + romSize = 0; + + if (romSize == 1) + { + printf("\nImage requires 2 MB FLASH ROM, current FLASH ROM is 1 MB\n"); + printf("\nFirmware download cannot be performed!\n"); + free(imageBuf); + return 0; + } +#endif + } + } + + t = port->fwVersion; + if (t == 0x01126300) // 1.18.99, "bridge" from phase 8 to phase 9 + { + if (new2MB) + { + printf("\nVersion 1.18.99 is being used to upgrade to Phase 9 firmware\n"); + cur2MB = 1; + skip_verify = 1; + } + else + { + printf("\nVersion 1.18.99 can only be used to upgrade to Phase 9 firmware\n"); + printf("\nFirmware download cannot be performed!\n"); + free(imageBuf); + return 0; + } + } + + t = get32(fwHeader->FWVersion.Word); + if (t == 0x01126300) // 1.18.99, "bridge" from phase 8 to phase 9 + { + if (cur2MB) + { + printf("\nVersion 1.18.99 cannot be used to downgrade to Phase 8 firmware\n"); + printf("\nFirmware download cannot be performed!\n"); + free(imageBuf); + return 0; + } + else + { + printf("\nVersion 1.18.99 can only be used to upgrade to Phase 9 firmware\n"); + printf("\nMake sure to do the second firmware download as soon as possible\n"); + skip_verify = 1; + } + } + + if (cur2MB != new2MB) + { +#if DOS || EFI + if (adap->fw_image != NULL) + free(adap->fw_image); + + adap->fw_image = malloc(imageLen); + adap->fw_image_size = imageLen; + + memcpy(adap->fw_image, imageBuf, imageLen); + + adap->ioc_online = FALSE; + + if (adap->partner_adap != NULL) + { + adap->partner_adap->ioc_online = FALSE; + + adap->partner_adap->fw_image = adap->fw_image; + adap->partner_adap->fw_image_size = 0; + } + + if (mpt_fwdownloadboot(adap) != 1) + { + printf("\nThe chip was not made operational with this firmware!\n"); + printf("\nFirmware download cannot be performed!\n"); + mpt_stop(adap, TRUE); + return 0; + } + + mustExit = 1; +#else + if (new2MB) + { + printf("\nSwitching from a 1 MB to a 2 MB FLASH ROM image requires special actions\n"); + printf("\nIt can either be done using the 1.18.99 bridge firmware image, or...\n"); + printf("\nUse the DOS or EFI version of lsiutil to perform the firmware download\n"); + free(imageBuf); + return 0; + } + else + { + printf("\nSwitching from a 2 MB to a 1 MB FLASH ROM image cannot be done online!\n"); + printf("\nUse the DOS or EFI version of lsiutil to perform the firmware download\n"); + free(imageBuf); + return 0; + } +#endif + } + } + } + + if (warn && noFlag == TRUE) + { + free(imageBuf); + return 0; + } + + if (warn || yesFlag == FALSE) + { + if (warn) + printf("\nAre you sure you want to continue? [Yes or No, default is No] "); + else + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + free(imageBuf); + return 0; + } + } + +retry: + t = doFwDownload(port, MPI_FW_DOWNLOAD_ITYPE_FW, imageBuf, imageLen, 0); + if (t != 1) + goto no_verify; + +#if DOS || EFI + if (adap->bootloader) + goto no_verify; +#endif + + if (skip_verify) + goto no_verify; + + printf("\nVerifying download...\n"); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + type = MPI_FW_UPLOAD_ITYPE_FW_BACKUP; + else + type = MPI_FW_UPLOAD_ITYPE_FW_FLASH; + + imageLenUpload = 0x10000; + imageBufUpload = (unsigned char *)malloc(imageLenUpload); + + offset = 0; + while (TRUE) + { + if (doFwUpload(port, type, imageBufUpload, imageLenUpload, offset, &actualImageLenUpload) != 1) + break; + + if (offset + imageLenUpload > actualImageLenUpload) + imageLenUpload = actualImageLenUpload - offset; + + if (memcmp(imageBuf + offset, imageBufUpload, imageLenUpload) != 0) + { + t = 0; + break; + } + + offset += imageLenUpload; + if (offset >= actualImageLenUpload) + break; + } + if (t && imageLen == actualImageLenUpload) + printf("Verification succeeded\n"); + else + { + printf("Verification failed!\n"); + + if (noFlag != TRUE) + { + printf("\nAt a minimum, to recover, the download operation should be retried\n"); + printf("\nWould you like to retry the download now? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) == 1) + goto retry; + } + } + free(imageBufUpload); +no_verify: + + free(imageBuf); +#if DOS || EFI + if (mustExit) + { + if (adap->fw_image != NULL) + free(adap->fw_image); + + adap->fw_image = NULL; + + doResetPort(port); + + closePorts(NUM_PORTS); + + exit(0); + } +#endif + + return t; +} + + +int +doFirmwareUpload(MPT_PORT *port) +{ + char name[256]; + int file; + unsigned char *imageBuf = NULL; + int imageLen; + int actualImageLen; + int offset; + int n; + int t; + + n = getFileName(name, sizeof name, stdin, "firmware", 0); + if (n > 0) + { + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + printf("Image won't be uploaded\n"); + return 1; + } + + imageLen = 0x10000; + imageBuf = (unsigned char *)malloc(imageLen); + + offset = 0; + while (TRUE) + { + if (doFwUpload(port, MPI_FW_UPLOAD_ITYPE_FW_FLASH, imageBuf, imageLen, offset, &actualImageLen) != 1) + break; + + if (offset + imageLen > actualImageLen) + imageLen = actualImageLen - offset; + + t = write(file, imageBuf, imageLen); + if (t != imageLen) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + break; + } + + offset += imageLen; + if (offset >= actualImageLen) + break; + } + + printf("\nWrote %d bytes to file %s\n", offset, name); + + close(file); + + free(imageBuf); + + return 1; +} + + +int +doBiosFcodeDownload(MPT_PORT *port) +{ + char name[256]; + unsigned char *imageBuf = NULL; + unsigned char *image1Buf = NULL; + unsigned char *image2Buf = NULL; + unsigned char *image3Buf = NULL; + unsigned char *image4Buf = NULL; + unsigned char *image5Buf = NULL; + int imageLen; + int image1Len; + int image2Len; + int image3Len; + int image4Len = 0; + int image5Len = 0; + int imageOff; + int n; + int warn = 0; + int last; + int valid = 0; + + printf("To erase an image:\n"); + printf(" 1. hit RETURN when asked for a image file name\n"); + printf(" 2. answer No if asked to preserve an existing image\n\n"); + + n = getFileName(name, sizeof name, stdin, "x86 BIOS", 0); + if (n > 0) + { + if (readFile(name, &image1Buf, &image1Len) != 1) + return 0; + + printWhatString("x86 BIOS", image1Buf, image1Len); + + warn |= verifyBiosFcodeImage(port, image1Buf, image1Len, 0); + } + else + { + if (doBiosFcodeUpload(port, &image1Buf, &image1Len, 0) == 1 && image1Buf != NULL) + { + valid = 1; + + printWhatString("Current x86 BIOS", image1Buf, image1Len); + + if (yesFlag == FALSE) + { + printf("\nDo you want to preserve the current x86 BIOS? [Yes or No, default is Yes] "); + + if (getYesNoAnswer(1) != 1) + { + free(image1Buf); + image1Buf = NULL; + } + } + } + else + { + printf("No x86 BIOS image exists in FLASH, and image won't be downloaded\n"); + + if (gFlag == TRUE && yesFlag == FALSE) + { + printf("\nYou realize there is nothing to preserve, right? [Yes or No] "); + getYesNoAnswer(1); + } + } + } + + printf("\n"); + + n = getFileName(name, sizeof name, stdin, "FCode", 1); + if (n > 0) + { + if (readFile(name, &image2Buf, &image2Len) != 1) + return 0; + + printWhatString("FCode", image2Buf, image2Len); + + warn |= verifyBiosFcodeImage(port, image2Buf, image2Len, 1); + } + else + { + if (doBiosFcodeUpload(port, &image2Buf, &image2Len, 1) == 1 && image2Buf != NULL) + { + valid = 1; + + printWhatString("Current FCode", image2Buf, image2Len); + + if (yesFlag == FALSE) + { + printf("\nDo you want to preserve the current FCode? [Yes or No, default is Yes] "); + + if (getYesNoAnswer(1) != 1) + { + free(image2Buf); + image2Buf = NULL; + } + } + } + else + { + printf("No FCode image exists in FLASH, and image won't be downloaded\n"); + + if (gFlag == TRUE && yesFlag == FALSE) + { + printf("\nYou realize there is nothing to preserve, right? [Yes or No] "); + getYesNoAnswer(1); + } + } + } + + printf("\n"); + + n = getFileName(name, sizeof name, stdin, "EFI BIOS", 2); + if (n > 0) + { + if (readFile(name, &image3Buf, &image3Len) != 1) + return 0; + + printWhatString("EFI BIOS", image3Buf, image3Len); + + warn |= verifyBiosFcodeImage(port, image3Buf, image3Len, 3); + } + else + { + if (doBiosFcodeUpload(port, &image3Buf, &image3Len, 3) == 1 && image3Buf != NULL) + { + valid = 1; + + printWhatString("Current EFI BIOS", image3Buf, image3Len); + + if (yesFlag == FALSE) + { + printf("\nDo you want to preserve the current EFI BIOS? [Yes or No, default is Yes] "); + + if (getYesNoAnswer(1) != 1) + { + free(image3Buf); + image3Buf = NULL; + } + } + } + else + { + printf("No EFI BIOS image exists in FLASH, and image won't be downloaded\n"); + + if (gFlag == TRUE && yesFlag == FALSE) + { + printf("\nYou realize there is nothing to preserve, right? [Yes or No] "); + getYesNoAnswer(1); + } + } + } + + if (image1Buf != NULL) + { + last = image2Buf == NULL && image3Buf == NULL; + splitBiosImage(port, &image1Buf, &image1Len, &image4Buf, &image4Len); + fixupBiosFcodeImage(port, image1Buf, image1Len, last); + } + else + image1Len = 0; + + if (image2Buf != NULL) + { + last = image3Buf == NULL; + fixupBiosFcodeImage(port, image2Buf, image2Len, last); + } + else + image2Len = 0; + + if (image3Buf != NULL) + { + last = 1; + splitBiosImage(port, &image3Buf, &image3Len, &image5Buf, &image5Len); + fixupBiosFcodeImage(port, image3Buf, image3Len, last); + } + else + image3Len = 0; + + imageLen = image1Len + image2Len + image3Len + image4Len + image5Len; + if (imageLen == 0) + { + if (valid) + { + image1Len = 512; + image1Buf = malloc(image1Len); + memset(image1Buf, 0xff, image1Len); + imageLen = image1Len; + } + else + return 1; + } + + imageBuf = (unsigned char *)malloc(imageLen); + imageOff = 0; + if (image1Buf != NULL) + { + memcpy(imageBuf + imageOff, image1Buf, image1Len); + imageOff += image1Len; + free(image1Buf); + } + if (image2Buf != NULL) + { + memcpy(imageBuf + imageOff, image2Buf, image2Len); + imageOff += image2Len; + free(image2Buf); + } + if (image3Buf != NULL) + { + memcpy(imageBuf + imageOff, image3Buf, image3Len); + imageOff += image3Len; + free(image3Buf); + } + if (image4Buf != NULL) + { + memcpy(imageBuf + imageOff, image4Buf, image4Len); + imageOff += image4Len; + free(image4Buf); + } + if (image5Buf != NULL) + { + memcpy(imageBuf + imageOff, image5Buf, image5Len); + imageOff += image5Len; + free(image5Buf); + } + + if (warn && noFlag == TRUE) + { + free(imageBuf); + return 0; + } + + if (warn || yesFlag == FALSE) + { + if (warn) + printf("\nAre you sure you want to continue? [Yes or No, default is No] "); + else + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + free(imageBuf); + return 0; + } + } + + doFwDownload(port, MPI_FW_DOWNLOAD_ITYPE_BIOS, imageBuf, imageLen, 0); + + free(imageBuf); + + return 1; +} + + +int +doBiosFcodeUpload(MPT_PORT *port, unsigned char **outBuf, int *outLen, int type) +{ + char name[4][256]; + int file[4]; + int who; + unsigned char *imageBuf = NULL; + int imageLen; + int actualImageLen; + int offset; + unsigned char *buf; + int len; + int i; + int n; + PCIR *pcir; + int t; + int last; + + if (outBuf == NULL || outLen == NULL) + printf("Searching for BIOS and/or FCode images\n"); + + for (i = 0; i < 4; i++) + file[i] = -1; + + imageLen = 0x10000; + imageBuf = (unsigned char *)malloc(imageLen); + + offset = 0; + while (offset < 0x80000) + { + if (doFwUpload(port, MPI_FW_UPLOAD_ITYPE_BIOS_FLASH, imageBuf, imageLen, offset, &actualImageLen) != 1) + break; + + buf = imageBuf; + + n = (buf[0x01]<<8) + buf[0x00]; + if (n != 0xaa55 && n != 0xbb55) + { + break; + } + + n = (buf[0x19]<<8) + buf[0x18]; + + if (n + (int)sizeof *pcir >= imageLen) + { + // not all of the image is in the buffer, so quit now and read more of the image + free(imageBuf); + imageLen = n + (int)sizeof *pcir; + imageBuf = (unsigned char *)malloc(imageLen); + continue; + } + + pcir = (PCIR *)(buf + n); + + if (pcir->signature[0] != 'P' || + pcir->signature[1] != 'C' || + pcir->signature[2] != 'I' || + pcir->signature[3] != 'R') + { + break; + } + + len = get16(pcir->imageLength) * 512; + if (len > imageLen) + { + // not all of the image is in the buffer, so quit now and read more of the image + free(imageBuf); + imageLen = len; + imageBuf = (unsigned char *)malloc(imageLen); + continue; + } + + last = pcir->indicator & 0x80; + + if (outBuf == NULL || outLen == NULL) + { + printf("\n"); + + switch (pcir->type) + { + case 0: + n = getFileName(name[0], sizeof name[0], stdin, "x86 BIOS", 0); + who = 0; + break; + case 1: + n = getFileName(name[1], sizeof name[1], stdin, "FCode", 1); + who = 1; + break; + case 3: + n = getFileName(name[2], sizeof name[2], stdin, "EFI BIOS", 2); + who = 2; + break; + case 255: + if (buf[4] == 'L' && buf[5] == 'S' && buf[6] == 'I' && buf[7] == 'L' && buf[0x34] == 0x02) + { + if ((buf[0x3b] & 0xf0) == 0x10) + { + printf("Found x86 BIOS extended image\n"); + n = -1; + who = 0; + break; + } + if ((buf[0x3b] & 0xf0) == 0x30) + { + printf("Found EFI BIOS extended image\n"); + n = -1; + who = 2; + break; + } + } + default: + printf("Image type is unknown, enter filename: "); + n = getString(name[3], sizeof name[3], stdin); + who = 3; + break; + } + + if (n > 0) + { + fixupBiosFcodeImage(port, buf, len, 1); + + file[who] = open(name[who], O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file[who] < 0) + { + printf("Open failure for file %s\n", name[who]); + perror("Error is"); + } + + t = write(file[who], buf, len); + if (t != len) + { + printf("Write failed for file %s, t = %x\n", name[who], t); + perror("Error is"); + } + else + printf("\nWrote %d bytes to file %s\n", len, name[who]); + } + + else if (n < 0) + { + if (file[who] >= 0) + { + fixupBiosFcodeImage(port, buf, len, 0); + + t = write(file[who], buf, len); + if (t != len) + { + printf("Write failed for file %s, t = %x\n", name[who], t); + perror("Error is"); + } + else + printf("\nWrote %d bytes to file %s\n", len, name[who]); + } + } + + else + { + printf("Image won't be uploaded\n"); + } + } + else + { + if (pcir->type == type) + { + *outBuf = (unsigned char *)malloc(len); + *outLen = len; + memcpy(*outBuf, buf, len); + } + else if (pcir->type == 255) + { + if (buf[4] == 'L' && buf[5] == 'S' && buf[6] == 'I' && buf[7] == 'L' && buf[0x34] == 0x02) + { + if (type == 0 && (buf[0x3b] & 0xf0) == 0x10) + { + *outBuf = (unsigned char *)realloc(*outBuf, *outLen + len); + memcpy(*outBuf + *outLen, buf, len); + *outLen = *outLen + len; + } + if (type == 3 && (buf[0x3b] & 0xf0) == 0x30) + { + *outBuf = (unsigned char *)realloc(*outBuf, *outLen + len); + memcpy(*outBuf + *outLen, buf, len); + *outLen = *outLen + len; + } + } + } + } + + offset += len; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + if (last) + { + // last image, so make sure we quit after this + break; + } + } + else + { + if (offset >= actualImageLen) + { + // last image, so make sure we quit after this + break; + } + } + } + + for (i = 0; i < 4; i++) + if (file[i] >= 0) + close(file[i]); + + free(imageBuf); + + return 1; +} + + +int +verifyBiosFcodeImage(MPT_PORT *port, unsigned char *buf, int len, int type) +{ + int n; + int n1; + int warn = 0; + PCIR *pcir; + int i; + U8 checksum; + + n = (buf[0x01]<<8) + buf[0x00]; + if (n != 0xaa55) + { + if (n == 0xbb55) + { + printf("\nThis appears to be the special non-functional (blank) image!\n"); + return 0; + } + if (!warn) + printf("\n"); + printf("Image's ROM signature %04x is invalid!\n", n); + warn = 1; + } + + if ((len % 512) != 0) + { + if (!warn) + printf("\n"); + printf("Image's length is not a multiple of 512 bytes!\n"); + printf(" The image appears to be corrupted, proceed with caution\n"); + warn = 1; + } + + /* if there's a what string, we will check the checksum even if it's not BIOS */ + for (i = 0; i < len; i++) + if (buf[i] == '@' && buf[i+1] == '(' && buf[i+2] == '#' && buf[i+3] == ')') + break; + + if (type == 0 || i < len) + { + checksum = 0; + for (i = 0; i < len; i++) + checksum += buf[i]; + + if (checksum != 0) + { + if (!warn) + printf("\n"); + printf("Image's checksum is invalid!\n"); + printf(" The image appears to be corrupted, proceed with caution\n"); + warn = 1; + } + } + + if (type == 1) + { + int len; + U32 checksum; + + len = get4bytes(buf, 0x38); + checksum = 0; + for (i = 0x3c; i < len + 0x34; i++) + checksum += buf[i]; + + while (checksum > 0xffff) + checksum -= 0xffff; + + checksum -= get2bytes(buf, 0x36); + + if (checksum != 0) + { + if (!warn) + printf("\n"); + printf("Image's FCode checksum is invalid!\n"); + printf(" The image appears to be corrupted, proceed with caution\n"); + warn = 1; + } + } + + n = (buf[0x19]<<8) + buf[0x18]; + + if (n + (int)sizeof *pcir < len) + { + pcir = (PCIR *)(buf + n); + + if (pcir->signature[0] != 'P' || + pcir->signature[1] != 'C' || + pcir->signature[2] != 'I' || + pcir->signature[3] != 'R') + { + if (!warn) + printf("\n"); + printf("Image's PCIR signature is invalid!\n"); + warn = 1; + } + + if (get16(pcir->vendorId) != MPI_MANUFACTPAGE_VENDORID_LSILOGIC) + { + if (!warn) + printf("\n"); + printf("Image's PCI Vendor ID %04x is not correct!\n", get16(pcir->vendorId)); + warn = 1; + } + + if (checkCompatible(get16(pcir->deviceId), port->deviceId, type) != 1) + { + if (!warn) + printf("\n"); + printf("Image's PCI Device ID %04x is not compatible!\n", get16(pcir->deviceId)); + warn = 1; + } + + if (pcir->type != type) + { + if (!warn) + printf("\n"); + printf("Image's PCI Type %d is not correct!\n", pcir->type); + warn = 1; + } + + n = get16(pcir->imageLength) * 512; + if (n < len) + { + n1 = (buf[0x01]<<8) + buf[0x00]; + if (n1 == 0xaa55) + { + n1 = (buf[n+0x19]<<8) + buf[n+0x18]; + + if (n + n1 + (int)sizeof *pcir < len) + { + pcir = (PCIR *)(buf + n + n1); + + if (pcir->signature[0] == 'P' || + pcir->signature[1] == 'C' || + pcir->signature[2] == 'I' || + pcir->signature[3] == 'R') + { +// printf("Image is in multiple parts, length check circumvented\n"); + n = len; + } + } + } + } + if (n != len) + { + if (!warn) + printf("\n"); + printf("Image's PCI Image Length %04x is not correct!\n", get16(pcir->imageLength)); + warn = 1; + } + } + else + { + if (!warn) + printf("\n"); + printf("Image's PCIR offset %04x is invalid!\n", n); + warn = 1; + } + + return warn; +} + + +int +splitBiosImage(MPT_PORT *port, unsigned char **buf1, int *len1, unsigned char **buf2, int *len2) +{ + int n; + PCIR *pcir; + + n = ((*buf1)[0x19]<<8) + (*buf1)[0x18]; + + if (n + (int)sizeof *pcir < *len1) + { + pcir = (PCIR *)(*buf1 + n); + + if (pcir->signature[0] == 'P' && + pcir->signature[1] == 'C' && + pcir->signature[2] == 'I' && + pcir->signature[3] == 'R') + { + n = get16(pcir->imageLength) * 512; + if (n < *len1) + { + *buf2 = (unsigned char *)malloc(*len1 - n); + *len2 = *len1 - n; + memcpy(*buf2, *buf1 + n, *len1 - n); + *buf1 = (unsigned char *)realloc(*buf1, n); + *len1 = n; + } + } + } + + return 1; +} + + +int +fixupBiosFcodeImage(MPT_PORT *port, unsigned char *buf, int len, int last) +{ + int n; + PCIR *pcir; + int type = 0; + int i; + U8 checksum; + + n = (buf[0x19]<<8) + buf[0x18]; + + if (n + (int)sizeof *pcir < len) + { + pcir = (PCIR *)(buf + n); + + if (pcir->signature[0] == 'P' && + pcir->signature[1] == 'C' && + pcir->signature[2] == 'I' && + pcir->signature[3] == 'R') + { + type = pcir->type; + if (type != 255) + pcir->deviceId = set16(port->deviceIdRaw); + + if (last) + pcir->indicator |= 0x80; + else + pcir->indicator &= ~0x80; + } + + n = get16(pcir->imageLength) * 512; + } + else + { + n = len; + } + + /* if there's a what string, we will fix up the checksum as long as it's not FCode */ + for (i = 0; i < len; i++) + if (buf[i] == '@' && buf[i+1] == '(' && buf[i+2] == '#' && buf[i+3] == ')') + break; + + if (type != 1 || i < len) + { + checksum = 0; + for (i = 0; i < n - 1; i++) + checksum += buf[i]; + buf[i] = -checksum; + } + + return 1; +} + + +int +doSeepromDownload(MPT_PORT *port) +{ + char name[256]; + unsigned char *imageBuf = NULL; + int imageLen; + int n; + + n = getFileName(name, sizeof name, stdin, "SEEPROM", 0); + if (n > 0) + { + if (readFile(name, &imageBuf, &imageLen) != 1) + return 0; + } + else + { + printf("Image won't be downloaded\n"); + return 1; + } + + if (doFwDownload(port, MPI_FW_DOWNLOAD_ITYPE_NVDATA, imageBuf, imageLen, 0) == 1) + { + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf("\n"); + printf("WARNING! The SEEPROM contains information (World Wide Names) that must\n"); + printf(" be unique for each port. Each port on a host adapter must have\n"); + printf(" its own WWNs, not copied from another host adapter. Please use\n"); + printf(" Manufacturing Page 3 to verify that the WWNs assigned to this\n"); + printf(" port are unique, and modify them if necessary.\n"); + } + } + + free(imageBuf); + + return 1; +} + + +int +doSeepromUpload(MPT_PORT *port) +{ + char name[256]; + int file; + unsigned char *imageBuf = NULL; + int imageLen; + int actualImageLen; + int offset; + int n; + int t; + + n = getFileName(name, sizeof name, stdin, "SEEPROM", 0); + if (n > 0) + { + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + printf("Image won't be uploaded\n"); + return 1; + } + + imageLen = CHUNK_SIZE; + imageBuf = (unsigned char *)malloc(imageLen); + + offset = 0; + while (TRUE) + { + if (doFwUpload(port, MPI_FW_UPLOAD_ITYPE_NVDATA, imageBuf, imageLen, offset, &actualImageLen) != 1) + break; + + if (offset + imageLen > actualImageLen) + imageLen = actualImageLen - offset; + + t = write(file, imageBuf, imageLen); + if (t != imageLen) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + break; + } + + offset += imageLen; + if (offset >= actualImageLen) + break; + } + + printf("\nWrote %d bytes to file %s\n", offset, name); + + close(file); + + free(imageBuf); + + return 1; +} + + +char *deviceType[32] = +{ + "Disk", + "Tape", + "Printer", + "Processor", + "WriteOnce", + "CDROM", + "Scanner", + "Optical", + "Jukebox", + "Comm", + "0Ah", + "0Bh", + "RAIDArray", + "EnclServ", + "0Eh", + "0Fh", + "10h", + "11h", + "12h", + "13h", + "14h", + "15h", + "16h", + "17h", + "18h", + "19h", + "1Ah", + "1Bh", + "1Ch", + "1Dh", + "1Eh", + "" +}; + + +int +doScanForLuns(MPT_PORT *port, int flag , int option) +{ + int bus; + int target; + int lun; + unsigned char inq[36]; + char buf[32]; + int i; + int version; + int max_lun; + //int option; + + //printf("Number of LUN's to scan for, select an option: [1-10] "); + printf("Number of LUN's to scan for is %d \n", option- 800); + //option = getNumberAnswer(0, 10, 10); + //printf("option value %d \n", option); + + if (flag) + showPortInfoHeader(port); + + getDeviceInfoHeader(port, buf, sizeof buf); + + printf(" B___T___L Type Vendor Product Rev %s\n", buf); + + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + max_lun = 1; + + for (lun = 0; lun < max_lun; lun++) + { + if (doInquiry(port, bus, target, lun, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + if (lun == 0) + break; + else + continue; + } + + if (lun == 0) + { + getDeviceInfo(port, bus, target, buf, sizeof buf); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + version = inq[2] & 0x07; + if (version > 1) + max_lun = option - 800; + //printf("option1 value %d \n", option); + if (version > 3) + max_lun = option - 800; + //printf("option2 value %d \n", option); + } + else + { + max_lun = option - 800; + //printf("option3 value %d \n", option); + } + //printf("max_lun value %d \n", max_lun); + } + else + { + if ((inq[0] & 0x1f) == 0x1f) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + if ((inq[0] & 0x1f) == 0x0d) + continue; + } + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + //printf("debug the max lun number \n"); + printf("%2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %s\n", + bus, target, lun, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, lun == 0 ? buf : ""); + } /* next lun */ + } /* next target */ + } /* next bus */ + + showPortInfo(port); + + showHiddenDevices(port); + + return 1; +} + +int +doScanForDevices(MPT_PORT *port, int flag) +{ + int bus; + int target; + int lun; + unsigned char inq[36]; + char buf[32]; + int i; + int version; + int max_lun; + + if (flag) + showPortInfoHeader(port); + + getDeviceInfoHeader(port, buf, sizeof buf); + + printf(" B___T___L Type Vendor Product Rev %s\n", buf); + + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + max_lun = 1; + + for (lun = 0; lun < max_lun; lun++) + { + if (doInquiry(port, bus, target, lun, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + if (lun == 0) + break; + else + continue; + } + + if (lun == 0) + { + getDeviceInfo(port, bus, target, buf, sizeof buf); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + version = inq[2] & 0x07; + if (version > 1) + max_lun = 8; + if (version > 3) + max_lun = 64; + } + else + { + max_lun = port->maxLuns; + } + } + else + { + if ((inq[0] & 0x1f) == 0x1f) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + if ((inq[0] & 0x1f) == 0x0d) + continue; + } + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + printf("%2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %s\n", + bus, target, lun, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, lun == 0 ? buf : ""); + } /* next lun */ + } /* next target */ + } /* next bus */ + + showPortInfo(port); + + showHiddenDevices(port); + + return 1; +} + + +int +doConfigPage(MPT_PORT *port) +{ + ConfigReply_t rep; + U32 buf[256]; + int type; + int number; + U32 address; + U32 offset; + U32 value; + int i; + int n; + int t; + int attributes; + int action; + int changed; + + while (TRUE) + { + printf("Enter page type: [0-255 or RETURN to quit] "); + type = getNumberAnswer(0, 255, -1); + if (type < 0) + break; + + if (type == 15) + { + printf("\nPage type 15 is reserved!\n\n"); + continue; + } + + printf("Enter page number: [0-255 or RETURN to quit] "); + number = getNumberAnswer(0, 255, -1); + if (number < 0) + break; + + if ((type == MPI_CONFIG_PAGETYPE_SCSI_DEVICE && (number == 0 || number == 1)) || + (type == MPI_CONFIG_PAGETYPE_FC_PORT && (number == 3 || number == 5)) || + (type == MPI_CONFIG_PAGETYPE_FC_DEVICE && number == 0) || + (type == MPI_CONFIG_PAGETYPE_RAID_VOLUME && (number == 0 || number == 1)) || + (type == MPI_CONFIG_PAGETYPE_RAID_PHYSDISK && (number == 0 || number == 1)) || + (type == MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER && (number == 0 || number == 1)) || + (type == MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE && (number == 0 || number == 1 || number == 2)) || + (type == MPI_CONFIG_EXTPAGETYPE_SAS_PHY && (number == 0 || number == 1 || number == 2 || number == 3 || number == 4)) || + (type == MPI_CONFIG_EXTPAGETYPE_ENCLOSURE && number == 0) || + (type == MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG && number == 0) || + (type == MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING && number == 0) || + (type == MPI2_CONFIG_EXTPAGETYPE_SAS_PORT && number == 0)) + { + printf("Enter page address: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&address) == 0) + break; + } + else + address = 0; + + if (getConfigPageHeader(port, type, number, address, &rep) != 1) + { + printf("\nFailed to read page header -- that page might not exist\n\n"); + continue; + } + + attributes = rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK; + + if (attributes == MPI_CONFIG_PAGEATTR_PERSISTENT || + attributes == MPI_CONFIG_PAGEATTR_RO_PERSISTENT) + { + printf("Read NVRAM or current values? [0=NVRAM, 1=Current, default is 0] "); + t = getNumberAnswer(0, 1, 0); + if (t == 0) + action = MPI_CONFIG_ACTION_PAGE_READ_NVRAM; + else + action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + } + else + action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + + t = getConfigPageAction(port, action, type, number, address, buf, sizeof buf); + + if (t != 1 && action == MPI_CONFIG_ACTION_PAGE_READ_NVRAM) + { + printf("The current values for this page will be used instead\n"); + t = getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, type, number, address, buf, sizeof buf); + } + + if (t == 1) + { + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + n = get16(((pConfigExtendedPageHeader_t)buf)->ExtPageLength); + else + n = ((pConfigPageHeader_t)buf)->PageLength; + + if (n == 0) + { + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + n = get16(rep.ExtPageLength); + else + n = rep.Header.PageLength; + } + + printf("\n"); + for (i = 0; i < n; i++) + printf("%04x : %08x\n", i*4, get32x(buf[i])); + + if (attributes == MPI_CONFIG_PAGEATTR_CHANGEABLE || + attributes == MPI_CONFIG_PAGEATTR_PERSISTENT || + attributes == MPI_CONFIG_PAGEATTR_RO_PERSISTENT) + { + printf("\nDo you want to make changes? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + { + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + i = sizeof(ConfigExtendedPageHeader_t); + else + i = sizeof(ConfigPageHeader_t); + + changed = FALSE; + + while (TRUE) + { + printf("Enter offset of value to change: [%04x-%04x or RETURN to quit] ", i, (n - 1) * 4); + while (TRUE) + { + t = getHexNumberAnswer(&offset); + if (t == 0) + break; + + if ((offset % 4) == 0) + { + offset /= 4; + if (offset >= (U32)(i / 4) && offset < (U32)n) + break; + } + + printf("Invalid answer, try again: "); + } + if (t == 0) + break; + + printf("Enter value: [00000000-FFFFFFFF or RETURN to not change] "); + + value = get32x(buf[offset]); + + if (parseHexNumberChange(&value) == 0) + continue; + + buf[offset] = set32x(value); + + changed = TRUE; + } + + if (changed == TRUE) + { + printf("\nDo you want to write your changes? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + { + if (action == MPI_CONFIG_ACTION_PAGE_READ_NVRAM) + action = MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM; + else + action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + + if (type == MPI_CONFIG_PAGETYPE_MANUFACTURING && number == 2) + { + U8 checksum = 0xa5; + U8 *p = (U8 *)buf; + + p += 8; + t = n * 4 - 8; + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC919: t -= 4; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929: t -= 4; break; + case MPI_MANUFACTPAGE_DEVICEID_FC919X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC939X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949E: t -= 4; break; + default: t = 0; break; + } + if (t != 0) + { + for (i = 0; i < t; i++) + { + checksum += *p++; + } + *p = -checksum; + } + } + + if (type == MPI_CONFIG_PAGETYPE_MANUFACTURING) + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + if (setConfigPageAction(port, action, type, number, address, buf, sizeof buf) != 1) + printf("Failed to write changes!\n"); + else + printf("Changes have been written\n"); + + if (type == MPI_CONFIG_PAGETYPE_MANUFACTURING) + doIocInit(port, port->whoInit); + } + } + } + } + } + + printf("\n"); + } + + return 1; +} + + +int +doInterruptCoalescingValues(MPT_PORT *port, int timeout, int depth) +{ + IOCPage1_t *IOCPage1; + int length; + int flags; + + IOCPage1 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, &length); + if (IOCPage1 == NULL) + return 0; + + flags = get32(IOCPage1->Flags); + if (timeout != 0 && depth != 0) + { + flags |= MPI_IOCPAGE1_REPLY_COALESCING; + IOCPage1->Flags = set32(flags); + IOCPage1->CoalescingTimeout = set32(timeout); + IOCPage1->CoalescingDepth = depth; + } + else + { + flags &= ~MPI_IOCPAGE1_REPLY_COALESCING; + IOCPage1->Flags = set32(flags); + IOCPage1->CoalescingTimeout = 0; + IOCPage1->CoalescingDepth = 0; + } + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, IOCPage1, length) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(IOCPage1); + return 0; + } + + free(IOCPage1); + + return 1; +} + + +int +doIocSettings(MPT_PORT *port) +{ + IOCPage1_t *IOCPage1; + int length; + int flags; + int timeout; + int depth; + int on; + int mode; + + IOCPage1 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, &length); + if (IOCPage1 == NULL) + return 0; + + flags = get32(IOCPage1->Flags) & MPI_IOCPAGE1_REPLY_COALESCING; + timeout = get32(IOCPage1->CoalescingTimeout); + depth = IOCPage1->CoalescingDepth; + + if (timeout < 0) + timeout = 0; + if (timeout > 1000) + timeout = 1000; + if (depth < 0) + depth = 0; + if (depth > 128) + depth = 128; + + on = flags != 0 && timeout != 0 && depth != 0; + if (on) + printf("Interrupt Coalescing is enabled, timeout is %d microseconds, depth is %d\n", + timeout, depth); + else + printf("Interrupt Coalescing is disabled\n"); + + printf("Enable interrupt coalescing: [0=No, 1=Yes, default is %d] ", on); + on = getNumberAnswer(0, 1, on); + + if (on) + { + printf("Enter timeout: [1-1000, 0=disable, default is %d] ", timeout); + timeout = getNumberAnswer(0, 1000, timeout); + + printf("Enter depth: [1-128, 0=disable, default is %d] ", depth); + depth = getNumberAnswer(0, 128, depth); + } + else + { + timeout = 0; + depth = 0; + } + + flags = get32(IOCPage1->Flags); + if (on && timeout != 0 && depth != 0) + { + flags |= MPI_IOCPAGE1_REPLY_COALESCING; + IOCPage1->Flags = set32(flags); + IOCPage1->CoalescingTimeout = set32(timeout); + IOCPage1->CoalescingDepth = depth; + } + else + { + flags &= ~MPI_IOCPAGE1_REPLY_COALESCING; + IOCPage1->Flags = set32(flags); + IOCPage1->CoalescingTimeout = 0; + IOCPage1->CoalescingDepth = 0; + } + + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC939X: + case MPI_MANUFACTPAGE_DEVICEID_FC949X: + case MPI_MANUFACTPAGE_DEVICEID_FC949E: + flags = get32(IOCPage1->Flags); + mode = (flags & MPI_IOCPAGE1_EEDP_MODE_MASK) >> 24; + printf("\nEnd-to-End Data Protection Mode: [0=Disabled, 1=T10, 2=LB, default is %d] ", mode); + mode = getNumberAnswer(0, 2, mode); + flags &= ~MPI_IOCPAGE1_EEDP_MODE_MASK; + flags |= mode << 24; + IOCPage1->Flags = set32(flags); + break; + } + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, IOCPage1, length) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(IOCPage1); + return 0; + } + + free(IOCPage1); + + return 1; +} + + +int +doScsiInitiatorSettings(MPT_PORT *port) +{ + SCSIPortPage1_t SCSIPortPage1; + SCSIPortPage2_t SCSIPortPage2; + int flags; + int settings; + int id; + int t; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0, &SCSIPortPage2, sizeof SCSIPortPage2) != 1) + return 0; + + flags = get32(SCSIPortPage2.PortFlags); + settings = get32(SCSIPortPage2.PortSettings); + + id = settings & MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK; + printf("Host SCSI ID: [0-15, default is %d] ", id); + id = getNumberAnswer(0, 15, id); + settings &= ~MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK; + settings |= id; + + t = (flags & MPI_SCSIPORTPAGE2_PORT_FLAGS_SCAN_HIGH_TO_LOW) != 0; + printf("Bus scan order: [0=LowToHigh, 1=HighToLow, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_SCSIPORTPAGE2_PORT_FLAGS_SCAN_HIGH_TO_LOW; + else + flags |= MPI_SCSIPORTPAGE2_PORT_FLAGS_SCAN_HIGH_TO_LOW; + + t = (flags & MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET) != 0; + printf("Avoid SCSI bus reset: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET; + else + flags |= MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET; + + t = (flags & MPI_SCSIPORTPAGE2_PORT_FLAGS_ALTERNATE_CHS) != 0; + printf("CHS mapping: [0=PlugAndPlay, 1=AlternateCHS, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_SCSIPORTPAGE2_PORT_FLAGS_ALTERNATE_CHS; + else + flags |= MPI_SCSIPORTPAGE2_PORT_FLAGS_ALTERNATE_CHS; + + t = (settings & MPI_SCSIPORTPAGE2_PORT_REMOVABLE_MEDIA) >> 6; + printf("Removable media support: [0=None, 1=BootDrive, 2=AnyWithMedia, default is %d] ", t); + t = getNumberAnswer(0, 2, t); + settings &= ~MPI_SCSIPORTPAGE2_PORT_REMOVABLE_MEDIA; + settings |= t << 6; // what, no nice symbolic name I can use here? + + t = (settings & MPI_SCSIPORTPAGE2_PORT_SPINUP_DELAY_MASK) >> 8; + printf("Spinup delay (in seconds): [0-15, default is %d] ", t); + t = getNumberAnswer(0, 15, t); + settings &= ~MPI_SCSIPORTPAGE2_PORT_SPINUP_DELAY_MASK; + settings |= t << 8; // what, no nice symbolic name I can use here? + + SCSIPortPage2.PortFlags = set32(flags); + SCSIPortPage2.PortSettings = set32(settings); + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0, &SCSIPortPage2, sizeof SCSIPortPage2) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0, &SCSIPortPage1, sizeof SCSIPortPage1) != 1) + return 0; + + SCSIPortPage1.Configuration = set32((1 << (id + 16)) | id); + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0, &SCSIPortPage1, sizeof SCSIPortPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +char * +syncToMt(int sync) +{ + if (sync == 0) + return "Async"; + if (sync == 8) + return "160"; + if (sync == 9) + return "80"; + if (sync == 10) + return "40"; + if (sync == 12) + return "20"; + if (sync == 25) + return "10"; + if (sync == 50) + return "5"; + return ""; +} + + +char * +syncToMb(int sync, int wide) +{ + if (wide == 0) + return syncToMt(sync); + if (sync == 0) + return "Async"; + if (sync == 8) + return "320"; + if (sync == 9) + return "160"; + if (sync == 10) + return "80"; + if (sync == 12) + return "40"; + if (sync == 25) + return "20"; + if (sync == 50) + return "10"; + return ""; +} + + +int +doScsiTargetSettings(MPT_PORT *port) +{ + SCSIPortPage2_t SCSIPortPage2; + U8 timeout[16]; + U8 sync_factor[16]; + U16 device_flags[16]; + int id; + int sync; + int i; + int t; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0, &SCSIPortPage2, sizeof SCSIPortPage2) != 1) + return 0; + + id = get32(SCSIPortPage2.PortSettings) & MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK; + + for (i = 0; i < 16; i++) + { + timeout[i] = SCSIPortPage2.DeviceSettings[i].Timeout; + sync_factor[i] = SCSIPortPage2.DeviceSettings[i].SyncFactor; + device_flags[i] = get16(SCSIPortPage2.DeviceSettings[i].DeviceFlags); + } + + while (TRUE) + { + printf("Target MB/sec | MT/sec Wide ScanID ScanLUNs Disconnect Timeout QueueTag Boot\n"); + for (i = 0; i < 16; i++) + printf(" %2d %5s | %5s %3s %3s %3s %3s %3d %3s %3s\n", + i, + syncToMb(sync_factor[i], + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE ? 0 : 1), + syncToMt(sync_factor[i]), + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE ? "No" : "Yes", + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE ? "Yes" : "No", + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE ? "Yes" : "No", + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE ? "Yes" : "No", + timeout[i], + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE ? "Yes" : "No", + device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_BOOT_CHOICE ? "Yes" : "No"); + printf("\nSelect a Target: [0-15, %d=AllTargets, RETURN to quit] ", id); + i = getNumberAnswer(0, 15, -1); + + if (i < 0) + break; + + switch (sync_factor[i]) + { + case 8: sync = 160; break; + case 9: sync = 80; break; + case 10: sync = 40; break; + case 12: sync = 20; break; + case 25: sync = 10; break; + case 50: sync = 5; break; + default: + case 0: sync = 0; break; + } + printf("\nMT/sec: [160, 80, 40, 20, 10, 5, 0=Async, default is %d] ", sync); + while (TRUE) + { + t = getNumberAnswer(0, 160, sync); + switch (t) + { + case 160: t = 8; break; + case 80: t = 9; break; + case 40: t = 10; break; + case 20: t = 12; break; + case 10: t = 25; break; + case 5: t = 50; break; + case 0: t = 0; break; + default: + printf("Invalid response, try again: "); + t = -1; + break; + } + if (t >= 0) + break; + } + sync_factor[i] = t; + + if (sync_factor[i] > 9 || sync_factor[i] == 0) + { + t = (device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE) == 0; + printf("Enable Wide: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE; + else + device_flags[i] |= MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE; + } + else + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE; + + t = (device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE) != 0; + printf("Enable ScanID: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE; + else + device_flags[i] |= MPI_SCSIPORTPAGE2_DEVICE_ID_SCAN_ENABLE; + + t = (device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE) != 0; + printf("Enable ScanLUNs: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE; + else + device_flags[i] |= MPI_SCSIPORTPAGE2_DEVICE_LUN_SCAN_ENABLE; + + t = (device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE) != 0; + printf("Enable Disconnect: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE; + else + device_flags[i] |= MPI_SCSIPORTPAGE2_DEVICE_DISCONNECT_ENABLE; + + t = timeout[i]; + printf("Timeout: [0-255, default is %d] ", t); + t = getNumberAnswer(0, 255, t); + timeout[i] = t; + + t = (device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE) != 0; + printf("Enable QueueTag: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE; + else + device_flags[i] |= MPI_SCSIPORTPAGE2_DEVICE_TAG_QUEUE_ENABLE; + + t = (device_flags[i] & MPI_SCSIPORTPAGE2_DEVICE_BOOT_CHOICE) != 0; + printf("Enable Boot: [0=No, 1=Yes, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + device_flags[i] &= ~MPI_SCSIPORTPAGE2_DEVICE_BOOT_CHOICE; + else + device_flags[i] |= MPI_SCSIPORTPAGE2_DEVICE_BOOT_CHOICE; + + if (i == id) + { + for (i = 0; i < 16; i++) + { + if (i != id) + { + timeout[i] = timeout[id]; + sync_factor[i] = sync_factor[id]; + device_flags[i] = device_flags[id]; + } + } + } + + printf("\n"); + } + + for (i = 0; i < 16; i++) + { + SCSIPortPage2.DeviceSettings[i].Timeout = timeout[i]; + SCSIPortPage2.DeviceSettings[i].SyncFactor = sync_factor[i]; + SCSIPortPage2.DeviceSettings[i].DeviceFlags = set16(device_flags[i]); + } + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0, &SCSIPortPage2, sizeof SCSIPortPage2) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doFcLinkSpeedValue(MPT_PORT *port, int t) +{ + FCPortPage0_t FCPortPage0; + FCPortPage1_t FCPortPage1; + int speeds; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + speeds = get32(FCPortPage0.SupportedSpeeds); + + switch (t) + { + case MPI_FCPORTPAGE1_LCONFIG_SPEED_1GIG: + speeds &= MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED; + break; + case MPI_FCPORTPAGE1_LCONFIG_SPEED_2GIG: + speeds &= MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED; + break; + case MPI_FCPORTPAGE1_LCONFIG_SPEED_4GIG: + speeds &= MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED; + break; + } + + if (speeds == 0) + { + printf("That link speed is not supported on this port!\n"); + return 0; + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + FCPortPage1.LinkConfig &= ~MPI_FCPORTPAGE1_LCONFIG_SPEED_MASK; + FCPortPage1.LinkConfig |= t; + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doFcTopologyValue(MPT_PORT *port, int t) +{ + FCPortPage1_t FCPortPage1; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + FCPortPage1.TopologyConfig &= ~MPI_FCPORTPAGE1_TOPOLOGY_MASK; + FCPortPage1.TopologyConfig |= t; + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doFcPortOffline(MPT_PORT *port) +{ + FCPortPage1_t FCPortPage1; + int flags; + + printf("Setting port offline\n"); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + flags = get32(FCPortPage1.Flags); + flags |= MPI_FCPORTPAGE1_FLAGS_PORT_OFFLINE; + FCPortPage1.Flags = set32(flags); + + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + + return 1; +} + + +int +doFcPortOnline(MPT_PORT *port) +{ + FCPortPage1_t FCPortPage1; + int flags; + + printf("Setting port online\n"); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + flags = get32(FCPortPage1.Flags); + flags &= ~MPI_FCPORTPAGE1_FLAGS_PORT_OFFLINE; + FCPortPage1.Flags = set32(flags); + + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + + return 1; +} + + +int +doFcTopologyNLPort(MPT_PORT *port) +{ + FCPortPage1_t FCPortPage1; + + printf("Setting port to NL_Port\n"); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + FCPortPage1.TopologyConfig &= ~MPI_FCPORTPAGE1_TOPOLOGY_MASK; + FCPortPage1.TopologyConfig |= MPI_FCPORTPAGE1_TOPOLOGY_NLPORT; + + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + + return 1; +} + + +int +doFcTopologyNPort(MPT_PORT *port) +{ + FCPortPage1_t FCPortPage1; + + printf("Setting port to N_Port\n"); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + FCPortPage1.TopologyConfig &= ~MPI_FCPORTPAGE1_TOPOLOGY_MASK; + FCPortPage1.TopologyConfig |= MPI_FCPORTPAGE1_TOPOLOGY_NPORT; + + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + + return 1; +} + + +int +doFcSpecialMode(MPT_PORT *port, int enable, int permanent) +{ + FCPortPage1_t FCPortPage1; + int flags; + + printf("%s special mode on port\n", enable ? "Enabling" : "Disabling"); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + flags = get32(FCPortPage1.Flags); + if (enable) + flags |= 0x1000; + else + flags &= ~0x1000; + FCPortPage1.Flags = set32(flags); + + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + + if (permanent) + { + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_NVRAM, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + flags = get32(FCPortPage1.Flags); + if (enable) + flags |= 0x1000; + else + flags &= ~0x1000; + FCPortPage1.Flags = set32(flags); + + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + } + + return 1; +} + + +int +doFcPortSettings(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + FCPortPage1_t FCPortPage1; + FCPortPage4_t FCPortPage4; + int flags; + int speed; + int speeds; + int t; + U32 alpa; + int settings; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + speeds = get32(FCPortPage0.SupportedSpeeds); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + t = FCPortPage1.TopologyConfig & MPI_FCPORTPAGE1_TOPOLOGY_MASK; + if (t == MPI_FCPORTPAGE1_TOPOLOGY_AUTO) + t = 0; + printf("Link topology: [0=Auto, 1=NL_Port, 2=N_Port, default is %d] ", t); + t = getNumberAnswer(0, 2, t); + if (t == 0) + t = MPI_FCPORTPAGE1_TOPOLOGY_AUTO; + FCPortPage1.TopologyConfig &= ~MPI_FCPORTPAGE1_TOPOLOGY_MASK; + FCPortPage1.TopologyConfig |= t; + + t = FCPortPage1.LinkConfig & MPI_FCPORTPAGE1_LCONFIG_SPEED_MASK; + if (t == MPI_FCPORTPAGE1_LCONFIG_SPEED_AUTO) + speed = 0; + else + speed = t + 1; + if (speeds & MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED) + { + if (speed == 4) + speed = 10; + else if (speed == 3) + speed = 4; + else if (speed > 3) + speed = 0; + printf("Link speed: [0=Auto, 1=1Gb, 2=2Gb, 4=4Gb, 10=10Gb, default is %d] ", speed); + while (TRUE) + { + t = getNumberAnswer(0, 10, speed); + if (t < 3 || t == 4 || t == 10) + break; + printf("Invalid response, try again: "); + } + if (t == 10) + t = 4; + else if (t == 4) + t = 3; + } + else if (speeds & MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED) + { + if (speed == 3) + speed = 4; + else if (speed > 3) + speed = 0; + printf("Link speed: [0=Auto, 1=1Gb, 2=2Gb, 4=4Gb, default is %d] ", speed); + while (TRUE) + { + t = getNumberAnswer(0, 4, speed); + if (t < 3 || t == 4) + break; + printf("Invalid response, try again: "); + } + if (t == 4) + t = 3; + } + else if (speeds & MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED) + { + if (speed > 2) + speed = 0; + printf("Link speed: [0=Auto, 1=1Gb, 2=2Gb, default is %d] ", speed); + t = getNumberAnswer(0, 2, speed); + } + else if (speeds & MPI_FCPORTPAGE1_LCONFIG_SPEED_1GIG) + { + t = 1; + } + else + { + t = 0; + } + if (t == 0) + t = MPI_FCPORTPAGE1_LCONFIG_SPEED_AUTO; + else + t--; + FCPortPage1.LinkConfig &= ~MPI_FCPORTPAGE1_LCONFIG_SPEED_MASK; + FCPortPage1.LinkConfig |= t; + + flags = get32(FCPortPage1.Flags); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT) != 0; + printf("FCP Initiator protocol: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT; + else + flags |= MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT; + + t = (flags & MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG) != 0; + printf("FCP Target protocol: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG; + else + flags |= MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG; + + t = (flags & MPI_FCPORTPAGE1_FLAGS_PROT_LAN) != 0; + printf("LAN protocol: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_FCPORTPAGE1_FLAGS_PROT_LAN; + else + flags |= MPI_FCPORTPAGE1_FLAGS_PROT_LAN; + + t = (flags & MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID) != 0; + printf("Assignment of Bus/Target IDs: [0=SortByWWN, 1=SortByDID, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID; + else + flags |= MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID; + + t = (flags & MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY) != 0; + printf("Immediate Error Reply: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY; + else + flags |= MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY; + + t = (flags & MPI_FCPORTPAGE1_FLAGS_MAINTAIN_LOGINS) != 0; + printf("Maintain Logins: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_FCPORTPAGE1_FLAGS_MAINTAIN_LOGINS; + else + flags |= MPI_FCPORTPAGE1_FLAGS_MAINTAIN_LOGINS; + + FCPortPage1.Flags = set32(flags); + + t = FCPortPage1.HardALPA; + printf("Hard AL_PA: [01 to EF, or FF for Soft AL_PA, default is %02x] ", t); + alpa = t; + while (TRUE) + { + t = getHexNumberAnswer(&alpa); + if (t == 0) + { + alpa = FCPortPage1.HardALPA; + break; + } + + if (alpa == 0xff) + break; + + if (alpa > 0x00 && alpa < 0xff && AlpaToLoopId[alpa] != 0xff) + break; + + printf("Invalid answer, try again: "); + } + FCPortPage1.HardALPA = (U8)alpa; + + t = FCPortPage1.InitiatorDeviceTimeout; + if (t == 0) + t = 60; + if (t & MPI_FCPORTPAGE1_INITIATOR_DEV_UNIT_16) + t = (t & ~MPI_FCPORTPAGE1_INITIATOR_DEV_UNIT_16) * 16; + printf("Initiator Device Timeout: [0 to 2047, default is %d] ", t); + t = getNumberAnswer(0, 2047, t); + if (t >= MPI_FCPORTPAGE1_INITIATOR_DEV_UNIT_16) + t = (t / 16) | MPI_FCPORTPAGE1_INITIATOR_DEV_UNIT_16; + if (t == 60) + t = 0; + FCPortPage1.InitiatorDeviceTimeout = t; + + t = FCPortPage1.InitiatorIoPendTimeout; + if (t == 0) + t = 8; + printf("Initiator I/O Pending Timeout: [0 to 127, default is %d] ", t); + t = getNumberAnswer(0, 127, t); + if (t == 8) + t = 0; + FCPortPage1.InitiatorIoPendTimeout = t; + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 4, 0, &FCPortPage4, sizeof FCPortPage4) != 1) + return 0; + + settings = get32(FCPortPage4.PortSettings); + + t = settings & MPI_FCPORTPAGE4_PORT_MASK_INIT_HBA; + printf("Enable booting under EFI BIOS: [Yes or No, default is %s] ", + t != MPI_FCPORTPAGE4_PORT_DISABLE_INIT_HBA ? "Yes" : "No"); + if (getYesNoAnswer(t != MPI_FCPORTPAGE4_PORT_DISABLE_INIT_HBA) == 0) + t = MPI_FCPORTPAGE4_PORT_DISABLE_INIT_HBA; + else if (t == MPI_FCPORTPAGE4_PORT_DISABLE_INIT_HBA) + t = MPI_FCPORTPAGE4_PORT_BIOS_OS_INIT_HBA; + + FCPortPage4.PortSettings = set32((settings & ~MPI_FCPORTPAGE4_PORT_MASK_INIT_HBA) | t); + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 4, 0, &FCPortPage4, sizeof FCPortPage4) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doFcChangeWwn(MPT_PORT *port) +{ + ManufacturingPage3_t *ManufacturingPage3; + int length; + int t; + U32 *p; + U32 wwnn_l; + U32 wwnn_h; + U32 wwpn_l; + U32 wwpn_h; + + ManufacturingPage3 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, &length); + if (ManufacturingPage3 == NULL) + return 0; + + p = (U32 *)ManufacturingPage3 + 2 + port->iocNumber * 8; + + wwnn_l = get32x(p[2]); + wwnn_h = get32x(p[3]); + wwpn_l = get32x(p[0]); + wwpn_h = get32x(p[1]); + + printf("Current FC WWNN = %08x%08x, WWPN = %08x%08x\n\n", wwnn_h, wwnn_l, wwpn_h, wwpn_l); + + printf("Enter new WWNN: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwnn_h, &wwnn_l); + if (t == 0) + { + free(ManufacturingPage3); + return 1; + } + + printf("Enter new WWPN: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwpn_h, &wwpn_l); + if (t == 0) + { + free(ManufacturingPage3); + return 1; + } + + p[2] = set32x(wwnn_l); + p[3] = set32x(wwnn_h); + p[0] = set32x(wwpn_l); + p[1] = set32x(wwpn_h); + + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + t = setConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, ManufacturingPage3, length); + + doIocInit(port, port->whoInit); + + free(ManufacturingPage3); + + if (t != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doSasPhyOnOffline(MPT_PORT *port, int onoff) +{ + SasDevicePage0_t SASDevicePage0; + SasExpanderPage0_t SASExpanderPage0; + SasExpanderPage1_t SASExpanderPage1; + SasIOUnitPage1_t *SASIOUnitPage1; + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + int length; + int handle; + int phy; + int min_phy; + int max_phy; + int dev_info; + int dev_type; + unsigned char phy_control_req[40]; + unsigned char phy_control_rsp[4]; + int parent; + int attached; + int t; + + printf("Enter handle: [0000-FFFF or RETURN to quit] "); + handle = getNumberAnswerHex(0x0000, 0xffff, -1); + if (handle < 0) + return 0; + + if (handle == 0) + { + min_phy = 0; + max_phy = port->numPhys - 1; + parent = 0; + } + else + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, + (MPI_SAS_DEVICE_PGAD_FORM_HANDLE + <PhyData[phy].PhyFlags &= ~MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + else + SASIOUnitPage1->PhyData[phy].PhyFlags |= MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + } + else + { + if (onoff) + SASIOUnitPage1->PhyData[phy].PhyFlags &= ~MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + else + SASIOUnitPage1->PhyData[phy].PhyFlags |= MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + } + + t = setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, + MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0, SASIOUnitPage1, length); + + free(SASIOUnitPage1); + + if (t != 1) + { + printf("Failed to write changes!\n"); + return 0; + } + + if (!onoff) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + req.Operation = MPI_SAS_OP_PHY_LINK_RESET; + req.PhyNum = phy; + + doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); + } + } + else + { + if (!onoff && yesFlag == FALSE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 1, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM + <NumPhys; + + t = SASIOUnitPage1->SATAMaxQDepth; + printf("SATA Maximum Queue Depth: [0 to 255, default is %d] ", t); + t = getNumberAnswer(0, 255, t); + SASIOUnitPage1->SATAMaxQDepth = t; + + if (mpi2) + { + SASIOUnitPage1_2 = (pMpi2SasIOUnitPage1_t)SASIOUnitPage1; + + t = get16(SASIOUnitPage1_2->SASNarrowMaxQueueDepth); + printf("SAS Max Queue Depth, Narrow: [0 to 65535, default is %d] ", t); + t = getNumberAnswer(0, 65535, t); + SASIOUnitPage1_2->SASNarrowMaxQueueDepth = set16(t); + + t = get16(SASIOUnitPage1_2->SASWideMaxQueueDepth); + printf("SAS Max Queue Depth, Wide: [0 to 65535, default is %d] ", t); + t = getNumberAnswer(0, 65535, t); + SASIOUnitPage1_2->SASWideMaxQueueDepth = set16(t); + } + + t = SASIOUnitPage1->ReportDeviceMissingDelay; + if (t & MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) + t = (t & ~MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) * 16; + printf("Device Missing Report Delay: [0 to 2047, default is %d] ", t); + t = getNumberAnswer(0, 2047, t); + if (t >= MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) + t = (t / 16) | MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16; + SASIOUnitPage1->ReportDeviceMissingDelay = t; + + t = SASIOUnitPage1->IODeviceMissingDelay; + printf("Device Missing I/O Delay: [0 to 255, default is %d] ", t); + t = getNumberAnswer(0, 127, t); + SASIOUnitPage1->IODeviceMissingDelay = t; + + while (TRUE) + { + printf("\nPhyNum Link MinRate MaxRate Initiator Target Port\n"); + for (i = 0; i < num_phys; i++) + { + if (mpi2) + flags = SASIOUnitPage1->PhyData[i].PhyFlags & MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + else + flags = SASIOUnitPage1->PhyData[i].PhyFlags & MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + min = SASIOUnitPage1->PhyData[i].MaxMinLinkRate & MPI_SAS_IOUNIT1_MIN_RATE_MASK; + max = SASIOUnitPage1->PhyData[i].MaxMinLinkRate & MPI_SAS_IOUNIT1_MAX_RATE_MASK; + dev_info = get32(SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo); + if (SASIOUnitPage1->PhyData[i].PortFlags & MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG) + sprintf(sas_port, "Auto"); + else + sprintf(sas_port, " %d ", SASIOUnitPage1->PhyData[i].Port); + printf(" %2d %s %s %s %s %s %s\n", i, + flags ? "Disabled" : "Enabled ", + min == MPI25_SASIOUNIT1_MIN_RATE_12_0 ? "12.0" : + min == MPI2_SASIOUNIT1_MIN_RATE_6_0 ? "6.0" : + min == MPI_SAS_IOUNIT1_MIN_RATE_3_0 ? "3.0" : "1.5", + max == MPI25_SASIOUNIT1_MAX_RATE_12_0 ? "12.0" : + max == MPI2_SASIOUNIT1_MAX_RATE_6_0 ? "6.0" : + max == MPI_SAS_IOUNIT1_MAX_RATE_3_0 ? "3.0" : "1.5", + dev_info & MPI_SAS_DEVICE_INFO_SSP_INITIATOR ? "Enabled " : "Disabled", + dev_info & MPI_SAS_DEVICE_INFO_SSP_TARGET ? "Enabled " : "Disabled", + sas_port); + } + printf("\nSelect a Phy: [0-%d, %d=AllPhys, RETURN to quit] ", num_phys - 1, num_phys); + i = getNumberAnswer(0, num_phys, -1); + + if (i < 0) + break; + + if (i < num_phys) + { + if (mpi2) + flags = SASIOUnitPage1->PhyData[i].PhyFlags & MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + else + flags = SASIOUnitPage1->PhyData[i].PhyFlags & MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + min = SASIOUnitPage1->PhyData[i].MaxMinLinkRate & MPI_SAS_IOUNIT1_MIN_RATE_MASK; + max = SASIOUnitPage1->PhyData[i].MaxMinLinkRate & MPI_SAS_IOUNIT1_MAX_RATE_MASK; + dev_info = get32(SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo); + + t = flags == 0; + printf("Link: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (mpi2) + { + if (t == 1) + SASIOUnitPage1->PhyData[i].PhyFlags &= ~MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + else + SASIOUnitPage1->PhyData[i].PhyFlags |= MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + } + else + { + if (t == 1) + SASIOUnitPage1->PhyData[i].PhyFlags &= ~MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + else + SASIOUnitPage1->PhyData[i].PhyFlags |= MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + } + + switch (min) + { + default: + case MPI_SAS_IOUNIT1_MIN_RATE_1_5: t = 0; break; + case MPI_SAS_IOUNIT1_MIN_RATE_3_0: t = 1; break; + case MPI2_SASIOUNIT1_MIN_RATE_6_0: t = 2; break; + case MPI25_SASIOUNIT1_MIN_RATE_12_0: t = 3; break; + } + if (mpi20) + { + printf("MinRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, default is %d] ", t); + t = getNumberAnswer(0, 2, t); + } + else if (mpi25) + { + printf("MinRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, 3=12.0 Gbps, default is %d] ", t); + t = getNumberAnswer(0, 3, t); + } + else + { + printf("MinRate: [0=1.5 Gbps, 1=3.0 Gbps, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + } + switch (t) + { + case 0: min = MPI_SAS_IOUNIT1_MIN_RATE_1_5; break; + case 1: min = MPI_SAS_IOUNIT1_MIN_RATE_3_0; break; + case 2: min = MPI2_SASIOUNIT1_MIN_RATE_6_0; break; + case 3: min = MPI25_SASIOUNIT1_MIN_RATE_12_0; break; + } + SASIOUnitPage1->PhyData[i].MaxMinLinkRate &= ~MPI_SAS_IOUNIT1_MIN_RATE_MASK; + SASIOUnitPage1->PhyData[i].MaxMinLinkRate |= min; + + switch (max) + { + default: + case MPI_SAS_IOUNIT1_MAX_RATE_1_5: t = 0; break; + case MPI_SAS_IOUNIT1_MAX_RATE_3_0: t = 1; break; + case MPI2_SASIOUNIT1_MAX_RATE_6_0: t = 2; break; + case MPI25_SASIOUNIT1_MAX_RATE_12_0: t = 3; break; + } + if (mpi20) + { + printf("MaxRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, default is %d] ", t); + t = getNumberAnswer(0, 2, t); + } + else if (mpi25) + { + printf("MaxRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, 3=12.0 Gbps, default is %d] ", t); + t = getNumberAnswer(0, 3, t); + } + else + { + printf("MaxRate: [0=1.5 Gbps, 1=3.0 Gbps, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + } + switch (t) + { + case 0: max = MPI_SAS_IOUNIT1_MAX_RATE_1_5; break; + case 1: max = MPI_SAS_IOUNIT1_MAX_RATE_3_0; break; + case 2: max = MPI2_SASIOUNIT1_MAX_RATE_6_0; break; + case 3: max = MPI25_SASIOUNIT1_MAX_RATE_12_0; break; + } + SASIOUnitPage1->PhyData[i].MaxMinLinkRate &= ~MPI_SAS_IOUNIT1_MAX_RATE_MASK; + SASIOUnitPage1->PhyData[i].MaxMinLinkRate |= max; + + t = (dev_info & MPI_SAS_DEVICE_INFO_SSP_INITIATOR) != 0; + printf("Initiator: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + dev_info |= (MPI_SAS_DEVICE_INFO_SSP_INITIATOR | + MPI_SAS_DEVICE_INFO_STP_INITIATOR | + MPI_SAS_DEVICE_INFO_SMP_INITIATOR); + else + dev_info &= ~(MPI_SAS_DEVICE_INFO_SSP_INITIATOR | + MPI_SAS_DEVICE_INFO_STP_INITIATOR | + MPI_SAS_DEVICE_INFO_SMP_INITIATOR); + + t = (dev_info & MPI_SAS_DEVICE_INFO_SSP_TARGET) != 0; + printf("Target: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + dev_info |= MPI_SAS_DEVICE_INFO_SSP_TARGET; + else + dev_info &= ~MPI_SAS_DEVICE_INFO_SSP_TARGET; + + SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo = set32(dev_info); + + if (SASIOUnitPage1->PhyData[i].PortFlags & MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG) + t = num_phys; + else + t = SASIOUnitPage1->PhyData[i].Port; + printf("Port: [0 to %d for manual config, %d for auto config, default is %d] ", + num_phys - 1, num_phys, t); + t = getNumberAnswer(0, num_phys, t); + if (t == num_phys) + { + SASIOUnitPage1->PhyData[i].PortFlags |= MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG; + SASIOUnitPage1->PhyData[i].Port = 0; + } + else + { + SASIOUnitPage1->PhyData[i].PortFlags &= ~MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG; + SASIOUnitPage1->PhyData[i].Port = t; + } + } + else + { + printf("Link: [0=Disabled, 1=Enabled, or RETURN to not change] "); + flags = getNumberAnswer(0, 1, -1); + + if (mpi20) + { + printf("MinRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, or RETURN to not change] "); + min = getNumberAnswer(0, 2, -1); + + printf("MaxRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, or RETURN to not change] "); + max = getNumberAnswer(0, 2, -1); + } + if (mpi25) + { + printf("MinRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, 3=12.0 Gbps, or RETURN to not change] "); + min = getNumberAnswer(0, 3, -1); + + printf("MaxRate: [0=1.5 Gbps, 1=3.0 Gbps, 2=6.0 Gbps, 3=12.0 Gpbs, or RETURN to not change] "); + max = getNumberAnswer(0, 3, -1); + } + else + { + printf("MinRate: [0=1.5 Gbps, 1=3.0 Gbps, or RETURN to not change] "); + min = getNumberAnswer(0, 1, -1); + + printf("MaxRate: [0=1.5 Gbps, 1=3.0 Gbps, or RETURN to not change] "); + max = getNumberAnswer(0, 1, -1); + } + switch (min) + { + case 0: min = MPI_SAS_IOUNIT1_MIN_RATE_1_5; break; + case 1: min = MPI_SAS_IOUNIT1_MIN_RATE_3_0; break; + case 2: min = MPI2_SASIOUNIT1_MIN_RATE_6_0; break; + case 3: min = MPI25_SASIOUNIT1_MIN_RATE_12_0; break; + } + switch (max) + { + case 0: max = MPI_SAS_IOUNIT1_MAX_RATE_1_5; break; + case 1: max = MPI_SAS_IOUNIT1_MAX_RATE_3_0; break; + case 2: max = MPI2_SASIOUNIT1_MAX_RATE_6_0; break; + case 3: max = MPI25_SASIOUNIT1_MAX_RATE_12_0; break; + } + + printf("Initiator: [0=Disabled, 1=Enabled, or RETURN to not change] "); + init = getNumberAnswer(0, 1, -1); + + printf("Target: [0=Disabled, 1=Enabled, or RETURN to not change] "); + targ = getNumberAnswer(0, 1, -1); + if (t == 1) + dev_info |= MPI_SAS_DEVICE_INFO_SSP_TARGET; + + printf("Port configuration: [1=Auto, 2=Narrow, 3=Wide, or RETURN to not change] "); + port_config = getNumberAnswer(0, 3, -1); + + for (i = 0; i < num_phys; i++) + { + if (mpi2) + { + if (flags == 0) + SASIOUnitPage1->PhyData[i].PhyFlags |= MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + if (flags == 1) + SASIOUnitPage1->PhyData[i].PhyFlags &= ~MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + } + else + { + if (flags == 0) + SASIOUnitPage1->PhyData[i].PhyFlags |= MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + if (flags == 1) + SASIOUnitPage1->PhyData[i].PhyFlags &= ~MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + } + + if (min != -1) + { + SASIOUnitPage1->PhyData[i].MaxMinLinkRate &= ~MPI_SAS_IOUNIT1_MIN_RATE_MASK; + SASIOUnitPage1->PhyData[i].MaxMinLinkRate |= min; + } + + if (max != -1) + { + SASIOUnitPage1->PhyData[i].MaxMinLinkRate &= ~MPI_SAS_IOUNIT1_MAX_RATE_MASK; + SASIOUnitPage1->PhyData[i].MaxMinLinkRate |= max; + } + + t = get32(SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo); + if (init == 0) + t &= ~(MPI_SAS_DEVICE_INFO_SSP_INITIATOR | + MPI_SAS_DEVICE_INFO_STP_INITIATOR | + MPI_SAS_DEVICE_INFO_SMP_INITIATOR); + if (init == 1) + t |= (MPI_SAS_DEVICE_INFO_SSP_INITIATOR | + MPI_SAS_DEVICE_INFO_STP_INITIATOR | + MPI_SAS_DEVICE_INFO_SMP_INITIATOR); + if (targ == 0) + t &= ~MPI_SAS_DEVICE_INFO_SSP_TARGET; + if (targ == 1) + t |= MPI_SAS_DEVICE_INFO_SSP_TARGET; + SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo = set32(t); + + if (port_config == 1) + { + SASIOUnitPage1->PhyData[i].PortFlags |= MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG; + SASIOUnitPage1->PhyData[i].Port = 0; + } + if (port_config == 2) + { + SASIOUnitPage1->PhyData[i].PortFlags &= ~MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG; + SASIOUnitPage1->PhyData[i].Port = i; + } + if (port_config == 3) + { + SASIOUnitPage1->PhyData[i].PortFlags &= ~MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG; + SASIOUnitPage1->PhyData[i].Port = i / 4; + } + } + } + } + + if (setConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0, SASIOUnitPage1, length) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(SASIOUnitPage1); + return 0; + } + + if (mpi1) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 2, 0, + &SASIOUnitPage2, sizeof SASIOUnitPage2) != 1) + { + free(SASIOUnitPage1); + return 0; + } + + flags = SASIOUnitPage2.Flags; + + t = (flags & MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS) == 0; + printf("\nPersistence: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + flags &= ~MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS; + else + flags |= MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS; + + t = (flags & MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE) >> MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE; + printf("Physical mapping: [0=None, 1=DirectAttach, 2=EnclosureSlot, default is %d] ", t); + t = getNumberAnswer(0, 2, t); + flags &= ~MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE; + flags |= t << MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE; + + SASIOUnitPage2.Flags = flags; + + if (t != MPI_SAS_IOUNIT2_FLAGS_NO_PHYS_MAP) + { + t = get16(SASIOUnitPage2.MaxNumPhysicalMappedIDs); + if (t == 0) + t = num_phys; + if (t > 32) + t = 32; + printf("Number of Target IDs to reserve: [0 to 32, default is %d] ", t); + t = getNumberAnswer(0, 32, t); + + SASIOUnitPage2.MaxNumPhysicalMappedIDs = set16(t); + } + + if (setConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 2, 0, + &SASIOUnitPage2, sizeof SASIOUnitPage2) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(SASIOUnitPage1); + return 0; + } + } + + free(SASIOUnitPage1); + + return 1; +} + + +int +doSasChangeWwid(MPT_PORT *port, int checkZero) +{ + ManufacturingPage5_t *ManufacturingPage5; + Mpi2ManufacturingPage5_t *ManufacturingPage5_2; + int length; + int t; + int i; + U32 wwid_l; + U32 wwid_h; + + ManufacturingPage5 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 5, 0, &length); + if (ManufacturingPage5 == NULL) + return 0; + + ManufacturingPage5_2 = (pMpi2ManufacturingPage5_t)ManufacturingPage5; + + if (mpi2) + { + wwid_l = get32(ManufacturingPage5_2->Phy[0].WWID.Low); + wwid_h = get32(ManufacturingPage5_2->Phy[0].WWID.High); + } + else + { + wwid_l = get32(ManufacturingPage5->BaseWWID.Low); + wwid_h = get32(ManufacturingPage5->BaseWWID.High); + } + + if (checkZero) + { + free(ManufacturingPage5); + + return wwid_l == 0 && wwid_h == 0; + } + + printf("Current SAS WWID = %08x%08x\n\n", wwid_h, wwid_l); + + printf("Enter new WWID: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwid_h, &wwid_l); + if (t == 0) + { + free(ManufacturingPage5); + return 0; + } + + if (mpi2) + { + for(i = 0; i < port->numPhys; i++) + { + ManufacturingPage5_2->Phy[i].WWID.Low = set32(wwid_l + i); + ManufacturingPage5_2->Phy[i].WWID.High = set32(wwid_h); + } + } + else + { + ManufacturingPage5->BaseWWID.Low = set32(wwid_l); + ManufacturingPage5->BaseWWID.High = set32(wwid_h); + } + + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + t = setConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 5, 0, ManufacturingPage5, length); + + doIocInit(port, port->whoInit); + + free(ManufacturingPage5); + + if (t != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doIoUnitSettings(MPT_PORT *port) +{ + IOUnitPage1_t IOUnitPage1; + int flags; + int t; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 1, 0, &IOUnitPage1, sizeof IOUnitPage1) != 1) + return 0; + + flags = get32(IOUnitPage1.Flags); + + t = (flags & MPI_IOUNITPAGE1_MULTI_PATHING) != 0; + printf("Multi-pathing: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 0) + flags &= ~MPI_IOUNITPAGE1_MULTI_PATHING; + else + flags |= MPI_IOUNITPAGE1_MULTI_PATHING; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + t = (flags & MPI_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE) == 0; + printf("SATA Native Command Queuing: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + flags &= ~MPI_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE; + else + flags |= MPI_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE; + + t = (flags & MPI_IOUNITPAGE1_SATA_WRITE_CACHE_DISABLE) == 0; + printf("SATA Write Caching: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + flags &= ~MPI_IOUNITPAGE1_SATA_WRITE_CACHE_DISABLE; + else + flags |= MPI_IOUNITPAGE1_SATA_WRITE_CACHE_DISABLE; + } + + IOUnitPage1.Flags = set32(flags); + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 1, 0, &IOUnitPage1, sizeof IOUnitPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doFcPersistentMappings(MPT_PORT *port, int command) +{ + FCPortPage1_t FCPortPage1; + FCPortPage3_t *FCPortPage3; + FCDevicePage0_t FCDevicePage0; + int sort_by_did; + int do_by_entry; + int i; + int j; + int loop_id; + int t; + int flags; + int bus; + int target; + int b_t; + int n; + int *changed; + int n_changed; + char *type; + int d_id = 0; + U32 wwnn_l; + U32 wwnn_h; + U32 wwpn_l; + U32 wwpn_h; + + if (bringOnline(port) != 1) + return 0; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + sort_by_did = get32(FCPortPage1.Flags) & MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID; + + n = port->maxPersistentIds * sizeof(PersistentData_t) + sizeof(ConfigPageHeader_t); + FCPortPage3 = (pFCPortPage3_t)malloc(n); + changed = (int *)malloc(port->maxPersistentIds * sizeof *changed); + + if (n > 255 * 4) + { + FCPortPage3_t tempFCPortPage3; + + do_by_entry = 1; + + for (i = 0; i < port->maxPersistentIds; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 3, + MPI_FC_PORT_PGAD_FORM_INDEX + i, + &tempFCPortPage3, sizeof tempFCPortPage3) != 1) + { + free(FCPortPage3); + free(changed); + return 0; + } + + FCPortPage3->Entry[i] = tempFCPortPage3.Entry[0]; + } + + FCPortPage3->Header = tempFCPortPage3.Header; + + n = port->maxPersistentIds; + } + else + { + do_by_entry = 0; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 3, 0, FCPortPage3, n) != 1) + { + free(FCPortPage3); + free(changed); + return 0; + } + + n = (FCPortPage3->Header.PageLength * 4 - sizeof(ConfigPageHeader_t)) / sizeof(PersistentData_t); + } + memset(changed, 0, port->maxPersistentIds * sizeof *changed); + n_changed = 0; + + if (command == 1 || command == 4 || command == 5) + { + j = 0; + for (i = 0; i < n; i++) + { + flags = get16(FCPortPage3->Entry[i].Flags); + if (flags & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + { + j++; + if (flags & MPI_PERSISTENT_FLAGS_BY_DID) + { + printf("Persistent entry %d is valid, Bus %d Target %d is DID %06x\n", i, + FCPortPage3->Entry[i].Bus, + FCPortPage3->Entry[i].TargetID, + get32(FCPortPage3->Entry[i].PhysicalIdentifier.Did)); + if (!sort_by_did) + printf(" Since the port is in SortByWWN mode, this entry is being ignored\n"); + } + else + { + printf("Persistent entry %d is valid, Bus %d Target %d is WWN %08x%08x\n", i, + FCPortPage3->Entry[i].Bus, + FCPortPage3->Entry[i].TargetID, + get32(FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.High), + get32(FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.Low)); + if (sort_by_did) + printf(" Since the port is in SortByDID mode, this entry is being ignored\n"); + } + if (command == 5) + { + printf(" Delete the entry for this target? [Yes or No, default is No] "); + if (getYesNoAnswer(0) != 1) + continue; + } + if (command == 4 || command == 5) + { + printf(" Deleting persistent entry %d\n", i); + flags &= ~MPI_PERSISTENT_FLAGS_ENTRY_VALID; + FCPortPage3->Entry[i].Flags = set16(flags); + changed[i] = 1; + n_changed++; + } + } + } + + if (j == 0) + printf("No persistent entries found\n"); + } + + if (command == 2 || command == 3) + { + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + b_t = (bus << 8) + target; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, + MPI_FC_DEVICE_PGAD_FORM_BUS_TID + b_t, + &FCDevicePage0, sizeof FCDevicePage0) != 1) + continue; + + if (sort_by_did) + printf("Bus %d Target %d is DID %06x\n", bus, target, + get32(FCDevicePage0.PortIdentifier)); + else + printf("Bus %d Target %d is WWN %08x%08x\n", bus, target, + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low)); + for (i = 0; i < n; i++) + { + if (get16(FCPortPage3->Entry[i].Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + { + if (FCPortPage3->Entry[i].Bus != bus || + FCPortPage3->Entry[i].TargetID != target) + { + continue; + } + + if (sort_by_did) + { + if (FCPortPage3->Entry[i].PhysicalIdentifier.Did == FCDevicePage0.PortIdentifier) + { + break; + } + } + else + { + if (FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.High == FCDevicePage0.WWPN.High && + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.Low == FCDevicePage0.WWPN.Low && + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWNN.High == FCDevicePage0.WWNN.High && + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWNN.Low == FCDevicePage0.WWNN.Low) + { + break; + } + } + } + } + if (i < n) + { + printf(" Persistent entry %d is already valid for this target!\n", i); + continue; + } + + for (i = 0; i < n; i++) + { + if (!(get16(FCPortPage3->Entry[i].Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID)) + { + break; + } + } + if (i < n) + { + if (command == 3) + { + printf(" Add an entry for this target? [Yes or No, default is No] "); + if (getYesNoAnswer(0) != 1) + continue; + } + + printf(" Adding persistent entry %d\n", i); + + flags = MPI_PERSISTENT_FLAGS_ENTRY_VALID | + MPI_PERSISTENT_FLAGS_SCAN_ID | + MPI_PERSISTENT_FLAGS_SCAN_LUNS; + FCPortPage3->Entry[i].Flags = set16(flags); + FCPortPage3->Entry[i].Bus = bus; + FCPortPage3->Entry[i].TargetID = target; + if (sort_by_did) + { + flags |= MPI_PERSISTENT_FLAGS_BY_DID; + FCPortPage3->Entry[i].Flags = set16(flags); + FCPortPage3->Entry[i].PhysicalIdentifier.Did = FCDevicePage0.PortIdentifier; + } + else + { + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.High = FCDevicePage0.WWPN.High; + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.Low = FCDevicePage0.WWPN.Low; + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWNN.High = FCDevicePage0.WWNN.High; + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWNN.Low = FCDevicePage0.WWNN.Low; + } + changed[i] = 1; + n_changed++; + } + else + { + printf(" No persistent entry available for this target!\n"); + } + } + } + } + + if (command == 6) + { + if (sort_by_did) + { + printf("The port is in SortByDID mode, enter Port IDs\n"); + type = "DID"; + } + else + { + printf("The port is in SortByWWN mode, enter World Wide Node and Port Names\n"); + type = "WWN"; + } + + for (i = 0; i < n; i++) + { + if (get16(FCPortPage3->Entry[i].Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + continue; + + printf("\n"); + + if (sort_by_did) + { + printf("Enter DID: [000000-FFFFFF or RETURN to quit] "); + d_id = getNumberAnswerHex(0x000000, 0xFFFFFF, -1); + if (d_id < 0) + break; + } + else + { + printf("Enter WWNN: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwnn_h, &wwnn_l); + if (t == 0) + break; + + printf("Enter WWPN: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwpn_h, &wwpn_l); + if (t == 0) + break; + } + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Enter desired Bus for this %s: [0-%d or RETURN to quit] ", type, port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + break; + } + else + { + bus = 0; + } + + printf("Enter desired Target for this %s: [0-%d or RETURN to quit] ", type, port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + break; + + for (j = 0; j < n; j++) + { + if (i == j) + continue; + + if (get16(FCPortPage3->Entry[j].Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + { + if (sort_by_did) + { + if (get32(FCPortPage3->Entry[j].PhysicalIdentifier.Did) == (U32)d_id) + { + printf("\nPersistent entry %d is already valid for this DID!\n", j); + break; + } + } + else + { + if (get32(FCPortPage3->Entry[j].PhysicalIdentifier.WWN.WWPN.High) == wwpn_h && + get32(FCPortPage3->Entry[j].PhysicalIdentifier.WWN.WWPN.Low) == wwpn_l && + get32(FCPortPage3->Entry[j].PhysicalIdentifier.WWN.WWNN.High) == wwnn_h && + get32(FCPortPage3->Entry[j].PhysicalIdentifier.WWN.WWNN.Low) == wwnn_l) + { + printf("\nPersistent entry %d is already valid for this WWN!\n", j); + break; + } + } + + if (FCPortPage3->Entry[j].Bus == bus && + FCPortPage3->Entry[j].TargetID == target) + { + printf("\nPersistent entry %d is already valid for this Bus & Target!\n", j); + break; + } + } + } + if (j < n) + { + i--; + continue; + } + + printf("\nAdding persistent entry %d\n", i); + + flags = MPI_PERSISTENT_FLAGS_ENTRY_VALID | + MPI_PERSISTENT_FLAGS_SCAN_ID | + MPI_PERSISTENT_FLAGS_SCAN_LUNS; + FCPortPage3->Entry[i].Flags = set16(flags); + FCPortPage3->Entry[i].Bus = bus; + FCPortPage3->Entry[i].TargetID = target; + if (sort_by_did) + { + flags |= MPI_PERSISTENT_FLAGS_BY_DID; + FCPortPage3->Entry[i].Flags = set16(flags); + FCPortPage3->Entry[i].PhysicalIdentifier.Did = set32(d_id); + } + else + { + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.High = set32(wwpn_h); + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWPN.Low = set32(wwpn_l); + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWNN.High = set32(wwnn_h); + FCPortPage3->Entry[i].PhysicalIdentifier.WWN.WWNN.Low = set32(wwnn_l); + } + changed[i] = 1; + n_changed++; + } + } + + if (command == 7) + { + if (!sort_by_did) + { + printf("The port is not in SortByDID mode!\n"); + + printf("\nDo you want to switch to SortByDID mode? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) == 1) + { + flags = get32(FCPortPage1.Flags); + flags |= MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID; + FCPortPage1.Flags = set32(flags); + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(FCPortPage3); + free(changed); + return 0; + } + else + { + sort_by_did = 1; + printf("\n"); + } + } + } + + loop_id = 0; + for (i = 0; i < n; i++) + { + if (get16(FCPortPage3->Entry[i].Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + continue; + + d_id = LoopIdToAlpa[loop_id]; + bus = 0; + target = loop_id; + + t = n; + for (j = 0; j < n; j++) + { + if (i == j) + continue; + + if (get16(FCPortPage3->Entry[j].Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + { + if (get32(FCPortPage3->Entry[j].PhysicalIdentifier.Did) == (U32)d_id && + FCPortPage3->Entry[j].Bus == bus && + FCPortPage3->Entry[j].TargetID == target) + { + printf("Persistent entry %d exists for LoopID %d: Bus %d Target %d is DID %02x\n", + j, loop_id, bus, target, d_id); + t = j; + break; + } + else + { + if (get32(FCPortPage3->Entry[j].PhysicalIdentifier.Did) == (U32)d_id) + { + printf("\nPersistent entry %d is already valid for DID %02x!\n", j, d_id); + break; + } + + if (FCPortPage3->Entry[j].Bus == bus && + FCPortPage3->Entry[j].TargetID == target) + { + printf("\nPersistent entry %d is already valid for Bus %d Target %d!\n", j, bus, target); + break; + } + } + } + } + if (j < n) + { + if (t == n) + { + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + break; + + printf("\n"); + } + i--; + } + else + { + printf("Adding persistent entry %d for LoopID %d: Bus %d Target %d is DID %02x\n", + i, loop_id, bus, target, d_id); + + flags = MPI_PERSISTENT_FLAGS_ENTRY_VALID | + MPI_PERSISTENT_FLAGS_SCAN_ID | + MPI_PERSISTENT_FLAGS_SCAN_LUNS | + MPI_PERSISTENT_FLAGS_BY_DID; + FCPortPage3->Entry[i].Flags = set16(flags); + FCPortPage3->Entry[i].Bus = bus; + FCPortPage3->Entry[i].TargetID = target; + FCPortPage3->Entry[i].PhysicalIdentifier.Did = set32(d_id); + changed[i] = 1; + n_changed++; + } + + loop_id++; + if (loop_id == 126) + break; + } + } + + if (n_changed != 0) + { + if (do_by_entry) + { + FCPortPage3_t tempFCPortPage3; + + tempFCPortPage3.Header = FCPortPage3->Header; + + for (i = 0; i < port->maxPersistentIds; i++) + { + if (changed[i]) + { + tempFCPortPage3.Entry[0] = FCPortPage3->Entry[i]; + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 3, + MPI_FC_PORT_PGAD_FORM_INDEX + i, + &tempFCPortPage3, sizeof tempFCPortPage3) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(FCPortPage3); + free(changed); + return 0; + } + } + } + } + else + { + n = FCPortPage3->Header.PageLength * 4; + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 3, 0, FCPortPage3, n) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + free(FCPortPage3); + free(changed); + return 0; + } + } + } + + free(FCPortPage3); + free(changed); + + return 1; +} + + +int +doSasPersistentMappings(MPT_PORT *port, int command) +{ + ConfigReply_t configRep; + SasDevicePage2_t *SASDevicePage2; + SasDevicePage2_t tempSASDevicePage2; + SasIOUnitPage2_t SASIOUnitPage2; + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + int flags; + int encl_slot; + int start_slot; + int num_slots; + U32 encl_id_l; + U32 encl_id_h; + int i; + int j; + int k; + int t; + int bus; + int target; + int b_t; + int max_b_t; + int n; + int *changed; + int n_changed; + int *i_to_b_t; + int old_i; + char name[256]; + FILE *file; + unsigned char *mappingBuf = NULL; + int mappingLen; + char *c; + U32 phys_id_l; + U32 phys_id_h; + U32 encl_map; + int warn = 0; + + if (bringOnline(port) != 1) + return 0; + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 2, 0, + &SASIOUnitPage2, sizeof SASIOUnitPage2) != 1) + return 0; + + flags = SASIOUnitPage2.Flags; + + encl_slot = (flags & MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE) == + (MPI_SAS_IOUNIT2_FLAGS_ENCLOSURE_SLOT_PHYS_MAP << MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE); + + if (command == 10 || command == 11) + { + if (flags & MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS) + { + printf("Persistent mapping is disabled, no entries will be cleared\n"); + return 1; + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + + if (command == 10) + { + req.Operation = MPI_SAS_OP_CLEAR_ALL_PERSISTENT; + + printf("Clearing all persistent entries...\n"); + } + if (command == 11) + { + req.Operation = MPI_SAS_OP_CLEAR_NOT_PRESENT; + + printf("Clearing all non-present persistent entries...\n"); + } + + t = doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); + + if (t != 1) + printf("Clear failed!\n"); + + if (wFlag) + fprintf(logFile, "%s: Clear (SAS_IO_UNIT_CONTROL) of type %d: %s\n", + logPrefix(port), command, t ? "PASS" : "FAIL"); + + return t; + } + + if (command == 12) + { + t = (flags & MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS) == 0; + printf("Persistence: [0=Disabled, 1=Enabled, default is %d] ", t); + t = getNumberAnswer(0, 1, t); + if (t == 1) + flags &= ~MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS; + else + flags |= MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS; + + SASIOUnitPage2.Flags = flags; + + if (setConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 2, 0, + &SASIOUnitPage2, sizeof SASIOUnitPage2) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; + } + + max_b_t = (port->maxBuses << 8) + port->maxTargets; + n = port->maxPersistentIds; + SASDevicePage2 = (pSasDevicePage2_t)malloc(n * sizeof *SASDevicePage2); + changed = (int *)malloc(n * sizeof *changed); + i_to_b_t = (int *)malloc(n * sizeof *i_to_b_t); + + if (getConfigPageHeader(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 2, 0, &configRep) != 1) + { + free(SASDevicePage2); + free(changed); + free(i_to_b_t); + return 0; + } + + memset(&tempSASDevicePage2, 0, sizeof tempSASDevicePage2); + tempSASDevicePage2.Header.ExtPageType = configRep.ExtPageType; + tempSASDevicePage2.Header.ExtPageLength = configRep.ExtPageLength; + tempSASDevicePage2.Header.PageType = configRep.Header.PageType; + tempSASDevicePage2.Header.PageNumber = configRep.Header.PageNumber; + tempSASDevicePage2.Header.PageVersion = configRep.Header.PageVersion; + + for (i = 0, j = 0; i < max_b_t && j < n; i++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 2, + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <> + MPI_SASDEVICE2_ENC_MAP_SHIFT_START_INDEX; + num_slots = (encl_map & MPI_SASDEVICE2_ENC_MAP_MASK_NUM_SLOTS) >> + MPI_SASDEVICE2_ENC_MAP_SHIFT_NUM_SLOTS; + if (num_slots == 1) + printf("Persistent entry %d is valid, EnclosureId %08x%08x, Slot %d\n", + i, + get32(SASDevicePage2[i].PhysicalIdentifier.High), + get32(SASDevicePage2[i].PhysicalIdentifier.Low), + start_slot); + else + printf("Persistent entry %d is valid, EnclosureId %08x%08x, Slots %d to %d\n", + i, + get32(SASDevicePage2[i].PhysicalIdentifier.High), + get32(SASDevicePage2[i].PhysicalIdentifier.Low), + start_slot, start_slot + num_slots - 1); + } + else + { + b_t = i_to_b_t[i]; + printf("Persistent entry %d is valid, Bus %d Target %d is PhysId %08x%08x\n", + i, b_t >> 8, b_t & 255, + get32(SASDevicePage2[i].PhysicalIdentifier.High), + get32(SASDevicePage2[i].PhysicalIdentifier.Low)); + } + if (command == 5) + { + printf(" Delete the entry for this %s? [Yes or No, default is No] ", + encl_slot ? "enclosure" : "target"); + if (getYesNoAnswer(0) != 1) + continue; + } + if (command == 4 || command == 5) + { + printf(" Deleting persistent entry\n"); + SASDevicePage2[i].PhysicalIdentifier.High = 0; + SASDevicePage2[i].PhysicalIdentifier.Low = 0; + SASDevicePage2[i].EnclosureMapping = 0; + changed[i] = 1; + n_changed++; + } + } + + if (j == 0) + printf("No persistent entries found\n"); + } + + if (command == 6) + { + while (j < n) + { + if (encl_slot) + { + printf("Enter current EnclosureId: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&encl_id_h, &encl_id_l); + if (t == 0) + break; + + k = 0; + for (i = 0; i < j; i++) + { + if (get32(SASDevicePage2[i].PhysicalIdentifier.High) == encl_id_h && + get32(SASDevicePage2[i].PhysicalIdentifier.Low) == encl_id_l) + { + printf("\nPersistent entry %d is valid for the current EnclosureId\n\n", i); + k++; + } + } + if (k == 0) + { + printf("\nNo persistent entries are valid for the current EnclosureId!\n\n"); + continue; + } + + old_i = i; + + printf("Enter desired EnclosureId: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&phys_id_h, &phys_id_l); + if (t == 0) + break; + + if (phys_id_h == encl_id_h && phys_id_l == encl_id_l) + { + printf("\nDesired EnclosureId is equal to Current EnclosureId!\n\n"); + continue; + } + + for (i = 0; i < j; i++) + { + if (get32(SASDevicePage2[i].PhysicalIdentifier.High) == phys_id_h && + get32(SASDevicePage2[i].PhysicalIdentifier.Low) == phys_id_l) + { + printf("\nPersistent entry %d is valid for the desired EnclosureId\n\n", i); + } + } + + for (i = 0; i < j; i++) + { + if (get32(SASDevicePage2[i].PhysicalIdentifier.High) == encl_id_h && + get32(SASDevicePage2[i].PhysicalIdentifier.Low) == encl_id_l) + { + printf("Modifying persistent entry %d!\n", i); + + SASDevicePage2[i].PhysicalIdentifier.High = set32(phys_id_h); + SASDevicePage2[i].PhysicalIdentifier.Low = set32(phys_id_l); + changed[i] = 1; + n_changed++; + continue; + } + + if (get32(SASDevicePage2[i].PhysicalIdentifier.High) == phys_id_h && + get32(SASDevicePage2[i].PhysicalIdentifier.Low) == phys_id_l) + { + printf("Deleting persistent entry %d!\n", i); + + SASDevicePage2[i].PhysicalIdentifier.High = 0; + SASDevicePage2[i].PhysicalIdentifier.Low = 0; + SASDevicePage2[i].EnclosureMapping = 0; + changed[i] = 1; + n_changed++; + continue; + } + } + + printf("\n"); + } + else + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Enter current Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + break; + } + else + { + bus = 0; + } + + printf("Enter current Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + break; + + b_t = (bus << 8) + target; + + for (i = 0; i < j; i++) + { + if (i_to_b_t[i] == b_t && + (SASDevicePage2[i].PhysicalIdentifier.High != 0 || + SASDevicePage2[i].PhysicalIdentifier.Low != 0)) + { +// printf("\nPersistent entry %d is valid for this Bus/Target\n\n", i); + break; + } + } + if (i == j) + { + printf("\nNo persistent entry is valid for this Bus/Target!\n\n"); + continue; + } + + old_i = i; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Enter desired Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + break; + } + else + { + bus = 0; + } + + printf("Enter desired Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + break; + + b_t = (bus << 8) + target; + + for (i = 0; i < j; i++) + { + if (i_to_b_t[i] == b_t && + (SASDevicePage2[i].PhysicalIdentifier.High != 0 || + SASDevicePage2[i].PhysicalIdentifier.Low != 0)) + { + if (i == old_i) + printf("\nDesired Bus/Target is equal to Current Bus/Target!\n\n"); + else + printf("\nPersistent entry %d is already valid for this Bus/Target!\n\n", i); + break; + } + } + if (i < j) + continue; + + printf("\nDeleting persistent entry %d!\n", old_i); + printf("Creating persistent entry %d!\n\n", j); + + printf("Persistent entry %d is valid, Bus %d Target %d is PhysId %08x%08x\n\n", + j, bus, target, + get32(SASDevicePage2[old_i].PhysicalIdentifier.High), + get32(SASDevicePage2[old_i].PhysicalIdentifier.Low)); + + SASDevicePage2[j] = SASDevicePage2[old_i]; + changed[j] = 1; + n_changed++; + i_to_b_t[j] = b_t; + j++; + + SASDevicePage2[old_i].PhysicalIdentifier.High = 0; + SASDevicePage2[old_i].PhysicalIdentifier.Low = 0; + SASDevicePage2[old_i].EnclosureMapping = 0; + changed[old_i] = 1; + n_changed++; + } + } + } + + if (command == 7) + { + n = getFileName(name, sizeof name, stdin, "persistent mapping", 0); + if (n > 0) + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + } + else + { + for (i = 0; i < j; i++) + { + b_t = i_to_b_t[i]; + fprintf(file, "Bus %d Target %d is PhysId %08x%08x EnclMap %08x\n", + b_t >> 8, b_t & 255, + get32(SASDevicePage2[i].PhysicalIdentifier.High), + get32(SASDevicePage2[i].PhysicalIdentifier.Low), + get32(SASDevicePage2[i].EnclosureMapping)); + } + + fclose(file); + + if (j) + printf("%d persistent entries saved\n", j); + else + printf("No persistent entries found\n"); + } + } + else + { + printf("Persistent mappings won't be saved\n"); + } + } + + if (command == 8) + { + n = getFileName(name, sizeof name, stdin, "persistent mapping", 0); + if (n > 0) + { + if (readFile(name, &mappingBuf, &mappingLen) != 1) + return 0; + + t = 0; + + c = (char *)mappingBuf; + + while (*c != '\0') + { + if (sscanf(c, "Bus %d Target %d is PhysId %8x%8x EnclMap %8x%n", + &bus, &target, &phys_id_h, &phys_id_l, &encl_map, &n) != 5) + { + printf("Incorrectly formatted file!\n"); + break; + } + + c += n; + + while (*c == '\r' || *c == '\n') + c++; + + b_t = (bus << 8) + target; + + k = ~MPI_SASDEVICE2_ENC_MAP_MASK_MISSING_COUNT; + + for (i = 0; i < j; i++) + { + if (i_to_b_t[i] == b_t && + get32(SASDevicePage2[i].PhysicalIdentifier.High) == phys_id_h && + get32(SASDevicePage2[i].PhysicalIdentifier.Low) == phys_id_l && + (get32(SASDevicePage2[i].EnclosureMapping) & k) == (encl_map & k)) + { + break; + } + if (i_to_b_t[i] == b_t) + { + printf("Bus %d Target %d is already valid with PhysId %08x%08x EnclMap %08x\n", + bus, target, + get32(SASDevicePage2[i].PhysicalIdentifier.High), + get32(SASDevicePage2[i].PhysicalIdentifier.Low), + get32(SASDevicePage2[i].EnclosureMapping)); + warn = 1; + break; + } + if (get32(SASDevicePage2[i].PhysicalIdentifier.High) == phys_id_h && + get32(SASDevicePage2[i].PhysicalIdentifier.Low) == phys_id_l && + (get32(SASDevicePage2[i].EnclosureMapping) & k) == (encl_map & k)) + { + printf("PhysId %08x%08x EnclMap %08x is already valid with Bus %d Target %d\n", + get32(SASDevicePage2[i].PhysicalIdentifier.High), + get32(SASDevicePage2[i].PhysicalIdentifier.Low), + get32(SASDevicePage2[i].EnclosureMapping), + i_to_b_t[i] >> 8, i_to_b_t[i] & 255); + warn = 1; + break; + } + } + + if (i == j) + { + t++; + + SASDevicePage2[j] = tempSASDevicePage2; + SASDevicePage2[j].PhysicalIdentifier.High = set32(phys_id_h); + SASDevicePage2[j].PhysicalIdentifier.Low = set32(phys_id_l); + SASDevicePage2[j].EnclosureMapping = set32(encl_map); + changed[j] = 1; + n_changed++; + i_to_b_t[j] = b_t; + j++; + } + } + + if (t) + printf("%d persistent entries loaded\n", t); + else + printf("No persistent entries loaded\n"); + + if (warn) + printf("\nSome persistent mappings were not loaded; clear persistent entries first!\n"); + + free(mappingBuf); + } + else + { + printf("Persistent mappings won't be loaded\n"); + } + } + + if (n_changed != 0) + { + for (i = 0; i < j; i++) + { + if (changed[i]) + { + if (setConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 2, + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <NumPhys); + + n = 0; + for (i = 0; i < SASIOUnitPage0->NumPhys; i++) + { + if (mpi2) + { + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0_2->PhyData[i]; + rate = (SASIOUnit0PhyData->NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_LOGICAL) >> + MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL; + } + else + { + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0->PhyData[i]; + rate = SASIOUnit0PhyData->NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL; + } + + + if (rate == MPI_SAS_IOUNIT0_RATE_1_5 || + rate == MPI_SAS_IOUNIT0_RATE_3_0 || + rate == MPI2_SAS_NEG_LINK_RATE_6_0 || + rate == MPI25_SAS_NEG_LINK_RATE_12_0) + { + if (mpi2) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 0, i, + &SASPhyPage0_2, sizeof SASPhyPage0_2) != 1) + continue; + + // convert from MPI 2.x format to MPI 1.x format (only a couple fields are needed) + SASPhyPage0.AttachedPhyIdentifier = SASPhyPage0_2.AttachedPhyIdentifier; + SASPhyPage0.AttachedDevHandle = SASPhyPage0_2.AttachedDevHandle; + } + else + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 0, i, + &SASPhyPage0, sizeof SASPhyPage0) != 1) + continue; + } + + if (rate == MPI_SAS_IOUNIT0_RATE_1_5) + speed = "1.5"; + else if (rate == MPI_SAS_IOUNIT0_RATE_3_0) + speed = "3.0"; + else if (rate == MPI2_SAS_NEG_LINK_RATE_6_0) + speed = "6.0"; + else if (rate == MPI25_SAS_NEG_LINK_RATE_12_0) + speed = "12.0"; + else + speed = "???"; + + if (n++) + printf(" "); + printf(" %2d %04x --> %2d %04x %2d %s\n", + i, get16(SASIOUnit0PhyData->ControllerDevHandle), + SASPhyPage0.AttachedPhyIdentifier, + get16(SASPhyPage0.AttachedDevHandle), + SASIOUnit0PhyData->Port, speed); + } + } //next phy + if (n == 0) + printf("\n"); + + free(SASIOUnitPage0); + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, handle, + &SASExpanderPage0, sizeof SASExpanderPage0) != 1) + break; + + handle = get16(SASExpanderPage0.DevHandle); + + printf("\nExpander %2d", SASExpanderPage0.NumPhys); + + n = 0; + for (i = 0; i < SASExpanderPage0.NumPhys; i++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 1, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM + <> + MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL; + else + rate = SASExpanderPage1.NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL; + + if (rate == MPI_SAS_EXPANDER1_NEG_RATE_1_5 || + rate == MPI_SAS_EXPANDER1_NEG_RATE_3_0 || + rate == MPI2_SAS_NEG_LINK_RATE_6_0 || + rate == MPI25_SAS_NEG_LINK_RATE_12_0) + { + if (rate == MPI_SAS_IOUNIT0_RATE_1_5) + speed = "1.5"; + else if (rate == MPI_SAS_EXPANDER1_NEG_RATE_3_0) + speed = "3.0"; + else if (rate == MPI25_SAS_NEG_LINK_RATE_12_0) + speed = "12.0"; + else + speed = "6.0"; + + if (n++) + printf(" "); + printf(" %2d %04x --> %2d %04x %2d %s\n", + i, handle, + SASExpanderPage1.AttachedPhyIdentifier, + get16(SASExpanderPage1.AttachedDevHandle), + SASExpanderPage1.PhysicalPort, speed); + } + } + if (n == 0) + printf("\n"); + } + + printf("\nEnclosure Handle Slots SASAddress B___T (SEP)\n"); + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_ENCLOSURE, 0, handle, + &SASEnclosurePage0, sizeof SASEnclosurePage0) != 1) + break; + + handle = get16(SASEnclosurePage0.EnclosureHandle); + flags = get16(SASEnclosurePage0.Flags); + + if (handle == 1) + { + mapped = 0; + } + else if (mpi1) + { + mapped = flags & MPI_SAS_ENCLS0_FLAGS_SEP_BUS_ID_VALID; + bus = SASEnclosurePage0.SEPBus; + target = SASEnclosurePage0.SEPTargetID; + } + else + { + Mpi2SasEnclosurePage0_t *SASEnclosurePage0_2; + int handle; + + SASEnclosurePage0_2 = (pMpi2SasEnclosurePage0_t)&SASEnclosurePage0; + handle = get16(SASEnclosurePage0_2->SEPDevHandle); + + mapped = mapDevHandleToBusTarget(port, handle, &bus, &target); + } + + if (mapped) + { + printf(" %04x %5d %08x%08x %2d %3d\n", + handle, get16(SASEnclosurePage0.NumSlots), + get32(SASEnclosurePage0.EnclosureLogicalID.High), + get32(SASEnclosurePage0.EnclosureLogicalID.Low), + bus, target); + } + else + { + printf(" %04x %5d %08x%08x\n", + handle, get16(SASEnclosurePage0.NumSlots), + get32(SASEnclosurePage0.EnclosureLogicalID.High), + get32(SASEnclosurePage0.EnclosureLogicalID.Low)); + } + } + + return 1; +} + + +int +showSasDiscoveryErrors(MPT_PORT *port) +{ + SasIOUnitPage0_t *SASIOUnitPage0; + Mpi2SasIOUnitPage0_t *SASIOUnitPage0_2; + SasIOUnit0PhyData *SASIOUnit0PhyData; + SasExpanderPage0_t SASExpanderPage0; + Mpi2ExpanderPage0_t *SASExpanderPage0_2; + int handle; + int length; + int i; + int n; + int t; + int disc_stat; + + n = 0; + + SASIOUnitPage0 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, &length); + if (SASIOUnitPage0 == NULL) + return 0; + + SASIOUnitPage0_2 = (pMpi2SasIOUnitPage0_t)SASIOUnitPage0; + + for (i = 0; i < SASIOUnitPage0->NumPhys; i++) + { + if (mpi2) + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0_2->PhyData[i]; + else + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0->PhyData[i]; + + if (SASIOUnit0PhyData->PortFlags & MPI_SAS_IOUNIT0_PORT_FLAGS_DISCOVERY_IN_PROGRESS) + { + if (n++) + printf("\n"); + + printf("Discovery is in progress for adapter phy %d!\n", i); + } + + disc_stat = get32(SASIOUnit0PhyData->DiscoveryStatus); + + if (disc_stat) + { + if (n++) + printf("\n"); + + printf("Discovery errors for adapter phy %d:\n", i); + if (mpi1) + { + if (disc_stat & MPI_SAS_IOUNIT0_DS_LOOP_DETECTED) + printf(" Loop detected\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_UNADDRESSABLE_DEVICE) + printf(" Unaddressable device detected\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_MULTIPLE_PORTS) + printf(" Multiple ports with same SAS address detected\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_EXPANDER_ERR) + printf(" Expander error\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_SMP_TIMEOUT) + printf(" SMP timeout\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_OUT_ROUTE_ENTRIES) + printf(" Expander route table out of entries\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_INDEX_NOT_EXIST) + printf(" Route table index does not exist\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_SMP_FUNCTION_FAILED) + printf(" SMP function failed\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_SMP_CRC_ERROR) + printf(" SMP CRC error\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_SUBTRACTIVE_LINK) + printf(" Subtractive-to-subtractive link detected\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_TABLE_LINK) + printf(" Table-to-table link detected\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_UNSUPPORTED_DEVICE) + printf(" Unsupported device detected\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_MAX_SATA_TARGETS) + printf(" Maximum number of supported SATA targets reached\n"); + if (disc_stat & MPI_SAS_IOUNIT0_DS_MULTI_PORT_DOMAIN) + printf(" Multiple ports attached to the same domain\n"); + } + else + { + if (disc_stat & MPI2_SASIOUNIT0_DS_MAX_ENCLOSURES_EXCEED) + printf(" Maximum number of enclosures exceeded\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_MAX_EXPANDERS_EXCEED) + printf(" Maximum number of expanders exceeded\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_MAX_DEVICES_EXCEED) + printf(" Maximum number of devices exceeded\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_MAX_TOPO_PHYS_EXCEED) + printf(" Maximum number of phys exceeded\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_DOWNSTREAM_INITIATOR ) + printf(" Downstream initiator detected in simplified routing mode\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE ) + printf(" Multiple subtractive-to-subtractive ports detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_EXP_MULTI_SUBTRACTIVE ) + printf(" Multiple subtractive ports within an expander detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_MULTI_PORT_DOMAIN) + printf(" Multiple ports attached to the same domain\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_TABLE_TO_SUBTRACTIVE_LINK) + printf(" Table-to-subtractive link detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_UNSUPPORTED_DEVICE) + printf(" Unsupported device detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_TABLE_LINK) + printf(" Table-to-table link detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_SUBTRACTIVE_LINK) + printf(" Subtractive-to-subtractive link detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_SMP_CRC_ERROR) + printf(" SMP CRC error\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_SMP_FUNCTION_FAILED) + printf(" SMP function failed\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_INDEX_NOT_EXIST) + printf(" Route table index does not exist\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_OUT_ROUTE_ENTRIES) + printf(" Expander route table out of entries\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_SMP_TIMEOUT) + printf(" SMP timeout\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_MULTIPLE_PORTS) + printf(" Multiple ports with same SAS address detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_UNADDRESSABLE_DEVICE) + printf(" Unaddressable device detected\n"); + if (disc_stat & MPI2_SASIOUNIT0_DS_LOOP_DETECTED) + printf(" Loop detected\n"); + } + } + } + + free(SASIOUnitPage0); + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, handle, + &SASExpanderPage0, sizeof SASExpanderPage0) != 1) + break; + + handle = get16(SASExpanderPage0.DevHandle); + + if (mpi2) + { + SASExpanderPage0_2 = (pMpi2ExpanderPage0_t)&SASExpanderPage0; + + t = get16(SASExpanderPage0_2->Flags) & MPI2_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS; + } + else + { + t = SASExpanderPage0.Flags & MPI2_SAS_EXPANDER0_FLAGS_CONFIG_IN_PROGRESS; + } + + if (t) + { + if (n++) + printf("\n"); + + printf("Configuration is in progress for expander %04x!\n", handle); + } + + disc_stat = get32(SASExpanderPage0.DiscoveryStatus); + + if (disc_stat) + { + if (n++) + printf("\n"); + + printf("Discovery errors for expander %04x:\n", handle); + if (mpi1) + { + if (disc_stat & MPI_SAS_EXPANDER0_DS_LOOP_DETECTED) + printf(" Loop detected\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_UNADDRESSABLE_DEVICE) + printf(" Unaddressable device detected\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_MULTIPLE_PORTS) + printf(" Multiple ports with same SAS address detected\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_EXPANDER_ERR) + printf(" Expander error\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_SMP_TIMEOUT) + printf(" SMP timeout\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_OUT_ROUTE_ENTRIES) + printf(" Expander route table out of entries\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_INDEX_NOT_EXIST) + printf(" Route table index does not exist\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_SMP_FUNCTION_FAILED) + printf(" SMP function failed\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_SMP_CRC_ERROR) + printf(" SMP CRC error\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_SUBTRACTIVE_LINK) + printf(" Subtractive-to-subtractive link detected\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_TABLE_LINK) + printf(" Table-to-table link detected\n"); + if (disc_stat & MPI_SAS_EXPANDER0_DS_UNSUPPORTED_DEVICE) + printf(" Unsupported device detected\n"); + } + else + { + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MAX_ENCLOSURES_EXCEED) + printf(" Maximum number of enclosures exceeded\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MAX_EXPANDERS_EXCEED) + printf(" Maximum number of expanders exceeded\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MAX_DEVICES_EXCEED) + printf(" Maximum number of devices exceeded\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MAX_TOPO_PHYS_EXCEED) + printf(" Maximum number of phys exceeded\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_DOWNSTREAM_INITIATOR) + printf(" Downstream initiator detected in simplified routing mode\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MULTI_SUBTRACTIVE_SUBTRACTIVE ) + printf(" Multiple subtractive-to-subtractive ports detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_EXP_MULTI_SUBTRACTIVE ) + printf(" Multiple subtractive ports within an expander detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MULTI_PORT_DOMAIN) + printf(" Multiple ports attached to the same domain\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_TABLE_TO_SUBTRACTIVE_LINK) + printf(" Table-to-subtractive link detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_UNSUPPORTED_DEVICE) + printf(" Unsupported device detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_TABLE_LINK) + printf(" Table-to-table link detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_SUBTRACTIVE_LINK) + printf(" Subtractive-to-subtractive link detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_SMP_CRC_ERROR) + printf(" SMP CRC error\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_SMP_FUNCTION_FAILED) + printf(" SMP function failed\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_INDEX_NOT_EXIST) + printf(" Route table index does not exist\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_OUT_ROUTE_ENTRIES) + printf(" Expander route table out of entries\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_SMP_TIMEOUT) + printf(" SMP timeout\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_MULTIPLE_PORTS) + printf(" Multiple ports with same SAS address detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_UNADDRESSABLE_DEVICE) + printf(" Unaddressable device detected\n"); + if (disc_stat & MPI2_SAS_EXPANDER0_DS_LOOP_DETECTED) + printf(" Loop detected\n"); + } + } + } + + if (n == 0) + printf("No discovery errors found\n"); + + return 1; +} + + +int +doShowPortAliases(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + FCPortPage1_t FCPortPage1; + FCPortPage5_t FCPortPage5; + int i; + + if (bringOnline(port) != 1) + return 0; + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + if (FCPortPage0.MaxAliasesSupported == 0) + { + printf("Aliases are not supported on this port\n"); + return 1; + } + + printf("%d aliases requested, %d aliases active\n", FCPortPage1.NumRequestedAliases, FCPortPage0.NumCurrentAliases); + + if (FCPortPage1.NumRequestedAliases == 0) + return 1; + + printf("\n WWNN WWPN PortId Flags\n"); + + for (i = 1; i <= FCPortPage1.NumRequestedAliases; i++) + { + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, MPI_CONFIG_PAGETYPE_FC_PORT, 5, + MPI_FC_PORT_PGAD_FORM_INDEX + i, &FCPortPage5, sizeof FCPortPage5) != 1) + continue; + + printf("%3d %08x%08x %08x%08x %04x%02x %02x (%s%s)\n", i, + get32(FCPortPage5.AliasInfo.AliasWWNN.High), get32(FCPortPage5.AliasInfo.AliasWWNN.Low), + get32(FCPortPage5.AliasInfo.AliasWWPN.High), get32(FCPortPage5.AliasInfo.AliasWWPN.Low), + get16(FCPortPage5.AliasInfo.DomainArea), + FCPortPage5.AliasInfo.AliasAlpa, + FCPortPage5.AliasInfo.Flags, + (FCPortPage5.AliasInfo.Flags & MPI_FCPORTPAGE5_FLAGS_DISABLE) ? "Disabled, " : "", + (FCPortPage5.AliasInfo.Flags & MPI_FCPORTPAGE5_FLAGS_ALPA_ACQUIRED) ? "Active" : "Inactive"); + } + + return 1; +} + + +int +doShowExpanderRoutingTables(MPT_PORT *port) +{ + SasExpanderPage0_t SASExpanderPage0; + SasExpanderPage1_t SASExpanderPage1; + Mpi2ExpanderPage0_t *SASExpanderPage0_2; + int exp_handle; + int handle; + int phy_info; + int i; + int j; + int t; + int flags; + int route_table_config; + int n1; + int n2; + unsigned char report_route_information_req[12]; + unsigned char report_route_information_rsp[40]; + unsigned char report_expander_route_table_req[28]; + unsigned char report_expander_route_table_rsp[48]; + U32 wwid_l = 0; + U32 wwid_h = 0; + char types[49]; + + if (bringOnline(port) != 1) + return 0; + + if (gFlag == TRUE) + { + printf("Enter expander handle: [0000-FFFF or RETURN for all expanders] "); + exp_handle = getNumberAnswerHex(0x0000, 0xffff, -1); + + printf("\n"); + } + else + exp_handle = -1; + + memset(report_route_information_req, 0, sizeof report_route_information_req); + + report_route_information_req[0] = 0x40; + report_route_information_req[1] = 0x13; + report_route_information_req[2] = 0xff; + + memset(report_expander_route_table_req, 0, sizeof report_expander_route_table_req); + + report_expander_route_table_req[0] = 0x40; +// report_expander_route_table_req[1] = + report_expander_route_table_req[2] = 0xff; + report_expander_route_table_req[3] = 6; + report_expander_route_table_req[9] = 1; + + n1 = 0; + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, handle, + &SASExpanderPage0, sizeof SASExpanderPage0) != 1) + break; + + handle = get16(SASExpanderPage0.DevHandle); + + if (exp_handle >= 0 && exp_handle != handle) + continue; + + if (n1++) + printf("\n"); + + for (i = 0; i < SASExpanderPage0.NumPhys; i++) + { + if (i >= sizeof types - 1) + break; + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 1, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM + <Flags); + route_table_config = flags & MPI2_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG; + } + else + { + flags = SASExpanderPage0.Flags; + route_table_config = flags & MPI_SAS_EXPANDER0_FLAGS_ROUTE_TABLE_CONFIG; + } + + if (route_table_config) + { + printf("Sending Report Route Information\n"); + n2 = 0; + for (i = 0; i < SASExpanderPage0.NumPhys; i++) + { + if (types[i] == 'T') + { + report_route_information_req[9] = i; + + for (j = 0; j < get16(SASExpanderPage0.ExpanderRouteIndexes); j++) + { + report_route_information_req[6] = j >> 8; + report_route_information_req[7] = j; + + if (doSmpPassthrough(port, SASExpanderPage0.PhysicalPort, SASExpanderPage0.SASAddress, + report_route_information_req, sizeof report_route_information_req, + report_route_information_rsp, sizeof report_route_information_rsp, NULL) == 1) + { + if (report_route_information_rsp[2] == 0x01) + break; + if (report_route_information_rsp[2] == 0x11) + break; + + if (report_route_information_rsp[2] != 0) + { + printf("Report Route Information failed with result %02x\n", + report_route_information_rsp[2]); + continue; + } + + if (report_route_information_rsp[12] & 0x80) + continue; + + wwid_h = get4bytes(report_route_information_rsp, 16); + wwid_l = get4bytes(report_route_information_rsp, 20); + + if (n2++ == 0) + printf("Phy Index SASAddress\n"); + + printf("%3d %5d %08x%08x\n", i, j, wwid_h, wwid_l); + } + else + { + printf("Report Route Information failed!\n"); + break; + } + } + } + } + } + else + { + n2 = 0; + printf("Sending Report Expander Route Table\n"); + report_expander_route_table_req[1] = 0x22; + for (j = 0; j < 65536; j++) + { + report_expander_route_table_req[10] = j >> 8; + report_expander_route_table_req[11] = j; + + t = doSmpPassthrough(port, SASExpanderPage0.PhysicalPort, SASExpanderPage0.SASAddress, + report_expander_route_table_req, sizeof report_expander_route_table_req, + report_expander_route_table_rsp, sizeof report_expander_route_table_rsp, NULL); + if (t == 1) + { + if (report_expander_route_table_rsp[2] == 0x01 && j == 0) + { + report_expander_route_table_req[1] = 0x17; + t = doSmpPassthrough(port, SASExpanderPage0.PhysicalPort, SASExpanderPage0.SASAddress, + report_expander_route_table_req, sizeof report_expander_route_table_req, + report_expander_route_table_rsp, sizeof report_expander_route_table_rsp, NULL); + } + } + if (t == 1) + { + if (report_expander_route_table_rsp[2] == 0x01) + break; + if (report_expander_route_table_rsp[2] == 0x11) + break; + + if (report_expander_route_table_rsp[2] != 0) + { + printf("Report Expander Route Table failed with result %02x\n", + report_expander_route_table_rsp[2]); + continue; + } + + if (report_expander_route_table_rsp[11] == 0) + break; + + j = get2bytes(report_expander_route_table_rsp, 12); + + wwid_h = get4bytes(report_expander_route_table_rsp, 32); + wwid_l = get4bytes(report_expander_route_table_rsp, 36); + + if (n2++ == 0) + printf("Index SASAddress Zone Phy Bitmask\n"); + + printf("%5d %08x%08x ", j, wwid_h, wwid_l); + if (report_expander_route_table_rsp[46] & 0x80) + printf(" %3d ", report_expander_route_table_rsp[47]); + else + printf(" "); + for (i = 40; i < 46; i++) + printf("%02x", report_expander_route_table_rsp[i]); + printf("\n"); + } + else + { + printf("Report Expander Route Table failed!\n"); + break; + } + } + } + } + if (n1 == 0) + { + if (exp_handle < 0) + printf("No expanders found\n"); + else + printf("Expander %04x not found\n", exp_handle); + } + + return 1; +} + + +int +doTestConfigPageActions(MPT_PORT *port) +{ + Config_t req; + ConfigReply_t rep; + char name[256]; + FILE *in_file; + FILE *out_file; + char str[80]; + char act[80]; + U32 buf[256]; + int action; + int type; + int number; + int length; + int ioc_status; + U32 address; + U32 offset; + U32 value; + int i; + int j; + int n; + int t; + char *action_string[7] = {"H", "RC", "WC", "D", "WN", "RD", "RN"}; + + printf("Enter input file, or RETURN to enter commands interactively: "); + n = getString(name, sizeof name, stdin); + + if (n > 0) + { + in_file = fopen(name, "r"); + if (in_file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + in_file = stdin; + } + + printf("Enter output file, or RETURN to send output to the screen: "); + n = getString(name, sizeof name, stdin); + + if (n > 0) + { + out_file = fopen(name, "w"); + if (out_file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + if (in_file != stdin) + fclose(in_file); + return 0; + } + } + else + { + out_file = stdout; + } + + while (TRUE) + { + while (TRUE) + { + if (in_file == stdin) + { + printf("\nEnter command, or ? for help, or RETURN to quit: "); + n = getString(str, sizeof str, stdin); + lines = 0; + } + else + { + if (fgets(str, sizeof str, in_file) == NULL) + { + n = 0; + } + else + { + str[sizeof str - 1] = '\0'; + n = (int)strlen(str); + if (n >= 1 && str[n-1] == '\n') + { + str[n-1] = '\0'; + n -= 1; + } + + if (n == 0) + continue; + + printf("Executing \"%s\"...\n", str); + } + } + + if (n == 0) + { + if (in_file != stdin) + fclose(in_file); + if (out_file != stdout) + fclose(out_file); + return 1; + } + + act[0] = '\0'; + type = 0; + number = 0; + address = 0; + i = sscanf(str, "%s %d %d %x%n\n", act, &type, &number, &address, &j); + if (i >= 4 && j < n && str[j] != ' ') + i = 0; + + if (i >= 3) + { + if (sscanf(act, "%d", &action) == 1) + ; + else if (strcasecmp(act, "h") == 0) + action = 0; + else if (strcasecmp(act, "rc") == 0) + action = 1; + else if (strcasecmp(act, "wc") == 0) + action = 2; + else if (strcasecmp(act, "d") == 0) + action = 3; + else if (strcasecmp(act, "wn") == 0) + action = 4; + else if (strcasecmp(act, "rd") == 0) + action = 5; + else if (strcasecmp(act, "rn") == 0) + action = 6; + + else if (strcasecmp(act, "rdwn") == 0) + action = 5; + + else + action = -1; + + if (action >= 0 && action <= 6 && + type >= 0 && type <= 255 && type != 15 && + number >= 0 && number <= 255) + { + break; + } + } + + if (in_file == stdin) + { + if (n != 1 || str[0] != '?') + printf("\nInvalid response!\n"); + printf("\nValid input is: []\n"); + printf(" Action is:\n"); + printf(" 0 or H display page Header only\n"); + printf(" 1 or RC display page after Read Current\n"); + printf(" 2 or WC enter page and do Write Current\n"); + printf(" 3 or D set current page to Default values\n"); + printf(" 4 or WN enter page and do Write NVRAM\n"); + printf(" 5 or RD display page after Read Default\n"); + printf(" 6 or RN display page after Read NVRAM\n"); + printf(" RDWN do Read Default then Write NVRAM\n"); + printf(" PageType is a decimal number beteen 0 and 255, but not 15\n"); + printf(" PageNumber is a decimal number between 0 and 255\n"); + printf(" PageAddress is an optional hex number\n"); + } + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_CONFIG; + req.AliasIndex = virtInit; + req.Action = MPI_CONFIG_ACTION_PAGE_HEADER; + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + req.Header.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; + req.ExtPageType = type; + } + else + { + req.Header.PageType = type; + } + req.Header.PageNumber = number; + req.PageAddress = set32(address); + + if (doMptCommand(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nFailed to get Header for page %d/%d/%x\n", type, number, address); + continue; + } + + if (action == 0) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + fprintf(out_file, "\n%s %d %d %x -- IOCStatus = %04x (%s)\n", + action_string[action], type, number, address, + ioc_status, translateIocStatus(ioc_status)); + + if (ioc_status == MPI_IOCSTATUS_SUCCESS) + { + fprintf(out_file, "0000 : %08x\n", get32x(*(U32 *)&rep.Header)); + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + fprintf(out_file, "0004 : 00%02x%04x\n", rep.ExtPageType, get16(rep.ExtPageLength)); + } + } + + if (action == 1 || action == 5 || action == 6) + { + req.Action = action; + req.ExtPageType = rep.ExtPageType; + req.ExtPageLength = rep.ExtPageLength; + req.Header = rep.Header; + + if (doMptCommand(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + buf, sizeof buf, NULL, 0, SHORT_TIME) != 1) + { + printf("\nFailed to read page %d/%d/%x\n", type, number, address); + continue; + } + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + fprintf(out_file, "\n%s %d %d %x -- IOCStatus = %04x (%s)\n", + action_string[action], type, number, address, + ioc_status, translateIocStatus(ioc_status)); + + if (ioc_status == MPI_IOCSTATUS_SUCCESS) + { + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + n = get16(rep.ExtPageLength); + else + n = rep.Header.PageLength; + + for (i = 0; i < n; i++) + fprintf(out_file, "%04x : %08x\n", i*4, get32x(buf[i])); + } + } + + if (action == 2 || action == 4) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status == MPI_IOCSTATUS_SUCCESS) + { + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + length = get16(rep.ExtPageLength) * 4; + else + length = rep.Header.PageLength * 4; + } + else + length = sizeof buf; + + memset (buf, 0, sizeof buf); + ((pConfigPageHeader_t)buf)->PageVersion = rep.Header.PageVersion; + ((pConfigPageHeader_t)buf)->PageLength = rep.Header.PageLength; + ((pConfigPageHeader_t)buf)->PageNumber = rep.Header.PageNumber; + ((pConfigPageHeader_t)buf)->PageType = rep.Header.PageType; + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + ((pConfigExtendedPageHeader_t)buf)->ExtPageLength = rep.ExtPageLength; + ((pConfigExtendedPageHeader_t)buf)->ExtPageType = rep.ExtPageType; + t = 8; + } + else + t = 4; + + while (TRUE) + { + if (in_file == stdin) + { + printf("Enter offset (%04x) and value, or ? for help, or RETURN to quit: ", t); + n = getString(str, sizeof str, stdin); + lines = 0; + } + else + { + if (fgets(str, sizeof str, in_file) == NULL) + { + n = 0; + } + else + { + str[sizeof str - 1] = '\0'; + n = (int)strlen(str); + if (n >= 1 && str[n-1] == '\n') + { + str[n-1] = '\0'; + n -= 1; + } + } + } + + if (n == 0) + break; + + offset = 0; + value = 0; + i = sscanf(str, "%x : %x%n\n", &offset, &value, &j); + if (i == 1 && strchr(str, ':') == NULL) + { + i = sscanf(str, "%x %x%n\n", &offset, &value, &j); + if (i == 1 && strchr(str, ' ') == NULL) + { + offset = t; + sscanf(str, "%x%n", &value, &j); + i = 2; + } + } + + if (i == 2 && j == n) + { + if (offset < (U32)length && (offset % 4) == 0) + { + buf[offset / 4] = value; + t = offset + 4; + + if (t == length) + break; + + continue; + } + } + + if (in_file == stdin) + { + if (n != 1 || str[0] != '?') + printf("\nInvalid response!\n"); + printf("\nValid input is: [ [:]] \n"); + printf(" Offset is an optional hex number between 0000 and %04x (multiple of 4 only)\n", length - 4); + printf(" Value is a hex number\n\n"); + } + } + } + + if (strcasecmp(act, "rdwn") == 0) + action = 4; + + if (action == 2 || action == 3 || action == 4) + { + req.Action = action; + req.ExtPageType = rep.ExtPageType; + req.ExtPageLength = rep.ExtPageLength; + req.Header = rep.Header; + + if (action != 3 && type == MPI_CONFIG_PAGETYPE_MANUFACTURING && number == 2) + { + U8 checksum = 0xa5; + U8 *p = (U8 *)buf; + + p += 8; + t = n * 4 - 8; + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC919: t -= 4; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929: t -= 4; break; + case MPI_MANUFACTPAGE_DEVICEID_FC919X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC939X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949X: t -= 3; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949E: t -= 4; break; + default: t = 0; break; + } + if (t != 0) + { + for (i = 0; i < t; i++) + { + checksum += *p++; + } + *p = -checksum; + } + } + + if (type == MPI_CONFIG_PAGETYPE_MANUFACTURING) + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + if (doMptCommand(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + NULL, 0, buf, sizeof buf, SHORT_TIME) != 1) + { + if (type == MPI_CONFIG_PAGETYPE_MANUFACTURING) + doIocInit(port, port->whoInit); + + printf("\nFailed to write page %d/%d/%x\n", type, number, address); + continue; + } + + if (type == MPI_CONFIG_PAGETYPE_MANUFACTURING) + doIocInit(port, port->whoInit); + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + fprintf(out_file, "\n%s %d %d %x -- IOCStatus = %04x (%s)\n", + action_string[action], type, number, address, + ioc_status, translateIocStatus(ioc_status)); + } + } +} + + +int +selectDevice(MPT_PORT *port, int *dev_bus, int *dev_target) +{ + int bus; + int target; + unsigned char inq[36]; + int i; + int n; + + if (kFlag == TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 0; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 0; + + *dev_bus = bus; + *dev_target = target; + + return 1; + } + + showPortInfoHeader(port); + + printf(" B___T Type Vendor Product Rev\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) == 0x1f) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + + n++; + + printf("%2d. %2d %3d %-9s %-8.8s %-16.16s %-4.4s\n", + n, bus, target, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + printf("\nNo devices are available for this test\n"); + return 0; + } + + printf("\nSelect a device: [1-%d or RETURN to quit] ", n); + n = getNumberAnswer(1, n, 0); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + + *dev_bus = bus; + *dev_target = target; + + return 1; +} + + +int +selectDeviceRWMedia(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char inq[36]; + unsigned char cap[8]; + unsigned char cap16[32]; + int i; + int n; + unsigned int mode; + unsigned int size; + int eedp; + + if (kFlag == TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 0; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 0; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 0; + + if (doInquiry(port, bus, target, lun, inq, sizeof inq) != 1) + return 0; + + if (doReadCapacity(port, bus, target, lun, cap, sizeof cap) != 1) + return 0; + + mode = get4bytes(cap, 4); + size = get4bytes(cap, 0); + eedp = 0; + + if (mode == 512 && (inq[5] & 1)) + { + if (doReadCapacity16(port, bus, target, lun, cap16, sizeof cap16) == 1) + { + if (cap16[12] && 1) + { + mode = 520; + eedp = 1; + } + } + } + else if (mode == 520) + { + eedp = 2; + } + + diag_targets[0].bus = bus; + diag_targets[0].target = target; + diag_targets[0].lun = lun; + diag_targets[0].mode = mode; + diag_targets[0].size = size; + diag_targets[0].eedp = eedp; + + return 1; + } + + showPortInfoHeader(port); + + printf(" B___T___L Type Vendor Product Rev Mode Disk Blocks\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + for (lun = 0; lun < port->maxLuns; lun++) + { + if (doInquiry(port, bus, target, lun, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + if (lun == 0) + break; + else + continue; + } + + if ((inq[0] & 0x1f) != 0x00) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + if (doReadCapacity(port, bus, target, lun, cap, sizeof cap) != 1) + continue; + + mode = get4bytes(cap, 4); + size = get4bytes(cap, 0); + eedp = 0; + + if (mode == 512 && (inq[5] & 1)) + { + if (doReadCapacity16(port, bus, target, lun, cap16, sizeof cap16) == 1) + { + if (cap16[12] && 1) + { + mode = 520; + eedp = 1; + } + } + } + else if (mode == 520) + { + eedp = 2; + } + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].lun = lun; + diag_targets[n].mode = mode; + diag_targets[n].size = size; + diag_targets[n].eedp = eedp; + + n++; + + printf("%2d. %2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %4d %10d\n", + n, bus, target, lun, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, mode, size + 1); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + printf("\nNo devices are available for this test\n"); + return 0; + } + + printf("\nSelect a device: [1-%d or RETURN to quit] ", n); + n = getNumberAnswer(1, n, 0); + + return n; +} + + +int +selectDeviceRWBuffer(MPT_PORT *port) +{ + int bus; + int target; + unsigned char inq[36]; + unsigned char buf[4]; + int i; + int n; + int mode; + unsigned int size; + + if (kFlag == TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 0; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 0; + + printf("Buffer: [0=Data, 1=Echo, or RETURN to quit] "); + i = getNumberAnswer(0, 1, -1); + if (i < 0) + return 0; + + switch (i) + { + case 0: mode = 0x2; break; + case 1: mode = 0xa; break; + default: return 0; + } + + if (doReadBuffer(port, bus, target, 0, mode + 1, buf, sizeof buf) != 1) + return 0; + + size = min(0x4000, get3bytes(buf, 1)); + if (size < 4) + return 0; + + diag_targets[0].bus = bus; + diag_targets[0].target = target; + diag_targets[0].mode = mode; + diag_targets[0].size = size; + + return 1; + } + + showPortInfoHeader(port); + + printf(" B___T Type Vendor Product Rev Buffer & Size\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) == 0x1f) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + mode = 0x2; + if (doReadBuffer(port, bus, target, 0, mode + 1, buf, sizeof buf) == 1) + { + size = min(0x4000, get3bytes(buf, 1)); + if (size < 4) + continue; + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].mode = mode; + diag_targets[n].size = size; + + n++; + + printf("%2d. %2d %3d %-9s %-8.8s %-16.16s %-4.4s Data %5d\n", + n, bus, target, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, size); + + if (n == MAX_DEVICES) + break; + } + + mode = 0xa; + if (doReadBuffer(port, bus, target, 0, mode + 1, buf, sizeof buf) == 1) + { + size = min(0x4000, get3bytes(buf, 1)); + if (size < 4) + continue; + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].mode = mode; + diag_targets[n].size = size; + + n++; + + printf("%2d. %2d %3d %-9s %-8.8s %-16.16s %-4.4s Echo %5d\n", + n, bus, target, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, size); + + if (n == MAX_DEVICES) + break; + } + } + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + printf("\nNo devices are available for this test\n"); + return 0; + } + + printf("\nSelect a device: [1-%d or RETURN to quit] ", n); + n = getNumberAnswer(1, n, 0); + + return n; +} + + +int +getExpanderType(int componentId, U8 *componentVendorId, U8 *vendorId) +{ + if ( (strncmp((char *)componentVendorId, "LSI", 3) != 0) && + (strncmp((char *)vendorId, "LSI", 3) != 0) ) + return EXPANDER_TYPE_3RD_PARTY; + else + { + switch(componentId) + { + case 0x0211: + case 0x0213: + return EXPANDER_TYPE_LSI_GEN1_YETI; + case 0x0220: + case 0x0221: + case 0x0223: + case 0x0224: + case 0x0225: + case 0x0226: + case 0x0227: + return EXPANDER_TYPE_LSI_GEN2_BOBCAT; + case 0x0230: + case 0x0231: + case 0x0232: + case 0x0233: + case 0x0235: + case 0x0236: + return EXPANDER_TYPE_LSI_GEN3_COBRA; + default: + return EXPANDER_TYPE_3RD_PARTY; + } + } +} + + +char * +printExpanderType(int expanderType) +{ + switch(expanderType) + { + case EXPANDER_TYPE_LSI_GEN1_YETI: return "LSI SAS1 (Yeti)"; + case EXPANDER_TYPE_LSI_GEN2_BOBCAT: return "LSI SAS2 (Bobcat)"; + case EXPANDER_TYPE_LSI_GEN3_COBRA: return "LSI SAS3 (Cobra)"; + case EXPANDER_TYPE_LSI_GEN1_X12: return "LSI SAS1 (X12)"; + case EXPANDER_TYPE_3RD_PARTY: return "non LSI expander"; + case EXPANDER_TYPE_UNKNOWN: + default: return "unknown expander"; + } +} + + +int +selectExpander(MPT_PORT *port, int *ses_bus, int *ses_target, U8 *phys_port, _U64 *sas_addr, int *expanderType) +{ + SasExpanderPage0_t SASExpanderPage0; + int handle = -1; + U32 wwid_l; + U32 wwid_h; + _U64 sas_address; + U8 physical_port; + int bus; + int target = 0; + unsigned char inq[36]; + char buf[32]; + int i; + int n; + int t; + int numDev; + int multipleSelect = FALSE; + int curr; + SMP_REPORT_MANUFACTURER_INFO_RESPONSE smpResp; + int respDataLength; + + t = ses_bus && ses_target; + + if (kFlag == TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + { + if (t) + return 0; + + goto getHandle; + } + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + { + if (t) + return 0; + + goto getHandle; + } + + if (t) + { + *ses_bus = bus; + *ses_target = target; + } + + getParent(port, bus, target, &handle); + + goto getHandle; + } + + showPortInfoHeader(port); + + getDeviceInfoHeader(port, buf, sizeof buf); + + printf(" B___T Type Vendor Product Rev %s\n", buf); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) != 0x0d) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + + n++; + + getDeviceInfo(port, bus, target, buf, sizeof buf); + + printf("%2d. %2d %3d %-9s %-8.8s %-16.16s %-4.4s %s\n", + n, bus, target, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, buf); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + if (t) + { + printf("\nNo expanders are available for this test\n"); + return 0; + } + goto getHandle; + } + + numDev = n; + printf("\nSelect an expander: [1-%d or RETURN to quit] ", numDev); + n = getNumberAnswer(1, numDev, -888); + + if (n > 0) + { + if (n == 888) + { + for (i = 0; i < numDev; i++) + { + bus = exp_targets[i].bus = diag_targets[i].bus; + target = exp_targets[i].target = diag_targets[i].target; + getParent(port, bus, target, &exp_targets[i].handle); + } + exp_targets[i].bus = -1; + exp_targets[i].target = -1; + exp_targets[i].handle = -1; + + if (t) + { + *ses_bus = -1; + *ses_target = -1; + } + + handle = 0xffff; // dummy value to indicate we need a list of handles + multipleSelect = TRUE; + } + else + { + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + + if (t) + { + *ses_bus = bus; + *ses_target = target; + } + + getParent(port, bus, target, &handle); + } + } + +getHandle: + if (handle < 0) + { + printf("\nExpander Handle SASAddress Port Phys\n"); + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, handle, + &SASExpanderPage0, sizeof SASExpanderPage0) != 1) + break; + + handle = get16(SASExpanderPage0.DevHandle); + + printf(" %04x %08x%08x %2d %2d\n", handle, + get32(SASExpanderPage0.SASAddress.High), + get32(SASExpanderPage0.SASAddress.Low), + SASExpanderPage0.PhysicalPort, + SASExpanderPage0.NumPhys); + } + + printf("\nEnter handle: [0000-FFFF or RETURN to quit] "); + handle = getNumberAnswerHex(0x0000, 0xffff, -1); + if (handle < 0) + return 0; + } + + if (handle == 0) + { + printf("Enter SASAddress: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwid_h, &wwid_l); + if (t == 0) + return 0; + + printf("Enter port: [0 to %d or RETURN to leave unspecified] ", port->numPhys - 1); + physical_port = (U8)getNumberAnswer(0, port->numPhys - 1, 255); + sas_address.Low = set32(wwid_l); + sas_address.High = set32(wwid_h); + } + else + { + curr = -1; + while (TRUE) + { + if (multipleSelect) + { + curr++; + handle = exp_targets[curr].handle; + + if (handle == -1) + { + physical_port = -1; + sas_address.Low = 0; + sas_address.High = 0; + break; + } + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE + <pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doEchoTest(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSataIdentifyDeviceTest(port); + break; + } + printf("Invalid selection!\n"); + break; + case 11: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doReadLinkErrorStatusTest(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSataClearAffiliationTest(port); + break; + } + printf("Invalid selection!\n"); + break; + case 12: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doDisplayPortCounters(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doDisplayPhyCounters(port); + break; + } + printf("Invalid selection!\n"); + break; + case 13: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doClearPortCounters(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doClearPhyCounters(port); + break; + } + printf("Invalid selection!\n"); + break; + case 14: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSataSmartReadTest(port); + break; + } + printf("Invalid selection!\n"); + break; + case 15: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI || + port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doSepTest(port); + break; + } + printf("Invalid selection!\n"); + break; + case 16: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doProdSpecSasIoUnitControl(port); + break; + } + printf("Invalid selection!\n"); + break; + case 17: + doDiagDataUpload(port); + break; + case 18: + doReportLunsTest(port); + break; + case 19: + doDriveFirmwareDownload(port); + break; + case 20: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + doTriggerAnalyzerWithEcho(port); + break; + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doExpanderFirmwareDownload(port); + break; + } + printf("Invalid selection!\n"); + break; + case 21: + doReadLogicalBlocks(port); + break; + case 22: + doWriteLogicalBlocks(port); + break; + case 23: + doVerifyLogicalBlocks(port); + break; + case 24: + doReadBufferFirmwareUpload(port); + break; + case 25: + doDisplayExpanderLogEntries(port); + break; + case 26: + doClearExpanderLogEntries(port); + break; + case 27: + doExpanderChangeMfgDataFields(port); + break; + case 29: + doDiagnosticPageTest(port); + break; + case 30: + doInjectRepairMediaError(port, 1); + break; + case 31: + doInjectRepairMediaError(port, 0); + break; + case 32: + doSoftwareWriteProtect(port, 1); + break; + case 33: + doSoftwareWriteProtect(port, 0); + break; + case 34: + doReadWriteCache(port, 1); + break; + case 35: + doReadWriteCache(port, 0); + break; + case 36: + doReadWriteCache(port, 3); + break; + case 37: + doReadWriteCache(port, 2); + break; + case 98: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doResetExpander(port); + break; + } + printf("Invalid selection!\n"); + break; + default: + printf("Invalid selection!\n"); + break; + } + + return 1; +} + + +void +generatePattern(int pattern, void *buf, int len) +{ + int i; + int j; + unsigned char *buf1 = (unsigned char *)buf; + unsigned short *buf2 = (unsigned short *)buf; + + switch (pattern) + { + case 1: + for (i = 0; i < len / 2; i++) + { + *buf1++ = 0x00; + *buf1++ = 0xff; + } + break; + + case 2: + for (i = 0; i < len / 2; i++) + { + *buf1++ = 0x55; + *buf1++ = 0xaa; + } + break; + + case 3: + for (i = 0; i < len; i++) + { + *buf1++ = i; + } + break; + + case 4: + for (i = 0; i < len / 2; i++) + { + *buf1++ = 1 << (i & 7); + *buf1++ = ~(1 << (i & 7)); + } + break; + + case 5: + for (i = 0; i < len / 4; i++) + { + *buf2++ = 0x0000; + *buf2++ = 0xffff; + } + break; + + case 6: + for (i = 0; i < len / 4; i++) + { + *buf2++ = 0x5555; + *buf2++ = 0xaaaa; + } + break; + + case 7: + for (i = 0; i < len / 2; i++) + { + *buf2++ = i; + } + break; + + case 8: + for (i = 0; i < len / 4; i++) + { + *buf2++ = 1 << (i & 15); + *buf2++ = ~(1 << (i & 15)); + } + break; + + case 9: + for (i = 0; i < len; i++) + { + *buf1++ = rand(); + } + break; + + case 10: + for (j = 0; j < len / 0x200; j++) + { + for (i = 0x0; i < 0x200; i++) + *buf1++ = 0xb5; + } + break; + + case 11: + for (j = 0; j < len / 0x200; j++) + { + for (i = 0x0; i < 0x200; i++) + *buf1++ = 0x4a; + } + break; + } +} + + +void +format64bitDecimal(uint64_t number, char *buf, int len) +{ + int i; + int part; + char temp[4]; + + memset(buf, ' ', len); + + i = len - 1; + + while (TRUE) + { + part = (int)(number % 1000); + number /= 1000; + + if (number == 0) + { + sprintf(temp, "%3d", part); + buf[--i] = temp[2]; + buf[--i] = temp[1]; + buf[--i] = temp[0]; + break; + } + + sprintf(temp, "%03d", part); + + buf[--i] = temp[2]; + buf[--i] = temp[1]; + buf[--i] = temp[0]; + buf[--i] = ','; + } + + buf[len - 1] = '\0'; +} + + +int +doInquiryTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int vpd; + int page; + unsigned char inq[255]; + int i; + int n; + int t; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("VPD Page: [00-FF or RETURN for normal Inquiry] "); + page = getNumberAnswerHex(0x00, 0xff, -1); + vpd = page != -1; + + printf("\n"); + + if (vpd) + { + t = doInquiryVpdPage(port, bus, target, lun, page, inq, sizeof inq); + n = inq[3] + 4; + } + else + { + t = doInquiry(port, bus, target, lun, inq, sizeof inq); + n = inq[4] + 5; + } + + if (t == 1) + { + if (vpd) + { + printf(" B___T___L Page\n"); + printf("%2d %3d %3d %02x\n\n", + bus, target, lun, page); + } + else + { + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + printf(" B___T___L Type Vendor Product Rev\n"); + printf("%2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s\n\n", + bus, target, lun, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32); + } + + printf("%d bytes of Inquiry Data returned\n\n", n); + + displayByteData(inq, n); + } + else + { + printf("Inquiry failed\n"); + } + + printf("\n"); + } +} + + +int +doWriteBufferReadBufferCompareTest(MPT_PORT *port) +{ + int bus; + int target; + unsigned char *data_in; + unsigned char *data_out; + unsigned char *p; + unsigned char *q; + int i; + unsigned int j; + int n; + int mode; + unsigned int size; + int pattern; + int passes; + int progress; + + n = selectDeviceRWBuffer(port); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + mode = diag_targets[n].mode; + + while (TRUE) + { + size = diag_targets[n].size; + + printf("\n"); + printf(" 1. Alternating, 8-Bit, 00 and FF\n"); + printf(" 2. Alternating, 8-Bit, 55 and AA\n"); + printf(" 3. Incrementing, 8-Bit\n"); + printf(" 4. Walking 1s and 0s, 8-Bit\n"); + printf(" 5. Alternating, 16-Bit, 0000 and FFFF\n"); + printf(" 6. Alternating, 16-Bit, 5555 and AAAA\n"); + printf(" 7. Incrementing, 16-Bit\n"); + printf(" 8. Walking 1s and 0s, 16-Bit\n"); + printf(" 9: Random\n"); + printf("10: All B5\n"); + printf("11: All 4A\n"); + + printf("\nSelect a data pattern: [1-11 or RETURN to quit] "); + pattern = getNumberAnswer(1, 11, 0); + if (pattern == 0) + return 1; + + printf("Pattern length: [1-%d or RETURN to quit] ", size); + size = getNumberAnswer(1, size, 0); + if (size == 0) + return 1; + + printf("Number of iterations: [1-1000000 or 0 for infinite or RETURN to quit] "); + passes = getNumberAnswer(0, 1000000, -1); + if (passes < 0) + return 1; + + data_in = malloc(size); + data_out = malloc(size); + + generatePattern(pattern, data_out, size); + + progress = max(10, passes / 10); + + printf("Testing started...\n"); + for (i = 1; i <= passes || passes == 0; i++) + { + if (doWriteBuffer(port, bus, target, 0, mode, data_out, size) != 1) + { + printf("W "); + continue; + } + + if (doReadBuffer(port, bus, target, 0, mode, data_in, size) != 1) + { + printf("R "); + continue; + } + + if (memcmp(data_in, data_out, size) != 0) + { + p = data_out; + q = data_in; + + for (j = 0; j < size; j++) + { + if (*p != *q) + printf("\nMiscompare at buffer offset %02x expected %02x actual %02x\n", j, *p, *q); + p++; q++; + } + break; + } + +// printf("."); + + if (passes == 0) + { + if (i % 100000 == 0) + { + printf(" %d", i); + if (i == 1000000) + { + i = 0; + printf("\n"); + } + fflush(stdout); + } + } + else if (i % progress == 0) + { + printf(" %d%% ", i * 100 / passes); + fflush(stdout); + } + } + printf("\nTesting ended...\n"); + + free(data_in); + free(data_out); + } +} + + +int +getEedpMode(MPT_PORT *port, int eedp) +{ + IOCPage1_t IOCPage1; + int flags = 0; + int eedp_mode = -1; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, &IOCPage1, sizeof IOCPage1) == 1) + { + flags = get32(IOCPage1.Flags); + + switch (flags & MPI_IOCPAGE1_EEDP_MODE_MASK) + { + case MPI_IOCPAGE1_EEDP_MODE_OFF: + printf("\nEnd-to-End Data Protection Mode is disabled\n"); + break; + case MPI_IOCPAGE1_EEDP_MODE_T10: + printf("\nEnd-to-End Data Protection Mode is set to T10\n"); + eedp_mode = 0x1; + break; + case MPI_IOCPAGE1_EEDP_MODE_LSI_1: + printf("\nEnd-to-End Data Protection Mode is set to LB\n"); + eedp_mode = 0x2; + break; + default: + printf("\nEnd-to-End Data Protection Mode is unknown, ignoring\n"); + break; + } + } + + if (eedp_mode > 0) + { + printf("\nIs firmware/hardware going to handle EEDP? [Yes or No, default is Yes] "); + + if (getYesNoAnswer(1) != 1) + { + printf("This utility will manage the Data Integrity Fields\n"); + eedp_mode += 0x100; + } + else + { + printf("Firmware/Hardware will manage the Data Integrity Fields\n"); + } + } + else + { + printf("\nShould software T10 EEDP be implemented? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) == 1) + { + printf("This utility will manage the Data Integrity Fields\n"); + eedp_mode = 0x201; + } + else if (eedp == 2) + { + printf("No EEDP will be provided\n"); + eedp_mode = 0; + } + else + { + printf("Disk cannot be used in this test\n"); + } + } + + return eedp_mode; +} + + +int +doReadTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char *data_in; + int i; + int n; + unsigned int mode; + unsigned int size; + int eedp; + unsigned int lbn; + int lbns; + int len; + int passes; + int random; + int progress; + int eedp_mode = 0; + + n = selectDeviceRWMedia(port); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + lun = diag_targets[n].lun; + mode = diag_targets[n].mode; + size = diag_targets[n].size; + eedp = diag_targets[n].eedp; + + if (eedp) + { + eedp_mode = getEedpMode(port, eedp); + + if (eedp_mode < 0) + return 0; + } + + while (TRUE) + { + printf("\n"); + printf("Number of blocks per I/O: [1-64 or RETURN to quit] "); + lbns = getNumberAnswer(1, 64, 0); + if (lbns == 0) + return 1; + + printf("Number of iterations: [1-1000000 or 0 for infinite or RETURN to quit] "); + passes = getNumberAnswer(0, 1000000, -1); + if (passes < 0) + return 1; + + printf("Type of I/O: [0=Sequential, 1=Random, default is 0] "); + random = getNumberAnswer(0, 1, 0); + + len = lbns * ((eedp_mode == 0) ? mode : 512); + + data_in = malloc(lbns * mode); + + progress = max(10, passes / 10); + + lbn = 128; + printf("Testing started...\n"); + for (i = 1; i <= passes || passes == 0; i++, lbn += lbns) + { + if (random) + { + lbn = rand(); + while (lbn + lbns >= size) + { + lbn /= 2; + } + } + else + { + if (lbn + lbns >= size) + { + lbn = 128; + } + } + + if (doRead(port, bus, target, lun, lbn, lbns, eedp_mode, data_in, len) != 1) + { + printf("R "); + continue; + } + +// printf("."); + + if (passes == 0) + { + if (i % 100000 == 0) + { + printf(" %d", i); + if (i == 1000000) + { + i = 0; + printf("\n"); + } + fflush(stdout); + } + } + else if (i % progress == 0) + { + printf(" %d%% ", i * 100 / passes); + fflush(stdout); + } + } + printf("\nTesting ended...\n"); + + free(data_in); + } +} + + +int +doWriteReadCompareTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char *data_in; + unsigned char *data_out; + int i; + int n; + unsigned int mode; + unsigned int size; + int eedp; + int pattern; + unsigned int lbn; + int lbns; + int len; + int passes; + int random; + int progress; + int eedp_mode = 0; + int quit; + + n = selectDeviceRWMedia(port); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + lun = diag_targets[n].lun; + mode = diag_targets[n].mode; + size = diag_targets[n].size; + eedp = diag_targets[n].eedp; + + if (eedp) + { + eedp_mode = getEedpMode(port, eedp); + + if (eedp_mode < 0) + return 0; + } + + while (TRUE) + { + printf("\n"); + printf(" 1. Alternating, 8-Bit, 00 and FF\n"); + printf(" 2. Alternating, 8-Bit, 55 and AA\n"); + printf(" 3. Incrementing, 8-Bit\n"); + printf(" 4. Walking 1s and 0s, 8-Bit\n"); + printf(" 5. Alternating, 16-Bit, 0000 and FFFF\n"); + printf(" 6. Alternating, 16-Bit, 5555 and AAAA\n"); + printf(" 7. Incrementing, 16-Bit\n"); + printf(" 8. Walking 1s and 0s, 16-Bit\n"); + printf(" 9: Random\n"); + printf("10: All B5\n"); + printf("11: All 4A\n"); + printf("12: Incrementing across iterations (00 through FF)\n"); + printf("\nSelect a data pattern: [1-12 or RETURN to quit] "); + pattern = getNumberAnswer(1, 12, 0); + if (pattern == 0) + return 1; + + printf("Number of blocks per I/O: [1-64 or RETURN to quit] "); + lbns = getNumberAnswer(1, 64, 0); + if (lbns == 0) + return 1; + + if (pattern == 12) + printf("Number of iterations per pattern: [1-1000000 or RETURN to quit] "); + else + printf("Number of iterations: [1-1000000 or 0 for infinite or RETURN to quit] "); + passes = getNumberAnswer(0, 1000000, -1); + if (passes < 0) + return 1; + if (passes == 0 && pattern == 12) + return 1; + + printf("Type of I/O: [0=Sequential, 1=Random, default is 0] "); + random = getNumberAnswer(0, 1, 0); + + len = lbns * ((eedp_mode == 0) ? mode : 512); + + data_in = malloc(lbns * mode); + data_out = malloc(lbns * mode); + + if (pattern == 12) + { + int j; + int quit_test = 0; + + printf("Stop pattern on Write, Read, or Compare error? [Yes or No, default is Yes] "); + quit = getYesNoAnswer(1); + + if (quit) + { + printf("Stop test on Write, Read, or Compare error? [Yes or No, default is Yes] "); + quit_test = getYesNoAnswer(1); + } + + lbn = 128; + printf("Testing started...\n"); + for (j = 0x00; j <= 0xff; j++) + { + FCPortPage6_t FCPortPage6; + uint64_t LipCount = 0; + uint64_t LossOfSyncCount = 0; + uint64_t LipCountDiff; + uint64_t LossOfSyncCountDiff; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6) == 1) + { + LipCount = get64(FCPortPage6.LipCount); + LossOfSyncCount = get64(FCPortPage6.LossOfSyncCount); + } + } + + printf(" %02X ", j); + fflush(stdout); + + memset(data_out, j, len); + + for (i = 1; i <= passes; i++, lbn += lbns) + { + if (random) + { + lbn = rand(); + while (lbn + lbns >= size) + { + lbn /= 2; + } + } + else + { + if (lbn + lbns >= size) + { + lbn = 128; + } + } + + if (doWrite(port, bus, target, lun, lbn, lbns, eedp_mode, data_out, len) != 1) + { + if (quit) + { + printf("W at pass %d", i); + if (quit_test) + j = 256; + break; + } + else + { + printf("W "); + continue; + } + } + + if (doRead(port, bus, target, lun, lbn, lbns, eedp_mode, data_in, len) != 1) + { + if (quit) + { + printf("R at pass %d", i); + if (quit_test) + j = 256; + break; + } + else + { + printf("R "); + continue; + } + } + + if (memcmp(data_in, data_out, len) != 0) + { + if (quit) + { + printf("C at pass %d", i); + if (quit_test) + j = 256; + break; + } + else + { + printf("C "); + continue; + } + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6) == 1) + { + LipCountDiff = get64(FCPortPage6.LipCount) - LipCount; + LossOfSyncCountDiff = get64(FCPortPage6.LossOfSyncCount) - LossOfSyncCount; + if (LipCountDiff != 0 || LossOfSyncCountDiff != 0) + { + printf("\nPattern %02X caused %s%d LIP%s and %s%d Loss%sOfSync\n", data_out[0], + LipCountDiff > 1000 ? ">" : "", + LipCountDiff > 1000 ? 1000 : (int)LipCountDiff, + LipCountDiff != 1 ? "s" : "", + LossOfSyncCountDiff > 1000 ? ">" : "", + LossOfSyncCountDiff > 1000 ? 1000 : (int)LossOfSyncCountDiff, + LossOfSyncCountDiff != 1 ? "es" : ""); + } + } + } + } + printf("\nTesting ended...\n"); + } + else + { + generatePattern(pattern, data_out, len); + + printf("Stop test on Write, Read, or Compare error? [Yes or No, default is Yes] "); + quit = getYesNoAnswer(1); + + progress = max(10, passes / 10); + + lbn = 128; + printf("Testing started...\n"); + for (i = 1; i <= passes || passes == 0; i++, lbn += lbns) + { + if (random) + { + lbn = rand(); + while (lbn + lbns >= size) + { + lbn /= 2; + } + } + else + { + if (lbn + lbns >= size) + { + lbn = 128; + } + } + + if (doWrite(port, bus, target, lun, lbn, lbns, eedp_mode, data_out, len) != 1) + { + if (quit) + { + printf("W at pass %d", i); + break; + } + else + { + printf("W "); + continue; + } + } + + if (doRead(port, bus, target, lun, lbn, lbns, eedp_mode, data_in, len) != 1) + { + if (quit) + { + printf("R at pass %d", i); + break; + } + else + { + printf("R "); + continue; + } + } + + if (memcmp(data_in, data_out, len) != 0) + { + if (quit) + { + printf("C at pass %d", i); + break; + } + else + { + printf("C "); + continue; + } + } + +// printf("."); + + if (passes == 0) + { + if (i % 100000 == 0) + { + printf(" %d", i); + if (i == 1000000) + { + i = 0; + printf("\n"); + } + fflush(stdout); + } + } + else if (i % progress == 0) + { + printf(" %d%% ", i * 100 / passes); + fflush(stdout); + } + } + printf("\nTesting ended...\n"); + } + + free(data_in); + free(data_out); + } +} + + +int +doWriteTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char *data_in; + unsigned char *data_out; + int i; + int j; + int n; + unsigned int mode; + unsigned int size; + int eedp; + U32 tag; + unsigned int lbn; + int lbns; + int len; + int progress; + int eedp_mode = 0; + int quit; + U32 *p; + + n = selectDeviceRWMedia(port); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + lun = diag_targets[n].lun; + mode = diag_targets[n].mode; + size = diag_targets[n].size; + eedp = diag_targets[n].eedp; + + if (eedp) + { + eedp_mode = getEedpMode(port, eedp); + + if (eedp_mode < 0) + return 0; + } + + printf("\nTagging data value: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&tag) == 0) + return 1; + + printf("Number of blocks per I/O: [1-64 or RETURN to quit] "); + lbns = getNumberAnswer(1, 64, 0); + if (lbns == 0) + return 1; + + len = lbns * ((eedp_mode == 0) ? mode : 512); + + data_in = malloc(lbns * mode); + data_out = malloc(lbns * mode); + + printf("Stop pattern on Write error? [Yes or No, default is Yes] "); + quit = getYesNoAnswer(1); + + progress = ((size - 128) / 10) / lbns * lbns; + + printf("Testing started...\n"); + for (lbn = 128; lbn < size; i++, lbn += lbns) + { + p = (U32 *)data_out; + + for (i = 0; i < lbns; i++) + { + *p++ = set32x(tag); + for (j = 4; j < (int)((eedp_mode == 0) ? mode : 512); j += 4) + { + *p++ = set32x(lbn + i); + } + } + + if (doWrite(port, bus, target, lun, lbn, lbns, eedp_mode, data_out, len) != 1) + { + if (quit) + { + printf("W at lbn %d", lbn); + break; + } + else + { + printf("W "); + continue; + } + } + +// printf("."); + + if (lbn > 128 && (lbn - 128) % progress == 0) + { + printf(" %d%% ", (lbn - 128) * 10 / progress); + fflush(stdout); + } + } + printf("\nTesting ended...\n"); + + free(data_in); + free(data_out); + + return 1; +} + + +int +doReadCompareTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char *data_in; + unsigned char *data_out; + int i; + int j; + int n; + unsigned int mode; + unsigned int size; + int eedp; + U32 tag; + unsigned int lbn; + int lbns; + int len; + int progress; + int eedp_mode = 0; + int quit; + U32 *p; + U32 *q; + + n = selectDeviceRWMedia(port); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + lun = diag_targets[n].lun; + mode = diag_targets[n].mode; + size = diag_targets[n].size; + eedp = diag_targets[n].eedp; + + if (eedp) + { + eedp_mode = getEedpMode(port, eedp); + + if (eedp_mode < 0) + return 0; + } + + printf("\nTagging data value: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&tag) == 0) + return 1; + + printf("Number of blocks per I/O: [1-64 or RETURN to quit] "); + lbns = getNumberAnswer(1, 64, 0); + if (lbns == 0) + return 1; + + len = lbns * ((eedp_mode == 0) ? mode : 512); + + data_in = malloc(lbns * mode); + data_out = malloc(lbns * mode); + + printf("Stop pattern on Read or Compare error? [Yes or No, default is Yes] "); + quit = getYesNoAnswer(1); + + progress = ((size - 128) / 10) / lbns * lbns; + + printf("Testing started...\n"); + for (lbn = 128; lbn < size; i++, lbn += lbns) + { + p = (U32 *)data_out; + + for (i = 0; i < lbns; i++) + { + *p++ = set32x(tag); + for (j = 4; j < (int)((eedp_mode == 0) ? mode : 512); j += 4) + { + *p++ = set32x(lbn + i); + } + } + + if (doRead(port, bus, target, lun, lbn, lbns, eedp_mode, data_in, len) != 1) + { + if (quit) + { + printf("R at lbn %d", lbn); + break; + } + else + { + printf("R "); + continue; + } + } + + if (memcmp(data_in, data_out, len) != 0) + { + if (quit) + { + p = (U32 *)data_out; + q = (U32 *)data_in; + + for (i = 0; i < lbns; i++) + { + for (j = 0; j < (int)((eedp_mode == 0) ? mode : 512); j += 4) + { + if (*p++ != *q++) + { + printf("C at lbn %d offset %x", lbn + i, j); + i = lbns - 1; + break; + } + } + } + break; + } + else + { + printf("C "); + continue; + } + } + +// printf("."); + + if (lbn > 128 && (lbn - 128) % progress == 0) + { + printf(" %d%% ", (lbn - 128) * 10 / progress); + fflush(stdout); + } + } + printf("\nTesting ended...\n"); + + free(data_in); + free(data_out); + + return 1; +} + + +int +doTestUnitReadyTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char data[512]; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + if (doTestUnitReady(port, bus, target, lun) == 1) + { + printf("\nTest Unit Ready successful\n"); + } + else + { + printf("\nTest Unit Ready failed\n"); + } + + if (doRead(port, bus, target, lun, 0, 1, 0, data, sizeof data) == 1) + { + printf("\nRead successful\n"); + } + else + { + printf("\nRead failed\n"); + } + + + if (doTestUnitReady(port, bus, target, lun) == 1) + { + printf("\nTest Unit Ready successful\n"); + } + else + { + printf("\nTest Unit Ready failed\n"); + } + + printf("\n"); + } +} + + +int +doLogSenseTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int page; + unsigned char log[1024]; + int n; + int t; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("Page: [00-3F or RETURN to quit] "); + page = getNumberAnswerHex(0x00, 0x3f, -1); + if (page < 0) + return 1; + + printf("\n"); + + t = doLogSense(port, bus, target, lun, page, 1, log, sizeof log); + n = get2bytes(log, 2) + 4; + + if (t == 1) + { + printf(" B___T___L Page\n"); + printf("%2d %3d %3d %02x\n\n", + bus, target, lun, page); + + printf("%d bytes of Log Sense Data returned\n\n", n); + + if (n > sizeof log) + { + printf("Too much data received, only %d bytes will be displayed\n\n", (int)sizeof log); + n = sizeof log; + } + + displayByteData(log, n); + } + else + { + printf("Log Sense failed\n"); + } + + printf("\n"); + } +} + + +int +doReadCapacityTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + unsigned char inq[36]; + unsigned char cap[8]; + unsigned char bl[6]; + unsigned int min_size; + unsigned int max_size; + unsigned int gran; + unsigned int mode; + unsigned int size; + unsigned char cap16[32]; + uint64_t size16; + uint64_t capacity; + int t; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("\n"); + + if (doInquiry(port, bus, target, lun, inq, sizeof inq) == 1) + { + if ((inq[0] & 0x1f) == 0x01) + { + if (doReadBlockLimits(port, bus, target, lun, bl, sizeof bl) == 1) + { + min_size = get2bytes(bl, 4); + max_size = get3bytes(bl, 1); + gran = 1 << (bl[0] & 0x1f); + + printf("Min Block Size = %d, Max Block Size = %d, Granularity = %d\n", + min_size, max_size, gran); + } + else + { + printf("Read Block Limits failed\n"); + } + + printf("\n"); + + continue; + } + } + + if (doReadCapacity16(port, bus, target, lun, cap16, sizeof cap16) == 1) + { + mode = get4bytes(cap16, 8); + size16 = get8bytes(cap16, 0); + + capacity = (uint64_t)mode * (size16 + 1); + + printf("Block Size = %08x, Last Block = %016" INT64_FMT "x", mode, size16); + } + else if (doReadCapacity(port, bus, target, lun, cap, sizeof cap) == 1) + { + mode = get4bytes(cap, 4); + size = get4bytes(cap, 0); + + capacity = (uint64_t)mode * (size + 1); + + printf("Block Size = %08x, Last Block = %08x", mode, size); + } + else + { + capacity = 0; + + printf("Read Capacity failed\n"); + } + + if (capacity == 0) + { + } + else if (capacity > (uint64_t)1000*1000*1000*1000) + { + t = (int)(capacity / ((uint64_t)100*1000*1000*1000)); + printf(" -- Capacity is %d.%d TB\n", t / 10, t % 10); + } + else if (capacity > (uint64_t)1000*1000*1000) + { + t = (int)(capacity / ((uint64_t)100*1000*1000)); + printf(" -- Capacity is %d.%d GB\n", t / 10, t % 10); + } + else if (capacity > (uint64_t)1000*1000) + { + t = (int)(capacity / ((uint64_t)100*1000)); + printf(" -- Capacity is %d.%d MB\n", t / 10, t % 10); + } + else + { + t = (int)(capacity / ((uint64_t)100)); + printf(" -- Capacity is %d.%d KB\n", t / 10, t % 10); + } + + printf("\n"); + } +} + + +int +doModePageTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int control; + int page; + unsigned char data[255]; + int n; + int t; + char *control_strings[4] = {"Current", "Changeable", "Default", "Saved"}; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("Mode Page: [00-3F or RETURN to quit] "); + page = getNumberAnswerHex(0x00, 0x3f, -1); + if (page < 0) + return 1; + + printf("\n"); + + for (control = 0; control < 4; control++) + { + t = doModeSense(port, bus, target, lun, page, control, 0, data, sizeof data); + n = data[0] + 1; + + if (t == 1) + { + printf("%d bytes of Page %x %s Data returned\n\n", + n, page, control_strings[control]); + + displayByteData(data, n); + } + else + { + printf("Mode Sense (Page %x %s) failed\n", page, control_strings[control]); + } + + printf("\n"); + } + } +} + + +int +doEchoTest(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + FCDevicePage0_t FCDevicePage0; + ExLinkServiceSendRequest_t req; + ExLinkServiceSendReply_t rep; + U32 buf_in[32]; + U32 buf_out[32]; + U32 els; + U32 d_id; + U32 port_id; + int len; + int n; + int i; + char *type; + U32 port_ids[MAX_DEVICES]; + int pattern; + int passes; + int progress; + int ioc_status; + U32 code; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + port_id = get32(FCPortPage0.PortIdentifier); + + printf(" Type WWNN WWPN PortId\n"); + + n = 0; + d_id = 0xffffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, d_id, + &FCDevicePage0, sizeof FCDevicePage0) != 1) + break; + + d_id = get32(FCDevicePage0.PortIdentifier); + + if (d_id == port_id) + { + type = port->chipName; + } + else if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) + { + if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET) + type = "FCP Initiator & Target"; + else + type = "FCP Initiator"; + } + else + { + if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET) + type = "FCP Target"; + else + type = "Non-FCP"; + } + + port_ids[n] = d_id; + + n++; + + printf("%2d. %-24s %08x%08x %08x%08x %06x\n", n, type, + get32(FCDevicePage0.WWNN.High), get32(FCDevicePage0.WWNN.Low), + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), + d_id); + + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + printf("\nNo devices are available for this test\n"); + return 1; + } + + printf("\nSelect a device: [1-%d or RETURN to quit] ", n); + n = getNumberAnswer(1, n, 0); + if (n == 0) + return 1; + n--; + + d_id = port_ids[n]; + + els = 0x10; + + while (TRUE) + { + printf("\n"); + printf(" 1. Alternating, 8-Bit, 00 and FF\n"); + printf(" 2. Alternating, 8-Bit, 55 and AA\n"); + printf(" 3. Incrementing, 8-Bit\n"); + printf(" 4. Walking 1s and 0s, 8-Bit\n"); + printf(" 5. Alternating, 16-Bit, 0000 and FFFF\n"); + printf(" 6. Alternating, 16-Bit, 5555 and AAAA\n"); + printf(" 7. Incrementing, 16-Bit\n"); + printf(" 8. Walking 1s and 0s, 16-Bit\n"); + printf("\nSelect a data pattern: [1-8 or RETURN to quit] "); + pattern = getNumberAnswer(1, 8, 0); + if (pattern == 0) + return 1; + + printf("Pattern length in words: [2-32 or RETURN to quit] "); + len = getNumberAnswer(2, 32, 0); + if (len == 0) + return 1; + len *= 4; + + printf("Number of iterations: [1-1000000 or 0 for infinite or RETURN to quit] "); + passes = getNumberAnswer(0, 1000000, -1); + if (passes < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_EX_LINK_SRVC_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(d_id); + req.ElsCommandCode = set32(els); + + generatePattern(pattern, buf_out, len); + + buf_out[0] = set32x(els); + + progress = max(10, passes / 10); + + printf("Testing started...\n"); + for (i = 1; i <= passes || passes == 0; i++) + { + buf_in[0] = 0; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, len, SHORT_TIME) != 1) + { + printf("E"); + continue; + } + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("\nSendELS failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + return 0; + } + + code = (get32x_be(buf_in[0]) >> 24) & 0xff; + + if (code == 0x01) + { + printf("\nECHO ELS rejected\n"); + return 0; + } + + if (code != 0x02) + { + printf("\nECHO ELS not accepted, code is %02x\n", code); + return 0; + } + + if (memcmp(buf_in + 1, buf_out + 1, len - 4) != 0) + { + printf("C "); + continue; + } + +// printf("."); + + if (passes == 0) + { + if (i % 100000 == 0) + { + printf(" %d", i); + if (i == 1000000) + { + i = 0; + printf("\n"); + } + fflush(stdout); + } + } + else if (i % progress == 0) + { + printf(" %d%% ", i * 100 / passes); + fflush(stdout); + } + } + printf("\nTesting ended...\n"); + } +} + + +int +doReadLinkErrorStatusTest(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + FCDevicePage0_t FCDevicePage0; + ExLinkServiceSendRequest_t req; + ExLinkServiceSendReply_t rep; + U32 buf_in[7]; + U32 buf_out[2]; + U32 els; + U32 d_id; + U32 port_id; + int n; + char *type; + U32 port_ids[MAX_DEVICES]; + int ioc_status; + U32 code; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + port_id = get32(FCPortPage0.PortIdentifier); + + printf(" Type WWNN WWPN PortId\n"); + + n = 0; + d_id = 0xffffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, d_id, + &FCDevicePage0, sizeof FCDevicePage0) != 1) + break; + + d_id = get32(FCDevicePage0.PortIdentifier); + + if (d_id == port_id) + { + type = port->chipName; + } + else if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) + { + if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET) + type = "FCP Initiator & Target"; + else + type = "FCP Initiator"; + } + else + { + if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET) + type = "FCP Target"; + else + type = "Non-FCP"; + } + + port_ids[n] = d_id; + + n++; + + printf("%2d. %-24s %08x%08x %08x%08x %06x\n", n, type, + get32(FCDevicePage0.WWNN.High), get32(FCDevicePage0.WWNN.Low), + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), + d_id); + + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + printf("\nNo devices are available for this test\n"); + return 1; + } + + printf("\nSelect a device: [1-%d or RETURN to quit] ", n); + n = getNumberAnswer(1, n, 0); + if (n == 0) + return 1; + n--; + + printf("\n"); + + d_id = port_ids[n]; + + els = 0x0f; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_EX_LINK_SRVC_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(d_id); + req.ElsCommandCode = set32(els); + + buf_out[0] = set32x(els); + buf_out[1] = set32x_be(d_id); + + buf_in[0] = 0; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, sizeof buf_out, SHORT_TIME) == 1) + { + char buf[32]; + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("SendELS failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + return 0; + } + + code = (get32x_be(buf_in[0]) >> 24) & 0xff; + + if (code == 0x01) + { + printf("RLS ELS rejected\n"); + return 0; + } + + if (code != 0x02) + { + printf("RLS ELS not accepted, code is %02x\n", code); + return 0; + } + + format64bitDecimal(get32x_be(buf_in[1]), buf, sizeof buf); + printf("Link Failure Count %32s\n", buf); + + format64bitDecimal(get32x_be(buf_in[2]), buf, sizeof buf); + printf("Loss Of Sync Count %32s\n", buf); + + format64bitDecimal(get32x_be(buf_in[3]), buf, sizeof buf); + printf("Loss Of Signal Count %32s\n", buf); + + format64bitDecimal(get32x_be(buf_in[4]), buf, sizeof buf); + printf("Primitive Sequence Error Count %32s\n", buf); + + format64bitDecimal(get32x_be(buf_in[5]), buf, sizeof buf); + printf("Invalid Tx Word Count %32s\n", buf); + + format64bitDecimal(get32x_be(buf_in[6]), buf, sizeof buf); + printf("Invalid CRC Count %32s\n", buf); + } + + return 1; +} + + +int +doDisplayPortCounters(MPT_PORT *port) +{ + FCPortPage6_t FCPortPage6; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6) == 1) + { + char buf[32]; + uint64_t time; + int seconds; + int minutes; + int hours; + int days; + + time = get64(FCPortPage6.TimeSinceReset); + seconds = (int)(time / 1000000) % 60; + minutes = (int)(time / 1000000 / 60) % 60; + hours = (int)(time / 1000000 / 60 / 60) % 24; + days = (int)(time / 1000000 / 60 / 60 / 24); + sprintf(buf, "%d day%s + %02d:%02d:%02d", days, days == 1 ? "" : "s", hours, minutes, seconds); + printf("Time Since Reset %32s\n\n", buf); + + format64bitDecimal(get64(FCPortPage6.TxFrames), buf, sizeof buf); + printf("Tx Frames %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.RxFrames), buf, sizeof buf); + printf("Rx Frames %32s\n\n", buf); + + format64bitDecimal(get64(FCPortPage6.TxWords), buf, sizeof buf); + printf("Tx Words %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.RxWords), buf, sizeof buf); + printf("Rx Words %32s\n\n", buf); + + format64bitDecimal(get64(FCPortPage6.LipCount), buf, sizeof buf); + printf("LIP Count %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.NosCount), buf, sizeof buf); + printf("NOS Count %32s\n\n", buf); + + format64bitDecimal(get64(FCPortPage6.ErrorFrames), buf, sizeof buf); + printf("Error Frames %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.DumpedFrames), buf, sizeof buf); + printf("Dumped Frames %32s\n\n", buf); + + format64bitDecimal(get64(FCPortPage6.LinkFailureCount), buf, sizeof buf); + printf("Link Failure Count %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.LossOfSyncCount), buf, sizeof buf); + printf("Loss Of Sync Count %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.LossOfSignalCount), buf, sizeof buf); + printf("Loss Of Signal Count %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.PrimativeSeqErrCount), buf, sizeof buf); + printf("Primitive Sequence Error Count %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.InvalidTxWordCount), buf, sizeof buf); + printf("Invalid Tx Word Count %32s\n", buf); + + format64bitDecimal(get64(FCPortPage6.InvalidCrcCount), buf, sizeof buf); + printf("Invalid CRC Count %32s\n\n", buf); + + format64bitDecimal(get64(FCPortPage6.FcpInitiatorIoCount), buf, sizeof buf); + printf("FCP Initiator I/O Count %32s\n", buf); + } + + return 1; +} + + +int +doClearPortCounters(MPT_PORT *port) +{ + ConfigReply_t rep; + FCPortPage6_t FCPortPage6; + + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &rep) != 1) + return 0; + + memset(&FCPortPage6, 0, sizeof FCPortPage6); + + FCPortPage6.Header = rep.Header; + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6) != 1) + printf("Failed to clear port counters!\n"); + else + printf("Port counters have been cleared\n"); + + return 1; +} + + +int +doTriggerAnalyzerWithEcho(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + ExLinkServiceSendRequest_t req; + ExLinkServiceSendReply_t rep; + U32 buf_in[32]; + U32 buf_out[32]; + U32 els; + U32 d_id; + char name[256]; + int n; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + d_id = get32(FCPortPage0.PortIdentifier); + + els = 0x10; + + n = getFileName(name, sizeof name, stdin, "analyzer trigger", 0); + if (n > 0) + { + printf("Waiting for \"%s\" to be created...", name); + waitForFile(name); + printf("\nFile created, sending ECHO ELS\n"); + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_EX_LINK_SRVC_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(d_id); + req.ElsCommandCode = set32(els); + + memset(buf_out, 0, sizeof buf_out); + + buf_out[0] = set32x(els); + + memset(buf_in, 0, sizeof buf_in); + + return doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, sizeof buf_out, SHORT_TIME); +} + + +int +isSata(MPT_PORT *port, int bus, int target) +{ + int b_t; + int dev_handle; + int address; + SasDevicePage0_t SASDevicePage0; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (mpi2) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + dev_handle = 0; + address = MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle; + } + else + { + b_t = (bus << 8) + target; + address = (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <= 6) + { + t = get2bytes(vpd, 4); + if (t == 0x0001) + { + return 1; + } + } + } + } + } + } + } + + return 0; +} + + +int +getPath(MPT_PORT *port, int bus, int target, PATH *path) +{ + int b_t; + int dev_handle; + int address; + int handle; + SasDevicePage0_t SASDevicePage0; + SasEnclosurePage0_t SASEnclosurePage0; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (mpi2) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + dev_handle = 0; + address = MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle; + } + else + { + b_t = (bus << 8) + target; + address = (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <slot = get16(SASDevicePage0.Slot); + path->encl_id_l = get32(SASEnclosurePage0.EnclosureLogicalID.Low); + path->encl_id_h = get32(SASEnclosurePage0.EnclosureLogicalID.High); + return 1; + } + } + } + + return 0; +} + + +int +getParent(MPT_PORT *port, int bus, int target, int *parent) +{ + int b_t; + int dev_handle; + int address; + int handle; + SasDevicePage0_t SASDevicePage0; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (mpi2) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + dev_handle = 0; + address = MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle; + } + else + { + b_t = (bus << 8) + target; + address = (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <iocNumber; + + if (mpi2) + return isRaidPhysDisk2(port, bus, target, physdisk); + + IOCPage3 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 3, 0, &length); + if (IOCPage3 == NULL) + return 0; + + for (i = 0; i < IOCPage3->NumPhysDisks; i++) + { + if (bus == IOCPage3->PhysDisk[i].PhysDiskBus && + target == IOCPage3->PhysDisk[i].PhysDiskID && + ioc == IOCPage3->PhysDisk[i].PhysDiskIOC) + { + *physdisk = IOCPage3->PhysDisk[i].PhysDiskNum; + free(IOCPage3); + return 1; + } + } + + free(IOCPage3); + return 0; +} + + +int +isRaidPhysDisk2(MPT_PORT *port, int bus, int target, int *physdisk) +{ + Mpi2RaidConfigurationPage0_t *RaidConfigPage0; + int i; + int handle; + int flags; + int type; + + if (!mapBusTargetToDevHandle(port, bus, target, &handle)) + return 0; + + getRaidConfig(port, MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT, handle, -1, &RaidConfigPage0); + + if (RaidConfigPage0 == NULL) + return 0; + + for (i = 0; i < RaidConfigPage0->NumElements; i++) + { + flags = get16(RaidConfigPage0->ConfigElement[i].ElementFlags); + type = flags & MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE; + + if (type == MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT) + { + if (handle == get16(RaidConfigPage0->ConfigElement[i].PhysDiskDevHandle)) + { + if (physdisk) + *physdisk = RaidConfigPage0->ConfigElement[i].PhysDiskNum; + free(RaidConfigPage0); + return 1; + } + } + } + + free(RaidConfigPage0); + return 0; +} + + +int +doReadLogicalBlocks(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int physdisk; + U32 lbn; + int lbns; + unsigned char *buf; + int i; + int j; + int n; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("Logical block: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&lbn) == 0) + return 1; + + printf("Number of logical blocks: [1-64 or RETURN to quit] "); + lbns = getNumberAnswer(1, 64, 0); + if (lbns == 0) + return 1; + + n = lbns * 512; + buf = malloc(n); + + printf("\n"); + + if (isRaidPhysDisk(port, bus, target, &physdisk)) + { + + if (isRaidVolume(port, bus, target)) + { + printf("The device selected is part of a RAID Volume (PhysDisk %d)\n\n", physdisk); + printf("Do you want to directly access the PhysDisk? [Yes or No, default is No] "); + port->raidPassthru = getYesNoAnswer(0); + printf("\n"); + } + else + { + printf("The device selected is RAID PhysDisk %d\n\n", physdisk); + port->raidPassthru = 1; + } + port->raidBus = bus; + port->raidTarget = target; + port->raidPhysdisk = physdisk; + } + + if (doRead(port, bus, target, lun, lbn, lbns, 0, buf, n) == 1) + { + for (i = 0, j = 0; i < n/4; i++, j++) + { + if (j == 0) + printf("%04x : ", i*4); + + printf("%08x ", get32x(((unsigned int *)buf)[i])); + + if (j == 7) + { + printf("\n"); + j = -1; + } + + if ((i % 128) == 127) + printf("\n"); + } + } + else + { + printf("Read failed\n\n"); + } + + free(buf); + } + + return 1; +} + + +int +doWriteLogicalBlocks(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int physdisk; + U32 lbn; + int lbns; + unsigned char *buf; + int n; + int pattern; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("Logical block: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&lbn) == 0) + return 1; + + printf("Number of logical blocks: [1-64 or RETURN to quit] "); + lbns = getNumberAnswer(1, 64, 0); + if (lbns == 0) + return 1; + + printf("Data to write: [0=Zeros, 1=Ones, 2=Preserve (read first), default is 2] "); + pattern = getNumberAnswer(0, 2, 2); + + n = lbns * 512; + buf = malloc(n); + + printf("\n"); + + if (isRaidPhysDisk(port, bus, target, &physdisk)) + { + + if (isRaidVolume(port, bus, target)) + { + printf("The device selected is part of a RAID Volume (PhysDisk %d)\n\n", physdisk); + printf("Do you want to directly access the PhysDisk? [Yes or No, default is No] "); + port->raidPassthru = getYesNoAnswer(0); + printf("\n"); + } + else + { + printf("The device selected is RAID PhysDisk %d\n\n", physdisk); + port->raidPassthru = 1; + } + port->raidBus = bus; + port->raidTarget = target; + port->raidPhysdisk = physdisk; + } + + if (pattern == 2) + { + if (doRead(port, bus, target, lun, lbn, lbns, 0, buf, n) != 1) + { + printf("Read failed\n\n"); + continue; + } + } + else if (pattern == 0) + { + memset(buf, 0x00, n); + } + else if (pattern == 1) + { + memset(buf, 0xff, n); + } + + if (doWrite(port, bus, target, lun, lbn, lbns, 0, buf, n) == 1) + { + printf("Write successful\n\n"); + } + else + { + printf("Write failed\n\n"); + } + + free(buf); + } + + return 1; +} + + +int +doVerifyLogicalBlocks(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int physdisk; + U32 lbn; + int lbns; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("Logical block: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&lbn) == 0) + return 1; + + printf("Number of logical blocks: [1-1024 or RETURN to quit] "); + lbns = getNumberAnswer(1, 1024, 0); + if (lbns == 0) + return 1; + + printf("\n"); + + if (isRaidPhysDisk(port, bus, target, &physdisk)) + { + + if (isRaidVolume(port, bus, target)) + { + printf("The device selected is part of a RAID Volume (PhysDisk %d)\n\n", physdisk); + printf("Do you want to directly access the PhysDisk? [Yes or No, default is No] "); + port->raidPassthru = getYesNoAnswer(0); + printf("\n"); + } + else + { + printf("The device selected is RAID PhysDisk %d\n\n", physdisk); + port->raidPassthru = 1; + } + port->raidBus = bus; + port->raidTarget = target; + port->raidPhysdisk = physdisk; + } + + if (doVerify(port, bus, target, lun, lbn, lbns, 0, NULL, 0) == 1) + { + printf("Verify successful\n\n"); + } + else + { + printf("Verify failed\n\n"); + } + } + + return 1; +} + + +int +doDiagnosticPageTest(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int page; + unsigned char data[1024]; + int i; + int n; + int t; + int value; + int changed; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("Diagnostic Page: [00-FF or RETURN to quit] "); + page = getNumberAnswerHex(0x00, 0xff, -1); + if (page < 0) + return 1; + + printf("\n"); + + t = doReceiveDiagnosticResults(port, bus, target, lun, page, data, sizeof data); + n = get2bytes(data, 2) + 4; + + if (t == 1) + { + printf("%d bytes of Page %x Data returned\n\n", n, page); + + if (n > sizeof data) + { + printf("Too much data received, only %d bytes will be displayed\n\n", (int)sizeof data); + n = sizeof data; + + t = 0; + } + + displayByteData(data, n); + + if (t && (page == 0x02 || + page == 0x04 || + page == 0x0c || + page == 0x0e || + page == 0x0f || + page >= 0x10)) + { + printf("\nDo you want to make changes? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + { + changed = FALSE; + + while (TRUE) + { + printf("\nEnter offset of value to change: [00-%02x or RETURN to quit] ", n - 1); + i = getNumberAnswerHex(0, n - 1, -1); + if (i < 0) + break; + + printf("Enter value: [00-FF or RETURN to not change] "); + value = getNumberAnswerHex(0x00, 0xff, -1); + if (value < 0) + continue; + + data[i] = (unsigned char)value; + + changed = TRUE; + + printf("\n"); + + displayByteData(data, n); + } + + if (changed == TRUE) + { + printf("\nDo you want to write your changes? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + { + if (doSendDiagnostic(port, bus, target, lun, data, n) != 1) + { + printf("Send Diagnostic (Page %x) failed\n", page); + } + } + } + } + } + } + else + { + printf("Receive Diagnostic Results (Page %x) failed\n", page); + } + + printf("\n"); + } +} + + +int +doInjectRepairMediaError(MPT_PORT *port, int inject) +{ + int bus; + int target; + int lun; + int physdisk; + int sata; + U32 lbn; + unsigned char *buf; + int i; + int j; + int n; + int t; + int resid; + + buf = malloc(1024); + + while (TRUE) + { + port->raidPassthru = 0; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + break; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + break; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + break; + + printf("Logical block: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&lbn) == 0) + break; + + if (isRaidPhysDisk(port, bus, target, &physdisk)) + { + printf("\nThe device selected is RAID PhysDisk %d\n", physdisk); + port->raidPassthru = 1; + port->raidBus = bus; + port->raidTarget = target; + port->raidPhysdisk = physdisk; + } + + /* first try using WRITE LONG(10) with the WR_UNCOR bit set. For SATA devices + * this should get translated to WRITE UNCORRECTABLE EXT + * If a SATA device supports WRITE UNCORRECTABLE EXT, then word 120, bit 2 of + * the IDENTIFY data should be set + */ + if (inject) + { + printf("Attempting error injection via WRITE LONG(10) / ATA WRITE UNCORRECTABLE EXT\n"); + if (doWriteLong(port, bus, target, lun, lbn, 0, NULL, 0, &resid) == 1 && resid == 0) + { + printf("\nWrite (inject) successful\n\n"); + continue; + } + } + + sata = isSata(port, bus, target); + + if (sata) + { + n = 1024; + + printf("Attempting error %s via SATA SCT / Long Sector Read/Write\n", inject ? "injection" : "repair"); + if (doReadLongSata(port, bus, target, lun, lbn, 0, buf, n) != 1) + { + if (inject) + { + printf("\nRead failed\n\n"); + continue; + } + printf("\nRead failed, can't preserve data\n"); + n = 0; + } + } + else + { + n = 512; + + if (doReadLong(port, bus, target, lun, lbn, 0, buf, n, &resid) != 1) + { + if (inject) + { + printf("\nRead failed\n\n"); + continue; + } + printf("\nRead failed, can't preserve data\n"); + n = 0; + } + else + { + n -= resid; + + printf("\nActual block size is %d bytes\n", n); + + if (doReadLong(port, bus, target, lun, lbn, 0, buf, n, &resid) != 1 || resid != 0) + { + if (inject) + { + printf("\nRead failed\n\n"); + continue; + } + printf("\nRead failed, can't preserve data\n"); + n = 0; + } + } + } + + for (i = 0, j = 0; i < n/4; i++, j++) + { + if ((i % 128) == 0) + printf("\n"); + + if (j == 0) + printf("%04x : ", i*4); + + printf("%08x ", get32x(((unsigned int *)buf)[i])); + + if (j == 7) + { + printf("\n"); + j = -1; + } + } + + if (j != 0) + printf("\n"); + + if (inject) + { + for (i = 512; i < n; i++) + if (buf[i]) + buf[i] = 0; + else + buf[i] = 1; + + if (sata) + { + t = doWriteLongSata(port, bus, target, lun, lbn, 0, buf, n); + } + else + { + t = doWriteLong(port, bus, target, lun, lbn, 0, buf, n, &resid) == 1 && resid == 0; + } + } + else + { + t = doWrite(port, bus, target, lun, lbn, 1, 0, buf, 512) == 1; + } + + if (t) + { + printf("\nWrite (%s) successful\n\n", inject ? "inject" : "repair"); + } + else + { + printf("Write (%s) failed\n\n", inject ? "inject" : "repair"); + } + } + + free(buf); + + return 1; +} + + +int +doSoftwareWriteProtect(MPT_PORT *port, int flag) +{ + int bus; + int target; + int lun; + unsigned char data[4+12]; + int n; + int t; + int offset = 4 + 4; + int bit = 3; + int mask; + char *mode = flag ? "set" : "clear"; + + mask = 1 << bit; + flag <<= bit; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("\n"); + + t = doModeSense(port, bus, target, lun, 0x0a, 1, 1, data, sizeof data); + n = data[0] + 1; + + if (t == 1 && n == sizeof data) + { + if (!(data[offset] & mask)) + { + printf("Software Write Protect is not changeable!\n\n"); + continue; + } + } + else + { + printf("Mode Sense (Changeable Control Mode Page) failed\n\n"); + continue; + } + + t = doModeSense(port, bus, target, lun, 0x0a, 0, 1, data, sizeof data); + n = data[0] + 1; + + if (t == 1 && n == sizeof data) + { + if ((data[offset] & mask) == flag) + { + printf("Software Write Protect is already %s\n\n", mode); + continue; + } + else + { + data[0] = 0; + data[1] = 0; + data[2] = 0; + + data[4] &= 0x3f; + + data[offset] &= ~mask; + data[offset] |= flag; + + if (doModeSelect(port, bus, target, lun, 0, data, sizeof data) != 1) + { + printf("Mode Select (Current Control Mode Page) failed\n\n"); + continue; + } + } + } + else + { + printf("Mode Sense (Current Control Mode Page) failed\n\n"); + continue; + } + + printf("Software Write Protect is now %s\n\n", mode); + } +} + + +int +doReadWriteCache(MPT_PORT *port, int flag) +{ + int bus; + int target; + int lun; + unsigned char data[4+20]; + int n; + int t; + int offset = 4 + 2; + int bit = (flag & 2) ? 2 : 0; + int mask; + char *type = (flag & 2) ? "Write" : "Read"; + char *mode = (flag & 1) ? "enabled" : "disabled"; + + flag &= 1; + + mask = 1 << bit; + flag <<= bit; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("\n"); + + t = doModeSense(port, bus, target, lun, 0x08, 1, 1, data, sizeof data); + n = data[0] + 1; + + if (t == 1 && n == sizeof data) + { + if (!(data[offset] & mask)) + { + printf("%s Cache is not changeable!\n\n", type); + continue; + } + } + else + { + printf("Mode Sense (Changeable Caching Mode Page) failed\n\n"); + continue; + } + + t = doModeSense(port, bus, target, lun, 0x08, 0, 1, data, sizeof data); + n = data[0] + 1; + + if (t == 1 && n == sizeof data) + { + if ((data[offset] & mask) == flag) + { + printf("%s Cache is already %s\n\n", type, mode); + continue; + } + else + { + data[0] = 0; + data[1] = 0; + data[2] = 0; + + data[4] &= 0x3f; + + data[offset] &= ~mask; + data[offset] |= flag; + + if (doModeSelect(port, bus, target, lun, 0, data, sizeof data) != 1) + { + printf("Mode Select (Current Caching Mode Page) failed\n\n"); + continue; + } + } + } + else + { + printf("Mode Sense (Current Caching Mode Page) failed\n\n"); + continue; + } + + printf("%s Cache is now %s\n\n", type, mode); + } +} + + +int +doDisplayPhyCounters(MPT_PORT *port) +{ + SasIOUnitPage0_t *SASIOUnitPage0; + Mpi2SasIOUnitPage0_t *SASIOUnitPage0_2; + SasIOUnit0PhyData *SASIOUnit0PhyData; + SasPhyPage1_t SASPhyPage1; + SasExpanderPage0_t SASExpanderPage0; + SasExpanderPage1_t SASExpanderPage1; + U32 handle; + int length; + int phy; + int rate; + int link_up; + uint64_t count1; + uint64_t count2; + uint64_t count3; + uint64_t count4; + char buf[32]; + unsigned char report_phy_error_log_req[12]; + unsigned char report_phy_error_log_rsp[28]; + + SASIOUnitPage0 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, &length); + if (SASIOUnitPage0 == NULL) + return 0; + + SASIOUnitPage0_2 = (pMpi2SasIOUnitPage0_t)SASIOUnitPage0; + + for (phy = 0; phy < SASIOUnitPage0->NumPhys; phy++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 1, phy, &SASPhyPage1, sizeof SASPhyPage1) == 1) + { + if (phy != 0) + printf("\n"); + + if (mpi2) + { + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0_2->PhyData[phy]; + rate = (SASIOUnit0PhyData->NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_LOGICAL) >> + MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL; + } + else + { + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0->PhyData[phy]; + rate = SASIOUnit0PhyData->NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL; + } + + link_up = rate == MPI_SAS_IOUNIT0_RATE_1_5 || + rate == MPI_SAS_IOUNIT0_RATE_3_0 || + rate == MPI2_SAS_NEG_LINK_RATE_6_0 || + rate == MPI25_SAS_NEG_LINK_RATE_12_0; + printf("Adapter Phy %d: Link %s", phy, link_up ? "Up" : "Down"); + count1 = get32(SASPhyPage1.InvalidDwordCount); + count2 = get32(SASPhyPage1.RunningDisparityErrorCount); + count3 = get32(SASPhyPage1.LossDwordSynchCount); + count4 = get32(SASPhyPage1.PhyResetProblemCount); + if (count1 || count2 || count3 || (link_up ? count4 : 0)) + { + printf("\n"); + format64bitDecimal(count1, buf, sizeof buf); + printf(" Invalid DWord Count %32s\n", buf); + format64bitDecimal(count2, buf, sizeof buf); + printf(" Running Disparity Error Count %32s\n", buf); + format64bitDecimal(count3, buf, sizeof buf); + printf(" Loss of DWord Synch Count %32s\n", buf); + format64bitDecimal(count4, buf, sizeof buf); + printf(" Phy Reset Problem Count %32s\n", buf); + } + else + { + printf(", No Errors\n"); + } + } + } + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, handle, + &SASExpanderPage0, sizeof SASExpanderPage0) != 1) + break; + + handle = get16(SASExpanderPage0.DevHandle); + + for (phy = 0; phy < SASExpanderPage0.NumPhys; phy++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 1, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM + <> + MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL; + else + rate = SASExpanderPage1.NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL; + + link_up = rate == MPI_SAS_IOUNIT0_RATE_1_5 || + rate == MPI_SAS_IOUNIT0_RATE_3_0 || + rate == MPI2_SAS_NEG_LINK_RATE_6_0 || + rate == MPI25_SAS_NEG_LINK_RATE_12_0; + printf("Expander (Handle %04x) Phy %d: Link %s", handle, phy, link_up ? "Up" : "Down"); + count1 = get4bytes(report_phy_error_log_rsp, 12); + count2 = get4bytes(report_phy_error_log_rsp, 16); + count3 = get4bytes(report_phy_error_log_rsp, 20); + count4 = get4bytes(report_phy_error_log_rsp, 24); + if (count1 || count2 || count3 || (link_up ? count4 : 0)) + { + printf("\n"); + format64bitDecimal(count1, buf, sizeof buf); + printf(" Invalid DWord Count %32s\n", buf); + format64bitDecimal(count2, buf, sizeof buf); + printf(" Running Disparity Error Count %32s\n", buf); + format64bitDecimal(count3, buf, sizeof buf); + printf(" Loss of DWord Synch Count %32s\n", buf); + format64bitDecimal(count4, buf, sizeof buf); + printf(" Phy Reset Problem Count %32s\n", buf); + } + else + { + printf(", No Errors\n"); + } + } + else + { + printf("Report Phy Error Log failed\n"); + break; + } + } + } + + free(SASIOUnitPage0); + + return 1; +} + + +int +doClearPhyCounters(MPT_PORT *port) +{ + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + SasIOUnitPage0_t *SASIOUnitPage0; + SasExpanderPage0_t SASExpanderPage0; + SasExpanderPage1_t SASExpanderPage1; + U32 handle; + int length; + int phy; + unsigned char phy_control_req[40]; + unsigned char phy_control_rsp[4]; + + SASIOUnitPage0 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, &length); + if (SASIOUnitPage0 == NULL) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + req.Operation = MPI_SAS_OP_PHY_CLEAR_ERROR_LOG; + + for (phy = 0; phy < SASIOUnitPage0->NumPhys; phy++) + { + req.PhyNum = phy; + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME) != 1) + printf("Failed to clear phy %d counters!\n", phy); + else + printf("Adapter Phy %d counters have been cleared\n", phy); + } + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, handle, + &SASExpanderPage0, sizeof SASExpanderPage0) != 1) + break; + + handle = get16(SASExpanderPage0.DevHandle); + + for (phy = 0; phy < SASExpanderPage0.NumPhys; phy++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 1, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM + <maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + if (!isSata(port, bus, target)) + { + printf("\nCan't do Identify Device, device is not SATA!\n\n"); + continue; + } + +{ + SataPassthroughRequest_t req; + SataPassthroughReply_t rep; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SATA_PASSTHROUGH; + req.PassthroughFlags = set16(MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_READ); + req.DataLength = set32(sizeof id); + req.CommandFIS[0] = 0x27; + req.CommandFIS[1] = 0x80; + req.CommandFIS[2] = 0xec; + + setName(port, bus, target, &req); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + id, sizeof id, NULL, 0, SHORT_TIME) != 1) + { + printf("SataPassThrough failed!\n"); + t = 0; + } + + else + t = 1; +} + + if (t == 1) + { + printf("\n%d words of Identify Device Data returned\n\n", (int)(sizeof id / 2)); + + for (i = 0, j = 0; i < sizeof id; i++, j++) + { + if (j == 0) + printf("%3d : ", i / 2); + + if (i & 1) + printf("%02x ", id[i^1]); + else + printf("%02x", id[i^1]); + + if (!isprint(id[i^1])) + c[j] = ' '; + else + c[j] = id[i^1]; + + if (j == sizeof c - 2) + { + c[j+1] = 0; + printf(" %s\n", c); + j = -1; + } + } + + if (j != 0) + { + c[j] = 0; + for (i = j; i < sizeof c - 1; i++) + if (i & 1) + printf(" "); + else + printf(" "); + + printf(" %s\n", c); + } + } + else + { + printf("Identify Device failed\n"); + } + + printf("\n"); + } +} + + +int +doSataClearAffiliationTest(MPT_PORT *port) +{ + SasDevicePage0_t SASDevicePage0; + SasExpanderPage0_t SASExpanderPage0; + int bus; + int target; + int b_t; + int dev_handle; + int address; + int info; + int parent; + unsigned char report_phy_sata_req[12]; + unsigned char report_phy_sata_rsp[56]; + unsigned char phy_control_req[40]; + unsigned char phy_control_rsp[4]; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("\n"); + + if (mpi2) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + dev_handle = 0; + address = MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle; + } + else + { + b_t = (bus << 8) + target; + address = (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + if (!isSata(port, bus, target)) + { + printf("\nCan't do SMART Read, device is not SATA!\n\n"); + continue; + } + +{ + SataPassthroughRequest_t req; + SataPassthroughReply_t rep; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SATA_PASSTHROUGH; + req.PassthroughFlags = set16(MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_READ); + req.DataLength = set32(sizeof data); + req.CommandFIS[0] = 0x27; + req.CommandFIS[1] = 0x80; + req.CommandFIS[2] = 0xb0; + req.CommandFIS[3] = 0xd0; + req.CommandFIS[5] = 0x4f; + req.CommandFIS[6] = 0xc2; + + setName(port, bus, target, &req); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + data, sizeof data, NULL, 0, SHORT_TIME) != 1) + { + printf("SataPassThrough failed!\n"); + t = 0; + } + + else + t = 1; +} + + if (t == 1) + { + printf("\n%d words of SMART Read Data returned\n\n", (int)(sizeof data / 2)); + + for (i = 0, j = 0; i < sizeof data; i++, j++) + { + if (j == 0) + printf("%3d : ", i / 2); + + if (i & 1) + printf("%02x ", data[i^1]); + else + printf("%02x", data[i^1]); + + if (!isprint(data[i^1])) + c[j] = ' '; + else + c[j] = data[i^1]; + + if (j == sizeof c - 2) + { + c[j+1] = 0; + printf(" %s\n", c); + j = -1; + } + } + + if (j != 0) + { + c[j+1] = 0; + for (i = j; i < sizeof c - 1; i++) + if (i & 1) + printf(" "); + else + printf(" "); + + printf(" %s\n", c); + } + } + else + { + printf("SMART Read failed\n"); + } + + printf("\n"); + } +} + + +int +doSepTest(MPT_PORT *port) +{ + SEPRequest_t req; + SEPReply_t rep; + int bus; + int target; + int handle; + int slot; + int flags = MPI_SEP_REQ_FLAGS_BUS_TARGETID_ADDRESS; + U32 status; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + printf("Use Enclosure/Slot, not Bus/Target, addressing? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) == 1) + { + flags = MPI_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS; + } + } + + while (TRUE) + { + if (flags == MPI_SEP_REQ_FLAGS_ENCLOSURE_SLOT_ADDRESS) + { + printf("Enclosure handle: [0000-FFFF or RETURN to quit] "); + handle = getNumberAnswerHex(0x0000, 0xffff, -1); + if (handle < 0) + return 1; + + printf("Slot: [0-255 or RETURN to quit] "); + slot = getNumberAnswer(0, 255, -1); + if (slot < 0) + return 1; + + bus = 0; + target = 0; + } + else + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + handle = 0; + slot = 0; + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR; + req.Flags = flags; + req.EnclosureHandle = set16(handle); + req.Slot = set16(slot); + + setName(port, bus, target, &req); + + req.Action = MPI_SEP_REQ_ACTION_READ_STATUS; + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("SCSI Enclosure Processor Read Status failed!\n"); + } + else + { + status = get32(rep.SlotStatus); + + printf("\nSlot Status = %08x\n", status); + + printf("\nDo you want to change the Slot Status? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) == 1) + { + printf("Enter value: [00000000-FFFFFFFF or RETURN to skip] "); + if (parseHexNumberChange(&status) == 1) + { + req.Action = MPI_SEP_REQ_ACTION_WRITE_STATUS; + req.SlotStatus = set32(status); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("SCSI Enclosure Processor Write Status failed!\n"); + } + } + } + } + + printf("\n"); + } +} + + +int +doProdSpecSasIoUnitControl(MPT_PORT *port) +{ + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + int iocparameter; + U32 iocparametervalue; + int devhandle; + + if (mpi2) + { + return doProdSpecSasIoUnitControl2(port); + } + + while (TRUE) + { + printf("Enter IOC Parameter: [80-FF or RETURN to quit] "); + iocparameter = getNumberAnswerHex(0x80, 0xff, -1); + if (iocparameter < 0) + return 1; + + printf("Enter IOC Parameter: [00000000-FFFFFFFF or RETURN if not needed] "); + if (getHexNumberAnswer(&iocparametervalue) == 0) + iocparametervalue = 0; + + printf("Enter DevHandle: [0000-FFFF or RETURN if not needed] "); + devhandle = getNumberAnswerHex(0x0000, 0xffff, 0); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + req.Operation = MPI_SAS_OP_SET_IOC_PARAMETER; + req.IOCParameter = iocparameter; + req.IOCParameterValue = set32(iocparametervalue); + req.DevHandle = set16(devhandle); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + printf("Failed to issue product-specific SAS IO Unit Control request!\n"); + + printf("\n"); + } +} + + +int +doProdSpecSasIoUnitControl2(MPT_PORT *port) +{ + Mpi2SasIoUnitControlRequest_t req; + Mpi2SasIoUnitControlReply_t rep; + int iocparameter; + U32 iocparametervalue; + int devhandle; + + while (TRUE) + { + printf("Enter IOC Parameter: [80-FF or RETURN to quit] "); + iocparameter = getNumberAnswerHex(0x80, 0xff, -1); + if (iocparameter < 0) + return 1; + + printf("Enter IOC Parameter: [00000000-FFFFFFFF or RETURN if not needed] "); + if (getHexNumberAnswer(&iocparametervalue) == 0) + iocparametervalue = 0; + + printf("Enter DevHandle: [0000-FFFF or RETURN if not needed] "); + devhandle = getNumberAnswerHex(0x0000, 0xffff, 0); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL; + req.Operation = MPI2_SAS_OP_SET_IOC_PARAMETER; + req.IOCParameter = iocparameter; + req.IOCParameterValue = set32(iocparametervalue); + req.DevHandle = set16(devhandle); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + printf("Failed to issue product-specific SAS IO Unit Control request!\n"); + + printf("\n"); + } +} + + +int +doDiagDataUpload(MPT_PORT *port) +{ + ToolboxDiagDataUploadRequest_t req; + ToolboxReply_t rep; + U32 flags; + DiagDataUploadHeader_t *header; + unsigned char *buf; + int length; + FILE *file; + char name[256]; + int n; + int binary = 0; + int binfile; + int i; + int j; + + printf("Enter flags: [00000000-FFFFFFFF or RETURN if not needed] "); + if (getHexNumberAnswer(&flags) == 0) + flags = 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI_TOOLBOX_DIAG_DATA_UPLOAD_TOOL; + req.Flags = set32(flags); + + printf("\nUploading diagnostic data...\n"); + + length = 16384 + sizeof *header; + buf = malloc(length); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf, length, NULL, 0, SHORT_TIME) != 1) + { + printf("Failed to upload diagnostic data!\n"); + return 0; + } + + header = (pDiagDataUploadHeader_t)buf; + length = get32(header->DiagDataLength); + + printf("%d bytes of data uploaded\n", length); + + if (length) + { + if (numFileNames) + { + n = getFileName(name, sizeof name, stdin, "output", 0); + } + else + { + printf("\nEnter output filename, or RETURN to send output to the screen: "); + n = getString(name, sizeof name, stdin); + } + if (n > 0) + { + if (gFlag == TRUE) + { + printf("File type: [0=ASCII, 1=Binary, default is 0] "); + binary = getNumberAnswer(0, 1, 0); + } + if (binary) + { + binfile = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (binfile < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + if (write(binfile, buf, length)); + close(binfile); + return 1; + } + else + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + } + else + { + file = stdout; + printf("\n"); + } + + for (i = 0, j = 0; i < length/4; i++, j++) + { + if (j == 0) + fprintf(file, "%04x : ", i*4); + + fprintf(file, "%08x ", get32x(((unsigned int *)buf)[i])); + + if (j == 7) + { + fprintf(file, "\n"); + j = -1; + } + } + + if (j != 0) + fprintf(file, "\n"); + + if (file != stdout) + fclose(file); + } + + free(buf); + + return 1; +} + + +int +doReportLunsTest(MPT_PORT *port) +{ + int bus; + int target; + int len; + unsigned char *luns; + int i; + int n; + int t; + + len = 8 + 256 + 8; + luns = malloc(len); + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + break; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + break; + + printf("\n"); + + t = doReportLuns(port, bus, target, luns, len); + n = get4bytes(luns, 0) / 8; + + if (t == 1) + { + if (n > 256) + { + printf("%d LUNs reported for this device, only 256 LUNs will be displayed\n\n", n); + n = 256; + } + + printf("LUN List: "); + for (i = 0; i < n; i++) + { + printf(" %d", get2bytes(luns, (i + 1) * 8)); + } + printf("\n"); + } + else + { + printf("Report LUNs failed\n"); + } + + printf("\n"); + } + + free(luns); + + return 1; +} + + +int +doDriveFirmwareDownload(MPT_PORT *port) +{ + int bus; + int target; + int n; + char name[256]; + unsigned char *imageBuf = NULL; + int imageLen; + int size; + unsigned char *buf; + int len; + int offset; + int mode; + int id; + + if (selectDevice(port, &bus, &target) != 1) + return 0; + + n = getFileName(name, sizeof name, stdin, "drive firmware", 0); + if (n > 0) + { + if (readFile(name, &imageBuf, &imageLen) != 1) + return 0; + } + else + { + printf("Image won't be downloaded\n"); + return 1; + } + + mode = isSata(port, bus, target) ? 5 : 7; + printf("Mode: [0-31, default is %d] ", mode); + mode = getNumberAnswer(0, 31, mode); + + printf("BufferID: [0-255, default is 0] "); + id = getNumberAnswer(0, 255, 0); + + if (yesFlag == FALSE) + { + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + free(imageBuf); + return 0; + } + } + + printf("\nDownloading image...\n"); + + buf = imageBuf; + len = imageLen; + offset = 0; + + while (len > 0) + { + if (mode == 5) + size = len; + else + size = min(len, 0x20000); + + if (doWriteBufferFull(port, bus, target, 0, mode, id, offset, buf, size) != 1) + { + printf("Download failed\n"); + if (wFlag) + fprintf(logFile, "%s: Drive Firmware Download (DRIVE_FW_DOWNLOAD): FAIL\n", + logPrefix(port)); + return 0; + } + + buf += size; + len -= size; + offset += size; + } + + printf("Download succeeded\n"); + if (wFlag) + fprintf(logFile, "%s: Drive Firmware Download (DRIVE_FW_DOWNLOAD) of size %x: PASS\n", + logPrefix(port), imageLen); + + free(imageBuf); + + return 1; +} + + +int +doSesDownloadMicrocode(MPT_PORT *port, int bus, int target, int lun, + int mode, int id, int offset, int size, unsigned char *buf, int len) +{ + unsigned char *data; + int n; + int t; + + n = ((len + 3) & ~3) + 24; + data = malloc(n); + t = n - 4; + + memset(data, 0, 24); + + data[0] = 0x0e; + data[2] = t >> 8; + data[3] = t; + data[8] = mode; + data[11] = id; + data[12] = offset >> 24; + data[13] = offset >> 16; + data[14] = offset >> 8; + data[15] = offset; + data[16] = size >> 24; + data[17] = size >> 16; + data[18] = size >> 8; + data[19] = size; + data[20] = len >> 24; + data[21] = len >> 16; + data[22] = len >> 8; + data[23] = len; + + memcpy(data + 24, buf, len); + + t = doSendDiagnostic(port, bus, target, lun, data, n); + + free(data); + + return t; +} + + +int +doExpanderChangeMfgDataFields(MPT_PORT *port) +{ + int bus; + int target; + int expanderType; + + if (selectExpander(port, &bus, &target, NULL, NULL, &expanderType) != 1) + return 0; + + if (bus == -1 && target == -1) + { + printf("Sorry, 'all' is not a valid selection for this operation\n"); + return 0; + } + + if (expanderType != EXPANDER_TYPE_LSI_GEN2_BOBCAT && + expanderType != EXPANDER_TYPE_LSI_GEN3_COBRA) + { + printf("This option is only supported on LSI SAS2/SAS3 expanders (Bobcat/Cobra).\n"); + return 0; + } + + return doExpanderGetSetMfgDataFields(port, bus, target, NULL, NULL, NULL); +} + + +/* fetch the expander SAS address, enclosure logical ID, and ethernet MAC address from + * the bobcat or cobra expander manufacturing data and return in sasAddr, enclLogId, and macAddr. + * If sasAddr, enclLogId, and macAddr are all NULL then interactively prompt for new + * addresses and program them into the expander's manufacturing data + */ +int +doExpanderGetSetMfgDataFields(MPT_PORT *port, int bus, int target, U64 *sasAddr, U64 *enclLogId, U8 *macAddr) +{ + unsigned char desc[4]; + unsigned char *imageBuf = NULL; + unsigned char *buf; + int imageLen; + int offset; + U16 pageId; + U16 pageLength; + U8 checksum8; + int i, x; + U64 sas_address; + U64 logical_id; + U8 mac_address[6]; + int mac_address_int[6]; + char mac_address_ascii[32]; + int prompt; + int enclIdPageOffset = 0; + int addrPageOffset = 0; + int etherPageOffset = 0; + int haveChange; + + if (!sasAddr && !enclLogId && !macAddr) + prompt = TRUE; + else + prompt = FALSE; + + haveChange = FALSE; + sas_address.High = 0; + sas_address.Low = 0; + logical_id.High = 0; + logical_id.Low = 0; + memset(mac_address, 0, sizeof mac_address); + + if (doReadBufferFull(port, bus, target, 0, 3, 1, 0, desc, sizeof desc) == 1) + { + imageLen = get3bytes(desc, 1); + } + else + { + printf("Can't read current manufacturing data, unknown buffer length.\n"); + return 0; + } + + imageBuf = (unsigned char *)malloc(imageLen); + + if (doReadBufferFull(port, bus, target, 0, 2, 1, 0, imageBuf, imageLen) == 1) + { + buf = imageBuf; + + offset = buf[3]; //get the start offset of the first config page from the region header + + if ( offset == 0xFF ) + { + printf("WARNING: The expander's manufacturing region does not appear to have valid data\n"); + free(imageBuf); + return 0; + } + + buf += offset; + while ( offset+8 < imageLen ) + { + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); + pageId = get16x(((U16 *)buf)[3]); + + if (pageLength == 0xFFFF && pageId == 0xFFFF) + break; + + for( i=0; i= 0x24) + { + if (checksum8 == buf[1]) + { + memcpy(mac_address, &buf[20], sizeof mac_address ); + etherPageOffset = offset; + } + else + { + printf("Found Ethernet config page, but checksum is invalid!\n"); + } + } + + // unit specific ethernet config page + if (pageId == 0xFE05 && pageLength == 0xC) + { + if (checksum8 == buf[1]) + { + memcpy(mac_address, &buf[8], sizeof mac_address ); + etherPageOffset = offset; + } + else + { + printf("Found unit specific Ethernet config page, but checksum is invalid!\n"); + } + } + + offset += pageLength + 4; + buf += pageLength + 4; + } + + if (prompt) + { + printf("Current SAS Address is %08x%08x\n", sas_address.High, sas_address.Low); + printf("Enter new SAS Address: [16 hex digits or RETURN to skip] "); + i = getHexDoubleNumberAnswer(&(sas_address.High), &(sas_address.Low)); + if (i != 0) + { + haveChange = TRUE; + buf = imageBuf + addrPageOffset; + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); +// displayByteData(buf, pageLength+4); + + ((U32 *)buf)[2] = set32x(sas_address.High); + ((U32 *)buf)[3] = set32x(sas_address.Low); + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + buf[1] = checksum8; +// displayByteData(buf, pageLength+4); + } + printf("Current Enclosure Logical ID is %08x%08x\n", logical_id.High, logical_id.Low); + printf("Enter new Enclosure Logical ID: [16 hex digits or RETURN to skip] "); + i = getHexDoubleNumberAnswer(&(logical_id.High), &(logical_id.Low)); + if (i != 0) + { + haveChange = TRUE; + buf = imageBuf + enclIdPageOffset; + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); +// displayByteData(buf, pageLength+4); + + ((U32 *)buf)[2] = set32x(logical_id.High); + ((U32 *)buf)[3] = set32x(logical_id.Low); + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + buf[1] = checksum8; +// displayByteData(buf, pageLength+4); + } + printf("Current Ethernet MAC Address is %02x-%02x-%02x-%02x-%02x-%02x\n", + mac_address[0],mac_address[1],mac_address[2], + mac_address[3],mac_address[4],mac_address[5]); + i = 0; + while ( TRUE ) + { + printf("Enter new MAC Address: [or RETURN to skip] "); + i = getStringFromArgs(mac_address_ascii, sizeof mac_address_ascii, stdin); + if (i == 0) + break; + + if ((sscanf(mac_address_ascii, "%x-%x-%x-%x-%x-%x", + &mac_address_int[0],&mac_address_int[1],&mac_address_int[2], + &mac_address_int[3],&mac_address_int[4],&mac_address_int[5]) == 6) && + mac_address_int[0] <= 0xFF && mac_address_int[1] <= 0xFF && + mac_address_int[2] <= 0xFF && mac_address_int[3] <= 0xFF && + mac_address_int[4] <= 0xFF && mac_address_int[5] <= 0xFF && + i <= 17) + { + for (x = 0; x < 6; x++) + mac_address[x] = mac_address_int[x]; + + break; + } + else + printf("Invalid MAC Address. Please enter a MAC Address in the form xx-xx-xx-xx-xx-xx\n"); + } + + if (i != 0) + { + haveChange = TRUE; + buf = imageBuf + etherPageOffset; + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); + pageId = get16x(((U16 *)buf)[3]); + +// displayByteData(buf, pageLength+4); + + if (pageId == 0xFF10) + memcpy(&buf[20], mac_address, sizeof mac_address); + else // pageId == 0xFE05 + memcpy(&buf[8], mac_address, sizeof mac_address); + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + buf[1] = checksum8; +// displayByteData(buf, pageLength+4); + } + + if (haveChange) + { + if (yesFlag == FALSE) + { + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + free(imageBuf); + return 0; + } + } + i = doWriteBufferFull(port, bus, target, 0, 2, 1, 0, imageBuf, imageLen); + } + else + i = 2; + + if (i == 1) + { + printf("\nWriting changes...Success!\n"); + } + else if (i == 2) + { + printf("\nNothing to do, no changes made.\n"); + } + else + { + printf("Writing changes failed\n"); + free(imageBuf); + return 0; + } + } + else + { + if (sasAddr) + *sasAddr = sas_address; + if (enclLogId) + *enclLogId = logical_id; + if (macAddr) + memcpy(macAddr, mac_address, sizeof mac_address); + } + + free(imageBuf); + return 1; + } + else + { + printf("Error reading manufacturing data from expander.\n"); + free(imageBuf); + return 0; + } +} + + +int +doExpanderFirmwareDownload(MPT_PORT *port) +{ + int bus; + int target; + int n; + int t; + char name[256]; + unsigned char *imageBuf = NULL; + int imageLen; + int size; + unsigned char *buf; + int len; + int offset; + int mode; + int id; + unsigned char *imageBufUpload = NULL; + int imageLenUpload; + MpiFwHeader_t *fwHeader; + U32 checksum32; + U8 checksum8; + int i, x; + int warn = 0; + int updateAll = FALSE; + int curr; + int expanderType; + int imageType; + int foundYeti; + int foundBobcat; + int foundCobra; + int foundOther; + int updateChoice; + int skip; + U64 currMfgSasAddr; + U64 currMfgEnclLogId; + U8 currMfgMACAddr[6]; + U64 newMfgSasAddr; + U64 newMfgEnclLogId; + U8 newMfgMACAddr[6]; + U64 mfgSasAddr; + U64 mfgEnclLogId; + U8 mfgMACAddr[6]; + U16 pageLength; + U16 pageId; + int enclIdPageOffset; + int addrPageOffset; + int etherPageOffset; + int choice; + int mac_address_int[6]; + char mac_address_ascii[32]; + + if (selectExpander(port, &bus, &target, NULL, NULL, &expanderType) != 1) + return 0; + + if (bus == -1 && target == -1) + updateAll = TRUE; + + if (updateAll) + { + curr = -1; + foundYeti = FALSE; + foundBobcat = FALSE; + foundCobra = FALSE; + foundOther = FALSE; + while (TRUE) + { + curr++; + + if (exp_targets[curr].bus == -1 && exp_targets[curr].target == -1) + break; + + if (exp_targets[curr].expanderType == EXPANDER_TYPE_LSI_GEN1_YETI) + foundYeti = TRUE; + else if (exp_targets[curr].expanderType == EXPANDER_TYPE_LSI_GEN2_BOBCAT) + foundBobcat = TRUE; + else if (exp_targets[curr].expanderType == EXPANDER_TYPE_LSI_GEN3_COBRA) + foundCobra = TRUE; + else + foundOther = TRUE; + } + + if (!foundYeti && !foundBobcat && !foundCobra) + { + printf("No supported LSI expanders found to update. The 'all' option to update all\n"); + printf("expanders is only supported for LSI SAS1 (Yeti) and SAS2 (Bobcat) expanders.\n"); + return 0; + } + + if (foundYeti + foundBobcat + foundCobra > 1) + { + printf("More than one type of LSI expander was found. Only one type can be updated.\n"); + printf("Which do you want to update? [0=SAS1 (Yeti), 1=SAS2 (Bobcat), 2=SAS3 (Cobra), default is 0] "); + updateChoice = getNumberAnswer(0, 2, 0); + if (updateChoice == 0) + expanderType = EXPANDER_TYPE_LSI_GEN1_YETI; + else if (updateChoice == 1) + expanderType = EXPANDER_TYPE_LSI_GEN2_BOBCAT; + else + expanderType = EXPANDER_TYPE_LSI_GEN3_COBRA; + } + else if (foundYeti) + expanderType = EXPANDER_TYPE_LSI_GEN1_YETI; + else if (foundBobcat) + expanderType = EXPANDER_TYPE_LSI_GEN2_BOBCAT; + else + expanderType = EXPANDER_TYPE_LSI_GEN3_COBRA; + + if (foundOther) + { + printf("The 'all' option to update all expanders is only supported for LSI SAS1 (Yeti)\n"); + printf("SAS2 (Bobcat), and SAS3 (Cobra) expanders. All other expanders will be ignored.\n"); + } + } + + n = getFileName(name, sizeof name, stdin, "expander firmware", 0); + if (n > 0) + { + if (readFile(name, &imageBuf, &imageLen) != 1) + return 0; + } + else + { + printf("Image won't be downloaded\n"); + return 1; + } + + printf("Mode: [0-31, default is 2] "); + mode = getNumberAnswer(0, 31, 2); + + printf("BufferID: [0-255, default is 2] "); + id = getNumberAnswer(0, 255, 2); + + if (id == 0 || id == 2 || + (id == 0xe2 && (expanderType == EXPANDER_TYPE_LSI_GEN2_BOBCAT || + expanderType == EXPANDER_TYPE_LSI_GEN3_COBRA))) + { + printWhatString("\nFirmware", imageBuf, imageLen); + + fwHeader = (pMpiFwHeader_t)imageBuf; + + if (get32(fwHeader->Signature0) == MPI_FW_HEADER_SIGNATURE_0 && + get32(fwHeader->Signature1) == MPI_FW_HEADER_SIGNATURE_1 && + get32(fwHeader->Signature2) == MPI_FW_HEADER_SIGNATURE_2) + { + imageType = EXPANDER_TYPE_LSI_GEN1_YETI; + } + else if (get32(fwHeader->Signature0) == BOBCAT_FW_HEADER_SIGNATURE_0 && + get32(fwHeader->Signature1) == BOBCAT_FW_HEADER_SIGNATURE_1 && + get32(fwHeader->Signature2) == BOBCAT_FW_HEADER_SIGNATURE_2) + { + imageType = EXPANDER_TYPE_LSI_GEN2_BOBCAT; + } + else if (get32(fwHeader->Signature0) == COBRA_FW_HEADER_SIGNATURE_0 && + get32(fwHeader->Signature1) == COBRA_FW_HEADER_SIGNATURE_1 && + get32(fwHeader->Signature2) == COBRA_FW_HEADER_SIGNATURE_2) + { + imageType = EXPANDER_TYPE_LSI_GEN3_COBRA; + } + else + { + if (!warn) + printf("\n"); + printf("Image's signature is not valid!\n"); + warn = 1; + imageType = EXPANDER_TYPE_UNKNOWN; + } + + checksum32 = 0; + for (i = 0; i < imageLen / 4; i++) + checksum32 += get32x(((U32 *)imageBuf)[i]); + + if (checksum32 != 0) + { + if (!warn) + printf("\n"); + printf("Image's checksum is invalid!\n"); + warn = 1; + } + + if (imageType != expanderType) + { + if (!warn) + printf("\n"); + printf("Image mismatch detected. The expander selected for updating is <%s>\n", printExpanderType(expanderType)); + printf("and the firmware image is for <%s>!\n", printExpanderType(imageType)); + warn = 1; + } + } + + if (id == 10) + { + int header_okay = 0; + int record_okay = 0; + + buf = imageBuf; + + if (buf[0] == 0x01 && buf[1] == 0x21 && buf[2] == 0x41 && buf[3] == 0x61) + { + header_okay = 1; + buf += 64; + } + + if (buf[0] == 'Y' && buf[1] == 'e' && buf[2] == 't' && buf[3] == 'i') + { + record_okay = 1; + } + + if (!record_okay) + { + if (!warn) + printf("\n"); + printf("Image's signature is not valid!\n"); + warn = 1; + } + else + { + if (mode == 2) + { + if (!header_okay) + { + printf("\nImage header not found, creating it...\n"); + + buf = malloc(imageLen + 64); + memset(buf, 0, 64); + buf[0] = 0x01; + buf[1] = 0x21; + buf[2] = 0x41; + buf[3] = 0x61; + memcpy(buf + 64, imageBuf, imageLen); + free(imageBuf); + + header_okay = 1; + + imageBuf = buf; + imageLen += 64; + } + } + + if (mode == 6 || mode == 7) + { + if (header_okay) + { + printf("\nImage header found, stripping it...\n"); + buf = malloc(imageLen - 64); + memcpy(buf, imageBuf + 64, imageLen - 64); + free(imageBuf); + + header_okay = 0; + + imageBuf = buf; + imageLen -= 64; + } + } + } + + t = header_okay ? 64 : 0; + + checksum8 = 0; + for (i = t; i < t + 220; i++) + checksum8 += imageBuf[i]; + + if (checksum8 != 0) + { + if (!warn) + printf("\n"); + printf("Image's checksum is invalid!\n"); + checksum8 = imageBuf[i-1] - checksum8; + printf(" At offset %04x, value %02x should be %02x\n", i-1, imageBuf[i-1], checksum8); + warn = 1; + } + } + + if ((expanderType == EXPANDER_TYPE_LSI_GEN2_BOBCAT || expanderType == EXPANDER_TYPE_LSI_GEN3_COBRA) && + (id == 1 || id == 0xE3)) + { + if (updateAll) + { + printf("Sorry, 'all' is not currently supported for updating LSI SAS2/SAS3 expander\n"); + printf("manufacturing data.\n"); + free(imageBuf); + return 0; + } + + if (imageBuf[2] != 0x10) + { + printf("This image does not appear to be a valid manufacturing image for an LSI SAS2/SAS3 expander!\n"); + warn = 1; + } + else + { + currMfgSasAddr.High = 0; + currMfgSasAddr.Low = 0; + currMfgEnclLogId.High = 0; + currMfgEnclLogId.Low = 0; + memset(currMfgMACAddr, 0, sizeof currMfgMACAddr); + + /* get the current SAS address, enclosure logical ID, and ethernet MAC address from the Bobcat or Cobra mfg data */ + doExpanderGetSetMfgDataFields(port, bus, target, &currMfgSasAddr, &currMfgEnclLogId, currMfgMACAddr); + newMfgSasAddr.High = 0; + newMfgSasAddr.Low = 0; + newMfgEnclLogId.High = 0; + newMfgEnclLogId.Low = 0; + memset(newMfgMACAddr, 0, sizeof newMfgMACAddr); + + buf = imageBuf; + offset = buf[3]; + buf += offset; + addrPageOffset = enclIdPageOffset = etherPageOffset = 0; + while ( offset+8 < imageLen ) + { + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); + pageId = get16x(((U16 *)buf)[3]); + + if (pageLength == 0xFFFF && pageId == 0xFFFF) + break; + if (pageLength == 0) + break; + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + + //sas address config page + if (pageId == 0xFF00 && pageLength == 0xC) + { + if (checksum8 == buf[1]) + { + newMfgSasAddr.High = get32x(((U32 *)buf)[2]); + newMfgSasAddr.Low = get32x(((U32 *)buf)[3]); + addrPageOffset = offset; + } + else + { + printf("Found SAS address config page in image, but checksum is invalid!\n"); + } + } + + //unit specific sas address page + if (pageId == 0xFE00 && pageLength == 0xC) + { + if (checksum8 == buf[1]) + { + newMfgSasAddr.High = get32x(((U32 *)buf)[2]); + newMfgSasAddr.Low = get32x(((U32 *)buf)[3]); + addrPageOffset = offset; + } + else + { + printf("Found unit specific SAS address config page, but checksum is invalid!\n"); + } + } + + // report general config page + if (pageId == 0xFF02 && pageLength == 0xC) + { + if (checksum8 == buf[1]) + { + newMfgEnclLogId.High = get32x(((U32 *)buf)[2]); + newMfgEnclLogId.Low = get32x(((U32 *)buf)[3]); + enclIdPageOffset = offset; + } + else + { + printf("Found Report General config page in image, but checksum is invalid!\n"); + } + } + + // unit specific report general config page + if (pageId == 0xFE01 && pageLength == 0xC) + { + if (checksum8 == buf[1]) + { + newMfgEnclLogId.High = get32x(((U32 *)buf)[2]); + newMfgEnclLogId.Low = get32x(((U32 *)buf)[3]); + enclIdPageOffset = offset; + } + else + { + printf("Found unit specific Report General config page, but checksum is invalid!\n"); + } + } + + // ethernet config page + if (pageId == 0xFF10 && pageLength >= 0x24) + { + if (checksum8 == buf[1]) + { + memcpy(newMfgMACAddr, &buf[20], sizeof newMfgMACAddr); + etherPageOffset = offset; + } + else + { + printf("Found Ethernet config page in image, but checksum is invalid!\n"); + } + } + + // unit specific ethernet config page + if (pageId == 0xFE05 && pageLength == 0xC) + { + if (checksum8 == buf[1]) + { + memcpy(newMfgMACAddr, &buf[8], sizeof newMfgMACAddr); + etherPageOffset = offset; + } + else + { + printf("Found unit specific Ethernet config page, but checksum is invalid!\n"); + } + } + + offset += pageLength + 4; + buf += pageLength + 4; + } + + if (addrPageOffset) + { + printf("Current SAS Address programmed in expander mfg data is %08x%08x\n", + currMfgSasAddr.High, currMfgSasAddr.Low); + printf("New SAS Address in supplied mfg image is %08x%08x\n", + newMfgSasAddr.High, newMfgSasAddr.Low); + while (TRUE) + { + printf("Use which SAS Address? [1=from supplied image, 2=preserve existing, 3=override, default is 1] "); + choice = getNumberAnswer(1, 3, 1); + if (choice == 3) + { + printf("Enter SAS Address: [16 hex digits or RETURN to quit] "); + i = getHexDoubleNumberAnswer(&(mfgSasAddr.High), &(mfgSasAddr.Low)); + if (i == 0) + continue; + } + break; + } + if (choice == 2) + mfgSasAddr = currMfgSasAddr; + + if (choice == 2 || choice == 3) + { + buf = imageBuf + addrPageOffset; + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); +// displayByteData(buf, pageLength+4); + + ((U32 *)buf)[2] = set32x(mfgSasAddr.High); + ((U32 *)buf)[3] = set32x(mfgSasAddr.Low); + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + buf[1] = checksum8; +// displayByteData(buf, pageLength+4); + } + } + else + { + printf("Unable to locate the SAS address config page in the image!\n"); + warn = 1; + } + + if (enclIdPageOffset) + { + printf("Current Enclosure Logical ID programmed in expander mfg data is %08x%08x\n", + currMfgEnclLogId.High, currMfgEnclLogId.Low); + printf("New Enclosure Logical ID in supplied mfg image is %08x%08x\n", + newMfgEnclLogId.High, newMfgEnclLogId.Low); + while (TRUE) + { + printf("Use which Enclosure Logical ID? [1=from supplied image, 2=preserve existing, 3=override, default is 1] "); + choice = getNumberAnswer(1, 3, 1); + if (choice == 3) + { + printf("Enter SAS Address: [16 hex digits or RETURN to quit] "); + i = getHexDoubleNumberAnswer(&(mfgEnclLogId.High), &(mfgEnclLogId.Low)); + if (i == 0) + continue; + } + break; + } + if (choice == 2) + mfgEnclLogId = currMfgEnclLogId; + + if (choice == 2 || choice == 3) + { + buf = imageBuf + enclIdPageOffset; + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); +// displayByteData(buf, pageLength+4); + + ((U32 *)buf)[2] = set32x(mfgEnclLogId.High); + ((U32 *)buf)[3] = set32x(mfgEnclLogId.Low); + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + buf[1] = checksum8; +// displayByteData(buf, pageLength+4); + } + } + else + { + printf("Unable to locate the Report General config page in the image!\n"); + warn = 1; + } + + if (etherPageOffset) + { + printf("Current Ethernet MAC Address programmed in expander mfg data is %02x-%02x-%02x-%02x-%02x-%02x\n", + currMfgMACAddr[0], currMfgMACAddr[1], currMfgMACAddr[2], + currMfgMACAddr[3], currMfgMACAddr[4], currMfgMACAddr[5]); + printf("New Ethernet MAC Address in supplied mfg image is %02x-%02x-%02x-%02x-%02x-%02x\n", + newMfgMACAddr[0], newMfgMACAddr[1], newMfgMACAddr[2], + newMfgMACAddr[3], newMfgMACAddr[4], newMfgMACAddr[5]); + while (TRUE) + { + printf("Use which MAC Address? [1=from supplied image, 2=preserve existing, 3=override, default is 1] "); + choice = getNumberAnswer(1, 3, 1); + if (choice == 3) + { + while ( TRUE ) + { + printf("Enter new MAC Address: [or RETURN to quit] "); + i = getStringFromArgs(mac_address_ascii, sizeof mac_address_ascii, stdin); + if (i == 0) + break; + + if ((sscanf(mac_address_ascii, "%x-%x-%x-%x-%x-%x", + &mac_address_int[0],&mac_address_int[1],&mac_address_int[2], + &mac_address_int[3],&mac_address_int[4],&mac_address_int[5]) == 6) && + mac_address_int[0] <= 0xFF && mac_address_int[1] <= 0xFF && + mac_address_int[2] <= 0xFF && mac_address_int[3] <= 0xFF && + mac_address_int[4] <= 0xFF && mac_address_int[5] <= 0xFF && + i <= 17) + { + for (x = 0; x < 6; x++) + mfgMACAddr[x] = mac_address_int[x]; + + break; + } + else + printf("Invalid MAC Address. Please enter a MAC Address in the form xx-xx-xx-xx-xx-xx\n"); + } + if (i == 0) + continue; + } + break; + } + if (choice == 2) + memcpy(mfgMACAddr, currMfgMACAddr, sizeof mfgMACAddr); + + if (choice == 2 || choice == 3) + { + buf = imageBuf + etherPageOffset; + checksum8 = 0; + pageLength = get16x(((U16 *)buf)[2]); + pageId = get16x(((U16 *)buf)[3]); +// displayByteData(buf, pageLength+4); + + if (pageId == 0xFF10) + memcpy(&buf[20], mfgMACAddr, sizeof mfgMACAddr); + else // pageId == 0xFE05 + memcpy(&buf[8], mfgMACAddr, sizeof mfgMACAddr); + + for( i=0; i < pageLength; i++ ) + { + checksum8 += buf[i+4]; + } + buf[1] = checksum8; +// displayByteData(buf, pageLength+4); + } + } + else + { + printf("Unable to locate the Ethernet config page in the image!\n"); + warn = 1; + } + } + } + + if (warn && noFlag == TRUE) + { + free(imageBuf); + return 0; + } + + if (warn || yesFlag == FALSE) + { + if (warn) + printf("\nAre you sure you want to continue? [Yes or No, default is No] "); + else + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + free(imageBuf); + return 0; + } + } + + curr = -1; + while (TRUE) + { + skip = FALSE; + if (updateAll) + { + curr++; + bus = exp_targets[curr].bus; + target = exp_targets[curr].target; + + if (bus == -1 && target == -1) + break; + + if (curr == 0) + printf("\n"); + + if (expanderType != exp_targets[curr].expanderType) + { + printf("Skipping image download to %d/%d...\n", bus, target); + skip = TRUE; + } + else + printf("Downloading image to %d/%d...\n", bus, target); + } + else + printf("\nDownloading image...\n"); + + if (skip) + len = 0; + else + len = imageLen; + + buf = imageBuf; + offset = 0; + + while (len > 0) + { + if (mode == 2 && (id == 0 || id == 2 || + (id == 0xe2 && (expanderType == EXPANDER_TYPE_LSI_GEN2_BOBCAT || + expanderType == EXPANDER_TYPE_LSI_GEN3_COBRA)))) + size = len; + else + size = min(len, CHUNK_SIZE); + + if (mode == 6 || mode == 7) + t = doSesDownloadMicrocode(port, bus, target, 0, mode, id, offset, imageLen, buf, size); + else + t = doWriteBufferFull(port, bus, target, 0, mode, id, offset, buf, size); + + if (t != 1) + { + printf("Download failed\n"); + return 0; + } + + buf += size; + len -= size; + offset += size; + + if (len > 0) + { + printf("."); + fflush(stdout); + } + else if (size != imageLen) + { + printf("\n"); + } + } + + if (!skip) + printf("Download succeeded\n"); + + if (!updateAll) + break; + } + + if (mode == 6 || mode == 7) + { + unsigned char data[24]; + int inProg; + + curr = -1; + while (TRUE) + { + skip = FALSE; + if (updateAll) + { + curr++; + bus = exp_targets[curr].bus; + target = exp_targets[curr].target; + + if (bus == -1 && target == -1) + break; + + if (expanderType != exp_targets[curr].expanderType) + skip = TRUE; + } + + inProg = FALSE; + while (!skip && TRUE) + { + if (doReceiveDiagnosticResults(port, bus, target, 0, 0x0e, data, sizeof data) == 1) + { + if (data[10] == mode + 10) + { + if (inProg) printf("\n"); + + if (updateAll) + printf("\nSES Download Microcode to %d/%d succeeded\n", bus, target); + else + printf("\nSES Download Microcode succeeded\n"); + + if (mode == 6) + printf("\nExpander will automatically reset itself\n"); + + break; + } + else + { + /* on some expander platforms 0x70 and 0x71 are used as interim statuses */ + if (((data[10] > 0) && (data[10] <= 3)) || data[10] == 0x70 || data[10] == 0x71) + { + if (!inProg) + { + if (updateAll) + printf("SES Download Microcode update to %d/%d in progress.", bus, target); + else + printf("SES Download Microcode update in progress."); + + inProg = TRUE; + } + else + { + printf("."); + fflush(stdout); + } + + sleep(1); + } + else + { + if ( inProg ) printf("\n"); + + if (updateAll) + printf("\nSES Download Microcode to %d/%d failed, status/additional status is %02x/%02x\n", + bus, target, data[10], data[11]); + else + printf("\nSES Download Microcode failed, status/additional status is %02x/%02x\n", + data[10], data[11]); + + break; + } + } + } + } + if (!updateAll) + break; + } + free(imageBuf); + + return 1; + } + + curr = -1; + while ( TRUE ) + { + skip = FALSE; + if (updateAll) + { + curr++; + bus = exp_targets[curr].bus; + target = exp_targets[curr].target; + + if (bus == -1 && target == -1) + break; + + if (expanderType != exp_targets[curr].expanderType) + skip = TRUE; + else + printf("\nVerifying download for %d/%d...\n", bus, target); + } + else + printf("\nVerifying download...\n"); + + imageLenUpload = CHUNK_SIZE; + imageBufUpload = (unsigned char *)malloc(imageLenUpload); + + if (skip) + len = 0; + else + len = imageLen; + + buf = imageBufUpload; + offset = 0; + + t = 1; + i = 1; + while (len > 0) + { + size = min(len, CHUNK_SIZE); + + if (doReadBufferFull(port, bus, target, 0, mode, id, offset, buf, size) != 1) + { + t = 0; + i = 0; + break; + } + + if (memcmp(imageBuf + offset, buf, size) != 0) + { + t = 0; + break; + } + + len -= size; + offset += size; + } + + if (!skip) + { + if (t == 1) + printf("Verification succeeded\n"); + else + { + if (offset == 0 && i == 0) + printf("Verification not supported!\n"); + else + printf("Verification failed!\n"); + } + } + + if (!updateAll) + break; + } + + free(imageBuf); + free(imageBufUpload); + + return 1; +} + + +int +doReadBufferFirmwareUpload(MPT_PORT *port) +{ + int bus; + int target; + unsigned char desc[4]; + int n; + int t; + char name[256]; + int file; + unsigned char *imageBuf = NULL; + int imageLen; + int length; + int offset; + int id; + + if (selectDevice(port, &bus, &target) != 1) + return 0; + + while (TRUE) + { + printf("\nBufferID: [0-255 or RETURN to quit] "); + id = getNumberAnswer(0, 255, -1); + if (id < 0) + return 1; + + if (doReadBufferFull(port, bus, target, 0, 3, id, 0, desc, sizeof desc) == 1) + { + length = get3bytes(desc, 1); + printf("Buffer length is %d\n", length); + } + else + { + length = 0; + printf("Buffer length is unknown\n"); + } + + n = getFileName(name, sizeof name, stdin, "output", 0); + if (n > 0) + { + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + printf("Buffer won't be saved\n"); + return 1; + } + + imageLen = CHUNK_SIZE; + if (length) + if (imageLen > length) + imageLen = length; + imageBuf = (unsigned char *)malloc(imageLen); + + offset = 0; + while (TRUE) + { + if (doReadBufferFull(port, bus, target, 0, 2, id, offset, imageBuf, imageLen) != 1) + { + if (length) + break; + if (imageLen == 0x200) + break; + imageLen /= 2; + continue; + } + + t = write(file, imageBuf, imageLen); + if (t != imageLen) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + break; + } + + offset += imageLen; + if (length) + if (offset >= length) + break; + } + + printf("\nWrote %d bytes to file %s\n", offset, name); + + close(file); + + free(imageBuf); + } + + return 1; +} + + +int +doRaidActions(MPT_PORT *port, int command) +{ + IOCPage2_t *IOCPage2; + IOCPage3_t *IOCPage3; + int length; + + if (bringOnline(port) != 1) + return 0; + + if (mpi2) + return doRaidActions2(port, command); + + IOCPage2 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 2, 0, &length); + if (IOCPage2 == NULL || IOCPage2->MaxVolumes == 0) + { + printf("RAID is not supported on this port\n"); + if (IOCPage2) + free(IOCPage2); + return 0; + } + + IOCPage3 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 3, 0, &length); + if (IOCPage3 == NULL) + { + printf("RAID is not supported on this port\n"); + free(IOCPage2); + return 0; + } + + switch (command) + { + case 1: + doShowVolumes(port, IOCPage2, IOCPage3); + break; + case 2: + doShowPhysDisks(port, IOCPage2, IOCPage3); + break; + case 3: + doGetVolumeState(port, IOCPage2); + break; + case 4: + doWaitForResync(port, IOCPage2); + break; + case 10: + doModifyVolume(port, IOCPage2, MPI_RAID_ACTION_DISABLE_VOLUME, "disabled"); + break; + case 11: + doModifyVolume(port, IOCPage2, MPI_RAID_ACTION_ENABLE_VOLUME, "enabled"); + break; + case 12: + doModifyVolume(port, IOCPage2, MPI_RAID_ACTION_INACTIVATE_VOLUME, "inactivated"); + break; + case 13: + doModifyVolume(port, IOCPage2, MPI_RAID_ACTION_ACTIVATE_VOLUME, "activated"); + break; + case 20: + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_PHYSDISK_OFFLINE, "offlined"); + break; + case 21: + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_PHYSDISK_ONLINE, "onlined"); + break; + case 22: + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_FAIL_PHYSDISK, "failed"); + break; + case 23: + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_REPLACE_PHYSDISK, "replaced"); + break; + case 24: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_QUIESCE_PHYS_IO, "quiesced"); + } + else + { + printf("Invalid selection!\n"); + } + break; + case 25: + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_ENABLE_PHYS_IO, "unquiesced"); + } + else + { + printf("Invalid selection!\n"); + } + break; + case 26: + doDriveFirmwareUpdateMode(port, IOCPage2, IOCPage3, 0); + break; + case 27: + doDriveFirmwareUpdateMode(port, IOCPage2, IOCPage3, 1); + break; + case 30: + doCreateVolume(port, IOCPage2, IOCPage3); + break; + case 31: + doDeleteVolume(port, IOCPage2); + break; + case 32: + doVolumeSettings(port, IOCPage2); + break; + case 33: + doVolumeName(port, IOCPage2); + break; + case 40: + doCreatePhysDisk(port, IOCPage2); + break; + case 41: + doModifyPhysDisk(port, IOCPage2, IOCPage3, MPI_RAID_ACTION_DELETE_PHYSDISK, "deleted"); + break; + case 42: + doPhysDiskSettings(port, IOCPage2, IOCPage3); + break; + case 50: + doCreateHotSpare(port, IOCPage2, IOCPage3); + break; + case 51: + doDeleteHotSpare(port, IOCPage2, IOCPage3); + break; + default: + printf("Invalid selection!\n"); + break; + } + + free(IOCPage2); + free(IOCPage3); + +#if DOS || EFI + // give the firmware a chance to update the volume metadata + sleep(5); +#endif + + return 1; +} + + +int +selectVolume(MPT_PORT *port, IOCPage2_t *IOCPage2, int *volumeOut) +{ + int volume; + int i; + + if (IOCPage2->NumActiveVolumes == 0) + { + printf("No active volumes\n"); + return 0; + } + + for (i = 0; i < IOCPage2->NumActiveVolumes; i++) + { + printf("Volume %d is Bus %d Target %d, Type %s%s\n", + i, IOCPage2->RaidVolume[i].VolumeBus, IOCPage2->RaidVolume[i].VolumeID, + IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IS ? "IS (Integrated Striping)" : + IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IME ? "IME (Integrated Mirroring Extended)" : + IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IM ? "IM (Integrated Mirroring)" : "Unknown", + IOCPage2->RaidVolume[i].Flags & MPI_IOCPAGE2_FLAG_VOLUME_INACTIVE ? ", inactive" : ""); + } + printf("\n"); + + if (IOCPage2->NumActiveVolumes > 1 || gFlag == TRUE) + { + printf("Volume: [0-%d or RETURN to quit] ", IOCPage2->NumActiveVolumes - 1); + volume = getNumberAnswer(0, IOCPage2->NumActiveVolumes - 1, -1); + if (volume < 0) + return 0; + printf("\n"); + } + else + { + volume = 0; + } + + *volumeOut = volume; + + return 1; +} + + +int +doShowVolumes(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3) +{ + RaidVolumePage0_t *RaidVolumePage0; + RaidVolumePage1_t RaidVolumePage1; + int b_t; + int i; + int j; + int k; + int nv; + int nd; + int t1; + int t2; + int length; + + nv = IOCPage2->NumActiveVolumes; + nd = IOCPage3->NumPhysDisks; + printf("%d volume%s active, %d physical disk%s active\n", + nv, nv == 1 ? " is" : "s are", nd, nd == 1 ? " is" : "s are"); + + for (i = 0; i < nv; i++) + { + printf("\nVolume %d is Bus %d Target %d, Type %s%s\n", + i, IOCPage2->RaidVolume[i].VolumeBus, IOCPage2->RaidVolume[i].VolumeID, + IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IS ? "IS (Integrated Striping)" : + IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IME ? "IME (Integrated Mirroring Extended)" : + IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IM ? "IM (Integrated Mirroring)" : "Unknown", + IOCPage2->RaidVolume[i].Flags & MPI_IOCPAGE2_FLAG_VOLUME_INACTIVE ? ", inactive" : ""); + + if (IOCPage2->RaidVolume[i].VolumePageNumber == 0) + { + b_t = (IOCPage2->RaidVolume[i].VolumeBus << 8) + IOCPage2->RaidVolume[i].VolumeID; + + RaidVolumePage0 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 0, b_t, &length); + if (RaidVolumePage0 == NULL) + continue; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 1, b_t, + &RaidVolumePage1, sizeof RaidVolumePage1) == 1) + { + printf(" Volume Name: %-32s\n", + RaidVolumePage1.Name); + printf(" Volume WWID: %08x%08x\n", + get32(RaidVolumePage1.WWID.High), get32(RaidVolumePage1.WWID.Low)); + } + + t1 = RaidVolumePage0->VolumeStatus.State; + t2 = RaidVolumePage0->VolumeStatus.Flags; + printf(" Volume State: %s%s%s%s%s\n", + t1 == MPI_RAIDVOL0_STATUS_STATE_OPTIMAL ? "optimal" : + t1 == MPI_RAIDVOL0_STATUS_STATE_DEGRADED ? "degraded" : + t1 == MPI_RAIDVOL0_STATUS_STATE_FAILED ? "failed" : + t1 == MPI_RAIDVOL0_STATUS_STATE_MISSING ? "missing" : "unknown", + t2 & MPI_RAIDVOL0_STATUS_FLAG_ENABLED ? ", enabled" : ", disabled", + t2 & MPI_RAIDVOL0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS ? ", resync in progress" : "", + t2 & MPI_RAIDVOL0_STATUS_FLAG_BAD_BLOCK_TABLE_FULL ? ", bad block table full" : ""); + + t1 = get16(RaidVolumePage0->VolumeSettings.Settings); + t2 = RaidVolumePage0->VolumeSettings.HotSparePool; + printf(" Volume Settings: write caching %s%s%s%s\n", + t1 & MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE ? "enabled" : "disabled", + t1 & MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART ? ", offline on SMART data" : "", + t1 & MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE ? ", auto configure" : "", + t1 & MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC ? ", priority resync" : ""); + if (t2 != 0) + printf(" Volume draws from Hot Spare Pools: %s%s%s%s%s%s%s%s\n", + t2 & MPI_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + + if (IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IM) + printf(" Volume Size %" INT64_FMT "d MB, %d Members\n", + (get64(RaidVolumePage0->MaxLBA) + 1) / 2048, RaidVolumePage0->NumPhysDisks); + else + printf(" Volume Size %" INT64_FMT "d MB, Stripe Size %d KB, %d Members\n", + (get64(RaidVolumePage0->MaxLBA) + 1) / 2048, get32(RaidVolumePage0->StripeSize) / 2, + RaidVolumePage0->NumPhysDisks); + + for (j = 0; j < RaidVolumePage0->NumPhysDisks; j++) + { + for (k = 0; k < nd; k++) + { + if (IOCPage3->PhysDisk[k].PhysDiskNum == RaidVolumePage0->PhysDisk[j].PhysDiskNum) + { + if (IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IM) + printf(" %s is PhysDisk %d (Bus %d Target %d)\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI_RAIDVOL0_PHYSDISK_PRIMARY ? "Primary" : + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI_RAIDVOL0_PHYSDISK_SECONDARY ? "Secondary" : + "Member", RaidVolumePage0->PhysDisk[j].PhysDiskNum, + IOCPage3->PhysDisk[k].PhysDiskBus, IOCPage3->PhysDisk[k].PhysDiskID); + else + printf(" Member %d is PhysDisk %d (Bus %d Target %d)\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap, RaidVolumePage0->PhysDisk[j].PhysDiskNum, + IOCPage3->PhysDisk[k].PhysDiskBus, IOCPage3->PhysDisk[k].PhysDiskID); + break; + } + } + if (k < nd) + continue; + + if (IOCPage2->RaidVolume[i].VolumeType == MPI_RAID_VOL_TYPE_IM) + printf(" %s is PhysDisk %d\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI_RAIDVOL0_PHYSDISK_PRIMARY ? "Primary" : + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI_RAIDVOL0_PHYSDISK_SECONDARY ? "Secondary" : + "Member", RaidVolumePage0->PhysDisk[j].PhysDiskNum); + else + printf(" Member %d is PhysDisk %d\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap, RaidVolumePage0->PhysDisk[j].PhysDiskNum); + } + + free(RaidVolumePage0); + } + } + + return 1; +} + + +int +doShowPhysDisks(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3) +{ + RaidPhysDiskPage0_t RaidPhysDiskPage0; + RaidPhysDiskPage1_t *RaidPhysDiskPage1; + int i; + int j; + int physdisk; + int nv; + int nd; + int np; + int t1; + int t2; + int length; + + nv = IOCPage2->NumActiveVolumes; + nd = IOCPage3->NumPhysDisks; + if (nd == 0 && nv) + { + nv = IOCPage2->MaxVolumes; + nd = IOCPage2->MaxPhysDisks; + printf("%d volume%s defined, %d physical disk%s possible\n", + nv, nv == 1 ? " is" : "s are", nd, nd == 1 ? " is" : "s are"); + } + else + { + printf("%d volume%s active, %d physical disk%s active\n", + nv, nv == 1 ? " is" : "s are", nd, nd == 1 ? " is" : "s are"); + } + + for (i = 0; i < nd; i++) + { + if (IOCPage3->NumPhysDisks) + physdisk = IOCPage3->PhysDisk[i].PhysDiskNum; + else + physdisk = i; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, physdisk, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) != 1) + continue; + + printf("\nPhysDisk %d is Bus %d Target %d\n", + physdisk, RaidPhysDiskPage0.PhysDiskBus, RaidPhysDiskPage0.PhysDiskID); + + t1 = RaidPhysDiskPage0.PhysDiskStatus.State; + t2 = RaidPhysDiskPage0.PhysDiskStatus.Flags; + printf(" PhysDisk State: %s%s%s%s\n", + t1 == MPI_PHYSDISK0_STATUS_ONLINE ? "online" : + t1 == MPI_PHYSDISK0_STATUS_MISSING ? "missing" : + t1 == MPI_PHYSDISK0_STATUS_NOT_COMPATIBLE ? "not compatible" : + t1 == MPI_PHYSDISK0_STATUS_FAILED ? "failed" : + t1 == MPI_PHYSDISK0_STATUS_INITIALIZING ? "initializing" : + t1 == MPI_PHYSDISK0_STATUS_OFFLINE_REQUESTED ? "offline requested" : + t1 == MPI_PHYSDISK0_STATUS_FAILED_REQUESTED ? "failed requested" : + t1 == MPI_PHYSDISK0_STATUS_OTHER_OFFLINE ? "offline" : "unknown", + t2 & MPI_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC ? ", out of sync" : "", + t2 & MPI_PHYSDISK0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + t2 & MPI_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME ? ", inactive volume" : ""); + + t1 = RaidPhysDiskPage0.PhysDiskSettings.PhysDiskSettings; + t2 = RaidPhysDiskPage0.PhysDiskSettings.HotSparePool; +// printf(" PhysDisk Settings: \n"); + if (t2 != 0) + printf(" PhysDisk belongs to Hot Spare Pools: %s%s%s%s%s%s%s%s\n", + t2 & MPI_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + + printf(" PhysDisk Size %d MB, Inquiry Data: %-8.8s %-16.16s %-4.4s\n", + (get32(RaidPhysDiskPage0.MaxLBA) + 1) / 2048, RaidPhysDiskPage0.InquiryData.VendorID, + RaidPhysDiskPage0.InquiryData.ProductID, RaidPhysDiskPage0.InquiryData.ProductRevLevel); + + t1 = get16(RaidPhysDiskPage0.ErrorData.ErrorCount); + t2 = get16(RaidPhysDiskPage0.ErrorData.SmartCount); + if (t1 != 0) + printf(" Error Count %d, Last Error: Command = %02Xh, Key = %d, ASC/ASCQ = %02Xh/%02Xh\n", + t1, RaidPhysDiskPage0.ErrorData.ErrorCdbByte, + RaidPhysDiskPage0.ErrorData.ErrorSenseKey, + RaidPhysDiskPage0.ErrorData.ErrorASC, RaidPhysDiskPage0.ErrorData.ErrorASCQ); + if (t2 != 0) + printf(" SMART Data Count %d, Last SMART Data: ASC/ASCQ = %02Xh/%02Xh\n", + t2, RaidPhysDiskPage0.ErrorData.SmartASC, RaidPhysDiskPage0.ErrorData.SmartASCQ); + + if (RaidPhysDiskPage0.PhysDiskStatus.Flags & MPI_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME) + continue; + + RaidPhysDiskPage1 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 1, physdisk, &length); + if (RaidPhysDiskPage1 == NULL) + continue; + + np = RaidPhysDiskPage1->NumPhysDiskPaths; + + if (np > 1) + { + for (j = 0; j < np; j++) + { + t1 = get16(RaidPhysDiskPage1->Path[j].Flags); + printf(" Path %d is Bus %d Target %d, %s\n", j, + RaidPhysDiskPage1->Path[j].PhysDiskBus, + RaidPhysDiskPage1->Path[j].PhysDiskID, + t1 & MPI_RAID_PHYSDISK1_FLAG_INVALID ? "invalid" : + t1 & MPI_RAID_PHYSDISK1_FLAG_BROKEN ? "broken" : + "online"); + } + } + + free(RaidPhysDiskPage1); + } + + return 1; +} + + +int +doGetVolumeState(MPT_PORT *port, IOCPage2_t *IOCPage2) +{ + MpiRaidActionRequest_t req; + struct + { + MpiRaidActionReply_t rep; + MpiRaidVolIndicator_t data; + } rep; + MpiRaidVolIndicator_t *data; + RaidVol0Status_t *status; + int volume; + uint64_t size; + uint64_t done; + int t1; + int t2; + + if (selectVolume(port, IOCPage2, &volume) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_INDICATOR_STRUCT; + req.VolumeBus = IOCPage2->RaidVolume[volume].VolumeBus; + req.VolumeID = IOCPage2->RaidVolume[volume].VolumeID; + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME) == 1) + { + data = (pMpiRaidVolIndicator_t)&rep.rep.ActionData; + status = (pRaidVol0Status_t)&rep.rep.VolumeStatus; + + t1 = status->State; + t2 = status->Flags; + printf("Volume %d State: %s%s%s%s\n", volume, + t1 == MPI_RAIDVOL0_STATUS_STATE_OPTIMAL ? "optimal" : + t1 == MPI_RAIDVOL0_STATUS_STATE_DEGRADED ? "degraded" : + t1 == MPI_RAIDVOL0_STATUS_STATE_FAILED ? "failed" : "unknown", + t2 & MPI_RAIDVOL0_STATUS_FLAG_ENABLED ? ", enabled" : ", disabled", + t2 & MPI_RAIDVOL0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS ? ", resync in progress" : ""); + + if (t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) + { + size = get64(data->TotalBlocks); + done = get64(data->BlocksRemaining); + + if (size) + { + printf("Resync Progress: total blocks %" INT64_FMT "d, blocks remaining %" INT64_FMT "d, %d%%\n", + size, done, (int)(done / (size / 100))); + } + } + } + + return 1; +} + + +int +doWaitForResync(MPT_PORT *port, IOCPage2_t *IOCPage2) +{ + MpiRaidActionRequest_t req; + struct + { + MpiRaidActionReply_t rep; + MpiRaidVolIndicator_t data; + } rep; + MpiRaidVolIndicator_t *data; + RaidVol0Status_t *status; + int volume; + uint64_t size; + uint64_t done; + int t1; + int t2; + int percent; + int last_percent = -1; + int n; + + if (selectVolume(port, IOCPage2, &volume) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_INDICATOR_STRUCT; + req.VolumeBus = IOCPage2->RaidVolume[volume].VolumeBus; + req.VolumeID = IOCPage2->RaidVolume[volume].VolumeID; + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + data = (pMpiRaidVolIndicator_t)&rep.rep.ActionData; + status = (pRaidVol0Status_t)&rep.rep.VolumeStatus; + + t1 = status->State; + t2 = status->Flags; + printf("Volume %d State: %s%s%s%s\n", volume, + t1 == MPI_RAIDVOL0_STATUS_STATE_OPTIMAL ? "optimal" : + t1 == MPI_RAIDVOL0_STATUS_STATE_DEGRADED ? "degraded" : + t1 == MPI_RAIDVOL0_STATUS_STATE_FAILED ? "failed" : "unknown", + t2 & MPI_RAIDVOL0_STATUS_FLAG_ENABLED ? ", enabled" : ", disabled", + t2 & MPI_RAIDVOL0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS ? ", resync in progress" : ""); + + if (t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) + { + size = get64(data->TotalBlocks); + done = get64(data->BlocksRemaining); + + if (size) + { + last_percent = (int)(done / (size / 100)); + printf("Resync Progress: total blocks %" INT64_FMT "d, blocks remaining %" INT64_FMT "d, %d%%\n", + size, done, last_percent); + } + } + else + return 1; + + n = 0; + while (TRUE) + { + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + data = (pMpiRaidVolIndicator_t)&rep.rep.ActionData; + status = (pRaidVol0Status_t)&rep.rep.VolumeStatus; + + t1 = status->State; + t2 = status->Flags; + + if (t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) + { + size = get64(data->TotalBlocks); + done = get64(data->BlocksRemaining); + + if (size) + { + percent = (int)(done / (size / 100)); + if (percent != last_percent) + { + last_percent = percent; + n += printf(" %d%%", last_percent); + if (n >= 75) + { + printf("\n"); + n = 0; + } + } + } + } + else + break; + + sleep(1); + } + if (n) + printf("\n"); + + printf("Volume %d State: %s%s%s%s\n", volume, + t1 == MPI_RAIDVOL0_STATUS_STATE_OPTIMAL ? "optimal" : + t1 == MPI_RAIDVOL0_STATUS_STATE_DEGRADED ? "degraded" : + t1 == MPI_RAIDVOL0_STATUS_STATE_FAILED ? "failed" : "unknown", + t2 & MPI_RAIDVOL0_STATUS_FLAG_ENABLED ? ", enabled" : ", disabled", + t2 & MPI_RAIDVOL0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + t2 & MPI_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS ? ", resync in progress" : ""); + + return 1; +} + + +int +doModifyVolume(MPT_PORT *port, IOCPage2_t *IOCPage2, int action, char *string) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + int volume; + int all; + + if (IOCPage2->NumActiveVolumes == 0) + { + printf("No active volumes\n"); + return 1; + } + + if (action == MPI_RAID_ACTION_DISABLE_VOLUME || + action == MPI_RAID_ACTION_ENABLE_VOLUME) + { + all = 1; + volume = 0; + } + else + { + all = 0; + if (selectVolume(port, IOCPage2, &volume) != 1) + return 0; + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = action; + req.VolumeBus = IOCPage2->RaidVolume[volume].VolumeBus; + req.VolumeID = IOCPage2->RaidVolume[volume].VolumeID; + + if (all) + printf("Volumes are being %s\n", string); + else + printf("Volume %d is being %s\n", volume, string); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doCreateVolume(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3) +{ + RaidVolumePage0_t *RaidVolumePage0; + RaidPhysDiskPage0_t RaidPhysDiskPage0; + ManufacturingPage4_t ManufacturingPage4; + IOCPage6_t IOCPage6; + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + ConfigReply_t config_rep; + int bus; + int target; + PATH path; + int no_mix_sas_sata; + int no_mix_ssd_non_ssd; + int sata = 0; + int ssd = 0; + int num_physdisks; + int physdisks[MAX_DEVICES]; + int chosen[MAX_DEVICES]; + unsigned char inq[36]; + unsigned char cap[8]; + unsigned int size; + unsigned int metadata_size = 0; + unsigned int coerced_size; + unsigned int min_size = 0; + uint64_t volume_size; + uint64_t max_volume_size; + uint64_t max_lba; + int first_bus = 0; + int first_target = 0; + int length; + int i; + int n; + int t; + int settings = 0; + int flags; + int min_disks; + int stripe_map = 0; + int min_stripe; + int max_stripe; + int def_stripe; + + if (IOCPage2->NumActiveVolumes >= IOCPage2->MaxVolumes) + { + printf("Cannot create another active volume\n"); + return 0; + } + + if (IOCPage3->NumPhysDisks + 2 > IOCPage2->MaxPhysDisks) + { + printf("Cannot create at least 2 physical disks\n"); + return 0; + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 6, 0, &IOCPage6, sizeof IOCPage6) != 1) + { + memset(&IOCPage6, 0, sizeof IOCPage6); + IOCPage6.MinDrivesIS = 2; + IOCPage6.MinDrivesIM = 2; + IOCPage6.MinDrivesIME = 3; + IOCPage6.MaxDrivesIS = IOCPage2->MaxPhysDisks; + IOCPage6.MaxDrivesIM = 2; + IOCPage6.MaxDrivesIME = IOCPage2->MaxPhysDisks; + if (IOCPage2->MaxVolumes > 1) + { + IOCPage6.MaxDrivesIS -= 2; + IOCPage6.MaxDrivesIME -= 2; + } + IOCPage6.MaxGlobalHotSpares = 1; + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + IOCPage6.SupportedStripeSizeMapIS = set32(0x3f8); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + IOCPage6.SupportedStripeSizeMapIS = set32(0x80); + } + + min_disks = min(2, min(IOCPage6.MinDrivesIS, IOCPage6.MinDrivesIME)); + + printf(" B___T___L Type Vendor Product Rev Disk Blocks Disk MB\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (isRaidVolume(port, bus, target)) + continue; + + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) != 0x00) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + if (doReadCapacity(port, bus, target, 0, cap, sizeof cap) != 1) + continue; + + size = get4bytes(cap, 0); + + if (getPath(port, bus, target, &path) == 1) + { + for (i = 0; i < n; i++) + { + if (diag_targets[i].path.slot == path.slot && + diag_targets[i].path.encl_id_l == path.encl_id_l && + diag_targets[i].path.encl_id_h == path.encl_id_h) + { + printf("Bus %d Target %d is another path to Bus %d Target %d, ignoring\n", + bus, target, diag_targets[i].bus, diag_targets[i].target); + break; + } + } + if (i < n) + continue; + } + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].size = size; + diag_targets[n].path = path; + + n++; + + printf("%2d. %2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %10d %7d\n", + n, bus, target, 0, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, size + 1, (size + 1) / 2048); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n < min_disks) + { + printf("\nNot enough available targets found\n"); + return 1; + } + + flags = get32(IOCPage2->CapabilitiesFlags); + + printf("\nTo create a volume, select %d or more of the available targets\n", min_disks); + if (flags & MPI_IOCPAGE2_CAP_FLAGS_IME_SUPPORT) + printf(" select %d to %d targets for a mirrored volume\n", + IOCPage6.MinDrivesIME, IOCPage6.MaxDrivesIME); + else if (flags & MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT) + printf(" select 2 targets for a mirrored volume\n"); + if (flags & MPI_IOCPAGE2_CAP_FLAGS_IS_SUPPORT) + printf(" select %d to %d targets for a striped volume\n", + IOCPage6.MinDrivesIS, IOCPage6.MaxDrivesIS); + printf("\n"); + + num_physdisks = 0; + + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, 0, &config_rep) != 1) + return 0; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 4, 0, + &ManufacturingPage4, sizeof ManufacturingPage4) != 1) + return 0; + + no_mix_sas_sata = (ManufacturingPage4.Flags & MPI_MANPAGE4_IR_NO_MIX_SAS_SATA) != 0; + no_mix_ssd_non_ssd = (get16(ManufacturingPage4.ExtFlags) & MPI_MANPAGE4_EXTFLAGS_MIX_SSD_AND_NON_SSD) == 0; + + while (TRUE) + { + printf("Select a target: [1-%d or RETURN to quit] ", n); + i = getNumberAnswer(1, n, 0); + if (i == 0) + break; + i--; + + for (t = 0; t < num_physdisks; t++) + { + if (i == chosen[t]) + { + printf("\nThis target has already been chosen!\n\n"); + break; + } + } + if (t < num_physdisks) + continue; + + chosen[num_physdisks] = i; + + bus = diag_targets[i].bus; + target = diag_targets[i].target; + + if (no_mix_sas_sata) + { + if (num_physdisks == 0) + { + sata = isSata(port, bus, target); + } + else if (sata != isSata(port, bus, target)) + { + printf("\nThis %s target cannot be mixed with the %s target%s already chosen!\n\n", + sata ? "SAS" : "SATA", sata ? "SATA" : "SAS", + num_physdisks == 1 ? "" : "s"); + continue; + } + } + + if (no_mix_ssd_non_ssd) + { + if (num_physdisks == 0) + { + ssd = isSsd(port, bus, target); + } + else if (ssd != isSsd(port, bus, target)) + { + printf("\nThis %s target cannot be mixed with the %s target%s already chosen!\n\n", + ssd ? "non-SSD" : "SSD", ssd ? "SSD" : "non-SSD", + num_physdisks == 1 ? "" : "s"); + continue; + } + } + + memset(&RaidPhysDiskPage0, 0, sizeof RaidPhysDiskPage0); + + RaidPhysDiskPage0.Header.PageType = config_rep.Header.PageType; + RaidPhysDiskPage0.Header.PageNumber = config_rep.Header.PageNumber; + RaidPhysDiskPage0.Header.PageLength = config_rep.Header.PageLength; + RaidPhysDiskPage0.Header.PageVersion = config_rep.Header.PageVersion; + + RaidPhysDiskPage0.PhysDiskIOC = port->iocNumber; + RaidPhysDiskPage0.PhysDiskBus = bus; + RaidPhysDiskPage0.PhysDiskID = target; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_CREATE_PHYSDISK; + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0, SHORT_TIME) != 1) + return 0; + + physdisks[num_physdisks] = get32(rep.ActionData); + +// printf("PhysDisk %d was created\n", physdisks[num_physdisks]); + + if (num_physdisks == 0) + { + first_bus = bus; + first_target = target; + } + num_physdisks++; + + if (num_physdisks >= n && gFlag != TRUE) + break; + + if (IOCPage3->NumPhysDisks + num_physdisks >= IOCPage2->MaxPhysDisks) + { + printf(" no more physical disks can be created, exiting loop\n"); + break; + } + + if (num_physdisks >= max(IOCPage6.MaxDrivesIS, IOCPage6.MaxDrivesIME)) + { + printf(" no more physical disks allowed in a volume, exiting loop\n"); + break; + } + } + + printf("\n%d physical disks were created\n\n", num_physdisks); + + if (num_physdisks < min_disks) + { + printf("Volumes must have at least %d physical disks!\n", min_disks); + return 0; + } + + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 0, 0, &config_rep) != 1) + return 0; + + length = sizeof *RaidVolumePage0 + sizeof RaidVolumePage0->PhysDisk * (num_physdisks - 1); + if (length < config_rep.Header.PageLength * 4) + length = config_rep.Header.PageLength * 4; + RaidVolumePage0 = malloc(length); + + memset(RaidVolumePage0, 0, length); + + RaidVolumePage0->Header.PageType = config_rep.Header.PageType; + RaidVolumePage0->Header.PageNumber = config_rep.Header.PageNumber; + RaidVolumePage0->Header.PageLength = length / 4; + RaidVolumePage0->Header.PageVersion = config_rep.Header.PageVersion; + + RaidVolumePage0->VolumeIOC = port->iocNumber; + RaidVolumePage0->VolumeBus = first_bus; + RaidVolumePage0->VolumeID = first_target; + + RaidVolumePage0->NumPhysDisks = num_physdisks; + + if (flags & (MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT | MPI_IOCPAGE2_CAP_FLAGS_IME_SUPPORT) && + flags & MPI_IOCPAGE2_CAP_FLAGS_IS_SUPPORT) + { + printf("Select volume type: [0=Mirroring, 1=Striping, default is 0] "); + if (getNumberAnswer(0, 1, 0) == 0) + if (num_physdisks == 2 && flags & MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT) + RaidVolumePage0->VolumeType = MPI_RAID_VOL_TYPE_IM; + else + RaidVolumePage0->VolumeType = MPI_RAID_VOL_TYPE_IME; + else + RaidVolumePage0->VolumeType = MPI_RAID_VOL_TYPE_IS; + } + else if (flags & (MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT | MPI_IOCPAGE2_CAP_FLAGS_IME_SUPPORT)) + { + if (num_physdisks == 2 && flags & MPI_IOCPAGE2_CAP_FLAGS_IM_SUPPORT) + RaidVolumePage0->VolumeType = MPI_RAID_VOL_TYPE_IM; + else + RaidVolumePage0->VolumeType = MPI_RAID_VOL_TYPE_IME; + } + else if (flags & MPI_IOCPAGE2_CAP_FLAGS_IS_SUPPORT) + { + RaidVolumePage0->VolumeType = MPI_RAID_VOL_TYPE_IS; + } + + if (RaidVolumePage0->VolumeType == MPI_RAID_VOL_TYPE_IM) + { + settings = get32(ManufacturingPage4.IMVolumeSettings); + } + + if (RaidVolumePage0->VolumeType == MPI_RAID_VOL_TYPE_IME) + { + settings = get32(ManufacturingPage4.IMEVolumeSettings); + stripe_map = get32(IOCPage6.SupportedStripeSizeMapIME); + } + + if (RaidVolumePage0->VolumeType == MPI_RAID_VOL_TYPE_IS) + { + settings = get32(ManufacturingPage4.ISVolumeSettings); + stripe_map = get32(IOCPage6.SupportedStripeSizeMapIS); + } + + if (flags & MPI_IOCPAGE2_CAP_FLAGS_RAID_64_BIT_ADDRESSING) + max_volume_size = ((uint64_t)1 << (64 - 11)); // in MB + else + max_volume_size = ((uint64_t)1 << (32 - 11)); // in MB + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + metadata_size = 32; // 32 blocks + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + switch (settings & MPI_RAIDVOL0_SETTING_MASK_METADATA_SIZE) + { + default: + case MPI_RAIDVOL0_SETTING_64MB_METADATA_SIZE: + metadata_size = 64 * 2048; // 64 MB + break; + case MPI_RAIDVOL0_SETTING_512MB_METADATA_SIZE: + metadata_size = 512 * 2048; // 512 MB + break; + } + } + + if (metadata_size > 2048) + printf("Required metadata size is %d MB, plus 2 MB\n", metadata_size / 2048); + else + printf("Required metadata size is %d blocks, plus 2 MB\n", metadata_size); + + max_volume_size -= metadata_size; + + t = 0; + for (i = 0; i < num_physdisks; i++) + { + size = diag_targets[chosen[i]].size + 1; + if (size <= metadata_size) + { + printf("Target %d is smaller than the required metadata size!\n", chosen[i]); + free(RaidVolumePage0); + return 0; + } + + size = (size - metadata_size) / 2048; + + if (size > 1000) + { + coerced_size = ((((size + 127) / 128) * 128) / 10) * 10; + if (coerced_size > size) + { + coerced_size = (((size / 128) * 128) / 10) * 10; + } + + size = coerced_size; + } + + if (size <= 2) + { + printf("Target %d is smaller than the required metadata size!\n", chosen[i]); + free(RaidVolumePage0); + return 0; + } + + size -= 2; + +// printf("Usable size of member %d is %d MB\n", i, size); + + if (i == 0) + { + min_size = size; + } + else + { + if (size != min_size) + t = 1; + if (size < min_size) + { +// printf(" reducing volume member size from %d MB to %d MB\n", min_size, size); + min_size = size; + } + } + } + if (t) + { + printf("Not all physical disks are the same size!\n"); + printf("A common size of %d MB will be used for each physical disk\n", min_size); + } + + volume_size = (uint64_t)min_size * num_physdisks; + if (RaidVolumePage0->VolumeType != MPI_RAID_VOL_TYPE_IS) + volume_size /= 2; + + if (volume_size > max_volume_size) + { + printf("Maximum volume size exceeded; reducing size from %" INT64_FMT "d MB to %" INT64_FMT "d MB\n", + volume_size, max_volume_size); + volume_size = max_volume_size; + } + + printf("Select volume size: [1 to %" INT64_FMT "d MB, default is %" INT64_FMT "d] ", + volume_size, volume_size); + max_lba = (uint64_t)getNumberAnswer(1, (int)volume_size, (int)volume_size) * 2048 - 1; + + t = (U32)max_lba; + RaidVolumePage0->MaxLBA = set32(t); + t = (U32)(max_lba >> 32); + RaidVolumePage0->MaxLBAHigh = set32(t); + + if (stripe_map) + { + if (stripe_map & (stripe_map - 1)) + { + t = stripe_map / 2; + min_stripe = t & (-t); + t = ((t | (min_stripe - 1)) + 1) / 2; + max_stripe = t & (-t); + def_stripe = min(max(64, min_stripe), max_stripe); + printf("Select stripe size: [%d to %d KB, default is %d] ", min_stripe, max_stripe, def_stripe); + size = getNumberAnswer(min_stripe, max_stripe, def_stripe); + } + else + { + size = stripe_map / 2; + printf("A stripe size of %d KB will be used\n", size); + } + RaidVolumePage0->StripeSize = set32(size * 2); + } + + for (i = 0; i < num_physdisks; i++) + { + RaidVolumePage0->PhysDisk[i].PhysDiskNum = physdisks[i]; + RaidVolumePage0->PhysDisk[i].PhysDiskMap = i; + } + + if (RaidVolumePage0->VolumeType == MPI_RAID_VOL_TYPE_IM) + { + RaidVolumePage0->PhysDisk[0].PhysDiskMap = MPI_RAIDVOL0_PHYSDISK_PRIMARY; + RaidVolumePage0->PhysDisk[1].PhysDiskMap = MPI_RAIDVOL0_PHYSDISK_SECONDARY; + } + + t = settings & MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE ? 1 : 0; + printf("Enable write caching: [Yes or No, default is %s] ", t == 0 ? "No" : "Yes"); + if (getYesNoAnswer(t)) + settings |= MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE; + else + settings &= ~MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE; + + RaidVolumePage0->VolumeSettings.Settings = set16(settings); + + flags = 0; + + printf("Zero the first and last blocks of the volume? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + flags |= MPI_RAID_ACTION_ADATA_LOW_LEVEL_INIT; + + printf("Skip initial volume resync? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + flags |= MPI_RAID_ACTION_ADATA_DO_NOT_SYNC; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_CREATE_VOLUME; + req.VolumeBus = first_bus; + req.VolumeID = first_target; + req.ActionDataWord = set32(flags); + + t = doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, RaidVolumePage0, length, LONG_TIME); + + if (t) + printf("\nVolume was created\n"); + + free(RaidVolumePage0); + + return t; +} + +int +doDeleteVolume(MPT_PORT *port, IOCPage2_t *IOCPage2) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + IOCPage5_t IOCPage5; + int volume; + int i; + int flags; + + if (selectVolume(port, IOCPage2, &volume) != 1) + return 0; + + printf("All data on Volume %d will be lost!\n", volume); + printf("\nAre you sure you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + return 1; + + flags = MPI_RAID_ACTION_ADATA_DEL_PHYS_DISKS; + + printf("Zero the first block of all volume members? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + flags |= MPI_RAID_ACTION_ADATA_ZERO_LBA0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_DELETE_VOLUME; + req.VolumeBus = IOCPage2->RaidVolume[volume].VolumeBus; + req.VolumeID = IOCPage2->RaidVolume[volume].VolumeID; + req.ActionDataWord = set32(flags); + + printf("\nVolume %d is being deleted\n", volume); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nVolume delete operation failed!\n"); + return 0; + } + + if (IOCPage2->NumActiveVolumes > 1) + return 1; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 5, 0, &IOCPage5, sizeof IOCPage5) != 1) + return 1; + + for (i = 0; i < IOCPage5.NumHotSpares; i++) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_DELETE_PHYSDISK; + req.PhysDiskNum = IOCPage5.HotSpare[i].PhysDiskNum; + + printf("\nHot Spare %d (PhysDisk %d) is being deleted\n", + i, IOCPage5.HotSpare[i].PhysDiskNum); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nHot Spare delete operation failed!\n"); + } + } + + return 1; +} + +int +doVolumeSettings(MPT_PORT *port, IOCPage2_t *IOCPage2) +{ + RaidVolumePage0_t *RaidVolumePage0; + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + int length; + int b_t; + int volume; + int t1; + int t2; + int t; + + if (selectVolume(port, IOCPage2, &volume) != 1) + return 0; + + b_t = (IOCPage2->RaidVolume[volume].VolumeBus << 8) + IOCPage2->RaidVolume[volume].VolumeID; + + RaidVolumePage0 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 0, b_t, &length); + if (RaidVolumePage0 == NULL) + return 0; + + t1 = get16(RaidVolumePage0->VolumeSettings.Settings); + t2 = RaidVolumePage0->VolumeSettings.HotSparePool; + printf("Volume %d Settings: write caching %s%s%s%s\n", volume, + t1 & MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE ? "enabled" : "disabled", + t1 & MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART ? ", offline on SMART data" : "", + t1 & MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE ? ", auto configure" : "", + t1 & MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC ? ", priority resync" : ""); + if (t2 != 0) + printf("Volume %d draws from Hot Spare Pools: %s%s%s%s%s%s%s%s\n", volume, + t2 & MPI_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + printf("\n"); + + t = t1 & MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE ? 1 : 0; + printf("Enable write caching: [Yes or No, default is %s] ", t == 0 ? "No" : "Yes"); + if (getYesNoAnswer(t)) + t1 |= MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE; + else + t1 &= ~MPI_RAIDVOL0_SETTING_WRITE_CACHING_ENABLE; + + t = t1 & MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART ? 1 : 0; + printf("Offline on SMART data: [Yes or No, default is %s] ", t == 0 ? "No" : "Yes"); + if (getYesNoAnswer(t)) + t1 |= MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART; + else + t1 &= ~MPI_RAIDVOL0_SETTING_OFFLINE_ON_SMART; + + t = t1 & MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE ? 1 : 0; + printf("Auto configuration: [Yes or No, default is %s] ", t == 0 ? "No" : "Yes"); + if (getYesNoAnswer(t)) + t1 |= MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE; + else + t1 &= ~MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE; + + t = t1 & MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC ? 1 : 0; + printf("Priority resync: [Yes or No, default is %s] ", t == 0 ? "No" : "Yes"); + if (getYesNoAnswer(t)) + t1 |= MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC; + else + t1 &= ~MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC; + + printf("Hot Spare Pools (bitmask of pool numbers): [00 to FF, default is %02x] ", t2); + t2 = getNumberAnswerHex(0x00, 0xff, t2); + + RaidVolumePage0->VolumeSettings.Settings = set16(t1); + RaidVolumePage0->VolumeSettings.HotSparePool = (U8)t2; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_CHANGE_VOLUME_SETTINGS; + req.VolumeBus = IOCPage2->RaidVolume[volume].VolumeBus; + req.VolumeID = IOCPage2->RaidVolume[volume].VolumeID; + + memcpy(&req.ActionDataWord, &RaidVolumePage0->VolumeSettings, sizeof req.ActionDataWord); + + free(RaidVolumePage0); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doVolumeName(MPT_PORT *port, IOCPage2_t *IOCPage2) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + RaidVolumePage1_t RaidVolumePage1; + int b_t; + int volume; + char name[16]; + int n; + + if (selectVolume(port, IOCPage2, &volume) != 1) + return 0; + + b_t = (IOCPage2->RaidVolume[volume].VolumeBus << 8) + IOCPage2->RaidVolume[volume].VolumeID; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 1, b_t, + &RaidVolumePage1, sizeof RaidVolumePage1) != 1) + return 0; + + printf("Enter a volume name: [0 to %d characters, current is \"%s\"] ", + (int)sizeof name - 1, RaidVolumePage1.Name); + + n = getStringFromArgs(name, sizeof name, stdin); + if (n == 0) + { + return 0; + } + if (n >= sizeof name) + { + printf("\nThe name is too long, current name not changed!\n"); + return 0; + } + + memset(name + n, '\0', sizeof name - n); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_SET_VOLUME_NAME; + req.VolumeBus = IOCPage2->RaidVolume[volume].VolumeBus; + req.VolumeID = IOCPage2->RaidVolume[volume].VolumeID; + + printf("\nVolume %d's name is being changed...\n", volume); + + return doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, name, sizeof name, SHORT_TIME); +} + + +int +doDriveFirmwareUpdateMode(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3, int flag) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + int physdisk; + int timeout; + + if (IOCPage3->NumPhysDisks == 0) + { + printf("No active physical disks\n"); + return 1; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage2->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage2->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + printf("Timeout in seconds: [0-255 or RETURN to quit] "); + timeout = getNumberAnswer(0, 255, -1); + if (timeout < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_DEVICE_FW_UPDATE_MODE; + req.PhysDiskNum = physdisk; + req.ActionDataWord = set32((timeout << MPI_RAID_ACTION_ADATA_SHIFT_FW_UPDATE_TIMEOUT) | flag); + + printf("\nDrive Firmware Update Mode on PhysDisk %d is being %s\n", physdisk, flag ? "enabled" : "disabled"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doModifyPhysDisk(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3, int action, char *string) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + int physdisk; + int physdisk2; + + if (IOCPage3->NumPhysDisks == 0) + { + printf("No active physical disks\n"); + return 1; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage2->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage2->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = action; + req.PhysDiskNum = physdisk; + + if (action == MPI_RAID_ACTION_REPLACE_PHYSDISK) + { + printf("Replacement PhysDisk: [0-%d or RETURN to quit] ", IOCPage2->MaxPhysDisks - 1); + physdisk2 = getNumberAnswer(0, IOCPage2->MaxPhysDisks - 1, -1); + if (physdisk2 < 0) + return 1; + + req.ActionDataWord = set32(physdisk2); + } + + printf("\nPhysDisk %d is being %s\n", physdisk, string); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doCreatePhysDisk(MPT_PORT *port, IOCPage2_t *IOCPage2) +{ + RaidPhysDiskPage0_t RaidPhysDiskPage0; + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + ConfigReply_t config_rep; + int bus; + int target; + int physdisk; + + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, 0, &config_rep) != 1) + return 0; + + while (TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + break; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + break; + + memset(&RaidPhysDiskPage0, 0, sizeof RaidPhysDiskPage0); + + RaidPhysDiskPage0.Header.PageType = config_rep.Header.PageType; + RaidPhysDiskPage0.Header.PageNumber = config_rep.Header.PageNumber; + RaidPhysDiskPage0.Header.PageLength = config_rep.Header.PageLength; + RaidPhysDiskPage0.Header.PageVersion = config_rep.Header.PageVersion; + + RaidPhysDiskPage0.PhysDiskIOC = port->iocNumber; + RaidPhysDiskPage0.PhysDiskBus = bus; + RaidPhysDiskPage0.PhysDiskID = target; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_CREATE_PHYSDISK; + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0, SHORT_TIME) != 1) + return 0; + + physdisk = get32(rep.ActionData); + + printf("PhysDisk %d was created\n", physdisk); + } + + return 1; +} + + +int +doPhysDiskSettings(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3) +{ + RaidPhysDiskPage0_t RaidPhysDiskPage0; + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + int physdisk; + int t2; + + if (IOCPage3->NumPhysDisks == 0) + { + printf("No active physical disks\n"); + return 1; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage2->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage2->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, physdisk, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) != 1) + return 0; + + t2 = RaidPhysDiskPage0.PhysDiskSettings.HotSparePool; + if (t2 != 0) + printf("PhysDisk %d belongs to Hot Spare Pools: %s%s%s%s%s%s%s%s\n", physdisk, + t2 & MPI_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + printf("\n"); + + printf("Hot Spare Pools (bitmask of pool numbers): [00 to FF, default is %02x] ", t2); + t2 = getNumberAnswerHex(0x00, 0xff, t2); + + RaidPhysDiskPage0.PhysDiskSettings.HotSparePool = (U8)t2; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_CHANGE_PHYSDISK_SETTINGS; + req.PhysDiskNum = physdisk; + + memcpy(&req.ActionDataWord, &RaidPhysDiskPage0.PhysDiskSettings, sizeof req.ActionDataWord); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doCreateHotSpare(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3) +{ + RaidPhysDiskPage0_t RaidPhysDiskPage0; + IOCPage5_t IOCPage5; + IOCPage6_t IOCPage6; + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + ConfigReply_t config_rep; + int bus; + int target; + unsigned char inq[36]; + unsigned char cap[8]; + unsigned int size; + int i; + int n; + int t; + + if (IOCPage3->NumPhysDisks == IOCPage2->MaxPhysDisks) + { + printf("Cannot create another active physical disk\n"); + return 1; + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 6, 0, &IOCPage6, sizeof IOCPage6) != 1) + { + memset(&IOCPage6, 0, sizeof IOCPage6); + IOCPage6.MaxDrivesIS = IOCPage2->MaxPhysDisks; + IOCPage6.MaxDrivesIM = 2; + IOCPage6.MaxDrivesIME = IOCPage2->MaxPhysDisks; + if (IOCPage2->MaxVolumes > 1) + { + IOCPage6.MaxDrivesIS -= 2; + IOCPage6.MaxDrivesIME -= 2; + } + IOCPage6.MaxGlobalHotSpares = 1; + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 5, 0, &IOCPage5, sizeof IOCPage5) == 1) + { + if (IOCPage5.NumHotSpares >= IOCPage6.MaxGlobalHotSpares) + { + printf("Cannot create another hot spare\n"); + return 1; + } + } + + printf(" B___T___L Type Vendor Product Rev Disk Blocks Disk MB\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (isRaidVolume(port, bus, target)) + continue; + + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) != 0x00) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + if (doReadCapacity(port, bus, target, 0, cap, sizeof cap) != 1) + continue; + + size = get4bytes(cap, 0); + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].size = size; + + n++; + + printf("%2d. %2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %10d %7d\n", + n, bus, target, 0, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, size + 1, (size + 1) / 2048); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n < 1) + { + printf("\nNo available targets found\n"); + return 1; + } + + printf("\nTo create a hot spare, select one of the available targets\n\n"); + + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, 0, &config_rep) != 1) + return 0; + + printf("Select a target: [1-%d or RETURN to quit] ", n); + i = getNumberAnswer(1, n, 0); + if (i == 0) + return 1; + i--; + + bus = diag_targets[i].bus; + target = diag_targets[i].target; + + printf("Hot Spare Pool: [0-7 or RETURN to quit] "); + t = getNumberAnswer(0, 7, -1); + if (t < 0) + return 1; + + memset(&RaidPhysDiskPage0, 0, sizeof RaidPhysDiskPage0); + + RaidPhysDiskPage0.Header.PageType = config_rep.Header.PageType; + RaidPhysDiskPage0.Header.PageNumber = config_rep.Header.PageNumber; + RaidPhysDiskPage0.Header.PageLength = config_rep.Header.PageLength; + RaidPhysDiskPage0.Header.PageVersion = config_rep.Header.PageVersion; + + RaidPhysDiskPage0.PhysDiskIOC = port->iocNumber; + RaidPhysDiskPage0.PhysDiskBus = bus; + RaidPhysDiskPage0.PhysDiskID = target; + + RaidPhysDiskPage0.PhysDiskSettings.HotSparePool = (U8)(1 << t); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_CREATE_PHYSDISK; + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0, SHORT_TIME) != 1) + return 0; + + printf("\nHot Spare was created\n"); + + return 1; +} + + +int +doDeleteHotSpare(MPT_PORT *port, IOCPage2_t *IOCPage2, IOCPage3_t *IOCPage3) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + IOCPage5_t IOCPage5; + int physdisk; + int i; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 5, 0, &IOCPage5, sizeof IOCPage5) != 1) + return 1; + + if (IOCPage5.NumHotSpares == 0) + { + printf("No active hot spares\n"); + return 1; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage2->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage2->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + for (i = 0; i < IOCPage5.NumHotSpares; i++) + { + if (physdisk == IOCPage5.HotSpare[i].PhysDiskNum) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_RAID_ACTION; + req.Action = MPI_RAID_ACTION_DELETE_PHYSDISK; + req.PhysDiskNum = IOCPage5.HotSpare[i].PhysDiskNum; + + printf("\nHot Spare %d (PhysDisk %d) is being deleted\n", + i, IOCPage5.HotSpare[i].PhysDiskNum); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nHot Spare delete operation failed!\n"); + } + + return 1; + } + } + + printf("PhysDisk %d is not a valid hot spare!\n", physdisk); + + return 0; +} + + +int +showHiddenDevices(MPT_PORT *port) +{ + IOCPage2_t *IOCPage2; + IOCPage3_t *IOCPage3; + RaidPhysDiskPage0_t RaidPhysDiskPage0; + int i; + int physdisk; + int nd; + int length; + int bus; + int target; + char buf[32]; + + if (mpi2) + return showHiddenDevices2(port); + + IOCPage2 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 2, 0, &length); + if (IOCPage2 == NULL || IOCPage2->MaxVolumes == 0) + { + if (IOCPage2) + free(IOCPage2); + return 0; + } + + IOCPage3 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 3, 0, &length); + if (IOCPage3 == NULL) + { + free(IOCPage2); + return 0; + } + + nd = IOCPage3->NumPhysDisks; + if (nd == 0 && IOCPage2->NumActiveVolumes) + nd = IOCPage2->MaxPhysDisks; + + if (nd) + { + printf("\nHidden RAID Devices:\n\n"); + + getDeviceInfoHeader(port, buf, sizeof buf); + + printf(" B___T Device Vendor Product Rev %s\n", buf); + + for (i = 0; i < nd; i++) + { + if (IOCPage3->NumPhysDisks) + physdisk = IOCPage3->PhysDisk[i].PhysDiskNum; + else + physdisk = i; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, physdisk, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) != 1) + continue; + + if (!IOCPage3->NumPhysDisks) + if (RaidPhysDiskPage0.PhysDiskStatus.State & MPI_PHYSDISK0_STATUS_MISSING) + continue; + + bus = RaidPhysDiskPage0.PhysDiskBus; + target = RaidPhysDiskPage0.PhysDiskID; + + getDeviceInfo(port, bus, target, buf, sizeof buf); + + printf("%2d %3d PhysDisk %-4d %-8.8s %-16.16s %-4.4s %s\n", + bus, target, physdisk, + RaidPhysDiskPage0.InquiryData.VendorID, + RaidPhysDiskPage0.InquiryData.ProductID, + RaidPhysDiskPage0.InquiryData.ProductRevLevel, buf); + } + } + + free(IOCPage2); + free(IOCPage3); + + return 1; +} + + +int +doRaidActions2(MPT_PORT *port, int command) +{ + Mpi2IOCPage6_t *IOCPage6; + int length; + + if (!(port->capabilities & MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID)) + { + printf("INTEGRATED_RAID capability is not set!\n"); + printf("RAID is not supported on this port\n"); + return 0; + } + + IOCPage6 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_IOC, 6, 0, &length); + if (IOCPage6 == NULL) + { + printf("Failed to read IOCPage6!\n"); + printf("RAID is not supported on this port\n"); + return 0; + } + + if (IOCPage6->MaxVolumes == 0) + { + printf("MaxVolumes is zero!\n"); + printf("RAID is not supported on this port\n"); + return 0; + } + + switch (command) + { + case 1: + doShowVolumes2(port, IOCPage6); + break; + case 2: + doShowPhysDisks2(port, IOCPage6); + break; + case 3: + doGetVolumeState2(port); + break; + case 4: + doWaitForResync2(port); + break; + case 10: + doModifyVolume2(port, MPI2_RAID_ACTION_DISABLE_ALL_VOLUMES, "disabled"); + break; + case 11: + doModifyVolume2(port, MPI2_RAID_ACTION_ENABLE_ALL_VOLUMES, "enabled"); + break; + case 13: + doModifyVolume2(port, MPI2_RAID_ACTION_ACTIVATE_VOLUME, "activated"); + break; + case 20: + doModifyPhysDisk2(port, IOCPage6, MPI2_RAID_ACTION_PHYSDISK_OFFLINE, "offlined"); + break; + case 21: + doModifyPhysDisk2(port, IOCPage6, MPI2_RAID_ACTION_PHYSDISK_ONLINE, "onlined"); + break; + case 22: + doModifyPhysDisk2(port, IOCPage6, MPI2_RAID_ACTION_FAIL_PHYSDISK, "failed"); + break; + case 26: + doDriveFirmwareUpdateMode2(port, IOCPage6, 0); + break; + case 27: + doDriveFirmwareUpdateMode2(port, IOCPage6, 1); + break; + case 30: + doCreateVolume2(port, IOCPage6); + break; + case 31: + doDeleteVolume2(port, IOCPage6); + break; + case 32: + doVolumeSettings2(port); + break; + case 33: + doVolumeName2(port); + break; + case 34: + doVolumeIRCC2(port); + break; + case 35: + doVolumeStopIRCC2(port); + break; + case 36: + doVolumeOCE(port); + break; + case 50: + doCreateHotSpare2(port, IOCPage6); + break; + case 51: + doDeleteHotSpare2(port, IOCPage6); + break; + case 60: + doModifyVolume2(port, MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE, "modified"); + break; + default: + printf("Invalid selection!\n"); + break; + } + + free(IOCPage6); + +#if DOS || EFI + // give the firmware a chance to update the volume metadata + sleep(5); +#endif + + return 1; +} + + +int +selectVolume2(MPT_PORT *port, int *volumeOut, int *handleOut) +{ + Mpi2RaidVolPage0_t *RaidVolumePage0; + int volume; + int volumes[MAX_DEVICES]; + int i; + int length; + int handle; + int type; + int flags; + int bus; + int target; + + handle = 0xffff; + for (i = 0; ; i++) + { + RaidVolumePage0 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE + handle, + &length); + if (RaidVolumePage0 == NULL) + break; + + handle = get16(RaidVolumePage0->DevHandle); + type = RaidVolumePage0->VolumeType; + flags = get32(RaidVolumePage0->VolumeStatusFlags); + + if (mapDevHandleToBusTarget(port, handle, &bus, &target)) + { + printf("Volume %d is DevHandle %04x, Bus %d Target %d, Type %s%s\n", + i, handle, bus, target, + type == MPI2_RAID_VOL_TYPE_RAID0 ? "RAID0 (Striping)" : + type == MPI2_RAID_VOL_TYPE_RAID1E ? "RAID1E (Mirroring Extended)" : + type == MPI2_RAID_VOL_TYPE_RAID1 ? "RAID1 (Mirroring)" : + type == MPI2_RAID_VOL_TYPE_RAID10 ? "RAID10 (Striped Mirroring)" : "Unknown", + flags & MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ? ", inactive" : ""); + } + else + { + printf("Volume %d is DevHandle %04x, Type %s%s\n", + i, handle, + type == MPI2_RAID_VOL_TYPE_RAID0 ? "RAID0 (Striping)" : + type == MPI2_RAID_VOL_TYPE_RAID1E ? "RAID1E (Mirroring Extended)" : + type == MPI2_RAID_VOL_TYPE_RAID1 ? "RAID1 (Mirroring)" : + type == MPI2_RAID_VOL_TYPE_RAID10 ? "RAID10 (Striped Mirroring)" : "Unknown", + flags & MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ? ", inactive" : ""); + } + + volumes[i] = handle; + + free(RaidVolumePage0); + } + printf("\n"); + + if (i == 0) + { + printf("No volumes found.\n"); + return 0; + } + else + { + if (i > 1 || gFlag == TRUE) + { + printf("Volume: [0-%d or RETURN to quit] ", i - 1); + volume = getNumberAnswer(0, i - 1, -1); + if (volume < 0) + return 0; + printf("\n"); + } + else + { + volume = 0; + } + } + + *volumeOut = volume; + *handleOut = volumes[volume]; + + return 1; +} + + +int +doShowVolumes2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6) +{ + Mpi2RaidVolPage0_t *RaidVolumePage0; + Mpi2RaidVolPage1_t RaidVolumePage1; + Mpi2RaidPhysDiskPage0_t RaidPhysDiskPage0; + int i; + int j; + int t1; + int t2; + int t3; + int length; + int handle2; + int handle; + int physdisk; + int type; + int flags; + int bus; + int target; + + handle = 0xffff; + for (i = 0; ; i++) + { + RaidVolumePage0 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE + handle, + &length); + if (RaidVolumePage0 == NULL) + break; + + if (i) + printf("\n"); + + handle = get16(RaidVolumePage0->DevHandle); + type = RaidVolumePage0->VolumeType; + flags = get32(RaidVolumePage0->VolumeStatusFlags); + + if (mapDevHandleToBusTarget(port, handle, &bus, &target)) + { + printf("Volume %d is DevHandle %04x, Bus %d Target %d, Type %s%s\n", + i, handle, bus, target, + type == MPI2_RAID_VOL_TYPE_RAID0 ? "RAID0 (Striping)" : + type == MPI2_RAID_VOL_TYPE_RAID1E ? "RAID1E (Mirroring Extended)" : + type == MPI2_RAID_VOL_TYPE_RAID1 ? "RAID1 (Mirroring)" : + type == MPI2_RAID_VOL_TYPE_RAID10 ? "RAID10 (Striped Mirroring)" : "Unknown", + flags & MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ? ", inactive" : ""); + } + else + { + printf("Volume %d is DevHandle %04x, Type %s%s\n", + i, handle, + type == MPI2_RAID_VOL_TYPE_RAID0 ? "RAID0 (Striping)" : + type == MPI2_RAID_VOL_TYPE_RAID1E ? "RAID1E (Mirroring Extended)" : + type == MPI2_RAID_VOL_TYPE_RAID1 ? "RAID1 (Mirroring)" : + type == MPI2_RAID_VOL_TYPE_RAID10 ? "RAID10 (Striped Mirroring)" : "Unknown", + flags & MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ? ", inactive" : ""); + } + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 1, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + handle, + &RaidVolumePage1, sizeof RaidVolumePage1) == 1) + { + printf(" Volume Name: %-32s\n", + RaidVolumePage1.Name); + printf(" Volume WWID: %08x%08x\n", + get32(RaidVolumePage1.WWID.High), get32(RaidVolumePage1.WWID.Low)); + } + + t1 = RaidVolumePage0->VolumeState; + t2 = flags; + + doShowVolumeState2(i, t1, t2, FALSE); + + if ( flags & MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ) + { + t3 = RaidVolumePage0->InactiveStatus; + printf(" Volume Inactive Reason: %s\n", + t3 == MPI2_RAIDVOLPAGE0_STALE_METADATA_INACTIVE ? "stale metadata" : + t3 == MPI2_RAIDVOLPAGE0_FOREIGN_VOLUME_INACTIVE ? "foreign volume" : + t3 == MPI2_RAIDVOLPAGE0_INSUFFICIENT_RESOURCE_INACTIVE ? "insufficient resources" : + t3 == MPI2_RAIDVOLPAGE0_CLONE_VOLUME_INACTIVE ? "clone of volume found" : + t3 == MPI2_RAIDVOLPAGE0_INSUFFICIENT_METADATA_INACTIVE ? "insufficent valid metadata" : + t3 == MPI2_RAIDVOLPAGE0_PREVIOUSLY_DELETED ? "volume previously deleted" : "unknown"); + } + + t1 = get16(RaidVolumePage0->VolumeSettings.Settings); + t2 = RaidVolumePage0->VolumeSettings.HotSparePool; + printf(" Volume Settings: write caching %s, auto configure hot swap %s%s\n", + t1 & MPI2_RAIDVOL0_SETTING_ENABLE_WRITE_CACHING ? "enabled" : + t1 & MPI2_RAIDVOL0_SETTING_DISABLE_WRITE_CACHING ? "disabled" : "controlled by members", + t1 & MPI2_RAIDVOL0_SETTING_AUTO_CONFIG_HSWAP_DISABLE ? "disabled" : "enabled", + flags & MPI2_RAIDVOL0_STATUS_FLAG_DATA_SCRUB ? ", data scrub allowed" : ""); + + if (t2 != 0) + printf(" Volume draws from Hot Spare Pools: %s%s%s%s%s%s%s%s\n", + t2 & MPI2_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + + if (type == MPI2_RAID_VOL_TYPE_RAID1) + printf(" Volume Size %" INT64_FMT "d MB, %d Members\n", + (get64(RaidVolumePage0->MaxLBA) + 1) / 2048, RaidVolumePage0->NumPhysDisks); + else + printf(" Volume Size %" INT64_FMT "d MB, Stripe Size %d KB, %d Members\n", + (get64(RaidVolumePage0->MaxLBA) + 1) / 2048, get32(RaidVolumePage0->StripeSize) / 2, + RaidVolumePage0->NumPhysDisks); + + for (j = 0; j < RaidVolumePage0->NumPhysDisks; j++) + { + physdisk = RaidVolumePage0->PhysDisk[j].PhysDiskNum; + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, + MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM + physdisk, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) == 1) + { + handle2 = get16(RaidPhysDiskPage0.DevHandle); + + if (mapDevHandleToBusTarget(port, handle2, &bus, &target)) + { + if (type == MPI2_RAID_VOL_TYPE_RAID1) + printf(" %s is PhysDisk %d (DevHandle %04x, Bus %d Target %d)\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI2_RAIDVOL0_PHYSDISK_PRIMARY ? "Primary" : + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI2_RAIDVOL0_PHYSDISK_SECONDARY ? "Secondary" : + "Member", RaidVolumePage0->PhysDisk[j].PhysDiskNum, handle2, bus, target); + else + printf(" Member %d is PhysDisk %d (DevHandle %04x, Bus %d Target %d)\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap, RaidVolumePage0->PhysDisk[j].PhysDiskNum, + handle2, bus, target); + } + else + { + if (type == MPI2_RAID_VOL_TYPE_RAID1) + printf(" %s is PhysDisk %d (DevHandle %04x)\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI2_RAIDVOL0_PHYSDISK_PRIMARY ? "Primary" : + RaidVolumePage0->PhysDisk[j].PhysDiskMap == MPI2_RAIDVOL0_PHYSDISK_SECONDARY ? "Secondary" : + "Member", RaidVolumePage0->PhysDisk[j].PhysDiskNum, handle2); + else + printf(" Member %d is PhysDisk %d (DevHandle %04x)\n", + RaidVolumePage0->PhysDisk[j].PhysDiskMap, RaidVolumePage0->PhysDisk[j].PhysDiskNum, + handle2); + } + } + } + + free(RaidVolumePage0); + } + + if (i == 0) + printf("No volumes active\n"); + + return 1; +} + + +int +doShowPhysDisks2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6) +{ + Mpi2RaidPhysDiskPage0_t RaidPhysDiskPage0; + Mpi2RaidPhysDiskPage1_t *RaidPhysDiskPage1; + int i; + int j; + int physdisk; + int np; + int t1; + int t2; + int length; + int handle; + int handle2; + int bus; + int target; + + physdisk = 0xff; + for (i = 0; ; i++) + { + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, + MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM + physdisk, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) != 1) + break; + + if (i) + printf("\n"); + + physdisk = RaidPhysDiskPage0.PhysDiskNum; + handle = get16(RaidPhysDiskPage0.DevHandle); + + if (mapDevHandleToBusTarget(port, handle, &bus, &target)) + { + printf("PhysDisk %d is DevHandle %04x, Bus %d Target %d\n", + physdisk, handle, bus, target); + } + else + { + printf("PhysDisk %d is DevHandle %04x\n", + physdisk, handle); + } + + t1 = RaidPhysDiskPage0.PhysDiskState; + t2 = get32(RaidPhysDiskPage0.PhysDiskStatusFlags); + printf(" PhysDisk State: %s%s%s%s%s%s%s\n", + t1 == MPI2_RAID_PD_STATE_NOT_CONFIGURED ? "not configured" : + t1 == MPI2_RAID_PD_STATE_NOT_COMPATIBLE ? "not compatible" : + t1 == MPI2_RAID_PD_STATE_OFFLINE ? "offline" : + t1 == MPI2_RAID_PD_STATE_ONLINE ? "online" : + t1 == MPI2_RAID_PD_STATE_HOT_SPARE ? "hot spare" : + t1 == MPI2_RAID_PD_STATE_DEGRADED ? "degraded" : + t1 == MPI2_RAID_PD_STATE_REBUILDING ? "rebuilding" : + t1 == MPI2_RAID_PD_STATE_OPTIMAL ? "optimal" : "unknown", + t2 & MPI2_PHYSDISK0_STATUS_FLAG_OUT_OF_SYNC ? ", out of sync" : "", + t2 & MPI2_PHYSDISK0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + t2 & MPI2_PHYSDISK0_STATUS_FLAG_INACTIVE_VOLUME ? ", member of inactive volume" : "", + t2 & MPI2_PHYSDISK0_STATUS_FLAG_WRITE_CACHE_ENABLED ? ", write cache enabled" : "", + t2 & MPI2_PHYSDISK0_STATUS_FLAG_OCE_TARGET ? ", online capacity expansion target" : "", + t2 & MPI2_PHYSDISK0_STATUS_FLAG_NOT_CERTIFIED ? ", disk not certified" : ""); + + + if (t1 == MPI2_RAID_PD_STATE_NOT_COMPATIBLE) + { + t2 = RaidPhysDiskPage0.IncompatibleReason; + printf(" PhysDisk Incompatible Reason: %s\n", + t2 == MPI2_PHYSDISK0_INCOMPATIBLE_PROTOCOL ? "incorrect protocol" : + t2 == MPI2_PHYSDISK0_INCOMPATIBLE_BLOCKSIZE ? "block size mismatch" : + t2 == MPI2_PHYSDISK0_INCOMPATIBLE_MAX_LBA ? "disk too small" : + t2 == MPI2_PHYSDISK0_INCOMPATIBLE_SATA_EXTENDED_CMD ? "SATA extended command set not supported" : + t2 == MPI2_PHYSDISK0_INCOMPATIBLE_REMOVEABLE_MEDIA ? "disk media is removable" : "unknown"); + } + + if (t1 == MPI2_RAID_PD_STATE_OFFLINE) + { + t2 = RaidPhysDiskPage0.OfflineReason; + printf(" PhysDisk Offline Reason: %s\n", + t2 == MPI2_PHYSDISK0_OFFLINE_MISSING ? "missing" : + t2 == MPI2_PHYSDISK0_OFFLINE_FAILED ? "failed" : + t2 == MPI2_PHYSDISK0_OFFLINE_INITIALIZING ? "initializing" : + t2 == MPI2_PHYSDISK0_OFFLINE_REQUESTED ? "offline at host request" : + t2 == MPI2_PHYSDISK0_OFFLINE_FAILED_REQUESTED ? "failed at host request" : "unknown"); + } + +// t1 = RaidPhysDiskPage0.PhysDiskSettings.PhysDiskSettings; + t2 = RaidPhysDiskPage0.PhysDiskSettings.HotSparePool; +// printf(" PhysDisk Settings: \n"); + if (t2 != 0) + printf(" PhysDisk belongs to Hot Spare Pools: %s%s%s%s%s%s%s%s\n", + t2 & MPI2_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + + printf(" PhysDisk Size %" INT64_FMT "d MB, Inquiry Data: %-8.8s %-16.16s %-4.4s\n", + (get64(RaidPhysDiskPage0.CoercedMaxLBA) + 1) / 2048, RaidPhysDiskPage0.InquiryData.VendorID, + RaidPhysDiskPage0.InquiryData.ProductID, RaidPhysDiskPage0.InquiryData.ProductRevLevel); + + RaidPhysDiskPage1 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 1, + MPI2_PHYSDISK_PGAD_FORM_PHYSDISKNUM + physdisk, + &length); + if (RaidPhysDiskPage1 == NULL) + continue; + + np = RaidPhysDiskPage1->NumPhysDiskPaths; + + if (np > 1) + { + for (j = 0; j < np; j++) + { + handle2 = get16(RaidPhysDiskPage1->PhysicalDiskPath[j].DevHandle); + t1 = get16(RaidPhysDiskPage1->PhysicalDiskPath[j].Flags); + + if (mapDevHandleToBusTarget(port, handle2, &bus, &target)) + { + printf(" Path %d is DevHandle %04x, Bus %d Target %d, %s\n", j, + handle2, bus, target, + t1 & MPI2_RAID_PHYSDISK1_FLAG_INVALID ? "invalid" : + t1 & MPI2_RAID_PHYSDISK1_FLAG_BROKEN ? "broken" : + t1 & MPI2_RAID_PHYSDISK1_FLAG_PRIMARY ? "online, primary" : + "online"); + } + else + { + printf(" Path %d is DevHandle %04x, %s\n", j, + handle2, + t1 & MPI2_RAID_PHYSDISK1_FLAG_INVALID ? "invalid" : + t1 & MPI2_RAID_PHYSDISK1_FLAG_BROKEN ? "broken" : + t1 & MPI2_RAID_PHYSDISK1_FLAG_PRIMARY ? "online, primary" : + "online"); + } + printf(" WWID %" INT64_FMT "x\tOwner WWID %" INT64_FMT "x\tOwner ID %x\n", + get64(RaidPhysDiskPage1->PhysicalDiskPath[j].WWID), + get64(RaidPhysDiskPage1->PhysicalDiskPath[j].OwnerWWID), + RaidPhysDiskPage1->PhysicalDiskPath[j].OwnerIdentifier); + } + } + + free(RaidPhysDiskPage1); + } + + if (i == 0) + printf("No physical disks active\n"); + + return 1; +} + + +void +doShowVolumeState2(int volume, int volState, int volFlag, int useVolume) +{ + char volStr[5]; + int gotOne; + + memset(volStr, 0, sizeof(volStr)); + + if (useVolume) + { + sprintf(volStr, "%d ", volume); + } + + printf("%sVolume %sState: %s%s%s%s%s%s\n", useVolume ? "" : " ", volStr, + volState == MPI2_RAID_VOL_STATE_OPTIMAL ? "optimal" : + volState == MPI2_RAID_VOL_STATE_DEGRADED ? "degraded" : + volState == MPI2_RAID_VOL_STATE_ONLINE ? "online" : + volState == MPI2_RAID_VOL_STATE_INITIALIZING ? "initializing" : + volState == MPI2_RAID_VOL_STATE_FAILED ? "failed" : + volState == MPI2_RAID_VOL_STATE_MISSING ? "missing" : "unknown", + volFlag & MPI2_RAIDVOL0_STATUS_FLAG_ENABLED ? ", enabled" : ", disabled", + volFlag & MPI2_RAIDVOL0_STATUS_FLAG_QUIESCED ? ", quiesced" : "", + volFlag & MPI2_RAIDVOL0_STATUS_FLAG_BAD_BLOCK_TABLE_FULL ? ", bad block table full" : "", + volFlag & MPI2_RAIDVOL0_STATUS_FLAG_OCE_ALLOWED ? ", online capacity expansion allowed" : "", + volFlag & MPI2_RAIDVOL0_STATUS_FLAG_BGI_COMPLETE ? ", background init complete" : ""); + + if (volFlag & (MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS | + MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT | + MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION | + MPI2_RAIDVOL0_STATUS_FLAG_CONSISTENCY_CHECK | + MPI2_RAIDVOL0_STATUS_FLAG_MAKE_DATA_CONSISTENT)) + { + printf("%s [In Progress: ", useVolume ? "" : " "); + gotOne = 0; + + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS) + { + printf("resync"); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT) + { + printf("%sbackground init", gotOne ? ", " : ""); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION) + { + printf("%scapacity expansion", gotOne ? ", " : ""); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_CONSISTENCY_CHECK) + { + printf("%suser initiated consistency check", gotOne ? ", " : ""); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_MAKE_DATA_CONSISTENT) + { + printf("%smake data consistent", gotOne ? ", " : ""); + gotOne = 1; + } + printf("]\n"); + } + + if (volFlag & (MPI2_RAIDVOL0_STATUS_FLAG_USER_CONSIST_PENDING | + MPI2_RAIDVOL0_STATUS_FLAG_MDC_PENDING | + MPI2_RAIDVOL0_STATUS_FLAG_BACKG_INIT_PENDING | + MPI2_RAIDVOL0_STATUS_FLAG_PENDING_RESYNC)) + { + printf("%s [Pending: ", useVolume ? "" : " "); + + gotOne = 0; + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_USER_CONSIST_PENDING) + { + printf("user initiated consistency check"); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_MDC_PENDING) + { + printf("%smake data consistent", gotOne ? ", " : ""); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_BACKG_INIT_PENDING) + { + printf("%sbackground init", gotOne ? ", " : ""); + gotOne = 1; + } + if (volFlag & MPI2_RAIDVOL0_STATUS_FLAG_PENDING_RESYNC) + { + printf("%sresync", gotOne ? ", " : ""); + gotOne = 1; + } + printf("]\n"); + } +} + + +int +doGetVolumeState2(MPT_PORT *port) +{ + Mpi2RaidVolPage0_t *RaidVolumePage0; + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + Mpi2RaidVolIndicator_t *data; + int volume; + int handle; + int length; + int t1; + int t2; + int t3; + uint64_t size; + uint64_t done; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + RaidVolumePage0 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + handle, + &length); + if (RaidVolumePage0 == NULL) + { + printf("Failed to read RaidVolumePage0!\n"); + return 0; + } + + t1 = RaidVolumePage0->VolumeState; + t2 = get32(RaidVolumePage0->VolumeStatusFlags); + + doShowVolumeState2(volume, t1, t2, TRUE); + + if (t2 & MPI2_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE) + { + t3 = RaidVolumePage0->InactiveStatus; + printf("Volume %d Inactive Reason: %s\n", volume, + t3 == MPI2_RAIDVOLPAGE0_STALE_METADATA_INACTIVE ? "stale metadata" : + t3 == MPI2_RAIDVOLPAGE0_FOREIGN_VOLUME_INACTIVE ? "foreign volume" : + t3 == MPI2_RAIDVOLPAGE0_INSUFFICIENT_RESOURCE_INACTIVE ? "insufficient resources" : + t3 == MPI2_RAIDVOLPAGE0_CLONE_VOLUME_INACTIVE ? "clone of volume found" : + t3 == MPI2_RAIDVOLPAGE0_INSUFFICIENT_METADATA_INACTIVE ? "insufficent valid metadata" : + t3 == MPI2_RAIDVOLPAGE0_PREVIOUSLY_DELETED ? "volume previously deleted" : "unknown"); + } + + if (t2 & (MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS | + MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT | + MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION | + MPI2_RAIDVOL0_STATUS_FLAG_CONSISTENCY_CHECK | + MPI2_RAIDVOL0_STATUS_FLAG_MAKE_DATA_CONSISTENT)) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_INDICATOR_STRUCT; + req.VolDevHandle = set16(handle); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + data = (pMpi2RaidVolIndicator_t)&rep.ActionData.RaidVolumeIndicator; + + size = get64(data->TotalBlocks); + done = get64(data->BlocksRemaining); + + if (size && done) + { + printf("Progress: total blocks %" INT64_FMT "d, blocks remaining %" INT64_FMT "d, %d%%\n", + size, done, (int)(done / (size / 100))); + } + } + + free (RaidVolumePage0); + + return 1; +} + + +int +doWaitForResync2(MPT_PORT *port) +{ + Mpi2RaidVolPage0_t *RaidVolumePage0; + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + Mpi2RaidVolIndicator_t *data; + int volume; + int handle; + int length; + uint64_t size; + uint64_t done; + int t1; + int t2; + int percent; + int last_percent = -1; + int n; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + RaidVolumePage0 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + handle, + &length); + if (RaidVolumePage0 == NULL) + { + printf("Failed to read RaidVolumePage0!\n"); + return 0; + } + + t1 = RaidVolumePage0->VolumeState; + t2 = get32(RaidVolumePage0->VolumeStatusFlags); + + doShowVolumeState2(volume, t1, t2, TRUE); + + if (t2 & (MPI2_RAIDVOL0_STATUS_FLAG_RESYNC_IN_PROGRESS | + MPI2_RAIDVOL0_STATUS_FLAG_BACKGROUND_INIT | + MPI2_RAIDVOL0_STATUS_FLAG_CAPACITY_EXPANSION | + MPI2_RAIDVOL0_STATUS_FLAG_CONSISTENCY_CHECK | + MPI2_RAIDVOL0_STATUS_FLAG_MAKE_DATA_CONSISTENT)) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_INDICATOR_STRUCT; + req.VolDevHandle = set16(handle); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + data = (pMpi2RaidVolIndicator_t)&rep.ActionData.RaidVolumeIndicator; + + size = get64(data->TotalBlocks); + done = get64(data->BlocksRemaining); + + if (size && done) + { + last_percent = (int)(done / (size / 100)); + printf("Progress: total blocks %" INT64_FMT "d, blocks remaining %" INT64_FMT "d, %d%%\n", + size, done, last_percent); + } + } + else + return 1; + + n = 0; + while (TRUE) + { + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + data = (pMpi2RaidVolIndicator_t)&rep.ActionData.RaidVolumeIndicator; + + size = get64(data->TotalBlocks); + done = get64(data->BlocksRemaining); + + if (size && done) + { + percent = (int)(done / (size / 100)); + if (percent != last_percent) + { + last_percent = percent; + n += printf(" %d%%", last_percent); + fflush(stdout); + if (n >= 75) + { + printf("\n"); + n = 0; + } + } + } + else + break; + + sleep(1); + } + if (n) + printf("\n"); + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + handle, + RaidVolumePage0, length) != 1) + { + free(RaidVolumePage0); + return 0; + } + + t1 = RaidVolumePage0->VolumeState; + t2 = get32(RaidVolumePage0->VolumeStatusFlags); + + doShowVolumeState2(volume, t1, t2, TRUE); + + free(RaidVolumePage0); + + return 1; +} + + +int +doModifyVolume2(MPT_PORT *port, int action, char *string) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int volume; + int handle; + int all; + int nv; + int rate; + int interval; + int actionWord; + + all = 0; + nv = 0; + handle = 0; + + /* get the current number of volumes across all configs */ + getRaidCounts(port, FALSE, &nv, NULL, NULL); + + if (nv == 0) + { + printf("No volumes available\n"); + return 1; + } + + if (action == MPI2_RAID_ACTION_DISABLE_ALL_VOLUMES || + action == MPI2_RAID_ACTION_ENABLE_ALL_VOLUMES) + { + all = 1; + volume = 0; + } + else + { + all = 0; + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + if (action == MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE) + { + printf("Enter rate to modify (0 = Resync, 1 = Data Scrub Duration, 2 = Power Save Mode): "); + rate = getNumberAnswer(0, 2, -1); + + printf("Enter new rate: "); + interval = getNumberAnswer(0, 999, -1); + + if(rate == 1) + { + actionWord = ((interval << 16) | rate); // For data scrub only + } + else + { + actionWord = ((interval << 8) | rate); // For resync and powersave modes + } + } /* if MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE */ + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = action; + req.VolDevHandle = set16(handle); + + if(action == MPI2_RAID_ACTION_SET_RAID_FUNCTION_RATE) + { + req.ActionDataWord.Word = set32(actionWord); + } + + if (all) + printf("Volumes are being %s\n", string); + else + printf("Volume %d is being %s\n", volume, string); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doCreateVolume2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6) +{ + Mpi2ManufacturingPage4_t ManufacturingPage4; + Mpi2RaidPhysDiskPage0_t RaidPhysDiskPage0; + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + Mpi2RaidVolumeCreationStruct_t *RaidVolumeCreate; + int bus; + int target; + PATH path; + int no_mix_sas_sata; + int no_mix_ssd_non_ssd; + int no_mix_ssd_sas_sata; + int sata = 0; + int ssd = 0; + int num_physdisks; + int physdisks[MAX_DEVICES]; + int chosen[MAX_DEVICES]; + unsigned char inq[36]; + unsigned char cap[8]; + uint64_t size; + uint64_t coerced_size; + uint64_t min_size = 0; + uint64_t volume_size; + uint64_t max_volume_size; + uint64_t max_lba; + int length; + int i; + int n; + int t; + int settings = 0; + int nd; + int nv; + int cap_flags; + int man_flags; + int type; + int handle; + char name[16]; + int raid0_okay; + int raid1_okay; + int raid1e_okay; + int raid10_okay; + int flags; + int min_disks; + + /* get the current number of volumes and phys disks in the active config */ + getRaidCounts(port, TRUE, &nv, &nd, NULL); + + if (nv >= IOCPage6->MaxVolumes) + { + printf("Cannot create another active volume\n"); + return 0; + } + + min_disks = min(2, min(IOCPage6->MinDrivesRAID0, min(IOCPage6->MinDrivesRAID1E, IOCPage6->MinDrivesRAID10))); + + if (nd + min_disks > IOCPage6->MaxPhysDisks) + { + printf("Cannot create at least %d physical disk%s\n", + min_disks, min_disks == 1 ? "" : "s"); + return 0; + } + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_MANUFACTURING, 4, 0, + &ManufacturingPage4, sizeof ManufacturingPage4) != 1) + return 0; + + if (nv >= ManufacturingPage4.MaxVolumes) + { + printf("Cannot create another active volume\n"); + return 0; + } + + if (nd + min_disks > ManufacturingPage4.MaxPhysDisks) + { + printf("Cannot create at least %d physical disk%s\n", + min_disks, min_disks == 1 ? "" : "s"); + return 0; + } + + printf(" B___T___L Type Vendor Product Rev Disk Blocks Disk MB\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (isRaidVolume(port, bus, target)) + continue; + + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) != 0x00) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + if (doReadCapacity(port, bus, target, 0, cap, sizeof cap) != 1) + continue; + + size = get4bytes(cap, 0); + + if (size == 0xffffffff) + { + if (doReadCapacity16(port, bus, target, 0, cap, sizeof cap) == 1) + { + size = get8bytes(cap, 0); + } + } + + if (getPath(port, bus, target, &path) == 1) + { + for (i = 0; i < n; i++) + { + if (diag_targets[i].path.slot == path.slot && + diag_targets[i].path.encl_id_l == path.encl_id_l && + diag_targets[i].path.encl_id_h == path.encl_id_h) + { + printf("Bus %d Target %d is another path to Bus %d Target %d, ignoring\n", + bus, target, diag_targets[i].bus, diag_targets[i].target); + break; + } + } + if (i < n) + continue; + } + + if (!mapBusTargetToDevHandle(port, bus, target, &handle)) + { + printf("Failed to get DevHandle for Bus %d Target %d\n", bus, target); + continue; + } + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, + MPI2_PHYSDISK_PGAD_FORM_DEVHANDLE + handle, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) != 1) + { + printf("Failed to get DevHandle for Bus %d Target %d\n", bus, target); + continue; + } + + coerced_size = get64(RaidPhysDiskPage0.CoercedMaxLBA); + + printf("%2d. %2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %10"INT64_FMT"d %7"INT64_FMT"d\n", + n+1, bus, target, 0, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, size + 1, (size + 1) / 2048); + + if (coerced_size > size) // unsigned arithmetic, checking for underflow (that is, disk too small) + { + printf("Bus %d Target %d is %d blocks (%d MB), too small to be a volume member\n", + bus, target, size + 1, (size + 1) / 2048); + continue; + } + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].size64 = coerced_size; + diag_targets[n].path = path; + + n++; + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n < min_disks) + { + printf("\nNot enough available targets found\n"); + return 1; + } + + cap_flags = get32(IOCPage6->CapabilitiesFlags); + + printf("\nTo create a volume, select %d or more of the available targets\n", min_disks); + if (cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID0_SUPPORT) + printf(" select %d to %d targets for a RAID0 volume\n", + IOCPage6->MinDrivesRAID0, IOCPage6->MaxDrivesRAID0); + if (cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID1_SUPPORT) + printf(" select 2 targets for a RAID1 volume\n"); + if (cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID1E_SUPPORT) + printf(" select %d to %d targets for a RAID1E volume\n", + IOCPage6->MinDrivesRAID1E, IOCPage6->MaxDrivesRAID1E); + if (cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID10_SUPPORT) + { + printf(" select %d to %d targets for a RAID10 volume\n", + IOCPage6->MinDrivesRAID10, IOCPage6->MaxDrivesRAID10); + printf("\nNote: for a RAID10, the number of targets must be even\n"); + } + printf("\n"); + + num_physdisks = 0; + + man_flags = get32(ManufacturingPage4.Flags); + no_mix_sas_sata = (man_flags & MPI2_MANPAGE4_IR_NO_MIX_SAS_SATA) != 0; + no_mix_ssd_non_ssd = (man_flags & MPI2_MANPAGE4_MIX_SSD_AND_NON_SSD) == 0; + no_mix_ssd_sas_sata = (man_flags & MPI2_MANPAGE4_MIX_SSD_SAS_SATA) == 0; + + while (TRUE) + { + printf("Select a target: [1-%d or RETURN to quit] ", n); + i = getNumberAnswer(1, n, 0); + if (i == 0) + break; + i--; + + for (t = 0; t < num_physdisks; t++) + { + if (i == chosen[t]) + { + printf("\nThis target has already been chosen!\n\n"); + break; + } + } + if (t < num_physdisks) + continue; + + chosen[num_physdisks] = i; + + bus = diag_targets[i].bus; + target = diag_targets[i].target; + + if (num_physdisks == 0) + { + sata = isSata(port, bus, target); + ssd = isSsd(port, bus, target); + } + else + { + if (no_mix_sas_sata) + { + if (sata != isSata(port, bus, target)) + { + printf("\nThis %s target cannot be mixed with the %s target%s already chosen!\n\n", + sata ? "SAS" : "SATA", sata ? "SATA" : "SAS", + num_physdisks == 1 ? "" : "s"); + continue; + } + } + + if (no_mix_ssd_non_ssd) + { + if (ssd != isSsd(port, bus, target)) + { + printf("\nThis %s target cannot be mixed with the %s target%s already chosen!\n\n", + ssd ? "non-SSD" : "SSD", ssd ? "SSD" : "non-SSD", + num_physdisks == 1 ? "" : "s"); + continue; + } + } + + if (no_mix_ssd_sas_sata) + { + if (ssd && isSsd(port, bus, target) && sata != isSata(port, bus, target)) + { + printf("\nThis %s SSD target cannot be mixed with the %s SSD target%s already chosen!\n\n", + sata ? "SAS" : "SATA", sata ? "SATA" : "SAS", + num_physdisks == 1 ? "" : "s"); + continue; + } + } + } + + if (!mapBusTargetToDevHandle(port, bus, target, &handle)) + { + printf("\nFailed to get DevHandle for Bus %d Target %d\n", bus, target); + continue; + } + + physdisks[num_physdisks] = handle; + + num_physdisks++; + + if (num_physdisks >= n && gFlag != TRUE) + break; + + if (nd + num_physdisks >= ManufacturingPage4.MaxPhysDisks) + { + printf(" no more physical disks can be created, exiting loop\n"); + break; + } + + if (num_physdisks >= ManufacturingPage4.MaxPhysDisksPerVol) + { + printf(" no more physical disks allowed in a volume, exiting loop\n"); + break; + } + } + + printf("\n%d physical disks were selected\n\n", num_physdisks); + + if (num_physdisks < min_disks) + { + printf("Volumes must have at least %d physical disks!\n", min_disks); + return 0; + } + + raid0_okay = num_physdisks >= IOCPage6->MinDrivesRAID0 && cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID0_SUPPORT; + raid1_okay = num_physdisks == 2 && cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID1_SUPPORT; + raid1e_okay = num_physdisks >= IOCPage6->MinDrivesRAID1E && cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID1E_SUPPORT; + raid10_okay = num_physdisks >= IOCPage6->MinDrivesRAID10 && num_physdisks % 2 == 0 && cap_flags & MPI2_IOCPAGE6_CAP_FLAGS_RAID10_SUPPORT; + + if (!raid0_okay && !raid1_okay && !raid1e_okay && !raid10_okay) + { + printf("No suitable RAID volume type could be found for the targets selected!\n"); + return 0; + } + + printf("Select volume type: [%s%s%s%sor RETURN to quit] ", + raid0_okay ? "0=RAID0, " : "", + raid1_okay ? "1=RAID1, " : "", + raid1e_okay ? "2=RAID1E, " : "", + raid10_okay ? "3=RAID10, " : ""); + while (TRUE) + { + type = getNumberAnswer(0, 3, -1); + if (type < 0) + return 0; + if ((type == 0 && raid0_okay) || + (type == 1 && raid1_okay) || + (type == 2 && raid1e_okay) || + (type == 3 && raid10_okay)) + { + break; + } + printf("Invalid answer, try again: "); + } + + switch (type) + { + case 0: + type = MPI2_RAID_VOL_TYPE_RAID0; + settings = get32(ManufacturingPage4.RAID0VolumeSettings); + break; + case 1: + type = MPI2_RAID_VOL_TYPE_RAID1; + settings = get32(ManufacturingPage4.RAID1VolumeSettings); + break; + case 2: + type = MPI2_RAID_VOL_TYPE_RAID1E; + settings = get32(ManufacturingPage4.RAID1EVolumeSettings); + break; + case 3: + type = MPI2_RAID_VOL_TYPE_RAID10; + settings = get32(ManufacturingPage4.RAID10VolumeSettings); + break; + } + + length = sizeof *RaidVolumeCreate + sizeof RaidVolumeCreate->PhysDisk * (num_physdisks - 1); + + RaidVolumeCreate = malloc(length); + + memset(RaidVolumeCreate, 0, length); + + RaidVolumeCreate->NumPhysDisks = num_physdisks; + RaidVolumeCreate->VolumeType = type; + RaidVolumeCreate->ResyncRate = ManufacturingPage4.ResyncRate; + RaidVolumeCreate->DataScrubDuration = ManufacturingPage4.DataScrubDuration; + + max_volume_size = ((uint64_t)1 << (64 - 11)); // in MB + + t = 0; + for (i = 0; i < num_physdisks; i++) + { + size = (diag_targets[chosen[i]].size64 + 1) / 2048; + + printf("Usable size of member %d is %"INT64_FMT"d MB\n", i, size); + + if (i == 0) + { + min_size = size; + } + else + { + if (size != min_size) + t = 1; + if (size < min_size) + { + printf(" reducing volume member size from %d MB to %d MB\n", min_size, size); + min_size = size; + } + } + } + if (t) + { + printf("Not all physical disks are the same size!\n"); + printf("A common size of %d MB will be used for each physical disk\n", min_size); + } + + volume_size = (uint64_t)min_size * num_physdisks; + + if (type != MPI2_RAID_VOL_TYPE_RAID0) + volume_size /= 2; + + if (volume_size > max_volume_size) + { + printf("Maximum volume size exceeded; reducing size from %" INT64_FMT "d MB to %" INT64_FMT "d MB\n", + volume_size, max_volume_size); + volume_size = max_volume_size; + } + + printf("Select volume size: [1 to %" INT64_FMT "d MB, default is %" INT64_FMT "d] ", + volume_size, volume_size); + max_lba = (uint64_t)getNumberAnswer(1, (int)volume_size, (int)volume_size) * 2048 - 1; + + t = (U32)max_lba; + RaidVolumeCreate->VolumeMaxLBA.Low = set32(t); + t = (U32)(max_lba >> 32); + RaidVolumeCreate->VolumeMaxLBA.High = set32(t); + + // Volumes can be made up of 512b sector and 4Kb sector drives. As such, + // we can no longer simply use the IOCPage6 map. We really should get + // the drive information and calculate the size based on that. However, + // the firmware only supports one block size. We can tell the FW to use + // its only supported size by setting StripeSize to 0. + RaidVolumeCreate->StripeSize = set32(0); +#if 0 + if (stripe_map) + { + if (stripe_map & (stripe_map - 1)) + { + t = stripe_map / 2; + min_stripe = t & (-t); + t = ((t | (min_stripe - 1)) + 1) / 2; + max_stripe = t & (-t); + def_stripe = min(max(128, min_stripe), max_stripe); + printf("Select stripe size: [%d to %d KB, default is %d] ", min_stripe, max_stripe, def_stripe); + size = getNumberAnswer(min_stripe, max_stripe, def_stripe); + } + else + { + size = stripe_map / 2; + printf("A stripe size of %d KB will be used\n", size); + } + RaidVolumeCreate->StripeSize = set32((unsigned int)size * 2); + } +#endif + while (TRUE) + { + printf("Enter a volume name: [0 to %d characters] ", (int)sizeof name - 1); + + n = getStringFromArgs(name, sizeof name, stdin); + if (n < sizeof name) + break; + + printf("Invalid answer, try again: "); + } + + memcpy(RaidVolumeCreate->Name, name, n); + + for (i = 0; i < num_physdisks; i++) + { + RaidVolumeCreate->PhysDisk[i].PhysDiskDevHandle = set16(physdisks[i]); + RaidVolumeCreate->PhysDisk[i].PhysDiskMap = i; + } + + if (type == MPI2_RAID_VOL_TYPE_RAID1) + { + RaidVolumeCreate->PhysDisk[0].PhysDiskMap = MPI2_RAIDVOL0_PHYSDISK_PRIMARY; + RaidVolumeCreate->PhysDisk[1].PhysDiskMap = MPI2_RAIDVOL0_PHYSDISK_SECONDARY; + } + + RaidVolumeCreate->VolumeSettings = set32(settings); + + flags = 0; + + printf("Use default settings? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) == 1) + flags |= MPI2_RAID_VOL_CREATION_DEFAULT_SETTINGS; + + printf("Zero the first and last blocks of the volume? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + flags |= MPI2_RAID_VOL_CREATION_LOW_LEVEL_INIT; + + if (type == MPI2_RAID_VOL_TYPE_RAID1) + { + printf("Copy all data from primary to secondary? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) == 1) + flags |= MPI2_RAID_VOL_CREATION_MIGRATE_DATA; + } + + if (type != MPI2_RAID_VOL_TYPE_RAID0) + { + flags |= MPI2_RAID_VOL_CREATION_BACKGROUND_INIT; + } + + RaidVolumeCreate->VolumeCreationFlags = set32(flags); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_CREATE_VOLUME; + + t = doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, RaidVolumeCreate, length, LONG_TIME); + + if (t == 1) + printf("\nVolume was created\n"); + + free(RaidVolumeCreate); + + return t; +} + + +int +doDeleteVolume2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + Mpi2RaidConfigurationPage0_t *RaidConfigPage0; + int volume; + int i; + int handle; + int type; + int flags; + int configNum; + int length; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + if (getRaidConfig(port, MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT, handle, -1, &RaidConfigPage0) == 1) + { + /* save the RAID config this volume resides in so we can check for hot spares after it is deleted */ + configNum = RaidConfigPage0->ConfigNum; + free(RaidConfigPage0); + } + else + { + printf("\nUnable to determine raid configuration volume resides in!\n"); + return 1; + } + + printf("All data on Volume %d will be lost!\n", volume); + printf("\nAre you sure you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + return 1; + + flags = 0; + + printf("Zero the first block of all volume members? [Yes or No, default is No] "); + if (getYesNoAnswer(0) == 1) + flags |= MPI2_RAID_ACTION_ADATA_ZERO_LBA0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_DELETE_VOLUME; + req.VolDevHandle = set16(handle); + req.ActionDataWord.Word = set32(flags); + + printf("\nVolume %d is being deleted\n", volume); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nVolume delete operation failed!\n"); + return 0; + } + + RaidConfigPage0 = getConfigPageAlloc(port, MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG, 0, + MPI2_RAID_PGAD_FORM_CONFIGNUM + configNum, &length); + + if (RaidConfigPage0 == NULL) + { + return 1; + } + + if (RaidConfigPage0->NumVolumes > 0) + { + free(RaidConfigPage0); + return 1; + } + + for (i = 0; i < RaidConfigPage0->NumElements; i++) + { + flags = get16(RaidConfigPage0->ConfigElement[i].ElementFlags); + type = flags & MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE; + + if (type == MPI2_RAIDCONFIG0_EFLAGS_HOT_SPARE_ELEMENT) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_DELETE_HOT_SPARE; + req.PhysDiskNum = RaidConfigPage0->ConfigElement[i].PhysDiskNum; + + printf("\nHot Spare (PhysDisk %d) is being deleted\n", + RaidConfigPage0->ConfigElement[i].PhysDiskNum); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nHot Spare delete operation failed!\n"); + } + } + } + + free(RaidConfigPage0); + return 1; +} + + +int +doVolumeSettings2(MPT_PORT *port) +{ + Mpi2RaidVolPage0_t *RaidVolumePage0; + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int length; + int volume; + int handle; + int t1; + int t2; + int t; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + RaidVolumePage0 = getConfigPageAlloc(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + handle, + &length); + if (RaidVolumePage0 == NULL) + { + printf("Failed to read RaidVolumePage0!\n"); + return 0; + } + + t1 = get16(RaidVolumePage0->VolumeSettings.Settings); + t2 = RaidVolumePage0->VolumeSettings.HotSparePool; + printf(" Volume %d Settings: write caching %s, auto configure hot swap %s\n", volume, + t1 & MPI2_RAIDVOL0_SETTING_ENABLE_WRITE_CACHING ? "enabled" : + t1 & MPI2_RAIDVOL0_SETTING_DISABLE_WRITE_CACHING ? "disabled" : "controlled by members", + t1 & MPI2_RAIDVOL0_SETTING_AUTO_CONFIG_HSWAP_DISABLE ? "disabled" : "enabled"); + if (t2 != 0) + printf("Volume %d draws from Hot Spare Pools: %s%s%s%s%s%s%s%s\n", volume, + t2 & MPI2_RAID_HOT_SPARE_POOL_0 ? " 0" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_1 ? " 1" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_2 ? " 2" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_3 ? " 3" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_4 ? " 4" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_5 ? " 5" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_6 ? " 6" : "", + t2 & MPI2_RAID_HOT_SPARE_POOL_7 ? " 7" : ""); + printf("\n"); + + t = t1 & MPI2_RAIDVOL0_SETTING_MASK_WRITE_CACHING; + switch (t) + { + case MPI2_RAIDVOL0_SETTING_DISABLE_WRITE_CACHING: + t = 0; + break; + case MPI2_RAIDVOL0_SETTING_ENABLE_WRITE_CACHING: + t = 1; + break; + default: + case MPI2_RAIDVOL0_SETTING_UNCHANGED: + t = 2; + break; + } + printf("Write caching: [0=Disabled, 1=Enabled, 2=MemberControlled, default is %d] ", t); + t = getNumberAnswer(0, 2, t); + switch (t) + { + case 0: + t = MPI2_RAIDVOL0_SETTING_DISABLE_WRITE_CACHING; + break; + case 1: + t = MPI2_RAIDVOL0_SETTING_ENABLE_WRITE_CACHING; + break; + case 2: + t = MPI2_RAIDVOL0_SETTING_UNCHANGED; + break; + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_CHANGE_VOL_WRITE_CACHE; + req.VolDevHandle = set16(handle); + req.ActionDataWord.Word = set32(t); + + free(RaidVolumePage0); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doVolumeName2(MPT_PORT *port) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + Mpi2RaidVolPage1_t RaidVolumePage1; + int volume; + int handle; + char name[16]; + int n; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 1, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + handle, + &RaidVolumePage1, sizeof RaidVolumePage1) != 1) + return 0; + + printf("Enter a volume name: [0 to %d characters, current is \"%s\"] ", + (int)sizeof name - 1, RaidVolumePage1.Name); + + n = getStringFromArgs(name, sizeof name, stdin); + if (n == 0) + { + return 0; + } + if (n >= sizeof name) + { + printf("\nThe name is too long, current name not changed!\n"); + return 0; + } + + memset(name + n, '\0', sizeof name - n); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_SET_VOLUME_NAME; + req.VolDevHandle = set16(handle); + + printf("\nVolume %d's name is being changed...\n", volume); + + return doMptCommandCheck(port, &req, sizeof req - sizeof req.ActionDataSGE, &rep, sizeof rep, + NULL, 0, name, sizeof name, SHORT_TIME); +} + + +int +doVolumeIRCC2(MPT_PORT *port) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int volume; + int handle; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_START_RAID_FUNCTION; + req.VolDevHandle = set16(handle); + req.ActionDataWord.StartRaidFunction.RAIDFunction = MPI2_RAID_ACTION_START_CONSISTENCY_CHECK; + + printf("\nIRCC started on volume %d...\n", volume); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doVolumeStopIRCC2(MPT_PORT *port) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int volume; + int handle; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_STOP_RAID_FUNCTION; + req.VolDevHandle = set16(handle); + req.ActionDataWord.StopRaidFunction.RAIDFunction = MPI2_RAID_ACTION_STOP_CONSISTENCY_CHECK; + + printf("\nStopping IRCC on volume %d...\n", volume); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doVolumeOCE(MPT_PORT *port) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int volume; + int handle; + + if (selectVolume2(port, &volume, &handle) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_START_RAID_FUNCTION; + req.VolDevHandle = set16(handle); + req.ActionDataWord.StartRaidFunction.RAIDFunction = MPI2_RAID_ACTION_START_ONLINE_CAP_EXPANSION; + + printf("\nOCE is being performed on volume %d...\n", volume); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doDriveFirmwareUpdateMode2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6, int flag) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int physdisk; + int timeout; + int nd; + + /* get the current number of phys disks in the active config */ + getRaidCounts(port, TRUE, NULL, &nd, NULL); + + if (nd == 0) + { + printf("No active physical disks\n"); + return 1; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage6->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage6->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + printf("Timeout in seconds: [0-255 or RETURN to quit] "); + timeout = getNumberAnswer(0, 255, -1); + if (timeout < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_DEVICE_FW_UPDATE_MODE; + req.PhysDiskNum = physdisk; + req.ActionDataWord. + FwUpdateMode.Flags = flag; + req.ActionDataWord.FwUpdateMode. + DeviceFirmwareUpdateModeTimeout = timeout; + + printf("\nDrive Firmware Update Mode on PhysDisk %d is being %s\n", physdisk, flag ? "enabled" : "disabled"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doModifyPhysDisk2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6, int action, char *string) +{ + MpiRaidActionRequest_t req; + MpiRaidActionReply_t rep; + int physdisk; + int nd; + + /* get the current number of phys disks across all configs */ + getRaidCounts(port, FALSE, NULL, &nd, NULL); + + if (nd == 0) + { + printf("No active physical disks\n"); + return 1; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage6->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage6->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = action; + req.PhysDiskNum = physdisk; + + printf("\nPhysDisk %d is being %s\n", physdisk, string); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doCreateHotSpare2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int bus; + int target; + unsigned char inq[36]; + unsigned char cap[8]; + unsigned int size; + int i; + int n; + int t; + int handle; + int nd; + int ns; + + /* get the current number of phys disks and hot spares in the active config */ + getRaidCounts(port, TRUE, NULL, &nd, &ns); + + if (nd >= IOCPage6->MaxPhysDisks) + { + printf("Cannot create another active physical disk\n"); + return 0; + } + + if (ns >= IOCPage6->MaxGlobalHotSpares) + { + printf("Cannot create another hot spare\n"); + return 0; + } + + printf(" B___T___L Type Vendor Product Rev Disk Blocks Disk MB\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (isRaidVolume(port, bus, target)) + continue; + + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) != 0x00) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + if (doReadCapacity(port, bus, target, 0, cap, sizeof cap) != 1) + continue; + + size = get4bytes(cap, 0); + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + diag_targets[n].size = size; + + n++; + + printf("%2d. %2d %3d %3d %-9s %-8.8s %-16.16s %-4.4s %10d %7d\n", + n, bus, target, 0, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32, size + 1, (size + 1) / 2048); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n < 1) + { + printf("\nNo available targets found\n"); + return 1; + } + + printf("\nTo create a hot spare, select one of the available targets\n\n"); + + printf("Select a target: [1-%d or RETURN to quit] ", n); + i = getNumberAnswer(1, n, 0); + if (i == 0) + return 1; + i--; + + bus = diag_targets[i].bus; + target = diag_targets[i].target; + + if (!mapBusTargetToDevHandle(port, bus, target, &handle)) + { + printf("\nFailed to get DevHandle for Bus %d Target %d\n", bus, target); + return 0; + } + + printf("Hot Spare Pool: [0-7 or RETURN to quit] "); + t = getNumberAnswer(0, 7, -1); + if (t < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_CREATE_HOT_SPARE; + + req.ActionDataWord.HotSpare.HotSparePool = (U8)(1 << t); + req.ActionDataWord.HotSpare.DevHandle = set16(handle); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + printf("\nHot Spare was created\n"); + + return 1; +} + + +int +doDeleteHotSpare2(MPT_PORT *port, Mpi2IOCPage6_t *IOCPage6) +{ + Mpi2RaidActionRequest_t req; + Mpi2RaidActionReply_t rep; + int physdisk; + int ns; + + /* get the current number of hot spares across all configs */ + getRaidCounts(port, FALSE, NULL, NULL, &ns); + + if (ns == 0) + { + printf("No hot spares\n"); + return 0; + } + + printf("PhysDisk: [0-%d or RETURN to quit] ", IOCPage6->MaxPhysDisks - 1); + physdisk = getNumberAnswer(0, IOCPage6->MaxPhysDisks - 1, -1); + if (physdisk < 0) + return 1; + + if (getRaidConfig(port, MPI2_RAIDCONFIG0_EFLAGS_HOT_SPARE_ELEMENT, -1, physdisk, NULL) == 1) + { + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI2_FUNCTION_RAID_ACTION; + req.Action = MPI2_RAID_ACTION_DELETE_HOT_SPARE; + req.PhysDiskNum = physdisk; + + printf("\nHot Spare (PhysDisk %d) is being deleted\n", physdisk); + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + { + printf("\nHot Spare delete operation failed!\n"); + } + + return 1; + } + + printf("PhysDisk %d is not a valid hot spare!\n", physdisk); + return 0; +} + + +int +showHiddenDevices2(MPT_PORT *port) +{ + Mpi2RaidPhysDiskPage0_t RaidPhysDiskPage0; + int i; + int physdisk; + int nd; + int handle; + int bus; + int target; + char buf[32]; + + getRaidCounts(port, FALSE, NULL, &nd, NULL); + + if (nd) + { + printf("\nHidden RAID Devices:\n\n"); + + getDeviceInfoHeader(port, buf, sizeof buf); + + printf(" B___T Device Vendor Product Rev %s\n", buf); + + physdisk = 0xff; + for (i = 0; ; i++) + { + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, + MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM + physdisk, + &RaidPhysDiskPage0, sizeof RaidPhysDiskPage0) != 1) + break; + + physdisk = RaidPhysDiskPage0.PhysDiskNum; + handle = get16(RaidPhysDiskPage0.DevHandle); + + if (mapDevHandleToBusTarget(port, handle, &bus, &target)) + { + getDeviceInfo(port, bus, target, buf, sizeof buf); + + printf("%2d %3d PhysDisk %-4d %-8.8s %-16.16s %-4.4s %s\n", + bus, target, physdisk, + RaidPhysDiskPage0.InquiryData.VendorID, + RaidPhysDiskPage0.InquiryData.ProductID, + RaidPhysDiskPage0.InquiryData.ProductRevLevel, buf); + } + } + } + + return 1; +} + + +int +getRaidCounts(MPT_PORT *port, int activeOnly, int *numVolumes, int *numPhysDisks, int *numHotSpares) +{ + Mpi2RaidConfigurationPage0_t *RaidConfigPage0; + int length; + int i; + int address; + + if (numVolumes) + *numVolumes = 0; + if (numPhysDisks) + *numPhysDisks = 0; + if (numHotSpares) + *numHotSpares = 0; + + if (mpi2 && port->capabilities & MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) + { + i = 0xff; + while (TRUE) + { + if (activeOnly) + address = MPI2_RAID_PGAD_FORM_ACTIVE_CONFIG; + else + address = MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM + i; + + RaidConfigPage0 = getConfigPageAlloc(port, MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG, 0, + address, &length); + + if (RaidConfigPage0 == NULL) + break; + + i = RaidConfigPage0->ConfigNum; + + if (numVolumes) + *numVolumes += RaidConfigPage0->NumVolumes; + + if (numPhysDisks) + *numPhysDisks += RaidConfigPage0->NumPhysDisks; + + if (numHotSpares) + *numHotSpares += RaidConfigPage0->NumHotSpares; + + free(RaidConfigPage0); + + if (activeOnly) + break; + } + } + + return 1; +} + + +/* + * getRaidConfig - Look for a raid config that contains an element matching the inputs. + * + * Inputs: elementType (required) - A MPI2_RAIDCONFIG0_EFLAGS_* value used to match + * a devHandle or physDiskNum + * devHandle - If elementType is VOLUME_ELEMENT then this is matched + * against VolDevHandle. If elementType is any other value + * then elementType is matched against PhysDiskDevHandle. + * If this field is used then physDiskNum should be -1. + * physDiskNum - Valid for any elementType except VOLUME_ELEMENT, it is + * the value to match against PhysDiskNum in the ConfigElement + * list. If this field is used then devHandle should be -1. + * + * Outputs: RaidConfigPage0 (optional) - If not NULL then an allocated RaidConfigPage0 is returned + * which contains the matched input or NULL if no match found. + * + * Return: 1 if a match is found, 0 otherwise. + * + * Note: If both devHandle and physDiskNum are not -1 then devHandle will be used and physDiskNum ignored. +*/ +int +getRaidConfig(MPT_PORT *port, int elementType, int devHandle, int physDiskNum, Mpi2RaidConfigurationPage0_t **RaidConfigPage0) +{ + Mpi2RaidConfigurationPage0_t *rcp0; + int i; + int j; + int length; + int flags; + int currType; + int currDevHandle; + + if (devHandle == -1 && physDiskNum == -1) + { + if (RaidConfigPage0) + *RaidConfigPage0 = NULL; + return 0; + } + + if (mpi2 && port->capabilities & MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) + { + i = 0xff; + while (TRUE) + { + rcp0 = getConfigPageAlloc(port, MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG, 0, + MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM + i, &length); + if (rcp0 != NULL) + { + i = rcp0->ConfigNum; + + for (j = 0; j < rcp0->NumElements; j++) + { + flags = get16(rcp0->ConfigElement[j].ElementFlags); + currType = flags & MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE; + + if (devHandle != -1) + { + if (elementType == MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT) + currDevHandle = get16(rcp0->ConfigElement[j].VolDevHandle); + else + currDevHandle = get16(rcp0->ConfigElement[j].PhysDiskDevHandle); + + if (currType == elementType && currDevHandle == devHandle) + { + if (RaidConfigPage0) + *RaidConfigPage0 = rcp0; + + return 1; + } + } + else + { + if (currType != MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT && + currType == elementType && + physDiskNum == rcp0->ConfigElement[j].PhysDiskNum) + { + if (RaidConfigPage0) + *RaidConfigPage0 = rcp0; + + return 1; + } + } + } + } + else + break; + + free(rcp0); + } + } + + if (RaidConfigPage0) + *RaidConfigPage0 = NULL; + + return 0; +} + + +int +doResetBus(MPT_PORT *port) +{ +#if WIN32 + int status; + SRB_BUFFER srb; + int inLen; + int outLen; + DWORD retLen; + + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = ISSUE_BUS_RESET; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = RESET_TIME; + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + printf("Resetting bus...\n"); + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + return status; +#else + SCSITaskMgmt_t req; + SCSITaskMgmtReply_t rep; + int bus; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SCSI_TASK_MGMT; + req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS; + + printf("Resetting bus...\n"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, RESET_TIME); +#endif +} + + +int +doResetTarget(MPT_PORT *port) +{ + SCSITaskMgmt_t req; + SCSITaskMgmtReply_t rep; + int bus; + int target; + int lun; + int type; + + printf(" 1. Target Reset\n"); + printf(" 2. Logical Unit Reset\n"); + printf(" 3. Abort Task Set\n"); + printf(" 4. Clear Task Set\n"); + printf(" 5. Query Task\n"); + printf(" 6. Abort Task\n"); + printf("\nSelect a reset type: [1-6 or RETURN to quit] "); + type = getNumberAnswer(1, 6, 0); + if (type == 0) + return 1; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + if (type != 1) + { + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + } + else + { + lun = 0; + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SCSI_TASK_MGMT; + switch(type) + { + case 1: req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET; break; + case 2: req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET; break; + case 3: req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET; break; + case 4: req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET; break; + case 5: req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK; break; + case 6: req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK; break; + } + req.LUN[1] = lun; + + setName(port, bus, target, &req); + + if (type == 5) + printf("\nSending Query Task...\n"); + else if (type == 6) + printf("\nSending Abort Task...\n"); + else + printf("\nResetting target...\n"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, RESET_TIME); +} + + +int +doClearAca(MPT_PORT *port) +{ + SCSITaskMgmt_t req; + SCSITaskMgmtReply_t rep; + int bus; + int target; + int lun; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SCSI_TASK_MGMT; + req.TaskType = MPI_SCSITASKMGMT_TASKTYPE_CLR_ACA; + req.LUN[1] = lun; + + setName(port, bus, target, &req); + + printf("\nClearing ACA...\n"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doBeacon(MPT_PORT *port, int on_off) +{ + ToolboxBeaconRequest_t req; + ToolboxReply_t rep; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI_TOOLBOX_BEACON_TOOL; + req.ConnectNum = 0; + req.Flags = on_off ? MPI_TOOLBOX_FLAGS_BEACON_MODE_ON : MPI_TOOLBOX_FLAGS_BEACON_MODE_OFF; + + printf("Turning beacon %s...\n", on_off ? "on" : "off"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doDisplaySfpPages(MPT_PORT *port) +{ + ToolboxIstwiReadWriteRequest_t req; + ToolboxReply_t rep; + unsigned char buf[256]; + int i; + int j; + char c[16]; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI_TOOLBOX_ISTWI_READ_WRITE_TOOL; + req.Flags = MPI_TB_ISTWI_FLAGS_READ; + req.NumAddressBytes = 1; + req.DataLength = set16(sizeof buf); + + req.DeviceAddr = 0xa0; + + printf("Reading SFP Page 0 (ISTWI address A0)...\n"); + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf, sizeof buf, NULL, 0, SHORT_TIME) == 1) + { + printf("\n"); + for (i = 0, j = 0; i < sizeof buf; i++, j++) + { + if (j == 0) + printf("%04x : ", i); + + printf("%02x ", buf[i]); + + if (!isprint(buf[i])) + c[j] = ' '; + else + c[j] = buf[i]; + + if (j == sizeof c - 1) + { + printf(" "); + for (j = 0; j < sizeof c; j++) + { + printf("%c", c[j]); + } + printf("\n"); + j = -1; + } + if (i == 127) + break; // last part is unused (reserved) + } + } + + printf("\n"); + + req.DeviceAddr = 0xa2; + + printf("Reading SFP Page 1 (ISTWI address A2)...\n"); + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf, sizeof buf, NULL, 0, SHORT_TIME) == 1) + { + printf("\n"); + for (i = 0, j = 0; i < sizeof buf; i++, j++) + { + if (j == 0) + printf("%04x : ", i); + + printf("%02x ", buf[i]); + + if (!isprint(buf[i])) + c[j] = ' '; + else + c[j] = buf[i]; + + if (j == sizeof c - 1) + { + printf(" "); + for (j = 0; j < sizeof c; j++) + { + printf("%c", c[j]); + } + printf("\n"); + j = -1; + } + } + } + + return 1; +} + + +int +doClean(MPT_PORT *port) +{ + ToolboxCleanRequest_t req; + ToolboxReply_t rep; + int type; + int flags; + char name[256]; + FILE *file; + int n; + int t; + + while (TRUE) + { + printf(" 1. NVSRAM\n"); + printf(" 2. SEEPROM\n"); + printf(" 3. FLASH\n"); + printf(" 4. BootLoader\n"); + printf(" 5. Firmware (backup copy)\n"); + printf(" 6. Firmware (current copy)\n"); + printf(" 7. Persistent non-manufacturing config pages\n"); + printf(" 8. Persistent manufacturing config pages\n"); + printf(" 9. Boot services (BIOS/FCode)\n"); + printf("\nSelect what to erase: [1-9 or RETURN to quit] "); + type = getNumberAnswer(1, 9, 0); + if (type == 0) + return 1; + + switch(type) + { + case 1: flags = MPI_TOOLBOX_CLEAN_NVSRAM; break; + case 2: flags = MPI_TOOLBOX_CLEAN_SEEPROM; break; + case 3: flags = MPI_TOOLBOX_CLEAN_FLASH; break; + case 4: flags = MPI_TOOLBOX_CLEAN_BOOTLOADER; break; + case 5: flags = MPI_TOOLBOX_CLEAN_FW_BACKUP; break; + case 6: flags = MPI_TOOLBOX_CLEAN_FW_CURRENT; break; + case 7: flags = MPI_TOOLBOX_CLEAN_OTHER_PERSIST_PAGES; break; + case 8: flags = MPI_TOOLBOX_CLEAN_PERSIST_MANUFACT_PAGES; break; + case 9: flags = MPI_TOOLBOX_CLEAN_BOOT_SERVICES; break; + default: flags = 0; break; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC && + flags == MPI_TOOLBOX_CLEAN_SEEPROM) + { + ManufacturingPage0_t ManufacturingPage0; + ManufacturingPage3_t *ManufacturingPage3; + int length; + U32 *p; + U32 wwnn_l; + U32 wwnn_h; + U32 wwpn_l; + U32 wwpn_h; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, + &ManufacturingPage0, sizeof ManufacturingPage0) == 1) + { + printf("\n"); + printf("BoardName = %-16s\n", ManufacturingPage0.BoardName); + printf("BoardAssembly = %-16s\n", ManufacturingPage0.BoardAssembly); + printf("BoardTracerNumber = %-16s\n", ManufacturingPage0.BoardTracerNumber); + + ManufacturingPage3 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, &length); + if (ManufacturingPage3 != NULL) + { + p = (U32 *)ManufacturingPage3 + 2; + + wwnn_l = get32x(p[2]); + wwnn_h = get32x(p[3]); + wwpn_l = get32x(p[0]); + wwpn_h = get32x(p[1]); + + printf("FC WWNN = %08x%08x\n", wwnn_h, wwnn_l); + printf("FC WWPN = %08x%08x\n", wwpn_h, wwpn_l); + + if (numFileNames) + { + n = getFileName(name, sizeof name, stdin, "board identity", 0); + } + else + { + printf("\nEnter board identity filename, or RETURN for none: "); + n = getString(name, sizeof name, stdin); + } + if (n > 0) + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + } + else + { + fprintf(file, "BoardName = %-16s\n", ManufacturingPage0.BoardName); + fprintf(file, "BoardAssembly = %-16s\n", ManufacturingPage0.BoardAssembly); + fprintf(file, "BoardTracerNumber = %-16s\n", ManufacturingPage0.BoardTracerNumber); + fprintf(file, "FC WWNN = %08x%08x\n", wwnn_h, wwnn_l); + fprintf(file, "FC WWPN = %08x%08x\n", wwpn_h, wwpn_l); + fclose(file); + } + } + + free (ManufacturingPage3); + } + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS && + flags == MPI_TOOLBOX_CLEAN_PERSIST_MANUFACT_PAGES) + { + ManufacturingPage0_t ManufacturingPage0; + ManufacturingPage5_t *ManufacturingPage5; + Mpi2ManufacturingPage5_t *ManufacturingPage5_2; + U32 wwid_l; + U32 wwid_h; + int length; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, + &ManufacturingPage0, sizeof ManufacturingPage0) == 1) + { + printf("\n"); + printf("BoardName = %-16s\n", ManufacturingPage0.BoardName); + printf("BoardAssembly = %-16s\n", ManufacturingPage0.BoardAssembly); + printf("BoardTracerNumber = %-16s\n", ManufacturingPage0.BoardTracerNumber); + + ManufacturingPage5 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 5, 0, + &length); + if (ManufacturingPage5) + { + ManufacturingPage5_2 = (pMpi2ManufacturingPage5_t)ManufacturingPage5; + + if (mpi2) + { + wwid_l = get32(ManufacturingPage5_2->Phy[0].WWID.Low); + wwid_h = get32(ManufacturingPage5_2->Phy[0].WWID.High); + } + else + { + wwid_l = get32(ManufacturingPage5->BaseWWID.Low); + wwid_h = get32(ManufacturingPage5->BaseWWID.High); + } + + free (ManufacturingPage5); + + printf("SAS WWID = %08x%08x\n", wwid_h, wwid_l); + + if (numFileNames) + { + n = getFileName(name, sizeof name, stdin, "board identity", 0); + } + else + { + printf("\nEnter board identity filename, or RETURN for none: "); + n = getString(name, sizeof name, stdin); + } + if (n > 0) + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + } + else + { + fprintf(file, "BoardName = %-16s\n", ManufacturingPage0.BoardName); + fprintf(file, "BoardAssembly = %-16s\n", ManufacturingPage0.BoardAssembly); + fprintf(file, "BoardTracerNumber = %-16s\n", ManufacturingPage0.BoardTracerNumber); + fprintf(file, "SAS WWID = %08x%08x\n", wwid_h, wwid_l); + fclose(file); + } + } + } + } + } + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI_TOOLBOX_CLEAN_TOOL; + req.Flags = set32(flags); + + printf("\nErasing...\n"); + + t = doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, LONG_TIME); + + if (t != 1) + printf("\nErase failed\n"); + + if (wFlag) + fprintf(logFile, "%s: Erase (TOOLBOX CLEAN_TOOL) of type %d: %s\n", + logPrefix(port), type, t ? "PASS" : "FAIL"); + + printf("\n"); + } +} + + +int +doFcManagementTools(MPT_PORT *port) +{ + ToolboxFcManageRequest_t req; + ToolboxFcManageReply_t rep; + int type; + int bus; + int target; + int portid; + int index; + int flags; + int count; + int period; + int temp[4]; + int t; + + if (bringOnline(port) != 1) + return 0; + + while (TRUE) + { + printf(" 1. Discover all targets\n"); + printf(" 2. Discover one target by PortId\n"); + printf(" 3. Discover one target by Bus/Target\n"); + printf(" 4. Set maximum frame size\n"); + printf(" 5. Log out target by PortId\n"); + printf(" 6. Log out target by Bus/Target\n"); + printf(" 7. Set login parameters\n"); + printf(" 8. Get login parameters\n"); + t = 8; + if (virtInit == 0) + { + printf(" 9. Create a virtual port\n"); + printf("10. Delete a virtual port\n"); + t = 10; + } + printf("\nSelect a tool: [1-%d or RETURN to quit] ", t); + type = getNumberAnswer(1, t, 0); + if (type == 0) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI_TOOLBOX_FC_MANAGEMENT_TOOL; + req.AliasIndex = virtInit; + + switch(type) + { + case 1: + printf("\nDiscovering all targets...\n"); + req.Action = MPI_TB_FC_MANAGE_ACTION_DISC_ALL; + break; + + case 2: + printf("PortId: [000000-FFFFFF or RETURN to quit] "); + portid = getNumberAnswerHex(0x000000, 0xffffff, -1); + if (portid < 0) + return 1; + + printf("\nDiscovering PortId %06x...\n", portid); + req.Action = MPI_TB_FC_MANAGE_ACTION_DISC_PID; + req.ActionInfo.Port.PortIdentifier = set32(portid); + break; + + case 3: + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("\nDiscovering Bus %d Target %d...\n", bus, target); + req.Action = MPI_TB_FC_MANAGE_ACTION_DISC_BUS_TID; + req.ActionInfo.BusTid.Bus = bus; + req.ActionInfo.BusTid.TargetId = target; + break; + + case 4: + printf("Maximum frame size: [128-2048 or RETURN to quit] "); + t = getNumberAnswer(128, 2048, -1); + if (t < 0) + return 1; + + printf("\nSetting maximum frame size to %d...\n", t); + req.Action = MPI_TB_FC_MANAGE_ACTION_SET_MAX_FRAME_SIZE; + req.ActionInfo.FrameSize.FrameSize = set16(t); + break; + + case 5: + printf("PortId: [000000-FFFFFF or RETURN to quit] "); + portid = getNumberAnswerHex(0x000000, 0xffffff, -1); + if (portid < 0) + return 1; + + printf("Keep this target logged out? [Yes or No, default is No] "); + flags = getYesNoAnswer(0) == 1 ? MPI_TB_FC_MANAGE_FLAGS_KEEP_LOGGED_OUT : 0; + + printf("\nLogging out PortId %06x...\n", portid); + req.Action = MPI_TB_FC_MANAGE_ACTION_LOGOUT_PID; + req.ActionInfo.Port.PortIdentifier = set32(portid); + req.Flags = flags; + break; + + case 6: + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("Keep this target logged out? [Yes or No, default is No] "); + flags = getYesNoAnswer(0) == 1 ? MPI_TB_FC_MANAGE_FLAGS_KEEP_LOGGED_OUT : 0; + + printf("\nLogging out Bus %d Target %d...\n", bus, target); + req.Action = MPI_TB_FC_MANAGE_ACTION_LOGOUT_BUS_TID; + req.ActionInfo.BusTid.Bus = bus; + req.ActionInfo.BusTid.TargetId = target; + req.Flags = flags; + break; + + case 7: + printf("Number of PLOGI attempts: [1-255 or 0 for default or RETURN to quit] "); + count = getNumberAnswer(0, 255, -1); + if (count < 0) + return 1; + + printf("Seconds between PLOGI attempts: [1-255 or 0 for default or RETURN to quit] "); + period = getNumberAnswer(0, 255, -1); + if (period < 0) + return 1; + + printf("Maximum FLOGI burst: [1-255 or 0 for default or RETURN to quit] "); + temp[0] = getNumberAnswer(0, 255, -1); + if (temp[0] < 0) + return 1; + + printf("Percent of resources for FLOGI: [1-99 or 0 for default or RETURN to quit] "); + temp[1] = getNumberAnswer(0, 99, -1); + if (temp[1] < 0) + return 1; + + printf("Maximum PLOGI burst: [1-255 or 0 for default or RETURN to quit] "); + temp[2] = getNumberAnswer(0, 255, -1); + if (temp[2] < 0) + return 1; + + printf("Percent of resources for PLOGI: [1-99 or 0 for default or RETURN to quit] "); + temp[3] = getNumberAnswer(0, 99, -1); + if (temp[3] < 0) + return 1; + + printf("\nSetting login parameters...\n"); + req.Action = MPI_TB_FC_MANAGE_ACTION_SET_LOGIN_PARAMS; + req.ActionInfo.LoginParams.Count = count; + req.ActionInfo.LoginParams.Period = period; + req.ActionInfo.LoginParams.FlogiBurst = temp[0]; + req.ActionInfo.LoginParams.FlogiExchanges = temp[1]; + req.ActionInfo.LoginParams.PlogiBurst = temp[2]; + req.ActionInfo.LoginParams.PlogiExchanges = temp[3]; + break; + + case 8: + printf("\nGetting login parameters...\n"); + req.Action = MPI_TB_FC_MANAGE_ACTION_GET_LOGIN_PARAMS; + break; + + case 9: + printf("\nCreating VP...\n"); + req.Action = MPI_TB_FC_MANAGE_ACTION_CREATE_VP; + req.Flags = MPI_TB_FC_MANAGE_FLAGS_AUTO_RETRY; + break; + + case 10: + printf("VP to delete: [1-125 or RETURN to quit] "); + index = getNumberAnswer(1, 125, -1); + if (index < 0) + return 1; + + printf("\nDeleting VP %d...\n", index); + req.Action = MPI_TB_FC_MANAGE_ACTION_DELETE_VP; + req.AliasIndex = index; + break; + } + + if (doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, + NULL, 0, NULL, 0, LONG_TIME) != 1) + { + printf("FcManagment tool failed\n"); + } + else if (type == 8) + { + printf("\nNumber of PLOGI attempts: %d\n", + rep.ActionInfo.LoginParams.Count); + printf("Seconds between PLOGI attempts: %d\n", + rep.ActionInfo.LoginParams.Period); + printf("Maximum FLOGI burst: %d\n", + rep.ActionInfo.LoginParams.FlogiBurst); + printf("Percent of resources for FLOGI: %d\n", + rep.ActionInfo.LoginParams.FlogiExchanges); + printf("Maximum PLOGI burst: %d\n", + rep.ActionInfo.LoginParams.PlogiBurst); + printf("Percent of resources for PLOGI: %d\n", + rep.ActionInfo.LoginParams.PlogiExchanges); + } + else if (type == 9) + { + printf("\nVP %d created, PortId = %06x, WWNN = %08x%08x, WWPN = %08x%08x\n", + rep.AliasIndex, get32(rep.ActionInfo.CreateVp.PortIdentifier), + get32(rep.ActionInfo.CreateVp.WWNN.High), get32(rep.ActionInfo.CreateVp.WWNN.Low), + get32(rep.ActionInfo.CreateVp.WWPN.High), get32(rep.ActionInfo.CreateVp.WWPN.Low)); + } + + printf("\n"); + } +} + + +int +doRemoveSasDevice(MPT_PORT *port) +{ + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + int handle; + + printf("Enter the DevHandle to remove: [0000-FFFF or RETURN to quit] "); + handle = getNumberAnswerHex(0x0000, 0xffff, -1); + if (handle < 0) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + req.Operation = MPI_SAS_OP_REMOVE_DEVICE; + req.DevHandle = set16(handle); + + printf("\nRemoving SAS DevHandle %04x...\n", handle); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doDisplayLogEntries(MPT_PORT *port) +{ + LogPage0_t *LogPage0; + Mpi2LogPage0_t *LogPage0_2; + int length; + int i; + int j; + int k; + int n; + U32 *p; + int dataLen; + int decodeTime; + char timeString[64]; + time_t timestamp; + + decodeTime = FALSE; + if (mpi2 && gFlag == TRUE) + { + printf("\nDo you want to decode timestamps? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) == 1) + decodeTime = TRUE; + } + + LogPage0 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_LOG, 0, 0, &length); + if (LogPage0 == NULL) + return 0; + + LogPage0_2 = (pMpi2LogPage0_t)LogPage0; + + n = get16(LogPage0->NumLogEntries); + + printf("%d Log entr%s found\n", n, n == 1 ? "y" : "ies"); + + if (n) + { + printf("\n"); + if (mpi2) + { + dataLen = MPI2_LOG_0_LOG_DATA_LENGTH; + if (decodeTime) + printf("SeqN Type Time Data\n"); + else + printf("SeqN Type Time Data\n"); + } + else + { + dataLen = MPI_LOG_0_LOG_DATA_LENGTH; + printf("SeqN Type Time Data\n"); + } + + for (i = 0; i < n; i++) + { + if (mpi2) + { + p = (U32 *)LogPage0_2->LogEntry[i].LogData; + + if (decodeTime) + { + timestamp = (time_t)(((uint64_t)get64(LogPage0_2->LogEntry[i].TimeStamp)) / 1000); + strcpy(timeString, ctime(×tamp)); + timeString[strlen(timeString) - 1] = '\0'; + printf("%04x %04x [%s]", + get16(LogPage0_2->LogEntry[i].LogSequence), + get16(LogPage0_2->LogEntry[i].LogEntryQualifier), + timeString); + } + else + { + printf("%04x %04x %08x%08x", + get16(LogPage0_2->LogEntry[i].LogSequence), + get16(LogPage0_2->LogEntry[i].LogEntryQualifier), + get32(LogPage0_2->LogEntry[i].TimeStamp.High), + get32(LogPage0_2->LogEntry[i].TimeStamp.Low)); + } + } + else + { + p = (U32 *)LogPage0->LogEntry[i].LogData; + printf("%04x %04x %08x", + get16(LogPage0->LogEntry[i].LogSequence), + get16(LogPage0->LogEntry[i].LogEntryQualifier), + get32(LogPage0->LogEntry[i].TimeStamp)); + } + + for (k = dataLen / 4 - 1; k > 0; k--) + if (p[k] != 0) + break; + for (j = 0; j <= k; j++) + printf(" %08x", get32x(p[j])); + printf("\n"); + } + } + + free(LogPage0); + + return 0; +} + + +int +doClearLogEntries(MPT_PORT *port) +{ + LogPage0_t *LogPage0; + int length; + int n; + + LogPage0 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_LOG, 0, 0, &length); + if (LogPage0 == NULL) + return 0; + + n = get16(LogPage0->NumLogEntries); + + printf("%d Log entr%s found, will be cleared\n", n, n == 1 ? "y" : "ies"); + if (yesFlag == FALSE) + { + printf("\nAre you sure you want to continue? [Yes or No, default is Yes] "); + } + + if (yesFlag == TRUE || getYesNoAnswer(1) == 1) + { + LogPage0->NumLogEntries = 0; + + if (setConfigPage(port, MPI_CONFIG_EXTPAGETYPE_LOG, 0, 0, LogPage0, length) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + } + + free(LogPage0); + + return 0; +} + + +int +doSasForceFullDiscovery(MPT_PORT *port) +{ + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; + req.Operation = MPI_SAS_OP_FORCE_FULL_DISCOVERY; + + printf("Forcing full discovery...\n"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doFirmwareDownloadBoot(MPT_PORT *port) +{ +#if DOS || EFI + HANDLE adap = port->fileHandle; + HANDLE partner_adap = adap->partner_adap; + char name[256]; + int n; + + printf("A valid firmware image can be temporarily loaded into this chip...\n\n"); + + n = getFileName(name, sizeof name, stdin, "firmware", 99); + if (n > 0) + { + if (adap->fw_image != NULL) + { + free(adap->fw_image); + adap->fw_image = NULL; + adap->fw_image_size = 0; + if (partner_adap != NULL) + { + partner_adap->fw_image = NULL; + partner_adap->fw_image_size = 0; + } + } + + if (readFile(name, &adap->fw_image, &adap->fw_image_size) == 1) + { + adap->ioc_online = FALSE; + + if (partner_adap != NULL) + { + partner_adap->ioc_online = FALSE; + + partner_adap->fw_image = adap->fw_image; + } + + if (mpt_fwdownloadboot(adap) == 1) + { + printf("\nThe chip was made operational, remember that this is temporary!\n"); + } + else + { + printf("\nThe chip was not made operational with this firmware!\n"); + mpt_stop(adap, TRUE); + return 0; + } + } + } + else + { + printf("Image won't be download booted\n"); + return 1; + } +#endif + + return 1; +} + + +int +eventQuery(MPT_PORT *port, int *entries, int *types) +{ +#if WIN32 + int len; + int status; + MPI_EVENTS_SRB *srb; + int inLen; + int outLen; + DWORD retLen; + + if (mpi2) + len = sizeof *srb + (sizeof(U32) * 4); + else + len = sizeof *srb + sizeof(U32); + + srb = malloc(len); + + memset(srb, 0, len); + + srb->Sic.Length = len - sizeof srb->Sic; + srb->Sic.ControlCode = DRVR_INFO_IOCTL; + srb->Sic.HeaderLength = sizeof srb->Sic; + srb->Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb->Sic.Signature, "4.00 ", 8); + + srb->PageCode = EVENT_QUERY; + + inLen = len; + outLen = len; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + srb, inLen, srb, outLen, &retLen, NULL); + + if (status != 1) + { + free(srb); + return 0; + } + + *entries = srb->EventData[0]; + types[0] = srb->EventData[1]; + + if (mpi2) + { + types[1] = srb->EventData[2]; + types[2] = srb->EventData[3]; + types[3] = srb->EventData[4]; + } + + free(srb); +#endif +#if __linux__ + struct mpt2_ioctl_eventquery eventquery; + int status; + + memset(&eventquery, 0, sizeof eventquery); + + if (mpi2) + eventquery.hdr.max_data_size = sizeof (struct mpt2_ioctl_eventquery); + else + eventquery.hdr.max_data_size = sizeof (struct mpt_ioctl_eventquery); + + eventquery.hdr.ioc_number = port->portNumber; + + if (mpi2) + status = ioctl(port->fileHandle, MPT2EVENTQUERY, &eventquery); + else + status = ioctl(port->fileHandle, MPTEVENTQUERY, &eventquery); + + if (status != 0) + return 0; + + *entries = eventquery.event_entries; + types[0] = eventquery.event_types[0]; + + if (mpi2) + { + types[1] = eventquery.event_types[1]; + types[2] = eventquery.event_types[2]; + types[3] = eventquery.event_types[3]; + } +#endif +#if __sparc__ + int status; + mptsas_event_query_t eventquery; + + if (mpi2) + status = ioctl(port->fileHandle, MPTIOCTL_EVENT_QUERY, &eventquery); + else + status = ioctl(port->fileHandle, SYMIOCTL_EVENT_QUERY, &eventquery); + + if (status != 0) + return 0; + + if (mpi2) + { + *entries = eventquery.Entries; + types[0] = eventquery.Types[0]; + types[1] = eventquery.Types[1]; + types[2] = eventquery.Types[2]; + types[3] = eventquery.Types[3]; + } + else + { + /* Entries was a U32 (now a U16) in the gen1 data structure, so cast it here to + * avoid any endian problems + */ + *entries = *(U32 *)&(eventquery.Entries); + types[0] = eventquery.Types[0]; + } + +#endif + + return 1; +} + + +int +eventEnable(MPT_PORT *port, int *types) +{ +#if WIN32 + int len; + int status; + MPI_EVENTS_SRB *srb; + int inLen; + int outLen; + DWORD retLen; + + if (mpi2) + len = sizeof *srb + (sizeof(U32) * 3); + else + len = sizeof *srb; + + srb = malloc(len); + + memset(srb, 0, len); + + srb->Sic.Length = len - sizeof srb->Sic; + srb->Sic.ControlCode = DRVR_INFO_IOCTL; + srb->Sic.HeaderLength = sizeof srb->Sic; + srb->Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb->Sic.Signature, "4.00 ", 8); + + srb->PageCode = EVENT_ENABLE; + srb->EventData[0] = types[0]; + + if (mpi2) + { + srb->EventData[1] = types[1]; + srb->EventData[2] = types[2]; + srb->EventData[3] = types[3]; + } + + inLen = len; + outLen = len; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + srb, inLen, srb, outLen, &retLen, NULL); + + free(srb); + + if (status != 1) + return 0; +#endif +#if __linux__ + struct mpt2_ioctl_eventenable eventenable; + int status; + + memset(&eventenable, 0, sizeof eventenable); + + eventenable.event_types[0] = types[0]; + eventenable.hdr.ioc_number = port->portNumber; + + if (mpi2) + { + eventenable.event_types[1] = types[1]; + eventenable.event_types[2] = types[2]; + eventenable.event_types[3] = types[3]; + eventenable.hdr.max_data_size = sizeof (struct mpt2_ioctl_eventenable); + } + else + eventenable.hdr.max_data_size = sizeof (struct mpt_ioctl_eventenable); + + if (mpi2) + status = ioctl(port->fileHandle, MPT2EVENTENABLE, &eventenable); + else + status = ioctl(port->fileHandle, MPTEVENTENABLE, &eventenable); + + if (status != 0) + return 0; +#endif +#if __sparc__ + int status; + mptsas_event_enable_t eventenable; + + eventenable.Types[0] = types[0]; + + if (mpi2) + { + eventenable.Types[1] = types[1]; + eventenable.Types[2] = types[2]; + eventenable.Types[3] = types[3]; + status = ioctl(port->fileHandle, MPTIOCTL_EVENT_ENABLE, &eventenable); + } + else + status = ioctl(port->fileHandle, SYMIOCTL_EVENT_ENABLE, &eventenable); + + + if (status != 0) + return 0; +#endif + + + return 1; +} + + +int +eventReport(MPT_PORT *port, int entries, EVENT2 *events) +{ +#if WIN32 + int len; + int status; + MPI_EVENTS_SRB *srb; + int inLen; + int outLen; + DWORD retLen; + + len = sizeof *srb - sizeof srb->EventData + (mpi2 ? sizeof(EVENT2) : sizeof(EVENT)) * entries; + + srb = malloc(len); + + memset(srb, 0, len); + + srb->Sic.Length = len - sizeof srb->Sic; + srb->Sic.ControlCode = DRVR_INFO_IOCTL; + srb->Sic.HeaderLength = sizeof srb->Sic; + srb->Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb->Sic.Signature, "4.00 ", 8); + + srb->PageCode = GET_EVENTS; + + inLen = len; + outLen = len; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + srb, inLen, srb, outLen, &retLen, NULL); + + if (status != 1) + { + free(srb); + return 0; + } + + if (mpi2) + { + memcpy(events, srb->EventData, entries * sizeof *events); + } + else + { + EVENT *events1 = (EVENT *)srb->EventData; + int i; + + memset(events, 0, entries * sizeof *events); + for (i = 0; i < entries; i++) + { + memcpy(events + i, events1 + i, sizeof(EVENT)); + } + } + + free(srb); +#endif +#if __linux__ + struct mpt_ioctl_eventreport *eventreport; + int len; + int status; + + len = sizeof *eventreport - sizeof eventreport->eventData + (mpi2 ? sizeof(EVENT2) : sizeof(EVENT)) * entries; + + eventreport = (struct mpt_ioctl_eventreport *)malloc(len); + + memset(eventreport, 0, len); + + eventreport->hdr.maxDataSize = len; + eventreport->hdr.iocnum = port->portNumber; + + if (mpi2) + status = ioctl(port->fileHandle, MPT2EVENTREPORT, eventreport); + else + status = ioctl(port->fileHandle, MPTEVENTREPORT, eventreport); + + if (status != 0) + { + free(eventreport); + return 0; + } + + if (mpi2) + { + memcpy(events, eventreport->eventData, entries * sizeof *events); + } + else + { + EVENT *events1 = (EVENT *)eventreport->eventData; + int i; + + memset(events, 0, entries * sizeof *events); + for (i = 0; i < entries; i++) + { + memcpy(events + i, events1 + i, sizeof(EVENT)); + } + } + + free(eventreport); +#endif +#if __sparc__ + int len; + int status; + SYM_EVENT_REPORT *eventreport; + + len = sizeof *eventreport - sizeof eventreport->Events + (mpi2 ? sizeof(EVENT2) : sizeof(EVENT)) * entries; + + eventreport = malloc(len); + + memset(eventreport, 0, len); + + eventreport->Size = len; + + if (mpi2) + status = ioctl(port->fileHandle, MPTIOCTL_EVENT_REPORT, eventreport); + else + status = ioctl(port->fileHandle, SYMIOCTL_EVENT_REPORT, eventreport); + + if (status != 0) + return 0; + + if (mpi2) + { + memcpy(events, eventreport->Events, entries * sizeof *events); + } + else + { + EVENT *events1 = (EVENT *)eventreport->Events; + int i; + + memset(events, 0, entries * sizeof *events); + for (i = 0; i < entries; i++) + { + memcpy(events + i, events1 + i, sizeof(EVENT)); + } + } + + free(eventreport); +#endif + + return 1; +} + + +int +doDisplayCurrentEvents(MPT_PORT *port) +{ + int entries; + int types[4] = { 0, 0, 0, 0 }; + EVENT2 *events; + int i; + int j; + int k; + int l; + int n; + int t; + + if (eventQuery(port, &entries, types) != 1) + { + printf("Failed to query events!\n"); + return 0; + } + + if ( (types[0] != 0xffffffff) || + (mpi2 && ((types[1] != 0xffffffff) || + (types[2] != 0xffffffff) || + (types[3] != 0xffffffff))) ) + { + memset(types, 0xffffffff, sizeof(types)); + if (eventEnable(port, types) != 1) + { + printf("Failed to enable events!\n"); + return 0; + } + + if (eventQuery(port, &entries, types) != 1) + { + printf("Failed to query events!\n"); + return 0; + } + + if (entries < 1) + return 0; + + port->lastEvent = -1; + } + + events = malloc(entries * sizeof *events); + + memset(events, 0, sizeof *events); + + if (eventReport(port, entries, events) != 1) + return 0; + + for (j = 0; j < entries - 1; j++) + { + if (events[j].number > events[j+1].number) + { + j++; + break; + } + } + + printf("Sequence Event Event Data\n"); + for (i = 0; i < entries; i++) + { + k = (i + j) % entries; + if (events[k].type) + { + t = events[k].number; + + if (port->lastEvent < t) + { + for (n = 47; n >= 2; n--) + if (events[k].data[n] != 0) + break; + printf("%08x %2x ", events[k].number, events[k].type); + for (l = 0; l <= n; l++) + printf(" %08x", events[k].data[l]); + printf("\n"); + + port->lastEvent = t; + } + } + } + + return 1; +} + + +int +doDisplayTransferStatistics(MPT_PORT *port) +{ + ConfigReply_t rep; + FCPortPage6_t FCPortPage6; + int i; + + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &rep) != 1) + return 0; + + FCPortPage6.Header = rep.Header; + + printf("Port Name Tx Frames Rx Frames Tx MB Rx MB Total MB\n\n"); + + for (i = 0; i < 10; i++) + { + setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6); + + sleep(1); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6) == 1) + { +#if !EFIEBC + double time; + double tx_frames; + double rx_frames; + double tx_words; + double rx_words; + + time = (int64_t)get64(FCPortPage6.TimeSinceReset) / 1000000.; + + tx_frames = (int64_t)get64(FCPortPage6.TxFrames) / time; + rx_frames = (int64_t)get64(FCPortPage6.RxFrames) / time; + + tx_words = (int64_t)get64(FCPortPage6.TxWords) * 4. / time / 1000000.; + rx_words = (int64_t)get64(FCPortPage6.RxWords) * 4. / time / 1000000.; + + printf("%-16s %8.0f %8.0f %8.2f %8.2f %8.2f\n", + port->portName, tx_frames, rx_frames, tx_words, rx_words, tx_words + rx_words); +#endif + } + } + + return 1; +} + + +int +doDisplayTransferStatisticsAll(int numPorts, MPT_PORT *ports[], int interval, int duration) +{ + MPT_PORT *port; + ConfigReply_t rep; + FCPortPage6_t FCPortPage6; + int i; + int n; + int p; + + n = 0; + for (i = 0; i < numPorts; i++) + { + port = ports[i]; + if (port) + { + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPageHeader(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &rep) == 1) + n++; + else + { + printf("%s can't be monitored, failed to read FCPortPage6\n", port->portName); + ports[i] = NULL; + } + } + else + { + printf("%s can't be monitored, only FC ports implement performance counters\n", port->portName); + ports[i] = NULL; + } + } + } + if (n == 0) + { + printf("There are no eligible ports to monitor!\n"); + return 0; + } + + FCPortPage6.Header = rep.Header; + + p = 0; + + while (TRUE) + { + for (i = 0; i < numPorts; i++) + { + port = ports[i]; + if (port) + { + setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6); + } + } + + sleep(interval); + + if (p == 0) + printf("\nPort Name Tx Frames Rx Frames Tx MB Rx MB Total MB\n\n"); + if (n == 1) + { + p++; + if (p >= 10) + p = 0; + } + + for (i = 0; i < numPorts; i++) + { + port = ports[i]; + if (port) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, &FCPortPage6, sizeof FCPortPage6) == 1) + { +#if !EFIEBC + double time; + double tx_frames; + double rx_frames; + double tx_words; + double rx_words; + + time = (int64_t)get64(FCPortPage6.TimeSinceReset) / 1000000.; + + tx_frames = (int64_t)get64(FCPortPage6.TxFrames) / time; + rx_frames = (int64_t)get64(FCPortPage6.RxFrames) / time; + + tx_words = (int64_t)get64(FCPortPage6.TxWords) * 4. / time / 1000000.; + rx_words = (int64_t)get64(FCPortPage6.RxWords) * 4. / time / 1000000.; + + printf("%-16s %8.0f %8.0f %8.2f %8.2f %8.2f\n", + port->portName, tx_frames, rx_frames, tx_words, rx_words, tx_words + rx_words); +#endif + } + } + } + + if (duration) + { + duration -= interval; + if (duration <= 0) + break; + } + } + + return 1; +} + + +int +isRaidVolume(MPT_PORT *port, int bus, int target) +{ + IOCPage2_t *IOCPage2; + int length; + int i; + int ioc = port->iocNumber; + + if (mpi2) + return isRaidVolume2(port, bus, target); + + IOCPage2 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_IOC, 2, 0, &length); + if (IOCPage2 == NULL || IOCPage2->MaxVolumes == 0 || IOCPage2->NumActiveVolumes == 0) + { + if (IOCPage2) + free(IOCPage2); + return 0; + } + + for (i = 0; i < IOCPage2->NumActiveVolumes; i++) + { + if (bus == IOCPage2->RaidVolume[i].VolumeBus && + target == IOCPage2->RaidVolume[i].VolumeID && + ioc == IOCPage2->RaidVolume[i].VolumeIOC) + { + free(IOCPage2); + return 1; + } + } + + free(IOCPage2); + + return 0; +} + + +int +isRaidVolume2(MPT_PORT *port, int bus, int target) +{ + int handle; + + if (!mapBusTargetToDevHandle(port, bus, target, &handle)) + return 0; + + return getRaidConfig(port, MPI2_RAIDCONFIG0_EFLAGS_VOLUME_ELEMENT, handle, -1, NULL); +} + + +#if WIN32 || __linux__ || __sparc__ + + +#if __linux__ +void +convertBusTarget(MPT_PORT *port, int *bus, int *target, int lun) +{ + char pathName[PATH_MAX]; + char linkName[PATH_MAX]; + char pathName2[PATH_MAX]; + char linkName2[PATH_MAX]; + int n; + int n2; + int i; + int j; + DIR *dirp; + struct dirent *direntp = NULL; + FCDevicePage0_t FCDevicePage0; + SasDevicePage0_t SASDevicePage0; + FILE *filep; + char deviceName[64]; + char deviceName2[64]; + char *p; + int t1; + int t2; + int t3; + int t4; + char matchName[64]; + char *typeString; + char *nameString; + int b_t; + int dev_handle; + int address; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, + MPI_FC_DEVICE_PGAD_FORM_BUS_TID + (*bus << 8) + *target, + &FCDevicePage0, sizeof FCDevicePage0) != 1) + return; + + i = sprintf(deviceName, "0x%08x%08x\n", + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low)); + + j = sprintf(matchName, "target%d:", port->hostNumber); + + typeString = "fc_transport"; + nameString = "port_name"; + } + + else if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (mpi1 && *bus == 0 && lun == 0 && isRaidVolume(port, *bus, *target)) + { + *bus = 1; + + return; + } + + if (mpi2) + { + if (mapBusTargetToDevHandle(port, *bus, *target, &dev_handle) != 1) + dev_handle = 0; + address = MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle; + } + else + { + b_t = (*bus << 8) + *target; + address = (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <hostNumber); + + typeString = "sas_device"; + nameString = "sas_address"; + } + + else + return; + + sprintf(pathName, "/sys/class/%s/", typeString); + dirp = opendir(pathName); + while (dirp) + { + direntp = readdir(dirp); + if (!direntp) + break; + if (strncmp(direntp->d_name, matchName, j) == 0) + { + sprintf(pathName, + "/sys/class/%s/%s/%s", + typeString, direntp->d_name, nameString); + + filep = fopen(pathName, "r"); + if (filep) + { + p = fgets(deviceName2, sizeof deviceName2, filep); + fclose(filep); + + if (p) + { + if (memcmp(deviceName, deviceName2, i) == 0) + { + closedir(dirp); + + sprintf(pathName, + "/sys/class/%s/%s/device", + typeString, direntp->d_name); + + n = readlink(pathName, linkName, sizeof linkName); + if (n > 0) + { + dirp = opendir("/sys/class/scsi_device/"); + while (dirp) + { + direntp = readdir(dirp); + if (!direntp) + break; + + sprintf(pathName2, + "/sys/class/scsi_device/%s/device", + direntp->d_name); + + memset(linkName2, 0, sizeof linkName2); + n2 = readlink(pathName2, linkName2, sizeof linkName2); + if (n2 > 0) + { + if (memcmp(linkName, linkName2, n) == 0) + { +// printf("matched SCSI %s with MPT %d/%d/%d/%d\n", +// direntp->d_name, port->hostNumber, *bus, *target, lun); + + sscanf(direntp->d_name, "%d:%d:%d:%d", &t1, bus, target, &t2); + + closedir(dirp); + return; + } + } + } + + if (dirp) + closedir(dirp); + } + + dirp = opendir(pathName); + while (dirp) + { + direntp = readdir(dirp); + if (!direntp) + break; + n = sscanf(direntp->d_name, "%d:%d:%d:%d", &t1, &t2, &t3, &t4); + if (n == 4 && t1 == port->hostNumber) + { + *bus = t2; + *target = t3; + closedir(dirp); + return; + } + n = sscanf(direntp->d_name, "target%d:%d:%d", &t1, &t2, &t3); + if (n == 3 && t1 == port->hostNumber) + { + *bus = t2; + *target = t3; + closedir(dirp); + return; + } + } + if (dirp) + closedir(dirp); + + return; + } + } + } + } + } + + if (dirp) + closedir(dirp); +} +#endif + + +#if __sparc__ +void +cachePathLinks(char *prefix, char *suffix, NAME_LINK **cacheOut, int *countOut) +{ + char *p; + char *q; + int n; + int count; + int limit; + DIR *dirp; + struct dirent *direntp; + char pathName[PATH_MAX]; + char linkName[PATH_MAX]; + NAME_LINK *cache; + + limit = 0; + count = 0; + cache = NULL; + + dirp = opendir(prefix); + while (dirp) + { + direntp = readdir(dirp); + if (!direntp) + break; + strcpy(pathName, prefix); + strcat(pathName, direntp->d_name); + n = readlink(pathName, linkName, sizeof linkName); + if (n <= 0) + continue; + linkName[n] = '\0'; + p = strstr(linkName, "/devices"); + if (p) + { + p += 8; + q = strchr(p, ':'); + if (q) + { + if (strcmp(q, suffix) != 0) + continue; + *q = '\0'; + } + if (count == limit) + { + limit += 100; + cache = realloc(cache, limit * sizeof *cache); + } + strcpy(cache[count].name, direntp->d_name); + strcpy(cache[count].link, p); + count++; + } + } + if (dirp) + closedir(dirp); + + *cacheOut = cache; + *countOut = count; +} + + +int +findPathLink(MPT_PORT *port, char *prefix, NAME_LINK *cache, int count, char *path, char *buf) +{ + int i; + int n; + + n = 0; + buf[0] = '\0'; + + for (i = 0; i < count; i++) + { + if (strcmp(path, cache[i].link) == 0) + { + sprintf(buf, "%s%s", prefix, cache[i].name); + n++; + } + } + + return n; +} + + +int +getVhciName(char *phci_buf, char *addr_buf, char *vhci_buf) +{ + sv_iocdata_t ioc; + + bzero(&ioc, sizeof(sv_iocdata_t)); + ioc.phci = phci_buf; + ioc.addr = addr_buf; + ioc.client = vhci_buf; + vhci_buf[0] = '\0'; + + return scsi_vhci_fd >= 0 && ioctl(scsi_vhci_fd, SCSI_VHCI_GET_CLIENT_NAME, &ioc) == 0; +} + + +int +getPortPhyMap(MPT_PORT *port) +{ + Mpi2SasIOUnitPage0_t *SASIOUnitPage0; + int length; + int i; + int j; + + SASIOUnitPage0 = getConfigPageAlloc(port, MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, &length); + if (SASIOUnitPage0 == NULL) + return 0; + + memset(port->portPhyMap, 0, sizeof port->portPhyMap); + + for (i = 0; i < SASIOUnitPage0->NumPhys; i++) + { + if (SASIOUnitPage0->PhyData[i].AttachedDevHandle) + { + j = SASIOUnitPage0->PhyData[i].Port; + port->portPhyMap[j] |= (1 << i); + } + } + + return 0; +} +#endif + + +int +getOsDeviceName(MPT_PORT *port, int bus, int target, int lun, char *buf, int len, int type) +{ +#if WIN32 + char name[512]; + char *p; + int t; + char device[32]; + HANDLE handle; + DWORD retLen; + SCSI_ADDRESS scsiAddress; + + if (osDeviceState == NULL) + { + t = 4096; + do + { + t *= 2; + if (osDeviceState) + osDeviceState = realloc(osDeviceState, t); + else + osDeviceState = malloc(t); + + QueryDosDevice(NULL, osDeviceState, t); + + } while (GetLastError() == ERROR_INSUFFICIENT_BUFFER); + } + + for (p = osDeviceState; *p; p += (int)strlen(p) + 1) + { + if (strlen(p) == 2 && p[1] == ':' && p[0] >= 'C' && p[0] <= 'Z') + { + QueryDosDevice (p, name, sizeof name); + if (strncmp(name,"\\Device\\CdRom",13)) + { + continue; + } + } + + if (strncmp(p, "PhysicalDrive", 13) && strncmp(p, "TAPE", 4) && + strncmp(p, "Scanner", 7) && strncmp(p, "Changer", 7) ) + { + continue; + } + + sprintf(device, "\\\\.\\%s", p); + + handle = CreateFile(device, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + + if (handle == INVALID_HANDLE_VALUE && GetLastError() == ERROR_SHARING_VIOLATION) + { + handle = CreateFile(device, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + } + + if (handle == INVALID_HANDLE_VALUE) + { + continue; + } + + t = DeviceIoControl(handle, IOCTL_SCSI_GET_ADDRESS, NULL, 0, + &scsiAddress, sizeof scsiAddress, &retLen, NULL); + + CloseHandle(handle); + + if (t) + { + if (port->portNumber == scsiAddress.PortNumber && + bus == scsiAddress.PathId && + target == scsiAddress.TargetId && + lun == scsiAddress.Lun) + { + QueryDosDevice (p, name, sizeof name); + name[len - 21] = '\0'; + sprintf(buf, "%-18s %s", p, name); + + return 1; + } + } + } +#endif +#if __linux__ + char pathName[PATH_MAX]; + char linkName[PATH_MAX]; + int n; + char *c = NULL; + int i; + int fd; + int id[2]; + int match; + int fail; + DIR *dirp; + struct dirent *direntp = NULL; + + convertBusTarget(port, &bus, &target, lun); + + sprintf(pathName, + "/sys/class/scsi_device/%d:%d:%d:%d/device/", + port->hostNumber, bus, target, lun); + + dirp = opendir(pathName); + while (dirp) + { + direntp = readdir(dirp); + if (!direntp) + break; + if (strncmp(direntp->d_name, "block", 5) == 0) + break; + if (strncmp(direntp->d_name, "tape", 4) == 0) + break; + } + + if (direntp) + { + strcat(pathName, direntp->d_name); + + n = readlink(pathName, linkName, sizeof linkName); + if (n > 0) + { + linkName[n] = '\0'; + c = strrchr(linkName, '/'); + } + if (c) + { + sprintf(buf, "/dev%-8s[%d:%d:%d:%d]", + c, port->hostNumber, bus, target, lun); + return 1; + } + } + + if (dirp) + closedir(dirp); + + match = (port->hostNumber << 24) | (bus << 16) | (lun << 8) | target; + + fail = 0; + for (i = 0; i < 256; i++) + { + if (i < 26) + { + sprintf(pathName, "/dev/sd%c", 'a' + i); + } + else + { + sprintf(pathName, "/dev/sd%c%c", 'a' + ((i-26) / 26), 'a' + (i % 26)); + } + fd = open(pathName, O_RDONLY | O_NONBLOCK); + if (fd < 0) + { + if (fail++ > 32) + break; + else + continue; + } + fail = 0; + n = ioctl(fd, SCSI_IOCTL_GET_IDLUN, id); + close(fd); + if (n == 0) + { + if (match == id[0]) + { + sprintf(buf, "%-12s[%d:%d:%d:%d]", + pathName, port->hostNumber, bus, target, lun); + return 1; + } + } + } + + fail = 0; + for (i = 0; i < 32; i++) + { + sprintf(pathName, "/dev/sr%d", i); + fd = open(pathName, O_RDONLY | O_NONBLOCK); + if (fd < 0) + { + if (fail++ > 4) + break; + else + continue; + } + fail = 0; + n = ioctl(fd, SCSI_IOCTL_GET_IDLUN, id); + close(fd); + if (n == 0) + { + if (match == id[0]) + { + sprintf(buf, "%-12s[%d:%d:%d:%d]", + pathName, port->hostNumber, bus, target, lun); + return 1; + } + } + } + + fail = 0; + for (i = 0; i < 32; i++) + { + sprintf(pathName, "/dev/st%d", i); + fd = open(pathName, O_RDONLY | O_NONBLOCK); + if (fd < 0) + { + if (fail++ > 4) + break; + else + continue; + } + fail = 0; + n = ioctl(fd, SCSI_IOCTL_GET_IDLUN, id); + close(fd); + if (n == 0) + { + if (match == id[0]) + { + sprintf(buf, "%-12s[%d:%d:%d:%d]", + pathName, port->hostNumber, bus, target, lun); + return 1; + } + } + } +#endif +#if __sparc__ + FCDevicePage0_t FCDevicePage0; + int fd; + int n; + char path[PATH_MAX]; + char phci_buf[MAXNAMELEN]; + char addr_buf[MAXNAMELEN]; + char vhci_buf[MAXNAMELEN]; + U32 wwpn_l; + U32 wwpn_h; + char *name; + int b_t; + int dev_handle; + Mpi2RaidVolPage1_t RaidVolumePage1; + Mpi2SasDevicePage0_t SASDevicePage0; + unsigned char vpd[255]; + U32 wwid_l; + U32 wwid_h; + U32 map; + + if (device_caches_initialized == 0) + { + device_caches_initialized = 1; + + scsi_vhci_fd = open("/devices/scsi_vhci:devctl", O_RDWR); + + cachePathLinks("/dev/rdsk/", ":c,raw", &dev_rdsk_cache, &dev_rdsk_count); + + cachePathLinks("/dev/rmt/", ":", &dev_rmt_cache, &dev_rmt_count); + + cachePathLinks("/dev/es/", ":0", &dev_es_cache, &dev_es_count); + } + + if (strstr(port->portName, "fc") && + getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, + MPI_FC_DEVICE_PGAD_FORM_BUS_TID + mapOsToHwTarget(port, target), + &FCDevicePage0, sizeof FCDevicePage0) == 1) + { + wwpn_l = get32(FCDevicePage0.WWPN.Low); + wwpn_h = get32(FCDevicePage0.WWPN.High); + + sprintf(addr_buf, "w%08x%08x,%x", wwpn_h, wwpn_l, lun); + + if (type == 0 || type == 5 || type == 7 || type == 13) + { + if (getVhciName(port->pathName, addr_buf, vhci_buf) == 1) + { + sprintf(path, "%s", vhci_buf); + } + else + { + if (type == 13) + { + name = "ses"; + } + else + { +#if i386 + name = "disk"; +#else + name = "ssd"; +#endif + } + sprintf(path, "%s/%s@%s", port->pathName, name, addr_buf); + } + if (type == 13) + n = findPathLink(port, "/dev/es/", dev_es_cache, dev_es_count, path, buf); + else + n = findPathLink(port, "/dev/rdsk/", dev_rdsk_cache, dev_rdsk_count, path, buf); + if (n == 0) + { + if (strlen(vhci_buf)) + sprintf(buf, "/devices%s", vhci_buf); + return 0; + } + } + else if (type == 1) + { + sprintf(path, "%s/st@%s", port->pathName, addr_buf); + n = findPathLink(port, "/dev/rmt/", dev_rmt_cache, dev_rmt_count, path, buf); + return n > 0; + } + else + { + buf[0] = '\0'; + return 0; + } + } + else if (mpi2 && port->ioctlValue == MPTIOCTL_PASS_THRU) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + { + buf[0] = '\0'; + return 0; + } + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 1, + MPI2_RAID_VOLUME_PGAD_FORM_HANDLE + dev_handle, + &RaidVolumePage1, sizeof RaidVolumePage1) == 1) + { + wwid_l = get32(RaidVolumePage1.WWID.Low); + wwid_h = get32(RaidVolumePage1.WWID.High); + wwid_h &= 0x0fffffff; + wwid_h |= 0x30000000; + + sprintf(phci_buf, "%s/iport@v0", port->pathName); + sprintf(addr_buf, "w%08x%08x,%x", wwid_h, wwid_l, lun); + } + else if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, + MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle, + &SASDevicePage0, sizeof SASDevicePage0) == 1) + { + if (get32(SASDevicePage0.DeviceInfo) & MPI_SAS_DEVICE_INFO_SATA_DEVICE) + { + if (doInquiryVpdPage(port, bus, target, 0, 0x83, vpd, sizeof vpd) == 1 && + vpd[3] >= 12 && vpd[4] == 1 && vpd[5] == 3 && vpd[7] == 8) + { + wwid_h = get4bytes(vpd, 8); + wwid_l = get4bytes(vpd, 12); + } + else if (get16(SASDevicePage0.ParentDevHandle) >= port->numPhys) + { + wwid_l = get32(SASDevicePage0.SASAddress.Low); + wwid_h = get32(SASDevicePage0.SASAddress.High); + } + else + { + wwid_l = 0; + wwid_h = 0; + } + } + else + { + wwid_l = get32(SASDevicePage0.SASAddress.Low); + wwid_h = get32(SASDevicePage0.SASAddress.High); + } + + map = port->portPhyMap[SASDevicePage0.PhysicalPort]; + sprintf(phci_buf, "%s/iport@%x", port->pathName, map); + + if (wwid_l || wwid_h) + sprintf(addr_buf, "w%08x%08x,%x", wwid_h, wwid_l, lun); + else + sprintf(addr_buf, "p%x,%x", SASDevicePage0.PhyNum, lun); + } + else + { + buf[0] = '\0'; + return 0; + } + + if (getVhciName(phci_buf, addr_buf, vhci_buf) == 1) + { + sprintf(path, "%s", vhci_buf); + } + else + { + if (type == 13) + name = "enclosure"; + else + name = "disk"; + sprintf(path, "%s/%s@%s", phci_buf, name, addr_buf); + } + if (type == 13) + n = findPathLink(port, "/dev/es/", dev_es_cache, dev_es_count, path, buf); + else + n = findPathLink(port, "/dev/rdsk/", dev_rdsk_cache, dev_rdsk_count, path, buf); + if (n == 0) + { + if (strlen(vhci_buf)) + sprintf(buf, "/devices%s", vhci_buf); + return 0; + } + } + else + { + b_t = (bus << 8) + target; + + if (type == 0 || type == 5 || type == 7 || type == 13) + { + sprintf(addr_buf, "%x,%x", b_t, lun); + if (getVhciName(port->pathName, addr_buf, vhci_buf) == 1) + { + sprintf(path, "%s", vhci_buf); + } + else + { + if (type == 13) + { + name = "ses"; + } + else + { +#if i386 + name = "sd"; +#else + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + name = "ssd"; + else + name = "sd"; +#endif + } + sprintf(path, "%s/%s@%s", port->pathName, name, addr_buf); + } + if (type == 13) + n = findPathLink(port, "/dev/es/", dev_es_cache, dev_es_count, path, buf); + else + n = findPathLink(port, "/dev/rdsk/", dev_rdsk_cache, dev_rdsk_count, path, buf); + if (n == 0) + return 0; + } + else if (type == 1) + { + sprintf(path, "%s/st@%x,%x", port->pathName, b_t, lun); + n = findPathLink(port, "/dev/rmt/", dev_rmt_cache, dev_rmt_count, path, buf); + return n > 0; + } + else + { + buf[0] = '\0'; + return 0; + } + } + + fd = open(buf, O_RDONLY | O_NDELAY); + if (fd >= 0) + { + close(fd); + return 1; + } + else + { + strcat(buf, " (?)"); + return 1; + } +#endif + + buf[0] = '\0'; + + return 0; +} + + +int +doDisplayOsDeviceNames(MPT_PORT *port) +{ + int bus; + int target; + int lun; + int type; + unsigned char inq[36]; + char buf[80]; + int version; + int max_lun; + +#if WIN32 + if (strlen(port->driverName)) + printf("%s is %s\n\n", port->portName, port->driverName); +#endif +#if __linux__ + if (port->hostNumber >= 0) + printf("%s is SCSI host %d\n\n", port->portName, port->hostNumber); +#endif +#if __sparc__ + if (mpi2) + getPortPhyMap(port); + if (port->hostNumber >= 0) + printf("%s is /dev/cfg/c%d\n\n", port->portName, port->hostNumber); +#endif + + printf(" B___T___L Type Operating System Device Name\n"); + + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + max_lun = 1; + + for (lun = 0; lun < max_lun; lun++) + { + if (doInquiry(port, bus, target, lun, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + if (lun == 0) + break; + else + continue; + } + + if (lun == 0) + { + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + version = inq[2] & 0x07; + if (version > 1) + max_lun = 8; + if (version > 3) + max_lun = 64; + } + else + { + max_lun = port->maxLuns; + } + } + else + { + if ((inq[0] & 0x1f) == 0x1f) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + if ((inq[0] & 0x1f) == 0x0d) + continue; + } + + type = inq[0] & 0x1f; + + getOsDeviceName(port, bus, target, lun, buf, sizeof buf, type); + + printf("%2d %3d %3d %-9s %s\n", + bus, target, lun, deviceType[type], buf); + } + } + } + + return 1; +} + + +#endif + + +#if WIN32 || LINUX_DIAG || __sparc__ + + +int +diagBufferAction(MPT_PORT *port, int action, void *buf, int size) +{ +#if WIN32 + int status; + SRB_DIAG_BUFFER srb; + int inLen; + int outLen; + DWORD retLen; + + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Buf + size - sizeof srb.Sic; + srb.Sic.ControlCode = MPI_FW_DIAG_IOCTL; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = LONG_TIME; + srb.Sic.ReturnCode = MPI_FW_DIAG_NEW; + + memcpy((char *)&srb.Sic.Signature, "FwDiag ", 8); + + srb.DiagType = action; + memcpy(srb.Buf, buf, size); + + inLen = sizeof srb - sizeof srb.Buf + size; + outLen = sizeof srb - sizeof srb.Buf + size; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + if (mpi1 && srb.Sic.ReturnCode == 2) // old drivers can return this bogus value + diagReturnCode = 0; + else + diagReturnCode = srb.Sic.ReturnCode; + + if (status != 1 || diagReturnCode != 0) + return 0; + + memcpy(buf, srb.Buf, size); + + return 1; +#endif +#if __linux__ + IOCTL_DIAG_BUFFER diagbuffer; + int status; + int ioctl_code; + + if (mpi2) + return diagBufferAction2(port, action, buf, size); + + switch (action) + { + case MPI_FW_DIAG_TYPE_REGISTER: ioctl_code = MPTDIAGREGISTER; break; + case MPI_FW_DIAG_TYPE_UNREGISTER: ioctl_code = MPTDIAGUNREGISTER; break; + case MPI_FW_DIAG_TYPE_QUERY: ioctl_code = MPTDIAGQUERY; break; + case MPI_FW_DIAG_TYPE_READ_BUFFER: ioctl_code = MPTDIAGREADBUFFER; break; + case MPI_FW_DIAG_TYPE_RELEASE: ioctl_code = MPTDIAGRELEASE; break; + default: return 0; + } + + memset(&diagbuffer, 0, sizeof diagbuffer); + + diagbuffer.hdr.max_data_size = sizeof diagbuffer - sizeof diagbuffer.buf + size; + diagbuffer.hdr.ioc_number = port->portNumber; + + memcpy(diagbuffer.buf, buf, size); + + // mptctl bug, remember size for later workaround + if (action == MPI_FW_DIAG_TYPE_REGISTER) + { + MPI_FW_DIAG_REGISTER *diagRegister = (MPI_FW_DIAG_REGISTER *)diagbuffer.buf; + + port->diagBufferSizes[diagRegister->BufferType] = diagRegister->RequestedBufferSize; + } + if (action == MPI_FW_DIAG_TYPE_UNREGISTER) + { + MPI_FW_DIAG_UNREGISTER *diagUnregister = (MPI_FW_DIAG_UNREGISTER *)diagbuffer.buf; + + port->diagBufferSizes[diagUnregister->UniqueId & 0xff] = 0; + } + + // mptctl bug, poison field for later workaround + if (action == MPI_FW_DIAG_TYPE_QUERY) + { + MPI_FW_DIAG_QUERY *diagQuery = (MPI_FW_DIAG_QUERY *)diagbuffer.buf; + + diagQuery->DriverAddedBufferSize = 0x07071959; + + errno = 0; + } + + status = ioctl(port->fileHandle, ioctl_code, &diagbuffer); + + // mptctl bug, MPTDIAGQUERY returns EFAULT even in success! + if (status != 0 && errno == EFAULT && action == MPI_FW_DIAG_TYPE_QUERY) + { + MPI_FW_DIAG_QUERY *diagQuery = (MPI_FW_DIAG_QUERY *)diagbuffer.buf; + + if (diagQuery->DriverAddedBufferSize != 0x07071959) + { + status = 0; + errno = 0; + } + } + + if (status != 0) + { + return 0; + } + + // mptctl bug, MPTDIAGQUERY returns 0 for TotalBufferSize! + if (action == MPI_FW_DIAG_TYPE_QUERY) + { + MPI_FW_DIAG_QUERY *diagQuery = (MPI_FW_DIAG_QUERY *)diagbuffer.buf; + + if (diagQuery->TotalBufferSize == 0) + { + diagQuery->TotalBufferSize = port->diagBufferSizes[diagQuery->BufferType]; + } + } + + memcpy(buf, diagbuffer.buf, size); + + return 1; +#endif +#if __sparc__ + SYM_DIAG_ACTION diagAction; + int status; + + diagAction.Action = action; + diagAction.Length = size; + diagAction.PtrDiagAction = (UINT64)(UINT32)buf; + diagAction.ReturnCode = MPI_FW_DIAG_NEW; + + if (mpi2) + status = ioctl(port->fileHandle, MPTIOCTL_DIAG_ACTION, &diagAction); + else + status = ioctl(port->fileHandle, SYMIOCTL_DIAG_ACTION, &diagAction); + + diagReturnCode = diagAction.ReturnCode; + + return status == 0 && diagReturnCode == 0; +#endif +} + + +int +diagBufferAction2(MPT_PORT *port, int action, void *buf, int size) +{ +#if __linux__ + IOCTL_DIAG_BUFFER diagbuffer; + int status; + int ioctl_code; + + switch (action) + { + case MPI_FW_DIAG_TYPE_REGISTER: ioctl_code = MPT2DIAGREGISTER; break; + case MPI_FW_DIAG_TYPE_UNREGISTER: ioctl_code = MPT2DIAGUNREGISTER; break; + case MPI_FW_DIAG_TYPE_QUERY: ioctl_code = MPT2DIAGQUERY; break; + case MPI_FW_DIAG_TYPE_READ_BUFFER: ioctl_code = MPT2DIAGREADBUFFER; break; + case MPI_FW_DIAG_TYPE_RELEASE: ioctl_code = MPT2DIAGRELEASE; break; + default: return 0; + } + + memset(&diagbuffer, 0, sizeof diagbuffer); + + diagbuffer.hdr.max_data_size = sizeof diagbuffer - sizeof diagbuffer.buf + size; + diagbuffer.hdr.ioc_number = port->portNumber; + + memcpy(diagbuffer.buf, buf, size); + + status = ioctl(port->fileHandle, ioctl_code, &diagbuffer); + + if (status != 0) + { + return 0; + } + + memcpy(buf, diagbuffer.buf, size); + +#endif + + return 1; +} + + +int +diagBufferRegister(MPT_PORT *port, int type, int id, int size) +{ + MPI_FW_DIAG_REGISTER diagRegister; + + if (mpi2) + return diagBufferRegister2(port, type, id, size); + + memset(&diagRegister, 0, sizeof diagRegister); + + diagRegister.BufferType = type; + diagRegister.UniqueId = id; + diagRegister.RequestedBufferSize = size; + + printf("\nUse default settings? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) != 1) + { + printf("Buffer posting options (ProductSpecific[0]): [00000000-FFFFFFFF, default is 00000000] "); + if (getHexNumberAnswer(&diagRegister.ProductSpecific[0]) == 0) + diagRegister.ProductSpecific[0] = 0x00000000; + printf("IOP Debug Mask (ProductSpecific[1]): [00000000-FFFFFFFF, default is FFFFEFFF] "); + if (getHexNumberAnswer(&diagRegister.ProductSpecific[1]) == 0) + diagRegister.ProductSpecific[1] = 0xFFFFEFFF; + printf("PL debug mask (ProductSpecific[2]): [00000000-FFFFFFFF, default is FFF3FFFF] "); + if (getHexNumberAnswer(&diagRegister.ProductSpecific[2]) == 0) + diagRegister.ProductSpecific[2] = 0xFFF3FFFF; + printf("IR debug mask (ProductSpecific[3]): [00000000-FFFFFFFF, default is FFFFFFFF] "); + if (getHexNumberAnswer(&diagRegister.ProductSpecific[3]) == 0) + diagRegister.ProductSpecific[3] = 0xFFFFFFFF; + } + + return diagBufferAction(port, MPI_FW_DIAG_TYPE_REGISTER, &diagRegister, sizeof diagRegister); +} + + +/* diag buffer register routine for gen2 */ +int +diagBufferRegister2(MPT_PORT *port, int type, int id, int size) +{ + MPI2_FW_DIAG_REGISTER diagRegister; + + memset(&diagRegister, 0, sizeof diagRegister); + + diagRegister.BufferType = type; + diagRegister.UniqueId = id; + diagRegister.RequestedBufferSize = size; + + printf("\nUse default settings? [Yes or No, default is Yes] "); + if (getYesNoAnswer(1) != 1) + { + printf("Buffer Posting Options (ProductSpecific[0]): [00000000-FFFFFFFF, default is 00000000] "); + if (getHexNumberAnswer(&diagRegister.ProductSpecific[0]) == 0) + diagRegister.ProductSpecific[0] = 0x00000000; + printf("IOP Debug Mask (ProductSpecific[2:1]): [16 hex digits (no dashes), default is FFFFCFFF-FFFFFFFF] "); + if (getHexDoubleNumberAnswer(&diagRegister.ProductSpecific[2], &diagRegister.ProductSpecific[1]) == 0) + { + diagRegister.ProductSpecific[1] = 0xFFFFFFFF; + diagRegister.ProductSpecific[2] = 0xFFFFCFFF; + } + printf("PL Debug Mask (ProductSpecific[4:3]): [16 hex digits (no dashes), default is FFFFEFFF-EFFFFFFF] "); + if (getHexDoubleNumberAnswer(&diagRegister.ProductSpecific[4], &diagRegister.ProductSpecific[3]) == 0) + { + diagRegister.ProductSpecific[3] = 0xEFFFFFFF; + diagRegister.ProductSpecific[4] = 0xFFFFEFFF; + } + printf("IR Debug Mask (ProductSpecific[6:5]): [16 hex digits (no dashes), default is FFFFEFFF-FFFFFFFF] "); + if (getHexDoubleNumberAnswer(&diagRegister.ProductSpecific[6], &diagRegister.ProductSpecific[5]) == 0) + { + diagRegister.ProductSpecific[5] = 0xFFFFFFFF; + diagRegister.ProductSpecific[6] = 0xFFFFEFFF; + } + } + + return diagBufferAction(port, MPI_FW_DIAG_TYPE_REGISTER, &diagRegister, sizeof diagRegister); +} + + +int +diagBufferUnregister(MPT_PORT *port, int id) +{ + MPI_FW_DIAG_UNREGISTER diagUnregister; + + memset(&diagUnregister, 0, sizeof diagUnregister); + + diagUnregister.UniqueId = id; + + return diagBufferAction(port, MPI_FW_DIAG_TYPE_UNREGISTER, &diagUnregister, sizeof diagUnregister); +} + + +/* diag buffer query routine for gen1 */ +int +diagBufferQuery(MPT_PORT *port, int type, int id, int *flags, int *size) +{ + MPI_FW_DIAG_QUERY diagQuery; + + if (mpi2) + return diagBufferQuery2(port, type, id, flags, size); + + memset(&diagQuery, 0, sizeof diagQuery); + + diagQuery.BufferType = type; + diagQuery.UniqueId = id; + + if (diagBufferAction(port, MPI_FW_DIAG_TYPE_QUERY, &diagQuery, sizeof diagQuery) != 1) + return 0; + + *flags = diagQuery.Flags; + *size = diagQuery.TotalBufferSize; + + return 1; +} + + +/* diag buffer query routine for gen2 */ +int +diagBufferQuery2(MPT_PORT *port, int type, int id, int *flags, int *size) +{ + MPI2_FW_DIAG_QUERY diagQuery; + + memset(&diagQuery, 0, sizeof diagQuery); + + diagQuery.BufferType = type; + diagQuery.UniqueId = id; + + if (diagBufferAction(port, MPI_FW_DIAG_TYPE_QUERY, &diagQuery, sizeof diagQuery) != 1) + return 0; + + *flags = diagQuery.AppFlags; + *size = diagQuery.TotalBufferSize; + + return 1; +} + + +int +diagBufferReadBuffer(MPT_PORT *port, int id, char *name, int file, int *sizeIn, int header) +{ + MPI_FW_DIAG_READ_BUFFER *diagReadBuffer; + DIAG_BUFFER_START *diagBufferStart; + DIAG_HEADER_FIRM_IDENTIFICATION diagHeaderFirm; + DIAG_HEADER_HOST_IDENTIFICATION diagHeaderHost; + int size = *sizeIn; + int offset = 0; + int length; + int t; + int actual; + + t = sizeof *diagReadBuffer - sizeof diagReadBuffer->DataBuffer + 32768; + diagReadBuffer = malloc(t); + + memset(diagReadBuffer, 0, t); + + diagReadBuffer->UniqueId = id; + + while (size) + { + length = min(size, 32768); + + diagReadBuffer->StartingOffset = offset; + diagReadBuffer->BytesToRead = length; + + t = sizeof *diagReadBuffer - sizeof diagReadBuffer->DataBuffer + length; + if (diagBufferAction(port, MPI_FW_DIAG_TYPE_READ_BUFFER, diagReadBuffer, t) != 1) + { + free(diagReadBuffer); + return 0; + } + + if (offset == 0) + { + diagBufferStart = (DIAG_BUFFER_START *)diagReadBuffer->DataBuffer; + if ((get32(diagBufferStart->DiagVersion) == 0x00000000 || + get32(diagBufferStart->DiagVersion) == 0x01000000) && + get32(diagBufferStart->Reserved3) == 0x4742444c) + { + if (diagBufferStart->BufferType == 0) + printf("Current trace pointer = %x\n", get32x(((U32 *)(diagBufferStart + 1))[3])); + + actual = get32(diagBufferStart->Size); + + if (size > actual) + { + size = actual; + *sizeIn = actual; + } + + if (length > actual) + length = actual; + + if (header) + { + memset(&diagHeaderFirm, 0, sizeof diagHeaderFirm); + diagHeaderFirm.Size = set32(sizeof diagHeaderFirm); + diagHeaderFirm.Type = set16(1); + diagHeaderFirm.Version = 1; +// diagHeaderFirm.CapabilitiesFlags = set32(port->capabilities); + diagHeaderFirm.FWVersion = set32(port->fwVersion); + diagHeaderFirm.ProductId = set16(port->productId); + + memset(&diagHeaderHost, 0, sizeof diagHeaderHost); + diagHeaderHost.Size = set32(sizeof diagHeaderHost); + diagHeaderHost.Type = set16(2); + diagHeaderHost.Version = 1; + + t = write(file, diagBufferStart, sizeof *diagBufferStart); + t += write(file, &diagHeaderFirm, sizeof diagHeaderFirm); + t += write(file, &diagHeaderHost, sizeof diagHeaderHost); + t += write(file, diagBufferStart + 1, length - sizeof *diagBufferStart); + if (t != length + (int)sizeof diagHeaderFirm + (int)sizeof diagHeaderHost) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + free(diagReadBuffer); + return 0; + } + + *sizeIn += sizeof diagHeaderFirm + sizeof diagHeaderHost; + + size -= length; + offset += length; + continue; + } + } + } + + t = write(file, diagReadBuffer->DataBuffer, length); + if (t != length) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + free(diagReadBuffer); + return 0; + } + + size -= length; + offset += length; + } + + free(diagReadBuffer); + + return 1; +} + + +int +diagBufferRelease(MPT_PORT *port, int type, int id) +{ + MPI_FW_DIAG_RELEASE diagRelease; + + memset(&diagRelease, 0, sizeof diagRelease); + + diagRelease.UniqueId = id; + + return diagBufferAction(port, MPI_FW_DIAG_TYPE_RELEASE, &diagRelease, sizeof diagRelease); +} + + +int +doDiagBuffer(MPT_PORT *port) +{ + int type; + int id; + int action; + int flags; + int size; + char name[256]; + int file; + int n; + int header = 0; + char *string; + + printf("Buffer type: [0=Trace, 1=Snapshot, or RETURN to quit] "); + type = getNumberAnswer(0, 1, -1); + if (type < 0) + return 1; + + switch (type) + { + case 0: type = MPI_DIAG_BUF_TYPE_TRACE; string = "trace"; break; + case 1: type = MPI_DIAG_BUF_TYPE_SNAPSHOT; string = "snapsot"; break; + default: return 0; + } + + id = 0x07075900 + type; + + printf("\nNOTE: the expected sequence is Register, Release, Read Buffer, Unregister\n"); + while (TRUE) + { + printf("\n"); + printf(" 1. Register\n"); + printf(" 2. Query\n"); + printf(" 3. Read Buffer\n"); + printf(" 4. Release\n"); + printf(" 5. Unregister\n"); + printf("\nSelect an action: [1-5 or RETURN to quit] "); + action = getNumberAnswer(1, 5, 0); + if (action == 0) + return 1; + + switch (action) + { + case 1: + if (type == MPI_DIAG_BUF_TYPE_TRACE) + size = 128; + else + size = 5*1024; + printf("\nRequested size in KB: [8 to 8192, default is %d] ", size); + size = getNumberAnswer(8, 8192, size) * 1024; + if (type == MPI_DIAG_BUF_TYPE_TRACE) + size += 64; + + printf("\nRegistering...\n"); + + if (diagBufferRegister(port, type, id, size) != 1) + { + printf("Register failed!\n"); + switch (diagReturnCode) + { + case MPI_FW_DIAG_ERROR_INVALID_UID: + printf("\nA %s buffer is already registered\n", string); + break; + case MPI_FW_DIAG_ERROR_NO_BUFFER: +#if WIN32 + printf("\nDriver support for a %s buffer is not enabled\n", string); +#else + printf("\nA %s buffer could not be allocated due to insufficient memory\n", string); +#endif + break; + case MPI_FW_DIAG_ERROR_POST_FAILED: + printf("\nThe %s buffer could not be posted\n", string); + break; + } + break; + } + + if (diagBufferQuery(port, type, id, &flags, &size) != 1) + { + printf("Query failed\n"); + break; + } + + printf("\nActual size is %d KB (0x%x bytes)\n", size / 1024, size); + break; + + case 2: + printf("\nQuerying...\n"); + + if (diagBufferQuery(port, type, id, &flags, &size) != 1) + { + if (diagReturnCode == MPI_FW_DIAG_ERROR_INVALID_UID) + printf("\nNo %s buffer is currently registered\n", string); + else + printf("Query failed\n"); + break; + } + + printf("\nA %d KB %s buffer is currently registered\n", size / 1024, string); + if (flags & MPI_FW_DIAG_FLAG_APP_OWNED) + printf(" buffer was registered by an application\n"); + if (flags & MPI_FW_DIAG_FLAG_BUFFER_VALID) + printf(" buffer contains valid data\n"); + if (flags & MPI_FW_DIAG_FLAG_FW_BUFFER_ACCESS) + printf(" buffer is being accessed by firmware\n"); + break; + + case 3: + if (diagBufferQuery(port, type, id, &flags, &size) != 1) + { + if (diagReturnCode == MPI_FW_DIAG_ERROR_INVALID_UID) + printf("\nNo %s buffer is currently registered\n", string); + else + printf("Query failed\n"); + break; + } + + if (!(flags & MPI_FW_DIAG_FLAG_BUFFER_VALID)) + { + printf("The %s buffer does not contain valid data\n", string); + break; + } + + n = getFileName(name, sizeof name, stdin, "trace", 0); + if (n > 0) + { + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + break; + } + } + else + { + printf("Read Buffer will not be done\n"); + break; + } + + if (gFlag == TRUE) + { + printf("Add tool header? [Yes or No, default is No] "); + header = getYesNoAnswer(0); + } + + printf("\nReading Buffer...\n"); + + if (diagBufferReadBuffer(port, id, name, file, &size, header) != 1) + printf("Read Buffer failed\n"); + else + printf("\nWrote %d bytes to file %s\n", size, name); + + close(file); + break; + + case 4: + printf("\nReleasing...\n"); + + if (diagBufferRelease(port, type, id) != 1) + { + printf("Release failed!\n"); + switch (diagReturnCode) + { + case MPI_FW_DIAG_ERROR_INVALID_UID: + printf("\nNo %s buffer is currently registered\n", string); + break; + case MPI_FW_DIAG_ERROR_ALREADY_RELEASED: + printf("\nThe %s buffer is already released\n", string); + break; + case MPI_FW_DIAG_ERROR_RELEASE_FAILED: + printf("\nThe %s buffer could not be released\n", string); + break; + } + } + break; + + case 5: + printf("\nUnregistering...\n"); + + if (diagBufferUnregister(port, id) != 1) + { + printf("Unregister failed\n"); + switch (diagReturnCode) + { + case MPI_FW_DIAG_ERROR_INVALID_UID: + printf("\nNo %s buffer is currently registered\n", string); + break; + case MPI_FW_DIAG_ERROR_RELEASE_FAILED: + printf("\nThe %s buffer could not be released\n", string); + break; + } + } + break; + + } + } + + return 1; +} + + +#endif + + +int +doFlashUpload(MPT_PORT *port) +{ + char name[256]; + int file; + unsigned char *imageBuf = NULL; + int imageLen; + int actualImageLen; + int offset; + int type; + int n; + int t; + + printf(" 1. Firmware\n"); + printf(" 2. BIOS/FCode\n"); + printf(" 3. BootLoader\n"); + printf(" 4. Firmware (backup copy)\n"); + printf(" 5. Complete (all sections)\n"); + t = 5; + if (port->deviceId == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + printf(" 6. MegaRAID\n"); + t = 6; + } + printf("\nSelect what to upload: [1-%d or RETURN to quit] ", t); + type = getNumberAnswer(1, t, 0); + if (type == 0) + return 1; + + switch(type) + { + case 1: type = MPI_FW_UPLOAD_ITYPE_FW_FLASH; break; + case 2: type = MPI_FW_UPLOAD_ITYPE_BIOS_FLASH; break; + case 3: type = MPI_FW_UPLOAD_ITYPE_BOOTLOADER; break; + case 4: type = MPI_FW_UPLOAD_ITYPE_FW_BACKUP; break; + case 5: type = MPI_FW_UPLOAD_ITYPE_COMPLETE; break; + case 6: type = MPI_FW_UPLOAD_ITYPE_MEGARAID; break; + default: type = 0; break; + } + + printf("\n"); + + n = getFileName(name, sizeof name, stdin, "FLASH section", 0); + if (n > 0) + { + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + printf("Image won't be uploaded\n"); + return 1; + } + + imageLen = 0x10000; + imageBuf = (unsigned char *)malloc(imageLen); + + printf("\nUploading image...\n"); + + offset = 0; + while (TRUE) + { + if (doFwUpload(port, type, imageBuf, imageLen, offset, &actualImageLen) != 1) + break; + + if (offset + imageLen > actualImageLen) + imageLen = actualImageLen - offset; + + t = write(file, imageBuf, imageLen); + if (t != imageLen) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + break; + } + + offset += imageLen; + if (offset >= actualImageLen) + break; + } + + printf("\nWrote %d bytes to file %s\n", offset, name); + + close(file); + + free(imageBuf); + + return 1; +} + + +int +doDisplayVersionInfo(MPT_PORT *port) +{ + Mpi2IOUnitPage0_t IOUnitPage0; + SasIOUnitPage0_t SASIOUnitPage0; + ManufacturingPage0_t ManufacturingPage0; +#if WIN32 + int status; + DRVR_INFO_SRB srb; + int inLen; + int outLen; + DWORD retLen; +#endif +#if __linux__ + int status; + struct mpt_ioctl_iocinfo iocinfo; + char *c; +#endif +#if __sparc__ + SYMHI_DMI_DATA dmiData; + mptsas_adapter_data_t adapterData; +#endif + int i; + +#if WIN32 + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = DRVR_INFO_IOCTL; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb.Sic.Signature, "4.00 ", 8); + + srb.PageCode = ADAPTER_INFO_PAGE; + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + if (status == 1) + { + if (strlen(port->driverName)) + printf("%s is %s, Version %s\n\n", port->portName, + port->driverName, srb.AdapterPageOut.DriverVersion); + } +#endif +#if __linux__ + memset(&iocinfo, 0, sizeof iocinfo); + + iocinfo.hdr.maxDataSize = sizeof iocinfo; + + iocinfo.hdr.iocnum = port->portNumber; + + if (mpi2) + status = ioctl(port->fileHandle, MPT2IOCINFO, &iocinfo); + else + status = ioctl(port->fileHandle, MPTIOCINFO, &iocinfo); + + if (status == 0) + { + c = iocinfo.driverVersion; + if (c[0] == '@' && c[1] == '(' && c[2] == '#' && c[3] == ')') + c += 4; + + if (port->hostNumber >= 0) + printf("%s is SCSI host %d, Driver is %s\n\n", + port->portName, port->hostNumber, c); + else + printf("%s, Driver is %s\n\n", + port->portName, c); + } +#endif +#if __sparc__ + + if (mpi2) + { + memset(&adapterData, 0, sizeof adapterData); + adapterData.StructureLength = sizeof adapterData; + + if (ioctl(port->fileHandle, MPTIOCTL_GET_ADAPTER_DATA, &adapterData) == 0 && + strlen(adapterData.DriverVersion) != 0) + { + if (port->hostNumber >= 0) + printf("%s is /dev/cfg/c%d, Driver is %s\n\n", + port->portName, port->hostNumber, adapterData.DriverVersion); + else + printf("%s, Driver is %s\n\n", + port->portName, adapterData.DriverVersion); + } + else + { + if (port->hostNumber >= 0) + printf("%s is /dev/cfg/c%d\n\n", + port->portName, port->hostNumber); + } + } + else + { + memset(&dmiData, 0, sizeof dmiData); + dmiData.StructureLength = sizeof dmiData; + + if (ioctl(port->fileHandle, SYMIOCTL_GET_DMI_DATA, &dmiData) == 0 && + strlen(dmiData.DriverVersion) != 0) + { + if (port->hostNumber >= 0) + printf("%s is /dev/cfg/c%d, Driver is %s\n\n", + port->portName, port->hostNumber, dmiData.DriverVersion); + else + printf("%s, Driver is %s\n\n", + port->portName, dmiData.DriverVersion); + } + else + { + if (port->hostNumber >= 0) + printf("%s is /dev/cfg/c%d\n\n", + port->portName, port->hostNumber); + } + } +#endif + + i = port->fwVersion; + if (port->mptVersion < MPI_VERSION_01_02) + { + printf("Firmware version is %08x (%d.%02d.%02d)\n", + i, (i >> 12) & 0xf, (i >> 8) & 0xf, i & 0xff); + } + else + { + if (i & 0xff) + { + printf("Firmware version is %08x (%d.%02d.%02d.%02d)\n", + i, (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff, i & 0xff); + } + else + { + printf("Firmware version is %08x (%d.%02d.%02d)\n", + i, (i >> 24) & 0xff, (i >> 16) & 0xff, (i >> 8) & 0xff); + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (mpi2) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 0, 0, + &IOUnitPage0, sizeof IOUnitPage0) == 1) + { + if (IOUnitPage0.NvdataVersionDefault.Word == IOUnitPage0.NvdataVersionPersistent.Word) + printf("NVDATA version is %08x\n", + get32(IOUnitPage0.NvdataVersionDefault.Word)); + else + printf("NVDATA version is %08x (default), %08x (persistent)\n", + get32(IOUnitPage0.NvdataVersionDefault.Word), + get32(IOUnitPage0.NvdataVersionPersistent.Word)); + } + } + else + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, + &SASIOUnitPage0, sizeof SASIOUnitPage0) == 1) + { + if (SASIOUnitPage0.NvdataVersionDefault == SASIOUnitPage0.NvdataVersionPersistent) + printf("NVDATA version is %04x\n", + get16(SASIOUnitPage0.NvdataVersionDefault)); + else + printf("NVDATA version is %04x (default), %04x (persistent)\n", + get16(SASIOUnitPage0.NvdataVersionDefault), + get16(SASIOUnitPage0.NvdataVersionPersistent)); + } + } + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, + &ManufacturingPage0, sizeof ManufacturingPage0) == 1) + { + for (i = 0; i < sizeof ManufacturingPage0.BoardName; i++) + if (!isprint(ManufacturingPage0.BoardName[i])) + break; + if (i >= 4) + printf("Board name is %-16s\n", ManufacturingPage0.BoardName); + } + + if (port->pciType) + printf("Chip is %s, %s\n", port->chipNameRev, port->pciType); + else + printf("Chip is %s\n", port->chipNameRev); + + if (getBoardInfo(port) == 1) + { + printf("PCI location is Segment %d, Bus %d, Device %d, Function %d (combined: %02x%02x%02x)\n", + port->pciSegment, port->pciBus, port->pciDevice, port->pciFunction, + port->pciSegment, port->pciBus, (port->pciDevice << 3) | port->pciFunction); + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf("Initiator Mode is %s, Target Mode is %s\n", + port->protocolFlags & MPI_PORTFACTS_PROTOCOL_INITIATOR ? "enabled" : "disabled", + port->protocolFlags & MPI_PORTFACTS_PROTOCOL_TARGET ? "enabled" : "disabled"); + } + + return 1; +} + + +void +showVpdData(MPT_PORT *port, ManufacturingPage1_t *ManufacturingPage1) +{ + int i; + int j; + char c[16]; + + printf("\nRaw VPD Data:\n"); + + for (i = 0, j = 0; i < sizeof ManufacturingPage1->VPD; i++, j++) + { + if (j == 0) + printf("%04x : ", i); + + printf("%02x ", ManufacturingPage1->VPD[i]); + + if (!isprint(ManufacturingPage1->VPD[i])) + c[j] = ' '; + else + c[j] = ManufacturingPage1->VPD[i]; + + if (j == sizeof c - 1) + { + printf(" "); + for (j = 0; j < sizeof c; j++) + { + printf("%c", c[j]); + } + printf("\n"); + j = -1; + } + } +} + + +int +doDisplayVpdInfo(MPT_PORT *port) +{ + ManufacturingPage1_t ManufacturingPage1; + U8 *p; + U8 *q; + U8 tag; + int item; + int length; + int i; + int j; + int l; + int n; + char c; + int error; + int got_end; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 1, 0, + &ManufacturingPage1, sizeof ManufacturingPage1) == 1) + { + if (ManufacturingPage1.VPD[0] == 0x82) + { + printf("VPD Data is valid\n\n"); + + error = 0; + got_end = 0; + + p = ManufacturingPage1.VPD; + for (i = 0; i < sizeof ManufacturingPage1.VPD; i += length, p += length) + { + tag = p[0]; + + if (tag == 0) + break; + + if (tag & 0x80) + { + item = tag & 0x7f; + length = (p[2] << 8) + p[1]; + switch (item) + { + case 2: + l = 3 + length; + c = p[l]; + p[l] = '\0'; + printf("%02x %02x %s\n", tag, length, p + 3); + p[l] = c; + break; + + case 16: + case 17: + printf("%02x %02x\n", tag, length); + q = p + 3; + for (j = 0; j < length; j += n + 3, q += n + 3) + { + n = q[2]; + if (q[0] == 'R' && q[1] == 'W') + { + printf(" %02x RW\n", n); + continue; + } + if (q[0] == 'R' && q[1] == 'V') + { + printf(" %02x RV %02x\n", n, q[3]); + continue; + } + l = 3 + n; + c = q[l]; + q[l] = '\0'; + printf(" %02x %c%c %s\n", n, q[0], q[1], q + 3); + q[l] = c; + } + if (j != length) + { + printf(" Incorrect large resource length, should be %02x!\n", j); + error = 1; + } + break; + + default: + printf("%02x %02x Unknown large resource type!\n", tag, length); + error = 1; + break; + } + length += 3; + } + else + { + item = (tag & 0x78) >> 3; + length = tag & 0x07; + switch (item) + { + case 15: + printf("%02x %02x\n", tag, length); + if (i + 1 != sizeof ManufacturingPage1.VPD) + { + printf(" Incorrect end tag placement, is at offset %02x, should be at offset %02x\n", + i, (int)sizeof ManufacturingPage1.VPD - 1); + error = 1; + } + if (length != 0) + { + printf(" Incorrect end tag length, should be 00\n"); + error = 1; + } + got_end = 1; + break; + + default: + printf("%02x %02x Unknown small resource type!\n", tag, length); + error = 1; + break; + } + length += 1; + } + } + + if (!got_end) + { + printf("Missing end tag, expected at offset %02x!\n", i); + error = 1; + } + + if (error) + { + showVpdData(port, &ManufacturingPage1); + } + } + else + { + printf("VPD Data is not valid\n"); + } + } + + return 1; +} + + +int +doProgramVpdInfo(MPT_PORT *port) +{ + ManufacturingPage1_t ManufacturingPage1; + char name[256]; + unsigned char *vpdinfoBuf = NULL; + int vpdinfoLen; + int n; + int i; + int t; + char *buf; + int after_equals; + int in_quotes; + char serial[64]; + char *c; + int tag; + int length; + char key1; + char key2; + int lr_n; + int lr_length; + + n = getFileName(name, sizeof name, stdin, "VPD information", 0); + if (n > 0) + { + if (readFile(name, &vpdinfoBuf, &vpdinfoLen) != 1) + return 0; + } + else + { + printf("VPD information won't be programmed\n"); + return 0; + } + + printf("%d bytes read from %s\n\n", vpdinfoLen, name); + + n = vpdinfoLen; + buf = realloc(vpdinfoBuf, n + 2); + if (n && buf[n-1] != '\n') + { + vpdinfoLen++; + buf[n++] = '\n'; + } + buf[n] = '\0'; + + n = 0; + after_equals = 0; + in_quotes = 0; + for (i = 0; i < vpdinfoLen; i++) + { + if (buf[i] == '\0' || buf[i] == '\r') // NUL and CR are ignored + continue; + + if (buf[i] == ';') // lines starting with ; are ignored + { + while (buf[i] != '\n' && i < vpdinfoLen) + i++; + } + + if (n) + { + if (buf[i] == '\n' && buf[n-1] == '\n') // blank lines are ignored + continue; + } + else + { + if (buf[i] == '\n') // blank lines are ignored + continue; + } + + if (buf[i] == '=') + after_equals = 1; + + if (buf[i] == '\n') + after_equals = 0; + + if (buf[i] == '"') + in_quotes ^= 1; + + if (!in_quotes && buf[i] == ' ') + continue; + + buf[n++] = after_equals ? buf[i] : toupper(buf[i]); + } + buf[n] = '\0'; + + memset(&ManufacturingPage1, 0, sizeof ManufacturingPage1); + + ManufacturingPage1.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + ManufacturingPage1.Header.PageNumber = 1; + ManufacturingPage1.Header.PageLength = sizeof(ManufacturingPage1_t) / 4; + ManufacturingPage1.Header.PageVersion = MPI_MANUFACTURING1_PAGEVERSION; + + c = buf; + n = 0; + lr_n = 0; + lr_length = 0; + + if (sscanf(c, "LR_ID_STRING_TAG=0x%x\n%n", &tag, &t) != 1) + { + printf("LR_ID_STRING_TAG not found or invalid!\n"); + goto error; + } + ManufacturingPage1.VPD[n++] = tag; + c += t; + if (sscanf(c, "LR_ID_STRING_LENGTH=0x%x\n%n", &length, &t) != 1) + { + printf("LR_ID_STRING_LENGTH not found or invalid!\n"); + goto error; + } + ManufacturingPage1.VPD[n++] = length; + ManufacturingPage1.VPD[n++] = length >> 8; + c += t; + if (strncmp(c, "LR_ID_STRING=", 13) != 0 || c[13] != '"' || c[14+length] != '"' || c[15+length] != '\n') + { + printf("LR_ID_STRING not found or invalid!\n"); + goto error; + } + memcpy(ManufacturingPage1.VPD + n, c + 14, length); + n += length; + c += 16 + length; + + while (c[0] != '\0') + { + if (c[0] == 'S') + break; + + else if (c[0] == 'L') + { + if (lr_n && lr_n + lr_length != n) + { + printf("VPD large resource tag %02x length is incorrect, is %02x, should be %02x\n", + ManufacturingPage1.VPD[lr_n-3], lr_length, n - lr_n); + } + + if (sscanf(c, "LR_VPD_TAG=0x%x\n%n", &tag, &t) != 1) + { + printf("LR_VPD_TAG not found or invalid!\n"); + goto error; + } + ManufacturingPage1.VPD[n++] = tag; + c += t; + if (sscanf(c, "LR_VPD_LENGTH=0x%x\n%n", &length, &t) != 1) + { + printf("LR_VPD_LENGTH not found or invalid!\n"); + goto error; + } + ManufacturingPage1.VPD[n++] = length; + ManufacturingPage1.VPD[n++] = length >> 8; + c += t; + lr_n = n; + lr_length = length; + } + + else if (c[0] == 'V') + { + if (sscanf(c, "VPD_KEYWORD=\"%c%c\"\n%n", &key1, &key2, &t) != 2) + { + printf("VPD_KEYWORD not found or invalid!\n"); + goto error; + } + key1 = toupper(key1); + key2 = toupper(key2); + ManufacturingPage1.VPD[n++] = key1; + ManufacturingPage1.VPD[n++] = key2; + c += t; + if (sscanf(c, "VPD_LENGTH=0x%x\n%n", &length, &t) != 1) + { + printf("VPD_LENGTH not found or invalid!\n"); + goto error; + } + ManufacturingPage1.VPD[n++] = length; + c += t; + if (strncmp(c, "VPD_DATA=", 9) != 0) + { + printf("VPD_DATA not found or invalid!\n"); + goto error; + } + c += 9; + if (key1 == 'R' && key2 == 'V') + { + if (strncasecmp(c, "\"CHECKSUM\"\n", 11) != 0) + { + printf("VPD_DATA not found or invalid!\n"); + c -= 11; + goto error; + } + memset(ManufacturingPage1.VPD + n, 0, length); + for (i = 0, t = 0; i < n; i++) + t += ManufacturingPage1.VPD[i]; + ManufacturingPage1.VPD[n] = -t; + n += length; + c += 11; + } + else if (key1 == 'R' && key2 == 'W') + { + if (strncasecmp(c, "\"RESERVED\"\n", 11) != 0) + { + printf("VPD_DATA not found or invalid!\n"); + c -= 11; + goto error; + } + memset(ManufacturingPage1.VPD + n, 0, length); + n += length; + c += 11; + } + else if (key1 == 'S' && key2 == 'N') + { + printf("Enter serial number: [%d characters or RETURN to quit] ", length); + while (TRUE) + { + t = getStringFromArgs(serial, sizeof serial, stdin); + + if (t == 0) + { + free(buf); + return 0; + } + + if (t == length) + { + printf("\n"); + break; + } + + printf("Invalid response, try again: "); + } + memcpy(ManufacturingPage1.VPD + n, serial, length); + n += length; + while (*c != '\0') + if (*c++ == '\n') + break; + } + else + { + if (c[0] != '"' || c[1+length] != '"' || c[2+length] != '\n') + { + printf("VPD_DATA not found or invalid!\n"); + c -= 11; + goto error; + } + memcpy(ManufacturingPage1.VPD + n, c + 1, length); + n += length; + c += 3 + length; + } + } + + else + break; + } + + if (lr_n && lr_n + lr_length != n) + { + printf("VPD large resource tag %02x length is incorrect, is %02x, should be %02x\n", + ManufacturingPage1.VPD[lr_n-3], lr_length, n - lr_n); + } + + if (sscanf(c, "SR_END_TAG=0x%x\n%n", &tag, &t) != 1) + { + printf("SR_END_TAG not found or invalid!\n"); + goto error; + } + ManufacturingPage1.VPD[n++] = tag; + c += t; + + if (tag != 0x78) + { + printf("VPD end tag value is incorrect, is %02x, should be 78\n", tag); + } + + if (n != sizeof ManufacturingPage1.VPD) + { + printf("VPD end tag is misplaced, is at offset %02x, should be at offset %02x\n", + n - 1, (int)sizeof ManufacturingPage1.VPD - 1); + } + +error: + if (c[0] != '\0') + { + printf("\nExtra lines found in VPD information file!\n"); + printf("----\n%s----\n", c); + } + + free(buf); + + printf("Writing VPD Data to ManufacturingPage1...\n"); + +// showVpdData(port, &ManufacturingPage1); + + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + t = setConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 1, 0, + &ManufacturingPage1, sizeof ManufacturingPage1); + + doIocInit(port, port->whoInit); + + if (t != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +#if (WIN32 || __linux__ || __sparc__ || DOS || EFI) && REGISTER_ACCESS + + +int +doEnableDiagAccess(MPT_PORT *port, U32 *diagOrig) +{ + U32 diag; + U32 data; + + readl(DIAGNOSTIC, diag); + if ((diag & MPI_DIAG_DRWE) == 0) + { + writel(WRITE_SEQUENCE, 0); + writel(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + writel(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + writel(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + writel(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + writel(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + writel(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + } + readl(DIAGNOSTIC, data); + + if (port->notOperational) + { + writel(DIAGNOSTIC, data | MPI_DIAG_RW_ENABLE | MPI_DIAG_MEM_ENABLE | MPI_DIAG_DISABLE_ARM); + } + else + { + writel(DIAGNOSTIC, data | MPI_DIAG_RW_ENABLE | MPI_DIAG_MEM_ENABLE); + } + + *diagOrig = diag; + + return 1; +} + + +int +doReadChipMemoryRegions(MPT_PORT *port, U32 addr, U32 *buf, int num) +{ + U32 flush; + U32 diag; + U32 data; +#ifdef REG_DIAG_READ + U32 base; +#endif + int i; + + if (doEnableDiagAccess(port, &diag) != 1) + return 0; + +#ifdef REG_DIAG_READ + if (port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919 || + port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929) + { + for (i = 0; i < num; i++) + { + writel(TEST_BASE_ADDRESS, addr); + readl(TEST_BASE_ADDRESS, base); + + doReadWriteRegister(port, addr - base, &data, REG_DIAG_READ); + + buf[i] = data; + } + } + else +#endif + { + writel(DIAG_RW_ADDRESS, addr); + readl(DIAG_RW_ADDRESS, flush); + for (i = 0; i < num; i++) + { + readl(DIAG_RW_DATA, data); + + buf[i] = data; + } + + writel(DIAG_RW_ADDRESS, 0); + } + + writel(DIAGNOSTIC, diag); + + return 1; +} + + +int +doWriteChipMemoryRegions(MPT_PORT *port, U32 addr, U32 *buf, int num) +{ + U32 flush; + U32 diag; + U32 data; +#ifdef REG_DIAG_WRITE + U32 base; +#endif + int i; + + if (doEnableDiagAccess(port, &diag) != 1) + return 0; + +#ifdef REG_DIAG_WRITE + if (port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919 || + port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929) + { + for (i = 0; i < num; i++) + { + writel(TEST_BASE_ADDRESS, addr); + readl(TEST_BASE_ADDRESS, base); + + data = buf[i]; + + doReadWriteRegister(port, addr - base, &data, REG_DIAG_WRITE); + } + } + else +#endif + { + writel(DIAG_RW_ADDRESS, addr); + readl(DIAG_RW_ADDRESS, flush); + for (i = 0; i < num; i++) + { + data = buf[i]; + + writel(DIAG_RW_DATA, data); + readl(DIAG_RW_ADDRESS, flush); + } + + writel(DIAG_RW_ADDRESS, 0); + } + + writel(DIAGNOSTIC, diag); + + return 1; +} + + +int +doDumpRegisters(MPT_PORT *port) +{ + U32 data; + + readl(DOORBELL, data); + printf("Doorbell %08x\n", data); + + readl(DIAGNOSTIC, data); + printf("Diagnostic %08x\n", data); + + readl(HOST_INTERRUPT_STATUS, data); + printf("Interrupt Status %08x\n", data); + + readl(HOST_INTERRUPT_MASK, data); + printf("Interrupt Mask %08x\n", data); + + return 1; +} + + +int +readLocalMemory(MPT_PORT *port, U32 addr, U32 *data, U32 temp) +{ + ToolboxMemMoveRequest_t req; + ToolboxReply_t rep; + SGESimple32_t *simple32; + + if (checkOperational(port, 1) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI_TOOLBOX_MEMORY_MOVE_TOOL; + + simple32 = (pSGESimple32_t)&req.SGL; + + simple32[0].FlagsLength = set32(4 | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_32_BIT_ADDRESSING | + MPI_SGE_FLAGS_HOST_TO_IOC | + MPI_SGE_FLAGS_LOCAL_ADDRESS | + MPI_SGE_FLAGS_END_OF_BUFFER)); + simple32[0].Address = set32(addr); + simple32[1].FlagsLength = set32(4 | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_32_BIT_ADDRESSING | + MPI_SGE_FLAGS_LOCAL_ADDRESS | + MPI_SGE_FLAGS_IOC_TO_HOST | + MPI_SGE_FLAGS_END_OF_BUFFER | + MPI_SGE_FLAGS_END_OF_LIST)); + simple32[1].Address = set32(temp); + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL + 2 * sizeof *simple32, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + req.SGL.FlagsLength = set32(4 | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_32_BIT_ADDRESSING | + MPI_SGE_FLAGS_LOCAL_ADDRESS | + MPI_SGE_FLAGS_HOST_TO_IOC | + MPI_SGE_FLAGS_END_OF_BUFFER)); + req.SGL.u.Address32 = set32(temp); + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL + 1 * sizeof *simple32, &rep, sizeof rep, + data, 4, NULL, 0, SHORT_TIME) != 1) + return 0; + + *data = get32x(*data); + + return 1; +} + + +int +doDumpChipMemoryRegions(MPT_PORT *port) +{ + FILE *file; + char name[256]; + int n; + U32 diag; + U32 start; + U32 end; + U32 data; + int i; + U32 tempaddr; + U32 tempdata; + int binary = 0; + int binfile; + + readl(DIAGNOSTIC, diag); // this will return if register access does not work + + while (TRUE) + { + printf("Enter starting address: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&start) == 0) + break; + + printf("Enter ending address: [%08x-FFFFFFFF or RETURN to skip] ", start); + while (TRUE) + { + if (getHexNumberAnswer(&end) == 0) + { + printf("Enter number of locations: [1-1000000, default is 1] "); + n = getNumberAnswer(1, 1000000, 1); + end = start + (n - 1) * 4; + break; + } + if (start <= end) + break; + + printf("Invalid answer, try again: "); + } + + if (numFileNames) + { + n = getFileName(name, sizeof name, stdin, "output", 0); + } + else + { + printf("Enter output filename, or RETURN to send output to the screen: "); + n = getString(name, sizeof name, stdin); + } + if (n > 0) + { + if (gFlag == TRUE) + { + printf("File type: [0=ASCII, 1=Binary, default is 0] "); + binary = getNumberAnswer(0, 1, 0); + } + if (binary) + { + binfile = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (binfile < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + file = NULL; + } + else + { + file = fopen(name, "a"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + binfile = -1; + } + } + else + { + file = stdout; + binfile = -1; + printf("\n"); + } + + start &= ~3; + end &= ~3; + + i = 0; + + if (end <= 0x10000000 && !port->notOperational) + { + tempaddr = 0; + tempdata = 0; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC919X: + case MPI_MANUFACTPAGE_DEVICEID_FC929X: + if (port->fwVersion >= 0x01021404) // 1.02.20.04 or later... + tempaddr = 0x21000000; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC939X: + case MPI_MANUFACTPAGE_DEVICEID_FC949X: + if (port->fwVersion >= 0x01031101) // 1.03.17.01 or later... + tempaddr = 0x21fc0000; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC949E: + if (port->fwVersion >= 0x01031101) // 1.03.17.01 or later... + tempaddr = 0x21f80000; + break; + } + } + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + tempaddr = 0x21fffffc; + } + + if (tempaddr != 0) + { + doReadChipMemoryRegions(port, tempaddr, &tempdata, 1); + } + + while (start <= end) + { + if (tempaddr != 0 && readLocalMemory(port, start, &data, tempaddr) == 1) + { + if (binary) + { + data = set32x(data); + i += write(binfile, &data, 4); + } + else + i += fprintf(file, "%08x: %08x\n", start, data); + start += 4; + } + else + { + printf("Unable to read local memory!\n"); + break; + } + } + + if (tempaddr != 0) + { + doWriteChipMemoryRegions(port, tempaddr, &tempdata, 1); + } + } + else + { + while (start <= end) + { + doReadChipMemoryRegions(port, start, &data, 1); + + if (binary) + { + data = set32x(data); + i += write(binfile, &data, 4); + } + else + i += fprintf(file, "%08x: %08x\n", start, data); + start += 4; + } + } + + if (n > 0) + { + printf("\nWrote %d bytes to file %s\n", i, name); + + if (binary) + close(binfile); + else if (file != stdout) + fclose(file); + } + + printf("\n"); + } + + return 1; +} + + +int +doReadModifyChipMemoryLocations(MPT_PORT *port) +{ + U32 diag; + U32 addr; + U32 data; + + while (TRUE) + { + readl(DIAGNOSTIC, diag); // this will return if register access does not work + + printf("Enter address: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&addr) == 0) + break; + + addr &= ~3; + + doReadChipMemoryRegions(port, addr, &data, 1); + + printf("%08x: %08x\n", addr, data); + + printf("Enter value: [00000000-FFFFFFFF or RETURN to skip] "); + if (parseHexNumberChange(&data) == 1) + { + doWriteChipMemoryRegions(port, addr, &data, 1); + } + + printf("\n"); + } + + return 1; +} + + +int +doDumpFcTraceBuffer(MPT_PORT *port) +{ + FILE *file; + char name[256]; + int n; + int i = 0; + U32 diag; + U32 addr; + U32 data; + U32 ptr1; + U32 len1; + U32 ptr2; + U32 len2; + + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC919: addr = 0x01000000; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929: addr = 0x01000000; break; + case MPI_MANUFACTPAGE_DEVICEID_FC919X: addr = 0x21000000; break; + case MPI_MANUFACTPAGE_DEVICEID_FC929X: addr = 0x21000000; break; + case MPI_MANUFACTPAGE_DEVICEID_FC939X: addr = 0x21fc0000; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949X: addr = 0x21fc0000; break; + case MPI_MANUFACTPAGE_DEVICEID_FC949E: addr = 0x21f80000; break; + default: + printf("Unsupported chip type!\n"); + return 0; + } + + readl(DIAGNOSTIC, diag); // this will return if register access does not work + + doReadChipMemoryRegions(port, addr, &data, 1); + + if (data <= addr || data & 3) + { + printf("FC trace buffer address is invalid\n"); + + return 0; + } + else + { + addr = data; + + doReadChipMemoryRegions(port, addr, &data, 1); + + if (data != ('T' << 24) + ('R' << 16) + ('A' << 8) + ('C' << 0)) + { + printf("FC trace buffer signature is invalid\n"); + + return 0; + } + } + + n = getFileName(name, sizeof name, stdin, "output", 0); + if (n > 0) + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + printf("Trace buffer won't be dumped\n"); + return 1; + } + + printf("\n"); + printf("TraceInfo %08x\n", addr); + printf("TraceSignature %08x\n", data); + + doReadChipMemoryRegions(port, addr + 4, &data, 1); + printf("TraceIndex %08x\n", data); + + doReadChipMemoryRegions(port, addr + 8, &data, 1); + printf("TraceHistoryBuf %08x\n", data); + ptr1 = data; + + doReadChipMemoryRegions(port, addr + 12, &data, 1); + printf("TraceHistoryBufSize %08x\n", data); + len1 = data; + + doReadChipMemoryRegions(port, addr + 16, &data, 1); + printf("TraceCounters %08x\n", data); + ptr2 = data; + + doReadChipMemoryRegions(port, addr + 20, &data, 1); + printf("NumTraceCounters %08x\n", data); + len2 = data; + + while (len1) + { + doReadChipMemoryRegions(port, ptr1, &data, 1); + i += fprintf(file, "%08x: %08x\n", ptr1, data); + ptr1 += 4; + len1 -= 1; + } + + while (len2) + { + doReadChipMemoryRegions(port, ptr2, &data, 1); + i += fprintf(file, "%08x: %08x\n", ptr2, data); + ptr2 += 4; + len2 -= 1; + } + + printf("\nWrote %d bytes to file %s\n", i, name); + + fclose(file); + + return 1; +} + + +int +doForceFirmwareFault(MPT_PORT *port) +{ + printf("Writing C0FFEE to Doorbell...\n"); + + writel(DOORBELL, 0xc0ffee00); + + return 1; +} + + +#endif + + +int +doReadWriteExpanderMemory(MPT_PORT *port) +{ + int i; + int j; + _U64 sas_address; + U8 physical_port; + U32 addr; + U32 data; + int n; + int action; + int ringFormat; + U16 ringAddr = 0; + int numDwords; + + if (selectExpander(port, NULL, NULL, &physical_port, &sas_address, NULL) != 1) + return 0; + + printf("\nDo you want to use the AHB (x28/x36/Bobcat/Cobra)\n"); + printf("or Ring (x12) format SMP? [0=AHB, 1=Ring, default is 0] "); + ringFormat = getNumberAnswer(0, 1, 0); + + while (TRUE) + { + if (ringFormat) + { + printf("\nEnter address: [00000-7FFFF or RETURN to quit] "); + addr = getNumberAnswerHex(0, 0x7FFFF, 0xFFFFFFFF); + if (addr == 0xFFFFFFFF) + break; + } + else + { + printf("\nEnter address: [00000000-FFFFFFFF or RETURN to quit] "); + if (getHexNumberAnswer(&addr) == 0) + break; + } + + while (TRUE) + { + printf("\nDo you want to read or write? [0=Read, 1=Write, or RETURN for new address] "); + action = getNumberAnswer(0, 1, -1); + if (action < 0) + break; + + printf("\n"); + + if (action == 0) + { + unsigned char smp_req[8]; + unsigned char smp_rsp[1024]; + + if (ringFormat) + { + printf("Enter number of locations: [1-127, default is 1] "); + n = getNumberAnswer(1, 127, 1); + } + else + { + printf("Enter number of locations: [1-128, default is 1] "); + n = getNumberAnswer(1, 128, 1); + } + + addr &= ~3; + + memset(smp_req, 0, sizeof smp_req); + + smp_req[0] = 0x40; + + if (ringFormat) + smp_req[1] = 0x40; + else + smp_req[1] = 0x42; + + smp_req[2] = 0xff; + smp_req[3] = n; + + if (ringFormat) + { + /* starting address must be on an 8-byte boundary */ + ringAddr = (addr >> 3) & 0xFFFF; + put2bytes(smp_req, 4, ringAddr); + } + else + { + put4bytes(smp_req, 4, addr); + } + + if (doSmpPassthrough(port, physical_port, sas_address, + smp_req, sizeof smp_req, smp_rsp, sizeof smp_rsp, NULL) == 1) + { + if (smp_rsp[2] != 0) + { + printf("\nRead Memory failed with result %02x\n\n", smp_rsp[2]); + continue; + } + + printf("\n"); + + if (ringFormat) + { + /* this SMP returns 2 DWORDS for each requested location. The + * starting address for returned data is the user supplied address + * with bits 0-2 cleared (i.e. the 8-byte boundary) + */ + numDwords = n*2; + addr = ringAddr << 3; + } + else + numDwords = n; + + for (i = 0, j = 0; i < numDwords; i++, j += 4) + { + data = get4bytes(smp_rsp, j + 4); + + printf("%08x: %08x\n", addr + j, data); + } + } + } + + if (action == 1) + { + unsigned char smp_req[16]; + unsigned char smp_rsp[4]; + + printf("Enter value: [00000000-FFFFFFFF or RETURN to not change] "); + if (getHexNumberAnswer(&data) == 0) + continue; + + addr &= ~3; + + memset(smp_req, 0, sizeof smp_req); + + smp_req[0] = 0x40; + if (ringFormat) + smp_req[1] = 0xc0; + else + smp_req[1] = 0xc2; + smp_req[2] = 0xff; + smp_req[3] = 1; + + if (ringFormat) + { + int firstDword; + int byteEnables; + int dataOffset; + + /* starting address must be on an 8-byte boundary */ + ringAddr = (addr >> 3) & 0xFFFF; + put2bytes(smp_req, 4, ringAddr); + + /* determine whether the data is going in the first or second + * dword and which byte enables are needed + */ + firstDword = (addr & 0x04) == 0 ? 1 : 0; + byteEnables = firstDword ? 0x0F : 0xF0; + dataOffset = firstDword ? 8 : 12; + + smp_req[6] = byteEnables; + smp_req[7] = byteEnables; + put4bytes(smp_req, dataOffset, data); + } + else + { + put4bytes(smp_req, 4, addr); + put4bytes(smp_req, 8, data); + } + + if (doSmpPassthrough(port, physical_port, sas_address, + smp_req, sizeof smp_req, smp_rsp, sizeof smp_rsp, NULL) == 1) + { + if (smp_rsp[2] != 0) + { + printf("\nWrite Memory failed with result %02x\n\n", smp_rsp[2]); + continue; + } + } + } + } + } + + return 1; +} + + +int +doReadWriteExpanderIstwiDevice(MPT_PORT *port) +{ + int bus; + int target; + unsigned char desc[4]; + unsigned char scan[1]; + int i; + int j; + int n; + int t; + char name[256]; + FILE *file; + unsigned char *buffer = NULL; + int length; + int offset; + int id; + int channel; + int address; + int size; + int action; + char c[16]; + + if (selectExpander(port, &bus, &target, NULL, NULL, NULL) != 1) + return 0; + + while (TRUE) + { + printf("\nEnter ISTWI device channel: [0-2 or RETURN to quit] "); + channel = getNumberAnswerHex(0, 2, -1); + if (channel < 0) + break; + + printf("Enter ISTWI device address: [00-FF or RETURN to quit] "); + address = getNumberAnswerHex(0x00, 0xff, -1); + if (address < 0) + break; + + if (address <= 1) + { + j = address == 0; + if (j) + printf("\nScanning for ISTWI devices...\n"); + else + printf("\nReading ISTWI devices...\n"); + fflush(stdout); + + for (i = 0; i < 128; i++) + { + if ((i & 15) == 0) + printf("\n"); + + address = i << 17; + id = 12 + channel; + + if (doReadBufferFull(port, bus, target, 0, 2, id, address, scan, sizeof scan) == 1) + { + if (j) + printf(" %02x", i << 1); + else + printf(" %02x", scan[0]); + } + else + { + printf(" --"); + } + + fflush(stdout); + } + + printf("\n"); + + continue; + } + + address &= ~1; + + printf("Enter ISTWI device size in bytes: [0=1, 1=256, 2=8192, or RETURN to quit] "); + size = getNumberAnswer(0, 2, -1); + if (size < 0) + break; + + address <<= 16; + id = 12 + channel + size * 3; + + if (doReadBufferFull(port, bus, target, 0, 3, id, address, desc, sizeof desc) == 1) + { + size = get3bytes(desc, 1); + } + else + { + printf("ISTWI device size could not be verified, cannot continue!\n"); + return 1; + } + + while (TRUE) + { + printf("\nDo you want to read or write? [0=Read, 1=Write, or RETURN for new device] "); + action = getNumberAnswer(0, 1, -1); + if (action < 0) + break; + + printf("\n"); + + if (action == 0) + { + if (size > 1) + { + printf("Enter read offset: [0-%X, default is 0] ", size - 1); + offset = getNumberAnswerHex(0, size - 1, 0); + + printf("Enter read length: [1-%X, default is %X] ", size - offset, size - offset); + length = getNumberAnswerHex(1, size - offset, size - offset); + } + else + { + offset = 0; + length = 1; + } + + buffer = (unsigned char *)malloc(length); + + if (doReadBufferFull(port, bus, target, 0, 2, id, address + offset, buffer, length) != 1) + { + printf("Failed to read ISTWI device!\n"); + break; + } + + if (length <= 16) + { + n = 0; + if (size > 1) + printf("\n"); + } + else if (numFileNames) + { + n = getFileName(name, sizeof name, stdin, "output", 0); + } + else + { + printf("Enter output filename, or RETURN to send output to the screen: "); + n = getString(name, sizeof name, stdin); + if (n == 0) + printf("\n"); + } + if (n > 0) + { + if (gFlag == TRUE) + { + printf("File type: [0=ASCII, 1=Binary, default is 0] "); + t = getNumberAnswer(0, 1, 0); + } + else + { + t = 0; + } + if (t) + { + int file; + + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + } + else + { + t = write(file, buffer, length); + if (t != length) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + } + else + { + printf("\nWrote %d bytes to file %s\n", length, name); + } + + close(file); + } + + free(buffer); + continue; + } + else + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + + free(buffer); + continue; + } + } + } + else + { + file = stdout; + } + + for (i = 0, j = 0; i < length; i++, j++) + { + if (j == 0) + fprintf(file, "%04x : ", i); + + fprintf(file, "%02x ", buffer[i]); + + if (!isprint(buffer[i])) + c[j] = ' '; + else + c[j] = buffer[i]; + + if (j == sizeof c - 1) + { + fprintf(file, " "); + for (j = 0; j < sizeof c; j++) + { + fprintf(file, "%c", c[j]); + } + fprintf(file, "\n"); + j = -1; + } + } + + if (j != 0) + { + for (i = j; i < sizeof c; i++) + fprintf(file, " "); + + fprintf(file, " "); + for (i = 0; i < j; i++) + { + fprintf(file, "%c", c[i]); + } + fprintf(file, "\n"); + } + + if (file != stdout) + fclose(file); + + free(buffer); + } + + if (action == 1) + { + if (size > 1) + { + printf("Enter write offset: [0-%X, default is 0] ", size - 1); + offset = getNumberAnswerHex(0, size - 1, 0); + } + else + { + offset = 0; + } + + printf("Enter value: [00-FF or RETURN to not change] "); + t = getNumberAnswerHex(0x00, 0xff, -1); + if (t < 0) + continue; + + scan[0] = t; + + if (doWriteBufferFull(port, bus, target, 0, 2, id, address + offset, scan, 1) != 1) + { + printf("Failed to write ISTWI device!\n"); + break; + } + } + } + } + + return 1; +} + + +int +doResetExpander(MPT_PORT *port) +{ + _U64 sas_address; + U8 physical_port; + U32 addr; + U32 data; + int n; + + if (selectExpander(port, NULL, NULL, &physical_port, &sas_address, NULL) != 1) + return 0; + + printf("\nResetting expander...\n"); + + addr = 0xc3800200; // cobra reset address + data = 0x0c0b080a; // cobra reset value + + /* first attempt the reset using the cobra reset value (this write will go to + * reserved address space on bobcat and yeti) + */ + if ((n = sendResetExpander(port, physical_port, sas_address, addr, data)) == 2) + { + /* no good. now try yeti */ + addr = 0xc0000200; // yeti and bobcat reset address + data = 0x59455449; // yeti reset value + + /* attempt the reset using the yeti reset value */ + if ((n = sendResetExpander(port, physical_port, sas_address, addr, data)) == 2) + { + /* no good. Try using the bobcat reset value instead */ + data = 0x0b0bca70; // bobcat reset value + if ((n = sendResetExpander(port, physical_port, sas_address, addr, data)) != 1) + return 0; + } + } + + return n; +} + + +int +sendResetExpander(MPT_PORT *port, U8 physical_port, _U64 sas_address, U32 addr, U32 data) +{ + SmpPassthroughRequest_t req; + SmpPassthroughReply_t rep; + int ioc_status; + unsigned char smp_req[12]; + unsigned char smp_rsp[4]; + + memset(smp_req, 0, sizeof smp_req); + memset(smp_rsp, 0, sizeof smp_rsp); + + smp_req[0] = 0x40; + smp_req[1] = 0xc2; + smp_req[3] = 1; + put4bytes(smp_req, 4, addr); + put4bytes(smp_req, 8, data); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SMP_PASSTHROUGH; + req.PhysicalPort = physical_port; + req.RequestDataLength = set16(sizeof smp_req); + req.SASAddress = sas_address; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + smp_rsp, sizeof smp_rsp, smp_req, sizeof smp_req, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS && + ioc_status != MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED) + { + printf("\nSMPPassthrough failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + return 0; + } + + /* if the SMP function result is 0 (success) or 2 (function failed) then assume it is ok to move on and + * key off the ioc_status. Since writing the cobra values to a bobcat attempts to write to a reserved + * memory region, bobcat might return function failed in that case. + */ + if (smp_rsp[2] != 0 && smp_rsp[2] != 2) + { + printf("\nWrite Memory failed with result %02x\n\n", smp_rsp[2]); + return 0; + } + + /* successfully resetting the expander should result in an ioc_status of + * SAS_SMP_REQUEST_FAILED (because the reset happens immediately and an SMP response + * is not sent to the host). + * If we get SUCCESS then assume we sent the wrong reset (i.e. the yeti value to a bobcat) + * and return a 2, indicating to the caller to try a different reset value. + */ + if (ioc_status == MPI_IOCSTATUS_SUCCESS) + return 2; + } + + return 1; +} + + +#if (WIN32 || __linux__ || __sparc__ || DOS || EFI) && REGISTER_ACCESS + + +int +setFlashWrite(MPT_PORT *port, U32 flash_csr, U32 flash_csr_wr_en, int on) +{ + U32 flush; + U32 data; + + writel(DIAG_RW_ADDRESS, flash_csr); + readl(DIAG_RW_ADDRESS, flush); + readl(DIAG_RW_DATA, data); + + if (on) + data |= flash_csr_wr_en; + else + data &= ~flash_csr_wr_en; + + writel(DIAG_RW_ADDRESS, flash_csr); + readl(DIAG_RW_ADDRESS, flush); + writel(DIAG_RW_DATA, data); + readl(DIAG_RW_ADDRESS, flush); + + return 1; +} + + +U32 +readFlash(MPT_PORT *port, U32 flash_add, int offset) +{ + U32 flush; + U32 addr; + U32 data; + + addr = flash_add + offset; + + writel(DIAG_RW_ADDRESS, addr); + readl(DIAG_RW_ADDRESS, flush); + readl(DIAG_RW_DATA, data); + +// printf("rf %08x %08x\n", addr, data); + + return data; +} + + +int +writeFlash(MPT_PORT *port, U32 flash_add, int offset, U32 data) +{ + U32 flush; + U32 addr; +#ifdef REG_DIAG_WRITE_BYTE + U32 base; +#endif + int lane; + + lane = offset & 3; + addr = flash_add + offset; + +#ifdef REG_DIAG_WRITE_BYTE + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVID_53C1030: + case MPI_MANUFACTPAGE_DEVID_1030_53C1035: + writel(TEST_BASE_ADDRESS, addr); + readl(TEST_BASE_ADDRESS, base); + +// printf("wf %08x %02x\n", addr, data); + + doReadWriteRegister(port, addr - base, &data, REG_DIAG_WRITE_BYTE); + readl(TEST_BASE_ADDRESS, flush); + + return 1; + } +#endif + + addr -= lane; + data <<= 24; + data += lane; + +// printf("wf %08x %08x\n", addr, data); + + writel(DIAG_RW_ADDRESS, addr); + readl(DIAG_RW_ADDRESS, flush); + writel(DIAG_RW_DATA, data); + readl(DIAG_RW_ADDRESS, flush); + + return 1; +} + + +void +resetFlash(MPT_PORT *port, U32 flash_csr, U32 flash_csr_wr_en, U32 flash_add, int intel) +{ + setFlashWrite(port, flash_csr, flash_csr_wr_en, 1); + writeFlash(port, flash_add, 0, intel ? FLASH_RESET_INTEL : FLASH_RESET_AMD); + setFlashWrite(port, flash_csr, flash_csr_wr_en, 0); +} + + +int +doFlashInfo(MPT_PORT *port) +{ + U32 diag; + U32 data; + U32 flash_add; + U32 flash_csr; + U32 flash_csr_wr_en; + U32 id; + unsigned char cfi_query[128]; + int i; + int t; + + if (doEnableDiagAccess(port, &diag) != 1) // this will return if register access does not work + return 0; + + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC939X: + case MPI_MANUFACTPAGE_DEVICEID_FC949X: + case MPI_MANUFACTPAGE_DEVICEID_FC949E: + flash_add = 0x3d000000; + flash_csr = 0x3f000004; + flash_csr_wr_en = 1<<16; + break; + +#ifdef REG_DIAG_WRITE_BYTE + case MPI_MANUFACTPAGE_DEVID_53C1030: + case MPI_MANUFACTPAGE_DEVID_1030_53C1035: + flash_add = 0x3e000000; + flash_csr = 0x3f000000; + flash_csr_wr_en = 1<<11; + break; +#endif + + case MPI_MANUFACTPAGE_DEVICEID_FC919X: + case MPI_MANUFACTPAGE_DEVICEID_FC929X: + case MPI_MANUFACTPAGE_DEVID_SAS1064: + case MPI_MANUFACTPAGE_DEVID_SAS1064E: + case MPI_MANUFACTPAGE_DEVID_SAS1066: + case MPI_MANUFACTPAGE_DEVID_SAS1066E: + case MPI_MANUFACTPAGE_DEVID_SAS1068: + case MPI_MANUFACTPAGE_DEVID_SAS1068E: + flash_add = 0x3e000000; + flash_csr = 0x3f000004; + flash_csr_wr_en = 1<<16; + break; + + default: + printf("Unable to gather FLASH information\n"); + return 0; + } + + data = readFlash(port, flash_add, 0); + t = 0; + + if (t == 0) + { + setFlashWrite(port, flash_csr, flash_csr_wr_en, 1); + writeFlash(port, flash_add, 0, FLASH_RESET_INTEL); + writeFlash(port, flash_add, 0, FLASH_IDENTIFY); + setFlashWrite(port, flash_csr, flash_csr_wr_en, 0); + id = readFlash(port, flash_add, 0); + + if (id != data && id != 0) + { + printf("Intel-compatible FLASH device, Manufacturer ID = %02x and Device ID = %02x\n", + (id >> 0) & 0xff, (id >> 8) & 0xff); + resetFlash(port, flash_csr, flash_csr_wr_en, flash_add, 1); + t = 1; + } + } + + if (t == 0) + { + setFlashWrite(port, flash_csr, flash_csr_wr_en, 1); + writeFlash(port, flash_add, 0, FLASH_RESET_AMD); + writeFlash(port, flash_add, 0x555, 0xaa); + writeFlash(port, flash_add, 0x2aa, 0x55); + writeFlash(port, flash_add, 0x555, FLASH_IDENTIFY); + setFlashWrite(port, flash_csr, flash_csr_wr_en, 0); + id = readFlash(port, flash_add, 0); + + if (id != data && id != 0) + { + printf("AMD-compatible 8-bit FLASH device, Manufacturer ID = %02x and Device ID = %02x\n", + (id >> 0) & 0xff, (id >> 8) & 0xff); + resetFlash(port, flash_csr, flash_csr_wr_en, flash_add, 0); + t = 1; + } + } + + if (t == 0) + { + setFlashWrite(port, flash_csr, flash_csr_wr_en, 1); + writeFlash(port, flash_add, 0, FLASH_RESET_AMD); + writeFlash(port, flash_add, 0xaaa, 0xaa); + writeFlash(port, flash_add, 0x555, 0x55); + writeFlash(port, flash_add, 0xaaa, FLASH_IDENTIFY); + setFlashWrite(port, flash_csr, flash_csr_wr_en, 0); + id = readFlash(port, flash_add, 0); + + if (id != data && id != 0) + { + printf("AMD-compatible 16-bit FLASH device, Manufacturer ID = %02x and Device ID = %02x\n", + (id >> 0) & 0xff, (id >> 16) & 0xff); + resetFlash(port, flash_csr, flash_csr_wr_en, flash_add, 0); + t = 1; + } + } + + setFlashWrite(port, flash_csr, flash_csr_wr_en, 1); + writeFlash(port, flash_add, 0, FLASH_RESET_AMD); + writeFlash(port, flash_add, 0x55, FLASH_CFI_QUERY); + setFlashWrite(port, flash_csr, flash_csr_wr_en, 0); + for (i = 0; i < sizeof cfi_query; i += 4) + *((U32 *)(cfi_query + i)) = set32x(readFlash(port, flash_add, i)); + resetFlash(port, flash_csr, flash_csr_wr_en, flash_add, 0); + + if (cfi_query[16] == 'Q' && cfi_query[17] == 'R' && cfi_query[18] == 'Y') + { + printf("CFI-compatible 8-bit or 16-bit FLASH device\n\n"); + displayByteData((unsigned char *)cfi_query, sizeof cfi_query / 2); + writel(DIAGNOSTIC, diag); + return 1; + } + + setFlashWrite(port, flash_csr, flash_csr_wr_en, 1); + writeFlash(port, flash_add, 0, FLASH_RESET_AMD); + writeFlash(port, flash_add, 0xaa, FLASH_CFI_QUERY); + setFlashWrite(port, flash_csr, flash_csr_wr_en, 0); + for (i = 0; i < sizeof cfi_query; i += 4) + *((U32 *)(cfi_query + i)) = set32x(readFlash(port, flash_add, i)); + resetFlash(port, flash_csr, flash_csr_wr_en, flash_add, 0); + + if (cfi_query[32] == 'Q' && cfi_query[34] == 'R' && cfi_query[36] == 'Y') + { + printf("CFI-compatible 16-bit FLASH device in 8-bit mode\n\n"); + for (i = 0; i < sizeof cfi_query / 2; i++) + cfi_query[i] = cfi_query[i * 2]; + displayByteData((unsigned char *)cfi_query, sizeof cfi_query / 2); + writel(DIAGNOSTIC, diag); + return 1; + } + + if (t == 0) + printf("Could not detect FLASH type!\n"); + writel(DIAGNOSTIC, diag); + + return 0; +} + + +int +doReadRegister(MPT_PORT *port, U32 offset, U32 *data) +{ + int command = REG_MEM_READ; + + if (port->deviceId == MPI_MANUFACTPAGE_DEVID_53C1030 && + (offset == MPI_DIAG_RW_DATA_OFFSET || offset == MPI_DIAG_RW_ADDRESS_OFFSET)) + { + command = REG_IO_READ; + } + + return doReadWriteRegister(port, offset, data, command); +} + + +int +doWriteRegister(MPT_PORT *port, U32 offset, U32 *data) +{ + int command = REG_MEM_WRITE; + + if (port->deviceId == MPI_MANUFACTPAGE_DEVID_53C1030 && + (offset == MPI_DIAG_RW_DATA_OFFSET || offset == MPI_DIAG_RW_ADDRESS_OFFSET)) + { + command = REG_IO_WRITE; + } + + return doReadWriteRegister(port, offset, data, command); +} + + +int +doReadWriteRegister(MPT_PORT *port, U32 offset, U32 *data, int command) +{ +#if WIN32 + int status; + MPI_REG_ACCESS_SRB srb; + int inLen; + int outLen; + DWORD retLen; + + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = MPI_REG_ACCESS; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb.Sic.Signature, "4.00 ", 8); + + srb.Command = command; + srb.RegOffset = offset; + srb.RegData = *data; + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + *data = srb.RegData; + + return status; +#endif +#if __linux__ +#if i386 + if (command == REG_IO_READ) + { + if (port->ioPhys == 0) + return 0; + + *data = inl(port->ioPhys + offset); + return 1; + } + + if (command == REG_IO_WRITE) + { + if (port->ioPhys == 0) + return 0; + + outl(*data, port->ioPhys + offset); + return 1; + } +#endif + + if (command == REG_MEM_READ) + { + if (port->memPhys == 0) + return 0; + + *data = get32x(*(port->memVirt + offset / 4)); + return 1; + } + + if (command == REG_MEM_WRITE) + { + if (port->memPhys == 0) + return 0; + + *(port->memVirt + offset / 4) = set32x(*data); + return 1; + } + + if (command == REG_DIAG_READ) + { + if (port->diagPhys == 0) + return 0; + + *data = get32x(*(port->diagVirt + offset / 4)); + return 1; + } + + if (command == REG_DIAG_WRITE) + { + if (port->diagPhys == 0) + return 0; + + *(port->diagVirt + offset / 4) = set32x(*data); + return 1; + } + + if (command == REG_DIAG_WRITE_BYTE) + { + if (port->diagPhys == 0) + return 0; + + *((U8 *)port->diagVirt + offset) = (U8)*data; + return 1; + } + + return 0; +#endif +#if __sparc__ + int status; + SYM_REG_ACCESS regAccess; + + regAccess.Command = command; + regAccess.RegOffset = offset; + regAccess.RegData = *data; + + // Not implemented for gen2 SAS driver...just let it fail in that case + status = ioctl(port->fileHandle, SYMIOCTL_REG_ACCESS, ®Access); + + *data = regAccess.RegData; + + return status == 0; +#endif +#if DOS || EFI + HANDLE adap = port->fileHandle; + + if (command == REG_IO_READ) + { + *data = mpt_read32(adap, offset, adap->io); + return 1; + } + + if (command == REG_MEM_READ) + { + *data = mpt_read32(adap, offset, adap->mem); + return 1; + } + + if (command == REG_DIAG_READ) + { + *data = mpt_read32(adap, offset, adap->diagmem); + return 1; + } + + if (command == REG_IO_WRITE) + { + mpt_write32(adap, offset, *data, adap->io); + return 1; + } + + if (command == REG_MEM_WRITE) + { + mpt_write32(adap, offset, *data, adap->mem); + return 1; + } + + if (command == REG_DIAG_WRITE) + { + mpt_write32(adap, offset, *data, adap->diagmem); + return 1; + } + + if (command == REG_DIAG_WRITE_BYTE) + { + mpt_write8(adap, offset, (U8)*data); + return 1; + } + + return 0; +#endif +} + + +#endif + + +int +doDumpPciConfigSpace(MPT_PORT *port) +{ +#if WIN32 + int status; + PCI_CONFIG_SPACE_SRB srb; + int inLen; + int outLen; + DWORD retLen; + U8 *config; +#endif +#if __linux__ + char name[64]; + HANDLE handle; + U8 config[256]; +#endif +#if __sparc__ + SYM_PCI_INFO pciInfo; + int status; + U8 *config; +#endif +#if DOS + HANDLE adap = port->fileHandle; + U8 config[256]; + int i; +#endif +#if EFI + EFI_STATUS status; + HANDLE adap = port->fileHandle; + U8 config[256]; +#endif + + if (getBoardInfo(port) == 1) + { + printf("PCI location is Segment %d, Bus %d, Device %d, Function %d (combined: %02x%02x%02x)\n", + port->pciSegment, port->pciBus, port->pciDevice, port->pciFunction, + port->pciSegment, port->pciBus, (port->pciDevice << 3) | port->pciFunction); + } + +#if WIN32 + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = DRVR_INFO_IOCTL; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb.Sic.Signature, "4.00 ", 8); + + srb.PageCode = PCI_CONFIG_SPACE_PAGE; + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + if (status != 1) + return 0; + + config = srb.PciConfigSpace; +#endif +#if __linux__ + sprintf(name, "/proc/bus/pci/%04x:%02x/%02x.%d", + port->pciSegment, port->pciBus, port->pciDevice, port->pciFunction); + + handle = open(name, O_RDWR); + + if (handle < 0) + { + sprintf(name, "/proc/bus/pci/%02x/%02x.%d", + port->pciBus, port->pciDevice, port->pciFunction); + + handle = open(name, O_RDWR); + + if (handle < 0) + return 0; + } + + if (read(handle, config, sizeof config) != sizeof config) + return 0; +#endif +#if __sparc__ + memset(&pciInfo, 0, sizeof pciInfo); + + if (mpi2) + status = ioctl(port->fileHandle, MPTIOCTL_GET_PCI_INFO, &pciInfo); + else + status = ioctl(port->fileHandle, SYMIOCTL_GET_PCI_INFO, &pciInfo); + + if (status != 0) + return 0; + + config = pciInfo.PciHeader; +#endif +#if DOS + for (i = 0; i < 256; i++) + { + config[i] = PciReadConfigByte(adap->bus_number, adap->device_function, i); + } +#endif +#if EFI + status = adap->pci_io->Pci.Read(adap->pci_io, EfiPciIoWidthUint8, 0, + sizeof config, config); + if (EFI_ERROR(status)) + return 0; +#endif + + dumpMemoryWide(config, 256, "PCI Config Space"); + + return 1; +} + + +char *pageType[32] = +{ + "IO Unit", + "IOC", + "BIOS", + "SCSI Port", + "SCSI Device", + "FC Port", + "FC Device", + "LAN", + "RAID Volume", + "Manufacturing", + "RAID PhysDisk", + "Inband", + "Type 0Ch", + "Type 0Dh", + "Type 0Eh", + "Extended", + "SAS IO Unit", + "SAS Expander", + "SAS Device", + "SAS Phy", + "Log", + "Enclosure", + "Type 16h", + "Type 17h", + "Type 18h", + "Type 19h", + "Type 1Ah", + "Type 1Bh", + "Type 1Ch", + "Type 1Dh", + "Type 1Eh", + "Type 1Fh" +}; + + +int +doShowNonDefaultSettings(MPT_PORT *port) +{ + ConfigReply_t rep; + int type; + int number; + int attr; + U32 buf_def[255]; + U32 buf_cur[255]; + int len_def; + int len_cur; + int i; + int len; + + printf("Checking for non-default persistent settings...\n"); + + for (type = 0; type < 32; type++) + { + if (type == MPI_CONFIG_PAGETYPE_RAID_VOLUME || + type == MPI_CONFIG_PAGETYPE_MANUFACTURING || + type == MPI_CONFIG_PAGETYPE_RAID_PHYSDISK || + type == MPI_CONFIG_PAGETYPE_EXTENDED || + type == MPI_CONFIG_EXTPAGETYPE_LOG) + { + continue; + } + for (number = 0; number < 16; number++) + { + if (type == MPI_CONFIG_PAGETYPE_IO_UNIT && number == 2) + { + continue; + } + + if (type == MPI_CONFIG_PAGETYPE_IO_UNIT && number == 3) + { + continue; + } + + if (type == MPI_CONFIG_PAGETYPE_BIOS && number == 2) + { + continue; + } + + if (getConfigPageHeader(port, type, number, 0, &rep) != 1) + { + continue; + } + + attr = rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK; + if (attr != MPI_CONFIG_PAGEATTR_PERSISTENT) + { + continue; + } + + printf("\n%s Page %d is persistent\n", pageType[type], number); + + if (type == MPI_CONFIG_PAGETYPE_FC_PORT && number == 3) + { + doFcPersistentMappings(port, 1); + continue; + } + + if (type == MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE && number == 2) + { + if (mpi1) + doSasPersistentMappings(port, 1); + continue; + } + + memset(buf_def, 0, sizeof buf_def); + memset(buf_cur, 0, sizeof buf_cur); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_DEFAULT, + type, number, 0, buf_def, sizeof buf_def) != 1) + { + continue; + } + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_NVRAM, + type, number, 0, buf_cur, sizeof buf_cur) != 1) + { + continue; + } + + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + len_def = get16(((pConfigExtendedPageHeader_t)buf_def)->ExtPageLength); + len_cur = get16(((pConfigExtendedPageHeader_t)buf_cur)->ExtPageLength); + } + else + { + len_def = ((pConfigPageHeader_t)buf_def)->PageLength; + len_cur = ((pConfigPageHeader_t)buf_cur)->PageLength; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (type == MPI_CONFIG_PAGETYPE_IO_UNIT && number == 1) + { + IOUnitPage1_t *def_IOUnitPage1 = (pIOUnitPage1_t)buf_def; + int def_flags = get32(def_IOUnitPage1->Flags); + + // default for multi-pathing is ON from the factory, but OFF for older firmware + // flip it on, so the firmware default matches the factory default + def_IOUnitPage1->Flags = set32(def_flags | MPI_IOUNITPAGE1_MULTI_PATHING); + } + } + + len = max(len_def, len_cur); + + for (i = 0; i < len; i++) + { + if (buf_def[i] != buf_cur[i]) + { + printf("Mismatch at offset %04x: default = %08x, current = %08x\n", + i*4, get32x(buf_def[i]), get32x(buf_cur[i])); + } + } + } + } + + return 1; +} + + +int +doRestoreDefaultSettings(MPT_PORT *port) +{ + ConfigReply_t rep; + int type; + int number; + int attr; + U32 buf_def[255]; + U32 buf_cur[255]; + int len_def; + int len_cur; + int i; + int len; + + printf("Restoring default persistent settings...\n"); + + for (type = 0; type < 32; type++) + { + if (type == MPI_CONFIG_PAGETYPE_RAID_VOLUME || + type == MPI_CONFIG_PAGETYPE_MANUFACTURING || + type == MPI_CONFIG_PAGETYPE_RAID_PHYSDISK || + type == MPI_CONFIG_PAGETYPE_EXTENDED || + type == MPI_CONFIG_EXTPAGETYPE_LOG) + { + continue; + } + for (number = 0; number < 16; number++) + { + if (type == MPI_CONFIG_PAGETYPE_IO_UNIT && number == 2) + { + continue; + } + + if (type == MPI_CONFIG_PAGETYPE_IO_UNIT && number == 3) + { + continue; + } + + if (type == MPI_CONFIG_PAGETYPE_BIOS && number == 2) + { + continue; + } + + if (getConfigPageHeader(port, type, number, 0, &rep) != 1) + { + continue; + } + + attr = rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK; + if (attr != MPI_CONFIG_PAGEATTR_PERSISTENT) + { + continue; + } + + printf("\n%s Page %d is persistent\n", pageType[type], number); + + if (type == MPI_CONFIG_PAGETYPE_FC_PORT && number == 3) + { + if (yesFlag == FALSE) + { + printf("Do you want to remove all persistent mappings? [Yes or No, default is Yes] "); + } + + if (yesFlag == TRUE || getYesNoAnswer(1) == 1) + { + doFcPersistentMappings(port, 4); + } + continue; + } + + if (type == MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE && number == 2) + { + if (mpi2) + continue; + + if (yesFlag == FALSE) + { + printf("Do you want to remove all persistent mappings? [Yes or No, default is Yes] "); + } + + if (yesFlag == TRUE || getYesNoAnswer(1) == 1) + { + doSasPersistentMappings(port, 10); + } + continue; + } + + memset(buf_def, 0, sizeof buf_def); + memset(buf_cur, 0, sizeof buf_cur); + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_DEFAULT, + type, number, 0, buf_def, sizeof buf_def) != 1) + { + continue; + } + + if (getConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_READ_NVRAM, + type, number, 0, buf_cur, sizeof buf_cur) != 1) + { +// continue; + } + + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + len_def = get16(((pConfigExtendedPageHeader_t)buf_def)->ExtPageLength); + len_cur = get16(((pConfigExtendedPageHeader_t)buf_cur)->ExtPageLength); + } + else + { + len_def = ((pConfigPageHeader_t)buf_def)->PageLength; + len_cur = ((pConfigPageHeader_t)buf_cur)->PageLength; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (type == MPI_CONFIG_PAGETYPE_IO_UNIT && number == 1) + { + IOUnitPage1_t *def_IOUnitPage1 = (pIOUnitPage1_t)buf_def; + IOUnitPage1_t *cur_IOUnitPage1 = (pIOUnitPage1_t)buf_cur; + int def_flags = get32(def_IOUnitPage1->Flags); + int cur_flags = get32(cur_IOUnitPage1->Flags); + + if (!(def_flags & MPI_IOUNITPAGE1_MULTI_PATHING)) + { + // default for multi-pathing is ON from the factory, but OFF for older firmware + // flip it on, so the firmware default matches the factory default + def_IOUnitPage1->Flags = set32(def_flags | MPI_IOUNITPAGE1_MULTI_PATHING); + if (!(cur_flags & MPI_IOUNITPAGE1_MULTI_PATHING)) + printf("restoring factory default for MULTI_PATHING\n"); + } + } + } + + len = max(len_def, len_cur); + + for (i = 0; i < len; i++) + { + if (buf_def[i] != buf_cur[i]) + { + if (setConfigPageAction(port, MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM, + type, number, 0, buf_def, len_def * 4) == 1) + { + printf("Defaults restored\n"); + } + else + { + printf("Failed to restore defaults!\n"); + } + break; + } + } + } + } + + return 1; +} + + +int +doDefaultPhyRegsSettings(MPT_PORT *port) +{ + ManufacturingPage3_t *CurManufacturingPage3; + ManufacturingPage3_t *DefManufacturingPage3; + int length; + int t; + int i; + int j; + U32 *p_cur; + U32 *p_def; + + printf("Updating default PhyRegs settings...\n"); + + if (port->deviceId == MPI_MANUFACTPAGE_DEVICEID_FC909) + { + return 0; + } + + CurManufacturingPage3 = getConfigPageActionAlloc(port, MPI_CONFIG_ACTION_PAGE_READ_NVRAM, + MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, + &length); + if (CurManufacturingPage3 == NULL) + { + printf("Failed to read non-volatile ManufacturingPage3!\n"); + return 0; + } + + DefManufacturingPage3 = getConfigPageActionAlloc(port, MPI_CONFIG_ACTION_PAGE_READ_DEFAULT, + MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, + &length); + if (DefManufacturingPage3 == NULL) + { + printf("Failed to read default ManufacturingPage3!\n"); + free(CurManufacturingPage3); + return 0; + } + + for (i = 0; i < 2; i++) + { + p_cur = (U32 *)CurManufacturingPage3 + 2 + i * 8; + p_def = (U32 *)DefManufacturingPage3 + 2 + i * 8; + + // preserve current WWNs for both channels! + for (j = 0; j < 4; j++) + p_def[j] = p_cur[j]; + + // preserve supported speeds / link type / connector type + p_def[j+3] = p_cur[j+3]; + } + + + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + t = setConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, DefManufacturingPage3, length); + + doIocInit(port, port->whoInit); + + free(CurManufacturingPage3); + free(DefManufacturingPage3); + + if (t != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doFcChangePersonalWwn(MPT_PORT *port) +{ + FCPortPage1_t FCPortPage1; + ManufacturingPage3_t *ManufacturingPage3; + int length; + int t1; + int t2; + int flags; + U32 *p; + U32 wwnn_l; + U32 wwnn_h; + U32 wwpn_l; + U32 wwpn_h; + + ManufacturingPage3 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, &length); + if (ManufacturingPage3 == NULL) + return 0; + + p = (U32 *)ManufacturingPage3 + 2 + port->iocNumber * 8; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + wwnn_l = get32(FCPortPage1.NoSEEPROMWWNN.Low); + wwnn_h = get32(FCPortPage1.NoSEEPROMWWNN.High); + wwpn_l = get32(FCPortPage1.NoSEEPROMWWPN.Low); + wwpn_h = get32(FCPortPage1.NoSEEPROMWWPN.High); + + printf("Current Personal FC WWNN = %08x%08x, WWPN = %08x%08x\n\n", wwnn_h, wwnn_l, wwpn_h, wwpn_l); + + printf("Enter new WWNN: [16 hex digits or RETURN for none] "); + t1 = getHexDoubleNumberAnswer(&wwnn_h, &wwnn_l); + if (t1 == 0) + { + wwnn_l = get32x(p[2]); + wwnn_h = get32x(p[3]); + } + + printf("Enter new WWPN: [16 hex digits or RETURN for none] "); + t2 = getHexDoubleNumberAnswer(&wwpn_h, &wwpn_l); + if (t1 == 0) + { + wwpn_l = get32x(p[0]); + wwpn_h = get32x(p[1]); + } + + free(ManufacturingPage3); + + FCPortPage1.NoSEEPROMWWNN.Low = set32(wwnn_l); + FCPortPage1.NoSEEPROMWWNN.High = set32(wwnn_h); + FCPortPage1.NoSEEPROMWWPN.Low = set32(wwpn_l); + FCPortPage1.NoSEEPROMWWPN.High = set32(wwpn_h); + + flags = get32(FCPortPage1.Flags); + + if (t1 || t2) + flags |= MPI_FCPORTPAGE1_FLAGS_FORCE_USE_NOSEEPROM_WWNS; + else + flags &= ~MPI_FCPORTPAGE1_FLAGS_FORCE_USE_NOSEEPROM_WWNS; + + FCPortPage1.Flags = set32(flags); + + if (setConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, &FCPortPage1, sizeof FCPortPage1) != 1) + { + printf("Failed to save changes to NVRAM!\n"); + return 0; + } + + return 1; +} + + +int +doGIEL(MPT_PORT *port) +{ + FcCommonTransportSendRequest_t req; + FcCommonTransportSendReply_t rep; + U32 buf_out[256]; + U32 buf_in[256]; + int ioc_status; + U32 code; + int i; + + if (bringOnline(port) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(0xfffffa); + req.CTCommandCode = set16(0x0101); + req.FsType = 0xfa; + + memset(buf_out, 0, sizeof buf_out); + + buf_out[0] = set32x_be(0x01000000); + buf_out[1] = set32x_be(0xfa0101fc); + buf_out[2] = set32x_be(0x01010000); + buf_out[3] = set32x_be(0x00000000); + + buf_in[2] = 0; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, 16, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("CTSend failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + return 0; + } + + code = (get32x_be(buf_in[2]) >> 16) & 0xffff; + + if (code == 0x8001) + { + printf("GIEL rejected\n\n"); + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + return 0; + } + + if (code != 0x8002) + { + printf("GIEL not accepted, code is %04x\n\n", code); + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + return 0; + } + + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + } + + return 1; +} + + +int +doGID_FT(MPT_PORT *port) +{ + FcCommonTransportSendRequest_t req; + FcCommonTransportSendReply_t rep; + U32 buf_out[256]; + U32 buf_in[256]; + int ioc_status; + U32 code; + int i; + + if (bringOnline(port) != 1) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(0xfffffc); + req.CTCommandCode = set16(0x0171); + req.FsType = 0xfc; + + memset(buf_out, 0, sizeof buf_out); + + buf_out[0] = set32x_be(0x01000000); + buf_out[1] = set32x_be(0xfc020000); + buf_out[2] = set32x_be(0x017101fc); + buf_out[3] = set32x_be(0x00000000); + buf_out[4] = set32x_be(0x00000008); + + buf_in[2] = 0; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, 20, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("CTSend failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + return 0; + } + + code = (get32x_be(buf_in[2]) >> 16) & 0xffff; + + if (code == 0x8001) + { + printf("GID_FT rejected\n\n"); + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + return 0; + } + + if (code != 0x8002) + { + printf("GID_FT not accepted, code is %04x\n\n", code); + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + return 0; + } + + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + } + + return 1; +} + + +int +doGA_NXT(MPT_PORT *port) +{ + FcCommonTransportSendRequest_t req; + FcCommonTransportSendReply_t rep; + U32 buf_out[256]; + U32 buf_in[256]; + int ioc_status; + U32 code; + int i; + int d_id; + + if (bringOnline(port) != 1) + return 0; + + printf("Enter D_ID: [000000-FFFFFF or RETURN to quit] "); + d_id = getNumberAnswerHex(0x000000, 0xffffff, -1); + if (d_id < 0) + return 0; + + printf("\n"); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(0xfffffc); + req.CTCommandCode = set16(0x0100); + req.FsType = 0xfc; + + memset(buf_out, 0, sizeof buf_out); + + buf_out[0] = set32x_be(0x01000000); + buf_out[1] = set32x_be(0xfc020000); + buf_out[2] = set32x_be(0x010001fc); + buf_out[3] = set32x_be(0x00000000); + buf_out[4] = set32x_be(d_id); + + buf_in[2] = 0; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, 20, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("CTSend failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + return 0; + } + + code = (get32x_be(buf_in[2]) >> 16) & 0xffff; + + if (code == 0x8001) + { + printf("GA_NXT rejected\n\n"); + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + return 0; + } + + if (code != 0x8002) + { + printf("GA_NXT not accepted, code is %04x\n\n", code); + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + return 0; + } + + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + } + + return 1; +} + + +int +doExLinkServiceSend(MPT_PORT *port) +{ + ExLinkServiceSendRequest_t req; + ExLinkServiceSendReply_t rep; + U32 buf_out[256]; + U32 buf_in[256]; + int els; + int d_id; + int len; + U32 value; + int i; + int j; + int ioc_status; + U32 code; + int passes; + int delay; + + if (bringOnline(port) != 1) + return 0; + + printf("Enter ELS code: [00-FF or RETURN to quit] "); + els = getNumberAnswerHex(0x00, 0xff, -1); + if (els < 0) + return 0; + + printf("Enter D_ID: [000000-FFFFFF or RETURN to quit] "); + d_id = getNumberAnswerHex(0x000000, 0xffffff, -1); + if (d_id < 0) + return 0; + + printf("Enter payload length in words: [1-256 or RETURN to quit] "); + len = getNumberAnswer(0, 256, -1); + if (len < 0) + return 0; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_EX_LINK_SRVC_SEND; + req.AliasIndex = virtInit; + req.MsgFlags_Did = set32(d_id); + req.ElsCommandCode = set32(els); + + memset(buf_out, 0, sizeof buf_out); + + buf_out[0] = set32x(els); + + if (len > 1) + { + while (TRUE) + { + printf("\n"); + for (i = 0; i < len; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_out[i])); + + printf("\nEnter word to change: [0-%d or RETURN to quit] ", len - 1); + i = getNumberAnswer(0, len - 1, -1); + if (i < 0) + break; + + printf("Enter value: [00000000-FFFFFFFF or RETURN to not change] "); + if (getHexNumberAnswer(&value) == 0) + continue; + + if (i == 0) + buf_out[0] = set32x_be((value & 0xffffff) | (els << 24)); + else + buf_out[i] = set32x_be(value); + } + } + + printf("\nNumber of iterations: [1-1000000, default is 1] "); + passes = getNumberAnswer(1, 1000000, 1); + if (passes > 1) + { + printf("Delay in seconds between iterations: [1-6000, default is 30] "); + delay = getNumberAnswer(1, 6000, 30); + } + else + delay = 0; + + for (j = 1; j <= passes; j++) + { + if (passes > 1) + { + if (j > 1) + sleep(delay); + printf("\nPass %d...\n", j); + } + + printf("\n"); + + buf_in[0] = 0; + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in, buf_out, len * 4, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("SendELS failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); +#if WIN32 + continue; +#else + return 0; +#endif + } + + code = (get32x_be(buf_in[0]) >> 24) & 0xff; + + if (code == 0x01) + { + printf("ELS rejected\n"); +#if WIN32 + continue; +#else + return 0; +#endif + } + + if (code != 0x02) + { + printf("ELS not accepted, code is %02x\n", code); +#if WIN32 + continue; +#else + return 0; +#endif + } + + for (i = 0; i < (int)get32(rep.ResponseLength) / 4; i++) + printf("Word %04d = %08x\n", i, get32x_be(buf_in[i])); + } + } + + return 1; +} + + +int +doResetFcLink(MPT_PORT *port, int flag) +{ + FcPrimitiveSendRequest_t req; + FcPrimitiveSendReply_t rep; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FC_PRIMITIVE_SEND; + if (flag) + req.SendFlags = MPI_FC_PRIM_SEND_FLAGS_ML_RESET_LINK; + else + req.SendFlags = MPI_FC_PRIM_SEND_FLAGS_RESET_LINK; + + printf("Resetting FC link...\n"); + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doScsiCdb(MPT_PORT *port) +{ + SCSIIORequest_t req1; + Mpi2SCSIIORequest_t req2; + Mpi25SCSIIORequest_t req25; + SCSI_REPLY rep1; + SCSI_REPLY2 rep2; + void *req; + int req_size; + void *rep; + int rep_size; + int bus; + int target; + int lun; + unsigned char cdb[80]; + unsigned char buf_out[512]; + unsigned char buf_in[1024]; + int len_out; + int len_in; + int value; + int i; + int j; + int t; + int n; + int ioc_status; + char c[17]; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("LUN: [0-%d or RETURN to quit] ", port->maxLuns - 1); + lun = getNumberAnswer(0, port->maxLuns - 1, -1); + if (lun < 0) + return 1; + + printf("CDB: [hex string or RETURN to quit] "); + n = getStringFromArgs((char *)cdb, sizeof cdb, stdin); + switch (n) + { + case 6*2: + case 10*2: + case 12*2: + case 16*2: + break; + + default: + printf("CDB must be 6, 10, 12, or 16 bytes (12, 20, 24, or 32 characters)\n"); + return 0; + } + + for (i = 0; i < n; i++) + { + j = cdb[i]; + + if (isdigit(j)) + { + cdb[i] = j - '0'; + } + else if (isxdigit(j)) + { + cdb[i] = tolower(j) - 'a' + 10; + } + else + { + printf("invalid hex digit %c at offset %d\n", j, i); + return 0; + } + } + + printf("\nEnter input data length in bytes: [0-1024 or RETURN to quit] "); + len_in = getNumberAnswer(0, 1024, -1); + if (len_in < 0) + return 0; + + if (len_in) + len_out = 0; + else + { + printf("Enter output data length in bytes: [0-1024 or RETURN to quit] "); + len_out = getNumberAnswer(0, 1024, -1); + if (len_out < 0) + return 0; + } + + t = tagType; + if (len_in) + t |= MPI_SCSIIO_CONTROL_READ; + if (len_out) + t |= MPI_SCSIIO_CONTROL_WRITE; + + memset(&req1, 0, sizeof req1); + memset(&rep1, 0, sizeof rep1); + + req1.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req1.AliasIndex = virtInit; + req1.LUN[1] = lun; + req1.Control = set32(t); + req1.DataLength = set32(len_in + len_out); + + for (i = 0, j = 0; j < n; i++, j += 2) + req1.CDB[i] = (cdb[j] << 4) + cdb[j+1]; + + req1.CDBLength = i; + + setName(port, bus, target, &req1); + + if (mpi20) + { + memset(&req2, 0, sizeof req2); + memset(&rep2, 0, sizeof rep2); + + // convert from MPI 1.x format to MPI 2.x format + req2.Function = req1.Function; + req2.DevHandle = ((pMpi2SCSIIORequest_t)&req1)->DevHandle; + req2.Control = req1.Control; + req2.IoFlags = set16(req1.CDBLength); + req2.DataLength = req1.DataLength; + + memcpy(req2.LUN, req1.LUN, sizeof req1.LUN); + memcpy(req2.CDB.CDB32, req1.CDB, sizeof req1.CDB); + + req2.SGLOffset0 = offsetof(Mpi2SCSIIORequest_t, SGL) / 4; + + req = &req2; + req_size = sizeof req2 - sizeof req2.SGL; + rep = &rep2; + rep_size = sizeof rep2; + } + else if (mpi25) + { + memset(&req25, 0, sizeof req25); + memset(&rep2, 0, sizeof rep2); + + // convert from MPI 1.x format to MPI 2.5 format + req25.Function = req1.Function; + req25.DevHandle = ((pMpi25SCSIIORequest_t)&req1)->DevHandle; + req25.Control = req1.Control; + req25.IoFlags = set16(req1.CDBLength); + req25.DataLength = req1.DataLength; + + memcpy(req25.LUN, req1.LUN, sizeof req1.LUN); + memcpy(req25.CDB.CDB32, req1.CDB, sizeof req1.CDB); + + req25.SGLOffset0 = offsetof(Mpi25SCSIIORequest_t, SGL) / 4; + + req = &req25; + req_size = sizeof req25 - sizeof req25.SGL; + rep = &rep2; + rep_size = sizeof rep2; + } + else + { + req = &req1; + req_size = sizeof req1 - sizeof req1.SGL; + rep = &rep1; + rep_size = sizeof rep1; + } + + memset(buf_out, 0, sizeof buf_out); + + if (len_out) + { + while (TRUE) + { + for (i = 0; i < len_out; i++) + { + if ((i % 16) == 0) + printf("\n%3d : ", i); + + printf("%02x ", buf_out[i]); + } + printf("\n"); + + printf("\nEnter byte to change: [0-%d or RETURN to quit] ", len_out - 1); + i = getNumberAnswer(0, len_out - 1, -1); + if (i < 0) + break; + + printf("Enter value: [00-FF or RETURN to not change] "); + value = getNumberAnswerHex(0x00, 0xff, -1); + if (value < 0) + continue; + + buf_out[i] = (unsigned char)value; + } + } + + memset(buf_in, 0, sizeof buf_in); + + if (doMptCommand(port, req, req_size, rep, rep_size, + buf_in, len_in, buf_out, len_out, SHORT_TIME) == 1) + { + if (mpi2) + { + memcpy(&rep1.reply, &rep2.reply, sizeof rep1.reply); + memcpy(&rep1.sense, &rep2.sense, sizeof rep1.sense); + } + + printf("\n"); + + ioc_status = get16(rep1.reply.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + } + + t = rep1.reply.SCSIStatus; + if (t != MPI_SCSI_STATUS_SUCCESS) + { + if (t == MPI_SCSI_STATUS_CHECK_CONDITION) + { + printf("Check Condition, Key = %d, ASC/ASCQ = %02Xh/%02Xh\n", + rep1.sense[2] & 0x0f, rep1.sense[12], rep1.sense[13]); + t = get32(rep1.reply.SenseCount); + printf("%d bytes of Sense Data returned\n", t); + + printf("\n"); + + for (i = 0, j = 0; i < t; i++, j++) + { + if (j == 0) + printf("%3d : ", i); + + printf("%02x ", rep1.sense[i]); + + if (!isprint(rep1.sense[i])) + c[j] = ' '; + else + c[j] = rep1.sense[i]; + + if (j == sizeof c - 2) + { + c[j+1] = 0; + printf(" %s\n", c); + j = -1; + } + } + + if (j != 0) + { + c[j] = 0; + for (i = j; i < sizeof c - 1; i++) + printf(" "); + + printf(" %s\n", c); + } + } + else + printf("SCSIStatus = %02x\n", t); + + printf("\n"); + } + + if (ioc_status == MPI_IOCSTATUS_SUCCESS && rep1.reply.SCSIStatus == MPI_SCSI_STATUS_SUCCESS) + t = len_in + len_out; + else + t = get32(rep1.reply.TransferCount); + printf("%d bytes of data transferred\n", t); + + if (len_in && t) + { + printf("\n"); + + for (i = 0, j = 0; i < t; i++, j++) + { + if (j == 0) + printf("%3d : ", i); + + printf("%02x ", buf_in[i]); + + if (!isprint(buf_in[i])) + c[j] = ' '; + else + c[j] = buf_in[i]; + + if (j == sizeof c - 2) + { + c[j+1] = 0; + printf(" %s\n", c); + j = -1; + } + } + + if (j != 0) + { + c[j] = 0; + for (i = j; i < sizeof c - 1; i++) + printf(" "); + + printf(" %s\n", c); + } + } + } + + return 1; +} + + +int +doSataPassthroughSend(MPT_PORT *port) +{ + SataPassthroughRequest_t req; + SataPassthroughReply_t rep; + int bus; + int target; + int feature; + int count; + int lbah; + int lbam; + int lbal; + int device; + int command; + unsigned short buf_out[512]; + unsigned char buf_in[1024]; + int len_out; + int len_in; + int value; + int i; + int j; + int t; + int ioc_status; + char c[21]; + + if (bringOnline(port) != 1) + return 0; + + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 1; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 1; + + printf("\n"); + + if (!isSata(port, bus, target)) + { + printf("Can't do SATA Request Send, device is not SATA!\n"); + return 1; + } + + printf("ATA Word 00 Feature: [0000-FFFF or RETURN to quit] "); + feature = getNumberAnswerHex(0x0000, 0xffff, -1); + if (feature < 0) + return 0; + + printf("ATA Word 01 Count: [0000-FFFF or RETURN to quit] "); + count = getNumberAnswerHex(0x0000, 0xffff, -1); + if (count < 0) + return 0; + + printf("ATA Word 02 LBA H: [0000-FFFF or RETURN to quit] "); + lbah = getNumberAnswerHex(0x0000, 0xffff, -1); + if (lbah < 0) + return 0; + + printf("ATA Word 03 LBA M: [0000-FFFF or RETURN to quit] "); + lbam = getNumberAnswerHex(0x0000, 0xffff, -1); + if (lbam < 0) + return 0; + + printf("ATA Word 04 LBA L: [0000-FFFF or RETURN to quit] "); + lbal = getNumberAnswerHex(0x0000, 0xffff, -1); + if (lbal < 0) + return 0; + + printf("ATA Word 05 Device: [00-FF or RETURN to quit] "); + device = getNumberAnswerHex(0x0000, 0xffff, -1); + if (device < 0) + return 0; + + printf("ATA Word 05 Command: [00-FF or RETURN to quit] "); + command = getNumberAnswerHex(0x0000, 0xffff, -1); + if (command < 0) + return 0; + + printf("\nEnter input data length in words: [0-512 or RETURN to quit] "); + len_in = getNumberAnswer(0, 512, -1); + if (len_in < 0) + return 0; + + if (len_in) + len_out = 0; + else + { + printf("Enter output data length in words: [0-512 or RETURN to quit] "); + len_out = getNumberAnswer(0, 512, -1); + if (len_out < 0) + return 0; + } + + t = 0; + if (len_in) + t |= MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_READ; + if (len_out) + t |= MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_WRITE; + + printf("SATA PassThrough Flags: [0000-FFFF, default is %04x] ", t); + t = getNumberAnswerHex(0x0000, 0xffff, t); + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SATA_PASSTHROUGH; + req.PassthroughFlags = set16(t); + req.DataLength = set32((len_in + len_out) * 2); + req.CommandFIS[0] = 0x27; + req.CommandFIS[1] = 0x80; + req.CommandFIS[2] = (U8)command; + req.CommandFIS[3] = (U8)feature; + req.CommandFIS[4] = (U8)lbal; + req.CommandFIS[5] = (U8)lbam; + req.CommandFIS[6] = (U8)lbah; + req.CommandFIS[7] = (U8)device; + req.CommandFIS[8] = (U8)(lbal >> 8); + req.CommandFIS[9] = (U8)(lbam >> 8); + req.CommandFIS[10] = (U8)(lbah >> 8); + req.CommandFIS[11] = (U8)(feature >> 8); + req.CommandFIS[12] = (U8)count; + req.CommandFIS[13] = (U8)(count >> 8); + + setName(port, bus, target, &req); + + memset(buf_out, 0, sizeof buf_out); + + if (len_out) + { + while (TRUE) + { + for (i = 0; i < len_out; i++) + { + if ((i % 10) == 0) + printf("\n%3d : ", i / 2); + + printf("%04x ", get16x(buf_out[i])); + } + printf("\n"); + + printf("\nEnter word to change: [0-%d or RETURN to quit] ", len_out - 1); + i = getNumberAnswer(0, len_out - 1, -1); + if (i < 0) + break; + + printf("Enter value: [0000-FFFF or RETURN to not change] "); + value = getNumberAnswerHex(0x0000, 0xffff, -1); + if (value < 0) + continue; + + buf_out[i] = (unsigned short)set16x(value); + } + } + + memset(buf_in, 0, sizeof buf_in); + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, len_in * 2, buf_out, len_out * 2, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("\nSATAPassthrough failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + + dumpMemory(&req, sizeof req - sizeof req.SGL, "MPT Request"); + dumpMemory(&rep, sizeof rep, "MPT Reply"); + + return 0; + } + + printf("\n"); + + t = get32(rep.StatusControlRegisters); + if (t) + { + printf("StatusControlRegisters = %04x\n\n", t); + } + + t = 0; + for (i = 0; i < sizeof rep.StatusFIS; i++) + t += rep.StatusFIS[i]; + + if (t) + { + printf("ATA Word 00 Error: 00%02x\n", rep.StatusFIS[3]); + printf("ATA Word 01 Count: %02x%02x\n", rep.StatusFIS[13], rep.StatusFIS[12]); + printf("ATA Word 02 LBA H: %02x%02x\n", rep.StatusFIS[10], rep.StatusFIS[6]); + printf("ATA Word 03 LBA M: %02x%02x\n", rep.StatusFIS[9], rep.StatusFIS[5]); + printf("ATA Word 04 LBA L: %02x%02x\n", rep.StatusFIS[8], rep.StatusFIS[4]); + printf("ATA Word 05 Device: %02x \n", rep.StatusFIS[7]); + printf("ATA Word 05 Status: %02x\n\n", rep.StatusFIS[2]); + } + + t = get32(rep.TransferCount); + printf("%d words of data transferred\n", t / 2); + + if (len_in) + { + printf("\n"); + + for (i = 0, j = 0; i < t; i++, j++) + { + if (j == 0) + printf("%3d : ", i / 2); + + if (i & 1) + printf("%02x ", buf_in[i^1]); + else + printf("%02x", buf_in[i^1]); + + if (!isprint(buf_in[i^1])) + c[j] = ' '; + else + c[j] = buf_in[i^1]; + + if (j == sizeof c - 2) + { + c[j+1] = 0; + printf(" %s\n", c); + j = -1; + } + } + + if (j != 0) + { + c[j] = 0; + for (i = j; i < sizeof c - 1; i++) + if (i & 1) + printf(" "); + else + printf(" "); + + printf(" %s\n", c); + } + } + } + + return 1; +} + + +int +doSmpPassthroughSend(MPT_PORT *port) +{ + SmpPassthroughRequest_t req; + SmpPassthroughReply_t rep; + SasExpanderPage0_t SASExpanderPage0; + unsigned char buf_out[1032]; + unsigned char buf_in[1032]; + int smp; + int handle; + int len; + int value; + int i; + int j; + int t; + int ioc_status; + U32 result; + U32 wwid_l; + U32 wwid_h; + _U64 sas_address; + U8 physical_port; + + if (bringOnline(port) != 1) + return 0; + + printf("Enter SMP function code: [00-FF or RETURN to quit] "); + smp = getNumberAnswerHex(0x00, 0xff, -1); + if (smp < 0) + return 0; + + printf("Enter handle: [0000-FFFF or RETURN to quit] "); + handle = getNumberAnswerHex(0x0000, 0xffff, -1); + if (handle < 0) + return 0; + + if (handle == 0) + { + printf("Enter SASAddress: [16 hex digits or RETURN to quit] "); + t = getHexDoubleNumberAnswer(&wwid_h, &wwid_l); + if (t == 0) + return 0; + + printf("Enter port: [0 to %d or RETURN to leave unspecified] ", port->numPhys - 1); + physical_port = (U8)getNumberAnswer(0, port->numPhys - 1, 255); + sas_address.Low = set32(wwid_l); + sas_address.High = set32(wwid_h); + } + else + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE + < 1) + { + while (TRUE) + { + printf("\n"); + for (i = 0; i < len; i++) + printf("Byte %04d = %02x\n", i, buf_out[i]); + + printf("\nEnter byte to change: [2-%d or RETURN to quit] ", len - 5); + i = getNumberAnswer(2, len - 5, -1); + if (i < 0) + break; + + printf("Enter value: [00-FF or RETURN to not change] "); + value = getNumberAnswerHex(0x00, 0xff, -1); + if (value < 0) + continue; + + buf_out[i] = (unsigned char)value; + } + } + + printf("\n"); + + memset(buf_in, 0, sizeof buf_in); + + if (doMptCommand(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf_in, sizeof buf_in - 4, buf_out, len - 4, SHORT_TIME) == 1) + { + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("SMPPassthrough failed, IOCStatus = %04x (%s), SASStatus = %02x, IOCLogInfo = %08x\n", + ioc_status, translateIocStatus(ioc_status), rep.SASStatus, get32(rep.IOCLogInfo)); + return 0; + } + + result = buf_in[2]; + + if (result != 0x00) + { + printf("SMP request not accepted, result is %02x (%s)\n", result, translateSmpFunctionResult(result)); + return 0; + } + + len = get16(rep.ResponseDataLength) + 4; + + /* zero anything that might be in the CRC bytes as the real CRC is not passed back */ + memset(buf_in + len - 4, 0, 4); + + printf("SMP request was accepted, and returned %d response bytes\n\n", len); + + for (i = 0, j = 0; i < len; i++, j++) + { + if (j == 0) + printf("%04x : ", i); + + printf("%02x ", buf_in[i]); + + if (j == 15) + { + printf("\n"); + j = -1; + } + } + + if (j != 0) + { + printf("\n"); + } + } + + return 1; +} + + +int +doResetSasLink(MPT_PORT *port, int flag) +{ + SasDevicePage0_t SASDevicePage0; + SasExpanderPage0_t SASExpanderPage0; + SasIoUnitControlRequest_t req; + SasIoUnitControlReply_t rep; + int handle; + int phy; + int min_phy; + int max_phy; + int dev_info; + int dev_type; + unsigned char phy_control_req[40]; + unsigned char phy_control_rsp[4]; + + printf("Enter handle: [0000-FFFF or RETURN to quit] "); + handle = getNumberAnswerHex(0x0000, 0xffff, -1); + if (handle < 0) + return 0; + + if (handle == 0) + { + min_phy = 0; + max_phy = port->numPhys - 1; + } + else + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, + (MPI_SAS_DEVICE_PGAD_FORM_HANDLE + <MsgLength * 4, "IOCFactsReply"); + + if (getPortFacts2(port, (pMpi2PortFactsReply_t)buf) == 1) + dumpMemory(buf, ((pMpi2PortFactsReply_t)buf)->MsgLength * 4, "PortFactsReply"); + } + else + { + if (getIocFacts(port, (pIOCFactsReply_t)buf) == 1) + dumpMemory(buf, ((pIOCFactsReply_t)buf)->MsgLength * 4, "IOCFactsReply"); + + if (getPortFacts(port, (pPortFactsReply_t)buf) == 1) + dumpMemory(buf, ((pPortFactsReply_t)buf)->MsgLength * 4, "PortFactsReply"); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 1, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 2, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage2", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 3, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage3", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 4, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage4", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 5, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage5", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 6, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage6", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 7, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage7", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 8, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage8", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 9, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage9", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 10, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage10", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 11, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage11", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 12, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage12", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 13, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage13", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 14, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage14", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 15, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage15", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 16, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage16", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 241, 0, buf, len) == 1) + { + showConfigPage(port, "ManufacturingPage241", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 0, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 1, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 2, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage2", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 3, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage3", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 4, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage4", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 5, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage5", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 6, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage6", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 7, 0, buf, len) == 1) + { + showConfigPage(port, "IOUnitPage7", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 0, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 2, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage2", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 3, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage3", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 4, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage4", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 5, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage5", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 6, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage6", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 7, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage7", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 8, 0, buf, len) == 1) + { + showConfigPage(port, "IOCPage8", buf, len); + } + + if (port->mptVersion >= MPI_VERSION_01_02) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_BIOS, 1, 0, buf, len) == 1) + { + showConfigPage(port, "BIOSPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_BIOS, 2, 0, buf, len) == 1) + { + showConfigPage(port, "BIOSPage2", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_BIOS, 3, 0, buf, len) == 1) + { + showConfigPage(port, "BIOSPage3", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_BIOS, 4, 0, buf, len) == 1) + { + showConfigPage(port, "BIOSPage4", buf, len); + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 0, 0, buf, len) == 1) + { + showConfigPage(port, "SCSIPortPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0, buf, len) == 1) + { + showConfigPage(port, "SCSIPortPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0, buf, len) == 1) + { + showConfigPage(port, "SCSIPortPage2", buf, len); + } + + for (i = 0; i < 16; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_DEVICE, 0, i, buf, len) == 1) + { + sprintf(name, "SCSIDevicePage0 / %d", i); + showConfigPage(port, name, buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_DEVICE, 1, i, buf, len) == 1) + { + sprintf(name, "SCSIDevicePage1 / %d", i); + showConfigPage(port, name, buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_DEVICE, 2, i, buf, len) == 1) + { + sprintf(name, "SCSIDevicePage2 / %d", i); + showConfigPage(port, name, buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_DEVICE, 3, i, buf, len) == 1) + { + sprintf(name, "SCSIDevicePage3 / %d", i); + showConfigPage(port, name, buf, len); + } + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 2, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage2", buf, len); + } + + if (port->maxPersistentIds * (int)sizeof(PersistentData_t) + (int)sizeof(ConfigPageHeader_t) > len) + { + for (i = 0; i < port->maxPersistentIds; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 3, + MPI_FC_PORT_PGAD_FORM_INDEX + i, buf, len) == 1) + { + if (get16(((pFCPortPage3_t)buf)->Entry->Flags) & MPI_PERSISTENT_FLAGS_ENTRY_VALID) + { + sprintf(name, "FCPortPage3 / %d", i); + showConfigPage(port, name, buf, len); + } + } + } + } + else + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 3, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage3", buf, len); + } + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 4, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage4", buf, len); + } + + for (i = 1; i <= 255; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 5, + MPI_FC_PORT_PGAD_FORM_INDEX + i, buf, len) == 1) + { + if (((pFCPortPage5_t)buf)->AliasInfo.Flags != 0) + { + sprintf(name, "FCPortPage5 / %d", i); + showConfigPage(port, name, buf, len); + } + } + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 6, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage6", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 7, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage7", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 8, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage8", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 9, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage9", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 10, 0, buf, len) == 1) + { + showConfigPage(port, "FCPortPage10", buf, len); + } + + i = 0xffffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, i, buf, len) == 1) + { + i = get32(((pFCDevicePage0_t)buf)->PortIdentifier); + sprintf(name, "FCDevicePage0 / %06x", i); + showConfigPage(port, name, buf, len); + } + else + break; + } + } + + if (mpi1 && getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 2, 0, temp_buf, len) == 1) + { + IOCPage2 = (pIOCPage2_t)temp_buf; + + for (i = 0; i < IOCPage2->MaxVolumes; i++) + { + b = IOCPage2->RaidVolume[i].VolumeBus; + t = IOCPage2->RaidVolume[i].VolumeID; + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 0, (b << 8) + t, buf, len) == 1) + { + sprintf(name, "RAIDVolumePage0 / %d,%d", b, t); + showConfigPage(port, name, buf, len); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_VOLUME, 1, i, buf, len) == 1) + { + sprintf(name, "RAIDVolumePage1 / %d,%d", b, t); + showConfigPage(port, name, buf, len); + } + } + } + + for (i = 0; i < IOCPage2->MaxPhysDisks; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, i, buf, len) == 1) + { + sprintf(name, "RAIDPhysDiskPage0 / %d", i); + showConfigPage(port, name, buf, len); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_RAID_PHYSDISK, 1, i, buf, len) == 1) + { + sprintf(name, "RAIDPhysDiskPage1 / %d", i); + showConfigPage(port, name, buf, len); + } + } + } + } + + if (mpi2 && port->capabilities & MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) + { + i = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_VOLUME, 0, + MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE + i, buf, len) == 1) + { + i = get16(((pMpi2RaidVolPage0_t)buf)->DevHandle); + sprintf(name, "RAIDVolumePage0 / %04x", i); + showConfigPage(port, name, buf, len); + } + else + break; + } + + i = 0xff; + while (TRUE) + { + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK, 0, + MPI2_PHYSDISK_PGAD_FORM_GET_NEXT_PHYSDISKNUM + i, buf, len) == 1) + { + i = ((pMpi2RaidPhysDiskPage0_t)buf)->PhysDiskNum; + sprintf(name, "RAIDPhysDiskPage0 / %d", i); + showConfigPage(port, name, buf, len); + } + else + break; + } + + i = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG, 0, + MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM + i, buf, len) == 1) + { + i = ((pMpi2RaidConfigurationPage0_t)buf)->ConfigNum; + sprintf(name, "RAIDConfigurationPage0 / %d", i); + showConfigPage(port, name, buf, len); + } + else + break; + } + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_LAN, 0, 0, buf, len) == 1) + { + showConfigPage(port, "LANPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_LAN, 1, 0, buf, len) == 1) + { + showConfigPage(port, "LANPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_INBAND, 0, 0, buf, len) == 1) + { + showConfigPage(port, "InbandPage0", buf, len); + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage0", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage1", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 2, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage2", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 3, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage3", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 4, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage4", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 5, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage5", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 6, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage6", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 7, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage7", buf, len); + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 8, 0, buf, len) == 1) + { + showConfigPage(port, "SASIOUnitPage8", buf, len); + } + + i = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, i, buf, len) == 1) + { + i = get16(((pSasExpanderPage0_t)buf)->DevHandle); + sprintf(name, "SASExpanderPage0 / %04x", i); + showConfigPage(port, name, buf, len); + + n = ((pSasExpanderPage0_t)buf)->NumPhys; + for (j = 0; j < n; j++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 1, + (MPI_SAS_EXPAND_PGAD_FORM_HANDLE_PHY_NUM + <PortNumber; + sprintf(name, "SASPortPage0 / %02x", i); + showConfigPage(port, name, buf, len); + } + else + break; + } + } + + i = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, i, buf, len) == 1) + { + i = get16(((pSasDevicePage0_t)buf)->DevHandle); + sprintf(name, "SASDevicePage0 / %04x", i); + showConfigPage(port, name, buf, len); + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 1, + (MPI_SAS_DEVICE_PGAD_FORM_HANDLE + <maxBuses << 8) + port->maxTargets; i++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 2, + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <PhysicalIdentifier.High != 0 || + ((pSasDevicePage2_t)buf)->PhysicalIdentifier.Low != 0) + { + sprintf(name, "SASDevicePage2 / %d,%d", i >> 8, i & 255); + showConfigPage(port, name, buf, len); + } + } + } + } + + for (i = 0; i < 256; i++) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 0, i, buf, len) == 1) + { + sprintf(name, "SASPhyPage0 / %02x", i); + showConfigPage(port, name, buf, len); + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 1, i, buf, len) == 1) + { + sprintf(name, "SASPhyPage1 / %02x", i); + showConfigPage(port, name, buf, len); + } + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 2, i, buf, len) == 1) + { + sprintf(name, "SASPhyPage2 / %02x", i); + showConfigPage(port, name, buf, len); + } + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 3, i, buf, len) == 1) + { + sprintf(name, "SASPhyPage3 / %02x", i); + showConfigPage(port, name, buf, len); + } + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_PHY, 4, i, buf, len) == 1) + { + sprintf(name, "SASPhyPage4 / %02x", i); + showConfigPage(port, name, buf, len); + } + } + else + break; + } + + i = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_ENCLOSURE, 0, i, buf, len) == 1) + { + i = get16(((pSasEnclosurePage0_t)buf)->EnclosureHandle); + sprintf(name, "SASEnclosurePage0 / %04x", i); + showConfigPage(port, name, buf, len); + } + else + break; + } + } + + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_LOG, 0, 0, buf, len) == 1) + { + showConfigPage(port, "LogPage0", buf, len); + } + + if (mpi2) + { + for (i = 0; i < port->maxPersistentIds; i++) + { + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING, 0, + (1<Entry.PhysicalIdentifier.High != 0 || + ((pMpi2DriverMappingPage0_t)buf)->Entry.PhysicalIdentifier.Low != 0) + { + sprintf(name, "DriverMappingPage0 / %04x", i); + showConfigPage(port, name, buf, len); + } + } + } + } + + if (mpi2) + { + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_ETHERNET, 0, 0, buf, len) == 1) + { + numInterfaces = ((pMpi2EthernetPage0_t)buf)->NumInterfaces; + for (i = 0; i < numInterfaces; i++) + { + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_ETHERNET, 0, i, buf, len) == 1) + { + sprintf(name, "EthernetPage0 / %02x", i); + showConfigPage(port, name, buf, len); + } + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_ETHERNET, 1, i, buf, len) == 1) + { + sprintf(name, "EthernetPage1 / %02x", i); + showConfigPage(port, name, buf, len); + } + } + } + } + + free(buf); + free(temp_buf); + + return 1; +} + + +int +doPortStateSummary(MPT_PORT *port) +{ + char *temp; + FCPortPage0_t FCPortPage0; + FCPortPage1_t FCPortPage1; + int flags; + int t; + IOCPage1_t IOCPage1; + int timeout; + int depth; + int on; + IOUnitPage1_t IOUnitPage1; + SCSIPortPage2_t SCSIPortPage2; + int settings; + int id; + SasIOUnitPage0_t SASIOUnitPage0; + SasIOUnitPage1_t *SASIOUnitPage1; + Mpi2SasIOUnitPage1_t *SASIOUnitPage1_2; + SasIOUnitPage2_t SASIOUnitPage2; + int length; + int i; + ManufacturingPage5_t *ManufacturingPage5; + Mpi2ManufacturingPage5_t *ManufacturingPage5_2; + int num_phys; + + printf("Current Port State\n------------------\n"); + showPortInfoHeader(port); + + printf("Software Version Information\n----------------------------\n"); + doIdentify(port); + + printf("\nFirmware Settings\n-----------------\n"); + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, + &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + printf("FC WWNN: %08x%08x\n", + get32(FCPortPage0.WWNN.High), + get32(FCPortPage0.WWNN.Low)); + + printf("FC WWPN: %08x%08x\n", + get32(FCPortPage0.WWPN.High), + get32(FCPortPage0.WWPN.Low)); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0, + &FCPortPage1, sizeof FCPortPage1) != 1) + return 0; + + t = FCPortPage1.TopologyConfig & MPI_FCPORTPAGE1_TOPOLOGY_MASK; + switch (t) + { + case MPI_FCPORTPAGE1_TOPOLOGY_AUTO: temp = "Auto"; break; + case MPI_FCPORTPAGE1_TOPOLOGY_NLPORT: temp = "NL_Port"; break; + case MPI_FCPORTPAGE1_TOPOLOGY_NPORT: temp = "N_Port"; break; + default: temp = "Unknown"; break; + } + printf("Link Topology: %s\n", temp); + + if (port->mptVersion < MPI_VERSION_01_01) + temp = "1 Gb"; + else + { + t = FCPortPage1.LinkConfig & MPI_FCPORTPAGE1_LCONFIG_SPEED_MASK; + switch (t) + { + case MPI_FCPORTPAGE1_LCONFIG_SPEED_AUTO: temp = "Auto"; break; + case MPI_FCPORTPAGE1_LCONFIG_SPEED_1GIG: temp = "1 Gb"; break; + case MPI_FCPORTPAGE1_LCONFIG_SPEED_2GIG: temp = "2 Gb"; break; + case MPI_FCPORTPAGE1_LCONFIG_SPEED_4GIG: temp = "4 Gb"; break; + case MPI_FCPORTPAGE1_LCONFIG_SPEED_10GIG: temp = "10 Gb"; break; + default: temp = "Unknown"; break; + } + } + printf("Link Speed: %s\n", temp); + + flags = get32(FCPortPage1.Flags); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT) != 0; + printf("FCP Initiator protocol: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG) != 0; + printf("FCP Target protocol: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_PROT_LAN) != 0; + printf("LAN protocol: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_SORT_BY_DID) != 0; + printf("Assignment of Bus/Target IDs: %s\n", t == 0 ? "SortByWWN" : "SortByDID"); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY) != 0; + printf("Immediate Error Reply: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_FCPORTPAGE1_FLAGS_MAINTAIN_LOGINS) != 0; + printf("Maintain Logins: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = FCPortPage1.HardALPA; + printf("Hard AL_PA: %02x\n", t); + + t = FCPortPage1.InitiatorDeviceTimeout; + if (t == 0) + t = 60; + printf("Initiator Device Timeout: %d\n", t); + + t = FCPortPage1.InitiatorIoPendTimeout; + if (t == 0) + t = 8; + printf("Initiator I/O Pending Timeout: %d\n", t); + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 1, 0, + &IOUnitPage1, sizeof IOUnitPage1) != 1) + return 0; + + flags = get32(IOUnitPage1.Flags); + + t = (flags & MPI_IOUNITPAGE1_MULTI_PATHING) != 0; + printf("Multi-pathing: %s\n", t == 0 ? "Disabled" : "Enabled"); + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0, + &SCSIPortPage2, sizeof SCSIPortPage2) != 1) + return 0; + + flags = get32(SCSIPortPage2.PortFlags); + settings = get32(SCSIPortPage2.PortSettings); + + id = settings & MPI_SCSIPORTPAGE2_PORT_HOST_ID_MASK; + printf("Host SCSI ID: %d\n", id); + + t = (flags & MPI_SCSIPORTPAGE2_PORT_FLAGS_SCAN_HIGH_TO_LOW) != 0; + printf("Bus scan order: %s\n", t == 0 ? "LowToHigh" : "HighToLow"); + + t = (flags & MPI_SCSIPORTPAGE2_PORT_FLAGS_AVOID_SCSI_RESET) != 0; + printf("Avoid SCSI bus reset: %s\n", t == 0 ? "No" : "Yes"); + + t = (flags & MPI_SCSIPORTPAGE2_PORT_FLAGS_ALTERNATE_CHS) != 0; + printf("CHS mapping: %s\n", t == 0 ? "PlugAndPlay" : "AlternateCHS"); + + t = (settings & MPI_SCSIPORTPAGE2_PORT_REMOVABLE_MEDIA) >> 6; + switch (t) + { + case 0: temp = "None"; break; + case 1: temp = "BootDrive"; break; + case 2: temp = "AnyWithMedia"; break; + default: temp = "Unknown"; break; + } + printf("Removable media support: %s\n", temp); + + t = (settings & MPI_SCSIPORTPAGE2_PORT_SPINUP_DELAY_MASK) >> 8; + printf("Spinup delay (in seconds): %d\n", t); + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + ManufacturingPage5 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 5, 0, &length); + if (ManufacturingPage5 == NULL) + return 0; + + ManufacturingPage5_2 = (pMpi2ManufacturingPage5_t)ManufacturingPage5; + if (mpi2) + { + printf("SAS WWID: %08x%08x\n", + get32(ManufacturingPage5_2->Phy[0].WWID.High), + get32(ManufacturingPage5_2->Phy[0].WWID.Low)); + } + else + { + printf("SAS WWID: %08x%08x\n", + get32(ManufacturingPage5->BaseWWID.High), + get32(ManufacturingPage5->BaseWWID.Low)); + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IO_UNIT, 1, 0, + &IOUnitPage1, sizeof IOUnitPage1) != 1) + return 0; + + flags = get32(IOUnitPage1.Flags); + + t = (flags & MPI_IOUNITPAGE1_MULTI_PATHING) != 0; + printf("Multi-pathing: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_IOUNITPAGE1_NATIVE_COMMAND_Q_DISABLE) == 0; + printf("SATA Native Command Queuing: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_IOUNITPAGE1_SATA_WRITE_CACHE_DISABLE) == 0; + printf("SATA Write Caching: %s\n", t == 0 ? "Disabled" : "Enabled"); + + SASIOUnitPage1 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0, &length); + if (SASIOUnitPage1 == NULL) + return 0; + + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, + &SASIOUnitPage0, sizeof SASIOUnitPage0) == 1) + num_phys = SASIOUnitPage0.NumPhys; + else + num_phys = SASIOUnitPage1->NumPhys; + + t = SASIOUnitPage1->SATAMaxQDepth; + printf("SATA Maximum Queue Depth: %d\n", t); + + if (mpi2) + { + SASIOUnitPage1_2 = (pMpi2SasIOUnitPage1_t)SASIOUnitPage1; + + t = get16(SASIOUnitPage1_2->SASNarrowMaxQueueDepth); + printf("SAS Max Queue Depth, Narrow: %d\n", t); + + t = get16(SASIOUnitPage1_2->SASWideMaxQueueDepth); + printf("SAS Max Queue Depth, Wide: %d\n", t); + } + + t = SASIOUnitPage1->ReportDeviceMissingDelay; + if (t & MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) + t = (t & ~MPI_SAS_IOUNIT1_REPORT_MISSING_UNIT_16) * 16; + printf("Device Missing Report Delay: %d seconds\n", t); + + t = SASIOUnitPage1->IODeviceMissingDelay; + printf("Device Missing I/O Delay: %d seconds\n", t); + + printf("Phy Parameters for Phynum: "); + for (i = 0; i < num_phys; i++) + printf("%-5d", i); + printf("\n"); + + printf(" Link Enabled: "); + for (i = 0; i < num_phys; i++) + { + if (mpi2) + t = SASIOUnitPage1->PhyData[i].PhyFlags & MPI2_SASIOUNIT1_PHYFLAGS_PHY_DISABLE; + else + t = SASIOUnitPage1->PhyData[i].PhyFlags & MPI_SAS_IOUNIT1_PHY_FLAGS_PHY_DISABLE; + printf("%-5s", t ? "No" : "Yes"); + } + printf("\n"); + + printf(" Link Min Rate: "); + for (i = 0; i < num_phys; i++) + { + t = SASIOUnitPage1->PhyData[i].MaxMinLinkRate & MPI_SAS_IOUNIT1_MIN_RATE_MASK; + printf("%-5s", + t == MPI25_SASIOUNIT1_MIN_RATE_12_0 ? "12.0" : + t == MPI2_SASIOUNIT1_MIN_RATE_6_0 ? "6.0" : + t == MPI_SAS_IOUNIT1_MIN_RATE_3_0 ? "3.0" : "1.5"); + } + printf("\n"); + + printf(" Link Max Rate: "); + for (i = 0; i < num_phys; i++) + { + t = SASIOUnitPage1->PhyData[i].MaxMinLinkRate & MPI_SAS_IOUNIT1_MAX_RATE_MASK; + printf("%-5s", + t == MPI25_SASIOUNIT1_MAX_RATE_12_0 ? "12.0" : + t == MPI2_SASIOUNIT1_MAX_RATE_6_0 ? "6.0" : + t == MPI_SAS_IOUNIT1_MAX_RATE_3_0 ? "3.0" : "1.5"); + } + printf("\n"); + + printf(" SSP Initiator Enabled: "); + for (i = 0; i < num_phys; i++) + { + t = get32(SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo) & MPI_SAS_DEVICE_INFO_SSP_INITIATOR; + printf("%-5s", t ? "Yes" : "No"); + } + printf("\n"); + + printf(" SSP Target Enabled: "); + for (i = 0; i < num_phys; i++) + { + t = get32(SASIOUnitPage1->PhyData[i].ControllerPhyDeviceInfo) & MPI_SAS_DEVICE_INFO_SSP_TARGET; + printf("%-5s", t ? "Yes" : "No"); + } + printf("\n"); + printf(" Port Configuration: "); + for (i = 0; i < num_phys; i++) + { + if (SASIOUnitPage1->PhyData[i].PortFlags & MPI_SAS_IOUNIT1_PORT_FLAGS_AUTO_PORT_CONFIG) + printf("%-5s", "Auto"); + else + printf("%-5d", SASIOUnitPage1->PhyData[i].Port); + } + printf("\n"); + + free(SASIOUnitPage1); + + if (mpi1) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 2, 0, + &SASIOUnitPage2, sizeof SASIOUnitPage2) != 1) + return 0; + + flags = SASIOUnitPage2.Flags; + + printf("Target IDs per enclosure: %d\n", SASIOUnitPage2.NumDevsPerEnclosure); + + t = (flags & MPI_SAS_IOUNIT2_FLAGS_DISABLE_PERSISTENT_MAPPINGS) == 0; + printf("Persistent mapping: %s\n", t == 0 ? "Disabled" : "Enabled"); + + t = (flags & MPI_SAS_IOUNIT2_FLAGS_MASK_PHYS_MAP_MODE) >> MPI_SAS_IOUNIT2_FLAGS_SHIFT_PHYS_MAP_MODE; + printf("Physical mapping type: %s\n", + t == MPI_SAS_IOUNIT2_FLAGS_NO_PHYS_MAP ? "None" : + t == MPI_SAS_IOUNIT2_FLAGS_DIRECT_ATTACH_PHYS_MAP ? "Direct Attach" : + t == MPI_SAS_IOUNIT2_FLAGS_ENCLOSURE_SLOT_PHYS_MAP ? "Enclosure/Slot" : + t == MPI_SAS_IOUNIT2_FLAGS_HOST_ASSIGNED_PHYS_MAP ? "Host Assigned" : + "Unknown"); + + t = (flags & MPI_SAS_IOUNIT2_FLAGS_RESERVE_ID_0_FOR_BOOT) != 0; + printf("Target ID 0 reserved for boot: %s\n", t == 0 ? "No" : "Yes"); + + t = (flags & MPI_SAS_IOUNIT2_FLAGS_DA_STARTING_SLOT) != 0; + printf("Starting slot (direct attach): %s\n", t == 0 ? "0" : "1"); + + printf("Target IDs (physical mapping): %d\n", get16(SASIOUnitPage2.MaxNumPhysicalMappedIDs)); + } + } + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 1, 0, &IOCPage1, sizeof IOCPage1) != 1) + return 0; + + flags = get32(IOCPage1.Flags) & MPI_IOCPAGE1_REPLY_COALESCING; + timeout = get32(IOCPage1.CoalescingTimeout); + depth = IOCPage1.CoalescingDepth; + + on = flags != 0 && timeout != 0 && depth != 0; + if (on) + printf("Interrupt Coalescing: Enabled, timeout is %d us, depth is %d\n", + timeout, depth); + else + printf("Interrupt Coalescing: Disabled\n"); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + printf("\nPersistent Mappings\n-------------------\n"); + doFcPersistentMappings(port, 1); + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS && mpi1) + { + printf("\nPersistent Mappings\n-------------------\n"); + doSasPersistentMappings(port, 1); + } + + return 1; +} + + +int +getChipName(MPT_PORT *port) +{ + char *string; + char *chipName; + char *chipNameRev; + int family; + int revision; + char *type; + int i; + U32 seqcodeversion = 0; + + family = port->productId & MPI_FW_HEADER_PID_FAMILY_MASK; + revision = port->revisionId; + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVICEID_FC909: + string = "FC909 B1"; + type = "PCI"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC919: + string = "FC919 B0"; + type = "PCI"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC929: + string = "FC929 B0"; + type = "PCI"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC919X: + if (revision < 0x80) + string = "FC919X A0"; + else + string = "FC919XL A1"; + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC929X: + if (revision < 0x80) + string = "FC929X A0"; + else + string = "FC929XL A1"; + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC939X: + string = "FC939X A1"; + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC949X: + string = "FC949X A1"; + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVICEID_FC949E: + switch (revision) + { + case 0x00: + string = "FC949E A0"; + break; + case 0x01: + string = "FC949E A1"; + break; + case 0x02: + string = "FC949E A2"; + break; + default: + string = "FC949E xx"; + break; + } + type = "PCI-E"; + break; + case MPI_MANUFACTPAGE_DEVID_53C1030: + switch (revision) + { + case 0x00: + string = "53C1030 A0"; + break; + case 0x01: + string = "53C1030 B0"; + break; + case 0x03: + string = "53C1030 B1"; + break; + case 0x07: + string = "53C1030 B2"; + break; + case 0x08: + string = "53C1030 C0"; + break; + case 0x80: + string = "53C1030T A0"; + break; + case 0x83: + string = "53C1030T A2"; + break; + case 0x87: + string = "53C1030T A3"; + break; + case 0xc1: + string = "53C1020A A1"; + break; + default: + string = "53C1030 xx"; + break; + } + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVID_1030_53C1035: + switch (revision) + { + case 0x03: + string = "53C1035 A2"; + break; + case 0x04: + string = "53C1035 B0"; + break; + default: + string = "53C1035 xx"; + break; + } + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1064: + switch (revision) + { + case 0x00: + string = "SAS1064 A1"; seqcodeversion = 0x1064a1; + break; + case 0x01: + string = "SAS1064 A2"; seqcodeversion = 0x1064a2; + break; + case 0x02: + string = "SAS1064 A3"; seqcodeversion = 0x1064a3; + break; + case 0x03: + string = "SAS1064 A4"; seqcodeversion = 0x1064a4; + break; + default: + string = "SAS1064 xx"; seqcodeversion = 0x1064ff; + break; + } + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1064E: + switch (revision) + { + case 0x00: + string = "SAS1064E A0"; seqcodeversion = 0x106ea0; + break; + case 0x01: + string = "SAS1064E B0"; seqcodeversion = 0x106eb0; + break; + case 0x02: + string = "SAS1064E B1"; seqcodeversion = 0x106eb1; + break; + case 0x04: + string = "SAS1064E B2"; seqcodeversion = 0x106eb2; + break; + case 0x08: + string = "SAS1064E B3"; seqcodeversion = 0x106eb3; + break; + case 0x10: + string = "SAS1064E C0"; seqcodeversion = 0x106ec0; + break; + default: + string = "SAS1064E xx"; seqcodeversion = 0x106eff; + break; + } + type = "PCI-E"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1066: + string = "SAS1066 xx"; + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1066E: + string = "SAS1066E xx"; + type = "PCI-E"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1068: + switch (revision) + { + case 0x00: + string = "SAS1068 A0"; seqcodeversion = 0x1068a0; + break; + case 0x01: + string = "SAS1068 B0"; seqcodeversion = 0x1068b0; + break; + case 0x02: + string = "SAS1068 B1"; seqcodeversion = 0x1068b1; + break; + default: + string = "SAS1068 xx"; seqcodeversion = 0x1068ff; + break; + } + type = "PCI-X"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1068E: + switch (revision) + { + case 0x00: + string = "SAS1068E A0"; seqcodeversion = 0x106ea0; + break; + case 0x01: + string = "SAS1068E B0"; seqcodeversion = 0x106eb0; + break; + case 0x02: + string = "SAS1068E B1"; seqcodeversion = 0x106eb1; + break; + case 0x04: + string = "SAS1068E B2"; seqcodeversion = 0x106eb2; + break; + case 0x08: + string = "SAS1068E B3"; seqcodeversion = 0x106eb3; + break; + case 0x10: + string = "SAS1068E C0"; seqcodeversion = 0x106ec0; + break; + default: + string = "SAS1068E xx"; seqcodeversion = 0x106eff; + break; + } + type = "PCI-E"; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1078: + switch (revision) + { + case 0x00: + string = "SAS1078 A0"; seqcodeversion = 0x1078a0; + break; + case 0x01: + string = "SAS1078 B0"; seqcodeversion = 0x1078b0; + break; + case 0x02: + string = "SAS1078 C0"; seqcodeversion = 0x1078c0; + break; + case 0x03: + string = "SAS1078 C1"; seqcodeversion = 0x1078c1; + break; + case 0x04: + string = "SAS1078 C2"; seqcodeversion = 0x1078c2; + break; + default: + string = "SAS1078 xx"; seqcodeversion = 0x1078ff; + break; + } + type = "PCI-E"; + break; + case MPI2_MFGPAGE_DEVID_SAS2004: + switch (revision) + { + case 0x00: + string = "SAS2004 A0"; + break; + case 0x01: + string = "SAS2004 B0"; + break; + case 0x02: + string = "SAS2004 B1"; + break; + case 0x03: + string = "SAS2004 B2"; + break; + default: + string = "SAS2004 xx"; + break; + } + type = "PCI-E"; + break; + case MPI2_MFGPAGE_DEVID_SAS2008: + switch (revision) + { + case 0x00: + string = "SAS2008 A0"; + break; + case 0x01: + string = "SAS2008 B0"; + break; + case 0x02: + string = "SAS2008 B1"; + break; + case 0x03: + string = "SAS2008 B2"; + break; + default: + string = "SAS2008 xx"; + break; + } + type = "PCI-E"; + break; + case MPI2_MFGPAGE_DEVID_SAS2108_1: + case MPI2_MFGPAGE_DEVID_SAS2108_2: + case MPI2_MFGPAGE_DEVID_SAS2108_3: + switch (revision) + { + case 0x00: + string = "SAS2108 A0"; + break; + case 0xFF: + string = "SAS2 FPGA A0"; + break; + /* the PCI Revision ID was not bumped between B0 and B1. Since B0 is not supported + * and had limited use (pre-production only), don't worry about identifying it. + * NOTE: PCI config space will always report a 1 for B0 or B1. The firmware + * (IOCPage0->RevisionID) is supposed to report a 1 for B0 and a 2 for B1 but it does not + * always do so. Therefore we consider either a 1 or 2 to be a B1 chip. + */ + case 0x01: + case 0x02: + string = "SAS2108 B1"; + break; + case 0x03: + string = "SAS2108 B2"; + break; + case 0x04: + string = "SAS2108 B3"; + break; + case 0x05: + string = "SAS2108 B4"; + break; + default: + string = "SAS2108 xx"; + break; + } + type = "PCI-E"; + break; + case MPI2_MFGPAGE_DEVID_SAS2116_1: + case MPI2_MFGPAGE_DEVID_SAS2116_2: + switch (revision) + { + case 0x00: + string = "SAS2116 A0"; + break; + case 0x01: + string = "SAS2116 B0"; + break; + case 0x02: + string = "SAS2116 B1"; + break; + default: + string = "SAS2116 xx"; + break; + } + type = "PCI-E"; + break; + case MPI2_MFGPAGE_DEVID_SAS2208_1: + case MPI2_MFGPAGE_DEVID_SAS2208_2: + case MPI2_MFGPAGE_DEVID_SAS2208_3: + case MPI2_MFGPAGE_DEVID_SAS2208_4: + case MPI2_MFGPAGE_DEVID_SAS2208_5: + case MPI2_MFGPAGE_DEVID_SAS2208_6: + switch (revision) + { + case 0x00: + string = "SAS2208 A0"; + break; + case 0x01: + string = "SAS2208 B0"; + break; + case 0x02: + string = "SAS2208 C0"; + break; + case 0x03: + string = "SAS2208 C1"; + break; + case 0x04: + string = "SAS2208 D0"; + break; + case 0x05: + string = "SAS2208 D1"; + break; + default: + string = "SAS2208 xx"; + break; + } + type = "PCI-E"; + break; + case MPI2_MFGPAGE_DEVID_SAS2308_1: + case MPI2_MFGPAGE_DEVID_SAS2308_2: + case MPI2_MFGPAGE_DEVID_SAS2308_3: + switch (revision) + { + case 0x00: + string = "SAS2308 A0"; + break; + case 0x01: + string = "SAS2308 B0"; + break; + case 0x02: + string = "SAS2308 C0"; + break; + case 0x03: + string = "SAS2308 C1"; + break; + case 0x04: + string = "SAS2308 D0"; + break; + case 0x05: + string = "SAS2308 D1"; + break; + default: + string = "SAS2308 xx"; + break; + } + type = "PCI-E"; + break; + case MPI25_MFGPAGE_DEVID_SAS3004: + switch (revision) + { + case 0x00: + string = "SA3004 A0"; + break; + case 0x01: + string = "SAS3004 B0"; + break; + case 0x02: + string = "SAS3004 C0"; + break; + default: + string = "SAS3004 xx"; + break; + } + type = "PCI-E"; + break; + case MPI25_MFGPAGE_DEVID_SAS3008: + switch (revision) + { + case 0x00: + string = "SA3008 A0"; + break; + case 0x01: + string = "SAS3008 B0"; + break; + case 0x02: + string = "SAS3008 C0"; + break; + default: + string = "SAS3008 xx"; + break; + } + type = "PCI-E"; + break; + case MPI25_MFGPAGE_DEVID_SAS3108_1: + case MPI25_MFGPAGE_DEVID_SAS3108_2: + case MPI25_MFGPAGE_DEVID_SAS3108_5: + case MPI25_MFGPAGE_DEVID_SAS3108_6: + switch (revision) + { + case 0x00: + string = "SAS3108 A0"; + break; + case 0x01: + string = "SAS3108 B0"; + break; + case 0x02: + string = "SAS3108 C0"; + break; + default: + string = "SAS3108 xx"; + break; + } + type = "PCI-E"; + break; +#ifdef SAS3108_FPGA_WORKAROUND + case 0x100: + case 0x092: + string = "SAS3108 FPGA"; + type = "PCI-E"; + break; +#endif + case MPI2_MFGPAGE_DEVID_SSS6200: + switch (revision) + { + case 0x00: + string = "SSS6200 A0"; + break; + case 0x01: + string = "SSS6200 B0"; + break; + case 0x02: + string = "SSS6200 C0"; + break; + default: + string = "SSS6200 xx"; + break; + } + type = "PCI-E"; + break; + default: + string = "xxxx xx"; + type = NULL; + break; + } + + port->seqCodeVersion = seqcodeversion; + + chipNameRev = malloc(strlen(string) + 1); + strcpy(chipNameRev, string); + + i = (int)strlen(chipNameRev) - 2; + + if (strncmp(chipNameRev + 0, "xxxx", 4) == 0) + sprintf(chipNameRev + 0, "%04x %02x", port->deviceId, port->revisionId); + else if (strncmp(chipNameRev + i, "xx", 2) == 0) + sprintf(chipNameRev + i, "%02x", port->revisionId); + + port->chipNameRev = chipNameRev; + + chipName = malloc(strlen(chipNameRev) + 1); + strcpy(chipName, chipNameRev); + + i = (int)strlen(chipNameRev) - 3; + chipName[i] = '\0'; + + port->chipName = chipName; + + port->pciType = type; + + return 1; +} + + +int +getPortInfo(MPT_PORT *port) +{ + IOCFactsReply_t IOCFacts; + PortFactsReply_t PortFacts; +#if !DOS && !EFI + IOCPage0_t IOCPage0; +#endif + SasIOUnitPage0_t SASIOUnitPage0; + + if (checkOperational(port, 0) != 1) + return 1; + + port->lastEvent = -1; + + port->payOff = 0; + + if (getIocFacts(port, &IOCFacts) != 1) + return 0; + +// dumpMemoryWide(&IOCFacts, sizeof IOCFacts, "IOCFactsReply"); + + port->mptVersion = get16(IOCFacts.MsgVersion); + + if (mpi2) + return getPortInfo2(port); + + port->iocNumber = IOCFacts.IOCNumber; + port->whoInit = IOCFacts.WhoInit; + port->productId = get16(IOCFacts.ProductID); + port->capabilities = get32(IOCFacts.IOCCapabilities); + port->flags = IOCFacts.Flags; + port->fwImageSize = get32(IOCFacts.FWImageSize); + port->payOff = get16(IOCFacts.CurReplyFrameSize); + port->maxBuses = IOCFacts.MaxBuses; + if (port->maxBuses == 0) + port->maxBuses = 1; + port->minTargets = 0; + port->maxTargets = IOCFacts.MaxDevices; + if (port->maxTargets == 0) + port->maxTargets = 255; /* Linux limit! */ + port->maxLuns = maxLuns; + + if (port->mptVersion < MPI_VERSION_01_02) + port->fwVersion = get16(IOCFacts.Reserved_0101_FWVersion); + else + port->fwVersion = get32(IOCFacts.FWVersion.Word); + + if (port->mptVersion < MPI_VERSION_01_02 && + port->productId == MPI_MANUFACTPAGE_DEVICEID_FC909) + port->productId = MPI_FW_HEADER_PID_FAMILY_909_FC | + MPI_FW_HEADER_PID_TYPE_FC; + + port->pidType = port->productId & MPI_FW_HEADER_PID_TYPE_MASK; + + if (getPortFacts(port, &PortFacts) != 1) + return 0; + +// dumpMemoryWide(&PortFacts, sizeof PortFacts, "PortFactsReply"); + + port->portType = PortFacts.PortType; + port->maxPersistentIds = get16(PortFacts.MaxPersistentIDs); + port->hostScsiId = get16(PortFacts.PortSCSIID); + port->protocolFlags = get16(PortFacts.ProtocolFlags); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (port->maxTargets > port->hostScsiId + 1) + port->maxTargets = port->hostScsiId + 1; + } + else + { + if (port->maxTargets > get16(PortFacts.MaxDevices)) + port->maxTargets = get16(PortFacts.MaxDevices); + } + +#if !DOS && !EFI + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_IOC, 0, 0, &IOCPage0, sizeof IOCPage0) != 1) + return 0; + + if (get16(IOCPage0.VendorID) != MPI_MANUFACTPAGE_VENDORID_LSILOGIC) + return 0; + + port->deviceIdRaw = get16(IOCPage0.DeviceID); + + /* the following three want to be set to the device ID that doesnt include ZC*/ + if ( (port->deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1030ZC) || + (port->deviceIdRaw == MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035) || + (port->deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1035ZC)) + { + port->deviceId = port->deviceIdRaw & ~1; + } + else + { + port->deviceId = port->deviceIdRaw; + } + + port->revisionId = IOCPage0.RevisionID; + + getChipName(port); +#endif + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, + &SASIOUnitPage0, sizeof SASIOUnitPage0) == 1) + { + port->numPhys = SASIOUnitPage0.NumPhys; + } + else + { + switch (port->deviceId) + { + case MPI_MANUFACTPAGE_DEVID_SAS1064: + case MPI_MANUFACTPAGE_DEVID_SAS1064E: + port->numPhys = 4; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1066: + case MPI_MANUFACTPAGE_DEVID_SAS1066E: + port->numPhys = 6; + break; + case MPI_MANUFACTPAGE_DEVID_SAS1068: + case MPI_MANUFACTPAGE_DEVID_SAS1068E: + case MPI_MANUFACTPAGE_DEVID_SAS1078: + port->numPhys = 8; + break; + } + } + } + + return 1; +} + + +int +getPortInfo2(MPT_PORT *port) +{ + Mpi2IOCFactsReply_t IOCFacts; + Mpi2PortFactsReply_t PortFacts; +#if !DOS && !EFI + Mpi2IOCPage0_t IOCPage0; +#endif + Mpi2SasIOUnitPage0_t SASIOUnitPage0; + + if (getIocFacts2(port, &IOCFacts) != 1) + return 0; + +// dumpMemoryWide(&IOCFacts, sizeof IOCFacts, "IOCFactsReply"); + + port->iocNumber = IOCFacts.IOCNumber; + port->whoInit = IOCFacts.WhoInit; + port->productId = get16(IOCFacts.ProductID); + port->capabilities = get32(IOCFacts.IOCCapabilities); + + // ReplyFrameSize moved within IOCFacts and went from + // indicating the number of bytes to indicating the + // number of dwords. Maintain backward compatibility + if (mpi25) + { + port->payOff = IOCFacts.ReplyFrameSize * 4; + } + else if (IOCFacts.OldReplyFrameSize) + { + port->payOff = get16(IOCFacts.OldReplyFrameSize); + } + else + { + port->payOff = IOCFacts.ReplyFrameSize * 4; + } + + port->maxDevHandle = get16(IOCFacts.MaxDevHandle) + 1; + + setMaxBusTarget(port); + + port->maxLuns = maxLuns; + port->protocolFlags = get16(IOCFacts.ProtocolFlags); + port->maxPersistentIds = get16(IOCFacts.MaxPersistentEntries); + + port->fwVersion = get32(IOCFacts.FWVersion.Word); + + port->fastpathCapable = port->capabilities & MPI25_IOCFACTS_CAPABILITY_FAST_PATH_CAPABLE ? 1 : 0; + + port->pidType = port->productId & MPI2_FW_HEADER_PID_TYPE_MASK; + + if (getPortFacts2(port, &PortFacts) != 1) + return 0; + +// dumpMemoryWide(&PortFacts, sizeof PortFacts, "PortFactsReply"); + + port->portType = PortFacts.PortType; + +#if !DOS && !EFI + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_IOC, 0, 0, &IOCPage0, sizeof IOCPage0) != 1) + return 0; + +#if SAS3108_FPGA_WORKAROUND + if (get16(IOCPage0.VendorID) != MPI2_MFGPAGE_VENDORID_LSI && get16(IOCPage0.VendorID) != SAS3108_FPGA_VENDORID) + return 0; +#else + if (get16(IOCPage0.VendorID) != MPI2_MFGPAGE_VENDORID_LSI) + return 0; +#endif + port->deviceIdRaw = get16(IOCPage0.DeviceID); + /* the following three want to be set to the device ID that doesnt include ZC*/ + if ( (port->deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1030ZC) || + (port->deviceIdRaw == MPI_MANUFACTPAGE_DEVID_1030ZC_53C1035) || + (port->deviceIdRaw == MPI_MANUFACTPAGE_DEVID_53C1035ZC)) + { + port->deviceId = port->deviceIdRaw & ~1; + } + else + { + port->deviceId = port->deviceIdRaw; + } + port->revisionId = IOCPage0.RevisionID; + + getChipName(port); +#endif + + if (port->pidType == MPI2_FW_HEADER_PID_TYPE_SAS) + { + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, + &SASIOUnitPage0, sizeof SASIOUnitPage0) == 1) + { + port->numPhys = SASIOUnitPage0.NumPhys; + } + else + { + switch (port->deviceId) + { + case MPI2_MFGPAGE_DEVID_SAS2004: + case MPI25_MFGPAGE_DEVID_SAS3004: + port->numPhys = 4; + break; + case MPI2_MFGPAGE_DEVID_SAS2008: + case MPI2_MFGPAGE_DEVID_SAS2108_1: + case MPI2_MFGPAGE_DEVID_SAS2108_2: + case MPI2_MFGPAGE_DEVID_SAS2108_3: + case MPI2_MFGPAGE_DEVID_SAS2208_1: + case MPI2_MFGPAGE_DEVID_SAS2208_2: + case MPI2_MFGPAGE_DEVID_SAS2208_3: + case MPI2_MFGPAGE_DEVID_SAS2208_4: + case MPI2_MFGPAGE_DEVID_SAS2208_5: + case MPI2_MFGPAGE_DEVID_SAS2208_6: + case MPI2_MFGPAGE_DEVID_SAS2308_1: + case MPI2_MFGPAGE_DEVID_SAS2308_2: + case MPI2_MFGPAGE_DEVID_SAS2308_3: + case MPI25_MFGPAGE_DEVID_SAS3008: + case MPI25_MFGPAGE_DEVID_SAS3108_1: + case MPI25_MFGPAGE_DEVID_SAS3108_2: + case MPI25_MFGPAGE_DEVID_SAS3108_5: + case MPI25_MFGPAGE_DEVID_SAS3108_6: + case MPI2_MFGPAGE_DEVID_SSS6200: + port->numPhys = 8; + break; + case MPI2_MFGPAGE_DEVID_SAS2116_1: + case MPI2_MFGPAGE_DEVID_SAS2116_2: + port->numPhys = 16; + break; + } + } + } + + return 1; +} + + +int +updatePortInfo(MPT_PORT *port) +{ + IOCFactsReply_t IOCFacts; + PortFactsReply_t PortFacts; + + if (port->mptVersion == 0) + return getPortInfo(port); + + if (getIocFacts(port, &IOCFacts) != 1) + return 0; + + port->mptVersion = get16(IOCFacts.MsgVersion); + + if (mpi2) + return updatePortInfo2(port); + + if (port->mptVersion < MPI_VERSION_01_02) + port->fwVersion = get16(IOCFacts.Reserved_0101_FWVersion); + else + port->fwVersion = get32(IOCFacts.FWVersion.Word); + port->capabilities = get32(IOCFacts.IOCCapabilities); + + if (port->portType == MPI_PORTFACTS_PORTTYPE_INACTIVE) + { + if (getPortFacts(port, &PortFacts) != 1) + return 0; + + port->portType = PortFacts.PortType; + port->maxPersistentIds = get16(PortFacts.MaxPersistentIDs); + port->hostScsiId = get16(PortFacts.PortSCSIID); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (port->maxTargets > port->hostScsiId + 1) + port->maxTargets = port->hostScsiId + 1; + } + else + { + if (port->maxTargets > get16(PortFacts.MaxDevices)) + port->maxTargets = get16(PortFacts.MaxDevices); + } + } + + return 1; +} + + +int +updatePortInfo2(MPT_PORT *port) +{ + Mpi2IOCFactsReply_t IOCFacts; + Mpi2PortFactsReply_t PortFacts; + + if (getIocFacts2(port, &IOCFacts) != 1) + return 0; + + port->fwVersion = get32(IOCFacts.FWVersion.Word); + port->capabilities = get32(IOCFacts.IOCCapabilities); + + port->maxDevHandle = get16(IOCFacts.MaxDevHandle) + 1; + + setMaxBusTarget(port); + + port->maxPersistentIds = get16(IOCFacts.MaxPersistentEntries); + + if (port->portType == MPI_PORTFACTS_PORTTYPE_INACTIVE) + { + if (getPortFacts2(port, &PortFacts) != 1) + return 0; + + port->portType = PortFacts.PortType; + } + + return 1; +} + + +int +getBoardInfo(MPT_PORT *port) +{ + int segment = 0; + int bus = 0; + int device = 0; + int function = 0; +#if WIN32 + int status; + DRVR_INFO_SRB srb; + int inLen; + int outLen; + DWORD retLen; +#endif +#if __linux__ + int status; + struct mpt_ioctl_iocinfo iocinfo; +#endif +#if __sparc__ + SYMHI_DMI_DATA dmiData; + mptsas_pci_info_t pciInfo; + int status; + U32 reg[64]; +#endif +#if DOS || EFI + HANDLE adap = port->fileHandle; +#endif + + if (port->pciSegment != 0 || port->pciBus != 0 || port->pciDevice != 0 || port->pciFunction != 0) + return 1; + +#if WIN32 + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = DRVR_INFO_IOCTL; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb.Sic.Signature, "4.00 ", 8); + + srb.PageCode = ADAPTER_INFO_PAGE; + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + if (status != 1) + return 0; + + if (retLen >= sizeof srb) + segment = srb.AdapterPageOut.PciSegmentId; + else + segment = srb.AdapterPageOut.PciInfo.u.bits.BusNumber >> 8; + bus = srb.AdapterPageOut.PciInfo.u.bits.BusNumber & 0xff; + device = srb.AdapterPageOut.PciInfo.u.bits.DeviceNumber; + function = srb.AdapterPageOut.PciInfo.u.bits.FunctionNumber; +#endif +#if __linux__ + memset(&iocinfo, 0, sizeof iocinfo); + + iocinfo.hdr.maxDataSize = sizeof iocinfo; + + iocinfo.hdr.iocnum = port->portNumber; + + if (mpi2) + status = ioctl(port->fileHandle, MPT2IOCINFO, &iocinfo); + else + status = ioctl(port->fileHandle, MPTIOCINFO, &iocinfo); + + if (status != 0) + return 0; + + segment = iocinfo.pciInfo.segmentID; + bus = iocinfo.pciInfo.u.bits.busNumber; + device = iocinfo.pciInfo.u.bits.deviceNumber; + function = iocinfo.pciInfo.u.bits.functionNumber; +#endif +#if __sparc__ + if (mpi2) + { + memset(&pciInfo, 0, sizeof pciInfo); + status = ioctl(port->fileHandle, MPTIOCTL_GET_PCI_INFO, &pciInfo); + if (status == 0) + { + bus = pciInfo.BusNumber; + device = pciInfo.DeviceNumber; + function = pciInfo.FunctionNumber; + } + else + return 0; + } + else + { + memset(&dmiData, 0, sizeof dmiData); + dmiData.StructureLength = sizeof dmiData; + status = ioctl(port->fileHandle, SYMIOCTL_GET_DMI_DATA, &dmiData); + + if (status == 0) + { + bus = dmiData.PciBusNumber; + device = dmiData.PciDeviceNumber; + function = dmiData.PciFunctionNumber; + } + else + { + memset(reg, 0, sizeof reg); + + status = getProperty(port, "reg", (char *)reg, sizeof reg); + + if (status == 0) + return 0; + + bus = (reg[0] >> 16) & 0xff; + device = (reg[0] >> 11) & 0x1f; + function = (reg[0] >> 8) & 0x07; + } + } + +#endif +#if DOS || EFI + segment = adap->segment_number; + bus = adap->bus_number; + device = (adap->device_function >> 3) & 31; + function = (adap->device_function >> 0) & 7; +#endif + + port->pciSegment = segment; + port->pciBus = bus; + port->pciDevice = device; + port->pciFunction = function; + + return 1; +} + + +int +showBoardInfo(MPT_PORT *port, int flag) +{ + ManufacturingPage0_t ManufacturingPage0; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, + &ManufacturingPage0, sizeof ManufacturingPage0) != 1) + return 0; + + if (getBoardInfo(port) == 1) + { + if (flag) + { + printf("Seg/Bus/Dev/Fun Board Name Board Assembly Board Tracer\n"); + printf("%2d %2d %2d %2d %-16.16s %-16.16s %-16.16s\n", + port->pciSegment, port->pciBus, port->pciDevice, port->pciFunction, + ManufacturingPage0.BoardName, ManufacturingPage0.BoardAssembly, ManufacturingPage0.BoardTracerNumber); + + } + else + { + printf("%-16s %2d %2d %2d %-16.16s %-16.16s %-16.16s\n", + port->portName, port->pciSegment, port->pciBus, port->pciDevice, + ManufacturingPage0.BoardName, ManufacturingPage0.BoardAssembly, ManufacturingPage0.BoardTracerNumber); + } + } + else + { + if (flag) + { + printf("Seg/Bus/Dev/Fun Board Name Board Assembly Board Tracer\n"); + printf(" %-16.16s %-16.16s %-16.16s\n", + ManufacturingPage0.BoardName, ManufacturingPage0.BoardAssembly, ManufacturingPage0.BoardTracerNumber); + + } + else + { + printf("%-16s %-16.16s %-16.16s %-16.16s\n", + port->portName, + ManufacturingPage0.BoardName, ManufacturingPage0.BoardAssembly, ManufacturingPage0.BoardTracerNumber); + } + } + + return 1; +} + + +int +dumpFcDevicePages(MPT_PORT *port) +{ + FCDevicePage0_t FCDevicePage0; + U32 d_id; + + printf(" B___T WWNN WWPN PortId ALPA FrSize BBCr Prot Flag\n"); + + d_id = 0xffffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, d_id, + &FCDevicePage0, sizeof FCDevicePage0) != 1) + break; + + d_id = get32(FCDevicePage0.PortIdentifier); + + if (FCDevicePage0.Flags & MPI_FC_DEVICE_PAGE0_FLAGS_TARGETID_BUS_VALID) + { + printf("%2d %3d %08x%08x %08x%08x %06x %02x %04x %02x %02x %02x\n", + FCDevicePage0.CurrentBus, FCDevicePage0.CurrentTargetID, + get32(FCDevicePage0.WWNN.High), get32(FCDevicePage0.WWNN.Low), + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), + d_id, FCDevicePage0.ADISCHardALPA, get16(FCDevicePage0.MaxRxFrameSize), + get16(FCDevicePage0.BBCredit), FCDevicePage0.Protocol, FCDevicePage0.Flags); + } + else + { + printf(" %08x%08x %08x%08x %06x %02x %04x %02x %02x %02x\n", + get32(FCDevicePage0.WWNN.High), get32(FCDevicePage0.WWNN.Low), + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), + d_id, FCDevicePage0.ADISCHardALPA, get16(FCDevicePage0.MaxRxFrameSize), + get16(FCDevicePage0.BBCredit), FCDevicePage0.Protocol, FCDevicePage0.Flags); + } + } + + return 1; +} + + +int +dumpSasDevicePages(MPT_PORT *port) +{ + SasDevicePage0_t SASDevicePage0; + U32 handle; + int bus; + int target; + int flags; + int mapped; + + printf(" B___T SASAddress Handle Encl/Slot DevInfo/Flag/Acc Port Parent PhyNum\n"); + + handle = 0xffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, handle, + &SASDevicePage0, sizeof SASDevicePage0) != 1) + break; + + handle = get16(SASDevicePage0.DevHandle); + flags = get16(SASDevicePage0.Flags); + + if (mpi1) + { + mapped = flags & MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED; + bus = SASDevicePage0.Bus; + target = SASDevicePage0.TargetID; + } + else + { + mapped = mapDevHandleToBusTarget(port, handle, &bus, &target); + } + + if (SASDevicePage0.ParentDevHandle == 0) + { + printf(" %08x%08x %04x\n", + get32(SASDevicePage0.SASAddress.High), get32(SASDevicePage0.SASAddress.Low), + handle); + } + else if (mapped) + { + printf("%2d %3d %08x%08x %04x %04x %2d %08x %04x %02x %2d %04x %2d\n", + bus, target, + get32(SASDevicePage0.SASAddress.High), get32(SASDevicePage0.SASAddress.Low), + handle, get16(SASDevicePage0.EnclosureHandle), get16(SASDevicePage0.Slot), + get32(SASDevicePage0.DeviceInfo), flags, SASDevicePage0.AccessStatus, + SASDevicePage0.PhysicalPort, get16(SASDevicePage0.ParentDevHandle), + SASDevicePage0.PhyNum); + } + else + { + printf(" %08x%08x %04x %04x %2d %08x %04x %02x %2d %04x %2d\n", + get32(SASDevicePage0.SASAddress.High), get32(SASDevicePage0.SASAddress.Low), + handle, get16(SASDevicePage0.EnclosureHandle), get16(SASDevicePage0.Slot), + get32(SASDevicePage0.DeviceInfo), flags, SASDevicePage0.AccessStatus, + SASDevicePage0.PhysicalPort, get16(SASDevicePage0.ParentDevHandle), + SASDevicePage0.PhyNum); + } + } + + return 1; +} + + +int +showPortInfo(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + FCDevicePage0_t FCDevicePage0; + int i; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + char buf[16]; + int portId; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + portId = get32(FCPortPage0.PortIdentifier); + + sprintf(buf, "%s Port", port->chipName); + printf(" %-24s %08x%08x %06x\n", buf, + get32(FCPortPage0.WWPN.High), get32(FCPortPage0.WWPN.Low), portId); + + i = 0xffffff; + while (TRUE) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, i, + &FCDevicePage0, sizeof FCDevicePage0) != 1) + break; + + i = get32(FCDevicePage0.PortIdentifier); + + if (i == portId) + continue; + + if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET) + continue; + + if (FCDevicePage0.Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) + printf(" FCP Initiator %08x%08x %06x\n", + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), i); + else + printf(" Non-FCP %08x%08x %06x\n", + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), i); + } + return 1; + } + + return 0; +} + + +int +showPortInfoHeader(MPT_PORT *port) +{ + FCPortPage0_t FCPortPage0; + SasIOUnitPage0_t *SASIOUnitPage0; + Mpi2SasIOUnitPage0_t *SASIOUnitPage0_2; + SasIOUnit0PhyData *SASIOUnit0PhyData; + int i; + + if (bringOnline(port) != 1) + return 0; + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + printf("%s's host SCSI ID is %d\n\n", port->chipName, port->hostScsiId); + return 1; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + char *attach; + char *speed; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_PORT, 0, 0, &FCPortPage0, sizeof FCPortPage0) != 1) + return 0; + + switch (get32(FCPortPage0.Flags) & MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK) + { + case MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT: attach = NULL; break; + case MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT: attach = "point to point"; break; + case MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP: attach = "private loop"; break; + case MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT: attach = "fabric direct attach"; break; + case MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP: attach = "public loop"; break; + default: attach = "unknown"; break; + } + + if (port->mptVersion < MPI_VERSION_01_01) + speed = "1 Gbps"; + else + switch (get32(FCPortPage0.CurrentSpeed)) + { + case MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT: speed = "1 Gbps"; break; + case MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT: speed = "2 Gbps"; break; + case MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT: speed = "4 Gbps"; break; + case MPI_FCPORTPAGE0_CURRENT_SPEED_10GBIT: speed = "10 Gbps"; break; + default: speed = "unknown"; break; + } + + if (attach != NULL) + printf("%s's link is online, type is %s, speed is %s\n\n", port->chipName, attach, speed); + else + printf("%s's link is offline\n\n", port->chipName); + return 1; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + int length; + char *speed; + int rate; + + SASIOUnitPage0 = getConfigPageAlloc(port, MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0, &length); + if (SASIOUnitPage0 == NULL) + return 0; + + SASIOUnitPage0_2 = (pMpi2SasIOUnitPage0_t)SASIOUnitPage0; + + if (SASIOUnitPage0->NumPhys == 1) + printf("%s's link is ", port->chipName); + else + printf("%s's links are ", port->chipName); + + for (i = 0; i < SASIOUnitPage0->NumPhys; i++) + { + if (i != 0) + printf(", "); + + if (mpi2) + { + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0_2->PhyData[i]; + rate = (SASIOUnit0PhyData->NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_LOGICAL) >> + MPI2_SAS_NEG_LINK_RATE_SHIFT_LOGICAL; + } + else + { + SASIOUnit0PhyData = (pSasIOUnit0PhyData)&SASIOUnitPage0->PhyData[i]; + rate = SASIOUnit0PhyData->NegotiatedLinkRate & MPI2_SAS_NEG_LINK_RATE_MASK_PHYSICAL; + } + + switch (rate) + { + case MPI_SAS_IOUNIT0_RATE_UNKNOWN: + speed = "down"; + break; + + case MPI_SAS_IOUNIT0_RATE_PHY_DISABLED: + speed = "off"; + break; + + case MPI_SAS_IOUNIT0_RATE_FAILED_SPEED_NEGOTIATION: + speed = "failed"; + break; + + case MPI_SAS_IOUNIT0_RATE_1_5: + speed = "1.5 G"; + break; + + case MPI_SAS_IOUNIT0_RATE_3_0: + speed = "3.0 G"; + break; + + case MPI2_SAS_NEG_LINK_RATE_6_0: + speed = "6.0 G"; + break; + + case MPI25_SAS_NEG_LINK_RATE_12_0: + speed = "12.0 G"; + break; + + default: + speed = "unknown"; + break; + } + + printf(speed); + } + + printf("\n\n"); + + free(SASIOUnitPage0); + + return 1; + } + + return 0; +} + + +int +getDeviceInfo(MPT_PORT *port, int bus, int target, char *buf, int len) +{ + SCSIDevicePage0_t SCSIDevicePage0; + FCDevicePage0_t FCDevicePage0; + SasDevicePage0_t SASDevicePage0; + int b_t; + int dev_handle; + int address; + + buf[0] = '\0'; + + b_t = (bus << 8) + mapOsToHwTarget(port, target); + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_SCSI_DEVICE, 0, b_t, + &SCSIDevicePage0, sizeof SCSIDevicePage0) == 1) + { + int parameters = get32(SCSIDevicePage0.NegotiatedParameters); + int speed = parameters & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_PERIOD_MASK; + int width = parameters & MPI_SCSIDEVPAGE0_NP_WIDE; + int mbps; + char *speed_string; + char *width_string; + + if ((parameters & MPI_SCSIDEVPAGE0_NP_NEG_SYNC_OFFSET_MASK) == 0) + speed = 0; + + if (speed == 0) + { + speed_string = "Async"; + mbps = 0; + } + else if (speed <= 0x800) + { + speed_string = "Ultra4"; + mbps = 160; + } + else if (speed <= 0x900) + { + speed_string = "Ultra3"; + mbps = 80; + } + else if (speed <= 0xa00) + { + speed_string = "Ultra2"; + mbps = 40; + } + else if (speed <= 0xc00) + { + speed_string = "Ultra"; + mbps = 20; + } + else if (speed <= 0x1900) + { + speed_string = "Fast"; + mbps = 64000 / speed; + } + else + { + speed_string = "Sync"; + mbps = 64000 / speed; + } + + if (width == 0) + { + width_string = "Narrow"; + } + else + { + width_string = "Wide"; + mbps *= 2; + } + + if (get32(SCSIDevicePage0.Information) & MPI_SCSIDEVPAGE0_INFO_PARAMS_NEGOTIATED) + { + sprintf(buf, "%s %s", speed_string, width_string); + if (mbps > 0) + sprintf(buf+strlen(buf), ", %d MB/sec", mbps); + return 1; + } + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, + MPI_FC_DEVICE_PGAD_FORM_BUS_TID + b_t, + &FCDevicePage0, sizeof FCDevicePage0) == 1) + { + sprintf(buf, "%08x%08x %06x", + get32(FCDevicePage0.WWPN.High), get32(FCDevicePage0.WWPN.Low), + get32(FCDevicePage0.PortIdentifier)); + return 1; + } + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + if (mpi2) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + dev_handle = 0; + address = MPI2_SAS_DEVICE_PGAD_FORM_HANDLE + dev_handle; + } + else + { + b_t = (bus << 8) + target; + address = (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID + <pidType == MPI_FW_HEADER_PID_TYPE_SCSI) + { + sprintf(buf, "Negotiated Speed & Width"); + return 1; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + sprintf(buf, " WWPN PortId"); + return 1; + } + + if (port->pidType == MPI_FW_HEADER_PID_TYPE_SAS) + { + sprintf(buf, " SASAddress PhyNum"); + return 1; + } + + return 0; +} + + +int +getIocFacts(MPT_PORT *port, IOCFactsReply_t *rep) +{ + IOCFacts_t req; + + memset(&req, 0, sizeof req); + memset(rep, 0, sizeof *rep); + + req.Function = MPI_FUNCTION_IOC_FACTS; + + return doMptCommand(port, &req, sizeof req, rep, sizeof *rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +getIocFacts2(MPT_PORT *port, Mpi2IOCFactsReply_t *rep) +{ + Mpi2IOCFactsRequest_t req; + + memset(&req, 0, sizeof req); + memset(rep, 0, sizeof *rep); + + req.Function = MPI2_FUNCTION_IOC_FACTS; + + return doMptCommand(port, &req, sizeof req, rep, sizeof *rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +getPortFacts(MPT_PORT *port, PortFactsReply_t *rep) +{ + PortFacts_t req; + + memset(&req, 0, sizeof req); + memset(rep, 0, sizeof *rep); + + req.Function = MPI_FUNCTION_PORT_FACTS; + + return doMptCommand(port, &req, sizeof req, rep, sizeof *rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +getPortFacts2(MPT_PORT *port, Mpi2PortFactsReply_t *rep) +{ + Mpi2PortFactsRequest_t req; + + memset(&req, 0, sizeof req); + memset(rep, 0, sizeof *rep); + + req.Function = MPI2_FUNCTION_PORT_FACTS; + + return doMptCommand(port, &req, sizeof req, rep, sizeof *rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +int +doConfigPageRequest(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut) +{ + int i; + + for (i = 0; i < 120; i++) + { + if (doMptCommand(port, req, reqSize, rep, repSize, payIn, payInSize, payOut, payOutSize, timeOut) != 1) + return 0; + + if (get16(((ConfigReply_t *)rep)->IOCStatus) != MPI_IOCSTATUS_BUSY) + { + if (i > 0) + printf("SUCCESS\n"); + return 1; + } + + if (i == 0) + printf("Firmware returned busy status, retrying."); + else + printf("."); + + fflush(stdout); + + sleep(1); + } + + printf("\nRetries exhausted. Giving up request!\n"); + return 1; +} + + +int +getConfigPageHeader(MPT_PORT *port, int type, int number, int address, ConfigReply_t *repOut) +{ + Config_t req; + ConfigReply_t rep; + int ioc_status; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_CONFIG; + req.AliasIndex = virtInit; + req.Action = MPI_CONFIG_ACTION_PAGE_HEADER; + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + req.Header.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; + req.ExtPageType = type; + } + else + { + req.Header.PageType = type; + } + req.Header.PageNumber = number; + req.PageAddress = set32(address); + + if (doConfigPageRequest(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + return 0; + + if (repOut != NULL) + memcpy(repOut, &rep, sizeof rep); + + return 1; +} + + +int +getConfigPageLength(MPT_PORT *port, int type, int number, int address, int *length) +{ + Config_t req; + ConfigReply_t rep; + int ioc_status; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_CONFIG; + req.AliasIndex = virtInit; + req.Action = MPI_CONFIG_ACTION_PAGE_HEADER; + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + req.Header.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; + req.ExtPageType = type; + } + else + { + req.Header.PageType = type; + } + req.Header.PageNumber = number; + req.PageAddress = set32(address); + + if (doConfigPageRequest(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + NULL, 0, NULL, 0, SHORT_TIME) != 1) + return 0; + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + return 0; + + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + *length = get16(rep.ExtPageLength) * 4; + else + *length = rep.Header.PageLength * 4; + + return 1; +} + + +int +getConfigPageAction(MPT_PORT *port, int action, int type, int number, int address, void *page, int pageSize) +{ + Config_t req; + ConfigReply_t rep, rep1; + ConfigPageHeader_t header; + int length; + int t; + int ioc_status; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + if (getConfigPageHeader(port, type, number, address, &rep) != 1) + return 0; + + memcpy(&rep1, &rep, sizeof rep); + + header = rep.Header; + length = get16(rep.ExtPageLength); + + req.Function = MPI_FUNCTION_CONFIG; + req.AliasIndex = virtInit; + if (action != -1) + req.Action = action; + else if ((rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK) == MPI_CONFIG_PAGEATTR_PERSISTENT || + (rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK) == MPI_CONFIG_PAGEATTR_RO_PERSISTENT) + req.Action = MPI_CONFIG_ACTION_PAGE_READ_NVRAM; + else + req.Action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + if (req.Action == MPI_CONFIG_ACTION_PAGE_READ_NVRAM && port->mptVersion < MPI_VERSION_01_01) + req.Action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + req.ExtPageType = rep.ExtPageType; + req.ExtPageLength = rep.ExtPageLength; + req.Header = rep.Header; + req.PageAddress = set32(address); + + if (doConfigPageRequest(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + page, pageSize, NULL, 0, SHORT_TIME) != 1) + return 0; + + port->ioc_status = ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status == MPI_IOCSTATUS_CONFIG_INVALID_PAGE || + ioc_status == MPI_IOCSTATUS_CONFIG_INVALID_DATA) + { + if (action == MPI_CONFIG_ACTION_PAGE_READ_NVRAM) + { + printf("\nNon-volatile storage for this page is invalid!\n"); +#if 0 + printf("The current values for this page will be used instead\n"); + req.Action = MPI_CONFIG_ACTION_PAGE_READ_NVRAM; +#else + return 0; +#endif + } + + if (req.Action == MPI_CONFIG_ACTION_PAGE_READ_NVRAM) + { + req.Action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; + + if (doConfigPageRequest(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + page, pageSize, NULL, 0, SHORT_TIME) != 1) + return 0; + + port->ioc_status = ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + } + } + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + return 0; + + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + if (get16(rep.ExtPageLength) == 0) + return 0; + if (memcmp(&header, &rep.Header, sizeof header) != 0) + printf("Warning, header in HEADER reply does not match header in READ reply\n (%08x vs. %08x)\n", + get32x(*(U32 *)&header), get32x(*(U32 *)&rep.Header)); + if (length != get16(rep.ExtPageLength)) + printf("Warning, length in HEADER reply does not match length in READ reply\n (%d vs. %d)\n", + length, get16(rep.ExtPageLength)); + t = get16(((pConfigExtendedPageHeader_t)page)->ExtPageLength); + if (t && get16(rep.ExtPageLength) != t) + printf("Warning, page length in reply does not match page length in buffer\n (%d vs. %d)\n", + get16(rep.ExtPageLength), t); + } + else + { + if (rep.Header.PageLength == 0) + return 0; + if (memcmp(&header, &rep.Header, sizeof header) != 0) + printf("Warning, header in HEADER reply does not match header in READ reply\n (%08x vs. %08x)\n", + get32x(*(U32 *)&header), get32x(*(U32 *)&rep.Header)); + t = ((pConfigPageHeader_t)page)->PageLength; + if (t && rep.Header.PageLength != t) + printf("Warning, page length in reply does not match page length in buffer\n (%d vs. %d)\n", + rep.Header.PageLength, t); + } + + return 1; +} + + +int +getConfigPage(MPT_PORT *port, int type, int number, int address, void *page, int pageSize) +{ + return getConfigPageAction(port, -1, type, number, address, page, pageSize); +} + + +void * +getConfigPageActionAlloc(MPT_PORT *port, int action, int type, int number, int address, int *length) +{ + void *page; + + if (getConfigPageLength(port, type, number, address, length) == 1) + { + page = malloc(*length); + + if (getConfigPageAction(port, action, type, number, address, page, *length) == 1) + { + return page; + } + + free(page); + } + + return NULL; +} + + +void * +getConfigPageAlloc(MPT_PORT *port, int type, int number, int address, int *length) +{ + return getConfigPageActionAlloc(port, -1, type, number, address, length); +} + + +int +setConfigPageAction(MPT_PORT *port, int action, int type, int number, int address, void *page, int pageSize) +{ + Config_t req; + ConfigReply_t rep; + ConfigPageHeader_t header; + int length; + int t; + int ioc_status; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + if (getConfigPageHeader(port, type, number, address, &rep) != 1) + return 0; + + header = rep.Header; + length = get16(rep.ExtPageLength); + + req.Function = MPI_FUNCTION_CONFIG; + req.AliasIndex = virtInit; + if (action != -1) + req.Action = action; + else if ((rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK) == MPI_CONFIG_PAGEATTR_PERSISTENT || + (rep.Header.PageType & MPI_CONFIG_PAGEATTR_MASK) == MPI_CONFIG_PAGEATTR_RO_PERSISTENT) + req.Action = MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM; + else + req.Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; + req.ExtPageType = rep.ExtPageType; + req.ExtPageLength = rep.ExtPageLength; + req.Header = rep.Header; + req.PageAddress = set32(address); + + if (doConfigPageRequest(port, &req, sizeof req - sizeof req.PageBufferSGE, &rep, sizeof rep, + NULL, 0, page, pageSize, SHORT_TIME) != 1) + return 0; + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + if(wFlag) + fprintf(logFile, "IOC Status returned from doConfigPageRequest = [%08X]", ioc_status); + port->ioc_status = ioc_status; + return 0; + } + + if (type > MPI_CONFIG_PAGETYPE_EXTENDED) + { + if (get16(rep.ExtPageLength) == 0) + return 0; + if (memcmp(&header, &rep.Header, sizeof header) != 0) + printf("Warning, header in HEADER reply does not match header in WRITE reply\n (%08x vs. %08x)\n", + get32x(*(U32 *)&header), get32x(*(U32 *)&rep.Header)); + if (length != get16(rep.ExtPageLength)) + printf("Warning, length in HEADER reply does not match length in WRITE reply\n (%d vs. %d)\n", + length, get16(rep.ExtPageLength)); + t = get16(((pConfigExtendedPageHeader_t)page)->ExtPageLength); + if (t && get16(rep.ExtPageLength) != t) + printf("Warning, page length in reply does not match page length in buffer\n (%d vs. %d)\n", + get16(rep.ExtPageLength), t); + } + else + { + if (rep.Header.PageLength == 0) + return 0; + if (memcmp(&header, &rep.Header, sizeof header) != 0) + printf("Warning, header in HEADER reply does not match header in WRITE reply\n (%08x vs. %08x)\n", + get32x(*(U32 *)&header), get32x(*(U32 *)&rep.Header)); + t = ((pConfigPageHeader_t)page)->PageLength; + if (t && rep.Header.PageLength != t) + printf("Warning, page length in reply does not match page length in buffer\n (%d vs. %d)\n", + rep.Header.PageLength, t); + } + + return 1; +} + + +int +setConfigPage(MPT_PORT *port, int type, int number, int address, void *page, int pageSize) +{ + int t; + + t = setConfigPageAction(port, -1, type, number, address, page, pageSize); + + if (t != 1) + if (wFlag) + fprintf(logFile, "%s: CONFIG write to NVRAM, type %x, number %x: FAIL\n", + logPrefix(port), type, number); + + return t; +} + + +int +showConfigPage(MPT_PORT *port, char *string, void *page, int length) +{ + ConfigPageHeader_t *header; + int n; + int numAvailDwords; + + header = (pConfigPageHeader_t)page; + + if ((header->PageType & MPI_CONFIG_PAGETYPE_MASK) == MPI_CONFIG_PAGETYPE_EXTENDED) + n = get16(((pConfigExtendedPageHeader_t)header)->ExtPageLength); + else + n = header->PageLength; + + numAvailDwords = min(n, length/4); + dumpMemory(page, numAvailDwords * 4, string); + + if (n > length/4) + printf("WARNING: %s Truncated. %d dwords printed but page contains %d dwords\n", string, length/4, n); + + return 1; +} + + +#if __sparc__ +int +getProperty(MPT_PORT *port, char *name, char *buf, int bufLen) +{ + SYM_GET_PROPERTY getProperty; + + getProperty.PtrName = (UINT64)(UINT32)name; + getProperty.PtrBuffer = (UINT64)(UINT32)buf; + getProperty.NameLen = strlen(name); + getProperty.BufferLen = bufLen; + getProperty.PropertyLen = 0; + + if (ioctl(port->fileHandle, SYMIOCTL_GET_PROPERTY, &getProperty) == 0) + return getProperty.PropertyLen; + + return 0; +} +#endif + + +void +setName(MPT_PORT *port, int bus, int target, void *req) +{ + SCSIIORequest_t *req1 = (pSCSIIORequest_t)req; + Mpi2SCSIIORequest_t *req2 = (pMpi2SCSIIORequest_t)req; + int dev_handle; + + + if (mpi2) + { + if (mapBusTargetToDevHandle(port, bus, target, &dev_handle) != 1) + dev_handle = 0; + + req2->DevHandle = set16(dev_handle); + } + else + { + req1->TargetID = mapOsToHwTarget(port, target); + req1->Bus = bus; + } +} + + +int +setMaxBusTarget(MPT_PORT *port) +{ + /* DOS, EFI, and SAS2 Solaris do not support devHandle to + * bus/target mapping so we "fudge" things here + */ +#if DOS || EFI || __sparc__ + int n; + + n = port->maxDevHandle; + if (n > 256) + { + port->maxBuses = (n + 255) / 256; + port->maxTargets = 256; + } + else + { + port->maxBuses = 1; + port->maxTargets = n; + } +#else + int maxBuses; + int minTargets; + int maxTargets; + int bus; + int target; + int devHandle; + + maxBuses = 0; + minTargets = 0xffff; + maxTargets = 0; + for (devHandle = 0; devHandle < port->maxDevHandle; devHandle++) + { + if (mapDevHandleToBusTarget(port, devHandle, &bus, &target) == 1) + { + if (bus > maxBuses) + maxBuses = bus; + if (target < minTargets) + minTargets = target; + if (target > maxTargets) + maxTargets = target; + } + } + port->maxBuses = maxBuses + 1; + port->minTargets = minTargets == 0xffff ? 0 : minTargets; + port->maxTargets = maxTargets + 1; +#endif + + return 1; +} + + +int +mapDevHandleToBusTarget(MPT_PORT *port, int dev_handle, int *bus, int *target) +{ + int t; + + if (port == mappedPort && dev_handle == mappedDevHandle) + { + *bus = mappedBus; + *target = mappedTarget; +#if __sparc__ + if (*bus == 0xffff || *target == 0xffff) + return 0; +#endif + if (*bus == 0xffffffff || *target == 0xffffffff) + return 0; + else + return 1; + } + + *bus = 0xffffffff; + *target = 0xffffffff; + + t = mapBTDH(port, bus, target, &dev_handle); + + if (t == 1) + { + mappedPort = port; + mappedBus = *bus; + mappedTarget = *target; + mappedDevHandle = dev_handle; + +#if __sparc__ + if (*bus == 0xffff || *target == 0xffff) + t = 0; +#endif + if (*bus == 0xffffffff || *target == 0xffffffff) + t = 0; + } + + return t; +} + + +int +mapBusTargetToDevHandle(MPT_PORT *port, int bus, int target, int *dev_handle) +{ + int t; + + if (port == mappedPort && bus == mappedBus && target == mappedTarget) + { + *dev_handle = mappedDevHandle; + if (*dev_handle == 0xffff) + return 0; + else + return 1; + } + + *dev_handle = 0xffff; + + t = mapBTDH(port, &bus, &target, dev_handle); + + if (t == 1) + { + mappedPort = port; + mappedBus = bus; + mappedTarget = target; + mappedDevHandle = *dev_handle; + + if (*dev_handle == 0xffff) + t = 0; + } + + return t; +} + + +int +mapBTDH(MPT_PORT *port, int *bus, int *target, int *dev_handle) +{ +#if WIN32 + int status; + MPI_BTDH_MAP_SRB srb; + int inLen; + int outLen; + DWORD retLen; + + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = MPI_BTDH_MAPPING; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = SHORT_TIME; + + memcpy((char *)&srb.Sic.Signature, "4.00 ", 8); + + srb.Bus = *bus; + srb.TargetID = *target; + srb.DevHandle = *dev_handle; + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + *bus = srb.Bus; + *target = srb.TargetID; + *dev_handle = srb.DevHandle; + + return status; +#endif +#if __linux__ + int status; + struct mpt2_ioctl_btdh_mapping btdh_mapping; + + memset(&btdh_mapping, 0, sizeof btdh_mapping); + + btdh_mapping.hdr.ioc_number = port->portNumber; + + btdh_mapping.bus = *bus; + btdh_mapping.id = *target; + btdh_mapping.handle = *dev_handle; + + status = ioctl(port->fileHandle, MPT2BTDHMAPPING, &btdh_mapping); + + *bus = btdh_mapping.bus; + *target = btdh_mapping.id; + *dev_handle = btdh_mapping.handle; + + return status == 0; +#endif +#if __sparc__ + int status; + SYM_BTDH_MAPPING btdhMapping; + + if (port->ioctlValue == MPTIOCTL_PASS_THRU) // this matches the mpt_sas driver + { + if (*bus == 0xffffffff && *target == 0xffffffff && *dev_handle != 0xffff) + { + *bus = (*dev_handle >> 8) & 0xff; + *target = (*dev_handle >> 0) & 0xff; + + return 1; + } + + if (*bus != 0xffffffff && *target != 0xffffffff && *dev_handle == 0xffff) + { + *dev_handle = ((*bus & 0xff) << 8) | ((*target & 0xff) << 0); + + return 1; + } + + return 0; + } + else // legacy support for the lsimpt SAS2 driver + { + btdhMapping.Bus = *bus; + btdhMapping.TargetID = *target; + btdhMapping.DevHandle = *dev_handle; + + status = ioctl(port->fileHandle, SYMIOCTL_BTDH_MAPPING, &btdhMapping); + + *bus = btdhMapping.Bus; + *target = btdhMapping.TargetID; + *dev_handle = btdhMapping.DevHandle; + + return status == 0; + } +#endif +#if DOS || EFI + if (*bus == 0xffffffff && *target == 0xffffffff && *dev_handle != 0xffff) + { + *bus = (*dev_handle >> 8) & 0xff; + *target = (*dev_handle >> 0) & 0xff; + + return 1; + } + + if (*bus != 0xffffffff && *target != 0xffffffff && *dev_handle == 0xffff) + { + *dev_handle = ((*bus & 0xff) << 8) | ((*target & 0xff) << 0); + + return 1; + } + + return 0; +#endif +} + + +int +mapOsToHwTarget(MPT_PORT *port, int target) +{ +#if __sparc__ + if (port->pidType == MPI_FW_HEADER_PID_TYPE_FC) + { + char name[32]; + char buffer[16]; + U32 wwnh; + U32 wwnl; + U32 port_id; + FCDevicePage0_t FCDevicePage0; + int i; + int t; + + if (port == mappedPort && target == mappedTarget) + return mappedValue; + + mappedPort = port; + mappedTarget = target; + mappedValue = port->hostScsiId; + + sprintf(name, "target-%d-wwn-nv", target); + t = getProperty(port, name, buffer, sizeof buffer); + + if (t != 8) + { + sprintf(name, "target-%d-wwn-cf", target); + t = getProperty(port, name, buffer, sizeof buffer); + } + + if (t != 8) + { + sprintf(name, "target-%d-wwn-hw", target); + t = getProperty(port, name, buffer, sizeof buffer); + } + + if (t == 8) + { +#if i386 + wwnl = ((U32 *)buffer)[0]; + wwnh = ((U32 *)buffer)[1]; +#else + wwnh = ((U32 *)buffer)[0]; + wwnl = ((U32 *)buffer)[1]; +#endif + for (i = 0; i < 256; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, + MPI_FC_DEVICE_PGAD_FORM_BUS_TID + i, + &FCDevicePage0, sizeof FCDevicePage0) == 1) + { + if (wwnh == get32(FCDevicePage0.WWPN.High) && + wwnl == get32(FCDevicePage0.WWPN.Low)) + { + mappedValue = i; + return i; + } + } + } + + return mappedValue; + } + + sprintf(name, "target-%d-did-nv", target); + t = getProperty(port, name, buffer, sizeof buffer); + + if (t != 4) + { + sprintf(name, "target-%d-did-cf", target); + t = getProperty(port, name, buffer, sizeof buffer); + } + + if (t != 4) + { + sprintf(name, "target-%d-did-hw", target); + t = getProperty(port, name, buffer, sizeof buffer); + } + + if (t == 4) + { + port_id = ((U32 *)buffer)[0]; + + for (i = 0; i < 256; i++) + { + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_FC_DEVICE, 0, + MPI_FC_DEVICE_PGAD_FORM_BUS_TID + i, + &FCDevicePage0, sizeof FCDevicePage0) == 1) + { + if (port_id == get32(FCDevicePage0.PortIdentifier)) + { + mappedValue = i; + return i; + } + } + } + + return mappedValue; + } + + target = port->hostScsiId; + } +#endif + return target; +} + + +int +doTestUnitReady(MPT_PORT *port, int bus, int target, int lun) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(tagType); + req.CDB[0] = 0x00; + req.CDB[1] = 0; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, NULL, 0, IO_TIME); +} + + +int +doInquiry(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x12; + req.CDB[1] = 0; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = len; + req.CDB[5] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doInquiryVpdPage(MPT_PORT *port, int bus, int target, int lun, int page, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x12; + req.CDB[1] = 1; + req.CDB[2] = page; + req.CDB[3] = 0; + req.CDB[4] = len; + req.CDB[5] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doLogSense(MPT_PORT *port, int bus, int target, int lun, int page, int pc, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x4d; + req.CDB[1] = 0; + req.CDB[2] = (pc << 6) | page; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = 0; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doLogSelect(MPT_PORT *port, int bus, int target, int lun, int pc, int sp, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x4c; + req.CDB[1] = sp << 0; + req.CDB[2] = pc << 6; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = 0; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); +} + + +int +doReadBlockLimits(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x05; + req.CDB[1] = 0; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = 0; + req.CDB[7] = 0; + req.CDB[8] = 0; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doReadCapacity(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x25; + req.CDB[1] = 0; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = 0; + req.CDB[7] = 0; + req.CDB[8] = 0; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doReadCapacity16(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 16; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x9e; + req.CDB[1] = 0x10; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = 0; + req.CDB[7] = 0; + req.CDB[8] = 0; + req.CDB[9] = 0; + req.CDB[10] = len >> 24; + req.CDB[11] = len >> 16; + req.CDB[12] = len >> 8; + req.CDB[13] = len; + req.CDB[14] = 0; + req.CDB[15] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doModeSense(MPT_PORT *port, int bus, int target, int lun, int page, int control, int dbd, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x1a; + req.CDB[1] = (dbd << 3); + req.CDB[2] = page | (control << 6); + req.CDB[3] = 0; + req.CDB[4] = len; + req.CDB[5] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doModeSelect(MPT_PORT *port, int bus, int target, int lun, int save, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x15; + req.CDB[1] = (1 << 4) | (save << 0); + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = len; + req.CDB[5] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); +} + + +int +doReadBuffer(MPT_PORT *port, int bus, int target, int lun, int mode, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x3c; + req.CDB[1] = mode; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = len >> 16; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doWriteBuffer(MPT_PORT *port, int bus, int target, int lun, int mode, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x3b; + req.CDB[1] = mode; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = len >> 16; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); +} + + +int +doReadBufferFull(MPT_PORT *port, int bus, int target, int lun, int mode, int id, int offset, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.LUN[1] = lun; + req.AliasIndex = virtInit; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x3c; + req.CDB[1] = mode; + req.CDB[2] = id; + req.CDB[3] = offset >> 16; + req.CDB[4] = offset >> 8; + req.CDB[5] = offset; + req.CDB[6] = len >> 16; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, LONG_TIME); +} + + +int +doWriteBufferFull(MPT_PORT *port, int bus, int target, int lun, int mode, int id, int offset, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.LUN[1] = lun; + req.AliasIndex = virtInit; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x3b; + req.CDB[1] = mode; + req.CDB[2] = id; + req.CDB[3] = offset >> 16; + req.CDB[4] = offset >> 8; + req.CDB[5] = offset; + req.CDB[6] = len >> 16; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, LONG_TIME); +} + + +int +doRead(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + int raid = port->raidPassthru && bus == port->raidBus && target == port->raidTarget; + + if (mode & 0xf0f) + return doRead32(port, bus, target, lun, lbn, lbns, mode, buf, len); + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x28; + req.CDB[1] = mode & 0xf0; + req.CDB[2] = lbn >> 24; + req.CDB[3] = lbn >> 16; + req.CDB[4] = lbn >> 8; + req.CDB[5] = lbn; + req.CDB[6] = 0; + req.CDB[7] = lbns >> 8; + req.CDB[8] = lbns; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, raid, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doWrite(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + int raid = port->raidPassthru && bus == port->raidBus && target == port->raidTarget; + + if (mode & 0xf0f) + return doWrite32(port, bus, target, lun, lbn, lbns, mode, buf, len); + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x2a; + req.CDB[1] = mode & 0xf0; + req.CDB[2] = lbn >> 24; + req.CDB[3] = lbn >> 16; + req.CDB[4] = lbn >> 8; + req.CDB[5] = lbn; + req.CDB[6] = 0; + req.CDB[7] = lbns >> 8; + req.CDB[8] = lbns; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, raid, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); +} + + +int +doVerify(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + int raid = port->raidPassthru && bus == port->raidBus && target == port->raidTarget; + +// if (mode) +// return doVerify32(port, bus, target, lun, lbn, lbns, mode, buf, len); + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x2f; + req.CDB[1] = len ? (1<<1) : 0; + req.CDB[2] = lbn >> 24; + req.CDB[3] = lbn >> 16; + req.CDB[4] = lbn >> 8; + req.CDB[5] = lbn; + req.CDB[6] = 0; + req.CDB[7] = lbns >> 8; + req.CDB[8] = lbns; + req.CDB[9] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, raid, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); +} + + +int +doRead32(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len) +{ + SCSIIO32Request_t req; + SCSI_REPLY rep; + unsigned char *buf2 = buf; + int len2 = len; + int t; + int flags; + + if (mode == 0x201) + { + len += lbns * 8; + buf = malloc(len); + + t = doRead(port, bus, target, lun, lbn, lbns, 0x20, buf, len); + + if (t == 1) + { + t = checkRemoveT10(port, lbn, lbns, buf, buf2, len2); + } + + free(buf); + + return t; + } + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_32; + req.AliasIndex = virtInit; + req.CDBLength = 10; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO32_CONTROL_READ | tagType); + req.CDB.EEDP16.CDB[0] = 0x28; + req.CDB.EEDP16.CDB[1] = 0; + req.CDB.EEDP16.CDB[2] = lbn >> 24; + req.CDB.EEDP16.CDB[3] = lbn >> 16; + req.CDB.EEDP16.CDB[4] = lbn >> 8; + req.CDB.EEDP16.CDB[5] = lbn; + req.CDB.EEDP16.CDB[6] = 0; + req.CDB.EEDP16.CDB[7] = lbns >> 8; + req.CDB.EEDP16.CDB[8] = lbns; + req.CDB.EEDP16.CDB[9] = 0; + req.CDB.EEDP16.PrimaryReferenceTag = set32(swap32(lbn)); + req.CDB.EEDP16.PrimaryApplicationTagMask = set16(0xffff); + req.DataLength = set32(len); + req.DeviceAddress.SCSIID.Bus = bus; + req.DeviceAddress.SCSIID.TargetID = mapOsToHwTarget(port, target); + + flags = MPI_SCSIIO32_EEDPFLAGS_INC_PRI_REFTAG | + MPI_SCSIIO32_EEDPFLAGS_T10_CHK_GUARD | + MPI_SCSIIO32_EEDPFLAGS_T10_CHK_REFTAG | + MPI_SCSIIO32_EEDPFLAGS_T10_CHK_LBATAG; + + if (mode == 0x101) + { + len += lbns * 8; + buf = malloc(len); + + flags |= MPI_SCSIIO32_EEDPFLAGS_CHK_OP; + + req.CDB.EEDP16.CDB[1] = 0x20; + req.DataLength = set32(len); + req.EEDPBlockSize = set32(512 + 8); + } + + if (mode == 0x1) + { + flags |= MPI_SCSIIO32_EEDPFLAGS_CHKRM_OP; + + req.CDB.EEDP16.CDB[1] = 0x20; + req.EEDPBlockSize = set32(512 + 8); + } + + if (mode == 0x102 || mode == 0x2) + { + len += lbns * 8; + buf = malloc(len); + + flags |= MPI_SCSIIO32_EEDPFLAGS_CHK_OP; + + req.CDB.EEDP16.CDB[5] = lbn & ~7; + req.DataLength = set32(len); + req.EEDPBlockSize = set32(4096 + 64); + } + + req.EEDPFlags = set16(flags); + + t = doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); + + if (mode == 0x101) + { + if (t == 1) + { + t = checkRemoveT10(port, lbn, lbns, buf, buf2, len2); + } + + free(buf); + } + + if (mode == 0x102) + { + if (t == 1) + { +// LB CRC not done yet... +// t = checkRemoveLb(port, lbn, lbns, buf, buf2, len2, 1); + t = checkRemoveLb(port, lbn, lbns, buf, buf2, len2, 0); + } + + free(buf); + } + + if (mode == 0x2) + { + if (t == 1) + { + t = checkRemoveLb(port, lbn, lbns, buf, buf2, len2, 0); + } + + free(buf); + } + + return t; +} + + +int +doWrite32(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int lbns, int mode, unsigned char *buf, int len) +{ + SCSIIO32Request_t req; + SCSI_REPLY rep; + unsigned char *buf2 = buf; + int t; + int flags; + + if (mode == 0x201) + { + len += lbns * 8; + buf = malloc(len); + + insertT10(port, lbn, lbns, buf2, buf, len); + + t = doWrite(port, bus, target, lun, lbn, lbns, 0x20, buf, len); + + free(buf); + + return t; + } + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_32; + req.AliasIndex = virtInit; + req.CDBLength = 10; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO32_CONTROL_WRITE | tagType); + req.CDB.EEDP16.CDB[0] = 0x2a; + req.CDB.EEDP16.CDB[1] = 0; + req.CDB.EEDP16.CDB[2] = lbn >> 24; + req.CDB.EEDP16.CDB[3] = lbn >> 16; + req.CDB.EEDP16.CDB[4] = lbn >> 8; + req.CDB.EEDP16.CDB[5] = lbn; + req.CDB.EEDP16.CDB[6] = 0; + req.CDB.EEDP16.CDB[7] = lbns >> 8; + req.CDB.EEDP16.CDB[8] = lbns; + req.CDB.EEDP16.CDB[9] = 0; + req.CDB.EEDP16.PrimaryReferenceTag = set32(swap32(lbn)); + req.CDB.EEDP16.PrimaryApplicationTagMask = set16(0xffff); + req.DataLength = set32(len); + req.DeviceAddress.SCSIID.Bus = bus; + req.DeviceAddress.SCSIID.TargetID = mapOsToHwTarget(port, target); + + flags = MPI_SCSIIO32_EEDPFLAGS_INC_PRI_REFTAG | + MPI_SCSIIO32_EEDPFLAGS_T10_CHK_GUARD | + MPI_SCSIIO32_EEDPFLAGS_T10_CHK_REFTAG | + MPI_SCSIIO32_EEDPFLAGS_T10_CHK_LBATAG; + + if (mode == 0x101) + { + len += lbns * 8; + buf = malloc(len); + + flags |= MPI_SCSIIO32_EEDPFLAGS_NOOP_OP; + + req.CDB.EEDP16.CDB[1] = 0x20; + req.DataLength = set32(len); +// req.EEDPFlags |= set16(MPI_SCSIIO32_EEDPFLAGS_CHK_OP); + req.EEDPBlockSize = set32(512 + 8); + + insertT10(port, lbn, lbns, buf2, buf, len); + } + + if (mode == 0x1) + { + flags |= MPI_SCSIIO32_EEDPFLAGS_INSERT_OP; + + req.CDB.EEDP16.CDB[1] = 0x20; + req.DataLength = set32(len); + req.EEDPBlockSize = set32(512 + 8); + } + + if (mode == 0x102) + { + len += lbns * 8; + buf = malloc(len); + +// LB CRC not done yet... +// flags |= MPI_SCSIIO32_EEDPFLAGS_CHKREGEN_OP; + flags |= MPI_SCSIIO32_EEDPFLAGS_REPLACE_OP; + + req.CDB.EEDP16.CDB[5] = lbn & ~7; + req.DataLength = set32(len); + req.EEDPBlockSize = set32(4096 + 64); + + insertLb(port, lbn, lbns, buf2, buf, len, 1); + } + + if (mode == 0x2) + { + len += lbns * 8; + buf = malloc(len); + + flags |= MPI_SCSIIO32_EEDPFLAGS_REPLACE_OP; + + req.CDB.EEDP16.CDB[5] = lbn & ~7; + req.DataLength = set32(len); + req.EEDPBlockSize = set32(4096 + 64); + + insertLb(port, lbn, lbns, buf2, buf, len, 0); + } + + req.EEDPFlags = set16(flags); + + t = doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); + + if (mode == 0x101 || mode == 0x102 || mode == 0x2) + { + free(buf); + } + + return t; +} + + +int +doReadLong(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len, int *resid) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + int raid = port->raidPassthru && bus == port->raidBus && target == port->raidTarget; + int t; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x3e; + req.CDB[1] = 0; + req.CDB[2] = lbn >> 24; + req.CDB[3] = lbn >> 16; + req.CDB[4] = lbn >> 8; + req.CDB[5] = lbn; + req.CDB[6] = 0; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + t = doScsiIo(port, bus, target, raid, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); + + if (t == 1) + { + *resid = 0; + return 1; + } + else if (rep.reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION) + { + if (rep.sense[0] == 0xf0 && rep.sense[2] & 0x20) + { + *resid = get4bytes(rep.sense, 3); + return 1; + } + } + + return 0; +} + + +int +doWriteLong(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len, int *resid) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + int raid = port->raidPassthru && bus == port->raidBus && target == port->raidTarget; + int t; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 10; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x3f; + req.CDB[1] = len ? 0 : (unsigned char)(1<<6); + req.CDB[2] = lbn >> 24; + req.CDB[3] = lbn >> 16; + req.CDB[4] = lbn >> 8; + req.CDB[5] = lbn; + req.CDB[6] = 0; + req.CDB[7] = len >> 8; + req.CDB[8] = len; + req.CDB[9] = 0; + req.DataLength = set32(len); + + t = doScsiIo(port, bus, target, raid, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, IO_TIME); + + if (t == 1) + { + *resid = 0; + return 1; + } + else if (rep.reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION) + { + if (rep.sense[0] == 0xf0 && rep.sense[2] & 0x20) + { + *resid = get4bytes(rep.sense, 3); + return 1; + } + } + + return 0; +} + + +int +doReportLuns(MPT_PORT *port, int bus, int target, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + int t; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 12; + req.AliasIndex = virtInit; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0xa0; + req.CDB[1] = 0; + req.CDB[2] = 0; + req.CDB[3] = 0; + req.CDB[4] = 0; + req.CDB[5] = 0; + req.CDB[6] = len >> 24; + req.CDB[7] = len >> 16; + req.CDB[8] = len >> 8; + req.CDB[9] = len; + req.CDB[10] = 0; + req.CDB[11] = 0; + req.DataLength = set32(len); + + t = doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); + + if (t == 1) + { + return 1; + } + else if (rep.reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION) + { + if (rep.sense[0] == 0xf0 && rep.sense[2] & 0x20) + { + return 1; + } + } + + return 0; +} + + +int +doReceiveDiagnosticResults(MPT_PORT *port, int bus, int target, int lun, int page, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_READ | tagType); + req.CDB[0] = 0x1c; + req.CDB[1] = 1; + req.CDB[2] = page; + req.CDB[3] = len >> 8; + req.CDB[4] = len; + req.CDB[5] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, buf, len, NULL, 0, IO_TIME); +} + + +int +doSendDiagnostic(MPT_PORT *port, int bus, int target, int lun, unsigned char *buf, int len) +{ + SCSIIORequest_t req; + SCSI_REPLY rep; + + memset(&req, 0, sizeof req); + + req.Function = MPI_FUNCTION_SCSI_IO_REQUEST; + req.CDBLength = 6; + req.AliasIndex = virtInit; + req.LUN[1] = lun; + req.Control = set32(MPI_SCSIIO_CONTROL_WRITE | tagType); + req.CDB[0] = 0x1d; + req.CDB[1] = 1 << 4; + req.CDB[2] = 0; + req.CDB[3] = len >> 8; + req.CDB[4] = len; + req.CDB[5] = 0; + req.DataLength = set32(len); + + return doScsiIo(port, bus, target, 0, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, NULL, 0, buf, len, LONG_TIME); +} + + +int +doScsiIo(MPT_PORT *port, int bus, int target, int raid, void *req, int reqSize, SCSI_REPLY *rep1, int rep1Size, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut) +{ + int ioc_status; + int ioc_loginfo; + SCSIIORequest_t *req1; + Mpi2SCSIIORequest_t req2; + Mpi25SCSIIORequest_t req25; + SCSI_REPLY2 rep2; + void *rep; + int repSize; + int command = -1; + + req1 = req; + if (req1->Function == MPI_FUNCTION_SCSI_IO_REQUEST) + { + command = req1->CDB[0]; + + setName(port, bus, target, req1); + if (raid) + { + req1->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH; + if (mpi1) + setName(port, 0, port->raidPhysdisk, req1); + } + + if (mpi20) + { + memset(&req2, 0, sizeof req2); + + // convert from MPI 1.x format to MPI 2.x format + req2.Function = req1->Function; + req2.DevHandle = ((pMpi2SCSIIORequest_t)req1)->DevHandle; + req2.Control = req1->Control; + req2.IoFlags = set16(req1->CDBLength); + req2.DataLength = req1->DataLength; + + memcpy(req2.LUN, req1->LUN, sizeof req1->LUN); + memcpy(req2.CDB.CDB32, req1->CDB, sizeof req1->CDB); + + req2.SGLOffset0 = offsetof(Mpi2SCSIIORequest_t, SGL) / 4; + + req = &req2; + reqSize = sizeof req2 - sizeof req2.SGL; + } + else if (mpi25) + { + memset(&req25, 0, sizeof req25); + + // convert from MPI 1.x format to MPI 2.5 format + req25.Function = req1->Function; + req25.DevHandle = ((pMpi25SCSIIORequest_t)req1)->DevHandle; + req25.Control = req1->Control; + req25.IoFlags = set16(req1->CDBLength); + req25.DataLength = req1->DataLength; + + memcpy(req25.LUN, req1->LUN, sizeof req1->LUN); + memcpy(req25.CDB.CDB32, req1->CDB, sizeof req1->CDB); + + req25.SGLOffset0 = offsetof(Mpi25SCSIIORequest_t, SGL) / 4; + + req = &req25; + reqSize = sizeof req25 - sizeof req25.SGL; + } + } + + if (mpi2) + { + rep = &rep2; + repSize = sizeof rep2; + } + else + { + rep = rep1; + repSize = rep1Size; + } + memset(rep, 0, repSize); + + if (doMptCommand(port, req, reqSize, rep, repSize, + payIn, payInSize, payOut, payOutSize, timeOut) != 1) + { +#if __linux__ + if (errno == EFAULT) + printf("SCSI command failed, mptscsih might not be loaded\n"); +#endif + return 0; + } + + if (mpi2) + { + memcpy(&rep1->reply, &rep2.reply, sizeof rep1->reply); + memcpy(&rep1->sense, &rep2.sense, sizeof rep1->sense); + } + + ioc_status = get16(rep1->reply.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status == MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE) + return 0; + + if (ioc_status == MPI_IOCSTATUS_BUSY || + ioc_status == MPI_IOCSTATUS_SCSI_IOC_TERMINATED || + ioc_status == MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH || + (rep1->reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION && !(rep1->sense[2] & 0xf0)) || + rep1->reply.SCSIStatus == MPI_SCSI_STATUS_BUSY || + rep1->reply.SCSIStatus == MPI_SCSI_STATUS_TASK_SET_FULL) + { + memset(rep, 0, repSize); + + if (doMptCommand(port, req, reqSize, rep, repSize, + payIn, payInSize, payOut, payOutSize, timeOut) != 1) + return 0; + + if (mpi2) + { + memcpy(&rep1->reply, &rep2.reply, sizeof rep1->reply); + memcpy(&rep1->sense, &rep2.sense, sizeof rep1->sense); + } + + ioc_status = get16(rep1->reply.IOCStatus) & MPI_IOCSTATUS_MASK; + } + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + if (ioc_status == MPI_IOCSTATUS_SCSI_DATA_UNDERRUN || + ioc_status == MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH) + { + if (rep1->reply.SCSIStatus == MPI_SCSI_STATUS_SUCCESS) + { + if (rep1->reply.TransferCount == 0) + { +// printf("ScsiIo to Bus %d Target %d failed, IOCStatus = %04x (%s)\n", +// bus, target, ioc_status, translateIocStatus(ioc_status)); + return 0; + } + else + return 1; + } + } + else + { + if ((get16(rep1->reply.IOCStatus) & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) != 0) + { + ioc_loginfo = get32(rep1->reply.IOCLogInfo); + printf("ScsiIo to Bus %d Target %d failed, IOCStatus = %04x (%s), IOCLogInfo = %08x\n", + bus, target, ioc_status, translateIocStatus(ioc_status), ioc_loginfo); + } + else + printf("ScsiIo to Bus %d Target %d failed, IOCStatus = %04x (%s)\n", + bus, target, ioc_status, translateIocStatus(ioc_status)); + + return 0; + } + } + + if (rep1->reply.SCSIStatus != MPI_SCSI_STATUS_SUCCESS) + { + if (rep1->reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION) + { + if (rep1->sense[2] == 5 && rep1->sense[12] == 0x20 && rep1->sense[13] == 0x00) + if (payInSize == 36 || payInSize == 32) + return 0; + + if (rep1->sense[2] == 5 && rep1->sense[12] == 0x24 && rep1->sense[13] == 0x00) + if (payInSize == 36 || payInSize == 32 || (command == 0x3c && payInSize <= 4)) + return 0; + + if (rep1->sense[2] == 5 && rep1->sense[12] == 0x25 && rep1->sense[13] == 0x00) + if (payInSize == 36 || payInSize == 32 || (command == 0x3c && payInSize <= 4)) + return 0; + + if (rep1->sense[2] == 0 && rep1->sense[12] == 0x00 && rep1->sense[13] == 0x00) + return 0; + + if (rep1->sense[2] == 4 && rep1->sense[12] == 0x44 && rep1->sense[13] == 0x00) + return 0; + + if (rep1->sense[2] == 0x08) + return 0; + + if (rep1->sense[0] == 0xf0 && rep1->sense[2] & 0xf0) + return 0; + + if (rep1->sense[0] & 0x80) + printf("ScsiIo to Bus %d Target %d failed, Check Condition, Key = %d, ASC/ASCQ = %02Xh/%02Xh, Info = %08Xh (%d)\n", + bus, target, rep1->sense[2] & 0x0f, rep1->sense[12], rep1->sense[13], get4bytes(rep1->sense, 3), get4bytes(rep1->sense, 3)); + else + printf("ScsiIo to Bus %d Target %d failed, Check Condition, Key = %d, ASC/ASCQ = %02Xh/%02Xh\n", + bus, target, rep1->sense[2] & 0x0f, rep1->sense[12], rep1->sense[13]); + +// dumpMemory(rep1->sense, get32(rep1->reply.SenseCount), "Sense Data"); + } + else + { + printf("ScsiIo to Bus %d Target %d failed, SCSIStatus = %02x\n", + bus, target, rep1->reply.SCSIStatus); + } + return 0; + } + + return 1; +} + + +int +doReadLongSata(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len) +{ + SataPassthroughRequest_t req; + SataPassthroughReply_t rep; + unsigned char cmd[512]; + + memset(cmd, 0, sizeof cmd); + + cmd[0] = 1; + cmd[2] = 1; + cmd[4] = lbn; + cmd[5] = lbn >> 8; + cmd[6] = lbn >> 16; + cmd[7] = lbn >> 24; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SATA_PASSTHROUGH; + req.PassthroughFlags = set16(MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_WRITE); + req.DataLength = set32(sizeof cmd); + req.CommandFIS[0] = 0x27; + req.CommandFIS[1] = 0x80; + req.CommandFIS[2] = 0xb0; + req.CommandFIS[3] = 0xd6; + req.CommandFIS[4] = 0xe0; + req.CommandFIS[5] = 0x4f; + req.CommandFIS[6] = 0xc2; + req.CommandFIS[12] = 0x01; + + setName(port, bus, target, &req); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + NULL, 0, cmd, sizeof cmd, SHORT_TIME) != 1) + { + printf("SataPassThrough (SCT / Long Sector Read / E0) failed!\n"); + return 0; + } + + /* if the statusFIS error field has any bits set, then the request was not successful */ + if (rep.StatusFIS[3]) + { + printf("SataPassThrough (SCT / Long Sector Read / E0) failed!\n"); + return 0; + } +// printf("StatusFIS->Error: %02x\n", rep.StatusFIS[3]); +// printf("StatusFIS->Status: %02x\n", rep.StatusFIS[2]); + + req.PassthroughFlags = set16(MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_READ); + req.DataLength = set32(len); + req.CommandFIS[3] = 0xd5; + req.CommandFIS[4] = 0xe1; + req.CommandFIS[12] = 0x02; + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + buf, len, NULL, 0, SHORT_TIME) != 1) + { + printf("SataPassThrough (SCT / Long Sector Read / E1) failed!\n"); + return 0; + } + + /* if the statusFIS error field has any bits set, then the request was not successful */ + if (rep.StatusFIS[3]) + { + printf("SataPassThrough (SCT / Long Sector Read / E1) failed!\n"); + return 0; + } +// printf("StatusFIS->Error: %02x\n", rep.StatusFIS[3]); +// printf("StatusFIS->Status: %02x\n", rep.StatusFIS[2]); + + return 1; +} + + +int +doWriteLongSata(MPT_PORT *port, int bus, int target, int lun, + unsigned int lbn, int mode, unsigned char *buf, int len) +{ + SataPassthroughRequest_t req; + SataPassthroughReply_t rep; + unsigned char cmd[512]; + + memset(cmd, 0, sizeof cmd); + + cmd[0] = 1; + cmd[2] = 2; + cmd[4] = lbn; + cmd[5] = lbn >> 8; + cmd[6] = lbn >> 16; + cmd[7] = lbn >> 24; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SATA_PASSTHROUGH; + req.PassthroughFlags = set16(MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_WRITE); + req.DataLength = set32(sizeof cmd); + req.CommandFIS[0] = 0x27; + req.CommandFIS[1] = 0x80; + req.CommandFIS[2] = 0xb0; + req.CommandFIS[3] = 0xd6; + req.CommandFIS[4] = 0xe0; + req.CommandFIS[5] = 0x4f; + req.CommandFIS[6] = 0xc2; + req.CommandFIS[12] = 0x01; + + setName(port, bus, target, &req); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + NULL, 0, cmd, sizeof cmd, SHORT_TIME) != 1) + { + printf("SataPassThrough (SCT / Long Sector Write / E0) failed!\n"); + return 0; + } + + /* if the statusFIS error field has any bits set, then the request was not successful */ + if (rep.StatusFIS[3]) + { + printf("SataPassThrough (SCT / Long Sector Write / E0) failed!\n"); + return 0; + } +// printf("StatusFIS->Error: %02x\n", rep.StatusFIS[3]); +// printf("StatusFIS->Status: %02x\n", rep.StatusFIS[2]); + + req.PassthroughFlags = set16(MPI_SATA_PT_REQ_PT_FLAGS_PIO | MPI_SATA_PT_REQ_PT_FLAGS_WRITE); + req.DataLength = set32(len); + req.CommandFIS[3] = 0xd6; + req.CommandFIS[4] = 0xe1; + req.CommandFIS[12] = 0x02; + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + NULL, 0, buf, len, SHORT_TIME) != 1) + { + printf("SataPassThrough (SCT / Long Sector Write / E1) failed!\n"); + return 0; + } + + /* if the statusFIS error field has any bits set, then the request was not successful */ + if (rep.StatusFIS[3]) + { + printf("SataPassThrough (SCT / Long Sector Write / E1) failed!\n"); + return 0; + } +// printf("StatusFIS->Error: %02x\n", rep.StatusFIS[3]); +// printf("StatusFIS->Status: %02x\n", rep.StatusFIS[2]); + + return 1; +} + + +int +doFwDownload(MPT_PORT *port, int type, unsigned char *buf, int len, int offset) +{ + FWDownload_t *req1; // the MPI 1.x request is a subset of the MPI 2.x request + Mpi2FWDownloadRequest req; + Mpi25FWDownloadRequest req25; + FWDownloadReply_t rep; + FWDownloadTCSGE_t *tc; + int req_size; + int size; + int ioc_status; + int inLen = len; + int mpt_return = 0; + + memset(&req, 0, sizeof req); + memset(&req25, 0, sizeof req25); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_FW_DOWNLOAD; + req25.Function = MPI2_FUNCTION_FW_DOWNLOAD; + req.ImageType = type; + req25.ImageType = type; + + if (mpi20) + { + tc = (pFWDownloadTCSGE_t)&req.SGL; + req_size = sizeof req - sizeof req.SGL + sizeof *tc; + + req.TotalImageSize = set32(len); + } + else if (mpi25) + { + req_size = sizeof req25 - sizeof req25.SGL; + req25.TotalImageSize = set32(len); + } + else + { + req1 = (pFWDownload_t)&req; + + tc = (pFWDownloadTCSGE_t)&req1->SGL; + req_size = sizeof *req1 - sizeof req1->SGL + sizeof *tc; + } + + if(port->mptVersion < MPI2_VERSION_02_05) + { + tc->ContextSize = 0; + tc->DetailsLength = 12; + tc->Flags = MPI_SGE_FLAGS_TRANSACTION_ELEMENT; + } + + if (port->mptVersion < MPI_VERSION_01_01 && type == MPI_FW_DOWNLOAD_ITYPE_BIOS) + { + int i; + U32 data_l; + U32 data_h; + U32 *p_data_l; + U32 *p_data_h; + + p_data_l = (U32 *)&buf[0]; + p_data_h = (U32 *)&buf[len] - 1; + + for (i = 0; i < len / 8; i++) + { + data_l = *p_data_l; + data_h = *p_data_h; + *p_data_l++ = data_h; + *p_data_h-- = data_l; + } + + offset += 0x100000; + buf += len; + } + + printf("\nDownloading image...\n"); + + while (len > 0) + { + if (port->mptVersion < MPI_VERSION_01_01) + { + int i; + U32 checksum; + + size = min(len, 0x10000); + + if (type == MPI_FW_DOWNLOAD_ITYPE_BIOS) + { + offset -= size; + buf -= size; + } + + checksum = 0; + for (i = 0; i < size / 4; i++) + checksum -= get32x(((U32 *)buf)[i]); + + tc->Reserved_0100_Checksum = set32(checksum); + } + else + { + size = min(len, CHUNK_SIZE); + if (size == len) + { + req.MsgFlags = MPI_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT; + req25.MsgFlags = MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT; + } + } + + if ( port->mptVersion >= MPI2_VERSION_02_05 ) + { + req25.ImageSize = set32(size); + req25.ImageOffset = set32(offset); + mpt_return = doMptCommand(port, &req25, req_size, &rep, sizeof rep, + NULL, 0, buf, size, LONG_TIME); + } + else + { + tc->ImageSize = set32(size); + tc->ImageOffset = set32(offset); + mpt_return = doMptCommand(port, &req, req_size, &rep, sizeof rep, + NULL, 0, buf, size, LONG_TIME); + } + + if ( mpt_return != 1 ) + { + printf("Download failed\n"); + if (wFlag) + fprintf(logFile, "%s: Firmware Download (FW_DOWNLOAD) of type %d: FAIL\n", + logPrefix(port), type); + return 0; + } + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + printf("Download failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + if (wFlag) + fprintf(logFile, "%s: Firmware Download (FW_DOWNLOAD) of type %d: FAIL\n", + logPrefix(port), type); + return 0; + } + + len -= size; + + if (!(port->mptVersion < MPI_VERSION_01_01 && type == MPI_FW_DOWNLOAD_ITYPE_BIOS)) + { + buf += size; + offset += size; + } + } //while(len>0) + + printf("Download succeeded\n"); + + if (wFlag) + fprintf(logFile, "%s: Firmware Download (FW_DOWNLOAD) of type %d size %x: PASS\n", + logPrefix(port), type, inLen); + return 1; +} + + +int +doFwUpload(MPT_PORT *port, int type, unsigned char *buf, int len, int offset, int *outLen) +{ + FWUpload_t *req1; + Mpi2FWUploadRequest_t req; + Mpi25FWUploadRequest_t req25; + FWUploadReply_t rep; + FWUploadTCSGE_t *tc; + int req_size; + int size; + int actual_size; + int ioc_status; + int mpt_return = 0; + + memset(&req, 0, sizeof req); + memset(&req25, 0, sizeof req25); + memset(&rep, 0, sizeof rep); + + req.Function = req25.Function = MPI_FUNCTION_FW_UPLOAD; + req.ImageType = req25.ImageType = type; + + if (mpi20) + { + tc = (pFWUploadTCSGE_t)&req.SGL; + req_size = sizeof req - sizeof req.SGL + sizeof *tc; + } + else if (mpi25) + { + req_size = sizeof(req25) - sizeof(req25.SGL); + } + else + { + req1 = (pFWUpload_t)&req; + tc = (pFWUploadTCSGE_t)&req1->SGL; + req_size = sizeof *req1 - sizeof req1->SGL + sizeof *tc; + } + + if(port->mptVersion < MPI2_VERSION_02_05) + { + tc->ContextSize = 0; + tc->DetailsLength = 12; + tc->Flags = MPI_SGE_FLAGS_TRANSACTION_ELEMENT; + } + + actual_size = 0; + while (len > 0) + { + size = min(len, CHUNK_SIZE); + + if (mpi25) + { + req25.ImageSize = set32(size); + req25.ImageOffset = set32(offset); + mpt_return = doMptCommand(port, &req25, req_size, &rep, sizeof rep, + buf, size, NULL, 0, LONG_TIME); + } + else + { + tc->ImageSize = set32(size); + tc->ImageOffset = set32(offset); + mpt_return = doMptCommand(port, &req, req_size, &rep, sizeof rep, + buf, size, NULL, 0, LONG_TIME); + } + + if (mpt_return != 1) + { + printf("Upload failed\n"); + if (wFlag) + fprintf(logFile, "%s: Firmware Upload (FW_UPLOAD) of type %d: FAIL\n", + logPrefix(port), type); + return 0; + } + + ioc_status = get16(rep.IOCStatus) & MPI_IOCSTATUS_MASK; + actual_size = get32(rep.ActualImageSize); + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + if (ioc_status == MPI_IOCSTATUS_INVALID_FIELD && actual_size != 0) + { + if (offset + size > actual_size) + { + len = actual_size - offset; + continue; + } + } + + printf("Upload failed, IOCStatus = %04x (%s)\n", ioc_status, translateIocStatus(ioc_status)); + if (wFlag) + fprintf(logFile, "%s: Firmware Upload (FW_UPLOAD) of type %d: FAIL\n", + logPrefix(port), type); + return 0; + } + + buf += size; + len -= size; + offset += size; + } + + *outLen = actual_size; + + if (wFlag) + fprintf(logFile, "%s: Firmware Upload (FW_UPLOAD) of type %d size %x: PASS\n", + logPrefix(port), type, *outLen); + return 1; +} + + +int +doIocInit(MPT_PORT *port, int WhoInit) +{ + IOCInit_t req; + IOCInitReply_t rep; + IOCFactsReply_t IOCFacts; + + if (mpi2) + return 1; + + if (getIocFacts(port, &IOCFacts) != 1) + return 0; + + if (IOCFacts.WhoInit == WhoInit) + return 1; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_IOC_INIT; + req.WhoInit = WhoInit; + req.Flags = 0; + req.MaxDevices = IOCFacts.MaxDevices; + req.MaxBuses = IOCFacts.MaxBuses; + req.ReplyFrameSize = IOCFacts.CurReplyFrameSize; + req.HostMfaHighAddr = IOCFacts.CurrentHostMfaHighAddr; + req.SenseBufferHighAddr = IOCFacts.CurrentSenseBufferHighAddr; + req.ReplyFifoHostSignalingAddr = IOCFacts.ReplyFifoHostSignalingAddr; + req.HostPageBufferSGE = IOCFacts.HostPageBufferSGE; + req.MsgVersion = set16(MPI_VERSION_01_05); + req.HeaderVersion = set16(MPI_HEADER_VERSION); + + if (IOCFacts.Flags & MPI_IOCFACTS_FLAGS_REPLY_FIFO_HOST_SIGNAL) + req.Flags |= MPI_IOCINIT_FLAGS_REPLY_FIFO_HOST_SIGNAL; + +#if __linux__ + if (oldMptBaseDetected) + { + // make the Linux IOCTL driver a bit happier + if (req.MaxDevices > port->maxTargets) + req.MaxDevices = port->maxTargets; + if (req.MaxDevices == 0) + req.MaxDevices = 255; + } + if (newMptBaseDetected) + { + // make the Linux IOCTL driver a bit happier + req.MaxDevices = 0; + req.MaxBuses = 0; + } +#endif + + return doMptCommandCheck(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); +} + + +char * +translateSmpFunctionResult(int functionResult) +{ + switch (functionResult) + { + case SMP_RESPONSE_FUNCTION_RESULT_ACCEPTED: return "Function Accepted"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_SMP_FUNCTION: return "Unknown Function"; + case SMP_RESPONSE_FUNCTION_RESULT_SMP_FUNCTION_FAILED: return "Function Failed"; + case SMP_RESPONSE_FUNCTION_RESULT_INVALID_REQUEST_LENGTH: return "Invalid Request Length"; + case SMP_RESPONSE_FUNCTION_RESULT_INVALID_EXP_CHANGE_COUNT: return "Invalid Expander Change Count"; + case SMP_RESPONSE_FUNCTION_RESULT_BUSY: return "Busy"; + case SMP_RESPONSE_FUNCTION_RESULT_INCOMPLETE_DESCRIPTOR_LIST: return "Incomplete Descriptor List"; + case SMP_RESPONSE_FUNCTION_RESULT_PHY_DOES_NOT_EXIST: return "Phy Does Not Exist"; + case SMP_RESPONSE_FUNCTION_RESULT_INDEX_DOES_NOT_EXIST: return "Index Does Not Exist"; + case SMP_RESPONSE_FUNCTION_RESULT_PHY_DOES_NOT_SUPPORT_SATA: return "Phy Does Not Support SATA"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_OPERATION: return "Unknown Phy Operation"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_TEST_FUNCTION: return "Unknown Phy Test Function"; + case SMP_RESPONSE_FUNCTION_RESULT_PHY_TEST_FUNCTION_IN_PROG: return "Phy Test Function In Progress"; + case SMP_RESPONSE_FUNCTION_RESULT_PHY_VACANT: return "Phy Vacant (No Access)"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_EVENT_SOURCE: return "Unknown Phy Event Source"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_DESCRIPTOR_TYPE: return "Unknown Descriptor Type"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_PHY_FILTER: return "Unknown Phy Filter"; + case SMP_RESPONSE_FUNCTION_RESULT_AFFILIATION_VIOLATION: return "Affiliation Violation"; + case SMP_RESPONSE_FUNCTION_RESULT_SMP_ZONE_VIOLATION: return "Zone Violation"; + case SMP_RESPONSE_FUNCTION_RESULT_NO_MANAGEMENT_ACCESS_RIGHTS: return "No Management Access Rights"; + case SMP_RESPONSE_FUNCTION_RESULT_UNKNOWN_ENABLE_DISABLE_ZONING_VALUE: return "Unknown Enable Disable Zoning Value"; + case SMP_RESPONSE_FUNCTION_RESULT_ZONE_LOCK_VIOLATION: return "Zone Lock Violation"; + case SMP_RESPONSE_FUNCTION_RESULT_NOT_ACTIVATED: return "Not Activated"; + case SMP_RESPONSE_FUNCTION_RESULT_ZONE_GROUP_OUT_OF_RANGE: return "Zone Group Out Of Range"; + case SMP_RESPONSE_FUNCTION_RESULT_NO_PHYSICAL_PRESENCE: return "No Physical Presence"; + case SMP_RESPONSE_FUNCTION_RESULT_SAVING_NOT_SUPPORTED: return "Saving Not Supported"; + case SMP_RESPONSE_FUNCTION_RESULT_SOURCE_ZONE_GROUP_DOES_NOT_EXIST: return "Source Zone Group Does Not Exist"; + case SMP_RESPONSE_FUNCTION_RESULT_DISABLED_PASSWORD_NOT_SUPPORTED: return "Disabled Password Not Supported"; + } + + return ""; +} + + +int +doSmpReportMfg(MPT_PORT *port, _U64 SASAddress, U8 physicalPort, PTR_SMP_REPORT_MANUFACTURER_INFO_RESPONSE smpResp, int *respDataLength) +{ + SMP_REPORT_MANUFACTURER_INFO_REQUEST smpReq; + int len; + + memset((PTR_SMP_REQUEST_UNION)&smpReq, 0, sizeof smpReq); + + smpReq.SMPFrameType = SMP_FRAME_TYPE_SMP_REQUEST; + smpReq.Function = SMP_FUNCTION_REPORT_MANUFACTURER_INFORMATION; + smpReq.ResponseLength = ALLOCATED_RESP_LEN; + smpReq.RequestLength = 0; + + if (doSmpPassthrough(port, physicalPort, SASAddress, + (void *)&smpReq, sizeof smpReq, (void *)smpResp, sizeof *smpResp, &len) == 1) + { + if (respDataLength) + { + *respDataLength = len; + } + + return 1; + } + + return 0; +} + + +int +doSmpPassthrough(MPT_PORT *port, U8 smpPort, _U64 smpAddr, void *smpReq, int smpReqSize, void *smpRsp, int smpRspSize, int *respDataLen) +{ + SmpPassthroughRequest_t req; + SmpPassthroughReply_t rep; + + memset(&req, 0, sizeof req); + memset(&rep, 0, sizeof rep); + + req.Function = MPI_FUNCTION_SMP_PASSTHROUGH; + req.PhysicalPort = smpPort; + req.RequestDataLength = set16(smpReqSize); + req.SASAddress = smpAddr; + + memset(smpRsp, 0, smpRspSize); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + smpRsp, smpRspSize, smpReq, smpReqSize, SHORT_TIME) == 1) + { + if (respDataLen) + { + *respDataLen = get16(rep.ResponseDataLength) + 4; + } + return 1; + } + else + return 0; +} + + +int +doResetPort(MPT_PORT *port) +{ + int t; +#if WIN32 + int status; + MPI_DIAG_RESET_SRB srb; + int inLen; + int outLen; + DWORD retLen; + + memset(&srb, 0, sizeof srb); + + srb.Sic.Length = sizeof srb - sizeof srb.Sic; + srb.Sic.ControlCode = MPI_DIAG_RESET; + srb.Sic.HeaderLength = sizeof srb.Sic; + srb.Sic.Timeout = RESET_TIME; + + memcpy((char *)&srb.Sic.Signature, "v93Ap6Q4", 8); + + inLen = sizeof srb; + outLen = sizeof srb; + retLen = 0; + + printf("Resetting port...\n"); + + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + &srb, inLen, &srb, outLen, &retLen, NULL); + + t = status; +#endif +#if __linux__ || __alpha__ + int status; + struct mpt_ioctl_diag_reset diag_reset; + + memset(&diag_reset, 0, sizeof diag_reset); + + diag_reset.hdr.iocnum = port->portNumber; + + printf("Resetting port...\n"); + + if (mpi2) + status = ioctl(port->fileHandle, MPT2HARDRESET, &diag_reset); + else + status = ioctl(port->fileHandle, MPTHARDRESET, &diag_reset); + + t = status == 0; +#endif +#if __sparc__ || __irix__ + int status; +#if __irix__ + struct scsi_ha_op scsiioctl; +#endif + + printf("Resetting port...\n"); + +#if __sparc__ + if (mpi2) + status = ioctl(port->fileHandle, MPTIOCTL_RESET_ADAPTER); + else + status = ioctl(port->fileHandle, SYMIOCTL_RESET_ADAPTER); +#endif +#if __irix__ + scsiioctl.sb_opt = SYMIOCTL_RESET_ADAPTER; + status = ioctl(port->fileHandle, SOP_GETDATA, &scsiioctl); +#endif + + t = status == 0; +#endif +#if DOS || EFI + printf("Resetting port...\n"); + + port->fileHandle->restart_needed = TRUE; + port->fileHandle->port_enable_needed = FALSE; + + port->fileHandle->ioc_online = mpt_restart(port->fileHandle); + + t = port->fileHandle->ioc_online; +#endif + + if (wFlag) + fprintf(logFile, "%s: Reset Adapter: %s\n", + logPrefix(port), t ? "PASS" : "FAIL"); + + if (t != 1) + printf("Failed to reset port!\n"); + + return t; +} + + +void +doLogMptCommandReq(MPT_PORT *port, void *req, int reqSize) +{ + int i; + + fprintf(logFile, "%s: MPT Req: ", logPrefix(port)); + for (i = 0; i < reqSize / 4; i++) + fprintf(logFile, " %08x", get32x(((U32 *)req)[i])); + fprintf(logFile, "\n"); +} + + +void +doLogMptCommandRep(MPT_PORT *port, void *rep, int repSize, int status) +{ + int i; + MPIDefaultReply_t *defaultRep; + + fprintf(logFile, "%s: MPT Rep: ", logPrefix(port)); + if (status == 1) + { + defaultRep = (pMPIDefaultReply_t)rep; + for (i = 0; i < defaultRep->MsgLength; i++) + fprintf(logFile, " %08x", get32x(((U32 *)rep)[i])); + if (defaultRep->Function == MPI_FUNCTION_SCSI_IO_REQUEST || + defaultRep->Function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + defaultRep->Function == MPI_FUNCTION_SCSI_IO_32) + { + if (defaultRep->MsgLength == 0) + fprintf(logFile, " "); + if (mpi2) + { + SCSI_REPLY2 *scsiRep = (SCSI_REPLY2 *)rep; + + if (scsiRep->reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION) + { + fprintf(logFile, "\n%s: Sense Data: ", logPrefix(port)); + for (i = 0; i < (int)get32(scsiRep->reply.SenseCount); i++) + fprintf(logFile, " %02x", scsiRep->sense[i]); + } + } + else + { + SCSI_REPLY *scsiRep = (SCSI_REPLY *)rep; + + if (scsiRep->reply.SCSIStatus == MPI_SCSI_STATUS_CHECK_CONDITION) + { + fprintf(logFile, "\n%s: Sense Data: ", logPrefix(port)); + for (i = 0; i < (int)get32(scsiRep->reply.SenseCount); i++) + fprintf(logFile, " %02x", scsiRep->sense[i]); + } + } + } + } + else + { + fprintf(logFile, " "); + } + fprintf(logFile, "\n"); +} + + +void +logMptCommandReq(MPT_PORT *port, void *req, int reqSize) +{ + if (wFlag >= 3) + { + doLogMptCommandReq(port, req, reqSize); + } +} + + +void +logMptCommandRep(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, int status) +{ +#if DOS || EFI + MPIHeader_t *reqL = (pMPIHeader_t)req; +#endif + MPIDefaultReply_t *repL = (pMPIDefaultReply_t)rep; + int ioc_status = get16(repL->IOCStatus) & MPI_IOCSTATUS_MASK; + +#if DOS || EFI + if (req && reqSize && reqL->Function == repL->Function && repL->MsgLength != 0) + { + status = 1; // reply is initially zeroed, so if we get here we can trust it + } +#endif + + if (wFlag >= 3) + { + doLogMptCommandRep(port, rep, repSize, status); + } + else if (wFlag >= 2 && (status == 0 || ioc_status != MPI_IOCSTATUS_SUCCESS)) + { + if (req && reqSize) + { + doLogMptCommandReq(port, req, reqSize); + } + doLogMptCommandRep(port, rep, repSize, status); + } +} + + +int +doMptCommand(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut) +{ +#if WIN32 + int cmd; + int status; + SRB_BUFFER srb_buffer; + SRB_BUFFER *srb; + int inLen; + int outLen; + DWORD retLen; + int size; + int retry; + int function = ((pMPIHeader_t)req)->Function; + + /* + * Add 8 for IoctlDetails, 128 for maximum request and reply, + * and 256 for maximum sense data (for SCSI I/O requests). + */ + size = 8 + 128 + 256 + max(payInSize, payOutSize); + if (size > sizeof srb->Buf) + srb = malloc(sizeof srb->Sic + size); + else + srb = &srb_buffer; + + memset(srb, 0, sizeof srb->Sic + size); + + srb->Sic.Length = size; + srb->Sic.ControlCode = MPI_MSG_IOCTL; + srb->Sic.HeaderLength = sizeof srb->Sic; + srb->Sic.Timeout = timeOut; + + memcpy((char *)&srb->Sic.Signature, "4.00 ", 8); + + if (payInSize != 0 && payOutSize != 0) + cmd = DUAL_SGLS; // data in and data out + else if (payInSize != 0) + cmd = 0; // data in + else if (payOutSize != 0) + cmd = DATA_FROM_APP; // data out + else + cmd = 0; // no data transfer, just say Read + + if (function == MPI_FUNCTION_SCSI_IO_REQUEST || + function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + function == MPI_FUNCTION_SCSI_IO_32) + { + if (function == MPI_FUNCTION_SCSI_IO_REQUEST || + function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) + cmd |= SCSI_IO; // flag SCSI I/O, potentially get sense data + ((pMPIHeader_t)req)->MsgContext = 0; + } + + *(PUSHORT)&srb->Buf[0] = cmd; + *(PUSHORT)&srb->Buf[2] = reqSize / 4; + if (cmd & DATA_FROM_APP) + *(PULONG)&srb->Buf[4] = payOutSize; + else + *(PULONG)&srb->Buf[4] = payInSize; + + if (cmd & DUAL_SGLS) + { + if (payInSize > 0xffff || payOutSize > 0xffff) + { + printf("Payload sizes too large, max is 64 KB!\n"); + return 0; + } + *(PUSHORT)&srb->Buf[4] = payInSize; + *(PUSHORT)&srb->Buf[6] = payOutSize; + } + + memcpy(&srb->Buf[8], req, reqSize); + if (payOutSize != 0) + memcpy(&srb->Buf[8+reqSize], payOut, payOutSize); + + inLen = sizeof srb->Sic + size; + outLen = sizeof srb->Sic + size; + retLen = 0; + + logMptCommandReq(port, req, reqSize); + + for (retry = 0; retry < 10; retry++) + { + status = DeviceIoControl(port->fileHandle, port->ioctlValue, + srb, inLen, srb, outLen, &retLen, NULL); + + if (status == 1) + { + gRetDataLen = retLen - sizeof(SRB_IO_CONTROL) - port->payOff; + + memcpy(rep, &srb->Buf[0], repSize); + if (payInSize != 0) + memcpy(payIn, &srb->Buf[port->payOff], payInSize); + + if (function == MPI_FUNCTION_SCSI_IO_REQUEST || + function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + function == MPI_FUNCTION_SCSI_IO_32) + { + if (mpi2) + { + Mpi2SCSIIOReply_t *scsiRep = (pMpi2SCSIIOReply_t)rep; + + if (scsiRep->MsgLength == 0) + memset(rep, 0, repSize); + + /* copy the sense data to where it is expected to be */ + memcpy(scsiRep + 1, &srb->Buf[port->payOff + payInSize], repSize - sizeof *scsiRep); + } + else + { + SCSIIOReply_t *scsiRep = (pSCSIIOReply_t)rep; + + if (scsiRep->MsgLength == 0) + memset(rep, 0, repSize); + + /* copy the sense data to where it is expected to be */ + memcpy(scsiRep + 1, &srb->Buf[port->payOff + payInSize], repSize - sizeof *scsiRep); + } + } + + break; + } + + if (GetLastError() == ERROR_BUSY) + { + sleep(1); + } + else + { + printf("IOCTL to %s failed due to error %ld\n", port->portName, GetLastError()); + break; + } + } + if (status != 1 && retry == 10) + printf("IOCTL to %s failed due to ERROR_BUSY %d times\n", port->portName, retry); + + logMptCommandRep(port, req, reqSize, rep, repSize, status); + + if (size > sizeof srb->Buf) + free(srb); + + return status; +#endif +#if __linux__ || __alpha__ + int status; + int extra; + struct mpt_ioctl_command *command; + int retry; + int function = ((pMPIHeader_t)req)->Function; + + extra = max(0, reqSize - sizeof command->MF); + command = (struct mpt_ioctl_command *)malloc(sizeof *command + extra); + + memset(command, 0, sizeof *command); + + command->hdr.iocnum = port->portNumber; + + command->timeout = timeOut; + command->replyFrameBufPtr = rep; + command->dataInBufPtr = payIn; + command->dataOutBufPtr = payOut; + command->maxReplyBytes = repSize; + command->dataInSize = payInSize; + command->dataOutSize = payOutSize; + command->dataSgeOffset = reqSize / 4; + + if (function == MPI_FUNCTION_SCSI_IO_REQUEST || + function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + function == MPI_FUNCTION_SCSI_IO_32) + { + if (mpi2) + { + Mpi2SCSIIOReply_t *scsiRep = (pMpi2SCSIIOReply_t)rep; + + command->senseDataPtr = (char *)(scsiRep + 1); + command->maxSenseBytes = repSize - sizeof *scsiRep; + command->maxReplyBytes = sizeof *scsiRep; + } + else + { + SCSIIOReply_t *scsiRep = (pSCSIIOReply_t)rep; + + command->senseDataPtr = (char *)(scsiRep + 1); + command->maxSenseBytes = repSize - sizeof *scsiRep; + command->maxReplyBytes = sizeof *scsiRep; + } + } + + memcpy(command->MF, req, reqSize); + + logMptCommandReq(port, req, reqSize); + + for (retry = 0; retry < 10; retry++) + { + errno = 0; + + if (mpi2) + status = ioctl(port->fileHandle, MPT2COMMAND, command); + else + status = ioctl(port->fileHandle, MPTCOMMAND, command); + + if (status != 0 && errno == EAGAIN) + { + sleep(1); + } + else + { + break; + } + } + + logMptCommandRep(port, req, reqSize, rep, repSize, status == 0); + +#if __linux__ + if (status != 0) + { + if (errno == EFAULT) + { + if (((pMPIHeader_t)req)->Function == MPI_FUNCTION_IOC_INIT) + { + IOCInit_t *iocinitReq = (pIOCInit_t)req; + int maxDevices; + + free(command); + + if (workaroundsTried == TRUE) + return 0; + + workaroundsTried = TRUE; + + // try to make the Linux IOCTL driver a bit happier + + maxDevices = iocinitReq->MaxDevices; + if (iocinitReq->MaxDevices > port->maxTargets) + iocinitReq->MaxDevices = port->maxTargets; + if (iocinitReq->MaxDevices == 0) + iocinitReq->MaxDevices = 255; + if (iocinitReq->MaxDevices != maxDevices) + { + status = doMptCommand(port, req, reqSize, rep, repSize, + payIn, payInSize, payOut, payOutSize, timeOut); + + if (status == 1) + { + oldMptBaseDetected = 1; + return 1; + } + } + + if (iocinitReq->MaxDevices != 0 || iocinitReq->MaxBuses != 0) + { + iocinitReq->MaxDevices = 0; + iocinitReq->MaxBuses = 0; + + status = doMptCommand(port, req, reqSize, rep, repSize, + payIn, payInSize, payOut, payOutSize, timeOut); + + if (status == 1) + { + newMptBaseDetected = 1; + return 1; + } + } + + return 0; + } + + if (((pMPIHeader_t)req)->Function != MPI_FUNCTION_SCSI_IO_REQUEST) + { + printf("Command rejected by mptctl!\n"); + } + } + } +#endif + + free(command); + + return status == 0; +#endif +#if __sparc__ || __irix__ + int status; +#if __sparc__ + SYM_PASS_THRU_TIMEOUT passThru; +#endif +#if __irix__ + struct scsi_ha_op scsiioctl; + SYM_PASS_THRU passThru; +#endif + + passThru.PtrRequest = (UINT64)(UINT32)req; + passThru.RequestSize = reqSize; + passThru.PtrReply = (UINT64)(UINT32)rep; + passThru.ReplySize = repSize; + if (payInSize != 0 && payOutSize != 0) + { + passThru.PtrData = (UINT64)(UINT32)payIn; + passThru.DataSize = payInSize; + passThru.PtrDataOut = (UINT64)(UINT32)payOut; + passThru.DataOutSize = payOutSize; + passThru.DataDirection = SYM_PASS_THRU_BOTH; + } + else if (payInSize != 0) + { + passThru.PtrData = (UINT64)(UINT32)payIn; + passThru.DataSize = payInSize; + passThru.DataDirection = SYM_PASS_THRU_READ; + } + else if (payOutSize != 0) + { + passThru.PtrData = (UINT64)(UINT32)payOut; + passThru.DataSize = payOutSize; + passThru.DataDirection = SYM_PASS_THRU_WRITE; + } + else + { + passThru.PtrData = (UINT64)(UINT32)NULL; + passThru.DataSize = 0; + passThru.PtrDataOut = (UINT64)(UINT32)NULL; + passThru.DataOutSize = 0; + passThru.DataDirection = SYM_PASS_THRU_NONE; + } +#if __sparc__ + passThru.Timeout = timeOut; +#endif + + logMptCommandReq(port, req, reqSize); + +#if __sparc__ + status = ioctl(port->fileHandle, port->ioctlValue, &passThru); + if (port->ioctlValue == SYMIOCTL_PASS_THRU_TIMEOUT && status != 0) + { + port->ioctlValue = SYMIOCTL_PASS_THRU; + status = ioctl(port->fileHandle, port->ioctlValue, &passThru); + } +#endif +#if __irix__ + scsiioctl.sb_opt = SYMIOCTL_PASS_THRU; + scsiioctl.sb_addr = (uintptr_t)&passThru; + status = ioctl(port->fileHandle, SOP_GETDATA, &scsiioctl); +#endif + + logMptCommandRep(port, req, reqSize, rep, repSize, status == 0); + + return status == 0; +#endif +#if DOS || EFI + HANDLE adap = port->fileHandle; + SGESimple64_t *sgeSimple = (pSGESimple64_t)((U8 *)req + reqSize); + U8 function = ((pMPIHeader_t)req)->Function; + int handshake_okay; + int no_port_enable_okay; + int ioc_status; + int t; + U8 ieee_sgl; + Mpi2IeeeSgeSimple64_t *sgeIeeeSimple = (pMpi2IeeeSgeSimple64_t)((U8 *)req + reqSize); + + if (adap->restart_needed == TRUE) + { + mpt_stop(adap, TRUE); + } + + if (adap->ioc_online == TRUE) + { + adap->ioc_online = mpt_verify_operational(adap); + } + + handshake_okay = + function == MPI_FUNCTION_IOC_INIT || + function == MPI_FUNCTION_IOC_FACTS || + function == MPI_FUNCTION_PORT_FACTS || + function == MPI_FUNCTION_CONFIG || + ((function == MPI_FUNCTION_TOOLBOX || + function == MPI_FUNCTION_FW_DOWNLOAD) && adap->bootloader) || + (function == MPI_FUNCTION_FW_UPLOAD && (port->flags & MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT)); + + ieee_sgl = ((mpi25) && + (function == MPI2_FUNCTION_SCSI_IO_REQUEST || + function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + function == MPI2_FUNCTION_SMP_PASSTHROUGH || + function == MPI2_FUNCTION_SATA_PASSTHROUGH || + function == MPI2_FUNCTION_FW_UPLOAD || + function == MPI2_FUNCTION_FW_DOWNLOAD || + function == MPI2_FUNCTION_TARGET_ASSIST || + function == MPI2_FUNCTION_TARGET_STATUS_SEND || + ((function == MPI2_FUNCTION_TOOLBOX) && (((pMPI2RequestHeader_t)req)->FunctionDependent1 == MPI2_TOOLBOX_DIAGNOSTIC_CLI_TOOL)) + )); + + no_port_enable_okay = handshake_okay || + function == MPI_FUNCTION_TOOLBOX || + function == MPI_FUNCTION_FW_DOWNLOAD || + function == MPI_FUNCTION_FW_UPLOAD; + + if (adap->ioc_online == FALSE && !handshake_okay) + { + adap->port_enable_needed = !no_port_enable_okay; + + adap->ioc_online = mpt_restart(adap); + + if (adap->ioc_online == FALSE && + (adap->bootloader == TRUE || adap->loaddevice == TRUE)) + { + printf("MPT Function %02x not supported!\n", function); + errno = EFAULT; + return 0; + } + } + + if (adap->ioc_online == TRUE && adap->port_online == FALSE && !no_port_enable_okay) + { + adap->port_online = mpt_port_online(adap); + } + + if (payOut && payOutSize) + { + if (payOutSize > sizeof adap->shared->scratch) + { + printf("payOutSize (%x) too big!\n", payOutSize); + return 0; + } + + if (ieee_sgl) + { + sgeIeeeSimple->Flags = MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT | + MPI25_IEEE_SGE_FLAGS_END_OF_LIST | + MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR; + sgeIeeeSimple->Length = set32(payOutSize); + sgeIeeeSimple->Address.Low = set32((U32)adap->shared_ba + offsetof(mpt_shared_t, scratch)); +#if DOS + sgeIeeeSimple->Address.High = 0; +#else + sgeIeeeSimple->Address.High = set32((U32)(adap->shared_ba >> 32)); +#endif + sgeIeeeSimple++; + reqSize += sizeof(Mpi2IeeeSgeSimple64_t); + } + else + { + sgeSimple->FlagsLength = set32(payOutSize | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_64_BIT_ADDRESSING | + MPI_SGE_FLAGS_HOST_TO_IOC | + MPI_SGE_FLAGS_END_OF_BUFFER | + MPI_SGE_FLAGS_END_OF_LIST)); + sgeSimple->Address.Low = set32((U32)adap->shared_ba + offsetof(mpt_shared_t, scratch)); +#if DOS + sgeSimple->Address.High = 0; +#else + sgeSimple->Address.High = set32((U32)(adap->shared_ba >> 32)); +#endif + sgeSimple++; + + reqSize += sizeof(SGESimple64_t); + + } + bcopy(payOut, adap->shared->scratch, payOutSize); + } + + if (payIn && payInSize) + { + if (payInSize > sizeof adap->shared->scratch) + { + printf("payInSize (%x) too big!\n", payInSize); + return 0; + } + if (ieee_sgl) + { + sgeIeeeSimple->Flags = MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT | + MPI25_IEEE_SGE_FLAGS_END_OF_LIST | + MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR; + sgeIeeeSimple->Length = set32(payInSize); + sgeIeeeSimple->Address.Low = set32((U32)adap->shared_ba + offsetof(mpt_shared_t, scratch)); +#if DOS + sgeIeeeSimple->Address.High = 0; +#else + sgeIeeeSimple->Address.High = set32((U32)(adap->shared_ba >> 32)); +#endif + sgeIeeeSimple++; + reqSize += sizeof(Mpi2IeeeSgeSimple64_t); + } + else + { + sgeSimple->FlagsLength = set32(payInSize | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_64_BIT_ADDRESSING | + MPI_SGE_FLAGS_IOC_TO_HOST | + MPI_SGE_FLAGS_END_OF_BUFFER | + MPI_SGE_FLAGS_END_OF_LIST)); + sgeSimple->Address.Low = set32((U32)adap->shared_ba + offsetof(mpt_shared_t, scratch)); +#if DOS + sgeSimple->Address.High = 0; +#else + sgeSimple->Address.High = set32((U32)(adap->shared_ba >> 32)); +#endif + sgeSimple++; + + reqSize += sizeof(SGESimple64_t); + } + } + + if (mpi2 && !(payOut && payOutSize) && !(payIn && payInSize)) + { + if (function == MPI_FUNCTION_SCSI_IO_REQUEST || + function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + function == MPI_FUNCTION_CONFIG) + { + if (ieee_sgl) + { + sgeIeeeSimple->Flags = MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT | + MPI25_IEEE_SGE_FLAGS_END_OF_LIST | + MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR; + sgeIeeeSimple->Length = set32(payInSize); + sgeIeeeSimple->Address.Low = 0; + sgeIeeeSimple->Address.High = 0; + sgeIeeeSimple++; + reqSize += sizeof(Mpi2IeeeSgeSimple64_t); + } + else + { + sgeSimple->FlagsLength = set32(payInSize | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_32_BIT_ADDRESSING | + MPI_SGE_FLAGS_END_OF_BUFFER | + MPI_SGE_FLAGS_END_OF_LIST)); + sgeSimple->Address.Low = 0; + sgeSimple->Address.High = 0; + sgeSimple++; + + reqSize += sizeof(SGESimple64_t); + } + } + } + + if (mpi2) + adap->msg_context = PASS_THRU_CONTEXT; + else + ((pMPIHeader_t)req)->MsgContext = set32(PASS_THRU_CONTEXT); + + if (function == MPI_FUNCTION_SCSI_IO_REQUEST || + function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || + function == MPI_FUNCTION_SCSI_IO_32) + { + if (mpi20) + { + Mpi2SCSIIORequest_t *scsiReq = (pMpi2SCSIIORequest_t)req; + Mpi2SCSIIOReply_t *scsiRep = (pMpi2SCSIIOReply_t)rep; + + scsiReq->SenseBufferLowAddress = + set32((U32)adap->shared_ba + offsetof(mpt_shared_t, data) + sizeof *scsiRep); + scsiReq->SenseBufferLength = (U8)(repSize - sizeof *scsiRep); + } + else if (mpi25) + { + Mpi25SCSIIORequest_t *scsiReq = (pMpi25SCSIIORequest_t)req; + Mpi2SCSIIOReply_t *scsiRep = (pMpi2SCSIIOReply_t)rep; + + scsiReq->SenseBufferLowAddress = + set32((U32)adap->shared_ba + offsetof(mpt_shared_t, data) + sizeof *scsiRep); + scsiReq->SenseBufferLength = (U8)(repSize - sizeof *scsiRep); + } + else + { + SCSIIORequest_t *scsiReq = (pSCSIIORequest_t)req; + SCSIIOReply_t *scsiRep = (pSCSIIOReply_t)rep; + + scsiReq->SenseBufferLowAddr = + set32((U32)adap->shared_ba + offsetof(mpt_shared_t, data) + sizeof *scsiRep); + scsiReq->SenseBufferLength = (U8)(repSize - sizeof *scsiRep); + } + } + + bcopy(req, adap->shared->message, reqSize); + + logMptCommandReq(port, req, reqSize); + + if (adap->ioc_online == TRUE) + { + if (mpt_verify_operational(adap)) + { + t = mpt_issue_command_and_wait(adap, timeOut); + + if (t != 1) + { + printf("mpt_issue_command_and_wait failed\n"); + } + } + else + { + t = 0; + } + } + else + { + time_t limit = time(NULL) + timeOut; + + if (mpt_verify_ready(adap) || mpt_verify_operational(adap)) + { + t = mpt_send_message(adap, reqSize, limit); + + if (t != 1) + { + printf("mpt_send_message failed!\n"); + } + else + { + t = mpt_receive_data(adap, repSize, limit); + + if (t != 1) + { + if (adap->bootloader == FALSE || + !(function == MPI_FUNCTION_IOC_INIT || + function == MPI_FUNCTION_IOC_FACTS || + function == MPI_FUNCTION_PORT_FACTS || + function == MPI_FUNCTION_CONFIG)) + { + ioc_status = get16(((pMPIDefaultReply_t)adap->shared->data)->IOCStatus) & MPI_IOCSTATUS_MASK; + + printf("[%s] mpt_receive_data failed, function = %d, IOCStatus = %04x (%s)\n", + port->portName, function, ioc_status, translateIocStatus(ioc_status)); + } + } + } + } + else + { + t = 0; + } + } + + bcopy(adap->shared->data, rep, repSize); + + logMptCommandRep(port, req, reqSize, rep, repSize, t); + + if (payIn && payInSize) + { + bcopy(adap->shared->scratch, payIn, payInSize); + } + + return t; +#endif +} + + +int +doMptCommandCheck(MPT_PORT *port, void *req, int reqSize, void *rep, int repSize, + void *payIn, int payInSize, void *payOut, int payOutSize, int timeOut) +{ + MPIDefaultReply_t *defaultRep; + int ioc_status; + int ioc_loginfo; + + if (doMptCommand(port, req, reqSize, rep, repSize, + payIn, payInSize, payOut, payOutSize, timeOut) != 1) + { + printf("\nFailed to issue command\n"); + return 0; + } + + defaultRep = (pMPIDefaultReply_t)rep; + ioc_status = get16(defaultRep->IOCStatus) & MPI_IOCSTATUS_MASK; + + if (ioc_status != MPI_IOCSTATUS_SUCCESS) + { + if ((get16(defaultRep->IOCStatus) & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) != 0) + { + ioc_loginfo = get32(defaultRep->IOCLogInfo); + printf("\nCommand failed with IOCStatus = %04x (%s), IOCLogInfo = %08x\n", + ioc_status, translateIocStatus(ioc_status), ioc_loginfo); + } + else + printf("\nCommand failed with IOCStatus = %04x (%s)\n", + ioc_status, translateIocStatus(ioc_status)); + + return 0; + } + + if (defaultRep->Function == MPI_FUNCTION_RAID_ACTION) + { + ioc_loginfo = get32(defaultRep->IOCLogInfo); + if (ioc_loginfo) + { + printf("\nRAID ACTION returned IOCLogInfo = %08x\n", ioc_loginfo); + } + } + + return 1; +} + + +char * +translateIocStatus(int ioc_status) +{ + // Bit 15 means "Log Info Available". Therefore, + // we only want bits 0 through 14. Otherwise, + // this routine won't work when log info is available. + ioc_status &= MPI_IOCSTATUS_MASK; + + switch (ioc_status) + { + case MPI_IOCSTATUS_SUCCESS: return "Success"; + case MPI_IOCSTATUS_INVALID_FUNCTION: return "Invalid Function"; + case MPI_IOCSTATUS_BUSY: return "IOC Busy"; + case MPI_IOCSTATUS_INVALID_SGL: return "Invalid SGL"; + case MPI_IOCSTATUS_INTERNAL_ERROR: return "Internal Error"; + case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: return "Insufficient Resources"; + case MPI_IOCSTATUS_INVALID_FIELD: return "Invalid Field"; + case MPI_IOCSTATUS_INVALID_STATE: return "Invalid State"; + case MPI_IOCSTATUS_OP_STATE_NOT_SUPPORTED: return "Operational State Not Supported"; + case MPI_IOCSTATUS_CONFIG_INVALID_ACTION: return "Invalid Action"; + case MPI_IOCSTATUS_CONFIG_INVALID_TYPE: return "Invalid Type"; + case MPI_IOCSTATUS_CONFIG_INVALID_PAGE: return "Invalid Page"; + case MPI_IOCSTATUS_CONFIG_INVALID_DATA: return "Invalid Data"; + case MPI_IOCSTATUS_CONFIG_NO_DEFAULTS: return "No Defaults"; + case MPI_IOCSTATUS_CONFIG_CANT_COMMIT: return "Can't Commit"; + case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: return "Recovered Error"; + case MPI_IOCSTATUS_SCSI_INVALID_BUS: return "Invalid Bus"; + case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: return "Invalid Target"; + case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: return "Device Not There"; + case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: return "Data Overrun"; + case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: return "Data Underrun"; + case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: return "I/O Data Error"; + case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: return "Protocol Error"; + case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: return "Task Terminated"; + case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: return "Residual Mismatch"; + case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: return "Task Managment Failed"; + case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: return "IOC Terminated"; + case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: return "Externally Terminated"; + case MPI_IOCSTATUS_EEDP_GUARD_ERROR: return "EEDP Guard Error"; + case MPI_IOCSTATUS_EEDP_REF_TAG_ERROR: return "EEDP Reference Tag Error"; + case MPI_IOCSTATUS_EEDP_APP_TAG_ERROR: return "EEDP Application Tag Error"; + case MPI_IOCSTATUS_TARGET_PRIORITY_IO: return "Target Priority I/O"; + case MPI_IOCSTATUS_TARGET_INVALID_PORT: return "Invalid Port"; + case MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX: return "Invalid I/O Index"; + case MPI_IOCSTATUS_TARGET_ABORTED: return "Target Aborted"; + case MPI_IOCSTATUS_TARGET_NO_CONN_RETRYABLE: return "No Connection, Retryable"; + case MPI_IOCSTATUS_TARGET_NO_CONNECTION: return "No Connection"; + case MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH: return "Transfer Count Mismatch"; + case MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT: return "Status Data Not Sent"; + case MPI_IOCSTATUS_TARGET_DATA_OFFSET_ERROR: return "Data Offset Error"; + case MPI_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA: return "Too Much Write Data"; + case MPI_IOCSTATUS_TARGET_IU_TOO_SHORT: return "Target IU Too Short"; + case MPI_IOCSTATUS_FC_ABORTED: return "FC Aborted"; + case MPI_IOCSTATUS_FC_RX_ID_INVALID: return "RX_ID Invalid"; + case MPI_IOCSTATUS_FC_DID_INVALID: return "D_ID Invalid"; + case MPI_IOCSTATUS_FC_NODE_LOGGED_OUT: return "Node Logged Out"; + case MPI_IOCSTATUS_FC_EXCHANGE_CANCELED: return "Exchange Canceled"; + case MPI_IOCSTATUS_LAN_DEVICE_NOT_FOUND: return "LAN Device Not Found"; + case MPI_IOCSTATUS_LAN_DEVICE_FAILURE: return "LAN Device Failure"; + case MPI_IOCSTATUS_LAN_TRANSMIT_ERROR: return "LAN Transmit Error"; + case MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED: return "LAN Transmit Aborted"; + case MPI_IOCSTATUS_LAN_RECEIVE_ERROR: return "LAN Receive Error"; + case MPI_IOCSTATUS_LAN_RECEIVE_ABORTED: return "LAN Receive Aborted"; + case MPI_IOCSTATUS_LAN_PARTIAL_PACKET: return "LAN Partial Packet"; + case MPI_IOCSTATUS_LAN_CANCELED: return "LAN Canceled"; + case MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED: return "SMP Request Failed"; + case MPI_IOCSTATUS_SAS_SMP_DATA_OVERRUN: return "SMP Data Overrun"; + case MPI_IOCSTATUS_INBAND_ABORTED: return "Inband Aborted"; + case MPI_IOCSTATUS_INBAND_NO_CONNECTION: return "Inband No Connection"; + case MPI_IOCSTATUS_DIAGNOSTIC_RELEASED: return "Diagnostic Buffer Released"; + case MPI2_IOCSTATUS_RAID_ACCEL_ERROR: return "RAID Accelerator Error"; + } + + return ""; +} + + +void +displayByteData(unsigned char *buf, int len) +{ + int i; + int j; + char c[16]; + + for (i = 0, j = 0; i < len; i++, j++) + { + if (j == 0) + printf("%04x : ", i); + + printf("%02x ", buf[i]); + + if (!isprint(buf[i])) + c[j] = ' '; + else + c[j] = buf[i]; + + if (j == sizeof c - 1) + { + printf(" "); + for (j = 0; j < sizeof c; j++) + { + printf("%c", c[j]); + } + printf("\n"); + j = -1; + } + } + + if (j != 0) + { + for (i = j; i < sizeof c; i++) + printf(" "); + + printf(" "); + for (i = 0; i < j; i++) + { + printf("%c", c[i]); + } + printf("\n"); + } +} + + +void +dumpMemory(void *buf, int len, char *string) +{ + U8 *p = (U8 *)buf; + int i; + + if (string != NULL) + printf("\n%s\n", string); + for (i = 0; i < len; i += 4) + printf("%04x : %02x%02x%02x%02x %c%c%c%c\n", i, + p[i+3], p[i+2], p[i+1], p[i+0], + isprint(p[i+0]) ? p[i+0] : '.', + isprint(p[i+1]) ? p[i+1] : '.', + isprint(p[i+2]) ? p[i+2] : '.', + isprint(p[i+3]) ? p[i+3] : '.'); +} + + +void +dumpMemoryWide(void *buf, int len, char *string) +{ + U32 *p = (U32 *)buf; + int i; + + if (string != NULL) + printf("\n%s", string); + for (i = 0; i < len/4; i++) + { + if ((i % 8) == 0) + printf("\n%04x : %08x", i * 4, get32x(p[i])); + else + printf(" %08x", get32x(p[i])); + } + printf("\n"); +} + + +#define POLY 0x8bb7 + +unsigned short polyTableT10[256]; + + +void +initT10Crc(void) +{ + unsigned int data; + unsigned int crc; + unsigned int r_mask; + unsigned int d_mask; + int i; + int j; + + r_mask = 1 << (16 - 1); + d_mask = 1 << (8 - 1); + + for (i = 0; i < 256; i++) + { + data = i; + + crc = 0; + + for (j = 0; j < 8; j++) + { + if (( (crc & r_mask) && !(data & d_mask)) || + (!(crc & r_mask) && (data & d_mask))) + { + crc = ((crc << 1) ^ POLY) & 0xffff; + } + else + { + crc = (crc << 1) & 0xffff; + } + + data = data << 1; + } + + polyTableT10[i] = crc; + } +} + + +unsigned int +genT10Crc(unsigned char *buf) +{ + unsigned int crc; + unsigned int data; + int i; + + crc = 0; + + for (i = 0; i < 512; i++) + { + data = buf[i]; + crc = ((crc << 8) ^ polyTableT10[data ^ (crc >> 8)]) & 0xffff; + } + + return crc; +} + + +unsigned int +genLbCrc(unsigned char *buf, int len) +{ + return 0; +} + + +int +checkRemoveT10(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len) +{ + int i; + unsigned char *in; + unsigned char *out; + unsigned int crc; + unsigned int crc_in; + unsigned int lba; + unsigned int lba_in; + + in = buf_in; + out = buf_out; + + for (i = 0, lba = lbn; i < lbns; i++, lba++) + { + if (in[512+2] != 0xff || in[512+3] != 0xff) + { + crc = genT10Crc(in) & 0xffff; + + crc_in = get2bytes(in, 512); + + if (crc != crc_in) + { + printf("CRC is incorrect: %04x vs %04x\n", crc, crc_in); + return 0; + } + + lba_in = get4bytes(in, 512+4); + + if (lba != lba_in) + { + printf("LBA Ref Tag is incorrect: %08x vs %08x\n", lba, lba_in); + return 0; + } + } + + memcpy(out, in, 512); + + in += 512+8; + out += 512; + } + +// dumpMemory(buf_out, len, "read with T10"); + + return 1; +} + + +int +checkRemoveLb(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len, int do_crc) +{ + int i; + unsigned char *in; + unsigned char *out; + unsigned int crc; + unsigned int crc_in; + unsigned int lba; + unsigned int lba_in; + unsigned int *dif; + unsigned int t; + + in = buf_in; + out = buf_out; + + for (i = 0, lba = lbn; i < lbns; i += 8, lba += 8) + { + dif = (unsigned int *)(in + 4096); + + if (do_crc) + { + crc = genLbCrc(in, 4096); + + crc_in = get32x(dif[1]); + + if (crc != crc_in) + { + printf("Data CRC is incorrect: %08x vs %08x\n", crc, crc_in); + return 0; + } + + t = dif[3]; + crc = genLbCrc(in + 4096, 64); + dif[3] = t; + + crc_in = get32x(dif[3]); + + if (crc != crc_in) + { + printf("DIF CRC is incorrect: %08x vs %08x\n", crc, crc_in); + return 0; + } + } + + lba_in = get32x(dif[2]); + + if (lba != lba_in) + { + printf("LBA Ref Tag is incorrect: %08x vs %08x\n", lba, lba_in); + return 0; + } + + memcpy(out, in, 4096); + + in += 4096+64; + out += 4096; + } + +// dumpMemory(buf_out, len, "read with LB"); + + return 1; +} + + +int +insertT10(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len) +{ + int i; + unsigned char *in; + unsigned char *out; + unsigned int crc; + unsigned int lba; + + in = buf_in + (lbns - 1) * 512; + out = buf_out + (lbns - 1) * (512+8); + + for (i = 0, lba = lbn + lbns - 1; i < lbns; i++, lba--) + { + crc = genT10Crc(in) & 0xffff; + + memcpy(out, in, 512); + + memset(out + 512, 0, 8); + + put2bytes(out, 512, crc); + put4bytes(out, 516, lba); + +// if (lba >= 128 + 12 && lba < 128 + 12 + 16) out[512 + lba - 128 - 12 - 8] ^= 0x69; + + in -= 512; + out -= 512+8; + } + +// dumpMemory(buf_out, len, "write with T10"); + + return 1; +} + + +int +insertLb(MPT_PORT *port, unsigned int lbn, int lbns, unsigned char *buf_in, unsigned char *buf_out, int len, int do_crc) +{ + int i; + unsigned char *in; + unsigned char *out; + unsigned int crc; + unsigned int lba; + unsigned int *dif; + + in = buf_in + (lbns - 8) * 512; + out = buf_out + (lbns - 8) * (512+8); + + for (i = 0, lba = lbn + lbns - 8; i < lbns; i += 8, lba -= 8) + { + dif = (unsigned int *)(out + 4096); + + if (do_crc) + crc = genLbCrc(in, 4096); + else + crc = 0; + + memcpy(out, in, 4096); + + memset(out + 4096, 0, 64); + + dif[1] = set32x(crc); + dif[2] = set32x(lba); + dif[4] = set32x(lba); + + if (do_crc) + crc = genLbCrc(in + 4096, 64); + else + crc = 0; + + dif[3] = crc; + + in -= 4096; + out -= 4096+64; + } + +// dumpMemory(buf_out, len, "write with LB"); + + return 1; +} + + +void +waitForFile(char *name) +{ + int file; + + while (TRUE) + { + file = open(name, O_RDONLY | O_BINARY); + if (file >= 0) + { + close(file); + break; + } + + sleep(1); + } +} + + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + + U8 SubsystemVendorId_0[2]; + U8 SubsystemId_0[2]; + U8 ClassCode_0[3]; + U8 PciMemory; + U8 HardwareConfig[1]; + U8 SubsystemVendorId_1[2]; + U8 SubsystemId_1[2]; + U8 ClassCode_1[3]; + U8 Checksum; + U8 Filler[3]; +} ManufacturingPage2_929_t; + + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + + U8 SubsystemVendorId_0[2]; + U8 SubsystemId_0[2]; + U8 ClassCode_0[3]; + U8 PciMemory; + U8 HardwareConfig[2]; + U8 SubsystemVendorId_1[2]; + U8 SubsystemId_1[2]; + U8 ClassCode_1[3]; + U8 Checksum; + U8 Filler[2]; +} ManufacturingPage2_929X_t; + + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + + U8 SubsystemVendorId[2]; + U8 SubsystemId[2]; + U8 ClassCode[3]; + U8 PciMemory; + U8 PciPowerBudgetData[8][3]; + U8 Checksum; + U8 Filler[3]; +} ManufacturingPage2_949E_t; + + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + + _U64 WWPN_0; + _U64 WWNN_0; + _U32 PhyRegs1_0; + _U32 PhyRegs2_0; + _U32 PhyRegs2_Alt_0; + U8 MfgSupportedSpeeds_0; + U8 MfgLinkType_0; + U8 MfgConnectorType_0; + U8 Filler_0; + _U64 WWPN_1; + _U64 WWNN_1; + _U32 PhyRegs1_1; + _U32 PhyRegs2_1; + _U32 PhyRegs2_Alt_1; + U8 MfgSupportedSpeeds_1; + U8 MfgLinkType_1; + U8 MfgConnectorType_1; + U8 Filler_1; +} ManufacturingPage3_929_t; + + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + + _U64 WWPN_0; + _U64 WWNN_0; + _U32 PhyRegs1_0; + U32 Unused1_0; + U32 Unused2_0; + U8 MfgSupportedSpeeds_0; + U8 MfgLinkType_0; + U8 MfgConnectorType_0; + U8 Filler_0; + _U64 WWPN_1; + _U64 WWNN_1; + _U32 PhyRegs1_1; + U32 Unused1_1; + U32 Unused2_1; + U8 MfgSupportedSpeeds_1; + U8 MfgLinkType_1; + U8 MfgConnectorType_1; + U8 Filler_1; + _U32 PhyRegs234[3*2*3]; +} ManufacturingPage3_949_t; + + +char * +skipLine(char *buf) +{ + char *c = buf; + + while (*c != '\n') + c++; + + c++; + + return c; +} + + +void +removeLine(char *buf) +{ + char *c = skipLine(buf); + + while (*c) + *buf++ = *c++; + + *buf = '\0'; +} + + +int +getNamedItem(MPT_PORT *port, char *name, char *buf, int type, void *address) +{ + char *c; + int n; + int t; + + n = (int)strlen(name); + + while (*buf) + { + if (*buf == '#') + { + c = buf; + + c++; + + if (*c == ' ') + c++; + + if (strncasecmp(name, c, n) == 0) + { + c = skipLine(c); + + switch (type) + { + case 1: + t = sscanf(c, "%s", (char *)address); +// if (t == 1) printf("parsed item %s = <%s>\n", name, (char *)address); + break; + + case 2: + t = sscanf(c, "%d", (int *)address); +// if (t == 1) printf("parsed item %s = <%d>\n", name, *(int *)address); + break; + + case 3: + t = sscanf(c, "0x%x", (int *)address); +// if (t == 1) printf("parsed item %s = <0x%x>\n", name, *(int *)address); + break; + + default: + t = 0; + } + + if (t == 1) + { + removeLine(buf); + removeLine(buf); + + return 1; + } + + printf("Parse error on item %s!\n", name); + return 0; + } + } + + buf = skipLine(buf); + } + + printf("Item %s not found!\n", name); + return 0; +} + + +int +updateConfigPage(MPT_PORT *port, char *string, void *page) +{ + ConfigPageHeader_t *header = (pConfigPageHeader_t)page; + int t; + + t = setConfigPage(port, header->PageType & MPI_CONFIG_PAGETYPE_MASK, header->PageNumber, 0, + page, header->PageLength * 4); + + if (t != 1) + printf("Failed to save %s to NVRAM!\n", string); + + return t; +} + + +int +doWriteFcManufacturingInfo(MPT_PORT *port) +{ + char name[256]; + unsigned char *mfginfoBuf = NULL; + int mfginfoLen; + unsigned char *identityBuf = NULL; + int identityLen; + int n; + int i; + int t; + int version; + char *buf; + char temp[64]; + char wwn[64]; + char tracer[64]; + char assembly[64]; + char board[64]; + char chip[64]; + char revision[64]; + int wwnl; + int device; + int pcirevision; + int subsys0; + int subsys1; + int subven0; + int subven1; + int pcimemory; + int class0; + int class1; + int hwconfig; + int linkconfig0; + int linkconfig1; + int ieeeident; + int phyreg10; + int phyreg11; + int phyreg20; + int phyreg21; + int phyreg2a0; + int phyreg2a1; + int phyreg234[3*2*3]; + int conninfo0; + int conninfo1; + int connect0; + int connect1; + int flags; + int coalflags0; + int coaltime0; + int coaldepth0; + int coalflags1; + int coaltime1; + int coaldepth1; + ManufacturingPage0_t ManufacturingPage0; + ManufacturingPage2_929_t ManufacturingPage2_929; + ManufacturingPage2_929X_t ManufacturingPage2_929X; + ManufacturingPage2_949E_t ManufacturingPage2_949E; + ManufacturingPage3_929_t ManufacturingPage3_929; + ManufacturingPage3_949_t ManufacturingPage3_949; + IOUnitPage1_t IOUnitPage1; + IOCPage1_t IOCPage1; + FCPortPage1_t FCPortPage1; + U8 checksum; + U8 *mp2p; + MPT_PORT *temp_port; + MPT_PORT *partner_port; + char *c; + + n = getFileName(name, sizeof name, stdin, "manufacturing information", 0); + if (n > 0) + { + if (readFile(name, &mfginfoBuf, &mfginfoLen) != 1) + return 0; + } + else + { + printf("Manufacturing information won't be programmed\n"); + return 0; + } + + printf("%d bytes read from %s\n\n", mfginfoLen, name); + + *tracer = 0; + *assembly = 0; + *wwn = 0; + + n = getFileName(name, sizeof name, stdin, "board identity", 1); + if (n > 0) + { + if (readFile(name, &identityBuf, &identityLen) != 1) + return 0; + + printf("%d bytes read from %s\n\n", identityLen, name); + + c = strchr((char *)identityBuf, '='); + + if (c) + { + c = strchr((char *)identityBuf, '\n'); + if (c) + { + if (strncmp(c + 1, "BoardAssembly = ", 16) == 0) + { + sscanf(c + 17, "%s", assembly); + c = strchr(c + 1, '\n'); + } + } + if (c) + { + if (strncmp(c + 1, "BoardTracerNumber = ", 20) == 0) + { + sscanf(c + 21, "%s", tracer); + c = strchr(c + 1, '\n'); + } + } + if (c) + { + if (strncmp(c + 1, "FC WWNN = ", 10) == 0) + { + sscanf(c + 11 + 10, "%s", wwn); + c = strchr(c + 1, '\n'); + } + } + } + else + { + sscanf((char *)identityBuf, "%s", assembly); + c = strchr((char *)identityBuf, '\n'); + if (c) + { + sscanf(c + 1, "%s", tracer); + c = strchr(c + 1, '\n'); + } + if (c) + { + sscanf(c + 1, "%s", wwn); + c = strchr(c + 1, '\n'); + } + } + + if (strlen(tracer) != 10 && strlen(tracer) != 11) + { + printf("Board Tracer value <%s> is invalid!\n", tracer); + *tracer = 0; + } + if (strlen(assembly) != 12) + { + printf("Board Assembly value <%s> is invalid!\n", assembly); + *assembly = 0; + } + if (strlen(wwn) != 6 || sscanf(wwn, "%x", &wwnl) != 1) + { + printf("Board WWN value <%s> is invalid!\n", wwn); + *wwn = 0; + } + + free(identityBuf); + } + else + { + printf("The board's identity must be entered manually!\n\n"); + } + + while (!*tracer || !*assembly || !*wwn) + { + printf("Board Tracer ...... %s\n", *tracer ? tracer : "not entered yet, 10 or 11 characters"); + printf("Board Assembly .... %s\n", *assembly ? assembly : "not entered yet, 12 characters"); + printf("Board WWN ......... %s\n", *wwn ? wwn : "not entered yet, 6 characters"); + + printf("\nEnter a value: [Tracer, Assembly, WWN, or Quit to quit] "); + + while (TRUE) + { + n = getStringFromArgs(temp, sizeof temp, stdin); + + if (n == 10 || n == 11) + { + strcpy(tracer, temp); + break; + } + else if (n == 12) + { + strcpy(assembly, temp); + break; + } + else if (n == 6) + { + if (sscanf(temp, "%x", &wwnl) == 1) + strcpy(wwn, temp); + break; + } + else if (n <= 4) + { + if (strncasecmp(temp, "quit", n) == 0) + return 0; + } + + printf("Invalid response, try again: "); + } + } + + printf("Board Tracer ...... %s\n", tracer); + printf("Board Assembly .... %s\n", assembly); + printf("Board WWN ......... %s\n", wwn); + + if (yesFlag == FALSE) + { + printf("\nAre these values correct? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + return 0; + } + + if (wFlag) + { + fprintf(logFile, "%s: Board Tracer ...... %s\n", logPrefix(port), tracer); + fprintf(logFile, "%s: Board Assembly .... %s\n", logPrefix(port), assembly); + fprintf(logFile, "%s: Board WWN ......... %s\n", logPrefix(port), wwn); + } + + n = mfginfoLen; + buf = realloc(mfginfoBuf, n + 2); + if (n && buf[n-1] != '\n') + { + mfginfoLen++; + buf[n++] = '\n'; + } + buf[n] = '\0'; + + n = 0; + for (i = 0; i < mfginfoLen; i++) + { + if (buf[i] == '\0' || buf[i] == '\r') // NUL and CR are ignored + continue; + + if (buf[i] == '#' && buf[i+1] == '#') // lines starting with ## are ignored + { + while (buf[i] != '\n' && i < mfginfoLen) + i++; + } + + if (buf[i] == '(') // text after an open parenthesis is ignored + { + while (buf[i] != '\n' && i < mfginfoLen) + i++; + } + + if (buf[i] == ' ' && buf[i+1] == '-' && buf[i+2] == ' ') // turn " - " into " " + { + buf[i+1] = ' '; + } + + if (n) + { + if (buf[i] == '\n' && buf[n-1] == '\n') // blank lines are ignored + continue; + + if (buf[i] == ' ' && buf[n-1] == ' ') // multiple spaces are collapsed + continue; + } + else + { + if (buf[i] == '\n') // blank lines are ignored + continue; + + if (buf[i] == ' ') // leading spaces are collapsed + continue; + } + + buf[n++] = buf[i]; + } + buf[n] = '\0'; + + printf("\n"); + + t = getNamedItem(port, "Version", buf, 2, &version); + if (t != 1) + { + printf("Incorrectly formatted file, failed to find version\n"); + return 0; + } + if (version != 3 && version != 4) + { + printf("Incorrectly formatted file, version should be 3 or 4\n"); + return 0; + } + + printf("Version %d found, processing...\n", version); + + t += getNamedItem(port, "Assembly Number", buf, 1, temp); + t += getNamedItem(port, "PCI Device Id", buf, 3, &device); + t += getNamedItem(port, "Chip Revision Id", buf, 3, &pcirevision); + t += getNamedItem(port, "Board Name", buf, 1, board); + t += getNamedItem(port, "Chip Name", buf, 1, chip); + t += getNamedItem(port, "Chip Revision Name", buf, 1, revision); + + if (t != 7) + { + printf("Could not read all required manufacturing information from file!\n"); + return 0; + } + + printf("\nBoard is %s, Assembly is %s, Chip is %s\n", board, temp, chip); + if (wFlag) + fprintf(logFile, "%s: Board is %s, Assembly is %s, Chip is %s\n", + logPrefix(port), board, temp, chip); + + if (device != port->deviceIdRaw || pcirevision != port->revisionId || + (strcasecmp(chip, port->chipName) && strcasecmp(chip + 3, port->chipName)) || + strcasecmp(temp, assembly)) + { + printf("Manufacturing information file is not for this chip!\n"); + return 0; + } + + device &= ~1; + + if (strncmp(board, "LSI74", 5) == 0 || strncmp(board, "LSIFC74", 7) == 0) + { + getBoardInfo(port); + + if (port->pciDevice == 6) // this is the second chip on a quad pci-x board + wwnl += 2; + + if (port->pciDevice == 0) // this is either the first or second chip on a quad pci-e board + { + n = 1; + + partner_port = NULL; + for (i = 0; i < NUM_PORTS; i++) // count how many 949E chips there are + { + temp_port = mptPorts[i]; + + if (temp_port == NULL || temp_port == port) + continue; + + if (getBoardInfo(temp_port) == 1) + { + if (temp_port->deviceId == 0x646 && + temp_port->pciDevice == 0 && + temp_port->pciFunction == 0) + { + n++; + partner_port = temp_port; + } + } + } + + if (n == 2) // if just two chips, the one with the higher bus is the second chip + { + if (port->pciBus > partner_port->pciBus) + wwnl += 2; + } + else // not the simple case, so ask the user + { + printf("\nIs this the first or second chip on this quad? [1=1st, 2=2nd, default is 1] "); + if (getNumberAnswer(1, 2, 1) == 2) + wwnl += 2; + } + } + } + + t += getNamedItem(port, "PCI Memory", buf, 3, &pcimemory); + t += getNamedItem(port, "Subsystem Id 0", buf, 3, &subsys0); + t += getNamedItem(port, "Subsystem Vendor Id 0", buf, 3, &subven0); + t += getNamedItem(port, "Class Code 0", buf, 3, &class0); + if (device != 0x646) + { + t += getNamedItem(port, "Subsystem Id 1", buf, 3, &subsys1); + t += getNamedItem(port, "Subsystem Vendor Id 1", buf, 3, &subven1); + t += getNamedItem(port, "Class Code 1", buf, 3, &class1); + t += getNamedItem(port, "Hardware Config", buf, 3, &hwconfig); + } + t += getNamedItem(port, "IOUnit1Flags", buf, 3, &flags); + t += getNamedItem(port, "IEEE Ident", buf, 3, &ieeeident); + t += getNamedItem(port, "LinkConfig Port 0", buf, 3, &linkconfig0); + t += getNamedItem(port, "PhyReg1 Port 0", buf, 3, &phyreg10); + t += getNamedItem(port, "PhyReg2 Port 0", buf, 3, &phyreg20); + t += getNamedItem(port, "PhyReg2Alt Port 0", buf, 3, &phyreg2a0); + t += getNamedItem(port, "ConnectInfo Port 0", buf, 3, &conninfo0); + t += getNamedItem(port, "Connector Port 0", buf, 3, &connect0); + t += getNamedItem(port, "Coalescing Flags 0", buf, 3, &coalflags0); + t += getNamedItem(port, "Coalescing Microseconds 0", buf, 3, &coaltime0); + t += getNamedItem(port, "Coalescing Depth 0", buf, 3, &coaldepth0); + if (!(flags & MPI_IOUNITPAGE1_SINGLE_FUNCTION)) + { + t += getNamedItem(port, "LinkConfig Port 1", buf, 3, &linkconfig1); + t += getNamedItem(port, "PhyReg1 Port 1", buf, 3, &phyreg11); + t += getNamedItem(port, "PhyReg2 Port 1", buf, 3, &phyreg21); + t += getNamedItem(port, "PhyReg2Alt Port 1", buf, 3, &phyreg2a1); + t += getNamedItem(port, "ConnectInfo Port 1", buf, 3, &conninfo1); + t += getNamedItem(port, "Connector Port 1", buf, 3, &connect1); + t += getNamedItem(port, "Coalescing Flags 1", buf, 3, &coalflags1); + t += getNamedItem(port, "Coalescing Depth 1", buf, 3, &coaldepth1); + t += getNamedItem(port, "Coalescing Microseconds 1", buf, 3, &coaltime1); + } + + if (device == 0x640 || device == 0x642 || device == 0x646) + { + t += getNamedItem(port, "PhyReg2A1", buf, 3, &phyreg234[0]); + t += getNamedItem(port, "PhyReg3A1", buf, 3, &phyreg234[1]); + t += getNamedItem(port, "PhyReg4A1", buf, 3, &phyreg234[2]); + t += getNamedItem(port, "PhyReg2A2", buf, 3, &phyreg234[3]); + t += getNamedItem(port, "PhyReg3A2", buf, 3, &phyreg234[4]); + t += getNamedItem(port, "PhyReg4A2", buf, 3, &phyreg234[5]); + t += getNamedItem(port, "PhyReg2A4", buf, 3, &phyreg234[6]); + t += getNamedItem(port, "PhyReg3A4", buf, 3, &phyreg234[7]); + t += getNamedItem(port, "PhyReg4A4", buf, 3, &phyreg234[8]); + t += getNamedItem(port, "PhyReg2P1", buf, 3, &phyreg234[9]); + t += getNamedItem(port, "PhyReg3P1", buf, 3, &phyreg234[10]); + t += getNamedItem(port, "PhyReg4P1", buf, 3, &phyreg234[11]); + t += getNamedItem(port, "PhyReg2P2", buf, 3, &phyreg234[12]); + t += getNamedItem(port, "PhyReg3P2", buf, 3, &phyreg234[13]); + t += getNamedItem(port, "PhyReg4P2", buf, 3, &phyreg234[14]); + t += getNamedItem(port, "PhyReg2P4", buf, 3, &phyreg234[15]); + t += getNamedItem(port, "PhyReg3P4", buf, 3, &phyreg234[16]); + t += getNamedItem(port, "PhyReg4P4", buf, 3, &phyreg234[17]); + } + + n = 1000; + + if (device == 0x622 || device == 0x624) + n = 35; + + if (device == 0x626 || device == 0x628) + n = 35; + + if (device == 0x640 || device == 0x642) + n = 53; + + if (device == 0x646) + n = 49; + + if (flags & MPI_IOUNITPAGE1_SINGLE_FUNCTION) + n -= 9; + + if (t != n) + { + printf("\nCould not read all required manufacturing information from file!\n"); + printf("Parsed %d out of %d items\n", t, n); + return 0; + } + + if (strlen(buf)) + { + printf("\nExtra lines found in manufacturing information file!\n"); + printf("----\n%s----\n", buf); + if (wFlag) + { + fprintf(logFile, "%s: Extra lines found in manufacturing information file!\n", logPrefix(port)); + fprintf(logFile, "----\n%s----\n", buf); + } + } + + free(buf); + + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + memset(&ManufacturingPage0, 0, sizeof ManufacturingPage0); + + ManufacturingPage0.Header.PageVersion = MPI_MANUFACTURING0_PAGEVERSION; + ManufacturingPage0.Header.PageLength = sizeof ManufacturingPage0 / 4; + ManufacturingPage0.Header.PageNumber = 0; + ManufacturingPage0.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + strcpy((char *)ManufacturingPage0.ChipName, chip); + strcpy((char *)ManufacturingPage0.ChipRevision, revision); + strcpy((char *)ManufacturingPage0.BoardName, board); + strcpy((char *)ManufacturingPage0.BoardAssembly, assembly); + strcpy((char *)ManufacturingPage0.BoardTracerNumber, tracer); + + updateConfigPage(port, "ManufacturingPage0", &ManufacturingPage0); + + if (device == 0x622 || device == 0x624) + { + memset(&ManufacturingPage2_929, 0, sizeof ManufacturingPage2_929); + + ManufacturingPage2_929.Header.PageVersion = MPI_MANUFACTURING2_PAGEVERSION; + ManufacturingPage2_929.Header.PageLength = sizeof ManufacturingPage2_929 / 4; + ManufacturingPage2_929.Header.PageNumber = 2; + ManufacturingPage2_929.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + ManufacturingPage2_929.ChipId.DeviceID = set16(port->deviceIdRaw); + ManufacturingPage2_929.ChipId.PCIRevisionID = port->revisionId; + + ManufacturingPage2_929.SubsystemVendorId_0[0] = (U8)(subven0 >> 8*0); + ManufacturingPage2_929.SubsystemVendorId_0[1] = (U8)(subven0 >> 8*1); + ManufacturingPage2_929.SubsystemId_0[0] = (U8)(subsys0 >> 8*0); + ManufacturingPage2_929.SubsystemId_0[1] = (U8)(subsys0 >> 8*1); + ManufacturingPage2_929.ClassCode_0[0] = (U8)(class0 >> 8*0); + ManufacturingPage2_929.ClassCode_0[1] = (U8)(class0 >> 8*1); + ManufacturingPage2_929.ClassCode_0[2] = (U8)(class0 >> 8*2); + ManufacturingPage2_929.PciMemory = (U8)(pcimemory >> 8*0); + ManufacturingPage2_929.HardwareConfig[0] = (U8)(hwconfig >> 8*0); + ManufacturingPage2_929.SubsystemVendorId_1[0] = (U8)(subven1 >> 8*0); + ManufacturingPage2_929.SubsystemVendorId_1[1] = (U8)(subven1 >> 8*1); + ManufacturingPage2_929.SubsystemId_1[0] = (U8)(subsys1 >> 8*0); + ManufacturingPage2_929.SubsystemId_1[1] = (U8)(subsys1 >> 8*1); + ManufacturingPage2_929.ClassCode_1[0] = (U8)(class1 >> 8*0); + ManufacturingPage2_929.ClassCode_1[1] = (U8)(class1 >> 8*1); + ManufacturingPage2_929.ClassCode_1[2] = (U8)(class1 >> 8*2); + + checksum = 0xa5; + mp2p = (U8 *)&ManufacturingPage2_929; + + for (i = sizeof ManufacturingPage2_929.Header + sizeof ManufacturingPage2_929.ChipId; + i < offsetof(ManufacturingPage2_929_t, Checksum); + i++) + { + checksum += mp2p[i]; + } + + ManufacturingPage2_929.Checksum = -checksum; + + updateConfigPage(port, "ManufacturingPage2", &ManufacturingPage2_929); + } + + if (device == 0x626 || device == 0x628 || device == 0x640 || device == 0x642) + { + memset(&ManufacturingPage2_929X, 0, sizeof ManufacturingPage2_929X); + + ManufacturingPage2_929X.Header.PageVersion = MPI_MANUFACTURING2_PAGEVERSION; + ManufacturingPage2_929X.Header.PageLength = sizeof ManufacturingPage2_929X / 4; + ManufacturingPage2_929X.Header.PageNumber = 2; + ManufacturingPage2_929X.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + ManufacturingPage2_929X.ChipId.DeviceID = set16(port->deviceIdRaw); + ManufacturingPage2_929X.ChipId.PCIRevisionID = port->revisionId; + + ManufacturingPage2_929X.SubsystemVendorId_0[0] = (U8)(subven0 >> 8*0); + ManufacturingPage2_929X.SubsystemVendorId_0[1] = (U8)(subven0 >> 8*1); + ManufacturingPage2_929X.SubsystemId_0[0] = (U8)(subsys0 >> 8*0); + ManufacturingPage2_929X.SubsystemId_0[1] = (U8)(subsys0 >> 8*1); + ManufacturingPage2_929X.ClassCode_0[0] = (U8)(class0 >> 8*0); + ManufacturingPage2_929X.ClassCode_0[1] = (U8)(class0 >> 8*1); + ManufacturingPage2_929X.ClassCode_0[2] = (U8)(class0 >> 8*2); + ManufacturingPage2_929X.PciMemory = (U8)(pcimemory >> 8*0); + ManufacturingPage2_929X.HardwareConfig[0] = (U8)(hwconfig >> 8*0); + ManufacturingPage2_929X.HardwareConfig[1] = (U8)(hwconfig >> 8*1); + ManufacturingPage2_929X.SubsystemVendorId_1[0] = (U8)(subven1 >> 8*0); + ManufacturingPage2_929X.SubsystemVendorId_1[1] = (U8)(subven1 >> 8*1); + ManufacturingPage2_929X.SubsystemId_1[0] = (U8)(subsys1 >> 8*0); + ManufacturingPage2_929X.SubsystemId_1[1] = (U8)(subsys1 >> 8*1); + ManufacturingPage2_929X.ClassCode_1[0] = (U8)(class1 >> 8*0); + ManufacturingPage2_929X.ClassCode_1[1] = (U8)(class1 >> 8*1); + ManufacturingPage2_929X.ClassCode_1[2] = (U8)(class1 >> 8*2); + + checksum = 0xa5; + mp2p = (U8 *)&ManufacturingPage2_929X; + + for (i = sizeof ManufacturingPage2_929X.Header + sizeof ManufacturingPage2_929X.ChipId; + i < offsetof(ManufacturingPage2_929X_t, Checksum); + i++) + { + checksum += mp2p[i]; + } + + ManufacturingPage2_929X.Checksum = -checksum; + + updateConfigPage(port, "ManufacturingPage2", &ManufacturingPage2_929X); + } + + if (device == 0x646) + { + memset(&ManufacturingPage2_949E, 0, sizeof ManufacturingPage2_949E); + + ManufacturingPage2_949E.Header.PageVersion = MPI_MANUFACTURING2_PAGEVERSION; + ManufacturingPage2_949E.Header.PageLength = sizeof ManufacturingPage2_949E / 4; + ManufacturingPage2_949E.Header.PageNumber = 2; + ManufacturingPage2_949E.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + ManufacturingPage2_949E.ChipId.DeviceID = set16(port->deviceIdRaw); + ManufacturingPage2_949E.ChipId.PCIRevisionID = port->revisionId; + + ManufacturingPage2_949E.SubsystemVendorId[0] = (U8)(subven0 >> 8*0); + ManufacturingPage2_949E.SubsystemVendorId[1] = (U8)(subven0 >> 8*1); + ManufacturingPage2_949E.SubsystemId[0] = (U8)(subsys0 >> 8*0); + ManufacturingPage2_949E.SubsystemId[1] = (U8)(subsys0 >> 8*1); + ManufacturingPage2_949E.ClassCode[0] = (U8)(class0 >> 8*0); + ManufacturingPage2_949E.ClassCode[1] = (U8)(class0 >> 8*1); + ManufacturingPage2_949E.ClassCode[2] = (U8)(class0 >> 8*2); + ManufacturingPage2_949E.PciMemory = (U8)(pcimemory >> 8*0); + + checksum = 0xa5; + mp2p = (U8 *)&ManufacturingPage2_949E; + + for (i = sizeof ManufacturingPage2_949E.Header + sizeof ManufacturingPage2_949E.ChipId; + i < offsetof(ManufacturingPage2_949E_t, Checksum); + i++) + { + checksum += mp2p[i]; + } + + ManufacturingPage2_949E.Checksum = -checksum; + + updateConfigPage(port, "ManufacturingPage2", &ManufacturingPage2_949E); + } + + if (device == 0x622 || device == 0x624 || device == 0x626 || device == 0x628) + { + memset(&ManufacturingPage3_929, 0, sizeof ManufacturingPage3_929); + + ManufacturingPage3_929.Header.PageVersion = MPI_MANUFACTURING3_PAGEVERSION; + ManufacturingPage3_929.Header.PageLength = sizeof ManufacturingPage3_929 / 4; + ManufacturingPage3_929.Header.PageNumber = 3; + ManufacturingPage3_929.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + ManufacturingPage3_929.ChipId.DeviceID = set16(port->deviceIdRaw); + ManufacturingPage3_929.ChipId.PCIRevisionID = port->revisionId; + + ManufacturingPage3_929.WWPN_0.Low = set32((wwnl & 0xffffff) | ((ieeeident & 0xff) << 24)); + ManufacturingPage3_929.WWPN_0.High = set32(0x10000000 | ((ieeeident & 0xffff00) >> 8)); + ManufacturingPage3_929.WWNN_0.Low = set32((wwnl & 0xffffff) | ((ieeeident & 0xff) << 24)); + ManufacturingPage3_929.WWNN_0.High = set32(0x20000000 | ((ieeeident & 0xffff00) >> 8)); + ManufacturingPage3_929.PhyRegs1_0 = set32(phyreg10); + ManufacturingPage3_929.PhyRegs2_0 = set32(phyreg20); + ManufacturingPage3_929.PhyRegs2_Alt_0 = set32(phyreg2a0); + ManufacturingPage3_929.MfgSupportedSpeeds_0 = (U8)(conninfo0 >> 8*0); + ManufacturingPage3_929.MfgLinkType_0 = (U8)(conninfo0 >> 8*1); + ManufacturingPage3_929.MfgConnectorType_0 = (U8)(conninfo0 >> 8*2); + if (!(flags & MPI_IOUNITPAGE1_SINGLE_FUNCTION)) + { + ManufacturingPage3_929.WWPN_1.Low = set32(get32(ManufacturingPage3_929.WWPN_0.Low) + 1); + ManufacturingPage3_929.WWPN_1.High = ManufacturingPage3_929.WWPN_0.High; + ManufacturingPage3_929.WWNN_1.Low = set32(get32(ManufacturingPage3_929.WWNN_0.Low) + 1); + ManufacturingPage3_929.WWNN_1.High = ManufacturingPage3_929.WWNN_0.High; + ManufacturingPage3_929.PhyRegs1_1 = set32(phyreg11); + ManufacturingPage3_929.PhyRegs2_1 = set32(phyreg21); + ManufacturingPage3_929.PhyRegs2_Alt_1 = set32(phyreg2a1); + ManufacturingPage3_929.MfgSupportedSpeeds_1 = (U8)(conninfo1 >> 8*0); + ManufacturingPage3_929.MfgLinkType_1 = (U8)(conninfo1 >> 8*1); + ManufacturingPage3_929.MfgConnectorType_1 = (U8)(conninfo1 >> 8*2); + } + + updateConfigPage(port, "ManufacturingPage3", &ManufacturingPage3_929); + } + + if (device == 0x640 || device == 0x642 || device == 0x646) + { + memset(&ManufacturingPage3_949, 0, sizeof ManufacturingPage3_949); + + ManufacturingPage3_949.Header.PageVersion = MPI_MANUFACTURING3_PAGEVERSION; + ManufacturingPage3_949.Header.PageLength = sizeof ManufacturingPage3_949 / 4; + ManufacturingPage3_949.Header.PageNumber = 3; + ManufacturingPage3_949.Header.PageType = MPI_CONFIG_PAGETYPE_MANUFACTURING | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + ManufacturingPage3_949.ChipId.DeviceID = set16(port->deviceIdRaw); + ManufacturingPage3_949.ChipId.PCIRevisionID = port->revisionId; + + ManufacturingPage3_949.WWPN_0.Low = set32((wwnl & 0xffffff) | ((ieeeident & 0xff) << 24)); + ManufacturingPage3_949.WWPN_0.High = set32(0x10000000 | ((ieeeident & 0xffff00) >> 8)); + ManufacturingPage3_949.WWNN_0.Low = set32((wwnl & 0xffffff) | ((ieeeident & 0xff) << 24)); + ManufacturingPage3_949.WWNN_0.High = set32(0x20000000 | ((ieeeident & 0xffff00) >> 8)); + ManufacturingPage3_949.PhyRegs1_0 = set32(phyreg10); + ManufacturingPage3_949.MfgSupportedSpeeds_0 = (U8)(conninfo0 >> 8*0); + ManufacturingPage3_949.MfgLinkType_0 = (U8)(conninfo0 >> 8*1); + ManufacturingPage3_949.MfgConnectorType_0 = (U8)(conninfo0 >> 8*2); + if (!(flags & MPI_IOUNITPAGE1_SINGLE_FUNCTION)) + { + ManufacturingPage3_949.WWPN_1.Low = set32(get32(ManufacturingPage3_949.WWPN_0.Low) + 1); + ManufacturingPage3_949.WWPN_1.High = ManufacturingPage3_949.WWPN_0.High; + ManufacturingPage3_949.WWNN_1.Low = set32(get32(ManufacturingPage3_949.WWNN_0.Low) + 1); + ManufacturingPage3_949.WWNN_1.High = ManufacturingPage3_949.WWNN_0.High; + ManufacturingPage3_949.PhyRegs1_1 = set32(phyreg11); + ManufacturingPage3_949.MfgSupportedSpeeds_1 = (U8)(conninfo1 >> 8*0); + ManufacturingPage3_949.MfgLinkType_1 = (U8)(conninfo1 >> 8*1); + ManufacturingPage3_949.MfgConnectorType_1 = (U8)(conninfo1 >> 8*2); + } + for (i = 0; i < 3*2*3; i++) + ManufacturingPage3_949.PhyRegs234[i] = set32(phyreg234[i]); + + updateConfigPage(port, "ManufacturingPage3", &ManufacturingPage3_949); + } + + doIocInit(port, port->whoInit); + + memset(&IOUnitPage1, 0, sizeof IOUnitPage1); + + IOUnitPage1.Header.PageVersion = MPI_IOUNITPAGE1_PAGEVERSION; + IOUnitPage1.Header.PageLength = sizeof IOUnitPage1 / 4; + IOUnitPage1.Header.PageNumber = 1; + IOUnitPage1.Header.PageType = MPI_CONFIG_PAGETYPE_IO_UNIT | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + IOUnitPage1.Flags = set32(flags); + + updateConfigPage(port, "IOUnitPage1", &IOUnitPage1); + + memset(&IOCPage1, 0, sizeof IOCPage1); + + IOCPage1.Header.PageVersion = MPI_IOCPAGE1_PAGEVERSION; + IOCPage1.Header.PageLength = sizeof IOCPage1 / 4; + IOCPage1.Header.PageNumber = 1; + IOCPage1.Header.PageType = MPI_CONFIG_PAGETYPE_IOC | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + if (port->iocNumber == 0) + { + IOCPage1.Flags = set32(coalflags0); + IOCPage1.CoalescingTimeout = set32(coaltime0); + IOCPage1.CoalescingDepth = coaldepth0; + } + else + { + IOCPage1.Flags = set32(coalflags1); + IOCPage1.CoalescingTimeout = set32(coaltime1); + IOCPage1.CoalescingDepth = coaldepth1; + } + IOCPage1.PCISlotNum = MPI_IOCPAGE1_PCISLOTNUM_UNKNOWN; + + updateConfigPage(port, "IOCPage1", &IOCPage1); + + memset(&FCPortPage1, 0, sizeof FCPortPage1); + + FCPortPage1.Header.PageVersion = MPI_FCPORTPAGE1_PAGEVERSION; + FCPortPage1.Header.PageLength = sizeof FCPortPage1 / 4; + FCPortPage1.Header.PageNumber = 1; + FCPortPage1.Header.PageType = MPI_CONFIG_PAGETYPE_FC_PORT | + MPI_CONFIG_PAGEATTR_PERSISTENT; + + FCPortPage1.Flags = set32(MPI_FCPORTPAGE1_FLAGS_SORT_BY_WWN | + MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT | + MPI_FCPORTPAGE1_FLAGS_PROT_FCP_TARG | + MPI_FCPORTPAGE1_FLAGS_PROT_LAN | + MPI_FCPORTPAGE1_FLAGS_PROT_LOGBUSADDR); + FCPortPage1.NoSEEPROMWWNN.Low = set32(0x10001000); + FCPortPage1.NoSEEPROMWWNN.High = set32(0x200000a0); + FCPortPage1.NoSEEPROMWWPN.Low = set32(0x10001000); + FCPortPage1.NoSEEPROMWWPN.High = set32(0x100000a0); + FCPortPage1.HardALPA = MPI_FCPORTPAGE1_HARD_ALPA_NOT_USED; + FCPortPage1.TopologyConfig = MPI_FCPORTPAGE1_TOPOLOGY_AUTO; + if (port->iocNumber == 0) + { + FCPortPage1.LinkConfig = linkconfig0; + FCPortPage1.AltConnector = connect0; + } + else + { + FCPortPage1.LinkConfig = linkconfig1; + FCPortPage1.AltConnector = connect1; + } + + updateConfigPage(port, "FCPortPage1", &FCPortPage1); + + if (flags & MPI_IOUNITPAGE1_SINGLE_FUNCTION) + return 1; + + if (getBoardInfo(port) != 1) + return 1; + + partner_port = NULL; + for (i = 0; i < NUM_PORTS; i++) + { + temp_port = mptPorts[i]; + + if (temp_port == NULL || temp_port == port) + continue; + + if (getBoardInfo(temp_port) == 1) + { + if (port->pciBus == temp_port->pciBus && + port->pciDevice == temp_port->pciDevice && + port->pciFunction == (temp_port->pciFunction ^ 1)) + { + partner_port = temp_port; + + printf("\nPartner of %s is %s\n", port->portName, partner_port->portName); + if (wFlag) + fprintf(logFile, "%s: Partner is %s\n", logPrefix(port), partner_port->portName); + break; + } + } + } + + if (i == NUM_PORTS) + return 1; + + temp_port = port; + port = partner_port; + + if (port->iocNumber == 0) + { + IOCPage1.Flags = set32(coalflags0); + IOCPage1.CoalescingTimeout = set32(coaltime0); + IOCPage1.CoalescingDepth = coaldepth0; + } + else + { + IOCPage1.Flags = set32(coalflags1); + IOCPage1.CoalescingTimeout = set32(coaltime1); + IOCPage1.CoalescingDepth = coaldepth1; + } + IOCPage1.PCISlotNum = MPI_IOCPAGE1_PCISLOTNUM_UNKNOWN; + + updateConfigPage(port, "IOCPage1", &IOCPage1); + + if (port->iocNumber == 0) + { + FCPortPage1.LinkConfig = linkconfig0; + FCPortPage1.AltConnector = connect0; + } + else + { + FCPortPage1.LinkConfig = linkconfig1; + FCPortPage1.AltConnector = connect1; + } + + updateConfigPage(port, "FCPortPage1", &FCPortPage1); + + return 1; +} + + +int +doWriteSasManufacturingInfo(MPT_PORT *port) +{ + char name[256]; + unsigned char *identityBuf = NULL; + int identityLen; + int length; + int n; + int t; + char temp[64]; + char wwid[64]; + char tracer[64]; + char assembly[64]; + char board[64]; + char chip[64]; + char revision[64]; + int wwidl; + int wwidh; + ManufacturingPage0_t ManufacturingPage0; + ManufacturingPage5_t *ManufacturingPage5; + Mpi2ManufacturingPage5_t *ManufacturingPage5_2; + char *c; + U32 prefix; + int phy_num; + + if (getConfigPage(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, + &ManufacturingPage0, sizeof ManufacturingPage0) != 1) + { + printf("ManufacturingPage0 is not valid!\n"); + return 0; + } + + strcpy(board, (char *)ManufacturingPage0.BoardName); + strcpy(chip, (char *)ManufacturingPage0.ChipName); + strcpy(revision, (char *)ManufacturingPage0.ChipRevision); + + ManufacturingPage5 = getConfigPageAlloc(port, MPI_CONFIG_PAGETYPE_MANUFACTURING, 5, 0, &length); + if (ManufacturingPage5 == NULL) + { + printf("ManufacturingPage5 is not valid!\n"); + return 0; + } + + ManufacturingPage5_2 = (pMpi2ManufacturingPage5_t)ManufacturingPage5; + + *tracer = 0; + *assembly = 0; + *wwid = 0; + + n = getFileName(name, sizeof name, stdin, "board identity", 0); + if (n > 0) + { + if (readFile(name, &identityBuf, &identityLen) != 1) + { + free(ManufacturingPage5); + return 0; + } + + printf("%d bytes read from %s\n\n", identityLen, name); + + c = strchr((char *)identityBuf, '='); + + if (c) + { + c = strchr((char *)identityBuf, '\n'); + if (c) + { + if (strncmp(c + 1, "BoardAssembly = ", 16) == 0) + { + sscanf(c + 17, "%s", assembly); + c = strchr(c + 1, '\n'); + } + } + if (c) + { + if (strncmp(c + 1, "BoardTracerNumber = ", 20) == 0) + { + sscanf(c + 21, "%s", tracer); + c = strchr(c + 1, '\n'); + } + } + if (c) + { + if (strncmp(c + 1, "SAS WWID = ", 11) == 0) + { + sscanf(c + 12, "%s", wwid); + c = strchr(c + 1, '\n'); + } + } + } + else + { + sscanf((char *)identityBuf, "%s", assembly); + c = strchr((char *)identityBuf, '\n'); + if (c) + { + sscanf(c + 1, "%s", tracer); + c = strchr(c + 1, '\n'); + } + if (c) + { + sscanf(c + 2, "%s", wwid); // skip the leading '1' digit! + c = strchr(c + 1, '\n'); + } + } + + if (strlen(tracer) != 10 && strlen(tracer) != 11 && strlen(tracer) != 14) + { + printf("Board Tracer value <%s> is invalid!\n", tracer); + *tracer = 0; + } + if (strlen(assembly) != 12) + { + printf("Board Assembly value <%s> is invalid!\n", assembly); + *assembly = 0; + } + if ((strlen(wwid) != 9 && strlen(wwid) != 16) || + sscanf(wwid, "%x", &t) != 1 || sscanf(wwid + 8, "%x", &t) != 1) + { + printf("Board WWID value <%s> is invalid!\n", wwid); + *wwid = 0; + } + + free(identityBuf); + } + else + { + printf("The board's identity must be entered manually!\n\n"); + } + + while (!*tracer || !*assembly || !*wwid) + { + printf("Board Tracer ...... %s\n", *tracer ? tracer : "not entered yet, 10, 11 or 14 characters"); + printf("Board Assembly .... %s\n", *assembly ? assembly : "not entered yet, 12 characters"); + printf("Board WWID ........ %s\n", *wwid ? wwid : "not entered yet, 9 or 16 characters"); + + printf("\nEnter a value: [Tracer, Assembly, WWID, or Quit to quit] "); + + while (TRUE) + { + n = getStringFromArgs(temp, sizeof temp, stdin); + + if (n == 10 || n == 11 || n == 14) + { + strcpy(tracer, temp); + break; + } + else if (n == 12) + { + strcpy(assembly, temp); + break; + } + else if (n == 9 || n == 16) + { + if (sscanf(temp, "%x", &wwidl) == 1 && sscanf(temp + 8, "%x", &wwidl) == 1) + strcpy(wwid, temp); + break; + } + else if (n <= 4) + { + if (strncasecmp(temp, "quit", n) == 0) + { + free(ManufacturingPage5); + return 0; + } + } + + printf("Invalid response, try again: "); + } + } + + printf("Board Tracer ...... %s\n", tracer); + printf("Board Assembly .... %s\n", assembly); + printf("Board WWID ........ %s\n", wwid); + + if (yesFlag == FALSE) + { + printf("\nAre these values correct? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + free(ManufacturingPage5); + return 0; + } + } + + if (wFlag) + { + fprintf(logFile, "%s: Board Tracer ...... %s\n", logPrefix(port), tracer); + fprintf(logFile, "%s: Board Assembly .... %s\n", logPrefix(port), assembly); + fprintf(logFile, "%s: Board WWID ........ %s\n", logPrefix(port), wwid); + } + + if (strlen(wwid) == 9) + { + sscanf(wwid + 1, "%x", &wwidl); + wwid[1] = '\0'; + sscanf(wwid, "%x", &wwidh); + + if (mpi2) + prefix = get32(ManufacturingPage5_2->Phy[0].WWID.High) >> 4; + else + prefix = get32(ManufacturingPage5->BaseWWID.High) >> 4; + if (prefix == 0) + { + if (port->deviceId == MPI_MANUFACTPAGE_DEVID_SAS1064 || + port->deviceId == MPI_MANUFACTPAGE_DEVID_SAS1064E) + { + prefix = 0x500062b; + } + else + { + prefix = 0x500605b; + } + + printf("Enter the SAS WWID prefix: [7 hex digits, default is %07x] ", prefix); + getHexNumberAnswer(&prefix); + } + + wwidh |= prefix << 4; + } + else + { + sscanf(wwid + 8, "%x", &wwidl); + wwid[8] = '\0'; + sscanf(wwid, "%x", &wwidh); + } + + printf("\nBoard is %s, Assembly is %s, Chip is %s\n", board, assembly, chip); + if (wFlag) + fprintf(logFile, "%s: Board is %s, Assembly is %s, Chip is %s\n", + logPrefix(port), board, temp, chip); + + strcpy((char *)ManufacturingPage0.BoardAssembly, assembly); + strcpy((char *)ManufacturingPage0.BoardTracerNumber, tracer); + + if (mpi2) + { + for(phy_num = 0; phy_num < port->numPhys; phy_num++) + { + ManufacturingPage5_2->Phy[phy_num].WWID.Low = set32(wwidl + phy_num); + ManufacturingPage5_2->Phy[phy_num].WWID.High = set32(wwidh); + } + } + else + { + ManufacturingPage5->BaseWWID.Low = set32(wwidl); + ManufacturingPage5->BaseWWID.High = set32(wwidh); + } + + doIocInit(port, MPI_WHOINIT_MANUFACTURER); + + updateConfigPage(port, "ManufacturingPage0", &ManufacturingPage0); + updateConfigPage(port, "ManufacturingPage5", ManufacturingPage5); + + doIocInit(port, port->whoInit); + + free(ManufacturingPage5); + + return 1; +} + + +#undef mpi1 +#undef mpi2 +#undef mpi20 +#undef mpi25 +#undef MPI1 +#undef MPI2 +#undef MPI20 +#undef MPI25 + + +typedef struct +{ + _U32 Signature; + U8 State; + U8 Checksum; + _U16 TotalBytes; + _U16 NvdataVersion; + _U16 MpiVersion; + U8 CdhSize; + U8 CdeSize; + U8 PphSize; + U8 ProdIdSize; + _U32 NbrDirEntries; + _U32 NbrPersistDirEntries; + _U32 SeepromFwVarsOffset; + _U32 SeepromBufferOffset; + U32 Reserved; +} CONFIG_DIR_HEADER; + +typedef struct +{ + _U32 Signature; + U8 State; + U8 Reserved1; + _U16 TotalBytes; + _U16 NvdataVersion; + _U16 MpiVersion; + U8 CdhSize; + U8 CdeSize; + U8 PphSize; + U8 ProdIdSize; + _U32 NbrDirEntries; + _U32 NbrPersistDirEntries; + U32 Reserved3; + _U16 ProductIdOffset; + _U16 DirEntryOffset; + _U32 VendorNvramVersion; +} CONFIG_DIR_HEADER2; + +#define CONFIG_DIR_HEADER_SIGNATURE (0x4E69636B) + +#define CONFIG_DIR_HEADER_STATE_ERASED (0xFF) +#define CONFIG_DIR_HEADER_STATE_INITIALIZATION (CONFIG_DIR_HEADER_STATE_ERASED & ~0x01) +#define CONFIG_DIR_HEADER_STATE_RCV_DATA (CONFIG_DIR_HEADER_STATE_INITIALIZATION & ~0x02) +#define CONFIG_DIR_HEADER_STATE_VALID (CONFIG_DIR_HEADER_STATE_RCV_DATA & ~0x04) +#define CONFIG_DIR_HEADER_STATE_XFER_COMPLETE (CONFIG_DIR_HEADER_STATE_VALID & ~0x08) + + +typedef struct +{ + _U32 Signature; + U8 VendorId[8]; + U8 ProductId[16]; + U8 ProductRevision[4]; + U32 Reserved1; + U32 Reserved2; + U32 Reserved3; + U32 Reserved4; + U32 Reserved5; + U32 Reserved6; + U32 Reserved7; + U32 Reserved8; +} CONFIG_PROD_ID; + +#define CONFIG_PROD_ID_SIGNATURE (0x4672617A) + + +typedef struct +{ + U32 State : 4; + U32 AllocUnits : 12; + U32 PageType : 8; + U32 PageNum : 4; + U32 ForceNvdataUpdate : 1; + U32 PersistPageUpdated : 1; + U32 FlagRsvd1 : 1; + U32 FlagRsvd2 : 1; + U32 DwordOffset : 15; + U32 IocNum : 1; + U32 PageAddress : 16; +} CONFIG_DIR_ENTRY; + +typedef struct +{ + U8 State; + U8 Reserved; + _U16 AllocUnits; + U8 PageType; + U8 PageNum; + U8 UpdateFlags; + U8 IocNum; + _U32 DwordOffset; + _U32 PageAddress; +} CONFIG_DIR_ENTRY2; + +#define CONFIG_DIR_ENTRY_STATE_ERASED (0xF) +#define CONFIG_DIR_ENTRY_STATE_BEGIN_UPDATE (CONFIG_DIR_ENTRY_STATE_ERASED & ~0x1) +#define CONFIG_DIR_ENTRY_STATE_IN_USE (CONFIG_DIR_ENTRY_STATE_BEGIN_UPDATE & ~0x2) + + +typedef struct +{ + U8 State; + U8 Checksum; + _U16 DwordOffset; +} PERSISTENT_PAGE_HEADER; + +typedef struct +{ + U8 State; + U8 Checksum; + U16 Reserved; + _U32 DwordOffset; +} PERSISTENT_PAGE_HEADER2; + +#define CONFIG_PERSISTENT_HEADER_STATE_ERASED (0xFF) +#define CONFIG_PERSISTENT_HEADER_STATE_BEGIN_UPATE (CONFIG_PERSISTENT_HEADER_STATE_ERASED & ~0x01) +#define CONFIG_PERSISTENT_HEADER_STATE_UPDATE_COMPLETE (CONFIG_PERSISTENT_HEADER_STATE_BEGIN_UPATE & ~0x02) +#define CONFIG_PERSISTENT_HEADER_STATE_USE_NEXT_COPY (CONFIG_PERSISTENT_HEADER_STATE_UPDATE_COMPLETE & ~0x04) + + +#if VERIFY_ENDIANNESS && EFIEBC + + +int +concatenateSasFirmwareNvdata(void) +{ + return 0; +} + + +#else + + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + U16 SubSystemIDFunc0; + U16 SubSystemVendorIDFunc0; + U8 PCIMemDiagSize; + U8 Reserved05; + U16 SubSystemIDFunc1; + U16 SubSystemVendorIDFunc1; + U8 AutoDownloadChecksum; + U8 Reserved0B; + U8 VendorIDDeviceIDLock; + U8 Reserved0D; + U16 VendorID0; + U16 DeviceID0; + U16 VendorID1; + U16 DeviceID1; + U8 ClassCode0[3]; + U8 Reserved19; + U8 ClassCode1[3]; + U8 Reserved1D; + U16 HardwareConfig; + U32 OptionRomOffset0; + U32 OptionRomOffset1; +} ManufacturingPage2_SAS_t, *pManufacturingPage2_SAS_t; + + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + MPI2_CHIP_REVISION_ID ChipId; + U32 Foo[19]; +} ManufacturingPage2_SAS2_t, *pManufacturingPage2_SAS2_t; + + +#define IOC_MFG_PAGE3_GPIO_DEFS (8) +#define IOC_MFG_PAGE3_NUM_PHYS_PER_QUAD (4) +#define IOC_MFG_PAGE3_NUM_QUADS (2) + +typedef struct +{ + U32 GigablazeConfig[4]; + U32 Reserved[1]; +} IOC_PHY_CONFIG; + +typedef struct +{ + U8 HotPlugTimeout; + U8 MaxCmdFrames; + U16 Reserved1; + U32 Reserved2[4]; + IOC_PHY_CONFIG PhyConfig[IOC_MFG_PAGE3_NUM_PHYS_PER_QUAD]; +} IOC_QUAD_CONFIG; + +typedef struct +{ + CONFIG_PAGE_HEADER Header; + MPI_CHIP_REVISION_ID ChipId; + U16 GPIODefinition[IOC_MFG_PAGE3_GPIO_DEFS]; + U8 FlashTime; + U8 NVTime; + U8 Flag; + U8 RuntimeConfig; + U8 SGPIOType; + U8 SEPType; + U8 PCIELaneConfig; + U8 Reserved0; + U32 PCIEConfig2; + U32 Reserved2; + U8 Reserved3[2]; + U8 Reserved4; + U8 Reserved5; + IOC_QUAD_CONFIG QuadConfig[IOC_MFG_PAGE3_NUM_QUADS]; +} ManufacturingPage3_SAS_t, *pManufacturingPage3_SAS_t; + + +#define IOC_MFG_PAGE3_NUM_PHYS (16) + +typedef struct _IOC_PHY_GROUP +{ + U32 Misc; + U32 Sas1G1Low; + U32 Sas1G1High; + U32 Sas1G2Low; + U32 Sas1G2High; + U32 SasOobLow; + U32 SasOobHigh; + U32 Sas2G1Low; + U32 Sas2G1High; + U32 Sas2G2Low; + U32 Sas2G2High; + U32 Sas2G3Low; + U32 Sas2G3High; + U32 SataG1Low; + U32 SataG1High; + U32 SataG2Low; + U32 SataG2High; + U32 SataG3Low; + U32 SataG3High; + U32 SataOobLow; + U32 SataOobHigh; +} IOC_PHY_GROUP; + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + MPI2_CHIP_REVISION_ID ChipId; + U32 Reserved1; + U32 Reserved2; + U32 Reserved3; + U32 Reserved4; + IOC_PHY_GROUP PhyGroup[4]; + U8 NumPhys; + U8 Reserved5; + U8 Reserved6; + U8 Reserved7; + U32 Phy[IOC_MFG_PAGE3_NUM_PHYS]; +} ManufacturingPage3_SAS2_t, *pManufacturingPage3_SAS2_t; + + +#define IOC_MFG_PAGE6_GPIO_DEFS (32) + +typedef struct +{ + U8 FunctionCode; + U8 Flags; + U8 Param1; + U8 Param2; + U32 Param3; +} IOC_CFG_MFG_6_GPIO_DEF; + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + U8 NumGPIO; + U8 Reserved1[3]; + U32 Reserved2; + U32 Reserved3; + IOC_CFG_MFG_6_GPIO_DEF GPIODefinition[IOC_MFG_PAGE6_GPIO_DEFS]; +} ManufacturingPage6_SAS2_t, *pManufacturingPage6_SAS2_t; + + +#define IOC_CFG_MFG9_NUMBER_OF_RESOURCES (13) + +typedef struct +{ + U32 Maximum; + U32 Decrement; + U32 Minimum; + U32 Actual; +} IOC_CFG_MFG9_RESOURCE; + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + U32 MaxAttempts; + U32 NumResources; + U32 Reserved1; + U32 Reserved2; + IOC_CFG_MFG9_RESOURCE ResourceArray[IOC_CFG_MFG9_NUMBER_OF_RESOURCES]; +} ManufacturingPage9_SAS2_t, *pManufacturingPage9_SAS2_t; + + +typedef struct +{ + U8 Flags; + U8 MoreFlags; + U16 TO; + U32 BaudRate; +} IOC_CFG_UART_SETTINGS; + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + U8 FlashTime; + U8 NVTime; + U8 Flag; + U8 Reserved1; + U8 HotPlugTimeout; + U8 Reserved[3]; + U8 MaxCmdFrames[4]; + U32 SysRefClk; + U32 Reserved2; + U32 ExtUartClk; + IOC_CFG_UART_SETTINGS UartSettings[2]; +} ManufacturingPage11_SAS2_t, *pManufacturingPage11_SAS2_t; + + +#define IOC_MAN_PAGE_12_SGPIO_INFO_ENTRIES (4) + +typedef struct +{ + U32 Flags; + U32 BitOrderSelect[12]; +} SGPIO_CONFIG_INFO; + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + U32 Flags; + U32 Reserved1; + U32 Reserved2; + U32 SGPIOCfg1; + U8 NumSGPIO; + U8 SGPIOType; + U16 ClkDivide; + U32 DefaultTxCtrl; + U32 SGPIOPatDef0; + U32 SGPIOPatDef1; + U32 SGPIOPatDef2; + U32 SGPIOPatDef3; + SGPIO_CONFIG_INFO SGPIOInfo[IOC_MAN_PAGE_12_SGPIO_INFO_ENTRIES]; +} ManufacturingPage12_SAS2_t, *pManufacturingPage12_SAS2_t; + + +#define IOC_MAN_PAGE_13_SGPIO_ENTRIES (4) + +typedef struct _SGPIO_TRANSLATION_DATA +{ + U32 Mask; + U32 SlotStatus; + U8 TxControl[4]; +} SGPIO_TRANSLATION_DATA, *PTR_SGPIO_TRANSLATION_DATA; + +typedef struct +{ + MPI2_CONFIG_PAGE_HEADER Header; + U8 NumSgpioEntries; + U8 Reserved0; + U16 Reserved1; + U32 Reserved2; + SGPIO_TRANSLATION_DATA SGPIOData[IOC_MAN_PAGE_13_SGPIO_ENTRIES]; +} ManufacturingPage13_SAS2_t, *pManufacturingPage13_SAS2_t; + + +typedef struct +{ + SAS_ADDRESS SasAddress; + U32 Reserved; +} SAS_PERSISTENT_ID_ENTRY; + +#define SAS_NUM_PERSIST_IDS_PER_PAGE (0x01) + +typedef struct +{ + CONFIG_EXTENDED_PAGE_HEADER Header; + SAS_PERSISTENT_ID_ENTRY PersistId[SAS_NUM_PERSIST_IDS_PER_PAGE]; +} PersistentId_SAS_t, *pPersistentId_SAS_t; + + +#define STR (1<<0) // item is a string +#define OPT (1<<1) // item is optional +#define DUP (1<<2) // item is a duplicate +#define BIT (1<<3) // item size is in bits, not bytes +#define IGN (1<<4) // item should be ignored if zero +#define MPI1 (1<<5) // item only applies to MPI 1.x +#define MPI2 (1<<6) // item only applies to MPI 2.0 +//TMC: MPI2.5 TODO + +typedef struct +{ + char *name; + int offset; + int size; + int flags; +} ITEM; + +#define EXT (1<<0) // section is an extended config page +#define GEN (1<<1) // section is "General" +#define PID (1<<2) // section is "Persistent ID" +#define MP2 (1<<3) // section is "Manufacturing Page 2" + +typedef struct +{ + char *name; + ITEM *items; + int size; + int flags; +} SECTION; + +typedef struct +{ + U8 SasAddress[6]; + U8 UserVersion; + U8 VendorId[8]; + U8 ProductId[16]; + U8 ProductRevision[4]; +} GeneralData_t, *pGeneralData_t; + +#undef data +#define data(x) (int)(size_t)&((pGeneralData_t)0)->x, sizeof(((pGeneralData_t)0)->x) + +ITEM general_data_items[] = +{ + {"SAS_ADRS_PREFIX", data(SasAddress), STR | OPT}, + {"USER_VERSION", data(UserVersion), 0}, + {"NVDATA_VENDORID", data(VendorId), STR}, + {"NVDATA_PRODUCTID", data(ProductId), STR}, + {"NVDATA_PRODUCT_REVISION", data(ProductRevision), STR}, + {0} +}; + +ITEM special_item = +{ + " SPECIAL ", 0, 0, OPT +}; + +ITEM forceupdate_item = +{ + "FORCEUPDATE", 0, 1, BIT +}; + +#undef data +#define data(x) (int)(size_t)&((pConfigPageHeader_t)0)->x, sizeof(((pConfigPageHeader_t)0)->x) + +ITEM header_items[] = +{ + {"PAGE_VERSION", data(PageVersion), 0}, + {"PAGE_LENGTH", data(PageLength), 0}, + {"PAGE_NUMBER", data(PageNumber), 0}, + {"PAGE_TYPE", data(PageType), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pConfigExtendedPageHeader_t)0)->x, sizeof(((pConfigExtendedPageHeader_t)0)->x) + +ITEM ext_header_items[] = +{ + {"PAGE_VERSION", data(PageVersion), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"CONFIG_EXTENDED_PAGE_HEADER_RESERVED1", data(Reserved1), OPT}, + {"PAGE_NUMBER", data(PageNumber), 0}, + {"PAGE_TYPE", data(PageType), 0}, + {"EXT_PAGE_LENGTH", data(ExtPageLength), 0}, + {"EXT_PAGE_TYPE", data(ExtPageType), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"CONFIG_EXTENDED_PAGE_HEADER_RESERVED2", data(Reserved2), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage0_t)0)->x, sizeof(((pManufacturingPage0_t)0)->x) + +ITEM manufacturing_page_0_items[] = +{ + {"CHIP_NAME", data(ChipName), STR}, + {"CHIP_REVISION", data(ChipRevision), STR}, + {"BOARD_NAME", data(BoardName), STR}, + {"BOARD_ASSEMBLY", data(BoardAssembly), STR}, + {"BOARD_TRACER_NUMBER", data(BoardTracerNumber), STR}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage1_t)0)->x, sizeof(((pManufacturingPage1_t)0)->x) + +ITEM manufacturing_page_1_items[] = +{ + {"VPD", data(VPD), STR}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage2_SAS_t)0)->x, sizeof(((pManufacturingPage2_SAS_t)0)->x) + +ITEM manufacturing_page_2_items[] = +{ + {"DEVICE_ID", data(ChipId.DeviceID), 0}, + {"PCI_REVISION", data(ChipId.PCIRevisionID), 0}, + {"MPI_CHIP_REVISION_ID_RESERVED", data(ChipId.Reserved), OPT}, + {"RESERVED", data(ChipId.Reserved), OPT}, + {"SSID_FCN_0", data(SubSystemIDFunc0), 0}, + {"SSVID_FCN_0", data(SubSystemVendorIDFunc0), 0}, + {"PCI_MEM_DIAG_SIZE", data(PCIMemDiagSize), 0}, + {"RESERVED0", data(Reserved05), OPT}, + {"RESERVED05", data(Reserved05), OPT}, + {"SSID_FCN_1", data(SubSystemIDFunc1), 0}, + {"SSVID_FCN_1", data(SubSystemVendorIDFunc1), 0}, + {"AUTODOWNLOAD_CHECKSUM", data(AutoDownloadChecksum), 0}, + {"RESERVED1", data(Reserved0B), OPT}, + {"RESERVED0B", data(Reserved0B), OPT}, + {"VENDORIDDEVICEIDLOCK", data(VendorIDDeviceIDLock), 0}, + {"RESERVED2", data(Reserved0D), OPT}, + {"RESERVED0D", data(Reserved0D), OPT}, + {"VENDOR_ID_0", data(VendorID0), 0}, + {"DEVICE_ID_0", data(DeviceID0), 0}, + {"VENDOR_ID_1", data(VendorID1), 0}, + {"DEVICE_ID_1", data(DeviceID1), 0}, + {"CC_0_SPECIFIC_CLASS", data(ClassCode0[0]), 0}, + {"CC_0_SUB_CLASS", data(ClassCode0[1]), 0}, + {"CC_0_BASE_CLASS", data(ClassCode0[2]), 0}, + {"RESERVED3", data(Reserved19), OPT}, + {"RESERVED19", data(Reserved19), OPT}, + {"CC_1_SPECIFIC_CLASS", data(ClassCode1[0]), 0}, + {"CC_1_SUB_CLASS", data(ClassCode1[1]), 0}, + {"CC_1_BASE_CLASS", data(ClassCode1[2]), 0}, + {"RESERVED4", data(Reserved1D), OPT}, + {"RESERVED1D", data(Reserved1D), OPT}, + {"HARDWARECONFIG", data(HardwareConfig), 0}, + {"OPTIONROMOFFSETFUNC0", data(OptionRomOffset0), 0}, + {"OPTIONROMOFFSETFUNC1", data(OptionRomOffset1), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage2_SAS2_t)0)->x, sizeof(((pManufacturingPage2_SAS2_t)0)->x) + +ITEM manufacturing_page_2_items2[] = +{ + {"DEVICE_ID", data(ChipId.DeviceID), 0}, + {"PCI_REVISION", data(ChipId.PCIRevisionID), 0}, + {"MPI_CHIP_REVISION_ID_RESERVED", data(ChipId.Reserved), OPT}, +// {"FOO_0", data(Foo[0]), 0}, +// {"FOO_1", data(Foo[1]), 0}, +// {"FOO_2", data(Foo[2]), 0}, +// {"FOO_3", data(Foo[3]), 0}, +// {"FOO_4", data(Foo[4]), 0}, +// {"FOO_5", data(Foo[5]), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage3_SAS_t)0)->x, sizeof(((pManufacturingPage3_SAS_t)0)->x) + +ITEM manufacturing_page_3_items[] = +{ + {"DEVICE_ID", data(ChipId.DeviceID), 0}, + {"PCI_REVISION_ID", data(ChipId.PCIRevisionID), 0}, + {"RESERVED", data(ChipId.Reserved), OPT}, + {"MPI_CHIP_REVISION_ID_RESERVED", data(ChipId.Reserved), OPT}, + {"GPIODEFINITION_0", data(GPIODefinition[0]), 0}, + {"GPIODEFINITION_1", data(GPIODefinition[1]), 0}, + {"GPIODEFINITION_2", data(GPIODefinition[2]), 0}, + {"GPIODEFINITION_3", data(GPIODefinition[3]), 0}, + {"GPIODEFINITION_4", data(GPIODefinition[4]), 0}, + {"GPIODEFINITION_5", data(GPIODefinition[5]), 0}, + {"GPIODEFINITION_6", data(GPIODefinition[6]), 0}, + {"GPIODEFINITION_7", data(GPIODefinition[7]), 0}, + {"FLASH_TIME", data(FlashTime), 0}, + {"NVS_TIME", data(NVTime), 0}, + {"FLAG", data(Flag), 0}, + {"RUNTIMECONFIG", data(RuntimeConfig), 0}, + {"SGPIOTYPE", data(SGPIOType), 0}, + {"MP3_SEPTYPE", data(SEPType), 0}, + {"PCIELANECONFIG", data(PCIELaneConfig), OPT}, + {"RESERVED", data(PCIELaneConfig), OPT}, + {"RESERVED0", data(Reserved0), OPT}, + {"PCIECONFIG2", data(PCIEConfig2), OPT}, + {"RESERVED1", data(PCIEConfig2), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3_0", data(Reserved3[0]), OPT}, + {"RESERVED3_1", data(Reserved3[1]), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {"HOT_PLUG_TIM_OUT", data(QuadConfig[0].HotPlugTimeout), DUP}, + {"IOC_QUAD_CONFIG0_HOT_PLUG_TIM_OUT", data(QuadConfig[0].HotPlugTimeout), 0}, + {"MAX_CMD_FRAMES", data(QuadConfig[0].MaxCmdFrames), DUP}, + {"IOC_QUAD_CONFIG0_MAX_CMD_FRAMES", data(QuadConfig[0].MaxCmdFrames), 0}, + {"RESERVED1", data(QuadConfig[0].Reserved1), OPT}, + {"IOC_QUAD_CONFIG0_RESERVED1", data(QuadConfig[0].Reserved1), OPT}, + {"RESERVED2", data(QuadConfig[0].Reserved2), OPT}, + {"IOC_QUAD_CONFIG0_RESERVED2_0", data(QuadConfig[0].Reserved2[0]), OPT}, + {"IOC_QUAD_CONFIG0_RESERVED2_1", data(QuadConfig[0].Reserved2[1]), OPT}, + {"IOC_QUAD_CONFIG0_RESERVED2_2", data(QuadConfig[0].Reserved2[2]), OPT}, + {"IOC_QUAD_CONFIG0_RESERVED2_3", data(QuadConfig[0].Reserved2[3]), OPT}, + {"QUAD0_PHY0_GIG_CONFIG0", data(QuadConfig[0].PhyConfig[0].GigablazeConfig[0]), 0}, + {"QUAD0_PHY0_GIG_CONFIG1", data(QuadConfig[0].PhyConfig[0].GigablazeConfig[1]), 0}, + {"QUAD0_PHY0_GIG_CONFIG2", data(QuadConfig[0].PhyConfig[0].GigablazeConfig[2]), 0}, + {"QUAD0_PHY0_GIG_CONFIG3", data(QuadConfig[0].PhyConfig[0].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[0].PhyConfig[0].Reserved), OPT}, + {"QUAD0_PHY0_GIG_CONFIG3_RESERVED", data(QuadConfig[0].PhyConfig[0].Reserved), OPT}, + {"QUAD0_PHY1_GIG_CONFIG0", data(QuadConfig[0].PhyConfig[1].GigablazeConfig[0]), 0}, + {"QUAD0_PHY1_GIG_CONFIG1", data(QuadConfig[0].PhyConfig[1].GigablazeConfig[1]), 0}, + {"QUAD0_PHY1_GIG_CONFIG2", data(QuadConfig[0].PhyConfig[1].GigablazeConfig[2]), 0}, + {"QUAD0_PHY1_GIG_CONFIG3", data(QuadConfig[0].PhyConfig[1].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[0].PhyConfig[1].Reserved), OPT}, + {"QUAD0_PHY1_GIG_CONFIG3_RESERVED", data(QuadConfig[0].PhyConfig[1].Reserved), OPT}, + {"QUAD0_PHY2_GIG_CONFIG0", data(QuadConfig[0].PhyConfig[2].GigablazeConfig[0]), 0}, + {"QUAD0_PHY2_GIG_CONFIG1", data(QuadConfig[0].PhyConfig[2].GigablazeConfig[1]), 0}, + {"QUAD0_PHY2_GIG_CONFIG2", data(QuadConfig[0].PhyConfig[2].GigablazeConfig[2]), 0}, + {"QUAD0_PHY2_GIG_CONFIG3", data(QuadConfig[0].PhyConfig[2].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[0].PhyConfig[2].Reserved), OPT}, + {"QUAD0_PHY2_GIG_CONFIG3_RESERVED", data(QuadConfig[0].PhyConfig[2].Reserved), OPT}, + {"QUAD0_PHY3_GIG_CONFIG0", data(QuadConfig[0].PhyConfig[3].GigablazeConfig[0]), 0}, + {"QUAD0_PHY3_GIG_CONFIG1", data(QuadConfig[0].PhyConfig[3].GigablazeConfig[1]), 0}, + {"QUAD0_PHY3_GIG_CONFIG2", data(QuadConfig[0].PhyConfig[3].GigablazeConfig[2]), 0}, + {"QUAD0_PHY3_GIG_CONFIG3", data(QuadConfig[0].PhyConfig[3].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[0].PhyConfig[3].Reserved), OPT}, + {"QUAD0_PHY3_GIG_CONFIG3_RESERVED", data(QuadConfig[0].PhyConfig[3].Reserved), OPT}, + {"HOT_PLUG_TIM_OUT", data(QuadConfig[1].HotPlugTimeout), DUP}, + {"IOC_QUAD_CONFIG1_HOT_PLUG_TIM_OUT", data(QuadConfig[1].HotPlugTimeout), 0}, + {"MAX_CMD_FRAMES", data(QuadConfig[1].MaxCmdFrames), DUP}, + {"IOC_QUAD_CONFIG1_MAX_CMD_FRAMES", data(QuadConfig[1].MaxCmdFrames), 0}, + {"RESERVED1", data(QuadConfig[1].Reserved1), OPT}, + {"IOC_QUAD_CONFIG1_RESERVED1", data(QuadConfig[1].Reserved1), OPT}, + {"RESERVED2", data(QuadConfig[1].Reserved2), OPT}, + {"IOC_QUAD_CONFIG1_RESERVED2_0", data(QuadConfig[1].Reserved2[0]), OPT}, + {"IOC_QUAD_CONFIG1_RESERVED2_1", data(QuadConfig[1].Reserved2[1]), OPT}, + {"IOC_QUAD_CONFIG1_RESERVED2_2", data(QuadConfig[1].Reserved2[2]), OPT}, + {"IOC_QUAD_CONFIG1_RESERVED2_3", data(QuadConfig[1].Reserved2[3]), OPT}, + {"QUAD1_PHY0_GIG_CONFIG0", data(QuadConfig[1].PhyConfig[0].GigablazeConfig[0]), 0}, + {"QUAD1_PHY0_GIG_CONFIG1", data(QuadConfig[1].PhyConfig[0].GigablazeConfig[1]), 0}, + {"QUAD1_PHY0_GIG_CONFIG2", data(QuadConfig[1].PhyConfig[0].GigablazeConfig[2]), 0}, + {"QUAD1_PHY0_GIG_CONFIG3", data(QuadConfig[1].PhyConfig[0].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[1].PhyConfig[0].Reserved), OPT}, + {"QUAD1_PHY0_GIG_CONFIG3_RESERVED", data(QuadConfig[1].PhyConfig[0].Reserved), OPT}, + {"QUAD1_PHY1_GIG_CONFIG0", data(QuadConfig[1].PhyConfig[1].GigablazeConfig[0]), 0}, + {"QUAD1_PHY1_GIG_CONFIG1", data(QuadConfig[1].PhyConfig[1].GigablazeConfig[1]), 0}, + {"QUAD1_PHY1_GIG_CONFIG2", data(QuadConfig[1].PhyConfig[1].GigablazeConfig[2]), 0}, + {"QUAD1_PHY1_GIG_CONFIG3", data(QuadConfig[1].PhyConfig[1].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[1].PhyConfig[1].Reserved), OPT}, + {"QUAD1_PHY1_GIG_CONFIG3_RESERVED", data(QuadConfig[1].PhyConfig[1].Reserved), OPT}, + {"QUAD1_PHY2_GIG_CONFIG0", data(QuadConfig[1].PhyConfig[2].GigablazeConfig[0]), 0}, + {"QUAD1_PHY2_GIG_CONFIG1", data(QuadConfig[1].PhyConfig[2].GigablazeConfig[1]), 0}, + {"QUAD1_PHY2_GIG_CONFIG2", data(QuadConfig[1].PhyConfig[2].GigablazeConfig[2]), 0}, + {"QUAD1_PHY2_GIG_CONFIG3", data(QuadConfig[1].PhyConfig[2].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[1].PhyConfig[2].Reserved), OPT}, + {"QUAD1_PHY2_GIG_CONFIG3_RESERVED", data(QuadConfig[1].PhyConfig[2].Reserved), OPT}, + {"QUAD1_PHY3_GIG_CONFIG0", data(QuadConfig[1].PhyConfig[3].GigablazeConfig[0]), 0}, + {"QUAD1_PHY3_GIG_CONFIG1", data(QuadConfig[1].PhyConfig[3].GigablazeConfig[1]), 0}, + {"QUAD1_PHY3_GIG_CONFIG2", data(QuadConfig[1].PhyConfig[3].GigablazeConfig[2]), 0}, + {"QUAD1_PHY3_GIG_CONFIG3", data(QuadConfig[1].PhyConfig[3].GigablazeConfig[3]), 0}, + {"RESERVED1", data(QuadConfig[1].PhyConfig[3].Reserved), OPT}, + {"QUAD1_PHY3_GIG_CONFIG3_RESERVED", data(QuadConfig[1].PhyConfig[3].Reserved), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage3_SAS2_t)0)->x, sizeof(((pManufacturingPage3_SAS2_t)0)->x) + +ITEM manufacturing_page_3_items2[] = +{ + {"DEVICE_ID", data(ChipId.DeviceID), 0}, + {"PCI_REVISION_ID", data(ChipId.PCIRevisionID), 0}, + {"MPI_CHIP_REVISION_ID_RESERVED", data(ChipId.Reserved), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"GROUP0_MISC", data(PhyGroup[0].Misc), 0}, + {"GROUP0_SAS1G1LOW", data(PhyGroup[0].Sas1G1Low), 0}, + {"GROUP0_SAS1G1HIGH", data(PhyGroup[0].Sas1G1High), 0}, + {"GROUP0_SAS1G2LOW", data(PhyGroup[0].Sas1G2Low), 0}, + {"GROUP0_SAS1G2HIGH", data(PhyGroup[0].Sas1G2High), 0}, + {"GROUP0_SASOOBLOW", data(PhyGroup[0].SasOobLow), 0}, + {"GROUP0_SASOOBHIGH", data(PhyGroup[0].SasOobHigh), 0}, + {"GROUP0_SAS2G1LOW", data(PhyGroup[0].Sas2G1Low), 0}, + {"GROUP0_SAS2G1HIGH", data(PhyGroup[0].Sas2G1High), 0}, + {"GROUP0_SAS2G2LOW", data(PhyGroup[0].Sas2G2Low), 0}, + {"GROUP0_SAS2G2HIGH", data(PhyGroup[0].Sas2G2High), 0}, + {"GROUP0_SAS2G3LOW", data(PhyGroup[0].Sas2G3Low), 0}, + {"GROUP0_SAS2G3HIGH", data(PhyGroup[0].Sas2G3High), 0}, + {"GROUP0_SATAG1LOW", data(PhyGroup[0].SataG1Low), 0}, + {"GROUP0_SATAG1HIGH", data(PhyGroup[0].SataG1High), 0}, + {"GROUP0_SATAG2LOW", data(PhyGroup[0].SataG2Low), 0}, + {"GROUP0_SATAG2HIGH", data(PhyGroup[0].SataG2High), 0}, + {"GROUP0_SATAG3LOW", data(PhyGroup[0].SataG3Low), 0}, + {"GROUP0_SATAG3HIGH", data(PhyGroup[0].SataG3High), 0}, + {"GROUP0_SATAOOBLOW", data(PhyGroup[0].SataOobLow), 0}, + {"GROUP0_SATAOOBHIGH", data(PhyGroup[0].SataOobHigh), 0}, + {"GROUP1_MISC", data(PhyGroup[1].Misc), 0}, + {"GROUP1_SAS1G1LOW", data(PhyGroup[1].Sas1G1Low), 0}, + {"GROUP1_SAS1G1HIGH", data(PhyGroup[1].Sas1G1High), 0}, + {"GROUP1_SAS1G2LOW", data(PhyGroup[1].Sas1G2Low), 0}, + {"GROUP1_SAS1G2HIGH", data(PhyGroup[1].Sas1G2High), 0}, + {"GROUP1_SASOOBLOW", data(PhyGroup[1].SasOobLow), 0}, + {"GROUP1_SASOOBHIGH", data(PhyGroup[1].SasOobHigh), 0}, + {"GROUP1_SAS2G1LOW", data(PhyGroup[1].Sas2G1Low), 0}, + {"GROUP1_SAS2G1HIGH", data(PhyGroup[1].Sas2G1High), 0}, + {"GROUP1_SAS2G2LOW", data(PhyGroup[1].Sas2G2Low), 0}, + {"GROUP1_SAS2G2HIGH", data(PhyGroup[1].Sas2G2High), 0}, + {"GROUP1_SAS2G3LOW", data(PhyGroup[1].Sas2G3Low), 0}, + {"GROUP1_SAS2G3HIGH", data(PhyGroup[1].Sas2G3High), 0}, + {"GROUP1_SATAG1LOW", data(PhyGroup[1].SataG1Low), 0}, + {"GROUP1_SATAG1HIGH", data(PhyGroup[1].SataG1High), 0}, + {"GROUP1_SATAG2LOW", data(PhyGroup[1].SataG2Low), 0}, + {"GROUP1_SATAG2HIGH", data(PhyGroup[1].SataG2High), 0}, + {"GROUP1_SATAG3LOW", data(PhyGroup[1].SataG3Low), 0}, + {"GROUP1_SATAG3HIGH", data(PhyGroup[1].SataG3High), 0}, + {"GROUP1_SATAOOBLOW", data(PhyGroup[1].SataOobLow), 0}, + {"GROUP1_SATAOOBHIGH", data(PhyGroup[1].SataOobHigh), 0}, + {"GROUP2_MISC", data(PhyGroup[2].Misc), 0}, + {"GROUP2_SAS1G1LOW", data(PhyGroup[2].Sas1G1Low), 0}, + {"GROUP2_SAS1G1HIGH", data(PhyGroup[2].Sas1G1High), 0}, + {"GROUP2_SAS1G2LOW", data(PhyGroup[2].Sas1G2Low), 0}, + {"GROUP2_SAS1G2HIGH", data(PhyGroup[2].Sas1G2High), 0}, + {"GROUP2_SASOOBLOW", data(PhyGroup[2].SasOobLow), 0}, + {"GROUP2_SASOOBHIGH", data(PhyGroup[2].SasOobHigh), 0}, + {"GROUP2_SAS2G1LOW", data(PhyGroup[2].Sas2G1Low), 0}, + {"GROUP2_SAS2G1HIGH", data(PhyGroup[2].Sas2G1High), 0}, + {"GROUP2_SAS2G2LOW", data(PhyGroup[2].Sas2G2Low), 0}, + {"GROUP2_SAS2G2HIGH", data(PhyGroup[2].Sas2G2High), 0}, + {"GROUP2_SAS2G3LOW", data(PhyGroup[2].Sas2G3Low), 0}, + {"GROUP2_SAS2G3HIGH", data(PhyGroup[2].Sas2G3High), 0}, + {"GROUP2_SATAG1LOW", data(PhyGroup[2].SataG1Low), 0}, + {"GROUP2_SATAG1HIGH", data(PhyGroup[2].SataG1High), 0}, + {"GROUP2_SATAG2LOW", data(PhyGroup[2].SataG2Low), 0}, + {"GROUP2_SATAG2HIGH", data(PhyGroup[2].SataG2High), 0}, + {"GROUP2_SATAG3LOW", data(PhyGroup[2].SataG3Low), 0}, + {"GROUP2_SATAG3HIGH", data(PhyGroup[2].SataG3High), 0}, + {"GROUP2_SATAOOBLOW", data(PhyGroup[2].SataOobLow), 0}, + {"GROUP2_SATAOOBHIGH", data(PhyGroup[2].SataOobHigh), 0}, + {"GROUP3_MISC", data(PhyGroup[3].Misc), 0}, + {"GROUP3_SAS1G1LOW", data(PhyGroup[3].Sas1G1Low), 0}, + {"GROUP3_SAS1G1HIGH", data(PhyGroup[3].Sas1G1High), 0}, + {"GROUP3_SAS1G2LOW", data(PhyGroup[3].Sas1G2Low), 0}, + {"GROUP3_SAS1G2HIGH", data(PhyGroup[3].Sas1G2High), 0}, + {"GROUP3_SASOOBLOW", data(PhyGroup[3].SasOobLow), 0}, + {"GROUP3_SASOOBHIGH", data(PhyGroup[3].SasOobHigh), 0}, + {"GROUP3_SAS2G1LOW", data(PhyGroup[3].Sas2G1Low), 0}, + {"GROUP3_SAS2G1HIGH", data(PhyGroup[3].Sas2G1High), 0}, + {"GROUP3_SAS2G2LOW", data(PhyGroup[3].Sas2G2Low), 0}, + {"GROUP3_SAS2G2HIGH", data(PhyGroup[3].Sas2G2High), 0}, + {"GROUP3_SAS2G3LOW", data(PhyGroup[3].Sas2G3Low), 0}, + {"GROUP3_SAS2G3HIGH", data(PhyGroup[3].Sas2G3High), 0}, + {"GROUP3_SATAG1LOW", data(PhyGroup[3].SataG1Low), 0}, + {"GROUP3_SATAG1HIGH", data(PhyGroup[3].SataG1High), 0}, + {"GROUP3_SATAG2LOW", data(PhyGroup[3].SataG2Low), 0}, + {"GROUP3_SATAG2HIGH", data(PhyGroup[3].SataG2High), 0}, + {"GROUP3_SATAG3LOW", data(PhyGroup[3].SataG3Low), 0}, + {"GROUP3_SATAG3HIGH", data(PhyGroup[3].SataG3High), 0}, + {"GROUP3_SATAOOBLOW", data(PhyGroup[3].SataOobLow), 0}, + {"GROUP3_SATAOOBHIGH", data(PhyGroup[3].SataOobHigh), 0}, + {"NUM_PHYS", data(NumPhys), 0}, + {"RESERVED5", data(Reserved5), OPT}, + {"RESERVED6", data(Reserved6), OPT}, + {"RESERVED7", data(Reserved7), OPT}, + {"PHY_0", data(Phy[0]), 0}, + {"PHY_1", data(Phy[1]), 0}, + {"PHY_2", data(Phy[2]), 0}, + {"PHY_3", data(Phy[3]), 0}, + {"PHY_4", data(Phy[4]), 0}, + {"PHY_5", data(Phy[5]), 0}, + {"PHY_6", data(Phy[6]), 0}, + {"PHY_7", data(Phy[7]), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage4_t)0)->x, sizeof(((pManufacturingPage4_t)0)->x) +#define off(x) (int)(size_t)&((pManufacturingPage4_t)0)->x + +ITEM manufacturing_page_4_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"INFO_OFFSET_0", data(InfoOffset0), 0}, + {"INFO_SIZE_0", data(InfoSize0), 0}, + {"INFO_OFFSET_1", data(InfoOffset1), 0}, + {"INFO_SIZE_1", data(InfoSize1), 0}, + {"INQUIRY_SIZE", data(InquirySize), 0}, + {"MP4_FLAGS", data(Flags), 0}, + {"RESERVED2", data(ExtFlags), OPT}, + {"EXTENDED_FLAGS", data(ExtFlags), OPT}, + {"DEVICE_TYPE", off(InquiryData[0]), 1, 0}, + {"DEVICE_TYPE_MOD", off(InquiryData[1]), 1, 0}, + {"VERSIONS", off(InquiryData[2]), 1, 0}, + {"DATA_FORMAT", off(InquiryData[3]), 1, 0}, + {"ADDITIONAL_LENGTH", off(InquiryData[4]), 1, 0}, + {"CAPABILITY_BITS", off(InquiryData[7]), 1, 0}, + {"VENDOR_ID", off(InquiryData[8]), 8, STR}, + {"PRODUCT_ID", off(InquiryData[16]), 16, STR}, + {"PRODUCT_REV", off(InquiryData[32]), 4, STR}, + {"VENDOR_SPECIFIC", off(InquiryData[36]), 20, STR}, + {"ISVOLUMESETTINGS", data(ISVolumeSettings), 0}, + {"IMEVOLUMESETTINGS", data(IMEVolumeSettings), 0}, + {"IMVOLUMESETTINGS", data(IMVolumeSettings), 0}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {"IME_DATASCRUBRATE", data(IMEDataScrubRate), 0}, + {"IME_RESYNCRATE", data(IMEResyncRate), 0}, + {"RESERVED6", data(Reserved6), OPT}, + {"IM_DATASCRUBRATE", data(IMDataScrubRate), 0}, + {"IM_RESYNCRATE", data(IMResyncRate), 0}, + {"RESERVED7", data(Reserved7), OPT}, + {"RESERVED8", data(Reserved8), OPT}, + {"RESERVED9", data(Reserved9), OPT}, + {0} +}; + +#undef off +#undef data +#define data(x) (int)(size_t)&((pMpi2ManufacturingPage4_t)0)->x, sizeof(((pMpi2ManufacturingPage4_t)0)->x) +#define off(x) (int)(size_t)&((pMpi2ManufacturingPage4_t)0)->x + +ITEM manufacturing_page_4_items2[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"FLAGS", data(Flags), 0}, + {"INQUIRY_SIZE", data(InquirySize), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"DEVICE_TYPE", off(InquiryData[0]), 1, 0}, + {"DEVICE_TYPE_MOD", off(InquiryData[1]), 1, 0}, + {"VERSIONS", off(InquiryData[2]), 1, 0}, + {"DATA_FORMAT", off(InquiryData[3]), 1, 0}, + {"ADDITIONAL_LENGTH", off(InquiryData[4]), 1, 0}, + {"CAPABILITY_BITS", off(InquiryData[7]), 1, 0}, + {"VENDOR_ID", off(InquiryData[8]), 8, STR}, + {"PRODUCT_ID", off(InquiryData[16]), 16, STR}, + {"PRODUCT_REV", off(InquiryData[32]), 4, STR}, + {"VENDOR_SPECIFIC", off(InquiryData[36]), 20, STR}, + {"RAID0VOLUMESETTINGS", data(RAID0VolumeSettings), 0}, + {"RAID1EVOLUMESETTINGS", data(RAID1EVolumeSettings), 0}, + {"RAID1VOLUMESETTINGS", data(RAID1VolumeSettings), 0}, + {"RAID10VOLUMESETTINGS", data(RAID10VolumeSettings), 0}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {"POWERSAVEFLAGS", data(PowerSaveSettings.PowerSaveFlags), 0}, + {"INTOPSLEEPTIME", data(PowerSaveSettings.InternalOperationsSleepTime), 0}, + {"INTOPRUNTIME", data(PowerSaveSettings.InternalOperationsRunTime), 0}, + {"HOSTIDLETIME", data(PowerSaveSettings.HostIdleTime), 0}, + {"MAXOCEDISKS", data(MaxOCEDisks), 0}, + {"RESYNCRATE", data(ResyncRate), 0}, + {"DATASCRUBDURATION", data(DataScrubDuration), 0}, + {"MAXHOTSPARES", data(MaxHotSpares), 0}, + {"MAXPHYSDISKSPERVOL", data(MaxPhysDisksPerVol), 0}, + {"MAXPHYSDISKS", data(MaxPhysDisks), 0}, + {"MAXVOLUMES", data(MaxVolumes), 0}, + {0} +}; + +#undef off +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage5_t)0)->x, sizeof(((pManufacturingPage5_t)0)->x) + +ITEM manufacturing_page_5_items_25[] = +{ + {"Base_WWID_Low", data(BaseWWID.Low), 0}, + {"Base_WWID_Hi", data(BaseWWID.High), 0}, + {"MANUFACT_5_FLAGS", data(Flags), 0}, + {0} +}; + +#define manufacturing_page_5_size_25 (int)(size_t)&((pManufacturingPage5_t)0)->Reserved3 + +ITEM manufacturing_page_5_items[] = +{ + {"Base_WWID_Low", data(BaseWWID.Low), 0}, + {"Base_WWID_Hi", data(BaseWWID.High), 0}, + {"MANUFACT_5_FLAGS", data(Flags), 0}, + {"MAN_5_NUM_FORCE_WWID", data(NumForceWWID), 0}, + {"MAN_5_RESERVED", data(Reserved2), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"FORCE_WWID_0_LOW", data(ForceWWID[0].Low), 0}, + {"FORCE_WWID_0_HI", data(ForceWWID[0].High), 0}, + {"FORCE_WWID_1_LOW", data(ForceWWID[1].Low), 0}, + {"FORCE_WWID_1_HI", data(ForceWWID[1].High), 0}, + {"FORCE_WWID_2_LOW", data(ForceWWID[2].Low), 0}, + {"FORCE_WWID_2_HI", data(ForceWWID[2].High), 0}, + {"FORCE_WWID_3_LOW", data(ForceWWID[3].Low), 0}, + {"FORCE_WWID_3_HI", data(ForceWWID[3].High), 0}, + {"FORCE_WWID_4_LOW", data(ForceWWID[4].Low), 0}, + {"FORCE_WWID_4_HI", data(ForceWWID[4].High), 0}, + {"FORCE_WWID_5_LOW", data(ForceWWID[5].Low), 0}, + {"FORCE_WWID_5_HI", data(ForceWWID[5].High), 0}, + {"FORCE_WWID_6_LOW", data(ForceWWID[6].Low), 0}, + {"FORCE_WWID_6_HI", data(ForceWWID[6].High), 0}, + {"FORCE_WWID_7_LOW", data(ForceWWID[7].Low), 0}, + {"FORCE_WWID_7_HI", data(ForceWWID[7].High), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2ManufacturingPage5_t)0)->x, sizeof(((pMpi2ManufacturingPage5_t)0)->x) + +ITEM manufacturing_page_5_items2[] = +{ + {"NUM_PHYS", data(NumPhys), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"PHY0_WWID_LOW", data(Phy[0].WWID.Low), 0}, + {"PHY0_WWID_HI", data(Phy[0].WWID.High), 0}, + {"PHY0_DEVICENAME_LOW", data(Phy[0].DeviceName.Low), 0}, + {"PHY0_DEVICENAME_HI", data(Phy[0].DeviceName.High), 0}, + {"PHY1_WWID_LOW", data(Phy[1].WWID.Low), 0}, + {"PHY1_WWID_HI", data(Phy[1].WWID.High), 0}, + {"PHY1_DEVICENAME_LOW", data(Phy[1].DeviceName.Low), 0}, + {"PHY1_DEVICENAME_HI", data(Phy[1].DeviceName.High), 0}, + {"PHY2_WWID_LOW", data(Phy[2].WWID.Low), 0}, + {"PHY2_WWID_HI", data(Phy[2].WWID.High), 0}, + {"PHY2_DEVICENAME_LOW", data(Phy[2].DeviceName.Low), 0}, + {"PHY2_DEVICENAME_HI", data(Phy[2].DeviceName.High), 0}, + {"PHY3_WWID_LOW", data(Phy[3].WWID.Low), 0}, + {"PHY3_WWID_HI", data(Phy[3].WWID.High), 0}, + {"PHY3_DEVICENAME_LOW", data(Phy[3].DeviceName.Low), 0}, + {"PHY3_DEVICENAME_HI", data(Phy[3].DeviceName.High), 0}, + {"PHY4_WWID_LOW", data(Phy[4].WWID.Low), 0}, + {"PHY4_WWID_HI", data(Phy[4].WWID.High), 0}, + {"PHY4_DEVICENAME_LOW", data(Phy[4].DeviceName.Low), 0}, + {"PHY4_DEVICENAME_HI", data(Phy[4].DeviceName.High), 0}, + {"PHY5_WWID_LOW", data(Phy[5].WWID.Low), 0}, + {"PHY5_WWID_HI", data(Phy[5].WWID.High), 0}, + {"PHY5_DEVICENAME_LOW", data(Phy[5].DeviceName.Low), 0}, + {"PHY5_DEVICENAME_HI", data(Phy[5].DeviceName.High), 0}, + {"PHY6_WWID_LOW", data(Phy[6].WWID.Low), 0}, + {"PHY6_WWID_HI", data(Phy[6].WWID.High), 0}, + {"PHY6_DEVICENAME_LOW", data(Phy[6].DeviceName.Low), 0}, + {"PHY6_DEVICENAME_HI", data(Phy[6].DeviceName.High), 0}, + {"PHY7_WWID_LOW", data(Phy[7].WWID.Low), 0}, + {"PHY7_WWID_HI", data(Phy[7].WWID.High), 0}, + {"PHY7_DEVICENAME_LOW", data(Phy[7].DeviceName.Low), 0}, + {"PHY7_DEVICENAME_HI", data(Phy[7].DeviceName.High), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage6_SAS2_t)0)->x, sizeof(((pManufacturingPage6_SAS2_t)0)->x) + +ITEM manufacturing_page_6_items2[] = +{ + {"NUM_GPIO", data(NumGPIO), 0}, + {"RESERVED1_0", data(Reserved1[0]), OPT}, + {"RESERVED1_1", data(Reserved1[1]), OPT}, + {"RESERVED1_2", data(Reserved1[2]), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"GPIO_0_FUNC_CODE", data(GPIODefinition[0].FunctionCode), 0}, + {"GPIO_0_FLAGS", data(GPIODefinition[0].Flags), 0}, + {"GPIO_0_PARAM1", data(GPIODefinition[0].Param1), 0}, + {"GPIO_0_PARAM2", data(GPIODefinition[0].Param2), 0}, + {"GPIO_0_PARAM3", data(GPIODefinition[0].Param3), 0}, + {"GPIO_1_FUNC_CODE", data(GPIODefinition[1].FunctionCode), 0}, + {"GPIO_1_FLAGS", data(GPIODefinition[1].Flags), 0}, + {"GPIO_1_PARAM1", data(GPIODefinition[1].Param1), 0}, + {"GPIO_1_PARAM2", data(GPIODefinition[1].Param2), 0}, + {"GPIO_1_PARAM3", data(GPIODefinition[1].Param3), 0}, + {"GPIO_2_FUNC_CODE", data(GPIODefinition[2].FunctionCode), 0}, + {"GPIO_2_FLAGS", data(GPIODefinition[2].Flags), 0}, + {"GPIO_2_PARAM1", data(GPIODefinition[2].Param1), 0}, + {"GPIO_2_PARAM2", data(GPIODefinition[2].Param2), 0}, + {"GPIO_2_PARAM3", data(GPIODefinition[2].Param3), 0}, + {"GPIO_3_FUNC_CODE", data(GPIODefinition[3].FunctionCode), 0}, + {"GPIO_3_FLAGS", data(GPIODefinition[3].Flags), 0}, + {"GPIO_3_PARAM1", data(GPIODefinition[3].Param1), 0}, + {"GPIO_3_PARAM2", data(GPIODefinition[3].Param2), 0}, + {"GPIO_3_PARAM3", data(GPIODefinition[3].Param3), 0}, + {"GPIO_4_FUNC_CODE", data(GPIODefinition[4].FunctionCode), 0}, + {"GPIO_4_FLAGS", data(GPIODefinition[4].Flags), 0}, + {"GPIO_4_PARAM1", data(GPIODefinition[4].Param1), 0}, + {"GPIO_4_PARAM2", data(GPIODefinition[4].Param2), 0}, + {"GPIO_4_PARAM3", data(GPIODefinition[4].Param3), 0}, + {"GPIO_5_FUNC_CODE", data(GPIODefinition[5].FunctionCode), 0}, + {"GPIO_5_FLAGS", data(GPIODefinition[5].Flags), 0}, + {"GPIO_5_PARAM1", data(GPIODefinition[5].Param1), 0}, + {"GPIO_5_PARAM2", data(GPIODefinition[5].Param2), 0}, + {"GPIO_5_PARAM3", data(GPIODefinition[5].Param3), 0}, + {"GPIO_6_FUNC_CODE", data(GPIODefinition[6].FunctionCode), 0}, + {"GPIO_6_FLAGS", data(GPIODefinition[6].Flags), 0}, + {"GPIO_6_PARAM1", data(GPIODefinition[6].Param1), 0}, + {"GPIO_6_PARAM2", data(GPIODefinition[6].Param2), 0}, + {"GPIO_6_PARAM3", data(GPIODefinition[6].Param3), 0}, + {"GPIO_7_FUNC_CODE", data(GPIODefinition[7].FunctionCode), 0}, + {"GPIO_7_FLAGS", data(GPIODefinition[7].Flags), 0}, + {"GPIO_7_PARAM1", data(GPIODefinition[7].Param1), 0}, + {"GPIO_7_PARAM2", data(GPIODefinition[7].Param2), 0}, + {"GPIO_7_PARAM3", data(GPIODefinition[7].Param3), 0}, + {"GPIO_8_FUNC_CODE", data(GPIODefinition[8].FunctionCode), 0}, + {"GPIO_8_FLAGS", data(GPIODefinition[8].Flags), 0}, + {"GPIO_8_PARAM1", data(GPIODefinition[8].Param1), 0}, + {"GPIO_8_PARAM2", data(GPIODefinition[8].Param2), 0}, + {"GPIO_8_PARAM3", data(GPIODefinition[8].Param3), 0}, + {"GPIO_9_FUNC_CODE", data(GPIODefinition[9].FunctionCode), 0}, + {"GPIO_9_FLAGS", data(GPIODefinition[9].Flags), 0}, + {"GPIO_9_PARAM1", data(GPIODefinition[9].Param1), 0}, + {"GPIO_9_PARAM2", data(GPIODefinition[9].Param2), 0}, + {"GPIO_9_PARAM3", data(GPIODefinition[9].Param3), 0}, + {"GPIO_10_FUNC_CODE", data(GPIODefinition[10].FunctionCode), 0}, + {"GPIO_10_FLAGS", data(GPIODefinition[10].Flags), 0}, + {"GPIO_10_PARAM1", data(GPIODefinition[10].Param1), 0}, + {"GPIO_10_PARAM2", data(GPIODefinition[10].Param2), 0}, + {"GPIO_10_PARAM3", data(GPIODefinition[10].Param3), 0}, + {"GPIO_11_FUNC_CODE", data(GPIODefinition[11].FunctionCode), 0}, + {"GPIO_11_FLAGS", data(GPIODefinition[11].Flags), 0}, + {"GPIO_11_PARAM1", data(GPIODefinition[11].Param1), 0}, + {"GPIO_11_PARAM2", data(GPIODefinition[11].Param2), 0}, + {"GPIO_11_PARAM3", data(GPIODefinition[11].Param3), 0}, + {"GPIO_12_FUNC_CODE", data(GPIODefinition[12].FunctionCode), 0}, + {"GPIO_12_FLAGS", data(GPIODefinition[12].Flags), 0}, + {"GPIO_12_PARAM1", data(GPIODefinition[12].Param1), 0}, + {"GPIO_12_PARAM2", data(GPIODefinition[12].Param2), 0}, + {"GPIO_12_PARAM3", data(GPIODefinition[12].Param3), 0}, + {"GPIO_13_FUNC_CODE", data(GPIODefinition[13].FunctionCode), 0}, + {"GPIO_13_FLAGS", data(GPIODefinition[13].Flags), 0}, + {"GPIO_13_PARAM1", data(GPIODefinition[13].Param1), 0}, + {"GPIO_13_PARAM2", data(GPIODefinition[13].Param2), 0}, + {"GPIO_13_PARAM3", data(GPIODefinition[13].Param3), 0}, + {"GPIO_14_FUNC_CODE", data(GPIODefinition[14].FunctionCode), 0}, + {"GPIO_14_FLAGS", data(GPIODefinition[14].Flags), 0}, + {"GPIO_14_PARAM1", data(GPIODefinition[14].Param1), 0}, + {"GPIO_14_PARAM2", data(GPIODefinition[14].Param2), 0}, + {"GPIO_14_PARAM3", data(GPIODefinition[14].Param3), 0}, + {"GPIO_15_FUNC_CODE", data(GPIODefinition[15].FunctionCode), 0}, + {"GPIO_15_FLAGS", data(GPIODefinition[15].Flags), 0}, + {"GPIO_15_PARAM1", data(GPIODefinition[15].Param1), 0}, + {"GPIO_15_PARAM2", data(GPIODefinition[15].Param2), 0}, + {"GPIO_15_PARAM3", data(GPIODefinition[15].Param3), 0}, + {"GPIO_16_FUNC_CODE", data(GPIODefinition[16].FunctionCode), 0}, + {"GPIO_16_FLAGS", data(GPIODefinition[16].Flags), 0}, + {"GPIO_16_PARAM1", data(GPIODefinition[16].Param1), 0}, + {"GPIO_16_PARAM2", data(GPIODefinition[16].Param2), 0}, + {"GPIO_16_PARAM3", data(GPIODefinition[16].Param3), 0}, + {"GPIO_17_FUNC_CODE", data(GPIODefinition[17].FunctionCode), 0}, + {"GPIO_17_FLAGS", data(GPIODefinition[17].Flags), 0}, + {"GPIO_17_PARAM1", data(GPIODefinition[17].Param1), 0}, + {"GPIO_17_PARAM2", data(GPIODefinition[17].Param2), 0}, + {"GPIO_17_PARAM3", data(GPIODefinition[17].Param3), 0}, + {"GPIO_18_FUNC_CODE", data(GPIODefinition[18].FunctionCode), 0}, + {"GPIO_18_FLAGS", data(GPIODefinition[18].Flags), 0}, + {"GPIO_18_PARAM1", data(GPIODefinition[18].Param1), 0}, + {"GPIO_18_PARAM2", data(GPIODefinition[18].Param2), 0}, + {"GPIO_18_PARAM3", data(GPIODefinition[18].Param3), 0}, + {"GPIO_19_FUNC_CODE", data(GPIODefinition[19].FunctionCode), 0}, + {"GPIO_19_FLAGS", data(GPIODefinition[19].Flags), 0}, + {"GPIO_19_PARAM1", data(GPIODefinition[19].Param1), 0}, + {"GPIO_19_PARAM2", data(GPIODefinition[19].Param2), 0}, + {"GPIO_19_PARAM3", data(GPIODefinition[19].Param3), 0}, + {"GPIO_20_FUNC_CODE", data(GPIODefinition[20].FunctionCode), 0}, + {"GPIO_20_FLAGS", data(GPIODefinition[20].Flags), 0}, + {"GPIO_20_PARAM1", data(GPIODefinition[20].Param1), 0}, + {"GPIO_20_PARAM2", data(GPIODefinition[20].Param2), 0}, + {"GPIO_20_PARAM3", data(GPIODefinition[20].Param3), 0}, + {"GPIO_21_FUNC_CODE", data(GPIODefinition[21].FunctionCode), 0}, + {"GPIO_21_FLAGS", data(GPIODefinition[21].Flags), 0}, + {"GPIO_21_PARAM1", data(GPIODefinition[21].Param1), 0}, + {"GPIO_21_PARAM2", data(GPIODefinition[21].Param2), 0}, + {"GPIO_21_PARAM3", data(GPIODefinition[21].Param3), 0}, + {"GPIO_22_FUNC_CODE", data(GPIODefinition[22].FunctionCode), 0}, + {"GPIO_22_FLAGS", data(GPIODefinition[22].Flags), 0}, + {"GPIO_22_PARAM1", data(GPIODefinition[22].Param1), 0}, + {"GPIO_22_PARAM2", data(GPIODefinition[22].Param2), 0}, + {"GPIO_22_PARAM3", data(GPIODefinition[22].Param3), 0}, + {"GPIO_23_FUNC_CODE", data(GPIODefinition[23].FunctionCode), 0}, + {"GPIO_23_FLAGS", data(GPIODefinition[23].Flags), 0}, + {"GPIO_23_PARAM1", data(GPIODefinition[23].Param1), 0}, + {"GPIO_23_PARAM2", data(GPIODefinition[23].Param2), 0}, + {"GPIO_23_PARAM3", data(GPIODefinition[23].Param3), 0}, + {"GPIO_24_FUNC_CODE", data(GPIODefinition[24].FunctionCode), 0}, + {"GPIO_24_FLAGS", data(GPIODefinition[24].Flags), 0}, + {"GPIO_24_PARAM1", data(GPIODefinition[24].Param1), 0}, + {"GPIO_24_PARAM2", data(GPIODefinition[24].Param2), 0}, + {"GPIO_24_PARAM3", data(GPIODefinition[24].Param3), 0}, + {"GPIO_25_FUNC_CODE", data(GPIODefinition[25].FunctionCode), 0}, + {"GPIO_25_FLAGS", data(GPIODefinition[25].Flags), 0}, + {"GPIO_25_PARAM1", data(GPIODefinition[25].Param1), 0}, + {"GPIO_25_PARAM2", data(GPIODefinition[25].Param2), 0}, + {"GPIO_25_PARAM3", data(GPIODefinition[25].Param3), 0}, + {"GPIO_26_FUNC_CODE", data(GPIODefinition[26].FunctionCode), 0}, + {"GPIO_26_FLAGS", data(GPIODefinition[26].Flags), 0}, + {"GPIO_26_PARAM1", data(GPIODefinition[26].Param1), 0}, + {"GPIO_26_PARAM2", data(GPIODefinition[26].Param2), 0}, + {"GPIO_26_PARAM3", data(GPIODefinition[26].Param3), 0}, + {"GPIO_27_FUNC_CODE", data(GPIODefinition[27].FunctionCode), 0}, + {"GPIO_27_FLAGS", data(GPIODefinition[27].Flags), 0}, + {"GPIO_27_PARAM1", data(GPIODefinition[27].Param1), 0}, + {"GPIO_27_PARAM2", data(GPIODefinition[27].Param2), 0}, + {"GPIO_27_PARAM3", data(GPIODefinition[27].Param3), 0}, + {"GPIO_28_FUNC_CODE", data(GPIODefinition[28].FunctionCode), 0}, + {"GPIO_28_FLAGS", data(GPIODefinition[28].Flags), 0}, + {"GPIO_28_PARAM1", data(GPIODefinition[28].Param1), 0}, + {"GPIO_28_PARAM2", data(GPIODefinition[28].Param2), 0}, + {"GPIO_28_PARAM3", data(GPIODefinition[28].Param3), 0}, + {"GPIO_29_FUNC_CODE", data(GPIODefinition[29].FunctionCode), 0}, + {"GPIO_29_FLAGS", data(GPIODefinition[29].Flags), 0}, + {"GPIO_29_PARAM1", data(GPIODefinition[29].Param1), 0}, + {"GPIO_29_PARAM2", data(GPIODefinition[29].Param2), 0}, + {"GPIO_29_PARAM3", data(GPIODefinition[29].Param3), 0}, + {"GPIO_30_FUNC_CODE", data(GPIODefinition[30].FunctionCode), 0}, + {"GPIO_30_FLAGS", data(GPIODefinition[30].Flags), 0}, + {"GPIO_30_PARAM1", data(GPIODefinition[30].Param1), 0}, + {"GPIO_30_PARAM2", data(GPIODefinition[30].Param2), 0}, + {"GPIO_30_PARAM3", data(GPIODefinition[30].Param3), 0}, + {"GPIO_31_FUNC_CODE", data(GPIODefinition[31].FunctionCode), 0}, + {"GPIO_31_FLAGS", data(GPIODefinition[31].Flags), 0}, + {"GPIO_31_PARAM1", data(GPIODefinition[31].Param1), 0}, + {"GPIO_31_PARAM2", data(GPIODefinition[31].Param2), 0}, + {"GPIO_31_PARAM3", data(GPIODefinition[31].Param3), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage7_t)0)->x, sizeof(((pManufacturingPage7_t)0)->x) + +ITEM manufacturing_page_7_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"MP7_FLAGS", data(Flags), 0}, + {"ENCLOSURE_NAME", data(EnclosureName), STR}, + {"NUM_PHYS", data(NumPhys), 0}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"CONN_INFO_0_PINOUT", data(ConnectorInfo[0].Pinout), 0}, + {"CONN_INFO_0_CONNECTOR", data(ConnectorInfo[0].Connector), STR}, + {"CONN_INFO_0_LOCATION", data(ConnectorInfo[0].Location), 0}, + {"CONN_INFO_0_RESERVED1", data(ConnectorInfo[0].Reserved1), OPT}, + {"CONN_INFO_0_SLOT", data(ConnectorInfo[0].Slot), 0}, + {"CONN_INFO_0_RESERVED2", data(ConnectorInfo[0].Reserved2), OPT}, + {"CONN_INFO_1_PINOUT", data(ConnectorInfo[1].Pinout), 0}, + {"CONN_INFO_1_CONNECTOR", data(ConnectorInfo[1].Connector), STR}, + {"CONN_INFO_1_LOCATION", data(ConnectorInfo[1].Location), 0}, + {"CONN_INFO_1_RESERVED1", data(ConnectorInfo[1].Reserved1), OPT}, + {"CONN_INFO_1_SLOT", data(ConnectorInfo[1].Slot), 0}, + {"CONN_INFO_1_RESERVED2", data(ConnectorInfo[1].Reserved2), OPT}, + {"CONN_INFO_2_PINOUT", data(ConnectorInfo[2].Pinout), 0}, + {"CONN_INFO_2_CONNECTOR", data(ConnectorInfo[2].Connector), STR}, + {"CONN_INFO_2_LOCATION", data(ConnectorInfo[2].Location), 0}, + {"CONN_INFO_2_RESERVED1", data(ConnectorInfo[2].Reserved1), OPT}, + {"CONN_INFO_2_SLOT", data(ConnectorInfo[2].Slot), 0}, + {"CONN_INFO_2_RESERVED2", data(ConnectorInfo[2].Reserved2), OPT}, + {"CONN_INFO_3_PINOUT", data(ConnectorInfo[3].Pinout), 0}, + {"CONN_INFO_3_CONNECTOR", data(ConnectorInfo[3].Connector), STR}, + {"CONN_INFO_3_LOCATION", data(ConnectorInfo[3].Location), 0}, + {"CONN_INFO_3_RESERVED1", data(ConnectorInfo[3].Reserved1), OPT}, + {"CONN_INFO_3_SLOT", data(ConnectorInfo[3].Slot), 0}, + {"CONN_INFO_3_RESERVED2", data(ConnectorInfo[3].Reserved2), OPT}, + {"CONN_INFO_4_PINOUT", data(ConnectorInfo[4].Pinout), 0}, + {"CONN_INFO_4_CONNECTOR", data(ConnectorInfo[4].Connector), STR}, + {"CONN_INFO_4_LOCATION", data(ConnectorInfo[4].Location), 0}, + {"CONN_INFO_4_RESERVED1", data(ConnectorInfo[4].Reserved1), OPT}, + {"CONN_INFO_4_SLOT", data(ConnectorInfo[4].Slot), 0}, + {"CONN_INFO_4_RESERVED2", data(ConnectorInfo[4].Reserved2), OPT}, + {"CONN_INFO_5_PINOUT", data(ConnectorInfo[5].Pinout), 0}, + {"CONN_INFO_5_CONNECTOR", data(ConnectorInfo[5].Connector), STR}, + {"CONN_INFO_5_LOCATION", data(ConnectorInfo[5].Location), 0}, + {"CONN_INFO_5_RESERVED1", data(ConnectorInfo[5].Reserved1), OPT}, + {"CONN_INFO_5_SLOT", data(ConnectorInfo[5].Slot), 0}, + {"CONN_INFO_5_RESERVED2", data(ConnectorInfo[5].Reserved2), OPT}, + {"CONN_INFO_6_PINOUT", data(ConnectorInfo[6].Pinout), 0}, + {"CONN_INFO_6_CONNECTOR", data(ConnectorInfo[6].Connector), STR}, + {"CONN_INFO_6_LOCATION", data(ConnectorInfo[6].Location), 0}, + {"CONN_INFO_6_RESERVED1", data(ConnectorInfo[6].Reserved1), OPT}, + {"CONN_INFO_6_SLOT", data(ConnectorInfo[6].Slot), 0}, + {"CONN_INFO_6_RESERVED2", data(ConnectorInfo[6].Reserved2), OPT}, + {"CONN_INFO_7_PINOUT", data(ConnectorInfo[7].Pinout), 0}, + {"CONN_INFO_7_CONNECTOR", data(ConnectorInfo[7].Connector), STR}, + {"CONN_INFO_7_LOCATION", data(ConnectorInfo[7].Location), 0}, + {"CONN_INFO_7_RESERVED1", data(ConnectorInfo[7].Reserved1), OPT}, + {"CONN_INFO_7_SLOT", data(ConnectorInfo[7].Slot), 0}, + {"CONN_INFO_7_RESERVED2", data(ConnectorInfo[7].Reserved2), OPT}, + {"CONN_INFO_8_PINOUT", data(ConnectorInfo[8].Pinout), OPT}, + {"CONN_INFO_8_CONNECTOR", data(ConnectorInfo[8].Connector), STR | OPT}, + {"CONN_INFO_8_LOCATION", data(ConnectorInfo[8].Location), OPT}, + {"CONN_INFO_8_RESERVED1", data(ConnectorInfo[8].Reserved1), OPT}, + {"CONN_INFO_8_SLOT", data(ConnectorInfo[8].Slot), OPT}, + {"CONN_INFO_8_RESERVED2", data(ConnectorInfo[8].Reserved2), OPT}, + {"CONN_INFO_9_PINOUT", data(ConnectorInfo[9].Pinout), OPT}, + {"CONN_INFO_9_CONNECTOR", data(ConnectorInfo[9].Connector), STR | OPT}, + {"CONN_INFO_9_LOCATION", data(ConnectorInfo[9].Location), OPT}, + {"CONN_INFO_9_RESERVED1", data(ConnectorInfo[9].Reserved1), OPT}, + {"CONN_INFO_9_SLOT", data(ConnectorInfo[9].Slot), OPT}, + {"CONN_INFO_9_RESERVED2", data(ConnectorInfo[9].Reserved2), OPT}, + {"CONN_INFO_10_PINOUT", data(ConnectorInfo[10].Pinout), OPT}, + {"CONN_INFO_10_CONNECTOR", data(ConnectorInfo[10].Connector), STR | OPT}, + {"CONN_INFO_10_LOCATION", data(ConnectorInfo[10].Location), OPT}, + {"CONN_INFO_10_RESERVED1", data(ConnectorInfo[10].Reserved1), OPT}, + {"CONN_INFO_10_SLOT", data(ConnectorInfo[10].Slot), OPT}, + {"CONN_INFO_10_RESERVED2", data(ConnectorInfo[10].Reserved2), OPT}, + {"CONN_INFO_11_PINOUT", data(ConnectorInfo[11].Pinout), OPT}, + {"CONN_INFO_11_CONNECTOR", data(ConnectorInfo[11].Connector), STR | OPT}, + {"CONN_INFO_11_LOCATION", data(ConnectorInfo[11].Location), OPT}, + {"CONN_INFO_11_RESERVED1", data(ConnectorInfo[11].Reserved1), OPT}, + {"CONN_INFO_11_SLOT", data(ConnectorInfo[11].Slot), OPT}, + {"CONN_INFO_11_RESERVED2", data(ConnectorInfo[11].Reserved2), OPT}, + {"CONN_INFO_12_PINOUT", data(ConnectorInfo[12].Pinout), OPT}, + {"CONN_INFO_12_CONNECTOR", data(ConnectorInfo[12].Connector), STR | OPT}, + {"CONN_INFO_12_LOCATION", data(ConnectorInfo[12].Location), OPT}, + {"CONN_INFO_12_RESERVED1", data(ConnectorInfo[12].Reserved1), OPT}, + {"CONN_INFO_12_SLOT", data(ConnectorInfo[12].Slot), OPT}, + {"CONN_INFO_12_RESERVED2", data(ConnectorInfo[12].Reserved2), OPT}, + {"CONN_INFO_13_PINOUT", data(ConnectorInfo[13].Pinout), OPT}, + {"CONN_INFO_13_CONNECTOR", data(ConnectorInfo[13].Connector), STR | OPT}, + {"CONN_INFO_13_LOCATION", data(ConnectorInfo[13].Location), OPT}, + {"CONN_INFO_13_RESERVED1", data(ConnectorInfo[13].Reserved1), OPT}, + {"CONN_INFO_13_SLOT", data(ConnectorInfo[13].Slot), OPT}, + {"CONN_INFO_13_RESERVED2", data(ConnectorInfo[13].Reserved2), OPT}, + {"CONN_INFO_14_PINOUT", data(ConnectorInfo[14].Pinout), OPT}, + {"CONN_INFO_14_CONNECTOR", data(ConnectorInfo[14].Connector), STR | OPT}, + {"CONN_INFO_14_LOCATION", data(ConnectorInfo[14].Location), OPT}, + {"CONN_INFO_14_RESERVED1", data(ConnectorInfo[14].Reserved1), OPT}, + {"CONN_INFO_14_SLOT", data(ConnectorInfo[14].Slot), OPT}, + {"CONN_INFO_14_RESERVED2", data(ConnectorInfo[14].Reserved2), OPT}, + {"CONN_INFO_15_PINOUT", data(ConnectorInfo[15].Pinout), OPT}, + {"CONN_INFO_15_CONNECTOR", data(ConnectorInfo[15].Connector), STR | OPT}, + {"CONN_INFO_15_LOCATION", data(ConnectorInfo[15].Location), OPT}, + {"CONN_INFO_15_RESERVED1", data(ConnectorInfo[15].Reserved1), OPT}, + {"CONN_INFO_15_SLOT", data(ConnectorInfo[15].Slot), OPT}, + {"CONN_INFO_15_RESERVED2", data(ConnectorInfo[15].Reserved2), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage8_t)0)->x, sizeof(((pManufacturingPage8_t)0)->x) + +ITEM manufacturing_page_8_items2[] = +{ + {"PRODSPECIFICINFO", data(ProductSpecificInfo), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage9_SAS2_t)0)->x, sizeof(((pManufacturingPage9_SAS2_t)0)->x) + +ITEM manufacturing_page_9_items2[] = +{ + {"MAX_ATTEMPTS", data(MaxAttempts), 0}, + {"NUM_RESOURCES", data(NumResources), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"NUM_VFS_MAX", data(ResourceArray[0].Maximum), 0}, + {"NUM_VFS_DEC", data(ResourceArray[0].Decrement), 0}, + {"NUM_VFS_MIN", data(ResourceArray[0].Minimum), 0}, + {"NUM_VFS_ACT", data(ResourceArray[0].Actual), 0}, + {"NUM_VPS_MAX", data(ResourceArray[1].Maximum), 0}, + {"NUM_VPS_DEC", data(ResourceArray[1].Decrement), 0}, + {"NUM_VPS_MIN", data(ResourceArray[1].Minimum), 0}, + {"NUM_VPS_ACT", data(ResourceArray[1].Actual), 0}, + {"HOST_CRED_PER_VF_MAX", data(ResourceArray[2].Maximum), 0}, + {"HOST_CRED_PER_VF_DEC", data(ResourceArray[2].Decrement), 0}, + {"HOST_CRED_PER_VF_MIN", data(ResourceArray[2].Minimum), 0}, + {"HOST_CRED_PER_VF_ACT", data(ResourceArray[2].Actual), 0}, + {"HIPRI_QDEPTH_PER_VF_MAX", data(ResourceArray[3].Maximum), 0}, + {"HIPRI_QDEPTH_PER_VF_DEC", data(ResourceArray[3].Decrement), 0}, + {"HIPRI_QDEPTH_PER_VF_MIN", data(ResourceArray[3].Minimum), 0}, + {"HIPRI_QDEPTH_PER_VF_ACT", data(ResourceArray[3].Actual), 0}, + {"TARGETS_MAX", data(ResourceArray[4].Maximum), 0}, + {"TARGETS_DEC", data(ResourceArray[4].Decrement), 0}, + {"TARGETS_MIN", data(ResourceArray[4].Minimum), 0}, + {"TARGETS_ACT", data(ResourceArray[4].Actual), 0}, + {"INITIATORS_MAX", data(ResourceArray[5].Maximum), 0}, + {"INITIATORS_DEC", data(ResourceArray[5].Decrement), 0}, + {"INITIATORS_MIN", data(ResourceArray[5].Minimum), 0}, + {"INITIATORS_ACT", data(ResourceArray[5].Actual), 0}, + {"TGT_CMD_BUFS_PER_VP_MAX", data(ResourceArray[6].Maximum), 0}, + {"TGT_CMD_BUFS_PER_VP_DEC", data(ResourceArray[6].Decrement), 0}, + {"TGT_CMD_BUFS_PER_VP_MIN", data(ResourceArray[6].Minimum), 0}, + {"TGT_CMD_BUFS_PER_VP_ACT", data(ResourceArray[6].Actual), 0}, + {"EXPANDERS_MAX", data(ResourceArray[7].Maximum), 0}, + {"EXPANDERS_DEC", data(ResourceArray[7].Decrement), 0}, + {"EXPANDERS_MIN", data(ResourceArray[7].Minimum), 0}, + {"EXPANDERS_ACT", data(ResourceArray[7].Actual), 0}, + {"PHYS_MAX", data(ResourceArray[8].Maximum), 0}, + {"PHYS_DEC", data(ResourceArray[8].Decrement), 0}, + {"PHYS_MIN", data(ResourceArray[8].Minimum), 0}, + {"PHYS_ACT", data(ResourceArray[8].Actual), 0}, + {"ENCLOSURES_MAX", data(ResourceArray[9].Maximum), 0}, + {"ENCLOSURES_DEC", data(ResourceArray[9].Decrement), 0}, + {"ENCLOSURES_MIN", data(ResourceArray[9].Minimum), 0}, + {"ENCLOSURES_ACT", data(ResourceArray[9].Actual), 0}, + {"RING_BUF_SIZE_MAX", data(ResourceArray[10].Maximum), 0}, + {"RING_BUF_SIZE_DEC", data(ResourceArray[10].Decrement), 0}, + {"RING_BUF_SIZE_MIN", data(ResourceArray[10].Minimum), 0}, + {"RING_BUF_SIZE_ACT", data(ResourceArray[10].Actual), 0}, + {"IR_BUFFER_SIZE_MAX", data(ResourceArray[11].Maximum), 0}, + {"IR_BUFFER_SIZE_DEC", data(ResourceArray[11].Decrement), 0}, + {"IR_BUFFER_SIZE_MIN", data(ResourceArray[11].Minimum), 0}, + {"IR_BUFFER_SIZE_ACT", data(ResourceArray[11].Actual), 0}, + {"NUM_ROUTE_TABLE_ENT_MAX", data(ResourceArray[12].Maximum), 0}, + {"NUM_ROUTE_TABLE_ENT_DEC", data(ResourceArray[12].Decrement), 0}, + {"NUM_ROUTE_TABLE_ENT_MIN", data(ResourceArray[12].Minimum), 0}, + {"NUM_ROUTE_TABLE_ENT_ACT", data(ResourceArray[12].Actual), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage10_t)0)->x, sizeof(((pManufacturingPage10_t)0)->x) + +ITEM manufacturing_page_10_items2[] = +{ + {"PRODSPECIFICINFO", data(ProductSpecificInfo), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage11_SAS2_t)0)->x, sizeof(((pManufacturingPage11_SAS2_t)0)->x) + +ITEM manufacturing_page_11_items2[] = +{ + {"FLASH_TIME", data(FlashTime), 0}, + {"NVS_TIME", data(NVTime), 0}, + {"FLAG", data(Flag), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"HOT_PLUG_TIM_OUT", data(HotPlugTimeout), 0}, + {"RESERVED_0", data(Reserved[0]), OPT}, + {"RESERVED_1", data(Reserved[1]), OPT}, + {"RESERVED_2", data(Reserved[2]), OPT}, + {"MAX_CMD_FRAMES_0", data(MaxCmdFrames[0]), 0}, + {"MAX_CMD_FRAMES_1", data(MaxCmdFrames[1]), 0}, + {"MAX_CMD_FRAMES_2", data(MaxCmdFrames[2]), 0}, + {"MAX_CMD_FRAMES_3", data(MaxCmdFrames[3]), 0}, + {"SYS_REF_CLK", data(SysRefClk), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"EXT_UART_CLK", data(ExtUartClk), 0}, + {"UART0_FLAGS", data(UartSettings[0].Flags), 0}, + {"UART0_MORE_FLAGS", data(UartSettings[0].MoreFlags), 0}, + {"UART0_TO", data(UartSettings[0].TO), 0}, + {"UART0_BAUD_RATE", data(UartSettings[0].BaudRate), 0}, + {"UART1_FLAGS", data(UartSettings[1].Flags), 0}, + {"UART1_MORE_FLAGS", data(UartSettings[1].MoreFlags), 0}, + {"UART1_TO", data(UartSettings[1].TO), 0}, + {"UART1_BAUD_RATE", data(UartSettings[1].BaudRate), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage12_SAS2_t)0)->x, sizeof(((pManufacturingPage12_SAS2_t)0)->x) + +ITEM manufacturing_page_12_items2[] = +{ + {"COMMON_FLAGS", data(Flags), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"SGPIO_CFG1", data(SGPIOCfg1), 0}, + {"NUM_SGPIO", data(NumSGPIO), 0}, + {"SGPIO_TYPE", data(SGPIOType), 0}, + {"CLK_DIVIDE", data(ClkDivide), 0}, + {"DEFAULT_TX_CTRL", data(DefaultTxCtrl), 0}, + {"SGPIO_PAT_DEF0", data(SGPIOPatDef0), 0}, + {"SGPIO_PAT_DEF1", data(SGPIOPatDef1), 0}, + {"SGPIO_PAT_DEF2", data(SGPIOPatDef2), 0}, + {"SGPIO_PAT_DEF3", data(SGPIOPatDef3), 0}, + {"SGPIO_0_FLAGS", data(SGPIOInfo[0].Flags), 0}, + {"SGPIO_0_BIT_ORDER_0", data(SGPIOInfo[0].BitOrderSelect[0]), 0}, + {"SGPIO_0_BIT_ORDER_1", data(SGPIOInfo[0].BitOrderSelect[1]), 0}, + {"SGPIO_0_BIT_ORDER_2", data(SGPIOInfo[0].BitOrderSelect[2]), 0}, + {"SGPIO_0_BIT_ORDER_3", data(SGPIOInfo[0].BitOrderSelect[3]), 0}, + {"SGPIO_0_BIT_ORDER_4", data(SGPIOInfo[0].BitOrderSelect[4]), 0}, + {"SGPIO_0_BIT_ORDER_5", data(SGPIOInfo[0].BitOrderSelect[5]), 0}, + {"SGPIO_0_BIT_ORDER_6", data(SGPIOInfo[0].BitOrderSelect[6]), 0}, + {"SGPIO_0_BIT_ORDER_7", data(SGPIOInfo[0].BitOrderSelect[7]), 0}, + {"SGPIO_0_BIT_ORDER_8", data(SGPIOInfo[0].BitOrderSelect[8]), 0}, + {"SGPIO_0_BIT_ORDER_9", data(SGPIOInfo[0].BitOrderSelect[9]), 0}, + {"SGPIO_0_BIT_ORDER_10", data(SGPIOInfo[0].BitOrderSelect[10]), 0}, + {"SGPIO_0_BIT_ORDER_11", data(SGPIOInfo[0].BitOrderSelect[11]), 0}, + {"SGPIO_1_FLAGS", data(SGPIOInfo[1].Flags), 0}, + {"SGPIO_1_BIT_ORDER_0", data(SGPIOInfo[1].BitOrderSelect[0]), 0}, + {"SGPIO_1_BIT_ORDER_1", data(SGPIOInfo[1].BitOrderSelect[1]), 0}, + {"SGPIO_1_BIT_ORDER_2", data(SGPIOInfo[1].BitOrderSelect[2]), 0}, + {"SGPIO_1_BIT_ORDER_3", data(SGPIOInfo[1].BitOrderSelect[3]), 0}, + {"SGPIO_1_BIT_ORDER_4", data(SGPIOInfo[1].BitOrderSelect[4]), 0}, + {"SGPIO_1_BIT_ORDER_5", data(SGPIOInfo[1].BitOrderSelect[5]), 0}, + {"SGPIO_1_BIT_ORDER_6", data(SGPIOInfo[1].BitOrderSelect[6]), 0}, + {"SGPIO_1_BIT_ORDER_7", data(SGPIOInfo[1].BitOrderSelect[7]), 0}, + {"SGPIO_1_BIT_ORDER_8", data(SGPIOInfo[1].BitOrderSelect[8]), 0}, + {"SGPIO_1_BIT_ORDER_9", data(SGPIOInfo[1].BitOrderSelect[9]), 0}, + {"SGPIO_1_BIT_ORDER_10", data(SGPIOInfo[1].BitOrderSelect[10]), 0}, + {"SGPIO_1_BIT_ORDER_11", data(SGPIOInfo[1].BitOrderSelect[11]), 0}, + {"SGPIO_2_FLAGS", data(SGPIOInfo[2].Flags), 0}, + {"SGPIO_2_BIT_ORDER_0", data(SGPIOInfo[2].BitOrderSelect[0]), 0}, + {"SGPIO_2_BIT_ORDER_1", data(SGPIOInfo[2].BitOrderSelect[1]), 0}, + {"SGPIO_2_BIT_ORDER_2", data(SGPIOInfo[2].BitOrderSelect[2]), 0}, + {"SGPIO_2_BIT_ORDER_3", data(SGPIOInfo[2].BitOrderSelect[3]), 0}, + {"SGPIO_2_BIT_ORDER_4", data(SGPIOInfo[2].BitOrderSelect[4]), 0}, + {"SGPIO_2_BIT_ORDER_5", data(SGPIOInfo[2].BitOrderSelect[5]), 0}, + {"SGPIO_2_BIT_ORDER_6", data(SGPIOInfo[2].BitOrderSelect[6]), 0}, + {"SGPIO_2_BIT_ORDER_7", data(SGPIOInfo[2].BitOrderSelect[7]), 0}, + {"SGPIO_2_BIT_ORDER_8", data(SGPIOInfo[2].BitOrderSelect[8]), 0}, + {"SGPIO_2_BIT_ORDER_9", data(SGPIOInfo[2].BitOrderSelect[9]), 0}, + {"SGPIO_2_BIT_ORDER_10", data(SGPIOInfo[2].BitOrderSelect[10]), 0}, + {"SGPIO_2_BIT_ORDER_11", data(SGPIOInfo[2].BitOrderSelect[11]), 0}, + {"SGPIO_3_FLAGS", data(SGPIOInfo[3].Flags), 0}, + {"SGPIO_3_BIT_ORDER_0", data(SGPIOInfo[3].BitOrderSelect[0]), 0}, + {"SGPIO_3_BIT_ORDER_1", data(SGPIOInfo[3].BitOrderSelect[1]), 0}, + {"SGPIO_3_BIT_ORDER_2", data(SGPIOInfo[3].BitOrderSelect[2]), 0}, + {"SGPIO_3_BIT_ORDER_3", data(SGPIOInfo[3].BitOrderSelect[3]), 0}, + {"SGPIO_3_BIT_ORDER_4", data(SGPIOInfo[3].BitOrderSelect[4]), 0}, + {"SGPIO_3_BIT_ORDER_5", data(SGPIOInfo[3].BitOrderSelect[5]), 0}, + {"SGPIO_3_BIT_ORDER_6", data(SGPIOInfo[3].BitOrderSelect[6]), 0}, + {"SGPIO_3_BIT_ORDER_7", data(SGPIOInfo[3].BitOrderSelect[7]), 0}, + {"SGPIO_3_BIT_ORDER_8", data(SGPIOInfo[3].BitOrderSelect[8]), 0}, + {"SGPIO_3_BIT_ORDER_9", data(SGPIOInfo[3].BitOrderSelect[9]), 0}, + {"SGPIO_3_BIT_ORDER_10", data(SGPIOInfo[3].BitOrderSelect[10]), 0}, + {"SGPIO_3_BIT_ORDER_11", data(SGPIOInfo[3].BitOrderSelect[11]), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pManufacturingPage13_SAS2_t)0)->x, sizeof(((pManufacturingPage13_SAS2_t)0)->x) + +ITEM manufacturing_page_13_items2[] = +{ + {"NUM_SGPIO_ENTRIES", data(NumSgpioEntries), 0}, + {"RESERVED0", data(Reserved0), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"SGPIO_0_MASK", data(SGPIOData[0].Mask), 0}, + {"SGPIO_0_SLOT_STATUS", data(SGPIOData[0].SlotStatus), 0}, + {"SGPIO_0_TX_CTRL_0", data(SGPIOData[0].TxControl[0]), 0}, + {"SGPIO_0_TX_CTRL_1", data(SGPIOData[0].TxControl[1]), 0}, + {"SGPIO_0_TX_CTRL_2", data(SGPIOData[0].TxControl[2]), 0}, + {"SGPIO_0_TX_CTRL_3", data(SGPIOData[0].TxControl[3]), 0}, + {"SGPIO_1_MASK", data(SGPIOData[0].Mask), 0}, + {"SGPIO_1_SLOT_STATUS", data(SGPIOData[1].SlotStatus), 0}, + {"SGPIO_1_TX_CTRL_0", data(SGPIOData[1].TxControl[0]), 0}, + {"SGPIO_1_TX_CTRL_1", data(SGPIOData[1].TxControl[1]), 0}, + {"SGPIO_1_TX_CTRL_2", data(SGPIOData[1].TxControl[2]), 0}, + {"SGPIO_1_TX_CTRL_3", data(SGPIOData[1].TxControl[3]), 0}, + {"SGPIO_2_MASK", data(SGPIOData[1].Mask), 0}, + {"SGPIO_2_SLOT_STATUS", data(SGPIOData[2].SlotStatus), 0}, + {"SGPIO_2_TX_CTRL_0", data(SGPIOData[2].TxControl[0]), 0}, + {"SGPIO_2_TX_CTRL_1", data(SGPIOData[2].TxControl[1]), 0}, + {"SGPIO_2_TX_CTRL_2", data(SGPIOData[2].TxControl[2]), 0}, + {"SGPIO_2_TX_CTRL_3", data(SGPIOData[2].TxControl[3]), 0}, + {"SGPIO_3_MASK", data(SGPIOData[3].Mask), 0}, + {"SGPIO_3_SLOT_STATUS", data(SGPIOData[3].SlotStatus), 0}, + {"SGPIO_3_TX_CTRL_0", data(SGPIOData[3].TxControl[0]), 0}, + {"SGPIO_3_TX_CTRL_1", data(SGPIOData[3].TxControl[1]), 0}, + {"SGPIO_3_TX_CTRL_2", data(SGPIOData[3].TxControl[2]), 0}, + {"SGPIO_3_TX_CTRL_3", data(SGPIOData[3].TxControl[3]), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOUnitPage0_t)0)->x, sizeof(((pIOUnitPage0_t)0)->x) + +ITEM io_unit_page_0_items[] = +{ + {"UNIQUE_VALUE", data(UniqueValue), DUP}, + {"UNIQUE_VALUE_LOW", data(UniqueValue.Low), 0}, + {"UNIQUE_VALUE_HI", data(UniqueValue.High), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOUnitPage1_t)0)->x, sizeof(((pIOUnitPage1_t)0)->x) + +ITEM io_unit_page_1_items[] = +{ + {"IO_UNIT_PAGE_1_FLAGS", data(Flags), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOUnitPage2_t)0)->x, sizeof(((pIOUnitPage2_t)0)->x) + +ITEM io_unit_page_2_items[] = +{ + {"IO_UNIT_PAGE_2_FLAGS", data(Flags), 0}, + {"BIOS_VERSION", data(BiosVersion), 0}, + {"PCI_BUS_NUMBER", data(AdapterOrder[0].PciBusNumber), DUP}, + {"PCI_BUS_NUMBER_0", data(AdapterOrder[0].PciBusNumber), 0}, + {"PCI_DEVICE_FUNCTION", data(AdapterOrder[0].PciDeviceAndFunctionNumber), DUP}, + {"PCI_DEVICE_FUNCTION_0", data(AdapterOrder[0].PciDeviceAndFunctionNumber), 0}, + {"ADAPTER_FLAGS", data(AdapterOrder[0].AdapterFlags), DUP}, + {"ADAPTER_FLAGS_0", data(AdapterOrder[0].AdapterFlags), 0}, + {"PCI_BUS_NUMBER_1", data(AdapterOrder[1].PciBusNumber), OPT}, + {"PCI_DEVICE_FUNCTION_1", data(AdapterOrder[1].PciDeviceAndFunctionNumber), OPT}, + {"ADAPTER_FLAGS_1", data(AdapterOrder[1].AdapterFlags), OPT}, + {"PCI_BUS_NUMBER_2", data(AdapterOrder[2].PciBusNumber), OPT}, + {"PCI_DEVICE_FUNCTION_2", data(AdapterOrder[2].PciDeviceAndFunctionNumber), OPT}, + {"ADAPTER_FLAGS_2", data(AdapterOrder[2].AdapterFlags), OPT}, + {"PCI_BUS_NUMBER_3", data(AdapterOrder[3].PciBusNumber), OPT}, + {"PCI_DEVICE_FUNCTION_3", data(AdapterOrder[3].PciDeviceAndFunctionNumber), OPT}, + {"ADAPTER_FLAGS_3", data(AdapterOrder[3].AdapterFlags), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOUnitPage3_t)0)->x, sizeof(((pIOUnitPage3_t)0)->x) + +#define io_unit_page_3_size_25 (int)(size_t)&((pIOUnitPage3_t)0)->GPIOVal[8] + +ITEM io_unit_page_3_items[] = +{ + {"GPIOCOUNT", data(GPIOCount), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"GPIOVAL_0", data(GPIOVal[0]), 0}, + {"GPIOVAL_1", data(GPIOVal[1]), 0}, + {"GPIOVAL_2", data(GPIOVal[2]), 0}, + {"GPIOVAL_3", data(GPIOVal[3]), 0}, + {"GPIOVAL_4", data(GPIOVal[4]), 0}, + {"GPIOVAL_5", data(GPIOVal[5]), 0}, + {"GPIOVAL_6", data(GPIOVal[6]), 0}, + {"GPIOVAL_7", data(GPIOVal[7]), 0}, + {"GPIOVAL_8", data(GPIOVal[8]), OPT}, + {"GPIOVAL_9", data(GPIOVal[9]), OPT}, + {"GPIOVAL_10", data(GPIOVal[10]), OPT}, + {"GPIOVAL_11", data(GPIOVal[11]), OPT}, + {"GPIOVAL_12", data(GPIOVal[12]), OPT}, + {"GPIOVAL_13", data(GPIOVal[13]), OPT}, + {"GPIOVAL_14", data(GPIOVal[14]), OPT}, + {"GPIOVAL_15", data(GPIOVal[15]), OPT}, + {"GPIOVAL_16", data(GPIOVal[16]), OPT}, + {"GPIOVAL_17", data(GPIOVal[17]), OPT}, + {"GPIOVAL_18", data(GPIOVal[18]), OPT}, + {"GPIOVAL_19", data(GPIOVal[19]), OPT}, + {"GPIOVAL_20", data(GPIOVal[20]), OPT}, + {"GPIOVAL_21", data(GPIOVal[21]), OPT}, + {"GPIOVAL_22", data(GPIOVal[22]), OPT}, + {"GPIOVAL_23", data(GPIOVal[23]), OPT}, + {"GPIOVAL_24", data(GPIOVal[24]), OPT}, + {"GPIOVAL_25", data(GPIOVal[25]), OPT}, + {"GPIOVAL_26", data(GPIOVal[26]), OPT}, + {"GPIOVAL_27", data(GPIOVal[27]), OPT}, + {"GPIOVAL_28", data(GPIOVal[28]), OPT}, + {"GPIOVAL_29", data(GPIOVal[29]), OPT}, + {"GPIOVAL_30", data(GPIOVal[30]), OPT}, + {"GPIOVAL_31", data(GPIOVal[31]), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOUnitPage4_t)0)->x, sizeof(((pIOUnitPage4_t)0)->x) + +ITEM io_unit_page_4_items[] = +{ + {"IOUNIT_4_RESERVED1", data(Reserved1), OPT}, + {"FWIMAGE_FLAGS", data(FWImageSGE.FlagsLength), 0}, + {"FWIMAGE_64HIGH", data(FWImageSGE.u.Address64.High), 0}, + {"FWIMAGE_64LOW", data(FWImageSGE.u.Address64.Low), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage0_t)0)->x, sizeof(((pIOCPage0_t)0)->x) + +ITEM ioc_page_0_items[] = +{ + {"TOTAL_NV_STORE", data(TotalNVStore), 0}, + {"FREE_NV_STORE", data(FreeNVStore), 0}, + {"VENDOR_ID", data(VendorID), 0}, + {"DEVICE_ID", data(DeviceID), 0}, + {"REVISION_ID", data(RevisionID), 0}, + {"RESERVED", data(Reserved), OPT}, + {"RESERVED_0", data(Reserved[0]), OPT}, + {"RESERVED_1", data(Reserved[1]), OPT}, + {"RESERVED_2", data(Reserved[2]), OPT}, + {"CLASS_CODE", data(ClassCode), 0}, + {"SS_VNDR_ID", data(SubsystemVendorID), 0}, + {"SS_ID", data(SubsystemID), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage1_t)0)->x, sizeof(((pIOCPage1_t)0)->x) + +ITEM ioc_page_1_items[] = +{ + {"IOC_PAGE_1_FLAGS", data(Flags), 0}, + {"COALESCING_TIMEOUT", data(CoalescingTimeout), 0}, + {"COALESCING_DEPTH", data(CoalescingDepth), 0}, + {"PCI_SLOT_NUM", data(PCISlotNum), 0}, + {"RESERVED", data(Reserved), OPT}, + {"RESERVED_0", data(Reserved[0]), OPT}, + {"RESERVED_1", data(Reserved[1]), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2IOCPage1_t)0)->x, sizeof(((pMpi2IOCPage1_t)0)->x) + +ITEM ioc_page_1_items2[] = +{ + {"IOC_PAGE_1_FLAGS", data(Flags), 0}, + {"COALESCING_TIMEOUT", data(CoalescingTimeout), 0}, + {"COALESCING_DEPTH", data(CoalescingDepth), 0}, + {"PCI_SLOT_NUM", data(PCISlotNum), 0}, + {"PCI_BUS_NUM", data(PCIBusNum), 0}, + {"PCI_DOMAIN_SEGMENT", data(PCIDomainSegment), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage2_t)0)->x, sizeof(((pIOCPage2_t)0)->x) + +ITEM ioc_page_2_items[] = +{ + {"CAP_FLAGS", data(CapabilitiesFlags), 0}, + {"NUM_ACTIVE_VOLS", data(NumActiveVolumes), 0}, + {"MAX_VOLS", data(MaxVolumes), 0}, + {"NUM_ACTIVE_PHYS_DSKS", data(NumActivePhysDisks), 0}, + {"MAX_PHYS_DSKS", data(MaxPhysDisks), 0}, + {"VOL_ID", data(RaidVolume[0].VolumeID), 0}, + {"VOL_BUS", data(RaidVolume[0].VolumeBus), 0}, + {"VOL_IOC", data(RaidVolume[0].VolumeIOC), 0}, + {"VOL_PAGE_NUM", data(RaidVolume[0].VolumePageNumber), 0}, + {"VOL_TYPE", data(RaidVolume[0].VolumeType), 0}, + {"FLAGS", data(RaidVolume[0].Flags), 0}, + {"RESERVED", data(RaidVolume[0].Reserved3), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage3_t)0)->x, sizeof(((pIOCPage3_t)0)->x) + +ITEM ioc_page_3_items[] = +{ + {"NUM_PHYS_DSKS", data(NumPhysDisks), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"PHYS_DSK_ID", data(PhysDisk[0].PhysDiskID), 0}, + {"PHYS_DSK_BUS", data(PhysDisk[0].PhysDiskBus), 0}, + {"PHYS_DSK_IOC", data(PhysDisk[0].PhysDiskIOC), 0}, + {"PHYS_DSE_NUM", data(PhysDisk[0].PhysDiskNum), DUP}, + {"PHYS_DSK_NUM", data(PhysDisk[0].PhysDiskNum), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage4_t)0)->x, sizeof(((pIOCPage4_t)0)->x) + +ITEM ioc_page_4_items[] = +{ + {"ACTIVE_SEP", data(ActiveSEP), 0}, + {"MAX_SEP", data(MaxSEP), 0}, + {"RESERVED", data(Reserved1), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {"SEP_TARGET_ID", data(SEP[0].SEPTargetID), 0}, + {"SEP_BUS", data(SEP[0].SEPBus), 0}, + {"RESERVED", data(SEP[0].Reserved), OPT}, + {"IOC_4_SEP_RESERVED", data(SEP[0].Reserved), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage5_t)0)->x, sizeof(((pIOCPage5_t)0)->x) + +ITEM ioc_page_5_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"NUM_HOT_SPARES", data(NumHotSpares), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"PHYS_DSK_NUM", data(HotSpare[0].PhysDiskNum), 0}, + {"RESERVED", data(HotSpare[0].Reserved), OPT}, + {"IOC_5_HOT_SPARE_RESERVED", data(HotSpare[0].Reserved), OPT}, + {"HOT_SPARE_POOL", data(HotSpare[0].HotSparePool), 0}, + {"FLAGS", data(HotSpare[0].Flags), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pIOCPage6_t)0)->x, sizeof(((pIOCPage6_t)0)->x) + +ITEM ioc_page_6_items[] = +{ + {"CAPABILITIES_FLAGS", data(CapabilitiesFlags), OPT}, + {"MAX_DRIVES_IS", data(MaxDrivesIS), OPT}, + {"MAX_DRIVES_IM", data(MaxDrivesIM), OPT}, + {"MAX_DRIVES_IME", data(MaxDrivesIME), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {"MIN_DRIVES_IS", data(MinDrivesIS), OPT}, + {"MIN_DRIVES_IM", data(MinDrivesIM), OPT}, + {"MIN_DRIVES_IME", data(MinDrivesIME), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"MAX_GLOBAL_HOTSPARES", data(MaxGlobalHotSpares), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {"SUPPORTED_STRIPE_SIZE_MAP_IS", data(SupportedStripeSizeMapIS), OPT}, + {"SUPPORTED_STRIPE_SIZE_MAP_IME", data(SupportedStripeSizeMapIME), OPT}, + {"RESERVED6", data(Reserved6), OPT}, + {"METADATA_SIZE", data(MetadataSize), OPT}, + {"RESERVED7", data(Reserved7), OPT}, + {"RESERVED8", data(Reserved8), OPT}, + {"MAX_BAD_BLOCK_TABLE_ENTRIES", data(MaxBadBlockTableEntries), OPT}, + {"RESERVED9", data(Reserved9), OPT}, + {"IR_NVSRAM_USAGE", data(IRNvsramUsage), OPT}, + {"RESERVED10", data(Reserved10), OPT}, + {"IR_NVSRAM_VERSION", data(IRNvsramVersion), OPT}, + {"RESERVED11", data(Reserved11), OPT}, + {"RESERVED12", data(Reserved12), OPT}, + {"ALL", sizeof(ConfigPageHeader_t), sizeof(IOCPage6_t) - sizeof(ConfigPageHeader_t), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2IOCPage8_t)0)->x, sizeof(((pMpi2IOCPage8_t)0)->x) + +ITEM ioc_page_8_items2[] = +{ + {"NUM_DEVS_PER_ENCL", data(NumDevsPerEnclosure), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"MAX_PERSIST_ENTRIES", data(MaxPersistentEntries), 0}, + {"MAX_NUM_PHYS_MAPPED_IDS", data(MaxNumPhysicalMappedIDs), 0}, + {"FLAGS", data(Flags), 0}, + {"RESERVED3", data(Reserved3), OPT}, + {"IR_VOLUME_MAPPING_FLAGS", data(IRVolumeMappingFlags), 0}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasIOUnitPage0_t)0)->x, sizeof(((pSasIOUnitPage0_t)0)->x) + +ITEM sas_io_unit_page_0_items[] = +{ + {"NVDATA_VER_DEFAULT", data(NvdataVersionDefault), 0}, + {"NVDATA_VER_PERSISTENT", data(NvdataVersionPersistent), 0}, + {"NUM_PHYS", data(NumPhys), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED1", data(Reserved3), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"PORT", data(PhyData[0].Port), 0}, + {"PORT_FLGS", data(PhyData[0].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[0].PhyFlags), 0}, + {"NEGOT_LINK_RATE", data(PhyData[0].NegotiatedLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[0].ControllerPhyDeviceInfo), 0}, + {"ATTCH_DEV_HNDL", data(PhyData[0].AttachedDeviceHandle), 0}, + {"CNTLR_DEV_HNDL", data(PhyData[0].ControllerDevHandle), 0}, + {"SAS0_DISCOVERYSTATUS", data(PhyData[0].DiscoveryStatus), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasIOUnitPage1_t)0)->x, sizeof(((pSasIOUnitPage1_t)0)->x) + +ITEM sas_io_unit_page_1_items[] = +{ + {"CONTROLFLAGS", data(ControlFlags), 0}, + {"MAXSATATARGETS", data(MaxNumSATATargets), 0}, + {"ADDCONTROLFLAGS", data(AdditionalControlFlags), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"NUM_PHYS", data(NumPhys), 0}, + {"SATAMAXQDEPTH", data(SATAMaxQDepth), 0}, + {"REPDEVMISSINGDELAY", data(ReportDeviceMissingDelay), 0}, + {"IODEVMISSINGDELAY", data(IODeviceMissingDelay), 0}, + {"Port", data(PhyData[0].Port), DUP}, + {"SAS_IO_UNIT1_PHY_0_PORT", data(PhyData[0].Port), 0}, + {"Port_Flgs", data(PhyData[0].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_0_PORT_FLGS", data(PhyData[0].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[0].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_0_PHY_FLGS", data(PhyData[0].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[0].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_0_MIN_MAX_LINK_RATE", data(PhyData[0].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[0].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_0_CNTLR_PHY_DEV_INFO", data(PhyData[0].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[0].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_0_MAX_TARG_PORT_CONN_TIME", data(PhyData[0].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[0].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_0_RESERVED1", data(PhyData[0].Reserved1), OPT}, + {"Port", data(PhyData[1].Port), DUP}, + {"SAS_IO_UNIT1_PHY_1_PORT", data(PhyData[1].Port), 0}, + {"Port_Flgs", data(PhyData[1].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_1_PORT_FLGS", data(PhyData[1].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[1].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_1_PHY_FLGS", data(PhyData[1].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[1].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_1_MIN_MAX_LINK_RATE", data(PhyData[1].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[1].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_1_CNTLR_PHY_DEV_INFO", data(PhyData[1].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[1].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_1_MAX_TARG_PORT_CONN_TIME", data(PhyData[1].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[1].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_1_RESERVED1", data(PhyData[1].Reserved1), OPT}, + {"Port", data(PhyData[2].Port), DUP}, + {"SAS_IO_UNIT1_PHY_2_PORT", data(PhyData[2].Port), 0}, + {"Port_Flgs", data(PhyData[2].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_2_PORT_FLGS", data(PhyData[2].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[2].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_2_PHY_FLGS", data(PhyData[2].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[2].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_2_MIN_MAX_LINK_RATE", data(PhyData[2].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[2].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_2_CNTLR_PHY_DEV_INFO", data(PhyData[2].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[2].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_2_MAX_TARG_PORT_CONN_TIME", data(PhyData[2].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[2].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_2_RESERVED1", data(PhyData[2].Reserved1), OPT}, + {"Port", data(PhyData[3].Port), DUP}, + {"SAS_IO_UNIT1_PHY_3_PORT", data(PhyData[3].Port), 0}, + {"Port_Flgs", data(PhyData[3].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_3_PORT_FLGS", data(PhyData[3].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[3].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_3_PHY_FLGS", data(PhyData[3].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[3].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_3_MIN_MAX_LINK_RATE", data(PhyData[3].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[3].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_3_CNTLR_PHY_DEV_INFO", data(PhyData[3].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[3].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_3_MAX_TARG_PORT_CONN_TIME", data(PhyData[3].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[3].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_3_RESERVED1", data(PhyData[3].Reserved1), OPT}, + {"Port", data(PhyData[4].Port), DUP}, + {"SAS_IO_UNIT1_PHY_4_PORT", data(PhyData[4].Port), 0}, + {"Port_Flgs", data(PhyData[4].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_4_PORT_FLGS", data(PhyData[4].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[4].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_4_PHY_FLGS", data(PhyData[4].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[4].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_4_MIN_MAX_LINK_RATE", data(PhyData[4].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[4].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_4_CNTLR_PHY_DEV_INFO", data(PhyData[4].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[4].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_4_MAX_TARG_PORT_CONN_TIME", data(PhyData[4].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[4].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_4_RESERVED1", data(PhyData[4].Reserved1), OPT}, + {"Port", data(PhyData[5].Port), DUP}, + {"SAS_IO_UNIT1_PHY_5_PORT", data(PhyData[5].Port), 0}, + {"Port_Flgs", data(PhyData[5].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_5_PORT_FLGS", data(PhyData[5].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[5].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_5_PHY_FLGS", data(PhyData[5].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[5].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_5_MIN_MAX_LINK_RATE", data(PhyData[5].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[5].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_5_CNTLR_PHY_DEV_INFO", data(PhyData[5].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[5].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_5_MAX_TARG_PORT_CONN_TIME", data(PhyData[5].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[5].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_5_RESERVED1", data(PhyData[5].Reserved1), OPT}, + {"Port", data(PhyData[6].Port), DUP}, + {"SAS_IO_UNIT1_PHY_6_PORT", data(PhyData[6].Port), 0}, + {"Port_Flgs", data(PhyData[6].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_6_PORT_FLGS", data(PhyData[6].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[6].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_6_PHY_FLGS", data(PhyData[6].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[6].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_6_MIN_MAX_LINK_RATE", data(PhyData[6].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[6].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_6_CNTLR_PHY_DEV_INFO", data(PhyData[6].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[6].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_6_MAX_TARG_PORT_CONN_TIME", data(PhyData[6].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[6].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_6_RESERVED1", data(PhyData[6].Reserved1), OPT}, + {"Port", data(PhyData[7].Port), DUP}, + {"SAS_IO_UNIT1_PHY_7_PORT", data(PhyData[7].Port), 0}, + {"Port_Flgs", data(PhyData[7].PortFlags), DUP}, + {"SAS_IO_UNIT1_PHY_7_PORT_FLGS", data(PhyData[7].PortFlags), 0}, + {"PHY_FLGS", data(PhyData[7].PhyFlags), DUP}, + {"SAS_IO_UNIT1_PHY_7_PHY_FLGS", data(PhyData[7].PhyFlags), 0}, + {"MIN_MAX_LINK_RATE", data(PhyData[7].MaxMinLinkRate), DUP}, + {"SAS_IO_UNIT1_PHY_7_MIN_MAX_LINK_RATE", data(PhyData[7].MaxMinLinkRate), 0}, + {"CNTLR_PHY_DEV_INFO", data(PhyData[7].ControllerPhyDeviceInfo), DUP}, + {"SAS_IO_UNIT1_PHY_7_CNTLR_PHY_DEV_INFO", data(PhyData[7].ControllerPhyDeviceInfo), 0}, + {"MAX_TARG_PORT_CONN_TIME", data(PhyData[7].MaxTargetPortConnectTime), DUP}, + {"SAS_IO_UNIT1_PHY_7_MAX_TARG_PORT_CONN_TIME", data(PhyData[7].MaxTargetPortConnectTime), 0}, + {"RESERVED", data(PhyData[7].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_7_RESERVED1", data(PhyData[7].Reserved1), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2SasIOUnitPage1_t)0)->x, sizeof(((pMpi2SasIOUnitPage1_t)0)->x) + +ITEM sas_io_unit_page_1_items2[] = +{ + {"CONTROLFLAGS", data(ControlFlags), 0}, + {"SASNARROWMAXQDEPTH", data(SASNarrowMaxQueueDepth), 0}, + {"ADDCONTROLFLAGS", data(AdditionalControlFlags), 0}, + {"SASWIDEMAXQDEPTH", data(SASWideMaxQueueDepth), 0}, + {"NUM_PHYS", data(NumPhys), 0}, + {"SATAMAXQDEPTH", data(SATAMaxQDepth), 0}, + {"REPDEVMISSINGDELAY", data(ReportDeviceMissingDelay), 0}, + {"IODEVMISSINGDELAY", data(IODeviceMissingDelay), 0}, + {"SAS_IO_UNIT1_PHY_0_PORT", data(PhyData[0].Port), 0}, + {"SAS_IO_UNIT1_PHY_0_PORT_FLGS", data(PhyData[0].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_0_PHY_FLGS", data(PhyData[0].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_0_MIN_MAX_LINK_RATE", data(PhyData[0].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_0_CNTLR_PHY_DEV_INFO", data(PhyData[0].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_0_MAX_TARG_PORT_CONN_TIME", data(PhyData[0].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_0_RESERVED1", data(PhyData[0].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_1_PORT", data(PhyData[1].Port), 0}, + {"SAS_IO_UNIT1_PHY_1_PORT_FLGS", data(PhyData[1].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_1_PHY_FLGS", data(PhyData[1].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_1_MIN_MAX_LINK_RATE", data(PhyData[1].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_1_CNTLR_PHY_DEV_INFO", data(PhyData[1].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_1_MAX_TARG_PORT_CONN_TIME", data(PhyData[1].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_1_RESERVED1", data(PhyData[1].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_2_PORT", data(PhyData[2].Port), 0}, + {"SAS_IO_UNIT1_PHY_2_PORT_FLGS", data(PhyData[2].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_2_PHY_FLGS", data(PhyData[2].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_2_MIN_MAX_LINK_RATE", data(PhyData[2].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_2_CNTLR_PHY_DEV_INFO", data(PhyData[2].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_2_MAX_TARG_PORT_CONN_TIME", data(PhyData[2].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_2_RESERVED1", data(PhyData[2].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_3_PORT", data(PhyData[3].Port), 0}, + {"SAS_IO_UNIT1_PHY_3_PORT_FLGS", data(PhyData[3].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_3_PHY_FLGS", data(PhyData[3].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_3_MIN_MAX_LINK_RATE", data(PhyData[3].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_3_CNTLR_PHY_DEV_INFO", data(PhyData[3].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_3_MAX_TARG_PORT_CONN_TIME", data(PhyData[3].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_3_RESERVED1", data(PhyData[3].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_4_PORT", data(PhyData[4].Port), 0}, + {"SAS_IO_UNIT1_PHY_4_PORT_FLGS", data(PhyData[4].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_4_PHY_FLGS", data(PhyData[4].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_4_MIN_MAX_LINK_RATE", data(PhyData[4].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_4_CNTLR_PHY_DEV_INFO", data(PhyData[4].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_4_MAX_TARG_PORT_CONN_TIME", data(PhyData[4].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_4_RESERVED1", data(PhyData[4].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_5_PORT", data(PhyData[5].Port), 0}, + {"SAS_IO_UNIT1_PHY_5_PORT_FLGS", data(PhyData[5].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_5_PHY_FLGS", data(PhyData[5].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_5_MIN_MAX_LINK_RATE", data(PhyData[5].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_5_CNTLR_PHY_DEV_INFO", data(PhyData[5].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_5_MAX_TARG_PORT_CONN_TIME", data(PhyData[5].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_5_RESERVED1", data(PhyData[5].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_6_PORT", data(PhyData[6].Port), 0}, + {"SAS_IO_UNIT1_PHY_6_PORT_FLGS", data(PhyData[6].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_6_PHY_FLGS", data(PhyData[6].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_6_MIN_MAX_LINK_RATE", data(PhyData[6].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_6_CNTLR_PHY_DEV_INFO", data(PhyData[6].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_6_MAX_TARG_PORT_CONN_TIME", data(PhyData[6].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_6_RESERVED1", data(PhyData[6].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_7_PORT", data(PhyData[7].Port), 0}, + {"SAS_IO_UNIT1_PHY_7_PORT_FLGS", data(PhyData[7].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_7_PHY_FLGS", data(PhyData[7].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_7_MIN_MAX_LINK_RATE", data(PhyData[7].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_7_CNTLR_PHY_DEV_INFO", data(PhyData[7].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_7_MAX_TARG_PORT_CONN_TIME", data(PhyData[7].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_7_RESERVED1", data(PhyData[7].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_8_PORT", data(PhyData[8].Port), 0}, + {"SAS_IO_UNIT1_PHY_8_PORT_FLGS", data(PhyData[8].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_8_PHY_FLGS", data(PhyData[8].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_8_MIN_MAX_LINK_RATE", data(PhyData[8].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_8_CNTLR_PHY_DEV_INFO", data(PhyData[8].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_8_MAX_TARG_PORT_CONN_TIME", data(PhyData[8].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_8_RESERVED1", data(PhyData[8].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_9_PORT", data(PhyData[9].Port), 0}, + {"SAS_IO_UNIT1_PHY_9_PORT_FLGS", data(PhyData[9].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_9_PHY_FLGS", data(PhyData[9].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_9_MIN_MAX_LINK_RATE", data(PhyData[9].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_9_CNTLR_PHY_DEV_INFO", data(PhyData[9].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_9_MAX_TARG_PORT_CONN_TIME", data(PhyData[9].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_9_RESERVED1", data(PhyData[9].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_10_PORT", data(PhyData[10].Port), 0}, + {"SAS_IO_UNIT1_PHY_10_PORT_FLGS", data(PhyData[10].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_10_PHY_FLGS", data(PhyData[10].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_10_MIN_MAX_LINK_RATE", data(PhyData[10].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_10_CNTLR_PHY_DEV_INFO", data(PhyData[10].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_10_MAX_TARG_PORT_CONN_TIME", data(PhyData[10].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_10_RESERVED1", data(PhyData[10].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_11_PORT", data(PhyData[11].Port), 0}, + {"SAS_IO_UNIT1_PHY_11_PORT_FLGS", data(PhyData[11].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_11_PHY_FLGS", data(PhyData[11].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_11_MIN_MAX_LINK_RATE", data(PhyData[11].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_11_CNTLR_PHY_DEV_INFO", data(PhyData[11].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_11_MAX_TARG_PORT_CONN_TIME", data(PhyData[11].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_11_RESERVED1", data(PhyData[11].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_12_PORT", data(PhyData[12].Port), 0}, + {"SAS_IO_UNIT1_PHY_12_PORT_FLGS", data(PhyData[12].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_12_PHY_FLGS", data(PhyData[12].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_12_MIN_MAX_LINK_RATE", data(PhyData[12].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_12_CNTLR_PHY_DEV_INFO", data(PhyData[12].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_12_MAX_TARG_PORT_CONN_TIME", data(PhyData[12].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_12_RESERVED1", data(PhyData[12].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_13_PORT", data(PhyData[13].Port), 0}, + {"SAS_IO_UNIT1_PHY_13_PORT_FLGS", data(PhyData[13].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_13_PHY_FLGS", data(PhyData[13].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_13_MIN_MAX_LINK_RATE", data(PhyData[13].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_13_CNTLR_PHY_DEV_INFO", data(PhyData[13].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_13_MAX_TARG_PORT_CONN_TIME", data(PhyData[13].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_13_RESERVED1", data(PhyData[13].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_14_PORT", data(PhyData[14].Port), 0}, + {"SAS_IO_UNIT1_PHY_14_PORT_FLGS", data(PhyData[14].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_14_PHY_FLGS", data(PhyData[14].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_14_MIN_MAX_LINK_RATE", data(PhyData[14].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_14_CNTLR_PHY_DEV_INFO", data(PhyData[14].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_14_MAX_TARG_PORT_CONN_TIME", data(PhyData[14].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_14_RESERVED1", data(PhyData[14].Reserved1), OPT}, + {"SAS_IO_UNIT1_PHY_15_PORT", data(PhyData[15].Port), 0}, + {"SAS_IO_UNIT1_PHY_15_PORT_FLGS", data(PhyData[15].PortFlags), 0}, + {"SAS_IO_UNIT1_PHY_15_PHY_FLGS", data(PhyData[15].PhyFlags), 0}, + {"SAS_IO_UNIT1_PHY_15_MIN_MAX_LINK_RATE", data(PhyData[15].MaxMinLinkRate), 0}, + {"SAS_IO_UNIT1_PHY_15_CNTLR_PHY_DEV_INFO", data(PhyData[15].ControllerPhyDeviceInfo), 0}, + {"SAS_IO_UNIT1_PHY_15_MAX_TARG_PORT_CONN_TIME", data(PhyData[15].MaxTargetPortConnectTime), 0}, + {"SAS_IO_UNIT1_PHY_15_RESERVED1", data(PhyData[15].Reserved1), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasIOUnitPage2_t)0)->x, sizeof(((pSasIOUnitPage2_t)0)->x) + +ITEM sas_io_unit_page_2_items[] = +{ + {"SAS2_NUMDEVICESPERENCLOSURE", data(NumDevsPerEnclosure), 0}, + {"MAX_PERSIST_IDS", data(MaxPersistentIDs), 0}, + {"MAX_PERSIST_IDS_USED", data(NumPersistentIDsUsed), 0}, + {"STATUS", data(Status), 0}, + {"FLAGS", data(Flags), 0}, + {"SAS2_MAXNUMPHYMAPPEDID", data(MaxNumPhysicalMappedIDs), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasIOUnitPage3_t)0)->x, sizeof(((pSasIOUnitPage3_t)0)->x) + +ITEM sas_io_unit_page_3_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"MAX_INVALID_DWRD_CNT", data(MaxInvalidDwordCount), 0}, + {"INVALID_DWRD_CNT_TIME", data(InvalidDwordCountTime), 0}, + {"MAX_RUNNING_DISPARE_ERR_CNT", data(MaxRunningDisparityErrorCount), 0}, + {"RUNNING_DISPARE_ERR_TIME", data(RunningDisparityErrorTime), 0}, + {"MAX_LOSS_DWRD_SYNC_CNT", data(MaxLossDwordSynchCount), 0}, + {"LOSS_DWRD_SYNC_CNT_TIME", data(LossDwordSynchCountTime), 0}, + {"MAX_PHY_RESET_PROB_CNT", data(MaxPhyResetProblemCount), 0}, + {"PHY_RESET_PROB_TIME", data(PhyResetProblemTime), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2SasIOUnitPage4_t)0)->x, sizeof(((pMpi2SasIOUnitPage4_t)0)->x) + +ITEM sas_io_unit_page_4_items2[] = +{ + {"GROUP0_MAX_TARGET_SPINUP", data(SpinupGroupParameters[0].MaxTargetSpinup), 0}, + {"GROUP0_SPINUP_DELAY", data(SpinupGroupParameters[0].SpinupDelay), 0}, + {"GROUP0_RESERVED1", data(SpinupGroupParameters[0].Reserved1), OPT}, + {"GROUP1_MAX_TARGET_SPINUP", data(SpinupGroupParameters[1].MaxTargetSpinup), 0}, + {"GROUP1_SPINUP_DELAY", data(SpinupGroupParameters[1].SpinupDelay), 0}, + {"GROUP1_RESERVED1", data(SpinupGroupParameters[1].Reserved1), OPT}, + {"GROUP2_MAX_TARGET_SPINUP", data(SpinupGroupParameters[2].MaxTargetSpinup), 0}, + {"GROUP2_SPINUP_DELAY", data(SpinupGroupParameters[2].SpinupDelay), 0}, + {"GROUP2_RESERVED1", data(SpinupGroupParameters[2].Reserved1), OPT}, + {"GROUP3_MAX_TARGET_SPINUP", data(SpinupGroupParameters[3].MaxTargetSpinup), 0}, + {"GROUP3_SPINUP_DELAY", data(SpinupGroupParameters[3].SpinupDelay), 0}, + {"GROUP3_RESERVED1", data(SpinupGroupParameters[3].Reserved1), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"NUM_PHYS", data(NumPhys), 0}, + {"PE_INIT_SPINUP_DELAY", data(PEInitialSpinupDelay), 0}, + {"PE_REPLY_DELAY", data(PEReplyDelay), 0}, + {"FLAGS", data(Flags), 0}, + {"PHY_0", data(PHY[0]), 0}, + {"PHY_1", data(PHY[1]), 0}, + {"PHY_2", data(PHY[2]), 0}, + {"PHY_3", data(PHY[3]), 0}, + {"PHY_4", data(PHY[4]), 0}, + {"PHY_5", data(PHY[5]), 0}, + {"PHY_6", data(PHY[6]), 0}, + {"PHY_7", data(PHY[7]), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasExpanderPage0_t)0)->x, sizeof(((pSasExpanderPage0_t)0)->x) + +ITEM sas_expander_page_0_items[] = +{ + {"SAS_EXP0_PHYSICALPORT", data(PhysicalPort), 0}, + {"SAS_EXP0_ENCLOSUREHANDLE", data(EnclosureHandle), 0}, + {"SASADRSHIGH", data(SASAddress.High), 0}, + {"SASADRSLOW", data(SASAddress.Low), 0}, + {"SAS_EXP0_DISCOVERYSTATUS", data(DiscoveryStatus), 0}, + {"DEVHNDL", data(DevHandle), 0}, + {"PARENTDEVHNDL", data(ParentDevHandle), 0}, + {"EXPNDRCHGCNT", data(ExpanderChangeCount), 0}, + {"EXPNDRROUTEINDX", data(ExpanderRouteIndexes), 0}, + {"NUMPHYS", data(NumPhys), 0}, + {"SASLEVEL", data(SASLevel), 0}, + {"FLAGS", data(Flags), 0}, + {"DISCOVERYSTATUS", data(Reserved3), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasExpanderPage1_t)0)->x, sizeof(((pSasExpanderPage1_t)0)->x) + +ITEM sas_expander_page_1_items[] = +{ + {"SAS_EXP1_PHYSICALPORT", data(PhysicalPort), 0}, + {"NUMPHYS", data(NumPhys), 0}, + {"PHY", data(Phy), 0}, + {"SAS_EXP1_NUMTBLENTRIESPROG", data(NumTableEntriesProgrammed), 0}, + {"PROGLINKRATE", data(ProgrammedLinkRate), 0}, + {"HWLINKRATE", data(HwLinkRate), 0}, + {"ATTCHDDEVHANDLE", data(AttachedDevHandle), 0}, + {"PHYINFO", data(PhyInfo), 0}, + {"ATTCHDDEVINFO", data(AttachedDeviceInfo), 0}, + {"OWNERDEVHNDL", data(OwnerDevHandle), 0}, + {"CHGCNT", data(ChangeCount), 0}, + {"NEGLNKRATE", data(NegotiatedLinkRate), 0}, + {"PHYIDENTIFIER", data(PhyIdentifier), 0}, + {"ATTCHDPHYIDENT", data(AttachedPhyIdentifier), 0}, + {"RESERVED3", data(Reserved3), OPT}, + {"DISCOVERYInfo", data(DiscoveryInfo), DUP}, + {"DISCOVERYINFO", data(DiscoveryInfo), 0}, + {"RESERVED4", data(Reserved4), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasDevicePage0_t)0)->x, sizeof(((pSasDevicePage0_t)0)->x) + +ITEM sas_device_page_0_items[] = +{ + {"SLOT", data(Slot), 0}, + {"ENCLOSURE_HANDLE", data(EnclosureHandle), 0}, + {"SASADRSHIGH", data(SASAddress.High), 0}, + {"SASADRSLOW", data(SASAddress.Low), 0}, + {"SAS_DEV0_PARENTDEVHANDLE", data(ParentDevHandle), 0}, + {"SAS_DEV0_PHYNUM", data(PhyNum), 0}, + {"SAS_DEV0_ACCESSSTATUS", data(AccessStatus), 0}, + {"DEVHNDL", data(DevHandle), 0}, + {"TARGETID", data(TargetID), 0}, + {"BUS", data(Bus), 0}, + {"DEVICEINFO", data(DeviceInfo), 0}, + {"FLAGS", data(Flags), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasDevicePage1_t)0)->x, sizeof(((pSasDevicePage1_t)0)->x) + +ITEM sas_device_page_1_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"SASADRSHIGH", data(SASAddress.High), 0}, + {"SASADRSLOW", data(SASAddress.Low), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"DEVHNDL", data(DevHandle), 0}, + {"TARGETID", data(TargetID), 0}, + {"BUS", data(Bus), 0}, + {"INITREGDEVICEFIS", data(InitialRegDeviceFIS), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasDevicePage2_t)0)->x, sizeof(((pSasDevicePage2_t)0)->x) + +ITEM sas_device_page_2_items[] = +{ + {"SAS_DEV2_PHYSICALIDHIGH", data(PhysicalIdentifier.High), 0}, + {"SAS_DEV2_PHYSICALIDLOW", data(PhysicalIdentifier.Low), 0}, + {"SAS_DEV2_ENCLOSURE_MAPPING", data(EnclosureMapping), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasPhyPage0_t)0)->x, sizeof(((pSasPhyPage0_t)0)->x) + +ITEM sas_phy_page_0_items[] = +{ + {"SAS_PHY0_OWNER_DEV_HANDLE", data(OwnerDevHandle), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"SASADRSHIGH", data(SASAddress.High), 0}, + {"SASADRSLOW", data(SASAddress.Low), 0}, + {"ATTCHDDEVHNDL", data(AttachedDevHandle), 0}, + {"ATTCHDPHYIDENTIFIER", data(AttachedPhyIdentifier), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"ATTCHDDEVINFO", data(AttachedDeviceInfo), 0}, + {"PRGMDLINKRATE", data(ProgrammedLinkRate), 0}, + {"HWLINKRATE", data(HwLinkRate), 0}, + {"CHNGCOUNT", data(ChangeCount), 0}, + {"SAS_PHY0_FLAGS", data(Flags), 0}, + {"PHYINFO", data(PhyInfo), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasPhyPage1_t)0)->x, sizeof(((pSasPhyPage1_t)0)->x) + +ITEM sas_phy_page_1_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"INVALIDDWRDCNT", data(InvalidDwordCount), 0}, + {"RUNNGDISPARITYERRCNT", data(RunningDisparityErrorCount), 0}, + {"LOSSDWRDSYNCCNT", data(LossDwordSynchCount), 0}, + {"PHYRESETPROBCNT", data(PhyResetProblemCount), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pSasEnclosurePage0_t)0)->x, sizeof(((pSasEnclosurePage0_t)0)->x) + +ITEM sas_enclosure_page_0_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"ENCLOSURELOGICALID_HIGH", data(EnclosureLogicalID.High), 0}, + {"ENCLOSURELOGICALID_LOW", data(EnclosureLogicalID.Low), 0}, + {"FLAGS", data(Flags), 0}, + {"ENCLOSUREHANDLE", data(EnclosureHandle), 0}, + {"NUMSLOTS", data(NumSlots), 0}, + {"STARTSLOT", data(StartSlot), 0}, + {"STARTTARGETID", data(StartTargetID), 0}, + {"STARTBUS", data(StartBus), 0}, + {"SEPTARGETID", data(SEPTargetID), 0}, + {"SEPBUS", data(SEPBus), 0}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pPersistentId_SAS_t)0)->x, sizeof(((pPersistentId_SAS_t)0)->x) + +ITEM sas_persistent_id_items[] = +{ + {"PERSISTID_SASADDRESS_HIGH_0", data(PersistId[0].SasAddress.Word.High), 0}, + {"PERSISTID_SASADDRESS_LOW_0", data(PersistId[0].SasAddress.Word.Low), 0}, + {"PERSISTID_RESERVED_0", data(PersistId[0].Reserved), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pRaidVolumePage0_t)0)->x, sizeof(((pRaidVolumePage0_t)0)->x) + +ITEM raid_volume_page_0_items[] = +{ + {"ALL", sizeof(ConfigPageHeader_t), sizeof(RaidVolumePage0_t) - sizeof(ConfigPageHeader_t), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pRaidVolumePage1_t)0)->x, sizeof(((pRaidVolumePage1_t)0)->x) + +ITEM raid_volume_page_1_items[] = +{ + {"RAIDVOL1_VOLUMEID", data(VolumeID), 0}, + {"RAIDVOL1_VOLUMEBUS", data(VolumeBus), 0}, + {"RAIDVOL1_VOLUMEIOC", data(VolumeIOC), 0}, + {"RAIDVOL1_WWID_HIGH", data(WWID.High), 0}, + {"RAIDVOL1_WWID_LOW", data(WWID.Low), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pRaidPhysDiskPage0_t)0)->x, sizeof(((pRaidPhysDiskPage0_t)0)->x) + +ITEM raid_physdisk_page_0_items[] = +{ + {"ALL", sizeof(ConfigPageHeader_t), sizeof(RaidPhysDiskPage0_t) - sizeof(ConfigPageHeader_t), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pRaidPhysDiskPage1_t)0)->x, sizeof(((pRaidPhysDiskPage1_t)0)->x) + +ITEM raid_physdisk_page_1_items[] = +{ + {"RAIDPHYDISK1_NUMPHYSDISKPATH", data(NumPhysDiskPaths), 0}, + {"RAIDPHYDISK1_PHYSDISKNUM", data(PhysDiskNum), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pBIOSPage1_t)0)->x, sizeof(((pBIOSPage1_t)0)->x) + +ITEM bios_page_1_items[] = +{ + {"BIOSOPTIONS", data(BiosOptions), 0}, + {"IOCSETTINGS", data(IOCSettings), 0}, + {"BIOS_RESERVED1", data(Reserved1), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {"DEVSETTINGS", data(DeviceSettings), 0}, + {"BIOS_NUMDEVS", data(NumberOfDevices), 0}, + {"BIOS1_EXPANDERSPINUP", data(ExpanderSpinup), MPI1}, + {"RESERVED2", data(Reserved2), OPT}, + {"IOTIMOUTBLKDEVSNONRM", data(IOTimeoutBlockDevicesNonRM), 0}, + {"IOTIMOUTSEQUENTIAL", data(IOTimeoutSequential), 0}, + {"IOTIMOUTOTHER", data(IOTimeoutOther), 0}, + {"IOTIMOUTBLKDEVSRM", data(IOTimeoutBlockDevicesRM), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pBIOSPage2_t)0)->x, sizeof(((pBIOSPage2_t)0)->x) + +ITEM bios_page_2_items[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {"RESERVED6", data(Reserved6), OPT}, + {"BIOS2_BOOTDEVICEFORM", data(BootDeviceForm), 0}, + {"BIOS2_PREVBOOTDEVFORM", data(PrevBootDeviceForm), 0}, + {"RESERVED8", data(Reserved8), OPT}, + {"BIOS2_SASADDRESS_HIGH", data(BootDevice.SasWwn.SASAddress.High), 0}, + {"BIOS2_SASADDRESS_LOW", data(BootDevice.SasWwn.SASAddress.Low), 0}, + {"BIOS2_SASADDRESS_LUN", data(BootDevice.SasWwn.LUN[1]), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2BiosPage2_t)0)->x, sizeof(((pMpi2BiosPage2_t)0)->x) + +ITEM bios_page_2_items2[] = +{ + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"RESERVED3", data(Reserved3), OPT}, + {"RESERVED4", data(Reserved4), OPT}, + {"RESERVED5", data(Reserved5), OPT}, + {"RESERVED6", data(Reserved6), OPT}, + {"REQ_BOOTDEVICEFORM", data(ReqBootDeviceForm), 0}, + {"RESERVED7", data(Reserved7), OPT}, + {"RESERVED8", data(Reserved8), OPT}, + {"REQ_SASADDRESS_LOW", data(RequestedBootDevice.SasWwid.SASAddress.Low), IGN}, + {"REQ_SASADDRESS_HI", data(RequestedBootDevice.SasWwid.SASAddress.High), IGN}, + {"REQ_SASADDRESS_LUN", data(RequestedBootDevice.SasWwid.LUN[1]), IGN}, + {"REQ_DEVICENAME_LOW", data(RequestedBootDevice.DeviceName.DeviceName.Low), IGN}, + {"REQ_DEVICENAME_HI", data(RequestedBootDevice.DeviceName.DeviceName.High), IGN}, + {"REQ_DEVICENAME_LUN", data(RequestedBootDevice.DeviceName.LUN[1]), IGN}, + {"REQ_ENCLOSUREID_LOW", data(RequestedBootDevice.EnclosureSlot.EnclosureLogicalID.Low), IGN}, + {"REQ_ENCLOSUREID_HI", data(RequestedBootDevice.EnclosureSlot.EnclosureLogicalID.High), IGN}, + {"REQ_SLOTNUMBER", data(RequestedBootDevice.EnclosureSlot.SlotNumber), IGN}, + {"REQALT_BOOTDEVICEFORM", data(ReqAltBootDeviceForm), 0}, + {"RESERVED9", data(Reserved9), OPT}, + {"RESERVED10", data(Reserved10), OPT}, + {"REQALT_SASADDRESS_LOW", data(RequestedAltBootDevice.SasWwid.SASAddress.Low), IGN}, + {"REQALT_SASADDRESS_HI", data(RequestedAltBootDevice.SasWwid.SASAddress.High), IGN}, + {"REQALT_SASADDRESS_LUN", data(RequestedAltBootDevice.SasWwid.LUN[1]), IGN}, + {"REQALT_DEVICENAME_LOW", data(RequestedAltBootDevice.DeviceName.DeviceName.Low), IGN}, + {"REQALT_DEVICENAME_HI", data(RequestedAltBootDevice.DeviceName.DeviceName.High), IGN}, + {"REQALT_DEVICENAME_LUN", data(RequestedAltBootDevice.DeviceName.LUN[1]), IGN}, + {"REQALT_ENCLOSUREID_LOW", data(RequestedAltBootDevice.EnclosureSlot.EnclosureLogicalID.Low), IGN}, + {"REQALT_ENCLOSUREID_HI", data(RequestedAltBootDevice.EnclosureSlot.EnclosureLogicalID.High), IGN}, + {"REQALT_SLOTNUMBER", data(RequestedAltBootDevice.EnclosureSlot.SlotNumber), IGN}, + {"CURR_BOOTDEVICEFORM", data(CurrentBootDeviceForm), 0}, + {"RESERVED11", data(Reserved11), OPT}, + {"RESERVED12", data(Reserved12), OPT}, + {"CURR_SASADDRESS_LOW", data(CurrentBootDevice.SasWwid.SASAddress.Low), IGN}, + {"CURR_SASADDRESS_HI", data(CurrentBootDevice.SasWwid.SASAddress.High), IGN}, + {"CURR_SASADDRESS_LUN", data(CurrentBootDevice.SasWwid.LUN[1]), IGN}, + {"CURR_DEVICENAME_LOW", data(CurrentBootDevice.DeviceName.DeviceName.Low), IGN}, + {"CURR_DEVICENAME_HI", data(CurrentBootDevice.DeviceName.DeviceName.High), IGN}, + {"CURR_DEVICENAME_LUN", data(CurrentBootDevice.DeviceName.LUN[1]), IGN}, + {"CURR_ENCLOSUREID_LOW", data(CurrentBootDevice.EnclosureSlot.EnclosureLogicalID.Low), IGN}, + {"CURR_ENCLOSUREID_HI", data(CurrentBootDevice.EnclosureSlot.EnclosureLogicalID.High), IGN}, + {"CURR_SLOTNUMBER", data(CurrentBootDevice.EnclosureSlot.SlotNumber), IGN}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2BiosPage3_t)0)->x, sizeof(((pMpi2BiosPage3_t)0)->x) + +ITEM bios_page_3_items2[] = +{ + {"GLOBAL_FLAGS", data(GlobalFlags), 0}, + {"BIOS_VERSION", data(BiosVersion), 0}, + {"PCI_BUS_NUMBER_0", data(AdapterOrder[0].PciBusNumber), 0}, + {"PCI_DEVICE_FUNCTION_0", data(AdapterOrder[0].PciDeviceAndFunctionNumber), 0}, + {"ADAPTER_FLAGS_0", data(AdapterOrder[0].AdapterFlags), 0}, + {"PCI_BUS_NUMBER_1", data(AdapterOrder[1].PciBusNumber), OPT}, + {"PCI_DEVICE_FUNCTION_1", data(AdapterOrder[1].PciDeviceAndFunctionNumber), OPT}, + {"ADAPTER_FLAGS_1", data(AdapterOrder[1].AdapterFlags), OPT}, + {"PCI_BUS_NUMBER_2", data(AdapterOrder[2].PciBusNumber), OPT}, + {"PCI_DEVICE_FUNCTION_2", data(AdapterOrder[2].PciDeviceAndFunctionNumber), OPT}, + {"ADAPTER_FLAGS_2", data(AdapterOrder[2].AdapterFlags), OPT}, + {"PCI_BUS_NUMBER_3", data(AdapterOrder[3].PciBusNumber), OPT}, + {"PCI_DEVICE_FUNCTION_3", data(AdapterOrder[3].PciDeviceAndFunctionNumber), OPT}, + {"ADAPTER_FLAGS_3", data(AdapterOrder[3].AdapterFlags), OPT}, + {"RESERVED1", data(Reserved1), OPT}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pBIOSPage4_t)0)->x, sizeof(((pBIOSPage4_t)0)->x) + +ITEM bios_page_4_items[] = +{ + {"BIOS4_REASSIGNMENTBASEWWID_HIGH", data(ReassignmentBaseWWID.High), 0}, + {"BIOS4_REASSIGNMENTBASEWWID_LOW", data(ReassignmentBaseWWID.Low), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2BiosPage4_t)0)->x, sizeof(((pMpi2BiosPage4_t)0)->x) + +ITEM bios_page_4_items2[] = +{ + {"NUM_PHYS", data(NumPhys), 0}, + {"RESERVED1", data(Reserved1), OPT}, + {"RESERVED2", data(Reserved2), OPT}, + {"REASSIGN_WWID_LOW_0", data(Phy[0].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_0", data(Phy[0].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_0", data(Phy[0].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_0", data(Phy[0].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_1", data(Phy[1].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_1", data(Phy[1].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_1", data(Phy[1].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_1", data(Phy[1].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_2", data(Phy[2].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_2", data(Phy[2].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_2", data(Phy[2].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_2", data(Phy[2].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_3", data(Phy[3].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_3", data(Phy[3].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_3", data(Phy[3].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_3", data(Phy[3].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_4", data(Phy[4].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_4", data(Phy[4].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_4", data(Phy[4].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_4", data(Phy[4].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_5", data(Phy[5].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_5", data(Phy[5].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_5", data(Phy[5].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_5", data(Phy[5].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_6", data(Phy[6].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_6", data(Phy[6].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_6", data(Phy[6].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_6", data(Phy[6].ReassignmentDeviceName.High), 0}, + {"REASSIGN_WWID_LOW_7", data(Phy[7].ReassignmentWWID.Low), 0}, + {"REASSIGN_WWID_HIGH_7", data(Phy[7].ReassignmentWWID.High), 0}, + {"REASSIGN_DEVNAME_LOW_7", data(Phy[7].ReassignmentDeviceName.Low), 0}, + {"REASSIGN_DEVNAME_HIGH_7", data(Phy[7].ReassignmentDeviceName.High), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pLogPage0_t)0)->x, sizeof(((pLogPage0_t)0)->x) + +ITEM log_page_0_items[] = +{ + {"ALL", sizeof(ConfigExtendedPageHeader_t), sizeof(LogPage0_t) - sizeof(ConfigExtendedPageHeader_t), 0}, + {0} +}; + +#undef data +#define data(x) (int)(size_t)&((pMpi2DriverMappingPage0_t)0)->x, sizeof(((pMpi2DriverMappingPage0_t)0)->x) + +ITEM driver_mapping_page_0_items2[] = +{ + {"PHYSICAL_IDENTIFIER_LOW", data(Entry.PhysicalIdentifier.Low), 0}, + {"PHYSICAL_IDENTIFIER_HIGH", data(Entry.PhysicalIdentifier.High), 0}, + {"MAPPING_INFORMATION", data(Entry.MappingInformation), 0}, + {"DEVICE_INDEX", data(Entry.DeviceIndex), 0}, + {"PHYSICAL_BITS_MAPPING", data(Entry.PhysicalBitsMapping), 0}, + {"RESERVED1", data(Entry.Reserved1), OPT}, + {0} +}; + +#undef data +#define data(x) sizeof(x) +#define plus(x,y,z) data(x) + sizeof(((p##x)0)->y) * z + +SECTION sections[] = +{ + {"SECTION_GENERAL_DATA", general_data_items, data(GeneralData_t), GEN}, + {"SECTION_MANUFACTURING_PAGE_0", manufacturing_page_0_items, data(ManufacturingPage0_t), 0}, + {"SECTION_MANUFACTURING_PAGE_1", manufacturing_page_1_items, data(ManufacturingPage1_t), 0}, + {"SECTION_IOC_MFG_PAGE_2", manufacturing_page_2_items, data(ManufacturingPage2_SAS_t), MP2}, + {"SECTION_IOC_MFG_PAGE_3", manufacturing_page_3_items, data(ManufacturingPage3_SAS_t), 0}, + {"SECTION_MANUFACTURING_PAGE_4", manufacturing_page_4_items, data(ManufacturingPage4_t), 0}, + {"SECTION_MANUFACTURING_PAGE_5", manufacturing_page_5_items, plus(ManufacturingPage5_t, ForceWWID, 7), 0}, + {"SECTION_MANUFACTURING_PAGE_7", manufacturing_page_7_items, plus(ManufacturingPage7_t, ConnectorInfo, 7), 0}, + {"SECTION_IO_UNIT_PAGE_0", io_unit_page_0_items, data(IOUnitPage0_t), 0}, + {"SECTION_IO_UNIT_PAGE_1", io_unit_page_1_items, data(IOUnitPage1_t), 0}, + {"SECTION_IO_UNIT_PAGE_2", io_unit_page_2_items, data(IOUnitPage2_t), 0}, + {"SECTION_IO_UNIT_PAGE_3", io_unit_page_3_items, plus(IOUnitPage3_t, GPIOVal, 31), 0}, + {"SECTION_IO_UNIT_PAGE_4", io_unit_page_4_items, data(IOUnitPage4_t), 0}, + {"SECTION_IOC_PAGE_0", ioc_page_0_items, data(IOCPage0_t), 0}, + {"SECTION_IOC_PAGE_1", ioc_page_1_items, data(IOCPage1_t), 0}, + {"SECTION_IOC_PAGE_2", ioc_page_2_items, data(IOCPage2_t), 0}, + {"SECTION_IOC_PAGE_3", ioc_page_3_items, data(IOCPage3_t), 0}, + {"SECTION_IOC_PAGE_4", ioc_page_4_items, data(IOCPage4_t), 0}, + {"SECTION_IOC_PAGE_5", ioc_page_5_items, data(IOCPage5_t), 0}, + {"SECTION_IOC_PAGE_6", ioc_page_6_items, data(IOCPage6_t), 0}, + {"SECTION_SAS_IO_UNIT_0", sas_io_unit_page_0_items, plus(SasIOUnitPage0_t, PhyData, 7), EXT}, + {"SECTION_SAS_IO_UNIT_1", sas_io_unit_page_1_items, plus(SasIOUnitPage1_t, PhyData, 7), EXT}, + {"SECTION_SAS_IO_UNIT_2", sas_io_unit_page_2_items, data(SasIOUnitPage2_t), EXT}, + {"SECTION_SAS_IO_UNIT_3", sas_io_unit_page_3_items, data(SasIOUnitPage3_t), EXT}, + {"SECTION_SAS_EXPANDER_0", sas_expander_page_0_items, data(SasExpanderPage0_t), EXT}, + {"SECTION_SAS_EXPANDER_1", sas_expander_page_1_items, data(SasExpanderPage1_t), EXT}, + {"SECTION_SAS_DEVICE_0", sas_device_page_0_items, data(SasDevicePage0_t), EXT}, + {"SECTION_SAS_DEVICE_1", sas_device_page_1_items, data(SasDevicePage1_t), EXT}, + {"SECTION_SAS_DEVICE_2", sas_device_page_2_items, data(SasDevicePage2_t), EXT}, + {"SECTION_SAS_PHY_0", sas_phy_page_0_items, data(SasPhyPage0_t), EXT}, + {"SECTION_SAS_PHY_1", sas_phy_page_1_items, data(SasPhyPage1_t), EXT}, + {"SECTION_SAS_ENCLOSURE_0", sas_enclosure_page_0_items, data(SasEnclosurePage0_t), EXT}, + {"SECTION_PERSISTENT_ID", sas_persistent_id_items, data(PersistentId_SAS_t), EXT | PID}, + {"SECTION_RAID_VOL_PAGE_0", raid_volume_page_0_items, data(RaidVolumePage0_t), 0}, + {"SECTION_RAID_VOL_PAGE_1", raid_volume_page_1_items, data(RaidVolumePage1_t), 0}, + {"SECTION_RAID_PHYS_DISK_PAGE_0", raid_physdisk_page_0_items, data(RaidPhysDiskPage0_t), 0}, + {"SECTION_RAID_PHYS_DISK_PAGE_1", raid_physdisk_page_1_items, data(RaidPhysDiskPage1_t), 0}, + {"SECTION_BIOS_1", bios_page_1_items, data(BIOSPage1_t), 0}, + {"SECTION_BIOS_2", bios_page_2_items, data(BIOSPage2_t), 0}, + {"SECTION_BIOS_4", bios_page_4_items, data(BIOSPage4_t), 0}, + {"SECTION_LOG_0", log_page_0_items, data(LogPage0_t), EXT}, + {0} +}; + +SECTION sections2[] = +{ + {"SECTION_GENERAL_DATA", general_data_items, data(GeneralData_t), GEN}, + {"SECTION_MANUFACTURING_PAGE_0", manufacturing_page_0_items, data(ManufacturingPage0_t), 0}, + {"SECTION_MANUFACTURING_PAGE_1", manufacturing_page_1_items, data(ManufacturingPage1_t), 0}, + {"SECTION_IOC_MFG_PAGE_2", manufacturing_page_2_items2, data(ManufacturingPage2_SAS2_t), MP2}, + {"SECTION_IOC_MFG_PAGE_3", manufacturing_page_3_items2, data(ManufacturingPage3_SAS2_t), 0}, + {"SECTION_MANUFACTURING_PAGE_4", manufacturing_page_4_items2, data(Mpi2ManufacturingPage4_t), 0}, + {"SECTION_MANUFACTURING_PAGE_5", manufacturing_page_5_items2, plus(Mpi2ManufacturingPage5_t, Phy, 15), 0}, + {"SECTION_IOC_MFG_PAGE_6", manufacturing_page_6_items2, data(ManufacturingPage6_SAS2_t), 0}, + {"SECTION_MANUFACTURING_PAGE_7", manufacturing_page_7_items, plus(ManufacturingPage7_t, ConnectorInfo, 15), 0}, + {"SECTION_MANUFACTURING_PAGE_8", manufacturing_page_8_items2, data(ManufacturingPage8_t), 0}, + {"SECTION_IOC_MFG_PAGE_9", manufacturing_page_9_items2, data(ManufacturingPage9_SAS2_t), 0}, + {"SECTION_MANUFACTURING_PAGE_10", manufacturing_page_10_items2, data(ManufacturingPage10_t), 0}, + {"SECTION_IOC_MFG_PAGE_11", manufacturing_page_11_items2, data(ManufacturingPage11_SAS2_t), 0}, + {"SECTION_IOC_MFG_PAGE_12", manufacturing_page_12_items2, data(ManufacturingPage12_SAS2_t), 0}, + {"SECTION_IOC_MFG_PAGE_13", manufacturing_page_13_items2, data(ManufacturingPage13_SAS2_t), 0}, + {"SECTION_IO_UNIT_PAGE_1", io_unit_page_1_items, data(IOUnitPage1_t), 0}, + {"SECTION_IOC_PAGE_1", ioc_page_1_items2, data(Mpi2IOCPage1_t), 0}, + {"SECTION_IOC_PAGE_8", ioc_page_8_items2, data(Mpi2IOCPage8_t), 0}, + {"SECTION_BIOS_1", bios_page_1_items, data(BIOSPage1_t), 0}, + {"SECTION_BIOS_2", bios_page_2_items2, data(Mpi2BiosPage2_t), 0}, + {"SECTION_BIOS_3", bios_page_3_items2, data(Mpi2BiosPage3_t), 0}, + {"SECTION_BIOS_4", bios_page_4_items2, plus(Mpi2BiosPage4_t, Phy, 15), 0}, + {"SECTION_SAS_IO_UNIT_1", sas_io_unit_page_1_items2, plus(Mpi2SasIOUnitPage1_t, PhyData, 15), EXT}, + {"SECTION_SAS_IO_UNIT_4", sas_io_unit_page_4_items2, plus(Mpi2SasIOUnitPage4_t, PHY, 3), EXT}, + {"SECTION_DRIVER_MAPPING_0", driver_mapping_page_0_items2, data(Mpi2DriverMappingPage0_t), EXT}, + {0} +}; + +#undef data +#undef plus + + +int +getSectionItem(SECTION *section, ITEM *item, char *buf, U8 *page) +{ + char *c; + char x; + U8 *p; + int n; + int t; + int i; + int j; + int k; + + n = (int)strlen(section->name); + + while (*buf) + { + if (strncmp(buf, section->name, n) == 0) + break; + + buf = skipLine(buf); + } + + if (!*buf) + { + printf("%s not found!\n", section->name); + return 0; + } + + buf = skipLine(buf); + + if (item->size == 0) // special! + { + while (*buf) + { + if (strncmp(buf, "SECTION", 7) == 0) + return 1; + + if (strncmp(buf, "END_SECTION", 11) == 0) + return 1; + + c = NULL; + k = 0; + + if (sscanf(buf, "BYTE_%d=%n", &i, &n) == 1) + { + c = buf + n; + j = i; + k = 1; + } + + if (sscanf(buf, "BYTES_%d_%d=%n", &j, &i, &n) == 2) + { + c = buf + n; + if (j < i) + { + k = i; + i = j; + j = k; + } + k = j - i + 1; + if (k > 4) + { + c--; + x = *c; + *c = '\0'; + printf("Byte range too large for %s in %s!\n", buf, section->name); + *c = x; + buf = skipLine(buf); + continue; + } + } + + if (c == NULL) + { + buf = skipLine(buf); + continue; + } + + if (sscanf(c, "%x%n", &t, &n) == 1) + { + if (c[n] != '\n') + { + c--; + x = *c; + *c = '\0'; + printf("Incorrectly formed number for %s in %s!\n", buf, section->name); + *c = x; + buf = skipLine(buf); + continue; + } + if (n > 8 || (k < 4 && (U32)t > ((U32)1 << (k * 8)))) + { + c--; + x = *c; + *c = '\0'; + printf("Number too large for %s in %s!\n", buf, section->name); + *c = x; + buf = skipLine(buf); + continue; + } + + p = page + i; + + switch(k) + { + default: + case 4: + p[3] = (U8)(t >> 24); + case 3: + p[2] = (U8)(t >> 16); + case 2: + p[1] = (U8)(t >> 8); + case 1: + p[0] = (U8)t; + } + +// c--; +// x = *c; +// *c = '\0'; +// printf("%-32.32s %-28.28s %x\n", section->name, buf, t); +// *c = x; + + removeLine(buf); + continue; + } + } + } + + n = (int)strlen(item->name); + c = NULL; + + while (*buf) + { + if (strncmp(buf, "SECTION", 7) == 0) + break; + + if (strncmp(buf, "END_SECTION", 11) == 0) + break; + + if (strncmp(buf, item->name, n) == 0 && buf[n] == '=') + { + c = buf + n + 1; + break; + } + + buf = skipLine(buf); + } + + if (c == NULL) + { + if (item->flags & OPT) + return 1; + + if (item->flags & DUP) + return 0; + + printf("%s not found in %s\n", item->name, section->name); + return 0; + } + + p = page + item->offset; + + t = 0; + + if (item->flags & STR) + { + if (*c++ == '"') + { + n = 0; + while (*c != '\n' && *c != '\0') + { + if (*c == '"') + break; + p[n++] = *c++; + } + if (c[1] != '\n') + { + printf("Incorrectly formed string for %s in %s!\n", item->name, section->name); + return 0; + } + + if (n != 0 || !(item->flags & IGN)) + p[n] = '\0'; + +// printf("%-32.32s %-28.28s %s\n", section->name, item->name, p); + + removeLine(buf); + return 1; + } + } + else + { + if (sscanf(c, "%x%n", &t, &n) == 1) + { + if (c[n] != '\n') + { + printf("Incorrectly formed number for %s in %s!\n", item->name, section->name); + return 0; + } + k = item->size * ((item->flags & BIT) ? 1 : 8); + if (n > 8 || (k < 32 && (U32)t > ((U32)1 << k))) + { + printf("Number too large for %s in %s!\n", item->name, section->name); + return 0; + } + + if (t != 0 || !(item->flags & IGN)) + { + switch((k + 7) / 8) + { + default: + case 4: + p[3] = (U8)(t >> 24); + case 3: + p[2] = (U8)(t >> 16); + case 2: + p[1] = (U8)(t >> 8); + case 1: + p[0] = (U8)t; + } + +// printf("%-32.32s %-28.28s %x\n", section->name, item->name, t); + } + + removeLine(buf); + return 1; + } + } + + printf("Parse error on %s in %s!\n", item->name, section->name); + return 0; +} + + +U8 +pageChecksum(U8 *page, int size, int skip) +{ + int i; + int checksum; + + checksum = 0; + for (i = skip; i < size; i++) + checksum -= page[i]; + + return checksum & 0xff; +} + + +#define NVDATA_SIZE 4096 +#define NUM_CONFIG_PAGES (sizeof(sections)/sizeof(sections[0]) - 2) // ignore sentinel and GEN +#define NUM_CONFIG_PAGES2 (sizeof(sections2)/sizeof(sections2[0]) - 2) // ignore sentinel and GEN + + +int +concatenateSasFirmwareNvdata(void) +{ + int file; + char name[256]; + unsigned char *imageBuf = NULL; + int imageLen; + unsigned char *nvdataBuf = NULL; + int nvdataLen; + int len; + int n; + char *buf; + MpiFwHeader_t *fwHeader; + Mpi2FWImageHeader_t *fwHeader2; + MpiExtImageHeader_t *fwExtImageHeader; + Mpi2ExtImageHeader_t *fwExtImageHeader2; + Mpi2SupportedDevicesData_t *fwSupportedDevices = NULL; + MpiExtImageHeader_t *fwNvdataHeader = NULL; + Mpi2InitImageFooter_t *fwFooter; + U32 fwNextImage; + U32 fwLastImage = 0; + int i; + int t; + U32 checksum; + SECTION *section; + ITEM *item; + U8 *nvdata; + int length; + int headOff; + int pageOff; + CONFIG_DIR_HEADER *cdh; + CONFIG_DIR_HEADER2 *cdh2; + CONFIG_PROD_ID *cpi; + CONFIG_DIR_ENTRY *cde; + CONFIG_DIR_ENTRY2 *cde2; + PERSISTENT_PAGE_HEADER *pph; + PERSISTENT_PAGE_HEADER2 *pph2; + U8 page[512]; + U8 update; + int header; + char *c1; + char *c2; + int pageType; + int pageNumber; + int pageLength; + int offset; + int size; + int fwFamily; + int fwDeviceId1 = 0; + int fwDeviceId2 = 0; + int nvDeviceId; + int fwVersion; + int nvVersion; + int mpi1; + int mpi2; + int ncp; + int npcp; + ITEM *section_items; + int section_size; + + n = getFileName(name, sizeof name, stdin, "firmware", 0); + if (n > 0) + { + if (readFile(name, &imageBuf, &imageLen) != 1) + return 0; + } + else + { + printf("Image won't be processed\n"); + return 1; + } + + printf("Read %d bytes from file %s\n", imageLen, name); + + checksum = 0; + for (i = 0; i < imageLen / 4; i++) + checksum += get32x(((U32 *)imageBuf)[i]); + + if (checksum != 0) + { + printf("Image's checksum is invalid!\n"); + free(imageBuf); + return 0; + } + + fwHeader = (pMpiFwHeader_t)imageBuf; + fwHeader2 = (pMpi2FWImageHeader_t)fwHeader; + + mpi1 = get32(fwHeader->Signature0) == MPI_FW_HEADER_SIGNATURE_0 && + get32(fwHeader->Signature1) == MPI_FW_HEADER_SIGNATURE_1 && + get32(fwHeader->Signature2) == MPI_FW_HEADER_SIGNATURE_2; + + mpi2 = get32(fwHeader2->Signature0) == MPI2_FW_HEADER_SIGNATURE0 && + get32(fwHeader2->Signature1) == MPI2_FW_HEADER_SIGNATURE1 && + get32(fwHeader2->Signature2) == MPI2_FW_HEADER_SIGNATURE2; + + if (!mpi1 && !mpi2) + { + printf("Image's signatures are invalid!\n"); + free(imageBuf); + return 0; + } + + fwExtImageHeader = NULL; + + len = get32(fwHeader->ImageSize); + fwNextImage = get32(fwHeader->NextImageHeaderOffset); + while (fwNextImage != 0) + { + if (fwNextImage > imageLen - sizeof *fwExtImageHeader) + { + printf("Image's NextImageHeaderOffset field is invalid!\n"); + free(imageBuf); + return 0; + } + + fwExtImageHeader = (pMpiExtImageHeader_t)(imageBuf + fwNextImage); + fwExtImageHeader2 = (pMpi2ExtImageHeader_t)fwExtImageHeader; + + if (fwExtImageHeader->ImageType == MPI_EXT_IMAGE_TYPE_NVDATA) + { + if (mpi1) + fwLastImage = fwNextImage; + + fwNvdataHeader = fwExtImageHeader; + + if (get32(fwExtImageHeader->NextImageHeaderOffset) != 0 || + get32(fwExtImageHeader->ImageSize) != sizeof(MpiExtImageHeader_t)) + { + printf("Image's attached NVDATA is incorrectly formed!\n"); + free(imageBuf); + return 0; + } + } + + if (fwExtImageHeader->ImageType == MPI2_EXT_IMAGE_TYPE_SUPPORTED_DEVICES) + { + fwSupportedDevices = (pMpi2SupportedDevicesData_t)(fwExtImageHeader2 + 1); + } + + len += get32(fwExtImageHeader->ImageSize); + fwNextImage = get32(fwExtImageHeader->NextImageHeaderOffset); + + if (fwExtImageHeader->ImageType == MPI2_EXT_IMAGE_TYPE_BOOTLOADER) + { + if (mpi2) + fwLastImage = fwNextImage; + } + } + + if (len != imageLen) + { + printf("Image's length is invalid!\n"); + free(imageBuf); + return 0; + } + + if (mpi1) + { + if (fwNvdataHeader == NULL) + { + printf("Image's attached NVDATA is missing!\n"); + free(imageBuf); + return 0; + } + + printf("\nFirmware is %s for %X\n", fwHeader->VersionName, get32(fwHeader->SeqCodeVersion)); + + fwFamily = get16(fwHeader->ProductId) & MPI_FW_HEADER_PID_FAMILY_MASK; + + switch (fwFamily) + { + case MPI_FW_HEADER_PID_FAMILY_1064_SAS: + fwDeviceId1 = MPI_MANUFACTPAGE_DEVID_SAS1064; + break; + case MPI_FW_HEADER_PID_FAMILY_1068_SAS: + fwDeviceId1 = MPI_MANUFACTPAGE_DEVID_SAS1068; + break; + case MPI_FW_HEADER_PID_FAMILY_1078_SAS: + fwDeviceId1 = MPI_MANUFACTPAGE_DEVID_SAS1078; + break; + case MPI_FW_HEADER_PID_FAMILY_106xE_SAS: + fwDeviceId1 = MPI_MANUFACTPAGE_DEVID_SAS1064E; + fwDeviceId2 = MPI_MANUFACTPAGE_DEVID_SAS1068E; + break; + } + + if (fwDeviceId2) + printf("Firmware ProductId Family is %x, DeviceId is %X/%X\n", + get16(fwHeader->ProductId) & MPI_FW_HEADER_PID_FAMILY_MASK, fwDeviceId1, fwDeviceId2); + else + printf("Firmware ProductId Family is %x, DeviceId is %X\n", + get16(fwHeader->ProductId) & MPI_FW_HEADER_PID_FAMILY_MASK, fwDeviceId1); + + fwVersion = (get32(fwHeader->ArmBranchInstruction1) >> 8) & 0xff; + printf("Firmware NVDATA Version is %x\n", fwVersion); + + if (fwVersion != 0x25 && fwVersion != 0x28 && fwVersion != 0x29 && + fwVersion != 0x2b && fwVersion != 0x2d) + { + printf("Expecting Version 25, 28, 29, 2B, or 2D -- can't process this image!\n"); + free(imageBuf); + return 0; + } + } + else + { + if (fwNvdataHeader != NULL) + { + printf("Image's NVDATA is already attached!\n"); + free(imageBuf); + return 0; + } + + if (fwLastImage == 0) + { + printf("Image's BootLoader is missing!\n"); + free(imageBuf); + return 0; + } + + if (fwSupportedDevices == NULL) + { + printf("Image's Supported Device List is missing!\n"); + free(imageBuf); + return 0; + } + + if (fwSupportedDevices->NumberOfDevices == 0) + { + printf("Image's Supported Device List is empty!\n"); + free(imageBuf); + return 0; + } + + printf("\nFirmware is %s\n", fwHeader2->FirmwareVersionName); + for (i = 0; i < fwSupportedDevices->NumberOfDevices; i++) + { + if (fwSupportedDevices->SupportedDevice[i].LowPCIRev == + fwSupportedDevices->SupportedDevice[i].HighPCIRev) + { + printf("Firmware supports DeviceId %X, RevisionId %X\n", + get16(fwSupportedDevices->SupportedDevice[i].DeviceID), + fwSupportedDevices->SupportedDevice[i].LowPCIRev); + } + else + { + printf("Firmware supports DeviceId %X, RevisionId %X to %X\n", + get16(fwSupportedDevices->SupportedDevice[i].DeviceID), + fwSupportedDevices->SupportedDevice[i].LowPCIRev, + fwSupportedDevices->SupportedDevice[i].HighPCIRev); + } + } + + fwVersion = (get32(fwHeader2->NVDATAVersion.Word) >> 8) & 0xff; + if (fwVersion == 0x25) // sfs + { + printf("Expecting Version 30, found 25 -- you can slide for now\n"); + fwVersion = 0x30; + } + printf("Firmware NVDATA Version is %x\n", fwVersion); + + if (fwVersion != 0x30) + { + printf("Expecting Version 30 -- can't process this image!\n"); + free(imageBuf); + return 0; + } + } + + printf("\n"); + n = getFileName(name, sizeof name, stdin, "NVDATA", 1); + if (n > 0) + { + if (readFile(name, &nvdataBuf, &nvdataLen) != 1) + { + free(imageBuf); + return 0; + } + } + else + { + printf("Image won't be processed\n"); + free(imageBuf); + return 1; + } + + printf("Read %d bytes from file %s\n", nvdataLen, name); + + n = nvdataLen; + buf = realloc(nvdataBuf, n + 2); + if (n && buf[n-1] != '\n') + { + nvdataLen++; + buf[n++] = '\n'; + } + buf[n] = '\0'; + + n = 0; + for (i = 0; i < nvdataLen; i++) + { + if (buf[i] == '\0' || buf[i] == '\r') // NUL and CR are ignored + continue; + + if (buf[i] == ';') // lines starting with ; are ignored + { + while (buf[i] != '\n' && i < nvdataLen) + i++; + } + + if (n) + { + if (buf[i] == '\n' && buf[n-1] == '\n') // blank lines are ignored + continue; + + if (buf[i] == ' ' && buf[n-1] == '\n') // leading spaces are ignored + continue; + + while (buf[i] == '\n' && buf[n-1] == ' ') // trailing spaces are ignored + n--; + } + else + { + if (buf[i] == '\n') // blank lines are ignored + continue; + + if (buf[i] == ' ') // leading spaces are ignored + continue; + } + + buf[n++] = buf[i]; + } + buf[n] = '\0'; + + if (sscanf(buf, "SASDATA_VERSION_CHECK=%x", &nvVersion) == 1) + { + printf("\nNVDATA Version is %x\n", nvVersion); + if (fwVersion != nvVersion) + { + printf("Firmware Version does not match NVDATA Version, can't process this NVDATA file!\n"); + free(imageBuf); + free(buf); + return 0; + } + } + + removeLine(buf); + + nvdata = malloc(NVDATA_SIZE); + memset(nvdata, 0, NVDATA_SIZE); + + length = 0; + headOff = 0; + + cdh = (CONFIG_DIR_HEADER *)(nvdata + headOff); + if (mpi1) + { + cdh->Signature = set32(CONFIG_DIR_HEADER_SIGNATURE); + cdh->State = CONFIG_DIR_HEADER_STATE_VALID; + cdh->CdhSize = sizeof *cdh / 4; + cdh->CdeSize = sizeof *cde / 4; + cdh->PphSize = sizeof *pph / 4; + cdh->ProdIdSize = sizeof *cpi / 4; + + length += sizeof *cdh; + headOff += sizeof *cdh; + } + else + { + cdh2 = (CONFIG_DIR_HEADER2 *)cdh; + + cdh2->Signature = set32(CONFIG_DIR_HEADER_SIGNATURE); + cdh2->State = CONFIG_DIR_HEADER_STATE_VALID; + cdh2->CdhSize = sizeof *cdh2 / 4; + cdh2->CdeSize = sizeof *cde2 / 4; + cdh2->PphSize = sizeof *pph2 / 4; + cdh2->ProdIdSize = sizeof *cpi / 4; + cdh2->NvdataVersion = set16(MPI2_VERSION); + cdh2->ProductIdOffset = set16(cdh2->CdhSize); + cdh2->DirEntryOffset = set16(cdh2->CdhSize + cdh->ProdIdSize); + + length += sizeof *cdh2; + headOff += sizeof *cdh2; + } + + ncp = 0; + npcp = 0; + + n = mpi1 ? sizeof *cde * NUM_CONFIG_PAGES : sizeof *cde2 * NUM_CONFIG_PAGES2; + + pageOff = length + sizeof *cpi + n; + + if (nvVersion < 0x2d) + pageOff -= sizeof *cde; // skipping BIOSPage4 + + for (section = (mpi1 ? sections : sections2); section->name; section++) + { + section_items = section->items; + section_size = section->size; + + if (nvVersion < 0x28) + { + if (section_items == manufacturing_page_5_items) + { + section_items = manufacturing_page_5_items_25; + section_size = manufacturing_page_5_size_25; + } + } + + if (nvVersion < 0x29) + { + if (section_items == io_unit_page_3_items) + { + section_size = io_unit_page_3_size_25; + } + } + + if (nvVersion < 0x2d) + { + if (section_items == bios_page_4_items) + { + continue; + } + } + + memset(page, 0, sizeof page); + + if (section->flags & GEN) + { + for (item = section_items; item->name; item++) + { + getSectionItem(section, item, buf, page); + } + + cpi = (CONFIG_PROD_ID *)(nvdata + headOff); + memcpy(cpi->VendorId, ((pGeneralData_t)page)->VendorId, sizeof cpi->VendorId); + memcpy(cpi->ProductId, ((pGeneralData_t)page)->ProductId, sizeof cpi->ProductId); + memcpy(cpi->ProductRevision, ((pGeneralData_t)page)->ProductRevision, sizeof cpi->ProductRevision); + cpi->Signature = set32(CONFIG_PROD_ID_SIGNATURE); + + cdh->NvdataVersion = set16((nvVersion << 8) | ((pGeneralData_t)page)->UserVersion); + + length += sizeof *cpi; + headOff += sizeof *cpi; + + continue; + } + + getSectionItem(section, &forceupdate_item, buf, &update); + + if (section->flags & EXT) + { + for (item = ext_header_items; item->name; item++) + { + t = getSectionItem(section, item, buf, page); + } + } + else + { + for (item = header_items; item->name; item++) + { + t = getSectionItem(section, item, buf, page); + } + } + + for (item = section_items; item->name; item++) + { + if (item->flags & MPI1 && !mpi1) + continue; + if (item->flags & MPI2 && !mpi2) + continue; + t = getSectionItem(section, item, buf, page); + if (t == 1) + if (item->flags & DUP) + item++; + } + + getSectionItem(section, &special_item, buf, page); + + if (section->flags & EXT) + { + pageType = ((pConfigExtendedPageHeader_t)page)->ExtPageType; + pageNumber = ((pConfigExtendedPageHeader_t)page)->PageNumber; + pageLength = get16(((pConfigExtendedPageHeader_t)page)->ExtPageLength); + header = sizeof(ConfigExtendedPageHeader_t); + size = section_size / 4; + if (size != pageLength && yesFlag == TRUE) + printf("incorrect EXT_PAGE_LENGTH %x vs. %x for %s\n", pageLength, size, section->name); + } + else + { + pageType = ((pConfigPageHeader_t)page)->PageType & MPI_CONFIG_PAGETYPE_MASK; + pageNumber = ((pConfigPageHeader_t)page)->PageNumber; + pageLength = ((pConfigPageHeader_t)page)->PageLength; + header = sizeof(ConfigPageHeader_t); + size = section_size / 4; + if (size != pageLength && yesFlag == TRUE) + printf("incorrect PAGE_LENGTH %x vs. %x for %s\n", pageLength, size, section->name); + } + + if (section->flags & PID) + offset = 0x7fff; + else + offset = pageOff / 4; + + size = (section_size - header) / 4; + + cde = (CONFIG_DIR_ENTRY *)(nvdata + headOff); + if (mpi1) + { +#if !__linux__ && !__sparc__ + // safe to use bit field definitions on little-endian machines + cde->State = CONFIG_DIR_ENTRY_STATE_IN_USE; + cde->PageType = pageType; + cde->PageNum = pageNumber; + cde->AllocUnits = size; + cde->ForceNvdataUpdate = update; + cde->DwordOffset = offset; +#else + // can't use bit field definitions on big-endian machines + ((U8 *)cde)[0] = (U8)(CONFIG_DIR_ENTRY_STATE_IN_USE | ((size & 0x00f) << 4)); + ((U8 *)cde)[1] = (U8)((size & 0xff0) >> 4); + ((U8 *)cde)[2] = (U8)(pageType & 0xff); + ((U8 *)cde)[3] = (U8)(((update & 1) << 4) | (pageNumber & 0xf)); + ((U8 *)cde)[4] = (U8)(offset & 0x00ff); + ((U8 *)cde)[5] = (U8)((offset & 0x7f00) >> 8); +#endif + n = sizeof *cde; + } + else + { + cde2 = (CONFIG_DIR_ENTRY2 *)cde; + cde2->State = CONFIG_DIR_ENTRY_STATE_IN_USE; + cde2->PageType = pageType; + cde2->PageNum = pageNumber; + cde2->AllocUnits = set16(size); + cde2->UpdateFlags = update; + cde2->DwordOffset = set32(offset); + n = sizeof *cde2; + } + + length += n; + headOff += n; + + ncp++; + if (((pConfigPageHeader_t)page)->PageType & MPI_CONFIG_PAGEATTR_PERSISTENT) + npcp++; + + if (section->flags & PID) + { + continue; + } + + if (section->flags & MP2) + { + nvDeviceId = get16(((pManufacturingPage2_SAS_t)page)->ChipId.DeviceID); + + printf("NVDATA DeviceId is %X\n", nvDeviceId); + if (mpi1) + { + if (nvDeviceId != fwDeviceId1 && nvDeviceId != fwDeviceId2) + { + printf("\nNVDATA DeviceId does not match Firmware DeviceId!\n"); + free(imageBuf); + free(nvdata); + return 0; + } + } + else + { + for (i = 0; i < fwSupportedDevices->NumberOfDevices; i++) + { + if (nvDeviceId == get16(fwSupportedDevices->SupportedDevice[i].DeviceID)) + break; + } + if (i == fwSupportedDevices->NumberOfDevices) + { + printf("\nNVDATA DeviceId does not match any Firmware DeviceId!\n"); + free(imageBuf); + free(nvdata); + return 0; + } + } + + if (mpi1) + { + ((pManufacturingPage2_SAS_t)page)->AutoDownloadChecksum = 0xa5; + checksum = 0; + for (i = 8; i < 38; i++) + checksum -= page[i]; + ((pManufacturingPage2_SAS_t)page)->AutoDownloadChecksum = (U8)checksum; + } + } + + pph = (PERSISTENT_PAGE_HEADER *)(nvdata + pageOff); + pph->State = CONFIG_PERSISTENT_HEADER_STATE_UPDATE_COMPLETE; + pph->Checksum = pageChecksum(page, section_size, header); + + if (mpi1) + { + pph->DwordOffset = set16(0x7fff); + n = sizeof *pph; + } + else + { + pph2 = (PERSISTENT_PAGE_HEADER2 *)pph; + pph2->DwordOffset = set32(0xffffffff); + n = sizeof *pph2; + } + + length += n; + pageOff += n; + + memcpy(nvdata + pageOff, page + header, section_size - header); + + length += section_size - header; + pageOff += section_size - header; + } + + cdh->TotalBytes = set16(length); + cdh->NbrDirEntries = set32(ncp); + cdh->NbrPersistDirEntries = set32(npcp); + + c1 = buf; + while (*c1) + { + if (strncmp(c1, "SECTION", 7) == 0) + { + c2 = skipLine(c1); + + if (*c2 == '\0' || strncmp(c2, "SECTION", 7) == 0) + { + removeLine(c1); + continue; + } + + if (*c2 == '\0' || strncmp(c2, "END_SECTION", 11) == 0) + { + removeLine(c1); + removeLine(c1); + continue; + } + } + + c1 = skipLine(c1); + } + + if (strlen(buf)) + { + printf("\nExtra lines found in NVDATA file!\n"); + printf("----\n%s----\n", buf); + } + + free(buf); + + printf("\n"); + n = getFileName(name, sizeof name, stdin, "output", 2); + if (n > 0) + { + file = open(name, O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0644); + if (file < 0) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + free(imageBuf); + free(nvdata); + return 0; + } + } + else + { + printf("Image won't be saved\n"); + free(imageBuf); + free(nvdata); + return 1; + } + + if (mpi2) + n = sizeof(Mpi2ExtImageHeader_t); + else + n = 0; + + imageBuf = realloc(imageBuf, imageLen + length + n); + + fwExtImageHeader = (pMpiExtImageHeader_t)(imageBuf + fwLastImage); + + if (mpi2) + { + fwExtImageHeader2 = (pMpi2ExtImageHeader_t)fwExtImageHeader; + + for (i = imageLen - 1; i >= (int)fwLastImage; i--) + imageBuf[i + length + n] = imageBuf[i]; + + memset(fwExtImageHeader2, 0, n); + + fwExtImageHeader2->ImageType = MPI2_EXT_IMAGE_TYPE_NVDATA; + fwExtImageHeader2->ImageSize = set32(n); + fwExtImageHeader2->NextImageHeaderOffset = set32(fwLastImage); + strcpy((char *)fwExtImageHeader2->IdentifyString, "@(#)NVDATA"); + + checksum = 0; + for (i = 0; i < n / 4; i++) + checksum -= get32x(((U32 *)fwExtImageHeader2)[i]); + + fwExtImageHeader2->Checksum = set32(checksum); + + memcpy(imageBuf + fwLastImage + n, nvdata, length); + } + else + { + memcpy(imageBuf + imageLen, nvdata, length); + } + + checksum = get32(fwExtImageHeader->Checksum); + + len = get32(fwExtImageHeader->ImageSize); + fwExtImageHeader->ImageSize = set32(len + length); + + checksum -= length; + for (i = 0; i < (length + 3) / 4; i++) + checksum -= get32x(((U32 *)nvdata)[i]); + + fwExtImageHeader->Checksum = set32(checksum); + + while ((fwNextImage = get32(fwExtImageHeader->NextImageHeaderOffset)) != 0) + { + checksum = get32(fwExtImageHeader->Checksum); + + fwNextImage += length + n; + checksum -= length + n; + + fwExtImageHeader->NextImageHeaderOffset = set32(fwNextImage); + fwExtImageHeader->Checksum = set32(checksum); + + fwExtImageHeader = (pMpiExtImageHeader_t)(imageBuf + fwNextImage); + + fwLastImage = fwNextImage; + } + + if (fwExtImageHeader->ImageType == MPI2_EXT_IMAGE_TYPE_INITIALIZATION) + { + len = get32(fwExtImageHeader->ImageSize); + + fwFooter = (pMpi2InitImageFooter_t)(imageBuf + fwLastImage + len) - 1; + + len = get32(fwFooter->ImageSize); + checksum = get32(fwExtImageHeader->Checksum); + + checksum += len; + + // the footer's ImageSize is big-endian! + len = swap32(len); + len += length + n; + len = swap32(len); + checksum -= len; + + fwFooter->ImageSize = set32(len); + fwExtImageHeader->Checksum = set32(checksum); + } + + t = write(file, imageBuf, imageLen + length + n); + if (t != imageLen + length + n) + { + printf("Write failed for file %s, t = %x\n", name, t); + perror("Error is"); + close(file); + free(imageBuf); + free(nvdata); + return 0; + } + + printf("Wrote %d bytes to file %s\n", imageLen + length + n, name); + + close(file); + + free(imageBuf); + free(nvdata); + + return 1; +} + + +#endif + + +char * +getSasProductId(char *nvdata) +{ + CONFIG_DIR_HEADER *cdh; + CONFIG_PROD_ID *cpi; + + cdh = (CONFIG_DIR_HEADER *)nvdata; + + cpi = (CONFIG_PROD_ID *)((char *)cdh + cdh->CdhSize * 4); + + return (char *)cpi->ProductId; +} + + +int +selectAltaDevice(MPT_PORT *port, int *dev_bus, int *dev_target) +{ + int bus; + int target; + unsigned char inq[36]; + unsigned char inqvpd[600]; + int i; + int n; + + if (kFlag == TRUE) + { + if (port->maxBuses > 1 || gFlag == TRUE) + { + printf("Bus: [0-%d or RETURN to quit] ", port->maxBuses - 1); + bus = getNumberAnswer(0, port->maxBuses - 1, -1); + if (bus < 0) + return 0; + } + else + { + bus = 0; + } + + printf("Target: [0-%d or RETURN to quit] ", port->maxTargets - 1); + target = getNumberAnswer(0, port->maxTargets - 1, -1); + if (target < 0) + return 0; + + *dev_bus = bus; + *dev_target = target; + + return 1; + } + + showPortInfoHeader(port); + + printf(" B___T Type Vendor Product Rev\n"); + + n = 0; + for (bus = 0; bus < port->maxBuses; bus++) + { + for (target = port->minTargets; target < port->maxTargets; target++) + { + if (doInquiry(port, bus, target, 0, inq, sizeof inq) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if (doInquiryVpdPage(port, bus, target, 0, 0x89, inqvpd, sizeof inqvpd) != 1) + { +#if __linux__ || DOS || EFI + if (errno == EFAULT) + return 0; +#endif + continue; + } + + if ((inq[0] & 0x1f) == 0x1f) + continue; + + if ((inq[0] & 0xe0) == 0x20) + continue; + + if ((inq[0] & 0xe0) == 0x60) + continue; + + if ((strncmp((char *)inqvpd+8, "LSI", 3) != 0) || + (strncmp((char *)inqvpd+16, "LSISS25x0", 9) != 0)) + continue; + + for (i = 8; i < 36; i++) + if (!isprint(inq[i])) + inq[i] = ' '; + + diag_targets[n].bus = bus; + diag_targets[n].target = target; + + n++; + + printf("%2d. %2d %3d %-9s %-8.8s %-16.16s %-4.4s\n", + n, bus, target, deviceType[inq[0] & 0x1f], + inq+8, inq+16, inq+32); + + if (n == MAX_DEVICES) + break; + } + if (n == MAX_DEVICES) + break; + } + + if (n == 0) + { + printf("\nNo devices are available for this test\n"); + return 0; + } + + printf("\nSelect a device: [1-%d or RETURN to quit] ", n); + n = getNumberAnswer(1, n, 0); + if (n == 0) + return 0; + n--; + + bus = diag_targets[n].bus; + target = diag_targets[n].target; + + *dev_bus = bus; + *dev_target = target; + + return 1; +} + + +int +doAltaDiagnostics(MPT_PORT *port, int command) +{ + int t; + + if (bringOnline(port) != 1) + return 0; + + switch (command) + { + case 1: + t = doAltaProgramManufacturingInfo(port); + if (t == 1) + printf("Programming completed successfully.\n"); + else + printf("Programming completed with errors.\n"); + if (wFlag) + fprintf(logFile, "%s: Alta Program Manufacturing Information: %s\n", + logPrefix(port), t ? "PASS" : "FAIL"); + break; + case 2: + doAltaDisplayManufacturingInfo(port); + break; + case 3: + doResetAlta(port); + break; + default: + printf("Invalid selection!\n"); + break; + } + + return 1; +} + + +int +doAltaProgramManufacturingInfo(MPT_PORT *port) +{ + char name[256]; + unsigned char *identityBuf = NULL; + int identityLen; + int n; + int t; + char wwid[64]; + char serial[64]; + char mfgdate[64]; + char rwkdate[64]; + char partnum[64]; + char tmpstr[64]; + int skipmfg = FALSE; + int skiprwk = FALSE; + int skipwwid = FALSE; + unsigned char data[255]; + U32 wwidl; + U32 wwidh; + int bus; + int target; + char *c; + int foundOne; + int passed; + U32 wwidlChk; + U32 wwidhChk; + int wwidError = TRUE; + + *serial = 0; + *mfgdate = 0; + *rwkdate = 0; + *partnum = 0; + *wwid = 0; + + if (gFlag) + { + printf("\nError if WWID not found in config? [Yes or No, default is Yes] "); + n = getYesNoAnswer(1); + if (n==0) + { + wwidError = FALSE; + } + } + + if (selectAltaDevice(port, &bus, &target) != 1) + return 0; + + n = getFileName(name, sizeof name, stdin, "Alta parameters", 0); + if (n > 0) + { + if (readFile(name, &identityBuf, &identityLen) != 1) + { + return 0; + } + + printf("%d bytes read from %s\n\n", identityLen, name); + + /* start processing the file data one line at a time */ + c = (char *)identityBuf; + while (!*wwid || !*serial || !*partnum || !*mfgdate || !*rwkdate) + { + foundOne = FALSE; + if (strncmp(c, "WWN=", 4) == 0) + { + // Check to see if "WWN=" is in the file (null value). + // If that's the case, then we need to check + // line endings to move 'c' forward the appropriate + // amount. Otherwise, `sscanf(c + 4, "%s", wwid);` + // will simply load the next line, which is + // definitely not what we want. + if(strncmp(c,"WWN=\n", 5) == 0) + { + wwid[0] = '\0'; + c += 5; + } + else if (strncmp(c,"WWN=\r\n", 6) == 0) + { + wwid[0] = '\0'; + c += 6; + } + else + { + sscanf(c + 4, "%s", wwid); + c = strchr(c + 1, '\n'); + if (c) + c++; + else + break; + } + } + if (strncmp(c, "SN=", 3) == 0) + { + foundOne = TRUE; + sscanf(c + 3, "%s", serial); + c = strchr(c + 1, '\n'); + if (c) + c++; + else + break; + } + if (strncmp(c, "PARTNUM=", 8) == 0) + { + foundOne = TRUE; + // Fix for a customer to allow the format "PARTNUM=P/N TCA-00347-01-A" + if(strncmp(c + 8, "P/N ", 4) == 0) + { + sscanf(c + 8 + 4, "%s", partnum); + } + else + { + sscanf(c + 8, "%s", partnum); + } + + c = strchr(c + 1, '\n'); + if (c) + c++; + else + break; + } + if (strncmp(c, "MFGDATE=", 8) == 0) + { + foundOne = TRUE; + sscanf(c + 8, "%s", mfgdate); + c = strchr(c + 1, '\n'); + if (c) + c++; + else + break; + } + if (strncmp(c, "RWKDATE=", 8) == 0) + { + foundOne = TRUE; + sscanf(c + 8, "%s", rwkdate); + c = strchr(c + 1, '\n'); + if (c) + c++; + else + break; + } + + /* if we didn't find a required key, see if any more lines are available to check */ + if (!foundOne) + { + c = strchr(c, '\n'); + if (c) + c++; + else + break; + } + } + + if( (wwidError==FALSE) && (!*wwid || strlen(wwid) == 0 ) ) + skipwwid = TRUE; + + if ((!skipwwid && !wwid) || !*serial || !*partnum || !*mfgdate || !*rwkdate) + { + printf("Parameters file missing required keys:%s%s%s%s%s\n", + !skipwwid && !*wwid ? " WWN" : "", !*serial ? " SN" : "", + !*partnum ? " PARTNUM" : "", !*mfgdate ? " MFGDATE" : "", + !*rwkdate ? " RWKDATE" : ""); + if (wFlag) + fprintf(logFile, "%s: Parameters file missing required keys:%s%s%s%s%s\n", + logPrefix(port), !skipwwid && !*wwid ? " WWN" : "", !*serial ? " SN" : "", + !*partnum ? " PARTNUM" : "", !*mfgdate ? " MFGDATE" : "", + !*rwkdate ? " RWKDATE" : ""); + return 0; + } + + if (skipwwid == FALSE && (strlen(wwid) != 9 || + sscanf(wwid, "%x", &t) != 1 || sscanf(wwid + 8, "%x", &t) != 1)) + { + printf("Alta WWN value <%s> is invalid!\n", wwid); + if (wFlag) + fprintf(logFile, "%s: Alta WWN value <%s> is invalid: FAIL\n", + logPrefix(port), wwid); + *wwid = 0; + } + if (strlen(serial) > 16) + { + printf("Alta SN value <%s> is invalid!\n", serial); + if (wFlag) + fprintf(logFile, "%s: Alta SN value <%s> is invalid: FAIL\n", + logPrefix(port), serial); + *serial = 0; + } + if (strlen(mfgdate) != 8 || sscanf(mfgdate, "%x", &t) != 1) + { + printf("Alta MFGDATE value <%s> is invalid!\n", mfgdate); + if (wFlag) + fprintf(logFile, "%s: Alta MFGDATE value <%s> is invalid: FAIL\n", + logPrefix(port), mfgdate); + *mfgdate = 0; + } + if (strlen(rwkdate) != 8 || sscanf(rwkdate, "%x", &t) != 1) + { + printf("Alta RWKDATE value <%s> is invalid!\n", rwkdate); + if (wFlag) + fprintf(logFile, "%s: Alta RWKDATE value <%s> is invalid: FAIL\n", + logPrefix(port), rwkdate); + *rwkdate = 0; + } + if (strlen(partnum) > 16) + { + printf("Alta PARTNUM value <%s> is invalid!\n", partnum); + if (wFlag) + fprintf(logFile, "%s: Alta PARTNUM value <%s> is invalid: FAIL\n", + logPrefix(port), partnum); + *partnum = 0; + } + + free(identityBuf); + } + else + { + printf("The Alta's manufacturing information will not be updated!\n\n"); + } + + if ((!skipwwid && !*wwid) || !*serial || !*partnum || !*mfgdate || !*rwkdate) + return 0; + + if (strncmp(mfgdate, "00000000", 8) == 0) + skipmfg = TRUE; + if (strncmp(rwkdate, "00000000", 8) == 0) + skiprwk = TRUE; + + printf("Alta WWN .......... %s%s\n", wwid, skipwwid == TRUE ? " (Will not be changed)" : ""); + printf("Alta SN ........... %s\n", serial); + printf("Alta MFGDATE ...... %s%s\n", mfgdate, skipmfg == TRUE ? " (Will not be changed)" : ""); + printf("Alta RWKDATE ...... %s%s\n", rwkdate, skiprwk == TRUE ? " (Will not be changed)" : ""); + printf("Alta PARTNUM ...... %s\n", partnum); + + if (yesFlag == FALSE) + { + printf("\nAre these values correct? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + { + return 0; + } + } + + if (wFlag) + { + fprintf(logFile, "%s: Alta WWN .......... %s\n", logPrefix(port), wwid); + fprintf(logFile, "%s: Alta SN ........... %s\n", logPrefix(port), serial); + fprintf(logFile, "%s: Alta MFGDATE ...... %s%s\n", logPrefix(port), mfgdate, + skipmfg == TRUE ? " (Will not be changed)" : ""); + fprintf(logFile, "%s: Alta RWKDATE ...... %s%s\n", logPrefix(port), rwkdate, + skiprwk == TRUE ? " (Will not be changed)" : ""); + fprintf(logFile, "%s: Alta PARTNUM ...... %s\n", logPrefix(port), partnum); + } + + /* start by assuming success */ + passed = TRUE; + + printf("\nProgramming Alta...\n"); + + // The WWID may not need to be programmed + if(skipwwid == FALSE) + { + /* program wwn */ + sscanf(wwid + 1, "%x", &wwidl); + wwid[1] = '\0'; + sscanf(wwid, "%x", &wwidh); + /* add the LSI prefix to the WWN */ + wwidh |= 0x500605b << 4; + + t = doModeSense(port, bus, target, 0, 0x32, 0, 0, data, sizeof data); + n = data[0] + 1; + + if ((t == 1) && (n >= 31)) + { + /* replace the current WWN with the value we are programming */ + put4bytes(data, 12+11, wwidh); + put4bytes(data, 12+15, wwidl); + + /* update the WWN gen type field */ + data[12+5] = (unsigned char)(data[12+5] | 1<<5); + + if (doModeSelect(port, bus, target, 0, 1, data, n) != 1) + { + printf("Mode select page 0x32 for programmed WWN failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Mode select page 0x32 for programmed WWN: FAIL\n", + logPrefix(port)); + passed = FALSE; + } + else + { + /* lets read it back and make sure it seems to have written correctly */ + memset(data, 0, sizeof data); + t = doModeSense(port, bus, target, 0, 0x32, 0, 0, data, sizeof data); + n = data[0] + 1; + + if ((t == 1) && (n >= 31)) + { + wwidhChk = get4bytes(data, 12+11); + wwidlChk = get4bytes(data, 12+15); + + if (wwidh != wwidhChk || wwidl != wwidlChk) + { + printf("Verify of programmed WWN failed! (found <%08x%08x>, expected <%08x%08x>)\n", + wwidhChk, wwidlChk, wwidh, wwidl); + if (wFlag) + fprintf(logFile, "%s: Mode sense verify of programmed WWN (found <%08x%08x>, expected <%08x%08x>): FAIL\n", + logPrefix(port), wwidhChk, wwidlChk, wwidh, wwidl); + passed = FALSE; + } + else + if (wFlag) + fprintf(logFile, "%s: Mode sense verify of programmed WWN: PASS\n", + logPrefix(port)); + } + else + { + printf("Mode sense page 0x32 for verify of programmed WWN failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Mode sense page 0x32 for verify of programmed WWN: FAIL\n", + logPrefix(port)); + passed = FALSE; + } + } + } + else + { + printf("Mode sense page 0x32 for programmed WWN failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Mode sense page 0x32 for programmed WWN: FAIL\n", + logPrefix(port)); + passed = FALSE; + } + } //skipwwid + + /* program serial number, part number, and dates */ + memset(data, 0, sizeof data); + + t = doLogSense(port, bus, target, 0, 0x35, 1, data, sizeof data); + n = get2bytes(data, 2) + 4; + + if ((t == 1) && (n >= 158)) + { + /* replace the current serial number with the value we are programming */ + strncpy((char *)(data+16), serial, strlen(serial)); // 16:31 + + /* pad the rest with spaces (20h) */ + memset((void *)(data+16+strlen(serial)), 0x20, 16 - strlen(serial)); + + /* replace the current part number with the value we are programming */ + strncpy((char *)(data+58), partnum, strlen(partnum)); // 58:73 + + /* pad the rest with spaces (20h) */ + memset((void *)(data+58+strlen(partnum)), 0x20, 16 - strlen(partnum)); + + if (skipmfg == FALSE) + { + /* mfg date is in ASCII in bytes 102-109 */ + strncpy((char *)(data+102), mfgdate, 8); + } + + if (skiprwk == FALSE) + { + /* rework date is in ASCII in bytes 118-125 */ + strncpy((char *)(data+118), rwkdate, 8); + } + + if (doLogSelect(port, bus, target, 0, 1, 1, data, n) != 1) + { + printf("Log select page 0x35 for programmed serial number, part number, and dates failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Log select page 0x35 for programmed serial number, part number, and dates: FAIL\n", + logPrefix(port)); + passed = FALSE; + } + else + { + /* lets read it back and make sure it seems to have written correctly */ + memset(data, 0, sizeof data); + + t = doLogSense(port, bus, target, 0, 0x35, 1, data, sizeof data); + n = get2bytes(data, 2) + 4; + + if ((t == 1) && (n >= 158)) + { + /* check the serial number */ + if (strncmp((char *)data+16, serial, strlen(serial)) != 0) + { + printf("Verify of programmed serial number failed! (found <%16.16s>, expected <%16.16s>)\n", + data+16, serial); + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed serial number (SN) (found <%10.10s>, expected <%10.10s>): FAIL\n", + logPrefix(port), data+16, serial); + passed = FALSE; + } + else + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed serial number (SN): PASS\n", + logPrefix(port)); + + /* check the manufacture date */ + if (skipmfg == FALSE) + { + if (strncmp((char *)data+102, mfgdate, 8) != 0) + { + printf("Verify of programmed manufacture date failed! (found <%8.8s>, expected <%8.8s>)\n", + data+102, mfgdate); + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed manufacture date (MFGDATE) (found <%8.8s>, expected <%8.8s>): FAIL\n", + logPrefix(port), data+102, mfgdate); + passed = FALSE; + } + else + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed manufacture date (MFGDATE): PASS\n", + logPrefix(port)); + } + else + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed manufacture date (unchanged) (MFGDATE): PASS\n", + logPrefix(port)); + + /* check the rework date */ + if (skiprwk == FALSE) + { + if (strncmp((char *)data+118, rwkdate, 8) != 0) + { + printf("Verify of programmed rework date failed! (found <%8.8s>, expected <%8.8s>)\n", + data+118, rwkdate); + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed rework date (RWKDATE) (found <%8.8s>, expected <%8.8s>): FAIL\n", + logPrefix(port), data+118, rwkdate); + passed = FALSE; + } + else + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed rework date (RWKDATE): PASS\n", + logPrefix(port)); + } + else + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed rework date (unchanged) (RWKDATE): PASS\n", + logPrefix(port)); + + /* check the part number */ + if (strncmp((char *)data+58, partnum, strlen(partnum)) != 0) + { + strncpy(tmpstr, (char *)data+58, strlen(partnum)); + tmpstr[strlen(partnum)] = '\0'; + printf("Verify of programmed part number failed! (found <%s>, expected <%s>)\n", + tmpstr, partnum); + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed part number (PARTNUM) (found <%s>, expected <%s>): FAIL\n", + logPrefix(port), tmpstr, partnum); + passed = FALSE; + } + else + if (wFlag) + fprintf(logFile, "%s: Log sense verify of programmed part number (PARTNUM): PASS\n", + logPrefix(port)); + } + else + { + printf("Log sense page 0x35 for verify of programmed serial number, part number, and dates failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Log sense page 0x35 for verify of programmed serial number, part number, and dates: FAIL\n", + logPrefix(port)); + passed = FALSE; + } + } +#if 0 //debug + t = doLogSense(port, bus, target, 0, 0x35, 1, data, sizeof data); + n = get2bytes(data, 2) + 4; + printf("written new log sense buffer:\n"); + displayByteData(data, n); +#endif + } + else + { + printf("Log sense page 0x35 for programmed serial number, part number, and dates failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Log sense page 0x35 for programmed serial number, part number, and dates: FAIL\n", + logPrefix(port)); + passed = FALSE; + } + + return passed; +} + + +int +doAltaDisplayManufacturingInfo(MPT_PORT *port) +{ + int bus; + int target; + unsigned char data[255]; + int t; + int n; + U32 wwn_h; + U32 wwn_l; + char tmpstr[64]; + int i; + + if (selectAltaDevice(port, &bus, &target) != 1) + return 0; + + t = doModeSense(port, bus, target, 0, 0x32, 0, 0, data, sizeof data); + n = data[0] + 1; + + if ((t == 1) && (n >= 12+19)) + { + wwn_h = get4bytes(data, 12+11); + wwn_l = get4bytes(data, 12+15); + } + else + { + wwn_h = 0; + wwn_l = 0; + printf("Read of mode page 0x32 for programmed WWN failed!\n"); + if (wFlag) + fprintf(logFile, "%s: read of mode page 0x32 for programmed WWN: FAIL\n", + logPrefix(port)); + } + + t = doLogSense(port, bus, target, 0, 0x35, 1, data, sizeof data); + n = get2bytes(data, 2) + 4; + + if ((t == 1) && (n >= 158)) + { + /* display the firmware version */ + strncpy(tmpstr, (char *)data+126, 12); + for (i = 0; i < 12; i++) + if ( tmpstr[i] == ' ') + break; + tmpstr[i] = '\0'; + + printf("Running firmware version is <%-s>\n", tmpstr); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - FWVERSION=%-s\n", + logPrefix(port), tmpstr); + + /* display the bootloader version */ + strncpy(tmpstr, (char *)data+138, 12); + for (i = 0; i < 12; i++) + if ( tmpstr[i] == ' ') + break; + tmpstr[i] = '\0'; + printf("Running bootloader version is <%-s>\n", tmpstr); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - BLVERSION=%-s\n", + logPrefix(port), tmpstr); + + /* display the WWN */ + printf("Programmed WWN is <%08x%08x>\n", wwn_h, wwn_l); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - WWN=%08x%08x\n", + logPrefix(port), wwn_h, wwn_l); + + /* display the serial number */ + printf("Programmed serial number is <%16.16s>\n", data+16); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - SN=%16.16s\n", + logPrefix(port), data+16); + + /* display the manufacturing date */ + printf("Programmed manufacture date is <%-8.8s>\n", data+102); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - MFGDATE=%-8.8s\n", + logPrefix(port), data+102); + + /* display the rework date */ + printf("Programmed rework date is <%-8.8s>\n", data+118); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - RWKDATE=%-8.8s\n", + logPrefix(port), data+118); + + /* display the part number */ + strncpy(tmpstr, (char *)data+58, 16); + for (i = 0; i < 16; i++) + if ( tmpstr[i] == ' ') + break; + tmpstr[i] = '\0'; + + printf("Programmed part number is <%-s>\n", tmpstr); + if (wFlag) + fprintf(logFile, "%s: AltaDisplayManufacturingInfo - PARTNUM=%-s\n", + logPrefix(port), tmpstr); + } + else + { + printf("Log sense page 0x35 for programmed serial number, part number, and dates failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Log sense page 0x35 for programmed serial number, part number, and dates: FAIL\n", + logPrefix(port)); + } + + return 1; +} + + +int +doResetAlta(MPT_PORT *port) +{ + int bus; + int target; + unsigned char data[128]; + int t; + int n; + + if (selectAltaDevice(port, &bus, &target) != 1) + return 0; + + t = doModeSense(port, bus, target, 0, 0x32, 0, 0, data, sizeof data); + n = data[0] + 1; + + if ((t == 1) && (n >= 12+6)) + { + /* set the reboot bit */ + data[12+5] = (unsigned char)(data[12+5] | 1<<3); + } + else + { + printf("Read of mode page 0x32 failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Read of mode page 0x32 for device reset: FAIL\n", + logPrefix(port)); + return 0; + } + + if (doModeSelect(port, bus, target, 0, 1, data, n) != 1) + { + printf("Write of mode select page 0x32 failed!\n"); + if (wFlag) + fprintf(logFile, "%s: Write of mode select page 0x32 for device reset: FAIL\n", + logPrefix(port)); + return 0; + } + + printf("Alta reset complete\n"); + return 1; +} + + +char * +translateExpanderEventCode(int code) +{ + switch (code) + { + case 1: return "POST_EVENT "; + case 2: return "SOD_EVENT "; + case 3: return "TSTAMP_RESET"; + case 4: return "FAULT_EVENT "; + case 5: return "WDOG_RESET "; + case 6: return "SES_EVENT "; + case 7: return "SCE_EVENT "; + case 0xFF: return "INVALID "; + } + + return "ERROR "; +} + + +int +decodeExpanderLogEntries(FILE *file, unsigned char *buf, int length) +{ + int offset; + U32 tstamp; + U32 eventid; + U8 size; + U8 pad; + int i; + + fprintf(file, "Timestamp Event Event Data\n"); + fprintf(file, "===============================================================================\n"); + + offset = 0; + while (offset < length) + { + /* timestamp is number of microseconds since start of day. This will wrap every 72 minutes or so. */ + tstamp = get32x(*(U32 *)&(buf[offset])); + if (tstamp == 0xffffffff) + break; + + offset += 4; + eventid = get32x(*(U32 *)&(buf[offset])); + offset += 4; + pad = (buf[offset] & 0xc0) >> 6; + /* data size is the size field minus the size field itself, the pad bytes, and the sizeClone field */ + size = ((buf[offset] & 0x3f) * 4) - 1 - pad - 1; + + /* move the offset to the start of the data bytes */ + offset++; + + fprintf(file, "%02d:%02d.%06d %12.12s ", tstamp / (60 * 1000 * 1000), + (tstamp % (60 * 1000 * 1000)) / (1000 * 1000), + tstamp % (1000 * 1000), + translateExpanderEventCode(eventid)); + + for (i=0; i < size; i++) + fprintf(file, "%c", buf[offset + i]); + + fprintf(file, "\n"); + offset += size + pad + 1; //the +1 is for the sizeClone field + } + return 1; +} + + +#define EXPANDER_LOG_SIGNATURE 0x74655065 + +int +doDisplayExpanderLogEntries(MPT_PORT *port) +{ + int bus; + int target; + FILE *file; + int n; + unsigned char desc[4]; + char name[256]; + int length; + int offset; + unsigned char *region1Buf = NULL; + int region1Len; + unsigned char *region2Buf = NULL; + int region2Len; + U32 r1Unused; + U32 r2Unused; + int r1Valid = TRUE; + int r2Valid = TRUE; + int firstEntryOffset; + int expanderType; + + if (selectExpander(port, &bus, &target, NULL, NULL, &expanderType) != 1) + return 0; + + if (expanderType != EXPANDER_TYPE_LSI_GEN1_YETI) + { + printf("This option is only supported on LSI SAS1 expanders (Yeti).\n"); + return 0; + } + + n = getFileName(name, sizeof name, stdin, "output", 0); + if (n > 0) + { + file = fopen(name, "w"); + if (file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + return 0; + } + } + else + { + printf("Event log won't be saved\n"); + return 1; + } + + /* read all the data from the first region */ + if (doReadBufferFull(port, bus, target, 0, 3, 6, 0, desc, sizeof desc) == 1) + { + region1Len = get3bytes(desc, 1); + if (region1Len == 0) + r1Valid = FALSE; + } + else + { + printf("Buffer 6 length is unknown, considering region 1 invalid\n"); + r1Valid = FALSE; + region1Len = 0; + } + + if (r1Valid) + { + length = CHUNK_SIZE; + + if (length > region1Len) + length = region1Len; + + region1Buf = (unsigned char *)malloc(region1Len); + + offset = 0; + while (TRUE) + { + if (doReadBufferFull(port, bus, target, 0, 2, 6, offset, region1Buf+offset, length) != 1) + { + printf("There as a problem reading buffer ID 6, considering region 1 invalid\n"); + r1Valid = FALSE; + break; + } + + offset += length; + if (offset >= region1Len) + break; + + if (length > region1Len - offset) + length = region1Len - offset; + } + } + + /* read all the data from the second region */ + if (doReadBufferFull(port, bus, target, 0, 3, 7, 0, desc, sizeof desc) == 1) + { + region2Len = get3bytes(desc, 1); + if (region2Len == 0) + r2Valid = FALSE; + } + else + { + printf("Buffer 7 length is unknown, considering region 2 invalid\n"); + r2Valid = FALSE; + region2Len = 0; + } + + if (r2Valid) + { + length = CHUNK_SIZE; + + if (length > region2Len) + length = region2Len; + + region2Buf = (unsigned char *)malloc(region2Len); + + offset = 0; + while (TRUE) + { + if (doReadBufferFull(port, bus, target, 0, 2, 7, offset, region2Buf+offset, length) != 1) + { + printf("There as a problem reading buffer ID 7, considering region 2 invalid\n"); + r2Valid = FALSE; + break; + } + + offset += length; + if (offset >= region2Len) + break; + + if (length > region2Len - offset) + length = region2Len - offset; + } + } + + if (!r1Valid || get32x(*(U32 *)&(region1Buf[0])) != EXPANDER_LOG_SIGNATURE) + { + printf("Region 1 does not have a valid event log signature\n"); + fprintf(file, "Region 1 does not have a valid event log signature\n"); + r1Valid = FALSE; + r1Unused = 0; + } + else + { + fprintf(file, "- Region 1 Details -\n"); + fprintf(file, " Region Length = %d bytes\n", region1Len); + fprintf(file, " Header Timestamp: %08x\n", get32x(*(U32 *)&(region1Buf[4]))); + r1Unused = get32x(*(U32 *)&(region1Buf[8])); + fprintf(file, " UnusedBytes: %08x\n", r1Unused); + fprintf(file, " SizeOfLog: %04x\n", get16x(*(U16 *)&(region1Buf[12]))); + fprintf(file, " FirstEntryOffset: %02x\n", region1Buf[14]); + fprintf(file, " RegionType: %02x\n", region1Buf[15]); + fprintf(file, " HeaderVersion: %02x\n", region1Buf[16]); + fprintf(file, " SequenceNumber: %02x\n\n", region1Buf[18]); + } + + if (!r2Valid || get32x(*(U32 *)&(region2Buf[0])) != EXPANDER_LOG_SIGNATURE) + { + printf("Region 2 does not have a valid event log signature\n"); + fprintf(file, "Region 2 does not have a valid event log signature\n"); + r2Valid = FALSE; + r2Unused = 0; + } + else + { + fprintf(file, "- Region 2 Details -\n"); + fprintf(file, " Region Length = %d bytes\n", region2Len); + fprintf(file, " Header Timestamp: %08x\n", get32x(*(U32 *)&(region2Buf[4]))); + r2Unused = get32x(*(U32 *)&(region2Buf[8])); + fprintf(file, " UnusedBytes: %08x\n", r2Unused); + fprintf(file, " SizeOfLog: %04x\n", get16x(*(U16 *)&(region1Buf[12]))); + fprintf(file, " FirstEntryOffset: %02x\n", region2Buf[14]); + fprintf(file, " RegionType: %02x\n", region2Buf[15]); + fprintf(file, " HeaderVersion: %02x\n", region2Buf[16]); + fprintf(file, " SequenceNumber: %02x\n\n", region2Buf[18]); + } + + if (r1Valid && r1Unused == 0xFFFFFFFF) + { + /* region 1 is actively in use, so if region 2 is valid then it + * contains the older entries so print it first + */ + if (r2Valid) + { + if (r2Unused == 0xFFFFFFFF) + { + printf("Strange, both regions appear to be active!!\n"); + fprintf(file, "Strange, both regions appear to be active!!\n"); + } + + fprintf(file, "\n-------------- Events from Region 2 -------------\n\n"); + firstEntryOffset = region2Buf[14]; + decodeExpanderLogEntries(file, ®ion2Buf[firstEntryOffset], region2Len - firstEntryOffset); + } + fprintf(file, "\n-------------- Events from Region 1 -------------\n\n"); + firstEntryOffset = region1Buf[14]; + decodeExpanderLogEntries(file, ®ion1Buf[firstEntryOffset], region1Len - firstEntryOffset); + } + else if (r2Valid && r2Unused == 0xFFFFFFFF) + { + /* region 2 is actively in use, so if region 1 is valid then it + * contains the older entries so print it first + */ + if (r1Valid) + { + fprintf(file, "\n-------------- Events from Region 1 -------------\n\n"); + firstEntryOffset = region1Buf[14]; + decodeExpanderLogEntries(file, ®ion1Buf[firstEntryOffset], region1Len - firstEntryOffset); + } + fprintf(file, "\n-------------- Events from Region 2 -------------\n\n"); + firstEntryOffset = region2Buf[14]; + decodeExpanderLogEntries(file, ®ion2Buf[firstEntryOffset], region2Len - firstEntryOffset); + } + else + { + printf("No valid log regions found!\n"); + fprintf(file, "No valid log regions found!\n"); + } + + if (r1Valid) + free(region1Buf); + if (r2Valid) + free(region2Buf); + + fclose(file); + + return 1; +} + + +int +doClearExpanderLogEntries(MPT_PORT *port) +{ + int bus; + int target; + unsigned char buf[4]; + int expanderType; + + if (selectExpander(port, &bus, &target, NULL, NULL, &expanderType) != 1) + return 0; + + if (expanderType != EXPANDER_TYPE_LSI_GEN1_YETI) + { + printf("This option is only supported on LSI SAS1 expanders (Yeti).\n"); + return 0; + } + + printf("\nAfter clearing the log regions, no logging will occur until the expander is reset\n"); + if (yesFlag == FALSE) + { + printf("\nAre you sure you want to continue? [Yes or No, default is No] "); + } + + if (getYesNoAnswer(0) != 1) + return 0; + + memset(buf, 0, sizeof buf); + + if (doWriteBufferFull(port, bus, target, 0, 2, 6, 0, buf, sizeof buf) != 1) + printf("Error clearing region 1 (buffer ID 6)\n"); + + if (doWriteBufferFull(port, bus, target, 0, 2, 7, 0, buf, sizeof buf) != 1) + printf("Error clearing region 2 (buffer ID 7)\n"); + + printf("Clearing expander log entries is complete.\n"); + return 1; +} + + +#define UART_DEFAULT_BUF_SIZE 1024 // 1MB + +#if DOS || EFI +#define UART_MAX_BUF_SIZE 1024 // 1MB - limited by mpt_shared_t's scratch[] buffer in mpt.c +#else +#define UART_MAX_BUF_SIZE 16384 // 16MB +#endif + +int +doUartDebugConsole(MPT_PORT *port) +{ + Mpi2ToolboxDiagnosticCliRequest_t req; + Mpi2ToolboxDiagnosticCliReply_t rep; + int n, m; + U32 x; + U8 *output; + char name[256]; + FILE *out_file; + char input[16]; + int lines; + U32 size; + U32 newsize; + int firstTime; + time_t now; + U32 dataLen; + U32 finalRetLength; +#if WIN32 + int maxPages; +#endif + + lines = 0; + + size = 0; + +#if WIN32 + getAdapterPropertiesMaxPages(port, &maxPages); + + if (maxPages) + { + /* calculate buffer size. generally expect maxPages to return 257. + * Subtract one page to account for possible partial page and + * assume a 4k page size + */ + size = ((maxPages - 1) * 4) * 1024; + } +#endif + + if (size == 0) + { + size = UART_DEFAULT_BUF_SIZE * 1024; + } + + output = NULL; + if (gFlag == FALSE) + { + output = (U8 *)malloc(size); + + if (output == NULL) + printf("ERROR: Unable to allocate a %d KB buffer\n", size/1024); + } + + if (gFlag == TRUE || output == NULL) + { + while (1) + { + printf("Allocated buffer size for displaying CLI command output: [in KB, max is %d, default is %d] ", + UART_MAX_BUF_SIZE, size/1024); + lines++; + newsize = getNumberAnswer(1, UART_MAX_BUF_SIZE, UART_DEFAULT_BUF_SIZE) * 1024; + + output = (U8 *)malloc(newsize); + + if (output == NULL) + printf("ERROR: Unable to allocate a %d KB buffer\n", newsize/1024); + else + break; + } + size = newsize; + } + + out_file = stdout; + while (1) + { + printf("Enter output file, or RETURN to send output to the screen: "); + lines++; + m = getStringFromArgs(name, sizeof name, stdin); + + if (m > 0) + { + out_file = fopen(name, "a"); + if (out_file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + continue; + } + } + break; + } + + printf("\n-- Starting UART Debug Console --\n(Type 'exit' to quit)\n\n"); + printf("NOTE: Messages asynchronously printed to the UART console\n"); + printf(" are NOT visible through this interface.\n\n"); + lines+=3; + + if (out_file != stdout) + { + time(&now); + fprintf(out_file, "\n%s\nStarting UART Debug Console\n(Type 'exit' to quit)\n\n", ctime(&now)); + fprintf(out_file, "NOTE: Messages asynchronously printed to the UART console\n"); + fprintf(out_file, " are NOT visible through this interface.\n\n"); + } + + firstTime = TRUE; + while (1) + { + memset(&req, 0, sizeof req); + if (firstTime) + { + strcpy((char *)req.DiagnosticCliCommand, "help"); + n = 4; + } + else + { + // print the console prompt and get the user input + printf("%%"); + n = getStringFromArgs((char *)(req.DiagnosticCliCommand), sizeof req.DiagnosticCliCommand, stdin); + } + + if (n > 0) + { + if ( strncmp((const char *)(req.DiagnosticCliCommand), "exit", 4) == 0 ) + { + break; + } + + /* if writing output to a file then echo the CLI command to the file */ + if (out_file != stdout && !firstTime) + fprintf(out_file, "%%%s\n", req.DiagnosticCliCommand); + + memset(&rep, 0, sizeof rep); + memset(output, 0, size); + + req.Function = MPI_FUNCTION_TOOLBOX; + req.Tool = MPI2_TOOLBOX_DIAGNOSTIC_CLI_TOOL; + req.DataLength = set32(size); + + if (doMptCommandCheck(port, &req, sizeof req - sizeof req.SGL, &rep, sizeof rep, + output, size, NULL, 0, SHORT_TIME) == 1) + { + dataLen = get32(rep.ReturnedDataLength); +#if WIN32 + finalRetLength = min(dataLen, gRetDataLen); +#else + finalRetLength = dataLen; +#endif + lines = 0; + + for ( x=0; x < min(finalRetLength, size); x++ ) + { + fputc(output[x], out_file); + + if (paged && out_file == stdout) + { + if (output[x] == '\n') + lines++; + if (lines >= paged) + { + fputs("\n--more, hit RETURN ('p' then RETURN to stop paging, 'q' then RETURN to quit)--", stdout); + if (fgets(input, 15, stdin)); + printf("\n"); + if (input[0] == 'p') + { + paged = 0; + } + if (input[0] == 'q') + { + break; + } + lines = 0; + } + } + } + + if (!firstTime) + { + /* strictly speaking the following should just be a '>' comparison, but some + * revisions of the firmware set ReturnedDataLength as the number of bytes + * returned rather than the number of bytes that could be returned if the + * allocated buffer was large enough Using '>=' helps indicate a possible + * issue in the output. + */ + if (dataLen >= size) + { + /* print warnings to the screen as well as the output file if one is in use */ + printf("\n\nWARNING: The command output was truncated!\n"); + printf("The output contains %d bytes but the allocated buffer is only %d bytes\n", + dataLen, size); + lines+=2; + if (out_file != stdout) + { + printf("\n%d bytes of output written to %s\n", size, name); + lines++; + fprintf(out_file, "\n\nWARNING: The command output was truncated!\n"); + fprintf(out_file, "The output contains %d bytes but the allocated buffer is only %d bytes\n", + dataLen, size); + } + } +#if WIN32 + else if ( gRetDataLen < size ) + { + /* print warnings to the screen as well as the output file if one is in use */ + printf("\n\nWARNING: The command output was truncated!\n"); + printf("The output contains %d bytes and the allocated buffer is %d bytes\n", dataLen, size); + printf("however, the MPT driver was forced to truncate the output at %d bytes.\n", gRetDataLen); + printf("This was likely due to system memory fragmentation.\n"); + + lines+=4; + if (out_file != stdout) + { + printf("\n%d bytes of output written to %s\n", gRetDataLen, name); + lines++; + fprintf(out_file, "\n\nWARNING: The command output was truncated!\n"); + fprintf(out_file, "The output contains %d bytes and the allocated buffer is %d bytes\n", dataLen, size); + fprintf(out_file, "however, the MPT driver was forced to truncate the output at %d bytes.\n", gRetDataLen); + fprintf(out_file, "This was likely due to system memory fragmentation.\n"); + } + } +#endif + else + { + if (out_file != stdout) + { + printf("\n%d bytes of output written to %s\n", dataLen, name); + lines++; + } + } + } + } + else if (firstTime && + (get16(rep.IOCStatus) == MPI_IOCSTATUS_INVALID_FIELD || + get16(rep.IOCStatus) == MPI_IOCSTATUS_INVALID_FUNCTION)) + { + printf("There was a problem getting the UART console data.\n"); + printf("This firmware may not support the UART passthrough feature.\n"); + } + } + firstTime = FALSE; + } + if (out_file != stdout) + fclose(out_file); + + free(output); + return 1; +} + + +#if WIN32 +int +getAdapterPropertiesMaxPages(MPT_PORT *port, int *maxPages) +{ + int status; + STORAGE_PROPERTY_QUERY query; + DWORD retLen; + STORAGE_ADAPTER_DESCRIPTOR desc; + + memset(&query, 0, sizeof(query)); + memset(&desc, 0, sizeof(desc)); + query.PropertyId = StorageAdapterProperty; + query.QueryType = PropertyStandardQuery; + + retLen = 0; + + status = DeviceIoControl(port->fileHandle, IOCTL_STORAGE_QUERY_PROPERTY, + &query, sizeof(query), &desc, sizeof(desc), &retLen, NULL); + + if (status == 1) + { + *maxPages = desc.MaximumPhysicalPages; + return 1; + } + else + { + *maxPages = 0; + return 0; + } +} +#endif + + +int +doSendPowerManagementControlMPI(MPT_PORT *port) +{ + MPI2_PWR_MGMT_CONTROL_REQUEST req; + MPI2_PWR_MGMT_CONTROL_REPLY rep; + int input; + int mpt_return; + + memset( &req, 0, sizeof(req) ); + memset( &rep, 0, sizeof(rep) ); + + req.Function = MPI2_FUNCTION_PWR_MGMT_CONTROL; + + // Query for the data + input = 0x01; + printf("Feature: [1=DA_PHY, 2=Port Width Mod, 3=PCIE, 4=IOC, 5=Global, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Feature = input; + + input = 0x00; + printf("Chain Offset: [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.ChainOffset = input; + + switch (req.Feature) + { + case MPI2_PM_CONTROL_FEATURE_IOC_SPEED: + input = 0x01; + printf("IOC Speed (Parameter1): [1=100%%, 2=50%%, 4=25%%, 8=12.5%%, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter1 = input; + break; + case MPI2_PM_CONTROL_FEATURE_DA_PHY_POWER_COND: + input = 0x00; + printf("PHY number (Parameter1): [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter1 = input; + + input = 0x01; + printf("IOC Action (Parameter2): [1=Partial, 2=Slumber, 3=Exit, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter2 = input; + break; + case MPI2_PM_CONTROL_FEATURE_PORT_WIDTH_MODULATION: + input = 0x00; + printf("Modulation Group Number (Parameter1): [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter1 = input; + + input = 0x01; + printf("IOC Action (Parameter2): [1=Request, 2=Change, 3=Relinquish, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter2 = input; + + if ( req.Parameter2 == MPI2_PM_CONTROL_PARAM2_CHANGE_MODULATION ) + { + input = 0x03; + printf("New Level (Parameter3): [0=25%%, 1=50%%, 2=75%%, 3=100%%, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter3 = input; + } + break; + case MPI2_PM_CONTROL_FEATURE_PCIE_LINK: + input = 0x00; + printf("Speed (Parameter1): [0=2.5G, 1=5G, 2=8G, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter1 = input; + + input = 0x01; + printf("Width (Parameter2): [1=X1, 2=X2, 4=X4, 8=X8, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter2 = input; + break; + case MPI2_PM_CONTROL_FEATURE_GLOBAL_PWR_MGMT_MODE: + input = 0x01; + printf("Action (Parameter1): [1=Take, 2=Change, 3=Release, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter1 = input; + + if (req.Parameter1 == MPI2_PM_CONTROL_PARAM1_CHANGE_GLOBAL_MODE) + { + input = 0x01; + printf("Mode (Parameter2): [1=Full, 8=Reduced, 64=Standby, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter2 = input; + } + break; + default: + input = 0x00; + printf("Parameter1: [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter1 = input; + + input = 0x00; + printf("Parameter2: [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter2 = input; + + input = 0x00; + printf("Parameter3: [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter3 = input; + + input = 0x00; + printf("Parameter4: [0 to 255, default is %d] ", input); + input = getNumberAnswer(0, 255, input); + req.Parameter4 = input; + break; + } //switch(function) + + // Send the message + mpt_return = doMptCommand(port, &req, sizeof req, &rep, sizeof rep, NULL, 0, NULL, 0, SHORT_TIME); + if(mpt_return != 1) + { + printf("ERROR: Could not send MPI message\n"); + return -1; + } + + printf("\n\n Reply:\n"); + printf(" Feature: [0x%08X]\n", rep.Feature); + printf(" IOCStatus: [0x%08X] (%s)\n", get16(rep.IOCStatus), translateIocStatus(get16(rep.IOCStatus))); + printf(" IOCLogInfo: [0x%08X]\n", get32(rep.IOCLogInfo)); + + return 1; +} + + +// IoUnit7 is Read-only, so this function only displays the info contained in the page +int +doIoUnit7Settings(MPT_PORT *port) +{ + Mpi2IOUnitPage7_t page; + + if (getConfigPage(port, MPI2_CONFIG_PAGETYPE_IO_UNIT, 7, 0, &page, sizeof page) != 1) + { + printf("Couldn't get IOUnitPage7\n"); + printf(" IOC Status: %s", translateIocStatus(port->ioc_status) ); + return 0; + } + + printf(" CurrentPowerMode: 0x%02X\n", page.CurrentPowerMode ); + printf(" PreviousPowerMode: 0x%02X\n", page.PreviousPowerMode ); + printf(" PCIeWidth: 0x%02X\n", page.PCIeWidth ); + printf(" PCIeSpeed: 0x%02X\n", page.PCIeSpeed ); + printf(" ProcessorState: 0x%08X\n", get32(page.ProcessorState) ); + printf(" PowerManagementCapabilities: 0x%08X\n", get32(page.PowerManagementCapabilities) ); + printf(" IOCTemperature: 0x%04X\n", get16(page.IOCTemperature) ); + printf(" IOCTemperatureUnits: 0x%02X\n", page.IOCTemperatureUnits ); + printf(" IOCSpeed: 0x%02X\n", page.IOCSpeed ); + printf(" BoardTemperature: 0x%04X\n", get16(page.BoardTemperature) ); + printf(" BoardTemperatureUnits: 0x%02X\n", page.BoardTemperatureUnits ); + + return 1; +} + + +int +doSasIoUnit8Settings(MPT_PORT *port) +{ + Mpi2SasIOUnitPage8_t page; + int input; + + memset( &page, 0, sizeof(page) ); + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 8, 0, &page, sizeof page) != 1) + { + printf("\nCouldn't get SasIoUnitPage8\n"); + printf(" IOC Status: %s", translateIocStatus(port->ioc_status) ); + return 0; + } + + // Dump the page first + printf(" PowerManagementCapabilities: 0x%08X\n", get32(page.PowerManagementCapabilities) ); + printf(" TxRxSleepStatus: 0x%02X\n\n", page.TxRxSleepStatus ); + + printf("Edit this page? [0=no, 1=yes, default is %d] ", 0); + input = getNumberAnswer(0, 1, 0); + + if(input == 1) + { + input = page.PowerManagementCapabilities; + printf("PowerManagementCapabilities: [0 to 0xFFFFFFF, default is %x] ", input); + input = getNumberAnswerHex(0, 0xFFFFFFF, input); + page.PowerManagementCapabilities = set32(input); + + input = page.TxRxSleepStatus; + printf("TxRxSleepStatus: [0 to 0xFF, default is %x] ", input); + input = getNumberAnswerHex(0, 0xFF, input); + page.TxRxSleepStatus = input; + + if (setConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 8, 0, &page, sizeof page) != 1) + { + printf("\nFailed to save changes to NVRAM!\n"); + printf(" IOC Status: %s", translateIocStatus(port->ioc_status) ); + return 0; + } + } + + return 1; +} + + +int +dumpSasDevicePage0sLong(MPT_PORT *port) +{ + Mpi2SasDevicePage0_t SASDevicePage0; + U32 handle; + int flags; + int deviceIndex; + U32 info; + int bit; + + deviceIndex = 0; + handle = 0xffff; + + // Decode DeviceInfo first + printf(" | |S|S|S|S|S|S|S|S| | |A| |\n"); + printf(" |T|A|M|T|S|A|M|T|S| | |T| |\n"); + printf(" |y|T|P|P|P|T|P|P|P| |L|A|S|\n"); + printf(" |p|A|i|i|i|A|t|t|t|D|S|P|E|\n"); + printf("SASAddress PhyNum Handle |e|h|n|n|n|d|a|a|a|A|I|I|P|\n"); + printf("---------------------------------|-|-|-|-|-|-|-|-|-|-|-|-|-|\n"); + while (TRUE) + { + if (getConfigPage(port, MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, handle, + &SASDevicePage0, sizeof SASDevicePage0) != 1) + break; + + handle = get16(SASDevicePage0.DevHandle); + info = get32(SASDevicePage0.DeviceInfo); + + printf("%08x%08x", get32(SASDevicePage0.SASAddress.High), get32(SASDevicePage0.SASAddress.Low)); + printf(" %04d", SASDevicePage0.PhyNum ); + printf(" %04d", handle ); + printf(" |%d|", info & 0x03); // Device type + for( bit = 3; bit <= 14; bit++) + { + printf("%d|", info & (1< 0) + { + out_file = fopen(name, "a"); + if (out_file == NULL) + { + printf("Open failure for file %s\n", name); + perror("Error is"); + out_file = stdout; + continue; + } + } + break; + } + + printf("\n-- Starting Expander UART Console --\n(Type 'exit' to quit)\n\n"); + printf("NOTE: Messages asynchronously printed to the UART console\n"); + printf(" are NOT visible through this interface.\n\n"); + lines+=3; + if (out_file != stdout) + { + time(&now); + fprintf(out_file, "\n%s\nStarting Expander UART Console --\n(Type 'exit' to quit)\n\n", ctime(&now)); + fprintf(out_file, "NOTE: Messages asynchronously printed to the UART console\n"); + fprintf(out_file, " are NOT visible through this interface.\n\n"); + } + + cmd_seq_id = (U16*)(&command[2]); + seq_id = 0; + command[0] = 0x0; + command[1] = 0x0; + + while (1) + { + drop_paged_output = 0; + printf("\n cmd >"); + + memset(&(command[4]), 0x0, 81); + n = getStringFromArgs((char*)&(command[4]), 80, stdin); + if (n > 0) + { + if (strncmp ((const char *)(&(command[4])), "exit", 5) == 0) + { + break; + } + /* if writing output to a file then echo the CLI command to the file */ + if (out_file != stdout) + fprintf(out_file, "\n cmd >%s\n", &(command[4])); + *cmd_seq_id = set16x(seq_id); + doWriteBufferFull(port, bus, target, 0, 1, 0xc4, 0, command, sizeof command); + transfer_complete = 0; + } + else + { + transfer_complete = 1; + } + + offset = 0; + lines = 0; + memset(output, 0, sizeof output); + while (!transfer_complete) + { + n = doReadBufferFull(port, bus, target, 0, 1, 0xc4, offset, output, sizeof output); + if (!n) + { + if (out_file != stdout && out_file != NULL) + { + fclose(out_file); + } + return 0; + } + + transfer_complete = output[0] & 0x8; + ret_seq_id = get16x(*(U16*)(&output[2])); + bytes_read = get16x(*(U16*)(&output[4])); + /* offset is incremented by the number of bytes of data plus the + read response header size + */ + offset += ( bytes_read + 6 ); + if (ret_seq_id != seq_id) + { + printf("Sequence ID mismatch \n"); + lines++; + } + + /* Output data starts at byte 6, only print if not dumping output + and index is within valid ranges for the response bytes and the + output buffer + */ + for ( index=6; + drop_paged_output == 0 && index < bytes_read + 6 && index < sizeof output; + index++ ) + { + fputc(output[index], out_file); + + if (paged && out_file == stdout) + { + if (output[index] == '\n') + lines++; + if (lines >= paged) + { + fputs("\n--more, hit RETURN ('p' then RETURN to stop paging, 'q' then RETURN to quit)--", stdout); + if (fgets(input, 15, stdin)); + printf("\n"); + if (input[0] == 'p') + { + paged = 0; + } + if (input[0] == 'q') + { + drop_paged_output = 1; + break; + } + lines = 0; + } + } + } + + if (out_file != stdout) + { + printf("\n%d bytes of output written to %s\n", bytes_read, name); + lines++; + } + + /* Sleep for a second if the expander didn't output anything + before checking again + */ + if (!transfer_complete && ( bytes_read == 0 )) + sleep(1); + } // keep getting more response data + seq_id++; + } // next command + + if (out_file != stdout && out_file != NULL) + fclose(out_file); + + return 1; + +} + + +#if EFI +#undef main +#undef malloc +#undef free +#include "helper.c" +#endif + +/* vi: set sw=4 ts=4 sts=4 et :iv */ diff --git a/source/mpt.c b/source/mpt.c new file mode 100755 index 0000000..1c9fc32 --- /dev/null +++ b/source/mpt.c @@ -0,0 +1,2680 @@ +/*************************************************************************** + * * + * Copyright 2012 LSI Corporation. All rights reserved. * + * * + * This file is confidential and a trade secret of LSI Corporation. 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 it may describe, in whole, or in part, without the specific * + * written consent of LSI Corporation. * + * * + *************************************************************************** +*/ +/* + * mpt -- simple driver for MPT adapters (FC, SCSI, and SAS/SATA) + * + * Written by Stephen F. Shirron, August 9, 2005 + */ + + +#ifdef DISABLE_TIMEOUTS +static time_t local_time = 0; +#define time(x) (local_time) +#endif + + +#define NUM_REPLIES 7 +#define REPLY_FREE_SIZE 8 +#define REPLY_POST_SIZE 16 +#define COMMAND_CONTEXT 0x111111 +#define PASS_THRU_CONTEXT 0x555555 + + +#define mpi1 (adap->mpt_version < MPI2_VERSION_02_00) +#define mpi2 (adap->mpt_version >= MPI2_VERSION_02_00) +#define mpi20 ((adap->mpt_version >= MPI2_VERSION_02_00) && (adap->mpt_version < MPI2_VERSION_02_05)) +#define mpi25 (adap->mpt_version >= MPI2_VERSION_02_05) + + +typedef struct mpt_io_rep +{ + union + { + SCSIIOReply_t default_reply; + U32 reply[32]; + } mf; +} mpt_io_rep_t; + + +typedef struct mpt_shared +{ + mpt_io_rep_t replies[NUM_REPLIES]; + U32 message[32]; + U32 free_queue[REPLY_FREE_SIZE]; + MPI2_DEFAULT_REPLY_DESCRIPTOR + post_queue[REPLY_POST_SIZE]; + U16 data[64]; + U32 config[256]; + U8 scratch[1024*1024 + 1024]; // 1MB + 1K - big enough for 1MB payload plus request/response + U32 hrsm_value; +} mpt_shared_t; + + +typedef struct mpt_adap +{ + MPT_PORT *port; + HANDLE partner_adap; + char *name; + U16 vendor_id; + U16 device_id; + U8 revision_id; + U8 segment_number; + U8 bus_number; + U8 device_function; + int mpt_version; + int hrsm_capable; + U32 hrsm_value; + U32 msg_context; + int restart_needed; + int port_enable_needed; + int config_active; + int command_active; + mpt_shared_t *shared; + mpt_bus_addr_t shared_ba; + int message_size; + int reply_depth; + int credits; + int port_count; + int block_size; + int port_type; + int host_id; + U32 interrupt_mask; + int max_targets; + int bus_reset_needed; + U32 capabilities[16]; + int ioc_online; + int port_online; + int bootloader; + int loaddevice; + U8 *fw_image; + int fw_image_size; + int fw_image_asked; + U32 mem_size; + U32 diagmem_size; +#if DOS + U32 io_addr; + U32 mem_addr; + U32 mem_virt; + U32 diagmem_addr; + U32 diagmem_virt; + CONTIGUOUS_MEMORY shared_contig_mem; +#endif +#if EFI + EFI_HANDLE handle; + EFI_PCI_IO_PROTOCOL *pci_io; + void *buffer_mapping; + int disconnected; +#endif + int io; + int mem; + int diagmem; + int free_index; + int post_index; +} mpt_adap_t; + + +#define rl(x) mpt_read32(adap, MPI_##x##_OFFSET, adap->mem) +#define wl(x,y) mpt_write32(adap, MPI_##x##_OFFSET, y, adap->mem) +#define rl2(x) mpt_read32(adap, MPI2_##x##_OFFSET, adap->mem) +#define wl2(x,y) mpt_write32(adap, MPI2_##x##_OFFSET, y, adap->mem) +#define rlio(x) mpt_read32(adap, MPI_##x##_OFFSET, adap->io) +#define wlio(x,y) mpt_write32(adap, MPI_##x##_OFFSET, y, adap->io) +#define rldiag(x,y) wl(TEST_BASE_ADDRESS, x & ~mask); y = mpt_read32(adap, x & mask, adap->diagmem) +#define wldiag(x,y) wl(TEST_BASE_ADDRESS, x & ~mask); mpt_write32(adap, x & mask, y, adap->diagmem) +U32 mpt_read32(mpt_adap_t *adap, int offset, int bar) +{ + U32 data; + +#if DOS + if (bar == adap->mem) + data = *(U32 *)(adap->mem_virt + offset); + else if (bar == adap->diagmem) + data = *(U32 *)(adap->diagmem_virt + offset); + else + data = inpd(adap->io_addr + offset); +#endif +#if EFI + if (bar == adap->mem || bar == adap->diagmem) + adap->pci_io->Mem.Read(adap->pci_io, EfiPciIoWidthUint32, (char)bar, offset, 1, &data); + else + adap->pci_io->Io.Read(adap->pci_io, EfiPciIoWidthUint32, (char)bar, offset, 1, &data); +#endif + + return data; +} +void mpt_write32(mpt_adap_t *adap, int offset, U32 data, int bar) +{ +#if DOS + if (bar == adap->mem) + *(U32 *)(adap->mem_virt + offset) = data; + else if (bar == adap->diagmem) + *(U32 *)(adap->diagmem_virt + offset) = data; + else + outpd(adap->io_addr + offset, data); +#endif +#if EFI + if (bar == adap->mem || bar == adap->diagmem) + adap->pci_io->Mem.Write(adap->pci_io, EfiPciIoWidthUint32, (char)bar, offset, 1, &data); + else + adap->pci_io->Io.Write(adap->pci_io, EfiPciIoWidthUint32, (char)bar, offset, 1, &data); +#endif +} +void mpt_write8(mpt_adap_t *adap, int offset, U8 data) +{ +#if DOS + *(U8 *)(adap->diagmem_virt + offset) = data; +#endif +#if EFI + adap->pci_io->Mem.Write(adap->pci_io, EfiPciIoWidthUint8, (char)adap->diagmem, offset, 1, &data); +#endif +} +#define MPI_DEBUG_OFFSET 0x18 +#define MPI_FC909_BUG_OFFSET 0x90 +#define MPI_SAS1078_RESET_OFFSET 0x10FC + + +int mpt_adjust_delay(mpt_adap_t *adap, int n); +void mpt_delay(mpt_adap_t *adap, int n); +int mpt_get_doorbell(mpt_adap_t *adap); +int mpt_get_state(mpt_adap_t *adap); +int mpt_verify_enabled(mpt_adap_t *adap); +int mpt_verify_ready(mpt_adap_t *adap); +int mpt_verify_operational(mpt_adap_t *adap); +int mpt_wait_for_ready(mpt_adap_t *adap); +int mpt_restart(mpt_adap_t *adap); +int mpt_stop(mpt_adap_t *adap, int wait); +int mpt_start(mpt_adap_t *adap); +int mpt_port_online(mpt_adap_t *adap); +int mpt_wait_for_doorbell(mpt_adap_t *adap, time_t limit); +int mpt_wait_for_response(mpt_adap_t *adap, time_t limit); +int mpt_send_message(mpt_adap_t *adap, int length, time_t limit); +int mpt_receive_data(mpt_adap_t *adap, int length, time_t limit); +int mpt_issue_command_and_wait(mpt_adap_t *adap, int wait); +int mpt_issue_config_and_wait(mpt_adap_t *adap, int wait); +int mpt_issue_ioc_facts(mpt_adap_t *adap); +int mpt2_issue_ioc_facts(mpt_adap_t *adap); +int mpt_issue_ioc_init(mpt_adap_t *adap); +int mpt2_issue_ioc_init(mpt_adap_t *adap); +int mpt_initialize(mpt_adap_t *adap); +int mpt_issue_port_facts(mpt_adap_t *adap, int port); +int mpt2_issue_port_facts(mpt_adap_t *adap, int port); +int mpt_issue_port_enable(mpt_adap_t *adap, int port); +int mpt2_issue_port_enable(mpt_adap_t *adap, int port); +int mpt_issue_event_notification(mpt_adap_t *adap); +int mpt2_issue_event_notification(mpt_adap_t *adap); +int mpt_watchdog(mpt_adap_t *adap); +int mpt_init_device_capabilities(mpt_adap_t *adap); +int mpt_set_device_capabilities(mpt_adap_t *adap, int targ); +int mpt_set_on_bus_timer(mpt_adap_t *adap, int timeout); +int mpt_get_config_page(mpt_adap_t *adap, int type, int number, int address); +int mpt_set_config_page(mpt_adap_t *adap, int type, int number, int address); +int mpt_do_config_action(mpt_adap_t *adap, int action, int type, int number, int address, int length); +void mpt_bus_reset(mpt_adap_t *adap); +void mpt_interrupt(mpt_adap_t *adap); +void mpt2_interrupt(mpt_adap_t *adap); +int mpt_handle_reply(mpt_adap_t *adap, MPIDefaultReply_t *reply, U32 reply_ba); +void mpt2_handle_scsi_io_success(mpt_adap_t *adap, Mpi2DefaultReplyDescriptor_t *reply_desc); +void mpt2_handle_address_reply(mpt_adap_t *adap, Mpi2DefaultReplyDescriptor_t *reply_desc); +int mpt_fwdownloadboot(mpt_adap_t *adap); +int mpt_directdownload(mpt_adap_t *adap); + + +int +mpt_adjust_delay(mpt_adap_t *adap, int n) +{ + if (adap->revision_id == 0xff) + return n * 10; + + return n; +} + + +void +mpt_delay(mpt_adap_t *adap, int n) +{ +#if DOS + int i; + + for (i = 0; i < mpt_adjust_delay(adap, n); i++) + { + PciReadConfigWord(adap->bus_number, adap->device_function, PCI_CONFIG_DEVICE_ID); + } +#endif +#if EFI + udelay(mpt_adjust_delay(adap, n)); +#endif +} + + +int +mpt_get_doorbell(mpt_adap_t *adap) +{ + return rl(DOORBELL); +} + + +int +mpt_get_state(mpt_adap_t *adap) +{ + return rl(DOORBELL) & MPI_IOC_STATE_MASK; +} + + +int +mpt_verify_enabled(mpt_adap_t *adap) +{ + if (rl(DIAGNOSTIC) & MPI_DIAG_DISABLE_ARM) + if (mpt_stop(adap, TRUE)) + return mpt_restart(adap); + + return 1; +} + + +int +mpt_verify_ready(mpt_adap_t *adap) +{ + if (adap->restart_needed == TRUE) + return 0; + + if ((rl(DOORBELL) & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_READY) + return 0; + + return 1; +} + + +int +mpt_verify_operational(mpt_adap_t *adap) +{ + if (adap->restart_needed == TRUE) + return 0; + + if ((rl(DOORBELL) & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_OPERATIONAL) + return 0; + + return 1; +} + + +int +mpt_wait_for_ready(mpt_adap_t *adap) +{ + U32 doorbell; + U32 diagnostic; + int state; + time_t limit = time(NULL) + mpt_adjust_delay(adap, 50); + + while (time(NULL) < limit) + { + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state == MPI_IOC_STATE_FAULT) + { + printf("\n%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + break; + + printf("\n"); + + adap->restart_needed = TRUE; + return 0; + } + if (state == MPI_IOC_STATE_READY) + { + adap->restart_needed = FALSE; + return 1; + } + diagnostic = rl(DIAGNOSTIC); + if (diagnostic & MPI_DIAG_FLASH_BAD_SIG) + { + if (adap->fw_image == NULL) + { + printf("\n%s: FLASH does not contain a valid image\n", adap->name); + if (wFlag) + fprintf(logFile, "%s: FLASH does not contain a valid image\n", + adap->name); + } + adap->restart_needed = TRUE; + return 0; + } + if (diagnostic & MPI_DIAG_DISABLE_ARM) + { + printf("\n%s: IOP ARM is disabled\n", adap->name); + if (wFlag) + fprintf(logFile, "%s: IOP ARM is disabled\n", + adap->name); + adap->restart_needed = TRUE; + return 0; + } + DELAY(1); + } + + return 0; +} + + +/* + * mpt_restart - completely restart the IOC and any outstanding commands. + */ +int +mpt_restart(mpt_adap_t *adap) +{ + int targ; + +// printf("mpt_restart called\n"); + + if (!mpt_verify_ready(adap)) + { + adap->restart_needed = FALSE; + adap->bus_reset_needed = FALSE; + + if (!mpt_stop(adap, TRUE)) + return 0; + } + + adap->config_active = FALSE; + adap->command_active = FALSE; + + if (!mpt_start(adap)) + return 0; + + if (adap->port_type == MPI_PORTFACTS_PORTTYPE_SCSI) + { + mpt_init_device_capabilities(adap); + + for (targ = 0; targ < adap->max_targets; targ++) + { + mpt_set_device_capabilities(adap, targ); + } + } + + return 1; +} + + +/* + * mpt_stop - stop the IOC (reset it). + */ +int +mpt_stop(mpt_adap_t *adap, int wait) +{ + time_t limit = time(NULL) + mpt_adjust_delay(adap, 30); + +// printf("mpt_stop called\n"); + +#if EFI + EFI_STATUS status; + + if (adap->disconnected == FALSE) + { + EFI_PCI_IO_PROTOCOL *pci_io; + + if (wait == FALSE) + { + return 1; + } + + if (adap->loaddevice == TRUE) + { + printf("This chip controls the device that this utility was loaded from.\n"); + printf("After this command, the load device cannot be accessed again\n"); + printf("to open files, until this utility has been exited and restarted.\n\n"); + } + + if (!EFI_ERROR(BS->DisconnectController(adap->handle, NULL, NULL))) + { + adap->disconnected = TRUE; + pci_io = adap->pci_io; + status = pci_io->Attributes(pci_io, EfiPciIoAttributeOperationEnable, + EFI_PCI_IO_ATTRIBUTE_IO | + EFI_PCI_IO_ATTRIBUTE_MEMORY | + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER | + EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE, NULL); + + if (status == EFI_UNSUPPORTED) + { + pci_io->Attributes(pci_io, EfiPciIoAttributeOperationEnable, + EFI_PCI_IO_ATTRIBUTE_IO | + EFI_PCI_IO_ATTRIBUTE_MEMORY | + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER, NULL); + } + } + + if (adap->partner_adap) + { + if (!EFI_ERROR(BS->DisconnectController(adap->partner_adap->handle, NULL, NULL))) + { + adap->partner_adap->disconnected = TRUE; + pci_io = adap->partner_adap->pci_io; + status = pci_io->Attributes(pci_io, EfiPciIoAttributeOperationEnable, + EFI_PCI_IO_ATTRIBUTE_IO | + EFI_PCI_IO_ATTRIBUTE_MEMORY | + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER | + EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE, NULL); + + if (status == EFI_UNSUPPORTED) + { + pci_io->Attributes(pci_io, EfiPciIoAttributeOperationEnable, + EFI_PCI_IO_ATTRIBUTE_IO | + EFI_PCI_IO_ATTRIBUTE_MEMORY | + EFI_PCI_IO_ATTRIBUTE_BUS_MASTER, NULL); + } + } + } + } +#endif + + adap->port_online = FALSE; + + adap->interrupt_mask = MPI_HIM_RIM | MPI_HIM_DIM; + wl(HOST_INTERRUPT_MASK, rl(HOST_INTERRUPT_MASK) | adap->interrupt_mask); + + /* + * Reset the chip. + */ + if (adap->device_id == MPI_MANUFACTPAGE_DEVICEID_FC909) + { + rl(FC909_BUG); /* work around FC909 bug */ + } + + if (!(rl(DIAGNOSTIC) & MPI_DIAG_DRWE)) + { + wl(WRITE_SEQUENCE, 0); + wl(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + wl(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + DELAY(100); + } + + if (!(rl(DIAGNOSTIC) & MPI_DIAG_RESET_HISTORY) || + ((rl(DOORBELL) & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_RESET && + (rl(DOORBELL) & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_READY)) + { + if (adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1078) + { + wl(SAS1078_RESET, 0x7); + } + else + { + wl(DIAGNOSTIC, MPI_DIAG_RESET_ADAPTER); + } + DELAY(50000); + wl(WRITE_SEQUENCE, 0); + wl(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + wl(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + DELAY(100); + } + + wl(DIAGNOSTIC, 0); + + if (wait == FALSE) + { + while (time(NULL) < limit) + { + if (rl(DOORBELL) & MPI_IOC_STATE_MASK) + break; + if (rl(DIAGNOSTIC) & MPI_DIAG_DISABLE_ARM) + break; + DELAY(100); + } + + return 1; + } + + if (rl(DIAGNOSTIC) & MPI_DIAG_RESET_ADAPTER) + { + printf("\n%s: Failed to clear RESET ADAPTER\n", adap->name); + if (wFlag) + fprintf(logFile, "%s: Failed to clear RESET ADAPTER\n", + adap->name); + adap->restart_needed = TRUE; + return 0; + } + + adap->bootloader = FALSE; + + if (mpt_wait_for_ready(adap)) + return 1; + + if (mpt_fwdownloadboot(adap)) + return 1; + + if ((rl(DOORBELL) & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_RESET) + { + adap->restart_needed = FALSE; + + printf("\n%s: Failed to leave the RESET state\n", adap->name); + if (wFlag) + fprintf(logFile, "%s: Failed to leave the RESET state\n", + adap->name); + } + else + { + adap->restart_needed = TRUE; + + printf("\n%s: Failed to reset properly\n", adap->name); + if (wFlag) + fprintf(logFile, "%s: Failed to reset properly\n", + adap->name); + } + + return 0; +} + + +/* + * mpt_start - start the IOC (completely initialize it). + */ +int +mpt_start(mpt_adap_t *adap) +{ + int port; + +// printf("mpt_start called\n"); + + if (adap->bootloader == TRUE) + { + printf("\nBootLoader firmware cannot be made fully operational!\n"); + return 0; + } + + if (!mpt_issue_ioc_facts(adap)) + { + printf("%s: Failed to send IOCFacts\n", adap->name); + return 0; + } + + if (!mpt_issue_ioc_init(adap)) + { + printf("%s: Failed to send IOCInit\n", adap->name); + return 0; + } + + if (!mpt_initialize(adap)) + { + printf("%s: Failed to finish initialization of IOC\n", adap->name); + return 0; + } + + for (port = 0; port < adap->port_count; port++) + { + if (!mpt_issue_port_facts(adap, port)) + { + printf("%s: Failed to send PortFacts to port %d\n", adap->name, port); + continue; + } + } + + if (adap->port_enable_needed) + { + adap->port_online = mpt_port_online(adap); + } + +#if 0 // skip this for DOS and EFI, as it doesn't really help + if (!mpt_issue_event_notification(adap)) + { + printf("%s: failed to send EventNotification\n", adap->name); + } +#endif + + if (adap->port_type == MPI_PORTFACTS_PORTTYPE_SCSI) + { + if (!mpt_set_on_bus_timer(adap, 1000)) + { + printf("%s: Failed to set SCSI On Bus Timer\n", adap->name); + } + } + + return 1; +} + + +/* + * mpt_port_online - bring the port online. + */ +int +mpt_port_online(mpt_adap_t *adap) +{ + int port; + +// printf("mpt_port_online called\n"); + + for (port = 0; port < adap->port_count; port++) + { + if (adap->port_type == MPI_PORTFACTS_PORTTYPE_SAS) + { + //TODO: MPI12.5 - This is where it crashes + if (doSasChangeWwid(adap->port, 1) == 1) + { + printf("\nThe SAS WWID is zero -- the port will not be enabled\n"); + printf("\nUse menu option 18 then option 99 to fix this problem\n"); + continue; + } + } + + if (!mpt_issue_port_enable(adap, port)) + { + printf("%s: Failed to send PortEnable to port %d\n", adap->name, port); + continue; + } + } + + return 1; +} + + +int +mpt_wait_for_doorbell(mpt_adap_t *adap, time_t limit) +{ + U32 doorbell; + int state; + + while (time(NULL) < limit) + { + if (adap->restart_needed == TRUE) + { + return 0; + } + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state == MPI_IOC_STATE_FAULT) + { + printf("\n%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nDo you want to continue? [Yes or No, default is No] "); + + if (getYesNoAnswer(0) != 1) + break; + + printf("\n"); + + adap->restart_needed = TRUE; + return 0; + } + if (rl(HOST_INTERRUPT_STATUS) & MPI_HIS_DOORBELL_INTERRUPT) + { + return 1; + } + DELAY(1); + } + + printf("%s: Failed in mpt_wait_for_doorbell, Doorbell = %08x\n", + adap->name, doorbell); + return 0; +} + + +int +mpt_wait_for_response(mpt_adap_t *adap, time_t limit) +{ + U32 doorbell; + int state; + + while (time(NULL) < limit) + { + if (adap->restart_needed == TRUE) + { + return 0; + } + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state == MPI_IOC_STATE_FAULT) + { + printf("\n%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nHit Enter to continue "); + + getYesNoAnswer(0); + + printf("\n"); + + adap->restart_needed = TRUE; + return 0; + } + if (!(rl(HOST_INTERRUPT_STATUS) & MPI_HIS_IOP_DOORBELL_STATUS)) + { + return 1; + } + DELAY(1); + } + + printf("%s: Failed in mpt_wait_for_response, Doorbell = %08x\n", + adap->name, doorbell); + return 0; +} + + +int +mpt_send_message(mpt_adap_t *adap, int length, time_t limit) +{ + U32 doorbell; + U32 *message = adap->shared->message; + int state; + int i; + + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state == MPI_IOC_STATE_FAULT) + { + printf("\n%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nHit Enter to continue "); + + getYesNoAnswer(0); + + printf("\n"); + + adap->restart_needed = TRUE; + return 0; + } + if (state == MPI_IOC_STATE_RESET) + { + adap->restart_needed = TRUE; + return 0; + } + if (doorbell & MPI_DOORBELL_USED) + { + printf("%s: Doorbell already active\n", adap->name); + adap->restart_needed = TRUE; + return 0; + } + wl(HOST_INTERRUPT_STATUS, 0); + wl(DOORBELL, (MPI_FUNCTION_HANDSHAKE << MPI_DOORBELL_FUNCTION_SHIFT) | + ((length / 4) << MPI_DOORBELL_ADD_DWORDS_SHIFT)); + if (!mpt_wait_for_doorbell(adap, limit)) + return 0; + wl(HOST_INTERRUPT_STATUS, 0); + if (!mpt_wait_for_response(adap, limit)) + return 0; + for (i = 0; i < length / 4; i++) + { + wl(DOORBELL, get32x(message[i])); + if (!mpt_wait_for_response(adap, limit)) + return 0; + } + + return 1; +} + + +int +mpt_receive_data(mpt_adap_t *adap, int length, time_t limit) +{ + int i; + int real_length; + U16 value; + U16 *data = adap->shared->data; + MPIDefaultReply_t *reply = (MPIDefaultReply_t *)data; + U16 status; + + bzero(data, length); + real_length = 4; /* enough for the header to start, fix up later */ + for (i = 0; i < real_length / 2; i++) + { + if (!mpt_wait_for_doorbell(adap, limit)) + return 0; + value = (U16)rl(DOORBELL); + if (i == 1) + real_length = (value & ~0xff00) * 4; + if (i < length / 2) + data[i] = get16x(value); + wl(HOST_INTERRUPT_STATUS, 0); + } + if (!mpt_wait_for_doorbell(adap, limit)) + return 0; + wl(HOST_INTERRUPT_STATUS, 0); + + status = get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK; + if (status == MPI_IOCSTATUS_SUCCESS || + status == MPI_IOCSTATUS_CONFIG_INVALID_PAGE || + status == MPI_IOCSTATUS_CONFIG_INVALID_DATA || + status == MPI_IOCSTATUS_CONFIG_INVALID_ACTION) + return 1; + else + return 0; +} + + +int +mpt_issue_command_and_wait(mpt_adap_t *adap, int wait) +{ + U8 function = ((MPIHeader_t *)adap->shared->message)->Function; + int handle; + time_t limit = time(NULL) + wait; + + adap->command_active = TRUE; + + if (mpi1) + { + if (function == MPI_FUNCTION_SCSI_TASK_MGMT) + { + if (mpt_send_message(adap, sizeof(SCSITaskMgmt_t), limit) != 1) + { + printf("mpt_send_message failed!\n"); + return 0; + } + } + else + { + wl(REQUEST_QUEUE, (U32)adap->shared_ba + (U32)offsetof(mpt_shared_t, message)); + } + } + else + { + if (function == MPI_FUNCTION_SCSI_TASK_MGMT) + { + /* SCSI Task Mgmt requests have to use high priority */ + wl2(REQUEST_DESCRIPTOR_POST_LOW, (1 << 16) + MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY); + wl2(REQUEST_DESCRIPTOR_POST_HIGH, 0); + } + else if (function == MPI_FUNCTION_SCSI_IO_REQUEST) + { + handle = get16(((Mpi2SCSIIORequest_t *)adap->shared->message)->DevHandle); + + /* SCSI requests have to use SCSI IO and supply a handle */ + wl2(REQUEST_DESCRIPTOR_POST_LOW, (1 << 16) + MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO); + wl2(REQUEST_DESCRIPTOR_POST_HIGH, handle << 16); + } + else if (function == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) + { + handle = get16(((Mpi2SCSIIORequest_t *)adap->shared->message)->DevHandle); + + /* RAID Passthru requests have to use default descriptor and supply a handle */ + wl2(REQUEST_DESCRIPTOR_POST_LOW, (1 << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE); + wl2(REQUEST_DESCRIPTOR_POST_HIGH, handle << 16); + } + else + { + wl2(REQUEST_DESCRIPTOR_POST_LOW, (1 << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE); + wl2(REQUEST_DESCRIPTOR_POST_HIGH, 0); + } + } + + while (time(NULL) < limit) + { + if (mpt_watchdog(adap)) + { + break; + } + mpt_interrupt(adap); + if (adap->command_active == TRUE) + { + DELAY(1); + } + else + { + break; + } + } + + if (adap->command_active == TRUE) + { + if (time(NULL) >= limit) + printf("timeout occurred!\n"); + return 0; + } + + return 1; +} + + +int +mpt_issue_config_and_wait(mpt_adap_t *adap, int wait) +{ + time_t limit = time(NULL) + wait; + + adap->config_active = TRUE; + + if (mpi1) + { + wl(REQUEST_QUEUE, (U32)adap->shared_ba + (U32)offsetof(mpt_shared_t, message)); + } + else + { + wl2(REQUEST_DESCRIPTOR_POST_LOW, (1 << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE); + wl2(REQUEST_DESCRIPTOR_POST_HIGH, 0); + } + + while (time(NULL) < limit) + { + if (adap->restart_needed == TRUE) + { + return 0; + } + mpt_interrupt(adap); + if (adap->config_active == TRUE) + { + DELAY(1); + } + else + { + break; + } + } + + if (adap->config_active == TRUE) + return 0; + + return 1; +} + + +/* + * mpt_issue_ioc_facts - issue an IOCFacts command to the IOC. + */ +int +mpt_issue_ioc_facts(mpt_adap_t *adap) +{ + IOCFacts_t *request = (IOCFacts_t *)adap->shared->message; + IOCFactsReply_t *reply = (IOCFactsReply_t *)adap->shared->data; + time_t limit = time(NULL) + 10; + int t; + +// printf("%s: sending IOCFacts\n", adap->name); + + bzero(request, sizeof(*request)); + + request->Function = MPI_FUNCTION_IOC_FACTS; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / IOCFacts failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / IOCFacts failed\n", adap->name); + return 0; + } + + adap->mpt_version = get16(reply->MsgVersion); + + if (mpi2) + { + return mpt2_issue_ioc_facts(adap); + } + + if (reply->WhoInit == MPI_WHOINIT_PCI_PEER) + { + printf("%s: WhoInit is PCI Peer!\n", adap->name); + return 0; + } + +// printf("BlockSize = %x\n", reply->BlockSize); +// printf("ReplyQueueDepth = %x\n", get16(reply->ReplyQueueDepth)); +// printf("RequestFrameSize = %x\n", get16(reply->RequestFrameSize)); +// printf("GlobalCredits = %x\n", get16(reply->GlobalCredits)); +// printf("NumberOfPorts = %x\n", reply->NumberOfPorts); + +// if (get16(reply->MsgVersion) < MPI_VERSION_01_02) +// printf("%s: MPT Version = %04x, Firmware Version = %04x\n", +// adap->name, get16(reply->MsgVersion), +// get16(reply->Reserved_0101_FWVersion)); +// else +// printf("%s: MPT Version = %04x, Firmware Version = %08x\n", +// adap->name, get16(reply->MsgVersion), +// get32(reply->FWVersion.Word)); + + adap->message_size = get16(reply->RequestFrameSize) * 4; + adap->reply_depth = get16(reply->ReplyQueueDepth); + adap->credits = get16(reply->GlobalCredits); + adap->port_count = reply->NumberOfPorts; + adap->block_size = reply->BlockSize; + + adap->hrsm_capable = FALSE; + if (get16(reply->MsgVersion) >= MPI_VERSION_01_05) + if (get32(reply->IOCCapabilities) & MPI_IOCFACTS_CAPABILITY_REPLY_HOST_SIGNAL) + adap->hrsm_capable = TRUE; + if (adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1064 || + adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1064E || + adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1066 || + adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1066E || + adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1068 || + adap->device_id == MPI_MANUFACTPAGE_DEVID_SAS1068E) + { + U32 version = get32(reply->FWVersion.Word); + + if (version < 0x00040100) + adap->hrsm_capable = FALSE; + if (version >= 0x01000000 && version < 0x01050000) + adap->hrsm_capable = FALSE; + } + + if (reply->MaxDevices) + if (adap->max_targets > reply->MaxDevices) + adap->max_targets = reply->MaxDevices; + + if (adap->port_type == MPI_PORTFACTS_PORTTYPE_SCSI) + if (adap->max_targets > 16) + adap->max_targets = 16; + + return 1; +} + + +int +mpt2_issue_ioc_facts(mpt_adap_t *adap) +{ + Mpi2IOCFactsRequest_t *request = (Mpi2IOCFactsRequest_t *)adap->shared->message; + Mpi2IOCFactsReply_t *reply = (Mpi2IOCFactsReply_t *)adap->shared->data; + time_t limit = time(NULL) + 10; + int t; + + bzero(request, sizeof(*request)); + + request->Function = MPI2_FUNCTION_IOC_FACTS; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / IOCFacts failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / IOCFacts failed\n", adap->name); + return 0; + } + + if (reply->WhoInit == MPI2_WHOINIT_PCI_PEER) + { + printf("%s: WhoInit is PCI Peer!\n", adap->name); + return 0; + } + +// printf("MaxReplyDescriptorPostQueueDepth = %x\n", get16(reply->MaxReplyDescriptorPostQueueDepth)); +// printf("IOCRequestFrameSize = %x\n", get16(reply->IOCRequestFrameSize)); +// printf("RequestCredit = %x\n", get16(reply->RequestCredit)); +// printf("NumberOfPorts = %x\n", reply->NumberOfPorts); + +// printf("%s: MPT Version = %04x, Firmware Version = %08x\n", +// adap->name, get16(reply->MsgVersion), +// get32(reply->FWVersion.Word)); + + adap->message_size = get16(reply->IOCRequestFrameSize) * 4; + adap->reply_depth = get16(reply->MaxReplyDescriptorPostQueueDepth); + adap->credits = get16(reply->RequestCredit); + adap->port_count = reply->NumberOfPorts; + + adap->hrsm_capable = FALSE; + + if (get16(reply->MaxTargets)) + if (adap->max_targets > get16(reply->MaxTargets)) + adap->max_targets = get16(reply->MaxTargets); + + return 1; +} + + +/* + * mpt_issue_ioc_init - issue an IOCInit command to the IOC. + */ +int +mpt_issue_ioc_init(mpt_adap_t *adap) +{ + IOCInit_t *request = (IOCInit_t *)adap->shared->message; + IOCInitReply_t *reply = (IOCInitReply_t *)adap->shared->data; + time_t limit = time(NULL) + 30; + int t; +#if EFI + _U32 high = set32((U32)(adap->shared_ba >> 32)); +#endif + +// printf("%s: sending IOCInit\n", adap->name); + + if (mpi2) + { + return mpt2_issue_ioc_init(adap); + } + + bzero(request, sizeof(*request)); + + request->Function = MPI_FUNCTION_IOC_INIT; + request->WhoInit = MPI_WHOINIT_HOST_DRIVER; + request->MaxDevices = adap->max_targets; + request->MaxBuses = 1; + request->MsgContext = set32(COMMAND_CONTEXT); + request->ReplyFrameSize = set16(sizeof(adap->shared->replies[0])); +#if EFI + request->HostMfaHighAddr = high; + request->SenseBufferHighAddr = high; +#endif + request->MsgVersion = set16(MPI_VERSION); + request->HeaderVersion = set16(MPI_HEADER_VERSION); + + if (adap->hrsm_capable == TRUE) + { + adap->hrsm_value = 0; + request->Flags |= MPI_IOCINIT_FLAGS_REPLY_FIFO_HOST_SIGNAL; + request->ReplyFifoHostSignalingAddr = + set32((U32)adap->shared_ba + + (U32)offsetof(mpt_shared_t, hrsm_value)); + } + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / IOCInit failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / IOCInit failed\n", adap->name); + return 0; + } + reply = reply; + + return 1; +} + + +int +mpt2_issue_ioc_init(mpt_adap_t *adap) +{ + Mpi2IOCInitRequest_t *request = (Mpi2IOCInitRequest_t *)adap->shared->message; + Mpi2IOCInitReply_t *reply = (Mpi2IOCInitReply_t *)adap->shared->data; + time_t limit = time(NULL) + 30; + int t; + time_t now; + uint64_t nowMsec; +#if EFI + _U32 high = set32((U32)(adap->shared_ba >> 32)); +#endif + + bzero(request, sizeof(*request)); + + request->Function = MPI2_FUNCTION_IOC_INIT; + request->WhoInit = MPI2_WHOINIT_SYSTEM_BIOS; + request->SystemRequestFrameSize = set16(sizeof(adap->shared->message) / 4); + request->ReplyDescriptorPostQueueDepth = set16(REPLY_POST_SIZE); + request->ReplyFreeQueueDepth = set16(REPLY_FREE_SIZE); + request->SystemRequestFrameBaseAddress.Low = + set32((U32)adap->shared_ba + offsetof(mpt_shared_t, message) - sizeof(adap->shared->message)); + request->ReplyDescriptorPostQueueAddress.Low = + set32((U32)adap->shared_ba + offsetof(mpt_shared_t, post_queue)); + request->ReplyFreeQueueAddress.Low = + set32((U32)adap->shared_ba + offsetof(mpt_shared_t, free_queue)); +#if EFI + request->SystemReplyAddressHigh = high; + request->SenseBufferAddressHigh = high; + request->SystemRequestFrameBaseAddress.High = high; + request->ReplyDescriptorPostQueueAddress.High = high; + request->ReplyFreeQueueAddress.High = high; +#endif + request->MsgVersion = set16(MPI2_VERSION); + request->HeaderVersion = set16(MPI2_HEADER_VERSION); + + time(&now); + nowMsec = ((uint64_t)(now)) * 1000; + request->TimeStamp.Low = set32((U32)(nowMsec & 0x00000000FFFFFFFF)); + request->TimeStamp.High = set32((U32)((nowMsec & 0xFFFFFFFF00000000) >> 32)); + + adap->free_index = 0; + adap->post_index = 0; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / IOCInit failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / IOCInit failed\n", adap->name); + return 0; + } + reply = reply; + + return 1; +} + + +/* + * mpt_initialize - finish initialization of IOC. + */ +int +mpt_initialize(mpt_adap_t *adap) +{ + U32 doorbell; + int i; + int state; + time_t limit = time(NULL) + 10; + +// printf("%s: initializing IOC\n", adap->name); + + while (time(NULL) < limit) + { + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state == MPI_IOC_STATE_OPERATIONAL) + break; + DELAY(1); + } + + if (state != MPI_IOC_STATE_OPERATIONAL) + { + if (state == MPI_IOC_STATE_FAULT) + { + printf("\n%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nHit Enter to continue "); + + getYesNoAnswer(0); + + printf("\n"); + } + adap->restart_needed = TRUE; + return 0; + } + + if (mpi1) + { + for (i = 0; i < NUM_REPLIES; i++) + { + wl(REPLY_QUEUE, (U32)adap->shared_ba + (U32)offsetof(mpt_shared_t, replies[i])); + } + } + else + { + for (i = 0; i < NUM_REPLIES; i++) + { + adap->shared->free_queue[i] = + (U32)adap->shared_ba + (U32)offsetof(mpt_shared_t, replies[i]); + } + adap->free_index = i; + wl2(REPLY_FREE_HOST_INDEX, i); + bzero(adap->shared->post_queue, sizeof(adap->shared->post_queue)); + for (i = 0; i < REPLY_POST_SIZE; i++) + { + adap->shared->post_queue[i].ReplyFlags = MPI2_RPY_DESCRIPT_FLAGS_UNUSED; + } + } + + adap->interrupt_mask &= ~MPI_HIM_RIM; +// wl(HOST_INTERRUPT_MASK, adap->interrupt_mask); + + return 1; +} + + +/* + * mpt_issue_port_facts - issue a PortFacts command to the IOC. + */ +int +mpt_issue_port_facts(mpt_adap_t *adap, int port) +{ + PortFacts_t *request = (PortFacts_t *)adap->shared->message; + PortFactsReply_t *reply = (PortFactsReply_t *)adap->shared->data; + time_t limit = time(NULL) + 10; + int t; + +// printf("%s: sending PortFacts to port %d\n", adap->name, port); + + if (mpi2) + { + return mpt2_issue_port_facts(adap, port); + } + + bzero(request, sizeof(*request)); + + request->Function = MPI_FUNCTION_PORT_FACTS; + request->PortNumber = port; + request->MsgContext = set32(COMMAND_CONTEXT); + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / PortFacts failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / PortFacts failed\n", adap->name); + return 0; + } + + adap->port_type = reply->PortType; + adap->host_id = get16(reply->PortSCSIID); + + return 1; +} + + +int +mpt2_issue_port_facts(mpt_adap_t *adap, int port) +{ + Mpi2PortFactsRequest_t *request = (Mpi2PortFactsRequest_t *)adap->shared->message; + Mpi2PortFactsReply_t *reply = (Mpi2PortFactsReply_t *)adap->shared->data; + time_t limit = time(NULL) + 10; + int t; + + bzero(request, sizeof(*request)); + + request->Function = MPI2_FUNCTION_PORT_FACTS; + request->PortNumber = port; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / PortFacts failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / PortFacts failed\n", adap->name); + return 0; + } + + adap->port_type = reply->PortType; + + return 1; +} + + +/* + * mpt_issue_port_enable - issue a PortEnable command to the IOC. + */ +int +mpt_issue_port_enable(mpt_adap_t *adap, int port) +{ + PortEnable_t *request = (PortEnable_t *)adap->shared->message; + MPIDefaultReply_t *reply = (MPIDefaultReply_t *)adap->shared->data; + time_t limit = time(NULL) + 120; + int t; + +// printf("%s: sending PortEnable to port %d\n", adap->name, port); + + if (mpi2) + { + return mpt2_issue_port_enable(adap, port); + } + + bzero(request, sizeof(*request)); + + request->Function = MPI_FUNCTION_PORT_ENABLE; + request->PortNumber = port; + request->MsgContext = set32(COMMAND_CONTEXT); + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / PortEnable failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / PortEnable failed\n", adap->name); + return 0; + } + reply = reply; + + return 1; +} + + +int +mpt2_issue_port_enable(mpt_adap_t *adap, int port) +{ + Mpi2PortEnableRequest_t *request = (Mpi2PortEnableRequest_t *)adap->shared->message; + Mpi2PortEnableReply_t *reply = (Mpi2PortEnableReply_t *)adap->shared->data; + time_t limit = time(NULL) + 120; + int t; + + bzero(request, sizeof(*request)); + + request->Function = MPI2_FUNCTION_PORT_ENABLE; + request->VP_ID = port; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / PortEnable failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / PortEnable failed\n", adap->name); + return 0; + } + reply = reply; + + return 1; +} + + +/* + * mpt_issue_event_notification - issue an EventNotification command to the IOC. + */ +int +mpt_issue_event_notification(mpt_adap_t *adap) +{ + EventNotification_t *request = (EventNotification_t *)adap->shared->message; + EventNotificationReply_t *reply = (EventNotificationReply_t *)adap->shared->data; + time_t limit = time(NULL) + 10; + int t; + +// printf("%s: sending EventNotification\n", adap->name); + + if (mpi2) + { + return mpt2_issue_event_notification(adap); + } + + bzero(request, sizeof(*request)); + + request->Function = MPI_FUNCTION_EVENT_NOTIFICATION; + request->Switch = MPI_EVENT_NOTIFICATION_SWITCH_ON; + request->MsgContext = set32(COMMAND_CONTEXT); + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / EventNotification failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / EventNotification failed\n", adap->name); + return 0; + } + reply = reply; + + return 1; +} + + +int +mpt2_issue_event_notification(mpt_adap_t *adap) +{ + Mpi2EventNotificationRequest_t *request = (Mpi2EventNotificationRequest_t *)adap->shared->message; + Mpi2EventNotificationReply_t *reply = (Mpi2EventNotificationReply_t *)adap->shared->data; + time_t limit = time(NULL) + 10; + int t; + + bzero(request, sizeof(*request)); + + request->Function = MPI2_FUNCTION_EVENT_NOTIFICATION; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / EventNotification failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + printf("%s: mpt_receive_data / EventNotification failed\n", adap->name); + return 0; + } + reply = reply; + + return 1; +} + + +/* + * mpt_watchdog - routine that acts as a watchdog. + */ +int +mpt_watchdog(mpt_adap_t *adap) +{ + U32 doorbell; + int state; + + if (mpi2) // move code to mpt_interrupt, so we don't poll during DMA + { + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state != MPI_IOC_STATE_OPERATIONAL) + { + if (state == MPI_IOC_STATE_FAULT) + { + printf("%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nHit Enter to Continue "); + + getYesNoAnswer(0); + + printf("\n"); + } + adap->restart_needed = TRUE; + } + } + + if (adap->restart_needed == TRUE) + { + mpt_restart(adap); + return 1; + } + else if (adap->bus_reset_needed == TRUE) + { + adap->bus_reset_needed = FALSE; + mpt_bus_reset(adap); + } + + return 0; +} + + +/* + * mpt_init_device_capabilities - initialize SCSI device capabilities. + */ +int +mpt_init_device_capabilities(mpt_adap_t *adap) +{ + SCSIPortPage0_t *scsi_port_0 = (SCSIPortPage0_t *)adap->shared->config; + SCSIPortPage2_t *scsi_port_2 = (SCSIPortPage2_t *)adap->shared->config; + int init_capabilities; + int init_sync_period; + int targ_capabilities; + int targ_sync_period; + int targ_device_flags; + int targ; + + if (!mpt_get_config_page(adap, MPI_CONFIG_PAGETYPE_SCSI_PORT, 0, 0)) + { + printf("%s: Failed to get SCSI Port Page 0\n", adap->name); + return 0; + } + + init_capabilities = get32(scsi_port_0->Capabilities); + + init_sync_period = MPI_SCSIPORTPAGE0_CAP_GET_MIN_SYNC_PERIOD(init_capabilities); + + if (!mpt_get_config_page(adap, MPI_CONFIG_PAGETYPE_SCSI_PORT, 2, 0)) + { + printf("%s: Failed to get SCSI Port Page 2\n", adap->name); + return 0; + } + + for (targ = 0; targ < adap->max_targets; targ++) + { + targ_sync_period = scsi_port_2->DeviceSettings[targ].SyncFactor; + targ_device_flags = get16(scsi_port_2->DeviceSettings[targ].DeviceFlags); + targ_capabilities = init_capabilities; + if (targ_sync_period == 0 || targ_sync_period > init_sync_period) + { + targ_capabilities &= ~MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK; + targ_capabilities |= targ_sync_period << MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD; + } + if (targ_device_flags & MPI_SCSIPORTPAGE2_DEVICE_WIDE_DISABLE) + { + targ_capabilities &= ~MPI_SCSIDEVPAGE1_RP_WIDE; + } + adap->capabilities[targ] = targ_capabilities; + } + + return 1; +} + + +/* + * mpt_set_device_capabilities - set SCSI device capabilities. + */ +int +mpt_set_device_capabilities(mpt_adap_t *adap, int targ) +{ + SCSIDevicePage1_t *scsi_device_1 = (SCSIDevicePage1_t *)adap->shared->config; + +// printf("%s: setting device capabilities\n", adap->name); + + bzero(scsi_device_1, sizeof(*scsi_device_1)); + + /* + * Set the control bits we know we want, as well as the maximum + * synchronous offset and minimum synchronous period. + */ + scsi_device_1->RequestedParameters = set32(adap->capabilities[targ]); + + if (!mpt_set_config_page(adap, MPI_CONFIG_PAGETYPE_SCSI_DEVICE, 1, targ)) + { + printf("%s: Failed to set SCSI Device Page 1 for %d\n", + adap->name, targ); + return 0; + } + + return 1; +} + + +/* + * mpt_set_on_bus_timer - set SCSI port on-bus-timer value. + */ +int +mpt_set_on_bus_timer(mpt_adap_t *adap, int timeout) +{ + SCSIPortPage1_t *scsi_port_1 = (SCSIPortPage1_t *)adap->shared->config; + U32 config; + +// printf("%s: setting on-bus-timer\n", adap->name); + + bzero(scsi_port_1, sizeof(*scsi_port_1)); + + config = adap->host_id | (1 << (adap->host_id + 16)); + scsi_port_1->Configuration = set32(config); + /* + * Convert from milliseconds to 1.6 microsecond units. + */ + scsi_port_1->OnBusTimerValue = set32(timeout * 1000*10/16); + + if (!mpt_set_config_page(adap, MPI_CONFIG_PAGETYPE_SCSI_PORT, 1, 0)) + { + printf("%s: Failed to set SCSI Port Page 1\n", adap->name); + } + + return 1; +} + + +/* + * mpt_get_config_page - get a configuration page. + */ +int +mpt_get_config_page(mpt_adap_t *adap, int type, int number, int address) +{ + ConfigReply_t *reply = (ConfigReply_t *)adap->shared->data; + int t; + int ioc_status; + int length; + + t = mpt_do_config_action(adap, MPI_CONFIG_ACTION_PAGE_HEADER, type, number, address, 0); + ioc_status = get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK; + length = reply->Header.PageLength; + if (!t || ioc_status != MPI_IOCSTATUS_SUCCESS || length == 0) + { + if (ioc_status != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + { + printf("%s: Failed to get config page header\n", + adap->name); + printf("%s: IOCStatus = %04x, PageLength = %x\n", + adap->name, ioc_status, length); + printf("%s: type = %d, number = %d, address = %x\n", + adap->name, type, number, address); + } + return 0; + } + + t = mpt_do_config_action(adap, MPI_CONFIG_ACTION_PAGE_READ_CURRENT, type, number, address, length); + ioc_status = get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK; + if (!t || ioc_status != MPI_IOCSTATUS_SUCCESS) + { + if (ioc_status != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + { + printf("%s: Failed to get config page\n", + adap->name); + printf("%s: IOCStatus = %04x, PageLength = %x\n", + adap->name, ioc_status, length); + printf("%s: type = %d, number = %d, address = %x\n", + adap->name, type, number, address); + } + return 0; + } + + return 1; +} + + +/* + * mpt_set_config_page - set a configuration page. + */ +int +mpt_set_config_page(mpt_adap_t *adap, int type, int number, int address) +{ + ConfigReply_t *reply = (ConfigReply_t *)adap->shared->data; + int t; + int ioc_status; + int length; + + t = mpt_do_config_action(adap, MPI_CONFIG_ACTION_PAGE_HEADER, type, number, address, 0); + ioc_status = get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK; + length = reply->Header.PageLength; + if (!t || ioc_status != MPI_IOCSTATUS_SUCCESS || length == 0) + { + if (ioc_status != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + { + printf("%s: Failed to get config page header\n", + adap->name); + printf("%s: IOCStatus = %04x, PageLength = %x\n", + adap->name, ioc_status, length); + printf("%s: type = %d, number = %d, address = %x\n", + adap->name, type, number, address); + } + return 0; + } + + *(ConfigPageHeader_t *)adap->shared->config= reply->Header; + + t = mpt_do_config_action(adap, MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT, type, number, address, length); + ioc_status = get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK; + if (!t || ioc_status != MPI_IOCSTATUS_SUCCESS) + { + if (ioc_status != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + { + printf("%s: Failed to set config page\n", + adap->name); + printf("%s: IOCStatus = %04x, PageLength = %x\n", + adap->name, ioc_status, length); + printf("%s: type = %d, number = %d, address = %x\n", + adap->name, type, number, address); + } + return 0; + } + + return 1; +} + + +int +mpt_do_config_action(mpt_adap_t *adap, int action, int type, int number, int address, int length) +{ + Config_t *request = (Config_t *)adap->shared->message; + ConfigReply_t *reply = (ConfigReply_t *)adap->shared->data; + SGESimple64_t *sge_simple = (SGESimple64_t *)&request->PageBufferSGE; + time_t limit = time(NULL) + 10; + int t; + U32 flags; + + bzero(request, sizeof(*request)); + bzero(reply, sizeof(*reply)); + + request->Function = MPI_FUNCTION_CONFIG; + request->Action = action; + request->MsgContext = set32(COMMAND_CONTEXT); + if (action == MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT || + action == MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM) + { + request->Header = *(ConfigPageHeader_t *)adap->shared->config; + } + else + { + request->Header.PageType = type; + request->Header.PageNumber = number; + request->Header.PageLength = length; + } + request->PageAddress = set32(address); + if (length) + { + flags = (length * 4) | + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_64_BIT_ADDRESSING | + MPI_SGE_FLAGS_END_OF_BUFFER | + MPI_SGE_FLAGS_END_OF_LIST); + if (action == MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT || + action == MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM) + { + flags |= MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_HOST_TO_IOC); + } + else + { + flags |= MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_IOC_TO_HOST); + } + sge_simple->FlagsLength = set32(flags); + sge_simple->Address.Low = set32((U32)adap->shared_ba + offsetof(mpt_shared_t, config)); +#if EFI + sge_simple->Address.High = set32((U32)(adap->shared_ba >> 32)); +#endif + } + else if (mpi2) + { + sge_simple->FlagsLength = set32( + MPI_SGE_SET_FLAGS(MPI_SGE_FLAGS_SIMPLE_ELEMENT | + MPI_SGE_FLAGS_LAST_ELEMENT | + MPI_SGE_FLAGS_64_BIT_ADDRESSING | + MPI_SGE_FLAGS_END_OF_BUFFER | + MPI_SGE_FLAGS_END_OF_LIST)); + } + + + if (mpt_verify_operational(adap)) + { + logMptCommandReq(adap->port, request, sizeof(*request)); + + t = mpt_issue_config_and_wait(adap, 10); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + if ((get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK) != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + { + printf("%s: mpt_issue_config_and_wait / Config failed!\n", adap->name); + } + return 0; + } + + return 1; + } + + if (mpt_verify_ready(adap)) + { + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / Config failed\n", adap->name); + return 0; + } + + t = mpt_receive_data(adap, sizeof(*reply), limit); + + logMptCommandRep(adap->port, request, sizeof(*request), reply, sizeof(*reply), t); + + if (!t) + { + if ((get16(reply->IOCStatus) & MPI_IOCSTATUS_MASK) != MPI_IOCSTATUS_CONFIG_INVALID_PAGE) + { + printf("%s: mpt_receive_data / Config failed\n", adap->name); + } + return 0; + } + + return 1; + } + + return 0; +} + + +void +mpt_bus_reset(mpt_adap_t *adap) +{ + SCSITaskMgmt_t *request = (SCSITaskMgmt_t *)adap->shared->message; + time_t limit = time(NULL) + 10; + +// printf("%s: sending SCSITaskMgmt (ResetBus)\n", adap->name); + + /* + * Use a SCSI Task Management request to reset the bus. + */ + bzero(request, sizeof(*request)); + + request->Function = MPI_FUNCTION_SCSI_TASK_MGMT; + request->TaskType = MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS; + request->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIP_RESET_OPTION; + + logMptCommandReq(adap->port, request, sizeof(*request)); + + if (!mpt_send_message(adap, sizeof(*request), limit)) + { + printf("%s: mpt_send_message / SCSITaskMgmt failed\n", adap->name); + adap->restart_needed = TRUE; + } +} + + +void +mpt_interrupt(mpt_adap_t *adap) +{ + U32 context; + U32 reply_ba; + MPIDefaultReply_t *reply; + U32 doorbell; + int state; + +// printf("mpt_interrupt called\n"); + + if (mpi2) + { + mpt2_interrupt(adap); + return; + } + + if (adap->hrsm_capable) + { + if (adap->hrsm_value == adap->shared->hrsm_value) + return; + adap->hrsm_value = adap->shared->hrsm_value; + } + + doorbell = rl(DOORBELL); + state = doorbell & MPI_IOC_STATE_MASK; + if (state != MPI_IOC_STATE_OPERATIONAL) + { + if (state == MPI_IOC_STATE_FAULT) + { + printf("%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + if (wFlag) + fprintf(logFile, "%s: MPT Firmware Fault, code %04x\n", + adap->name, doorbell & MPI_DOORBELL_DATA_MASK); + + printf("\nHit Enter to continue "); + + getYesNoAnswer(0); + + printf("\n"); + } + adap->restart_needed = TRUE; + } + + while ((context = rl(REPLY_QUEUE)) != 0xffffffff) + { + if (context & MPI_CONTEXT_REPLY_A_BIT) + { + reply_ba = context << 1; + reply = (MPIDefaultReply_t *)((U8 *)adap->shared + reply_ba - (U32)adap->shared_ba); + if (mpt_handle_reply(adap, reply, reply_ba)) + wl(REPLY_QUEUE, reply_ba); + continue; + } + if (context == PASS_THRU_CONTEXT) + { + if (adap->command_active == TRUE) + { + SCSIIOReply_t *scsiRep = (SCSIIOReply_t *)adap->shared->data; + + adap->command_active = FALSE; + bzero(scsiRep, sizeof(*scsiRep)); + } + continue; + } + printf("%s: Invalid reply, Context = %08x\n", adap->name, reply); + } +} + + +void +mpt2_interrupt(mpt_adap_t *adap) +{ + int index; + Mpi2DefaultReplyDescriptor_t *reply_desc; + int reply_type; + int count; + + index = adap->post_index; + count = 0; + while (TRUE) + { + reply_desc = &adap->shared->post_queue[index]; + reply_type = reply_desc->ReplyFlags & MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK; + if (reply_type == MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS) + { + mpt2_handle_scsi_io_success(adap, reply_desc); + } + else if (reply_type == MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY) + { + mpt2_handle_address_reply(adap, reply_desc); + } + else if (reply_type == MPI2_RPY_DESCRIPT_FLAGS_UNUSED) + { + break; + } + else + { + printf("%s: Invalid reply, ReplyType = %x\n", adap->name, reply_type); + } + reply_desc->ReplyFlags = MPI2_RPY_DESCRIPT_FLAGS_UNUSED; + index++; + if (index == REPLY_POST_SIZE) + index = 0; + count++; + } + + if (count) + { + adap->post_index = index; + wl2(REPLY_POST_HOST_INDEX, index); + } +} + + +int +mpt_handle_reply(mpt_adap_t *adap, MPIDefaultReply_t *reply, U32 reply_ba) +{ + U32 context; + EventNotificationReply_t *event; + EventDataScsi_t *ed_scsi; + EventAckReply_t *event_ack; + int targ; + int repost; + + repost = 1; + context = get32(reply->MsgContext); + + if (get16(reply->IOCStatus) & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) + { + printf("%s: Function = %02x, IOCStatus = %04x, IOCLogInfo = %08x\n", + adap->name, reply->Function, get16(reply->IOCStatus), + get32(reply->IOCLogInfo)); + } + + if (context == PASS_THRU_CONTEXT) + { + if (adap->command_active == TRUE) + { + adap->command_active = FALSE; + bcopy(reply, adap->shared->data, reply->MsgLength * 4); + } + return repost; + } + + switch (reply->Function) + { + case MPI_FUNCTION_CONFIG: + if (adap->config_active == TRUE) + { + adap->config_active = FALSE; + bcopy(reply, adap->shared->data, reply->MsgLength * 4); + } + break; + case MPI_FUNCTION_EVENT_NOTIFICATION: + logMptCommandRep(adap->port, NULL, 0, reply, sizeof(*reply), 1); + event = (EventNotificationReply_t *)reply; + switch (get32(event->Event)) + { + case MPI_EVENT_NONE: + break; + case MPI_EVENT_STATE_CHANGE: + adap->restart_needed = TRUE; + break; + case MPI_EVENT_ON_BUS_TIMER_EXPIRED: + ed_scsi = (EventDataScsi_t *)event->Data; + targ = ed_scsi->TargetID; + printf("%s: ON BUS TIMER EXPIRED for SCSI target %d\n", adap->name, targ); + adap->bus_reset_needed = TRUE; + break; + } + if (event->AckRequired) + { + _U32 t1; + _U32 t2; + EventAck_t *event_ack; + + t1 = event->Event; + t2 = event->EventContext; + /* + * Use the EventNotify reply as the EventAck command. + */ + event_ack = (EventAck_t *)event; + bzero(event_ack, sizeof(*event_ack)); + event_ack->Function = MPI_FUNCTION_EVENT_ACK; + event_ack->MsgContext = set32(reply_ba); + event_ack->Event = t1; + event_ack->EventContext = t2; + wl(REQUEST_QUEUE, get32(event_ack->MsgContext)); + /* + * Signal that the reply should not be given back to + * the IOC yet, since it's being used as the EventAck + * command right now. + */ + repost = 0; + } + break; + case MPI_FUNCTION_EVENT_ACK: + event_ack = (EventAckReply_t *)reply; + wl(REPLY_QUEUE, get32(event_ack->MsgContext)); + break; + default: + printf("%s: Invalid reply, Function = %02x, IOCStatus = %04x\n", + adap->name, reply->Function, get16(reply->IOCStatus)); +#if 1 +{ + int i; + U32 *p = (U32 *)reply; + + for (i = 0; i < reply->MsgLength; i++) + printf("reply[%02x] = %08x\n", i*4, get32x(p[i])); +} +#endif + break; + } + + return repost; +} + + +void +mpt2_handle_scsi_io_success(mpt_adap_t *adap, Mpi2DefaultReplyDescriptor_t *reply_desc) +{ + Mpi2SCSIIOSuccessReplyDescriptor_t *scsi_io_success; + U32 context; + + scsi_io_success = (Mpi2SCSIIOSuccessReplyDescriptor_t *)reply_desc; + context = adap->msg_context; + if (get16(scsi_io_success->SMID) == 1) + adap->msg_context = 0; + + if (context == PASS_THRU_CONTEXT) + { + if (adap->command_active == TRUE) + { + Mpi2SCSIIOReply_t *scsiRep = (Mpi2SCSIIOReply_t *)adap->shared->data; + + adap->command_active = FALSE; + bzero(scsiRep, sizeof(*scsiRep)); + } + return; + } + printf("%s: Invalid SCSI IO SUCCESS reply, Context = %08x\n", adap->name, context); +} + + +void +mpt2_handle_address_reply(mpt_adap_t *adap, Mpi2DefaultReplyDescriptor_t *reply_desc) +{ + Mpi2AddressReplyDescriptor_t *address_reply; + MPI2DefaultReply_t *reply; + U32 context; + U32 reply_ba; + int index; + + address_reply = (Mpi2AddressReplyDescriptor_t *)reply_desc; + + reply_ba = get32(address_reply->ReplyFrameAddress); + reply = (MPI2DefaultReply_t *)((U8 *)adap->shared + reply_ba - (U32)adap->shared_ba); + context = adap->msg_context; + if (get16(address_reply->SMID) == 1) + adap->msg_context = 0; + + if (get16(reply->IOCStatus) & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) + { + printf("%s: Function = %02x, IOCStatus = %04x, IOCLogInfo = %08x\n", + adap->name, reply->Function, get16(reply->IOCStatus), + get32(reply->IOCLogInfo)); + } + + if (context == PASS_THRU_CONTEXT) + { + if (adap->command_active == TRUE) + { + adap->command_active = FALSE; + bcopy(reply, adap->shared->data, reply->MsgLength * 4); + } + goto repost; + } + + switch (reply->Function) + { + case MPI2_FUNCTION_CONFIG: + if (adap->config_active == TRUE) + { + adap->config_active = FALSE; + bcopy(reply, adap->shared->data, reply->MsgLength * 4); + } + break; + default: + printf("%s: Invalid reply, Function = %02x, IOCStatus = %04x\n", + adap->name, reply->Function, get16(reply->IOCStatus)); +#if 1 +{ + int i; + U32 *p = (U32 *)reply; + + for (i = 0; i < reply->MsgLength; i++) + printf("reply[%02x] = %08x\n", i*4, get32x(p[i])); +} +#endif + break; + } + +repost: + index = adap->free_index; + adap->shared->free_queue[index] = reply_ba; + index++; + if (index == REPLY_FREE_SIZE) + index = 0; + adap->free_index = index; + wl2(REPLY_FREE_HOST_INDEX, index); +} + + +int mpt_fwdownloadboot(mpt_adap_t *adap) +{ + U16 deviceId = adap->device_id; + MpiFwHeader_t *fwHeader; + MpiExtImageHeader_t *extImageHeader; + U32 *image; + U8 *nextImage; + U32 addr; + U32 size; + U32 next; + U32 data; + U32 resetAddr; + U32 resetData; + int t; + + if (adap->fw_image == NULL) + { + char name[256]; + int n; + + if (adap->fw_image_asked == TRUE) + return 0; + + adap->fw_image_asked = TRUE; + + printf("\nThe firmware on this %s appears broken!\n", adap->port->chipNameRev); + printf("A valid firmware image is required to make this chip operational...\n\n"); + + n = getFileName(name, sizeof name, stdin, "firmware", 99); + if (n > 0) + { + if (readFile(name, &adap->fw_image, &adap->fw_image_size) != 1) + { + printf("\nThe firmware image could not be read\n"); + return 0; + } + } + else + { + printf("\nThe chip cannot be made operational\n"); + return 0; + } + } + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC909 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919 || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929) + { + return mpt_directdownload(adap); + } + + wl(WRITE_SEQUENCE, 0); + wl(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + wl(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | + MPI_DIAG_PREVENT_IOC_BOOT | + MPI_DIAG_CLEAR_FLASH_BAD_SIG); + DELAY(100); + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949E) + { + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | + MPI_DIAG_PREVENT_IOC_BOOT | + MPI_DIAG_CLEAR_FLASH_BAD_SIG | + MPI_DIAG_RW_ENABLE); + + wlio(DIAG_RW_ADDRESS, 0x40100064); + data = rlio(DIAG_RW_DATA); + + wlio(DIAG_RW_ADDRESS, 0x40100064); + wlio(DIAG_RW_DATA, data | 0x20000); + + DELAY(100); + } + + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | + MPI_DIAG_PREVENT_IOC_BOOT | + MPI_DIAG_RESET_ADAPTER); + DELAY(50000); + + wl(WRITE_SEQUENCE, 0); + wl(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + wl(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | + MPI_DIAG_PREVENT_IOC_BOOT | + MPI_DIAG_CLEAR_FLASH_BAD_SIG | + MPI_DIAG_RW_ENABLE); + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949E) + { + wlio(DIAG_RW_ADDRESS, 0x40100064); + wlio(DIAG_RW_DATA, data); + } + + fwHeader = (MpiFwHeader_t *)adap->fw_image; + + image = (U32 *)fwHeader; + + addr = get32(fwHeader->LoadStartAddress); + size = get32(fwHeader->ImageSize); + + next = get32(fwHeader->NextImageHeaderOffset); + + resetAddr = get32(fwHeader->IopResetRegAddr); + resetData = get32(fwHeader->IopResetVectorValue); + + while (next != 0) + { + nextImage = (U8 *)fwHeader + next; + + extImageHeader = (MpiExtImageHeader_t *)nextImage; + + if (extImageHeader->ImageType == MPI_EXT_IMAGE_TYPE_BOOTLOADER) + { + printf("Found a BootLoader, using only that part of the image!\n"); + + adap->bootloader = TRUE; + + image = (U32 *)extImageHeader; + + addr = get32(extImageHeader->LoadStartAddress); + size = get32(extImageHeader->ImageSize); + + next = 0; + + resetData = addr + sizeof(MpiExtImageHeader_t); + + break; + } + + next = get32(extImageHeader->NextImageHeaderOffset); + } + + if (addr == get32(fwHeader->LoadStartAddress) && + size == get32(fwHeader->ImageSize)) + { + next = get32(fwHeader->NextImageHeaderOffset); + } + + while (1) + { + wlio(DIAG_RW_ADDRESS, addr); + + while (size) + { + data = *image++; + + wlio(DIAG_RW_DATA, data); + + size -= 4; + } + + if (next == 0) + { + break; + } + + nextImage = (U8 *)fwHeader + next; + + extImageHeader = (MpiExtImageHeader_t *)nextImage; + + image = (U32 *)extImageHeader; + + addr = get32(extImageHeader->LoadStartAddress); + size = get32(extImageHeader->ImageSize); + + next = get32(extImageHeader->NextImageHeaderOffset); + } + + wlio(DIAG_RW_ADDRESS, resetAddr); + wlio(DIAG_RW_DATA, resetData); + + if (deviceId == MPI_MANUFACTPAGE_DEVID_53C1030) + { + wlio(DIAG_RW_ADDRESS, 0x3f000000); + data = rlio(DIAG_RW_DATA); + + data |= 0x40000000; + + wlio(DIAG_RW_ADDRESS, 0x3f000000); + wlio(DIAG_RW_DATA, data); + } + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC919X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929X) + { + wlio(DIAG_RW_ADDRESS, 0x3e000000); + data = rlio(DIAG_RW_DATA); + } + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC939X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949X || + deviceId == MPI_MANUFACTPAGE_DEVICEID_FC949E) + { + wlio(DIAG_RW_ADDRESS, 0x3d000000); + data = rlio(DIAG_RW_DATA); + } + + if (adap->bootloader) + { + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | + MPI_DIAG_CLEAR_FLASH_BAD_SIG); + DELAY(100); + + wl(DIAGNOSTIC, 0); + DELAY(100); + + sleep(1); + } + + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | + MPI_DIAG_CLEAR_FLASH_BAD_SIG); + DELAY(100); + + wl(DIAGNOSTIC, 0); + DELAY(100); + + t = mpt_wait_for_ready(adap); + + if (wFlag) + fprintf(logFile, "%s: Firmware Download Boot: %s\n", + adap->name, t ? "PASS" : "FAIL"); + + if (t) + return 1; + + printf("\n%s: FWDownloadBoot failed!\n", adap->name); + return 0; +} + + +int +mpt_directdownload(mpt_adap_t *adap) +{ + U16 deviceId = adap->device_id; + U32 mask = adap->diagmem_size - 1; + MpiFwHeader_t *fwHeader; + U32 *image; + U32 addr; + U32 size; + U32 data; + int t; + + wl(WRITE_SEQUENCE, 0); + wl(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + wl(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM); + DELAY(100); + + /* If FlashBadSig is set, the download doesn't seem to work if we reset + * the chip here. + * + * If FlashBadSig isn't set, the download doesn't seem to work if we + * don't reset the chip here. + */ + data = rl(DIAGNOSTIC); + if (!(data & MPI_DIAG_FLASH_BAD_SIG)) + { + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | MPI_DIAG_RESET_ADAPTER); + DELAY(50000); + + wl(WRITE_SEQUENCE, 0); + wl(WRITE_SEQUENCE, MPI_WRSEQ_KEY_VALUE_MASK); + wl(WRITE_SEQUENCE, MPI_WRSEQ_1ST_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_2ND_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_3RD_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_4TH_KEY_VALUE); + wl(WRITE_SEQUENCE, MPI_WRSEQ_5TH_KEY_VALUE); + } + + wl(DIAGNOSTIC, MPI_DIAG_DISABLE_ARM | MPI_DIAG_MEM_ENABLE); + + addr = 0x50004; + rldiag(addr, data); + data &= ~0x80000000; + wldiag(addr, data); + + if (deviceId == MPI_MANUFACTPAGE_DEVICEID_FC929) + { + addr = 0x51004; + rldiag(addr, data); + data &= ~0x80000000; + wldiag(addr, data); + } + + if (rl(DIAGNOSTIC) & MPI_DIAG_FLASH_BAD_SIG) + { + addr = 0x40000; + rldiag(addr, data); + data |= 0x40000000; + wldiag(addr, data); + } + + fwHeader = (MpiFwHeader_t *)adap->fw_image; + + image = (U32 *)fwHeader; + + addr = get32(fwHeader->LoadStartAddress); + size = get32(fwHeader->ImageSize); + + while (size) + { + data = *image++; + + wldiag(addr, data); + + addr += 4; + size -= 4; + } + + addr = get32(fwHeader->IopResetRegAddr); + data = get32(fwHeader->IopResetVectorValue); + + wldiag(addr, data); + + addr = 0x40000; + rldiag(addr, data); + data |= 0x40000000; + wldiag(addr, data); + + wl(DIAGNOSTIC, 0); + DELAY(100); + + t = mpt_wait_for_ready(adap); + + if (wFlag) + fprintf(logFile, "%s: Firmware Direct Download: %s\n", + adap->name, t ? "PASS" : "FAIL"); + + if (t) + return 1; + + printf("\n%s: DirectDownload failed!\n", adap->name); + return 0; +} + + +/* vi: set sw=4 ts=4 sts=4 et :iv */

AE4B+2xnxuc|eG|0* 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%0DdS!0AFkYa(AbK<$f}9{-Z0>I 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%0AJm&>5=|9 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