<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
{mso-style-priority:99;
mso-style-link:"Plain Text Char";
margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.PlainTextChar
{mso-style-name:"Plain Text Char";
mso-style-priority:99;
mso-style-link:"Plain Text";
font-family:"Calibri",sans-serif;}
p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.EmailStyle20
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:windowtext;}
span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:#1F497D;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Oleksandr Shamray <br>
<b>Sent:</b> Tuesday, May 22, 2018 4:09 PM<br>
<b>To:</b> Andy Shevchenko <andy.shevchenko@gmail.com><br>
<b>Cc:</b> Greg Kroah-Hartman <gregkh@linuxfoundation.org>; Arnd Bergmann <arnd@arndb.de>; Linux Kernel Mailing List <linux-kernel@vger.kernel.org>; linux-arm Mailing List <linux-arm-kernel@lists.infradead.org>; devicetree <devicetree@vger.kernel.org>; openbmc@lists.ozlabs.org;
Joel Stanley <joel@jms.id.au>; Jiří Pírko <jiri@resnulli.us>; Tobias Klauser <tklauser@distanz.ch>; open list:SERIAL DRIVERS <linux-serial@vger.kernel.org>; Vadim Pasternak <vadimp@mellanox.com>; system-sw-low-level <system-sw-low-level@mellanox.com>; Rob
Herring <robh+dt@kernel.org>; openocd-devel-owner@lists.sourceforge.net; linux-api@vger.kernel.org; David S. Miller <davem@davemloft.net>; Mauro Carvalho Chehab <mchehab@kernel.org>; Jiri Pirko <jiri@mellanox.com><br>
<b>Subject:</b> RE: [patch v21 1/4] drivers: jtag: Add JTAG core driver<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoPlainText">Hi Andy. <o:p></o:p></p>
<p class="MsoPlainText">Thanks for review.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Please read my answers inline.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> -----Original Message-----<o:p></o:p></p>
<p class="MsoPlainText">> From: Andy Shevchenko [<a href="mailto:andy.shevchenko@gmail.com">mailto:andy.shevchenko@gmail.com</a>]<o:p></o:p></p>
<p class="MsoPlainText">> Sent: 16 мая 2018 г. 0:22<o:p></o:p></p>
<p class="MsoPlainText">> To: Oleksandr Shamray <<a href="mailto:oleksandrs@mellanox.com">oleksandrs@mellanox.com</a>><o:p></o:p></p>
<p class="MsoPlainText">> Cc: Greg Kroah-Hartman <<a href="mailto:gregkh@linuxfoundation.org">gregkh@linuxfoundation.org</a>>; Arnd Bergmann
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:arnd@arndb.de">arnd@arndb.de</a>>; Linux Kernel Mailing List
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:linux-kernel@vger.kernel.org">linux-kernel@vger.kernel.org</a>>; linux-arm Mailing List
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:linux-arm-kernel@lists.infradead.org">linux-arm-kernel@lists.infradead.org</a>>; devicetree
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:devicetree@vger.kernel.org">devicetree@vger.kernel.org</a>>;
<a href="mailto:openbmc@lists.ozlabs.org">openbmc@lists.ozlabs.org</a>; Joel Stanley
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:joel@jms.id.au">joel@jms.id.au</a>>; Jiří Pírko <<a href="mailto:jiri@resnulli.us">jiri@resnulli.us</a>>; Tobias Klauser
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:tklauser@distanz.ch">tklauser@distanz.ch</a>>; open list:SERIAL DRIVERS <linux-
<o:p></o:p></p>
<p class="MsoPlainText">> <a href="mailto:serial@vger.kernel.org">serial@vger.kernel.org</a>>; Vadim Pasternak <<a href="mailto:vadimp@mellanox.com">vadimp@mellanox.com</a>>;
<o:p></o:p></p>
<p class="MsoPlainText">> system-sw-low-level <<a href="mailto:system-sw-low-level@mellanox.com">system-sw-low-level@mellanox.com</a>>; Rob Herring
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:robh+dt@kernel.org">robh+dt@kernel.org</a>>;
<a href="mailto:openocd-devel-owner@lists.sourceforge.net">openocd-devel-owner@lists.sourceforge.net</a>;
<o:p></o:p></p>
<p class="MsoPlainText">> linux- <a href="mailto:api@vger.kernel.org">api@vger.kernel.org</a>; David S. Miller <<a href="mailto:davem@davemloft.net">davem@davemloft.net</a>>;
<o:p></o:p></p>
<p class="MsoPlainText">> Mauro Carvalho Chehab <<a href="mailto:mchehab@kernel.org">mchehab@kernel.org</a>>; Jiri Pirko
<o:p></o:p></p>
<p class="MsoPlainText">> <<a href="mailto:jiri@mellanox.com">jiri@mellanox.com</a>><o:p></o:p></p>
<p class="MsoPlainText">> Subject: Re: [patch v21 1/4] drivers: jtag: Add JTAG core driver<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> On Tue, May 15, 2018 at 5:21 PM, Oleksandr Shamray <o:p>
</o:p></p>
<p class="MsoPlainText">> <<a href="mailto:oleksandrs@mellanox.com">oleksandrs@mellanox.com</a>> wrote:<o:p></o:p></p>
<p class="MsoPlainText">> > Initial patch for JTAG driver<o:p></o:p></p>
<p class="MsoPlainText">> > JTAG class driver provide infrastructure to support <o:p>
</o:p></p>
<p class="MsoPlainText">> > hardware/software JTAG platform drivers. It provide user layer API
<o:p></o:p></p>
<p class="MsoPlainText">> > interface for flashing and debugging external devices which equipped
<o:p></o:p></p>
<p class="MsoPlainText">> > with JTAG interface using standard transactions.<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > Driver exposes set of IOCTL to user space for:<o:p></o:p></p>
<p class="MsoPlainText">> > - XFER:<o:p></o:p></p>
<p class="MsoPlainText">> > - SIR (Scan Instruction Register, IEEE 1149.1 Data Register scan);<o:p></o:p></p>
<p class="MsoPlainText">> > - SDR (Scan Data Register, IEEE 1149.1 Instruction Register scan);<o:p></o:p></p>
<p class="MsoPlainText">> > - RUNTEST (Forces the IEEE 1149.1 bus to a run state for a specified<o:p></o:p></p>
<p class="MsoPlainText">> > number of clocks).<o:p></o:p></p>
<p class="MsoPlainText">> > - SIOCFREQ/GIOCFREQ for setting and reading JTAG frequency.<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > Driver core provides set of internal APIs for allocation and<o:p></o:p></p>
<p class="MsoPlainText">> > registration:<o:p></o:p></p>
<p class="MsoPlainText">> > - jtag_register;<o:p></o:p></p>
<p class="MsoPlainText">> > - jtag_unregister;<o:p></o:p></p>
<p class="MsoPlainText">> > - jtag_alloc;<o:p></o:p></p>
<p class="MsoPlainText">> > - jtag_free;<o:p></o:p></p>
<p class="MsoPlainText">> ><o:p></o:p></p>
<p class="MsoPlainText">> > Platform driver on registration with jtag-core creates the next
<o:p></o:p></p>
<p class="MsoPlainText">> > entry in dev folder:<o:p></o:p></p>
<p class="MsoPlainText">> > /dev/jtagX<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > 0xB0 all RATIO devices in development:<o:p></o:p></p>
<p class="MsoPlainText">> > <<a href="mailto:vgo@ratio.de">mailto:vgo@ratio.de</a>><o:p></o:p></p>
<p class="MsoPlainText">> > 0xB1 00-1F PPPoX <<a href="mailto:mostrows@styx.uwaterloo.ca">mailto:mostrows@styx.uwaterloo.ca</a>><o:p></o:p></p>
<p class="MsoPlainText">> > +0xB2 00-0f linux/jtag.h JTAG driver<o:p></o:p></p>
<p class="MsoPlainText">> > +<o:p></o:p></p>
<p class="MsoPlainText">> > +<<a href="mailto:oleksandrs@mellanox.com">mailto:oleksandrs@mellanox.com</a>><o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Consider to preserve style (upper vs. lower).<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">JTAG in code is lower (jtag) cane but in descriptions and notes it is upper (JTAG).<o:p></o:p></p>
<p class="MsoPlainText">In all places which do not correspond to this I will fix.
<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > + This provides basic core functionality support for JTAG class devices.<o:p></o:p></p>
<p class="MsoPlainText">> > + Hardware that is equipped with a JTAG microcontroller can be<o:p></o:p></p>
<p class="MsoPlainText">> > + supported by using this driver's interfaces.<o:p></o:p></p>
<p class="MsoPlainText">> > + This driver exposes a set of IOCTLs to the user space for<o:p></o:p></p>
<p class="MsoPlainText">> > + the following commands:<o:p></o:p></p>
<p class="MsoPlainText">> > + SDR: (Scan Data Register) Performs an IEEE 1149.1 Data Register scan<o:p></o:p></p>
<p class="MsoPlainText">> > + SIR: (Scan Instruction Register) Performs an IEEE 1149.1 Instruction<o:p></o:p></p>
<p class="MsoPlainText">> > + Register scan.<o:p></o:p></p>
<p class="MsoPlainText">> > + RUNTEST: Forces the IEEE 1149.1 bus to a run state for a specified<o:p></o:p></p>
<p class="MsoPlainText">> > + number of clocks or a specified time period.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Something feels wrong with formatting here.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Will fix<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> > +#define MAX_JTAG_NAME_LEN (sizeof("jtag") + 5)<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Interesting definition. Why not to set to 10 explicitly? And why 10?<o:p></o:p></p>
<p class="MsoPlainText">> (16 sounds better)<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">5 - is a max len of JTAG device id in device name. I will add define to it.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">In general I don't see the case for the system with hundreds JTAG interfaces.<o:p></o:p></p>
<p class="MsoPlainText">I will limit maximum jtag master to 255 devices and change id len to 3<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">#define MAX_JTAG_ID_STR_LEN 5<o:p></o:p></p>
<p class="MsoPlainText">#define MAX_JTAG_NAME_LEN (sizeof("jtag") + MAX_JTAG_ID_STR_LEN)<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> > +struct jtag {<o:p></o:p></p>
<p class="MsoPlainText">> > + struct miscdevice miscdev;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > + struct device *dev;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Doesn't miscdev parent contain exactly this one?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Yes. <o:p></o:p></p>
<p class="MsoPlainText">Will fix.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > + const struct jtag_ops *ops;<o:p></o:p></p>
<p class="MsoPlainText">> > + int id;<o:p></o:p></p>
<p class="MsoPlainText">> > + bool opened;<o:p></o:p></p>
<p class="MsoPlainText">> > + struct mutex open_lock;<o:p></o:p></p>
<p class="MsoPlainText">> > + unsigned long priv[0];<o:p></o:p></p>
<p class="MsoPlainText">> > +};<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > + err = copy_to_user(u64_to_user_ptr(xfer.tdio),<o:p></o:p></p>
<p class="MsoPlainText">> > + (void *)(xfer_data), data_size);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Redundant parens in one case. Check the rest similar places.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Yes.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> > +static int jtag_open(struct inode *inode, struct file *file) {<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > + struct jtag *jtag = container_of(file->private_data, struct jtag,<o:p></o:p></p>
<p class="MsoPlainText">> > + miscdev);<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> I would don't care about length and put it on one line.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">But following to LINUX kernel style, it should be no longer than 80 symbols.
<o:p></o:p></p>
<p class="MsoPlainText">It will not pass by ./scripts/checkpatch.pl<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Will it be OK to send a patch which failed 80 symbols limitation check?<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> > + if (jtag->opened) {<o:p></o:p></p>
<p class="MsoPlainText">> > + jtag->opened = true;<o:p></o:p></p>
<p class="MsoPlainText">> > + jtag->opened = false;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Can it be opened non exclusively several times? If so, this needs to
<o:p></o:p></p>
<p class="MsoPlainText">> be a ref counter instead.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">It can be opened only once.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > + if (!ops->idle || !ops->mode_set || !ops->status_get || !ops->xfer)<o:p></o:p></p>
<p class="MsoPlainText">> > + return NULL;<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Are all of them mandatory?<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Yes, except "mode_set"<o:p></o:p></p>
<p class="MsoPlainText">Will remove mode_set from check<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> > +int jtag_register(struct jtag *jtag)<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Perhaps devm_ variant.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Jtag driver uses miscdevice and related misc_register and misc_deregister calls for creation and destruction. There is no device object prior to call to misc_register, which could be used in devm_jtag_register.<o:p></o:p></p>
<p class="MsoPlainText"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:#1F497D">Vadim: Keep size of line limited by 80 or 75 symbols<o:p></o:p></span></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > +#define jtag_u64_to_ptr(arg) ((void *)(uintptr_t)arg)<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Redundant. Removed.<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> Where is this used or supposed to be used?<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> > +#define JTAG_MAX_XFER_DATA_LEN 65535<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Is this limitation from some spec?<o:p></o:p></p>
<p class="MsoPlainText">> Otherwise why not to allow 64K?<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">It not limited by specification. <o:p></o:p></p>
<p class="MsoPlainText">But we enforce an upper bound for the length here, to prevent users from draining kernel memory with giant buffers.<o:p></o:p></p>
<p class="MsoPlainText"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span style="color:#1F497D">Vadim: your explanation is not relevant. You have there 64*1024 = 65535.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:#1F497D"> means 64K (maybe Andy considers 64K as 64*1000. But you can just<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:#1F497D"> wrote him that this is 64*1024.<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:#1F497D">Vadim: Keep size of line limited by 80 or 75 symbols<o:p></o:p></span></p>
<p class="MsoPlainText"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> > +/**<o:p></o:p></p>
<p class="MsoPlainText">> > + * struct jtag_ops - callbacks for jtag control functions:<o:p></o:p></p>
<p class="MsoPlainText">> > + *<o:p></o:p></p>
<p class="MsoPlainText">> > + * @freq_get: get frequency function. Filled by device driver<o:p></o:p></p>
<p class="MsoPlainText">> > + * @freq_set: set frequency function. Filled by device driver<o:p></o:p></p>
<p class="MsoPlainText">> > + * @status_get: set status function. Filled by device driver<o:p></o:p></p>
<p class="MsoPlainText">> > + * @idle: set JTAG to idle state function. Filled by device driver<o:p></o:p></p>
<p class="MsoPlainText">> > + * @xfer: send JTAG xfer function. Filled by device driver */<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText">> Perhaps you need to describe which of them are _really_ mandatory and
<o:p></o:p></p>
<p class="MsoPlainText">> which are optional.<o:p></o:p></p>
<p class="MsoPlainText">> <o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">Ok<o:p></o:p></p>
<p class="MsoPlainText"><o:p> </o:p></p>
<p class="MsoPlainText">> --<o:p></o:p></p>
<p class="MsoPlainText">> With Best Regards,<o:p></o:p></p>
<p class="MsoPlainText">> Andy Shevchenko<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoPlainText">Best Regards,<o:p></o:p></p>
<p class="MsoPlainText">Oleksandr Shamray<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>