<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML xmlns="http://www.w3.org/TR/REC-html40" xmlns:v = 
"urn:schemas-microsoft-com:vml" xmlns:o = 
"urn:schemas-microsoft-com:office:office" xmlns:w = 
"urn:schemas-microsoft-com:office:word" xmlns:x = 
"urn:schemas-microsoft-com:office:excel" xmlns:p = 
"urn:schemas-microsoft-com:office:powerpoint" xmlns:a = 
"urn:schemas-microsoft-com:office:access" xmlns:dt = 
"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s = 
"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs = 
"urn:schemas-microsoft-com:rowset" xmlns:z = "#RowsetSchema" xmlns:b = 
"urn:schemas-microsoft-com:office:publisher" xmlns:ss = 
"urn:schemas-microsoft-com:office:spreadsheet" xmlns:c = 
"urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc = 
"urn:schemas-microsoft-com:office:odc" xmlns:oa = 
"urn:schemas-microsoft-com:office:activation" xmlns:html = 
"http://www.w3.org/TR/REC-html40" xmlns:q = 
"http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc = 
"http://microsoft.com/officenet/conferencing" XMLNS:D = "DAV:" XMLNS:Repl = 
"http://schemas.microsoft.com/repl/" xmlns:mt = 
"http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2 = 
"http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda = 
"http://www.passport.com/NameSpace.xsd" xmlns:ois = 
"http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir = 
"http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds = 
"http://www.w3.org/2000/09/xmldsig#" xmlns:dsp = 
"http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc = 
"http://schemas.microsoft.com/data/udc" xmlns:xsd = 
"http://www.w3.org/2001/XMLSchema" xmlns:sub = 
"http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec = 
"http://www.w3.org/2001/04/xmlenc#" xmlns:sp = 
"http://schemas.microsoft.com/sharepoint/" xmlns:sps = 
"http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi = 
"http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs = 
"http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf = 
"http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p = 
"http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf = 
"http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss = 
"http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi = 
"http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi = 
"http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver = 
"http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m = 
"http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels = 
"http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp = 
"http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t = 
"http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m = 
"http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl = 
"http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl = 
"http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" 
XMLNS:Z = "urn:schemas-microsoft-com:" xmlns:st = ""><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18928"><!--[if !mso]>
<STYLE>v\:* {
        BEHAVIOR: url(#default#VML)
}
o\:* {
        BEHAVIOR: url(#default#VML)
}
w\:* {
        BEHAVIOR: url(#default#VML)
}
.shape {
        BEHAVIOR: url(#default#VML)
}
</STYLE>
<![endif]-->
<STYLE>@font-face {
        font-family: Helvetica;
}
@font-face {
        font-family: Courier;
}
@font-face {
        font-family: Tms Rmn;
}
@font-face {
        font-family: Helv;
}
@font-face {
        font-family: New York;
}
@font-face {
        font-family: System;
}
@font-face {
        font-family: Wingdings;
}
@font-face {
        font-family: MS Mincho;
}
@font-face {
        font-family: Batang;
}
@font-face {
        font-family: SimSun;
}
@font-face {
        font-family: PMingLiU;
}
@font-face {
        font-family: MS Gothic;
}
@font-face {
        font-family: Dotum;
}
@font-face {
        font-family: SimHei;
}
@font-face {
        font-family: MingLiU;
}
@font-face {
        font-family: Mincho;
}
@font-face {
        font-family: Gulim;
}
@font-face {
        font-family: Century;
}
@font-face {
        font-family: Angsana New;
}
@font-face {
        font-family: Cordia New;
}
@font-face {
        font-family: Mangal;
}
@font-face {
        font-family: Latha;
}
@font-face {
        font-family: Sylfaen;
}
@font-face {
        font-family: Vrinda;
}
@font-face {
        font-family: Raavi;
}
@font-face {
        font-family: Shruti;
}
@font-face {
        font-family: Sendnya;
}
@font-face {
        font-family: Gautami;
}
@font-face {
        font-family: Tunga;
}
@font-face {
        font-family: Estrangelo Edessa;
}
@font-face {
        font-family: Cambria Math;
}
@font-face {
        font-family: Arial Unicode MS;
}
@font-face {
        font-family: Cambria;
}
@font-face {
        font-family: Calibri;
}
@font-face {
        font-family: Tahoma;
}
@font-face {
        font-family: Consolas;
}
@font-face {
        font-family: Times New Roman CE;
}
@font-face {
        font-family: Times New Roman CYR;
}
@font-face {
        font-family: Times New Roman Greek;
}
@font-face {
        font-family: Times New Roman TUR;
}
@font-face {
        font-family: Times New Roman (Hebrew);
}
@font-face {
        font-family: Times New Roman Baltic;
}
@font-face {
        font-family: Arial CE;
}
@font-face {
        font-family: Arial CYR;
}
@font-face {
        font-family: Arial Greek;
}
@font-face {
        font-family: Arial TUR;
}
@font-face {
        font-family: Arial (Hebrew);
}
@font-face {
        font-family: Arial Baltic;
}
@font-face {
        font-family: Bookman Old Style;
}
@font-face {
        font-family: Comic Sans MS;
}
@font-face {
        font-family: Monotype Corsiva;
}
@font-face {
        font-family: Huxtable;
}
@font-face {
        font-family: Mufferaw;
}
@font-face {
        font-family: Planet Benson 2;
}
@font-face {
        font-family: Marlett;
}
@font-face {
        font-family: BatangChe;
}
@font-face {
        font-family: Gungsuh;
}
@font-face {
        font-family: GungsuhChe;
}
@font-face {
        font-family: DaunPenh;
}
@font-face {
        font-family: DokChampa;
}
@font-face {
        font-family: Euphemia;
}
@font-face {
        font-family: Vani;
}
@font-face {
        font-family: GulimChe;
}
@font-face {
        font-family: DotumChe;
}
@font-face {
        font-family: Impact;
}
@font-face {
        font-family: Iskoola Pota;
}
@font-face {
        font-family: Kalinga;
}
@font-face {
        font-family: Kartika;
}
@font-face {
        font-family: Khmer UI;
}
@font-face {
        font-family: Lao UI;
}
@font-face {
        font-family: Lucida Console;
}
@font-face {
        font-family: Malgun Gothic;
}
@font-face {
        font-family: Meiryo;
}
@font-face {
        font-family: Meiryo UI;
}
@font-face {
        font-family: Microsoft Himalaya;
}
@font-face {
        font-family: Microsoft JhengHei;
}
@font-face {
        font-family: Microsoft YaHei;
}
@font-face {
        font-family: MingLiU_HKSCS;
}
@font-face {
        font-family: MingLiU-ExtB;
}
@font-face {
        font-family: PMingLiU-ExtB;
}
@font-face {
        font-family: MingLiU_HKSCS-ExtB;
}
@font-face {
        font-family: Mongolian Baiti;
}
@font-face {
        font-family: MS PGothic;
}
@font-face {
        font-family: MS UI Gothic;
}
@font-face {
        font-family: MS PMincho;
}
@font-face {
        font-family: MV Boli;
}
@font-face {
        font-family: Microsoft New Tai Lue;
}
@font-face {
        font-family: Nyala;
}
@font-face {
        font-family: Microsoft PhagsPa;
}
@font-face {
        font-family: Plantagenet Cherokee;
}
@font-face {
        font-family: Segoe Script;
}
@font-face {
        font-family: Segoe UI;
}
@font-face {
        font-family: Segoe UI Semibold;
}
@font-face {
        font-family: Segoe UI Light;
}
@font-face {
        font-family: Segoe UI Symbol;
}
@font-face {
        font-family: NSimSun;
}
@font-face {
        font-family: SimSun-ExtB;
}
@font-face {
        font-family: Microsoft Tai Le;
}
@font-face {
        font-family: Shonar Bangla;
}
@font-face {
        font-family: Microsoft Yi Baiti;
}
@font-face {
        font-family: Microsoft Sans Serif;
}
@font-face {
        font-family: Aparajita;
}
@font-face {
        font-family: Ebrima;
}
@font-face {
        font-family: Gisha;
}
@font-face {
        font-family: Kokila;
}
@font-face {
        font-family: Leelawadee;
}
@font-face {
        font-family: Microsoft Uighur;
}
@font-face {
        font-family: MoolBoran;
}
@font-face {
        font-family: Utsaah;
}
@font-face {
        font-family: Vijaya;
}
@font-face {
        font-family: Andalus;
}
@font-face {
        font-family: Arabic Typesetting;
}
@font-face {
        font-family: Simplified Arabic;
}
@font-face {
        font-family: Simplified Arabic Fixed;
}
@font-face {
        font-family: Sakkal Majalla;
}
@font-face {
        font-family: Traditional Arabic;
}
@font-face {
        font-family: Aharoni;
}
@font-face {
        font-family: David;
}
@font-face {
        font-family: FrankRuehl;
}
@font-face {
        font-family: Levenim MT;
}
@font-face {
        font-family: Miriam;
}
@font-face {
        font-family: Miriam Fixed;
}
@font-face {
        font-family: Narkisim;
}
@font-face {
        font-family: Rod;
}
@font-face {
        font-family: FangSong;
}
@font-face {
        font-family: KaiTi;
}
@font-face {
        font-family: AngsanaUPC;
}
@font-face {
        font-family: Browallia New;
}
@font-face {
        font-family: BrowalliaUPC;
}
@font-face {
        font-family: CordiaUPC;
}
@font-face {
        font-family: DilleniaUPC;
}
@font-face {
        font-family: EucrosiaUPC;
}
@font-face {
        font-family: FreesiaUPC;
}
@font-face {
        font-family: IrisUPC;
}
@font-face {
        font-family: JasmineUPC;
}
@font-face {
        font-family: KodchiangUPC;
}
@font-face {
        font-family: LilyUPC;
}
@font-face {
        font-family: DFKai-SB;
}
@font-face {
        font-family: Lucida Sans Unicode;
}
@font-face {
        font-family: Arial Black;
}
@font-face {
        font-family: Candara;
}
@font-face {
        font-family: Constantia;
}
@font-face {
        font-family: Corbel;
}
@font-face {
        font-family: Franklin Gothic Medium;
}
@font-face {
        font-family: Gabriola;
}
@font-face {
        font-family: Georgia;
}
@font-face {
        font-family: Palatino Linotype;
}
@font-face {
        font-family: Segoe Print;
}
@font-face {
        font-family: Trebuchet MS;
}
@font-face {
        font-family: Verdana;
}
@font-face {
        font-family: Webdings;
}
@font-face {
        font-family: MT Extra;
}
@font-face {
        font-family: Bookshelf Symbol 7;
}
@font-face {
        font-family: MS Reference Sans Serif;
}
@font-face {
        font-family: MS Reference Specialty;
}
@font-face {
        font-family: MS Outlook;
}
@font-face {
        font-family: Book Antiqua;
}
@font-face {
        font-family: Garamond;
}
@font-face {
        font-family: Century Gothic;
}
@font-face {
        font-family: Wingdings 2;
}
@font-face {
        font-family: Wingdings 3;
}
@font-face {
        font-family: Arial Narrow;
}
@font-face {
        font-family: Amienne;
}
@font-face {
        font-family: Arnprior;
}
@font-face {
        font-family: Baveuse;
}
@font-face {
        font-family: Berylium;
}
@font-face {
        font-family: Blue Highway;
}
@font-face {
        font-family: Blue Highway Condensed;
}
@font-face {
        font-family: Blue Highway D Type;
}
@font-face {
        font-family: Blue Highway Linocut;
}
@font-face {
        font-family: Burnstown Dam;
}
@font-face {
        font-family: Carbon Block;
}
@font-face {
        font-family: Credit Valley;
}
@font-face {
        font-family: Earwig Factory;
}
@font-face {
        font-family: Hurry Up;
}
@font-face {
        font-family: Heavy Heap;
}
@font-face {
        font-family: Kredit;
}
@font-face {
        font-family: Minya Nouvelle;
}
@font-face {
        font-family: Neuropol;
}
@font-face {
        font-family: Pupcat;
}
@font-face {
        font-family: Stereofidelic;
}
@font-face {
        font-family: Sybil Green;
}
@font-face {
        font-family: Teen;
}
@font-face {
        font-family: Teen Light;
}
@font-face {
        font-family: Velvenda Cooler;
}
@font-face {
        font-family: Biondi;
}
@font-face {
        font-family: Boopee;
}
@font-face {
        font-family: Byington;
}
@font-face {
        font-family: Catriel;
}
@font-face {
        font-family: Euphorigenic S;
}
@font-face {
        font-family: Ligurino;
}
@font-face {
        font-family: Ligurino Condensed;
}
@font-face {
        font-family: Tandelle;
}
@font-face {
        font-family: Waker;
}
@font-face {
        font-family: Times;
}
@font-face {
        font-family: Guttman Stam;
}
@font-face {
        font-family: ms sans serif;
}
@font-face {
        font-family: SimSun;
}
@font-face {
        font-family: SimSun;
}
@font-face {
        font-family: @SimSun;
}
@font-face {
        font-family: @MS Mincho;
}
@font-face {
        font-family: Lucida Sans;
}
@font-face {
        font-family: MS Mincho;
}
@font-face {
        font-family: メイリオ;
}
@font-face {
        font-family: @メイリオ;
}
@font-face {
        font-family: MS Mincho;
}
@font-face {
        font-family: MS Shell Dlg 2;
}
@font-face {
        font-family: @Meiryo;
}
@font-face {
        font-family: @MS Gothic;
}
@font-face {
        font-family: Script MT Bold;
}
@font-face {
        font-family: Lucida Calligraphy;
}
@font-face {
        font-family: Times New
Roman;
}
@font-face {
        font-family: Times New
Roman;
}
@font-face {
        font-family: Times New Roman;
}
@font-face {
        font-family: @Batang;
}
@font-face {
        font-family: @BatangChe;
}
@font-face {
        font-family: @Gungsuh;
}
@font-face {
        font-family: @GungsuhChe;
}
@font-face {
        font-family: @Gulim;
}
@font-face {
        font-family: @GulimChe;
}
@font-face {
        font-family: @Dotum;
}
@font-face {
        font-family: @DotumChe;
}
@font-face {
        font-family: @Malgun Gothic;
}
@font-face {
        font-family: @Meiryo UI;
}
@font-face {
        font-family: @Microsoft JhengHei;
}
@font-face {
        font-family: @Microsoft YaHei;
}
@font-face {
        font-family: @MingLiU;
}
@font-face {
        font-family: @PMingLiU;
}
@font-face {
        font-family: @MingLiU_HKSCS;
}
@font-face {
        font-family: @MingLiU-ExtB;
}
@font-face {
        font-family: @PMingLiU-ExtB;
}
@font-face {
        font-family: @MingLiU_HKSCS-ExtB;
}
@font-face {
        font-family: @MS PGothic;
}
@font-face {
        font-family: @MS UI Gothic;
}
@font-face {
        font-family: @MS PMincho;
}
@font-face {
        font-family: @NSimSun;
}
@font-face {
        font-family: @SimSun-ExtB;
}
@font-face {
        font-family: @FangSong;
}
@font-face {
        font-family: @SimHei;
}
@font-face {
        font-family: @KaiTi;
}
@font-face {
        font-family: @DFKai-SB;
}
@font-face {
        font-family: @Arial Unicode MS;
}
@font-face {
        font-family: Guttman Yad-Brush;
}
@font-face {
        font-family: 新
}
@page WordSection1 {size: 8.5in 11.0in; margin: 1.0in 1.25in 1.0in 1.25in; }
P.MsoNormal {
        MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
LI.MsoNormal {
        MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
DIV.MsoNormal {
        MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
A:link {
        COLOR: blue; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.MsoHyperlink {
        COLOR: blue; TEXT-DECORATION: underline; mso-style-priority: 99
}
A:visited {
        COLOR: purple; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.MsoHyperlinkFollowed {
        COLOR: purple; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.EmailStyle17 {
        FONT-FAMILY: "Calibri","sans-serif"; COLOR: windowtext; mso-style-type: personal
}
SPAN.EmailStyle18 {
        FONT-FAMILY: "Calibri","sans-serif"; COLOR: #1f497d; mso-style-type: personal
}
SPAN.EmailStyle19 {
        FONT-FAMILY: "Calibri","sans-serif"; COLOR: #1f497d; mso-style-type: personal
}
SPAN.EmailStyle20 {
        FONT-FAMILY: "Calibri","sans-serif"; COLOR: #1f497d; mso-style-type: personal-reply
}
SPAN.msoIns {
        COLOR: teal; TEXT-DECORATION: underline; mso-style-type: export-only; mso-style-name: ""
}
SPAN.msoDel {
        COLOR: red; TEXT-DECORATION: line-through; mso-style-type: export-only; mso-style-name: ""
}
.MsoChpDefault {
        FONT-SIZE: 10pt; mso-style-type: export-only
}
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=blue vLink=purple>
<DIV dir=ltr align=left>
<HR tabIndex=-1>
<FONT size=2 face=Tahoma><B>From:</B> Uri Habusha [mailto:urih@mellanox.co.il] 
<BR><B>Sent:</B> Monday, August 30, 2010 5:33 AM<BR><B>To:</B> Smith, Stan; 
Tzachi Dar<BR><B>Cc:</B> ofw@lists.openfabrics.org<BR><B>Subject:</B> RE: [ofw] 
FW: fixing a system clock assert that is raised when the receive function stays 
in DPC too much time<BR></FONT><BR></DIV>
<DIV></DIV>
<DIV class=WordSection1>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Thanks for  your 
inputs.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">I checked in the patch with 
minor changes. Svn # 2878<SPAN class=245412216-30082010><FONT color=#0000ff 
size=2 face=Arial> </FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Hello 
Uri,</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>When committing 
patches, it's best to stay with the existing coding style (regardless if you 
like the style or not).</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Consistent 
look-and-feel of the code is the desired end goal.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>That said, the 
ipoib_ndis6_cm code base, '{' curly braces are on a separate 
lines.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Personally I'm 
not a huge fan of this style, nonetheless the bulk of the IPoIB_NDIS6_CM code is 
written in this style; please observe and adhere to existing 
conventions.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Along the lines 
of consistency</FONT></SPAN></SPAN></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial>__iopoib_WorkItem  what does 'iopoib' stand for? Did 
you intend to prefix the WorkItem name with __ipoib_ ?</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial>stan.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN 
class=245412216-30082010><FONT color=#0000ff size=2 
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<DIV>
<DIV 
style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<P class=MsoNormal><B><SPAN 
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">From:</SPAN></B><SPAN 
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt"> 
ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org] 
<B>On Behalf Of </B>Smith, Stan<BR><B>Sent:</B> Friday, August 27, 2010 3:51 
AM<BR><B>To:</B> Tzachi Dar; Uri Habusha<BR><B>Cc:</B> 
ofw@lists.openfabrics.org<BR><B>Subject:</B> Re: [ofw] FW: fixing a system clock 
assert that is raised when the receive function stays in DPC too much 
time<o:p></o:p></SPAN></P></DIV></DIV>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">ulp\ipoib 
patches applied OK via patch.</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">ulp\ipoib_ndis6_cm 
patches did not apply, major problems.</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">After 
spending a few hours separating out white-space replacement for <tabs> 
(should have been a separate patch) I believe the code may work; testing in the 
AM.</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">Fixed a 
reference counting problem in recv_cb_internal() where WorkItem is fired 
off.</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">Please 
review enclosed patches without <tab> --> spaces changes.</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">stan.</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p> </o:p></SPAN></P>
<DIV style="TEXT-ALIGN: center" class=MsoNormal align=center><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt">
<HR align=center SIZE=2 width="100%">
</SPAN></DIV>
<P style="MARGIN-BOTTOM: 12pt" class=MsoNormal><B><SPAN 
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">From:</SPAN></B><SPAN 
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt"> Tzachi Dar 
[mailto:tzachid@mellanox.co.il] <BR><B>Sent:</B> Wednesday, August 25, 2010 1:47 
PM<BR><B>To:</B> Fab Tillier; Smith, Stan; Uri Habusha<BR><B>Cc:</B> 
ofw@lists.openfabrics.org<BR><B>Subject:</B> RE: [ofw] FW: fixing a system clock 
assert that is raised when the receive function stays in DPC too much 
time</SPAN><SPAN 
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">This was what the code was doing 
before the last change. Still this assert has poped up.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Please note that scheduling a 
dpc lets other dpc run, but it does not let any other thread 
run.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">If a thread was running and than 
a dpc was schdualed that that thread stops running until the DPC will end. 
Please note that this DPC might never end, since new packets will keep arriving. 
This gives the user bad experience.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">With the new code the irql goes 
up and down and thus the thread can move to another 
processor.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Thanks<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Tzachi<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<DIV 
style="BORDER-BOTTOM: medium none; BORDER-LEFT: blue 1.5pt solid; PADDING-BOTTOM: 0in; PADDING-LEFT: 4pt; PADDING-RIGHT: 0in; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in">
<DIV>
<DIV 
style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<P class=MsoNormal><B><SPAN 
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">From:</SPAN></B><SPAN 
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt"> 
ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org] 
<B>On Behalf Of </B>Fab Tillier<BR><B>Sent:</B> Wednesday, August 25, 2010 7:29 
PM<BR><B>To:</B> Smith, Stan; Uri Habusha<BR><B>Cc:</B> 
ofw@lists.openfabrics.org<BR><B>Subject:</B> Re: [ofw] FW: fixing a system clock 
assert that is raised when the receive function stays in DPC too much 
time<o:p></o:p></SPAN></P></DIV></DIV>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Don’t use a work item.  
Just create a DPC object, and queue it yourself after processing a certain 
number of completions.  Look at the SMI code – it does exactly 
this.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">-Fab<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<DIV>
<DIV 
style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<P class=MsoNormal><B>From:</B> ofw-bounces@lists.openfabrics.org 
[mailto:ofw-bounces@lists.openfabrics.org] <B>On Behalf Of </B>Smith, 
Stan<BR><B>Sent:</B> Wednesday, August 25, 2010 8:54 AM<BR><B>To:</B> 
urih@mellanox.co.il<BR><B>Cc:</B> ofw@lists.openfabrics.org<BR><B>Subject:</B> 
[ofw] FW: fixing a system clock assert that is raised when the receive function 
stays in DPC too much time<o:p></o:p></P></DIV></DIV>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Resend as original email bounced.<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>stan. <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<DIV style="TEXT-ALIGN: center" class=MsoNormal align=center>
<HR align=center SIZE=2 width="100%">
</DIV>
<P style="MARGIN-BOTTOM: 12pt" class=MsoNormal><B>From:</B> Uri Habusha 
[mailto:urih@mellanox.co.il] <BR><B>Sent:</B> Wednesday, August 25, 2010 8:12 
AM<BR><B>To:</B> ofw@lists.openfabrics.org<BR><B>Subject:</B> fixing a system 
clock assert that is raised when the receive function stays in DPC too much 
time<o:p></o:p></P>
<P class=MsoNormal>The purpose of this check in is to fix a system clock assert 
that is raised when the function stays in DPC too much time.<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>When processing of receive packet in DPC take too much time 
the OS throw an assert warning that too much time is spent in DPC and it may 
affect the system.<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>The fix move the receive processing to a workitem. so the 
IPOIB give-up after some time and return to process receive packet in workitem. 
that allows other DPCs and workitems too run in parallel. <o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Uri<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.c<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib/kernel/ipoib_adapter.c       (revision 
6314)<o:p></o:p></P>
<P class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.c    
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -224,6 +224,9 @@<o:p></o:p></P>
<P 
class=MsoNormal>                                
}<o:p></o:p></P>
<P 
class=MsoNormal>                
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    NdisMGetDeviceProperty(h_adapter, 
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(p_adapter->pdo != 
NULL);<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P 
class=MsoNormal>                
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></P>
<P 
class=MsoNormal>                
if ( p_adapter->p_stat ) <o:p></o:p></P>
<P 
class=MsoNormal>                                
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.h<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib/kernel/ipoib_adapter.h      (revision 
6314)<o:p></o:p></P>
<P class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.h   (working 
copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -150,6 +150,7 @@<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>                
cl_obj_t                                                               
obj;<o:p></o:p></P>
<P 
class=MsoNormal>                
NDIS_HANDLE                                                   
h_adapter;<o:p></o:p></P>
<P class=MsoNormal>+    
PDEVICE_OBJECT          
pdo;<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_ifc_data_t                               
guids;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_list_item_t                                    
entry;<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.c<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib/kernel/ipoib_port.c              
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++ 
ulp/ipoib/kernel/ipoib_port.c           
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -605,6 +605,8 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
__endpt_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>+             
p_port->pPoWorkItem = NULL;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P 
class=MsoNormal>                
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE 
);<o:p></o:p></P>
<P 
class=MsoNormal>                
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE 
);<o:p></o:p></P>
<P 
class=MsoNormal>                
<o:p></o:p></P>
<P class=MsoNormal>@@ -626,6 +628,12 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></P>
<P 
class=MsoNormal>                
p_port->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    p_port->pPoWorkItem = 
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></P>
<P 
class=MsoNormal>+             
if( p_port->pPoWorkItem == NULL ) {<o:p></o:p></P>
<P 
class=MsoNormal>+                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("IoAllocateWorkItem 
returned NULL\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                             
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>+             
}<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>                
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>                
{<o:p></o:p></P>
<P class=MsoNormal>@@ -682,9 +690,6 @@<o:p></o:p></P>
<P 
class=MsoNormal>                                
return status;<o:p></o:p></P>
<P 
class=MsoNormal>                
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P 
class=MsoNormal>                
 /* Initialize multicast garbage collector timer and DPC object 
*/<o:p></o:p></P>
<P 
class=MsoNormal>                
 KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></P>
<P 
class=MsoNormal>                
 KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></P>
<P class=MsoNormal>@@ -795,6 +800,7 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_obj_deinit( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    IoFreeWorkItem( p_port->pPoWorkItem 
);<o:p></o:p></P>
<P 
class=MsoNormal>                
cl_free( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>@@ -1628,10 +1634,43 @@<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P 
class=MsoNormal>+             
IN                           
const     
ib_cq_handle_t                                                                
h_cq,<o:p></o:p></P>
<P 
class=MsoNormal>+             
IN                                                           
void                                                                                       
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
uint32_t*                    
p_recv_cnt );<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal>-__recv_cb(<o:p></o:p></P>
<P class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></P>
<P 
class=MsoNormal>+             
IN                                                           
DEVICE_OBJECT*                                                             
p_dev_obj,<o:p></o:p></P>
<P 
class=MsoNormal>+             
IN                                                           
void*                                                                                     
context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P 
class=MsoNormal>+             
ipoib_port_t *p_port = ( ipoib_port_t* ) context;<o:p></o:p></P>
<P class=MsoNormal>+    int WorkToDo = true;<o:p></o:p></P>
<P class=MsoNormal>+    KIRQL irql;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t recv_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t total_recv_cnt = 
0;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P 
class=MsoNormal>+             
UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    while (WorkToDo && total_recv_cnt 
< 512) {<o:p></o:p></P>
<P class=MsoNormal>+        irql = 
KeRaiseIrqlToDpcLevel();<o:p></o:p></P>
<P class=MsoNormal>+        WorkToDo = 
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></P>
<P class=MsoNormal>+        
KeLowerIrql(irql);<o:p></o:p></P>
<P class=MsoNormal>+        total_recv_cnt += 
recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+    if (WorkToDo) {<o:p></o:p></P>
<P class=MsoNormal>+        IoQueueWorkItem( 
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, 
p_port);<o:p></o:p></P>
<P class=MsoNormal>+    
}        <o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P 
class=MsoNormal>                
IN                           
const     
ib_cq_handle_t                                                                
h_cq,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*cq_context )<o:p></o:p></P>
<P 
class=MsoNormal>+             
IN                                                           
void                                                                                       
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
uint32_t*                    
p_recv_cnt)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>                
ib_api_status_t                                
status;<o:p></o:p></P>
<P class=MsoNormal>@@ -1639,6 +1678,8 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
int32_t                                                  
pkt_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></P>
<P 
class=MsoNormal>                
cl_qlist_t                                              
done_list, bad_list;<o:p></o:p></P>
<P 
class=MsoNormal>                
size_t                                                    
i;<o:p></o:p></P>
<P class=MsoNormal>+    BOOLEAN WorkToDo =  
FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P 
class=MsoNormal>                
PERF_DECLARE( RecvCompBundle );<o:p></o:p></P>
<P 
class=MsoNormal>                
PERF_DECLARE( RecvCb );<o:p></o:p></P>
<P 
class=MsoNormal>                
PERF_DECLARE( PollRecv );<o:p></o:p></P>
<P class=MsoNormal>@@ -1655,8 +1696,6 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_perf_start( RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P 
class=MsoNormal>                
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_qlist_init( &done_list );<o:p></o:p></P>
<P class=MsoNormal>@@ -1785,13 +1824,30 @@<o:p></o:p></P>
<P 
class=MsoNormal>                                
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></P>
<P 
class=MsoNormal>                
} else {<o:p></o:p></P>
<P 
class=MsoNormal>                                
// Please note the reference is still up<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></P>
<P class=MsoNormal>+        if (h_cq) 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, 
p_port);<o:p></o:p></P>
<P 
class=MsoNormal>+            
WorkToDo = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
WorkToDo = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P 
class=MsoNormal>                
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    return WorkToDo;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+static void<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb(<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    __recv_cb_internal(h_cq, cq_context, 
&recv_cnt);<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.h<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib/kernel/ipoib_port.h             
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++ 
ulp/ipoib/kernel/ipoib_port.h          
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -502,8 +502,6 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_recv_mgr_t                            
recv_mgr;<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_send_mgr_t                          
send_mgr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KDPC                                                                     
recv_dpc;<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_endpt_mgr_t                        
endpt_mgr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_endpt_t                                   
*p_local_endpt;<o:p></o:p></P>
<P class=MsoNormal>@@ -520,6 +518,7 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
KTIMER                                                                                
gc_timer;<o:p></o:p></P>
<P 
class=MsoNormal>                
uint32_t                                                               
bc_join_retry_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>                
ib_net16_t                                                          
base_lid;<o:p></o:p></P>
<P 
class=MsoNormal>+             
PIO_WORKITEM                                               
pPoWorkItem;<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_hdr_t                                                        
hdr[1];  /* Must be last! */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> }             
ipoib_port_t;<o:p></o:p></P>
<P class=MsoNormal>Index: 
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp         
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++ 
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp      
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -216,6 +216,9 @@<o:p></o:p></P>
<P 
class=MsoNormal>                                
}<o:p></o:p></P>
<P 
class=MsoNormal>                
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    NdisMGetDeviceProperty(h_adapter, 
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(p_adapter->pdo != 
NULL);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P 
class=MsoNormal>                
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></P>
<P 
class=MsoNormal>                
if ( p_adapter->p_stat ) <o:p></o:p></P>
<P 
class=MsoNormal>                                
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal>Index: 
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h             
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++ 
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h          
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -185,6 +185,7 @@<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>                
cl_obj_t                                                               
obj;<o:p></o:p></P>
<P 
class=MsoNormal>                
NDIS_HANDLE                                                   
h_adapter;<o:p></o:p></P>
<P class=MsoNormal>+    
PDEVICE_OBJECT          
pdo;<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_ifc_data_t                               
guids;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
cl_list_item_t                                    
entry;<o:p></o:p></P>
<P class=MsoNormal>Index: 
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp             
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++ 
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp          
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -3126,7 +3126,7 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
if( p_adapter->state != IB_PNP_PORT_ACTIVE || !p_adapter->p_port 
)<o:p></o:p></P>
<P 
class=MsoNormal>                
{<o:p></o:p></P>
<P 
class=MsoNormal>                                
cl_obj_unlock( &p_adapter->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>                                                                
("Got send during port non-active, complete with error \n") );<o:p></o:p></P>
<P 
class=MsoNormal>                                
status = NDIS_STATUS_FAILURE; <o:p></o:p></P>
<P 
class=MsoNormal>                                
goto compl_status;<o:p></o:p></P>
<P class=MsoNormal>@@ -3172,7 +3172,7 @@<o:p></o:p></P>
<P class=MsoNormal>     if (status != 
NDIS_STATUS_SUCCESS)<o:p></o:p></P>
<P 
class=MsoNormal>                
{<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>                                                                
("Got bad status, g_NBL=%d, g_NBL_completed=%d \n", g_NBL, g_NBL_complete) 
);<o:p></o:p></P>
<P 
class=MsoNormal>                                
send_complete_flags = 0;<o:p></o:p></P>
<P 
class=MsoNormal>                
    <o:p></o:p></P>
<P class=MsoNormal>Index: 
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp                
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++ 
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp             
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -58,50 +58,48 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-ib_gid_t              
bcast_mgid_template = {<o:p></o:p></P>
<P 
class=MsoNormal>-              
0xff,                                                                                                                       
/* multicast field */<o:p></o:p></P>
<P 
class=MsoNormal>-              
0x12,                                                                                                                     
/* scope (to be filled in) */<o:p></o:p></P>
<P 
class=MsoNormal>-              
0x40, 
0x1b,                                                                                                         
/* IPv4 signature */<o:p></o:p></P>
<P 
class=MsoNormal>-              
0xff, 
0xff,                                                                                                            
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></P>
<P 
class=MsoNormal>-              
0x00, 0x00, 0x00, 0x00, 0x00, 
0x00,           /* 48 bits of 
zeros */<o:p></o:p></P>
<P 
class=MsoNormal>-              
0xff, 0xff, 0xff, 
0xff,                                                        
/* 32 bit IPv4 broadcast address */<o:p></o:p></P>
<P class=MsoNormal>+ib_gid_t    bcast_mgid_template = 
{<o:p></o:p></P>
<P class=MsoNormal>+    
0xff,                               
/* multicast field */<o:p></o:p></P>
<P class=MsoNormal>+    
0x12,                               
/* scope (to be filled in) */<o:p></o:p></P>
<P class=MsoNormal>+    0x40, 
0x1b,               
          /* IPv4 signature 
*/<o:p></o:p></P>
<P class=MsoNormal>+    0xff, 
0xff,                         
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></P>
<P class=MsoNormal>+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48 
bits of zeros */<o:p></o:p></P>
<P class=MsoNormal>+    0xff, 0xff, 0xff, 
0xff,             /* 
32 bit IPv4 broadcast address */<o:p></o:p></P>
<P class=MsoNormal> };<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></P>
<P class=MsoNormal> /* Handy pointer for debug use. */<o:p></o:p></P>
<P class=MsoNormal>-ipoib_port_t     
*gp_ipoib_port;<o:p></o:p></P>
<P class=MsoNormal>+ipoib_port_t    
*gp_ipoib_port;<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC 
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2);<o:p></o:p></P>
<P class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t* 
const       p_port );<o:p></o:p></P>
<P class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const 
p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void 
*s_arg1, void *s_arg2);<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> #ifndef _IPOIB_DEBUG_NDIS6<o:p></o:p></P>
<P class=MsoNormal> #define _IPOIB_DEBUG_NDIS6<o:p></o:p></P>
<P class=MsoNormal> CL_INLINE void CL_API<o:p></o:p></P>
<P class=MsoNormal> cl_qlist_check_validity(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           cl_qlist_t* 
const               
p_list )<o:p></o:p></P>
<P class=MsoNormal>+    IN  cl_qlist_t* const   
p_list )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_list_item_t    *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
size_t cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    cl_list_item_t  
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    size_t cnt = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* CL_ASSERT that a non-null pointer is provided. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* CL_ASSERT that the list was initialized. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_list->state == CL_INITIALIZED );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qlist_head(p_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
while(p_item != cl_qlist_end(p_list)) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
++cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = p_item->p_next;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT (cnt <= p_list->count);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT (cnt == p_list->count);<o:p></o:p></P>
<P 
class=MsoNormal>-              
return;<o:p></o:p></P>
<P class=MsoNormal>+    /* CL_ASSERT that a non-null pointer is 
provided. */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_list );<o:p></o:p></P>
<P class=MsoNormal>+    /* CL_ASSERT that the list was 
initialized. */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_list->state == 
CL_INITIALIZED );<o:p></o:p></P>
<P class=MsoNormal>+    p_item = 
cl_qlist_head(p_list);<o:p></o:p></P>
<P class=MsoNormal>+    while(p_item != cl_qlist_end(p_list)) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
++cnt;<o:p></o:p></P>
<P class=MsoNormal>+        
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
p_item->p_next;<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT (cnt 
<= p_list->count);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT (cnt == 
p_list->count);<o:p></o:p></P>
<P class=MsoNormal>+    return;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal>@@ -112,34 +110,34 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_adapter_t* 
const                                
p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_pnp_port_rec_t* const          
p_pnp_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_adapter_t* const      p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_pnp_port_rec_t* const    p_pnp_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_destroying(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_obj_t* 
const                                                 
p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_obj_t* 
const             
p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_cleanup(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_obj_t* 
const                                                 
p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_obj_t* 
const             
p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_free(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_obj_t* 
const                                                 
p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_obj_t* 
const             
p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ipoib_port_t* 
const                                                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ib_ca_attr_t**                                                                                  
pp_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ipoib_port_t* const   
              p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ib_ca_attr_t**                      
pp_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __srq_async_event_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                                          
ib_async_event_rec_t                  
*p_event_rec );<o:p></o:p></P>
<P class=MsoNormal>+IN          
ib_async_event_rec_t        *p_event_rec 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -148,27 +146,27 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __qp_event(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_async_event_rec_t                  
*p_event_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_async_event_rec_t        *p_event_rec 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __cq_event(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_async_event_rec_t                  
*p_event_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_async_event_rec_t        *p_event_rec 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_activate(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -177,58 +175,58 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static cl_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_ctor(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void* 
const                                                                         
p_object,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void*                                                                                     
context,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_pool_item_t** 
const                                
pp_pool_item );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void* 
const                 
p_object,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void*                       
context,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         cl_pool_item_t** 
const      pp_pool_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_dtor(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     cl_pool_item_t* 
const                  
p_pool_item,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*context );<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   cl_pool_item_t* const       
p_pool_item,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*context );<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_send_desc_t*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_send(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_send(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_desc_t* const          
p_desc );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_desc_t* const    p_desc );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NET_BUFFER_LIST* 
const                            
p_net_buffer_list OPTIONAL );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
        ipoib_port_t* 
const         p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
NET_BUFFER_LIST* const      p_net_buffer_list OPTIONAL 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* const        
                                
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_qlist_t* 
const                                               
p_list );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_qlist_t* const           
p_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //NDIS60<o:p></o:p></P>
<P class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* const        
                                
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            p_desc 
);<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal>@@ -238,76 +236,76 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* Posts receive buffers to the receive queue. 
*/<o:p></o:p></P>
<P class=MsoNormal> int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_repost(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
ib_cq_handle_t                                                                
h_cq,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*cq_context );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_get_endpts(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_wc_t* 
const                                                 
p_wc,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_src,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_dst );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_wc_t* 
const              
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_src,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_dst );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_filter(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_wc_t* 
const                                                 
p_done_wc_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_qlist_t* 
const                                               
p_done_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_qlist_t* 
const                                               
p_bad_list );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_wc_t* 
const              
p_done_wc_list,<o:p></o:p></P>
<P class=MsoNormal>+  
      OUT         
cl_qlist_t* const           
p_done_list,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         cl_qlist_t* 
const           p_bad_list 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_gen(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        
p_src,<o:p></o:p></P>
<P class=MsoNormal>+    IN   
           ipoib_endpt_t* 
const        p_dst );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_dhcp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        
p_src,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_dst 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_arp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_wc_t* 
const                                                 
p_wc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t** 
const                 
p_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_wc_t* 
const              
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t** const       p_src,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_dst 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
NET_BUFFER_LIST** 
const                          
pp_net_buffer_list );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         NET_BUFFER_LIST** 
const     pp_net_buffer_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static uint32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_qlist_t*                                                                           
p_done_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
int32_t* 
const                                                   
p_discarded );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+   
     OUT         
cl_qlist_t*                 
p_done_list,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         int32_t* 
const              
p_discarded );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -316,128 +314,128 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_gen(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_NB_SG 
*                                     
s_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
INT 
                                                                                        
lso_data_index,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
UINT                                                                                      
lso_header_size OPTIONAL);<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_NB_SG *          
s_buf,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
INT                         
lso_data_index,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
UINT                        
lso_header_size OPTIONAL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG* 
const                          
s_buf);<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         ipoib_send_NB_SG* 
const     s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN 
                                                          
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P class=MsoNormal>-    
IN                      
const     ip_hdr_t* 
const                                                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
iph_options_size,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len );<o:p></o:p></P>
<P class=MsoNormal>+    IN   
           ipoib_port_t* 
const         p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ip_hdr_t* 
const             
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
iph_options_size,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ip_hdr_t* 
const                                                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG* 
const                          
s_buf);<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ip_hdr_t* const  
           p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         ipoib_send_NB_SG* 
const     s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     udp_hdr_t* 
const                                           
p_udp_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG* 
const                          
s_buf );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   udp_hdr_t* 
const            
p_udp_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         ipoib_send_NB_SG* 
const     s_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG* 
const                          
s_buf );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         ipoib_send_NB_SG* 
const     s_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void <o:p></o:p></P>
<P class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
ipoib_send_NB_SG        *s_buf, 
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           NDIS_STATUS 
                   
status,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
ULONG                                                 
compl_flags,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
boolean_t                                           
bLock    );<o:p></o:p></P>
<P class=MsoNormal>+    IN  
ipoib_send_NB_SG    *s_buf, <o:p></o:p></P>
<P class=MsoNormal>+    IN  
NDIS_STATUS         
status,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
ULONG               
compl_flags,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
boolean_t           
bLock   );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_queue(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_send_desc(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL* 
const                                                                        
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
size_t                                                                                    
mdl_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_NB_SG                                        
*s_buf);<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL* 
const                  
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
size_t                      
mdl_len,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_NB_SG            
*s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
ib_cq_handle_t                                                                
h_cq,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*cq_context );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS <o:p></o:p></P>
<P class=MsoNormal> GetLsoHeaderSize(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
PNET_BUFFER                   
pNetBuffer,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
LsoData 
                               
*pLsoData,<o:p></o:p></P>
<P 
class=MsoNormal>-              
OUT       
UINT                                      
*IndexOfData,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
PNET_BUFFER     pNetBuffer,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
LsoData         
*pLsoData,<o:p></o:p></P>
<P class=MsoNormal>+    OUT     
UINT            
*IndexOfData,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_lso_desc(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ULONG                                                                                 
mss,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
int32_t                                                                                  
hdr_idx,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NET_BUFFER                                                                      
*p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ULONG      
                 mss,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
int32_t                     
hdr_idx,<o:p></o:p></P>
<P class=MsoNormal>+    IN 
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
NET_BUFFER                  
*p_netbuf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO CM Restore<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_fragments(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ipoib_port_t* 
const                                                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ipoib_send_desc_t* 
const                                          
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
eth_hdr_t* 
const                                                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ip_hdr_t* 
const                                                                                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
uint32_t                                                                                                               
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
NDIS_BUFFER*                                                                                 
p_ndis_buf );<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ipoib_port_t* 
const                 
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ipoib_send_desc_t* 
const            
p_desc,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
eth_hdr_t* 
const                    
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ip_hdr_t* 
const                     
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
uint32_t                            
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
NDIS_BUFFER*                        
p_ndis_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
ip_hdr_t* 
const                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint16_t                                               
fragment_size, <o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint16_t                                               
fragment_offset, <o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
BOOLEAN                                                            
more_fragments );<o:p></o:p></P>
<P class=MsoNormal>+IN      ip_hdr_t* 
const     p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN      
uint16_t            
fragment_size, <o:p></o:p></P>
<P class=MsoNormal>+IN      
uint16_t            
fragment_offset, <o:p></o:p></P>
<P class=MsoNormal>+IN      
BOOLEAN             
more_fragments );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __copy_ip_options(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint8_t*                                               
p_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint8_t*                                               
p_options,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint32_t                                               
options_len,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
BOOLEAN                                                            
copy_all );<o:p></o:p></P>
<P class=MsoNormal>+IN      
uint8_t*            
p_buf,<o:p></o:p></P>
<P class=MsoNormal>+IN      
uint8_t*            
p_options,<o:p></o:p></P>
<P class=MsoNormal>+IN      
uint32_t            
options_len,<o:p></o:p></P>
<P class=MsoNormal>+IN      
BOOLEAN             
copy_all );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -446,85 +444,85 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /****f* IPoIB/__endpt_mgr_remove_all<o:p></o:p></P>
<P class=MsoNormal> * NAME<o:p></o:p></P>
<P 
class=MsoNormal>-*            
__endpt_mgr_remove_all<o:p></o:p></P>
<P class=MsoNormal>+*   __endpt_mgr_remove_all<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal> * DESCRIPTION<o:p></o:p></P>
<P 
class=MsoNormal>-*            
Removes all enpoints from the port, dereferencing them to 
initiate<o:p></o:p></P>
<P 
class=MsoNormal>-*            
destruction.<o:p></o:p></P>
<P class=MsoNormal>+*   Removes all enpoints from the port, 
dereferencing them to initiate<o:p></o:p></P>
<P class=MsoNormal>+*   destruction.<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal> * SYNOPSIS<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> /*<o:p></o:p></P>
<P class=MsoNormal> ********/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_endpt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ib_gid_t* 
const                                                 
p_gid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
UNALIGNED net32_t* const       p_qpn 
);<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ib_gid_t* 
const             
p_gid,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         UNALIGNED net32_t* 
const    p_qpn );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ib_gid_t* 
const                                                 
p_gid );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ib_gid_t* 
const             
p_gid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
                                
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
net16_t                                                                                                
lid );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
net16_t                     
lid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_endpt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_endpt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_port_info_t* 
const                   
p_port_info );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_port_info_t* const       p_port_info 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_mcast_rec_t                                                                
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_mcast_rec_t              
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -533,85 +531,85 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_get_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_join_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_member_rec_t* 
const                            
p_member_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_member_rec_t* const      p_member_rec 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_create_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_get_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_query_rec_t                                                                
*p_query_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_query_rec_t              
*p_query_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_mcast_rec_t                                                                
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_mcast_rec_t              
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __mcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_mcast_rec_t                                                                
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_mcast_rec_t              
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                       
*context );<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                
*context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static int<o:p></o:p></P>
<P class=MsoNormal> __gid_cmp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     void* 
const                                                                         
p_key1,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     void* 
const                                                                         
p_key2 )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   void* 
const                 
p_key1,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   void* 
const                 
p_key2 )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
return cl_memcmp( p_key1, p_key2, sizeof(ib_gid_t) );<o:p></o:p></P>
<P class=MsoNormal>+    return cl_memcmp( p_key1, p_key2, 
sizeof(ib_gid_t) );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline void ipoib_port_ref( ipoib_port_t * p_port, int 
type )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_ref( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_ref( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->ref[type % ref_mask] );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Port[%d] refcount raised to %d\n", p_port->port_num, 
p_port->obj.ref_cnt));<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( &p_port->ref[type % 
ref_mask] );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Port[%d] refcount raised to %d\n", p_port->port_num, 
p_port->obj.ref_cnt));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if ((p_port->obj.ref_cnt % 20)==0)<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+    if ((p_port->obj.ref_cnt % 
20)==0)<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+        ("ref type %d 
ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline void ipoib_port_deref(ipoib_port_t * p_port, int 
type)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_deref( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_deref( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_dec( &p_port->ref[type % ref_mask] );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Port[%d] refcount decremented to %d\n", p_port->port_num, 
p_port->obj.ref_cnt));<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ((p_port->obj.ref_cnt % 20) == 0)<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_dec( &p_port->ref[type % 
ref_mask] );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Port[%d] refcount decremented to %d\n", p_port->port_num, 
p_port->obj.ref_cnt));<o:p></o:p></P>
<P class=MsoNormal>+    if ((p_port->obj.ref_cnt % 20) == 
0)<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+        ("deref type %d 
ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* function returns pointer to payload that is going 
after IP header.<o:p></o:p></P>
<P class=MsoNormal> *  asssuming that payload and IP header are in the 
same buffer<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal>-static void* 
GetIpPayloadPtr(const        ip_hdr_t* 
const                
p_ip_hdr)<o:p></o:p></P>
<P class=MsoNormal>+static void* GetIpPayloadPtr(const  ip_hdr_t* const 
p_ip_hdr)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></P>
<P class=MsoNormal>+    return (void*)((uint8_t*)p_ip_hdr + 
IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal>@@ -621,316 +619,324 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_create_port(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_adapter_t* 
const                                
p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_pnp_port_rec_t* const          
p_pnp_rec,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_port_t** 
const                     
pp_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_adapter_t* const      p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+    
IN            
  ib_pnp_port_rec_t* const    p_pnp_rec,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_port_t** 
const        pp_port )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( !p_adapter->p_port );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( !p_adapter->p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t *) cl_zalloc( sizeof(ipoib_port_t) +<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_port )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
sizeof(ipoib_port_t)) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_port = (ipoib_port_t *) cl_zalloc( 
sizeof(ipoib_port_t) +<o:p></o:p></P>
<P class=MsoNormal>+        
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_port )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
sizeof(ipoib_port_t)) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></P>
<P 
class=MsoNormal>-              
gp_ipoib_port = p_port;<o:p></o:p></P>
<P class=MsoNormal>+    gp_ipoib_port = p_port;<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__port_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    __port_construct( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __port_init( p_port, p_adapter, p_pnp_rec );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_port_init returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__port_cleanup( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__port_free( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    status = __port_init( p_port, p_adapter, 
p_pnp_rec );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_port_init returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        __port_cleanup( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        __port_free( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_port = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    *pp_port = p_port;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( !p_port->p_adapter->p_port );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port->p_adapter 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( 
!p_port->p_adapter->p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_destroy( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_destroy( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->state = IB_QPS_RESET;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->state = 
IB_QPS_RESET;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_construct( &p_port->obj, IPOIB_OBJ_PORT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_construct( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_construct( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__ib_mgr_construct( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__buf_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_construct( &p_port->obj, 
IPOIB_OBJ_PORT );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_construct( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_construct( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    __ib_mgr_construct( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    __buf_mgr_construct( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__recv_mgr_construct( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__send_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    __recv_mgr_construct( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    __send_mgr_construct( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__endpt_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    __endpt_mgr_construct( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    p_port->pPoWorkItem = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+    KeInitializeEvent( 
&p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></P>
<P class=MsoNormal>+    KeInitializeEvent( 
&p_port->leave_mcast_event, NotificationEvent, TRUE );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_adapter_t* 
const                                
p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_pnp_port_rec_t* const          
p_pnp_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_adapter_t* const      p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_pnp_port_rec_t* const    p_pnp_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status_t                                          
cl_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_status_t         
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->port_num = 
p_pnp_rec->p_port_attr->port_num;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_adapter = 
p_adapter;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_port->pPoWorkItem = 
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->pPoWorkItem == NULL 
)   {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("IoAllocateWorkItem returned NULL\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_spinlock_init( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_spinlock_init( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Initialize the IB resource manager. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __ib_mgr_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__ib_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_spinlock_init( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Initialize the buffer manager. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __buf_mgr_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__buf_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Initialize the IB resource manager. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = __ib_mgr_init( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__ib_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Initialize the receive manager. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __recv_mgr_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__recv_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
status =__send_mgr_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__send_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Initialize the buffer manager. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = __buf_mgr_init( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__buf_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Initialize the endpoint manager. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __endpt_mgr_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__endpt_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Initialize the receive manager. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = __recv_mgr_init( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__recv_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    status =__send_mgr_init( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__send_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></P>
<P class=MsoNormal>+    /* Initialize the endpoint manager. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = __endpt_mgr_init( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__endpt_mgr_init returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+     /* Initialize multicast garbage 
collector timer and DPC object */<o:p></o:p></P>
<P class=MsoNormal>+     
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></P>
<P class=MsoNormal>+     
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Initialize multicast garbage collector timer and DPC object */<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></P>
<P class=MsoNormal>+    /* We only ever destroy from the PnP 
callback thread. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_obj_init( 
&p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></P>
<P class=MsoNormal>+        
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* We only ever destroy from the PnP callback thread. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( 
&p_port->ref[ref_init] );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+        ("ref type %d 
ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj, 
&p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_obj_insert_rel returned %#x\n", cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_obj_insert_rel( 
&p_port->rel, &p_adapter->obj, &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+ 
           ("cl_obj_insert_rel 
returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( 
&p_port->ref[ref_init] );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_ERROR, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+        ("ref type %d 
ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
// The port is started as paused and NDIS calls latter to ipoib_restart. 
We<o:p></o:p></P>
<P 
class=MsoNormal>-              
// shut the recv_shuter for now and alive it on ipoib_restart. We 
did<o:p></o:p></P>
<P 
class=MsoNormal>-              
// it in this way since MpInitializeInternal also calls in reset and 
than<o:p></o:p></P>
<P 
class=MsoNormal>-              
// we need to set the rec ref count to 1 //TODO !!!!!!!!!!1<o:p></o:p></P>
<P 
class=MsoNormal>-              
//<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( p_adapter->ipoib_state == IPOIB_INIT) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("Shutter shut, state = %d\n", p_adapter->ipoib_state));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
shutter_shut ( &p_adapter->recv_shutter );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("*****Shutter wasn't shut, state = %d*****\n", 
p_adapter->ipoib_state));<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    // The port is started as paused and NDIS 
calls latter to ipoib_restart. We<o:p></o:p></P>
<P class=MsoNormal>+    // shut the recv_shuter for now and alive 
it on ipoib_restart. We did<o:p></o:p></P>
<P class=MsoNormal>+    // it in this way since 
MpInitializeInternal also calls in reset and than<o:p></o:p></P>
<P class=MsoNormal>+    // we need to set the rec ref count to 1 
//TODO !!!!!!!!!!1<o:p></o:p></P>
<P class=MsoNormal>+    //<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if ( p_adapter->ipoib_state == 
IPOIB_INIT) {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P class=MsoNormal>+        ("Shutter shut, 
state = %d\n", p_adapter->ipoib_state));<o:p></o:p></P>
<P class=MsoNormal>+        shutter_shut ( 
&p_adapter->recv_shutter );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></P>
<P class=MsoNormal>+        ("*****Shutter 
wasn't shut, state = %d*****\n", p_adapter->ipoib_state));<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_destroying(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_obj_t* 
const                                                 
p_obj )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_obj_t* 
const             
p_obj )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t      *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t    
*p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal>+    p_port = PARENT_STRUCT( p_obj, 
ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_down( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_down( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__endpt_mgr_remove_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    __endpt_mgr_remove_all( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
endpt_cm_buf_mgr_destroy(  p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
endpt_cm_buf_mgr_destroy(  p_port );<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></P>
<P class=MsoNormal>+        cl_event_signal( 
&p_port->endpt_mgr.event );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_resume( p_port, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+    
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_resume( p_port, FALSE 
);<o:p></o:p></P>
<P class=MsoNormal>+    
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_cleanup(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_obj_t* 
const                                                 
p_obj )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_obj_t* 
const             
p_obj )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t      *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t    
*p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal>+    p_port = PARENT_STRUCT( p_obj, 
ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all sends and receives to get flushed. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->send_mgr.depth || p_port->recv_mgr.depth )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all sends and receives to get 
flushed. */<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->send_mgr.depth || 
p_port->recv_mgr.depth )<o:p></o:p></P>
<P class=MsoNormal>+        
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Destroy the send and receive managers before closing the CA. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
__ib_mgr_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    /* Destroy the send and receive managers 
before closing the CA. */<o:p></o:p></P>
<P class=MsoNormal>+    __ib_mgr_destroy( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_free(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_obj_t* 
const                                                 
p_obj )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_obj_t* 
const             
p_obj )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t      *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t    
*p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal>+    p_port = PARENT_STRUCT( p_obj, 
ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeFlushQueuedDpcs();<o:p></o:p></P>
<P 
class=MsoNormal>-              
__endpt_mgr_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__recv_mgr_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__send_mgr_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__buf_mgr_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P class=MsoNormal>+    KeFlushQueuedDpcs();<o:p></o:p></P>
<P class=MsoNormal>+    __endpt_mgr_destroy( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    __recv_mgr_destroy( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    __send_mgr_destroy( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    __buf_mgr_destroy( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_destroy( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_destroy( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_destroy( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_destroy( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_deinit( p_obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_ca_attrs )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_free ( p_port->p_ca_attrs );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_free( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_deinit( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->p_ca_attrs 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_free ( 
p_port->p_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IoFreeWorkItem( p_port->pPoWorkItem 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_free( p_port );<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -942,338 +948,338 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &p_port->ib_mgr, sizeof(ipoib_ib_mgr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &p_port->ib_mgr, 
sizeof(ipoib_ib_mgr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_cq_create_t                 
cq_create;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_qp_create_t                                
qp_create;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_phys_create_t            
phys_create;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_phys_range_t                             
phys_range;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                                               
vaddr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
net32_t                                                                
rkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_qp_attr_t                      
qp_attr;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_cq_create_t      cq_create;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_qp_create_t      qp_create;<o:p></o:p></P>
<P class=MsoNormal>+    ib_phys_create_t    
phys_create;<o:p></o:p></P>
<P class=MsoNormal>+    ib_phys_range_t     
phys_range;<o:p></o:p></P>
<P class=MsoNormal>+    
uint64_t            
vaddr;<o:p></o:p></P>
<P class=MsoNormal>+    
net32_t             
rkey;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_qp_attr_t        qp_attr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Open the CA. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->h_al, 
p_port->p_adapter->guids.ca_guid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NULL, p_port, &p_port->ib_mgr.h_ca );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_open_ca returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Open the CA. */<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->h_al, 
p_port->p_adapter->guids.ca_guid,<o:p></o:p></P>
<P class=MsoNormal>+        NULL, p_port, 
&p_port->ib_mgr.h_ca );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_open_ca returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __port_query_ca_attrs( p_port, &p_port->p_ca_attrs 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Query CA attributes failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    status = __port_query_ca_attrs( p_port, 
&p_port->p_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Query CA attributes failed\n" ) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
uint32_t payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
- sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* adjust ipoib UD payload MTU to actual port MTU 
size.              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->params.payload_mtu = <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(sizeof(eth_hdr_t) + 
p_port->p_adapter->params.payload_mtu);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        uint32_t 
payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
- sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+        /* adjust ipoib 
UD payload MTU to actual port MTU size. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->params.payload_mtu = <o:p></o:p></P>
<P 
class=MsoNormal>+                
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></P>
<P 
class=MsoNormal>+            
(sizeof(eth_hdr_t) + 
p_port->p_adapter->params.payload_mtu);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_USE_DMA<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* init DMA only once while running MiniportInitialize */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( !p_port->p_adapter->reset )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ULONG max_phys_mapping;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
max_phys_mapping = 
p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( p_port->p_adapter->params.lso )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
                
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
max_phys_mapping = 
p_port->p_adapter->params.xfer_block_size;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*if( NdisMInitializeScatterGatherDma( 
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* init DMA only once while running 
MiniportInitialize */<o:p></o:p></P>
<P class=MsoNormal>+    if ( !p_port->p_adapter->reset 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ULONG 
max_phys_mapping;<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
max_phys_mapping = 
p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( 
p_port->p_adapter->params.lso )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
max_phys_mapping = 
p_port->p_adapter->params.xfer_block_size;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /*if( 
NdisMInitializeScatterGatherDma( 
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                            
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+        
}*/<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the PD. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_alloc_pd returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the PD. */<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_alloc_pd returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate receive CQ. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cq_create.size = p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cq_create.pfn_comp_cb = __recv_cb;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cq_create.h_wait_obj = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate receive CQ. */<o:p></o:p></P>
<P class=MsoNormal>+    cq_create.size = 
p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P class=MsoNormal>+    cq_create.pfn_comp_cb = 
__recv_cb;<o:p></o:p></P>
<P class=MsoNormal>+    cq_create.h_wait_obj = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__cq_event, &p_port->ib_mgr.h_recv_cq );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P class=MsoNormal>+        __cq_event, 
&p_port->ib_mgr.h_recv_cq );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate send CQ. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cq_create.size = p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cq_create.pfn_comp_cb = __send_cb;<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate send CQ. */<o:p></o:p></P>
<P class=MsoNormal>+    cq_create.size = 
p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P class=MsoNormal>+    cq_create.pfn_comp_cb = 
__send_cb;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__cq_event, &p_port->ib_mgr.h_send_cq );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the QP. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &qp_create, sizeof(qp_create) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.qp_type = IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.rq_depth = p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.rq_sge = 2;   /* To support buffers spanning pages. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.h_rq_cq = p_port->ib_mgr.h_recv_cq;<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.sq_depth = p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P class=MsoNormal>+        __cq_event, 
&p_port->ib_mgr.h_send_cq );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the QP. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &qp_create, 
sizeof(qp_create) );<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.qp_type = 
IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.rq_depth = 
p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.rq_sge = 2;   /* To 
support buffers spanning pages. */<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.h_rq_cq = 
p_port->ib_mgr.h_recv_cq;<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.sq_depth = 
p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #define UD_QP_USED_SGE 3<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.sq_sge = MAX_SEND_SGE < p_port->p_ca_attrs->max_sges ? 
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
MAX_SEND_SGE  : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( !p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></P>
<P 
class=MsoNormal>-              
{ <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* checksum is not supported by device<o:p></o:p></P>
<P 
class=MsoNormal>-                              
user must specify BYPASS to explicitly cancel checksum calculation 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (p_port->p_adapter->params.send_chksum_offload == 
CSUM_ENABLED)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->params.send_chksum_offload = 
CSUM_DISABLED;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (p_port->p_adapter->params.recv_chksum_offload == 
CSUM_ENABLED)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->params.recv_chksum_offload = 
CSUM_DISABLED;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.sq_sge = MAX_SEND_SGE < 
p_port->p_ca_attrs->max_sges ? <o:p></o:p></P>
<P 
class=MsoNormal>+            
MAX_SEND_SGE  : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE 
);<o:p></o:p></P>
<P class=MsoNormal>+    if ( 
!p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></P>
<P class=MsoNormal>+    { <o:p></o:p></P>
<P class=MsoNormal>+        /* checksum is 
not supported by device<o:p></o:p></P>
<P class=MsoNormal>+        user must specify 
BYPASS to explicitly cancel checksum calculation */<o:p></o:p></P>
<P class=MsoNormal>+        if 
(p_port->p_adapter->params.send_chksum_offload == 
CSUM_ENABLED)<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->params.send_chksum_offload = 
CSUM_DISABLED;<o:p></o:p></P>
<P class=MsoNormal>+        if 
(p_port->p_adapter->params.recv_chksum_offload == 
CSUM_ENABLED)<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->params.recv_chksum_offload = 
CSUM_DISABLED;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
// Now, params struct contains the intersection between the user 
definition<o:p></o:p></P>
<P 
class=MsoNormal>-              
// and actual HW capabilites<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Remember these values for NDIS OID requests<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_adapter->offload_cap.lso = 
!!(p_port->p_adapter->params.lso);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
!! (p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_adapter->offload_cap.recv_chksum_offload = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
!! (p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_create.sq_signaled = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__qp_event, &p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_create_qp returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Query the QP so we can get our QPN. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_query_qp returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->ib_mgr.qpn = qp_attr.num;<o:p></o:p></P>
<P class=MsoNormal>+    // Now, params struct contains the 
intersection between the user definition<o:p></o:p></P>
<P class=MsoNormal>+    // and actual HW 
capabilites<o:p></o:p></P>
<P class=MsoNormal>+    // Remember these values for NDIS OID 
requests<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_adapter->offload_cap.lso 
= !!(p_port->p_adapter->params.lso);<o:p></o:p></P>
<P class=MsoNormal>+    
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></P>
<P class=MsoNormal>+        !! 
(p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></P>
<P class=MsoNormal>+    
p_port->p_adapter->offload_cap.recv_chksum_offload = <o:p></o:p></P>
<P class=MsoNormal>+        !! 
(p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    qp_create.h_sq_cq = 
p_port->ib_mgr.h_send_cq;<o:p></o:p></P>
<P class=MsoNormal>+    qp_create.sq_signaled = 
FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></P>
<P class=MsoNormal>+        __qp_event, 
&p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_create_qp returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* Query the QP so we can get our QPN. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_query_qp returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_port->ib_mgr.qpn = 
qp_attr.num;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Register all of physical memory */<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_create.length = MEM_REG_SIZE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_create.num_ranges = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_create.range_array = &phys_range;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_create.buf_offset = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_create.hca_page_size = PAGE_SIZE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_create.access_ctrl = IB_AC_LOCAL_WRITE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_range.base_addr = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
phys_range.size = MEM_REG_SIZE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
vaddr = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_reg_phys returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Register all of physical memory 
*/<o:p></o:p></P>
<P class=MsoNormal>+    phys_create.length = 
MEM_REG_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+    phys_create.num_ranges = 
1;<o:p></o:p></P>
<P class=MsoNormal>+    phys_create.range_array = 
&phys_range;<o:p></o:p></P>
<P class=MsoNormal>+    phys_create.buf_offset = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    phys_create.hca_page_size = 
PAGE_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+    phys_create.access_ctrl = 
IB_AC_LOCAL_WRITE;<o:p></o:p></P>
<P class=MsoNormal>+    phys_range.base_addr = 0;<o:p></o:p></P>
<P class=MsoNormal>+    phys_range.size = 
MEM_REG_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+    vaddr = 0;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_reg_phys returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = ipoib_port_srq_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_port_srq_init failed %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* disable further CM initialization */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    status = ipoib_port_srq_init( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_port_srq_init failed %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        /* disable 
further CM initialization */<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> //CM<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = endpt_cm_buf_mgr_init( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        status = 
endpt_cm_buf_mgr_init( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else <o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if ( p_port->p_adapter->params.send_chksum_offload )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->params.send_chksum_offload = 
CSUM_DISABLED;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else 
<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+         
   if ( p_port->p_adapter->params.send_chksum_offload 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->params.send_chksum_offload = 
CSUM_DISABLED;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __srq_async_event_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                                          
ib_async_event_rec_t                  
*p_event_rec )<o:p></o:p></P>
<P class=MsoNormal>+IN          
ib_async_event_rec_t        *p_event_rec 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t* p_port = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
(ipoib_port_t *)p_event_rec->context;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t* p_port = <o:p></o:p></P>
<P class=MsoNormal>+        (ipoib_port_t 
*)p_event_rec->context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( p_event_rec->code )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    switch( p_event_rec->code 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    case 
IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+    case 
IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+                
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P class=MsoNormal>+   
         p_port->p_adapter->hung 
= TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+    case 
IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+                
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></P>
<P 
class=MsoNormal>+                
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_srq_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
ib_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_srq_handle_t                              
h_srq;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_srq_attr_t                     
srq_attr;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    ib_srq_handle_t     
h_srq;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_srq_attr_t       srq_attr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( 
!p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
srq_attr.max_sge = min( 2, p_port->p_ca_attrs->max_srq_sges 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
srq_attr.srq_limit = 10;<o:p></o:p></P>
<P 
class=MsoNormal>-              
srq_attr.max_wr = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></P>
<P class=MsoNormal>+    srq_attr.max_sge = min( 2, 
p_port->p_ca_attrs->max_srq_sges );<o:p></o:p></P>
<P class=MsoNormal>+    srq_attr.srq_limit = 10;<o:p></o:p></P>
<P class=MsoNormal>+    srq_attr.max_wr = <o:p></o:p></P>
<P class=MsoNormal>+        min( 
(uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_status = p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
p_port->ib_mgr.h_pd, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
&srq_attr, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
p_port, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
__srq_async_event_cb, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
&h_srq );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_create_srq failed status %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return ib_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->ib_mgr.h_srq = h_srq;<o:p></o:p></P>
<P class=MsoNormal>+    ib_status = 
p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></P>
<P 
class=MsoNormal>+                                
p_port->ib_mgr.h_pd, <o:p></o:p></P>
<P class=MsoNormal>+           
                     &srq_attr, 
<o:p></o:p></P>
<P 
class=MsoNormal>+                                
p_port, <o:p></o:p></P>
<P 
class=MsoNormal>+                                
__srq_async_event_cb, <o:p></o:p></P>
<P 
class=MsoNormal>+                                
&h_srq );<o:p></o:p></P>
<P class=MsoNormal>+    if( ib_status != IB_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_create_srq failed status %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_port->ib_mgr.h_srq = 
h_srq;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
return ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    return ib_status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /*  __port_query_ca_attrs() <o:p></o:p></P>
<P class=MsoNormal>@@ -1282,82 +1288,82 @@<o:p></o:p></P>
<P class=MsoNormal>  */<o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ipoib_port_t* 
const                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ib_ca_attr_t**                                  
pp_ca_attrs )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ipoib_port_t* const     p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ib_ca_attr_t**          pp_ca_attrs 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
ib_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                               
attr_size;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_ca_attr_t*                    
p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t            
attr_size;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_ca_attr_t*       p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_ca_attrs = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    *pp_ca_attrs = NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_status = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL , 
&attr_size );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ib_status != IB_INSUFFICIENT_MEMORY )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_query_ca failed status %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( attr_size );<o:p></o:p></P>
<P class=MsoNormal>+    ib_status = <o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL , 
&attr_size );<o:p></o:p></P>
<P class=MsoNormal>+    if( ib_status != IB_INSUFFICIENT_MEMORY 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_query_ca failed status %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P class=MsoNormal>+        goto 
done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( attr_size );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ca_attrs = (ib_ca_attr_t *) cl_zalloc( attr_size );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( p_ca_attrs == NULL )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ib_status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_ca_attrs = (ib_ca_attr_t *) cl_zalloc( 
attr_size );<o:p></o:p></P>
<P class=MsoNormal>+    if ( p_ca_attrs == NULL )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></P>
<P class=MsoNormal>+        ib_status = 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+        goto 
done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_status = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs 
, &attr_size );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("CA attributes query failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_free ( p_ca_attrs );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    ib_status = <o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs 
, &attr_size );<o:p></o:p></P>
<P class=MsoNormal>+    if ( ib_status != IB_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("CA attributes query failed\n") );<o:p></o:p></P>
<P class=MsoNormal>+        cl_free ( 
p_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+        goto 
done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_ca_attrs = p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal>+    *pp_ca_attrs = p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal> done:<o:p></o:p></P>
<P 
class=MsoNormal>-              
return ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    return ib_status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_srq_destroy( <o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
status;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->ib_mgr.h_srq )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status =<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->ib_mgr.h_srq 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        status 
=<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL 
);<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( status 
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    IN  
            ipoib_port_t* 
const         p_port )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
status;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->ib_mgr.h_ca )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status =<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->ib_mgr.h_ca 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        status 
=<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL 
);<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( status 
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -1369,58 +1375,58 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_construct( &p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal>+    cl_qpool_construct( 
&p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->buf_mgr.h_packet_pool = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->buf_mgr.h_buffer_pool = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->buf_mgr.h_packet_pool = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->buf_mgr.h_buffer_pool = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisInitializeNPagedLookasideList( 
&p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NULL, NULL, 0, MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></P>
<P class=MsoNormal>+    NdisInitializeNPagedLookasideList( 
&p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P class=MsoNormal>+        NULL, NULL, 0, 
MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->buf_mgr.h_send_pkt_pool = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->buf_mgr.h_send_pkt_pool = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN         
     ipoib_port_t* 
const         p_port )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status_t                          
cl_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_params_t                
*p_params;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST_POOL_PARAMETERS pool_parameters;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    cl_status_t     
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_params_t  
*p_params;<o:p></o:p></P>
<P class=MsoNormal>+    NET_BUFFER_LIST_POOL_PARAMETERS 
pool_parameters;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port->p_adapter 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_params = &p_port->p_adapter->params;<o:p></o:p></P>
<P class=MsoNormal>+    p_params = 
&p_port->p_adapter->params;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the receive descriptor pool */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_qpool_init( &p_port->buf_mgr.recv_pool,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the receive descriptor pool 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_qpool_init( 
&p_port->buf_mgr.recv_pool,<o:p></o:p></P>
<P class=MsoNormal>+        
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                              
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port 
);<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        0, 0, 
sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        0, 0, 
sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the NET BUFFER list pools for receive indication. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisZeroMemory(&pool_parameters, 
sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the NET BUFFER list pools for 
receive indication. */<o:p></o:p></P>
<P class=MsoNormal>+    NdisZeroMemory(&pool_parameters, 
sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.Header.Type = 
NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.Header.Revision = 
NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.Header.Size = 
sizeof(pool_parameters);<o:p></o:p></P>
<P class=MsoNormal>@@ -1428,288 +1434,288 @@<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.ContextSize = 
0;<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.fAllocateNetBuffer = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.PoolTag = 
'CRPI';<o:p></o:p></P>
<P 
class=MsoNormal>-              
pool_parameters.DataSize = 0;<o:p></o:p></P>
<P class=MsoNormal>+    pool_parameters.DataSize = 
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>     p_port->buf_mgr.h_packet_pool = 
NdisAllocateNetBufferListPool(<o:p></o:p></P>
<P 
class=MsoNormal>                 
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>                 
&pool_parameters); <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_port->buf_mgr.h_packet_pool )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES  );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the NET buffer list pool for send formatting. */<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_port->buf_mgr.h_packet_pool 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES  );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) 
);<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the NET buffer list pool for 
send formatting. */<o:p></o:p></P>
<P class=MsoNormal>     pool_parameters.PoolTag = 
'XTPI';<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>     p_port->buf_mgr.h_send_pkt_pool = 
NdisAllocateNetBufferListPool(<o:p></o:p></P>
<P 
class=MsoNormal>                 
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>                 
&pool_parameters); <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
!p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES) 
);<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Destroy the send packet and buffer pools. <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->buf_mgr.h_send_buf_pool )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->buf_mgr.h_send_pkt_pool )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></P>
<P class=MsoNormal>+    /* Destroy the send packet and buffer 
pools. <o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->buf_mgr.h_send_buf_pool 
)<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->buf_mgr.h_send_pkt_pool 
)<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Destroy the receive packet and buffer pools. <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->buf_mgr.h_buffer_pool )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->buf_mgr.h_packet_pool )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );<o:p></o:p></P>
<P class=MsoNormal>+    /* Destroy the receive packet and buffer 
pools. <o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->buf_mgr.h_buffer_pool 
)<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->buf_mgr.h_packet_pool 
)<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Free the receive and send descriptors. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_destroy( &p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal>+    /* Free the receive and send descriptors. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_qpool_destroy( 
&p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Free the lookaside list of scratch buffers. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisDeleteNPagedLookasideList( &p_port->buf_mgr.send_buf_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Free the lookaside list of scratch 
buffers. */<o:p></o:p></P>
<P class=MsoNormal>+    NdisDeleteNPagedLookasideList( 
&p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT(  IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT(  IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static cl_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_ctor(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void* 
const                                                                         
p_object,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void*                                                                                     
context,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_pool_item_t** 
const                                
pp_pool_item )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void* 
const              
   p_object,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void*                       
context,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         cl_pool_item_t** 
const      pp_pool_item )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t          
*p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_recv_desc_t   
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                               
ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t            
ds0_len;<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ALLOC 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_object );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( context );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_object );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc = (ipoib_recv_desc_t*)p_object;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc = 
(ipoib_recv_desc_t*)p_object;<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Setup the work request. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->wr.ds_array = p_desc->local_ds;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->wr.wr_id = (uintn_t)p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    /* Setup the work request. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->wr.ds_array = 
p_desc->local_ds;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->wr.wr_id = 
(uintn_t)p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Sanity check on the receive buffer layout */<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( (void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(void*)&p_desc->buf.ib.pkt.type );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( sizeof(recv_buf_t) == sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Sanity check on the receive buffer 
layout */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( 
(void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></P>
<P class=MsoNormal>+ 
       (void*)&p_desc->buf.ib.pkt.type 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( sizeof(recv_buf_t) == 
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Setup the local data segment. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_desc->buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ds0_len =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
PAGE_SIZE - ((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 
1));<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ds0_len >= sizeof(recv_buf_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* The whole buffer is within a page. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* The buffer crosses page boundaries. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->local_ds[1].vaddr = cl_get_physaddr( <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->wr.num_ds = 2;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the receive buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->p_buf = (recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_desc->p_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to allocate receive buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return CL_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Setup the local data segment. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->local_ds[0].vaddr = 
cl_get_physaddr( &p_desc->buf );<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->local_ds[0].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    ds0_len =<o:p></o:p></P>
<P class=MsoNormal>+        PAGE_SIZE - 
((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));<o:p></o:p></P>
<P class=MsoNormal>+    if( ds0_len >= sizeof(recv_buf_t) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* The whole 
buffer is within a page. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* The buffer 
crosses page boundaries. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->local_ds[1].vaddr = cl_get_physaddr( <o:p></o:p></P>
<P 
class=MsoNormal>+            
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->wr.num_ds = 2;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the receive buffer. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->p_buf = 
(recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_desc->p_buf )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to allocate receive buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
CL_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Sanity check on the receive buffer layout */<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( (void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></P>
<P class=MsoNormal>+    /* Sanity check on the receive buffer 
layout */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( 
(void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></P>
<P class=MsoNormal>+        
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Setup the local data segment. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->local_ds[0].vaddr = cl_get_physaddr( p_desc->p_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->local_ds[0].length = sizeof(ipoib_pkt_t) + 
sizeof(ib_grh_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+    /* Setup the local data segment. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->local_ds[0].vaddr = 
cl_get_physaddr( p_desc->p_buf );<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->local_ds[0].length = 
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->local_ds[0].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_pool_item = &p_desc->item;<o:p></o:p></P>
<P class=MsoNormal>+    *pp_pool_item = 
&p_desc->item;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return CL_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ALLOC 
);<o:p></o:p></P>
<P class=MsoNormal>+    return CL_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_dtor(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     cl_pool_item_t* 
const                  
p_pool_item,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*context )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   cl_pool_item_t* const       
p_pool_item,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t          
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_recv_desc_t   
*p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER(  IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER(  IPOIB_DBG_ALLOC 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( context );<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM( context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc = PARENT_STRUCT( p_pool_item, ipoib_recv_desc_t, item );<o:p></o:p></P>
<P class=MsoNormal>+    p_desc = PARENT_STRUCT( p_pool_item, 
ipoib_recv_desc_t, item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_desc->p_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_free( p_desc->p_buf );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_desc->p_buf )<o:p></o:p></P>
<P class=MsoNormal>+        cl_free( 
p_desc->p_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ALLOC 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t          
*p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc = (ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Reference the port object for the send. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_desc )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_ref( p_port, ref_get_recv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_recv_desc_t   
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    p_desc = 
(ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Reference the port object for the 
send. */<o:p></o:p></P>
<P class=MsoNormal>+    if( p_desc )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_ref( 
p_port, ref_get_recv );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_desc->local_ds[0].length ==<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return p_desc;<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_desc->local_ds[0].length ==<o:p></o:p></P>
<P 
class=MsoNormal>+            
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return p_desc;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //NDIS60<o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NET_BUFFER_LIST* 
const                            
p_net_buffer_list OPTIONAL )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></P>
<P class=MsoNormal>+ 
   IN              
NET_BUFFER_LIST* const      p_net_buffer_list OPTIONAL 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER                      
*p_buf = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
MDL                                                       
*p_mdl = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER(IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    NET_BUFFER      
*p_buf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
MDL             
*p_mdl = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_net_buffer_list )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_buf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_mdl = NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        p_buf = 
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( p_buf 
);<o:p></o:p></P>
<P class=MsoNormal>+        p_mdl = 
NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( p_mdl 
);<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Return the descriptor to its pools. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_put( &p_port->buf_mgr.recv_pool, &p_desc->item 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Return the descriptor to its pools. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_qpool_put( 
&p_port->buf_mgr.recv_pool, &p_desc->item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Dereference the port object since the receive is no longer 
outstanding.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_get_recv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Dereference the port object since 
the receive is no longer outstanding.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, ref_get_recv 
);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT(  IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
cl_qlist_t* 
const                                               
p_list )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
cl_qlist_t* const           
p_list )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
//IPOIB_ENTER(  IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_put_list( &p_port->buf_mgr.recv_pool, p_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
//IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    //IPOIB_ENTER(  IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_qpool_put_list( 
&p_port->buf_mgr.recv_pool, p_list );<o:p></o:p></P>
<P class=MsoNormal>+    //IPOIB_EXIT(  IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            p_desc 
)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST                                           
*p_net_buffer_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
MDL                                                                                       
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal>+    
NET_BUFFER_LIST         
*p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+    
MDL                     
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER(  IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER(  IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
&p_desc->buf.eth.pkt,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
p_desc->len );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to allocate MDL\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_mdl = 
NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P class=MsoNormal>+           
                 &p_desc->buf.eth.pkt,<o:p></o:p></P>
<P 
class=MsoNormal>+                            
p_desc->len );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_mdl )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to allocate MDL\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_port->buf_mgr.h_packet_pool,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
0,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
0,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
0,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
0);<o:p></o:p></P>
<P class=MsoNormal>+    p_net_buffer_list = 
NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_port->buf_mgr.h_packet_pool,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
0,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
0,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
0,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
0);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_net_buffer_list )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></P>
<P class=MsoNormal>+       
 NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P class=MsoNormal>+        return 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PORT_FROM_NBL( p_net_buffer_list ) = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_RECV_FROM_NBL( p_net_buffer_list ) = p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_net_buffer_list->SourceHandle = 
p_port->p_adapter->h_adapter;<o:p></o:p></P>
<P class=MsoNormal>+    
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PORT_FROM_NBL( p_net_buffer_list ) 
= p_port;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_RECV_FROM_NBL( p_net_buffer_list ) 
= p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    p_net_buffer_list->SourceHandle = 
p_port->p_adapter->h_adapter;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT(  IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -1720,54 +1726,54 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &p_port->recv_mgr.done_list );<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( 
&p_port->recv_mgr.done_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->recv_mgr.recv_NBL_array = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->recv_mgr.recv_NBL_array = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the NDIS_PACKET pointer array for indicating receives. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->recv_mgr.recv_NBL_array = (NET_BUFFER_LIST 
**)cl_malloc(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_port->recv_mgr.recv_NBL_array )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the NDIS_PACKET pointer array 
for indicating receives. */<o:p></o:p></P>
<P class=MsoNormal>+    p_port->recv_mgr.recv_NBL_array = 
(NET_BUFFER_LIST **)cl_malloc(<o:p></o:p></P>
<P class=MsoNormal>+        
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_port->recv_mgr.recv_NBL_array 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P class=MsoNormal>+           
 EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( cl_is_qlist_empty( &p_port->recv_mgr.done_list ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( !p_port->recv_mgr.depth );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( cl_is_qlist_empty( 
&p_port->recv_mgr.done_list ) );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( !p_port->recv_mgr.depth 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->recv_mgr.recv_NBL_array )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_free( p_port->recv_mgr.recv_NBL_array );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->recv_mgr.recv_NBL_array 
)<o:p></o:p></P>
<P class=MsoNormal>+        cl_free( 
p_port->recv_mgr.recv_NBL_array );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -1779,1449 +1785,1490 @@<o:p></o:p></P>
<P class=MsoNormal>  */<o:p></o:p></P>
<P class=MsoNormal> int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_repost(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t          *p_head 
= NULL, *p_tail = NULL, *p_next;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_recv_wr_t                     
*p_failed;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PostRecv );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_recv_desc_t   *p_head = 
NULL, *p_tail = NULL, *p_next;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_recv_wr_t        *p_failed;<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetRecv );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PostRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Port in invalid state.  Not reposting.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_repost );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->state != IB_QPS_RTS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Port in invalid state.  Not reposting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
0;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_repost 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Pull receives out of the pool and chain them up. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( GetRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_next = __buf_mgr_get_recv( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, GetRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_next )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Out of receive descriptors! recv queue depth 
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->recv_mgr.depth < 
p_port->p_adapter->params.rq_depth )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Pull receives 
out of the pool and chain them up. */<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
GetRecv );<o:p></o:p></P>
<P class=MsoNormal>+        p_next = 
__buf_mgr_get_recv( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, GetRecv );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_next 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Out of receive descriptors! recv queue depth 
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_tail )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_tail = p_next;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_next->wr.p_next = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_next->wr.p_next = &p_head->wr;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_tail 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_tail = p_next;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_next->wr.p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_next->wr.p_next = &p_head->wr;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_head = p_next;<o:p></o:p></P>
<P class=MsoNormal>+        p_head = 
p_next;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->recv_mgr.depth++;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->recv_mgr.depth++;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_head )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( PostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, PostRecv );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_head )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
PostRecv );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, PostRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("ip_post_recv returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* return the descriptors to the pool */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
while( p_failed )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_failed = p_failed->p_next;<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("ip_post_recv returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* return the descriptors to the pool */<o:p></o:p></P>
<P 
class=MsoNormal>+            
while( p_failed )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_failed = p_failed->p_next;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->recv_mgr.depth--;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->recv_mgr.depth--;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_repost );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return p_port->p_adapter->params.rq_low_watermark - 
p_port->recv_mgr.depth;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, ref_repost 
);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
p_port->p_adapter->params.rq_low_watermark - 
p_port->recv_mgr.depth;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline ULONG __free_received_NBL (<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN 
ipoib_port_t                 
*p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN NET_BUFFER_LIST     *p_net_buffer_lists<o:p></o:p></P>
<P 
class=MsoNormal>-              
) <o:p></o:p></P>
<P class=MsoNormal>+    IN ipoib_port_t     
*p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN NET_BUFFER_LIST  
*p_net_buffer_lists<o:p></o:p></P>
<P class=MsoNormal>+    ) <o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t          
*p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST                           
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
LONG                                                    
NBL_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_recv_desc_t   
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    NET_BUFFER_LIST     
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+  
  LONG                
NBL_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
for (cur_net_buffer_list = p_net_buffer_lists;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cur_net_buffer_list != NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
++NBL_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
next_net_buffer_list = 
NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    for (cur_net_buffer_list = 
p_net_buffer_lists;<o:p></o:p></P>
<P class=MsoNormal>+         
cur_net_buffer_list != NULL;<o:p></o:p></P>
<P class=MsoNormal>+         
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
++NBL_cnt;<o:p></o:p></P>
<P class=MsoNormal>+        
next_net_buffer_list = 
NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Get the port and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT(p_port == IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc = IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P class=MsoNormal>+        /* Get the port 
and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT(p_port 
== IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></P>
<P class=MsoNormal>+        p_desc = 
IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal> #if 0 //TODO CM flow<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
int32_t 
                                 
discarded;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
uint32_t                                               
NBL_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ib_api_status_t 
               
status = IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
int32_t             
discarded;<o:p></o:p></P>
<P class=MsoNormal>+    
        uint32_t            
NBL_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
ib_api_status_t     status = IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NDIS_BUFFER                    
*p_buf;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P 
class=MsoNormal>+            
NDIS_BUFFER     *p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Unchain the NDIS buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( p_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisFreeBuffer( p_buf );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Unchain the NDIS buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( p_buf );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisFreeBuffer( p_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t *)p_desc 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = endpt_cm_post_recv( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if(  status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Post Recv QP failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t *)p_desc 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = endpt_cm_post_recv( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if(  status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Post Recv QP failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+           
 return;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( ReturnPutRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NBL_cnt;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
ReturnPutRecv );<o:p></o:p></P>
<P class=MsoNormal>+     
   __buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list 
);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, ReturnPutRecv );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    return NBL_cnt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_return_net_buffer_list(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NDIS_HANDLE                                                                   
adapter_context,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NET_BUFFER_LIST                                                           
*p_net_buffer_lists,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ULONG                                                                                 
return_flags)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
NDIS_HANDLE                 
adapter_context,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
NET_BUFFER_LIST             
*p_net_buffer_lists,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ULONG                       
return_flags)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
int32_t                                                  
shortage;<o:p></o:p></P>
<P 
class=MsoNormal>-              
LONG                                                    
NBL_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ReturnPacket );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ReturnPutRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ReturnRepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ReturnPreparePkt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ReturnNdisIndicate );<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    
int32_t             
shortage;<o:p></o:p></P>
<P class=MsoNormal>+    
LONG                
NBL_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ReturnPacket 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ReturnPutRecv 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ReturnRepostRecv 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ReturnPreparePkt 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ReturnNdisIndicate 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( return_flags );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = ((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_net_buffer_lists );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( !p_port ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("return_NBL callback called when port pointer was already cleared\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM( return_flags 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_net_buffer_lists 
);<o:p></o:p></P>
<P class=MsoNormal>+    if ( !p_port ) {<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(p_port);<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+       
     ("return_NBL callback called when port pointer was 
already cleared\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( ReturnPacket );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
NBL_cnt = __free_received_NBL( p_port, p_net_buffer_lists );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( ReturnPacket 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    NBL_cnt = __free_received_NBL( p_port, 
p_net_buffer_lists );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
shutter_sub( &p_port->p_adapter->recv_shutter, -NBL_cnt 
);<o:p></o:p></P>
<P class=MsoNormal>+    shutter_sub( 
&p_port->p_adapter->recv_shutter, -NBL_cnt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Repost buffers to HW */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( ReturnRepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
shortage = __recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></P>
<P class=MsoNormal>+    /* Repost buffers to HW */<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( ReturnRepostRecv 
);<o:p></o:p></P>
<P class=MsoNormal>+    shortage = __recv_mgr_repost( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, ReturnRepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void 
* s_arg1 , void * s_arg2)<o:p></o:p></P>
<P class=MsoNormal>-{<o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
uint32_t                     
*p_recv_cnt<o:p></o:p></P>
<P class=MsoNormal>+    );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></P>
<P class=MsoNormal>+static void<o:p></o:p></P>
<P class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
DEVICE_OBJECT*              
p_dev_obj,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void*                       
context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t *p_port = ( ipoib_port_t* ) 
context;<o:p></o:p></P>
<P class=MsoNormal>+    int WorkToDo = true;<o:p></o:p></P>
<P class=MsoNormal>+    KIRQL irql;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t recv_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t total_recv_cnt = 
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__recv_cb(NULL, p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    while (WorkToDo && total_recv_cnt 
< 512) {<o:p></o:p></P>
<P class=MsoNormal>+        irql = 
KeRaiseIrqlToDpcLevel();<o:p></o:p></P>
<P class=MsoNormal>+        WorkToDo = 
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></P>
<P class=MsoNormal>+        
KeLowerIrql(irql);<o:p></o:p></P>
<P class=MsoNormal>+        total_recv_cnt += 
recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+    if (WorkToDo) {<o:p></o:p></P>
<P class=MsoNormal>+        IoQueueWorkItem( 
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, 
p_port);<o:p></o:p></P>
<P class=MsoNormal>+    
}        <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void<o:p></o:p></P>
<P class=MsoNormal>-__recv_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
ib_cq_handle_t                                                                
h_cq,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
uint32_t*                    
p_recv_cnt)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_wc_t                                                                
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_wc_t             
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></P>
<P 
class=MsoNormal>                
int32_t                                                  
NBL_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_t                                              
done_list, bad_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
size_t                                                    
i;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                 
recv_complete_flags = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
BOOLEAN                                                            
res;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_qlist_t          done_list, 
bad_list;<o:p></o:p></P>
<P class=MsoNormal>+    
size_t              
i;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG               
recv_complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
BOOLEAN             
res;<o:p></o:p></P>
<P class=MsoNormal>+    BOOLEAN WorkToDo =  
FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvCompBundle );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvCb );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PollRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( FilterRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( BuildNBLArray );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvNdisIndicate );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RearmRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PutRecvList );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvCompBundle 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvCb );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PollRecv );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RepostRecv 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( FilterRecv 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( BuildNBLArray 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvNdisIndicate 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RearmRecv );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PutRecvList 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_clr( RecvCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_clr( RecvCompBundle 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( RecvCb );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags, 
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags, 
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &done_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &bad_list 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &done_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &bad_list );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_recv_cb 
);<o:p></o:p></P>
<P class=MsoNormal>+    for( i = 0; i < MAX_RECV_WC; i++ 
)<o:p></o:p></P>
<P class=MsoNormal>+        wc[i].p_next = 
&wc[i + 1];<o:p></o:p></P>
<P class=MsoNormal>+    wc[MAX_RECV_WC - 1].p_next = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_recv_cb );<o:p></o:p></P>
<P 
class=MsoNormal>-              
for( i = 0; i < MAX_RECV_WC; i++ )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
wc[i].p_next = &wc[i + 1];<o:p></o:p></P>
<P 
class=MsoNormal>-              
wc[MAX_RECV_WC - 1].p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * We'll be accessing the endpoint 
map so take a reference<o:p></o:p></P>
<P class=MsoNormal>+     * on it to prevent 
modifications.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( &p_port->endpt_rdr 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* We'll be accessing the endpoint map so take a reference<o:p></o:p></P>
<P 
class=MsoNormal>-              
* on it to prevent modifications.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    do<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* If we get 
here, then the list of WCs is intact. */<o:p></o:p></P>
<P class=MsoNormal>+        p_free = 
wc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
do<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* If we get here, then the list of WCs is intact. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_free = wc;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
PollRecv );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, PollRecv );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( status 
== IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( PollRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, PollRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal>+        /* Look at the 
payload now and filter ARP and DHCP packets. */<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
FilterRecv );<o:p></o:p></P>
<P class=MsoNormal>+        recv_cnt += 
__recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, FilterRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Look at the payload now and filter ARP and DHCP packets. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( FilterRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );<o:p></o:p></P>
<P class=MsoNormal>+    } while( ( !p_free ) && ( 
recv_cnt < 128 )); //TODO restore back to 128<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
} while( ( !p_free ) && ( recv_cnt < 16 )); //TODO restore back to 
128<o:p></o:p></P>
<P class=MsoNormal>+    *p_recv_cnt = 
(uint32_t)recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* We're done looking at the endpoint 
map, release the reference. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_dec( &p_port->endpt_rdr 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* We're done looking at the endpoint map, release the reference. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_log( 
&p_port->p_adapter->perf, RecvCompBundle, recv_cnt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_log( &p_port->p_adapter->perf, RecvCompBundle, recv_cnt 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    /* Update our posted depth. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_port->recv_mgr.depth -= 
recv_cnt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Update our posted depth. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->recv_mgr.depth -= recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    /* Return any discarded receives to the 
pool */<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( PutRecvList 
);<o:p></o:p></P>
<P class=MsoNormal>+    __buf_mgr_put_recv_list( p_port, 
&bad_list );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, PutRecvList );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Return any discarded receives to the pool */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( PutRecvList );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__buf_mgr_put_recv_list( p_port, &bad_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, PutRecvList );<o:p></o:p></P>
<P class=MsoNormal>+    do<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        //int32_t 
cnt;<o:p></o:p></P>
<P class=MsoNormal>+        /* Repost ASAP so 
we don't starve the RQ. */<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
RepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+        shortage = 
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if( shortage > 
0 )<o:p></o:p></P>
<P class=MsoNormal>+        
{               
<o:p></o:p></P>
<P 
class=MsoNormal>+            
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
do<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//int32_t cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Repost ASAP so we don't starve the RQ. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( RepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
shortage = __recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( shortage > 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
BuildNBLArray );<o:p></o:p></P>
<P class=MsoNormal>+        /* Notify NDIS of 
any and all possible receive buffers. */<o:p></o:p></P>
<P class=MsoNormal>+        NBL_cnt = 
__recv_mgr_build_NBL_array(<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port, &done_list, &discarded);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, BuildNBLArray );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( BuildNBLArray );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Notify NDIS of any and all possible receive buffers. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NBL_cnt = __recv_mgr_build_NBL_array(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port, &done_list, &discarded);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, BuildNBLArray 
);<o:p></o:p></P>
<P class=MsoNormal>+        /* Only indicate 
receives if we actually had any. */<o:p></o:p></P>
<P class=MsoNormal>+        if( discarded 
&& shortage > 0 )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* We may have thrown away packets, and have a shortage */<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( RepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>+            
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Only indicate receives if we actually had any. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( discarded && shortage > 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* We may have thrown away packets, and have a shortage */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( RepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( !NBL_cnt ) 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !NBL_cnt ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
RecvNdisIndicate );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if (shortage 
<= 0) {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( RecvNdisIndicate );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (shortage <= 0) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
if (res) {<o:p></o:p></P>
<P 
class=MsoNormal>+                
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P 
class=MsoNormal>+                    
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
NBL_cnt,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
recv_complete_flags);<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else {<o:p></o:p></P>
<P 
class=MsoNormal>+                
__free_received_NBL (p_port, 
p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P 
class=MsoNormal>+            
// If shortage >0, we already set the status to 
NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></P>
<P 
class=MsoNormal>+            
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures 
immediately<o:p></o:p></P>
<P 
class=MsoNormal>+            
res = shutter_add( &p_port->p_adapter->recv_shutter, 1 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
if (res) {<o:p></o:p></P>
<P 
class=MsoNormal>+                
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P 
class=MsoNormal>+                    
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
NBL_cnt,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
recv_complete_flags);<o:p></o:p></P>
<P 
class=MsoNormal>+                
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if (res) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NBL_cnt,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
recv_complete_flags);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
__free_received_NBL (p_port, 
p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
// If shortage >0, we already set the status to 
NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures 
immediately<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
res = shutter_add( &p_port->p_adapter->recv_shutter, 1 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if (res) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NBL_cnt,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
recv_complete_flags);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, RecvNdisIndicate );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate 
);<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Cap the 
number of receives to put back to what we just indicated<o:p></o:p></P>
<P class=MsoNormal>+         * with 
NDIS_STATUS_RESOURCES.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        if( shortage > 
0 )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Cap the number of receives to put back to what we just 
indicated<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* with NDIS_STATUS_RESOURCES.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( shortage > 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Return all but the last packet to the pool. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>+            
//while( shortage-- > 1 )<o:p></o:p></P>
<P 
class=MsoNormal>+            
while ( NBL_cnt-- > 0)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
__buf_mgr_put_recv( p_port,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL( 
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Return all but the last packet to the pool. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//while( shortage-- > 1 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
while ( NBL_cnt-- > 0)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
__buf_mgr_put_recv( p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL( 
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Return the last packet as if NDIS returned it, so that we 
repost<o:p></o:p></P>
<P 
class=MsoNormal>+             
* and report any other pending receives.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
//ipoib_return_net_buffer_list( p_port, 
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Return the last packet as if NDIS returned it, so that we 
repost<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* and report any other pending receives.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//ipoib_return_net_buffer_list( p_port, 
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    } while( NBL_cnt );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
} while( NBL_cnt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    if (p_free ) {<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Rearm 
after filtering to prevent contention on the enpoint maps<o:p></o:p></P>
<P class=MsoNormal>+         * and 
eliminate the possibility of having a call to<o:p></o:p></P>
<P class=MsoNormal>+         * 
__endpt_mgr_insert find a duplicate.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+         
<o:p></o:p></P>
<P class=MsoNormal>+        ASSERT(WorkToDo 
== FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
RearmRecv );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, RearmRecv );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( status 
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if (p_free ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Rearm after filtering to prevent contention on the enpoint maps<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* and eliminate the possibility of having a call to<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* __endpt_mgr_insert find a duplicate.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( RearmRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_recv_cb );<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        // Please note 
the reference is still up<o:p></o:p></P>
<P class=MsoNormal>+        if (h_cq) 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, 
p_port);<o:p></o:p></P>
<P 
class=MsoNormal>+            
WorkToDo = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
WorkToDo = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// Please note the reference is still up<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return WorkToDo;<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static void<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb(<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    __recv_cb_internal(h_cq, cq_context, 
&recv_cnt);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_get_endpts(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t* 
const            
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_wc_t* 
const                                                 
p_wc,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_src,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_dst )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_wc_t* 
const              
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_src,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_dst )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mac_addr_t                                       
mac;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEndptByGid );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEndptByLid );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( EndptInsert );<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
mac_addr_t          
mac;<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEndptByGid 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEndptByLid 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( EndptInsert 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Setup our shortcut pointers based on whether GRH is valid. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_wc->recv.ud.recv_opt & IB_RECV_OPT_GRH_VALID )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Lookup the source endpoints based on GID. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( GetEndptByGid );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_src =<o:p></o:p></P>
<P class=MsoNormal>+    /* Setup our shortcut pointers based on 
whether GRH is valid. */<o:p></o:p></P>
<P class=MsoNormal>+    if( p_wc->recv.ud.recv_opt & 
IB_RECV_OPT_GRH_VALID )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Lookup the 
source endpoints based on GID. */<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal>+        *pp_src 
=<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid 
);<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid 
);<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid 
);<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid 
);<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Lookup the destination endpoint based on GID.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* This is used along with the packet filter to determine<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* whether to report this to NDIS.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( GetEndptByGid );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_dst =<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Lookup 
the destination endpoint based on GID.<o:p></o:p></P>
<P class=MsoNormal>+         * This is 
used along with the packet filter to determine<o:p></o:p></P>
<P class=MsoNormal>+         * whether 
to report this to NDIS.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal>+        *pp_dst 
=<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid 
);<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid 
);<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid 
);<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid 
);<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Create the source endpoint if it does not exist.  Note that 
we<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* can only do this for globally routed traffic since we need the<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* information from the GRH to generate the MAC.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !*pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = ipoib_mac_from_guid(<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Create 
the source endpoint if it does not exist.  Note that we<o:p></o:p></P>
<P class=MsoNormal>+         * can only 
do this for globally routed traffic since we need the<o:p></o:p></P>
<P class=MsoNormal>+         * 
information from the GRH to generate the MAC.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        if( !*pp_src 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = ipoib_mac_from_guid(<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->buf.ib.grh.src_gid.unicast.interface_id, 
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id, 
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->buf.ib.grh.src_gid.unicast.interface_id, 
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id, 
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+                
return;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Create the endpoint. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Create the endpoint. */<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src = ipoib_endpt_create( 
&p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( !*pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( EndptInsert );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("__endpt_mgr_insert returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Lookup the remote endpoint based on LID.  Note that only<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* unicast traffic can be LID routed.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( GetEndptByLid );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_src = __endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByLid 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_dst = p_port->p_local_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( *pp_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src = ipoib_endpt_create( 
&p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( !*pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
return;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( EndptInsert );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P class=MsoNormal>+        
    if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("__endpt_mgr_insert returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+                
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>+                
return;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Lookup 
the remote endpoint based on LID.  Note that only<o:p></o:p></P>
<P class=MsoNormal>+         * unicast 
traffic can be LID routed.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
GetEndptByLid );<o:p></o:p></P>
<P class=MsoNormal>+        *pp_src = 
__endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, GetEndptByLid );<o:p></o:p></P>
<P class=MsoNormal>+        *pp_dst = 
p_port->p_local_endpt;<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
*pp_dst );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( *pp_src && !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Update the QPN for the endpoint. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></P>
<P 
class=MsoNormal>-//                          
(*pp_src)->qpn = p_wc->recv.ud.remote_qp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( *pp_src && 
!ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) 
&&<o:p></o:p></P>
<P class=MsoNormal>+        (*pp_src)->qpn 
!= p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Update the QPN 
for the endpoint. */<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+//      (*pp_src)->qpn = 
p_wc->recv.ud.remote_qp;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( *pp_src && *pp_dst )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Recv:\n"<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( *pp_src && *pp_dst 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Recv:\n"<o:p></o:p></P>
<P 
class=MsoNormal>+            
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P 
class=MsoNormal>+            
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+  
          (*pp_dst 
)->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_filter(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_wc_t* 
const                                                 
p_done_wc_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_qlist_t* 
const                                               
p_done_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_qlist_t* 
const                                               
p_bad_list )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_wc_t* 
const              
p_done_wc_list,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         cl_qlist_t* 
const           
p_done_list,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         cl_qlist_t* 
const           p_bad_list 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t                          
*p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_wc_t                                                                                
*p_wc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_pkt_t                                                        
*p_ipoib;<o:p></o:p></P>
<P 
class=MsoNormal>-              
eth_pkt_t                                                           
*p_eth;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t                                   
*p_src, *p_dst;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                                               
len;<o:p></o:p></P>
<P 
class=MsoNormal>-              
int32_t                                                                  
recv_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetRecvEndpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvGen );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvTcp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RecvArp );<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_recv_desc_t       *p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_wc_t                 
*p_wc;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_pkt_t             
*p_ipoib;<o:p></o:p></P>
<P class=MsoNormal>+    
eth_pkt_t               
*p_eth;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t           
*p_src, *p_dst;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_api_status_t         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t                
len;<o:p></o:p></P>
<P class=MsoNormal>+    
int32_t                 
recv_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetRecvEndpts 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvGen );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvTcp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvUdp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvDhcp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RecvArp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
for( p_wc = p_done_wc_list; p_wc; p_wc = p_wc->p_next )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc = (ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
recv_cnt++;<o:p></o:p></P>
<P class=MsoNormal>+    for( p_wc = p_done_wc_list; p_wc; p_wc = 
p_wc->p_next )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+        p_desc = 
(ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P class=MsoNormal>+       
 recv_cnt++;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Failed completion %s  (vendor specific %#x)\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status 
),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Flushed completion %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Dereference the port object on behalf of the failed receive. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
continue;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P class=MsoNormal>+    
            IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Failed completion %s  (vendor specific %#x)\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status 
),<o:p></o:p></P>
<P 
class=MsoNormal>+                    
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P 
class=MsoNormal>+                
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Flushed completion %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Dereference the port object on behalf of the failed receive. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></P>
<P 
class=MsoNormal>+            
continue;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
len = p_wc->length - sizeof(ib_grh_t);<o:p></o:p></P>
<P class=MsoNormal>+        len = 
p_wc->length - sizeof(ib_grh_t);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( len < sizeof(ipoib_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Received ETH packet < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
continue;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( len < 
sizeof(ipoib_hdr_t) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Received ETH packet < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P 
class=MsoNormal>+            
continue;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if((len - sizeof(ipoib_hdr_t)) > 
p_port->p_adapter->params.payload_mtu)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
continue;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Successful completion.  Get the receive information. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt & 
IB_RECV_OPT_CSUM_MASK ) >> 8 );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->len = len + 14 - 4 ;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( GetRecvEndpts );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts 
);<o:p></o:p></P>
<P class=MsoNormal>+        if((len - 
sizeof(ipoib_hdr_t)) > 
p_port->p_adapter->params.payload_mtu)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P 
class=MsoNormal>+            
continue;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /* Successful 
completion.  Get the receive information. */<o:p></o:p></P>
<P class=MsoNormal>+      
  p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt & 
IB_RECV_OPT_CSUM_MASK ) >> 8 );<o:p></o:p></P>
<P class=MsoNormal>+        p_desc->len = 
len + 14 - 4 ;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
GetRecvEndpts );<o:p></o:p></P>
<P class=MsoNormal>+        
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst 
);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, GetRecvEndpts );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ipoib = &p_desc->buf.ib.pkt;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_eth = &p_desc->buf.eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ipoib = &p_desc->p_buf->ib.pkt;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_eth = &p_desc->p_buf->eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>-#endif /*IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        p_ipoib = 
&p_desc->buf.ib.pkt;<o:p></o:p></P>
<P class=MsoNormal>+        p_eth = 
&p_desc->buf.eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+        p_ipoib = 
&p_desc->p_buf->ib.pkt;<o:p></o:p></P>
<P class=MsoNormal>+        p_eth = 
&p_desc->p_buf->eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>+#endif  /*IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_src )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
* "This is not the packet you're looking for" - don't update<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
* receive statistics, the packet never happened.<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
continue;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( p_src 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/*<o:p></o:p></P>
<P 
class=MsoNormal>+                 
* "This is not the packet you're looking for" - don't update<o:p></o:p></P>
<P 
class=MsoNormal>+                 
* receive statistics, the packet never happened.<o:p></o:p></P>
<P 
class=MsoNormal>+                 
*/<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></P>
<P class=MsoNormal>+  
              continue;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
switch( p_ipoib->hdr.type )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Received IP packet < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P class=MsoNormal>+        switch( 
p_ipoib->hdr.type )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+        case 
ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Received IP packet < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></P>
<P 
class=MsoNormal>-              
                                                
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_perf_start( RecvTcp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_perf_start( RecvTcp );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* First packet of a UDP transfer. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( len <<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Received UDP packet < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* First packet of a UDP transfer. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( len <<o:p></o:p></P>
<P 
class=MsoNormal>+                
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+             
       ("Received UDP packet < min 
size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Check if DHCP conversion is required. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_PROXY_SERVER 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_ipoib->type.ip.prot.udp.hdr.src_port == 
DHCP_PORT_PROXY_SERVER))<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("Received DHCP < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
// If there are IP options in this message, we are in trouble in any 
case<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
break;                                                                   
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_perf_start( RecvDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_perf_start( RecvUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_perf_stop( &p_port->p_adapter->perf, RecvUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Check if DHCP conversion is required. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER 
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P 
class=MsoNormal>+                
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT 
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></P>
<P class=MsoNormal>+    
            (p_ipoib->type.ip.prot.udp.hdr.dst_port 
== DHCP_PORT_PROXY_SERVER &&<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P 
class=MsoNormal>+                
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT 
&&<o:p></o:p></P>
<P 
class=MsoNormal>+              
  p_ipoib->type.ip.prot.udp.hdr.src_port == 
DHCP_PORT_PROXY_SERVER))<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></P>
<P 
class=MsoNormal>+                    
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("Received DHCP < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
break;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></P>
<P 
class=MsoNormal>+                    
// If there are IP options in this message, we are in trouble in any 
case<o:p></o:p></P>
<P 
class=MsoNormal>+                    
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
break;                  
<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_perf_start( RecvDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_perf_start( RecvUdp );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P class=MsoNormal>+        
        cl_perf_stop( 
&p_port->p_adapter->perf, RecvUdp );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
case ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Received ARP < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( RecvArp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &p_port->p_adapter->perf, RecvArp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        case 
ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+      
              ("Received 
ARP < min size\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( RecvArp );<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst 
);<o:p></o:p></P>
<P class=MsoNormal>+   
         cl_perf_stop( 
&p_port->p_adapter->perf, RecvArp );<o:p></o:p></P>
<P 
class=MsoNormal>+            
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( RecvGen );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        
default:<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( RecvGen );<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Update stats. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Dereference the port object on behalf of the failed receive. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ip_stat_sel_t                     
    ip_stat;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->len =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
                                
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_dst->h_mcast)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 );  
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Update stats. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Dereference the port object on behalf of the failed receive. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ip_stat_sel_t           
ip_stat;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->len =<o:p></o:p></P>
<P 
class=MsoNormal>+                
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_dst->h_mcast)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
else<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></P>
<P 
class=MsoNormal>+                
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 );  
<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return recv_cnt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_gen(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        
p_src,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_dst 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_src || !p_dst )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received packet with no matching endpoints.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_NOT_DONE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_src || !p_dst )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received packet with no matching endpoints.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Fill in the ethernet header.  Note that doing so will 
overwrite<o:p></o:p></P>
<P 
class=MsoNormal>-              
* the IPoIB header, so start by moving the information from the 
IPoIB<o:p></o:p></P>
<P 
class=MsoNormal>-              
* header.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_eth->hdr.type = p_ipoib->hdr.type;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_eth->hdr.src = p_src->mac;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_eth->hdr.dst = p_dst->mac;<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Fill in the ethernet 
header.  Note that doing so will overwrite<o:p></o:p></P>
<P class=MsoNormal>+     * the IPoIB header, so start by 
moving the information from the IPoIB<o:p></o:p></P>
<P class=MsoNormal>+     * header.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    p_eth->hdr.type = 
p_ipoib->hdr.type;<o:p></o:p></P>
<P class=MsoNormal>+    p_eth->hdr.src = 
p_src->mac;<o:p></o:p></P>
<P class=MsoNormal>+    p_eth->hdr.dst = 
p_dst->mac;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( p_eth->hdr.dst.addr[0] == 1 && <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_eth->hdr.dst.addr[2] == 0x5E)  <o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (p_dst->h_mcast)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_dst->is_in_use = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    if ( p_eth->hdr.dst.addr[0] == 1 
&& <o:p></o:p></P>
<P class=MsoNormal>+         
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P class=MsoNormal>+         
p_eth->hdr.dst.addr[2] == 0x5E)  <o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></P>
<P class=MsoNormal>+        
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if (p_dst->h_mcast)<o:p></o:p></P>
<P class=MsoNormal>+        
p_dst->is_in_use = TRUE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_dhcp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
    const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        
p_src,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_dst 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
dhcp_pkt_t                                        
*p_dhcp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                                 
*p_option;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                                 
*p_cid = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                                 
msg = 0;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
dhcp_pkt_t          
*p_dhcp;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t             
*p_option;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t             
*p_cid = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t             
msg = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Create the ethernet header. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Create the ethernet header. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = __recv_gen( p_ipoib, p_eth, 
p_src, p_dst );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Fixup the payload. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_dhcp = &p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_dhcp->op != DHCP_REQUEST && p_dhcp->op != DHCP_REPLY 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Invalid DHCP op code.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Fixup the payload. */<o:p></o:p></P>
<P class=MsoNormal>+    p_dhcp = 
&p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></P>
<P class=MsoNormal>+    if( p_dhcp->op != DHCP_REQUEST 
&& p_dhcp->op != DHCP_REPLY )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Invalid DHCP op code.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Find the client identifier option, making sure to skip<o:p></o:p></P>
<P 
class=MsoNormal>-              
* the "magic cookie".<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_option = &p_dhcp->options[0];<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( *(uint32_t *)p_option != DHCP_COOKIE )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("DHCP cookie corrupted.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_PARAMETER;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Find the client identifier 
option, making sure to skip<o:p></o:p></P>
<P class=MsoNormal>+     * the "magic 
cookie".<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    p_option = 
&p_dhcp->options[0];<o:p></o:p></P>
<P class=MsoNormal>+    if ( *(uint32_t *)p_option != DHCP_COOKIE 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("DHCP cookie corrupted.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_option = &p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( *p_option != DHCP_OPT_END && p_option < 
&p_dhcp->options[312] )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
switch( *p_option )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case DHCP_OPT_PAD:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_option++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    p_option = 
&p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></P>
<P class=MsoNormal>+    while( *p_option != DHCP_OPT_END 
&& p_option < &p_dhcp->options[312] )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        switch( *p_option 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+        case 
DHCP_OPT_PAD:<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_option++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
case DHCP_OPT_MSG:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
msg = p_option[2];<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_option += 3;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        case 
DHCP_OPT_MSG:<o:p></o:p></P>
<P 
class=MsoNormal>+            
msg = p_option[2];<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_option += 3;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
case DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_cid = p_option;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal>+        case 
DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_cid = p_option;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* All other options have a length byte following the option code.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Offset by the length to get to the next option.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
default:<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* All other options have a length byte following the option code.<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Offset by the length to get to the next option.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( msg )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* message from client */<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPDISCOVER:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPREQUEST:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPDECLINE:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPRELEASE:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPINFORM:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_cid )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to find required Client-identifier option.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Invalid hardware address type.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* message from DHCP server */<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPOFFER:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPACK:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPNAK:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    switch( msg )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    /* message from client */<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPDISCOVER:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPREQUEST:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPDECLINE:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPRELEASE:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPINFORM:<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_cid 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to find required Client-identifier option.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Invalid hardware address type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+          
  return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    /* message from DHCP server 
*/<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPOFFER:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPACK:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPNAK:<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Invalide message type.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_PARAMETER;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_eth->type.ip.prot.udp.hdr.chksum = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_dhcp->htype = DHCP_HW_TYPE_ETH;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_dhcp->hlen = HW_ADDR_LEN;<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Invalide message type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_eth->type.ip.prot.udp.hdr.chksum = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    p_dhcp->htype = 
DHCP_HW_TYPE_ETH;<o:p></o:p></P>
<P class=MsoNormal>+    p_dhcp->hlen = 
HW_ADDR_LEN;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_cid ) /* from client */<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Validate that the length and type of the option is as required. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("DHCP CID received is:"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
for (int i=0; i < coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
                
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_cid[1] != coIPoIB_CID_Len )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Client-identifier length is not equal to %d as required.\n",coIPoIB_CID_Len) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_cid[2] != coIPoIB_HwTypeIB)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Client-identifier type is %d <> %d and wrong \n", p_cid[2], 
coIPoIB_HwTypeIB) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Copy the GID value from the option so that we can make aligned<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* accesses to the contents.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Recover CID to standard type.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_cid[1] =  sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_cid[2] =  DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//Copy the GUID to the 3-d byte of CID<o:p></o:p></P>
<P 
class=MsoNormal>-                              
RtlMoveMemory( &p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof 
(ib_net64_t)], sizeof (ib_net64_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// Clear the rest<o:p></o:p></P>
<P 
class=MsoNormal>-                              
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof 
(ib_net64_t), 0);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_cid ) /* from client 
*/<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Validate that 
the length and type of the option is as required. */<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("DHCP CID received is:"));<o:p></o:p></P>
<P class=MsoNormal>+        for (int i=0; i 
< coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if( p_cid[1] != 
coIPoIB_CID_Len )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Client-identifier length is not equal to %d as required.\n",coIPoIB_CID_Len) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if( p_cid[2] != 
coIPoIB_HwTypeIB)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Client-identifier type is %d <> %d and wrong \n", p_cid[2], 
coIPoIB_HwTypeIB) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Copy the 
GID value from the option so that we can make aligned<o:p></o:p></P>
<P class=MsoNormal>+         * accesses 
to the contents.<o:p></o:p></P>
<P class=MsoNormal>+         * Recover 
CID to standard type.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        p_cid[1] =  
sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></P>
<P class=MsoNormal>+        p_cid[2] =  
DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></P>
<P class=MsoNormal>+        //Copy the GUID 
to the 3-d byte of CID<o:p></o:p></P>
<P class=MsoNormal>+        RtlMoveMemory( 
&p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof (ib_net64_t)], sizeof 
(ib_net64_t) );<o:p></o:p></P>
<P class=MsoNormal>+        // Clear the 
rest<o:p></o:p></P>
<P class=MsoNormal>+        
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof 
(ib_net64_t), 0);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
RtlCopyMemory( p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
RtlFillMemory( &p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
       ( sizeof(p_dhcp->chaddr) - 
sizeof(p_src->mac) ), 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+        RtlCopyMemory( 
p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );<o:p></o:p></P>
<P class=MsoNormal>+        RtlFillMemory( 
&p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></P>
<P 
class=MsoNormal>+                   
( sizeof(p_dhcp->chaddr) - sizeof(p_src->mac) ), 0 );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_arp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_wc_t* 
const                                                 
p_wc,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t** 
const                 
pp_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_wc_t* 
const              
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+ 
   IN              
ipoib_endpt_t** const       pp_src,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_dst 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
arp_pkt_t                                                            
*p_arp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
const ipoib_arp_pkt_t   *p_ib_arp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_gid_t                                                               
gid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mac_addr_t                                                       
mac;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_hw_addr_t                                             
null_hw = {0};<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                                                 
cm_capable = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_api_status_t         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
arp_pkt_t               
*p_arp;<o:p></o:p></P>
<P class=MsoNormal>+    const ipoib_arp_pkt_t   
*p_ib_arp;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_gid_t                
gid;<o:p></o:p></P>
<P class=MsoNormal>+    
mac_addr_t              
mac;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_hw_addr_t         null_hw = 
{0};<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t                 
cm_capable = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_dst )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Unknown destination endpoint\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_dst )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Unknown destination endpoint\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp = &p_ipoib->type.arp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_arp = &p_eth->type.arp;<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp = 
&p_ipoib->type.arp;<o:p></o:p></P>
<P class=MsoNormal>+    p_arp = 
&p_eth->type.arp;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_ib_arp->hw_type != ARP_HW_TYPE_IB )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ARP hardware type is not IB\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_ib_arp->hw_type != 
ARP_HW_TYPE_IB )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ARP hardware type is not IB\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_ib_arp->hw_size != 
sizeof(ipoib_hw_addr_t) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ARP protocal type not IP\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_ib_arp->prot_type != 
ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+     
       ("ARP protocal type not IP\n") 
);<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cm_capable = ipoib_addr_get_flags( &p_ib_arp->src_hw );<o:p></o:p></P>
<P class=MsoNormal>+    cm_capable = ipoib_addr_get_flags( 
&p_ib_arp->src_hw );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* If we don't have a source, lookup the endpoint specified in the 
payload.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !*pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid 
);<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * If we don't have a source, lookup 
the endpoint specified in the payload.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    if( !*pp_src )<o:p></o:p></P>
<P class=MsoNormal>+        *pp_src = 
__endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* If the endpoint exists for the GID, make sure<o:p></o:p></P>
<P 
class=MsoNormal>-              
* the dlid and qpn match the arp.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( *pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( cl_memcmp( &(*pp_src)->dgid, 
&p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
sizeof(ib_gid_t) ) )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* GIDs for the endpoint are different.  The ARP must<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* have been proxied.  Dereference it.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( (*pp_src)->dlid &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if ( ! ((*pp_src)->dlid)) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_wc->recv.ud.remote_qp !=  ipoib_addr_get_qpn( &p_ib_arp->src_hw 
) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * If the endpoint exists for the 
GID, make sure<o:p></o:p></P>
<P class=MsoNormal>+     * the dlid and qpn match the 
arp.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    if( *pp_src )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( cl_memcmp( 
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P 
class=MsoNormal>+            
sizeof(ib_gid_t) ) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* GIDs for the endpoint are different.  The ARP must<o:p></o:p></P>
<P 
class=MsoNormal>+             
* have been proxied.  Dereference it.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( 
(*pp_src)->dlid &&<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if ( ! 
((*pp_src)->dlid)) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( 
ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) 
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P class=MsoNormal>+       
         /* Out of date!  
Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>+                
*pp_src = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( 
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+ 
           /* Out of 
date!  Destroy the endpoint and replace it. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Do we need to create an endpoint for this GID? */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !*pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Copy the src GID to allow aligned access */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = ipoib_mac_from_guid( gid.unicast.interface_id, 
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (status == IB_INVALID_GUID_MASK)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Invalid GUID mask received, rejecting it") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX, 
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Create the endpoint.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Do we need to create an endpoint for 
this GID? */<o:p></o:p></P>
<P class=MsoNormal>+    if( !*pp_src )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Copy the src 
GID to allow aligned access */<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( 
&gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
ipoib_mac_from_guid( gid.unicast.interface_id, 
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>+        if (status == 
IB_INVALID_GUID_MASK)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Invalid GUID mask received, rejecting it") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX, 
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( status 
!= IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Create 
the endpoint.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        *pp_src = 
ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !*pp_src )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( !*pp_src 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("__endpt_mgr_insert return %s \n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("__endpt_mgr_insert return %s \n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></P>
<P class=MsoNormal>+    (*pp_src)->cm_flag = 
cm_capable;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( !cl_memcmp(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) 
||<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( !cl_memcmp(<o:p></o:p></P>
<P class=MsoNormal>+       
 &(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ) 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( ipoib_is_voltaire_router_gid( 
&(*pp_src)->dgid ) ||<o:p></o:p></P>
<P class=MsoNormal>+        (*pp_src)->qpn 
== ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ib_arp->op == ARP_OP_REQ &&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cm_capable == IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* if we've got ARP request and RC flag is set, <o:p></o:p></P>
<P 
class=MsoNormal>-                              
save SID for connect REQ to be sent in ARP reply<o:p></o:p></P>
<P 
class=MsoNormal>-                              
when requestor's path get resolved */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_addr_set_sid( <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&(*pp_src)->conn.service_id,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P class=MsoNormal>+        p_ib_arp->op 
== ARP_OP_REQ &&<o:p></o:p></P>
<P class=MsoNormal>+        cm_capable == 
IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* if we've got 
ARP request and RC flag is set, <o:p></o:p></P>
<P class=MsoNormal>+        save SID for 
connect REQ to be sent in ARP reply<o:p></o:p></P>
<P class=MsoNormal>+        when requestor's 
path get resolved */<o:p></o:p></P>
<P class=MsoNormal>+        if( 
endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_addr_set_sid( <o:p></o:p></P>
<P 
class=MsoNormal>+                
&(*pp_src)->conn.service_id,<o:p></o:p></P>
<P 
class=MsoNormal>+                
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> #if 0 //DBG<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC: 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC: 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></P>
<P 
class=MsoNormal>+            
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></P>
<P 
class=MsoNormal>+            
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Now swizzle the data. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_arp->hw_type = ARP_HW_TYPE_ETH;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_arp->hw_size = sizeof(mac_addr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_arp->src_hw = (*pp_src)->mac;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_arp->src_ip = p_ib_arp->src_ip;<o:p></o:p></P>
<P class=MsoNormal>+    /* Now swizzle the data. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_arp->hw_type = 
ARP_HW_TYPE_ETH;<o:p></o:p></P>
<P class=MsoNormal>+    p_arp->hw_size = 
sizeof(mac_addr_t);<o:p></o:p></P>
<P class=MsoNormal>+    p_arp->src_hw = 
(*pp_src)->mac;<o:p></o:p></P>
<P class=MsoNormal>+    p_arp->src_ip = 
p_ib_arp->src_ip;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_memcmp( &p_ib_arp->dst_hw, &null_hw, sizeof(ipoib_hw_addr_t) ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( cl_memcmp( &p_dst->dgid, &p_ib_arp->dst_hw.gid, 
sizeof(ib_gid_t) ) )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* We received bcast ARP packet that means<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* remote port lets everyone know it was changed IP/MAC<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* or just activated<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_memcmp( &p_ib_arp->dst_hw, 
&null_hw, sizeof(ipoib_hw_addr_t) ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( cl_memcmp( 
&p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t) ) 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* We received bcast ARP packet that means<o:p></o:p></P>
<P class=MsoNormal>+      
       * remote port lets everyone know it 
was changed IP/MAC<o:p></o:p></P>
<P 
class=MsoNormal>+             
* or just activated<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Guy: TODO: Check why this check fails in case of Voltaire IPR 
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Guy: TODO: Check why this check fails in case of Voltaire IPR 
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("ARP: is not ARP MCAST\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) 
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                 
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+  
                  ("ARP: 
is not ARP MCAST\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
return IB_INVALID_SETTING;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* we don't care what receiver ip addr is,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* as long as OS' ARP table is global  ???<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_arp->dst_ip = (net32_t)0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else /* we've got reply to our ARP request */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_arp->dst_hw = p_dst->mac;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else /* we got ARP reqeust */<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memclr( &p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* we don't care what receiver ip addr is,<o:p></o:p></P>
<P 
class=MsoNormal>+             
* as long as OS' ARP table is global  ???<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_arp->dst_ip = (net32_t)0;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else /* we've got 
reply to our ARP request */<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_arp->dst_hw = p_dst->mac;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) 
);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else /* we got ARP reqeust 
*/<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_memclr( 
&p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+        p_arp->dst_ip 
= p_ib_arp->dst_ip;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Create the ethernet header.  Note that this is done last so 
that<o:p></o:p></P>
<P 
class=MsoNormal>-              
* we have a chance to create a new endpoint.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Create the ethernet header.  
Note that this is done last so that<o:p></o:p></P>
<P class=MsoNormal>+     * we have a chance to create a new 
endpoint.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    status = __recv_gen( p_ipoib, p_eth, 
*pp_src, p_dst );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_recv_desc_t*        
const     p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
NET_BUFFER_LIST** 
const                          
pp_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_recv_desc_t*  const   p_desc,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         NET_BUFFER_LIST** 
const     pp_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                                                                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                                                                                               
pkt_filter;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//NDIS60<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO      
chksum;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//NDIS_TCP_IP_CHECKSUM_PACKET_INFO        
chksum;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS                         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t                            
pkt_filter;<o:p></o:p></P>
<P class=MsoNormal>+    //NDIS60<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO   chksum;<o:p></o:p></P>
<P class=MsoNormal>+    //NDIS_TCP_IP_CHECKSUM_PACKET_INFO  
chksum;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetNdisPkt );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetNdisPkt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
pkt_filter = p_port->p_adapter->packet_filter;<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Check the packet filter. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( p_desc->type )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case PKT_TYPE_UCAST:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* OK to report. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
case PKT_TYPE_BCAST:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* OK to report. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received BCAST PKT.\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
case PKT_TYPE_MCAST:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* OK to report. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    pkt_filter = 
p_port->p_adapter->packet_filter;<o:p></o:p></P>
<P class=MsoNormal>+    /* Check the packet filter. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    switch( p_desc->type )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+    case PKT_TYPE_UCAST:<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if( pkt_filter 
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P 
class=MsoNormal>+            
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></P>
<P 
class=MsoNormal>+            
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></P>
<P 
class=MsoNormal>+            
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* OK to report. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    case PKT_TYPE_BCAST:<o:p></o:p></P>
<P class=MsoNormal>+        if( pkt_filter 
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P 
class=MsoNormal>+            
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* OK to report. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received BCAST PKT.\n"));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+ 
       break;<o:p></o:p></P>
<P class=MsoNormal>+    case PKT_TYPE_MCAST:<o:p></o:p></P>
<P class=MsoNormal>+        if( pkt_filter 
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P 
class=MsoNormal>+            
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></P>
<P 
class=MsoNormal>+            
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* OK to report. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Return the receive descriptor to the pool. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Packet filter doesn't match receive.  Dropping.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Return IB_NOT_DONE since the packet has been completed,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* but has not consumed an array entry.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_NOT_DONE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Return the 
receive descriptor to the pool. */<o:p></o:p></P>
<P class=MsoNormal>+        
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Packet filter doesn't match receive.  Dropping.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Return 
IB_NOT_DONE since the packet has been completed,<o:p></o:p></P>
<P class=MsoNormal>+         * but has 
not consumed an array entry.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( GetNdisPkt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_net_buffer_list = __buf_mgr_get_NBL( p_port, p_desc );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !*pp_net_buffer_list )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( GetNdisPkt 
);<o:p></o:p></P>
<P class=MsoNormal>+    *pp_net_buffer_list = __buf_mgr_get_NBL( 
p_port, p_desc );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></P>
<P class=MsoNormal>+    if( !*pp_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
chksum.Value = 0;<o:p></o:p></P>
<P class=MsoNormal>+    chksum.Value = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PNET_BUFFER NetBuffer = 
NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_DATA_LENGTH(NetBuffer) = p_desc->len;<o:p></o:p></P>
<P class=MsoNormal>+    PNET_BUFFER NetBuffer = 
NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+    NET_BUFFER_DATA_LENGTH(NetBuffer) = 
p_desc->len;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
  default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
  case CSUM_DISABLED:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = 
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
  case CSUM_ENABLED:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Get the checksums directly from packet information. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* In this case, no one of cheksum's cat get false value */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* If hardware checksum failed or wasn't calculated, NDIS will recalculate it 
again */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) 
=<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
  case CSUM_BYPASS:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Flag the checksums as having been calculated. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
chksum.Receive.UdpChecksumSucceeded = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) 
=<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    switch( 
p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+      default:<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( FALSE 
);<o:p></o:p></P>
<P class=MsoNormal>+      case 
CSUM_DISABLED:<o:p></o:p></P>
<P class=MsoNormal>+        
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = 
<o:p></o:p></P>
<P class=MsoNormal>+        
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+      case 
CSUM_ENABLED:<o:p></o:p></P>
<P class=MsoNormal>+        /* Get the 
checksums directly from packet information. */<o:p></o:p></P>
<P class=MsoNormal>+        /* In this case, 
no one of cheksum's cat get false value */<o:p></o:p></P>
<P class=MsoNormal>+        /* If hardware 
checksum failed or wasn't calculated, NDIS will recalculate it again 
*/<o:p></o:p></P>
<P class=MsoNormal>+    
    NET_BUFFER_LIST_INFO(*pp_net_buffer_list, 
TcpIpChecksumNetBufferListInfo) =<o:p></o:p></P>
<P 
class=MsoNormal>+            
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+      case 
CSUM_BYPASS:<o:p></o:p></P>
<P class=MsoNormal>+        /* Flag the 
checksums as having been calculated. */<o:p></o:p></P>
<P class=MsoNormal>+        
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></P>
<P class=MsoNormal>+        
chksum.Receive.UdpChecksumSucceeded = <o:p></o:p></P>
<P class=MsoNormal>+        
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) 
=<o:p></o:p></P>
<P class=MsoNormal>+        
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static uint32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
cl_qlist_t*     
                                      
p_done_list OPTIONAL,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
int32_t* 
const                                                   
p_discarded)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         
cl_qlist_t*                 
p_done_list OPTIONAL,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         int32_t* 
const              
p_discarded)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_list_item_t                                    
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_recv_desc_t                          
*p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                                               
i = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PreparePkt );<o:p></o:p></P>
<P class=MsoNormal>+    
cl_list_item_t          
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_recv_desc_t       *p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t                
i = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_api_status_t         
status;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PreparePkt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*p_discarded = 0;<o:p></o:p></P>
<P class=MsoNormal>+    *p_discarded = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Move any existing receives to the head of p_done_list to preserve ordering. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( p_done_list ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_done_list = &p_port->recv_mgr.done_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_item != cl_qlist_end( p_done_list ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc = (ipoib_recv_desc_t*)p_item;<o:p></o:p></P>
<P class=MsoNormal>+    /* Move any existing receives to the head 
of p_done_list to preserve ordering. */<o:p></o:p></P>
<P class=MsoNormal>+    if ( p_done_list ) {<o:p></o:p></P>
<P class=MsoNormal>+        
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        p_done_list = 
&p_port->recv_mgr.done_list;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qlist_remove_head( 
p_done_list );<o:p></o:p></P>
<P class=MsoNormal>+    while( p_item != cl_qlist_end( 
p_done_list ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_desc = 
(ipoib_recv_desc_t*)p_item;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( PreparePkt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __recv_mgr_prepare_NBL( p_port, p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, PreparePkt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status == IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
PreparePkt );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__recv_mgr_prepare_NBL( p_port, p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, PreparePkt );<o:p></o:p></P>
<P class=MsoNormal>+        if( status == 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if (i) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
// Link NBLs together<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) = 
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
i++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( status == IB_NOT_DONE )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(*p_discarded)++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Put all completed receives on the port's done list. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if (i) {<o:p></o:p></P>
<P 
class=MsoNormal>+                
// Link NBLs together<o:p></o:p></P>
<P 
class=MsoNormal>+                
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) = 
<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
i++;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( status 
== IB_NOT_DONE )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
(*p_discarded)++;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+      
  else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Put all completed receives on the port's done list. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
} else {<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
cl_qlist_remove_head( p_done_list );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return i;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV 
);<o:p></o:p></P>
<P class=MsoNormal>+    return i;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -3234,180 +3281,180 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->send_mgr.depth = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_construct( &p_port->send_mgr.send_pool );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_desc = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    p_port->send_mgr.depth = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( 
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+    cl_qpool_construct( 
&p_port->send_mgr.send_pool );<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_desc = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status_t                          
cl_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER(IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    cl_status_t     
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
static const size_t cPoolDeltaSize(1024);<o:p></o:p></P>
<P 
class=MsoNormal>-              
static const ULONG         
MaxNumBuffers(16384);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the pool for async NETBUF flow (process_sg_list) */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_qpool_init( &p_port->send_mgr.sg_pool,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
MaxNumBuffers,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
0, cPoolDeltaSize, sizeof(cl_pool_item_t) + 
p_port->p_adapter->sg_list_size, NULL, NULL, p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO 
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return  IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    static const size_t 
cPoolDeltaSize(1024);<o:p></o:p></P>
<P class=MsoNormal>+    static const ULONG  
MaxNumBuffers(16384);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the pool for async NETBUF 
flow (process_sg_list) */<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_qpool_init( 
&p_port->send_mgr.sg_pool,<o:p></o:p></P>
<P class=MsoNormal>+        
MaxNumBuffers,<o:p></o:p></P>
<P class=MsoNormal>+        0, 
cPoolDeltaSize, sizeof(cl_pool_item_t) + p_port->p_adapter->sg_list_size, 
NULL, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO 
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        return  
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_qpool_init( &p_port->send_mgr.send_pool,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
MaxNumBuffers,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
0, cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO 
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                              
                
cl_status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = cl_qpool_init( 
&p_port->send_mgr.send_pool,<o:p></o:p></P>
<P class=MsoNormal>+        
MaxNumBuffers,<o:p></o:p></P>
<P class=MsoNormal>+        0, 
cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO 
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+        
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//This send descriptor can't be allocated on the stack because of boundary 
violation !!!<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_desc =  <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof 
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (!p_port->p_desc) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO 
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Allocation of  send descriptor failed\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    //This send descriptor can't be allocated 
on the stack because of boundary violation !!!<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_desc =  <o:p></o:p></P>
<P 
class=MsoNormal>+            
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof 
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></P>
<P class=MsoNormal>+    if (!p_port->p_desc) {<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO 
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Allocation of  send descriptor failed\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P class=MsoNormal>+        
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void <o:p></o:p></P>
<P class=MsoNormal> __pending_list_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_list_item_t                    
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG        *s_buf;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                 
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_list_item_t      *p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG    
*s_buf;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG               
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Complete any pending packets. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this 
casting<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(s_buf->p_port == p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+    /* Complete any pending packets. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    for( p_item = cl_qlist_remove_head( 
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+        p_item != 
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        s_buf = 
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(s_buf->p_port == p_port);<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
//TODO<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//__send_complete_net_buffer(s_buf, 
NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__send_complete_net_buffer(s_buf, 
NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
//TODO<o:p></o:p></P>
<P class=MsoNormal>+        
//__send_complete_net_buffer(s_buf, 
NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></P>
<P class=MsoNormal>+        
__send_complete_net_buffer(s_buf, 
NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>   <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
//Destroy pending list and put all the send buffers back to pool<o:p></o:p></P>
<P 
class=MsoNormal>-              
//The list should be already destroyed at this point<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__pending_list_destroy(p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    //Destroy pending list and put all the 
send buffers back to pool<o:p></o:p></P>
<P class=MsoNormal>+    //The list should be already destroyed at 
this point<o:p></o:p></P>
<P class=MsoNormal>+    
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    
__pending_list_destroy(p_port);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
// Now, destroy the send pool<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+    // Now, destroy the send 
pool<o:p></o:p></P>
<P class=MsoNormal>+    
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P class=MsoNormal>+    
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//Now, free port descriptor<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (p_port->p_desc)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></P>
<P class=MsoNormal>+    //Now, free port 
descriptor<o:p></o:p></P>
<P class=MsoNormal>+    if (p_port->p_desc)<o:p></o:p></P>
<P class=MsoNormal>+        
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//Lookaside list will be destroyed in __buf_mgr_destroy<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    //Lookaside list will be destroyed in 
__buf_mgr_destroy<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL* 
const                                                                        
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG                                        
*s_buf)<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL* 
const                  
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         
ipoib_send_NB_SG            
*s_buf)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                    
status;<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_STATUS     
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( FilterIp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( FilterArp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendGen );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( FilterIp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( FilterArp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendGen );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* We already checked the ethernet header length, so we know it's 
safe<o:p></o:p></P>
<P 
class=MsoNormal>-              
* to decrement the buf_len without underflowing.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * We already checked the ethernet 
header length, so we know it's safe<o:p></o:p></P>
<P class=MsoNormal>+     * to decrement the buf_len without 
underflowing.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    buf_len -= 
sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( p_eth_hdr->type )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
case ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( FilterIp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, FilterIp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    switch( p_eth_hdr->type 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    case ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
FilterIp );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, FilterIp );<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( FilterArp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, FilterArp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    case ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
FilterArp );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, FilterArp );<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* The IPoIB spec doesn't define how to send non IP or ARP 
packets.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Just send the payload and hope for the best.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * The IPoIB 
spec doesn't define how to send non IP or ARP packets.<o:p></o:p></P>
<P class=MsoNormal>+         * Just send 
the payload and hope for the best.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( SendGen );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_gen( s_buf, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, SendGen );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
SendGen );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_gen( s_buf, 0, 0 );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, SendGen );<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -3416,7 +3463,7 @@<o:p></o:p></P>
<P class=MsoNormal> ULONG <o:p></o:p></P>
<P class=MsoNormal> CopyNetBuffer(<o:p></o:p></P>
<P class=MsoNormal>     PNET_BUFFER 
NetBuffer,<o:p></o:p></P>
<P class=MsoNormal>-    
PUCHAR                         
pDest<o:p></o:p></P>
<P class=MsoNormal>+    
PUCHAR       pDest<o:p></o:p></P>
<P class=MsoNormal>     ) <o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal>     ULONG  BytesCopied = 
0;<o:p></o:p></P>
<P class=MsoNormal>@@ -3429,12 +3476,12 @@<o:p></o:p></P>
<P class=MsoNormal>     ULONG Offset = 
NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);<o:p></o:p></P>
<P class=MsoNormal>     ULONG DataLength = 
NET_BUFFER_DATA_LENGTH(NetBuffer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if (DataLength > MAX_LSO_PAYLOAD_MTU) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Can't copy buffer of %d because of 64K limitation\n", 
DataLength));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if (DataLength > MAX_LSO_PAYLOAD_MTU) 
{<o:p></o:p></P>
<P class=MsoNormal>+   
     ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Can't copy buffer of %d because of 64K limitation\n", 
DataLength));<o:p></o:p></P>
<P class=MsoNormal>+        return 
0;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>     while (CurrentMdl && 
DataLength > 0)<o:p></o:p></P>
<P class=MsoNormal>     {<o:p></o:p></P>
<P class=MsoNormal>@@ -3507,93 +3554,93 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_copy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_NB_SG 
*                                     
s_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
UINT                                                                                      
lso_header_size)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_NB_SG *     
     s_buf,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
UINT                        
lso_header_size)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                                 
tot_len = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG                   
tot_len = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
(send_buf_t *) NdisAllocateFromNPagedLookasideList( 
&p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !s_buf->p_send_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
tot_len = CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) 
s_buf->p_send_buf);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (tot_len <= lso_header_size) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(tot_len > lso_header_size);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO Do not copy the ETH header <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Setup the work request. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
int seg_index = lso_header_size ? 0 : 1;<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(s_buf->p_send_buf == 
NULL);<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf = <o:p></o:p></P>
<P class=MsoNormal>+        (send_buf_t *) 
NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( !s_buf->p_send_buf 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    tot_len = 
CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) 
s_buf->p_send_buf);<o:p></o:p></P>
<P class=MsoNormal>+    if (tot_len <= lso_header_size) 
{<o:p></o:p></P>
<P class=MsoNormal>+        ASSERT(tot_len 
> lso_header_size);<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    //TODO Do not copy the ETH header 
<o:p></o:p></P>
<P class=MsoNormal>+    /* Setup the work request. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    int seg_index = lso_header_size ? 0 : 
1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[seg_index].vaddr = 
cl_get_physaddr(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[seg_index].length = tot_len - 
lso_header_size;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[seg_index].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.num_ds = seg_index+1;<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[0].local_ds[seg_index].vaddr = 
cl_get_physaddr(<o:p></o:p></P>
<P class=MsoNormal>+        
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[0].local_ds[seg_index].length = tot_len - 
lso_header_size;<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[0].local_ds[seg_index].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 
seg_index+1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_get_eth_hdr(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
PNET_BUFFER                                                                   
p_net_buffer,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
MDL** 
const                                                                     
pp_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_hdr_t** 
const                                          
pp_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
UINT*                                                                                   
p_mdl_len)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
PNET_BUFFER                 
p_net_buffer,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         MDL** 
const                 
pp_mdl,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_hdr_t** 
const           
pp_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         
UINT*                       
p_mdl_len)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
PUCHAR               
p_head = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    PUCHAR  p_head = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_mdl              
= NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></P>
<P class=MsoNormal>+    *pp_mdl = 
NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ! p_head )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Failed to get first buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("NdisQueryMdl failed.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    
NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+    if( ! p_head )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Failed to get 
first buffer. */<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("NdisQueryMdl failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG MdlDataOffset = 
NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></P>
<P 
class=MsoNormal>-              
*p_mdl_len -= MdlDataOffset; <o:p></o:p></P>
<P class=MsoNormal>+    ULONG MdlDataOffset = 
NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></P>
<P class=MsoNormal>+    *p_mdl_len -= 
MdlDataOffset;    <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( *p_mdl_len < sizeof(eth_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*p_mdl_len) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( *p_mdl_len < sizeof(eth_hdr_t) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
*p_mdl_len) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_eth_hdr = (eth_hdr_t*)(p_head + MdlDataOffset);<o:p></o:p></P>
<P class=MsoNormal>+    *pp_eth_hdr = (eth_hdr_t*)(p_head + 
MdlDataOffset);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("Ethernet header:\n"<o:p></o:p></P>
<P 
class=MsoNormal>-                              
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P 
class=MsoNormal>-                              
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P 
class=MsoNormal>-                              
"\tprotocol type: %04X\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_ntoh16( (*pp_eth_hdr)->type )) );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P class=MsoNormal>+        ("Ethernet 
header:\n"<o:p></o:p></P>
<P class=MsoNormal>+        "\tsrc MAC: 
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P class=MsoNormal>+        "\tdst MAC: 
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P class=MsoNormal>+        "\tprotocol type: 
%04X\n",<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></P>
<P class=MsoNormal>+        cl_ntoh16( 
(*pp_eth_hdr)->type )) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -3601,139 +3648,139 @@<o:p></o:p></P>
<P class=MsoNormal> /* Send using the MDL's page information rather than 
the SGL. */<o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __send_gen(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_desc_t* const          
p_desc )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_desc_t* const    p_desc )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                                               
i, j = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                                 
offset;<o:p></o:p></P>
<P 
class=MsoNormal>-              
MDL                                                                                       
*p_mdl;<o:p></o:p></P>
<P 
class=MsoNormal>-              
UINT                                                                      
num_pages, tot_len;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                                 
buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PPFN_NUMBER                                                                
page_array;<o:p></o:p></P>
<P 
class=MsoNormal>-              
boolean_t                                                           
hdr_done = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PNET_BUFFER                                                   
p_net_buf;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t                
i, j = 1;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG                   
offset;<o:p></o:p></P>
<P class=MsoNormal>+    
MDL                     
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal>+    
UINT                    
num_pages, tot_len;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG                   
buf_len;<o:p></o:p></P>
<P class=MsoNormal>+    
PPFN_NUMBER             
page_array;<o:p></o:p></P>
<P class=MsoNormal>+    
boolean_t               
hdr_done = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_api_status_t         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
PNET_BUFFER             
p_net_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_net_buf = NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisQueryBuffer( p_net_buf, &num_pages, NULL, &p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&tot_len );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    p_net_buf = 
NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></P>
<P class=MsoNormal>+    NdisQueryBuffer( p_net_buf, 
&num_pages, NULL, &p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+        &tot_len 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("No buffers associated with packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_mdl )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("No buffers associated with packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Remember that one of the DS entries is reserved for the IPoIB header. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( num_pages >= MAX_SEND_SGE )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Too many buffers to fit in WR ds_array.  Copying data.\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_copy( p_port, p_desc );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Remember that one of the DS entries is 
reserved for the IPoIB header. */<o:p></o:p></P>
<P class=MsoNormal>+    if( num_pages >= MAX_SEND_SGE 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Too many buffers to fit in WR ds_array.  Copying data.\n") 
);<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_copy( p_port, p_desc );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( tot_len > sizeof(eth_hdr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( tot_len <= p_port->p_adapter->params.xfer_block_size 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Assume that the ethernet header is always fully contained<o:p></o:p></P>
<P 
class=MsoNormal>-              
* in the first page of the first MDL.  This makes for much<o:p></o:p></P>
<P 
class=MsoNormal>-              
* simpler code.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
offset = MmGetMdlByteOffset( p_mdl ) + sizeof(eth_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( offset <= PAGE_SIZE );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( tot_len > sizeof(eth_hdr_t) 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( tot_len <= 
p_port->p_adapter->params.xfer_block_size );<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Assume that the ethernet header 
is always fully contained<o:p></o:p></P>
<P class=MsoNormal>+     * in the first page of the first 
MDL.  This makes for much<o:p></o:p></P>
<P class=MsoNormal>+     * simpler code.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    offset = MmGetMdlByteOffset( p_mdl ) + 
sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( offset <= PAGE_SIZE 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
while( tot_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
buf_len = MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
page_array = MmGetMdlPfnArray( p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( page_array );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
i = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !hdr_done )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Skip the ethernet header. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* The ethernet header is a subset of this MDL. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
CL_ASSERT( i == 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( offset < PAGE_SIZE )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << 
PAGE_SHIFT);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_desc->send_wr[0].local_ds[j].vaddr += offset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
buf_len = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
/* This data segment is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
j++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* This page is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
i++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Done handling the ethernet header. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
hdr_done = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    while( tot_len )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        buf_len = 
MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        page_array = 
MmGetMdlPfnArray( p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
page_array );<o:p></o:p></P>
<P class=MsoNormal>+        i = 
0;<o:p></o:p></P>
<P class=MsoNormal>+        if( !hdr_done 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Skip the ethernet header. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* The ethernet header is a subset of this MDL. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
CL_ASSERT( i == 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( offset < PAGE_SIZE )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << 
PAGE_SHIFT);<o:p></o:p></P>
<P 
class=MsoNormal>+                    
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></P>
<P class=MsoNormal>+        
            p_desc->send_wr[0].local_ds[j].vaddr 
+= offset;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></P>
<P 
class=MsoNormal>+                        
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P 
class=MsoNormal>+                    
else<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>+                        
buf_len = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P class=MsoNormal>+     
               /* 
This data segment is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>+                    
j++;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* This page is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
i++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Done handling the ethernet header. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
hdr_done = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Finish this MDL */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
while( buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << 
PAGE_SHIFT);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Add the first page's offset if we're on the first page. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( i == 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl 
);<o:p></o:p></P>
<P class=MsoNormal>+        /* Finish this 
MDL */<o:p></o:p></P>
<P class=MsoNormal>+        while( buf_len 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << 
PAGE_SHIFT);<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Add the first page's offset if we're on the first page. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( i == 0 )<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Buffers spans pages. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* This page is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
i++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Last page of the buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
buf_len = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* This data segment is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
j++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Buffers spans pages. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P 
class=MsoNormal>+                    
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>+                
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* This page is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
i++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Last page of the buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>+                
buf_len = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* This data segment is done.  Move to the next. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
j++;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
tot_len -= MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !tot_len )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        tot_len -= 
MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !tot_len 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get next buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_mdl 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get next buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Set the number of data segments. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></P>
<P class=MsoNormal>+    /* Set the number of data segments. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 
j;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P class=MsoNormal>@@ -3750,261 +3797,261 @@<o:p></o:p></P>
<P class=MsoNormal>     IN  
PSCATTER_GATHER_LIST    p_sgl,<o:p></o:p></P>
<P class=MsoNormal>     IN  
PVOID                   
context<o:p></o:p></P>
<P class=MsoNormal>     )<o:p></o:p></P>
<P 
class=MsoNormal>-{             
<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
MDL                                                                                       
*p_mdl;<o:p></o:p></P>
<P 
class=MsoNormal>-              
eth_hdr_t                                                           
*p_eth_hdr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
UINT                                                                      
mdl_len;<o:p></o:p></P>
<P 
class=MsoNormal>-              
bool ret = false;<o:p></o:p></P>
<P class=MsoNormal>+{   <o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS             
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t       
     *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    
MDL                     
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal>+    
eth_hdr_t               
*p_eth_hdr;<o:p></o:p></P>
<P class=MsoNormal>+    
UINT                    
mdl_len;<o:p></o:p></P>
<P class=MsoNormal>+    bool ret = false;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_send_wr_t                                   
*p_wr_failed;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST                                           
*p_net_buffer_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER                                                      
*p_netbuf;<o:p></o:p></P>
<P 
class=MsoNormal>-              
boolean_t                                                           
from_queue;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                                
ib_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                                 
complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_send_wr_t            
*p_wr_failed;<o:p></o:p></P>
<P class=MsoNormal>+    
NET_BUFFER_LIST         
*p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+    
NET_BUFFER              
*p_netbuf;<o:p></o:p></P>
<P class=MsoNormal>+    
boolean_t               
from_queue;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_api_status_t         
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG                   
complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(p_sgl != NULL);<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(p_sgl != NULL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(pDO);<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(pDO);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( BuildSendDesc );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( QueuePacket );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendMgrQueue );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PostSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( BuildSendDesc 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( QueuePacket 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendMgrQueue 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ProcessFailedSends 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
++g_ipoib_send_SG_real;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ++g_ipoib_send_SG_real;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//Read Data from the buffer passed as a context<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG *  s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_net_buffer_list = s_buf->p_nbl;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_netbuf = 
                                        
s_buf->p_curr_nb;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = 
                                             
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal>+    //Read Data from the buffer passed as a 
context<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG *  s_buf = 
(ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P class=MsoNormal>+    p_net_buffer_list = 
s_buf->p_nbl;<o:p></o:p></P>
<P class=MsoNormal>+    p_netbuf 
=          
s_buf->p_curr_nb;<o:p></o:p></P>
<P class=MsoNormal>+    p_port 
=            
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO Define this function as void if we are not in DBG mode<o:p></o:p></P>
<P 
class=MsoNormal>-              
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags, 
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+    //TODO Define this function as void if we 
are not in DBG mode<o:p></o:p></P>
<P class=MsoNormal>+    
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags, 
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT(KeGetCurrentIrql() == 
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_desc->p_netbuf_list = p_net_buffer_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_desc->p_endpt = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_desc->num_wrs = 1;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_desc->p_netbuf_list = 
p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_desc->p_endpt = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_desc->num_wrs = 
1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Get the ethernet header so we can find the endpoint. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( GetEthHdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __send_mgr_get_eth_hdr(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_netbuf, &p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, 
IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></P>
<P class=MsoNormal>+    /* Get the ethernet header so we can find 
the endpoint. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( GetEthHdr 
);<o:p></o:p></P>
<P class=MsoNormal>+    status = 
__send_mgr_get_eth_hdr(<o:p></o:p></P>
<P class=MsoNormal>+        p_netbuf, 
&p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* fail  net buffer */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process SG 
list\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
from_queue = (boolean_t)(s_buf->p_sgl != NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (from_queue)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( GetEndpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, 
&(p_port->p_desc->p_endpt) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called 
for %p\n", p_port->p_desc->p_endpt));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status == NDIS_STATUS_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(cl_list_item_t*)s_buf  );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this item 
back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ret = false;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+        /* fail  net 
buffer */<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process SG 
list\n"));<o:p></o:p></P>
<P class=MsoNormal>+        
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+        ret = 
true;<o:p></o:p></P>
<P class=MsoNormal>+        goto 
send_end;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    from_queue = (boolean_t)(s_buf->p_sgl 
!= NULL);<o:p></o:p></P>
<P class=MsoNormal>+    if (from_queue)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__endpt_mgr_ref( p_port, p_eth_hdr->dst, &(p_port->p_desc->p_endpt) 
);<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", 
p_port->p_desc->p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+        if( status == 
NDIS_STATUS_PENDING )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P 
class=MsoNormal>+                
(cl_list_item_t*)s_buf  );<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this item 
back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></P>
<P 
class=MsoNormal>+            
ret = false;<o:p></o:p></P>
<P 
class=MsoNormal>+            
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if( status 
!= NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc packet 
(from the queue) %p\n", p_net_buffer_list));<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this MULTICAST 
item back to the pending list: %p \n", 
p_net_buffer_list));                                                                  
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*) 
s_buf  );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ret = false;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* sends to fail.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and the 
packet had not been sent\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc packet 
(from the queue) %p\n", p_net_buffer_list));<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this MULTICAST 
item back to the pending list: %p \n", 
p_net_buffer_list));                    
<o:p></o:p></P>
<P 
class=MsoNormal>+                    
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*) 
s_buf  );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ret = false;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P 
class=MsoNormal>+             
* sends to fail.<o:p></o:p></P>
<P class=MsoNormal>+        
     */<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and the 
packet had not been sent\n"));<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else //We got this Net Buffer and its SG list directly from NDIS<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( SendMgrQueue );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>+            
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else //We got this Net Buffer and its SG 
list directly from NDIS<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></P>
<P class=MsoNormal>+        s_buf->p_sgl = 
p_sgl;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
SendMgrQueue );<o:p></o:p></P>
<P class=MsoNormal>+        if ( 
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></P>
<P 
class=MsoNormal>+             
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P 
class=MsoNormal>+             
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ip_hdr_t                                              
*p_ip_hdr;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
uint8_t                                                 
*p_tmp;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
MDL                                                                       
*p_ip_hdr_mdl;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
UINT                                                      
ip_hdr_mdl_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
g_ipoib_send_mcast++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
// Extract the ip hdr <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( !p_ip_hdr_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
goto mc_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( !p_tmp )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("Failed to get IP header.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
goto mc_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}                                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
/* This buffer is done for.  Get the next buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
goto mc_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_ip_hdr = (ip_hdr_t*)(p_tmp + 
NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] & 
0x0f;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_eth_hdr->dst.addr[3] = ((unsigned 
char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P 
class=MsoNormal>+            
ip_hdr_t            
*p_ip_hdr;<o:p></o:p></P>
<P class=MsoNormal>+          
  uint8_t             
*p_tmp;<o:p></o:p></P>
<P 
class=MsoNormal>+            
MDL                 
*p_ip_hdr_mdl;<o:p></o:p></P>
<P 
class=MsoNormal>+            
UINT                
ip_hdr_mdl_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
g_ipoib_send_mcast++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></P>
<P 
class=MsoNormal>+                
// Extract the ip hdr <o:p></o:p></P>
<P 
class=MsoNormal>+                
if( !p_ip_hdr_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
goto mc_end;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}   <o:p></o:p></P>
<P 
class=MsoNormal>+                
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( !p_tmp )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("Failed to get IP header.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
goto mc_end;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}                   
<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
/* This buffer is done for.  Get the next buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
goto mc_end;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_ip_hdr = (ip_hdr_t*)(p_tmp + 
NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] & 
0x0f;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_eth_hdr->dst.addr[3] = ((unsigned 
char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> mc_end:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(s_buf->p_sgl);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_mgr_queue( p_port, p_eth_hdr, 
&(p_port->p_desc->p_endpt) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status == NDIS_STATUS_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Queue net buffer list. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( QueuePacket );<o:p></o:p></P>
<P class=MsoNormal>+      
  ASSERT(s_buf->p_sgl);<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_mgr_queue( p_port, p_eth_hdr, &(p_port->p_desc->p_endpt) 
);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></P>
<P class=MsoNormal>+        if( status == 
NDIS_STATUS_PENDING )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Queue net buffer list. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( QueuePacket );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( &p_port->send_mgr.pending_list, 
(cl_list_item_t*)s_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB first 
time to the pending list\n", p_netbuf));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ret = false;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* sends to fail.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//TODO - check previous comment !<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( BuildSendDesc );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __build_send_desc( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail( &p_port->send_mgr.pending_list, 
(cl_list_item_t*)s_buf );<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB first 
time to the pending list\n", p_netbuf));<o:p></o:p></P>
<P class=MsoNormal>+    
        <o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></P>
<P 
class=MsoNormal>+            
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P 
class=MsoNormal>+            
ret = false;<o:p></o:p></P>
<P 
class=MsoNormal>+            
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P 
class=MsoNormal>+             
* sends to fail.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+             
//TODO - check previous comment !<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>+            
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>+            
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( BuildSendDesc 
);<o:p></o:p></P>
<P class=MsoNormal>+    status = __build_send_desc( p_eth_hdr, 
p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, BuildSendDesc );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-//                          
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto send_end;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+//      
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+        
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, 
TRUE);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+        ret = 
true;<o:p></o:p></P>
<P class=MsoNormal>+        goto 
send_end;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Post the WR. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( PostSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("sending packet with wr-id 
=0x%p\n",p_net_buffer_list ));<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_status = p_port->p_adapter->p_ifc->post_send( 
p_port->ib_mgr.h_qp, &(p_port->p_desc->send_wr[0].wr), 
&p_wr_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->n_no_progress = 0; // IPoIB can send, reset the failure 
counter<o:p></o:p></P>
<P 
class=MsoNormal>-              
ret = true;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, PostSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_post_send returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Flag the adapter as hung since posting is busted. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
++g_ipoib_send;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_atomic_inc( &p_port->send_mgr.depth );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Post the WR. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, 
IPOIB_DBG_SEND, ("sending packet with wr-id =0x%p\n",p_net_buffer_list 
));<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ib_status = 
p_port->p_adapter->p_ifc->post_send( p_port->ib_mgr.h_qp, 
&(p_port->p_desc->send_wr[0].wr), &p_wr_failed );<o:p></o:p></P>
<P class=MsoNormal>+    p_port->n_no_progress = 0; // IPoIB 
can send, reset the failure counter<o:p></o:p></P>
<P class=MsoNormal>+    ret = true;<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, PostSend );<o:p></o:p></P>
<P class=MsoNormal>+    if( ib_status != IB_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_post_send returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+        
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, 
TRUE);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+        /* Flag the 
adapter as hung since posting is busted. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        
++g_ipoib_send;<o:p></o:p></P>
<P class=MsoNormal>+        cl_atomic_inc( 
&p_port->send_mgr.depth );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-send_end:                        
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+send_end:       
<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
return ret;<o:p></o:p></P>
<P class=MsoNormal>+    return ret;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -4018,486 +4065,486 @@<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG *  s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t* p_port = 
                                                
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG *  s_buf = 
(ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t* p_port 
=          
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
++g_ipoib_send_SG;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (g_ipoib_send_SG > 2) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send + 
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+ 
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_process_sg_list_real(pDO, pIrp, p_sgl, context);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (g_ipoib_send_SG > 1) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send + 
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count + 
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    ++g_ipoib_send_SG;<o:p></o:p></P>
<P class=MsoNormal>+    if (g_ipoib_send_SG > 2) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send + 
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+ 
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_process_sg_list_real(pDO, pIrp, 
p_sgl, context);<o:p></o:p></P>
<P class=MsoNormal>+    if (g_ipoib_send_SG > 1) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send + 
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count + 
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_gen(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_NB_SG 
*                                     
s_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
INT                                                                                                         
lso_data_index,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
UINT                                                                                      
lso_header_size OPTIONAL)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_NB_SG *          
s_buf,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
INT                         
lso_data_index,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
UINT                        
lso_header_size OPTIONAL)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                               
i, j 
                          
= 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG 
                                                
DataOffset          = 0; 
        <o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                               
EthHeaderOffset 
                            
= sizeof(eth_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
static const         EthIPoIBHeaderOffset 
  = EthHeaderOffset - sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_STATUS     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t        i, 
j        = 1;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG           
DataOffset  = 0;    <o:p></o:p></P>
<P class=MsoNormal>+  
  uint32_t        
EthHeaderOffset         = 
sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    static const    
EthIPoIBHeaderOffset    = EthHeaderOffset - 
sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PSCATTER_GATHER_LIST              
p_sgl = s_buf->p_sgl;<o:p></o:p></P>
<P class=MsoNormal>+    PSCATTER_GATHER_LIST    
p_sgl = s_buf->p_sgl;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_sgl )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT( p_sgl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO: Copy only essential data<o:p></o:p></P>
<P 
class=MsoNormal>-              
// That is, copy only 2 chunks of ETH header if it contained in several first SG 
elements<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Copy only N+1-MAX_SEND_SGE, where N is a lenght of SG List<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Remember that one of the DS entries is reserved for the IPoIB header. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_sgl )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ASSERT( p_sgl 
);<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    //TODO: Copy only essential 
data<o:p></o:p></P>
<P class=MsoNormal>+    // That is, copy only 2 chunks of ETH 
header if it contained in several first SG elements<o:p></o:p></P>
<P class=MsoNormal>+    // Copy only N+1-MAX_SEND_SGE, where N is 
a lenght of SG List<o:p></o:p></P>
<P class=MsoNormal>+    /* Remember that one of the DS entries is 
reserved for the IPoIB header. */<o:p></o:p></P>
<P class=MsoNormal>+    if( ( p_sgl->NumberOfElements >= 
MAX_SEND_SGE ||<o:p></o:p></P>
<P class=MsoNormal>+        
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Too many buffers %d to fit in WR ds_array[%d] \<o:p></o:p></P>
<P 
class=MsoNormal>-                              
                
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( SendCopy );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P class=MsoNormal>+      
      ("Too many buffers %d to fit in WR 
ds_array[%d] \<o:p></o:p></P>
<P 
class=MsoNormal>+             
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length ) 
);<o:p></o:p></P>
<P class=MsoNormal>+        status = 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+        if( 
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_start( SendCopy );<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy 
);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Skip the ethernet header.  It is either the first element,<o:p></o:p></P>
<P 
class=MsoNormal>-              
* or part of it.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
i = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
DataOffset= (ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); 
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( lso_data_index )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{ /* we have an LSO packet */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
i = lso_data_index;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
j = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT( i <= p_sgl->NumberOfElements);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (i == p_sgl->NumberOfElements) {<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Skip the ethernet header.  
It is either the first element,<o:p></o:p></P>
<P class=MsoNormal>+     * or part of it.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    i = 0;<o:p></o:p></P>
<P class=MsoNormal>+    DataOffset= 
(ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( lso_data_index )<o:p></o:p></P>
<P class=MsoNormal>+    { /* we have an LSO packet 
*/<o:p></o:p></P>
<P class=MsoNormal>+        i = 
lso_data_index;<o:p></o:p></P>
<P class=MsoNormal>+        j = 
0;<o:p></o:p></P>
<P class=MsoNormal>+        ASSERT( i <= 
p_sgl->NumberOfElements);<o:p></o:p></P>
<P class=MsoNormal>+        if (i == 
p_sgl->NumberOfElements) {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/****************************<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Handle the case when there is only one SG element !<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
****************************/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset + 
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_sgl->Elements[0].Length - lso_header_size - DataOffset - 
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Set the number of data segments. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else while( EthHeaderOffset )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset + 
DataOffset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[0].local_ds[j].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
i++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
j++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Now fill in the rest of the local data segments. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( i < p_sgl->NumberOfElements )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_wr[0].local_ds[j].vaddr = 
p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_wr[0].local_ds[j].length = 
p_sgl->Elements[i].Length;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_wr[0].local_ds[j].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
i++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
j++;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+  
          /****************************<o:p></o:p></P>
<P 
class=MsoNormal>+            
* Handle the case when there is only one SG element !<o:p></o:p></P>
<P 
class=MsoNormal>+            
****************************/<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></P>
<P 
class=MsoNormal>+                
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset + 
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></P>
<P 
class=MsoNormal>+                
p_sgl->Elements[0].Length - lso_header_size - DataOffset - 
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Set the number of data segments. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+        
}       <o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else while( EthHeaderOffset 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></P>
<P class=MsoNormal>+     
           p_sgl->Elements[i].Address.QuadPart 
+ EthHeaderOffset + DataOffset;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[0].local_ds[j].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+            
i++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
j++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* Now fill in the rest of the local data 
segments. */<o:p></o:p></P>
<P class=MsoNormal>+    while( i < p_sgl->NumberOfElements 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_wr[0].local_ds[j].vaddr = 
p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_wr[0].local_ds[j].length = 
p_sgl->Elements[i].Length;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_wr[0].local_ds[j].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+        
i++;<o:p></o:p></P>
<P class=MsoNormal>+        
j++;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Set the number of data segments. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></P>
<P class=MsoNormal>+    /* Set the number of data segments. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 
j;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_NB_SG                                        
*s_buf )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_NB_SG            
*s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ip_hdr_t                              
*p_ip_hdr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                               
ip_packet_len;<o:p></o:p></P>
<P 
class=MsoNormal>-              
size_t                                    
iph_size_in_bytes;<o:p></o:p></P>
<P 
class=MsoNormal>-              
size_t                                    
iph_options_size;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( QueryIp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendTcp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( FilterUdp );<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_STATUS     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ip_hdr_t        *p_ip_hdr;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t        ip_packet_len;<o:p></o:p></P>
<P class=MsoNormal>+    
size_t          
iph_size_in_bytes;<o:p></o:p></P>
<P class=MsoNormal>+    
size_t          
iph_options_size;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( QueryIp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendTcp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( FilterUdp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( QueryIp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextMdl ( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
QueryIp );<o:p></o:p></P>
<P class=MsoNormal>+        NdisGetNextMdl ( 
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_mdl 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, 
NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_ip_hdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to query IP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, QueryIp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* This buffer is done for.  Get the next buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, 
NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_ip_hdr 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to query IP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, QueryIp );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_ip_hdr = 
(ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if( buf_len < sizeof(ip_hdr_t) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* This buffer is 
done for.  Get the next buffer. */<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( p_ip_hdr->prot )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IP_PROT_UDP:<o:p></o:p></P>
<P class=MsoNormal>+    switch( p_ip_hdr->prot 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    case IP_PROT_UDP:<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( FilterUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), 
s_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status == NDIS_STATUS_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{  /* not DHCP packet, keep going */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IP_PROT_TCP:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IP_PROT_IGMP:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
1. iph<o:p></o:p></P>
<P 
class=MsoNormal>-                              
2. ip options<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
So to get the IGMP packet we need to skip the ip options 
NDIS_BUFFER<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
FilterUdp );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), s_buf 
);<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, FilterUdp );<o:p></o:p></P>
<P class=MsoNormal>+        if( status == 
NDIS_STATUS_PENDING )<o:p></o:p></P>
<P class=MsoNormal>+        {  /* not 
DHCP packet, keep going */<o:p></o:p></P>
<P class=MsoNormal>+     
       if( ETH_IS_MULTICAST( 
p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    case IP_PROT_TCP:<o:p></o:p></P>
<P class=MsoNormal>+    
    p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    case IP_PROT_IGMP:<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+        In igmp packet I 
saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></P>
<P class=MsoNormal>+        1. 
iph<o:p></o:p></P>
<P class=MsoNormal>+        2. ip 
options<o:p></o:p></P>
<P 
class=MsoNormal>+                
So to get the IGMP packet we need to skip the ip options 
NDIS_BUFFER<o:p></o:p></P>
<P 
class=MsoNormal>+            
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></P>
<P 
class=MsoNormal>+            
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
Could be a case that arrived igmp packet not from type IGMPv2 ,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
but IGMPv1 or IGMPv3.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
We anyway pass it to __send_mgr_filter_igmp_v2().<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status =<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl, 
buf_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P class=MsoNormal>+        Could be a case 
that arrived igmp packet not from type IGMPv2 ,<o:p></o:p></P>
<P class=MsoNormal>+        but IGMPv1 or 
IGMPv3.<o:p></o:p></P>
<P class=MsoNormal>+        We anyway pass it 
to __send_mgr_filter_igmp_v2().<o:p></o:p></P>
<P class=MsoNormal>+        */<o:p></o:p></P>
<P class=MsoNormal>+        status 
=<o:p></o:p></P>
<P 
class=MsoNormal>+            
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl, 
buf_len );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case IP_PROT_ICMP:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto send_gen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ip_packet_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( ip_packet_len  > 
s_buf->p_port->p_adapter->params.payload_mtu )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//TODO: NDIS60<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
#if 0<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = __send_fragments( p_port, p_desc, (eth_hdr_t* 
const)p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
#endif<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    case IP_PROT_ICMP:<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( 
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+        goto 
send_gen;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else if( endpt_cm_get_state( 
p_desc->p_endpt ) != IPOIB_CM_CONNECTED )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if( p_desc->send_dir == SEND_UD_QP 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ip_packet_len = 
cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
ip_packet_len  > s_buf->p_port->p_adapter->params.payload_mtu 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
//TODO: NDIS60<o:p></o:p></P>
<P 
class=MsoNormal>+            
#if 0<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = __send_fragments( p_port, p_desc, (eth_hdr_t* 
const)p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P 
class=MsoNormal>+            
#endif<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> send_gen:<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( SendTcp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __send_gen(  s_buf, 0, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, SendTcp );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( SendTcp );<o:p></o:p></P>
<P class=MsoNormal>+    status = __send_gen(  s_buf, 0, 0 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, SendTcp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ip_hdr_t* 
const                                                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
iph_options_size,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ip_hdr_t* 
const             
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
iph_options_size,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
igmp_v2_hdr_t                 
*p_igmp_v2_hdr = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
endpt_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t* 
                               
p_endpt = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mac_addr_t                                       
fake_mcast_mac;<o:p></o:p></P>
<P class=MsoNormal>+ 
   igmp_v2_hdr_t       
*p_igmp_v2_hdr = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
endpt_status;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t*      p_endpt = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
mac_addr_t          
fake_mcast_mac;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size ) 
);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+             
("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size ) 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if 
exists)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
while ( iph_options_size )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( !p_igmp_v2_hdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
iph_options_size-=buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        // To get the 
IGMP packet we need to skip the ip options NDIS_BUFFER (if 
exists)<o:p></o:p></P>
<P class=MsoNormal>+        while ( 
iph_options_size )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority 
);<o:p></o:p></P>
<P class=MsoNormal>+        
    if( !p_igmp_v2_hdr )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
iph_options_size-=buf_len;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>         
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_igmp_v2_hdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* assuming ip header and options are in the same packet */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_igmp_v2_hdr = (igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Get the IGMP header length. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( buf_len < sizeof(igmp_v2_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Buffer not large enough for IGMPv2 packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        NdisGetNextMdl( 
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_mdl 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        NdisQueryMdl( 
p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
!p_igmp_v2_hdr )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* assuming ip 
header and options are in the same packet */<o:p></o:p></P>
<P class=MsoNormal>+        p_igmp_v2_hdr = 
(igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* Get the IGMP header length. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    if( buf_len < sizeof(igmp_v2_hdr_t) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+      
      ("Buffer not large enough for IGMPv2 
packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
// build fake mac from igmp packet group address<o:p></o:p></P>
<P 
class=MsoNormal>-              
fake_mcast_mac.addr[0] = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
fake_mcast_mac.addr[1] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></P>
<P 
class=MsoNormal>-              
fake_mcast_mac.addr[2] = 0x5E;<o:p></o:p></P>
<P 
class=MsoNormal>-              
fake_mcast_mac.addr[3] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></P>
<P 
class=MsoNormal>-              
fake_mcast_mac.addr[4] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></P>
<P 
class=MsoNormal>-              
fake_mcast_mac.addr[5] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></P>
<P class=MsoNormal>+    // build fake mac from igmp packet group 
address<o:p></o:p></P>
<P class=MsoNormal>+    fake_mcast_mac.addr[0] = 
1;<o:p></o:p></P>
<P class=MsoNormal>+    fake_mcast_mac.addr[1] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></P>
<P class=MsoNormal>+    fake_mcast_mac.addr[2] = 
0x5E;<o:p></o:p></P>
<P class=MsoNormal>+    fake_mcast_mac.addr[3] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></P>
<P class=MsoNormal>+    fake_mcast_mac.addr[4] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></P>
<P class=MsoNormal>+    fake_mcast_mac.addr[5] = ((unsigned 
char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch ( p_igmp_v2_hdr->type )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
This mean that some body open listener on this group <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector 
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
will not delete this mcast endpt.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called 
for %p\n", p_endpt));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if ( p_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    switch ( p_igmp_v2_hdr->type 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    case 
IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></P>
<P class=MsoNormal>+        /* 
<o:p></o:p></P>
<P class=MsoNormal>+     
       This mean that some body open listener 
on this group <o:p></o:p></P>
<P 
class=MsoNormal>+            
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector 
<o:p></o:p></P>
<P 
class=MsoNormal>+            
will not delete this mcast endpt.<o:p></o:p></P>
<P class=MsoNormal>+        */<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></P>
<P class=MsoNormal>+        endpt_status = 
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", 
p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+        if ( p_endpt 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>             
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case IGMP_V2_LEAVE_GROUP:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
This mean that somebody CLOSE listener on this group .<o:p></o:p></P>
<P 
class=MsoNormal>-                              
    Change type of mcast endpt to SEND_ONLY endpt. So mcast 
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
garbage collector will delete this mcast endpt next time.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
     ("Catched IGMP_V2_LEAVE_GROUP message\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called 
for %p\n", p_endpt));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if ( p_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    case IGMP_V2_LEAVE_GROUP:<o:p></o:p></P>
<P class=MsoNormal>+        /* 
<o:p></o:p></P>
<P 
class=MsoNormal>+            
This mean that somebody CLOSE listener on this group .<o:p></o:p></P>
<P 
class=MsoNormal>+            
Change type of mcast endpt to SEND_ONLY endpt. So mcast <o:p></o:p></P>
<P 
class=MsoNormal>+            
garbage collector will delete this mcast endpt next time.<o:p></o:p></P>
<P class=MsoNormal>+        */<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+                 
("Catched IGMP_V2_LEAVE_GROUP message\n") );<o:p></o:p></P>
<P class=MsoNormal>+        endpt_status = 
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", 
p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+        if ( p_endpt 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal>+        
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
     ("Send Unknown IGMP message: 0x%x \n", 
p_igmp_v2_hdr->type ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+                 
("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) 
);<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ip_hdr_t* 
const                                                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG*                                      
s_buf )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ip_hdr_t* 
const             
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    IN   
           size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         
ipoib_send_NB_SG*           
s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
udp_hdr_t                                          
*p_udp_hdr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( QueryUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( FilterDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
udp_hdr_t           
*p_udp_hdr;<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( QueryUdp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendUdp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( FilterDhcp 
);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( QueryUdp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get UDP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryMdl( p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_udp_hdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to query UDP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &s_buf->p_port->p_adapter->perf, QueryUdp 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Get the UDP header and check the destination port numbers. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (p_ip_hdr->offset > 0) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* This is a fragmented part of UDP packet<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Only first packet will contain UDP header in such case<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* So, return if offset > 0<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
QueryUdp );<o:p></o:p></P>
<P class=MsoNormal>+        NdisGetNextMdl( 
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_mdl 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get UDP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        NdisQueryMdl( 
p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_udp_hdr 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to query UDP header buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&s_buf->p_port->p_adapter->perf, QueryUdp );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_udp_hdr = 
(udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* Get the UDP header and check the 
destination port numbers. */<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if (p_ip_hdr->offset > 0) 
{<o:p></o:p></P>
<P class=MsoNormal>+        /* This is a 
fragmented part of UDP packet<o:p></o:p></P>
<P class=MsoNormal>+         * Only 
first packet will contain UDP header in such case<o:p></o:p></P>
<P class=MsoNormal>+         * So, 
return if offset > 0<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+         return 
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+         
<o:p></o:p></P>
<P class=MsoNormal>+    if( buf_len < sizeof(udp_hdr_t) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( (p_udp_hdr->src_port != DHCP_PORT_CLIENT ||<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Not a DHCP packet. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( (p_udp_hdr->src_port != 
DHCP_PORT_CLIENT ||<o:p></o:p></P>
<P class=MsoNormal>+        
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></P>
<P class=MsoNormal>+        
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></P>
<P class=MsoNormal>+        
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Not a DHCP 
packet. */<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
buf_len -= sizeof(udp_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    buf_len -= 
sizeof(udp_hdr_t);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate our scratch buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ExAllocateFromNPagedLookasideList( 
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !s_buf->p_send_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Copy the IP and UDP headers. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate our scratch buffer. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf = 
(send_buf_t*)<o:p></o:p></P>
<P class=MsoNormal>+        
ExAllocateFromNPagedLookasideList( 
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P class=MsoNormal>+    if( !s_buf->p_send_buf 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* Copy the IP and UDP headers. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( 
&s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy(<o:p></o:p></P>
<P class=MsoNormal>+        
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( FilterDhcp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __send_mgr_filter_dhcp( p_udp_hdr, p_mdl, buf_len, s_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( FilterDhcp 
);<o:p></o:p></P>
<P class=MsoNormal>+    status = __send_mgr_filter_dhcp( 
p_udp_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> unsigned short ipchksum(unsigned short *ip, int 
len)<o:p></o:p></P>
<P class=MsoNormal>@@ -4515,646 +4562,646 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     udp_hdr_t* 
const                                           
p_udp_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NDIS_BUFFER*                                                 
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG*                                      
s_buf )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   udp_hdr_t* 
const            
p_udp_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
NDIS_BUFFER*                
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         
ipoib_send_NB_SG*           
s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
dhcp_pkt_t                                        
*p_dhcp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
dhcp_pkt_t                                        
*p_ib_dhcp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                                 
*p_option, *p_cid = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                                 
msg = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
size_t                                                    
len;<o:p></o:p></P>
<P class=MsoNormal>+    
dhcp_pkt_t          
*p_dhcp;<o:p></o:p></P>
<P class=MsoNormal>+    
dhcp_pkt_t          
*p_ib_dhcp;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t             
*p_option, *p_cid = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t             
msg = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
size_t              
len;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get DHCP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryMdl( p_mdl, &p_dhcp, &buf_len, NormalPagePriority 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_dhcp )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to query DHCP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_dhcp = (dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        NdisGetNextMdl( 
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_mdl 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get DHCP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        NdisQueryMdl( 
p_mdl, &p_dhcp, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_dhcp 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+   
             ("Failed 
to query DHCP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_dhcp = 
(dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( buf_len < DHCP_MIN_SIZE )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( buf_len < DHCP_MIN_SIZE 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_dhcp = &s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_dhcp = 
&s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( p_ib_dhcp, p_dhcp, buf_len 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Now scan through the options looking for the client identifier. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_option = &p_ib_dhcp->options[4];<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( *p_option != DHCP_OPT_END && p_option < 
&p_ib_dhcp->options[312] )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
switch( *p_option )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case DHCP_OPT_PAD:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_option++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    /* Now scan through the options looking 
for the client identifier. */<o:p></o:p></P>
<P class=MsoNormal>+    p_option = 
&p_ib_dhcp->options[4];<o:p></o:p></P>
<P class=MsoNormal>+    while( *p_option != DHCP_OPT_END 
&& p_option < &p_ib_dhcp->options[312] )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        switch( *p_option 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+        case 
DHCP_OPT_PAD:<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_option++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
case DHCP_OPT_MSG:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
msg = p_option[2];<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_option += 3;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        case 
DHCP_OPT_MSG:<o:p></o:p></P>
<P 
class=MsoNormal>+            
msg = p_option[2];<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_option += 3;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
case DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_cid = p_option;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal>+        case 
DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_cid = p_option;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* All other options have a length byte following the option code.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Offset by the length to get to the next option.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
default:<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* All other options have a length byte following the option code.<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Offset by the length to get to the next option.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( msg )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Client messages */<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPDISCOVER:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPREQUEST:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Fall through */<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPDECLINE:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPRELEASE:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPINFORM:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Fix up the client identifier option */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_cid )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* do we need to replace it ?  len eq ETH MAC sz 'and' MAC is mine 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( 
&p_cid[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Make sure there's room to extend it.  22 is the size of<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
* the CID option for IPoIB. (20 is the length, one byte for type and the second 
for lenght field)<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* Move the existing options down, and add a new CID option */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_cid += len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Make sure there's room to extend it.  23 is the size of<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* the CID option for IPoIB.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P class=MsoNormal>+    switch( msg )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    /* Client messages */<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPDISCOVER:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPREQUEST:<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></P>
<P class=MsoNormal>+        /* Fall through 
*/<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPDECLINE:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPRELEASE:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPINFORM:<o:p></o:p></P>
<P class=MsoNormal>+        /* Fix up the 
client identifier option */<o:p></o:p></P>
<P class=MsoNormal>+        if( p_cid 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* do we need to replace it ?  len eq ETH MAC sz 'and' MAC is mine 
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( 
&p_cid[3],<o:p></o:p></P>
<P 
class=MsoNormal>+                
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Make sure there's room to extend it.  22 is the size of<o:p></o:p></P>
<P 
class=MsoNormal>+                 
* the CID option for IPoIB. (20 is the length, one byte for type and the second 
for lenght field)<o:p></o:p></P>
<P 
class=MsoNormal>+                 
*/<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* Move the existing options down, and add a new CID option */<o:p></o:p></P>
<P 
class=MsoNormal>+                
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></P>
<P 
class=MsoNormal>+                
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_cid += len;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Make sure there's room to extend it.  23 is the size of<o:p></o:p></P>
<P 
class=MsoNormal>+             
* the CID option for IPoIB.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_cid = p_option;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_cid = p_option;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// Copy the default prefix for ALL DHCP messages<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( &p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof 
coIBDefaultDHCPPrefix);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// Copy the GUID into the last 8 bytes of the CID field<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( &p_cid[2+ 
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid 
, <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></P>
<P class=MsoNormal>+        
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        // Copy the 
default prefix for ALL DHCP messages<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( 
&p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof 
coIBDefaultDHCPPrefix);<o:p></o:p></P>
<P class=MsoNormal>+        // Copy the GUID 
into the last 8 bytes of the CID field<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( 
&p_cid[2+ 
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid 
, <o:p></o:p></P>
<P 
class=MsoNormal>+            
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) 
);<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Server messages. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPOFFER:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ib_dhcp->htype = 0x20;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_ib_dhcp->hlen = 0x8;<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPACK:<o:p></o:p></P>
<P 
class=MsoNormal>-              
case DHCPNAK:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* don't touch server messages */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    /* Server messages. */<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPOFFER:<o:p></o:p></P>
<P class=MsoNormal>+        
p_ib_dhcp->htype = 0x20;<o:p></o:p></P>
<P class=MsoNormal>+        
p_ib_dhcp->hlen = 0x8;<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPACK:<o:p></o:p></P>
<P class=MsoNormal>+    case DHCPNAK:<o:p></o:p></P>
<P class=MsoNormal>+        /* don't touch 
server messages */<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Invalide message type.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Invalide message type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) + 
sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) + 
sizeof(dhcp_pkt_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf->ip.hdr.chksum = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf->ip.hdr.chksum = ipchksum((unsigned short*) 
&s_buf->p_send_buf->ip.hdr, sizeof(ip_hdr_t));<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf->ip.hdr.length = 
cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) 
);<o:p></o:p></P>
<P class=MsoNormal>+    
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) + 
sizeof(dhcp_pkt_t) );<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf->ip.hdr.chksum = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf->ip.hdr.chksum = 
ipchksum((unsigned short*) &s_buf->p_send_buf->ip.hdr, 
sizeof(ip_hdr_t));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* no chksum for udp, in a case when HW does not support checksum offload 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( s_buf->p_send_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t) 
+      sizeof(udp_hdr_t) + 
sizeof(dhcp_pkt_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[1].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* no chksum for udp, in a case when HW 
does not support checksum offload */<o:p></o:p></P>
<P class=MsoNormal>+    
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].vaddr = 
cl_get_physaddr( s_buf->p_send_buf );<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].length 
= sizeof(ip_hdr_t) +  sizeof(udp_hdr_t) + 
sizeof(dhcp_pkt_t);<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 
2;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_dir = 
SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL*                                                                                    
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
size_t                                                                                    
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
OUT                                       
ipoib_send_NB_SG*                                      
s_buf )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL*                        
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
size_t                      
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
OUT         
ipoib_send_NB_SG*           
s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
arp_pkt_t                                            
*p_arp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_arp_pkt_t                               
*p_ib_arp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mac_addr_t                                       
null_hw = {0};<o:p></o:p></P>
<P class=MsoNormal>+    
arp_pkt_t           
*p_arp;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_arp_pkt_t     
*p_ib_arp;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
mac_addr_t          null_hw = 
{0};<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !buf_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_mdl )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get ARP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryMdl( p_mdl, &p_arp, &buf_len, NormalPagePriority 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_arp )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get query ARP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_arp = (arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        NdisGetNextMdl( 
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_mdl 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get ARP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        NdisQueryMdl( 
p_mdl, &p_arp, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_arp 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get query ARP buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_arp = 
(arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Single buffer ARP packet. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( buf_len < sizeof(arp_pkt_t) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Buffer too short for ARP.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Single buffer ARP packet. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    if( buf_len < sizeof(arp_pkt_t) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Buffer too short for ARP.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Unsupported protocol type.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_arp->prot_type != 
ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Unsupported protocol type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate our scratch buffer. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisAllocateFromNPagedLookasideList( 
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !s_buf->p_send_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to query ARP packet buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp = (ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate our scratch buffer. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(s_buf->p_send_buf == 
NULL);<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf = 
(send_buf_t*)<o:p></o:p></P>
<P class=MsoNormal>+        
NdisAllocateFromNPagedLookasideList( 
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P class=MsoNormal>+    if( !s_buf->p_send_buf 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to query ARP packet buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp = 
(ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Convert the ARP payload. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->hw_type = ARP_HW_TYPE_IB;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->prot_type = p_arp->prot_type;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->hw_size = sizeof(ipoib_hw_addr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->prot_size = p_arp->prot_size;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->op = p_arp->op;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_addr_set_qpn( &p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Convert the ARP payload. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->hw_type = 
ARP_HW_TYPE_IB;<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->prot_type = 
p_arp->prot_type;<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->hw_size = 
sizeof(ipoib_hw_addr_t);<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->prot_size = 
p_arp->prot_size;<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->op = 
p_arp->op;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ipoib_addr_set_qpn( 
&p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn );<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC 
);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_gid_set_default( &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->src_ip = p_arp->src_ip;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Get the endpoint referenced by the dst_hw address. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
net32_t                
qpn = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __endpt_mgr_get_gid_qpn( s_buf->p_port, 
p_arp->dst_hw,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed lookup of destination HW address\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></P>
<P class=MsoNormal>+    ib_gid_set_default( 
&p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P class=MsoNormal>+        
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->src_ip = 
p_arp->src_ip;<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_memcmp( &p_arp->dst_hw, 
&null_hw, sizeof(mac_addr_t) ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Get the 
endpoint referenced by the dst_hw address. */<o:p></o:p></P>
<P class=MsoNormal>+        net32_t qpn = 
0;<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__endpt_mgr_get_gid_qpn( s_buf->p_port, p_arp->dst_hw,<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed lookup of destination HW address\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_arp->op == ARP_OP_REP && <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->params.cm_enabled && <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cm_state_t         
cm_state;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cm_state = <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
( cm_state_t )InterlockedCompareExchange( (volatile LONG 
*)&p_desc->p_endpt->conn.state,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
switch( cm_state )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
case IPOIB_CM_DISCONNECTED:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
                
("ARP REPLY pending Endpt[%p] QPN %#x MAC 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->p_endpt, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->p_endpt->mac.addr[0], 
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->p_endpt->mac.addr[2], 
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                                              
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></P>
<P class=MsoNormal>+        if( p_arp->op 
== ARP_OP_REP && <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->params.cm_enabled && <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cm_state_t  cm_state;<o:p></o:p></P>
<P 
class=MsoNormal>+            
cm_state = <o:p></o:p></P>
<P 
class=MsoNormal>+                
( cm_state_t )InterlockedCompareExchange( (volatile LONG 
*)&p_desc->p_endpt->conn.state,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>+            
switch( cm_state )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
case IPOIB_CM_DISCONNECTED:<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("ARP REPLY pending Endpt[%p] QPN %#x MAC 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->p_endpt, <o:p></o:p></P>
<P 
class=MsoNormal>+                        
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->p_endpt->mac.addr[0], 
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->p_endpt->mac.addr[2], 
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></P>
<P 
class=MsoNormal>+                                        
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, 
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                                                                              
&p_desc->p_endpt->list_item, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                                                                              
&p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
case IPOIB_CM_CONNECT:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
/* queue ARP REP packet until connected */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+                    
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P 
class=MsoNormal>+                        
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, 
<o:p></o:p></P>
<P 
class=MsoNormal>+                                                
&p_desc->p_endpt->list_item, <o:p></o:p></P>
<P 
class=MsoNormal>+                                                
&p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
case IPOIB_CM_CONNECT:<o:p></o:p></P>
<P 
class=MsoNormal>+                
/* queue ARP REP packet until connected */<o:p></o:p></P>
<P class=MsoNormal>+   
                 NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P 
class=MsoNormal>+                    
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>+            
default:<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memclr( &p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_memclr( 
&p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> #if 0 //DBG<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(" ARP %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
( p_ib_arp->op == ARP_OP_REP ? "REP": 
"REQ"),                                             
p_desc->p_endpt, <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->p_endpt->cm_flag, <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->p_endpt->mac.addr[0], 
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->p_endpt->mac.addr[2], 
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] 
));<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P class=MsoNormal>+        (" ARP %s SEND to 
ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
( p_ib_arp->op == ARP_OP_REP ? "REP": 
"REQ"),           
p_desc->p_endpt, <o:p></o:p></P>
<P 
class=MsoNormal>+            
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->p_endpt->cm_flag, <o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->p_endpt->mac.addr[0], 
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->p_endpt->mac.addr[2], 
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] 
));<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ib_arp->dst_ip = p_arp->dst_ip;<o:p></o:p></P>
<P class=MsoNormal>+    p_ib_arp->dst_ip = 
p_arp->dst_ip;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[1].length = 
sizeof(ipoib_arp_pkt_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[1].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].vaddr = 
cl_get_physaddr( p_ib_arp );<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].length 
= sizeof(ipoib_arp_pkt_t);<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 
2;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.p_next = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_queue(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ipoib_endpt_t** 
const       pp_endpt )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
status;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
//No need in spinlock, this function is already under lock <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_qlist_count( &p_port->send_mgr.pending_list ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Pending list not empty.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Check the send queue and pend the 
request if not empty. */<o:p></o:p></P>
<P class=MsoNormal>+    //No need in spinlock, this function is 
already under lock <o:p></o:p></P>
<P class=MsoNormal>+    if( cl_qlist_count( 
&p_port->send_mgr.pending_list ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Pending list not empty.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("No available WQEs.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_dbg_out("HW is full\n");<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Check the send queue and pend the 
request if not empty. */<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->send_mgr.depth == 
p_port->p_adapter->params.sq_depth )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("No available WQEs.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        cl_dbg_out("HW is 
full\n");<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( GetEndpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called 
for %p\n", *pp_endpt));<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+    status = __endpt_mgr_ref( p_port, 
p_eth_hdr->dst, pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", *pp_endpt));<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join mcast 
from send_mgr_queue\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Multicast Mac - trying to join.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else if ( status == NDIS_STATUS_SUCCESS && <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
  ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&  
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
  !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( (*pp_endpt) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( status == 
NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></P>
<P class=MsoNormal>+        ETH_IS_MULTICAST( 
p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join mcast from 
send_mgr_queue\n"));<o:p></o:p></P>
<P class=MsoNormal>+        if( 
ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></P>
<P 
class=MsoNormal>+            
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Multicast Mac - trying to join.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else if ( status == NDIS_STATUS_SUCCESS 
&& <o:p></o:p></P>
<P 
class=MsoNormal>+              
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&  <o:p></o:p></P>
<P 
class=MsoNormal>+              
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
(*pp_endpt) );<o:p></o:p></P>
<P class=MsoNormal>+        
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></P>
<P class=MsoNormal>+        
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_send_desc(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
MDL* 
const                                                                        
p_mdl,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
size_t                                                                                    
mdl_len,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_send_NB_SG                                        
*s_buf)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
MDL* 
const                  
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
size_t                      
mdl_len,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_send_NB_SG            
*s_buf)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
int32_t                                                  
hdr_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG 
                                                                
mss = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
int32_t             
hdr_idx;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG               
mss = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO 
                                   
p_checksum_list_info = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info = 
NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendMgrFilter );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO          
p_checksum_list_info = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO   p_lso_info = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendMgrFilter 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Store context in our reserved area of the packet. */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* Store context in our reserved area of 
the packet. */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(s_buf == (ipoib_send_NB_SG *) 
IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_endpt = p_desc->p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO IMPORTANT: Send buffer should not be allocated within global struct 
!!!<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Otherwise, the next send may override its content<o:p></o:p></P>
<P 
class=MsoNormal>-              
//s_buf->p_send_buf= p_desc->p_buf;<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(s_buf == (ipoib_send_NB_SG *) 
IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_endpt = 
p_desc->p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    //TODO IMPORTANT: Send buffer should not 
be allocated within global struct !!!<o:p></o:p></P>
<P class=MsoNormal>+    // Otherwise, the next send may override 
its content<o:p></o:p></P>
<P class=MsoNormal>+    //s_buf->p_send_buf= 
p_desc->p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Format the send descriptor. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
PVOID* ppTemp 
                             
= &NET_BUFFER_LIST_INFO(s_buf->p_nbl, 
TcpIpChecksumNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>+    /* Format the send descriptor. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    PVOID* 
ppTemp       = 
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, 
TcpIpChecksumNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>     p_checksum_list_info = 
<o:p></o:p></P>
<P 
class=MsoNormal>                         
(PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO) ((PULONG)ppTemp); <o:p></o:p></P>
<P 
class=MsoNormal>-              
// Calculate LSO<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></P>
<P class=MsoNormal>+    // Calculate LSO<o:p></o:p></P>
<P class=MsoNormal>+    if( 
s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_lso_info =<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG) 
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, 
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(p_lso_info);<o:p></o:p></P>
<P class=MsoNormal>-    
          ULONG LsoType = 
p_lso_info->Transmit.Type;<o:p></o:p></P>
<P class=MsoNormal>+        p_lso_info 
=<o:p></o:p></P>
<P 
class=MsoNormal>+            
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG) 
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, 
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(p_lso_info);<o:p></o:p></P>
<P class=MsoNormal>+        ULONG LsoType = 
p_lso_info->Transmit.Type;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
    mss = p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ULONG PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if  (PacketLength < mss) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
    if(LsoType == NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) 
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
        
ASSERT(p_lso_info->LsoV2Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></P>
<P 
class=MsoNormal>-              
        ASSERT(mss == 
p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></P>
<P 
class=MsoNormal>-              
        
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset == 
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></P>
<P 
class=MsoNormal>-              
    }<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Format the send descriptor. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
hdr_idx = cl_atomic_inc( &s_buf->p_port->hdr_idx );<o:p></o:p></P>
<P 
class=MsoNormal>-              
hdr_idx &= (s_buf->p_port->p_adapter->params.sq_depth - 
1);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT( hdr_idx < s_buf->p_port->p_adapter->params.sq_depth 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_port->hdr[hdr_idx].type = p_eth_hdr->type;<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_port->hdr[hdr_idx].resv = 0;<o:p></o:p></P>
<P class=MsoNormal>+        mss = 
p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></P>
<P class=MsoNormal>+        ULONG 
PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></P>
<P class=MsoNormal>+        if  
(PacketLength < mss) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if(LsoType == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(p_lso_info->LsoV2Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(mss == p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset == 
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+    /* Format the send descriptor. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    hdr_idx = cl_atomic_inc( 
&s_buf->p_port->hdr_idx );<o:p></o:p></P>
<P class=MsoNormal>+    hdr_idx &= 
(s_buf->p_port->p_adapter->params.sq_depth - 1);<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT( hdr_idx < 
s_buf->p_port->p_adapter->params.sq_depth );<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_port->hdr[hdr_idx].type = 
p_eth_hdr->type;<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_port->hdr[hdr_idx].resv = 
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO why we enter this block for LSO ???<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( 
&s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].local_ds[0].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.send_opt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//Init send buffer to 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    //TODO why we enter this block for LSO 
???<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[0].vaddr = 
cl_get_physaddr( &s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[0].length 
= sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].local_ds[0].lkey = 
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.send_opt = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    //Init send buffer to 0<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (mss && (p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We 
have LSO packet<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT( mss == (p_lso_info->LsoV1Transmit.MSS & 
p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//ASSERT ( (mss & (1<<20)) == mss);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info, 
s_buf->p_curr_nb);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
uint32_t               
i;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( SendMgrFilter );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+    if (mss && 
(p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We have LSO 
packet<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        ASSERT( mss == 
(p_lso_info->LsoV1Transmit.MSS & 
p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></P>
<P class=MsoNormal>+        //ASSERT ( (mss 
& (1<<20)) == mss);<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info, 
s_buf->p_curr_nb);<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
uint32_t    i;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
SendMgrFilter );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, SendMgrFilter );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i].wr.dgrm.ud.remote_qp = 
p_desc->p_endpt->qpn;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey = 
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i].wr.dgrm.ud.h_av = 
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i].wr.dgrm.ud.pkey_index = 
s_buf->p_port->pkey_index;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_desc->send_dir == SEND_UD_QP )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></P>
<P 
class=MsoNormal>+            
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P class=MsoNormal>+   
             p_desc->send_wr[i].wr.dgrm.ud.remote_qp 
= p_desc->p_endpt->qpn;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey = 
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[i].wr.dgrm.ud.h_av = 
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P class=MsoNormal>+  
              p_desc->send_wr[i].wr.dgrm.ud.pkey_index 
= s_buf->p_port->pkey_index;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( s_buf->p_port->p_adapter->params.send_chksum_offload 
                
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_checksum_list_info 
                                                                                                  
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
( p_checksum_list_info->Transmit.IsIPv4  || <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_checksum_list_info->Transmit.IsIPv6  ))<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
// Set transimition checksum offloading<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
if( p_checksum_list_info->Transmit.TcpChecksum || 
p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else // RC QP<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[i].wr.ds_array = 
&p_desc->send_wr[i].local_ds[0];<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( i )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[i-1].wr.p_next = 
&p_desc->send_wr[i].wr;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf 
;<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( 
s_buf->p_port->p_adapter->params.send_chksum_offload    
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_checksum_list_info                            
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                    
( p_checksum_list_info->Transmit.IsIPv4  || <o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_checksum_list_info->Transmit.IsIPv6  ))<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
// Set transimition checksum offloading<o:p></o:p></P>
<P 
class=MsoNormal>+                    
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P 
class=MsoNormal>+                    
if( p_checksum_list_info->Transmit.TcpChecksum || 
p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else // RC 
QP<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        for( i = 0; i 
< p_desc->num_wrs; i++ )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[i].wr.ds_array = 
&p_desc->send_wr[i].local_ds[0];<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( i )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[i-1].wr.p_next = 
&p_desc->send_wr[i].wr;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf 
;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= 
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= 
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P class=MsoNormal>+        
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_lso_desc(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ULONG                                                                                 
mss,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
int32_t                                                                                  
hdr_idx, <o:p></o:p></P>
<P 
class=MsoNormal>-              
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
NET_BUFFER                                                                      
*p_netbuf)<o:p></o:p></P>
<P class=MsoNormal>+    
IN           
   ipoib_port_t* 
const         p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ULONG                       
mss,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
int32_t                     
hdr_idx, <o:p></o:p></P>
<P class=MsoNormal>+    IN 
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
NET_BUFFER                  
*p_netbuf)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
LsoData                                                                                                                                
TheLsoData;<o:p></o:p></P>
<P 
class=MsoNormal>-              
UINT                                                                                                                      
IndexOfData = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
LsoData                             
TheLsoData;<o:p></o:p></P>
<P class=MsoNormal>+    
UINT              
                  IndexOfData 
= 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG * s_buf = IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG * s_buf = 
IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_desc_t *p_desc = 
p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO What if first NB was inserted to pending list ????<o:p></o:p></P>
<P 
class=MsoNormal>-              
PNET_BUFFER   FirstBuffer  = NET_BUFFER_LIST_FIRST_NB 
(s_buf->p_nbl);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG 
                                                
PacketLength = NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></P>
<P class=MsoNormal>+    //TODO What if first NB was inserted to 
pending list ????<o:p></o:p></P>
<P class=MsoNormal>+    PNET_BUFFER     
FirstBuffer  = NET_BUFFER_LIST_FIRST_NB (s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG           PacketLength = 
NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
memset(&TheLsoData, 0, sizeof TheLsoData );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = GetLsoHeaderSize(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
FirstBuffer, <o:p></o:p></P>
<P 
class=MsoNormal>-                              
&TheLsoData, <o:p></o:p></P>
<P 
class=MsoNormal>-                              
&IndexOfData,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P class=MsoNormal>+    memset(&TheLsoData, 0, sizeof 
TheLsoData );<o:p></o:p></P>
<P class=MsoNormal>+    status = GetLsoHeaderSize(<o:p></o:p></P>
<P class=MsoNormal>+        FirstBuffer, 
<o:p></o:p></P>
<P class=MsoNormal>+        &TheLsoData, 
<o:p></o:p></P>
<P class=MsoNormal>+        
&IndexOfData,<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if ((status != NDIS_STATUS_SUCCESS ) || <o:p></o:p></P>
<P 
class=MsoNormal>-                              
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+    if ((status != NDIS_STATUS_SUCCESS ) || 
<o:p></o:p></P>
<P class=MsoNormal>+        
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this 
packet\n"));<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this 
packet\n"));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status == NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Tell NDIS how much we will send.<o:p></o:p></P>
<P 
class=MsoNormal>-              
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = 
UlongToPtr(PacketLength);<o:p></o:p></P>
<P 
class=MsoNormal>-              
//p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Tell NDIS how much we will send.<o:p></o:p></P>
<P 
class=MsoNormal>-              
if(p_lso_info->LsoV1Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></P>
<P class=MsoNormal>+        if( status == 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(TheLsoData.LsoHeaderSize > 
0);<o:p></o:p></P>
<P class=MsoNormal>+    // Tell NDIS how much we will 
send.<o:p></o:p></P>
<P class=MsoNormal>+    
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = 
UlongToPtr(PacketLength);<o:p></o:p></P>
<P class=MsoNormal>+    
//p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    // Tell NDIS how much we will 
send.<o:p></o:p></P>
<P class=MsoNormal>+    if(p_lso_info->LsoV1Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></P>
<P class=MsoNormal>     {<o:p></o:p></P>
<P class=MsoNormal>-    
                          
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) += 
PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P class=MsoNormal>-    
                          
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P class=MsoNormal>-    
                          
<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) += 
PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P 
class=MsoNormal>+            
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.mss = mss;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.header = 
TheLsoData.LsoBuffers[0].pData;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize 
;//lso_header_size; <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.remote_qp = 
p_desc->p_endpt->qpn;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = 
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.h_av = 
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.pkey_index = 
p_port->pkey_index;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.mss = 
mss;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.header = 
TheLsoData.LsoBuffers[0].pData;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.hlen = 
TheLsoData.LsoHeaderSize ;//lso_header_size; <o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[0].wr.dgrm.ud.remote_qp = 
p_desc->p_endpt->qpn;<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = 
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.h_av = 
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[0].wr.dgrm.ud.pkey_index = 
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.rsvd = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.wr_id = (uintn_t)s_buf;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.ds_array = 
p_desc->send_wr[0].local_ds;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.wr_type = WR_LSO;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.send_opt = <o:p></o:p></P>
<P 
class=MsoNormal>-                              
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | 
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_qp = p_port->ib_mgr.h_qp;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __send_gen( s_buf, IndexOfData, TheLsoData.LsoHeaderSize 
);<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.wr_id = 
(uintn_t)s_buf;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.ds_array = 
p_desc->send_wr[0].local_ds;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.wr_type = 
WR_LSO;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.send_opt = 
<o:p></o:p></P>
<P class=MsoNormal>+        
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | 
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_wr[0].wr.p_next = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_qp = 
p_port->ib_mgr.h_qp;<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->send_dir = 
SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+    status = __send_gen( s_buf, IndexOfData, 
TheLsoData.LsoHeaderSize );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -5182,7 +5229,7 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>     ULONG i = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
int j=0;<o:p></o:p></P>
<P class=MsoNormal>+    int j=0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>     UINT  buf_len = 
NET_BUFFER_DATA_LENGTH(NetBuff);<o:p></o:p></P>
<P class=MsoNormal>     PMDL pMdl = 
NET_BUFFER_CURRENT_MDL(NetBuff);<o:p></o:p></P>
<P class=MsoNormal>@@ -5195,7 +5242,7 @@<o:p></o:p></P>
<P class=MsoNormal> #ifdef DBG<o:p></o:p></P>
<P class=MsoNormal>     ASSERT(PhysBufCount <= 
MAX_PHYS_BUF_FRAG_ELEMENTS);<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal>     <o:p></o:p></P>
<P class=MsoNormal>     ASSERT(buf_len > 
0);<o:p></o:p></P>
<P class=MsoNormal>@@ -5221,7 +5268,7 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>         ASSERT( 
(buf_len > 0) && (MdlBytesCount > 0) );<o:p></o:p></P>
<P class=MsoNormal>  <o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList: pMdl=%p, 
MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount, 
MdlBufCount));<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList: pMdl=%p, 
MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount, 
MdlBufCount));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>         if 
(MdlBytesCount > 0)<o:p></o:p></P>
<P class=MsoNormal>         
{<o:p></o:p></P>
<P class=MsoNormal>@@ -5274,7 +5321,7 @@<o:p></o:p></P>
<P class=MsoNormal>           
          {<o:p></o:p></P>
<P 
class=MsoNormal>                         
<o:p></o:p></P>
<P 
class=MsoNormal>                         
ULONG size = min(PAGE_SIZE, MdlBytesCount);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
i -= 1;<o:p></o:p></P>
<P 
class=MsoNormal>+                        
i -= 1;<o:p></o:p></P>
<P 
class=MsoNormal>                         
pFragList->Elements[i].Length += size;<o:p></o:p></P>
<P 
class=MsoNormal>                         
MdlBytesCount -= size;<o:p></o:p></P>
<P 
class=MsoNormal>                     
}<o:p></o:p></P>
<P class=MsoNormal>@@ -5331,517 +5378,517 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_send(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>     IN  
NET_BUFFER_LIST     *p_net_buffer_list,<o:p></o:p></P>
<P class=MsoNormal>     IN  
ULONG               
send_flags)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PNET_BUFFER                                   
p_netbuf, p_next_netbuf = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
UINT 
                                                     
buf_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG                                                 
send_complete_flags = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
KIRQL                                                    
old_irql;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( BuildSendDesc );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( QueuePacket );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendMgrQueue );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PostSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_STATUS         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
PNET_BUFFER         p_netbuf, 
p_next_netbuf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
UINT                
buf_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
ULONG               
send_complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    
KIRQL               
old_irql;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( BuildSendDesc 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( QueuePacket 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendMgrQueue 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ProcessFailedSends 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//TODO Tzachid: make an assert here to validate your IRQL<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT (KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
old_irql = DISPATCH_LEVEL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, 
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_net_buffer_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
send_complete_flags);  <o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if 
(NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        //TODO Tzachid: 
make an assert here to validate your IRQL<o:p></o:p></P>
<P class=MsoNormal>+        ASSERT 
(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+        old_irql = 
DISPATCH_LEVEL;<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></P>
<P class=MsoNormal>+        //ASSERT 
(KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags, 
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->state != IB_QPS_RTS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></P>
<P class=MsoNormal>+        
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+        
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_net_buffer_list,<o:p></o:p></P>
<P 
class=MsoNormal>+            
send_complete_flags);  <o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
// You are already here at dispatch<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    // You are already here at 
dispatch<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
// We need to init the status here<o:p></o:p></P>
<P 
class=MsoNormal>-              
// When completing the send, we will set the status NDIS_STATUS_FAILURE if AT 
LEAST<o:p></o:p></P>
<P 
class=MsoNormal>-              
// one of NBs will fail.<o:p></o:p></P>
<P 
class=MsoNormal>-              
// That is, status can't be updated back to SUCCESS if it previosly was set to 
FAILURE<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    // We need to init the status 
here<o:p></o:p></P>
<P class=MsoNormal>+    // When completing the send, we will set 
the status NDIS_STATUS_FAILURE if AT LEAST<o:p></o:p></P>
<P class=MsoNormal>+    // one of NBs will fail.<o:p></o:p></P>
<P class=MsoNormal>+    // That is, status can't be updated back 
to SUCCESS if it previosly was set to FAILURE<o:p></o:p></P>
<P class=MsoNormal>+    NET_BUFFER_LIST_STATUS(p_net_buffer_list) 
= NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_netbuf != NULL; <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_netbuf = NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
++g_ipoib_send_SW;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
++buf_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    for (p_netbuf = 
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+         p_netbuf != 
NULL; <o:p></o:p></P>
<P class=MsoNormal>+         p_netbuf = 
NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
++g_ipoib_send_SW;<o:p></o:p></P>
<P class=MsoNormal>+        
++buf_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list, 
buf_cnt));<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, 
IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list, 
buf_cnt));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(buf_cnt);<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Raise reference count of the NBL to the number of its NBs<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) = 
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(buf_cnt);<o:p></o:p></P>
<P class=MsoNormal>+    // Raise reference count of the NBL to 
the number of its NBs<o:p></o:p></P>
<P class=MsoNormal>+    
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) = 
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_netbuf != NULL; <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_netbuf = p_next_netbuf)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_next_netbuf = NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+    for (p_netbuf = 
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+         p_netbuf != 
NULL; <o:p></o:p></P>
<P class=MsoNormal>+         p_netbuf = 
p_next_netbuf)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_next_netbuf = 
NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG*) (PVOID) 
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (s_buf == NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_net_buffer_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
send_complete_flags);  
               
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_send_NB_SG 
* s_buf = (ipoib_send_NB_SG*) (PVOID) 
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></P>
<P class=MsoNormal>+        if (s_buf == 
NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_net_buffer_list,<o:p></o:p></P>
<P 
class=MsoNormal>+                
send_complete_flags);   <o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
//Set all the data needed for process_sg_list<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_port = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_sgl = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_endpt = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_nbl = p_net_buffer_list;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//TODO remove this line from process_sg_real<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P class=MsoNormal>+        //Set all the 
data needed for process_sg_list<o:p></o:p></P>
<P class=MsoNormal>+        s_buf->p_port 
= p_port;<o:p></o:p></P>
<P class=MsoNormal>+        s_buf->p_sgl = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+        s_buf->p_endpt 
= NULL;<o:p></o:p></P>
<P class=MsoNormal>+        s_buf->p_nbl = 
p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+        
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></P>
<P class=MsoNormal>+        //TODO remove 
this line from process_sg_real<o:p></o:p></P>
<P class=MsoNormal>+        
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
//We can also define p_sg_buf as a static member of send_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// But the problem is that we don't know it's size<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (s_buf->p_sg_buf == NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
s_buf->p_sg_buf = (PVOID) 
cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></P>
<P class=MsoNormal>+        //We can also 
define p_sg_buf as a static member of send_buf,<o:p></o:p></P>
<P class=MsoNormal>+        // But the 
problem is that we don't know it's size<o:p></o:p></P>
<P class=MsoNormal>+        if 
(s_buf->p_sg_buf == NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
s_buf->p_sg_buf = (PVOID) 
cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool , 
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT(pTemp != NULL);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_sgl = pTemp;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf, 
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
                                
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x, PhysBufCnt=%ld, NB 
LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) 
,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, 
p_netbuf);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-#else                                   
<o:p></o:p></P>
<P 
class=MsoNormal>+            
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool , 
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT(pTemp != NULL);<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_sgl = pTemp;<o:p></o:p></P>
<P 
class=MsoNormal>+            
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf, 
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x, PhysBufCnt=%ld, NB 
LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                        
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) 
,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                        
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, 
p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+       
     status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>+#else           
<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P 
class=MsoNormal>+            
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++g_ipoib_send_SW_in_loop;<o:p></o:p></P>
<P 
class=MsoNormal>+            
++g_ipoib_send_SW_in_loop;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(s_buf->p_sg_buf);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = NdisMAllocateNetBufferSGList(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
p_netbuf,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
s_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
p_port->p_adapter->sg_list_size);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_acquire( &p_port->send_lock 
);                       
<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(s_buf->p_sg_buf);<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = NdisMAllocateNetBufferSGList(<o:p></o:p></P>
<P 
class=MsoNormal>+                                    
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P 
class=MsoNormal>+                                    
p_netbuf,<o:p></o:p></P>
<P 
class=MsoNormal>+                                    
s_buf,<o:p></o:p></P>
<P 
class=MsoNormal>+                                    
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></P>
<P 
class=MsoNormal>+                                    
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></P>
<P 
class=MsoNormal>+                                    
p_port->p_adapter->sg_list_size);<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+ 
           cl_spinlock_acquire( 
&p_port->send_lock );      <o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-//                          
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P class=MsoNormal>+//      }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
// TODOD: There is a bug here if we have succeeded in sending some and 
failed<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
// with the otheres.<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
// TODOD: There is a bug here if we have succeeded in sending some and 
failed<o:p></o:p></P>
<P 
class=MsoNormal>+            
// with the otheres.<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* fail net buffer list */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_net_buffer_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
send_complete_flags);  
               
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_LOWER_IRQL(old_irql, DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P 
class=MsoNormal>+            
/* fail net buffer list */<o:p></o:p></P>
<P 
class=MsoNormal>+            
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_net_buffer_list,<o:p></o:p></P>
<P 
class=MsoNormal>+                
send_complete_flags);   <o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_LOWER_IRQL(old_irql, 
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void <o:p></o:p></P>
<P class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
ipoib_send_NB_SG        *s_buf, 
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           NDIS_STATUS 
                   
status,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
ULONG                                                 
compl_flags,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN           
boolean_t                                           
bLock    ) <o:p></o:p></P>
<P class=MsoNormal>+    IN  
ipoib_send_NB_SG    *s_buf, <o:p></o:p></P>
<P class=MsoNormal>+    IN  
NDIS_STATUS         
status,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
ULONG               
compl_flags,<o:p></o:p></P>
<P class=MsoNormal>+    IN  
boolean_t           
bLock   ) <o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( s_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("Processing send completion for NBL=0x%p .\n",  s_buf->p_nbl 
));<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
// Free SGL element allocated by NDIS<o:p></o:p></P>
<P 
class=MsoNormal>-              
// We should do it before freeing the whole NBL<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisMFreeNetBufferSGList(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
s_buf->p_sgl,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
s_buf->p_curr_nb);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
// No need to delete p_sg_buf at this state, we will destroy the whole list at 
the end of the execution<o:p></o:p></P>
<P 
class=MsoNormal>-              
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( s_buf );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT(TRACE_LEVEL_VERBOSE, 
IPOIB_DBG_SEND,<o:p></o:p></P>
<P class=MsoNormal>+        ("Processing send 
completion for NBL=0x%p .\n",  s_buf->p_nbl ));<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    // Free SGL element allocated by 
NDIS<o:p></o:p></P>
<P class=MsoNormal>+    // We should do it before freeing the 
whole NBL<o:p></o:p></P>
<P class=MsoNormal>+    NdisMFreeNetBufferSGList(<o:p></o:p></P>
<P 
class=MsoNormal>+                            
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P 
class=MsoNormal>+                            
s_buf->p_sgl,<o:p></o:p></P>
<P class=MsoNormal>+ 
                           s_buf->p_curr_nb);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    // No need to delete p_sg_buf at this 
state, we will destroy the whole list at the end of the execution<o:p></o:p></P>
<P class=MsoNormal>+    
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (NET_BUFFER_LIST_STATUS(s_buf->p_nbl) != NDIS_STATUS_FAILURE) 
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//TODO what about other statuses ?????<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if 
(NET_BUFFER_LIST_STATUS(s_buf->p_nbl) != NDIS_STATUS_FAILURE) 
{<o:p></o:p></P>
<P class=MsoNormal>+        //TODO what about 
other statuses ?????<o:p></o:p></P>
<P class=MsoNormal>+        
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P class=MsoNormal>+    NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = 
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch (status) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++g_ipoib_send_ack;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++g_ipoib_send_reset;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_FAILURE:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_PAUSED:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_SEND_ABORTED:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
case NDIS_STATUS_RESOURCES:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Complete the NBL */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo = 
         <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) 
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl, 
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>+    switch (status) {<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P 
class=MsoNormal>+            
++g_ipoib_send_ack;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></P>
<P 
class=MsoNormal>+            
++g_ipoib_send_reset;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_FAILURE:<o:p></o:p></P>
<P 
class=MsoNormal>+            
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_PAUSED:<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_SEND_ABORTED:<o:p></o:p></P>
<P class=MsoNormal>+        case 
NDIS_STATUS_RESOURCES:<o:p></o:p></P>
<P class=MsoNormal>+        
default:<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+    
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+    /* Complete the NBL */<o:p></o:p></P>
<P class=MsoNormal>+    if 
(IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></P>
<P class=MsoNormal>+        
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P class=MsoNormal>+        
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =    
<o:p></o:p></P>
<P class=MsoNormal>+    
        (PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) 
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl, 
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>         
if(pLsoInfo->Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{            
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
UINT TcpPayLoad = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
                                
//TODO optimize this code during MSS/LSO building<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
for (PNET_BUFFER NetBuffer = 
NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
     NetBuffer != NULL ; <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
     NetBuffer = 
NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pLsoInfo->LsoV1TransmitComplete.TcpPayload = 
TcpPayLoad;            
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
    else if (pLsoInfo->Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></P>
<P 
class=MsoNormal>-              
    {<o:p></o:p></P>
<P 
class=MsoNormal>-              
        
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
        
pLsoInfo->LsoV2TransmitComplete.Type = 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
    }<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (bLock) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_spinlock_acquire( &s_buf->p_port->send_lock );  
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
} <o:p></o:p></P>
<P class=MsoNormal>+        
{            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
UINT TcpPayLoad = 0;<o:p></o:p></P>
<P class=MsoNormal>+  
          //TODO optimize this 
code during MSS/LSO building<o:p></o:p></P>
<P 
class=MsoNormal>+            
for (PNET_BUFFER NetBuffer = 
NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></P>
<P 
class=MsoNormal>+                 
NetBuffer != NULL ; <o:p></o:p></P>
<P 
class=MsoNormal>+                 
NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+                
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
pLsoInfo->LsoV1TransmitComplete.TcpPayload = 
TcpPayLoad;            
<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        else if 
(pLsoInfo->Transmit.Type == 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
pLsoInfo->LsoV2TransmitComplete.Type = 
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if (bLock) 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_spinlock_acquire( &s_buf->p_port->send_lock );  
<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    } <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( s_buf->p_send_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( FreeSendBuf );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisFreeToNPagedLookasideList( 
&s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
s_buf->p_send_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Dereference the enpoint used for the transfer. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( s_buf->p_endpt ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>-#if 0      <o:p></o:p></P>
<P 
class=MsoNormal>-              
if (status == NDIS_STATUS_SUCCESS) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//++g_ipoib_send_SG_real;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+                                
<o:p></o:p></P>
<P class=MsoNormal>+    if( s_buf->p_send_buf )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
FreeSendBuf );<o:p></o:p></P>
<P class=MsoNormal>+        
NdisFreeToNPagedLookasideList( 
&s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P 
class=MsoNormal>+            
s_buf->p_send_buf );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></P>
<P class=MsoNormal>+    }   <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* Dereference the enpoint used for the 
transfer. */<o:p></o:p></P>
<P class=MsoNormal>+    if( s_buf->p_endpt ) {<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+#if 0   <o:p></o:p></P>
<P class=MsoNormal>+    if (status == NDIS_STATUS_SUCCESS) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
//++g_ipoib_send_SG_real;<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
//Put back into the pool list structure allocated for the NB<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t* 
)s_buf);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, SendComp );<o:p></o:p></P>
<P class=MsoNormal>+    //Put back into the pool list structure 
allocated for the NB<o:p></o:p></P>
<P class=MsoNormal>+    
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t* 
)s_buf);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, SendComp );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_resume(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN 
boolean_t                                                                                                                     
b_pending )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN 
boolean_t                                
b_pending )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_list_item_t                    
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG        *s_buf = 
NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
boolean_t                                           
b_good_port_state = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( BuildSendDesc );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+    
cl_list_item_t      *p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG    *s_buf 
= NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
boolean_t           
b_good_port_state = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( BuildSendDesc 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( ProcessFailedSends 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM(b_pending);<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM(b_pending);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Invalid port state =%d - Flushing the penging list\n", p_port->state) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
b_good_port_state = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(KeGetCurrentIrql() == 
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->state != IB_QPS_RTS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Invalid port state =%d - Flushing the penging list\n", p_port->state) 
);<o:p></o:p></P>
<P class=MsoNormal>+        b_good_port_state 
= FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if (p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
};<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item =  cl_qlist_remove_head( &p_port->send_mgr.pending_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
while (p_item != 
cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P class=MsoNormal>+    if 
(p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    };<o:p></o:p></P>
<P class=MsoNormal>+    p_item =  cl_qlist_remove_head( 
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+    while (p_item != 
cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this 
casting<o:p></o:p></P>
<P class=MsoNormal>+        s_buf = 
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (!b_good_port_state) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
// Port is in error state, flush the list<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__send_complete_net_buffer(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, 
FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
} else {<o:p></o:p></P>
<P class=MsoNormal>+        if 
(!b_good_port_state) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
// Port is in error state, flush the list<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
__send_complete_net_buffer(<o:p></o:p></P>
<P 
class=MsoNormal>+                
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, 
FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
    <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("No available WQEs.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item  
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL, 
(PSCATTER_GATHER_LIST) s_buf->p_sgl, s_buf);<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth 
)<o:p></o:p></P>
<P class=MsoNormal>+        
    {<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("No available WQEs.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item  
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL, 
(PSCATTER_GATHER_LIST) s_buf->p_sgl, s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P 
class=MsoNormal>+            
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if (!continue_sending) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list, 
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
goto Cleanup;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item =  cl_qlist_remove_head( &p_port->send_mgr.pending_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if (!continue_sending) {<o:p></o:p></P>
<P 
class=MsoNormal>+                
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list, 
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></P>
<P 
class=MsoNormal>+                
goto Cleanup;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P class=MsoNormal>+        p_item =  
cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> Cleanup:<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO: use s_buf-><data_member> directly, 
instead of useless copies<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
ib_cq_handle_t                                                                
h_cq,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                                                       
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
ib_cq_handle_t              
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                        
*cq_context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_wc_t                                                                
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_t                                              
done_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t                   
*p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ip_stat_sel_t                     
type;<o:p></o:p></P>
<P 
class=MsoNormal>-              
size_t                                                    
i;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NET_BUFFER                                      
*p_netbuffer = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG        
*s_buf;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+   
 ib_wc_t             
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_qlist_t          
done_list;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t       *p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    
ip_stat_sel_t       type;<o:p></o:p></P>
<P class=MsoNormal>+    
size_t              
i;<o:p></o:p></P>
<P class=MsoNormal>+    
NET_BUFFER          *p_netbuffer = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG    
*s_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendCompBundle );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendCb );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PollSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( SendComp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( FreeSendBuf );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( RearmSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( PortResume );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendCompBundle 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendCb );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PollSend );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( SendComp );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( FreeSendBuf 
);<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( RearmSend );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( PortResume 
);<o:p></o:p></P>
<P class=MsoNormal>  <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(KeGetCurrentIrql() == 
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_clr( SendCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_clr( SendCompBundle 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( SendCb );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( SendCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &done_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &done_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_send_cb );<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_send_cb 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
for( i = 0; i < MAX_SEND_WC; i++ )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
wc[i].p_next = &wc[i + 1];<o:p></o:p></P>
<P 
class=MsoNormal>-              
wc[MAX_SEND_WC - 1].p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    for( i = 0; i < MAX_SEND_WC; i++ 
)<o:p></o:p></P>
<P class=MsoNormal>+        wc[i].p_next = 
&wc[i + 1];<o:p></o:p></P>
<P class=MsoNormal>+    wc[MAX_SEND_WC - 1].p_next = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
do<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_free = wc;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_start( PollSend );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = p_port->p_adapter->p_ifc->poll_cq( 
p_port->ib_mgr.h_send_cq, &p_free, &p_wc );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_perf_stop( &p_port->p_adapter->perf, PollSend );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal>+    do<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_free = 
wc;<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_start( 
PollSend );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq, 
&p_free, &p_wc );<o:p></o:p></P>
<P class=MsoNormal>+        cl_perf_stop( 
&p_port->p_adapter->perf, PollSend );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( status 
== IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
while( p_wc )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_start( SendComp );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND 
|| p_wc->wc_type == IB_WC_LSO);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Successfull send completion for NBL=0x%p .\n",  s_buf->p_nbl 
));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( s_buf );<o:p></o:p></P>
<P class=MsoNormal>+        while( p_wc 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+  
          cl_perf_start( 
SendComp );<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND 
|| p_wc->wc_type == IB_WC_LSO);<o:p></o:p></P>
<P 
class=MsoNormal>+            
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Successfull send completion for NBL=0x%p .\n",  s_buf->p_nbl 
));<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( s_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt = s_buf->p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt = s_buf->p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
switch( p_wc->status )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
case IB_WCS_SUCCESS:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( p_endpt->h_mcast )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
p_endpt->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
type = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
type = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
type = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
switch( p_wc->status )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
case IB_WCS_SUCCESS:<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( p_endpt->h_mcast )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF 
&&<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P 
class=MsoNormal>+                        
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P class=MsoNormal>+     
                   p_endpt->dgid.multicast.raw_group_id[13] 
== 0xFF )<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
type = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P 
class=MsoNormal>+                    
else<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
type = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
else<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
type = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ipoib_inc_send_stat( p_port->p_adapter, type, 
NET_BUFFER_DATA_LENGTH(p_netbuffer) );    <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></P>
<P 
class=MsoNormal>+                
ipoib_inc_send_stat( p_port->p_adapter, type, 
NET_BUFFER_DATA_LENGTH(p_netbuffer) );    <o:p></o:p></P>
<P 
class=MsoNormal>+             
   status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Flushed send completion.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P 
class=MsoNormal>+             
       ("Flushed send completion.\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></P>
<P 
class=MsoNormal>+                
<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status 
),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__send_complete_net_buffer(s_buf, status, 
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></P>
<P 
class=MsoNormal>+            
default:<o:p></o:p></P>
<P 
class=MsoNormal>+                
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status 
),<o:p></o:p></P>
<P 
class=MsoNormal>+                    
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+                
break;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
__send_complete_net_buffer(s_buf, status, 
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_wc = p_wc->p_next;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_perf_inc( SendCompBundle );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* If we didn't use up every WC, break out. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
} while( !p_free );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_wc = p_wc->p_next;<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_perf_inc( SendCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /* If we didn't 
use up every WC, break out. */<o:p></o:p></P>
<P class=MsoNormal>+    } while( !p_free );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Resume any sends awaiting resources. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( PortResume );<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_resume( p_port, TRUE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, PortResume );<o:p></o:p></P>
<P class=MsoNormal>+    /* Resume any sends awaiting resources. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( PortResume 
);<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_resume( p_port, TRUE 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, PortResume );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Rearm the CQ. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( RearmSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->rearm_cq( 
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, RearmSend );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+    /* Rearm the CQ. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( RearmSend 
);<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, RearmSend );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( status == IB_SUCCESS 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_send_cb );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, ref_send_cb 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, SendCb );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, SendCb );<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_update_ctr( 
&p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+    
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -5853,349 +5900,349 @@<o:p></o:p></P>
<P 
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qmap_init( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qmap_init( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_init( &p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_qmap_init( 
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    cl_qmap_init( 
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    cl_fmap_init( 
&p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO Restore CM<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
void*                     
p_context );<o:p></o:p></P>
<P class=MsoNormal>+IN      
void*       p_context );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_init(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_fmap_init( &p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisInitializeListHead( &p_port->endpt_mgr.pending_conns 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_event_init( &p_port->endpt_mgr.event, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
                
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_fmap_init( 
&p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
NdisInitializeListHead( &p_port->endpt_mgr.pending_conns 
);<o:p></o:p></P>
<P class=MsoNormal>+        
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P class=MsoNormal>+        cl_event_init( 
&p_port->endpt_mgr.event, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+        
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></P>
<P class=MsoNormal>+        
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_thread_init( &p_port->endpt_mgr.h_thread, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
__endpt_cm_mgr_thread,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
( const void *)p_port, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
"CmEndPtMgr" );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        cl_thread_init( 
&p_port->endpt_mgr.h_thread, <o:p></o:p></P>
<P 
class=MsoNormal>+                        
__endpt_cm_mgr_thread,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
( const void *)p_port, <o:p></o:p></P>
<P 
class=MsoNormal>+                        
"CmEndPtMgr" );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM(p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM(p_port);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO CM Restore<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
void*                     
p_context )<o:p></o:p></P>
<P class=MsoNormal>+IN      
void*       p_context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
ib_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
LIST_ENTRY                        
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t      *p_port =( ipoib_port_t 
*)p_context;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P 
class=MsoNormal>-                              
("Starting Port [%d] Endpt CM thread \n", p_port->port_num ) 
);<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t ib_status;<o:p></o:p></P>
<P class=MsoNormal>+    LIST_ENTRY      
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t    *p_port =( 
ipoib_port_t *)p_context;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P class=MsoNormal>+        ("Starting Port 
[%d] Endpt CM thread \n", p_port->port_num ) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
while( !p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
while( ( p_item = NdisInterlockedRemoveHeadList( <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
&p_port->endpt_mgr.pending_conns,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P class=MsoNormal>+    while( 
!p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_event_wait_on( 
&p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+        while( ( p_item = 
NdisInterlockedRemoveHeadList( <o:p></o:p></P>
<P 
class=MsoNormal>+                                
&p_port->endpt_mgr.pending_conns,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
continue;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>+                
continue;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( !p_endpt->conn.h_send_qp )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
                
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                              
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt,<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+       
         p_endpt->mac.addr[4], 
p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( !p_endpt->conn.h_send_qp )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                        
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P class=MsoNormal>+  
              else<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>+                    
{<o:p></o:p></P>
<P 
class=MsoNormal>+                        
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                            
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                    
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P 
class=MsoNormal>+             
   {<o:p></o:p></P>
<P 
class=MsoNormal>+                    
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>+                    
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
}//while( p_item != NULL )<o:p></o:p></P>
<P class=MsoNormal>+        }//while( p_item 
!= NULL )<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
while( ( p_item = NdisInterlockedRemoveHeadList(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
&p_port->endpt_mgr.remove_conns,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P class=MsoNormal>+        while( ( p_item = 
NdisInterlockedRemoveHeadList(<o:p></o:p></P>
<P 
class=MsoNormal>+                                
&p_port->endpt_mgr.remove_conns,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P 
class=MsoNormal>+            
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("\nDESTROYING Endpt[%p]  MAC 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("\nDESTROYING Endpt[%p]  MAC 
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt,<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>+            
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->endpt_mgr.thread_is_done++;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisFreeSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P 
class=MsoNormal>-                              
(" Port [%d] Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></P>
<P class=MsoNormal>+    
p_port->endpt_mgr.thread_is_done++;<o:p></o:p></P>
<P class=MsoNormal>+    NdisFreeSpinLock( 
&p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P class=MsoNormal>+        (" Port [%d] 
Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.mac_endpts ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.lid_endpts ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.gid_endpts ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM(p_port);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( cl_is_qmap_empty( 
&p_port->endpt_mgr.mac_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( cl_is_qmap_empty( 
&p_port->endpt_mgr.lid_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( cl_is_fmap_empty( 
&p_port->endpt_mgr.gid_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM(p_port);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all readers to complete. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
;<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* We don't need to initiate destruction - this is called only<o:p></o:p></P>
<P 
class=MsoNormal>-              
* from the __port_destroying function, and destruction cascades<o:p></o:p></P>
<P 
class=MsoNormal>-              
* to all child objects.  Just clear all the maps.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qmap_remove_all( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qmap_remove_all( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all readers to complete. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+        ;<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * We don't need to initiate 
destruction - this is called only<o:p></o:p></P>
<P class=MsoNormal>+     * from the __port_destroying 
function, and destruction cascades<o:p></o:p></P>
<P class=MsoNormal>+     * to all child objects.  Just 
clear all the maps.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    cl_qmap_remove_all( 
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    cl_qmap_remove_all( 
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    cl_fmap_remove_all( 
&p_port->endpt_mgr.gid_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t                                 
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_item_t                                               
*p_fmap_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t                                   
*p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_t                                                              
mc_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_t                                                              
conn_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t                                                               
local_exist = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_LINK_STATE                                           
link_state;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS_INDICATION        
status_indication;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_map_item_t           
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_fmap_item_t          
*p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t           
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_t      
        mc_list;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_qlist_t              
conn_list;<o:p></o:p></P>
<P class=MsoNormal>+    
uint32_t                
local_exist = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
NDIS_LINK_STATE         
link_state;<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_STATUS_INDICATION  
status_indication;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &mc_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &conn_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all readers to complete. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
;<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &mc_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &conn_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all readers to complete. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+        ;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_remove_all(p_port);<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_remove_all(p_port);<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.Header.Size = sizeof(NDIS_LINK_STATE);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.XmitLinkSpeed = <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.RcvLinkSpeed  = SET_PORT_RATE_BPS( 
p_port->p_adapter->port_rate );<o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></P>
<P class=MsoNormal>+        
    link_state.Header.Size = 
sizeof(NDIS_LINK_STATE);<o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.XmitLinkSpeed = <o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.RcvLinkSpeed  = SET_PORT_RATE_BPS( 
p_port->p_adapter->port_rate );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
(PVOID)&link_state,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
                                                                                
sizeof(link_state));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
(PVOID)&link_state,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
sizeof(link_state));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Connect\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                              
  NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
(PVOID)&link_state,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
sizeof(link_state));<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
(PVOID)&link_state,<o:p></o:p></P>
<P 
class=MsoNormal>+                                
sizeof(link_state));<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Connect\n") 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
//            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
//            ("Link 
DOWN!\n") );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P 
class=MsoNormal>+                
//  IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
//  ("Link DOWN!\n") );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_local_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//TODO: CM RESTORE<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->p_local_endpt 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        //TODO: CM 
RESTORE<o:p></o:p></P>
<P class=MsoNormal>+        
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_port->p_local_endpt->gid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_port->p_local_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_port->p_local_endpt->dlid ) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_port->p_local_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_local_endpt->dlid = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qlist_insert_head(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
local_exist = 1;<o:p></o:p></P>
<P class=MsoNormal>+        
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_port->p_local_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+        
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_port->p_local_endpt->mac_item );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_port->p_local_endpt->dlid ) {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_port->p_local_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_local_endpt->dlid = 0;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        
cl_qlist_insert_head(<o:p></o:p></P>
<P 
class=MsoNormal>+            
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item 
);<o:p></o:p></P>
<P class=MsoNormal>+        local_exist = 
1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_local_endpt = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_local_endpt = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = cl_qmap_next( p_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_endpt->h_mcast )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* We destroy MC endpoints since they will get recreated<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
                                
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_head( 
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    while( p_item != cl_qmap_end( 
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
cl_qmap_next( p_item );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_endpt->h_mcast )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* We destroy MC endpoints since they will get recreated<o:p></o:p></P>
<P 
class=MsoNormal>+             
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* destroy connected endpoints if any */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, 
&p_endpt->dgid );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
&p_endpt->conn_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->gid_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail(<o:p></o:p></P>
<P 
class=MsoNormal>+                
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /* destroy 
connected endpoints if any */<o:p></o:p></P>
<P class=MsoNormal>+        else if( 
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P 
class=MsoNormal>+                 
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, 
&p_endpt->dgid );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P 
class=MsoNormal>+                    
&p_endpt->conn_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_endpt->h_av )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Destroy the AV for all other endpoints. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->h_av = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_endpt->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>-              
                
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->dlid = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+         
   cl_qlist_insert_tail(<o:p></o:p></P>
<P 
class=MsoNormal>+                
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_endpt->h_av )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Destroy the AV for all other endpoints. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->h_av = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->dlid = 0;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO CM<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*while( cl_qlist_count( &conn_list ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
endpt_cm_destroy_conn( p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}*/<o:p></o:p></P>
<P class=MsoNormal>+    //TODO CM<o:p></o:p></P>
<P class=MsoNormal>+    /*while( cl_qlist_count( &conn_list ) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
endpt_cm_destroy_conn( p_port,<o:p></o:p></P>
<P 
class=MsoNormal>+            
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></P>
<P class=MsoNormal>+    }*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if(cl_qlist_count( &mc_list ) - local_exist)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->mcast_cnt =  (uint32_t)cl_qlist_count( &mc_list ) - 
local_exist;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->mcast_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}              
<o:p></o:p></P>
<P class=MsoNormal>+    if(cl_qlist_count( &mc_list ) - 
local_exist)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->mcast_cnt =  (uint32_t)cl_qlist_count( &mc_list ) - 
local_exist;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->mcast_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    }   <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("p_port->mcast_cnt = 
%d\n", p_port->mcast_cnt - local_exist));<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt - 
local_exist));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Destroy all multicast endpoints now that we have released the lock. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( cl_qlist_count( &mc_list ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_list_item_t    *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = cl_qlist_remove_head( &mc_list );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, 
mac_item.pool_item.list_item);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_endpt->obj);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Destroy all multicast endpoints now 
that we have released the lock. */<o:p></o:p></P>
<P class=MsoNormal>+    while( cl_qlist_count( &mc_list ) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
cl_list_item_t  *p_item;<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
cl_qlist_remove_head( &mc_list );<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT(p_item, ipoib_endpt_t, 
mac_item.pool_item.list_item);<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_endpt->obj);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -6207,542 +6254,542 @@<o:p></o:p></P>
<P class=MsoNormal>  */<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_endpt 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> #if 0 //CM<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_item_t*             
p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>-#endif <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    cl_fmap_item_t* 
p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>+#endif  <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* This function must be called from the receive path */<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT(p_port->endpt_rdr > 0);<o:p></o:p></P>
<P class=MsoNormal>+    /* This function must be called from the 
receive path */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT(p_port->endpt_rdr > 
0);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all readers to complete. */    <o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr > 1 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
;<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all readers to complete. 
*/    <o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr > 1 
)<o:p></o:p></P>
<P class=MsoNormal>+        ;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Remove the endpoint from the maps so further requests don't find it. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts, 
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* The enpoints are *ALWAYS* in both the MAC and GID maps.  They are 
only<o:p></o:p></P>
<P 
class=MsoNormal>-              
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts, 
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+    /* Remove the endpoint from the maps so 
further requests don't find it. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_qmap_remove_item( 
&p_port->endpt_mgr.mac_endpts, &p_endpt->mac_item 
);<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * The enpoints are *ALWAYS* in both 
the MAC and GID maps.  They are only<o:p></o:p></P>
<P class=MsoNormal>+     * in the LID map if the GID has the 
same subnet prefix as us.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    cl_fmap_remove_item( 
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item 
);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, 
&p_endpt->dgid );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->conn_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_fmap_item = 
cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid 
);<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if( p_fmap_item 
!= cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->conn_item );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_endpt->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_endpt->lid_item );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_destroy( &p_endpt->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO CM<o:p></o:p></P>
<P 
class=MsoNormal>-              
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    //TODO CM<o:p></o:p></P>
<P class=MsoNormal>+    //endpt_cm_destroy_conn( p_port, p_endpt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> NTSTATUS<o:p></o:p></P>
<P class=MsoNormal> ipoib_mac_to_gid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ib_gid_t*                                                                             
p_gid )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         
ib_gid_t*              
     p_gid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t*                
p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                               
key = 0;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t*  
p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    
uint64_t        key = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( &key, &mac, 
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_get( 
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item == cl_qmap_end( 
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
*p_gid = p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt = PARENT_STRUCT( p_item, 
ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+    *p_gid = p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> NTSTATUS<o:p></o:p></P>
<P class=MsoNormal> ipoib_mac_to_path(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ib_path_rec_t*                                                                
p_path )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         
ib_path_rec_t*    
          p_path 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t*                
p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                               
key = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                 
sl;<o:p></o:p></P>
<P 
class=MsoNormal>-              
net32_t                                                
flow_lbl;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                 
hop_limit;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                 
pkt_life;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t*  
p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    uint64_t      
  key = 0;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t         sl;<o:p></o:p></P>
<P class=MsoNormal>+    
net32_t         flow_lbl;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t         
hop_limit;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t         pkt_life;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( &key, &mac, 
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_local_endpt == NULL )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("No local endpoint.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->p_local_endpt == NULL 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("No local endpoint.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( mac.addr[0] == 0 && mac.addr[1] == 0 && mac.addr[2] == 0 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[3] == 0 && mac.addr[4] == 0 && mac.addr[5] == 0 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = p_port->p_local_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( mac.addr[0] == 0 && 
mac.addr[1] == 0 && mac.addr[2] == 0 &&<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[3] == 0 
&& mac.addr[4] == 0 && mac.addr[5] == 0 )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
p_port->p_local_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+        if( p_item == 
cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_path->service_id = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_path->dgid = p_endpt->dgid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_path->sgid = p_port->p_local_endpt->dgid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_path->dlid = p_endpt->dlid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_path->slid = p_port->p_local_endpt->dlid;<o:p></o:p></P>
<P class=MsoNormal>+    p_path->service_id = 0;<o:p></o:p></P>
<P class=MsoNormal>+    p_path->dgid = 
p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+    p_path->sgid = 
p_port->p_local_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+    p_path->dlid = 
p_endpt->dlid;<o:p></o:p></P>
<P class=MsoNormal>+    p_path->slid = 
p_port->p_local_endpt->dlid;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_member_get_sl_flow_hop(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&sl,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&flow_lbl,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&hop_limit<o:p></o:p></P>
<P 
class=MsoNormal>-                              
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_path->slid == p_path->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pkt_life = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></P>
<P class=MsoNormal>+    ib_member_get_sl_flow_hop(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></P>
<P class=MsoNormal>+        
&sl,<o:p></o:p></P>
<P class=MsoNormal>+        
&flow_lbl,<o:p></o:p></P>
<P class=MsoNormal>+        
&hop_limit<o:p></o:p></P>
<P class=MsoNormal>+        );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if( p_path->slid == p_path->dlid 
)<o:p></o:p></P>
<P class=MsoNormal>+        pkt_life = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+        pkt_life = 
p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_path_rec_init_local(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_path,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_endpt->dgid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->p_local_endpt->dgid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt->dlid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_local_endpt->dlid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
1,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
sl, 0,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
0 );<o:p></o:p></P>
<P class=MsoNormal>+    ib_path_rec_init_local(<o:p></o:p></P>
<P class=MsoNormal>+        
p_path,<o:p></o:p></P>
<P class=MsoNormal>+        
&p_endpt->dgid,<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->p_local_endpt->dgid,<o:p></o:p></P>
<P class=MsoNormal>+        
p_endpt->dlid,<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_local_endpt->dlid,<o:p></o:p></P>
<P class=MsoNormal>+        1,<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></P>
<P class=MsoNormal>+        sl, 
0,<o:p></o:p></P>
<P class=MsoNormal>+        
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></P>
<P class=MsoNormal>+        
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></P>
<P class=MsoNormal>+        
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></P>
<P class=MsoNormal>+        0 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Set global routing information. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></P>
<P class=MsoNormal>+    /* Set global routing information. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    ib_path_rec_set_hop_flow_raw( p_path, 
hop_limit, flow_lbl, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    p_path->tclass = 
p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></P>
<P class=MsoNormal>  <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ipoib_endpt_t** 
const                 
pp_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+  
      OUT         
ipoib_endpt_t** const       pp_endpt 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS                    
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                               
key;<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_STATUS     
status;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    
uint64_t        key;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
PERF_DECLARE( EndptQueue );<o:p></o:p></P>
<P class=MsoNormal>+    PERF_DECLARE( EndptQueue 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !cl_memcmp( &mac, &p_port->p_adapter->params.conf_mac, 
sizeof(mac) ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Discard loopback traffic. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Discarding loopback traffic\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !cl_memcmp( &mac, 
&p_port->p_adapter->params.conf_mac, sizeof(mac) ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Discard 
loopback traffic. */<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Discarding loopback traffic\n") );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
key = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    key = 0;<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( &key, &mac, 
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("Look for :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, 
IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P class=MsoNormal>+        ("Look for 
:\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[0], 
mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[3], 
mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_get( 
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item == cl_qmap_end( 
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*pp_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_ref( *pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    *pp_endpt = PARENT_STRUCT( p_item, 
ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_ref( *pp_endpt 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_start( EndptQueue );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = ipoib_endpt_queue( *pp_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_perf_stop( &p_port->p_adapter->perf, EndptQueue );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*pp_endpt = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_start( EndptQueue 
);<o:p></o:p></P>
<P class=MsoNormal>+    status = ipoib_endpt_queue( *pp_endpt 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_perf_stop( 
&p_port->p_adapter->perf, EndptQueue );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+        *pp_endpt = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
ib_gid_t* 
const                                                 
p_gid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
UNALIGNED net32_t* const       p_qpn 
)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         ib_gid_t* 
const             
p_gid,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         UNALIGNED net32_t* 
const    p_qpn )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNALIGNED<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                               
key;<o:p></o:p></P>
<P class=MsoNormal>+    UNALIGNED<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    
uint64_t        key;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
key = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    key = 0;<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( &key, &mac, 
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_get( 
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item == cl_qmap_end( 
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt = PARENT_STRUCT( p_item, 
ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
*p_gid = p_endpt->dgid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
*p_qpn = p_endpt->qpn;<o:p></o:p></P>
<P class=MsoNormal>+    *p_gid = p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+    *p_qpn = p_endpt->qpn;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ib_gid_t* 
const                                                 
p_gid )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ib_gid_t* 
const             
p_gid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_item_t               
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    cl_fmap_item_t  
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_fmap_get( &p_port->endpt_mgr.gid_endpts, p_gid 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_fmap_get( 
&p_port->endpt_mgr.gid_endpts, p_gid );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item == cl_fmap_end( 
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return p_endpt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
net16_t                                                                                                
lid )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
net16_t                     
lid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_get( &p_port->endpt_mgr.lid_endpts, lid 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item == cl_qmap_end( &p_port->endpt_mgr.lid_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_get( 
&p_port->endpt_mgr.lid_endpts, lid );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item == cl_qmap_end( 
&p_port->endpt_mgr.lid_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return p_endpt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+    
IN           
   ipoib_endpt_t* const        
p_endpt )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
status;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("insert  :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P class=MsoNormal>+        ("insert  
:\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[0], 
mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[3], 
mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* __endpt_mgr_insert expects *one* reference to be held when being called. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status= __endpt_mgr_insert( p_port, mac, p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* __endpt_mgr_insert expects *one* 
reference to be held when being called. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( &p_port->endpt_rdr 
);<o:p></o:p></P>
<P class=MsoNormal>+    status= __endpt_mgr_insert( p_port, mac, 
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_dec( &p_port->endpt_rdr 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_endpt 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                               
key;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status_t                          
cl_status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_qitem;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_item_t               
*p_fitem;<o:p></o:p></P>
<P class=MsoNormal>+    
uint64_t        key;<o:p></o:p></P>
<P class=MsoNormal>+    cl_status_t     
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_qitem;<o:p></o:p></P>
<P class=MsoNormal>+    cl_fmap_item_t  
*p_fitem;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all accesses to the map to complete. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr > 1 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
;<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all accesses to the map to 
complete. */<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr > 1 
)<o:p></o:p></P>
<P class=MsoNormal>+        ;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Link the endpoint to the port. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_status = cl_obj_insert_rel_parent_locked(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_endpt->rel, &p_port->obj, &p_endpt->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Link the endpoint to the port. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_status = 
cl_obj_insert_rel_parent_locked(<o:p></o:p></P>
<P class=MsoNormal>+        
&p_endpt->rel, &p_port->obj, &p_endpt->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INVALID_STATE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_status != CL_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INVALID_STATE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("ref  type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( 
&p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+        ("ref  type 
%d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt->mac = mac;<o:p></o:p></P>
<P 
class=MsoNormal>-              
key = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_qitem = cl_qmap_insert(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_qitem == &p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_fitem = cl_fmap_insert(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid, 
&p_endpt->gid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_fitem == &p_endpt->gid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_endpt->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_qitem = cl_qmap_insert(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid, 
&p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_qitem == &p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (p_qitem != &p_endpt->lid_item) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
// Since we failed to insert into the list, make sure it is not 
removed<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->dlid =0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt->mac = mac;<o:p></o:p></P>
<P class=MsoNormal>+    key = 0;<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( &key, &mac, 
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    p_qitem = cl_qmap_insert(<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_qitem == 
&p_endpt->mac_item );<o:p></o:p></P>
<P class=MsoNormal>+    p_fitem = cl_fmap_insert(<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid, 
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_fitem == 
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_qitem = 
cl_qmap_insert(<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid, 
&p_endpt->lid_item );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_qitem == &p_endpt->lid_item );<o:p></o:p></P>
<P class=MsoNormal>+        if (p_qitem != 
&p_endpt->lid_item) {<o:p></o:p></P>
<P class=MsoNormal>+        
    // Since we failed to insert into the list, make sure it 
is not removed<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->dlid =0;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_mcast_rec_t                                                                
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_mcast_rec_t              
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mac_addr_t                       
bcast_mac;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    mac_addr_t      
bcast_mac;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Cache the broadcast group properties for creating future mcast 
groups.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->ib_mgr.bcast_rec = *p_mcast_rec->p_member_rec;<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Cache the broadcast group 
properties for creating future mcast groups.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    p_port->ib_mgr.bcast_rec = 
*p_mcast_rec->p_member_rec;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Allocate the broadcast endpoint. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt = ipoib_endpt_create( 
&p_mcast_rec->p_member_rec->mgid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
0 , CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* set reference to transport to be used while is not attached to the port 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->port_num, p_mcast_rec );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Allocate the broadcast endpoint. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt = ipoib_endpt_create( 
&p_mcast_rec->p_member_rec->mgid,<o:p></o:p></P>
<P class=MsoNormal>+        0 , 
CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    /* set reference to transport to be used 
while is not attached to the port */<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt->is_mcast_listener = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt->p_ifc = 
p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P class=MsoNormal>+    status = ipoib_endpt_set_mcast( p_endpt, 
p_port->ib_mgr.h_pd,<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->port_num, p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Add the broadcast endpoint to the endpoint map. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    /* Add the broadcast endpoint to the 
endpoint map. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_memset( &bcast_mac, 0xFF, 
sizeof(bcast_mac) );<o:p></o:p></P>
<P class=MsoNormal>+    status = __endpt_mgr_insert_locked( 
p_port, bcast_mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_remove_endpt(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
                                
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                                       
mac )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t                  
mac )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//TODO CM<o:p></o:p></P>
<P class=MsoNormal>-//          
cl_fmap_item_t  *p_fmap_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint64_t                               
key;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    //TODO CM<o:p></o:p></P>
<P class=MsoNormal>+//  cl_fmap_item_t  *p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    
uint64_t        key;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
key = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    key = 0;<o:p></o:p></P>
<P class=MsoNormal>+    cl_memcpy( &key, &mac, 
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Remove the endpoint from the maps so further requests don't find it. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all readers to finish */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_remove( &p_port->endpt_mgr.mac_endpts, key 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Dereference the endpoint.  If the ref count goes to zero, 
it<o:p></o:p></P>
<P 
class=MsoNormal>-              
* will get freed.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* The enpoints are *ALWAYS* in both the MAC and GID maps.  They are 
only<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_fmap_remove_item(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Remove the endpoint from the maps so 
further requests don't find it. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all readers to finish 
*/<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+        ;<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_remove( 
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Dereference the endpoint.  
If the ref count goes to zero, it<o:p></o:p></P>
<P class=MsoNormal>+     * will get freed.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item != cl_qmap_end( 
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * The 
enpoints are *ALWAYS* in both the MAC and GID maps.  They are 
only<o:p></o:p></P>
<P class=MsoNormal>+         * in the 
LID map if the GID has the same subnet prefix as us.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        
cl_fmap_remove_item(<o:p></o:p></P>
<P 
class=MsoNormal>+            
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item 
);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, 
&p_endpt->dgid );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
&p_endpt->conn_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts, 
&p_endpt->dgid );<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P class=MsoNormal>+      
              &p_endpt->conn_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_endpt->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qmap_remove_item(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->dlid = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P class=MsoNormal>+   
         cl_qmap_remove_item(<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->dlid = 0;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//TODO CM<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+        //TODO 
CM<o:p></o:p></P>
<P class=MsoNormal>+        
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_atomic_dec( &p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) 
);<o:p></o:p></P>
<P class=MsoNormal>+        cl_atomic_dec( 
&p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) 
);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /*<o:p></o:p></P>
<P class=MsoNormal>  * The sequence for port up is as 
follows:<o:p></o:p></P>
<P class=MsoNormal>- 
*           1. The port goes 
active.  This allows the adapter to send SA queries<o:p></o:p></P>
<P class=MsoNormal>- 
*           and join the 
broadcast group (and other groups).<o:p></o:p></P>
<P class=MsoNormal>+ *  1. The port goes active.  This allows the 
adapter to send SA queries<o:p></o:p></P>
<P class=MsoNormal>+ *  and join the broadcast group (and other 
groups).<o:p></o:p></P>
<P class=MsoNormal>  *<o:p></o:p></P>
<P class=MsoNormal>- 
*           2. The adapter 
sends an SA query for the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>+ *  2. The adapter sends an SA query for the broadcast 
group.<o:p></o:p></P>
<P class=MsoNormal>  *<o:p></o:p></P>
<P class=MsoNormal>- 
*           3. Upon completion 
of the query, the adapter joins the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>+ *  3. Upon completion of the query, the adapter joins 
the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>  */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -6751,183 +6798,183 @@<o:p></o:p></P>
<P class=MsoNormal>  */<o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_up(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ib_pnp_port_rec_t* 
const          p_pnp_rec 
)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ib_pnp_port_rec_t* const    p_pnp_rec 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_port_info_t                  
*p_port_info;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_mad_t                                            
*mad_in              
= NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_mad_t                                            
*mad_out = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status    = IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
static int 
                                              
cnt          = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->n_no_progress = 0; // Init the send failure counter<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if ( p_port->state == IB_QPS_INIT ) <o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = IB_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("p_port->state = %d - Aborting.\n", p_port->state) 
);        <o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto up_done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else if ( p_port->state == IB_QPS_RTS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = IB_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Port init is done. p_port->state = %d.\n", p_port->state ) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto up_done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->state = IB_QPS_INIT;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );  <o:p></o:p></P>
<P class=MsoNormal>+    
ib_port_info_t      *p_port_info;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_mad_t            
*mad_in     = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_mad_t            
*mad_out = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status  = IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    static 
int          
cnt     = 0;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_ERROR, 
IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></P>
<P class=MsoNormal>+    p_port->n_no_progress = 0; // Init the 
send failure counter<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    if ( p_port->state == IB_QPS_INIT ) 
<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("p_port->state = %d - Aborting.\n", p_port->state) 
);        <o:p></o:p></P>
<P class=MsoNormal>+        goto 
up_done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else if ( p_port->state == IB_QPS_RTS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+        status = 
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Port init is done. p_port->state = %d.\n", p_port->state ) 
);<o:p></o:p></P>
<P class=MsoNormal>+        goto 
up_done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_port->state = 
IB_QPS_INIT;<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);  <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all work requests to get flushed. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->recv_mgr.depth || p_port->send_mgr.depth )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all work requests to get 
flushed. */<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->recv_mgr.depth || 
p_port->send_mgr.depth )<o:p></o:p></P>
<P class=MsoNormal>+        
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeResetEvent( &p_port->sa_event );<o:p></o:p></P>
<P class=MsoNormal>+    KeResetEvent( &p_port->sa_event 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_out = (ib_mad_t *) (ib_mad_t*)cl_zalloc(256);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if(! mad_out)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("failed to allocate mad mad_out\n")); <o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto up_done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_in = (ib_mad_t *) cl_zalloc(256);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if(! mad_in)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("failed to allocate mad mad_in\n")); <o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto up_done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    mad_out = (ib_mad_t *) 
(ib_mad_t*)cl_zalloc(256);<o:p></o:p></P>
<P class=MsoNormal>+    if(! mad_out)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("failed to allocate mad mad_out\n")); <o:p></o:p></P>
<P class=MsoNormal>+        goto 
up_done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    mad_in = (ib_mad_t *) 
cl_zalloc(256);<o:p></o:p></P>
<P class=MsoNormal>+    if(! mad_in)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("failed to allocate mad mad_in\n")); <o:p></o:p></P>
<P class=MsoNormal>+        goto 
up_done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_in->method = IB_MAD_METHOD_GET;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_in->base_ver = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_in->class_ver =1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mad_in->mgmt_class = IB_MCLASS_SUBN_LID;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></P>
<P class=MsoNormal>+    mad_in->attr_id = 
IB_MAD_ATTR_PORT_INFO;<o:p></o:p></P>
<P class=MsoNormal>+    mad_in->method = 
IB_MAD_METHOD_GET;<o:p></o:p></P>
<P class=MsoNormal>+    mad_in->base_ver = 1;<o:p></o:p></P>
<P class=MsoNormal>+    mad_in->class_ver =1;<o:p></o:p></P>
<P class=MsoNormal>+    mad_in->mgmt_class = 
IB_MCLASS_SUBN_LID;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_local_mad returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto up_done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_local_mad returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        goto 
up_done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->base_lid = p_pnp_rec->p_port_attr->lid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Received port info: link width = %d.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port_info->link_width_active) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->ib_mgr.rate =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ib_port_info_compute_rate( p_port_info );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_set_rate( p_port->p_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port_info->link_width_active,<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_port_info_get_link_speed_active( p_port_info ) );<o:p></o:p></P>
<P class=MsoNormal>+    p_port_info = 
(ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></P>
<P class=MsoNormal>+    p_port->base_lid = 
p_pnp_rec->p_port_attr->lid;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Received port info: link width = %d.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port_info->link_width_active) );<o:p></o:p></P>
<P class=MsoNormal>+    p_port->ib_mgr.rate =<o:p></o:p></P>
<P class=MsoNormal>+        
ib_port_info_compute_rate( p_port_info );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ipoib_set_rate( 
p_port->p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+        
p_port_info->link_width_active,<o:p></o:p></P>
<P class=MsoNormal>+    ib_port_info_get_link_speed_active( 
p_port_info ) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __port_get_bcast( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (status != IB_SUCCESS)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(" __port_get_bcast returned 
%s\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></P>
<P class=MsoNormal>+    status = __port_get_bcast( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if (status != IB_SUCCESS)<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+        (" 
__port_get_bcast returned %s\n",p_port->p_adapter->p_ifc->get_err_str( 
status )));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> up_done:<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_CANCELED )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_CANCELED )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+        p_port->state 
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if(mad_out)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_free(mad_out);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if(mad_in)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_free(mad_in);<o:p></o:p></P>
<P class=MsoNormal>+    if(mad_out)<o:p></o:p></P>
<P class=MsoNormal>+        
cl_free(mad_out);<o:p></o:p></P>
<P class=MsoNormal>+    if(mad_in)<o:p></o:p></P>
<P class=MsoNormal>+        
cl_free(mad_in);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_port_info_t* 
const                   
p_port_info )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_port_info_t* const       p_port_info 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_gid_t                                                               
gid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t                                   
*p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_av_attr_t                                       
av_attr;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_api_status_t         
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_gid_t                
gid;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t           
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_av_attr_t            
av_attr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt = ipoib_endpt_create(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&gid, p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to create local endpt\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    ib_gid_set_default( &gid, 
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt = 
ipoib_endpt_create(<o:p></o:p></P>
<P class=MsoNormal>+        &gid, 
p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to create local endpt\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &av_attr, sizeof(ib_av_attr_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
av_attr.port_num = p_port->port_num;<o:p></o:p></P>
<P 
class=MsoNormal>-              
av_attr.sl = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( 
p_port_info->base_lid ) ));<o:p></o:p></P>
<P 
class=MsoNormal>-              
av_attr.dlid = p_port_info->base_lid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
av_attr.static_rate = p_port->ib_mgr.rate;<o:p></o:p></P>
<P 
class=MsoNormal>-              
av_attr.path_bits = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->create_av(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &av_attr, 
sizeof(ib_av_attr_t) );<o:p></o:p></P>
<P class=MsoNormal>+    av_attr.port_num = 
p_port->port_num;<o:p></o:p></P>
<P class=MsoNormal>+    av_attr.sl = 0;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P class=MsoNormal>+        (" av_attr.dlid = 
p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid ) 
));<o:p></o:p></P>
<P class=MsoNormal>+    av_attr.dlid = 
p_port_info->base_lid;<o:p></o:p></P>
<P class=MsoNormal>+    av_attr.static_rate = 
p_port->ib_mgr.rate;<o:p></o:p></P>
<P class=MsoNormal>+    av_attr.path_bits = 0;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->create_av(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* __endpt_mgr_insert expects *one* reference to be held. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac, 
p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* __endpt_mgr_insert expects *one* 
reference to be held. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_inc( &p_port->endpt_rdr 
);<o:p></o:p></P>
<P class=MsoNormal>+    status = __endpt_mgr_insert( p_port, 
p_port->p_adapter->params.conf_mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_dec( &p_port->endpt_rdr 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->p_local_endpt = p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    p_port->p_local_endpt = 
p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -6935,924 +6982,924 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_get_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_query_req_t                                
query;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_user_query_t                              
info;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_member_rec_t                           
member_rec;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_query_req_t      query;<o:p></o:p></P>
<P class=MsoNormal>+    ib_user_query_t     
info;<o:p></o:p></P>
<P class=MsoNormal>+    ib_member_rec_t     
member_rec;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
info.method = IB_MAD_METHOD_GETTABLE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></P>
<P 
class=MsoNormal>-              
info.attr_size = sizeof(ib_member_rec_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
info.comp_mask = IB_MCR_COMPMASK_MGID;<o:p></o:p></P>
<P 
class=MsoNormal>-              
info.p_attr = &member_rec;<o:p></o:p></P>
<P class=MsoNormal>+    info.method = 
IB_MAD_METHOD_GETTABLE;<o:p></o:p></P>
<P class=MsoNormal>+    info.attr_id = 
IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></P>
<P class=MsoNormal>+    info.attr_size = 
sizeof(ib_member_rec_t);<o:p></o:p></P>
<P class=MsoNormal>+    info.comp_mask = 
IB_MCR_COMPMASK_MGID;<o:p></o:p></P>
<P class=MsoNormal>+    info.p_attr = 
&member_rec;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Query requires only the MGID. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &member_rec, sizeof(ib_member_rec_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
member_rec.mgid = bcast_mgid_template;<o:p></o:p></P>
<P class=MsoNormal>+    /* Query requires only the MGID. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &member_rec, 
sizeof(ib_member_rec_t) );<o:p></o:p></P>
<P class=MsoNormal>+    member_rec.mgid = 
bcast_mgid_template;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>     member_rec.mgid.raw[4] = (uint8_t) 
(p_port->p_adapter->guids.port_guid.pkey >> 8) ;<o:p></o:p></P>
<P 
class=MsoNormal>-              
member_rec.mgid.raw[5] = (uint8_t) 
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
member_rec.pkey = 
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &query, sizeof(ib_query_req_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.query_type = IB_QUERY_USER_DEFINED;<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.p_query_input = &info;<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.query_context = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
query.pfn_query_cb = __bcast_get_cb;<o:p></o:p></P>
<P class=MsoNormal>+    member_rec.mgid.raw[5] = (uint8_t) 
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P class=MsoNormal>+    member_rec.pkey = 
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &query, 
sizeof(ib_query_req_t) );<o:p></o:p></P>
<P class=MsoNormal>+    query.query_type = 
IB_QUERY_USER_DEFINED;<o:p></o:p></P>
<P class=MsoNormal>+    query.p_query_input = 
&info;<o:p></o:p></P>
<P class=MsoNormal>+    query.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+    query.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+    query.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    query.query_context = 
p_port;<o:p></o:p></P>
<P class=MsoNormal>+    query.pfn_query_cb = 
__bcast_get_cb;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* reference the object for the multicast query. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_get_bcast );<o:p></o:p></P>
<P class=MsoNormal>+    /* reference the object for the multicast 
query. */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_get_bcast 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->query(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_get_bcast );<o:p></o:p></P>
<P 
class=MsoNormal>-//                          
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_query returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_query returned SUCCESS\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->query(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_get_bcast );<o:p></o:p></P>
<P class=MsoNormal>+//      
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_query returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_ERROR, 
IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_query returned SUCCESS\n"));<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* Callback for the MCMemberRecord Get query for the 
IPv4 broadcast group. */<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_get_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_query_rec_t                                                                
*p_query_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_query_rec_t              
*p_query_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_member_rec_t                           
*p_mc_req;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ib_member_rec_t     
*p_mc_req;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    p_port->ib_mgr.h_query = 
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->state != IB_QPS_INIT )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = IB_CANCELED;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto done;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_query_rec->status;<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT(p_port->state == IB_QPS_INIT 
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->state != IB_QPS_INIT 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        status = 
IB_CANCELED;<o:p></o:p></P>
<P class=MsoNormal>+        goto 
done;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_query_rec->status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("status of request %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_INIT,<o:p></o:p></P>
<P class=MsoNormal>+        ("status of 
request %s\n", <o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( status )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
case IB_SUCCESS:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_query_rec->result_cnt )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_mc_req = (ib_member_rec_t*)<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></P>
<P class=MsoNormal>+    switch( status )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    case IB_SUCCESS:<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_query_rec->result_cnt )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_mc_req = (ib_member_rec_t*)<o:p></o:p></P>
<P 
class=MsoNormal>+                
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* Join the broadcast group. */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Fall through. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* Join the broadcast group. */<o:p></o:p></P>
<P 
class=MsoNormal>+            
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /* Fall through. 
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case IB_REMOTE_ERROR:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* SA failed the query.  Broadcast group doesn't exist, create it. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __port_create_bcast( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    case IB_REMOTE_ERROR:<o:p></o:p></P>
<P class=MsoNormal>+        /* SA failed the 
query.  Broadcast group doesn't exist, create it. */<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__port_create_bcast( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case IB_CANCELED:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Instance destroying - Aborting.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    case IB_CANCELED:<o:p></o:p></P>
<P class=MsoNormal>+   
     IPOIB_PRINT(TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Instance destroying - Aborting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
default:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    default:<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> done:<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_CANCELED )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_CANCELED )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        p_port->state 
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Return the response MAD to AL. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_query_rec->p_result_mad )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Return the response MAD to AL. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    if( p_query_rec->p_result_mad 
)<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Release the reference taken when issuing the member record query. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_bcast_get_cb );<o:p></o:p></P>
<P class=MsoNormal>+    /* Release the reference taken when 
issuing the member record query. */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, 
ref_bcast_get_cb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_join_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_member_rec_t* 
const                            
p_member_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_member_rec_t* const      p_member_rec 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_mcast_req_t                                
mcast_req;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_mcast_req_t      mcast_req;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Check that the rate is realizable for our port. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F) 
&&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* The MC group rate is higher than our port's rate.  Log an 
error<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* and stop.  A port transition will drive the retry.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Check that the rate is realizable for 
our port. */<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->ib_mgr.rate < 
(p_member_rec->rate & 0x3F) &&<o:p></o:p></P>
<P class=MsoNormal>+        
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * The MC 
group rate is higher than our port's rate.  Log an error<o:p></o:p></P>
<P class=MsoNormal>+         * and 
stop.  A port transition will drive the retry.<o:p></o:p></P>
<P class=MsoNormal>+        
 */<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+            
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></P>
<P 
class=MsoNormal>+            
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></P>
<P 
class=MsoNormal>+            
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Join the broadcast group. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Copy the results of the Get to use as parameters. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec = *p_member_rec;<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* We specify our port GID for the join operation. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.port_gid.unicast.prefix = 
IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+    /* Join the broadcast group. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &mcast_req, 
sizeof(mcast_req) );<o:p></o:p></P>
<P class=MsoNormal>+    /* Copy the results of the Get to use as 
parameters. */<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec = 
*p_member_rec;<o:p></o:p></P>
<P class=MsoNormal>+    /* We specify our port GID for the join 
operation. */<o:p></o:p></P>
<P class=MsoNormal>+    
mcast_req.member_rec.port_gid.unicast.prefix = 
IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></P>
<P class=MsoNormal>+    
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.mcast_context = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.mcast_context = 
p_port;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.pfn_mcast_cb = 
__bcast_cb;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.pkey_index = 
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( ib_member_get_state( 
mcast_req.member_rec.scope_state ) !=<o:p></o:p></P>
<P class=MsoNormal>+      
  IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></P>
<P 
class=MsoNormal>+            
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* reference the object for the multicast join request. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></P>
<P class=MsoNormal>+    /* reference the object for the multicast 
join request. */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_join_bcast 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_bcast_join_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_bcast_join_failed );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_create_bcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_mcast_req_t                                
mcast_req;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_mcast_req_t      mcast_req;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Join the broadcast group. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.create = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Create requires pkey, qkey, SL, flow label, traffic class, joing 
state<o:p></o:p></P>
<P 
class=MsoNormal>-              
* and port GID.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* We specify the MGID since we don't want the SA to generate it for 
us.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.mgid = bcast_mgid_template;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.mgid.raw[4] = (uint8_t) 
(p_port->p_adapter->guids.port_guid.pkey >> 8); <o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.mgid.raw[5] = (uint8_t) 
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_gid_set_default( &mcast_req.member_rec.port_gid,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* IPOIB spec requires that the QKEY have the MSb set so that the 
QKEY<o:p></o:p></P>
<P 
class=MsoNormal>-              
* from the QP is used rather than the QKEY in the send WR.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.qkey =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.mtu =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></P>
<P class=MsoNormal>+    /* Join the broadcast group. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &mcast_req, 
sizeof(mcast_req) );<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.create = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Create requires pkey, qkey, SL, 
flow label, traffic class, joing state<o:p></o:p></P>
<P class=MsoNormal>+     * and port GID.<o:p></o:p></P>
<P class=MsoNormal>+     *<o:p></o:p></P>
<P class=MsoNormal>+     * We specify the MGID since we 
don't want the SA to generate it for us.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.mgid = 
bcast_mgid_template;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.mgid.raw[4] = 
(uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8); 
<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.mgid.raw[5] = 
(uint8_t) p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P class=MsoNormal>+    ib_gid_set_default( 
&mcast_req.member_rec.port_gid,<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * IPOIB spec requires that the QKEY 
have the MSb set so that the QKEY<o:p></o:p></P>
<P class=MsoNormal>+     * from the QP is used rather than 
the QKEY in the send WR.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.qkey 
=<o:p></o:p></P>
<P class=MsoNormal>+        
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.mtu =<o:p></o:p></P>
<P class=MsoNormal>+        
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.pkey = 
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.pkey = 
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.scope_state =<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.sl_flow_hop = 
ib_member_set_sl_flow_hop( 0, 0, 0 );<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.scope_state 
=<o:p></o:p></P>
<P class=MsoNormal>+        
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.mcast_context = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.mcast_context = 
p_port;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.pfn_mcast_cb = 
__bcast_cb;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.pkey_index = 
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* reference the object for the multicast join request. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></P>
<P class=MsoNormal>+    /* reference the object for the multicast 
join request. */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_join_bcast 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, 
&mcast_req );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_bcast_create_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, 
&mcast_req );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_bcast_create_failed );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_down(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_qp_mod_t                                    
qp_mod;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_qp_mod_t         
qp_mod;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Mark our state.  This causes all callbacks to abort.<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Note that we hold the receive lock so that we synchronize<o:p></o:p></P>
<P 
class=MsoNormal>-              
* with reposting.  We must take the receive lock before the<o:p></o:p></P>
<P 
class=MsoNormal>-              
* object lock since that is the order taken when reposting.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Mark our state.  This causes 
all callbacks to abort.<o:p></o:p></P>
<P class=MsoNormal>+     * Note that we hold the receive 
lock so that we synchronize<o:p></o:p></P>
<P class=MsoNormal>+     * with reposting.  We must 
take the receive lock before the<o:p></o:p></P>
<P class=MsoNormal>+     * object lock since that is the 
order taken when reposting.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    p_port->state = 
IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__pending_list_destroy(p_port);<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></P>
<P class=MsoNormal>+    
__pending_list_destroy(p_port);<o:p></o:p></P>
<P class=MsoNormal>+    NdisWriteErrorLogEntry( 
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P class=MsoNormal>+        
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->ib_mgr.h_query )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->ib_mgr.h_query 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeWaitForSingleObject(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></P>
<P class=MsoNormal>+    KeWaitForSingleObject(<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* garbage collector timer is not needed when link is down */<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeFlushQueuedDpcs();<o:p></o:p></P>
<P class=MsoNormal>+    /* garbage collector timer is not needed 
when link is down */<o:p></o:p></P>
<P class=MsoNormal>+    
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P class=MsoNormal>+    KeFlushQueuedDpcs();<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Put the QP in the error state.  This removes the need to<o:p></o:p></P>
<P 
class=MsoNormal>-              
* synchronize with send/receive callbacks.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, 
&qp_mod );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Put the QP in the error 
state.  This removes the need to<o:p></o:p></P>
<P class=MsoNormal>+     * synchronize with send/receive 
callbacks.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_port->ib_mgr.h_qp 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &qp_mod, 
sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P class=MsoNormal>+    qp_mod.req_state = 
IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, 
&qp_mod );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></P>
<P class=MsoNormal>+    
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Reset all endpoints so we don't flush our ARP cache. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+    /* Reset all endpoints so we don't flush 
our ARP cache. */<o:p></o:p></P>
<P class=MsoNormal>+    __endpt_mgr_reset_all( p_port 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeWaitForSingleObject(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_dereg_addrs( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    KeWaitForSingleObject(<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( 
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_dereg_addrs( p_port->p_adapter 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( 
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_mcast_rec_t                                                                
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_mcast_rec_t              
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t      *p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
LARGE_INTEGER  
            
gc_due_time;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t    
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal>+    LARGE_INTEGER   
gc_due_time;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->state != IB_QPS_INIT )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_bcast_inv_state );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Invalid state - Aborting.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_mcast_rec->status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Multicast join for broadcast group returned %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status == IB_REMOTE_ERROR )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Either:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*            - the join 
failed because the group no longer exists<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*            - the create 
failed because the group already exists<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* from the top.  Note that as an optimization, it would be<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* possible to distinguish between the join and the create.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* If the join fails, try the create.  If the create fails, 
start<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
* over with the Get.<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* TODO: Assert is a place holder.  Can we ever get here if 
the<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if(++p_port->bc_join_retry_cnt < 
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
status = __port_get_bcast( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->bc_join_retry_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(p_port->state == IB_QPS_INIT || 
p_port->state == IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->state != IB_QPS_INIT 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_bcast_inv_state );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Invalid state - Aborting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_mcast_rec->status;<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+    
        ("Multicast join for broadcast 
group returned %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) 
);<o:p></o:p></P>
<P class=MsoNormal>+        if( status == 
IB_REMOTE_ERROR )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Either:<o:p></o:p></P>
<P 
class=MsoNormal>+             
*  - the join failed because the group no longer exists<o:p></o:p></P>
<P 
class=MsoNormal>+             
*  - the create failed because the group already exists<o:p></o:p></P>
<P 
class=MsoNormal>+             
*<o:p></o:p></P>
<P 
class=MsoNormal>+             
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></P>
<P 
class=MsoNormal>+             
* from the top.  Note that as an optimization, it would be<o:p></o:p></P>
<P 
class=MsoNormal>+             
* possible to distinguish between the join and the create.<o:p></o:p></P>
<P 
class=MsoNormal>+             
* If the join fails, try the create.  If the create fails, 
start<o:p></o:p></P>
<P 
class=MsoNormal>+             
* over with the Get.<o:p></o:p></P>
<P 
class=MsoNormal>+             
*/<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* TODO: Assert is a place holder.  Can we ever get here if 
the<o:p></o:p></P>
<P 
class=MsoNormal>+            
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></P>
<P 
class=MsoNormal>+            
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>+            
if(++p_port->bc_join_retry_cnt < 
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
status = __port_get_bcast( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->bc_join_retry_cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_bcast_req_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port->bc_join_retry_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>+            
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>+            
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>+            
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_bcast_req_failed );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_port->bc_join_retry_cnt = 
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_port->p_local_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ib_port_info_t  port_info;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
port_info.base_lid = p_port->base_lid;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = __endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
goto err;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_port->p_local_endpt 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
ib_port_info_t  port_info;<o:p></o:p></P>
<P class=MsoNormal>+        
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></P>
<P class=MsoNormal>+        
port_info.base_lid = p_port->base_lid;<o:p></o:p></P>
<P class=MsoNormal>+        status = 
__endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></P>
<P class=MsoNormal>+        if( status != 
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
goto err;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = p_port->p_adapter->p_ifc->leave_mcast( 
p_mcast_rec->h_mcast, __leave_error_mcast_cb );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
goto err;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    status = __endpt_mgr_add_bcast( p_port, 
p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+        status = 
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( status 
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+        goto 
err;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Get the QP ready for action. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __ib_mgr_activate( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__ib_mgr_activate returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+    /* Get the QP ready for action. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = __ib_mgr_activate( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__ib_mgr_activate returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> err:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Flag the adapter as hung. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->state = IB_QPS_ERROR;        
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_bcast_error );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        /* Flag the 
adapter as hung. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+        p_port->state 
= IB_QPS_ERROR;        <o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_bcast_error );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Only change the state if we're still in INIT. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT( p_port->state == IB_QPS_INIT || p_port->state == 
IB_QPS_ERROR);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (p_port->state == IB_QPS_INIT) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->state = IB_QPS_RTS;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Only change the state if we're still 
in INIT. */<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT( p_port->state == IB_QPS_INIT 
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+    if (p_port->state == IB_QPS_INIT) 
{<o:p></o:p></P>
<P class=MsoNormal>+        p_port->state 
= IB_QPS_RTS;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Prepost receives. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    /* Prepost receives. */<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    __recv_mgr_repost( p_port 
);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Notify the adapter that we now have an active connection. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = ipoib_set_active( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ib_qp_mod_t                                    
qp_mod;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_set_active returned 
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status 
)));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_port->ib_mgr.h_query )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+    /* Notify the adapter that we now have an 
active connection. */<o:p></o:p></P>
<P class=MsoNormal>+    status = ipoib_set_active( 
p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
ib_qp_mod_t         
qp_mod;<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_set_active returned 
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status 
)));<o:p></o:p></P>
<P class=MsoNormal>+        
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        p_port->state 
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_port->ib_mgr.h_query )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, 
&qp_mod );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P class=MsoNormal>+        cl_memclr( 
&qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P class=MsoNormal>+        qp_mod.req_state 
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+        status = 
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, 
&qp_mod );<o:p></o:p></P>
<P class=MsoNormal>+        
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_join_bcast );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #if 0 //CM<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P 
class=MsoNormal>-                              
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Port CM Listen failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/*keep going with UD only */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    if( 
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P class=MsoNormal>+        
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( 
ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Port CM Listen failed\n" ) );<o:p></o:p></P>
<P 
class=MsoNormal>+            
/*keep going with UD only */<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P 
class=MsoNormal>+                
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* garbage collector timer is needed when link is active */<o:p></o:p></P>
<P 
class=MsoNormal>-              
gc_due_time.QuadPart = 
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000) 
* 10);<o:p></o:p></P>
<P 
class=MsoNormal>-              
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
    
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></P>
<P class=MsoNormal>+    /* garbage collector timer is needed when 
link is active */<o:p></o:p></P>
<P class=MsoNormal>+    gc_due_time.QuadPart = 
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000) 
* 10);<o:p></o:p></P>
<P class=MsoNormal>+    
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></P>
<P 
class=MsoNormal>+                
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+    KeSetEvent( &p_port->sa_event, 
EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, ref_join_bcast 
);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __qp_event(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_async_event_rec_t                  
*p_event_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_async_event_rec_t        *p_event_rec 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( p_event_rec );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_event_rec->context );<o:p></o:p></P>
<P 
class=MsoNormal>-              
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM( p_event_rec 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_event_rec->context 
);<o:p></o:p></P>
<P class=MsoNormal>+    
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __cq_event(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_async_event_rec_t                  
*p_event_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_async_event_rec_t        *p_event_rec 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNUSED_PARAM( p_event_rec );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( p_event_rec->context );<o:p></o:p></P>
<P 
class=MsoNormal>-              
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    UNUSED_PARAM( p_event_rec 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( p_event_rec->context 
);<o:p></o:p></P>
<P class=MsoNormal>+    
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_activate(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         p_port 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_dgrm_info_t                
dgrm_info;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_qp_mod_t                    
qp_mod;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal>+    ib_dgrm_info_t  
dgrm_info;<o:p></o:p></P>
<P class=MsoNormal>+    ib_qp_mod_t     
qp_mod;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Move the QP to RESET.  This allows us to reclaim any<o:p></o:p></P>
<P 
class=MsoNormal>-              
* unflushed receives.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
qp_mod.req_state = IB_QPS_RESET;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, 
&qp_mod );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_modify_qp returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Move the QP to RESET.  This 
allows us to reclaim any<o:p></o:p></P>
<P class=MsoNormal>+     * unflushed 
receives.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &qp_mod, 
sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P class=MsoNormal>+    qp_mod.req_state = 
IB_QPS_RESET;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, 
&qp_mod );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_modify_qp returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Move the QP to RTS. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
dgrm_info.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
dgrm_info.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->init_dgrm_svc( 
p_port->ib_mgr.h_qp, &dgrm_info );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Move the QP to RTS. */<o:p></o:p></P>
<P class=MsoNormal>+    dgrm_info.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+    dgrm_info.qkey = 
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P class=MsoNormal>+    dgrm_info.pkey_index = 
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp, 
&dgrm_info );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Rearm the CQs. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->rearm_cq( 
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->rearm_cq( 
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_rearm_cq for send returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Rearm the CQs. */<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_recv_cq, FALSE 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_rearm_cq for send returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT 
);<o:p></o:p></P>
<P class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* Transition to a passive level thread. 
*/<o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_join_mcast(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
mac_addr_t                                                       
mac,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
uint8_t                                                                 
state)<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
mac_addr_t              
mac,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
uint8_t                 
state)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_mcast_req_t                                
mcast_req;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t                   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ib_mcast_req_t      mcast_req;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t       *p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
("Join Multicast request: \n"<o:p></o:p></P>
<P 
class=MsoNormal>-                              
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[0], mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[2], mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mac.addr[4], mac.addr[5]));<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P class=MsoNormal>+        ("Join Multicast 
request: \n"<o:p></o:p></P>
<P class=MsoNormal>+        "\tsrc MAC: 
%02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[0], 
mac.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[2], 
mac.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+        mac.addr[4], 
mac.addr[5]));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-              
case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
break;<o:p></o:p></P>
<P class=MsoNormal>+    switch( __endpt_mgr_ref( p_port, mac, 
&p_endpt ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+    case 
NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></P>
<P class=MsoNormal>+        
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Fall through */<o:p></o:p></P>
<P class=MsoNormal>+    case NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+        /* Fall through 
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
case NDIS_STATUS_PENDING:<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called 
for %p\n", p_endpt));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called 
for %p\n", p_endpt));<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Issue the mcast request, using the parameters of the broadcast 
group.<o:p></o:p></P>
<P 
class=MsoNormal>-              
* This allows us to do a create request that should always succeed 
since<o:p></o:p></P>
<P 
class=MsoNormal>-              
* the required parameters are known.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.create = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    case NDIS_STATUS_PENDING:<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", 
p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Issue the mcast request, using 
the parameters of the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>+     * This allows us to do a create 
request that should always succeed since<o:p></o:p></P>
<P class=MsoNormal>+     * the required parameters are 
known.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    cl_memclr( &mcast_req, 
sizeof(mcast_req) );<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.create = TRUE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Copy the settings from the broadcast group. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec = p_port->ib_mgr.bcast_rec;<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Clear fields that aren't specified in the join */<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.mlid = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_member_set_state( 
&mcast_req.member_rec.scope_state,state);<o:p></o:p></P>
<P class=MsoNormal>+    /* Copy the settings from the broadcast 
group. */<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec = 
p_port->ib_mgr.bcast_rec;<o:p></o:p></P>
<P class=MsoNormal>+    /* Clear fields that aren't specified in 
the join */<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.mlid = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    ib_member_set_state( 
&mcast_req.member_rec.scope_state,state);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E ))<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Update the address portion of the MGID with the 28 lower bits of 
the<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* IP address.  Since we're given a MAC address, we are using 
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* 24 lower bits of that network-byte-ordered value (assuming MSb<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* is zero) and 4 lsb bits of the first byte of IP address.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[13] = mac.addr[3];<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Handle non IP mutlicast MAC addresses. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Update the signature to use the lower 2 bytes of the OpenIB OUI. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Now copy the MAC address into the last 6 bytes of the GID. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( &mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( (mac.addr[0] == 1) && 
(mac.addr[2] == 0x5E ))<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * Update 
the address portion of the MGID with the 28 lower bits of the<o:p></o:p></P>
<P class=MsoNormal>+         * IP 
address.  Since we're given a MAC address, we are using <o:p></o:p></P>
<P class=MsoNormal>+         * 24 lower 
bits of that network-byte-ordered value (assuming MSb<o:p></o:p></P>
<P class=MsoNormal>+         * is zero) 
and 4 lsb bits of the first byte of IP address.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[13] = mac.addr[3];<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /* Handle non IP 
mutlicast MAC addresses. */<o:p></o:p></P>
<P class=MsoNormal>+        /* Update the 
signature to use the lower 2 bytes of the OpenIB OUI. */<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></P>
<P class=MsoNormal>+        /* Now copy the 
MAC address into the last 6 bytes of the GID. */<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( 
&mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.mcast_context = p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.pfn_mcast_cb = __mcast_cb;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P 
class=MsoNormal>-              
mcast_req.member_rec.pkey = 
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* Create the endpoint and insert it in the port.  Since we don't wait 
for<o:p></o:p></P>
<P 
class=MsoNormal>-              
* the mcast SA operations to complete before returning from the 
multicast<o:p></o:p></P>
<P 
class=MsoNormal>-              
* list set OID asynchronously, it is possible for the mcast entry to 
be<o:p></o:p></P>
<P 
class=MsoNormal>-              
* cleared before the SA interaction completes.  In this case, when 
the<o:p></o:p></P>
<P 
class=MsoNormal>-              
* mcast callback is invoked, it would not find the corresponding 
endpoint<o:p></o:p></P>
<P 
class=MsoNormal>-              
* and would be undone.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt = ipoib_endpt_create(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_endpt )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.mcast_context = 
p_port;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.pfn_mcast_cb = 
__mcast_cb;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.timeout_ms = 
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.retry_cnt = 
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.port_guid = 
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.pkey_index = 
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+    mcast_req.member_rec.pkey = 
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * Create the endpoint and insert it 
in the port.  Since we don't wait for<o:p></o:p></P>
<P class=MsoNormal>+     * the mcast SA operations to 
complete before returning from the multicast<o:p></o:p></P>
<P class=MsoNormal>+     * list set OID asynchronously, it 
is possible for the mcast entry to be<o:p></o:p></P>
<P class=MsoNormal>+     * cleared before the SA interaction 
completes.  In this case, when the<o:p></o:p></P>
<P class=MsoNormal>+     * mcast callback is invoked, it 
would not find the corresponding endpoint<o:p></o:p></P>
<P class=MsoNormal>+     * and would be 
undone.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt = 
ipoib_endpt_create(<o:p></o:p></P>
<P class=MsoNormal>+        
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    status = __endpt_mgr_insert_locked( 
p_port, mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* reference the object for the multicast join request. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_ref( p_port, ref_join_mcast );<o:p></o:p></P>
<P class=MsoNormal>+    /* reference the object for the multicast 
join request. */<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_ref( p_port, ref_join_mcast 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, 
&mcast_req );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_mcast_join_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-              
("Joined MCAST group with MGID[10:15]= %0x %0x %0x %0x %0x 
%0x\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></P>
<P 
class=MsoNormal>-                              
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></P>
<P class=MsoNormal>+    status = 
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, 
&mcast_req );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_mcast_join_failed );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_MCAST,<o:p></o:p></P>
<P class=MsoNormal>+    ("Joined MCAST group with MGID[10:15]= 
%0x %0x %0x %0x %0x %0x\n",<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></P>
<P class=MsoNormal>+        
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return status;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal>+    return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __mcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ib_mcast_rec_t                                                                
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ib_mcast_rec_t              
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ib_api_status_t                                
status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_fmap_item_t                               
*p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t                   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    ib_api_status_t     
status;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal>+    
cl_fmap_item_t      *p_item;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_endpt_t       *p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if( p_port->state != IB_QPS_RTS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_mcast_inv_state );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid state - 
Aborting.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state - 
Aborting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_mcast_inv_state );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid state - Aborting.\n") 
);<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state - Aborting.\n") 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
__pending_list_destroy( p_port );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+        
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        
__pending_list_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+        
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_mcast_rec->status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Multicast join request failed with status %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Flag the adapter as hung. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->hung =TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_mcast_req_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( p_mcast_rec->status != IB_SUCCESS 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Multicast join request failed with status %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) 
);<o:p></o:p></P>
<P class=MsoNormal>+        /* Flag the 
adapter as hung. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->hung =TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_mcast_req_failed );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_fmap_get(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* The endpoint must have been flushed while the join request<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* was outstanding.  Just leave the group and return.  
This<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* is not an error.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to find endpoint for update.\n") );<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_fmap_get(<o:p></o:p></P>
<P class=MsoNormal>+        
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( p_item == cl_fmap_end( 
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        /*<o:p></o:p></P>
<P class=MsoNormal>+         * The 
endpoint must have been flushed while the join request<o:p></o:p></P>
<P class=MsoNormal>+         * was 
outstanding.  Just leave the group and return.  This<o:p></o:p></P>
<P class=MsoNormal>+         * is not an 
error.<o:p></o:p></P>
<P class=MsoNormal>+         
*/<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to find endpoint for update.\n") );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_mcast_no_endpt );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+        
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, 
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_mcast_no_endpt );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt = PARENT_STRUCT( p_item, 
ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt->p_ifc = 
p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Setup the endpoint for use. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
status = ipoib_endpt_set_mcast(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( status != IB_SUCCESS )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Flag the adapter as hung. */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ipoib_port_deref( p_port, ref_mcast_av_failed );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Setup the endpoint for use. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    status = 
ipoib_endpt_set_mcast(<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt, 
p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+        /* Flag the 
adapter as hung. */<o:p></o:p></P>
<P class=MsoNormal>+        
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+        ipoib_port_deref( 
p_port, ref_mcast_av_failed );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_EXIT( 
IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/*<o:p></o:p></P>
<P 
class=MsoNormal>-              
* The endpoint is already in the GID and MAC maps.<o:p></o:p></P>
<P 
class=MsoNormal>-              
* mast endpoint are not used in the LID map.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT(p_endpt->dlid == 0);<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* set flag that endpoint is use */<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_endpt->is_in_use = TRUE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Try to send all pending sends. */<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("Calling 
ipoib_port_resume from mcast_cb\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_resume(p_port , FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    /*<o:p></o:p></P>
<P class=MsoNormal>+     * The endpoint is already in the 
GID and MAC maps.<o:p></o:p></P>
<P class=MsoNormal>+     * mast endpoint are not used in the 
LID map.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT(p_endpt->dlid == 
0);<o:p></o:p></P>
<P class=MsoNormal>+    /* set flag that endpoint is use 
*/<o:p></o:p></P>
<P class=MsoNormal>+    p_endpt->is_in_use = 
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* Try to send all pending sends. 
*/<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, 
IPOIB_DBG_MCAST, ("Calling ipoib_port_resume from mcast_cb\n"));<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_resume(p_port , 
FALSE);<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_join_mcast );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, ref_join_mcast 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_leave_mcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                       
*context )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                
*context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt = 
%d\n", p_port->mcast_cnt));<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>-              
//It happens<o:p></o:p></P>
<P 
class=MsoNormal>-              
//ASSERT(p_port->mcast_cnt > 0);<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_atomic_dec( &p_port->mcast_cnt);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if(0 == p_port->mcast_cnt)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, 
IPOIB_DBG_MCAST,("p_port->mcast_cnt = %d\n", 
p_port->mcast_cnt));<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, 
ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+    //It happens<o:p></o:p></P>
<P class=MsoNormal>+    //ASSERT(p_port->mcast_cnt > 
0);<o:p></o:p></P>
<P class=MsoNormal>+    cl_atomic_dec( 
&p_port->mcast_cnt);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if(0 == 
p_port->mcast_cnt)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        KeSetEvent( 
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
void                                                       
*context )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
void                
*context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t                      
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+    
ipoib_port_t        *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_port = (ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal>+    p_port = 
(ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_deref( p_port, 
ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_PRINT_EXIT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /*++<o:p></o:p></P>
<P class=MsoNormal>@@ -7874,336 +7921,336 @@<o:p></o:p></P>
<P class=MsoNormal> --*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> NDIS_STATUS GetLsoHeaderSize(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
PNET_BUFFER                   
pNetBuffer,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
LsoData 
                               
*pLsoData,<o:p></o:p></P>
<P 
class=MsoNormal>-              
OUT       
UINT                                      
*IndexOfData,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
ipoib_hdr_t *ipoib_hdr<o:p></o:p></P>
<P 
class=MsoNormal>-              
)<o:p></o:p></P>
<P class=MsoNormal>+    IN      
PNET_BUFFER     pNetBuffer,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
LsoData         
*pLsoData,<o:p></o:p></P>
<P class=MsoNormal>+    OUT     
UINT            
*IndexOfData,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
ipoib_hdr_t *ipoib_hdr<o:p></o:p></P>
<P class=MsoNormal>+    )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
UINT                      
CurrLength;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PUCHAR                               
pSrc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PUCHAR                               
pCopiedData = pLsoData->coppied_data;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ip_hdr_t 
             
UNALIGNED  *IpHdr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
tcp_hdr_t            UNALIGNED 
*TcpHdr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint16_t               
TcpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint16_t               
IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint16_t 
              
IpOffset;<o:p></o:p></P>
<P 
class=MsoNormal>-              
INT                                         
FullBuffers = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PMDL 
                   
pMDL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
NDIS_STATUS    status = 
NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    
UINT        CurrLength;<o:p></o:p></P>
<P class=MsoNormal>+    PUCHAR      
pSrc;<o:p></o:p></P>
<P class=MsoNormal>+    PUCHAR      
pCopiedData = pLsoData->coppied_data;<o:p></o:p></P>
<P class=MsoNormal>+    ip_hdr_t    
UNALIGNED  *IpHdr;<o:p></o:p></P>
<P class=MsoNormal>+    tcp_hdr_t   UNALIGNED 
*TcpHdr;<o:p></o:p></P>
<P class=MsoNormal>+    uint16_t    
TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    uint16_t    
IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    uint16_t    
IpOffset;<o:p></o:p></P>
<P class=MsoNormal>+    
INT         FullBuffers = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    
PMDL        pMDL;<o:p></o:p></P>
<P class=MsoNormal>+    NDIS_STATUS status = 
NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> #define IP_OFFSET 14;<o:p></o:p></P>
<P 
class=MsoNormal>-              
//<o:p></o:p></P>
<P 
class=MsoNormal>-              
// This Flag indicates the way we gets the headers<o:p></o:p></P>
<P 
class=MsoNormal>-              
// RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer 
<o:p></o:p></P>
<P 
class=MsoNormal>-              
// in sequence.<o:p></o:p></P>
<P 
class=MsoNormal>-              
//<o:p></o:p></P>
<P 
class=MsoNormal>-              
boolean_t                                           
IsRegularFlow = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+    //<o:p></o:p></P>
<P class=MsoNormal>+    // This Flag indicates the way we gets 
the headers<o:p></o:p></P>
<P class=MsoNormal>+    // RegularFlow = we get the headers 
(ETH+IP+TCP) in the same Buffer <o:p></o:p></P>
<P class=MsoNormal>+    // in sequence.<o:p></o:p></P>
<P class=MsoNormal>+    //<o:p></o:p></P>
<P class=MsoNormal>+    
boolean_t           
IsRegularFlow = TRUE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
const uint16_t 
                  
ETH_OFFSET = IP_OFFSET; <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
pLsoData->LsoHeaderSize = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IpOffset = IP_OFFSET; 
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></P>
<P 
class=MsoNormal>-              
*IndexOfData = 0;<o:p></o:p></P>
<P class=MsoNormal>+    const 
uint16_t      ETH_OFFSET = IP_OFFSET; <o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    pLsoData->LsoHeaderSize = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    IpOffset = IP_OFFSET; 
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></P>
<P class=MsoNormal>+    *IndexOfData = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></P>
<P 
class=MsoNormal>-              
NdisQueryMdl(pMDL, &pSrc, &CurrLength, 
NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (pSrc == NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
ULONG DataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></P>
<P 
class=MsoNormal>-              
pSrc += DataOffset;<o:p></o:p></P>
<P 
class=MsoNormal>-              
CurrLength -= DataOffset;<o:p></o:p></P>
<P class=MsoNormal>+    pMDL = 
NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+    NdisQueryMdl(pMDL, &pSrc, 
&CurrLength, NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if (pSrc == NULL) {<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing 
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ULONG DataOffset = 
NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+    pSrc += DataOffset;<o:p></o:p></P>
<P class=MsoNormal>+    CurrLength -= DataOffset;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
// We start by looking for the ethernet and the IP<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength < ETH_OFFSET) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
//pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + 
ETH_OFFSET;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength == ETH_OFFSET) {        
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IsRegularFlow = FALSE;        <o:p></o:p></P>
<P 
class=MsoNormal>-                              
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pCopiedData += ETH_OFFSET;        
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
FullBuffers++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// First buffer was only ethernet<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+    // We start by looking for the ethernet 
and the IP<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength < ETH_OFFSET) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    //pLsoData->LsoHeaderSize = 
pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength == ETH_OFFSET) 
{        <o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        IsRegularFlow = 
FALSE;        <o:p></o:p></P>
<P class=MsoNormal>+        
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></P>
<P class=MsoNormal>+        pCopiedData += 
ETH_OFFSET;        <o:p></o:p></P>
<P class=MsoNormal>+        
FullBuffers++;<o:p></o:p></P>
<P class=MsoNormal>+        // First buffer 
was only ethernet<o:p></o:p></P>
<P class=MsoNormal>+        pNetBuffer = 
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>         
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, 
NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (pSrc == NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
    }<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// This is ETH + IP together (at least)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof 
(ipoib_hdr_t));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//IMPORTANT: we de-facto replace ETH header by IPoIB header here<o:p></o:p></P>
<P 
class=MsoNormal>-                              
memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof 
(ipoib_hdr_t));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CurrLength -= ETH_OFFSET;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pSrc = pSrc + ETH_OFFSET;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof 
(ipoib_hdr_t);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
// we should now be having at least the size of ethernet data<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength < IpHeaderLen) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + 
IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
// We now start to find where the TCP header starts<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength == IpHeaderLen) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(FALSE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// two options : <o:p></o:p></P>
<P 
class=MsoNormal>-                              
// if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two 
buffers<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer 
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// TCP will start at next buffer<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if(IsRegularFlow){<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        if (pSrc == NULL) 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        // This is ETH + 
IP together (at least)<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof 
(ipoib_hdr_t));<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        //IMPORTANT: we 
de-facto replace ETH header by IPoIB header here<o:p></o:p></P>
<P class=MsoNormal>+        memcpy 
(pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof 
(ipoib_hdr_t));<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        CurrLength -= 
ETH_OFFSET;<o:p></o:p></P>
<P class=MsoNormal>+        pSrc = pSrc + 
ETH_OFFSET;<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof 
(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    // we should now be having at least the 
size of ethernet data<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength < sizeof (ip_hdr_t)) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    IpHdr = (ip_hdr_t 
UNALIGNED*)pSrc;<o:p></o:p></P>
<P class=MsoNormal>+    IpHeaderLen = 
(uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(IpHdr->prot == 
IP_PROT_TCP);<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength < IpHeaderLen) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing 
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    pLsoData->LsoHeaderSize = 
pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    // We now start to find where the TCP 
header starts<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength == IpHeaderLen) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+        // two options : 
<o:p></o:p></P>
<P class=MsoNormal>+        // 
if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two 
buffers<o:p></o:p></P>
<P class=MsoNormal>+        // 
if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer <o:p></o:p></P>
<P class=MsoNormal>+        // TCP will start 
at next buffer<o:p></o:p></P>
<P class=MsoNormal>+        
if(IsRegularFlow){<o:p></o:p></P>
<P 
class=MsoNormal>+            
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>+            
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>+            
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
FullBuffers++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IsRegularFlow = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength, 
NormalPagePriority );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, 
NormalPagePriority);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (pSrc == NULL) {<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
// if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same 
buffer       <o:p></o:p></P>
<P 
class=MsoNormal>-                              
// if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the 
same buffer<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if (IsRegularFlow) 
{            
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
} else {  
          <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P class=MsoNormal>+        
FullBuffers++;<o:p></o:p></P>
<P class=MsoNormal>+        IsRegularFlow = 
FALSE;<o:p></o:p></P>
<P class=MsoNormal>+        
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></P>
<P class=MsoNormal>+        
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength, 
NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+        pNetBuffer = 
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+        
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength, 
NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+        if (pSrc == NULL) 
{<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>+            
return status;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        // 
if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same 
buffer       <o:p></o:p></P>
<P class=MsoNormal>+        // 
if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the 
same buffer<o:p></o:p></P>
<P class=MsoNormal>+        if 
(IsRegularFlow) 
{            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+        } else 
{            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>+            
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
CurrLength -= IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pSrc = pSrc + IpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength < sizeof (tcp_hdr_t)) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
// We have finaly found the TCP header<o:p></o:p></P>
<P 
class=MsoNormal>-              
TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></P>
<P 
class=MsoNormal>-              
TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></P>
<P class=MsoNormal>+        CurrLength -= 
IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+        pSrc = pSrc + 
IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength < sizeof (tcp_hdr_t)) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    // We have finaly found the TCP 
header<o:p></o:p></P>
<P class=MsoNormal>+    TcpHdr = (tcp_hdr_t UNALIGNED 
*)pSrc;<o:p></o:p></P>
<P class=MsoNormal>+    TcpHeaderLen = 
TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
//ASSERT(TcpHeaderLen == 20);<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength < TcpHeaderLen) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return status;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
pLsoData->LsoHeaderSize =  pLsoData->LsoHeaderSize + 
TcpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if(IsRegularFlow){<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pCopiedData += TcpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if (CurrLength == TcpHeaderLen) {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
FullBuffers++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*IndexOfData = FullBuffers ;<o:p></o:p></P>
<P 
class=MsoNormal>-              
} else {<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*IndexOfData = FullBuffers - 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
pLsoData->FullBuffers = FullBuffers; <o:p></o:p></P>
<P 
class=MsoNormal>-              
if (!IsRegularFlow){<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + 
TcpHeaderLen;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+    //ASSERT(TcpHeaderLen == 
20);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength < TcpHeaderLen) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing 
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+        return 
status;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    pLsoData->LsoHeaderSize =  
pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    if(IsRegularFlow){<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else{<o:p></o:p></P>
<P class=MsoNormal>+        
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></P>
<P class=MsoNormal>+        pCopiedData += 
TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if (CurrLength == TcpHeaderLen) 
{<o:p></o:p></P>
<P class=MsoNormal>+        
FullBuffers++;<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></P>
<P class=MsoNormal>+        *IndexOfData = 
FullBuffers ;<o:p></o:p></P>
<P class=MsoNormal>+    } else {<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></P>
<P class=MsoNormal>+        *IndexOfData = 
FullBuffers - 1;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    pLsoData->FullBuffers = FullBuffers; 
<o:p></o:p></P>
<P class=MsoNormal>+    if (!IsRegularFlow){<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></P>
<P class=MsoNormal>+        
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + 
TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+        
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t* 
const       p_port)<o:p></o:p></P>
<P class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const 
p_port)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal>     const mac_addr_t DEFAULT_MCAST_GROUP 
= {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01};<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Do garbage collecting... */<o:p></o:p></P>
<P class=MsoNormal>+    /* Do garbage collecting... 
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_map_item_t *p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_endpt_t   *p_endpt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_t                              
destroy_mc_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t                                 
cnt;<o:p></o:p></P>
<P 
class=MsoNormal>-              
const static GC_MAX_LEAVE_NUM = 80;<o:p></o:p></P>
<P class=MsoNormal>+    cl_map_item_t   
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_endpt_t   
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_t      
destroy_mc_list;<o:p></o:p></P>
<P class=MsoNormal>+    
uint8_t         cnt;<o:p></o:p></P>
<P class=MsoNormal>+    const static GC_MAX_LEAVE_NUM = 
80;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &destroy_mc_list );<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &destroy_mc_list 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Wait for all readers to finish */<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( p_port->endpt_rdr )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cnt = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )) 
&& (cnt < GC_MAX_LEAVE_NUM))<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = cl_qmap_next( p_item );<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_lock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal>+    /* Wait for all readers to finish 
*/<o:p></o:p></P>
<P class=MsoNormal>+    while( p_port->endpt_rdr 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_unlock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_lock( 
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+    p_item = cl_qmap_head( 
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+    while( (p_item != cl_qmap_end( 
&p_port->endpt_mgr.mac_endpts )) && (cnt < 
GC_MAX_LEAVE_NUM))<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+        p_item = 
cl_qmap_next( p_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* Check if the current endpoint is not a multicast listener */<o:p></o:p></P>
<P class=MsoNormal>+        /* Check if the 
current endpoint is not a multicast listener */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_endpt->h_mcast && <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(!p_endpt->is_mcast_listener) &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t) 
) &&<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
(!p_endpt->is_in_use) ))<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+        if( 
p_endpt->h_mcast && <o:p></o:p></P>
<P 
class=MsoNormal>+            
(!p_endpt->is_mcast_listener) &&<o:p></o:p></P>
<P 
class=MsoNormal>+            
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t) 
) &&<o:p></o:p></P>
<P 
class=MsoNormal>+             
(!p_endpt->is_in_use) ))<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->mac_item );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( p_endpt->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
&p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->dlid = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( p_endpt->dlid )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
&p_endpt->lid_item );<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_endpt->dlid = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cnt++;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_insert_tail(<o:p></o:p></P>
<P 
class=MsoNormal>+                
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
cnt++;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_obj_unlock( &p_port->obj 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* Destroy all multicast endpoints now that we have released the lock. 
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
while( cl_qlist_count( &destroy_mc_list ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list 
),<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x 
\n", <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[0],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[2],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[4],<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_endpt->mac.addr[5]) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    /* Destroy all multicast endpoints now 
that we have released the lock. */<o:p></o:p></P>
<P class=MsoNormal>+    while( cl_qlist_count( 
&destroy_mc_list ) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_endpt = 
PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),<o:p></o:p></P>
<P 
class=MsoNormal>+                                 
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT( 
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x 
\n", <o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_endpt->mac.addr[0],<o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_endpt->mac.addr[1],<o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_endpt->mac.addr[2],<o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_endpt->mac.addr[3],<o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_endpt->mac.addr[4],<o:p></o:p></P>
<P 
class=MsoNormal>+                 
p_endpt->mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+        cl_obj_destroy( 
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC 
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_port_t *p_port = (ipoib_port_t *) 
context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></P>
<P 
class=MsoNormal>-              
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></P>
<P class=MsoNormal>+    
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal>+    
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_get_by_gid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ib_gid_t* 
const                                                 
p_gid )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ib_gid_t* 
const             
p_gid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
return __endpt_mgr_get_by_gid( p_port, p_gid );<o:p></o:p></P>
<P class=MsoNormal>+    return __endpt_mgr_get_by_gid( p_port, 
p_gid );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_get_by_lid(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     
net16_t                                                                                                
lid )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   
net16_t                     
lid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
return __endpt_mgr_get_by_lid( p_port, lid );<o:p></o:p></P>
<P class=MsoNormal>+    return __endpt_mgr_get_by_lid( p_port, 
lid );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_recv_dhcp(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                           
const     ipoib_pkt_t* 
const                                          
p_ipoib,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
OUT                                       
eth_pkt_t* 
const                                             
p_eth,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_src,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_endpt_t* 
const                    
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const         
p_port,<o:p></o:p></P>
<P class=MsoNormal>+    IN      
const   ipoib_pkt_t* 
const          
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+        
OUT         eth_pkt_t* 
const            
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const      
  p_src,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_endpt_t* const        p_dst 
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
return __recv_dhcp(<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_port, p_ipoib, p_eth, p_src,p_dst );<o:p></o:p></P>
<P class=MsoNormal>+    return __recv_dhcp(<o:p></o:p></P>
<P class=MsoNormal>+        p_port, p_ipoib, 
p_eth, p_src,p_dst );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_cancel_xmit(<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
ipoib_port_t* 
const                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-              
IN                                                           
PVOID                                                                   
cancel_id )<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
ipoib_port_t* const     p_port,<o:p></o:p></P>
<P class=MsoNormal>+    
IN              
PVOID                    
cancel_id )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_list_item_t                    
*p_item, *p_next;<o:p></o:p></P>
<P 
class=MsoNormal>-              
ipoib_send_NB_SG        
*s_buf;<o:p></o:p></P>
<P 
class=MsoNormal>-              
PVOID                                   
nbl_id;<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_t                              
cancel_list;<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    
cl_list_item_t      *p_item, *p_next;<o:p></o:p></P>
<P class=MsoNormal>+    ipoib_send_NB_SG    
*s_buf;<o:p></o:p></P>
<P class=MsoNormal>+    
PVOID           
nbl_id;<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_t      
cancel_list;<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_qlist_init( &cancel_list );<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
ASSERT(FALSE); //TODO ???????????????? Do we reach here 
????????????<o:p></o:p></P>
<P class=MsoNormal>+    cl_qlist_init( &cancel_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    ASSERT(FALSE); //TODO ???????????????? Do 
we reach here ????????????<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_acquire( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_item = p_next )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_next = cl_qlist_next( p_item );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this 
casting<o:p></o:p></P>
<P 
class=MsoNormal>-                              
nbl_id = NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( nbl_id == cancel_id )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED 
;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+    for( p_item = cl_qlist_head( 
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+        p_item != 
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+        p_item = p_next 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        p_next = 
cl_qlist_next( p_item );<o:p></o:p></P>
<P class=MsoNormal>+        s_buf = 
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></P>
<P class=MsoNormal>+        nbl_id = 
NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></P>
<P class=MsoNormal>+        if( nbl_id == 
cancel_id )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item 
);<o:p></o:p></P>
<P 
class=MsoNormal>+            
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED 
;<o:p></o:p></P>
<P class=MsoNormal>+          
  cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf 
);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    cl_spinlock_release( 
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( cl_qlist_count( &cancel_list ) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
while( ( p_item = cl_qlist_remove_head( &cancel_list )) <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
!= cl_qlist_end( &cancel_list ))<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+    if( cl_qlist_count( &cancel_list ) 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        while( ( p_item = 
cl_qlist_remove_head( &cancel_list )) <o:p></o:p></P>
<P 
class=MsoNormal>+                                
!= cl_qlist_end( &cancel_list ))<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
//TODO don't use DISPATCH LEVEL<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__send_complete_net_buffer(<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, 
TRUE);<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
//TODO don't use DISPATCH LEVEL<o:p></o:p></P>
<P 
class=MsoNormal>+            
__send_complete_net_buffer(<o:p></o:p></P>
<P 
class=MsoNormal>+                
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, 
TRUE);<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* <o:p></o:p></P>
<P class=MsoNormal>@@ -8215,305 +8262,305 @@<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_fragments(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
ipoib_port_t* 
const                                        
p_port,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
ipoib_send_desc_t* const          
p_desc,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
eth_hdr_t* 
const                                            
p_eth_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
ip_hdr_t* 
const                                                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint32_t                                                                               
buf_len,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
NDIS_BUFFER*                                                 
p_ndis_buf )<o:p></o:p></P>
<P class=MsoNormal>+IN      ipoib_port_t* 
const         p_port,<o:p></o:p></P>
<P class=MsoNormal>+IN      ipoib_send_desc_t* 
const    p_desc,<o:p></o:p></P>
<P class=MsoNormal>+IN      eth_hdr_t* 
const            
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN      ip_hdr_t* 
const             
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN      
uint32_t                    
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+IN      
NDIS_BUFFER*                
p_ndis_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
ds_idx = 1;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
wr_idx = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
sgl_idx = 2; //skip eth hdr, ip hdr<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
options_len = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t*               
p_options = NULL;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t*               
p_buf;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
frag_offset = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
wr_size = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
total_ip_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    ds_idx = 
1;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    wr_idx = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    sgl_idx = 2; 
//skip eth hdr, ip hdr<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    options_len = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    uint8_t*    p_options = 
NULL;<o:p></o:p></P>
<P class=MsoNormal>+    uint8_t*    
p_buf;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    frag_offset = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    
next_sge;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    wr_size = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    ip_hdr_len = 
IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    total_ip_len = 
cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
SCATTER_GATHER_LIST                                
*p_sgl;<o:p></o:p></P>
<P class=MsoNormal>+    
SCATTER_GATHER_LIST     *p_sgl;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( IP_DONT_FRAGMENT(p_ip_hdr) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, 
ScatterGatherListPacketInfo );<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_sgl )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ASSERT( p_sgl );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Too many SG Elements in packet.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_buf = (uint8_t *)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( !p_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
s_buf->p_send_buf = (send_buf_t*)p_buf;<o:p></o:p></P>
<P class=MsoNormal>+    if( IP_DONT_FRAGMENT(p_ip_hdr) 
)<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( 
p_desc->p_pkt, ScatterGatherListPacketInfo );<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_sgl )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        ASSERT( p_sgl 
);<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    if( ( p_sgl->NumberOfElements > 
MAX_SEND_SGE ||<o:p></o:p></P>
<P class=MsoNormal>+        
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Too many SG Elements in packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_buf = (uint8_t *)<o:p></o:p></P>
<P class=MsoNormal>+        
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list 
);<o:p></o:p></P>
<P class=MsoNormal>+    if( !p_buf )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        IPOIB_PRINT_EXIT( 
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+            
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+        return 
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    s_buf->p_send_buf = 
(send_buf_t*)p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( buf_len < ip_hdr_len )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{              /* ip 
options in a separate buffer */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_ndis_buf )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to get IP options buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, 
NormalPagePriority );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( !p_options )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
("Failed to query IP options buffer address.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( p_options && options_len )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{ <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
p_options, options_len, TRUE );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
wr_size = buf_len + options_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
sgl_idx++;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{              
/*options probably in the same buffer */<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( p_buf, p_ip_hdr, buf_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
options_len = ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( options_len )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
frag_offset += ( buf_len - ip_hdr_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
wr_size = buf_len;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P class=MsoNormal>+    if( buf_len < ip_hdr_len 
)<o:p></o:p></P>
<P class=MsoNormal>+    {   /* ip options in a separate 
buffer */<o:p></o:p></P>
<P class=MsoNormal>+        CL_ASSERT( 
buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P class=MsoNormal>+        
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_ndis_buf 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to get IP options buffer.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, 
NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+        if( !p_options 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P 
class=MsoNormal>+                
("Failed to query IP options buffer address.\n") );<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( p_buf, 
p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P class=MsoNormal>+        if( p_options 
&& options_len )<o:p></o:p></P>
<P class=MsoNormal>+        { <o:p></o:p></P>
<P 
class=MsoNormal>+            
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P 
class=MsoNormal>+                                
p_options, options_len, TRUE );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        wr_size = buf_len 
+ options_len;<o:p></o:p></P>
<P class=MsoNormal>+        
sgl_idx++;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {   /*options probably in the 
same buffer */<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( p_buf, 
p_ip_hdr, buf_len );<o:p></o:p></P>
<P class=MsoNormal>+        options_len = 
ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></P>
<P class=MsoNormal>+        if( options_len 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        frag_offset += ( 
buf_len - ip_hdr_len );<o:p></o:p></P>
<P class=MsoNormal>+        wr_size = 
buf_len;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
/* count how much data can be put into the first WR beside IP 
header.<o:p></o:p></P>
<P 
class=MsoNormal>-              
* other protocols headers possibly supplied in subsequent 
buffers.<o:p></o:p></P>
<P 
class=MsoNormal>-              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-              
for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf 
);<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+    
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    /* count how much data can be put into 
the first WR beside IP header.<o:p></o:p></P>
<P class=MsoNormal>+     * other protocols headers possibly 
supplied in subsequent buffers.<o:p></o:p></P>
<P class=MsoNormal>+     */<o:p></o:p></P>
<P class=MsoNormal>+    for( sgl_idx; sgl_idx < 
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        next_sge = 
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
/* add sgl if it can fit into the same WR <o:p></o:p></P>
<P 
class=MsoNormal>-                              
* Note: so far not going to split large SGE between WRs,<o:p></o:p></P>
<P 
class=MsoNormal>-                              
* so first fragment could be a smaller size.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) 
)<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
wr_size += next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
frag_offset += next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                                              
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
else<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
/* fix ip hdr for the first fragment and move on */<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></P>
<P class=MsoNormal>+        /* add sgl if it 
can fit into the same WR <o:p></o:p></P>
<P class=MsoNormal>+        * Note: so far 
not going to split large SGE between WRs,<o:p></o:p></P>
<P class=MsoNormal>+        * so first 
fragment could be a smaller size.<o:p></o:p></P>
<P class=MsoNormal>+        */<o:p></o:p></P>
<P class=MsoNormal>+        if( next_sge 
<= ( p_port->p_adapter->params.payload_mtu - wr_size ) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
++ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>+            
wr_size += next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>+            
frag_offset += next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></P>
<P class=MsoNormal>+        
                            p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        
else<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
/* fix ip hdr for the first fragment and move on */<o:p></o:p></P>
<P 
class=MsoNormal>+            
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></P>
<P 
class=MsoNormal>+                
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_buf += ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 
0);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++wr_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
ds_idx = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
total_ip_len -= wr_size;<o:p></o:p></P>
<P 
class=MsoNormal>-              
wr_size = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_buf += ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 
0);<o:p></o:p></P>
<P 
class=MsoNormal>+            
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></P>
<P 
class=MsoNormal>+            
++wr_idx;<o:p></o:p></P>
<P 
class=MsoNormal>+            
ds_idx = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    total_ip_len -= wr_size;<o:p></o:p></P>
<P class=MsoNormal>+    wr_size = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ 
)<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
uint32_t               
seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
uint64_t               
next_sgl_addr;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                              
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P class=MsoNormal>+    for( sgl_idx, wr_idx; sgl_idx < 
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
uint32_t    seg_len;<o:p></o:p></P>
<P class=MsoNormal>+        
uint64_t    next_sgl_addr;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        if( wr_idx >= 
( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></P>
<P 
class=MsoNormal>+            
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+        <o:p></o:p></P>
<P class=MsoNormal>+        next_sge = 
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P class=MsoNormal>+        next_sgl_addr = 
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
while( next_sge )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( ds_idx == 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{              
/* new ipoib + ip header */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
++ds_idx;<o:p></o:p></P>
<P class=MsoNormal>+        while( next_sge 
)<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( ds_idx == 0 )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{   /* new ipoib + ip header */<o:p></o:p></P>
<P 
class=MsoNormal>+                
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></P>
<P 
class=MsoNormal>+                
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></P>
<P 
class=MsoNormal>+                
++ds_idx;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( p_options && options_len )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
/* copy ip options if needed */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                                                                              
p_options, options_len, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
wr_size = ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( ds_idx == 1 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
++ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( p_options && options_len )<o:p></o:p></P>
<P 
class=MsoNormal>+                
{<o:p></o:p></P>
<P 
class=MsoNormal>+                    
/* copy ip options if needed */<o:p></o:p></P>
<P 
class=MsoNormal>+                    
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P 
class=MsoNormal>+                                
p_options, options_len, FALSE );<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+                
wr_size = ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( ds_idx == 1 )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+                
++ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu - 
wr_size ) )?<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
( p_port->p_adapter->params.payload_mtu - wr_size ) : 
next_sge;<o:p></o:p></P>
<P 
class=MsoNormal>+            
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu - 
wr_size ) )?<o:p></o:p></P>
<P 
class=MsoNormal>+                
( p_port->p_adapter->params.payload_mtu - wr_size ) : 
next_sge;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = 
next_sgl_addr;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
++ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
wr_size += seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
total_ip_len -= seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = 
next_sgl_addr;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = 
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P 
class=MsoNormal>+            
++ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>+            
<o:p></o:p></P>
<P 
class=MsoNormal>+            
wr_size += seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
total_ip_len -= seg_len;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len == 
0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{              
/* fix ip hdr for that fragment */<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, 
(uint16_t)wr_size,<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) 
);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
if( total_ip_len > 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
++wr_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
wr_size = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
ds_idx = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                                              
p_buf += ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
next_sge -= seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
if( next_sge > 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                                              
next_sgl_addr += seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_desc->num_wrs += wr_idx;<o:p></o:p></P>
<P 
class=MsoNormal>-              
<o:p></o:p></P>
<P 
class=MsoNormal>-              
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P 
class=MsoNormal>-              
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len == 
0 )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{   /* fix ip hdr for that fragment */<o:p></o:p></P>
<P 
class=MsoNormal>+                
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, 
(uint16_t)wr_size,<o:p></o:p></P>
<P 
class=MsoNormal>+                    
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></P>
<P 
class=MsoNormal>+                    
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) 
);<o:p></o:p></P>
<P 
class=MsoNormal>+                
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></P>
<P 
class=MsoNormal>+                
if( total_ip_len > 0 )<o:p></o:p></P>
<P class=MsoNormal>+          
      {<o:p></o:p></P>
<P 
class=MsoNormal>+                    
++wr_idx;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></P>
<P 
class=MsoNormal>+                    
wr_size = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
ds_idx = 0;<o:p></o:p></P>
<P 
class=MsoNormal>+                    
p_buf += ip_hdr_len;<o:p></o:p></P>
<P 
class=MsoNormal>+                
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P 
class=MsoNormal>+            
next_sge -= seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
if( next_sge > 0 )<o:p></o:p></P>
<P 
class=MsoNormal>+            
{<o:p></o:p></P>
<P 
class=MsoNormal>+                
next_sgl_addr += seg_len;<o:p></o:p></P>
<P 
class=MsoNormal>+            
}<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_desc->num_wrs += 
wr_idx;<o:p></o:p></P>
<P class=MsoNormal>+    <o:p></o:p></P>
<P class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND 
);<o:p></o:p></P>
<P class=MsoNormal>+    return 
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
ip_hdr_t* 
const                                
p_ip_hdr,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint16_t                                               
fragment_size, <o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint16_t                                               
fragment_offset, <o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
BOOLEAN                                                            
more_fragments )<o:p></o:p></P>
<P class=MsoNormal>+IN      ip_hdr_t* 
const     p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN      
uint16_t            
fragment_size, <o:p></o:p></P>
<P class=MsoNormal>+IN      
uint16_t            
fragment_offset, <o:p></o:p></P>
<P class=MsoNormal>+IN      
BOOLEAN             
more_fragments )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint16_t*            
p_hdr = (uint16_t*)p_ip_hdr;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ip_hdr->length = cl_hton16( fragment_size ); // bytes<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte 
units<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( more_fragments )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
else<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ip_hdr->chksum = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
p_ip_hdr->chksum = ipchksum( p_hdr, IP_HEADER_LENGTH(p_ip_hdr) 
);<o:p></o:p></P>
<P class=MsoNormal>+    uint16_t*   p_hdr = 
(uint16_t*)p_ip_hdr;<o:p></o:p></P>
<P class=MsoNormal>+    p_ip_hdr->length = cl_hton16( 
fragment_size ); // bytes<o:p></o:p></P>
<P class=MsoNormal>+    p_ip_hdr->offset = cl_hton16( 
fragment_offset ); // 8-byte units<o:p></o:p></P>
<P class=MsoNormal>+    if( more_fragments )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    else<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    p_ip_hdr->chksum = 0;<o:p></o:p></P>
<P class=MsoNormal>+    p_ip_hdr->chksum = ipchksum( p_hdr, 
IP_HEADER_LENGTH(p_ip_hdr) );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __copy_ip_options(<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint8_t*               
p_buf,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint8_t*               
p_options,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
uint32_t               
options_len,<o:p></o:p></P>
<P 
class=MsoNormal>-IN                          
BOOLEAN                            
copy_all )<o:p></o:p></P>
<P class=MsoNormal>+IN      uint8_t*    
p_buf,<o:p></o:p></P>
<P class=MsoNormal>+IN      uint8_t*    
p_options,<o:p></o:p></P>
<P class=MsoNormal>+IN      uint32_t    
options_len,<o:p></o:p></P>
<P class=MsoNormal>+IN      
BOOLEAN     copy_all )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
option_length;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
total_length = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint32_t               
copied_length = 0;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t*               
p_src = p_options;<o:p></o:p></P>
<P 
class=MsoNormal>-              
uint8_t*               
p_dst = p_buf;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    
option_length;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    total_length = 
0;<o:p></o:p></P>
<P class=MsoNormal>+    uint32_t    copied_length 
= 0;<o:p></o:p></P>
<P class=MsoNormal>+    uint8_t*    p_src = 
p_options;<o:p></o:p></P>
<P class=MsoNormal>+    uint8_t*    p_dst = 
p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
if( p_options == NULL || options_len == 0 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( copy_all )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memcpy( p_dst, p_src, options_len );<o:p></o:p></P>
<P 
class=MsoNormal>-                              
return;<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
do<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( ( *p_src ) == 0 ) // end of options list<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
total_length++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
break;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( ( *p_src ) == 0x1 ) // no op<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_src++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
total_length++;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
continue;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
/*from RFC791: <o:p></o:p></P>
<P 
class=MsoNormal>-                              
* This option may be used between options, for example, to align<o:p></o:p></P>
<P class=MsoNormal>+    if( p_options == NULL || options_len == 0 
)<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    if( copy_all )<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_memcpy( p_dst, 
p_src, options_len );<o:p></o:p></P>
<P class=MsoNormal>+        
return;<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    do<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        if( ( *p_src ) == 
0 ) // end of options list<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
total_length++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
break;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        if( ( *p_src ) == 
0x1 ) // no op<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_src++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
total_length++;<o:p></o:p></P>
<P 
class=MsoNormal>+            
continue;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        /*from RFC791: 
<o:p></o:p></P>
<P class=MsoNormal>+        * This option may 
be used between options, for example, to align<o:p></o:p></P>
<P class=MsoNormal>         * the 
beginning of a subsequent option on a 32 bit boundary.<o:p></o:p></P>
<P 
class=MsoNormal>-                              
*/<o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( copied_length && (copied_length % 4) )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_dst += align;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
copied_length += align;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
option_length = *(p_src + 1);<o:p></o:p></P>
<P class=MsoNormal>+        */<o:p></o:p></P>
<P class=MsoNormal>+        if( copied_length 
&& (copied_length % 4) )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_dst += align;<o:p></o:p></P>
<P 
class=MsoNormal>+            
copied_length += align;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        option_length = 
*(p_src + 1);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-                              
if( *p_src & 0x80 )<o:p></o:p></P>
<P 
class=MsoNormal>-                              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
p_dst += option_length;<o:p></o:p></P>
<P 
class=MsoNormal>-                                              
copied_length += option_length;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
}<o:p></o:p></P>
<P 
class=MsoNormal>-                              
total_length += option_length;<o:p></o:p></P>
<P 
class=MsoNormal>-                              
p_src += option_length;<o:p></o:p></P>
<P class=MsoNormal>+        if( *p_src & 
0x80 )<o:p></o:p></P>
<P class=MsoNormal>+        {<o:p></o:p></P>
<P 
class=MsoNormal>+            
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></P>
<P 
class=MsoNormal>+            
p_dst += option_length;<o:p></o:p></P>
<P 
class=MsoNormal>+            
copied_length += option_length;<o:p></o:p></P>
<P class=MsoNormal>+        }<o:p></o:p></P>
<P class=MsoNormal>+        total_length += 
option_length;<o:p></o:p></P>
<P class=MsoNormal>+        p_src += 
option_length;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
}while( total_length < options_len );<o:p></o:p></P>
<P class=MsoNormal>+    }while( total_length < options_len 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( total_length == options_len );<o:p></o:p></P>
<P 
class=MsoNormal>-              
CL_ASSERT( copied_length <= 40 );<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( total_length == options_len 
);<o:p></o:p></P>
<P class=MsoNormal>+    CL_ASSERT( copied_length <= 40 
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
/* padding the rest */<o:p></o:p></P>
<P 
class=MsoNormal>-              
if( options_len > copied_length )<o:p></o:p></P>
<P 
class=MsoNormal>-              
{<o:p></o:p></P>
<P 
class=MsoNormal>-                              
cl_memclr( p_dst, ( options_len - copied_length ) );<o:p></o:p></P>
<P 
class=MsoNormal>-              
}<o:p></o:p></P>
<P 
class=MsoNormal>-              
return;<o:p></o:p></P>
<P class=MsoNormal>+    /* padding the rest */<o:p></o:p></P>
<P class=MsoNormal>+    if( options_len > copied_length 
)<o:p></o:p></P>
<P class=MsoNormal>+    {<o:p></o:p></P>
<P class=MsoNormal>+        cl_memclr( p_dst, 
( options_len - copied_length ) );<o:p></o:p></P>
<P class=MsoNormal>+    }<o:p></o:p></P>
<P class=MsoNormal>+    return;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h<o:p></o:p></P>
<P 
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>--- 
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h     (revision 
6314)<o:p></o:p></P>
<P class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h  (working 
copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -607,8 +607,6 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_send_mgr_t                          
send_mgr;<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_send_desc_t 
*                     
p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>-              
KDPC                                                                     
recv_dpc;<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_endpt_mgr_t                        
endpt_mgr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal>                
endpt_buf_mgr_t                                           
cm_buf_mgr;<o:p></o:p></P>
<P class=MsoNormal>@@ -629,6 +627,7 @@<o:p></o:p></P>
<P 
class=MsoNormal>                
uint32_t                                                               
bc_join_retry_cnt;<o:p></o:p></P>
<P 
class=MsoNormal>                
ib_net16_t                                                          
base_lid;<o:p></o:p></P>
<P 
class=MsoNormal>                
LONG                                                                    
n_no_progress;<o:p></o:p></P>
<P 
class=MsoNormal>+             
PIO_WORKITEM                                               
pPoWorkItem;<o:p></o:p></P>
<P 
class=MsoNormal>                
ipoib_hdr_t                                                        
hdr[1];  /* Must be last! */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P 
class=MsoNormal> }             
ipoib_port_t;<o:p></o:p></P></DIV></DIV></BODY></HTML>