Neutrino QNX Dev Drivers equivalent.

Hi all,

I have a very very annoying problem.
I am in charge of the development of a driver for a serial multiport
card under Neutrino. A driver for this card already
exists under QNX 4.24 and I have the source code for it.
My job is just to adapt the current source code to Neutrino.

But, and here come the problems, the QNX driver
uses the classic Dev <-> Dev Drivers communication
structure. It uses the sys/_devdrvr.h include file and
some functions like dev_drvr_register() to register the driver
and some callback functions that should be called by Dev
to add stuff in the output queues (Kick()), etc … or
like dev_drvr_mount to allocate input/output buffers …
Moreover, Dev provides a tti() function for the driver to add stuff
in the input queue etc …
I have some difficulties finding some good papers on the
way Neutrino handles this type of driver. It seems that
the equivalent of Dev interface is io-char in Neutrino but
i have not been able to find more information on how to use it and
on the equivalent of the few QNX functions above.

Is there a strict correspondancy between the io-char use
and behaviour and the Dev ones ?
Is there some equivalent functions that achieve the same
tasks as the ones above ?
Can some one provide me some good and accurate
informations/urls/docs about that problem ?

I give in attachment the classic Dev Driver document
that covers and explains all the functions that i have
cited above.

Thank you in advance for your help,


ABREU Alexandre


