<!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">
<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: @Batang;
}
@font-face {
        font-family: BatangChe;
}
@font-face {
        font-family: @BatangChe;
}
@font-face {
        font-family: Gungsuh;
}
@font-face {
        font-family: @Gungsuh;
}
@font-face {
        font-family: GungsuhChe;
}
@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: @Gulim;
}
@font-face {
        font-family: GulimChe;
}
@font-face {
        font-family: @GulimChe;
}
@font-face {
        font-family: @Dotum;
}
@font-face {
        font-family: DotumChe;
}
@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: @Malgun Gothic;
}
@font-face {
        font-family: Meiryo;
}
@font-face {
        font-family: @Meiryo;
}
@font-face {
        font-family: Meiryo UI;
}
@font-face {
        font-family: @Meiryo UI;
}
@font-face {
        font-family: Microsoft Himalaya;
}
@font-face {
        font-family: Microsoft JhengHei;
}
@font-face {
        font-family: @Microsoft JhengHei;
}
@font-face {
        font-family: Microsoft YaHei;
}
@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_HKSCS;
}
@font-face {
        font-family: MingLiU-ExtB;
}
@font-face {
        font-family: @MingLiU-ExtB;
}
@font-face {
        font-family: PMingLiU-ExtB;
}
@font-face {
        font-family: @PMingLiU-ExtB;
}
@font-face {
        font-family: MingLiU_HKSCS-ExtB;
}
@font-face {
        font-family: @MingLiU_HKSCS-ExtB;
}
@font-face {
        font-family: Mongolian Baiti;
}
@font-face {
        font-family: @MS Gothic;
}
@font-face {
        font-family: MS PGothic;
}
@font-face {
        font-family: @MS PGothic;
}
@font-face {
        font-family: MS UI Gothic;
}
@font-face {
        font-family: @MS UI Gothic;
}
@font-face {
        font-family: @MS Mincho;
}
@font-face {
        font-family: MS PMincho;
}
@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: @SimSun;
}
@font-face {
        font-family: NSimSun;
}
@font-face {
        font-family: @NSimSun;
}
@font-face {
        font-family: SimSun-ExtB;
}
@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: @FangSong;
}
@font-face {
        font-family: @SimHei;
}
@font-face {
        font-family: KaiTi;
}
@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: @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 Unicode MS;
}
@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;
}
@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-compose
}
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 {
        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><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010>Uri,</SPAN></FONT></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010>  Breaking this patch into 2 separate patches 
would make it easier to digest.</SPAN></FONT></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010></SPAN></FONT> </DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010>patch#1 deals with work items replacing 
DPC</SPAN></FONT></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010>patch #2 deals with whitespace 
adjustments.</SPAN></FONT></DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010></SPAN></FONT> </DIV>
<DIV dir=ltr align=left><FONT color=#0000ff size=2 face=Arial><SPAN 
class=151410700-26082010>stan.</SPAN></FONT></DIV><BR>
<DIV dir=ltr lang=en-us class=OutlookMessageHeader align=left>
<HR tabIndex=-1>
<FONT size=2 face=Tahoma><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<BR></FONT><BR></DIV>
<DIV></DIV>
<DIV dir=ltr align=left><SPAN class=851315115-25082010><FONT color=#0000ff 
size=2 face=Arial>Resend as original email bounced.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=851315115-25082010></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=851315115-25082010><FONT color=#0000ff 
size=2 face=Arial>stan.</FONT> </SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=851315115-25082010></SPAN> </DIV>
<DIV dir=ltr align=left>
<HR tabIndex=-1>
</DIV>
<DIV dir=ltr align=left><FONT size=2 face=Tahoma><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<BR></FONT><BR></DIV>
<DIV></DIV>
<DIV class=WordSection1>
<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><SPAN 
style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt">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></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt">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></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN 
style="FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt">Uri</SPAN><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></BODY></HTML>