begin 666 Dev_doc.txt
M(" @(" @(" @(" @(" @(" @(" @("!13E@@-"!$979I8V4@1’)I=F5R<R -
M"@T26YT<F]D=6-T:6]N#0H-“E=H96X@>6]U(&YE960@=&@<’)O=FED92!A
M;B!I;G1E<F9A8V4@=&@82!T<F%D:71I;VYA;”!F;W)M(&]F#0IC:&%R86-T
M97(@9&5V:6-E(“AM;V1E;2P@=&5R;6EN86P@;W(@<’)I;G1E<BD@=VAI8V@@
M=VEL;”!B90T
86-C97-S960@8GD@<’)O9W)A;7,@=VAI8V@@97AP96-T(‘1O
M(’-E92!A(#$P,“4@4$]325@@,3 P,RXQ#0II;G1E<F9A8V4L(‘1H96X@>6]U
M(’!R;V)A8FQY(&YE960@=&@=W)I=&4@82!$978@1’)I=F5R(’!R;V-E<W,N
M( T5&AE(%!/4TE8(&EN=&5R9F%C92!I;F-L=61E<R!S97)V:6-E<R!S=6-H
M(&%S(&UO9&5M(&-O;G1R;VPL(&QI;F4-“F1I<V-I<&QI;F4L(&)A=60@<F%T
M97,L(’!A2P@96-H;RP@;&EN92!E9&ET:6YG+”!T:6UE9"!R96%D<RP-
M"FEN=&5R8GET92!T:6UI;F<L(&5T8RX@($%L;"!O9B!T:&5S92!S97)V:6-E
M<R!A<F4@<’)O=FED960@9F]R#0IA;F0@;6%N86=E9"!B>2!T:&4@44Y8-"!$
M978@<’)O8V5S<RX@(%%.6#0@1&5V($1R:79E<G,@<VEM<&QY#0IP<F]V:61E
M('1H92!H87)D=V%R92!I;G1E<F9A8V4@8F5T=V5E;B!$978@86YD('1H92!H
M87)D=V%R92!U<VEN9PT
82!P<FEV871E+”!H:6=H;‘D@;W!T:6UI>F5D(&EN
M=&5R9F%C92X@(%1H92!O;FQY(’)E<W!O;G-I8FEL:71Y#0IO9B!A(%%.6#0@
M1&5V($1R:79E<B!I<R!T;R!P<F]V:61E(&%C8V5S<R!T;R!T:&4@:&%R9’=A
M<F4N("!4:&4-“G)E86P@=V]R:R!I<R!D;VYE(&)Y($1E=B!I=’-E;&8N#0H-
M"D)E9F]R92!W92!S=&%R=“P@:70@<VAO=6QD(&)E(’!O:6YT960@;W5T(‘1H
M870@1&5V($1R:79E<G,@87)E#0IN;W0@=&AE(&]N;‘D@;65T:&]D(&]F(&EN
M=&5R9F%C:6YG(‘1O(&AA<F1W87)E(&1E=FEC97,@:6X@44Y8-“X@#0I);B!F
M86-T+”!U;FQE<W,@>6]U<B!D979I8V4@;&]O:W,@=F5R>2!M=6-H(&QI:V4@
M82!T>7!I8V%L(’-E<FEA; T9&5V:6-E+"!Y;W4@<’)O8F%B;‘D@9&]N)W0@
M=V%N="!T;R!W<FET92!A($1E=B!$<FEV97(N#0H-“DUA;GD@=‘EP97,@;V8@
M:&%R9’=A<F4@87)E(&)E=‘1E<B!H86YD;&5D(&EN(%%.6#0@8GD@82!S97)V
M97(-"G!R;V-E<W,@=VAI8V@@<F5S<&]N9’,@=&@8W5S=&]M(&UE<W-A9V5S
M(&1I<F5C=&QY(&9R;VT@8VQI96YT#0IP<F]C97-S97,N(”!296UE;6)E<B!T
M:&%T(&%N>2!P<F]C97-S(&-A;B!A8V-E<W,@=&AE(&AA<F1W87)E(&EF#0II
M="!H87,@<W5F9FEC:65N="!P<FEV:71Y+"!S;R!S=6-H(’-E<G9E<B!P<F]C
M97-S97,@87)E#0IR96UA<FMA8FQY(&5A<WD@=&@9&5V96QO<“P@86YD(&%R
M92!O9G1E;B!M=6-H(&5A<VEE<B!T;R!D979E;&]P#0IT:&%N(&$@1&5V($1R
M:79E<B H<V5E('1H92!#;&EE;G0O4V5R=F5R('1E8VAN:6-A;”!N;W1E(&9O
M<B!M;W)E#0II;F9O<FUA=&EO;BDN#0H-“DEF(‘1H92!B97-T(’=A>2!T;R!A
M8V-E<W,@82!P:65C92!O9B!H87)D=V%R92!I<R!D965M960@=&@8F4-“G1H
M<F]U9V@@<W1A;F1A<F0@22]/(&-A;&QS(“AO<&5N+”!C;&]S92P@<F5A9”!A
M;F0@=W)I=&4I+”!T:&5N(&$-“FUE<W-A9V4M9’)I=F5N(&-L:65N=”]S97)V
M97(@87!P<F]A8V@@;6%Y(&YO="!B92!A<’!R;W!R:6%T92X@#0I.;VYE=&AE
M;&5S<RP@82!$978@1’)I=F5R(&UA>2!S=&EL;"!N;W0@8F4@=&AE(&)E<W0@
M87!P<F]A8V@N("!!#0IS<&5C:6%L(&9O<FT@;V8@<V5R=F5R(’!R;V-E<W,@
M8V%N(&)E(’=R:71T96X@=VAI8V@@861O<'1S(&$-"G!O<G1I;VX@;V8@=&AE
M(%%.6#0@;F%M97-P86-E("AE9SH@+V1E=B]T87!E
2!A;F0@=VAI8V@@<F5S
M<&]N9’,-“G1O(&$@=V5L;”!D969I;F5D(’-E=”!O9B!)+T@;65S<V%G97,@
M*$E/7T]014XL($E/7T-,3U-%+”!E=&,N2 -“E1H:7,@='EP92!O9B!S97)V
M97(@=VEL;”!B92!A;B!)+T@36%N86=E<B!A;F0@8V%N(’!R;W9I9&4@:&EG
M:&QY#0IO<'1I;6EZ960@22]/(&1I<F5C=&QY(‘1O(‘1H92!H87)D=V%R92X@
M(%-U8V@@<V5R=F5R<R!A;&QO=R!F;W(-“G-P96-I86QI>F5D(&YO;BU03U-)
M6”!F=6YC=&EO;F%L:71Y(&%N9"!T:&ES(&%P<’)O86-H(&%V;VED<R!T:&4-
M"G!O<W-I8FQY(‘5N;F5C97-S87)Y(&]V97)H96%D(&]F(&-O;6UU;FEC871I
M;F<@=&AR;W5G:"!A;F]T:&5R#0IP<F]C97-S.R!$978N(“AS964@=&AE($DO
M3R!-86YA9V5R('1E8VAN:6-A;”!N;W1E(&9O<B!M;W)E#0II;F9O<FUA=&EO
M;BDN#0H-"E1H:7,@=&5C:&YI8V%L(&YO=&4@861D<F5S<V5S(‘1H92!C87-E
M(’=H97)E(%!/4TE8(’-T>6QE#0IC:&%R86-T97(@22]/(&ES(’)E<75I<F5D
M+B @5&AI<R!I;F-L=61E<R!A(‘9A<W0@;G5M8F5R(&]F#0ID979I8V5S(’-U
M8V@@87,@;75L=&EP;W)T+"!I;G1E;&QI9V5N="!S97)I86P@861A<'1E<G,L
M#0IW:6YD;W=S+6)A<V5D(‘1E<FUI;F%L(&5M=6QA=&]R<RP@<’)I;G1E<B!D
M<FEV97)S(&%N9"!M86YY+"!M86YY#0IM;W)E+@T
#0I/=F5R=FEE=PT*#0I1
M3E@@:7,@82!M;V1U;&%R(&]P97)A=&EN9R!S>7-T96TN("!!<R!S=6-H+"!V
M87)I;W5S(’-Y<W1E;0T*<V5R=FEC97,@87)E(’!R;W9I9&5D(&)Y(&EN9&5P
M96YD96YT(’-E<G9E<B!P<F]C97-S97,N("!);B!T:&4-“F-A<V4@;V8@4$]3
M25@@,3 P,RXQ(&-O;7!A=&EB;&4@9&5V:6-E<R H8VAA<F%C=&5R(’-P96-I
M86P-“F9I;&5S2P@22]/(’-E<G9I8V5S(&%R92!P<F]V:61E9"!B>2!A(&-O
M;6UO;B!$979I8V4@4V5R=F5R#0IP<F]C97-S(&-A;&QE9"!$978N#0H-"D1E
M=B!O=VYS(‘1H92!P87)T(&]F(‘1H92!N86UE<W!A8V4@8F5G:6YN:6YG(’=I
M=&@@=&AE(’!R969I> T
)R]D978G(&%N9”!R96-E:79E<R!M97-S86=E<R!F
M<F]M(’!R;V-E<W-E<R!W:&EC:”!W:7-H(‘1O(&1O($DO3PT*;W!E<F%T:6]N
M<R!O;B!P871H;F%M97,@8F5G:6YN:6YG(’=I=&@@=&AI<R!P<F5F:7@N("!!
M;&P@4$]325@-“F9E871U<F5S(&%N9”!S:61E+65F9F5C=’,@87)E(&UA;F%G
M960@97AC;‘5S:79E;‘D@8GD@1&5V+@T*:6YC;‘5D:6YG(&)L;V-K:6YG(&%N
M9"!N;VXM8FQO8VMI;F<@<F5A9’,@86YD(’=R:71E<RP@=&EM960@<F5A9 T*
M;W!E<F%T:6]N<RP@9FQO=R!C;VYT<F]L+"!E8VAO+"!L:6YE(&5D:71I;F<L
M(&5T8RX-"@T*# T*#0I4:&4@:6YT97)F86-E(‘1O(‘1H92!H87)D=V%R92!D
M979I8V5S(‘1H96US96QV97,@:7,@<’)O=FED960@8GD@80T*<V5R:65S(&]F
M($1E=B!$<FEV97(@<’)O8V5S<V5S+B @5&AE<V4@9’)I=F5R<R!C;VUM=6YI
M8V%T90T9&ER96-T;‘D@=VET:"!T:&4@:&%R9’=A<F4@86YD(&EN=&5R9F%C
M92!W:71H($1E=B!V:6$@82!S970@;V8-"G1H<F5E(&1A=&$@<75E=65S(&%S
M(’-H;W=N(&EN($9I9W5R92 Q(&)E;&]W.@T
#0H@(" @($1E=B @(" @(" @
M(" @("!O=71P=70@8G5F9F5R(" @(" @(" @(" @(" @("!$<FEV97(-“B @
M(”#:Q,3$OR @(" @(" @(" @(-K$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,2_
M(" @(-K$Q,3$OPT*(" @(+,O+R^SQ,3$Q,3$Q,3$Q,0^LWQ?‘Q?‘Q?‘Q
M?‘Q?‘Q?‘Q?‘Q?+/$Q,0^LUQ<7%RS#0H@(" @LR\O+[,@(" @(" @(" @
M("# Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$V2 @("“S7%Q<7+,-“B @(”“S
M+R\OLR @(” @(” @(" @(&EN<‘5T(&)U9F9E<B @(" @(" @(" @(" @(" @
M(±<7%Q<LPT*(" @(+,O+R^S(" @(" @(" @(" @VL3$Q,3$Q,3$Q,3$Q,3$
MQ,3$Q,3$Q,3$OR @(" @LUQ<7%RS#0H@(" @LR\O+[,\Q,3$Q,3$PL3$Q,2S
M?‘Q?‘Q?‘Q?‘Q?‘Q?‘Q?‘Q?‘RS/,3$Q,2S7%Q<7+,-“B @(”“S+R\O
MLR @(” @("“S(” @(,#$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q-D@(" @(±<
M7%Q<LPT*(" @(+,O+R^S(" @(" @(,#$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$Q,3$
MQ,3$Q,3$OR @(" @LUQ<7%RS#0H@(" @LR\O+[,@(" @(" @(" @("!C86YO
M;FEC86P@&5D:70I(&)U9F9E<B"S(" @("“S7%Q<7+,-“B @(”“S+R\OLR @
M(” @(” @(" @(-K$Q,3$Q,3$Q,3$Q,2_(" @(" @(" @(+,@(" @(±<7%Q<
MLPT
(" @(+,O+R^S/,3$Q,3$Q,3$Q,3$LWQ?‘Q?‘Q?‘Q?+,\Q,3$Q,3$
MQ,3$V2 @(" @LUQ<7%RS#0H@(" @LR\O+[,@(" @(" @(" @("# Q,3$Q,3$
MQ,3$Q,3$V2 @(" @(" @(" @(" @("“S7%Q<7+,-“B @(”# Q,3$V2 @(” @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(,#$Q,3$V0T*
M#0I&:6=U<F4@,3H@($-O;6UU;FEC871I;VX@=FEA(’%U975E<R!B971W965N
M($1E=B!A;F0@82!$979I8V4-“B @(” @(" @(" @1’)I=F5R#0H@(" @(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @#0I4:&4@9G5N8W1I;VX@
M;V8@82!13E@T($1E=B!$<FEV97(@‘5N;&EK92!T:&%T(&]F(&$@;6]R92!C
M;&%S<VEC#0I53DE8(&1E=FEC92!D<FEV97(L(&]R(&5V96X@82!13E@R(&1E
M=FEC92!D<FEV97(I(&ES(’-I;7!L>2!T;PT
=’)A;G-M:70@9&%T82!B>71E
M<R!T;R!T:&4@:&%R9’=A<F4@9&5V:6-E(&%N9"!T;R!R96-E:79E(&1A=&$-
M"F)Y=&5S(&9R;VT@=&AE(&AA<F1W87)E(&%N9"!I;G-E<G0@=&AE;2!I;G1O
M(‘1H92!R87<@:6YP=70@<75E=64N( T07-I9&4@9G)O;2!A(&9E=R H;W!T
M:6]N86PI(&-O;G1R;VP@9G5N8W1I;VYS+"!T:&5R92!I<R!L:71T;&4-"F5L
M<V4@<F5Q=6ER960@;V8@82!13E@T($1E=B!$<FEV97(N#0H-“E%.6#0@1&5V
M($1R:79E<G,@87)E(&YO<FUA;”!13E@@<’)O8V5S<V5S(&-O;7!I;&5D(‘1O
M(’)U;B!A= T
<’)I=FET>2 Q(&EN(&]R9&5R(‘1O(&=A:6X@86-C97-S(‘1O
M(‘1H92!H87)D=V%R92!)+T@<F5G:7-T97)S+B -"E1H97-E(&1R:79E<G,@
M8V%N(&)E(’-T87)T960@86YD(’-T;W!P960@9’EN86UI8V%L;‘DN#0H-“E=H
M96X@82!D<FEV97(@<W1A<G1S+”!I="!A=‘1E;7!T<R!T;R!R96=I<W1E<B!I
M=’-E;&8@86YD(&%L;&]C871E#0IR97-O=7)C97,@9G)O;2!$978@8GD@8V%L
M;&EN9R!T:&4@9&5V7V1R=G)?<F5G:7-T97(@"D@9G5N8W1I;VXN( T070@
M=&AI<R!T:6UE(‘1H92!D<FEV97(@:6YD:6-A=&5S(&AO=R!M86YY(&1E=FEC
M97,@:70@=VEL;"!B90T*:&%N9&QI;F<L(’=H870@<’)E9FEX(‘1H92!D979I
M8V5S(’=I;&P@8F4@9VEV96X@86YD(’-O;64-“FAO=7-E:V5E<&EN9R!I;F9O
M<FUA=&EO;BX@(%!R;W9I9&5D(‘1H870@=&AE<F4@:7,@<W5F9FEC:65N= T*
M<F5S;W5R8V5S(&%V86EL86)L92P@1&5V(’=I;&P@<F5P;'D@=VET:”!A(&1R
M:79E<B!C;VYT<F]L#0IS=’)U8W1U<F4@=VAI8V@@8V]N=&%I;G,@9V5N97)I
M8R!I;F9O<FUA=&EO;B!W:&EC:"!W:6QL(&)E(‘5S960-“F)Y('1H92!D<FEV
M97(@:6X@<W5B<V5Q=65N=”!C86QL<RX@($EN8VQU9&5D(&EN(‘1H:7,@<W1R
M=6-T=7)E(&ES#0IT:&4@861D<F5S<R!O9B!A(&9U;F-T:6]N(‘1O(&-A;&P@
M*&-A;&QE9"!T=&DI(’=H:6-H(&UU<W0@8F4@=7-E9 T*=&@861D(&1A=&$@
M:6YT;R!T:&4@:6YP=70@9&%T82!Q=65U92X@($EN8VQU9&5D(&EN(‘1H90T*
M<&%R86UE=&5R<R!P87-S960@=&@=&AE(&1E=E]D<G9R7W)E9VES=&5R("@I
M(&9U;F-T:6]N(&ES(‘1H90T861D<F5S<R!O9B!T:’)E92!R;W5T:6YE<R!I
M;B!T:&4@9’)I=F5R)W,@<W!A8V4@=VAI8V@@8V%N(&)E#0IC86QL960@8GD@
M1&5V(‘1O(&EN9&EC871E(’-I9VYI9FEC86YT(&5V96YT<RX@(%1H92!+:6-K
M("@I#0IF=6YC=&EO;B!W:6QL(&)E(&-A;&QE9"!B>2 @1&5V(’=H96YE=F5R
M(’-O;65T:&EN9R!H87!P96YS(’=I=&@-"G1H92!O=71P=70@8G5F9F5R("AI
M93H@9&%T82!A=F%I;&%B;&4I+B @5&AE(%-T='D@
“D@9G5N8W1I;VX@:7,-
M"F-A;&QE9”!B>2!$978@=VAE;F5V97(@<V]M971H:6YG(&AA<’!E;G,@=&@
M=&AE(‘1E<FUI;W,@&1E=FEC90T8V]N=’)O;"D@<W1R=6-T=7)E(’=H:6-H
M(’)E<75I<F5S(‘1H92!A=‘1E;G1I;VX@;V8@=&AE(&1R:79E<@T**’-U8V@@
M87,@8VAA;F=E(&EN(&)A=60@<F%T92!O<B!P87)I=‘DI+B @5&AE($EO8W1L
M("@I(&9U;F-T:6]N#0II<R!C86QL960@=&@<&5R9F]R;2!G96YE<F%L(&-O
M;G1R;VP@;W!E<F%T:6]N<R H<V5N9&)R96%K+ T9’)O<&QI;F4L(&5T8RXI
M#0H,#0I4:&4@9’)I=F5R(&UU<W0@=&AE;B!C86QL(&1E=E]D<G9R7VUO=6YT
M("@I(&9O<B!E86-H(&]F('1H90T
9&5V:6-E<RX@($EN(‘1H:7,@8V%L;"P@
M=&AE(&1R:79E<B!M=7-T(’-U<’!L>2!T:&4@:6YD:79I9’5A; T*<VEZ97,@
M9F]R(&5A8V@@;V8@=&AE(&EN<‘5T+"!O=71P=70@86YD(&-A;F]N:6-A;"!B
M=69F97)S+B @16%C: T8V%L;"!T;R!D979?9’)V<E]M;W5N=" H2!C86X@
M:6YC;‘5D92!O;F4@;W(@;6]R92!D979I8V5S+B @268-"FUO<F4@=&AA;B!O
M;F4@9&5V:6-E(&ES(’-P96-I9FEE9"P@=&AE;B!T:&4@;&EB<F%R>2!R;W5T
M:6YE(’=I;&P-"F%T=&5M<‘0@=&@<&%C:R!T:&4@22]/(&)U9F9E<G,@:6YT
M;R!A<R!F97<@<VAA<F5D(&UE;6]R>0T*<V5G;65N=’,@87,@<&]S<VEB;&4@
M=VAI8V@@:7,@82!G;V]D(’=A>2!T;R!C;VYS97)V92!S>7-T96T-“G)E<V]U
M<F-E<RX@(%!R;W9I9&5D(‘1H870@=&AE(’)E<V]U<F-E<R!C86X@86QL(&)E
M(&%C<75I<F5D+”!$978-“G=I;&P@<F5P;'D@=VET:”!A(&1E=FEC92!C;VYT
M<F]L(’-T<G5C=‘5R92!F;W(@96%C:"!D979I8V4N("!4:&ES#0IS=’)U8W1U
M<F4@=VEL;"!C;VYT86EN(’!O:6YT97)S(‘1O(‘1H92!T:’)E92!D871A(’%U
M975E<R!A<R!W96QL#0IA<R!A(‘5N:7%U92!T=‘DC(“AH86YD;&4I(&9O<B!E
M86-H(&1E=FEC92X@(%1H:7,@=‘1Y(R!M=7-T(&)E#0IU<V5D(’=H96X@8V%L
M;&EN9R!T:&4@='1I(”@I(&9U;F-T:6]N(‘1O(&ED96YT:69Y(’=H:6-H(&EN
M<‘5T#0IQ=65U92!I<R!T;R!R96-E:79E(‘1H92!D871A+@T*#0I&:6YA;&QY
M+"!O;F-E(&%L;"!D979I8V5S(&%R92!R96=I<W1E<F5D(&%N9"!M;W5N=&5D
M+"!I="!I<PT*;F5C97-S87)Y(‘1O(&5N86)L92 H87)M2!E86-H(&]F(‘1H
M92!O=71P=70@8VAA;FYE;’,@8GD@8V%L;&EN9PT
=&AE(&1E=E]D<G9R7V%R
M;2 H2!F=6YC=&EO;B!F;W(@96%C:"!D979I8V4N("!4:&ES(’=I;&P@8V]M
M<&QE=&4-“G1H92!R96=I<W1R871I;VX@<’)O8V5S<R!A;F0@=VEL;”!A;&QO
M=R!$978@=&@<W1A<G0@<&QA8VEN9R!D871A#0II;B!T:&4@;W5T<‘5T(’%U
M975E<RX-"@T
5&AE(&1R:79E<B!I<R!N;W<@<F5A9’D@9F]R(&ET<R!M86EN
M;&EN92!M;V1E(&]F(&]P97)A=&EO;BX-"@T02!F:6YA;"!F=6YC=&EO;B!I
M<R!A=F%I;&%B;&4@9F]R(’)E;&5A<VEN9R!A;&P@;V8@=&AE(’)E<V]U<F-E
M<PT
87-S:6=N960@=&@82!$978@1’)I=F5R(&)E9F]R92!I="!T97)M:6YA
M=&5S+B @5&AE#0ID979?9’)V<E]S:‘5T9&]W;B H2!C86QL(&ES(‘5S960@
M:G5S="!B969O<F4@82!D<FEV97(-“G1E<FUI;F%T97,N(”!$978@1’)I=F5R
M<R!S:&]U;&0@8V%T8V@@=&AE(%-)1U1%4DT@<VEG;F%L(&%N9 T
<&5R9F]R
M;2!A;B!O<F1E<FQY(’-H=71D;W=N(’=H:6-H(&%L;&]W<R!T:&4@2!U
M=&EL:71Y(‘1O(&)E#0IU<V5D(‘1O(&-L96%N;‘D@=&5R;6EN871E(&$@9’)I
M=F5R+@T*#0I0<F]C97-S:6YG($EN<‘5T($1A=&$-"@T36]S="!D979I8V4@
M9’)I=F5R<R!I;B!13E@T(’=I;&P@8F4@:6YT97)R=7!T(&1R:79E;B!W:&5N
M(&ET#0IC;VUE<R!T;R!I;G!U="!D871A+B @1F]R('1H:7,@<F5A<V]N+"!T
M:&4@9F%C:6QI=&EE<R!P<F]V:61E9"!B>0T
1&5V(&%R92!G96%R960@=&]W
M87)D<R!A;&QO=VEN9R!E9F9I8VEE;G0@86YD(&-O;G9E;FEE;G0@9&%T80T*
M:6YP=70@9&ER96-T;‘D@9G)O;2!I;G1E<G)U<‘0@:&%N9&QE<G,N#0H-“E%.
M6#0@:6YT97)R=7!T(&AA;F1L97)S(&%R92!C87!A8FQE(&]F(‘1R:6=G97)I
M;F<@82!P<F]X>2!W:&5N#0IT:&5Y(’)E=‘5R;BX@(%1H92!T=&D@“D@9G5N
M8W1I;VX@86-C97!T<R!A<R!P87)A;65T97)S(&$@='1Y(PT**&EN9&EC871I
M;F<@=&AE(&1E=FEC92DL(&$@,38M8FET(&EN<'5T('9A;'5E(&-O;7!R:7-E
M9”!O9B X(&1A=&$-“F)I=’,@86YD(#@@8V]N=’)O;”!B:71S+"!A;F0@82!V
M86QU92!W:&EC:"!C86X@8F4@=7-E9"!T;R!A8V-E<W,-“D1E=B=S(&1A=&$@
M<V5G;65N=”!F<F]M(’=I=&AI;B!T:&4@8V]N=&5X="!O9B!T:&4@:6YT97)R
M=7!T#0IH86YD;&5R+B @5&AE(&9U;F-T:6]N('1T:2 H
2!W:6QL(&5I=&AE
M<B!R971U<FX@82!Z97)O(&]R(&ET#0IW:6QL(’)E=‘5R;B!T:&4@<’)O8V5S
M<RUI9”!O9B!A(’!R;WAY(’=H:6-H(’-H;W5L9"!B92!T<FEG9V5R960-"G1O
M(’=A:V4@=7 @1&5V+B @06X@:6YT97)R=7!T(&AA;F1L97(@<VEM<&QY(&AA
M<R!T;R!R971U<FX@&EN#0IA>"D@=&AE(’)E='5R;B!V86QU92!O9B!T=&D@
M
"D@=&@:&%V92!T:&ES(&5F9F5C=“X@($EF('1H92!T=&D-“B@I(&9U;F-T
M:6]N(&ES(&-A;&QE9”!A=”!P<F]C97-S(‘1I;64L(‘1H96X@:70@=VEL;"!B
M92!N96-E<W-A<GD-"G1O(%1R:6=G97(@"D@=&AE(’!R;WAY(&EF(&$@;F]N
M+7IE<F@=F%L=64@:7,@<F5T=7)N960N#0H-"E1H92!T=&D@
"D@9G5N8W1I
M;VX@:&%S(&)E96X@9&5S:6=N960@=&@8F4@87,@969F:6-I96YT(&%S#0IP
M;W-S:6)L92!A;F0@<VEM<&QY(’!L86-E<R!T:&4@9&%T82!I;G1O(‘1H92!R
M87<@:6YP=70@<75E=64N("!)= T*<F5T=7)N<R!E:71H97(@82!Z97)O(&]R
M(&$@<’)O>‘D@:68@82!P<F4M8V]N9&ET:6]N960@979E;G0@:&%S#0IB965N
M(‘1R:6=G97)E9"X@($1E=B!S970@=7 @=&AE<V4@<’)E+6-O;F1I=&EO;G,@
M8F%S960@;VX@<&5N9&EN9PT22]/(’)E<75E<W1S+B @4V]M92!O9B!T:&5S
M92!C;VYD:71I;VYS(&1E<&5N9"!O;B!T:&4-“G)E;&%T:6]N<VAI<”!B971W
M965N(’)E8V5I=F5D(&1A=&$@8GET97,@86YD('1I;65R<R!A;F0@;6%Y(&EN
M#0IF86-T(&-A=7-E(&9U<G1H97(@8V]N9&ET:6]N<R!T;R!B92!A<FUE9"P@
M<V@:70@:7,@;F5C97-S87)Y('1O#0IC86QL('1T:2 H
2!F;W(@979E<GD@
M8GET92!R96-E:79E9"X-"@P-"E1H92!B;W1T;VT@8GET92!O9B!T:&4@9&%T
M82!W;W)D(’!A<W-E9"!T;R!T=&D@“D@:7,@=&AE#0IC:&%R86-T97(@<F5C
M96EV960N(”!4:&4@=&]P(&)Y=&4@8V]N=&%I;G,@9FQA9W,@:6YD:6-A=&EN
M9PT
<W!E8VEA;"!C;VYD:71I;VYS.@T*#0H@(" @(" @(" @1V]O9"!$871A
M(" @(" P,# P,# P," @(" @("!D871A#0H@(" @(" @(" @2"]7($)R96%K
M(" @(" Q,# P,# P," @(" @,# P,# P,# -“B @(” @(" @("!“860@1&%T
M82 @(” @(# Q,# P1$90(" @(" @(&1A=&$-“B @(” @(" @("!(+U<@179E
M;G0@(" @(# P,3 P,# P(" @(" P,# P8VAN9@T*#0H@(" @(" @(" @(" @
M(" @(" @($0M1&%T82!/=F5R<G5N(" @8RUC87)R:65R(’)E8V5I=F5D#0H@
M(" @(" @(" @(" @(" @(" @($8M1G)A;6EN9R!%<G)O<B @:“UH86YG=7 @
M*&QO<W,@;V8@8V%R<FEE<BD-“B @(” @(” @(" @(" @(" @(" @4"U087)I
M=‘D@17)R;W(@("!N+6AA<F1W87)E(&AA;F1S:&%K:6YG($].#0H@(" @(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @9BUH87)D=V%R92!H86YD
M<VAA:VEN9R!/1D8-"@T*#0I0<F]C97-S:6YG($]U=’!U="!$871A#0H-"D]U
M=’!U="!S=&%R=’,@=VAE;B!T:&4@2VEC:R H2!F=6YC=&EO;B!I<R!C86QL
M960N("!)="!I<R!T:&4-"G)E<W!O;G-I8FEL:71Y(&]F('1H92!D<FEV97(@
M=&@97AA;6EN92!T:&4@;W5T<'5T(&)U9F9E<B!O;@T
979E<GD@2VEC:R H
M2!C86QL(&%N9"!A='1E;7!T(‘1O(&]U=’!U="!A;GD@9&%T82!W:&EC:"!I
M<PT
879A:6QA8FQE+B @02!P;VEN=&5R(‘1O(‘1H92!O=71P=70@8G5F9F5R
M(’=H:6-H(&AA<R!C:&%N9V5D(&ES#0IP87-S960@87,@=&AE(&]N;‘D@87)G
M=6UE;G0@2VEC:R H2X-"@T0V]N=’)O;"!/<&5R871I;VYS#0H-“D1E=B!W
M:6QL(&-A;&P@=&AE(%-T='D@“D@9G5N8W1I;VX@=VAE;B!I=”!R97%U:7)E
M<R!T:&4@9’)I=F5R('1O#0IC:&%N9V4@<V]M92!A<W!E8W0@;V8@=&AE(&AA
M<F1W87)E("AS=6-H(&%S(&)A=60@<F%T92P@9&%T82!B:71S+ T
<W1O<”!B
M:71S(&]R(’!A2DN("!4:&4@;F5W(’-E=‘1I;F=S(&-A;B!B92!F;W5N
M9"!U<VEN9R!T:&4-"G!O:6YT97(@=&@82!T97)M:6]S(’-T<G5C=‘5R92!W
M:&EC:"!I<R!P87-S960@87,@=&AE(&]N;‘D-"F%R9W5M96YT(‘1O(%-T=‘D@
M*"DN#0H-“D1E=B!W:6QL(&-A;&P@=&AE($EO8W1L(”@I(&9U;F-T:6]N(’=H
M96YE=F5R(&ET(’)E<75I<F5S(’-O;64-“G-P96-I86P@86-T:6]N(&]F('1H
M92!D<FEV97(@’-U8V@@87,@87-S97)T(&]R(’)E;6]V92!A(&)R96%K#0IC
M;VYD:71I;VXL(&]R(’-T87)T+W-T;W @82!D<F]P;&EN92!C;VYD:71I;VXI
M+B @270@=VEL;"!A;’-O#0IC86QL($EO8W1L("@I(‘1O(’!R;W9I9&4@=&AE
M(&1R:79E<B!W:71H('5S969U;"!I;F9O<FUA=&EO;B H<W5C: T
87,@9FER
M<W0@;W!E;B!O<B!L87-T(&-L;W-E2X-"@T4W!E8VEA;”!-;V1E<R!A;F0@
M3W!T:6]N<PT*#0I!(&9L86<@=V]R9"!I<R!P87-S960@87,@;VYE(&]F(‘1H
M92!A<F=U;65N=’,@=&-“F1E=E]D<G9R7W)E9VES=&5R(”@I(’=H:6-H(&-A
M;B!C;VYT86EN(&)I=’,@:6YD:6-A=&EN9R!S<&5C:6%L#0IM;V1E<R!O9B!O
M<&5R871I;VXN("!4:&5S92!B:71S(&%R92!D97-C<FEB960@:6X@=&AE(&UA
M;G5A;"!P86=E#0IF;W(@=&AE(&1E=E]D<G9R7W)E9VES=&5R("@I(&9U;F-T
M:6]N+@T*#0I#;VUP:6QI;F<@=&AE($1R:79E<@T*#0I4:&4@:6YT97)F86-E
M(&)E=’=E96X@1&5V(&%N9"!A($1E=B!$<FEV97(@:7,@9&5S:6=N960@=&@
M8V]N<W5M90T87,@9F5W(’)E<V]U<F-E<R!A<R!P;W-S:6)L92!W:&EL92!S
M=&EL;"!M86EN=&%I;FEN9R!A(&AI9V@@<W!E960L#0IS96-U<F4@96YV:7)O
M;FUE;G0N("!";W1H($1E=B!A;F0@=&AE($1E=B!$<FEV97(@9F%R+6-A;&P@
M:6YT;R!T:&4-"F]T:&5R)W,@8V]D92!S<&%C92X@#0H-"E=H:6QE(&]P97)A
M=&EN9R!I;B!T:&ES(&-O9&4@<W!A8V4L('1H92!I;G1E<F9A8V4@;6%K97,@
M879A:6QA8FQE#0IO;F4@9&%T82!S96=M96YT(&9O<B!A8V-E<W-I;F<@9VQO
M8F%L('9A<FEA8FQE<RX@(%1H90T
9&5V7V1R:79E<E]R96=I<W1E<B H2!P
M<F]C97-S(&5N<W5R97,@=&AA="!,1%0@86QI87-E<R!E>&ES="!F;W(-“G1H
M92!A<’!R;W!R:6%T92!C;V1E(&%N9”!D871A(’-E9VUE;G1S+B @270@<VAO
M=6QD(&)E(&YO=&5D(‘1H870-"G1H92!F;VQL;W=I;F<@<F5S=’)I8W1I;VYS
M(&%P<&QY(’=I=&AI;B!T:&4@:6YT97)F86-E(&9U;F-T:6]N<PT
2VEC:R H
M2P@4W1T>2 H2!A;F0@26]C=&P@“DZ#0H-“C$N(” @3VYL>2!G;&]B86P@
M=F%R:6%B;&5S(&EN('1H92!S86UE(&1A=&$@<V5G;65N=”!A<R!T:&4-“B @
M(” @=F%R:6%B;&4@9’)V7V-T<FP@
’=H:6-H(’=A<R!P87-S960@=&@9&5V
M7V1R=G)?<F5G:7-T97(I(&-A;B!B90T*(" @("!A8V-E<W-E9"X-"@T*,BX@
M("!/;FQY(&9U;F-T:6]N<R!I;B!T:&4@<V%M92!C;V1E(’-E9VUE;G0@87,@
M=&AE(&EN=&5R9F%C90T*(" @("!R;W5T:6YE(“A+:6-K+”!3=‘1Y(&]R($EO
M8W1L2!C86X@8F4@8V%L;&5D+@T#0HS+B @($EN(&=E;F5R86PL(&YO(’-Y
M<W1E;2!F=6YC=&EO;G,@;W(@;&EB<F%R>2!R;W5T:6YE<R!C86X@8F4-“B @
M(” @=7-E9"!O=&AE<B!T:&%N(%1R:6=G97(@“DN#0H-“C0N(” @5VAE;B!A
M;B!I;G1E<F9A8V4@<F]U=&EN92!I<R!C86QL960@8GD@1&5V+”!I="!W:6QL
M(&)E('5S:6YG#0H@(" @('1H92!S=&%C:R!O9B!$978N("!4:‘5S(’-T86-K
M(‘5S86=E(’-H;W5L9"!B92!K97!T('1O(&$@;6EN:6UU;0T
(" @("!A;F0@
M;VYE(’-H;W5L9"!N;W0@87-S=6UE(‘1H870@4U,]1%,N#0H-“C4N(” @4W1A
M8VL@8VAE8VMI;F<@;75S="!B92!D:7-A8FQE9"X-"@T5&AE(&%B;W9E(’)U
M;&5S(&%R92!E87-I97-T('1O(&5N9F]R8V4@:68@=&AE($1E=B!$<FEV97(@
M:7,-“F-O;7!I;&5D(&EN(#$V+6)I=” H;W(@,S(M8FET
2!S;6%L;"!M;V1E
M;"!W:71H(’-T86-K(&-H96-K:6YG#0ID:7-A8FQE9"X@($%S(&$@<G5L92!O
M9B!T:‘5M8BP@=&AE(&EN=&5R9F%C92!R;W5T:6YE<R!S:&]U;&0@9&-“FYO
M=&AI;F<@;6]R92!T:&%N(&UO9&EF>2!G;&]B86P@=F%R:6%B;&5S+”!O<‘1I
M;VYA;&QY(‘1R:6=G97(@80T*<’)O>‘DL(‘1H96X@<F5T=7)N+B @268@;6]R
M92!W;W)K(&UU<W0@8F4@9&]N92P@:70@:7,@<F5C;VUM96YD960-“G1H870@
M82!P<F]X>2!B92!T<FEG9V5R960@=VAI8V@@=VEL;”!W86ME(‘5P(‘1H92!$
M978@1’)I=F5R(’!R;V-E<W,-"G=H:6-H(&-A;B!T:&5N(’!E<F9O<FT@=&AE
M(&)U;&L@;V8@=&AE(’=O<FL@870@<’)O8V5S<R!T:6UE+B!4:&ES#0IA=F]I
M9’,@:&%V:6YG(‘1O(&1E86P@=VET:"!T:&4@86)O=F4@<F5S=’)I8W1I;VYS
M+@T*#0I$978@1’)I=F5R<R!M=7-T(&)E(&-O;7!I;&5D(’=I=&@@<’)I=FET
M>2 Q("@M5#$I+@T*# T*(" @(" @(" @(" @(" @(" @(" @(" @($QI8G)A
M<GD@4F]U=&EN92!2969E<F5N8V4@#0H-"F1E=E]D<G9R7W)E9VES=&5R#0HM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2 )#0H-"E-Y;F]P<VES#0H-“B @(” @(VEN8VQU9&4@
M/‘1E<FUI;W,N:#X-“B @(” @(VEN8VQU9&4@/’-Y<R]?9&5V9’)V<BYH/@T*
M#0H@(" @(&EN="!D979?9’)V<E]R96=I<W1E<B@-“B @(” @(" @("!C:&%R
M(“IN86UE+ T*(” @(" @(" @(&-H87(@G!R969I>“P-“B @(” @(” @("!I
M;G0@;G1T>7,L#0H@(" @(" @(" @:6YT(“AF87(@DMI8VLI("@@<W1R=6-T
M(&]U=’!U=%]B=69F97(@9F%R("HI+ T
(” @(" @(" @(&EN=" H9F%R("I3
M='1Y
2 H<W1R=6-T(‘1E<FUI;W,@9F%R(“HI#0H@(” @(" @(" @:6YT("AF
M87(@D-T<FPI("AU;FEO;B!I;V-T;%]E;G1R>2!F87(@BD-“B @(” @(" @
M("!S=’)U8W0@9’)I=F5R7V-T<FP@F1R>5]C=’)L+ T(" @(" @(" @(‘5N
M<VEG;F5D(&9L86=S("D[#0H-"D1E<V-R:7!T:6]N#0H-"E1H92!D979?9’)V
M<E]R96=I<W1E<B!F=6YC=&EO;B!I<R!U<V5D(‘1O(&-R96%T92!N97<@8VAA
M<F%C=&5R#0IS<&5C:6%L(&1E=FEC97,N#0H-"B=N86UE)R!I<R!A(’-Y;6)O
M;&EC(&YA;64@=&@8F4@87-S;V-I871E9"!W:71H(‘1H:7,@8VQA<W,@;V8-
M"F1E=FEC92X@(%1H:7,@=VEL;"!B92!T:&4@<W1R:6YG(&9O=6YD(&EN(‘1H
M92!D<FEV97)?=‘EP92!M96UB97(-"F]F(&$@7V1E=E]I;F9O7V5N=’)Y(’=H
M:6-H(&ES(’)E='5R;F5D(&)Y(&1E=E]I;F9O(&%N9"!I<PT
9&ES<&QA>65D
M(&%S('1H92!D979I8V4@5’EP92!B>2!T:&4@2!U=&EL:71Y+B @3F%M
M92!C86YN;W0-“F5X8V5E9” Q-B!C:&%R86-T97)S+@T
#0HG<’)E9FEX)R!I
M<R!T:&4@<W1R:6YG(‘1O(&)E(‘5S960@87,@=&AE(&9I<G-T(’!A<G0@;V8@
M82!D979I8V4-“FYA;64N(”!!;&P@9&5V:6-E<R!C<F5A=&5D(&%S(&$@<F5S
M=6QT(&]F(‘1H:7,@8V%L;"!W:6QL(&AA=F4-“FYA;65S(&EN('1H92 O9&5V
M(&1I<F5C=&]R>2!W:&EC:”!S=&%R="!W:71H(‘1H:7,@<’)E9FEX(&%N9"!E
M;F0-"FEN(&$@;G5M8F5R("AE9SH@<F5G:7-T97)I;F<@,R!D979I8V5S(’=I
M=&@@=&AE(’!R969I>" G=’-T)R!W:6QL#0IC<F5A=&4@,R!D979I8V5S(&-A
M;&QE9" G+V1E=B]T<W0Q)RP@)R]D978O=’-T,B<@86YD("<O9&5V+W1S=#,G
M+B -“G!R969I>”!C86YN;W0@97AC965D(#@@8VAA<F%C=&5R<RX-"@T*)VYT
M=‘ES)R!I<R!T:&4@;G5M8F5R(&]F(&1E=FEC97,@&]R('5N:71S2!T;R!B
M92!C<F5A=&5D(’=I=&@@=&AI<PT*<’)E9FEX+@T*#0HG9’)V7V-T<FPG(&ES
M(&$@<&]I;G1E<B!T;R!A(&1R:79E<E]C=’)L(’-T<G5C=‘5R92!W:&EC:"!W
M:6QL(&)E#0IF:6QL960@:68@=&AE(&9U;F-T:6]N(&ES(’-U8V-E<W-F=6PN
M("!4:&ES(’-T<G5C=‘5R92!C;VYT86EN<PT*:6YF;W)M871I;VX@=VAI8V@@
M:7,@8V]M;6]N(‘1O(&%L;"!T:&4@;F5W;‘D@8W)E871E9"!D979I8V5S+B -
M"E1H92!S=’)U8W1U<F4@:7,@9&5F:6YE9"!I;B <WES+U]D979D<G9R+F@^
M(&%N9"!I;F-L=61E<R!T:&4-“F9O;&QO=VEN9R!M96UB97)S.@T*#0H@(” @
M(’-H;W)T(&EN="!B87-E7W1T>2 @(" @(" @(%1H92 G:6YT97)N86PG(‘1T
M>2!N=6UB97(@87-S:6=N960-“B @(” @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @=&@=&AE(&9I<G-T(&1E=FEC92X@(%1H92!R96UA:6YI;F<-“B @
M(” @(" @(" @(" @(" @(" @(" @(" @(" @(" @9&5V:6-E<R!A<F4@87-S
M:6=N960@<V5Q=65N=&EA; T*(" @(" @(" @(" @(" @(" @(" @(" @(" @
M(" @("!N=6UB97)S+@T*#0H@(" @(’-H;W)T(&EN="!N=‘1Y<R @(" @(" @
M(" @(%1H92!N=6UB97(@;V8@9&5V:6-E<R!B96QO;F=I;F<@=&-“B @(” @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @=&AI<R!H86YD;&4N#0H,#0H@
M(" @(’!I9%]T("AF87(@G1T:2D@(" @(" @(" @($$@9F%R(’!O:6YT97(@
M=&@82!F=6YC=&EO;B H:6YS:61E#0H@(" @("AS:&]R="P@<VAO<G0L('5N
M<VEG;F5D
2 @($1E=B=S(&%D9’)E<W,@<W!A8V4I(’=H:6-H(&UU<W0@8F4-
M"B @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @=7-E9"!T;R!E;G1E
M<B!D871A(&EN=&@=&AE(&EN<‘5T#0H@(" @(" @(" @(" @(" @(" @(" @
M(" @(" @(" @(’%U975E+B!4:&4@9FER<W0@87)G=6UE;G0@:7,@=&AE#0H@
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(&EN=&5R;F%L(‘1T>2!N
M=6UB97(@;V8@=&AE(&1E=FEC90T*(" @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @(" H8F%S92 K(‘5N:70@+2 Q2X@(%1H92!S96-O;F0@87)G=6UE
M;G0-“B @(” @(" @(" @(" @(" @(" @(" @(" @(" @(" @:7,@=&AE(’)E
M8V5I=F5D(&1A=&$@8VAA<F%C=&5R+B @5&AE#0H@(" @(" @(" @(" @(" @
M(" @(" @(" @(" @(" @('1H:7)D(&%R9W5M96YT(&ES(&$@9&%T82!S96QE
M8W1O<B!T;PT
(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @("!U<V4@
M=VAE;B!C86QL:6YG(‘1T:2 H2X@(%1H92!F=6YC=&EO;@T(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(" @("!R971U<FYS(&5I=&AE<B!A(‘IE<F@
M*&1O(&YO=&AI;F<I(&]R#0H@(" @(" @(" @(" @(" @(" @(" @(" @(" @
M(" @(&$@<’)O>‘D@=VAI8V@@<VAO=6QD(&)E(%1R:6=G97)E9"!T;PT*(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" G:VEC:R<@1&5V+@T*#0H@
M(" @(’-H;W)T(‘5N<VEG;F5D(‘1T:5]D<R @(" @($$@9&%T82!S96QE8W1O
M<B!T;R!B92!U<V5D(&%S(‘1H92!T:&ER9 T*(" @(" @(" @(" @(" @(" @
M(" @(" @(" @(" @("!A<F=U;65N="!T;R!T=&DH2X-"@T(" @("!P:61?
M="!H=U]P:60@(" @(" @(" @(" @("!!(’!R;WAY(‘1O(‘1R:6=G97(@1&5V
M(’=H96X@82!S:6=N:69I8V%N= T*(" @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @("!E=F5N="!O8V-U<G,N#0H-“B @(” @<VAO<G0@=6YS:6=N960@
M9FQA9W,@(" @(" @02!B:71F:65L9"!O9B!F;&%G(&)I=’,@87-S;V-I871E
M9"!W:71H#0H@(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(‘1H:7,@
M;F5W(&1E=FEC92!C;&%S<RX@(%1H92!B:71S(&%R90T*(" @(" @(" @(" @
M(" @(" @(" @(" @(" @(" @("!D969I;F5D(&EN(#QS>7,O7V1E=F1R=G(N
M:#XN("!!="!T:&4-“B @(” @(" @(" @(" @(" @(" @(" @(" @(" @(" @
M=&EM92!O9B!T:&ES(’!R:6YT:6YG(‘1H92!F;VQL;W=I;F<@8FET<PT*(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @("!A<F4@9&5F:6YE9#H-"@T*
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @("!$4E927T=%5%-?4$E$
M4R @("!)3T-43%]/4$5.(’!A<W-E<R!D;W=N#0H@(" @(" @(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(’!I9"P@9F0L(&5T
M8RX@'1H:7,-“B @(” @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @(" @(" @(" @9F5A='5R92!D:60@;F]T(&5X:7-T#0H@(" @(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @('5N
M=&EL(%%.6" T+C$P
2X-"@T*)V9L86=S)R!I<R!U<V5D(‘1O(&-O;G1R;VP@
M;W!T:6]N86P@;6]D97,@;V8@9’)I=F5R(&]P97)A=&EO;BX-"E1H92!F;&%G
M(&)I=’,@87)E(&1E9FEN960@:6X@/’-Y<R]?9&5V9’)V<BYH/BX@($%T(‘1H
M92!T:6UE#0IO9B!T:&ES(’!R:6YT:6YG+"!T:&4@9F]L;&]W:6YG(&1R:79E
M<B!F;&%G<R!A<F4@9&5F:6YE9#H-"@T*(" @("!$4E927U-#04X@(" @(" @
M(" @(" @(" @("!O<&5N("@I(’=I=&@@;F@<W5F9FEX(&-A=7-E<R!$978@
M=&-“B @(” @(" @(" @(" @(" @(" @(" @(" @(" @(" @<V-A;B!F;W(@
M86X@=6YU<V5D(‘5N:70N(" H96<Z("]D978O8V]N#0H@(" @(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(&9R964@8V]N<V]L92DN#0H-“B @(” @1%)6
M4E].3U1462 @(" @(" @(" @(" @(" @3F]T(&$@=&5R;6EN86P@9&5V:6-E
M(“AE9SH@+V1E=B]N=6QL2X-“B @(” @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @268@<V5T+"!T:&ES(&9L86<@8V%U<V5S(‘1H92!T;V=E=&%T=’(-
M"B @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @
“D@9G5N8W1I;VX@
M=&@9F%I;“P@=VAI8V@@8V%U<V4@:7-A='1Y#0H@(” @(” @(” @(" @(" @
M(" @(" @(" @(" @(" @("@I(‘1O(&9A:6PN( T*#0H@(" @($125E)?3$]#
M2U](1DQ/5R @(" @(" @(" @($E(1DQ/5R]/2$9,3U<@:6X@8U]C9FQA9R!C
M86YN;W0@8F4-“B @(” @(" @(" @(" @(" @(" @(" @(" @(" @(" @8VAA
M;F=E9"P@979E;B!B>2!S=‘1Y+@T*#0H@(" @($125E)?4TE.1TQ%7T]014X@
M(" @(" @(" @($]P96X@“D@=VEL;”!F86EL(&EF('1H92!D979I8V4@:7,-
M"B @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @86QR96%D>2!O<&5N
M960N#0H,#0H@(" @($125E)?2$587U-51D9)6" @(" @(" @(" @(%-U9F9I
M>&5S(&%R92 P,"!B87-E9"!H97@@<F%T:&5R('1H86X@,0T
(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(" @("!B87-E9"!D96-I;6%L(“AE9SH@1&5V
M+G!T>2DN#0H-“B @(” @1%)64E]35%19(” @(" @(" @(" @(" @(" @1’)I
M=F5R(&=E=’,@8V%L;&5D(&]N(&5V97)Y(‘1C<V5T871T<B H0T(" @(" @
M(" @(" @(" @(" @(" @(" @(" @(" @("!C86QL(’)A=&AE<B!T:&%N(&IU
M<W0@=VAE;B!B875D+W-T;W M8FET<R-“B @(” @(" @(" @(" @(" @(" @
M(" @(" @(" @(" @<&%R:71Y(&%R92!C:&%N9V5D+@T*#0H@(" @($125E)?
M3D]?4U5&1DE8(" @(" @(" @(" @(%-U<’!R97-S(‘1H92!N=6UE<FEC(’-U
M9F9I>"!I9B!O;FQY"3$-“B @(” @(" @(" @(" @(" @(" @(" @(" @(" @
M(" @9&5V:6-E(&ES(’)E9VES=&5R960@&5G.B O9&5V+VYU;&P-“B @(” @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @=VEL;"!B92!D:7-P;&%Y960@
M:6YS=&5A9"!O9B O9&5V+VYU;&PQ
2X-"@T*)TMI8VLG(&ES(‘1H92!A9&1R
M97-S(&]F(&$@9G5N8W1I;VX@=&@8F4@8V%L;&5D(&)Y($1E=B!E=F5R>2!T
M:6UE#0IS;VUE=&AI;F<@;F5W(&AA<’!E;G,@=VET:"!T:&4@;W5T<‘5T(’%U
M975E(“AN97<@9&%T82!O<B!F;&]W#0IC;VYT<F]L(&-H86YG92DN(”!+:6-K
M(’=I;&P@8F4@<&%S<V5D(&$@<VEN9VQE(’!A<F%M971E<B!W:&EC:"!I<PT*
M82!F87(@<&]I;G1E<B!T;R!T:&4@;W5T<‘5T(&)U9F9E<B!W:&EC:"!H87,@
M8VAA;F=E9"X-"@T*)U-T=‘DG(&ES(‘1H92!A9&1R97-S(&]F(&$@9G5N8W1I
M;VX@=&@8F4@8V%L;&5D(&)Y($1E=B!E=F5R>2!T:6UE#0IS;VUE=&AI;F<@
M<VEG;FEF:6-A;G0@:&%P<&5N<R!T;R!T:&4@=&5R;6EO<R!C;VYT<F]L(’-T
M<G5C=‘5R90T87-S;V-I871E9"!W:71H('1H:7,@9&5V:6-E+B @56YL97-S
M('1H92!$4E927U-45%D@;6]D92!I<PT
96YA8FQE9"P@<VEG;FEF:6-A;G0@
M979E;G1S(&%R92!D965M960@=&@8F4@;VYL>2!T:&]S92!W:&EC: T*<F5Q
M=6ER92!S;VUE(&%T=&5N=&EO;B!B>2!T:&4@:&%R9’=A<F4@&)A=60@<F%T
M92P@<&%R:71Y+"!E=&,N
2X@#0I3=‘1Y(’=I;&P@8F4@<&%S<V5D(&$@<VEN
M9VQE(’!A<F%M971E<B!W:&EC:"!I<R!A(&9A<B!P;VEN=&5R(‘1O#0IT:&4@
M=&5R;6EO<R!S=’)U8W1U<F4@=VAI8V@@:&%S(&-H86YG960N#0H-"B=#=’)L
M)R!I<R!T:&4@861D<F5S<R!O9B!A(&9U;F-T:6]N(‘1O(&)E(&-A;&QE9"!B
M>2!$978@=&@<&5R9F]R;0T8V]N=’)O;" H;W(@:&]U<V5K965P:6YG2!O
M<&5R871I;VYS+B @0W1R;"!W:6QL(&)E(’!A<W-E9"!A#0IS:6YG;&4@<&%R
M86UE=&5R(’=H:6-H(&ES(&$@9F%R(’!O:6YT97(@=&@86X@:6]C=&Q?96YT
M<GD@=VAI8V@-“FES(&$@;75L=&DM<‘5R<&]S92!S=’)U8W1U<F4@8V]N=&%I
M;FEN9R!A(&-O;G1R;VP@;W!E<F%T:6]N+B @26X-“F=E;F5R86PL(&ET(&ES
M(’!E<FUI<W-I8FQE(‘1O(’-I;7!L>2!I9VYO<F4@=&AE<V4@8V]M;6%N9’,L
M(&)U= T*;6]R92!S;W!H:7-T:6-A=&5D(&1R:79E<G,@;6%Y(&)E(&%B;&4@
M=&@=7-E(‘1H:7,@:6YF;W)M871I;VX@=&-“G!R;W9I9&4@97AT<F$@<V5R
M=FEC97,@;W(@9F5A='5R97,N(”!4:&4@:6]C=&Q?96YT<GD@:7,@9&5F:6YE
M9 T*:6X@/’-Y<R]?9&5V9’)V<BYH/BX@(%1H92!F:7)S=”!S:&]R=”!I;G0@
M9&5F:6YE<R!T:&4@='EP92!O9B!T:&4-“F]P97)A=&EO;BX@(%1H92!S96-O
M;F0@<VAO<G0@:6YT(&ES('5S=6%L;‘D@82!U;FET(&YU;6)E<B H,2 N+BX-
M"DXI(’=H:6-H(&EN9&EC871E<R!W:&EC:”!O9B!T:&4@9&5V:6-E<R!O=VYE
M9"!B>2!T:&ES(&1R:79E<B!I<PT8F5I;F<@;W!E<F%T960@;VXN("!/;B!R
M971U<FXL(&ET(&ES(&5X<&5C=&5D('1H870@=&AE(&1R:79E<@T
=VEL;"!R
M97!L86-E(‘1H92!F:7)S="!W;W)D(’=I=&@@82!S=&%T=7,@# @=7-U86QL
M>2!M96%N:6YG#0IS=6-C97-S
2X@($%T(‘1H92!T:6UE(&]F(‘1H:7,@<’)I
M;G1I;F<L(‘1H92!F;VQL;W=I;F<@=‘EP97,@87)E#0ID969I;F5D.@T*#0H@
M(" @($E/0U1,7T]014X@(" @(" @("!#86QL960@;VX@9FER<W0@;W!E;B@I
M+@T*(" @("!)3T-43%]#3$]312 @(" @(" @0V%L;&5D(&]N(&QA<W0@8VQO
M<V4H2X-“B @(” @24]#5$Q?0U1,(" @(" @(" @($-A;&QE9"!B>2!Q;GA?
M:6]C=&PH
2X-“B @(” @24]#5$Q?4U1!4E1"4D5!2R @($%S<V5R="!B<F5A
M:R!C;VYD:71I;VX@&EF(’!O<W-I8FQE2X-“B @(” @24]#5$Q?4U1/4$)2
M14%+(" @(%)E;6]V92!T:&4@8G)E86L@8V]N9&ET:6]N+@T*(" @("!)3T-4
M3%]35$%25$123U @(" @3&]W97(@;6]D96T@8V]N=’)O;" H:64Z(&1R;W -
M"B @(" @(" @(" @(" @(" @(" @(" @(&-O;6UU;FEC871I;VX@;&EN92DN
M#0H@(" @($E/0U1,7U-43U!$4D]0(" @("!286ES92!M;V1E;2!C;VYT<F]L
M(“AR971U<FX@=&@;F]R;6%L2X-"@T4F5T=7)N<PT*#0I4:&4@9&5V7V1R
M=G)?<F5G:7-T97(@9G5N8W1I;VX@<F5T=7)N<R!A(“AP;W-I=&EV92!I;G1E
M9V5R0T:&%N9&QE('1O(&)E('5S960@=VET:”!S=6)S97%U96YT(&-A;&QS
M(‘1O(&1E=E]D<G9R7VUO=6YT(&%N9 T9&5V7V1R=G)?<VAU=&1O=VXN#0H-
M"D5R<F]R<PT
#0I7:&5N(&%N(&5R<F]R(&AA<R!O8V-U<G)E9"P@=&AE(&9U
M;F-T:6]N(’)E='5R;G,@82!N96=A=&EV92!V86QU90T*:6YD:6-A=&EN9R!T
M:&4@='EP92!O9B!E<G)O<B!T:&%T(&AA<R!B965N(&1E=&5C=&5D+@T*#0H@
M(” @("@M,2D@56YA8FQE(‘1O(&-O;6UU;FEC871E(’=I=&@@1&5V+@T*(" @
M(" H+3$I($EN<W5F9FEC:65N="!R97-O=7)C97,N#0H-"E-E92!!;’-O#0H-
M"B @(" @9&5V7V1R=G)?;6]U;G0L(&1E=E]D<G9R7V%R;2P@9&5V7V1R=G)?
M<VAU=&1O=VX-"@T17AA;7!L90T#0I#;&%S<VEF:6-A=&EO;@T*#0I13E@-
M"@P-“F1E=E]D<G9R7VUO=6YT#0HM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2T-”@T4WEN;W!S
M:7,-"@T
(" @(" C:6YC;‘5D92 <WES+U]D979D<G9R+F@^#0H-“B @(” @
M:6YT(&1E=E]D<G9R7VUO=6YT(" @&EN="!H86YD;&4L#0H@(" @(" @(" @
M(" @(" @(" @(" @(" @("!I;G0@='1Y+ T
(" @(" @(" @(" @(" @(" @
M(" @(" @(" @:6YT(&YT=‘ES+ T*(" @(" @(" @(" @(" @(" @(" @(" @
M(" @<W1R=6-T(&1E=FEC95]C=’)L("IC=’)L("D[#0H-"D1E<V-R:7!T:6]N
M#0H-"E1H92!D979?9’)V<E]M;W5N="!F=6YC=&EO;B!I<R!U<V5D(‘1O(&-R
M96%T92!N=‘1Y<R!I;G-T86YC97,@;V8-“FYE=R!C:&%R86-T97(@<W!E8VEA
M;”!D979I8V5S+@T*#0I4:&4@=F%L=64@:6X@=‘1Y(&ES(‘1H92!S=&%R=&EN
M9R!I;G1E<FYA;"!T=‘D@;G5M8F5R(&9O<B!T:&4-“F9I<G-T(&1E=FEC92!I
M;B!T:&4@9W)O=7 @8F5I;F<@;6]U;G1E9” H8F%S960@;VX@=&AE(&)A<V5?
M=‘1Y#0IV86QU92!R971U<FYE9"!I;B!T:&4@9’)V7V-T<FP@<W1R=6-T=7)E
M2X-"@T06X@87)R87D@;V8@:6YI=&EA;&EZ960@9&5V:6-E7V-T<FP@96YT
M<FEE<R!I<R!P87-S960@=&@=&AI<PT9G5N8W1I;VX@&]N92!F;W(@96%C
M:"!O9B!T:&4@;G1T>7,I+B @16%C:"!E;G1R>2!O;B!I;G!U="!S:&]U;&0-
M"F1E9FEN92!T:&4@9F]L;&]W:6YG(’-T<G5C=‘5R97,Z#0H-“B @(” @<VAO
M<G0@=6YS:6=N960@:7-I>F4@(" @(%-I>F4@;V8@:6YP=70@8G5F9F5R(‘1O
M(&%L;&]C871E+@T*(" @("!S:&]R="!U;G-I9VYE9"!O<VEZ92 @(" @4VEZ
M92!O9B!O=71P=70@8G5F9F5R(‘1O(&%L;&]C871E+@T*(" @("!S:&]R="!U
M;G-I9VYE9"!C<VEZ92 @(" @4VEZ92!O9B!C86YO;FEC86P@&5D:70I(&)U
M9F9E<B!T;PT
(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @86QL;V-A
M=&4N#0H-“E1H:7,@8V%L;”!W:6QL(&%T=&5M<‘0@=&@86QL;V-A=&4@86QL
M(‘1H92!R97-O=7)C97,@;F5C97-S87)Y#0IF;W(@=&AI<R!E;G1I<F4@9W)O
M=7 @;V8@9&5V:6-E<RX@(%=H97)E(’!O<W-I8FQE+"!B=69F97)S(’=I;&P-
M"F)E(’!A8VME9"!I;G1O(&%S(&9E=R!M96UO<GD@<V5L96-T;W)S(&%S(’!O
M<W-I8FQE+"!T;R!C;VYS97)V90T*<F5S;W5R8V5S+B @5&AE(&)U9F9E<G,@
M86YD(&-O;G1R;VP@<W1R=6-T=7)E<R!W:6QL(&%L;"!B92!M861E#0IA9&1R
M97-S86)L92!B>2!B;W1H(‘1H:7,@9’)I=F5R(&%N9"!$978N#0H-"DEF(’-U
M8V-E<W-F=6QL>2!M;W5N=&5D+"!T:&4@9G5N8W1I;VX@=VEL;"!R971U<FX@
M82!Z97)O(&%N9"!T:&4-"G)E;6%I;FEN9R!D979I8V4@8V]N=’)O;"!E;G1R
M:65S(’=I;&P@8F4@9FEL;&5D(&9O<B!E86-H(&1E=FEC92X@#0I!="!T:&4@
M=&EM92!O9B!T:&ES(’!R:6YT:6YG+"!T:&4@9F]L;&]W:6YG(&UE;6)E<G,@
M87)E(&1E9FEN960Z#0H-“B @(” @<VAO<G0@:6YT(" @(" @(" @(" @(" @
M(" @(‘1T>2 @(" @("!);G1E<FYA;"!T=‘D@;G5M8F5R#0H@(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @;V8@=&AI<R!U;FET
M+@T*(" @("!S=’)U8W0@:6YP=71?8G5F9F5R(" @9F%R(" @FEB=68@(" @
M(%!O:6YT97(@=&@<F%W(&EN<'5T#0H@(" @(" @(" @(" @(" @(" @(" @
M(" @(" @(" @(" @(" @(" @(" @8G5F9F5R+@T
(" @("!S=’)U8W0@;W5T
M<‘5T7V)U9F9E<B @9F%R(" @F]B=68@(" @(%!O:6YT97(@=&@<F%W#0H@
M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @;W5T
M<'5T(&)U9F9E<BX-“B @(” @<W1R=6-T(&-A;F]N7V)U9F9E<B @(&9A<B @
M(“IC8G5F(” @("!0;VEN=&5R('1O(&5D:70@8G5F9F5R+@T
(" @("!S=’)U
M8W0@=&5R;6EO<R @(" @(" @9F%R(" @G1E<FUI;W,@(%!O:6YT97(@=&@
M9&5V:6-E#0H@(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @
M(" @(" @8V]N=’)O;"!S=’)U8W1U<F4N#0H@(" @(’-T<G5C="!S=&%T(" @
M(" @(" @("!F87(@(" J<W1A=" @(" @4&]I;G1E<B!T;R!D979I8V4G<PT

M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(&1I
M<F5C=&]R>2!E;G1R>2X-"@T5&AE('9A;‘5E(&]F(‘1T>2!I;B!T:&ES(&1E
M=FEC95]C=’)L(’-T<G5C=‘5R92!I<R!T:&4@=F%L=64@=&-“G5S92!A<R!T
M:&4@9FER<W0@87)G=6UE;G0@=&@='1I(”@I(’=H96X@96YT97)I;F<@9&%T
M82!F;W(@=&AI<PT
=6YI=“X-”@T*;V)U9B!I<R!A(’!O:6YT97(@=&@86X@
M;W5T<‘5T(&)U9F9E<B!C;VYT<F]L(’-T<G5C=‘5R92!W:&EC: T8V]N=&%I
M;G,@:6YF;W)M871I;VX@<F5Q=6ER960@9F]R(&]U=’!U='1I;F<@9&%T82X-
M"@T
:6)U9BP@8V)U9BP@=&5R;6EO<R!A;F0@<W1A="!A<F4@86QL(’!R;W9I
M9&5D(&9O<B!I;F9O<FUA=&EO;F%L#0IP=7)P;W-E<RP@8G5T(&YE960@;F]T
M(&%C=‘5A;&QY(&)E(‘5S960@9&ER96-T;‘D@8GD@=&AE(&1R:79E<BX-"@T*
M4F5T=7)N<PT*#0I4:&4@9&5V7V1R=G)?;6]U;G0@9G5N8W1I;VX@<F5T=7)N
M<R!A(‘IE<F@:68@=6YS=6-C97-S9G5L+@T*#0H,#0ID979?9’)V<E]A<FT-
M"BTM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM#0H-"E-Y;F]P<VES#0H-“B @(” @(VEN8VQU
M9&4@/’-Y<R]?9&5V9’)V<BYH/@T*(" @("!I;G0@9&5V7V1R=G)?87)M*"!I
M;G0@=‘1Y("D[#0H-"D1E<V-R:7!T:6]N#0H-"E1H92!D979?9’)V<E]A<FT@
M9G5N8W1I;VX@:7,@=7-E9"!T;R!E;F%B;&4@82!N97=L>2!C<F5A=&5D#0IC
M:&%R86-T97(@<W!E8VEA;"!D979I8V4N("!.;R!D871A(’=I;&P@8F4@<&QA
M8V5D(&EN('1H92 H86QR96%D>0T97-T86)L:7-H960I(&1E=FEC92!O=71P
M=70@8G5F9F5R(&)Y($1E=B!U;G1I;"!T:&ES(&-A;&P@:7,@;6%D92X-"@T

M)W1T>2<@:7,@=&AE(&EN=&5R;F%L(‘1T>2!N=6UB97(@&)A<V4K=6YI="TQ
M
2!O9B!T:&4@9&5V:6-E(&)E:6YG#0IE;F%B;&5D+@T*#0I2971U<FYS#0H-
M"E1H92!D979?9’)V<E]A<FT@9G5N8W1I;VX@<F5T=7)N<R!A(‘IE<F@:68@
M<W5C8V5S<V9U; T*#0I%<G)O<G,-"@T5VAE;B!A;B!E<G)O<B!H87,@;V-C
M=7)R960L('1H92!F=6YC=&EO;B!R971U<FYS(&$@;F5G871I=F4@=F%L=64-
M"FEN9&EC871I;F<@=&AE('1Y<&4@;V8@97)R;W(@=&AA="!H87,@8F5E;B!D
M971E8W1E9"X-"@T
(" @(" H+3$I($YO(’!R:6]R(&-A;&P@=&@9&5V7V1R
M=G)?<F5G:7-T97(N#0H@(" @("@M,2D@17)R;W(@8V]M;75N:6-A=&EN9R!W
M:71H($1E=BX-“B @(” @"TQ2!“860@=‘1Y+@T*#0I3964@06QS;PT*#0ID
M979?9’)V<E]R96=I<W1E<BP@9&5V7V1R=G)?;6]U;G0L(&1E=E]D<G9R7W-H
M=71D;W=N#0H-“D5X86UP;&4-”@T0VQA<W-I9FEC871I;VX-"@T44Y8#0H-
M"E=H96X@86X@97)R;W(@:&%S(&]C8W5R<F5D+”!T:&4@9G5N8W1I;VX@<F5T
M=7)N<R!A(&YE9V%T:79E(‘9A;‘5E#0II;F1I8V%T:6YG(‘1H92!T>7!E(&]F
M(&5R<F]R(‘1H870@:&%S(&)E96X@9&5T96-T960N#0H-“B @(” @"TQ2!.
M;R!P<FEO<B!C86QL(‘1O(&1E=E]D<G9R7W)E9VES=&5R+@T*(" @(" H+3(I
M(%5N86)L92!T;R!A;&QO8V%T92!T:&4@;65M;W)Y(&9O<B!T:&4@<F5Q=65S
M=&5D(&1E=FEC90T*(" @(" @(" @(&)U9F9E<G,N#0H@(" @("@M-“D@0F%D
M(&AA;F1L92X-“B @(” @"TT2!5;F%B;&4@=&@:6YS=&%L;”!T:&4@;F5W
M(&1E=FEC97,N#0H-"E-E92!!;’-O#0H-“F1E=E]D<G9R7W)E9VES=&5R+”!D
M979?9’)V<E]A<FTL(&1E=E]D<G9R7W-H=71D;W=N#0H-“D5X86UP;&4-”@T*
M0VQA<W-I9FEC871I;VX-"@T44Y8#0H-"@P-"F1E=E]D<G9R7W-H=71D;W=N
M#0HM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM
M+2TM+2TM+2TM+2TM+2TM+2TM+0T
#0I3>6YO<’-I<PT*#0H@(" @("-I;F-L
M=61E(#QS>7,O7V1E=F1R=G(N:#X-“B @(” @:6YT(&1E=E]D<G9R7W-H=71D
M;W=N(“AU;G-I9VYE9”!H86YD;&4I.PT*#0I$97-C<FEP=&EO;@T*#0I4:&4@
M9&5V7V1R=G)?<VAU=&1O=VX@9G5N8W1I;VX@:7,@=7-E9"!T;R!R96QE87-E
M(&%L;"!R97-O=7)C97,-“F%S<V]C:6%T960@=VET:”!T:&4@8VAA<F%C=&5R
M(’-P96-I86P@9&5V:6-E<R!A<W-O8VEA=&5D(’=I=&@-“FAA;F1L92X@(%1H
M:7,@9G5N8W1I;VX@;75S=”!B92!C86QL960@8F5F;W)E(&$@9&5V:6-E(&1R
M:79E<@T*=&5R;6EN871E<RX-"@T4F5T=7)N<PT#0I4:&4@9&5V7V1R=G)?
M<VAU=&1O=VX@9G5N8W1I;VX@<F5T=7)N<R!Z97)O(&EF('5N<W5C8V5S<V9U
M;“X-”@T17)R;W)S#0H-“E=H96X@86X@97)R;W(@:&%S(&]C8W5R<F5D+”!T
M:&4@9G5N8W1I;VX@<F5T=7)N<R!A(&YE9V%T:79E('9A;'5E#0II;F1I8V%T
M:6YG(‘1H92!T>7!E(&]F(&5R<F]R(‘1H870@:&%S(&)E96X@9&5T96-T960N
M#0H-"B@M,2D@3F@<’)I;W(@8V%L;"!T;R!D979?9’)V<E]R96=I<W1E<BX-
M"B@M,2D@0F%D(&AA;F1L92X-"@T
4V5E($%L<V-"@T9&5V7V1R=G)?<F5G
M:7-T97(L(&1E=E]D<G9R7VUO=6YT+"!D979?9’)V<E]A<FT-"@T
17AA;7!L
<90T*#0I#;&%S<VEF:6-A=&EO;@T*#0I13E@-"@``
`
end

“The Neutrino devc architecture is not the same as the QNX4 Dev driver
architecture”.

Once you have come to grips with this fact, you can goto cvs.qnx.com,
and get the source to the io-char library, and the devc-ser8250 drivers.
As they say the source is the ultimate documentation :wink:

-----Original Message-----
From: Alexandre ABREU [mailto:alexandre.abreu@opal-rt.com]
Posted At: Friday, July 27, 2001 8:20 AM
Posted To: os
Conversation: Neutrino QNX Dev Drivers equivalent.
Subject: Neutrino QNX Dev Drivers equivalent.


Hi all,

I have a very very annoying problem.
I am in charge of the development of a driver for a serial multiport
card under Neutrino. A driver for this card already
exists under QNX 4.24 and I have the source code for it.
My job is just to adapt the current source code to Neutrino.

But, and here come the problems, the QNX driver
uses the classic Dev <-> Dev Drivers communication
structure. It uses the sys/_devdrvr.h include file and
some functions like dev_drvr_register() to register the driver
and some callback functions that should be called by Dev
to add stuff in the output queues (Kick()), etc … or
like dev_drvr_mount to allocate input/output buffers …
Moreover, Dev provides a tti() function for the driver to add stuff
in the input queue etc …
I have some difficulties finding some good papers on the
way Neutrino handles this type of driver. It seems that
the equivalent of Dev interface is io-char in Neutrino but
i have not been able to find more information on how to use it and
on the equivalent of the few QNX functions above.

Is there a strict correspondancy between the io-char use
and behaviour and the Dev ones ?
Is there some equivalent functions that achieve the same
tasks as the ones above ?
Can some one provide me some good and accurate
informations/urls/docs about that problem ?

I give in attachment the classic Dev Driver document
that covers and explains all the functions that i have
cited above.

Thank you in advance for your help,


ABREU Alexandre

I’d look into devc-xxx drivers’ source available from cvs.qnx.com.

  • igor

Alexandre ABREU wrote:

Hi all,

I have a very very annoying problem.
I am in charge of the development of a driver for a serial multiport
card under Neutrino. A driver for this card already
exists under QNX 4.24 and I have the source code for it.
My job is just to adapt the current source code to Neutrino.

But, and here come the problems, the QNX driver
uses the classic Dev <-> Dev Drivers communication
structure. It uses the sys/_devdrvr.h include file and
some functions like dev_drvr_register() to register the driver
and some callback functions that should be called by Dev
to add stuff in the output queues (Kick()), etc … or
like dev_drvr_mount to allocate input/output buffers …
Moreover, Dev provides a tti() function for the driver to add stuff
in the input queue etc …
I have some difficulties finding some good papers on the
way Neutrino handles this type of driver. It seems that
the equivalent of Dev interface is io-char in Neutrino but
i have not been able to find more information on how to use it and
on the equivalent of the few QNX functions above.

Is there a strict correspondancy between the io-char use
and behaviour and the Dev ones ?
Is there some equivalent functions that achieve the same
tasks as the ones above ?
Can some one provide me some good and accurate
informations/urls/docs about that problem ?

I give in attachment the classic Dev Driver document
that covers and explains all the functions that i have
cited above.

Thank you in advance for your help,


ABREU Alexandre

QNX 4 Device Drivers

Introduction

When you need to provide an interface to a traditional form of
character device (modem, terminal or printer) which will be
accessed by programs which expect to see a 100% POSIX 1003.1
interface, then you probably need to write a Dev Driver process.
The POSIX interface includes services such as modem control, line
discipline, baud rates, parity, echo, line editing, timed reads,
interbyte timing, etc. All of these services are provided for
and managed by the QNX4 Dev process. QNX4 Dev Drivers simply
provide the hardware interface between Dev and the hardware using
a private, highly optimized interface. The only responsibility
of a QNX4 Dev Driver is to provide access to the hardware. The
real work is done by Dev itself.

Before we start, it should be pointed out that Dev Drivers are
not the only method of interfacing to hardware devices in QNX4.
In fact, unless your device looks very much like a typical serial
device, you probably don’t want to write a Dev Driver.

Many types of hardware are better handled in QNX4 by a server
process which responds to custom messages directly from client
processes. Remember that any process can access the hardware if
it has sufficient privity, so such server processes are
remarkably easy to develop, and are often much easier to develop
than a Dev Driver (see the Client/Server technical note for more
information).

If the best way to access a piece of hardware is deemed to be
through standard I/O calls (open, close, read and write), then a
message-driven client/server approach may not be appropriate.
Nonetheless, a Dev Driver may still not be the best approach. A
special form of server process can be written which adopts a
portion of the QNX4 namespace (eg: /dev/tape) and which responds
to a well defined set of I/O messages (IO_OPEN, IO_CLOSE, etc.)
This type of server will be an I/O Manager and can provide highly
optimized I/O directly to the hardware. Such servers allow for
specialized non-POSIX functionality and this approach avoids the
possibly unnecessary overhead of communicating through another
process; Dev. (see the I/O Manager technical note for more
information).

This technical note addresses the case where POSIX style
character I/O is required. This includes a vast number of
devices such as multiport, intelligent serial adapters,
windows-based terminal emulators, printer drivers and many, many
more.

Overview

QNX is a modular operating system. As such, various system
services are provided by independent server processes. In the
case of POSIX 1003.1 compatible devices (character special
files), I/O services are provided by a common Device Server
process called Dev.

Dev owns the part of the namespace beginning with the prefix
‘/dev’ and receives messages from processes which wish to do I/O
operations on pathnames beginning with this prefix. All POSIX
features and side-effects are managed exclusively by Dev.
including blocking and non-blocking reads and writes, timed read
operations, flow control, echo, line editing, etc.

The interface to the hardware devices themselves is provided by a
series of Dev Driver processes. These drivers communicate
directly with the hardware and interface with Dev via a set of
three data queues as shown in Figure 1 below:

Dev output buffer Driver
ÚÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄ¿
³///³ÄÄÄÄÄÄÄÄÄÄÄ>³||||||||||||||||||||||||³ÄÄÄ>³\\³
³///³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³\\³
³///³ input buffer ³\\³
³///³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³\\³
³///³<ÄÄÄÄÄÄÂÄÄÄij|||||||||||||||||||||||³<ÄÄÄij\\³
³///³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³\\³
³///³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³\\³
³///³ canonical (edit) buffer ³ ³\\³
³///³ ÚÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³\\³
³///³<ÄÄÄÄÄÄÄÄÄÄij||||||||||||³<ÄÄÄÄÄÄÄÄÄÙ ³\\³
³///³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ ³\\³
ÀÄÄÄÙ ÀÄÄÄÄÙ

Figure 1: Communication via queues between Dev and a Device
Driver

The function of a QNX4 Dev Driver (unlike that of a more classic
UNIX device driver, or even a QNX2 device driver) is simply to
transmit data bytes to the hardware device and to receive data
bytes from the hardware and insert them into the raw input queue.
Aside from a few (optional) control functions, there is little
else required of a QNX4 Dev Driver.

QNX4 Dev Drivers are normal QNX processes compiled to run at
privity 1 in order to gain access to the hardware I/O registers.
These drivers can be started and stopped dynamically.

When a driver starts, it attempts to register itself and allocate
resources from Dev by calling the dev_drvr_register () function.
At this time the driver indicates how many devices it will be
handling, what prefix the devices will be given and some
housekeeping information. Provided that there is sufficient
resources available, Dev will reply with a driver control
structure which contains generic information which will be used
by the driver in subsequent calls. Included in this structure is
the address of a function to call (called tti) which must be used
to add data into the input data queue. Included in the
parameters passed to the dev_drvr_register () function is the
address of three routines in the driver’s space which can be
called by Dev to indicate significant events. The Kick ()
function will be called by Dev whenever something happens with
the output buffer (ie: data available). The Stty () function is
called by Dev whenever something happens to the termios (device
control) structure which requires the attention of the driver
(such as change in baud rate or parity). The Ioctl () function
is called to perform general control operations (sendbreak,
dropline, etc.)

The driver must then call dev_drvr_mount () for each of the
devices. In this call, the driver must supply the individual
sizes for each of the input, output and canonical buffers. Each
call to dev_drvr_mount () can include one or more devices. If
more than one device is specified, then the library routine will
attempt to pack the I/O buffers into as few shared memory
segments as possible which is a good way to conserve system
resources. Provided that the resources can all be acquired, Dev
will reply with a device control structure for each device. This
structure will contain pointers to the three data queues as well
as a unique tty# (handle) for each device. This tty# must be
used when calling the tti () function to identify which input
queue is to receive the data.

Finally, once all devices are registered and mounted, it is
necessary to enable (arm) each of the output channels by calling
the dev_drvr_arm () function for each device. This will complete
the registration process and will allow Dev to start placing data
in the output queues.

The driver is now ready for its mainline mode of operation.

A final function is available for releasing all of the resources
assigned to a Dev Driver before it terminates. The
dev_drvr_shutdown () call is used just before a driver
terminates. Dev Drivers should catch the SIGTERM signal and
perform an orderly shutdown which allows the slay utility to be
used to cleanly terminate a driver.

Processing Input Data

Most device drivers in QNX4 will be interrupt driven when it
comes to input data. For this reason, the facilities provided by
Dev are geared towards allowing efficient and convenient data
input directly from interrupt handlers.

QNX4 interrupt handlers are capable of triggering a proxy when
they return. The tti () function accepts as parameters a tty#
(indicating the device), a 16-bit input value comprised of 8 data
bits and 8 control bits, and a value which can be used to access
Dev’s data segment from within the context of the interrupt
handler. The function tti () will either return a zero or it
will return the process-id of a proxy which should be triggered
to wake up Dev. An interrupt handler simply has to return (in
ax) the return value of tti () to have this effect. If the tti
() function is called at process time, then it will be necessary
to Trigger () the proxy if a non-zero value is returned.

The tti () function has been designed to be as efficient as
possible and simply places the data into the raw input queue. It
returns either a zero or a proxy if a pre-conditioned event has
been triggered. Dev set up these pre-conditions based on pending
I/O requests. Some of these conditions depend on the
relationship between received data bytes and timers and may in
fact cause further conditions to be armed, so it is necessary to
call tti () for every byte received.

The bottom byte of the data word passed to tti () is the
character received. The top byte contains flags indicating
special conditions:

Good Data 00000000 data
H/W Break 10000000 00000000
Bad Data 01000DFP data
H/W Event 00100000 0000chnf

D-Data Overrun c-carrier received
F-Framing Error h-hangup (loss of carrier)
P-Parity Error n-hardware handshaking ON
f-hardware handshaking OFF

Processing Output Data

Output starts when the Kick () function is called. It is the
responsibility of the driver to examine the output buffer on
every Kick () call and attempt to output any data which is
available. A pointer to the output buffer which has changed is
passed as the only argument Kick ().

Control Operations

Dev will call the Stty () function when it requires the driver to
change some aspect of the hardware (such as baud rate, data bits,
stop bits or parity). The new settings can be found using the
pointer to a termios structure which is passed as the only
argument to Stty ().

Dev will call the Ioctl () function whenever it requires some
special action of the driver (such as assert or remove a break
condition, or start/stop a dropline condition). It will also
call Ioctl () to provide the driver with useful information (such
as first open or last close).

Special Modes and Options

A flag word is passed as one of the arguments to
dev_drvr_register () which can contain bits indicating special
modes of operation. These bits are described in the manual page
for the dev_drvr_register () function.

Compiling the Driver

The interface between Dev and a Dev Driver is designed to consume
as few resources as possible while still maintaining a high speed,
secure environment. Both Dev and the Dev Driver far-call into the
other’s code space.

While operating in this code space, the interface makes available
one data segment for accessing global variables. The
dev_driver_register () process ensures that LDT aliases exist for
the appropriate code and data segments. It should be noted that
the following restrictions apply within the interface functions
Kick (), Stty () and Ioctl ():

  1. Only global variables in the same data segment as the
    variable drv_ctrl (which was passed to dev_drvr_register) can be
    accessed.

  2. Only functions in the same code segment as the interface
    routine (Kick, Stty or Ioctl) can be called.

  3. In general, no system functions or library routines can be
    used other than Trigger ().

  4. When an interface routine is called by Dev, it will be using
    the stack of Dev. Thus stack usage should be kept to a minimum
    and one should not assume that SS=DS.

  5. Stack checking must be disabled.

The above rules are easiest to enforce if the Dev Driver is
compiled in 16-bit (or 32-bit) small model with stack checking
disabled. As a rule of thumb, the interface routines should do
nothing more than modify global variables, optionally trigger a
proxy, then return. If more work must be done, it is recommended
that a proxy be triggered which will wake up the Dev Driver process
which can then perform the bulk of the work at process time. This
avoids having to deal with the above restrictions.

Dev Drivers must be compiled with privity 1 (-T1).

Library Routine Reference

dev_drvr_register

Synopsis

#include <termios.h
#include <sys/_devdrvr.h

int dev_drvr_register(
char *name,
char *prefix,
int nttys,
int (far *Kick) ( struct output_buffer far *),
int (far *Stty) (struct termios far *)
int (far *Ctrl) (union ioctl_entry far *)
struct driver_ctrl *dry_ctrl,
unsigned flags );

Description

The dev_drvr_register function is used to create new character
special devices.

‘name’ is a symbolic name to be associated with this class of
device. This will be the string found in the driver_type member
of a _dev_info_entry which is returned by dev_info and is
displayed as the device Type by the stty utility. Name cannot
exceed 16 characters.

‘prefix’ is the string to be used as the first part of a device
name. All devices created as a result of this call will have
names in the /dev directory which start with this prefix and end
in a number (eg: registering 3 devices with the prefix ‘tst’ will
create 3 devices called ‘/dev/tst1’, ‘/dev/tst2’ and ‘/dev/tst3’.
prefix cannot exceed 8 characters.

‘nttys’ is the number of devices (or units) to be created with this
prefix.

‘drv_ctrl’ is a pointer to a driver_ctrl structure which will be
filled if the function is successful. This structure contains
information which is common to all the newly created devices.
The structure is defined in <sys/_devdrvr.h> and includes the
following members:

short int base_tty The ‘internal’ tty number assigned
to the first device. The remaining
devices are assigned sequential
numbers.

short int nttys The number of devices belonging to
this handle.

pid_t (far *tti) A far pointer to a function (inside
(short, short, unsigned) Dev’s address space) which must be
used to enter data into the input
queue. The first argument is the
internal tty number of the device
(base + unit - 1). The second argument
is the received data character. The
third argument is a data selector to
use when calling tti (). The function
returns either a zero (do nothing) or
a proxy which should be Triggered to
‘kick’ Dev.

short unsigned tti_ds A data selector to be used as the third
argument to tti().

pid_t hw_pid A proxy to trigger Dev when a significant
event occurs.

short unsigned flags A bitfield of flag bits associated with
this new device class. The bits are
defined in <sys/_devdrvr.h>. At the
time of this printing the following bits
are defined:

DRVR_GETS_PIDS IOCTL_OPEN passes down
pid, fd, etc. (this
feature did not exist
until QNX 4.10).

‘flags’ is used to control optional modes of driver operation.
The flag bits are defined in <sys/_devdrvr.h>. At the time
of this printing, the following driver flags are defined:

DRVR_SCAN open () with no suffix causes Dev to
scan for an unused unit. (eg: /dev/con
free console).

DRVR_NOTTY Not a terminal device (eg: /dev/null).
If set, this flag causes the togetattr
() function to fail, which cause isatty
() to fail.

DRVR_LOCK_HFLOW IHFLOW/OHFLOW in c_cflag cannot be
changed, even by stty.

DRVR_SINGLE_OPEN Open () will fail if the device is
already opened.

DRVR_HEX_SUFFIX Suffixes are 00 based hex rather than 1
based decimal (eg: Dev.pty).

DRVR_STTY Driver gets called on every tcsetattr ()
call rather than just when baud/stop-bits/
parity are changed.

DRVR_NO_SUFFIX Suppress the numeric suffix if only 1
device is registered (eg: /dev/null
will be displayed instead of /dev/null1).

‘Kick’ is the address of a function to be called by Dev every time
something new happens with the output queue (new data or flow
control change). Kick will be passed a single parameter which is
a far pointer to the output buffer which has changed.

‘Stty’ is the address of a function to be called by Dev every time
something significant happens to the termios control structure
associated with this device. Unless the DRVR_STTY mode is
enabled, significant events are deemed to be only those which
require some attention by the hardware (baud rate, parity, etc.).
Stty will be passed a single parameter which is a far pointer to
the termios structure which has changed.

‘Ctrl’ is the address of a function to be called by Dev to perform
control (or housekeeping) operations. Ctrl will be passed a
single parameter which is a far pointer to an ioctl_entry which
is a multi-purpose structure containing a control operation. In
general, it is permissible to simply ignore these commands, but
more sophisticated drivers may be able to use this information to
provide extra services or features. The ioctl_entry is defined
in <sys/_devdrvr.h>. The first short int defines the type of the
operation. The second short int is usually a unit number (1 …
N) which indicates which of the devices owned by this driver is
being operated on. On return, it is expected that the driver
will replace the first word with a status (0 usually meaning
success). At the time of this printing, the following types are
defined:

IOCTL_OPEN Called on first open().
IOCTL_CLOSE Called on last close().
IOCTL_CTL Called by qnx_ioctl().
IOCTL_STARTBREAK Assert break condition (if possible).
IOCTL_STOPBREAK Remove the break condition.
IOCTL_STARTDROP Lower modem control (ie: drop
communication line).
IOCTL_STOPDROP Raise modem control (return to normal).

Returns

The dev_drvr_register function returns a (positive integer)
handle to be used with subsequent calls to dev_drvr_mount and
dev_drvr_shutdown.

Errors

When an error has occurred, the function returns a negative value
indicating the type of error that has been detected.

(-1) Unable to communicate with Dev.
(-1) Insufficient resources.

See Also

dev_drvr_mount, dev_drvr_arm, dev_drvr_shutdown

Example

Classification

QNX

dev_drvr_mount

Synopsis

#include <sys/_devdrvr.h

int dev_drvr_mount (int handle,
int tty,
int nttys,
struct device_ctrl *ctrl );

Description

The dev_drvr_mount function is used to create nttys instances of
new character special devices.

The value in tty is the starting internal tty number for the
first device in the group being mounted (based on the base_tty
value returned in the drv_ctrl structure).

An array of initialized device_ctrl entries is passed to this
function (one for each of the nttys). Each entry on input should
define the following structures:

short unsigned isize Size of input buffer to allocate.
short unsigned osize Size of output buffer to allocate.
short unsigned csize Size of canonical (edit) buffer to
allocate.

This call will attempt to allocate all the resources necessary
for this entire group of devices. Where possible, buffers will
be packed into as few memory selectors as possible, to conserve
resources. The buffers and control structures will all be made
addressable by both this driver and Dev.

If successfully mounted, the function will return a zero and the
remaining device control entries will be filled for each device.
At the time of this printing, the following members are defined:

short int tty Internal tty number
of this unit.
struct input_buffer far *ibuf Pointer to raw input
buffer.
struct output_buffer far *obuf Pointer to raw
output buffer.
struct canon_buffer far *cbuf Pointer to edit buffer.
struct termios far *termios Pointer to device
control structure.
struct stat far *stat Pointer to device’s
directory entry.

The value of tty in this device_ctrl structure is the value to
use as the first argument to tti () when entering data for this
unit.

obuf is a pointer to an output buffer control structure which
contains information required for outputting data.

ibuf, cbuf, termios and stat are all provided for informational
purposes, but need not actually be used directly by the driver.

Returns

The dev_drvr_mount function returns a zero if unsuccessful.

dev_drvr_arm

Synopsis

#include <sys/_devdrvr.h
int dev_drvr_arm( int tty );

Description

The dev_drvr_arm function is used to enable a newly created
character special device. No data will be placed in the (already
established) device output buffer by Dev until this call is made.

‘tty’ is the internal tty number (base+unit-1) of the device being
enabled.

Returns

The dev_drvr_arm function returns a zero if successful

Errors

When an error has occurred, the function returns a negative value
indicating the type of error that has been detected.

(-1) No prior call to dev_drvr_register.
(-1) Error communicating with Dev.
(-1) Bad tty.

See Also

dev_drvr_register, dev_drvr_mount, dev_drvr_shutdown

Example

Classification

QNX

When an error has occurred, the function returns a negative value
indicating the type of error that has been detected.

(-1) No prior call to dev_drvr_register.
(-2) Unable to allocate the memory for the requested device
buffers.
(-4) Bad handle.
(-4) Unable to install the new devices.

See Also

dev_drvr_register, dev_drvr_arm, dev_drvr_shutdown

Example

Classification

QNX

dev_drvr_shutdown

Synopsis

#include <sys/_devdrvr.h
int dev_drvr_shutdown (unsigned handle);

Description

The dev_drvr_shutdown function is used to release all resources
associated with the character special devices associated with
handle. This function must be called before a device driver
terminates.

Returns

The dev_drvr_shutdown function returns zero if unsuccessful.

Errors

When an error has occurred, the function returns a negative value
indicating the type of error that has been detected.

(-1) No prior call to dev_drvr_register.
(-1) Bad handle.

See Also

dev_drvr_register, dev_drvr_mount, dev_drvr_arm

Example

Classification

QNX

Rennie Allen wrote:

“The Neutrino devc architecture is not the same as the QNX4 Dev driver
architecture”.

Once you have come to grips with this fact, you can goto cvs.qnx.com,
and get the source to the io-char library, and the devc-ser8250 drivers.
As they say the source is the ultimate documentation > :wink:

Yes … but only as long as documented library calls are used :slight_smile:

Armin

-----Original Message-----
From: Alexandre ABREU [mailto:> alexandre.abreu@opal-rt.com> ]
Posted At: Friday, July 27, 2001 8:20 AM
Posted To: os
Conversation: Neutrino QNX Dev Drivers equivalent.
Subject: Neutrino QNX Dev Drivers equivalent.

Hi all,

I have a very very annoying problem.
I am in charge of the development of a driver for a serial multiport
card under Neutrino. A driver for this card already
exists under QNX 4.24 and I have the source code for it.
My job is just to adapt the current source code to Neutrino.

But, and here come the problems, the QNX driver
uses the classic Dev <-> Dev Drivers communication
structure. It uses the sys/_devdrvr.h include file and
some functions like dev_drvr_register() to register the driver
and some callback functions that should be called by Dev
to add stuff in the output queues (Kick()), etc … or
like dev_drvr_mount to allocate input/output buffers …
Moreover, Dev provides a tti() function for the driver to add stuff
in the input queue etc …
I have some difficulties finding some good papers on the
way Neutrino handles this type of driver. It seems that
the equivalent of Dev interface is io-char in Neutrino but
i have not been able to find more information on how to use it and
on the equivalent of the few QNX functions above.

Is there a strict correspondancy between the io-char use
and behaviour and the Dev ones ?
Is there some equivalent functions that achieve the same
tasks as the ones above ?
Can some one provide me some good and accurate
informations/urls/docs about that problem ?

I give in attachment the classic Dev Driver document
that covers and explains all the functions that i have
cited above.

Thank you in advance for your help,


ABREU Alexandre