<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML xmlns="http://www.w3.org/TR/REC-html40" xmlns:v =
"urn:schemas-microsoft-com:vml" xmlns:o =
"urn:schemas-microsoft-com:office:office" xmlns:w =
"urn:schemas-microsoft-com:office:word" xmlns:x =
"urn:schemas-microsoft-com:office:excel" xmlns:p =
"urn:schemas-microsoft-com:office:powerpoint" xmlns:a =
"urn:schemas-microsoft-com:office:access" xmlns:dt =
"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s =
"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs =
"urn:schemas-microsoft-com:rowset" xmlns:z = "#RowsetSchema" xmlns:b =
"urn:schemas-microsoft-com:office:publisher" xmlns:ss =
"urn:schemas-microsoft-com:office:spreadsheet" xmlns:c =
"urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc =
"urn:schemas-microsoft-com:office:odc" xmlns:oa =
"urn:schemas-microsoft-com:office:activation" xmlns:html =
"http://www.w3.org/TR/REC-html40" xmlns:q =
"http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc =
"http://microsoft.com/officenet/conferencing" XMLNS:D = "DAV:" XMLNS:Repl =
"http://schemas.microsoft.com/repl/" xmlns:mt =
"http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2 =
"http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda =
"http://www.passport.com/NameSpace.xsd" xmlns:ois =
"http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir =
"http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds =
"http://www.w3.org/2000/09/xmldsig#" xmlns:dsp =
"http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc =
"http://schemas.microsoft.com/data/udc" xmlns:xsd =
"http://www.w3.org/2001/XMLSchema" xmlns:sub =
"http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec =
"http://www.w3.org/2001/04/xmlenc#" xmlns:sp =
"http://schemas.microsoft.com/sharepoint/" xmlns:sps =
"http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi =
"http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs =
"http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf =
"http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p =
"http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf =
"http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss =
"http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi =
"http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi =
"http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver =
"http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m =
"http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels =
"http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp =
"http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t =
"http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m =
"http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl =
"http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl =
"http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService"
XMLNS:Z = "urn:schemas-microsoft-com:" xmlns:st = ""><HEAD>
<META content="text/html; charset=us-ascii" http-equiv=Content-Type>
<META name=GENERATOR content="MSHTML 8.00.6001.18928"><!--[if !mso]>
<STYLE>v\:* {
BEHAVIOR: url(#default#VML)
}
o\:* {
BEHAVIOR: url(#default#VML)
}
w\:* {
BEHAVIOR: url(#default#VML)
}
.shape {
BEHAVIOR: url(#default#VML)
}
</STYLE>
<![endif]-->
<STYLE>@font-face {
font-family: Helvetica;
}
@font-face {
font-family: Courier;
}
@font-face {
font-family: Tms Rmn;
}
@font-face {
font-family: Helv;
}
@font-face {
font-family: New York;
}
@font-face {
font-family: System;
}
@font-face {
font-family: Wingdings;
}
@font-face {
font-family: MS Mincho;
}
@font-face {
font-family: Batang;
}
@font-face {
font-family: SimSun;
}
@font-face {
font-family: PMingLiU;
}
@font-face {
font-family: MS Gothic;
}
@font-face {
font-family: Dotum;
}
@font-face {
font-family: SimHei;
}
@font-face {
font-family: MingLiU;
}
@font-face {
font-family: Mincho;
}
@font-face {
font-family: Gulim;
}
@font-face {
font-family: Century;
}
@font-face {
font-family: Angsana New;
}
@font-face {
font-family: Cordia New;
}
@font-face {
font-family: Mangal;
}
@font-face {
font-family: Latha;
}
@font-face {
font-family: Sylfaen;
}
@font-face {
font-family: Vrinda;
}
@font-face {
font-family: Raavi;
}
@font-face {
font-family: Shruti;
}
@font-face {
font-family: Sendnya;
}
@font-face {
font-family: Gautami;
}
@font-face {
font-family: Tunga;
}
@font-face {
font-family: Estrangelo Edessa;
}
@font-face {
font-family: Cambria Math;
}
@font-face {
font-family: Arial Unicode MS;
}
@font-face {
font-family: Cambria;
}
@font-face {
font-family: Calibri;
}
@font-face {
font-family: Tahoma;
}
@font-face {
font-family: Consolas;
}
@font-face {
font-family: Times New Roman CE;
}
@font-face {
font-family: Times New Roman CYR;
}
@font-face {
font-family: Times New Roman Greek;
}
@font-face {
font-family: Times New Roman TUR;
}
@font-face {
font-family: Times New Roman (Hebrew);
}
@font-face {
font-family: Times New Roman Baltic;
}
@font-face {
font-family: Arial CE;
}
@font-face {
font-family: Arial CYR;
}
@font-face {
font-family: Arial Greek;
}
@font-face {
font-family: Arial TUR;
}
@font-face {
font-family: Arial (Hebrew);
}
@font-face {
font-family: Arial Baltic;
}
@font-face {
font-family: Bookman Old Style;
}
@font-face {
font-family: Comic Sans MS;
}
@font-face {
font-family: Monotype Corsiva;
}
@font-face {
font-family: Huxtable;
}
@font-face {
font-family: Mufferaw;
}
@font-face {
font-family: Planet Benson 2;
}
@font-face {
font-family: Marlett;
}
@font-face {
font-family: BatangChe;
}
@font-face {
font-family: Gungsuh;
}
@font-face {
font-family: GungsuhChe;
}
@font-face {
font-family: DaunPenh;
}
@font-face {
font-family: DokChampa;
}
@font-face {
font-family: Euphemia;
}
@font-face {
font-family: Vani;
}
@font-face {
font-family: GulimChe;
}
@font-face {
font-family: DotumChe;
}
@font-face {
font-family: Impact;
}
@font-face {
font-family: Iskoola Pota;
}
@font-face {
font-family: Kalinga;
}
@font-face {
font-family: Kartika;
}
@font-face {
font-family: Khmer UI;
}
@font-face {
font-family: Lao UI;
}
@font-face {
font-family: Lucida Console;
}
@font-face {
font-family: Malgun Gothic;
}
@font-face {
font-family: Meiryo;
}
@font-face {
font-family: Meiryo UI;
}
@font-face {
font-family: Microsoft Himalaya;
}
@font-face {
font-family: Microsoft JhengHei;
}
@font-face {
font-family: Microsoft YaHei;
}
@font-face {
font-family: MingLiU_HKSCS;
}
@font-face {
font-family: MingLiU-ExtB;
}
@font-face {
font-family: PMingLiU-ExtB;
}
@font-face {
font-family: MingLiU_HKSCS-ExtB;
}
@font-face {
font-family: Mongolian Baiti;
}
@font-face {
font-family: MS PGothic;
}
@font-face {
font-family: MS UI Gothic;
}
@font-face {
font-family: MS PMincho;
}
@font-face {
font-family: MV Boli;
}
@font-face {
font-family: Microsoft New Tai Lue;
}
@font-face {
font-family: Nyala;
}
@font-face {
font-family: Microsoft PhagsPa;
}
@font-face {
font-family: Plantagenet Cherokee;
}
@font-face {
font-family: Segoe Script;
}
@font-face {
font-family: Segoe UI;
}
@font-face {
font-family: Segoe UI Semibold;
}
@font-face {
font-family: Segoe UI Light;
}
@font-face {
font-family: Segoe UI Symbol;
}
@font-face {
font-family: NSimSun;
}
@font-face {
font-family: SimSun-ExtB;
}
@font-face {
font-family: Microsoft Tai Le;
}
@font-face {
font-family: Shonar Bangla;
}
@font-face {
font-family: Microsoft Yi Baiti;
}
@font-face {
font-family: Microsoft Sans Serif;
}
@font-face {
font-family: Aparajita;
}
@font-face {
font-family: Ebrima;
}
@font-face {
font-family: Gisha;
}
@font-face {
font-family: Kokila;
}
@font-face {
font-family: Leelawadee;
}
@font-face {
font-family: Microsoft Uighur;
}
@font-face {
font-family: MoolBoran;
}
@font-face {
font-family: Utsaah;
}
@font-face {
font-family: Vijaya;
}
@font-face {
font-family: Andalus;
}
@font-face {
font-family: Arabic Typesetting;
}
@font-face {
font-family: Simplified Arabic;
}
@font-face {
font-family: Simplified Arabic Fixed;
}
@font-face {
font-family: Sakkal Majalla;
}
@font-face {
font-family: Traditional Arabic;
}
@font-face {
font-family: Aharoni;
}
@font-face {
font-family: David;
}
@font-face {
font-family: FrankRuehl;
}
@font-face {
font-family: Levenim MT;
}
@font-face {
font-family: Miriam;
}
@font-face {
font-family: Miriam Fixed;
}
@font-face {
font-family: Narkisim;
}
@font-face {
font-family: Rod;
}
@font-face {
font-family: FangSong;
}
@font-face {
font-family: KaiTi;
}
@font-face {
font-family: AngsanaUPC;
}
@font-face {
font-family: Browallia New;
}
@font-face {
font-family: BrowalliaUPC;
}
@font-face {
font-family: CordiaUPC;
}
@font-face {
font-family: DilleniaUPC;
}
@font-face {
font-family: EucrosiaUPC;
}
@font-face {
font-family: FreesiaUPC;
}
@font-face {
font-family: IrisUPC;
}
@font-face {
font-family: JasmineUPC;
}
@font-face {
font-family: KodchiangUPC;
}
@font-face {
font-family: LilyUPC;
}
@font-face {
font-family: DFKai-SB;
}
@font-face {
font-family: Lucida Sans Unicode;
}
@font-face {
font-family: Arial Black;
}
@font-face {
font-family: Candara;
}
@font-face {
font-family: Constantia;
}
@font-face {
font-family: Corbel;
}
@font-face {
font-family: Franklin Gothic Medium;
}
@font-face {
font-family: Gabriola;
}
@font-face {
font-family: Georgia;
}
@font-face {
font-family: Palatino Linotype;
}
@font-face {
font-family: Segoe Print;
}
@font-face {
font-family: Trebuchet MS;
}
@font-face {
font-family: Verdana;
}
@font-face {
font-family: Webdings;
}
@font-face {
font-family: MT Extra;
}
@font-face {
font-family: Bookshelf Symbol 7;
}
@font-face {
font-family: MS Reference Sans Serif;
}
@font-face {
font-family: MS Reference Specialty;
}
@font-face {
font-family: MS Outlook;
}
@font-face {
font-family: Book Antiqua;
}
@font-face {
font-family: Garamond;
}
@font-face {
font-family: Century Gothic;
}
@font-face {
font-family: Wingdings 2;
}
@font-face {
font-family: Wingdings 3;
}
@font-face {
font-family: Arial Narrow;
}
@font-face {
font-family: Amienne;
}
@font-face {
font-family: Arnprior;
}
@font-face {
font-family: Baveuse;
}
@font-face {
font-family: Berylium;
}
@font-face {
font-family: Blue Highway;
}
@font-face {
font-family: Blue Highway Condensed;
}
@font-face {
font-family: Blue Highway D Type;
}
@font-face {
font-family: Blue Highway Linocut;
}
@font-face {
font-family: Burnstown Dam;
}
@font-face {
font-family: Carbon Block;
}
@font-face {
font-family: Credit Valley;
}
@font-face {
font-family: Earwig Factory;
}
@font-face {
font-family: Hurry Up;
}
@font-face {
font-family: Heavy Heap;
}
@font-face {
font-family: Kredit;
}
@font-face {
font-family: Minya Nouvelle;
}
@font-face {
font-family: Neuropol;
}
@font-face {
font-family: Pupcat;
}
@font-face {
font-family: Stereofidelic;
}
@font-face {
font-family: Sybil Green;
}
@font-face {
font-family: Teen;
}
@font-face {
font-family: Teen Light;
}
@font-face {
font-family: Velvenda Cooler;
}
@font-face {
font-family: Biondi;
}
@font-face {
font-family: Boopee;
}
@font-face {
font-family: Byington;
}
@font-face {
font-family: Catriel;
}
@font-face {
font-family: Euphorigenic S;
}
@font-face {
font-family: Ligurino;
}
@font-face {
font-family: Ligurino Condensed;
}
@font-face {
font-family: Tandelle;
}
@font-face {
font-family: Waker;
}
@font-face {
font-family: Times;
}
@font-face {
font-family: Guttman Stam;
}
@font-face {
font-family: ms sans serif;
}
@font-face {
font-family: SimSun;
}
@font-face {
font-family: SimSun;
}
@font-face {
font-family: @SimSun;
}
@font-face {
font-family: @MS Mincho;
}
@font-face {
font-family: Lucida Sans;
}
@font-face {
font-family: MS Mincho;
}
@font-face {
font-family: メイリオ;
}
@font-face {
font-family: @メイリオ;
}
@font-face {
font-family: MS Mincho;
}
@font-face {
font-family: MS Shell Dlg 2;
}
@font-face {
font-family: @Meiryo;
}
@font-face {
font-family: @MS Gothic;
}
@font-face {
font-family: Script MT Bold;
}
@font-face {
font-family: Lucida Calligraphy;
}
@font-face {
font-family: Times New
Roman;
}
@font-face {
font-family: Times New
Roman;
}
@font-face {
font-family: Times New Roman;
}
@font-face {
font-family: @Batang;
}
@font-face {
font-family: @BatangChe;
}
@font-face {
font-family: @Gungsuh;
}
@font-face {
font-family: @GungsuhChe;
}
@font-face {
font-family: @Gulim;
}
@font-face {
font-family: @GulimChe;
}
@font-face {
font-family: @Dotum;
}
@font-face {
font-family: @DotumChe;
}
@font-face {
font-family: @Malgun Gothic;
}
@font-face {
font-family: @Meiryo UI;
}
@font-face {
font-family: @Microsoft JhengHei;
}
@font-face {
font-family: @Microsoft YaHei;
}
@font-face {
font-family: @MingLiU;
}
@font-face {
font-family: @PMingLiU;
}
@font-face {
font-family: @MingLiU_HKSCS;
}
@font-face {
font-family: @MingLiU-ExtB;
}
@font-face {
font-family: @PMingLiU-ExtB;
}
@font-face {
font-family: @MingLiU_HKSCS-ExtB;
}
@font-face {
font-family: @MS PGothic;
}
@font-face {
font-family: @MS UI Gothic;
}
@font-face {
font-family: @MS PMincho;
}
@font-face {
font-family: @NSimSun;
}
@font-face {
font-family: @SimSun-ExtB;
}
@font-face {
font-family: @FangSong;
}
@font-face {
font-family: @SimHei;
}
@font-face {
font-family: @KaiTi;
}
@font-face {
font-family: @DFKai-SB;
}
@font-face {
font-family: @Arial Unicode MS;
}
@font-face {
font-family: Guttman Yad-Brush;
}
@font-face {
font-family: 新
}
@page WordSection1 {size: 8.5in 11.0in; margin: 1.0in 1.25in 1.0in 1.25in; }
P.MsoNormal {
MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
LI.MsoNormal {
MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
DIV.MsoNormal {
MARGIN: 0in 0in 0pt; FONT-FAMILY: "Calibri","sans-serif"; FONT-SIZE: 11pt
}
A:link {
COLOR: blue; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.MsoHyperlink {
COLOR: blue; TEXT-DECORATION: underline; mso-style-priority: 99
}
A:visited {
COLOR: purple; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.MsoHyperlinkFollowed {
COLOR: purple; TEXT-DECORATION: underline; mso-style-priority: 99
}
SPAN.EmailStyle17 {
FONT-FAMILY: "Calibri","sans-serif"; COLOR: windowtext; mso-style-type: personal
}
SPAN.EmailStyle18 {
FONT-FAMILY: "Calibri","sans-serif"; COLOR: #1f497d; mso-style-type: personal
}
SPAN.EmailStyle19 {
FONT-FAMILY: "Calibri","sans-serif"; COLOR: #1f497d; mso-style-type: personal
}
SPAN.EmailStyle20 {
FONT-FAMILY: "Calibri","sans-serif"; COLOR: #1f497d; mso-style-type: personal-reply
}
SPAN.msoIns {
COLOR: teal; TEXT-DECORATION: underline; mso-style-type: export-only; mso-style-name: ""
}
SPAN.msoDel {
COLOR: red; TEXT-DECORATION: line-through; mso-style-type: export-only; mso-style-name: ""
}
.MsoChpDefault {
FONT-SIZE: 10pt; mso-style-type: export-only
}
DIV.WordSection1 {
page: WordSection1
}
</STYLE>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></HEAD>
<BODY lang=EN-US link=blue vLink=purple>
<DIV dir=ltr align=left>
<HR tabIndex=-1>
<FONT size=2 face=Tahoma><B>From:</B> Uri Habusha [mailto:urih@mellanox.co.il]
<BR><B>Sent:</B> Monday, August 30, 2010 5:33 AM<BR><B>To:</B> Smith, Stan;
Tzachi Dar<BR><B>Cc:</B> ofw@lists.openfabrics.org<BR><B>Subject:</B> RE: [ofw]
FW: fixing a system clock assert that is raised when the receive function stays
in DPC too much time<BR></FONT><BR></DIV>
<DIV></DIV>
<DIV class=WordSection1>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Thanks for your
inputs.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">I checked in the patch with
minor changes. Svn # 2878<SPAN class=245412216-30082010><FONT color=#0000ff
size=2 face=Arial> </FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Hello
Uri,</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>When committing
patches, it's best to stay with the existing coding style (regardless if you
like the style or not).</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Consistent
look-and-feel of the code is the desired end goal.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>That said, the
ipoib_ndis6_cm code base, '{' curly braces are on a separate
lines.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Personally I'm
not a huge fan of this style, nonetheless the bulk of the IPoIB_NDIS6_CM code is
written in this style; please observe and adhere to existing
conventions.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2 face=Arial>Along the lines
of consistency</FONT></SPAN></SPAN></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial>__iopoib_WorkItem what does 'iopoib' stand for? Did
you intend to prefix the WorkItem name with __ipoib_ ?</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial>stan.</FONT></SPAN></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><SPAN
class=245412216-30082010><FONT color=#0000ff size=2
face=Arial></FONT></SPAN></SPAN> </P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<DIV>
<DIV
style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<P class=MsoNormal><B><SPAN
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">From:</SPAN></B><SPAN
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">
ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org]
<B>On Behalf Of </B>Smith, Stan<BR><B>Sent:</B> Friday, August 27, 2010 3:51
AM<BR><B>To:</B> Tzachi Dar; Uri Habusha<BR><B>Cc:</B>
ofw@lists.openfabrics.org<BR><B>Subject:</B> Re: [ofw] FW: fixing a system clock
assert that is raised when the receive function stays in DPC too much
time<o:p></o:p></SPAN></P></DIV></DIV>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">ulp\ipoib
patches applied OK via patch.</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">ulp\ipoib_ndis6_cm
patches did not apply, major problems.</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">After
spending a few hours separating out white-space replacement for <tabs>
(should have been a separate patch) I believe the code may work; testing in the
AM.</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">Fixed a
reference counting problem in recv_cb_internal() where WorkItem is fired
off.</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">Please
review enclosed patches without <tab> --> spaces changes.</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Arial','sans-serif'; COLOR: blue; FONT-SIZE: 10pt">stan.</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p> </o:p></SPAN></P>
<DIV style="TEXT-ALIGN: center" class=MsoNormal align=center><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt">
<HR align=center SIZE=2 width="100%">
</SPAN></DIV>
<P style="MARGIN-BOTTOM: 12pt" class=MsoNormal><B><SPAN
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">From:</SPAN></B><SPAN
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt"> Tzachi Dar
[mailto:tzachid@mellanox.co.il] <BR><B>Sent:</B> Wednesday, August 25, 2010 1:47
PM<BR><B>To:</B> Fab Tillier; Smith, Stan; Uri Habusha<BR><B>Cc:</B>
ofw@lists.openfabrics.org<BR><B>Subject:</B> RE: [ofw] FW: fixing a system clock
assert that is raised when the receive function stays in DPC too much
time</SPAN><SPAN
style="FONT-FAMILY: 'Times New Roman','serif'; FONT-SIZE: 12pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">This was what the code was doing
before the last change. Still this assert has poped up.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Please note that scheduling a
dpc lets other dpc run, but it does not let any other thread
run.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">If a thread was running and than
a dpc was schdualed that that thread stops running until the DPC will end.
Please note that this DPC might never end, since new packets will keep arriving.
This gives the user bad experience.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">With the new code the irql goes
up and down and thus the thread can move to another
processor.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Thanks<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Tzachi<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<DIV
style="BORDER-BOTTOM: medium none; BORDER-LEFT: blue 1.5pt solid; PADDING-BOTTOM: 0in; PADDING-LEFT: 4pt; PADDING-RIGHT: 0in; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0in">
<DIV>
<DIV
style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<P class=MsoNormal><B><SPAN
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">From:</SPAN></B><SPAN
style="FONT-FAMILY: 'Tahoma','sans-serif'; FONT-SIZE: 10pt">
ofw-bounces@lists.openfabrics.org [mailto:ofw-bounces@lists.openfabrics.org]
<B>On Behalf Of </B>Fab Tillier<BR><B>Sent:</B> Wednesday, August 25, 2010 7:29
PM<BR><B>To:</B> Smith, Stan; Uri Habusha<BR><B>Cc:</B>
ofw@lists.openfabrics.org<BR><B>Subject:</B> Re: [ofw] FW: fixing a system clock
assert that is raised when the receive function stays in DPC too much
time<o:p></o:p></SPAN></P></DIV></DIV>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">Don’t use a work item.
Just create a DPC object, and queue it yourself after processing a certain
number of completions. Look at the SMI code – it does exactly
this.<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d">-Fab<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN style="COLOR: #1f497d"><o:p> </o:p></SPAN></P>
<DIV>
<DIV
style="BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<P class=MsoNormal><B>From:</B> ofw-bounces@lists.openfabrics.org
[mailto:ofw-bounces@lists.openfabrics.org] <B>On Behalf Of </B>Smith,
Stan<BR><B>Sent:</B> Wednesday, August 25, 2010 8:54 AM<BR><B>To:</B>
urih@mellanox.co.il<BR><B>Cc:</B> ofw@lists.openfabrics.org<BR><B>Subject:</B>
[ofw] FW: fixing a system clock assert that is raised when the receive function
stays in DPC too much time<o:p></o:p></P></DIV></DIV>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Resend as original email bounced.<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>stan. <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<DIV style="TEXT-ALIGN: center" class=MsoNormal align=center>
<HR align=center SIZE=2 width="100%">
</DIV>
<P style="MARGIN-BOTTOM: 12pt" class=MsoNormal><B>From:</B> Uri Habusha
[mailto:urih@mellanox.co.il] <BR><B>Sent:</B> Wednesday, August 25, 2010 8:12
AM<BR><B>To:</B> ofw@lists.openfabrics.org<BR><B>Subject:</B> fixing a system
clock assert that is raised when the receive function stays in DPC too much
time<o:p></o:p></P>
<P class=MsoNormal>The purpose of this check in is to fix a system clock assert
that is raised when the function stays in DPC too much time.<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>When processing of receive packet in DPC take too much time
the OS throw an assert warning that too much time is spent in DPC and it may
affect the system.<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>The fix move the receive processing to a workitem. so the
IPOIB give-up after some time and return to process receive packet in workitem.
that allows other DPCs and workitems too run in parallel. <o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Uri<o:p></o:p></P>
<P class=MsoNormal><o:p> </o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.c<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib/kernel/ipoib_adapter.c (revision
6314)<o:p></o:p></P>
<P class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.c
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -224,6 +224,9 @@<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ NdisMGetDeviceProperty(h_adapter,
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(p_adapter->pdo !=
NULL);<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></P>
<P
class=MsoNormal>
if ( p_adapter->p_stat ) <o:p></o:p></P>
<P
class=MsoNormal>
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.h<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib/kernel/ipoib_adapter.h (revision
6314)<o:p></o:p></P>
<P class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.h (working
copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -150,6 +150,7 @@<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>
cl_obj_t
obj;<o:p></o:p></P>
<P
class=MsoNormal>
NDIS_HANDLE
h_adapter;<o:p></o:p></P>
<P class=MsoNormal>+
PDEVICE_OBJECT
pdo;<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_ifc_data_t
guids;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
cl_list_item_t
entry;<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.c<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib/kernel/ipoib_port.c
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++
ulp/ipoib/kernel/ipoib_port.c
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -605,6 +605,8 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
__endpt_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->pPoWorkItem = NULL;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE
);<o:p></o:p></P>
<P
class=MsoNormal>
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE
);<o:p></o:p></P>
<P
class=MsoNormal>
<o:p></o:p></P>
<P class=MsoNormal>@@ -626,6 +628,12 @@<o:p></o:p></P>
<P
class=MsoNormal>
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></P>
<P
class=MsoNormal>
p_port->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ p_port->pPoWorkItem =
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_port->pPoWorkItem == NULL ) {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("IoAllocateWorkItem
returned NULL\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>
{<o:p></o:p></P>
<P class=MsoNormal>@@ -682,9 +690,6 @@<o:p></o:p></P>
<P
class=MsoNormal>
return status;<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P
class=MsoNormal>
/* Initialize multicast garbage collector timer and DPC object
*/<o:p></o:p></P>
<P
class=MsoNormal>
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></P>
<P
class=MsoNormal>
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></P>
<P class=MsoNormal>@@ -795,6 +800,7 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
cl_obj_deinit( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ IoFreeWorkItem( p_port->pPoWorkItem
);<o:p></o:p></P>
<P
class=MsoNormal>
cl_free( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>@@ -1628,10 +1634,43 @@<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P
class=MsoNormal>+
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P
class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+
IN
uint32_t*
p_recv_cnt );<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal>-__recv_cb(<o:p></o:p></P>
<P class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></P>
<P
class=MsoNormal>+
IN
DEVICE_OBJECT*
p_dev_obj,<o:p></o:p></P>
<P
class=MsoNormal>+
IN
void*
context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_t *p_port = ( ipoib_port_t* ) context;<o:p></o:p></P>
<P class=MsoNormal>+ int WorkToDo = true;<o:p></o:p></P>
<P class=MsoNormal>+ KIRQL irql;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t recv_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t total_recv_cnt =
0;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P
class=MsoNormal>+
UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ while (WorkToDo && total_recv_cnt
< 512) {<o:p></o:p></P>
<P class=MsoNormal>+ irql =
KeRaiseIrqlToDpcLevel();<o:p></o:p></P>
<P class=MsoNormal>+ WorkToDo =
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></P>
<P class=MsoNormal>+
KeLowerIrql(irql);<o:p></o:p></P>
<P class=MsoNormal>+ total_recv_cnt +=
recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+ if (WorkToDo) {<o:p></o:p></P>
<P class=MsoNormal>+ IoQueueWorkItem(
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></P>
<P class=MsoNormal>+
} <o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P
class=MsoNormal>
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*cq_context )<o:p></o:p></P>
<P
class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+
IN
uint32_t*
p_recv_cnt)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>@@ -1639,6 +1678,8 @@<o:p></o:p></P>
<P
class=MsoNormal>
int32_t
pkt_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></P>
<P
class=MsoNormal>
cl_qlist_t
done_list, bad_list;<o:p></o:p></P>
<P
class=MsoNormal>
size_t
i;<o:p></o:p></P>
<P class=MsoNormal>+ BOOLEAN WorkToDo =
FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>
PERF_DECLARE( RecvCompBundle );<o:p></o:p></P>
<P
class=MsoNormal>
PERF_DECLARE( RecvCb );<o:p></o:p></P>
<P
class=MsoNormal>
PERF_DECLARE( PollRecv );<o:p></o:p></P>
<P class=MsoNormal>@@ -1655,8 +1696,6 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
cl_perf_start( RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P
class=MsoNormal>
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
cl_qlist_init( &done_list );<o:p></o:p></P>
<P class=MsoNormal>@@ -1785,13 +1824,30 @@<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></P>
<P
class=MsoNormal>
} else {<o:p></o:p></P>
<P
class=MsoNormal>
// Please note the reference is still up<o:p></o:p></P>
<P
class=MsoNormal>-
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></P>
<P class=MsoNormal>+ if (h_cq)
{<o:p></o:p></P>
<P
class=MsoNormal>+
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></P>
<P
class=MsoNormal>+
WorkToDo = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ } else
{<o:p></o:p></P>
<P
class=MsoNormal>+
WorkToDo = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ return WorkToDo;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+static void<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb(<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ __recv_cb_internal(h_cq, cq_context,
&recv_cnt);<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.h<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib/kernel/ipoib_port.h
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++
ulp/ipoib/kernel/ipoib_port.h
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -502,8 +502,6 @@<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_recv_mgr_t
recv_mgr;<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_send_mgr_t
send_mgr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KDPC
recv_dpc;<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_endpt_mgr_t
endpt_mgr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
ipoib_endpt_t
*p_local_endpt;<o:p></o:p></P>
<P class=MsoNormal>@@ -520,6 +518,7 @@<o:p></o:p></P>
<P
class=MsoNormal>
KTIMER
gc_timer;<o:p></o:p></P>
<P
class=MsoNormal>
uint32_t
bc_join_retry_cnt;<o:p></o:p></P>
<P
class=MsoNormal>
ib_net16_t
base_lid;<o:p></o:p></P>
<P
class=MsoNormal>+
PIO_WORKITEM
pPoWorkItem;<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_hdr_t
hdr[1]; /* Must be last! */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> }
ipoib_port_t;<o:p></o:p></P>
<P class=MsoNormal>Index:
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -216,6 +216,9 @@<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ NdisMGetDeviceProperty(h_adapter,
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(p_adapter->pdo !=
NULL);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></P>
<P
class=MsoNormal>
if ( p_adapter->p_stat ) <o:p></o:p></P>
<P
class=MsoNormal>
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal>Index:
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -185,6 +185,7 @@<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>
cl_obj_t
obj;<o:p></o:p></P>
<P
class=MsoNormal>
NDIS_HANDLE
h_adapter;<o:p></o:p></P>
<P class=MsoNormal>+
PDEVICE_OBJECT
pdo;<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_ifc_data_t
guids;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
cl_list_item_t
entry;<o:p></o:p></P>
<P class=MsoNormal>Index:
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -3126,7 +3126,7 @@<o:p></o:p></P>
<P
class=MsoNormal>
if( p_adapter->state != IB_PNP_PORT_ACTIVE || !p_adapter->p_port
)<o:p></o:p></P>
<P
class=MsoNormal>
{<o:p></o:p></P>
<P
class=MsoNormal>
cl_obj_unlock( &p_adapter->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>
("Got send during port non-active, complete with error \n") );<o:p></o:p></P>
<P
class=MsoNormal>
status = NDIS_STATUS_FAILURE; <o:p></o:p></P>
<P
class=MsoNormal>
goto compl_status;<o:p></o:p></P>
<P class=MsoNormal>@@ -3172,7 +3172,7 @@<o:p></o:p></P>
<P class=MsoNormal> if (status !=
NDIS_STATUS_SUCCESS)<o:p></o:p></P>
<P
class=MsoNormal>
{<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>
("Got bad status, g_NBL=%d, g_NBL_completed=%d \n", g_NBL, g_NBL_complete)
);<o:p></o:p></P>
<P
class=MsoNormal>
send_complete_flags = 0;<o:p></o:p></P>
<P
class=MsoNormal>
<o:p></o:p></P>
<P class=MsoNormal>Index:
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
(revision 6314)<o:p></o:p></P>
<P class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp
(working copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -58,50 +58,48 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-ib_gid_t
bcast_mgid_template = {<o:p></o:p></P>
<P
class=MsoNormal>-
0xff,
/* multicast field */<o:p></o:p></P>
<P
class=MsoNormal>-
0x12,
/* scope (to be filled in) */<o:p></o:p></P>
<P
class=MsoNormal>-
0x40,
0x1b,
/* IPv4 signature */<o:p></o:p></P>
<P
class=MsoNormal>-
0xff,
0xff,
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></P>
<P
class=MsoNormal>-
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, /* 48 bits of
zeros */<o:p></o:p></P>
<P
class=MsoNormal>-
0xff, 0xff, 0xff,
0xff,
/* 32 bit IPv4 broadcast address */<o:p></o:p></P>
<P class=MsoNormal>+ib_gid_t bcast_mgid_template =
{<o:p></o:p></P>
<P class=MsoNormal>+
0xff,
/* multicast field */<o:p></o:p></P>
<P class=MsoNormal>+
0x12,
/* scope (to be filled in) */<o:p></o:p></P>
<P class=MsoNormal>+ 0x40,
0x1b,
/* IPv4 signature
*/<o:p></o:p></P>
<P class=MsoNormal>+ 0xff,
0xff,
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></P>
<P class=MsoNormal>+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 48
bits of zeros */<o:p></o:p></P>
<P class=MsoNormal>+ 0xff, 0xff, 0xff,
0xff, /*
32 bit IPv4 broadcast address */<o:p></o:p></P>
<P class=MsoNormal> };<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></P>
<P class=MsoNormal> /* Handy pointer for debug use. */<o:p></o:p></P>
<P class=MsoNormal>-ipoib_port_t
*gp_ipoib_port;<o:p></o:p></P>
<P class=MsoNormal>+ipoib_port_t
*gp_ipoib_port;<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2);<o:p></o:p></P>
<P class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t*
const p_port );<o:p></o:p></P>
<P class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const
p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void
*s_arg1, void *s_arg2);<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> #ifndef _IPOIB_DEBUG_NDIS6<o:p></o:p></P>
<P class=MsoNormal> #define _IPOIB_DEBUG_NDIS6<o:p></o:p></P>
<P class=MsoNormal> CL_INLINE void CL_API<o:p></o:p></P>
<P class=MsoNormal> cl_qlist_check_validity(<o:p></o:p></P>
<P
class=MsoNormal>-
IN cl_qlist_t*
const
p_list )<o:p></o:p></P>
<P class=MsoNormal>+ IN cl_qlist_t* const
p_list )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_list_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
size_t cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_list_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ size_t cnt = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* CL_ASSERT that a non-null pointer is provided. */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_list );<o:p></o:p></P>
<P
class=MsoNormal>-
/* CL_ASSERT that the list was initialized. */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_list->state == CL_INITIALIZED );<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_head(p_list);<o:p></o:p></P>
<P
class=MsoNormal>-
while(p_item != cl_qlist_end(p_list)) {<o:p></o:p></P>
<P
class=MsoNormal>-
++cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = p_item->p_next;<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT (cnt <= p_list->count);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT (cnt == p_list->count);<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P class=MsoNormal>+ /* CL_ASSERT that a non-null pointer is
provided. */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_list );<o:p></o:p></P>
<P class=MsoNormal>+ /* CL_ASSERT that the list was
initialized. */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_list->state ==
CL_INITIALIZED );<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qlist_head(p_list);<o:p></o:p></P>
<P class=MsoNormal>+ while(p_item != cl_qlist_end(p_list))
{<o:p></o:p></P>
<P class=MsoNormal>+
++cnt;<o:p></o:p></P>
<P class=MsoNormal>+
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
p_item->p_next;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT (cnt
<= p_list->count);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT (cnt ==
p_list->count);<o:p></o:p></P>
<P class=MsoNormal>+ return;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal>@@ -112,34 +110,34 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_adapter_t*
const
p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_pnp_port_rec_t* const
p_pnp_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_adapter_t* const p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_pnp_port_rec_t* const p_pnp_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_destroying(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_obj_t*
const
p_obj );<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_obj_t*
const
p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_cleanup(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_obj_t*
const
p_obj );<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_obj_t*
const
p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_free(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_obj_t*
const
p_obj );<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_obj_t*
const
p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_ca_attr_t**
pp_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ib_ca_attr_t**
pp_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __srq_async_event_cb(<o:p></o:p></P>
<P
class=MsoNormal>-IN
ib_async_event_rec_t
*p_event_rec );<o:p></o:p></P>
<P class=MsoNormal>+IN
ib_async_event_rec_t *p_event_rec
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -148,27 +146,27 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __qp_event(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __cq_event(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_activate(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -177,58 +175,58 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static cl_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_ctor(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void*
const
p_object,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void*
context,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_pool_item_t**
const
pp_pool_item );<o:p></o:p></P>
<P class=MsoNormal>+
IN
void*
const
p_object,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void*
context,<o:p></o:p></P>
<P class=MsoNormal>+
OUT cl_pool_item_t**
const pp_pool_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_dtor(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const cl_pool_item_t*
const
p_pool_item,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*context );<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ IN
const cl_pool_item_t* const
p_pool_item,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*context );<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_send_desc_t*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_send(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_send(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_desc_t* const
p_desc );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_desc_t* const p_desc );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NET_BUFFER_LIST*
const
p_net_buffer_list OPTIONAL );<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_port_t*
const p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+
IN
NET_BUFFER_LIST* const p_net_buffer_list OPTIONAL
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_qlist_t*
const
p_list );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_qlist_t* const
p_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //NDIS60<o:p></o:p></P>
<P class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const p_desc
);<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal>@@ -238,76 +236,76 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* Posts receive buffers to the receive queue.
*/<o:p></o:p></P>
<P class=MsoNormal> int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_repost(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*cq_context );<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_get_endpts(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_src,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_dst );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_src,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_dst );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_filter(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_qlist_t*
const
p_done_list,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_qlist_t*
const
p_bad_list );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
cl_qlist_t* const
p_done_list,<o:p></o:p></P>
<P class=MsoNormal>+
OUT cl_qlist_t*
const p_bad_list
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_gen(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst );<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_endpt_t*
const p_dst );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_dhcp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_arp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t**
const
p_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t** const p_src,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
NET_BUFFER_LIST**
const
pp_net_buffer_list );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+
OUT NET_BUFFER_LIST**
const pp_net_buffer_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static uint32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_qlist_t*
p_done_list,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
int32_t*
const
p_discarded );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
cl_qlist_t*
p_done_list,<o:p></o:p></P>
<P class=MsoNormal>+
OUT int32_t*
const
p_discarded );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -316,128 +314,128 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_gen(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG
*
s_buf,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
INT
lso_data_index,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
UINT
lso_header_size OPTIONAL);<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_NB_SG *
s_buf,<o:p></o:p></P>
<P class=MsoNormal>+
IN
INT
lso_data_index,<o:p></o:p></P>
<P class=MsoNormal>+
IN
UINT
lso_header_size OPTIONAL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf);<o:p></o:p></P>
<P class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
iph_options_size,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len );<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_port_t*
const p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
iph_options_size,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf);<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ip_hdr_t* const
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
const
s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT ipoib_send_NB_SG*
const s_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void <o:p></o:p></P>
<P class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG *s_buf,
<o:p></o:p></P>
<P
class=MsoNormal>-
IN NDIS_STATUS
status,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ULONG
compl_flags,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
boolean_t
bLock );<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></P>
<P class=MsoNormal>+ IN
NDIS_STATUS
status,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ULONG
compl_flags,<o:p></o:p></P>
<P class=MsoNormal>+ IN
boolean_t
bLock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_queue(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_send_desc(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
const
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
size_t
mdl_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG
*s_buf);<o:p></o:p></P>
<P class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
const
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
size_t
mdl_len,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_NB_SG
*s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*cq_context );<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS <o:p></o:p></P>
<P class=MsoNormal> GetLsoHeaderSize(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
PNET_BUFFER
pNetBuffer,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
LsoData
*pLsoData,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
UINT
*IndexOfData,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></P>
<P class=MsoNormal>+ IN
PNET_BUFFER pNetBuffer,<o:p></o:p></P>
<P class=MsoNormal>+ IN
LsoData
*pLsoData,<o:p></o:p></P>
<P class=MsoNormal>+ OUT
UINT
*IndexOfData,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_lso_desc(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ULONG
mss,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
int32_t
hdr_idx,<o:p></o:p></P>
<P
class=MsoNormal>-
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NET_BUFFER
*p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ULONG
mss,<o:p></o:p></P>
<P class=MsoNormal>+
IN
int32_t
hdr_idx,<o:p></o:p></P>
<P class=MsoNormal>+ IN
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P class=MsoNormal>+
IN
NET_BUFFER
*p_netbuf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO CM Restore<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_fragments(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_desc_t*
const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
uint32_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NDIS_BUFFER*
p_ndis_buf );<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_send_desc_t*
const
p_desc,<o:p></o:p></P>
<P class=MsoNormal>+ IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+ IN
uint32_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
NDIS_BUFFER*
p_ndis_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></P>
<P
class=MsoNormal>-IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint16_t
fragment_size, <o:p></o:p></P>
<P
class=MsoNormal>-IN
uint16_t
fragment_offset, <o:p></o:p></P>
<P
class=MsoNormal>-IN
BOOLEAN
more_fragments );<o:p></o:p></P>
<P class=MsoNormal>+IN ip_hdr_t*
const p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN
uint16_t
fragment_size, <o:p></o:p></P>
<P class=MsoNormal>+IN
uint16_t
fragment_offset, <o:p></o:p></P>
<P class=MsoNormal>+IN
BOOLEAN
more_fragments );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __copy_ip_options(<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint8_t*
p_buf,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint8_t*
p_options,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint32_t
options_len,<o:p></o:p></P>
<P
class=MsoNormal>-IN
BOOLEAN
copy_all );<o:p></o:p></P>
<P class=MsoNormal>+IN
uint8_t*
p_buf,<o:p></o:p></P>
<P class=MsoNormal>+IN
uint8_t*
p_options,<o:p></o:p></P>
<P class=MsoNormal>+IN
uint32_t
options_len,<o:p></o:p></P>
<P class=MsoNormal>+IN
BOOLEAN
copy_all );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -446,85 +444,85 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /****f* IPoIB/__endpt_mgr_remove_all<o:p></o:p></P>
<P class=MsoNormal> * NAME<o:p></o:p></P>
<P
class=MsoNormal>-*
__endpt_mgr_remove_all<o:p></o:p></P>
<P class=MsoNormal>+* __endpt_mgr_remove_all<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal> * DESCRIPTION<o:p></o:p></P>
<P
class=MsoNormal>-*
Removes all enpoints from the port, dereferencing them to
initiate<o:p></o:p></P>
<P
class=MsoNormal>-*
destruction.<o:p></o:p></P>
<P class=MsoNormal>+* Removes all enpoints from the port,
dereferencing them to initiate<o:p></o:p></P>
<P class=MsoNormal>+* destruction.<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal> * SYNOPSIS<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> /*<o:p></o:p></P>
<P class=MsoNormal> ********/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ib_gid_t*
const
p_gid,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
UNALIGNED net32_t* const p_qpn
);<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ib_gid_t*
const
p_gid,<o:p></o:p></P>
<P class=MsoNormal>+
OUT UNALIGNED net32_t*
const p_qpn );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ib_gid_t*
const
p_gid );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ib_gid_t*
const
p_gid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
net16_t
lid );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
net16_t
lid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_port_info_t*
const
p_port_info );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_port_info_t* const p_port_info
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>@@ -533,85 +531,85 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_get_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_join_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_member_rec_t*
const
p_member_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_member_rec_t* const p_member_rec
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_create_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_get_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_query_rec_t
*p_query_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_query_rec_t
*p_query_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __mcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*context );<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static int<o:p></o:p></P>
<P class=MsoNormal> __gid_cmp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const void*
const
p_key1,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const void*
const
p_key2 )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const void*
const
p_key1,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const void*
const
p_key2 )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
return cl_memcmp( p_key1, p_key2, sizeof(ib_gid_t) );<o:p></o:p></P>
<P class=MsoNormal>+ return cl_memcmp( p_key1, p_key2,
sizeof(ib_gid_t) );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline void ipoib_port_ref( ipoib_port_t * p_port, int
type )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_ref( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_ref( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->ref[type % ref_mask] );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("Port[%d] refcount raised to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc( &p_port->ref[type %
ref_mask] );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>+
("Port[%d] refcount raised to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if ((p_port->obj.ref_cnt % 20)==0)<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+ if ((p_port->obj.ref_cnt %
20)==0)<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+ ("ref type %d
ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline void ipoib_port_deref(ipoib_port_t * p_port, int
type)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_deref( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_deref( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->ref[type % ref_mask] );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("Port[%d] refcount decremented to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></P>
<P
class=MsoNormal>-
if ((p_port->obj.ref_cnt % 20) == 0)<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_dec( &p_port->ref[type %
ref_mask] );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>+
("Port[%d] refcount decremented to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></P>
<P class=MsoNormal>+ if ((p_port->obj.ref_cnt % 20) ==
0)<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+ ("deref type %d
ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(type);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* function returns pointer to payload that is going
after IP header.<o:p></o:p></P>
<P class=MsoNormal> * asssuming that payload and IP header are in the
same buffer<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal>-static void*
GetIpPayloadPtr(const ip_hdr_t*
const
p_ip_hdr)<o:p></o:p></P>
<P class=MsoNormal>+static void* GetIpPayloadPtr(const ip_hdr_t* const
p_ip_hdr)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></P>
<P class=MsoNormal>+ return (void*)((uint8_t*)p_ip_hdr +
IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> /******************************************************************************<o:p></o:p></P>
<P class=MsoNormal>@@ -621,316 +619,324 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_create_port(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_adapter_t*
const
p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_pnp_port_rec_t* const
p_pnp_rec,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_port_t**
const
pp_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_adapter_t* const p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_pnp_port_rec_t* const p_pnp_rec,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_port_t**
const pp_port )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( !p_adapter->p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( !p_adapter->p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t *) cl_zalloc( sizeof(ipoib_port_t) +<o:p></o:p></P>
<P
class=MsoNormal>-
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_port )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(ipoib_port_t)) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_port = (ipoib_port_t *) cl_zalloc(
sizeof(ipoib_port_t) +<o:p></o:p></P>
<P class=MsoNormal>+
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_port )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></P>
<P
class=MsoNormal>+
sizeof(ipoib_port_t)) );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></P>
<P
class=MsoNormal>-
gp_ipoib_port = p_port;<o:p></o:p></P>
<P class=MsoNormal>+ gp_ipoib_port = p_port;<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__port_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ __port_construct( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = __port_init( p_port, p_adapter, p_pnp_rec );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_port_init returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
__port_cleanup( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
__port_free( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ status = __port_init( p_port, p_adapter,
p_pnp_rec );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_port_init returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ __port_cleanup(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ __port_free(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_port = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ *pp_port = p_port;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( !p_port->p_adapter->p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port->p_adapter
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
!p_port->p_adapter->p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_RESET;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state =
IB_QPS_RESET;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_construct( &p_port->obj, IPOIB_OBJ_PORT );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_construct( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_construct( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
__ib_mgr_construct( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_construct( &p_port->obj,
IPOIB_OBJ_PORT );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_construct(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_construct(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ __ib_mgr_construct( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ __buf_mgr_construct( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__recv_mgr_construct( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
__send_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ __recv_mgr_construct( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ __send_mgr_construct( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_construct( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ __endpt_mgr_construct( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE
);<o:p></o:p></P>
<P
class=MsoNormal>-
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE
);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ p_port->pPoWorkItem =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+ KeInitializeEvent(
&p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></P>
<P class=MsoNormal>+ KeInitializeEvent(
&p_port->leave_mcast_event, NotificationEvent, TRUE );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_adapter_t*
const
p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_pnp_port_rec_t* const
p_pnp_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_adapter_t* const p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_pnp_port_rec_t* const p_pnp_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
cl_status_t
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter = p_adapter;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->port_num =
p_pnp_rec->p_port_attr->port_num;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_adapter =
p_adapter;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_port->pPoWorkItem =
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->pPoWorkItem == NULL
) {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("IoAllocateWorkItem returned NULL\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_spinlock_init( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_spinlock_init(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Initialize the IB resource manager. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __ib_mgr_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__ib_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_spinlock_init(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Initialize the buffer manager. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __buf_mgr_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__buf_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Initialize the IB resource manager.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status = __ib_mgr_init( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__ib_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Initialize the receive manager. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_mgr_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__recv_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
status =__send_mgr_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__send_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Initialize the buffer manager.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status = __buf_mgr_init( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__buf_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Initialize the endpoint manager. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Initialize the receive manager.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status = __recv_mgr_init( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__recv_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ status =__send_mgr_init( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__send_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></P>
<P class=MsoNormal>+ /* Initialize the endpoint manager.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status = __endpt_mgr_init( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_init returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ /* Initialize multicast garbage
collector timer and DPC object */<o:p></o:p></P>
<P class=MsoNormal>+
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></P>
<P class=MsoNormal>+
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Initialize multicast garbage collector timer and DPC object */<o:p></o:p></P>
<P
class=MsoNormal>-
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></P>
<P class=MsoNormal>+ /* We only ever destroy from the PnP
callback thread. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_obj_init(
&p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></P>
<P class=MsoNormal>+
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* We only ever destroy from the PnP callback thread. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></P>
<P
class=MsoNormal>-
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc(
&p_port->ref[ref_init] );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+ ("ref type %d
ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj,
&p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_obj_insert_rel returned %#x\n", cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_obj_insert_rel(
&p_port->rel, &p_adapter->obj, &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("cl_obj_insert_rel
returned %#x\n", cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc(
&p_port->ref[ref_init] );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+ ("ref type %d
ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
// The port is started as paused and NDIS calls latter to ipoib_restart.
We<o:p></o:p></P>
<P
class=MsoNormal>-
// shut the recv_shuter for now and alive it on ipoib_restart. We
did<o:p></o:p></P>
<P
class=MsoNormal>-
// it in this way since MpInitializeInternal also calls in reset and
than<o:p></o:p></P>
<P
class=MsoNormal>-
// we need to set the rec ref count to 1 //TODO !!!!!!!!!!1<o:p></o:p></P>
<P
class=MsoNormal>-
//<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_adapter->ipoib_state == IPOIB_INIT) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Shutter shut, state = %d\n", p_adapter->ipoib_state));<o:p></o:p></P>
<P
class=MsoNormal>-
shutter_shut ( &p_adapter->recv_shutter );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("*****Shutter wasn't shut, state = %d*****\n",
p_adapter->ipoib_state));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ // The port is started as paused and NDIS
calls latter to ipoib_restart. We<o:p></o:p></P>
<P class=MsoNormal>+ // shut the recv_shuter for now and alive
it on ipoib_restart. We did<o:p></o:p></P>
<P class=MsoNormal>+ // it in this way since
MpInitializeInternal also calls in reset and than<o:p></o:p></P>
<P class=MsoNormal>+ // we need to set the rec ref count to 1
//TODO !!!!!!!!!!1<o:p></o:p></P>
<P class=MsoNormal>+ //<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if ( p_adapter->ipoib_state ==
IPOIB_INIT) {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P class=MsoNormal>+ ("Shutter shut,
state = %d\n", p_adapter->ipoib_state));<o:p></o:p></P>
<P class=MsoNormal>+ shutter_shut (
&p_adapter->recv_shutter );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></P>
<P class=MsoNormal>+ ("*****Shutter
wasn't shut, state = %d*****\n", p_adapter->ipoib_state));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_destroying(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_obj_t*
const
p_obj )<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_obj_t*
const
p_obj )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal>+ p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_down( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_down( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_remove_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ __endpt_mgr_remove_all( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_buf_mgr_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
endpt_cm_buf_mgr_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></P>
<P class=MsoNormal>+ cl_event_signal(
&p_port->endpt_mgr.event );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_resume( p_port, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_resume( p_port, FALSE
);<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_cleanup(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_obj_t*
const
p_obj )<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_obj_t*
const
p_obj )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal>+ p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all sends and receives to get flushed. */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->send_mgr.depth || p_port->recv_mgr.depth )<o:p></o:p></P>
<P
class=MsoNormal>-
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all sends and receives to get
flushed. */<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->send_mgr.depth ||
p_port->recv_mgr.depth )<o:p></o:p></P>
<P class=MsoNormal>+
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Destroy the send and receive managers before closing the CA.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
__ib_mgr_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ /* Destroy the send and receive managers
before closing the CA. */<o:p></o:p></P>
<P class=MsoNormal>+ __ib_mgr_destroy( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __port_free(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_obj_t*
const
p_obj )<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_obj_t*
const
p_obj )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal>+ p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P
class=MsoNormal>-
KeFlushQueuedDpcs();<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
__recv_mgr_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
__send_mgr_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P class=MsoNormal>+ KeFlushQueuedDpcs();<o:p></o:p></P>
<P class=MsoNormal>+ __endpt_mgr_destroy( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ __recv_mgr_destroy( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ __send_mgr_destroy( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ __buf_mgr_destroy( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_destroy( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_destroy( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_destroy(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_destroy(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_deinit( p_obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_ca_attrs )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free ( p_port->p_ca_attrs );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_deinit( p_obj );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->p_ca_attrs
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_free (
p_port->p_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IoFreeWorkItem( p_port->pPoWorkItem
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_free( p_port );<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -942,338 +948,338 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &p_port->ib_mgr, sizeof(ipoib_ib_mgr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &p_port->ib_mgr,
sizeof(ipoib_ib_mgr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_cq_create_t
cq_create;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_qp_create_t
qp_create;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_phys_create_t
phys_create;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_phys_range_t
phys_range;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
vaddr;<o:p></o:p></P>
<P
class=MsoNormal>-
net32_t
rkey;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_qp_attr_t
qp_attr;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_cq_create_t cq_create;<o:p></o:p></P>
<P class=MsoNormal>+
ib_qp_create_t qp_create;<o:p></o:p></P>
<P class=MsoNormal>+ ib_phys_create_t
phys_create;<o:p></o:p></P>
<P class=MsoNormal>+ ib_phys_range_t
phys_range;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t
vaddr;<o:p></o:p></P>
<P class=MsoNormal>+
net32_t
rkey;<o:p></o:p></P>
<P class=MsoNormal>+
ib_qp_attr_t qp_attr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Open the CA. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_al,
p_port->p_adapter->guids.ca_guid,<o:p></o:p></P>
<P
class=MsoNormal>-
NULL, p_port, &p_port->ib_mgr.h_ca );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_open_ca returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Open the CA. */<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->h_al,
p_port->p_adapter->guids.ca_guid,<o:p></o:p></P>
<P class=MsoNormal>+ NULL, p_port,
&p_port->ib_mgr.h_ca );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_open_ca returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = __port_query_ca_attrs( p_port, &p_port->p_ca_attrs
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Query CA attributes failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ status = __port_query_ca_attrs( p_port,
&p_port->p_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Query CA attributes failed\n" ) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu
)<o:p></o:p></P>
<P
class=MsoNormal>-
- sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
/* adjust ipoib UD payload MTU to actual port MTU
size.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.payload_mtu = <o:p></o:p></P>
<P
class=MsoNormal>-
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></P>
<P
class=MsoNormal>-
(sizeof(eth_hdr_t) +
p_port->p_adapter->params.payload_mtu);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t
payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu
)<o:p></o:p></P>
<P
class=MsoNormal>+
- sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ /* adjust ipoib
UD payload MTU to actual port MTU size. */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->params.payload_mtu = <o:p></o:p></P>
<P
class=MsoNormal>+
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></P>
<P
class=MsoNormal>+
(sizeof(eth_hdr_t) +
p_port->p_adapter->params.payload_mtu);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_USE_DMA<o:p></o:p></P>
<P
class=MsoNormal>-
/* init DMA only once while running MiniportInitialize */<o:p></o:p></P>
<P
class=MsoNormal>-
if ( !p_port->p_adapter->reset )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG max_phys_mapping;<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
max_phys_mapping =
p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( p_port->p_adapter->params.lso )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
max_phys_mapping =
p_port->p_adapter->params.xfer_block_size;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/*if( NdisMInitializeScatterGatherDma(
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}*/<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* init DMA only once while running
MiniportInitialize */<o:p></o:p></P>
<P class=MsoNormal>+ if ( !p_port->p_adapter->reset
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ULONG
max_phys_mapping;<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
max_phys_mapping =
p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if(
p_port->p_adapter->params.lso )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
max_phys_mapping =
p_port->p_adapter->params.xfer_block_size;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /*if(
NdisMInitializeScatterGatherDma(
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+
}*/<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the PD. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_alloc_pd returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the PD. */<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_alloc_pd returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate receive CQ. */<o:p></o:p></P>
<P
class=MsoNormal>-
cq_create.size = p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P
class=MsoNormal>-
cq_create.pfn_comp_cb = __recv_cb;<o:p></o:p></P>
<P
class=MsoNormal>-
cq_create.h_wait_obj = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate receive CQ. */<o:p></o:p></P>
<P class=MsoNormal>+ cq_create.size =
p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P class=MsoNormal>+ cq_create.pfn_comp_cb =
__recv_cb;<o:p></o:p></P>
<P class=MsoNormal>+ cq_create.h_wait_obj =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
__cq_event, &p_port->ib_mgr.h_recv_cq );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P class=MsoNormal>+ __cq_event,
&p_port->ib_mgr.h_recv_cq );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate send CQ. */<o:p></o:p></P>
<P
class=MsoNormal>-
cq_create.size = p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P
class=MsoNormal>-
cq_create.pfn_comp_cb = __send_cb;<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate send CQ. */<o:p></o:p></P>
<P class=MsoNormal>+ cq_create.size =
p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P class=MsoNormal>+ cq_create.pfn_comp_cb =
__send_cb;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
__cq_event, &p_port->ib_mgr.h_send_cq );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the QP. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &qp_create, sizeof(qp_create) );<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.qp_type = IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.rq_depth = p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.rq_sge = 2; /* To support buffers spanning pages.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.h_rq_cq = p_port->ib_mgr.h_recv_cq;<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.sq_depth = p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></P>
<P class=MsoNormal>+ __cq_event,
&p_port->ib_mgr.h_send_cq );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_create_cq returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the QP. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &qp_create,
sizeof(qp_create) );<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.qp_type =
IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.rq_depth =
p_port->p_adapter->params.rq_depth;<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.rq_sge = 2; /* To
support buffers spanning pages. */<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.h_rq_cq =
p_port->ib_mgr.h_recv_cq;<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.sq_depth =
p_port->p_adapter->params.sq_depth;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #define UD_QP_USED_SGE 3<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.sq_sge = MAX_SEND_SGE < p_port->p_ca_attrs->max_sges ?
<o:p></o:p></P>
<P
class=MsoNormal>-
MAX_SEND_SGE : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE
);<o:p></o:p></P>
<P
class=MsoNormal>-
if ( !p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></P>
<P
class=MsoNormal>-
{ <o:p></o:p></P>
<P
class=MsoNormal>-
/* checksum is not supported by device<o:p></o:p></P>
<P
class=MsoNormal>-
user must specify BYPASS to explicitly cancel checksum calculation
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_port->p_adapter->params.send_chksum_offload ==
CSUM_ENABLED)<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.send_chksum_offload =
CSUM_DISABLED;<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_port->p_adapter->params.recv_chksum_offload ==
CSUM_ENABLED)<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.recv_chksum_offload =
CSUM_DISABLED;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.sq_sge = MAX_SEND_SGE <
p_port->p_ca_attrs->max_sges ? <o:p></o:p></P>
<P
class=MsoNormal>+
MAX_SEND_SGE : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE
);<o:p></o:p></P>
<P class=MsoNormal>+ if (
!p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></P>
<P class=MsoNormal>+ { <o:p></o:p></P>
<P class=MsoNormal>+ /* checksum is
not supported by device<o:p></o:p></P>
<P class=MsoNormal>+ user must specify
BYPASS to explicitly cancel checksum calculation */<o:p></o:p></P>
<P class=MsoNormal>+ if
(p_port->p_adapter->params.send_chksum_offload ==
CSUM_ENABLED)<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.send_chksum_offload =
CSUM_DISABLED;<o:p></o:p></P>
<P class=MsoNormal>+ if
(p_port->p_adapter->params.recv_chksum_offload ==
CSUM_ENABLED)<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.recv_chksum_offload =
CSUM_DISABLED;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
// Now, params struct contains the intersection between the user
definition<o:p></o:p></P>
<P
class=MsoNormal>-
// and actual HW capabilites<o:p></o:p></P>
<P
class=MsoNormal>-
// Remember these values for NDIS OID requests<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->offload_cap.lso =
!!(p_port->p_adapter->params.lso);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></P>
<P
class=MsoNormal>-
!! (p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->offload_cap.recv_chksum_offload = <o:p></o:p></P>
<P
class=MsoNormal>-
!! (p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;<o:p></o:p></P>
<P
class=MsoNormal>-
qp_create.sq_signaled = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
__qp_event, &p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_create_qp returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Query the QP so we can get our QPN. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_query_qp returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.qpn = qp_attr.num;<o:p></o:p></P>
<P class=MsoNormal>+ // Now, params struct contains the
intersection between the user definition<o:p></o:p></P>
<P class=MsoNormal>+ // and actual HW
capabilites<o:p></o:p></P>
<P class=MsoNormal>+ // Remember these values for NDIS OID
requests<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_adapter->offload_cap.lso
= !!(p_port->p_adapter->params.lso);<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></P>
<P class=MsoNormal>+ !!
(p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->offload_cap.recv_chksum_offload = <o:p></o:p></P>
<P class=MsoNormal>+ !!
(p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ qp_create.h_sq_cq =
p_port->ib_mgr.h_send_cq;<o:p></o:p></P>
<P class=MsoNormal>+ qp_create.sq_signaled =
FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></P>
<P class=MsoNormal>+ __qp_event,
&p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_create_qp returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Query the QP so we can get our QPN.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_query_qp returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_port->ib_mgr.qpn =
qp_attr.num;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Register all of physical memory */<o:p></o:p></P>
<P
class=MsoNormal>-
phys_create.length = MEM_REG_SIZE;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_create.num_ranges = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_create.range_array = &phys_range;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_create.buf_offset = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_create.hca_page_size = PAGE_SIZE;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_create.access_ctrl = IB_AC_LOCAL_WRITE;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_range.base_addr = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
phys_range.size = MEM_REG_SIZE;<o:p></o:p></P>
<P
class=MsoNormal>-
vaddr = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_reg_phys returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Register all of physical memory
*/<o:p></o:p></P>
<P class=MsoNormal>+ phys_create.length =
MEM_REG_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+ phys_create.num_ranges =
1;<o:p></o:p></P>
<P class=MsoNormal>+ phys_create.range_array =
&phys_range;<o:p></o:p></P>
<P class=MsoNormal>+ phys_create.buf_offset =
0;<o:p></o:p></P>
<P class=MsoNormal>+ phys_create.hca_page_size =
PAGE_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+ phys_create.access_ctrl =
IB_AC_LOCAL_WRITE;<o:p></o:p></P>
<P class=MsoNormal>+ phys_range.base_addr = 0;<o:p></o:p></P>
<P class=MsoNormal>+ phys_range.size =
MEM_REG_SIZE;<o:p></o:p></P>
<P class=MsoNormal>+ vaddr = 0;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_reg_phys returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_port_srq_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_port_srq_init failed %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* disable further CM initialization */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ status = ipoib_port_srq_init( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_port_srq_init failed %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ /* disable
further CM initialization */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> //CM<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = endpt_cm_buf_mgr_init( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ status =
endpt_cm_buf_mgr_init( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_srq_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else <o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_port->p_adapter->params.send_chksum_offload )<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.send_chksum_offload =
CSUM_DISABLED;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else
<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
if ( p_port->p_adapter->params.send_chksum_offload
)<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.send_chksum_offload =
CSUM_DISABLED;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __srq_async_event_cb(<o:p></o:p></P>
<P
class=MsoNormal>-IN
ib_async_event_rec_t
*p_event_rec )<o:p></o:p></P>
<P class=MsoNormal>+IN
ib_async_event_rec_t *p_event_rec
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t* p_port = <o:p></o:p></P>
<P
class=MsoNormal>-
(ipoib_port_t *)p_event_rec->context;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t* p_port = <o:p></o:p></P>
<P class=MsoNormal>+ (ipoib_port_t
*)p_event_rec->context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_event_rec->code )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ switch( p_event_rec->code
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></P>
<P
class=MsoNormal>+
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung
= TRUE;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></P>
<P
class=MsoNormal>+
/*SRQ is in err state, must reinitialize */<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_srq_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_srq_handle_t
h_srq;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_srq_attr_t
srq_attr;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+ ib_srq_handle_t
h_srq;<o:p></o:p></P>
<P class=MsoNormal>+
ib_srq_attr_t srq_attr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if(
!p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
srq_attr.max_sge = min( 2, p_port->p_ca_attrs->max_srq_sges
);<o:p></o:p></P>
<P
class=MsoNormal>-
srq_attr.srq_limit = 10;<o:p></o:p></P>
<P
class=MsoNormal>-
srq_attr.max_wr = <o:p></o:p></P>
<P
class=MsoNormal>-
min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></P>
<P class=MsoNormal>+ srq_attr.max_sge = min( 2,
p_port->p_ca_attrs->max_srq_sges );<o:p></o:p></P>
<P class=MsoNormal>+ srq_attr.srq_limit = 10;<o:p></o:p></P>
<P class=MsoNormal>+ srq_attr.max_wr = <o:p></o:p></P>
<P class=MsoNormal>+ min(
(uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_pd, <o:p></o:p></P>
<P
class=MsoNormal>-
&srq_attr, <o:p></o:p></P>
<P
class=MsoNormal>-
p_port, <o:p></o:p></P>
<P
class=MsoNormal>-
__srq_async_event_cb, <o:p></o:p></P>
<P
class=MsoNormal>-
&h_srq );<o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_create_srq failed status %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return ib_status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_srq = h_srq;<o:p></o:p></P>
<P class=MsoNormal>+ ib_status =
p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->ib_mgr.h_pd, <o:p></o:p></P>
<P class=MsoNormal>+
&srq_attr,
<o:p></o:p></P>
<P
class=MsoNormal>+
p_port, <o:p></o:p></P>
<P
class=MsoNormal>+
__srq_async_event_cb, <o:p></o:p></P>
<P
class=MsoNormal>+
&h_srq );<o:p></o:p></P>
<P class=MsoNormal>+ if( ib_status != IB_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_create_srq failed status %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_port->ib_mgr.h_srq =
h_srq;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
return ib_status;<o:p></o:p></P>
<P class=MsoNormal>+ return ib_status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* __port_query_ca_attrs() <o:p></o:p></P>
<P class=MsoNormal>@@ -1282,82 +1288,82 @@<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_ca_attr_t**
pp_ca_attrs )<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_port_t* const p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ib_ca_attr_t** pp_ca_attrs
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
attr_size;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_ca_attr_t*
p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
attr_size;<o:p></o:p></P>
<P class=MsoNormal>+
ib_ca_attr_t* p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_ca_attrs = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ *pp_ca_attrs = NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL ,
&attr_size );<o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_status != IB_INSUFFICIENT_MEMORY )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_query_ca failed status %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
goto done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( attr_size );<o:p></o:p></P>
<P class=MsoNormal>+ ib_status = <o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL ,
&attr_size );<o:p></o:p></P>
<P class=MsoNormal>+ if( ib_status != IB_INSUFFICIENT_MEMORY
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_query_ca failed status %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P class=MsoNormal>+ goto
done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( attr_size );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_ca_attrs = (ib_ca_attr_t *) cl_zalloc( attr_size );<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_ca_attrs == NULL )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
goto done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_ca_attrs = (ib_ca_attr_t *) cl_zalloc(
attr_size );<o:p></o:p></P>
<P class=MsoNormal>+ if ( p_ca_attrs == NULL )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></P>
<P class=MsoNormal>+ ib_status =
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ goto
done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs
, &attr_size );<o:p></o:p></P>
<P
class=MsoNormal>-
if ( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("CA attributes query failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free ( p_ca_attrs );<o:p></o:p></P>
<P
class=MsoNormal>-
goto done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ib_status = <o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs
, &attr_size );<o:p></o:p></P>
<P class=MsoNormal>+ if ( ib_status != IB_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("CA attributes query failed\n") );<o:p></o:p></P>
<P class=MsoNormal>+ cl_free (
p_ca_attrs );<o:p></o:p></P>
<P class=MsoNormal>+ goto
done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_ca_attrs = p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal>+ *pp_ca_attrs = p_ca_attrs;<o:p></o:p></P>
<P class=MsoNormal> done:<o:p></o:p></P>
<P
class=MsoNormal>-
return ib_status;<o:p></o:p></P>
<P class=MsoNormal>+ return ib_status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_srq_destroy( <o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->ib_mgr.h_srq )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status =<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->ib_mgr.h_srq
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ status
=<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_port_t*
const p_port )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->ib_mgr.h_ca )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status =<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->ib_mgr.h_ca
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ status
=<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -1369,58 +1375,58 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_construct( &p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal>+ cl_qpool_construct(
&p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->buf_mgr.h_packet_pool = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->buf_mgr.h_buffer_pool = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->buf_mgr.h_packet_pool =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->buf_mgr.h_buffer_pool =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisInitializeNPagedLookasideList(
&p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P
class=MsoNormal>-
NULL, NULL, 0, MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></P>
<P class=MsoNormal>+ NdisInitializeNPagedLookasideList(
&p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P class=MsoNormal>+ NULL, NULL, 0,
MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->buf_mgr.h_send_pkt_pool = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->buf_mgr.h_send_pkt_pool =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t*
const p_port )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_params_t
*p_params;<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_POOL_PARAMETERS pool_parameters;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ cl_status_t
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_params_t
*p_params;<o:p></o:p></P>
<P class=MsoNormal>+ NET_BUFFER_LIST_POOL_PARAMETERS
pool_parameters;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port->p_adapter
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_params = &p_port->p_adapter->params;<o:p></o:p></P>
<P class=MsoNormal>+ p_params =
&p_port->p_adapter->params;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the receive descriptor pool */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_qpool_init( &p_port->buf_mgr.recv_pool,<o:p></o:p></P>
<P
class=MsoNormal>-
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the receive descriptor pool
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_qpool_init(
&p_port->buf_mgr.recv_pool,<o:p></o:p></P>
<P class=MsoNormal>+
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port
);<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ 0, 0,
sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ 0, 0,
sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the NET BUFFER list pools for receive indication. */<o:p></o:p></P>
<P
class=MsoNormal>-
NdisZeroMemory(&pool_parameters,
sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the NET BUFFER list pools for
receive indication. */<o:p></o:p></P>
<P class=MsoNormal>+ NdisZeroMemory(&pool_parameters,
sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.Header.Type =
NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.Header.Revision =
NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.Header.Size =
sizeof(pool_parameters);<o:p></o:p></P>
<P class=MsoNormal>@@ -1428,288 +1434,288 @@<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.ContextSize =
0;<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.fAllocateNetBuffer =
TRUE;<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.PoolTag =
'CRPI';<o:p></o:p></P>
<P
class=MsoNormal>-
pool_parameters.DataSize = 0;<o:p></o:p></P>
<P class=MsoNormal>+ pool_parameters.DataSize =
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> p_port->buf_mgr.h_packet_pool =
NdisAllocateNetBufferListPool(<o:p></o:p></P>
<P
class=MsoNormal>
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>
&pool_parameters); <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_port->buf_mgr.h_packet_pool )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the NET buffer list pool for send formatting. */<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_port->buf_mgr.h_packet_pool
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the NET buffer list pool for
send formatting. */<o:p></o:p></P>
<P class=MsoNormal> pool_parameters.PoolTag =
'XTPI';<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> p_port->buf_mgr.h_send_pkt_pool =
NdisAllocateNetBufferListPool(<o:p></o:p></P>
<P
class=MsoNormal>
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>
&pool_parameters); <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
!p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Destroy the send packet and buffer pools. <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->buf_mgr.h_send_buf_pool )<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->buf_mgr.h_send_pkt_pool )<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></P>
<P class=MsoNormal>+ /* Destroy the send packet and buffer
pools. <o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->buf_mgr.h_send_buf_pool
)<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->buf_mgr.h_send_pkt_pool
)<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Destroy the receive packet and buffer pools. <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->buf_mgr.h_buffer_pool )<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->buf_mgr.h_packet_pool )<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );<o:p></o:p></P>
<P class=MsoNormal>+ /* Destroy the receive packet and buffer
pools. <o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->buf_mgr.h_buffer_pool
)<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->buf_mgr.h_packet_pool
)<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Free the receive and send descriptors. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_destroy( &p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal>+ /* Free the receive and send descriptors.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_qpool_destroy(
&p_port->buf_mgr.recv_pool );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Free the lookaside list of scratch buffers. */<o:p></o:p></P>
<P
class=MsoNormal>-
NdisDeleteNPagedLookasideList( &p_port->buf_mgr.send_buf_list
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Free the lookaside list of scratch
buffers. */<o:p></o:p></P>
<P class=MsoNormal>+ NdisDeleteNPagedLookasideList(
&p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static cl_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_ctor(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void*
const
p_object,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void*
context,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_pool_item_t**
const
pp_pool_item )<o:p></o:p></P>
<P class=MsoNormal>+
IN
void*
const
p_object,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void*
context,<o:p></o:p></P>
<P class=MsoNormal>+
OUT cl_pool_item_t**
const pp_pool_item )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
ds0_len;<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ALLOC
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_object );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( context );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_object );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)p_object;<o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)p_object;<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Setup the work request. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->wr.ds_array = p_desc->local_ds;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->wr.wr_id = (uintn_t)p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ /* Setup the work request.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->wr.ds_array =
p_desc->local_ds;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->wr.wr_id =
(uintn_t)p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
/* Sanity check on the receive buffer layout */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( (void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></P>
<P
class=MsoNormal>-
(void*)&p_desc->buf.ib.pkt.type );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( sizeof(recv_buf_t) == sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Sanity check on the receive buffer
layout */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
(void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></P>
<P class=MsoNormal>+
(void*)&p_desc->buf.ib.pkt.type
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( sizeof(recv_buf_t) ==
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Setup the local data segment. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_desc->buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
ds0_len =<o:p></o:p></P>
<P
class=MsoNormal>-
PAGE_SIZE - ((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE -
1));<o:p></o:p></P>
<P
class=MsoNormal>-
if( ds0_len >= sizeof(recv_buf_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* The whole buffer is within a page. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* The buffer crosses page boundaries. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[1].vaddr = cl_get_physaddr( <o:p></o:p></P>
<P
class=MsoNormal>-
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->wr.num_ds = 2;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the receive buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_buf = (recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_desc->p_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to allocate receive buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return CL_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Setup the local data segment.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->local_ds[0].vaddr =
cl_get_physaddr( &p_desc->buf );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->local_ds[0].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ ds0_len =<o:p></o:p></P>
<P class=MsoNormal>+ PAGE_SIZE -
((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));<o:p></o:p></P>
<P class=MsoNormal>+ if( ds0_len >= sizeof(recv_buf_t)
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* The whole
buffer is within a page. */<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* The buffer
crosses page boundaries. */<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->local_ds[1].vaddr = cl_get_physaddr( <o:p></o:p></P>
<P
class=MsoNormal>+
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->wr.num_ds = 2;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the receive buffer.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->p_buf =
(recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_desc->p_buf )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to allocate receive buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
CL_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Sanity check on the receive buffer layout */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( (void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></P>
<P
class=MsoNormal>-
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></P>
<P class=MsoNormal>+ /* Sanity check on the receive buffer
layout */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
(void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></P>
<P class=MsoNormal>+
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Setup the local data segment. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].vaddr = cl_get_physaddr( p_desc->p_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].length = sizeof(ipoib_pkt_t) +
sizeof(ib_grh_t);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ /* Setup the local data segment.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->local_ds[0].vaddr =
cl_get_physaddr( p_desc->p_buf );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->local_ds[0].length =
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->local_ds[0].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->wr.num_ds = 1;<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_pool_item = &p_desc->item;<o:p></o:p></P>
<P class=MsoNormal>+ *pp_pool_item =
&p_desc->item;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P
class=MsoNormal>-
return CL_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ALLOC
);<o:p></o:p></P>
<P class=MsoNormal>+ return CL_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_dtor(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const cl_pool_item_t*
const
p_pool_item,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*context )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const cl_pool_item_t* const
p_pool_item,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ALLOC
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( context );<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM( context );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc = PARENT_STRUCT( p_pool_item, ipoib_recv_desc_t, item );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc = PARENT_STRUCT( p_pool_item,
ipoib_recv_desc_t, item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_desc->p_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free( p_desc->p_buf );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_desc->p_buf )<o:p></o:p></P>
<P class=MsoNormal>+ cl_free(
p_desc->p_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ALLOC
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool
);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Reference the port object for the send. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_desc )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_get_recv );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Reference the port object for the
send. */<o:p></o:p></P>
<P class=MsoNormal>+ if( p_desc )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref(
p_port, ref_get_recv );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P
class=MsoNormal>-
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P
class=MsoNormal>-
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].length ==<o:p></o:p></P>
<P
class=MsoNormal>-
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P
class=MsoNormal>+
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].vaddr ==<o:p></o:p></P>
<P
class=MsoNormal>+
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].length ==<o:p></o:p></P>
<P
class=MsoNormal>+
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return p_desc;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //NDIS60<o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NET_BUFFER_LIST*
const
p_net_buffer_list OPTIONAL )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+
IN
NET_BUFFER_LIST* const p_net_buffer_list OPTIONAL
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER
*p_buf = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
MDL
*p_mdl = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ NET_BUFFER
*p_buf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
MDL
*p_mdl = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_net_buffer_list )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
p_buf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
p_mdl = NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_buf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_buf
);<o:p></o:p></P>
<P class=MsoNormal>+ p_mdl =
NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_mdl
);<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Return the descriptor to its pools. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_put( &p_port->buf_mgr.recv_pool, &p_desc->item
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Return the descriptor to its pools.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_qpool_put(
&p_port->buf_mgr.recv_pool, &p_desc->item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Dereference the port object since the receive is no longer
outstanding.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_get_recv );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Dereference the port object since
the receive is no longer outstanding.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port, ref_get_recv
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
cl_qlist_t*
const
p_list )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
cl_qlist_t* const
p_list )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
//IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_put_list( &p_port->buf_mgr.recv_pool, p_list );<o:p></o:p></P>
<P
class=MsoNormal>-
//IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ //IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_qpool_put_list(
&p_port->buf_mgr.recv_pool, p_list );<o:p></o:p></P>
<P class=MsoNormal>+ //IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></P>
<P class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const p_desc
)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></P>
<P
class=MsoNormal>-
MDL
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+
MDL
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_desc->buf.eth.pkt,<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->len );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to allocate MDL\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_mdl =
NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
&p_desc->buf.eth.pkt,<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->len );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to allocate MDL\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->buf_mgr.h_packet_pool,<o:p></o:p></P>
<P
class=MsoNormal>-
0,<o:p></o:p></P>
<P
class=MsoNormal>-
0,<o:p></o:p></P>
<P
class=MsoNormal>-
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
0,<o:p></o:p></P>
<P
class=MsoNormal>-
0);<o:p></o:p></P>
<P class=MsoNormal>+ p_net_buffer_list =
NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->buf_mgr.h_packet_pool,<o:p></o:p></P>
<P
class=MsoNormal>+
0,<o:p></o:p></P>
<P
class=MsoNormal>+
0,<o:p></o:p></P>
<P
class=MsoNormal>+
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>+
0,<o:p></o:p></P>
<P
class=MsoNormal>+
0);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_net_buffer_list )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P
class=MsoNormal>-
return NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeMdl(p_mdl);<o:p></o:p></P>
<P class=MsoNormal>+ return
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PORT_FROM_NBL( p_net_buffer_list ) = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_RECV_FROM_NBL( p_net_buffer_list ) = p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buffer_list->SourceHandle =
p_port->p_adapter->h_adapter;<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PORT_FROM_NBL( p_net_buffer_list )
= p_port;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_RECV_FROM_NBL( p_net_buffer_list )
= p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ p_net_buffer_list->SourceHandle =
p_port->p_adapter->h_adapter;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -1720,54 +1726,54 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &p_port->recv_mgr.done_list );<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init(
&p_port->recv_mgr.done_list );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->recv_mgr.recv_NBL_array =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the NDIS_PACKET pointer array for indicating receives.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array = (NET_BUFFER_LIST
**)cl_malloc(<o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_port->recv_mgr.recv_NBL_array )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the NDIS_PACKET pointer array
for indicating receives. */<o:p></o:p></P>
<P class=MsoNormal>+ p_port->recv_mgr.recv_NBL_array =
(NET_BUFFER_LIST **)cl_malloc(<o:p></o:p></P>
<P class=MsoNormal>+
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth
);<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_port->recv_mgr.recv_NBL_array
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( cl_is_qlist_empty( &p_port->recv_mgr.done_list )
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( !p_port->recv_mgr.depth );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( cl_is_qlist_empty(
&p_port->recv_mgr.done_list ) );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( !p_port->recv_mgr.depth
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->recv_mgr.recv_NBL_array )<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free( p_port->recv_mgr.recv_NBL_array );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->recv_mgr.recv_NBL_array
)<o:p></o:p></P>
<P class=MsoNormal>+ cl_free(
p_port->recv_mgr.recv_NBL_array );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -1779,1449 +1785,1490 @@<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_repost(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t *p_head
= NULL, *p_tail = NULL, *p_next;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_recv_wr_t
*p_failed;<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_recv_desc_t *p_head =
NULL, *p_tail = NULL, *p_next;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_recv_wr_t *p_failed;<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetRecv );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PostRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Port in invalid state. Not reposting.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_repost );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->state != IB_QPS_RTS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Port in invalid state. Not reposting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_repost
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Pull receives out of the pool and chain them up. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
p_next = __buf_mgr_get_recv( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_next )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Out of receive descriptors! recv queue depth
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->recv_mgr.depth <
p_port->p_adapter->params.rq_depth )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Pull receives
out of the pool and chain them up. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
GetRecv );<o:p></o:p></P>
<P class=MsoNormal>+ p_next =
__buf_mgr_get_recv( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetRecv );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_next
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Out of receive descriptors! recv queue depth
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_tail )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_tail = p_next;<o:p></o:p></P>
<P
class=MsoNormal>-
p_next->wr.p_next = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_next->wr.p_next = &p_head->wr;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_tail
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_tail = p_next;<o:p></o:p></P>
<P
class=MsoNormal>+
p_next->wr.p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_next->wr.p_next = &p_head->wr;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_head = p_next;<o:p></o:p></P>
<P class=MsoNormal>+ p_head =
p_next;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.depth++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
p_port->recv_mgr.depth++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_head )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_head )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
PostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PostRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ip_post_recv returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* return the descriptors to the pool */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_failed )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></P>
<P
class=MsoNormal>-
p_failed = p_failed->p_next;<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ip_post_recv returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
/* return the descriptors to the pool */<o:p></o:p></P>
<P
class=MsoNormal>+
while( p_failed )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></P>
<P
class=MsoNormal>+
p_failed = p_failed->p_next;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.depth--;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->recv_mgr.depth--;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_repost );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return p_port->p_adapter->params.rq_low_watermark -
p_port->recv_mgr.depth;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port, ref_repost
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return
p_port->p_adapter->params.rq_low_watermark -
p_port->recv_mgr.depth;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline ULONG __free_received_NBL (<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t
*p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN NET_BUFFER_LIST *p_net_buffer_lists<o:p></o:p></P>
<P
class=MsoNormal>-
) <o:p></o:p></P>
<P class=MsoNormal>+ IN ipoib_port_t
*p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN NET_BUFFER_LIST
*p_net_buffer_lists<o:p></o:p></P>
<P class=MsoNormal>+ ) <o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></P>
<P
class=MsoNormal>-
LONG
NBL_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ NET_BUFFER_LIST
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+
LONG
NBL_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
for (cur_net_buffer_list = p_net_buffer_lists;<o:p></o:p></P>
<P
class=MsoNormal>-
cur_net_buffer_list != NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
++NBL_cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
next_net_buffer_list =
NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ for (cur_net_buffer_list =
p_net_buffer_lists;<o:p></o:p></P>
<P class=MsoNormal>+
cur_net_buffer_list != NULL;<o:p></o:p></P>
<P class=MsoNormal>+
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
++NBL_cnt;<o:p></o:p></P>
<P class=MsoNormal>+
next_net_buffer_list =
NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the port and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(p_port == IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc = IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the port
and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(p_port
== IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></P>
<P class=MsoNormal>+ p_desc =
IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> #if 0 //TODO CM flow<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
int32_t
discarded;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
NBL_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status = IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
int32_t
discarded;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
NBL_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
ib_api_status_t status = IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_BUFFER
*p_buf;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_BUFFER *p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Unchain the NDIS buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></P>
<P
class=MsoNormal>-
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeBuffer( p_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
/* Unchain the NDIS buffer. */<o:p></o:p></P>
<P
class=MsoNormal>+
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( p_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></P>
<P
class=MsoNormal>+
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></P>
<P
class=MsoNormal>+
NdisFreeBuffer( p_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t *)p_desc
);<o:p></o:p></P>
<P
class=MsoNormal>-
status = endpt_cm_post_recv( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Post Recv QP failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t *)p_desc
);<o:p></o:p></P>
<P
class=MsoNormal>+
status = endpt_cm_post_recv( p_port );<o:p></o:p></P>
<P
class=MsoNormal>+
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Post Recv QP failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ReturnPutRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
return NBL_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
ReturnPutRecv );<o:p></o:p></P>
<P class=MsoNormal>+
__buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ReturnPutRecv );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ return NBL_cnt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_return_net_buffer_list(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NDIS_HANDLE
adapter_context,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NET_BUFFER_LIST
*p_net_buffer_lists,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ULONG
return_flags)<o:p></o:p></P>
<P class=MsoNormal>+
IN
NDIS_HANDLE
adapter_context,<o:p></o:p></P>
<P class=MsoNormal>+
IN
NET_BUFFER_LIST
*p_net_buffer_lists,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ULONG
return_flags)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
int32_t
shortage;<o:p></o:p></P>
<P
class=MsoNormal>-
LONG
NBL_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ReturnPacket );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ReturnPutRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ReturnRepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ReturnPreparePkt );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ReturnNdisIndicate );<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+
int32_t
shortage;<o:p></o:p></P>
<P class=MsoNormal>+
LONG
NBL_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ReturnPacket
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ReturnPutRecv
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ReturnRepostRecv
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ReturnPreparePkt
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ReturnNdisIndicate
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( return_flags );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_port = ((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_net_buffer_lists );<o:p></o:p></P>
<P
class=MsoNormal>-
if ( !p_port ) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("return_NBL callback called when port pointer was already cleared\n")
);<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM( return_flags
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ p_port =
((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_net_buffer_lists
);<o:p></o:p></P>
<P class=MsoNormal>+ if ( !p_port ) {<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(p_port);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("return_NBL callback called when port pointer was
already cleared\n") );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ReturnPacket );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
NBL_cnt = __free_received_NBL( p_port, p_net_buffer_lists );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( ReturnPacket
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ NBL_cnt = __free_received_NBL( p_port,
p_net_buffer_lists );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
shutter_sub( &p_port->p_adapter->recv_shutter, -NBL_cnt
);<o:p></o:p></P>
<P class=MsoNormal>+ shutter_sub(
&p_port->p_adapter->recv_shutter, -NBL_cnt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Repost buffers to HW */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ReturnRepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
shortage = __recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></P>
<P class=MsoNormal>+ /* Repost buffers to HW */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( ReturnRepostRecv
);<o:p></o:p></P>
<P class=MsoNormal>+ shortage = __recv_mgr_repost( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ReturnRepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void
* s_arg1 , void * s_arg2)<o:p></o:p></P>
<P class=MsoNormal>-{<o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+
IN
uint32_t
*p_recv_cnt<o:p></o:p></P>
<P class=MsoNormal>+ );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></P>
<P class=MsoNormal>+static void<o:p></o:p></P>
<P class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></P>
<P class=MsoNormal>+
IN
DEVICE_OBJECT*
p_dev_obj,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void*
context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t *p_port = ( ipoib_port_t* )
context;<o:p></o:p></P>
<P class=MsoNormal>+ int WorkToDo = true;<o:p></o:p></P>
<P class=MsoNormal>+ KIRQL irql;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t recv_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t total_recv_cnt =
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__recv_cb(NULL, p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ while (WorkToDo && total_recv_cnt
< 512) {<o:p></o:p></P>
<P class=MsoNormal>+ irql =
KeRaiseIrqlToDpcLevel();<o:p></o:p></P>
<P class=MsoNormal>+ WorkToDo =
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></P>
<P class=MsoNormal>+
KeLowerIrql(irql);<o:p></o:p></P>
<P class=MsoNormal>+ total_recv_cnt +=
recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>+ if (WorkToDo) {<o:p></o:p></P>
<P class=MsoNormal>+ IoQueueWorkItem(
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></P>
<P class=MsoNormal>+
} <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void<o:p></o:p></P>
<P class=MsoNormal>-__recv_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+static BOOLEAN<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb_internal(<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context,<o:p></o:p></P>
<P class=MsoNormal>+
IN
uint32_t*
p_recv_cnt)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_wc_t
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_wc_t
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></P>
<P
class=MsoNormal>
int32_t
NBL_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_t
done_list, bad_list;<o:p></o:p></P>
<P
class=MsoNormal>-
size_t
i;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
recv_complete_flags = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
BOOLEAN
res;<o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_t done_list,
bad_list;<o:p></o:p></P>
<P class=MsoNormal>+
size_t
i;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
recv_complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal>+
BOOLEAN
res;<o:p></o:p></P>
<P class=MsoNormal>+ BOOLEAN WorkToDo =
FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvCompBundle );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvCb );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PollRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( FilterRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( BuildNBLArray );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvNdisIndicate );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RearmRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PutRecvList );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvCompBundle
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvCb );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PollRecv );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RepostRecv
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( FilterRecv
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( BuildNBLArray
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvNdisIndicate
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RearmRecv );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PutRecvList
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_clr( RecvCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_clr( RecvCompBundle
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvCb );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags,
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags,
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &done_list
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &bad_list
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &done_list );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &bad_list );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_recv_cb
);<o:p></o:p></P>
<P class=MsoNormal>+ for( i = 0; i < MAX_RECV_WC; i++
)<o:p></o:p></P>
<P class=MsoNormal>+ wc[i].p_next =
&wc[i + 1];<o:p></o:p></P>
<P class=MsoNormal>+ wc[MAX_RECV_WC - 1].p_next =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_recv_cb );<o:p></o:p></P>
<P
class=MsoNormal>-
for( i = 0; i < MAX_RECV_WC; i++ )<o:p></o:p></P>
<P
class=MsoNormal>-
wc[i].p_next = &wc[i + 1];<o:p></o:p></P>
<P
class=MsoNormal>-
wc[MAX_RECV_WC - 1].p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * We'll be accessing the endpoint
map so take a reference<o:p></o:p></P>
<P class=MsoNormal>+ * on it to prevent
modifications.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* We'll be accessing the endpoint map so take a reference<o:p></o:p></P>
<P
class=MsoNormal>-
* on it to prevent modifications.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ do<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* If we get
here, then the list of WCs is intact. */<o:p></o:p></P>
<P class=MsoNormal>+ p_free =
wc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
do<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* If we get here, then the list of WCs is intact. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_free = wc;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
PollRecv );<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PollRecv );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status
== IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PollRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PollRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal>+ /* Look at the
payload now and filter ARP and DHCP packets. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
FilterRecv );<o:p></o:p></P>
<P class=MsoNormal>+ recv_cnt +=
__recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Look at the payload now and filter ARP and DHCP packets. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( FilterRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );<o:p></o:p></P>
<P class=MsoNormal>+ } while( ( !p_free ) && (
recv_cnt < 128 )); //TODO restore back to 128<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
} while( ( !p_free ) && ( recv_cnt < 16 )); //TODO restore back to
128<o:p></o:p></P>
<P class=MsoNormal>+ *p_recv_cnt =
(uint32_t)recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* We're done looking at the endpoint
map, release the reference. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* We're done looking at the endpoint map, release the reference.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_log(
&p_port->p_adapter->perf, RecvCompBundle, recv_cnt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_log( &p_port->p_adapter->perf, RecvCompBundle, recv_cnt
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ /* Update our posted depth.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_port->recv_mgr.depth -=
recv_cnt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Update our posted depth. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.depth -= recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ /* Return any discarded receives to the
pool */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( PutRecvList
);<o:p></o:p></P>
<P class=MsoNormal>+ __buf_mgr_put_recv_list( p_port,
&bad_list );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PutRecvList );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Return any discarded receives to the pool */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PutRecvList );<o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_put_recv_list( p_port, &bad_list );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PutRecvList );<o:p></o:p></P>
<P class=MsoNormal>+ do<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ //int32_t
cnt;<o:p></o:p></P>
<P class=MsoNormal>+ /* Repost ASAP so
we don't starve the RQ. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
RepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ shortage =
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( shortage >
0 )<o:p></o:p></P>
<P class=MsoNormal>+
{
<o:p></o:p></P>
<P
class=MsoNormal>+
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>+
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
do<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
//int32_t cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Repost ASAP so we don't starve the RQ. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
shortage = __recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( shortage > 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{
<o:p></o:p></P>
<P
class=MsoNormal>-
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
BuildNBLArray );<o:p></o:p></P>
<P class=MsoNormal>+ /* Notify NDIS of
any and all possible receive buffers. */<o:p></o:p></P>
<P class=MsoNormal>+ NBL_cnt =
__recv_mgr_build_NBL_array(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port, &done_list, &discarded);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, BuildNBLArray );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( BuildNBLArray );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Notify NDIS of any and all possible receive buffers. */<o:p></o:p></P>
<P
class=MsoNormal>-
NBL_cnt = __recv_mgr_build_NBL_array(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port, &done_list, &discarded);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, BuildNBLArray
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Only indicate
receives if we actually had any. */<o:p></o:p></P>
<P class=MsoNormal>+ if( discarded
&& shortage > 0 )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* We may have thrown away packets, and have a shortage */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( RepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>+
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Only indicate receives if we actually had any. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( discarded && shortage > 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* We may have thrown away packets, and have a shortage */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !NBL_cnt )
{<o:p></o:p></P>
<P
class=MsoNormal>+
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !NBL_cnt ) {<o:p></o:p></P>
<P
class=MsoNormal>-
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
RecvNdisIndicate );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if (shortage
<= 0) {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvNdisIndicate );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (shortage <= 0) {<o:p></o:p></P>
<P
class=MsoNormal>+
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt
);<o:p></o:p></P>
<P
class=MsoNormal>+
if (res) {<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P
class=MsoNormal>+
NBL_cnt,<o:p></o:p></P>
<P
class=MsoNormal>+
recv_complete_flags);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else {<o:p></o:p></P>
<P
class=MsoNormal>+
__free_received_NBL (p_port,
p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ } else
{<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>+
// If shortage >0, we already set the status to
NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></P>
<P
class=MsoNormal>+
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures
immediately<o:p></o:p></P>
<P
class=MsoNormal>+
res = shutter_add( &p_port->p_adapter->recv_shutter, 1
);<o:p></o:p></P>
<P
class=MsoNormal>+
if (res) {<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P
class=MsoNormal>+
NBL_cnt,<o:p></o:p></P>
<P
class=MsoNormal>+
recv_complete_flags);<o:p></o:p></P>
<P
class=MsoNormal>+
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt
);<o:p></o:p></P>
<P
class=MsoNormal>-
if (res) {<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P
class=MsoNormal>-
NBL_cnt,<o:p></o:p></P>
<P
class=MsoNormal>-
recv_complete_flags);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else {<o:p></o:p></P>
<P
class=MsoNormal>-
__free_received_NBL (p_port,
p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
// If shortage >0, we already set the status to
NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></P>
<P
class=MsoNormal>-
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures
immediately<o:p></o:p></P>
<P
class=MsoNormal>-
res = shutter_add( &p_port->p_adapter->recv_shutter, 1
);<o:p></o:p></P>
<P
class=MsoNormal>-
if (res) {<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></P>
<P
class=MsoNormal>-
NBL_cnt,<o:p></o:p></P>
<P
class=MsoNormal>-
recv_complete_flags);<o:p></o:p></P>
<P
class=MsoNormal>-
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RecvNdisIndicate );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate
);<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Cap the
number of receives to put back to what we just indicated<o:p></o:p></P>
<P class=MsoNormal>+ * with
NDIS_STATUS_RESOURCES.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ if( shortage >
0 )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Cap the number of receives to put back to what we just
indicated<o:p></o:p></P>
<P
class=MsoNormal>-
* with NDIS_STATUS_RESOURCES.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( shortage > 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>+
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></P>
<P
class=MsoNormal>+
/* Return all but the last packet to the pool. */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>+
//while( shortage-- > 1 )<o:p></o:p></P>
<P
class=MsoNormal>+
while ( NBL_cnt-- > 0)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
__buf_mgr_put_recv( p_port,<o:p></o:p></P>
<P
class=MsoNormal>+
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL(
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></P>
<P
class=MsoNormal>-
/* Return all but the last packet to the pool. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
//while( shortage-- > 1 )<o:p></o:p></P>
<P
class=MsoNormal>-
while ( NBL_cnt-- > 0)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_put_recv( p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL(
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* Return the last packet as if NDIS returned it, so that we
repost<o:p></o:p></P>
<P
class=MsoNormal>+
* and report any other pending receives.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
//ipoib_return_net_buffer_list( p_port,
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Return the last packet as if NDIS returned it, so that we
repost<o:p></o:p></P>
<P
class=MsoNormal>-
* and report any other pending receives.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
//ipoib_return_net_buffer_list( p_port,
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ } while( NBL_cnt );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
} while( NBL_cnt );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ if (p_free ) {<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Rearm
after filtering to prevent contention on the enpoint maps<o:p></o:p></P>
<P class=MsoNormal>+ * and
eliminate the possibility of having a call to<o:p></o:p></P>
<P class=MsoNormal>+ *
__endpt_mgr_insert find a duplicate.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(WorkToDo
== FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
RearmRecv );<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RearmRecv );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if (p_free ) {<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Rearm after filtering to prevent contention on the enpoint maps<o:p></o:p></P>
<P
class=MsoNormal>-
* and eliminate the possibility of having a call to<o:p></o:p></P>
<P
class=MsoNormal>-
* __endpt_mgr_insert find a duplicate.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RearmRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_recv_cb );<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+ // Please note
the reference is still up<o:p></o:p></P>
<P class=MsoNormal>+ if (h_cq)
{<o:p></o:p></P>
<P
class=MsoNormal>+
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></P>
<P
class=MsoNormal>+
WorkToDo = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ } else
{<o:p></o:p></P>
<P
class=MsoNormal>+
WorkToDo = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
// Please note the reference is still up<o:p></o:p></P>
<P
class=MsoNormal>-
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RecvCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return WorkToDo;<o:p></o:p></P>
<P class=MsoNormal>+}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+<o:p></o:p></P>
<P class=MsoNormal>+static void<o:p></o:p></P>
<P class=MsoNormal>+__recv_cb(<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+{<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ __recv_cb_internal(h_cq, cq_context,
&recv_cnt);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __recv_get_endpts(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_src,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_dst )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_src,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_dst )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
mac_addr_t
mac;<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEndptByGid );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEndptByLid );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( EndptInsert );<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
mac_addr_t
mac;<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEndptByGid
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEndptByLid
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( EndptInsert
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Setup our shortcut pointers based on whether GRH is valid. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_wc->recv.ud.recv_opt & IB_RECV_OPT_GRH_VALID )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Lookup the source endpoints based on GID. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetEndptByGid );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src =<o:p></o:p></P>
<P class=MsoNormal>+ /* Setup our shortcut pointers based on
whether GRH is valid. */<o:p></o:p></P>
<P class=MsoNormal>+ if( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_GRH_VALID )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Lookup the
source endpoints based on GID. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal>+ *pp_src
=<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid
);<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid
);<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid
);<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid
);<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid
);<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Lookup the destination endpoint based on GID.<o:p></o:p></P>
<P
class=MsoNormal>-
* This is used along with the packet filter to determine<o:p></o:p></P>
<P
class=MsoNormal>-
* whether to report this to NDIS.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetEndptByGid );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_dst =<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Lookup
the destination endpoint based on GID.<o:p></o:p></P>
<P class=MsoNormal>+ * This is
used along with the packet filter to determine<o:p></o:p></P>
<P class=MsoNormal>+ * whether
to report this to NDIS.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal>+ *pp_dst
=<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid
);<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid
);<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid
);<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid
);<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid
);<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Create the source endpoint if it does not exist. Note that
we<o:p></o:p></P>
<P
class=MsoNormal>-
* can only do this for globally routed traffic since we need the<o:p></o:p></P>
<P
class=MsoNormal>-
* information from the GRH to generate the MAC.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( !*pp_src )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_mac_from_guid(<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Create
the source endpoint if it does not exist. Note that we<o:p></o:p></P>
<P class=MsoNormal>+ * can only
do this for globally routed traffic since we need the<o:p></o:p></P>
<P class=MsoNormal>+ *
information from the GRH to generate the MAC.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ if( !*pp_src
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
status = ipoib_mac_from_guid(<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->buf.ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->buf.ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>+
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
return;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Create the endpoint. */<o:p></o:p></P>
<P
class=MsoNormal>+
/* Create the endpoint. */<o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = ipoib_endpt_create(
&p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !*pp_src )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( EndptInsert );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_insert returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Lookup the remote endpoint based on LID. Note that only<o:p></o:p></P>
<P
class=MsoNormal>-
* unicast traffic can be LID routed.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetEndptByLid );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = __endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByLid
);<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_dst = p_port->p_local_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( *pp_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = ipoib_endpt_create(
&p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></P>
<P class=MsoNormal>+#endif /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>+
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></P>
<P
class=MsoNormal>+
if( !*pp_src )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( EndptInsert );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P class=MsoNormal>+
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_insert returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>+
return;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Lookup
the remote endpoint based on LID. Note that only<o:p></o:p></P>
<P class=MsoNormal>+ * unicast
traffic can be LID routed.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
GetEndptByLid );<o:p></o:p></P>
<P class=MsoNormal>+ *pp_src =
__endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByLid );<o:p></o:p></P>
<P class=MsoNormal>+ *pp_dst =
p_port->p_local_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
*pp_dst );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( *pp_src && !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
&&<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Update the QPN for the endpoint. */<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></P>
<P
class=MsoNormal>-//
(*pp_src)->qpn = p_wc->recv.ud.remote_qp;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( *pp_src &&
!ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
&&<o:p></o:p></P>
<P class=MsoNormal>+ (*pp_src)->qpn
!= p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Update the QPN
for the endpoint. */<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+// (*pp_src)->qpn =
p_wc->recv.ud.remote_qp;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( *pp_src && *pp_dst )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Recv:\n"<o:p></o:p></P>
<P
class=MsoNormal>-
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P
class=MsoNormal>-
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( *pp_src && *pp_dst
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Recv:\n"<o:p></o:p></P>
<P
class=MsoNormal>+
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P
class=MsoNormal>+
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_dst
)->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static int32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_filter(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_qlist_t*
const
p_done_list,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_qlist_t*
const
p_bad_list )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_wc_t*
const
p_done_wc_list,<o:p></o:p></P>
<P class=MsoNormal>+
OUT cl_qlist_t*
const
p_done_list,<o:p></o:p></P>
<P class=MsoNormal>+
OUT cl_qlist_t*
const p_bad_list
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_wc_t
*p_wc;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_pkt_t
*p_ipoib;<o:p></o:p></P>
<P
class=MsoNormal>-
eth_pkt_t
*p_eth;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t
*p_src, *p_dst;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
len;<o:p></o:p></P>
<P
class=MsoNormal>-
int32_t
recv_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetRecvEndpts );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvGen );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvTcp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvDhcp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RecvArp );<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_recv_desc_t *p_desc;<o:p></o:p></P>
<P class=MsoNormal>+
ib_wc_t
*p_wc;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_pkt_t
*p_ipoib;<o:p></o:p></P>
<P class=MsoNormal>+
eth_pkt_t
*p_eth;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t
*p_src, *p_dst;<o:p></o:p></P>
<P class=MsoNormal>+
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
len;<o:p></o:p></P>
<P class=MsoNormal>+
int32_t
recv_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetRecvEndpts
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvGen );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvTcp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvUdp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvDhcp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RecvArp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
for( p_wc = p_done_wc_list; p_wc; p_wc = p_wc->p_next )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P
class=MsoNormal>-
recv_cnt++;<o:p></o:p></P>
<P class=MsoNormal>+ for( p_wc = p_done_wc_list; p_wc; p_wc =
p_wc->p_next )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P class=MsoNormal>+
recv_cnt++;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed completion %s (vendor specific %#x)\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status
),<o:p></o:p></P>
<P
class=MsoNormal>-
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Flushed completion %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ))
);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Dereference the port object on behalf of the failed receive.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></P>
<P
class=MsoNormal>-
continue;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed completion %s (vendor specific %#x)\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status
),<o:p></o:p></P>
<P
class=MsoNormal>+
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Flushed completion %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ))
);<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0
);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
/* Dereference the port object on behalf of the failed receive.
*/<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></P>
<P
class=MsoNormal>+
continue;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
len = p_wc->length - sizeof(ib_grh_t);<o:p></o:p></P>
<P class=MsoNormal>+ len =
p_wc->length - sizeof(ib_grh_t);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( len < sizeof(ipoib_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received ETH packet < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P
class=MsoNormal>-
continue;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( len <
sizeof(ipoib_hdr_t) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received ETH packet < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P
class=MsoNormal>+
continue;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if((len - sizeof(ipoib_hdr_t)) >
p_port->p_adapter->params.payload_mtu)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></P>
<P
class=MsoNormal>-
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P
class=MsoNormal>-
continue;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Successful completion. Get the receive information. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_CSUM_MASK ) >> 8 );<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->len = len + 14 - 4 ;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetRecvEndpts );<o:p></o:p></P>
<P
class=MsoNormal>-
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts
);<o:p></o:p></P>
<P class=MsoNormal>+ if((len -
sizeof(ipoib_hdr_t)) >
p_port->p_adapter->params.payload_mtu)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></P>
<P
class=MsoNormal>+
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></P>
<P
class=MsoNormal>+
continue;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Successful
completion. Get the receive information. */<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_CSUM_MASK ) >> 8 );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->len =
len + 14 - 4 ;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
GetRecvEndpts );<o:p></o:p></P>
<P class=MsoNormal>+
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetRecvEndpts );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib = &p_desc->buf.ib.pkt;<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth = &p_desc->buf.eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>-#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib = &p_desc->p_buf->ib.pkt;<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth = &p_desc->p_buf->eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>-#endif /*IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ p_ipoib =
&p_desc->buf.ib.pkt;<o:p></o:p></P>
<P class=MsoNormal>+ p_eth =
&p_desc->buf.eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>+#else /* IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal>+ p_ipoib =
&p_desc->p_buf->ib.pkt;<o:p></o:p></P>
<P class=MsoNormal>+ p_eth =
&p_desc->p_buf->eth.pkt;<o:p></o:p></P>
<P class=MsoNormal>+#endif /*IPOIB_INLINE_RECV */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_src )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* "This is not the packet you're looking for" - don't update<o:p></o:p></P>
<P
class=MsoNormal>-
* receive statistics, the packet never happened.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></P>
<P
class=MsoNormal>-
continue;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_src
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></P>
<P
class=MsoNormal>+
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) )
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* "This is not the packet you're looking for" - don't update<o:p></o:p></P>
<P
class=MsoNormal>+
* receive statistics, the packet never happened.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></P>
<P class=MsoNormal>+
continue;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_ipoib->hdr.type )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P
class=MsoNormal>-
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received IP packet < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ switch(
p_ipoib->hdr.type )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P
class=MsoNormal>+
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received IP packet < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvTcp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></P>
<P
class=MsoNormal>+
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( RecvTcp );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* First packet of a UDP transfer. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( len <<o:p></o:p></P>
<P
class=MsoNormal>-
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received UDP packet < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
/* First packet of a UDP transfer. */<o:p></o:p></P>
<P
class=MsoNormal>+
if( len <<o:p></o:p></P>
<P
class=MsoNormal>+
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received UDP packet < min
size\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Check if DHCP conversion is required. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P
class=MsoNormal>-
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></P>
<P
class=MsoNormal>-
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_PROXY_SERVER
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P
class=MsoNormal>-
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_ipoib->type.ip.prot.udp.hdr.src_port ==
DHCP_PORT_PROXY_SERVER))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received DHCP < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></P>
<P
class=MsoNormal>-
// If there are IP options in this message, we are in trouble in any
case<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
break;
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvDhcp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>+
/* Check if DHCP conversion is required. */<o:p></o:p></P>
<P
class=MsoNormal>+
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER
&&<o:p></o:p></P>
<P
class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P
class=MsoNormal>+
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT
&&<o:p></o:p></P>
<P
class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></P>
<P class=MsoNormal>+
(p_ipoib->type.ip.prot.udp.hdr.dst_port
== DHCP_PORT_PROXY_SERVER &&<o:p></o:p></P>
<P
class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></P>
<P
class=MsoNormal>+
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT
&&<o:p></o:p></P>
<P
class=MsoNormal>+
p_ipoib->type.ip.prot.udp.hdr.src_port ==
DHCP_PORT_PROXY_SERVER))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></P>
<P
class=MsoNormal>+
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received DHCP < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></P>
<P
class=MsoNormal>+
// If there are IP options in this message, we are in trouble in any
case<o:p></o:p></P>
<P
class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>+
break;
<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( RecvDhcp );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( RecvUdp );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P class=MsoNormal>+
cl_perf_stop(
&p_port->p_adapter->perf, RecvUdp );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P
class=MsoNormal>-
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received ARP < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvArp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvArp );<o:p></o:p></P>
<P
class=MsoNormal>-
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P
class=MsoNormal>+
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("Received
ARP < min size\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
status = IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( RecvArp );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst
);<o:p></o:p></P>
<P class=MsoNormal>+
cl_perf_stop(
&p_port->p_adapter->perf, RecvArp );<o:p></o:p></P>
<P
class=MsoNormal>+
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RecvGen );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
/* Unfiltered. Setup the ethernet header and report. */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( RecvGen );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Update stats. */<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Dereference the port object on behalf of the failed receive.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ip_stat_sel_t
ip_stat;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->len =<o:p></o:p></P>
<P
class=MsoNormal>-
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_dst->h_mcast)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></P>
<P
class=MsoNormal>-
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></P>
<P
class=MsoNormal>-
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></P>
<P
class=MsoNormal>-
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 );
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* Update stats. */<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
/* Dereference the port object on behalf of the failed receive.
*/<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ip_stat_sel_t
ip_stat;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->len =<o:p></o:p></P>
<P
class=MsoNormal>+
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_dst->h_mcast)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>+
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>+
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>+
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></P>
<P
class=MsoNormal>+
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></P>
<P
class=MsoNormal>+
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></P>
<P
class=MsoNormal>+
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 );
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return recv_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return recv_cnt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_gen(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_src || !p_dst )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received packet with no matching endpoints.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_NOT_DONE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_src || !p_dst )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received packet with no matching endpoints.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Fill in the ethernet header. Note that doing so will
overwrite<o:p></o:p></P>
<P
class=MsoNormal>-
* the IPoIB header, so start by moving the information from the
IPoIB<o:p></o:p></P>
<P
class=MsoNormal>-
* header.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.type = p_ipoib->hdr.type;<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.src = p_src->mac;<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.dst = p_dst->mac;<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Fill in the ethernet
header. Note that doing so will overwrite<o:p></o:p></P>
<P class=MsoNormal>+ * the IPoIB header, so start by
moving the information from the IPoIB<o:p></o:p></P>
<P class=MsoNormal>+ * header.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ p_eth->hdr.type =
p_ipoib->hdr.type;<o:p></o:p></P>
<P class=MsoNormal>+ p_eth->hdr.src =
p_src->mac;<o:p></o:p></P>
<P class=MsoNormal>+ p_eth->hdr.dst =
p_dst->mac;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_eth->hdr.dst.addr[0] == 1 && <o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.dst.addr[2] == 0x5E) <o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_dst->h_mcast)<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst->is_in_use = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ if ( p_eth->hdr.dst.addr[0] == 1
&& <o:p></o:p></P>
<P class=MsoNormal>+
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P class=MsoNormal>+
p_eth->hdr.dst.addr[2] == 0x5E) <o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></P>
<P class=MsoNormal>+
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if (p_dst->h_mcast)<o:p></o:p></P>
<P class=MsoNormal>+
p_dst->is_in_use = TRUE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_dhcp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
dhcp_pkt_t
*p_dhcp;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
*p_option;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
*p_cid = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
msg = 0;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
dhcp_pkt_t
*p_dhcp;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
*p_option;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
*p_cid = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
msg = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Create the ethernet header. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Create the ethernet header.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status = __recv_gen( p_ipoib, p_eth,
p_src, p_dst );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Fixup the payload. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_dhcp = &p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_dhcp->op != DHCP_REQUEST && p_dhcp->op != DHCP_REPLY
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalid DHCP op code.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Fixup the payload. */<o:p></o:p></P>
<P class=MsoNormal>+ p_dhcp =
&p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></P>
<P class=MsoNormal>+ if( p_dhcp->op != DHCP_REQUEST
&& p_dhcp->op != DHCP_REPLY )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalid DHCP op code.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Find the client identifier option, making sure to skip<o:p></o:p></P>
<P
class=MsoNormal>-
* the "magic cookie".<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_option = &p_dhcp->options[0];<o:p></o:p></P>
<P
class=MsoNormal>-
if ( *(uint32_t *)p_option != DHCP_COOKIE )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("DHCP cookie corrupted.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_PARAMETER;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Find the client identifier
option, making sure to skip<o:p></o:p></P>
<P class=MsoNormal>+ * the "magic
cookie".<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ p_option =
&p_dhcp->options[0];<o:p></o:p></P>
<P class=MsoNormal>+ if ( *(uint32_t *)p_option != DHCP_COOKIE
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("DHCP cookie corrupted.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_option = &p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></P>
<P
class=MsoNormal>-
while( *p_option != DHCP_OPT_END && p_option <
&p_dhcp->options[312] )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
switch( *p_option )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCP_OPT_PAD:<o:p></o:p></P>
<P
class=MsoNormal>-
p_option++;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ p_option =
&p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></P>
<P class=MsoNormal>+ while( *p_option != DHCP_OPT_END
&& p_option < &p_dhcp->options[312] )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ switch( *p_option
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
DHCP_OPT_PAD:<o:p></o:p></P>
<P
class=MsoNormal>+
p_option++;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case DHCP_OPT_MSG:<o:p></o:p></P>
<P
class=MsoNormal>-
msg = p_option[2];<o:p></o:p></P>
<P
class=MsoNormal>-
p_option += 3;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
DHCP_OPT_MSG:<o:p></o:p></P>
<P
class=MsoNormal>+
msg = p_option[2];<o:p></o:p></P>
<P
class=MsoNormal>+
p_option += 3;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid = p_option;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal>+ case
DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid = p_option;<o:p></o:p></P>
<P
class=MsoNormal>+
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* All other options have a length byte following the option code.<o:p></o:p></P>
<P
class=MsoNormal>-
* Offset by the length to get to the next option.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* All other options have a length byte following the option code.<o:p></o:p></P>
<P
class=MsoNormal>+
* Offset by the length to get to the next option.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( msg )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* message from client */<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPDISCOVER:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPREQUEST:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPDECLINE:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPRELEASE:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPINFORM:<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_cid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to find required Client-identifier option.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalid hardware address type.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
/* message from DHCP server */<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPOFFER:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPACK:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPNAK:<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ switch( msg )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* message from client */<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPDISCOVER:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPREQUEST:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPDECLINE:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPRELEASE:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPINFORM:<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_cid
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to find required Client-identifier option.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalid hardware address type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ /* message from DHCP server
*/<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPOFFER:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPACK:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPNAK:<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalide message type.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_PARAMETER;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth->type.ip.prot.udp.hdr.chksum = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_dhcp->htype = DHCP_HW_TYPE_ETH;<o:p></o:p></P>
<P
class=MsoNormal>-
p_dhcp->hlen = HW_ADDR_LEN;<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalide message type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_eth->type.ip.prot.udp.hdr.chksum =
0;<o:p></o:p></P>
<P class=MsoNormal>+ p_dhcp->htype =
DHCP_HW_TYPE_ETH;<o:p></o:p></P>
<P class=MsoNormal>+ p_dhcp->hlen =
HW_ADDR_LEN;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_cid ) /* from client */<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Validate that the length and type of the option is as required.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("DHCP CID received is:"));<o:p></o:p></P>
<P
class=MsoNormal>-
for (int i=0; i < coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_cid[1] != coIPoIB_CID_Len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Client-identifier length is not equal to %d as required.\n",coIPoIB_CID_Len)
);<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_cid[2] != coIPoIB_HwTypeIB)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Client-identifier type is %d <> %d and wrong \n", p_cid[2],
coIPoIB_HwTypeIB) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Copy the GID value from the option so that we can make aligned<o:p></o:p></P>
<P
class=MsoNormal>-
* accesses to the contents.<o:p></o:p></P>
<P
class=MsoNormal>-
* Recover CID to standard type.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[1] = sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[2] = DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></P>
<P
class=MsoNormal>-
//Copy the GUID to the 3-d byte of CID<o:p></o:p></P>
<P
class=MsoNormal>-
RtlMoveMemory( &p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof
(ib_net64_t)], sizeof (ib_net64_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
// Clear the rest<o:p></o:p></P>
<P
class=MsoNormal>-
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof
(ib_net64_t), 0);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_cid ) /* from client
*/<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Validate that
the length and type of the option is as required. */<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("DHCP CID received is:"));<o:p></o:p></P>
<P class=MsoNormal>+ for (int i=0; i
< coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( p_cid[1] !=
coIPoIB_CID_Len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Client-identifier length is not equal to %d as required.\n",coIPoIB_CID_Len)
);<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( p_cid[2] !=
coIPoIB_HwTypeIB)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Client-identifier type is %d <> %d and wrong \n", p_cid[2],
coIPoIB_HwTypeIB) );<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Copy the
GID value from the option so that we can make aligned<o:p></o:p></P>
<P class=MsoNormal>+ * accesses
to the contents.<o:p></o:p></P>
<P class=MsoNormal>+ * Recover
CID to standard type.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_cid[1] =
sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></P>
<P class=MsoNormal>+ p_cid[2] =
DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></P>
<P class=MsoNormal>+ //Copy the GUID
to the 3-d byte of CID<o:p></o:p></P>
<P class=MsoNormal>+ RtlMoveMemory(
&p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof (ib_net64_t)], sizeof
(ib_net64_t) );<o:p></o:p></P>
<P class=MsoNormal>+ // Clear the
rest<o:p></o:p></P>
<P class=MsoNormal>+
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof
(ib_net64_t), 0);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
RtlCopyMemory( p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac)
);<o:p></o:p></P>
<P
class=MsoNormal>-
RtlFillMemory( &p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></P>
<P
class=MsoNormal>-
( sizeof(p_dhcp->chaddr) -
sizeof(p_src->mac) ), 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ RtlCopyMemory(
p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );<o:p></o:p></P>
<P class=MsoNormal>+ RtlFillMemory(
&p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></P>
<P
class=MsoNormal>+
( sizeof(p_dhcp->chaddr) - sizeof(p_src->mac) ), 0 );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_arp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t**
const
pp_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_wc_t*
const
p_wc,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t** const pp_src,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
arp_pkt_t
*p_arp;<o:p></o:p></P>
<P
class=MsoNormal>-
const ipoib_arp_pkt_t *p_ib_arp;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_gid_t
gid;<o:p></o:p></P>
<P
class=MsoNormal>-
mac_addr_t
mac;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_hw_addr_t
null_hw = {0};<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
cm_capable = 0;<o:p></o:p></P>
<P class=MsoNormal>+
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
arp_pkt_t
*p_arp;<o:p></o:p></P>
<P class=MsoNormal>+ const ipoib_arp_pkt_t
*p_ib_arp;<o:p></o:p></P>
<P class=MsoNormal>+
ib_gid_t
gid;<o:p></o:p></P>
<P class=MsoNormal>+
mac_addr_t
mac;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_hw_addr_t null_hw =
{0};<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
cm_capable = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_dst )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Unknown destination endpoint\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_dst )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Unknown destination endpoint\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp = &p_ipoib->type.arp;<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp = &p_eth->type.arp;<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp =
&p_ipoib->type.arp;<o:p></o:p></P>
<P class=MsoNormal>+ p_arp =
&p_eth->type.arp;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_ib_arp->hw_type != ARP_HW_TYPE_IB )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ARP hardware type is not IB\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_ib_arp->hw_type !=
ARP_HW_TYPE_IB )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ARP hardware type is not IB\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_ib_arp->hw_size !=
sizeof(ipoib_hw_addr_t) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ARP protocal type not IP\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_ib_arp->prot_type !=
ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("ARP protocal type not IP\n")
);<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_SETTING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cm_capable = ipoib_addr_get_flags( &p_ib_arp->src_hw );<o:p></o:p></P>
<P class=MsoNormal>+ cm_capable = ipoib_addr_get_flags(
&p_ib_arp->src_hw );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* If we don't have a source, lookup the endpoint specified in the
payload.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( !*pp_src )<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid
);<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * If we don't have a source, lookup
the endpoint specified in the payload.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ if( !*pp_src )<o:p></o:p></P>
<P class=MsoNormal>+ *pp_src =
__endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* If the endpoint exists for the GID, make sure<o:p></o:p></P>
<P
class=MsoNormal>-
* the dlid and qpn match the arp.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( *pp_src )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_memcmp( &(*pp_src)->dgid,
&p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(ib_gid_t) ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* GIDs for the endpoint are different. The ARP must<o:p></o:p></P>
<P
class=MsoNormal>-
* have been proxied. Dereference it.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( (*pp_src)->dlid &&<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if ( ! ((*pp_src)->dlid)) {<o:p></o:p></P>
<P
class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( &p_ib_arp->src_hw
) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * If the endpoint exists for the
GID, make sure<o:p></o:p></P>
<P class=MsoNormal>+ * the dlid and qpn match the
arp.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ if( *pp_src )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_memcmp(
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P
class=MsoNormal>+
sizeof(ib_gid_t) ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* GIDs for the endpoint are different. The ARP must<o:p></o:p></P>
<P
class=MsoNormal>+
* have been proxied. Dereference it.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if(
(*pp_src)->dlid &&<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if ( !
((*pp_src)->dlid)) {<o:p></o:p></P>
<P
class=MsoNormal>+
/* Out of date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if(
ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></P>
<P
class=MsoNormal>+
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P class=MsoNormal>+
/* Out of date!
Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if(
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
/* Out of
date! Destroy the endpoint and replace it. */<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Do we need to create an endpoint for this GID? */<o:p></o:p></P>
<P
class=MsoNormal>-
if( !*pp_src )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Copy the src GID to allow aligned access */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t)
);<o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_mac_from_guid( gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P
class=MsoNormal>-
if (status == IB_INVALID_GUID_MASK)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalid GUID mask received, rejecting it") );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX,
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Create the endpoint.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P
class=MsoNormal>-
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw )
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Do we need to create an endpoint for
this GID? */<o:p></o:p></P>
<P class=MsoNormal>+ if( !*pp_src )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Copy the src
GID to allow aligned access */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy(
&gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></P>
<P class=MsoNormal>+ status =
ipoib_mac_from_guid( gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></P>
<P class=MsoNormal>+ if (status ==
IB_INVALID_GUID_MASK)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalid GUID mask received, rejecting it") );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX,
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if( status
!= IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Create
the endpoint.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ *pp_src =
ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P
class=MsoNormal>+
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw )
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !*pp_src )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !*pp_src
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_endpt_create failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_insert return %s \n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_insert return %s \n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></P>
<P class=MsoNormal>+ (*pp_src)->cm_flag =
cm_capable;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( !cl_memcmp(<o:p></o:p></P>
<P
class=MsoNormal>-
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) )
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
||<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw )
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( !cl_memcmp(<o:p></o:p></P>
<P class=MsoNormal>+
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) )
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( ipoib_is_voltaire_router_gid(
&(*pp_src)->dgid ) ||<o:p></o:p></P>
<P class=MsoNormal>+ (*pp_src)->qpn
== ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->op == ARP_OP_REQ &&<o:p></o:p></P>
<P
class=MsoNormal>-
cm_capable == IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* if we've got ARP request and RC flag is set, <o:p></o:p></P>
<P
class=MsoNormal>-
save SID for connect REQ to be sent in ARP reply<o:p></o:p></P>
<P
class=MsoNormal>-
when requestor's path get resolved */<o:p></o:p></P>
<P
class=MsoNormal>-
if( endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_set_sid( <o:p></o:p></P>
<P
class=MsoNormal>-
&(*pp_src)->conn.service_id,<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->op
== ARP_OP_REQ &&<o:p></o:p></P>
<P class=MsoNormal>+ cm_capable ==
IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* if we've got
ARP request and RC flag is set, <o:p></o:p></P>
<P class=MsoNormal>+ save SID for
connect REQ to be sent in ARP reply<o:p></o:p></P>
<P class=MsoNormal>+ when requestor's
path get resolved */<o:p></o:p></P>
<P class=MsoNormal>+ if(
endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_addr_set_sid( <o:p></o:p></P>
<P
class=MsoNormal>+
&(*pp_src)->conn.service_id,<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> #if 0 //DBG<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC:
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></P>
<P
class=MsoNormal>-
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></P>
<P
class=MsoNormal>-
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC:
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></P>
<P
class=MsoNormal>+
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></P>
<P
class=MsoNormal>+
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></P>
<P
class=MsoNormal>+
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Now swizzle the data. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->hw_type = ARP_HW_TYPE_ETH;<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->hw_size = sizeof(mac_addr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->src_hw = (*pp_src)->mac;<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->src_ip = p_ib_arp->src_ip;<o:p></o:p></P>
<P class=MsoNormal>+ /* Now swizzle the data.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_arp->hw_type =
ARP_HW_TYPE_ETH;<o:p></o:p></P>
<P class=MsoNormal>+ p_arp->hw_size =
sizeof(mac_addr_t);<o:p></o:p></P>
<P class=MsoNormal>+ p_arp->src_hw =
(*pp_src)->mac;<o:p></o:p></P>
<P class=MsoNormal>+ p_arp->src_ip =
p_ib_arp->src_ip;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_memcmp( &p_ib_arp->dst_hw, &null_hw, sizeof(ipoib_hw_addr_t) )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_memcmp( &p_dst->dgid, &p_ib_arp->dst_hw.gid,
sizeof(ib_gid_t) ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* We received bcast ARP packet that means<o:p></o:p></P>
<P
class=MsoNormal>-
* remote port lets everyone know it was changed IP/MAC<o:p></o:p></P>
<P
class=MsoNormal>-
* or just activated<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_memcmp( &p_ib_arp->dst_hw,
&null_hw, sizeof(ipoib_hw_addr_t) ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_memcmp(
&p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t) )
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* We received bcast ARP packet that means<o:p></o:p></P>
<P class=MsoNormal>+
* remote port lets everyone know it
was changed IP/MAC<o:p></o:p></P>
<P
class=MsoNormal>+
* or just activated<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Guy: TODO: Check why this check fails in case of Voltaire IPR
*/<o:p></o:p></P>
<P
class=MsoNormal>+
/* Guy: TODO: Check why this check fails in case of Voltaire IPR
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
&&<o:p></o:p></P>
<P
class=MsoNormal>-
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ARP: is not ARP MCAST\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
&&<o:p></o:p></P>
<P
class=MsoNormal>+
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("ARP:
is not ARP MCAST\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_INVALID_SETTING;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* we don't care what receiver ip addr is,<o:p></o:p></P>
<P
class=MsoNormal>-
* as long as OS' ARP table is global ???<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->dst_ip = (net32_t)0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else /* we've got reply to our ARP request */<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->dst_hw = p_dst->mac;<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw )
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else /* we got ARP reqeust */<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P
class=MsoNormal>+
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* we don't care what receiver ip addr is,<o:p></o:p></P>
<P
class=MsoNormal>+
* as long as OS' ARP table is global ???<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
p_arp->dst_ip = (net32_t)0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else /* we've got
reply to our ARP request */<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_arp->dst_hw = p_dst->mac;<o:p></o:p></P>
<P
class=MsoNormal>+
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw )
);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else /* we got ARP reqeust
*/<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr(
&p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ p_arp->dst_ip
= p_ib_arp->dst_ip;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Create the ethernet header. Note that this is done last so
that<o:p></o:p></P>
<P
class=MsoNormal>-
* we have a chance to create a new endpoint.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Create the ethernet header.
Note that this is done last so that<o:p></o:p></P>
<P class=MsoNormal>+ * we have a chance to create a new
endpoint.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ status = __recv_gen( p_ipoib, p_eth,
*pp_src, p_dst );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__recv_gen returned %s.\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_recv_desc_t*
const p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
NET_BUFFER_LIST**
const
pp_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_recv_desc_t* const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+
OUT NET_BUFFER_LIST**
const pp_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
pkt_filter;<o:p></o:p></P>
<P
class=MsoNormal>-
//NDIS60<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
chksum;<o:p></o:p></P>
<P
class=MsoNormal>-
//NDIS_TCP_IP_CHECKSUM_PACKET_INFO
chksum;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
pkt_filter;<o:p></o:p></P>
<P class=MsoNormal>+ //NDIS60<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO chksum;<o:p></o:p></P>
<P class=MsoNormal>+ //NDIS_TCP_IP_CHECKSUM_PACKET_INFO
chksum;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetNdisPkt );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetNdisPkt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter = p_port->p_adapter->packet_filter;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Check the packet filter. */<o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_desc->type )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
case PKT_TYPE_UCAST:<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* OK to report. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case PKT_TYPE_BCAST:<o:p></o:p></P>
<P
class=MsoNormal>-
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* OK to report. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received BCAST PKT.\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case PKT_TYPE_MCAST:<o:p></o:p></P>
<P
class=MsoNormal>-
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* OK to report. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ pkt_filter =
p_port->p_adapter->packet_filter;<o:p></o:p></P>
<P class=MsoNormal>+ /* Check the packet filter.
*/<o:p></o:p></P>
<P class=MsoNormal>+ switch( p_desc->type )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+ case PKT_TYPE_UCAST:<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P
class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></P>
<P
class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></P>
<P
class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* OK to report. */<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case PKT_TYPE_BCAST:<o:p></o:p></P>
<P class=MsoNormal>+ if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P
class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* OK to report. */<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received BCAST PKT.\n"));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case PKT_TYPE_MCAST:<o:p></o:p></P>
<P class=MsoNormal>+ if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></P>
<P
class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></P>
<P
class=MsoNormal>+
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* OK to report. */<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received UCAST PKT.\n"));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Return the receive descriptor to the pool. */<o:p></o:p></P>
<P
class=MsoNormal>-
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Packet filter doesn't match receive. Dropping.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Return IB_NOT_DONE since the packet has been completed,<o:p></o:p></P>
<P
class=MsoNormal>-
* but has not consumed an array entry.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_NOT_DONE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Return the
receive descriptor to the pool. */<o:p></o:p></P>
<P class=MsoNormal>+
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Packet filter doesn't match receive. Dropping.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Return
IB_NOT_DONE since the packet has been completed,<o:p></o:p></P>
<P class=MsoNormal>+ * but has
not consumed an array entry.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_NOT_DONE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetNdisPkt );<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_net_buffer_list = __buf_mgr_get_NBL( p_port, p_desc );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !*pp_net_buffer_list )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( GetNdisPkt
);<o:p></o:p></P>
<P class=MsoNormal>+ *pp_net_buffer_list = __buf_mgr_get_NBL(
p_port, p_desc );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></P>
<P class=MsoNormal>+ if( !*pp_net_buffer_list )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
chksum.Value = 0;<o:p></o:p></P>
<P class=MsoNormal>+ chksum.Value = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PNET_BUFFER NetBuffer =
NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_DATA_LENGTH(NetBuffer) = p_desc->len;<o:p></o:p></P>
<P class=MsoNormal>+ PNET_BUFFER NetBuffer =
NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+ NET_BUFFER_DATA_LENGTH(NetBuffer) =
p_desc->len;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
case CSUM_DISABLED:<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =
<o:p></o:p></P>
<P
class=MsoNormal>-
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case CSUM_ENABLED:<o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the checksums directly from packet information. */<o:p></o:p></P>
<P
class=MsoNormal>-
/* In this case, no one of cheksum's cat get false value */<o:p></o:p></P>
<P
class=MsoNormal>-
/* If hardware checksum failed or wasn't calculated, NDIS will recalculate it
again */<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo)
=<o:p></o:p></P>
<P
class=MsoNormal>-
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case CSUM_BYPASS:<o:p></o:p></P>
<P
class=MsoNormal>-
/* Flag the checksums as having been calculated. */<o:p></o:p></P>
<P
class=MsoNormal>-
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></P>
<P
class=MsoNormal>-
chksum.Receive.UdpChecksumSucceeded = <o:p></o:p></P>
<P
class=MsoNormal>-
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo)
=<o:p></o:p></P>
<P
class=MsoNormal>-
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ switch(
p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( FALSE
);<o:p></o:p></P>
<P class=MsoNormal>+ case
CSUM_DISABLED:<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =
<o:p></o:p></P>
<P class=MsoNormal>+
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
CSUM_ENABLED:<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the
checksums directly from packet information. */<o:p></o:p></P>
<P class=MsoNormal>+ /* In this case,
no one of cheksum's cat get false value */<o:p></o:p></P>
<P class=MsoNormal>+ /* If hardware
checksum failed or wasn't calculated, NDIS will recalculate it again
*/<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_INFO(*pp_net_buffer_list,
TcpIpChecksumNetBufferListInfo) =<o:p></o:p></P>
<P
class=MsoNormal>+
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
CSUM_BYPASS:<o:p></o:p></P>
<P class=MsoNormal>+ /* Flag the
checksums as having been calculated. */<o:p></o:p></P>
<P class=MsoNormal>+
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></P>
<P class=MsoNormal>+
chksum.Receive.UdpChecksumSucceeded = <o:p></o:p></P>
<P class=MsoNormal>+
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo)
=<o:p></o:p></P>
<P class=MsoNormal>+
(void*)(uintn_t)chksum.Value;<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static uint32_t<o:p></o:p></P>
<P class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
cl_qlist_t*
p_done_list OPTIONAL,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
int32_t*
const
p_discarded)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
cl_qlist_t*
p_done_list OPTIONAL,<o:p></o:p></P>
<P class=MsoNormal>+
OUT int32_t*
const
p_discarded)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_list_item_t
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_recv_desc_t
*p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
i = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PreparePkt );<o:p></o:p></P>
<P class=MsoNormal>+
cl_list_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_recv_desc_t *p_desc;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
i = 0;<o:p></o:p></P>
<P class=MsoNormal>+
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PreparePkt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*p_discarded = 0;<o:p></o:p></P>
<P class=MsoNormal>+ *p_discarded = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Move any existing receives to the head of p_done_list to preserve ordering.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_done_list ) {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
p_done_list = &p_port->recv_mgr.done_list;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_item != cl_qlist_end( p_done_list ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc = (ipoib_recv_desc_t*)p_item;<o:p></o:p></P>
<P class=MsoNormal>+ /* Move any existing receives to the head
of p_done_list to preserve ordering. */<o:p></o:p></P>
<P class=MsoNormal>+ if ( p_done_list ) {<o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list
);<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+ p_done_list =
&p_port->recv_mgr.done_list;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qlist_remove_head(
p_done_list );<o:p></o:p></P>
<P class=MsoNormal>+ while( p_item != cl_qlist_end(
p_done_list ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_desc =
(ipoib_recv_desc_t*)p_item;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PreparePkt );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __recv_mgr_prepare_NBL( p_port, p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PreparePkt );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status == IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
PreparePkt );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__recv_mgr_prepare_NBL( p_port, p_desc,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PreparePkt );<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if (i) {<o:p></o:p></P>
<P
class=MsoNormal>-
// Link NBLs together<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) =
<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
i++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( status == IB_NOT_DONE )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
(*p_discarded)++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Put all completed receives on the port's done list. */<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
if (i) {<o:p></o:p></P>
<P
class=MsoNormal>+
// Link NBLs together<o:p></o:p></P>
<P
class=MsoNormal>+
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) =
<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
i++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if( status
== IB_NOT_DONE )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
(*p_discarded)++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
/* Put all completed receives on the port's done list. */<o:p></o:p></P>
<P
class=MsoNormal>+
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list
);<o:p></o:p></P>
<P
class=MsoNormal>+
} else {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qlist_remove_head( p_done_list );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></P>
<P
class=MsoNormal>-
return i;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_RECV
);<o:p></o:p></P>
<P class=MsoNormal>+ return i;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -3234,180 +3281,180 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->send_mgr.depth = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_construct( &p_port->send_mgr.send_pool );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_desc = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ p_port->send_mgr.depth =
0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init(
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ cl_qpool_construct(
&p_port->send_mgr.send_pool );<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_desc = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER(IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ cl_status_t
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER(IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
static const size_t cPoolDeltaSize(1024);<o:p></o:p></P>
<P
class=MsoNormal>-
static const ULONG
MaxNumBuffers(16384);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the pool for async NETBUF flow (process_sg_list) */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_qpool_init( &p_port->send_mgr.sg_pool,<o:p></o:p></P>
<P
class=MsoNormal>-
MaxNumBuffers,<o:p></o:p></P>
<P
class=MsoNormal>-
0, cPoolDeltaSize, sizeof(cl_pool_item_t) +
p_port->p_adapter->sg_list_size, NULL, NULL, p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ static const size_t
cPoolDeltaSize(1024);<o:p></o:p></P>
<P class=MsoNormal>+ static const ULONG
MaxNumBuffers(16384);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the pool for async NETBUF
flow (process_sg_list) */<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_qpool_init(
&p_port->send_mgr.sg_pool,<o:p></o:p></P>
<P class=MsoNormal>+
MaxNumBuffers,<o:p></o:p></P>
<P class=MsoNormal>+ 0,
cPoolDeltaSize, sizeof(cl_pool_item_t) + p_port->p_adapter->sg_list_size,
NULL, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_qpool_init( &p_port->send_mgr.send_pool,<o:p></o:p></P>
<P
class=MsoNormal>-
MaxNumBuffers,<o:p></o:p></P>
<P
class=MsoNormal>-
0, cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port
);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status) );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_status = cl_qpool_init(
&p_port->send_mgr.send_pool,<o:p></o:p></P>
<P class=MsoNormal>+
MaxNumBuffers,<o:p></o:p></P>
<P class=MsoNormal>+ 0,
cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
cl_status) );<o:p></o:p></P>
<P class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//This send descriptor can't be allocated on the stack because of boundary
violation !!!<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_desc = <o:p></o:p></P>
<P
class=MsoNormal>-
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></P>
<P
class=MsoNormal>-
if (!p_port->p_desc) {<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Allocation of send descriptor failed\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ //This send descriptor can't be allocated
on the stack because of boundary violation !!!<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_desc = <o:p></o:p></P>
<P
class=MsoNormal>+
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></P>
<P class=MsoNormal>+ if (!p_port->p_desc) {<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO
EVENT_IPOIB_SEND_POOL<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Allocation of send descriptor failed\n") );<o:p></o:p></P>
<P class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void <o:p></o:p></P>
<P class=MsoNormal> __pending_list_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_list_item_t
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG *s_buf;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></P>
<P class=MsoNormal>+
cl_list_item_t *p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG
*s_buf;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Complete any pending packets. */<o:p></o:p></P>
<P
class=MsoNormal>-
for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this
casting<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_port == p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+ /* Complete any pending packets.
*/<o:p></o:p></P>
<P class=MsoNormal>+ for( p_item = cl_qlist_remove_head(
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ p_item !=
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(s_buf->p_port == p_port);<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//TODO<o:p></o:p></P>
<P
class=MsoNormal>-
//__send_complete_net_buffer(s_buf,
NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf,
NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
//TODO<o:p></o:p></P>
<P class=MsoNormal>+
//__send_complete_net_buffer(s_buf,
NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></P>
<P class=MsoNormal>+
__send_complete_net_buffer(s_buf,
NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
//Destroy pending list and put all the send buffers back to pool<o:p></o:p></P>
<P
class=MsoNormal>-
//The list should be already destroyed at this point<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
__pending_list_destroy(p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ //Destroy pending list and put all the
send buffers back to pool<o:p></o:p></P>
<P class=MsoNormal>+ //The list should be already destroyed at
this point<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+
__pending_list_destroy(p_port);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
// Now, destroy the send pool<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+ // Now, destroy the send
pool<o:p></o:p></P>
<P class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></P>
<P class=MsoNormal>+
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//Now, free port descriptor<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_port->p_desc)<o:p></o:p></P>
<P
class=MsoNormal>-
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></P>
<P class=MsoNormal>+ //Now, free port
descriptor<o:p></o:p></P>
<P class=MsoNormal>+ if (p_port->p_desc)<o:p></o:p></P>
<P class=MsoNormal>+
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//Lookaside list will be destroyed in __buf_mgr_destroy<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ //Lookaside list will be destroyed in
__buf_mgr_destroy<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
const
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG
*s_buf)<o:p></o:p></P>
<P class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
const
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG
*s_buf)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( FilterIp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( FilterArp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendGen );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( FilterIp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( FilterArp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendGen );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* We already checked the ethernet header length, so we know it's
safe<o:p></o:p></P>
<P
class=MsoNormal>-
* to decrement the buf_len without underflowing.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * We already checked the ethernet
header length, so we know it's safe<o:p></o:p></P>
<P class=MsoNormal>+ * to decrement the buf_len without
underflowing.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ buf_len -=
sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_eth_hdr->type )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( FilterIp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterIp );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ switch( p_eth_hdr->type
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case ETH_PROT_TYPE_IP:<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
FilterIp );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterIp );<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( FilterArp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterArp );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ case ETH_PROT_TYPE_ARP:<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
FilterArp );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterArp );<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* The IPoIB spec doesn't define how to send non IP or ARP
packets.<o:p></o:p></P>
<P
class=MsoNormal>-
* Just send the payload and hope for the best.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * The IPoIB
spec doesn't define how to send non IP or ARP packets.<o:p></o:p></P>
<P class=MsoNormal>+ * Just send
the payload and hope for the best.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendGen );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_gen( s_buf, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendGen );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
SendGen );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_gen( s_buf, 0, 0 );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendGen );<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -3416,7 +3463,7 @@<o:p></o:p></P>
<P class=MsoNormal> ULONG <o:p></o:p></P>
<P class=MsoNormal> CopyNetBuffer(<o:p></o:p></P>
<P class=MsoNormal> PNET_BUFFER
NetBuffer,<o:p></o:p></P>
<P class=MsoNormal>-
PUCHAR
pDest<o:p></o:p></P>
<P class=MsoNormal>+
PUCHAR pDest<o:p></o:p></P>
<P class=MsoNormal> ) <o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> ULONG BytesCopied =
0;<o:p></o:p></P>
<P class=MsoNormal>@@ -3429,12 +3476,12 @@<o:p></o:p></P>
<P class=MsoNormal> ULONG Offset =
NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);<o:p></o:p></P>
<P class=MsoNormal> ULONG DataLength =
NET_BUFFER_DATA_LENGTH(NetBuffer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if (DataLength > MAX_LSO_PAYLOAD_MTU) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Can't copy buffer of %d because of 64K limitation\n",
DataLength));<o:p></o:p></P>
<P
class=MsoNormal>-
return 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if (DataLength > MAX_LSO_PAYLOAD_MTU)
{<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Can't copy buffer of %d because of 64K limitation\n",
DataLength));<o:p></o:p></P>
<P class=MsoNormal>+ return
0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> while (CurrentMdl &&
DataLength > 0)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal>@@ -3507,93 +3554,93 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_copy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG
*
s_buf,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
UINT
lso_header_size)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_NB_SG *
s_buf,<o:p></o:p></P>
<P class=MsoNormal>+
IN
UINT
lso_header_size)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
tot_len = 0;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
tot_len = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = <o:p></o:p></P>
<P
class=MsoNormal>-
(send_buf_t *) NdisAllocateFromNPagedLookasideList(
&p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !s_buf->p_send_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
tot_len = CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR)
s_buf->p_send_buf);<o:p></o:p></P>
<P
class=MsoNormal>-
if (tot_len <= lso_header_size) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(tot_len > lso_header_size);<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO Do not copy the ETH header <o:p></o:p></P>
<P
class=MsoNormal>-
/* Setup the work request. */<o:p></o:p></P>
<P
class=MsoNormal>-
int seg_index = lso_header_size ? 0 : 1;<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(s_buf->p_send_buf ==
NULL);<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf = <o:p></o:p></P>
<P class=MsoNormal>+ (send_buf_t *)
NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list
);<o:p></o:p></P>
<P class=MsoNormal>+ if( !s_buf->p_send_buf
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ tot_len =
CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR)
s_buf->p_send_buf);<o:p></o:p></P>
<P class=MsoNormal>+ if (tot_len <= lso_header_size)
{<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(tot_len
> lso_header_size);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ //TODO Do not copy the ETH header
<o:p></o:p></P>
<P class=MsoNormal>+ /* Setup the work request.
*/<o:p></o:p></P>
<P class=MsoNormal>+ int seg_index = lso_header_size ? 0 :
1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[seg_index].vaddr =
cl_get_physaddr(<o:p></o:p></P>
<P
class=MsoNormal>-
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[seg_index].length = tot_len -
lso_header_size;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[seg_index].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = seg_index+1;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[seg_index].vaddr =
cl_get_physaddr(<o:p></o:p></P>
<P class=MsoNormal>+
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[seg_index].length = tot_len -
lso_header_size;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[seg_index].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds =
seg_index+1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_get_eth_hdr(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
PNET_BUFFER
p_net_buffer,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
MDL**
const
pp_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_hdr_t**
const
pp_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
UINT*
p_mdl_len)<o:p></o:p></P>
<P class=MsoNormal>+
IN
PNET_BUFFER
p_net_buffer,<o:p></o:p></P>
<P class=MsoNormal>+
OUT MDL**
const
pp_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_hdr_t**
const
pp_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
UINT*
p_mdl_len)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
PUCHAR
p_head = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ PUCHAR p_head =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_mdl
= NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></P>
<P class=MsoNormal>+ *pp_mdl =
NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>-
if( ! p_head )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Failed to get first buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("NdisQueryMdl failed.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+ if( ! p_head )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Failed to get
first buffer. */<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("NdisQueryMdl failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ULONG MdlDataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></P>
<P
class=MsoNormal>-
*p_mdl_len -= MdlDataOffset; <o:p></o:p></P>
<P class=MsoNormal>+ ULONG MdlDataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></P>
<P class=MsoNormal>+ *p_mdl_len -=
MdlDataOffset; <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( *p_mdl_len < sizeof(eth_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
*p_mdl_len) );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( *p_mdl_len < sizeof(eth_hdr_t)
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
*p_mdl_len) );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_eth_hdr = (eth_hdr_t*)(p_head + MdlDataOffset);<o:p></o:p></P>
<P class=MsoNormal>+ *pp_eth_hdr = (eth_hdr_t*)(p_head +
MdlDataOffset);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Ethernet header:\n"<o:p></o:p></P>
<P
class=MsoNormal>-
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P
class=MsoNormal>-
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P
class=MsoNormal>-
"\tprotocol type: %04X\n",<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></P>
<P
class=MsoNormal>-
cl_ntoh16( (*pp_eth_hdr)->type )) );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P class=MsoNormal>+ ("Ethernet
header:\n"<o:p></o:p></P>
<P class=MsoNormal>+ "\tsrc MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P class=MsoNormal>+ "\tdst MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></P>
<P class=MsoNormal>+ "\tprotocol type:
%04X\n",<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></P>
<P class=MsoNormal>+ cl_ntoh16(
(*pp_eth_hdr)->type )) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -3601,139 +3648,139 @@<o:p></o:p></P>
<P class=MsoNormal> /* Send using the MDL's page information rather than
the SGL. */<o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __send_gen(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_desc_t* const
p_desc )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_desc_t* const p_desc )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
i, j = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
offset;<o:p></o:p></P>
<P
class=MsoNormal>-
MDL
*p_mdl;<o:p></o:p></P>
<P
class=MsoNormal>-
UINT
num_pages, tot_len;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
buf_len;<o:p></o:p></P>
<P
class=MsoNormal>-
PPFN_NUMBER
page_array;<o:p></o:p></P>
<P
class=MsoNormal>-
boolean_t
hdr_done = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
PNET_BUFFER
p_net_buf;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
i, j = 1;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
offset;<o:p></o:p></P>
<P class=MsoNormal>+
MDL
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal>+
UINT
num_pages, tot_len;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
buf_len;<o:p></o:p></P>
<P class=MsoNormal>+
PPFN_NUMBER
page_array;<o:p></o:p></P>
<P class=MsoNormal>+
boolean_t
hdr_done = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
PNET_BUFFER
p_net_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buf = NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryBuffer( p_net_buf, &num_pages, NULL, &p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
&tot_len );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ p_net_buf =
NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></P>
<P class=MsoNormal>+ NdisQueryBuffer( p_net_buf,
&num_pages, NULL, &p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+ &tot_len
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("No buffers associated with packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("No buffers associated with packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Remember that one of the DS entries is reserved for the IPoIB header.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( num_pages >= MAX_SEND_SGE )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Too many buffers to fit in WR ds_array. Copying data.\n")
);<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_copy( p_port, p_desc );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Remember that one of the DS entries is
reserved for the IPoIB header. */<o:p></o:p></P>
<P class=MsoNormal>+ if( num_pages >= MAX_SEND_SGE
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Too many buffers to fit in WR ds_array. Copying data.\n")
);<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_copy( p_port, p_desc );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( tot_len > sizeof(eth_hdr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( tot_len <= p_port->p_adapter->params.xfer_block_size
);<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Assume that the ethernet header is always fully contained<o:p></o:p></P>
<P
class=MsoNormal>-
* in the first page of the first MDL. This makes for much<o:p></o:p></P>
<P
class=MsoNormal>-
* simpler code.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
offset = MmGetMdlByteOffset( p_mdl ) + sizeof(eth_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( offset <= PAGE_SIZE );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( tot_len > sizeof(eth_hdr_t)
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( tot_len <=
p_port->p_adapter->params.xfer_block_size );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Assume that the ethernet header
is always fully contained<o:p></o:p></P>
<P class=MsoNormal>+ * in the first page of the first
MDL. This makes for much<o:p></o:p></P>
<P class=MsoNormal>+ * simpler code.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ offset = MmGetMdlByteOffset( p_mdl ) +
sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( offset <= PAGE_SIZE
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( tot_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len = MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
page_array = MmGetMdlPfnArray( p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( page_array );<o:p></o:p></P>
<P
class=MsoNormal>-
i = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
if( !hdr_done )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Skip the ethernet header. */<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* The ethernet header is a subset of this MDL. */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( i == 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
if( offset < PAGE_SIZE )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] <<
PAGE_SHIFT);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr += offset;<o:p></o:p></P>
<P
class=MsoNormal>-
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* This data segment is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>-
j++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* This page is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>-
i++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Done handling the ethernet header. */<o:p></o:p></P>
<P
class=MsoNormal>-
hdr_done = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ while( tot_len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ buf_len =
MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ page_array =
MmGetMdlPfnArray( p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
page_array );<o:p></o:p></P>
<P class=MsoNormal>+ i =
0;<o:p></o:p></P>
<P class=MsoNormal>+ if( !hdr_done
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></P>
<P
class=MsoNormal>+
/* Skip the ethernet header. */<o:p></o:p></P>
<P
class=MsoNormal>+
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu
);<o:p></o:p></P>
<P
class=MsoNormal>+
if( buf_len )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* The ethernet header is a subset of this MDL. */<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( i == 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
if( offset < PAGE_SIZE )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] <<
PAGE_SHIFT);<o:p></o:p></P>
<P
class=MsoNormal>+
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr
+= offset;<o:p></o:p></P>
<P
class=MsoNormal>+
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></P>
<P
class=MsoNormal>+
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P
class=MsoNormal>+
buf_len = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+
/*
This data segment is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>+
j++;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
/* This page is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>+
i++;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
/* Done handling the ethernet header. */<o:p></o:p></P>
<P
class=MsoNormal>+
hdr_done = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Finish this MDL */<o:p></o:p></P>
<P
class=MsoNormal>-
while( buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] <<
PAGE_SHIFT);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Add the first page's offset if we're on the first page. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( i == 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Finish this
MDL */<o:p></o:p></P>
<P class=MsoNormal>+ while( buf_len
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] <<
PAGE_SHIFT);<o:p></o:p></P>
<P
class=MsoNormal>+
/* Add the first page's offset if we're on the first page. */<o:p></o:p></P>
<P
class=MsoNormal>+
if( i == 0 )<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Buffers spans pages. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P
class=MsoNormal>-
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P
class=MsoNormal>-
/* This page is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>-
i++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Last page of the buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* This data segment is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>-
j++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* Buffers spans pages. */<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P
class=MsoNormal>+
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>+
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></P>
<P
class=MsoNormal>+
/* This page is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>+
i++;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* Last page of the buffer. */<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></P>
<P
class=MsoNormal>+
buf_len = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
/* This data segment is done. Move to the next. */<o:p></o:p></P>
<P
class=MsoNormal>+
j++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
tot_len -= MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !tot_len )<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ tot_len -=
MmGetMdlByteCount( p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !tot_len
)<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get next buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get next buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Set the number of data segments. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></P>
<P class=MsoNormal>+ /* Set the number of data segments.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds =
j;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P class=MsoNormal>@@ -3750,261 +3797,261 @@<o:p></o:p></P>
<P class=MsoNormal> IN
PSCATTER_GATHER_LIST p_sgl,<o:p></o:p></P>
<P class=MsoNormal> IN
PVOID
context<o:p></o:p></P>
<P class=MsoNormal> )<o:p></o:p></P>
<P
class=MsoNormal>-{
<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
MDL
*p_mdl;<o:p></o:p></P>
<P
class=MsoNormal>-
eth_hdr_t
*p_eth_hdr;<o:p></o:p></P>
<P
class=MsoNormal>-
UINT
mdl_len;<o:p></o:p></P>
<P
class=MsoNormal>-
bool ret = false;<o:p></o:p></P>
<P class=MsoNormal>+{ <o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+
MDL
*p_mdl;<o:p></o:p></P>
<P class=MsoNormal>+
eth_hdr_t
*p_eth_hdr;<o:p></o:p></P>
<P class=MsoNormal>+
UINT
mdl_len;<o:p></o:p></P>
<P class=MsoNormal>+ bool ret = false;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_send_wr_t
*p_wr_failed;<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER
*p_netbuf;<o:p></o:p></P>
<P
class=MsoNormal>-
boolean_t
from_queue;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal>+
ib_send_wr_t
*p_wr_failed;<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST
*p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER
*p_netbuf;<o:p></o:p></P>
<P class=MsoNormal>+
boolean_t
from_queue;<o:p></o:p></P>
<P class=MsoNormal>+
ib_api_status_t
ib_status;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_sgl != NULL);<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(p_sgl != NULL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(pDO);<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(pDO);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( BuildSendDesc );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( QueuePacket );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendMgrQueue );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PostSend );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( BuildSendDesc
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( QueuePacket
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendMgrQueue
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ProcessFailedSends
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SG_real;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ++g_ipoib_send_SG_real;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//Read Data from the buffer passed as a context<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buffer_list = s_buf->p_nbl;<o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf =
s_buf->p_curr_nb;<o:p></o:p></P>
<P
class=MsoNormal>-
p_port =
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal>+ //Read Data from the buffer passed as a
context<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG * s_buf =
(ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P class=MsoNormal>+ p_net_buffer_list =
s_buf->p_nbl;<o:p></o:p></P>
<P class=MsoNormal>+ p_netbuf
=
s_buf->p_curr_nb;<o:p></o:p></P>
<P class=MsoNormal>+ p_port
=
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//TODO Define this function as void if we are not in DBG mode<o:p></o:p></P>
<P
class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ //TODO Define this function as void if we
are not in DBG mode<o:p></o:p></P>
<P class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_desc->p_netbuf_list = p_net_buffer_list;<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_desc->p_endpt = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_desc->num_wrs = 1;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_desc->p_netbuf_list =
p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_desc->p_endpt =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_desc->num_wrs =
1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the ethernet header so we can find the endpoint. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetEthHdr );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_get_eth_hdr(<o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf, &p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the ethernet header so we can find
the endpoint. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( GetEthHdr
);<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_mgr_get_eth_hdr(<o:p></o:p></P>
<P class=MsoNormal>+ p_netbuf,
&p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>-
/* fail net buffer */<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process SG
list\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends
);<o:p></o:p></P>
<P
class=MsoNormal>-
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
from_queue = (boolean_t)(s_buf->p_sgl != NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
if (from_queue)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetEndpt );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst,
&(p_port->p_desc->p_endpt) );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_port->p_desc->p_endpt));<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status == NDIS_STATUS_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P
class=MsoNormal>-
(cl_list_item_t*)s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this item
back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></P>
<P
class=MsoNormal>-
ret = false;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+ /* fail net
buffer */<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process SG
list\n"));<o:p></o:p></P>
<P class=MsoNormal>+
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+ ret =
true;<o:p></o:p></P>
<P class=MsoNormal>+ goto
send_end;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ from_queue = (boolean_t)(s_buf->p_sgl
!= NULL);<o:p></o:p></P>
<P class=MsoNormal>+ if (from_queue)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__endpt_mgr_ref( p_port, p_eth_hdr->dst, &(p_port->p_desc->p_endpt)
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n",
p_port->p_desc->p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P
class=MsoNormal>+
(cl_list_item_t*)s_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this item
back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></P>
<P
class=MsoNormal>+
ret = false;<o:p></o:p></P>
<P
class=MsoNormal>+
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if( status
!= NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc packet
(from the queue) %p\n", p_net_buffer_list));<o:p></o:p></P>
<P
class=MsoNormal>-
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></P>
<P
class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this MULTICAST
item back to the pending list: %p \n",
p_net_buffer_list));
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*)
s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
ret = false;<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P
class=MsoNormal>-
* sends to fail.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and the
packet had not been sent\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>+
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc packet
(from the queue) %p\n", p_net_buffer_list));<o:p></o:p></P>
<P
class=MsoNormal>+
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></P>
<P
class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this MULTICAST
item back to the pending list: %p \n",
p_net_buffer_list));
<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*)
s_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
ret = false;<o:p></o:p></P>
<P
class=MsoNormal>+
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P
class=MsoNormal>+
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P
class=MsoNormal>+
* sends to fail.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and the
packet had not been sent\n"));<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else //We got this Net Buffer and its SG list directly from NDIS<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_sgl = p_sgl;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendMgrQueue );<o:p></o:p></P>
<P
class=MsoNormal>-
if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></P>
<P
class=MsoNormal>-
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P
class=MsoNormal>-
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>+
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>+
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else //We got this Net Buffer and its SG
list directly from NDIS<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_sgl =
p_sgl;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
SendMgrQueue );<o:p></o:p></P>
<P class=MsoNormal>+ if (
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></P>
<P
class=MsoNormal>+
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></P>
<P
class=MsoNormal>+
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ip_hdr_t
*p_ip_hdr;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
*p_tmp;<o:p></o:p></P>
<P
class=MsoNormal>-
MDL
*p_ip_hdr_mdl;<o:p></o:p></P>
<P
class=MsoNormal>-
UINT
ip_hdr_mdl_len;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
g_ipoib_send_mcast++;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></P>
<P
class=MsoNormal>-
// Extract the ip hdr <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_ip_hdr_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
goto mc_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}
<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_tmp )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get IP header.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
goto mc_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}
<o:p></o:p></P>
<P
class=MsoNormal>-
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* This buffer is done for. Get the next buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
goto mc_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr = (ip_hdr_t*)(p_tmp +
NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] &
0x0f;<o:p></o:p></P>
<P
class=MsoNormal>-
p_eth_hdr->dst.addr[3] = ((unsigned
char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>+
ip_hdr_t
*p_ip_hdr;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
*p_tmp;<o:p></o:p></P>
<P
class=MsoNormal>+
MDL
*p_ip_hdr_mdl;<o:p></o:p></P>
<P
class=MsoNormal>+
UINT
ip_hdr_mdl_len;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
g_ipoib_send_mcast++;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></P>
<P
class=MsoNormal>+
// Extract the ip hdr <o:p></o:p></P>
<P
class=MsoNormal>+
if( !p_ip_hdr_mdl )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
goto mc_end;<o:p></o:p></P>
<P
class=MsoNormal>+
} <o:p></o:p></P>
<P
class=MsoNormal>+
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>+
if( !p_tmp )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get IP header.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
goto mc_end;<o:p></o:p></P>
<P
class=MsoNormal>+
}
<o:p></o:p></P>
<P
class=MsoNormal>+
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* This buffer is done for. Get the next buffer. */<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
goto mc_end;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
p_ip_hdr = (ip_hdr_t*)(p_tmp +
NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] &
0x0f;<o:p></o:p></P>
<P
class=MsoNormal>+
p_eth_hdr->dst.addr[3] = ((unsigned
char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> mc_end:<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_sgl);<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_queue( p_port, p_eth_hdr,
&(p_port->p_desc->p_endpt) );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status == NDIS_STATUS_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Queue net buffer list. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( QueuePacket );<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(s_buf->p_sgl);<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_mgr_queue( p_port, p_eth_hdr, &(p_port->p_desc->p_endpt)
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* Queue net buffer list. */<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( QueuePacket );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,
(cl_list_item_t*)s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB first
time to the pending list\n", p_netbuf));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P
class=MsoNormal>-
ret = false;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P
class=MsoNormal>-
* sends to fail.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO - check previous comment !<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends
);<o:p></o:p></P>
<P
class=MsoNormal>-
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( BuildSendDesc );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __build_send_desc( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc
);<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,
(cl_list_item_t*)s_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB first
time to the pending list\n", p_netbuf));<o:p></o:p></P>
<P class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></P>
<P
class=MsoNormal>+
++g_ipoib_send_SG_pending;<o:p></o:p></P>
<P
class=MsoNormal>+
ret = false;<o:p></o:p></P>
<P
class=MsoNormal>+
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></P>
<P
class=MsoNormal>+
* sends to fail.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
//TODO - check previous comment !<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends
);<o:p></o:p></P>
<P
class=MsoNormal>+
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>+
goto send_end;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( BuildSendDesc
);<o:p></o:p></P>
<P class=MsoNormal>+ status = __build_send_desc( p_eth_hdr,
p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, BuildSendDesc );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-//
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends
);<o:p></o:p></P>
<P
class=MsoNormal>-
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_end;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+//
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags,
TRUE);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+ ret =
true;<o:p></o:p></P>
<P class=MsoNormal>+ goto
send_end;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Post the WR. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PostSend );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("sending packet with wr-id
=0x%p\n",p_net_buffer_list ));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = p_port->p_adapter->p_ifc->post_send(
p_port->ib_mgr.h_qp, &(p_port->p_desc->send_wr[0].wr),
&p_wr_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->n_no_progress = 0; // IPoIB can send, reset the failure
counter<o:p></o:p></P>
<P
class=MsoNormal>-
ret = true;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PostSend );<o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_post_send returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends
);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Flag the adapter as hung since posting is busted. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->send_mgr.depth );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Post the WR. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND, ("sending packet with wr-id =0x%p\n",p_net_buffer_list
));<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ib_status =
p_port->p_adapter->p_ifc->post_send( p_port->ib_mgr.h_qp,
&(p_port->p_desc->send_wr[0].wr), &p_wr_failed );<o:p></o:p></P>
<P class=MsoNormal>+ p_port->n_no_progress = 0; // IPoIB
can send, reset the failure counter<o:p></o:p></P>
<P class=MsoNormal>+ ret = true;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PostSend );<o:p></o:p></P>
<P class=MsoNormal>+ if( ib_status != IB_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_post_send returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags,
TRUE);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+ /* Flag the
adapter as hung since posting is busted. */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+
++g_ipoib_send;<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc(
&p_port->send_mgr.depth );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-send_end:
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+send_end:
<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
return ret;<o:p></o:p></P>
<P class=MsoNormal>+ return ret;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -4018,486 +4065,486 @@<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t* p_port =
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG * s_buf =
(ipoib_send_NB_SG *)context;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t* p_port
=
s_buf->p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SG;<o:p></o:p></P>
<P
class=MsoNormal>-
if (g_ipoib_send_SG > 2) {<o:p></o:p></P>
<P
class=MsoNormal>-
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_process_sg_list_real(pDO, pIrp, p_sgl, context);<o:p></o:p></P>
<P
class=MsoNormal>-
if (g_ipoib_send_SG > 1) {<o:p></o:p></P>
<P
class=MsoNormal>-
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count +
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ ++g_ipoib_send_SG;<o:p></o:p></P>
<P class=MsoNormal>+ if (g_ipoib_send_SG > 2)
{<o:p></o:p></P>
<P class=MsoNormal>+
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_process_sg_list_real(pDO, pIrp,
p_sgl, context);<o:p></o:p></P>
<P class=MsoNormal>+ if (g_ipoib_send_SG > 1)
{<o:p></o:p></P>
<P class=MsoNormal>+
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count +
g_ipoib_send_SG_failed);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_gen(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG
*
s_buf,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
INT
lso_data_index,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
UINT
lso_header_size OPTIONAL)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_NB_SG *
s_buf,<o:p></o:p></P>
<P class=MsoNormal>+
IN
INT
lso_data_index,<o:p></o:p></P>
<P class=MsoNormal>+
IN
UINT
lso_header_size OPTIONAL)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
i, j
= 1;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
DataOffset = 0;
<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
EthHeaderOffset
= sizeof(eth_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
static const EthIPoIBHeaderOffset
= EthHeaderOffset - sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t i,
j = 1;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
DataOffset = 0; <o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
EthHeaderOffset =
sizeof(eth_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ static const
EthIPoIBHeaderOffset = EthHeaderOffset -
sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendCopy );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PSCATTER_GATHER_LIST
p_sgl = s_buf->p_sgl;<o:p></o:p></P>
<P class=MsoNormal>+ PSCATTER_GATHER_LIST
p_sgl = s_buf->p_sgl;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_sgl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( p_sgl );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO: Copy only essential data<o:p></o:p></P>
<P
class=MsoNormal>-
// That is, copy only 2 chunks of ETH header if it contained in several first SG
elements<o:p></o:p></P>
<P
class=MsoNormal>-
// Copy only N+1-MAX_SEND_SGE, where N is a lenght of SG List<o:p></o:p></P>
<P
class=MsoNormal>-
/* Remember that one of the DS entries is reserved for the IPoIB header.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_sgl )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT( p_sgl
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ //TODO: Copy only essential
data<o:p></o:p></P>
<P class=MsoNormal>+ // That is, copy only 2 chunks of ETH
header if it contained in several first SG elements<o:p></o:p></P>
<P class=MsoNormal>+ // Copy only N+1-MAX_SEND_SGE, where N is
a lenght of SG List<o:p></o:p></P>
<P class=MsoNormal>+ /* Remember that one of the DS entries is
reserved for the IPoIB header. */<o:p></o:p></P>
<P class=MsoNormal>+ if( ( p_sgl->NumberOfElements >=
MAX_SEND_SGE ||<o:p></o:p></P>
<P class=MsoNormal>+
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Too many buffers %d to fit in WR ds_array[%d] \<o:p></o:p></P>
<P
class=MsoNormal>-
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->NumberOfElements, MAX_SEND_SGE, p_sgl->Elements[0].Length )
);<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendCopy );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P class=MsoNormal>+
("Too many buffers %d to fit in WR
ds_array[%d] \<o:p></o:p></P>
<P
class=MsoNormal>+
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_sgl->NumberOfElements, MAX_SEND_SGE, p_sgl->Elements[0].Length )
);<o:p></o:p></P>
<P class=MsoNormal>+ status =
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ if(
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_start( SendCopy );<o:p></o:p></P>
<P
class=MsoNormal>+
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy
);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Skip the ethernet header. It is either the first element,<o:p></o:p></P>
<P
class=MsoNormal>-
* or part of it.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
i = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
DataOffset= (ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb));
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( lso_data_index )<o:p></o:p></P>
<P
class=MsoNormal>-
{ /* we have an LSO packet */<o:p></o:p></P>
<P
class=MsoNormal>-
i = lso_data_index;<o:p></o:p></P>
<P
class=MsoNormal>-
j = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( i <= p_sgl->NumberOfElements);<o:p></o:p></P>
<P
class=MsoNormal>-
if (i == p_sgl->NumberOfElements) {<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Skip the ethernet header.
It is either the first element,<o:p></o:p></P>
<P class=MsoNormal>+ * or part of it.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ i = 0;<o:p></o:p></P>
<P class=MsoNormal>+ DataOffset=
(ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( lso_data_index )<o:p></o:p></P>
<P class=MsoNormal>+ { /* we have an LSO packet
*/<o:p></o:p></P>
<P class=MsoNormal>+ i =
lso_data_index;<o:p></o:p></P>
<P class=MsoNormal>+ j =
0;<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT( i <=
p_sgl->NumberOfElements);<o:p></o:p></P>
<P class=MsoNormal>+ if (i ==
p_sgl->NumberOfElements) {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/****************************<o:p></o:p></P>
<P
class=MsoNormal>-
* Handle the case when there is only one SG element !<o:p></o:p></P>
<P
class=MsoNormal>-
****************************/<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset +
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[0].Length - lso_header_size - DataOffset -
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Set the number of data segments. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
}
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else while( EthHeaderOffset )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset +
DataOffset;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
i++;<o:p></o:p></P>
<P
class=MsoNormal>-
j++;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Now fill in the rest of the local data segments. */<o:p></o:p></P>
<P
class=MsoNormal>-
while( i < p_sgl->NumberOfElements )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].vaddr =
p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].length =
p_sgl->Elements[i].Length;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[j].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
i++;<o:p></o:p></P>
<P
class=MsoNormal>-
j++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
/****************************<o:p></o:p></P>
<P
class=MsoNormal>+
* Handle the case when there is only one SG element !<o:p></o:p></P>
<P
class=MsoNormal>+
****************************/<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></P>
<P
class=MsoNormal>+
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset +
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></P>
<P
class=MsoNormal>+
p_sgl->Elements[0].Length - lso_header_size - DataOffset -
EthIPoIBHeaderOffset;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
/* Set the number of data segments. */<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+
} <o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else while( EthHeaderOffset
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></P>
<P class=MsoNormal>+
p_sgl->Elements[i].Address.QuadPart
+ EthHeaderOffset + DataOffset;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></P>
<P
class=MsoNormal>+
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
i++;<o:p></o:p></P>
<P
class=MsoNormal>+
j++;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Now fill in the rest of the local data
segments. */<o:p></o:p></P>
<P class=MsoNormal>+ while( i < p_sgl->NumberOfElements
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].vaddr =
p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].length =
p_sgl->Elements[i].Length;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].local_ds[j].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+
i++;<o:p></o:p></P>
<P class=MsoNormal>+
j++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Set the number of data segments. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></P>
<P class=MsoNormal>+ /* Set the number of data segments.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds =
j;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG
*s_buf )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_NB_SG
*s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ip_hdr_t
*p_ip_hdr;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
ip_packet_len;<o:p></o:p></P>
<P
class=MsoNormal>-
size_t
iph_size_in_bytes;<o:p></o:p></P>
<P
class=MsoNormal>-
size_t
iph_options_size;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( QueryIp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendTcp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( FilterUdp );<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
ip_hdr_t *p_ip_hdr;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t ip_packet_len;<o:p></o:p></P>
<P class=MsoNormal>+
size_t
iph_size_in_bytes;<o:p></o:p></P>
<P class=MsoNormal>+
size_t
iph_options_size;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( QueryIp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendTcp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( FilterUdp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
if( !buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( QueryIp );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl ( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
QueryIp );<o:p></o:p></P>
<P class=MsoNormal>+ NdisGetNextMdl (
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get IP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len,
NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_ip_hdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query IP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, QueryIp );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* This buffer is done for. Get the next buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len,
NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_ip_hdr
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query IP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, QueryIp );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_ip_hdr =
(ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( buf_len < sizeof(ip_hdr_t)
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* This buffer is
done for. Get the next buffer. */<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Buffer too small for IP packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_ip_hdr->prot )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case IP_PROT_UDP:<o:p></o:p></P>
<P class=MsoNormal>+ switch( p_ip_hdr->prot
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case IP_PROT_UDP:<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( FilterUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)),
s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status == NDIS_STATUS_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>-
{ /* not DHCP packet, keep going */<o:p></o:p></P>
<P
class=MsoNormal>-
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
case IP_PROT_TCP:<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case IP_PROT_IGMP:<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></P>
<P
class=MsoNormal>-
1. iph<o:p></o:p></P>
<P
class=MsoNormal>-
2. ip options<o:p></o:p></P>
<P
class=MsoNormal>-
So to get the IGMP packet we need to skip the ip options
NDIS_BUFFER<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></P>
<P
class=MsoNormal>-
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></P>
<P
class=MsoNormal>-
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
FilterUdp );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), s_buf
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterUdp );<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></P>
<P class=MsoNormal>+ { /* not
DHCP packet, keep going */<o:p></o:p></P>
<P class=MsoNormal>+
if( ETH_IS_MULTICAST(
p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ case IP_PROT_TCP:<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case IP_PROT_IGMP:<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ In igmp packet I
saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></P>
<P class=MsoNormal>+ 1.
iph<o:p></o:p></P>
<P class=MsoNormal>+ 2. ip
options<o:p></o:p></P>
<P
class=MsoNormal>+
So to get the IGMP packet we need to skip the ip options
NDIS_BUFFER<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></P>
<P
class=MsoNormal>+
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></P>
<P
class=MsoNormal>+
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
Could be a case that arrived igmp packet not from type IGMPv2 ,<o:p></o:p></P>
<P
class=MsoNormal>-
but IGMPv1 or IGMPv3.<o:p></o:p></P>
<P
class=MsoNormal>-
We anyway pass it to __send_mgr_filter_igmp_v2().<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
status =<o:p></o:p></P>
<P
class=MsoNormal>-
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl,
buf_len );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P class=MsoNormal>+ Could be a case
that arrived igmp packet not from type IGMPv2 ,<o:p></o:p></P>
<P class=MsoNormal>+ but IGMPv1 or
IGMPv3.<o:p></o:p></P>
<P class=MsoNormal>+ We anyway pass it
to __send_mgr_filter_igmp_v2().<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ status
=<o:p></o:p></P>
<P
class=MsoNormal>+
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl,
buf_len );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case IP_PROT_ICMP:<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
goto send_gen;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ip_packet_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P
class=MsoNormal>-
if( ip_packet_len >
s_buf->p_port->p_adapter->params.payload_mtu )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO: NDIS60<o:p></o:p></P>
<P
class=MsoNormal>-
#if 0<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_fragments( p_port, p_desc, (eth_hdr_t*
const)p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
#endif<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ case IP_PROT_ICMP:<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if(
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ goto
send_gen;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if( endpt_cm_get_state(
p_desc->p_endpt ) != IPOIB_CM_CONNECTED )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( p_desc->send_dir == SEND_UD_QP
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ip_packet_len =
cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P class=MsoNormal>+ if(
ip_packet_len > s_buf->p_port->p_adapter->params.payload_mtu
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
//TODO: NDIS60<o:p></o:p></P>
<P
class=MsoNormal>+
#if 0<o:p></o:p></P>
<P
class=MsoNormal>+
status = __send_fragments( p_port, p_desc, (eth_hdr_t*
const)p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>+
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P
class=MsoNormal>+
#endif<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> send_gen:<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendTcp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_gen( s_buf, 0, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendTcp );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( SendTcp );<o:p></o:p></P>
<P class=MsoNormal>+ status = __send_gen( s_buf, 0, 0
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendTcp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
iph_options_size,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
iph_options_size,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
igmp_v2_hdr_t
*p_igmp_v2_hdr = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
endpt_status;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t*
p_endpt = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
mac_addr_t
fake_mcast_mac;<o:p></o:p></P>
<P class=MsoNormal>+
igmp_v2_hdr_t
*p_igmp_v2_hdr = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
endpt_status;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t* p_endpt = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
mac_addr_t
fake_mcast_mac;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size )
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("buf_len = %d,iph_options_size = %d\n",(int)buf_len,(int)iph_options_size )
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
// To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if
exists)<o:p></o:p></P>
<P
class=MsoNormal>-
while ( iph_options_size )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_igmp_v2_hdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
iph_options_size-=buf_len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ // To get the
IGMP packet we need to skip the ip options NDIS_BUFFER (if
exists)<o:p></o:p></P>
<P class=MsoNormal>+ while (
iph_options_size )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>+
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority
);<o:p></o:p></P>
<P class=MsoNormal>+
if( !p_igmp_v2_hdr )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
iph_options_size-=buf_len;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>
<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_igmp_v2_hdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* assuming ip header and options are in the same packet */<o:p></o:p></P>
<P
class=MsoNormal>-
p_igmp_v2_hdr = (igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the IGMP header length. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len < sizeof(igmp_v2_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Buffer not large enough for IGMPv2 packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+ if(
!p_igmp_v2_hdr )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* assuming ip
header and options are in the same packet */<o:p></o:p></P>
<P class=MsoNormal>+ p_igmp_v2_hdr =
(igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the IGMP header length.
*/<o:p></o:p></P>
<P class=MsoNormal>+ if( buf_len < sizeof(igmp_v2_hdr_t)
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("Buffer not large enough for IGMPv2
packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
// build fake mac from igmp packet group address<o:p></o:p></P>
<P
class=MsoNormal>-
fake_mcast_mac.addr[0] = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
fake_mcast_mac.addr[1] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></P>
<P
class=MsoNormal>-
fake_mcast_mac.addr[2] = 0x5E;<o:p></o:p></P>
<P
class=MsoNormal>-
fake_mcast_mac.addr[3] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></P>
<P
class=MsoNormal>-
fake_mcast_mac.addr[4] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></P>
<P
class=MsoNormal>-
fake_mcast_mac.addr[5] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></P>
<P class=MsoNormal>+ // build fake mac from igmp packet group
address<o:p></o:p></P>
<P class=MsoNormal>+ fake_mcast_mac.addr[0] =
1;<o:p></o:p></P>
<P class=MsoNormal>+ fake_mcast_mac.addr[1] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></P>
<P class=MsoNormal>+ fake_mcast_mac.addr[2] =
0x5E;<o:p></o:p></P>
<P class=MsoNormal>+ fake_mcast_mac.addr[3] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></P>
<P class=MsoNormal>+ fake_mcast_mac.addr[4] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></P>
<P class=MsoNormal>+ fake_mcast_mac.addr[5] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch ( p_igmp_v2_hdr->type )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></P>
<P
class=MsoNormal>-
/* <o:p></o:p></P>
<P
class=MsoNormal>-
This mean that some body open listener on this group <o:p></o:p></P>
<P
class=MsoNormal>-
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector
<o:p></o:p></P>
<P
class=MsoNormal>-
will not delete this mcast endpt.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt
);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_endpt));<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ switch ( p_igmp_v2_hdr->type
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></P>
<P class=MsoNormal>+ /*
<o:p></o:p></P>
<P class=MsoNormal>+
This mean that some body open listener
on this group <o:p></o:p></P>
<P
class=MsoNormal>+
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector
<o:p></o:p></P>
<P
class=MsoNormal>+
will not delete this mcast endpt.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></P>
<P class=MsoNormal>+ endpt_status =
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n",
p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+ if ( p_endpt
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case IGMP_V2_LEAVE_GROUP:<o:p></o:p></P>
<P
class=MsoNormal>-
/* <o:p></o:p></P>
<P
class=MsoNormal>-
This mean that somebody CLOSE listener on this group .<o:p></o:p></P>
<P
class=MsoNormal>-
Change type of mcast endpt to SEND_ONLY endpt. So mcast
<o:p></o:p></P>
<P
class=MsoNormal>-
garbage collector will delete this mcast endpt next time.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Catched IGMP_V2_LEAVE_GROUP message\n")
);<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt
);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_endpt));<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ case IGMP_V2_LEAVE_GROUP:<o:p></o:p></P>
<P class=MsoNormal>+ /*
<o:p></o:p></P>
<P
class=MsoNormal>+
This mean that somebody CLOSE listener on this group .<o:p></o:p></P>
<P
class=MsoNormal>+
Change type of mcast endpt to SEND_ONLY endpt. So mcast <o:p></o:p></P>
<P
class=MsoNormal>+
garbage collector will delete this mcast endpt next time.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("Catched IGMP_V2_LEAVE_GROUP message\n") );<o:p></o:p></P>
<P class=MsoNormal>+ endpt_status =
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n",
p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+ if ( p_endpt
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal>+
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Send Unknown IGMP message: 0x%x \n",
p_igmp_v2_hdr->type ) );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type )
);<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+ IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
udp_hdr_t
*p_udp_hdr;<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( QueryUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( FilterDhcp );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
udp_hdr_t
*p_udp_hdr;<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( QueryUdp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendUdp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( FilterDhcp
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( QueryUdp );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get UDP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_udp_hdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query UDP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &s_buf->p_port->p_adapter->perf, QueryUdp
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the UDP header and check the destination port numbers. */<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_ip_hdr->offset > 0) {<o:p></o:p></P>
<P
class=MsoNormal>-
/* This is a fragmented part of UDP packet<o:p></o:p></P>
<P
class=MsoNormal>-
* Only first packet will contain UDP header in such case<o:p></o:p></P>
<P
class=MsoNormal>-
* So, return if offset > 0<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
QueryUdp );<o:p></o:p></P>
<P class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get UDP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_udp_hdr
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query UDP header buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&s_buf->p_port->p_adapter->perf, QueryUdp );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_udp_hdr =
(udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the UDP header and check the
destination port numbers. */<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if (p_ip_hdr->offset > 0)
{<o:p></o:p></P>
<P class=MsoNormal>+ /* This is a
fragmented part of UDP packet<o:p></o:p></P>
<P class=MsoNormal>+ * Only
first packet will contain UDP header in such case<o:p></o:p></P>
<P class=MsoNormal>+ * So,
return if offset > 0<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ if( buf_len < sizeof(udp_hdr_t)
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( (p_udp_hdr->src_port != DHCP_PORT_CLIENT ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></P>
<P
class=MsoNormal>-
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Not a DHCP packet. */<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( (p_udp_hdr->src_port !=
DHCP_PORT_CLIENT ||<o:p></o:p></P>
<P class=MsoNormal>+
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></P>
<P class=MsoNormal>+
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></P>
<P class=MsoNormal>+
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Not a DHCP
packet. */<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
buf_len -= sizeof(udp_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ buf_len -=
sizeof(udp_hdr_t);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate our scratch buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></P>
<P
class=MsoNormal>-
ExAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !s_buf->p_send_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Copy the IP and UDP headers. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t)
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy(<o:p></o:p></P>
<P
class=MsoNormal>-
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t)
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate our scratch buffer.
*/<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf =
(send_buf_t*)<o:p></o:p></P>
<P class=MsoNormal>+
ExAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P class=MsoNormal>+ if( !s_buf->p_send_buf
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Copy the IP and UDP headers.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy(
&s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t)
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy(<o:p></o:p></P>
<P class=MsoNormal>+
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t)
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( FilterDhcp );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_filter_dhcp( p_udp_hdr, p_mdl, buf_len, s_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( FilterDhcp
);<o:p></o:p></P>
<P class=MsoNormal>+ status = __send_mgr_filter_dhcp(
p_udp_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> unsigned short ipchksum(unsigned short *ip, int
len)<o:p></o:p></P>
<P class=MsoNormal>@@ -4515,646 +4562,646 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NDIS_BUFFER*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const udp_hdr_t*
const
p_udp_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
NDIS_BUFFER*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
dhcp_pkt_t
*p_dhcp;<o:p></o:p></P>
<P
class=MsoNormal>-
dhcp_pkt_t
*p_ib_dhcp;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
*p_option, *p_cid = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
msg = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
size_t
len;<o:p></o:p></P>
<P class=MsoNormal>+
dhcp_pkt_t
*p_dhcp;<o:p></o:p></P>
<P class=MsoNormal>+
dhcp_pkt_t
*p_ib_dhcp;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
*p_option, *p_cid = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
msg = 0;<o:p></o:p></P>
<P class=MsoNormal>+
size_t
len;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( !buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get DHCP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_dhcp, &buf_len, NormalPagePriority
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_dhcp )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query DHCP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_dhcp = (dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get DHCP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_dhcp, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_dhcp
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("Failed
to query DHCP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_dhcp =
(dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len < DHCP_MIN_SIZE )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( buf_len < DHCP_MIN_SIZE
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_dhcp = &s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_dhcp =
&s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( p_ib_dhcp, p_dhcp, buf_len
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Now scan through the options looking for the client identifier.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_option = &p_ib_dhcp->options[4];<o:p></o:p></P>
<P
class=MsoNormal>-
while( *p_option != DHCP_OPT_END && p_option <
&p_ib_dhcp->options[312] )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
switch( *p_option )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCP_OPT_PAD:<o:p></o:p></P>
<P
class=MsoNormal>-
p_option++;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ /* Now scan through the options looking
for the client identifier. */<o:p></o:p></P>
<P class=MsoNormal>+ p_option =
&p_ib_dhcp->options[4];<o:p></o:p></P>
<P class=MsoNormal>+ while( *p_option != DHCP_OPT_END
&& p_option < &p_ib_dhcp->options[312] )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ switch( *p_option
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
DHCP_OPT_PAD:<o:p></o:p></P>
<P
class=MsoNormal>+
p_option++;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case DHCP_OPT_MSG:<o:p></o:p></P>
<P
class=MsoNormal>-
msg = p_option[2];<o:p></o:p></P>
<P
class=MsoNormal>-
p_option += 3;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
DHCP_OPT_MSG:<o:p></o:p></P>
<P
class=MsoNormal>+
msg = p_option[2];<o:p></o:p></P>
<P
class=MsoNormal>+
p_option += 3;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid = p_option;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal>+ case
DHCP_OPT_CLIENT_ID:<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid = p_option;<o:p></o:p></P>
<P
class=MsoNormal>+
/* Fall through. */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* All other options have a length byte following the option code.<o:p></o:p></P>
<P
class=MsoNormal>-
* Offset by the length to get to the next option.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* All other options have a length byte following the option code.<o:p></o:p></P>
<P
class=MsoNormal>+
* Offset by the length to get to the next option.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
p_option += (p_option[1] + 2);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( msg )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Client messages */<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPDISCOVER:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPREQUEST:<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Fall through */<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPDECLINE:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPRELEASE:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPINFORM:<o:p></o:p></P>
<P
class=MsoNormal>-
/* Fix up the client identifier option */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_cid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* do we need to replace it ? len eq ETH MAC sz 'and' MAC is mine
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp(
&p_cid[3],<o:p></o:p></P>
<P
class=MsoNormal>-
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Make sure there's room to extend it. 22 is the size of<o:p></o:p></P>
<P
class=MsoNormal>-
* the CID option for IPoIB. (20 is the length, one byte for type and the second
for lenght field)<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t)
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Move the existing options down, and add a new CID option */<o:p></o:p></P>
<P
class=MsoNormal>-
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></P>
<P
class=MsoNormal>-
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></P>
<P
class=MsoNormal>-
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid += len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Make sure there's room to extend it. 23 is the size of<o:p></o:p></P>
<P
class=MsoNormal>-
* the CID option for IPoIB.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ switch( msg )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Client messages */<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPDISCOVER:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPREQUEST:<o:p></o:p></P>
<P
class=MsoNormal>+
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></P>
<P class=MsoNormal>+ /* Fall through
*/<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPDECLINE:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPRELEASE:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPINFORM:<o:p></o:p></P>
<P class=MsoNormal>+ /* Fix up the
client identifier option */<o:p></o:p></P>
<P class=MsoNormal>+ if( p_cid
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* do we need to replace it ? len eq ETH MAC sz 'and' MAC is mine
*/<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp(
&p_cid[3],<o:p></o:p></P>
<P
class=MsoNormal>+
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN )
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* Make sure there's room to extend it. 22 is the size of<o:p></o:p></P>
<P
class=MsoNormal>+
* the CID option for IPoIB. (20 is the length, one byte for type and the second
for lenght field)<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t)
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
/* Move the existing options down, and add a new CID option */<o:p></o:p></P>
<P
class=MsoNormal>+
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></P>
<P
class=MsoNormal>+
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></P>
<P
class=MsoNormal>+
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid += len;<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* Make sure there's room to extend it. 23 is the size of<o:p></o:p></P>
<P
class=MsoNormal>+
* the CID option for IPoIB.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_cid = p_option;<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid = p_option;<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></P>
<P
class=MsoNormal>+
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></P>
<P
class=MsoNormal>-
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
// Copy the default prefix for ALL DHCP messages<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof
coIBDefaultDHCPPrefix);<o:p></o:p></P>
<P
class=MsoNormal>-
// Copy the GUID into the last 8 bytes of the CID field<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &p_cid[2+
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid
, <o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid)
);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></P>
<P class=MsoNormal>+
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ // Copy the
default prefix for ALL DHCP messages<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy(
&p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof
coIBDefaultDHCPPrefix);<o:p></o:p></P>
<P class=MsoNormal>+ // Copy the GUID
into the last 8 bytes of the CID field<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy(
&p_cid[2+
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid
, <o:p></o:p></P>
<P
class=MsoNormal>+
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid)
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Server messages. */<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPOFFER:<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_dhcp->htype = 0x20;<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_dhcp->hlen = 0x8;<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPACK:<o:p></o:p></P>
<P
class=MsoNormal>-
case DHCPNAK:<o:p></o:p></P>
<P
class=MsoNormal>-
/* don't touch server messages */<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ /* Server messages. */<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPOFFER:<o:p></o:p></P>
<P class=MsoNormal>+
p_ib_dhcp->htype = 0x20;<o:p></o:p></P>
<P class=MsoNormal>+
p_ib_dhcp->hlen = 0x8;<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPACK:<o:p></o:p></P>
<P class=MsoNormal>+ case DHCPNAK:<o:p></o:p></P>
<P class=MsoNormal>+ /* don't touch
server messages */<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalide message type.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalide message type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) +
sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) +
sizeof(dhcp_pkt_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf->ip.hdr.chksum = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf->ip.hdr.chksum = ipchksum((unsigned short*)
&s_buf->p_send_buf->ip.hdr, sizeof(ip_hdr_t));<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf->ip.hdr.length =
cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t)
);<o:p></o:p></P>
<P class=MsoNormal>+
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t) +
sizeof(dhcp_pkt_t) );<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf->ip.hdr.chksum =
0;<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf->ip.hdr.chksum =
ipchksum((unsigned short*) &s_buf->p_send_buf->ip.hdr,
sizeof(ip_hdr_t));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* no chksum for udp, in a case when HW does not support checksum offload
*/<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( s_buf->p_send_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t)
+ sizeof(udp_hdr_t) +
sizeof(dhcp_pkt_t);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* no chksum for udp, in a case when HW
does not support checksum offload */<o:p></o:p></P>
<P class=MsoNormal>+
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].vaddr =
cl_get_physaddr( s_buf->p_send_buf );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].length
= sizeof(ip_hdr_t) + sizeof(udp_hdr_t) +
sizeof(dhcp_pkt_t);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds =
2;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_dir =
SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
size_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+
IN
size_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+ IN
OUT
ipoib_send_NB_SG*
s_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
arp_pkt_t
*p_arp;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_arp_pkt_t
*p_ib_arp;<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
mac_addr_t
null_hw = {0};<o:p></o:p></P>
<P class=MsoNormal>+
arp_pkt_t
*p_arp;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_arp_pkt_t
*p_ib_arp;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
mac_addr_t null_hw =
{0};<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( !buf_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_mdl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get ARP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl( p_mdl, &p_arp, &buf_len, NormalPagePriority
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_arp )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get query ARP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_arp = (arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( !buf_len )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_mdl
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get ARP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ NdisQueryMdl(
p_mdl, &p_arp, &buf_len, NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_arp
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get query ARP buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_arp =
(arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Single buffer ARP packet. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len < sizeof(arp_pkt_t) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Buffer too short for ARP.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Single buffer ARP packet.
*/<o:p></o:p></P>
<P class=MsoNormal>+ if( buf_len < sizeof(arp_pkt_t)
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Buffer too short for ARP.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Unsupported protocol type.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_arp->prot_type !=
ETH_PROT_TYPE_IP )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Unsupported protocol type.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_INVALID_DATA;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate our scratch buffer. */<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></P>
<P
class=MsoNormal>-
NdisAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !s_buf->p_send_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query ARP packet buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp = (ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate our scratch buffer.
*/<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(s_buf->p_send_buf ==
NULL);<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf =
(send_buf_t*)<o:p></o:p></P>
<P class=MsoNormal>+
NdisAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></P>
<P class=MsoNormal>+ if( !s_buf->p_send_buf
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query ARP packet buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp =
(ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Convert the ARP payload. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->hw_type = ARP_HW_TYPE_IB;<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->prot_type = p_arp->prot_type;<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->hw_size = sizeof(ipoib_hw_addr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->prot_size = p_arp->prot_size;<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->op = p_arp->op;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_set_qpn( &p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Convert the ARP payload.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->hw_type =
ARP_HW_TYPE_IB;<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->prot_type =
p_arp->prot_type;<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->hw_size =
sizeof(ipoib_hw_addr_t);<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->prot_size =
p_arp->prot_size;<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->op =
p_arp->op;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ipoib_addr_set_qpn(
&p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn );<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC
);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_gid_set_default( &p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->src_ip = p_arp->src_ip;<o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the endpoint referenced by the dst_hw address. */<o:p></o:p></P>
<P
class=MsoNormal>-
net32_t
qpn = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_get_gid_qpn( s_buf->p_port,
p_arp->dst_hw,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed lookup of destination HW address\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></P>
<P class=MsoNormal>+ ib_gid_set_default(
&p_ib_arp->src_hw.gid,<o:p></o:p></P>
<P class=MsoNormal>+
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->src_ip =
p_arp->src_ip;<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_memcmp( &p_arp->dst_hw,
&null_hw, sizeof(mac_addr_t) ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the
endpoint referenced by the dst_hw address. */<o:p></o:p></P>
<P class=MsoNormal>+ net32_t qpn =
0;<o:p></o:p></P>
<P class=MsoNormal>+ status =
__endpt_mgr_get_gid_qpn( s_buf->p_port, p_arp->dst_hw,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed lookup of destination HW address\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_arp->op == ARP_OP_REP && <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.cm_enabled && <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cm_state_t
cm_state;<o:p></o:p></P>
<P
class=MsoNormal>-
cm_state = <o:p></o:p></P>
<P
class=MsoNormal>-
( cm_state_t )InterlockedCompareExchange( (volatile LONG
*)&p_desc->p_endpt->conn.state,<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>-
switch( cm_state )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case IPOIB_CM_DISCONNECTED:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("ARP REPLY pending Endpt[%p] QPN %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt, <o:p></o:p></P>
<P
class=MsoNormal>-
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->mac.addr[0],
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->mac.addr[2],
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] )
);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_arp->op
== ARP_OP_REP && <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.cm_enabled && <o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cm_state_t cm_state;<o:p></o:p></P>
<P
class=MsoNormal>+
cm_state = <o:p></o:p></P>
<P
class=MsoNormal>+
( cm_state_t )InterlockedCompareExchange( (volatile LONG
*)&p_desc->p_endpt->conn.state,<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>+
switch( cm_state )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
case IPOIB_CM_DISCONNECTED:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("ARP REPLY pending Endpt[%p] QPN %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt, <o:p></o:p></P>
<P
class=MsoNormal>+
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->mac.addr[0],
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->mac.addr[2],
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] )
);<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns,
<o:p></o:p></P>
<P
class=MsoNormal>-
&p_desc->p_endpt->list_item, <o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
case IPOIB_CM_CONNECT:<o:p></o:p></P>
<P
class=MsoNormal>-
/* queue ARP REP packet until connected */<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></P>
<P
class=MsoNormal>+
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns,
<o:p></o:p></P>
<P
class=MsoNormal>+
&p_desc->p_endpt->list_item, <o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
case IPOIB_CM_CONNECT:<o:p></o:p></P>
<P
class=MsoNormal>+
/* queue ARP REP packet until connected */<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeToNPagedLookasideList(<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr(
&p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> #if 0 //DBG<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
(" ARP %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
( p_ib_arp->op == ARP_OP_REP ? "REP":
"REQ"),
p_desc->p_endpt, <o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->cm_flag, <o:p></o:p></P>
<P
class=MsoNormal>-
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->mac.addr[0],
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->mac.addr[2],
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5]
));<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P class=MsoNormal>+ (" ARP %s SEND to
ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
( p_ib_arp->op == ARP_OP_REP ? "REP":
"REQ"),
p_desc->p_endpt, <o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->cm_flag, <o:p></o:p></P>
<P
class=MsoNormal>+
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->mac.addr[0],
p_desc->p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->mac.addr[2],
p_desc->p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5]
));<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_ib_arp->dst_ip = p_arp->dst_ip;<o:p></o:p></P>
<P class=MsoNormal>+ p_ib_arp->dst_ip =
p_arp->dst_ip;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].length =
sizeof(ipoib_arp_pkt_t);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].vaddr =
cl_get_physaddr( p_ib_arp );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].length
= sizeof(ipoib_arp_pkt_t);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.num_ds =
2;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.p_next =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_mgr_queue(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ipoib_endpt_t**
const pp_endpt )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P
class=MsoNormal>-
//No need in spinlock, this function is already under lock <o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_qlist_count( &p_port->send_mgr.pending_list ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Pending list not empty.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Check the send queue and pend the
request if not empty. */<o:p></o:p></P>
<P class=MsoNormal>+ //No need in spinlock, this function is
already under lock <o:p></o:p></P>
<P class=MsoNormal>+ if( cl_qlist_count(
&p_port->send_mgr.pending_list ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Pending list not empty.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("No available WQEs.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_dbg_out("HW is full\n");<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Check the send queue and pend the
request if not empty. */<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->send_mgr.depth ==
p_port->p_adapter->params.sq_depth )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("No available WQEs.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ cl_dbg_out("HW is
full\n");<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( GetEndpt );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", *pp_endpt));<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ status = __endpt_mgr_ref( p_port,
p_eth_hdr->dst, pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", *pp_endpt));<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></P>
<P
class=MsoNormal>-
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join mcast
from send_mgr_queue\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></P>
<P
class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Multicast Mac - trying to join.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if ( status == NDIS_STATUS_SUCCESS && <o:p></o:p></P>
<P
class=MsoNormal>-
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&
<o:p></o:p></P>
<P
class=MsoNormal>-
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( (*pp_endpt) );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></P>
<P class=MsoNormal>+ ETH_IS_MULTICAST(
p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join mcast from
send_mgr_queue\n"));<o:p></o:p></P>
<P class=MsoNormal>+ if(
ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></P>
<P
class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Multicast Mac - trying to join.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_PENDING;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if ( status == NDIS_STATUS_SUCCESS
&& <o:p></o:p></P>
<P
class=MsoNormal>+
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></P>
<P
class=MsoNormal>+
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
(*pp_endpt) );<o:p></o:p></P>
<P class=MsoNormal>+
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></P>
<P class=MsoNormal>+
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_send_desc(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
MDL*
const
p_mdl,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
size_t
mdl_len,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG
*s_buf)<o:p></o:p></P>
<P class=MsoNormal>+
IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+
IN
MDL*
const
p_mdl,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
size_t
mdl_len,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_send_NB_SG
*s_buf)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
int32_t
hdr_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
mss = 0;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
int32_t
hdr_idx;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
mss = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
p_checksum_list_info = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info =
NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendMgrFilter );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
p_checksum_list_info = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendMgrFilter
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Store context in our reserved area of the packet. */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* Store context in our reserved area of
the packet. */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf == (ipoib_send_NB_SG *)
IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_endpt = p_desc->p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO IMPORTANT: Send buffer should not be allocated within global struct
!!!<o:p></o:p></P>
<P
class=MsoNormal>-
// Otherwise, the next send may override its content<o:p></o:p></P>
<P
class=MsoNormal>-
//s_buf->p_send_buf= p_desc->p_buf;<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(s_buf == (ipoib_send_NB_SG *)
IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_endpt =
p_desc->p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ //TODO IMPORTANT: Send buffer should not
be allocated within global struct !!!<o:p></o:p></P>
<P class=MsoNormal>+ // Otherwise, the next send may override
its content<o:p></o:p></P>
<P class=MsoNormal>+ //s_buf->p_send_buf=
p_desc->p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Format the send descriptor. */<o:p></o:p></P>
<P
class=MsoNormal>-
PVOID* ppTemp
= &NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpIpChecksumNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>+ /* Format the send descriptor.
*/<o:p></o:p></P>
<P class=MsoNormal>+ PVOID*
ppTemp =
&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpIpChecksumNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal> p_checksum_list_info =
<o:p></o:p></P>
<P
class=MsoNormal>
(PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO) ((PULONG)ppTemp); <o:p></o:p></P>
<P
class=MsoNormal>-
// Calculate LSO<o:p></o:p></P>
<P
class=MsoNormal>-
if( s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></P>
<P class=MsoNormal>+ // Calculate LSO<o:p></o:p></P>
<P class=MsoNormal>+ if(
s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_lso_info =<o:p></o:p></P>
<P
class=MsoNormal>-
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG)
&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_lso_info);<o:p></o:p></P>
<P class=MsoNormal>-
ULONG LsoType =
p_lso_info->Transmit.Type;<o:p></o:p></P>
<P class=MsoNormal>+ p_lso_info
=<o:p></o:p></P>
<P
class=MsoNormal>+
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG)
&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(p_lso_info);<o:p></o:p></P>
<P class=MsoNormal>+ ULONG LsoType =
p_lso_info->Transmit.Type;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mss = p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></P>
<P
class=MsoNormal>-
if (PacketLength < mss) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if(LsoType == NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_lso_info->LsoV2Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(mss ==
p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset ==
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Format the send descriptor. */<o:p></o:p></P>
<P
class=MsoNormal>-
hdr_idx = cl_atomic_inc( &s_buf->p_port->hdr_idx );<o:p></o:p></P>
<P
class=MsoNormal>-
hdr_idx &= (s_buf->p_port->p_adapter->params.sq_depth -
1);<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( hdr_idx < s_buf->p_port->p_adapter->params.sq_depth
);<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_port->hdr[hdr_idx].type = p_eth_hdr->type;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_port->hdr[hdr_idx].resv = 0;<o:p></o:p></P>
<P class=MsoNormal>+ mss =
p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></P>
<P class=MsoNormal>+ ULONG
PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></P>
<P class=MsoNormal>+ if
(PacketLength < mss) {<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if(LsoType ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) {<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(p_lso_info->LsoV2Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(mss == p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset ==
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ /* Format the send descriptor.
*/<o:p></o:p></P>
<P class=MsoNormal>+ hdr_idx = cl_atomic_inc(
&s_buf->p_port->hdr_idx );<o:p></o:p></P>
<P class=MsoNormal>+ hdr_idx &=
(s_buf->p_port->p_adapter->params.sq_depth - 1);<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT( hdr_idx <
s_buf->p_port->p_adapter->params.sq_depth );<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_port->hdr[hdr_idx].type =
p_eth_hdr->type;<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_port->hdr[hdr_idx].resv =
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//TODO why we enter this block for LSO ???<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr(
&s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].local_ds[0].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.send_opt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
//Init send buffer to 0<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ //TODO why we enter this block for LSO
???<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[0].vaddr =
cl_get_physaddr( &s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[0].length
= sizeof(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].local_ds[0].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.send_opt =
0;<o:p></o:p></P>
<P class=MsoNormal>+ //Init send buffer to 0<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (mss && (p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We
have LSO packet<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( mss == (p_lso_info->LsoV1Transmit.MSS &
p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></P>
<P
class=MsoNormal>-
//ASSERT ( (mss & (1<<20)) == mss);<o:p></o:p></P>
<P
class=MsoNormal>-
status = __build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info,
s_buf->p_curr_nb);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
i;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendMgrFilter );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if (mss &&
(p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We have LSO
packet<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ASSERT( mss ==
(p_lso_info->LsoV1Transmit.MSS &
p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></P>
<P class=MsoNormal>+ //ASSERT ( (mss
& (1<<20)) == mss);<o:p></o:p></P>
<P class=MsoNormal>+ status =
__build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info,
s_buf->p_curr_nb);<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t i;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
SendMgrFilter );<o:p></o:p></P>
<P class=MsoNormal>+ status =
__send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendMgrFilter );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></P>
<P
class=MsoNormal>-
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.remote_qp =
p_desc->p_endpt->qpn;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey =
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.h_av =
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.pkey_index =
s_buf->p_port->pkey_index;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_desc->send_dir == SEND_UD_QP )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></P>
<P
class=MsoNormal>+
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.remote_qp
= p_desc->p_endpt->qpn;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey =
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.h_av =
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.pkey_index
= s_buf->p_port->pkey_index;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( s_buf->p_port->p_adapter->params.send_chksum_offload
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_checksum_list_info
&&<o:p></o:p></P>
<P
class=MsoNormal>-
( p_checksum_list_info->Transmit.IsIPv4 || <o:p></o:p></P>
<P
class=MsoNormal>-
p_checksum_list_info->Transmit.IsIPv6 ))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
// Set transimition checksum offloading<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_checksum_list_info->Transmit.TcpChecksum ||
p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else // RC QP<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i].wr.ds_array =
&p_desc->send_wr[i].local_ds[0];<o:p></o:p></P>
<P
class=MsoNormal>-
if( i )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[i-1].wr.p_next =
&p_desc->send_wr[i].wr;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf
;<o:p></o:p></P>
<P
class=MsoNormal>+
if(
s_buf->p_port->p_adapter->params.send_chksum_offload
&&<o:p></o:p></P>
<P
class=MsoNormal>+
p_checksum_list_info
&&<o:p></o:p></P>
<P
class=MsoNormal>+
( p_checksum_list_info->Transmit.IsIPv4 || <o:p></o:p></P>
<P
class=MsoNormal>+
p_checksum_list_info->Transmit.IsIPv6 ))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
// Set transimition checksum offloading<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_checksum_list_info->Transmit.TcpChecksum ||
p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else // RC
QP<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ for( i = 0; i
< p_desc->num_wrs; i++ )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i].wr.ds_array =
&p_desc->send_wr[i].local_ds[0];<o:p></o:p></P>
<P
class=MsoNormal>+
if( i )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[i-1].wr.p_next =
&p_desc->send_wr[i].wr;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf
;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |=
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |=
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __build_lso_desc(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ULONG
mss,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
int32_t
hdr_idx, <o:p></o:p></P>
<P
class=MsoNormal>-
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
NET_BUFFER
*p_netbuf)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t*
const p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ULONG
mss,<o:p></o:p></P>
<P class=MsoNormal>+
IN
int32_t
hdr_idx, <o:p></o:p></P>
<P class=MsoNormal>+ IN
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></P>
<P class=MsoNormal>+
IN
NET_BUFFER
*p_netbuf)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
LsoData
TheLsoData;<o:p></o:p></P>
<P
class=MsoNormal>-
UINT
IndexOfData = 0;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
LsoData
TheLsoData;<o:p></o:p></P>
<P class=MsoNormal>+
UINT
IndexOfData
= 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG * s_buf = IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG * s_buf =
IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_desc_t *p_desc =
p_port->p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//TODO What if first NB was inserted to pending list ????<o:p></o:p></P>
<P
class=MsoNormal>-
PNET_BUFFER FirstBuffer = NET_BUFFER_LIST_FIRST_NB
(s_buf->p_nbl);<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
PacketLength = NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></P>
<P class=MsoNormal>+ //TODO What if first NB was inserted to
pending list ????<o:p></o:p></P>
<P class=MsoNormal>+ PNET_BUFFER
FirstBuffer = NET_BUFFER_LIST_FIRST_NB (s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+
ULONG PacketLength =
NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
memset(&TheLsoData, 0, sizeof TheLsoData );<o:p></o:p></P>
<P
class=MsoNormal>-
status = GetLsoHeaderSize(<o:p></o:p></P>
<P
class=MsoNormal>-
FirstBuffer, <o:p></o:p></P>
<P
class=MsoNormal>-
&TheLsoData, <o:p></o:p></P>
<P
class=MsoNormal>-
&IndexOfData,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P class=MsoNormal>+ memset(&TheLsoData, 0, sizeof
TheLsoData );<o:p></o:p></P>
<P class=MsoNormal>+ status = GetLsoHeaderSize(<o:p></o:p></P>
<P class=MsoNormal>+ FirstBuffer,
<o:p></o:p></P>
<P class=MsoNormal>+ &TheLsoData,
<o:p></o:p></P>
<P class=MsoNormal>+
&IndexOfData,<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->hdr[hdr_idx] );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if ((status != NDIS_STATUS_SUCCESS ) || <o:p></o:p></P>
<P
class=MsoNormal>-
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ if ((status != NDIS_STATUS_SUCCESS ) ||
<o:p></o:p></P>
<P class=MsoNormal>+
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this
packet\n"));<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this
packet\n"));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status == NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></P>
<P
class=MsoNormal>-
// Tell NDIS how much we will send.<o:p></o:p></P>
<P
class=MsoNormal>-
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] =
UlongToPtr(PacketLength);<o:p></o:p></P>
<P
class=MsoNormal>-
//p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
// Tell NDIS how much we will send.<o:p></o:p></P>
<P
class=MsoNormal>-
if(p_lso_info->LsoV1Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(TheLsoData.LsoHeaderSize >
0);<o:p></o:p></P>
<P class=MsoNormal>+ // Tell NDIS how much we will
send.<o:p></o:p></P>
<P class=MsoNormal>+
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] =
UlongToPtr(PacketLength);<o:p></o:p></P>
<P class=MsoNormal>+
//p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ // Tell NDIS how much we will
send.<o:p></o:p></P>
<P class=MsoNormal>+ if(p_lso_info->LsoV1Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal>-
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) +=
PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P class=MsoNormal>-
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) +=
PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.mss = mss;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.header =
TheLsoData.LsoBuffers[0].pData;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize
;//lso_header_size; <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.remote_qp =
p_desc->p_endpt->qpn;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.h_av =
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.pkey_index =
p_port->pkey_index;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.mss =
mss;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.header =
TheLsoData.LsoBuffers[0].pData;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.hlen =
TheLsoData.LsoHeaderSize ;//lso_header_size; <o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].wr.dgrm.ud.remote_qp =
p_desc->p_endpt->qpn;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.h_av =
p_desc->p_endpt->h_av;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[0].wr.dgrm.ud.pkey_index =
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.dgrm.ud.rsvd =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.wr_id = (uintn_t)s_buf;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.ds_array =
p_desc->send_wr[0].local_ds;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.wr_type = WR_LSO;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.send_opt = <o:p></o:p></P>
<P
class=MsoNormal>-
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) |
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_qp = p_port->ib_mgr.h_qp;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></P>
<P
class=MsoNormal>-
status = __send_gen( s_buf, IndexOfData, TheLsoData.LsoHeaderSize
);<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.wr_id =
(uintn_t)s_buf;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.ds_array =
p_desc->send_wr[0].local_ds;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.wr_type =
WR_LSO;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.send_opt =
<o:p></o:p></P>
<P class=MsoNormal>+
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) |
IB_SEND_OPT_SIGNALED;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_wr[0].wr.p_next =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_qp =
p_port->ib_mgr.h_qp;<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->send_dir =
SEND_UD_QP;<o:p></o:p></P>
<P class=MsoNormal>+ status = __send_gen( s_buf, IndexOfData,
TheLsoData.LsoHeaderSize );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -5182,7 +5229,7 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ULONG i = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
int j=0;<o:p></o:p></P>
<P class=MsoNormal>+ int j=0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> UINT buf_len =
NET_BUFFER_DATA_LENGTH(NetBuff);<o:p></o:p></P>
<P class=MsoNormal> PMDL pMdl =
NET_BUFFER_CURRENT_MDL(NetBuff);<o:p></o:p></P>
<P class=MsoNormal>@@ -5195,7 +5242,7 @@<o:p></o:p></P>
<P class=MsoNormal> #ifdef DBG<o:p></o:p></P>
<P class=MsoNormal> ASSERT(PhysBufCount <=
MAX_PHYS_BUF_FRAG_ELEMENTS);<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ASSERT(buf_len >
0);<o:p></o:p></P>
<P class=MsoNormal>@@ -5221,7 +5268,7 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ASSERT(
(buf_len > 0) && (MdlBytesCount > 0) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList: pMdl=%p,
MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount,
MdlBufCount));<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList: pMdl=%p,
MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount,
MdlBufCount));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> if
(MdlBytesCount > 0)<o:p></o:p></P>
<P class=MsoNormal>
{<o:p></o:p></P>
<P class=MsoNormal>@@ -5274,7 +5321,7 @@<o:p></o:p></P>
<P class=MsoNormal>
{<o:p></o:p></P>
<P
class=MsoNormal>
<o:p></o:p></P>
<P
class=MsoNormal>
ULONG size = min(PAGE_SIZE, MdlBytesCount);<o:p></o:p></P>
<P
class=MsoNormal>-
i -= 1;<o:p></o:p></P>
<P
class=MsoNormal>+
i -= 1;<o:p></o:p></P>
<P
class=MsoNormal>
pFragList->Elements[i].Length += size;<o:p></o:p></P>
<P
class=MsoNormal>
MdlBytesCount -= size;<o:p></o:p></P>
<P
class=MsoNormal>
}<o:p></o:p></P>
<P class=MsoNormal>@@ -5331,517 +5378,517 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_send(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal> IN
NET_BUFFER_LIST *p_net_buffer_list,<o:p></o:p></P>
<P class=MsoNormal> IN
ULONG
send_flags)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
PNET_BUFFER
p_netbuf, p_next_netbuf = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
UINT
buf_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG
send_complete_flags = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
KIRQL
old_irql;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( BuildSendDesc );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( QueuePacket );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendMgrQueue );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PostSend );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+
PNET_BUFFER p_netbuf,
p_next_netbuf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
UINT
buf_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+
ULONG
send_complete_flags = 0;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
KIRQL
old_irql;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEthHdr );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( BuildSendDesc
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( QueuePacket
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendMgrQueue
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ProcessFailedSends
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO Tzachid: make an assert here to validate your IRQL<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT (KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P
class=MsoNormal>-
old_irql = DISPATCH_LEVEL;<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></P>
<P
class=MsoNormal>-
//ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buffer_list,<o:p></o:p></P>
<P
class=MsoNormal>-
send_complete_flags); <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if
(NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ //TODO Tzachid:
make an assert here to validate your IRQL<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT
(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ old_irql =
DISPATCH_LEVEL;<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></P>
<P class=MsoNormal>+ //ASSERT
(KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->state != IB_QPS_RTS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
p_net_buffer_list,<o:p></o:p></P>
<P
class=MsoNormal>+
send_complete_flags); <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
// You are already here at dispatch<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ // You are already here at
dispatch<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
// We need to init the status here<o:p></o:p></P>
<P
class=MsoNormal>-
// When completing the send, we will set the status NDIS_STATUS_FAILURE if AT
LEAST<o:p></o:p></P>
<P
class=MsoNormal>-
// one of NBs will fail.<o:p></o:p></P>
<P
class=MsoNormal>-
// That is, status can't be updated back to SUCCESS if it previosly was set to
FAILURE<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ // We need to init the status
here<o:p></o:p></P>
<P class=MsoNormal>+ // When completing the send, we will set
the status NDIS_STATUS_FAILURE if AT LEAST<o:p></o:p></P>
<P class=MsoNormal>+ // one of NBs will fail.<o:p></o:p></P>
<P class=MsoNormal>+ // That is, status can't be updated back
to SUCCESS if it previosly was set to FAILURE<o:p></o:p></P>
<P class=MsoNormal>+ NET_BUFFER_LIST_STATUS(p_net_buffer_list)
= NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf != NULL; <o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf = NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SW;<o:p></o:p></P>
<P
class=MsoNormal>-
++buf_cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ for (p_netbuf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+ p_netbuf !=
NULL; <o:p></o:p></P>
<P class=MsoNormal>+ p_netbuf =
NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
++g_ipoib_send_SW;<o:p></o:p></P>
<P class=MsoNormal>+
++buf_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list,
buf_cnt));<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list,
buf_cnt));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(buf_cnt);<o:p></o:p></P>
<P
class=MsoNormal>-
// Raise reference count of the NBL to the number of its NBs<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) =
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(buf_cnt);<o:p></o:p></P>
<P class=MsoNormal>+ // Raise reference count of the NBL to
the number of its NBs<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) =
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf != NULL; <o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf = p_next_netbuf)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_next_netbuf = NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+ for (p_netbuf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></P>
<P class=MsoNormal>+ p_netbuf !=
NULL; <o:p></o:p></P>
<P class=MsoNormal>+ p_netbuf =
p_next_netbuf)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_next_netbuf =
NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG*) (PVOID)
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></P>
<P
class=MsoNormal>-
if (s_buf == NULL) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) =
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buffer_list,<o:p></o:p></P>
<P
class=MsoNormal>-
send_complete_flags);
<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG
* s_buf = (ipoib_send_NB_SG*) (PVOID)
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></P>
<P class=MsoNormal>+ if (s_buf ==
NULL) {<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>+
NET_BUFFER_LIST_STATUS(p_net_buffer_list) =
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
p_net_buffer_list,<o:p></o:p></P>
<P
class=MsoNormal>+
send_complete_flags); <o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//Set all the data needed for process_sg_list<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_port = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_sgl = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_endpt = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_nbl = p_net_buffer_list;<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO remove this line from process_sg_real<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ //Set all the
data needed for process_sg_list<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_port
= p_port;<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_sgl =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_endpt
= NULL;<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_nbl =
p_net_buffer_list;<o:p></o:p></P>
<P class=MsoNormal>+
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></P>
<P class=MsoNormal>+ //TODO remove
this line from process_sg_real<o:p></o:p></P>
<P class=MsoNormal>+
s_buf->p_send_buf = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//We can also define p_sg_buf as a static member of send_buf,<o:p></o:p></P>
<P
class=MsoNormal>-
// But the problem is that we don't know it's size<o:p></o:p></P>
<P
class=MsoNormal>-
if (s_buf->p_sg_buf == NULL) {<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_sg_buf = (PVOID)
cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></P>
<P class=MsoNormal>+ //We can also
define p_sg_buf as a static member of send_buf,<o:p></o:p></P>
<P class=MsoNormal>+ // But the
problem is that we don't know it's size<o:p></o:p></P>
<P class=MsoNormal>+ if
(s_buf->p_sg_buf == NULL) {<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_sg_buf = (PVOID)
cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool ,
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(pTemp != NULL);<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl = pTemp;<o:p></o:p></P>
<P
class=MsoNormal>-
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf,
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x, PhysBufCnt=%ld, NB
LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></P>
<P
class=MsoNormal>-
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf)
,<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size)
);<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl,
p_netbuf);<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-#else
<o:p></o:p></P>
<P
class=MsoNormal>+
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool ,
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT(pTemp != NULL);<o:p></o:p></P>
<P
class=MsoNormal>+
p_sgl = pTemp;<o:p></o:p></P>
<P
class=MsoNormal>+
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf,
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></P>
<P
class=MsoNormal>+
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x, PhysBufCnt=%ld, NB
LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></P>
<P
class=MsoNormal>+
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf)
,<o:p></o:p></P>
<P
class=MsoNormal>+
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size)
);<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl,
p_netbuf);<o:p></o:p></P>
<P class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>+#else
<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P
class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SW_in_loop;<o:p></o:p></P>
<P
class=MsoNormal>+
++g_ipoib_send_SW_in_loop;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(s_buf->p_sg_buf);<o:p></o:p></P>
<P
class=MsoNormal>-
status = NdisMAllocateNetBufferSGList(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuf,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf,<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></P>
<P
class=MsoNormal>-
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->sg_list_size);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock
);
<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(s_buf->p_sg_buf);<o:p></o:p></P>
<P
class=MsoNormal>+
status = NdisMAllocateNetBufferSGList(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P
class=MsoNormal>+
p_netbuf,<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf,<o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></P>
<P
class=MsoNormal>+
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->sg_list_size);<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_acquire(
&p_port->send_lock ); <o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-//
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P class=MsoNormal>+// }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
// TODOD: There is a bug here if we have succeeded in sending some and
failed<o:p></o:p></P>
<P
class=MsoNormal>-
// with the otheres.<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>+
// TODOD: There is a bug here if we have succeeded in sending some and
failed<o:p></o:p></P>
<P
class=MsoNormal>+
// with the otheres.<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* fail net buffer list */<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
p_net_buffer_list,<o:p></o:p></P>
<P
class=MsoNormal>-
send_complete_flags);
<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_LOWER_IRQL(old_irql, DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>+
/* fail net buffer list */<o:p></o:p></P>
<P
class=MsoNormal>+
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMSendNetBufferListsCompleteX(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
p_net_buffer_list,<o:p></o:p></P>
<P
class=MsoNormal>+
send_complete_flags); <o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_LOWER_IRQL(old_irql,
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline void <o:p></o:p></P>
<P class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_send_NB_SG *s_buf,
<o:p></o:p></P>
<P
class=MsoNormal>-
IN NDIS_STATUS
status,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ULONG
compl_flags,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
boolean_t
bLock ) <o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_send_NB_SG *s_buf, <o:p></o:p></P>
<P class=MsoNormal>+ IN
NDIS_STATUS
status,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ULONG
compl_flags,<o:p></o:p></P>
<P class=MsoNormal>+ IN
boolean_t
bLock ) <o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( s_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Processing send completion for NBL=0x%p .\n", s_buf->p_nbl
));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
// Free SGL element allocated by NDIS<o:p></o:p></P>
<P
class=MsoNormal>-
// We should do it before freeing the whole NBL<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMFreeNetBufferSGList(<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_sgl,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_curr_nb);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
// No need to delete p_sg_buf at this state, we will destroy the whole list at
the end of the execution<o:p></o:p></P>
<P
class=MsoNormal>-
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></P>
<P class=MsoNormal>+ ("Processing send
completion for NBL=0x%p .\n", s_buf->p_nbl ));<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ // Free SGL element allocated by
NDIS<o:p></o:p></P>
<P class=MsoNormal>+ // We should do it before freeing the
whole NBL<o:p></o:p></P>
<P class=MsoNormal>+ NdisMFreeNetBufferSGList(<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_sgl,<o:p></o:p></P>
<P class=MsoNormal>+
s_buf->p_curr_nb);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ // No need to delete p_sg_buf at this
state, we will destroy the whole list at the end of the execution<o:p></o:p></P>
<P class=MsoNormal>+
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if (NET_BUFFER_LIST_STATUS(s_buf->p_nbl) != NDIS_STATUS_FAILURE)
{<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO what about other statuses ?????<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if
(NET_BUFFER_LIST_STATUS(s_buf->p_nbl) != NDIS_STATUS_FAILURE)
{<o:p></o:p></P>
<P class=MsoNormal>+ //TODO what about
other statuses ?????<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P class=MsoNormal>+ NET_BUFFER_LIST_STATUS(s_buf->p_nbl) =
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch (status) {<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_ack;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_reset;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_FAILURE:<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_PAUSED:<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_SEND_ABORTED:<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_RESOURCES:<o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Complete the NBL */<o:p></o:p></P>
<P
class=MsoNormal>-
if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P
class=MsoNormal>-
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =
<o:p></o:p></P>
<P
class=MsoNormal>-
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>+ switch (status) {<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P
class=MsoNormal>+
++g_ipoib_send_ack;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></P>
<P
class=MsoNormal>+
++g_ipoib_send_reset;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_FAILURE:<o:p></o:p></P>
<P
class=MsoNormal>+
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_PAUSED:<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_SEND_ABORTED:<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_RESOURCES:<o:p></o:p></P>
<P class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+ /* Complete the NBL */<o:p></o:p></P>
<P class=MsoNormal>+ if
(IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></P>
<P class=MsoNormal>+
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =
<o:p></o:p></P>
<P class=MsoNormal>+
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></P>
<P class=MsoNormal>
if(pLsoInfo->Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></P>
<P
class=MsoNormal>-
{
<o:p></o:p></P>
<P
class=MsoNormal>-
UINT TcpPayLoad = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO optimize this code during MSS/LSO building<o:p></o:p></P>
<P
class=MsoNormal>-
for (PNET_BUFFER NetBuffer =
NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></P>
<P
class=MsoNormal>-
NetBuffer != NULL ; <o:p></o:p></P>
<P
class=MsoNormal>-
NetBuffer =
NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoInfo->LsoV1TransmitComplete.TcpPayload =
TcpPayLoad;
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if (pLsoInfo->Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoInfo->LsoV2TransmitComplete.Type =
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (bLock) {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &s_buf->p_port->send_lock );
<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
} <o:p></o:p></P>
<P class=MsoNormal>+
{
<o:p></o:p></P>
<P
class=MsoNormal>+
UINT TcpPayLoad = 0;<o:p></o:p></P>
<P class=MsoNormal>+
//TODO optimize this
code during MSS/LSO building<o:p></o:p></P>
<P
class=MsoNormal>+
for (PNET_BUFFER NetBuffer =
NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></P>
<P
class=MsoNormal>+
NetBuffer != NULL ; <o:p></o:p></P>
<P
class=MsoNormal>+
NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
pLsoInfo->LsoV1TransmitComplete.TcpPayload =
TcpPayLoad;
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if
(pLsoInfo->Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
pLsoInfo->LsoV2TransmitComplete.Type =
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if (bLock)
{<o:p></o:p></P>
<P
class=MsoNormal>+
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_spinlock_acquire( &s_buf->p_port->send_lock );
<o:p></o:p></P>
<P class=MsoNormal>+ } else
{<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_nbl, compl_flags );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ } <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( s_buf->p_send_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( FreeSendBuf );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeToNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></P>
<P
class=MsoNormal>-
}
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Dereference the enpoint used for the transfer. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( s_buf->p_endpt ) {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>-#if 0 <o:p></o:p></P>
<P
class=MsoNormal>-
if (status == NDIS_STATUS_SUCCESS) {<o:p></o:p></P>
<P
class=MsoNormal>-
//++g_ipoib_send_SG_real;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ if( s_buf->p_send_buf )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
FreeSendBuf );<o:p></o:p></P>
<P class=MsoNormal>+
NdisFreeToNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf->p_send_buf );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></P>
<P class=MsoNormal>+ } <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* Dereference the enpoint used for the
transfer. */<o:p></o:p></P>
<P class=MsoNormal>+ if( s_buf->p_endpt ) {<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+#if 0 <o:p></o:p></P>
<P class=MsoNormal>+ if (status == NDIS_STATUS_SUCCESS)
{<o:p></o:p></P>
<P class=MsoNormal>+
//++g_ipoib_send_SG_real;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+
++g_ipoib_send_SG_failed;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
//Put back into the pool list structure allocated for the NB<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t*
)s_buf);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendComp );<o:p></o:p></P>
<P class=MsoNormal>+ //Put back into the pool list structure
allocated for the NB<o:p></o:p></P>
<P class=MsoNormal>+
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t*
)s_buf);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendComp );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_resume(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
boolean_t
b_pending )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
boolean_t
b_pending )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_list_item_t
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG *s_buf =
NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
boolean_t
b_good_port_state = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( BuildSendDesc );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal>+
cl_list_item_t *p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG *s_buf
= NULL;<o:p></o:p></P>
<P class=MsoNormal>+
boolean_t
b_good_port_state = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( GetEndpt );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( BuildSendDesc
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( ProcessFailedSends
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PostSend );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM(b_pending);<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM(b_pending);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalid port state =%d - Flushing the penging list\n", p_port->state)
);<o:p></o:p></P>
<P
class=MsoNormal>-
b_good_port_state = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->state != IB_QPS_RTS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalid port state =%d - Flushing the penging list\n", p_port->state)
);<o:p></o:p></P>
<P class=MsoNormal>+ b_good_port_state
= FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if (p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
};<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
while (p_item !=
cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P class=MsoNormal>+ if
(p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ };<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qlist_remove_head(
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ while (p_item !=
cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this
casting<o:p></o:p></P>
<P class=MsoNormal>+ s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if (!b_good_port_state) {<o:p></o:p></P>
<P
class=MsoNormal>-
// Port is in error state, flush the list<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P class=MsoNormal>+ if
(!b_good_port_state) {<o:p></o:p></P>
<P
class=MsoNormal>+
// Port is in error state, flush the list<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
__send_complete_net_buffer(<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ } else
{<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("No available WQEs.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL,
(PSCATTER_GATHER_LIST) s_buf->p_sgl, s_buf);<o:p></o:p></P>
<P
class=MsoNormal>+
/* Check the send queue and pend the request if not empty. */<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth
)<o:p></o:p></P>
<P class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("No available WQEs.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL,
(PSCATTER_GATHER_LIST) s_buf->p_sgl, s_buf);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P
class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if (!continue_sending) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list,
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></P>
<P
class=MsoNormal>-
goto Cleanup;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
if (!continue_sending) {<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list,
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></P>
<P
class=MsoNormal>+
goto Cleanup;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> Cleanup:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO: use s_buf-><data_member> directly,
instead of useless copies<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __send_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*cq_context )<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
ib_cq_handle_t
h_cq,<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*cq_context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_wc_t
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_t
done_list;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
ip_stat_sel_t
type;<o:p></o:p></P>
<P
class=MsoNormal>-
size_t
i;<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER
*p_netbuffer = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG
*s_buf;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_wc_t
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_t
done_list;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+
ip_stat_sel_t type;<o:p></o:p></P>
<P class=MsoNormal>+
size_t
i;<o:p></o:p></P>
<P class=MsoNormal>+
NET_BUFFER *p_netbuffer =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG
*s_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendCompBundle );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendCb );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PollSend );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( SendComp );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( FreeSendBuf );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( RearmSend );<o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( PortResume );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendCompBundle
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendCb );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PollSend );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( SendComp );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( FreeSendBuf
);<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( RearmSend );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( PortResume
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_clr( SendCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_clr( SendCompBundle
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendCb );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( SendCb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM( h_cq );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &done_list );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &done_list
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_send_cb );<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)cq_context;<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_send_cb
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
for( i = 0; i < MAX_SEND_WC; i++ )<o:p></o:p></P>
<P
class=MsoNormal>-
wc[i].p_next = &wc[i + 1];<o:p></o:p></P>
<P
class=MsoNormal>-
wc[MAX_SEND_WC - 1].p_next = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ for( i = 0; i < MAX_SEND_WC; i++
)<o:p></o:p></P>
<P class=MsoNormal>+ wc[i].p_next =
&wc[i + 1];<o:p></o:p></P>
<P class=MsoNormal>+ wc[MAX_SEND_WC - 1].p_next =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
do<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_free = wc;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PollSend );<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->poll_cq(
p_port->ib_mgr.h_send_cq, &p_free, &p_wc );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PollSend );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal>+ do<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_free =
wc;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start(
PollSend );<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq,
&p_free, &p_wc );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PollSend );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status
== IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( p_wc )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( SendComp );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND
|| p_wc->wc_type == IB_WC_LSO);<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Successfull send completion for NBL=0x%p .\n", s_buf->p_nbl
));<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( s_buf );<o:p></o:p></P>
<P class=MsoNormal>+ while( p_wc
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
cl_perf_start(
SendComp );<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND
|| p_wc->wc_type == IB_WC_LSO);<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Successfull send completion for NBL=0x%p .\n", s_buf->p_nbl
));<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( s_buf );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = s_buf->p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt = s_buf->p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
switch( p_wc->status )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
case IB_WCS_SUCCESS:<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->h_mcast )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF
&&<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
type = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
type = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
type = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
switch( p_wc->status )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
case IB_WCS_SUCCESS:<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_endpt->h_mcast )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF
&&<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></P>
<P class=MsoNormal>+
p_endpt->dgid.multicast.raw_group_id[13]
== 0xFF )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
type = IP_STAT_BCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
type = IP_STAT_MCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
type = IP_STAT_UCAST_BYTES;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, type,
NET_BUFFER_DATA_LENGTH(p_netbuffer) ); <o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>+
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, type,
NET_BUFFER_DATA_LENGTH(p_netbuffer) ); <o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>-
("Flushed send completion.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>+
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></P>
<P
class=MsoNormal>+
("Flushed send completion.\n")
);<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status
),<o:p></o:p></P>
<P
class=MsoNormal>-
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P
class=MsoNormal>-
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(s_buf, status,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></P>
<P
class=MsoNormal>+
default:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status
),<o:p></o:p></P>
<P
class=MsoNormal>+
(int)p_wc->vendor_specific) );<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></P>
<P
class=MsoNormal>+
status = NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
__send_complete_net_buffer(s_buf, status,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_wc = p_wc->p_next;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_inc( SendCompBundle );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* If we didn't use up every WC, break out. */<o:p></o:p></P>
<P
class=MsoNormal>-
} while( !p_free );<o:p></o:p></P>
<P
class=MsoNormal>+
p_wc = p_wc->p_next;<o:p></o:p></P>
<P
class=MsoNormal>+
cl_perf_inc( SendCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* If we didn't
use up every WC, break out. */<o:p></o:p></P>
<P class=MsoNormal>+ } while( !p_free );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Resume any sends awaiting resources. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( PortResume );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_resume( p_port, TRUE );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, PortResume );<o:p></o:p></P>
<P class=MsoNormal>+ /* Resume any sends awaiting resources.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( PortResume
);<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_resume( p_port, TRUE
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, PortResume );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Rearm the CQ. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( RearmSend );<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, RearmSend );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+ /* Rearm the CQ. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( RearmSend
);<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, RearmSend );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status == IB_SUCCESS
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_send_cb );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port, ref_send_cb
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, SendCb );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle
);<o:p></o:p></P>
<P
class=MsoNormal>-
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, SendCb );<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_update_ctr(
&p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></P>
<P class=MsoNormal>+
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -5853,349 +5900,349 @@<o:p></o:p></P>
<P
class=MsoNormal> ******************************************************************************/<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_init( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_init( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_init( &p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_qmap_init(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ cl_qmap_init(
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_init(
&p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO Restore CM<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></P>
<P
class=MsoNormal>-IN
void*
p_context );<o:p></o:p></P>
<P class=MsoNormal>+IN
void* p_context );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_init(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_init( &p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
NdisInitializeListHead( &p_port->endpt_mgr.pending_conns
);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_event_init( &p_port->endpt_mgr.event, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_init(
&p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
NdisInitializeListHead( &p_port->endpt_mgr.pending_conns
);<o:p></o:p></P>
<P class=MsoNormal>+
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_event_init(
&p_port->endpt_mgr.event, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></P>
<P class=MsoNormal>+
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_thread_init( &p_port->endpt_mgr.h_thread, <o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_cm_mgr_thread,<o:p></o:p></P>
<P
class=MsoNormal>-
( const void *)p_port, <o:p></o:p></P>
<P
class=MsoNormal>-
"CmEndPtMgr" );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_thread_init(
&p_port->endpt_mgr.h_thread, <o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_cm_mgr_thread,<o:p></o:p></P>
<P
class=MsoNormal>+
( const void *)p_port, <o:p></o:p></P>
<P
class=MsoNormal>+
"CmEndPtMgr" );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM(p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM(p_port);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> //TODO CM Restore<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></P>
<P
class=MsoNormal>-IN
void*
p_context )<o:p></o:p></P>
<P class=MsoNormal>+IN
void* p_context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
ib_status;<o:p></o:p></P>
<P
class=MsoNormal>-
LIST_ENTRY
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port =( ipoib_port_t
*)p_context;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P
class=MsoNormal>-
("Starting Port [%d] Endpt CM thread \n", p_port->port_num )
);<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t ib_status;<o:p></o:p></P>
<P class=MsoNormal>+ LIST_ENTRY
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t *p_port =(
ipoib_port_t *)p_context;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P class=MsoNormal>+ ("Starting Port
[%d] Endpt CM thread \n", p_port->port_num ) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( !p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE
);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
while( ( p_item = NdisInterlockedRemoveHeadList( <o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.pending_conns,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P class=MsoNormal>+ while(
!p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_event_wait_on(
&p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ while( ( p_item =
NdisInterlockedRemoveHeadList( <o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.pending_conns,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>-
continue;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>+
continue;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt,<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_endpt->conn.h_send_qp )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt,<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+
p_endpt->mac.addr[4],
p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
if( !p_endpt->conn.h_send_qp )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp
);<o:p></o:p></P>
<P
class=MsoNormal>+
if( ib_status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>+
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
}//while( p_item != NULL )<o:p></o:p></P>
<P class=MsoNormal>+ }//while( p_item
!= NULL )<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( ( p_item = NdisInterlockedRemoveHeadList(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.remove_conns,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P class=MsoNormal>+ while( ( p_item =
NdisInterlockedRemoveHeadList(<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.remove_conns,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("\nDESTROYING Endpt[%p] MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt,<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("\nDESTROYING Endpt[%p] MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt,<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->endpt_mgr.thread_is_done++;<o:p></o:p></P>
<P
class=MsoNormal>-
NdisFreeSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P
class=MsoNormal>-
(" Port [%d] Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->endpt_mgr.thread_is_done++;<o:p></o:p></P>
<P class=MsoNormal>+ NdisFreeSpinLock(
&p_port->endpt_mgr.conn_lock );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></P>
<P class=MsoNormal>+ (" Port [%d]
Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.mac_endpts )
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.lid_endpts )
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.gid_endpts )
);<o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM(p_port);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( cl_is_qmap_empty(
&p_port->endpt_mgr.mac_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( cl_is_qmap_empty(
&p_port->endpt_mgr.lid_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( cl_is_fmap_empty(
&p_port->endpt_mgr.gid_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM(p_port);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts )
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all readers to complete. */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
;<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* We don't need to initiate destruction - this is called only<o:p></o:p></P>
<P
class=MsoNormal>-
* from the __port_destroying function, and destruction cascades<o:p></o:p></P>
<P
class=MsoNormal>-
* to all child objects. Just clear all the maps.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_all( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_all( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all readers to complete.
*/<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ ;<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * We don't need to initiate
destruction - this is called only<o:p></o:p></P>
<P class=MsoNormal>+ * from the __port_destroying
function, and destruction cascades<o:p></o:p></P>
<P class=MsoNormal>+ * to all child objects. Just
clear all the maps.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ cl_qmap_remove_all(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ cl_qmap_remove_all(
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_remove_all(
&p_port->endpt_mgr.gid_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_item_t
*p_fmap_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_t
mc_list;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_t
conn_list;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
local_exist = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_LINK_STATE
link_state;<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS_INDICATION
status_indication;<o:p></o:p></P>
<P class=MsoNormal>+
cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+
cl_fmap_item_t
*p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_t
mc_list;<o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_t
conn_list;<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t
local_exist = 0;<o:p></o:p></P>
<P class=MsoNormal>+
NDIS_LINK_STATE
link_state;<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_STATUS_INDICATION
status_indication;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &mc_list );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &conn_list );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all readers to complete. */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
;<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &mc_list
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &conn_list
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all readers to complete.
*/<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ ;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_remove_all(p_port);<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_remove_all(p_port);<o:p></o:p></P>
<P class=MsoNormal> #else<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.Header.Size = sizeof(NDIS_LINK_STATE);<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.XmitLinkSpeed = <o:p></o:p></P>
<P
class=MsoNormal>-
link_state.RcvLinkSpeed = SET_PORT_RATE_BPS(
p_port->p_adapter->port_rate );<o:p></o:p></P>
<P
class=MsoNormal>+
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></P>
<P
class=MsoNormal>+
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></P>
<P class=MsoNormal>+
link_state.Header.Size =
sizeof(NDIS_LINK_STATE);<o:p></o:p></P>
<P
class=MsoNormal>+
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></P>
<P
class=MsoNormal>+
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></P>
<P
class=MsoNormal>+
link_state.XmitLinkSpeed = <o:p></o:p></P>
<P
class=MsoNormal>+
link_state.RcvLinkSpeed = SET_PORT_RATE_BPS(
p_port->p_adapter->port_rate );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P
class=MsoNormal>-
(PVOID)&link_state,<o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(link_state));<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n")
);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P
class=MsoNormal>-
(PVOID)&link_state,<o:p></o:p></P>
<P
class=MsoNormal>-
sizeof(link_state));<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Connect\n")
);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P
class=MsoNormal>+
(PVOID)&link_state,<o:p></o:p></P>
<P
class=MsoNormal>+
sizeof(link_state));<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n")
);<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
NDIS_STATUS_LINK_STATE,<o:p></o:p></P>
<P
class=MsoNormal>+
(PVOID)&link_state,<o:p></o:p></P>
<P
class=MsoNormal>+
sizeof(link_state));<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate Connect\n")
);<o:p></o:p></P>
<P
class=MsoNormal>+
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
//
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
// ("Link
DOWN!\n") );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>+
// IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
// ("Link DOWN!\n") );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_local_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO: CM RESTORE<o:p></o:p></P>
<P
class=MsoNormal>-
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->p_local_endpt
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ //TODO: CM
RESTORE<o:p></o:p></P>
<P class=MsoNormal>+
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->p_local_endpt->gid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->p_local_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_local_endpt->dlid ) {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->p_local_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_local_endpt->dlid = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_head(<o:p></o:p></P>
<P
class=MsoNormal>-
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
local_exist = 1;<o:p></o:p></P>
<P class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->p_local_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->p_local_endpt->mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_local_endpt->dlid ) {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->p_local_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_local_endpt->dlid = 0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_insert_head(<o:p></o:p></P>
<P
class=MsoNormal>+
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item
);<o:p></o:p></P>
<P class=MsoNormal>+ local_exist =
1;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_local_endpt = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_local_endpt = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_next( p_item );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->h_mcast )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* We destroy MC endpoints since they will get recreated<o:p></o:p></P>
<P
class=MsoNormal>-
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_head(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ while( p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qmap_next( p_item );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_endpt->h_mcast )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* We destroy MC endpoints since they will get recreated<o:p></o:p></P>
<P
class=MsoNormal>+
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail(<o:p></o:p></P>
<P
class=MsoNormal>-
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* destroy connected endpoints if any */<o:p></o:p></P>
<P
class=MsoNormal>-
else if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->conn_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->gid_item );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail(<o:p></o:p></P>
<P
class=MsoNormal>+
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* destroy
connected endpoints if any */<o:p></o:p></P>
<P class=MsoNormal>+ else if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P
class=MsoNormal>+
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->conn_item );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail(<o:p></o:p></P>
<P
class=MsoNormal>-
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->h_av )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Destroy the AV for all other endpoints. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->h_av = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dlid = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_insert_tail(<o:p></o:p></P>
<P
class=MsoNormal>+
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_endpt->h_av )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* Destroy the AV for all other endpoints. */<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av
);<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->h_av = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if(
p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>+
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->dlid = 0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//TODO CM<o:p></o:p></P>
<P
class=MsoNormal>-
/*while( cl_qlist_count( &conn_list ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
endpt_cm_destroy_conn( p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></P>
<P
class=MsoNormal>-
}*/<o:p></o:p></P>
<P class=MsoNormal>+ //TODO CM<o:p></o:p></P>
<P class=MsoNormal>+ /*while( cl_qlist_count( &conn_list )
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
endpt_cm_destroy_conn( p_port,<o:p></o:p></P>
<P
class=MsoNormal>+
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></P>
<P class=MsoNormal>+ }*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if(cl_qlist_count( &mc_list ) - local_exist)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->mcast_cnt = (uint32_t)cl_qlist_count( &mc_list ) -
local_exist;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->mcast_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE
);<o:p></o:p></P>
<P
class=MsoNormal>-
}
<o:p></o:p></P>
<P class=MsoNormal>+ if(cl_qlist_count( &mc_list ) -
local_exist)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_port->mcast_cnt = (uint32_t)cl_qlist_count( &mc_list ) -
local_exist;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_port->mcast_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ } <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("p_port->mcast_cnt =
%d\n", p_port->mcast_cnt - local_exist));<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt -
local_exist));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Destroy all multicast endpoints now that we have released the lock.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
while( cl_qlist_count( &mc_list ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_list_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qlist_remove_head( &mc_list );<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t,
mac_item.pool_item.list_item);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Destroy all multicast endpoints now
that we have released the lock. */<o:p></o:p></P>
<P class=MsoNormal>+ while( cl_qlist_count( &mc_list )
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
cl_list_item_t *p_item;<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qlist_remove_head( &mc_list );<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT(p_item, ipoib_endpt_t,
mac_item.pool_item.list_item);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -6207,542 +6254,542 @@<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> #if 0 //CM<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_item_t*
p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>-#endif <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_item_t*
p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>+#endif <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* This function must be called from the receive path */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(p_port->endpt_rdr > 0);<o:p></o:p></P>
<P class=MsoNormal>+ /* This function must be called from the
receive path */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(p_port->endpt_rdr >
0);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all readers to complete. */ <o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr > 1 )<o:p></o:p></P>
<P
class=MsoNormal>-
;<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all readers to complete.
*/ <o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr > 1
)<o:p></o:p></P>
<P class=MsoNormal>+ ;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Remove the endpoint from the maps so further requests don't find it.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* The enpoints are *ALWAYS* in both the MAC and GID maps. They are
only<o:p></o:p></P>
<P
class=MsoNormal>-
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ /* Remove the endpoint from the maps so
further requests don't find it. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_qmap_remove_item(
&p_port->endpt_mgr.mac_endpts, &p_endpt->mac_item
);<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * The enpoints are *ALWAYS* in both
the MAC and GID maps. They are only<o:p></o:p></P>
<P class=MsoNormal>+ * in the LID map if the GID has the
same subnet prefix as us.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_remove_item(
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item
);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->conn_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_fmap_item =
cl_fmap_get( &p_port->endpt_mgr.conn_endpts, &p_endpt->dgid
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( p_fmap_item
!= cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->conn_item );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->lid_item );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy( &p_endpt->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//TODO CM<o:p></o:p></P>
<P
class=MsoNormal>-
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ //TODO CM<o:p></o:p></P>
<P class=MsoNormal>+ //endpt_cm_destroy_conn( p_port, p_endpt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> NTSTATUS<o:p></o:p></P>
<P class=MsoNormal> ipoib_mac_to_gid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ib_gid_t*
p_gid )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
ib_gid_t*
p_gid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t*
p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
key = 0;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t*
p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t key = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
*p_gid = p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ *p_gid = p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> NTSTATUS<o:p></o:p></P>
<P class=MsoNormal> ipoib_mac_to_path(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ib_path_rec_t*
p_path )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
ib_path_rec_t*
p_path
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t*
p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
key = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
sl;<o:p></o:p></P>
<P
class=MsoNormal>-
net32_t
flow_lbl;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
hop_limit;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
pkt_life;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t*
p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ uint64_t
key = 0;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t sl;<o:p></o:p></P>
<P class=MsoNormal>+
net32_t flow_lbl;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t
hop_limit;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t pkt_life;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_local_endpt == NULL )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("No local endpoint.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->p_local_endpt == NULL
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("No local endpoint.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( mac.addr[0] == 0 && mac.addr[1] == 0 && mac.addr[2] == 0
&&<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[3] == 0 && mac.addr[4] == 0 && mac.addr[5] == 0
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = p_port->p_local_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( mac.addr[0] == 0 &&
mac.addr[1] == 0 && mac.addr[2] == 0 &&<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[3] == 0
&& mac.addr[4] == 0 && mac.addr[5] == 0 )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
p_port->p_local_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item ==
cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return STATUS_INVALID_PARAMETER;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_path->service_id = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_path->dgid = p_endpt->dgid;<o:p></o:p></P>
<P
class=MsoNormal>-
p_path->sgid = p_port->p_local_endpt->dgid;<o:p></o:p></P>
<P
class=MsoNormal>-
p_path->dlid = p_endpt->dlid;<o:p></o:p></P>
<P
class=MsoNormal>-
p_path->slid = p_port->p_local_endpt->dlid;<o:p></o:p></P>
<P class=MsoNormal>+ p_path->service_id = 0;<o:p></o:p></P>
<P class=MsoNormal>+ p_path->dgid =
p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+ p_path->sgid =
p_port->p_local_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+ p_path->dlid =
p_endpt->dlid;<o:p></o:p></P>
<P class=MsoNormal>+ p_path->slid =
p_port->p_local_endpt->dlid;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_member_get_sl_flow_hop(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></P>
<P
class=MsoNormal>-
&sl,<o:p></o:p></P>
<P
class=MsoNormal>-
&flow_lbl,<o:p></o:p></P>
<P
class=MsoNormal>-
&hop_limit<o:p></o:p></P>
<P
class=MsoNormal>-
);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_path->slid == p_path->dlid )<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_life = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></P>
<P class=MsoNormal>+ ib_member_get_sl_flow_hop(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></P>
<P class=MsoNormal>+
&sl,<o:p></o:p></P>
<P class=MsoNormal>+
&flow_lbl,<o:p></o:p></P>
<P class=MsoNormal>+
&hop_limit<o:p></o:p></P>
<P class=MsoNormal>+ );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( p_path->slid == p_path->dlid
)<o:p></o:p></P>
<P class=MsoNormal>+ pkt_life =
0;<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ pkt_life =
p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_path_rec_init_local(<o:p></o:p></P>
<P
class=MsoNormal>-
p_path,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->dgid,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->p_local_endpt->dgid,<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dlid,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_local_endpt->dlid,<o:p></o:p></P>
<P
class=MsoNormal>-
1,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></P>
<P
class=MsoNormal>-
sl, 0,<o:p></o:p></P>
<P
class=MsoNormal>-
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></P>
<P
class=MsoNormal>-
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></P>
<P
class=MsoNormal>-
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></P>
<P
class=MsoNormal>-
0 );<o:p></o:p></P>
<P class=MsoNormal>+ ib_path_rec_init_local(<o:p></o:p></P>
<P class=MsoNormal>+
p_path,<o:p></o:p></P>
<P class=MsoNormal>+
&p_endpt->dgid,<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->p_local_endpt->dgid,<o:p></o:p></P>
<P class=MsoNormal>+
p_endpt->dlid,<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_local_endpt->dlid,<o:p></o:p></P>
<P class=MsoNormal>+ 1,<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></P>
<P class=MsoNormal>+ sl,
0,<o:p></o:p></P>
<P class=MsoNormal>+
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></P>
<P class=MsoNormal>+
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></P>
<P class=MsoNormal>+
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></P>
<P class=MsoNormal>+ 0
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Set global routing information. */<o:p></o:p></P>
<P
class=MsoNormal>-
ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></P>
<P class=MsoNormal>+ /* Set global routing information.
*/<o:p></o:p></P>
<P class=MsoNormal>+ ib_path_rec_set_hop_flow_raw( p_path,
hop_limit, flow_lbl, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ p_path->tclass =
p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ipoib_endpt_t**
const
pp_endpt )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
OUT
ipoib_endpt_t** const pp_endpt
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS
status;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
key;<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_STATUS
status;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t key;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
PERF_DECLARE( EndptQueue );<o:p></o:p></P>
<P class=MsoNormal>+ PERF_DECLARE( EndptQueue
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !cl_memcmp( &mac, &p_port->p_adapter->params.conf_mac,
sizeof(mac) ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Discard loopback traffic. */<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Discarding loopback traffic\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !cl_memcmp( &mac,
&p_port->p_adapter->params.conf_mac, sizeof(mac) ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Discard
loopback traffic. */<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Discarding loopback traffic\n") );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
key = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ key = 0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Look for :\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P class=MsoNormal>+ ("Look for
:\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[0],
mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[3],
mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*pp_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_ref( *pp_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ *pp_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_ref( *pp_endpt
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_start( EndptQueue );<o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_endpt_queue( *pp_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_perf_stop( &p_port->p_adapter->perf, EndptQueue );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
*pp_endpt = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_start( EndptQueue
);<o:p></o:p></P>
<P class=MsoNormal>+ status = ipoib_endpt_queue( *pp_endpt
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_perf_stop(
&p_port->p_adapter->perf, EndptQueue );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != NDIS_STATUS_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ *pp_endpt =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
ib_gid_t*
const
p_gid,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
UNALIGNED net32_t* const p_qpn
)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
OUT ib_gid_t*
const
p_gid,<o:p></o:p></P>
<P class=MsoNormal>+
OUT UNALIGNED net32_t*
const p_qpn )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
UNALIGNED<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
key;<o:p></o:p></P>
<P class=MsoNormal>+ UNALIGNED<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t key;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
key = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ key = 0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed endpoint lookup.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
*p_gid = p_endpt->dgid;<o:p></o:p></P>
<P
class=MsoNormal>-
*p_qpn = p_endpt->qpn;<o:p></o:p></P>
<P class=MsoNormal>+ *p_gid = p_endpt->dgid;<o:p></o:p></P>
<P class=MsoNormal>+ *p_qpn = p_endpt->qpn;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ib_gid_t*
const
p_gid )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ib_gid_t*
const
p_gid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_item_t
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_fmap_get( &p_port->endpt_mgr.gid_endpts, p_gid
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_fmap_get(
&p_port->endpt_mgr.gid_endpts, p_gid );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item == cl_fmap_end(
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return p_endpt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
net16_t
lid )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
net16_t
lid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_get( &p_port->endpt_mgr.lid_endpts, lid
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_qmap_end( &p_port->endpt_mgr.lid_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_get(
&p_port->endpt_mgr.lid_endpts, lid );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item == cl_qmap_end(
&p_port->endpt_mgr.lid_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return p_endpt;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const
p_endpt )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("insert :\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P class=MsoNormal>+ ("insert
:\t MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[0],
mac.addr[1], mac.addr[2],<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[3],
mac.addr[4], mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* __endpt_mgr_insert expects *one* reference to be held when being called.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></P>
<P
class=MsoNormal>-
status= __endpt_mgr_insert( p_port, mac, p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* __endpt_mgr_insert expects *one*
reference to be held when being called. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></P>
<P class=MsoNormal>+ status= __endpt_mgr_insert( p_port, mac,
p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> inline ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_endpt
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
key;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status_t
cl_status;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_qitem;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_item_t
*p_fitem;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t key;<o:p></o:p></P>
<P class=MsoNormal>+ cl_status_t
cl_status;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_qitem;<o:p></o:p></P>
<P class=MsoNormal>+ cl_fmap_item_t
*p_fitem;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all accesses to the map to complete. */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr > 1 )<o:p></o:p></P>
<P
class=MsoNormal>-
;<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all accesses to the map to
complete. */<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr > 1
)<o:p></o:p></P>
<P class=MsoNormal>+ ;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Link the endpoint to the port. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_status = cl_obj_insert_rel_parent_locked(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->rel, &p_port->obj, &p_endpt->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Link the endpoint to the port.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_status =
cl_obj_insert_rel_parent_locked(<o:p></o:p></P>
<P class=MsoNormal>+
&p_endpt->rel, &p_port->obj, &p_endpt->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_status != CL_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INVALID_STATE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_status != CL_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INVALID_STATE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></P>
<P
class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc(
&p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></P>
<P class=MsoNormal>+ ("ref type
%d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac = mac;<o:p></o:p></P>
<P
class=MsoNormal>-
key = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
p_qitem = cl_qmap_insert(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_qitem == &p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
p_fitem = cl_fmap_insert(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid,
&p_endpt->gid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_fitem == &p_endpt->gid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_qitem = cl_qmap_insert(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid,
&p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_qitem == &p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_qitem != &p_endpt->lid_item) {<o:p></o:p></P>
<P
class=MsoNormal>-
// Since we failed to insert into the list, make sure it is not
removed<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dlid =0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt->mac = mac;<o:p></o:p></P>
<P class=MsoNormal>+ key = 0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ p_qitem = cl_qmap_insert(<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_qitem ==
&p_endpt->mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_fitem = cl_fmap_insert(<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid,
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_fitem ==
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_qitem =
cl_qmap_insert(<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid,
&p_endpt->lid_item );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_qitem == &p_endpt->lid_item );<o:p></o:p></P>
<P class=MsoNormal>+ if (p_qitem !=
&p_endpt->lid_item) {<o:p></o:p></P>
<P class=MsoNormal>+
// Since we failed to insert into the list, make sure it
is not removed<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->dlid =0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
mac_addr_t
bcast_mac;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ mac_addr_t
bcast_mac;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Cache the broadcast group properties for creating future mcast
groups.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.bcast_rec = *p_mcast_rec->p_member_rec;<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Cache the broadcast group
properties for creating future mcast groups.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ p_port->ib_mgr.bcast_rec =
*p_mcast_rec->p_member_rec;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Allocate the broadcast endpoint. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = ipoib_endpt_create(
&p_mcast_rec->p_member_rec->mgid,<o:p></o:p></P>
<P
class=MsoNormal>-
0 , CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* set reference to transport to be used while is not attached to the port
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->port_num, p_mcast_rec );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Allocate the broadcast endpoint.
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt = ipoib_endpt_create(
&p_mcast_rec->p_member_rec->mgid,<o:p></o:p></P>
<P class=MsoNormal>+ 0 ,
CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* set reference to transport to be used
while is not attached to the port */<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt->is_mcast_listener =
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt->p_ifc =
p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P class=MsoNormal>+ status = ipoib_endpt_set_mcast( p_endpt,
p_port->ib_mgr.h_pd,<o:p></o:p></P>
<P class=MsoNormal>+
p_port->port_num, p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Add the broadcast endpoint to the endpoint map. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ /* Add the broadcast endpoint to the
endpoint map. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memset( &bcast_mac, 0xFF,
sizeof(bcast_mac) );<o:p></o:p></P>
<P class=MsoNormal>+ status = __endpt_mgr_insert_locked(
p_port, bcast_mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_remove_endpt(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO CM<o:p></o:p></P>
<P class=MsoNormal>-//
cl_fmap_item_t *p_fmap_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
key;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ //TODO CM<o:p></o:p></P>
<P class=MsoNormal>+// cl_fmap_item_t *p_fmap_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t key;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
key = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ key = 0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Remove the endpoint from the maps so further requests don't find it.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all readers to finish */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
;<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_remove( &p_port->endpt_mgr.mac_endpts, key
);<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Dereference the endpoint. If the ref count goes to zero,
it<o:p></o:p></P>
<P
class=MsoNormal>-
* will get freed.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* The enpoints are *ALWAYS* in both the MAC and GID maps. They are
only<o:p></o:p></P>
<P
class=MsoNormal>-
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Remove the endpoint from the maps so
further requests don't find it. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all readers to finish
*/<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ ;<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_remove(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Dereference the endpoint.
If the ref count goes to zero, it<o:p></o:p></P>
<P class=MsoNormal>+ * will get freed.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * The
enpoints are *ALWAYS* in both the MAC and GID maps. They are
only<o:p></o:p></P>
<P class=MsoNormal>+ * in the
LID map if the GID has the same subnet prefix as us.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+
cl_fmap_remove_item(<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item
);<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->conn_item );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P
class=MsoNormal>+
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></P>
<P class=MsoNormal>+
&p_endpt->conn_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dlid = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_endpt->dlid )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
cl_qmap_remove_item(<o:p></o:p></P>
<P
class=MsoNormal>+
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->dlid = 0;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO CM<o:p></o:p></P>
<P
class=MsoNormal>-
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ //TODO
CM<o:p></o:p></P>
<P class=MsoNormal>+
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> #if DBG<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_dec(
&p_port->ref[ref_endpt_track] );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>+
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_ENDPT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /*<o:p></o:p></P>
<P class=MsoNormal> * The sequence for port up is as
follows:<o:p></o:p></P>
<P class=MsoNormal>-
* 1. The port goes
active. This allows the adapter to send SA queries<o:p></o:p></P>
<P class=MsoNormal>-
* and join the
broadcast group (and other groups).<o:p></o:p></P>
<P class=MsoNormal>+ * 1. The port goes active. This allows the
adapter to send SA queries<o:p></o:p></P>
<P class=MsoNormal>+ * and join the broadcast group (and other
groups).<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>-
* 2. The adapter
sends an SA query for the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>+ * 2. The adapter sends an SA query for the broadcast
group.<o:p></o:p></P>
<P class=MsoNormal> *<o:p></o:p></P>
<P class=MsoNormal>-
* 3. Upon completion
of the query, the adapter joins the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>+ * 3. Upon completion of the query, the adapter joins
the broadcast group.<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -6751,183 +6798,183 @@<o:p></o:p></P>
<P class=MsoNormal> */<o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_up(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ib_pnp_port_rec_t*
const p_pnp_rec
)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ib_pnp_port_rec_t* const p_pnp_rec
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_port_info_t
*p_port_info;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_mad_t
*mad_in
= NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_mad_t
*mad_out = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
static int
cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->n_no_progress = 0; // Init the send failure counter<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if ( p_port->state == IB_QPS_INIT ) <o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("p_port->state = %d - Aborting.\n", p_port->state)
); <o:p></o:p></P>
<P
class=MsoNormal>-
goto up_done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else if ( p_port->state == IB_QPS_RTS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Port init is done. p_port->state = %d.\n", p_port->state )
);<o:p></o:p></P>
<P
class=MsoNormal>-
goto up_done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_INIT;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj ); <o:p></o:p></P>
<P class=MsoNormal>+
ib_port_info_t *p_port_info;<o:p></o:p></P>
<P class=MsoNormal>+
ib_mad_t
*mad_in = NULL;<o:p></o:p></P>
<P class=MsoNormal>+
ib_mad_t
*mad_out = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ static
int
cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></P>
<P class=MsoNormal>+ p_port->n_no_progress = 0; // Init the
send failure counter<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ if ( p_port->state == IB_QPS_INIT )
<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ status =
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("p_port->state = %d - Aborting.\n", p_port->state)
); <o:p></o:p></P>
<P class=MsoNormal>+ goto
up_done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else if ( p_port->state == IB_QPS_RTS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+ status =
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Port init is done. p_port->state = %d.\n", p_port->state )
);<o:p></o:p></P>
<P class=MsoNormal>+ goto
up_done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state =
IB_QPS_INIT;<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
); <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all work requests to get flushed. */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->recv_mgr.depth || p_port->send_mgr.depth )<o:p></o:p></P>
<P
class=MsoNormal>-
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all work requests to get
flushed. */<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->recv_mgr.depth ||
p_port->send_mgr.depth )<o:p></o:p></P>
<P class=MsoNormal>+
cl_thread_suspend( 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeResetEvent( &p_port->sa_event );<o:p></o:p></P>
<P class=MsoNormal>+ KeResetEvent( &p_port->sa_event
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mad_out = (ib_mad_t *) (ib_mad_t*)cl_zalloc(256);<o:p></o:p></P>
<P
class=MsoNormal>-
if(! mad_out)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("failed to allocate mad mad_out\n")); <o:p></o:p></P>
<P
class=MsoNormal>-
goto up_done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
mad_in = (ib_mad_t *) cl_zalloc(256);<o:p></o:p></P>
<P
class=MsoNormal>-
if(! mad_in)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("failed to allocate mad mad_in\n")); <o:p></o:p></P>
<P
class=MsoNormal>-
goto up_done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ mad_out = (ib_mad_t *)
(ib_mad_t*)cl_zalloc(256);<o:p></o:p></P>
<P class=MsoNormal>+ if(! mad_out)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("failed to allocate mad mad_out\n")); <o:p></o:p></P>
<P class=MsoNormal>+ goto
up_done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ mad_in = (ib_mad_t *)
cl_zalloc(256);<o:p></o:p></P>
<P class=MsoNormal>+ if(! mad_in)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("failed to allocate mad mad_in\n")); <o:p></o:p></P>
<P class=MsoNormal>+ goto
up_done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;<o:p></o:p></P>
<P
class=MsoNormal>-
mad_in->method = IB_MAD_METHOD_GET;<o:p></o:p></P>
<P
class=MsoNormal>-
mad_in->base_ver = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
mad_in->class_ver =1;<o:p></o:p></P>
<P
class=MsoNormal>-
mad_in->mgmt_class = IB_MCLASS_SUBN_LID;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></P>
<P class=MsoNormal>+ mad_in->attr_id =
IB_MAD_ATTR_PORT_INFO;<o:p></o:p></P>
<P class=MsoNormal>+ mad_in->method =
IB_MAD_METHOD_GET;<o:p></o:p></P>
<P class=MsoNormal>+ mad_in->base_ver = 1;<o:p></o:p></P>
<P class=MsoNormal>+ mad_in->class_ver =1;<o:p></o:p></P>
<P class=MsoNormal>+ mad_in->mgmt_class =
IB_MCLASS_SUBN_LID;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_local_mad returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
goto up_done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_local_mad returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ goto
up_done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->base_lid = p_pnp_rec->p_port_attr->lid;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Received port info: link width = %d.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port_info->link_width_active) );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.rate =<o:p></o:p></P>
<P
class=MsoNormal>-
ib_port_info_compute_rate( p_port_info );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_set_rate( p_port->p_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port_info->link_width_active,<o:p></o:p></P>
<P
class=MsoNormal>-
ib_port_info_get_link_speed_active( p_port_info ) );<o:p></o:p></P>
<P class=MsoNormal>+ p_port_info =
(ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></P>
<P class=MsoNormal>+ p_port->base_lid =
p_pnp_rec->p_port_attr->lid;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Received port info: link width = %d.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port_info->link_width_active) );<o:p></o:p></P>
<P class=MsoNormal>+ p_port->ib_mgr.rate =<o:p></o:p></P>
<P class=MsoNormal>+
ib_port_info_compute_rate( p_port_info );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ipoib_set_rate(
p_port->p_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
p_port_info->link_width_active,<o:p></o:p></P>
<P class=MsoNormal>+ ib_port_info_get_link_speed_active(
p_port_info ) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = __port_get_bcast( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if (status != IB_SUCCESS)<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
(" __port_get_bcast returned
%s\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></P>
<P class=MsoNormal>+ status = __port_get_bcast( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if (status != IB_SUCCESS)<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+ ("
__port_get_bcast returned %s\n",p_port->p_adapter->p_ifc->get_err_str(
status )));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> up_done:<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_CANCELED )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_CANCELED )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if(mad_out)<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free(mad_out);<o:p></o:p></P>
<P
class=MsoNormal>-
if(mad_in)<o:p></o:p></P>
<P
class=MsoNormal>-
cl_free(mad_in);<o:p></o:p></P>
<P class=MsoNormal>+ if(mad_out)<o:p></o:p></P>
<P class=MsoNormal>+
cl_free(mad_out);<o:p></o:p></P>
<P class=MsoNormal>+ if(mad_in)<o:p></o:p></P>
<P class=MsoNormal>+
cl_free(mad_in);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_port_info_t*
const
p_port_info )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_port_info_t* const p_port_info
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_gid_t
gid;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_av_attr_t
av_attr;<o:p></o:p></P>
<P class=MsoNormal>+
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_gid_t
gid;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+
ib_av_attr_t
av_attr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = ipoib_endpt_create(<o:p></o:p></P>
<P
class=MsoNormal>-
&gid, p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to create local endpt\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ib_gid_set_default( &gid,
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
ipoib_endpt_create(<o:p></o:p></P>
<P class=MsoNormal>+ &gid,
p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to create local endpt\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &av_attr, sizeof(ib_av_attr_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
av_attr.port_num = p_port->port_num;<o:p></o:p></P>
<P
class=MsoNormal>-
av_attr.sl = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
(" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16(
p_port_info->base_lid ) ));<o:p></o:p></P>
<P
class=MsoNormal>-
av_attr.dlid = p_port_info->base_lid;<o:p></o:p></P>
<P
class=MsoNormal>-
av_attr.static_rate = p_port->ib_mgr.rate;<o:p></o:p></P>
<P
class=MsoNormal>-
av_attr.path_bits = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->create_av(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &av_attr,
sizeof(ib_av_attr_t) );<o:p></o:p></P>
<P class=MsoNormal>+ av_attr.port_num =
p_port->port_num;<o:p></o:p></P>
<P class=MsoNormal>+ av_attr.sl = 0;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P class=MsoNormal>+ (" av_attr.dlid =
p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid )
));<o:p></o:p></P>
<P class=MsoNormal>+ av_attr.dlid =
p_port_info->base_lid;<o:p></o:p></P>
<P class=MsoNormal>+ av_attr.static_rate =
p_port->ib_mgr.rate;<o:p></o:p></P>
<P class=MsoNormal>+ av_attr.path_bits = 0;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->create_av(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* __endpt_mgr_insert expects *one* reference to be held. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac,
p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* __endpt_mgr_insert expects *one*
reference to be held. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></P>
<P class=MsoNormal>+ status = __endpt_mgr_insert( p_port,
p_port->p_adapter->params.conf_mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_local_endpt = p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ p_port->p_local_endpt =
p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>@@ -6935,924 +6982,924 @@<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_get_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_query_req_t
query;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_user_query_t
info;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_member_rec_t
member_rec;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_query_req_t query;<o:p></o:p></P>
<P class=MsoNormal>+ ib_user_query_t
info;<o:p></o:p></P>
<P class=MsoNormal>+ ib_member_rec_t
member_rec;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
info.method = IB_MAD_METHOD_GETTABLE;<o:p></o:p></P>
<P
class=MsoNormal>-
info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></P>
<P
class=MsoNormal>-
info.attr_size = sizeof(ib_member_rec_t);<o:p></o:p></P>
<P
class=MsoNormal>-
info.comp_mask = IB_MCR_COMPMASK_MGID;<o:p></o:p></P>
<P
class=MsoNormal>-
info.p_attr = &member_rec;<o:p></o:p></P>
<P class=MsoNormal>+ info.method =
IB_MAD_METHOD_GETTABLE;<o:p></o:p></P>
<P class=MsoNormal>+ info.attr_id =
IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></P>
<P class=MsoNormal>+ info.attr_size =
sizeof(ib_member_rec_t);<o:p></o:p></P>
<P class=MsoNormal>+ info.comp_mask =
IB_MCR_COMPMASK_MGID;<o:p></o:p></P>
<P class=MsoNormal>+ info.p_attr =
&member_rec;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Query requires only the MGID. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &member_rec, sizeof(ib_member_rec_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
member_rec.mgid = bcast_mgid_template;<o:p></o:p></P>
<P class=MsoNormal>+ /* Query requires only the MGID.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &member_rec,
sizeof(ib_member_rec_t) );<o:p></o:p></P>
<P class=MsoNormal>+ member_rec.mgid =
bcast_mgid_template;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8) ;<o:p></o:p></P>
<P
class=MsoNormal>-
member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P
class=MsoNormal>-
member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &query, sizeof(ib_query_req_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
query.query_type = IB_QUERY_USER_DEFINED;<o:p></o:p></P>
<P
class=MsoNormal>-
query.p_query_input = &info;<o:p></o:p></P>
<P
class=MsoNormal>-
query.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P
class=MsoNormal>-
query.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P
class=MsoNormal>-
query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
query.query_context = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
query.pfn_query_cb = __bcast_get_cb;<o:p></o:p></P>
<P class=MsoNormal>+ member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P class=MsoNormal>+ member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &query,
sizeof(ib_query_req_t) );<o:p></o:p></P>
<P class=MsoNormal>+ query.query_type =
IB_QUERY_USER_DEFINED;<o:p></o:p></P>
<P class=MsoNormal>+ query.p_query_input =
&info;<o:p></o:p></P>
<P class=MsoNormal>+ query.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+ query.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+ query.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ query.query_context =
p_port;<o:p></o:p></P>
<P class=MsoNormal>+ query.pfn_query_cb =
__bcast_get_cb;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* reference the object for the multicast query. */<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_get_bcast );<o:p></o:p></P>
<P class=MsoNormal>+ /* reference the object for the multicast
query. */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_get_bcast
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->query(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_get_bcast );<o:p></o:p></P>
<P
class=MsoNormal>-//
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_query returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_query returned SUCCESS\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->query(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_get_bcast );<o:p></o:p></P>
<P class=MsoNormal>+//
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_query returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_query returned SUCCESS\n"));<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* Callback for the MCMemberRecord Get query for the
IPv4 broadcast group. */<o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_get_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_query_rec_t
*p_query_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_query_rec_t
*p_query_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_member_rec_t
*p_mc_req;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ib_member_rec_t
*p_mc_req;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ p_port->ib_mgr.h_query =
NULL;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->state != IB_QPS_INIT )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = IB_CANCELED;<o:p></o:p></P>
<P
class=MsoNormal>-
goto done;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_query_rec->status;<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(p_port->state == IB_QPS_INIT
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->state != IB_QPS_INIT
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ status =
IB_CANCELED;<o:p></o:p></P>
<P class=MsoNormal>+ goto
done;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ status =
p_query_rec->status;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("status of request %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></P>
<P class=MsoNormal>+ ("status of
request %s\n", <o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( status )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case IB_SUCCESS:<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_query_rec->result_cnt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_mc_req = (ib_member_rec_t*)<o:p></o:p></P>
<P
class=MsoNormal>-
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></P>
<P class=MsoNormal>+ switch( status )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case IB_SUCCESS:<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_query_rec->result_cnt )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_mc_req = (ib_member_rec_t*)<o:p></o:p></P>
<P
class=MsoNormal>+
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Join the broadcast group. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/* Fall through. */<o:p></o:p></P>
<P
class=MsoNormal>+
/* Join the broadcast group. */<o:p></o:p></P>
<P
class=MsoNormal>+
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /* Fall through.
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case IB_REMOTE_ERROR:<o:p></o:p></P>
<P
class=MsoNormal>-
/* SA failed the query. Broadcast group doesn't exist, create it.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
status = __port_create_bcast( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ case IB_REMOTE_ERROR:<o:p></o:p></P>
<P class=MsoNormal>+ /* SA failed the
query. Broadcast group doesn't exist, create it. */<o:p></o:p></P>
<P class=MsoNormal>+ status =
__port_create_bcast( p_port );<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case IB_CANCELED:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Instance destroying - Aborting.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ case IB_CANCELED:<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Instance destroying - Aborting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
default:<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ default:<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> done:<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_CANCELED )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_CANCELED )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Return the response MAD to AL. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_query_rec->p_result_mad )<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Return the response MAD to AL.
*/<o:p></o:p></P>
<P class=MsoNormal>+ if( p_query_rec->p_result_mad
)<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Release the reference taken when issuing the member record query.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_get_cb );<o:p></o:p></P>
<P class=MsoNormal>+ /* Release the reference taken when
issuing the member record query. */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port,
ref_bcast_get_cb );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_join_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_member_rec_t*
const
p_member_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_member_rec_t* const p_member_rec
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_mcast_req_t
mcast_req;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_mcast_req_t mcast_req;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Check that the rate is realizable for our port. */<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F)
&&<o:p></o:p></P>
<P
class=MsoNormal>-
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* The MC group rate is higher than our port's rate. Log an
error<o:p></o:p></P>
<P
class=MsoNormal>-
* and stop. A port transition will drive the retry.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></P>
<P
class=MsoNormal>-
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></P>
<P
class=MsoNormal>-
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Check that the rate is realizable for
our port. */<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->ib_mgr.rate <
(p_member_rec->rate & 0x3F) &&<o:p></o:p></P>
<P class=MsoNormal>+
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * The MC
group rate is higher than our port's rate. Log an error<o:p></o:p></P>
<P class=MsoNormal>+ * and
stop. A port transition will drive the retry.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></P>
<P class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></P>
<P
class=MsoNormal>+
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></P>
<P
class=MsoNormal>+
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Join the broadcast group. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Copy the results of the Get to use as parameters. */<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec = *p_member_rec;<o:p></o:p></P>
<P
class=MsoNormal>-
/* We specify our port GID for the join operation. */<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.port_gid.unicast.prefix =
IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+ /* Join the broadcast group.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></P>
<P class=MsoNormal>+ /* Copy the results of the Get to use as
parameters. */<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec =
*p_member_rec;<o:p></o:p></P>
<P class=MsoNormal>+ /* We specify our port GID for the join
operation. */<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.port_gid.unicast.prefix =
IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.mcast_context = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.mcast_context =
p_port;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.pfn_mcast_cb =
__bcast_cb;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=<o:p></o:p></P>
<P
class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></P>
<P
class=MsoNormal>-
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( ib_member_get_state(
mcast_req.member_rec.scope_state ) !=<o:p></o:p></P>
<P class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></P>
<P class=MsoNormal>+
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></P>
<P
class=MsoNormal>+
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* reference the object for the multicast join request. */<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></P>
<P class=MsoNormal>+ /* reference the object for the multicast
join request. */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_join_bcast
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_join_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_bcast_join_failed );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __port_create_bcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_mcast_req_t
mcast_req;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_mcast_req_t mcast_req;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Join the broadcast group. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.create = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Create requires pkey, qkey, SL, flow label, traffic class, joing
state<o:p></o:p></P>
<P
class=MsoNormal>-
* and port GID.<o:p></o:p></P>
<P
class=MsoNormal>-
*<o:p></o:p></P>
<P
class=MsoNormal>-
* We specify the MGID since we don't want the SA to generate it for
us.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid = bcast_mgid_template;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8); <o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_gid_set_default( &mcast_req.member_rec.port_gid,<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* IPOIB spec requires that the QKEY have the MSb set so that the
QKEY<o:p></o:p></P>
<P
class=MsoNormal>-
* from the QP is used rather than the QKEY in the send WR.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.qkey =<o:p></o:p></P>
<P
class=MsoNormal>-
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mtu =<o:p></o:p></P>
<P
class=MsoNormal>-
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></P>
<P class=MsoNormal>+ /* Join the broadcast group.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.create = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Create requires pkey, qkey, SL,
flow label, traffic class, joing state<o:p></o:p></P>
<P class=MsoNormal>+ * and port GID.<o:p></o:p></P>
<P class=MsoNormal>+ *<o:p></o:p></P>
<P class=MsoNormal>+ * We specify the MGID since we
don't want the SA to generate it for us.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.mgid =
bcast_mgid_template;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.mgid.raw[4] =
(uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8);
<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.mgid.raw[5] =
(uint8_t) p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></P>
<P class=MsoNormal>+ ib_gid_set_default(
&mcast_req.member_rec.port_gid,<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * IPOIB spec requires that the QKEY
have the MSb set so that the QKEY<o:p></o:p></P>
<P class=MsoNormal>+ * from the QP is used rather than
the QKEY in the send WR.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.qkey
=<o:p></o:p></P>
<P class=MsoNormal>+
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.mtu =<o:p></o:p></P>
<P class=MsoNormal>+
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0
);<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.scope_state =<o:p></o:p></P>
<P
class=MsoNormal>-
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.sl_flow_hop =
ib_member_set_sl_flow_hop( 0, 0, 0 );<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.scope_state
=<o:p></o:p></P>
<P class=MsoNormal>+
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.mcast_context = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.mcast_context =
p_port;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.pfn_mcast_cb =
__bcast_cb;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* reference the object for the multicast join request. */<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></P>
<P class=MsoNormal>+ /* reference the object for the multicast
join request. */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_join_bcast
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_create_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_bcast_create_failed );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_down(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_qp_mod_t
qp_mod;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_qp_mod_t
qp_mod;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Mark our state. This causes all callbacks to abort.<o:p></o:p></P>
<P
class=MsoNormal>-
* Note that we hold the receive lock so that we synchronize<o:p></o:p></P>
<P
class=MsoNormal>-
* with reposting. We must take the receive lock before the<o:p></o:p></P>
<P
class=MsoNormal>-
* object lock since that is the order taken when reposting.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Mark our state. This causes
all callbacks to abort.<o:p></o:p></P>
<P class=MsoNormal>+ * Note that we hold the receive
lock so that we synchronize<o:p></o:p></P>
<P class=MsoNormal>+ * with reposting. We must
take the receive lock before the<o:p></o:p></P>
<P class=MsoNormal>+ * object lock since that is the
order taken when reposting.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state =
IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__pending_list_destroy(p_port);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></P>
<P class=MsoNormal>+
__pending_list_destroy(p_port);<o:p></o:p></P>
<P class=MsoNormal>+ NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P class=MsoNormal>+
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->ib_mgr.h_query )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->ib_mgr.h_query
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeWaitForSingleObject(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></P>
<P class=MsoNormal>+ KeWaitForSingleObject(<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* garbage collector timer is not needed when link is down */<o:p></o:p></P>
<P
class=MsoNormal>-
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P
class=MsoNormal>-
KeFlushQueuedDpcs();<o:p></o:p></P>
<P class=MsoNormal>+ /* garbage collector timer is not needed
when link is down */<o:p></o:p></P>
<P class=MsoNormal>+
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></P>
<P class=MsoNormal>+ KeFlushQueuedDpcs();<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Put the QP in the error state. This removes the need to<o:p></o:p></P>
<P
class=MsoNormal>-
* synchronize with send/receive callbacks.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Put the QP in the error
state. This removes the need to<o:p></o:p></P>
<P class=MsoNormal>+ * synchronize with send/receive
callbacks.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_port->ib_mgr.h_qp
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &qp_mod,
sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P class=MsoNormal>+ qp_mod.req_state =
IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></P>
<P class=MsoNormal>+
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Reset all endpoints so we don't flush our ARP cache. */<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ /* Reset all endpoints so we don't flush
our ARP cache. */<o:p></o:p></P>
<P class=MsoNormal>+ __endpt_mgr_reset_all( p_port
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeWaitForSingleObject(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL
);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_dereg_addrs( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ KeWaitForSingleObject(<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_dereg_addrs( p_port->p_adapter
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->p_adapter->obj );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __bcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
LARGE_INTEGER
gc_due_time;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal>+ LARGE_INTEGER
gc_due_time;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->state != IB_QPS_INIT )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_inv_state );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("Invalid state - Aborting.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_mcast_rec->status;<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Multicast join for broadcast group returned %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status ))
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status == IB_REMOTE_ERROR )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Either:<o:p></o:p></P>
<P
class=MsoNormal>-
* - the join
failed because the group no longer exists<o:p></o:p></P>
<P
class=MsoNormal>-
* - the create
failed because the group already exists<o:p></o:p></P>
<P
class=MsoNormal>-
*<o:p></o:p></P>
<P
class=MsoNormal>-
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></P>
<P
class=MsoNormal>-
* from the top. Note that as an optimization, it would be<o:p></o:p></P>
<P
class=MsoNormal>-
* possible to distinguish between the join and the create.<o:p></o:p></P>
<P
class=MsoNormal>-
* If the join fails, try the create. If the create fails,
start<o:p></o:p></P>
<P
class=MsoNormal>-
* over with the Get.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
/* TODO: Assert is a place holder. Can we ever get here if
the<o:p></o:p></P>
<P
class=MsoNormal>-
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
if(++p_port->bc_join_retry_cnt <
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
status = __port_get_bcast( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->bc_join_retry_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(p_port->state == IB_QPS_INIT ||
p_port->state == IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->state != IB_QPS_INIT
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_bcast_inv_state );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("Invalid state - Aborting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_mcast_rec->status;<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P class=MsoNormal>+
("Multicast join for broadcast
group returned %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status ))
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status ==
IB_REMOTE_ERROR )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/*<o:p></o:p></P>
<P
class=MsoNormal>+
* Either:<o:p></o:p></P>
<P
class=MsoNormal>+
* - the join failed because the group no longer exists<o:p></o:p></P>
<P
class=MsoNormal>+
* - the create failed because the group already exists<o:p></o:p></P>
<P
class=MsoNormal>+
*<o:p></o:p></P>
<P
class=MsoNormal>+
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></P>
<P
class=MsoNormal>+
* from the top. Note that as an optimization, it would be<o:p></o:p></P>
<P
class=MsoNormal>+
* possible to distinguish between the join and the create.<o:p></o:p></P>
<P
class=MsoNormal>+
* If the join fails, try the create. If the create fails,
start<o:p></o:p></P>
<P
class=MsoNormal>+
* over with the Get.<o:p></o:p></P>
<P
class=MsoNormal>+
*/<o:p></o:p></P>
<P
class=MsoNormal>+
/* TODO: Assert is a place holder. Can we ever get here if
the<o:p></o:p></P>
<P
class=MsoNormal>+
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></P>
<P
class=MsoNormal>+
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></P>
<P
class=MsoNormal>+
if(++p_port->bc_join_retry_cnt <
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
status = __port_get_bcast( p_port );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->bc_join_retry_cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_req_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->bc_join_retry_cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P
class=MsoNormal>+
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>+
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_bcast_req_failed );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_port->bc_join_retry_cnt =
0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_port->p_local_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ib_port_info_t port_info;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></P>
<P
class=MsoNormal>-
port_info.base_lid = p_port->base_lid;<o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
goto err;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_port->p_local_endpt
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
ib_port_info_t port_info;<o:p></o:p></P>
<P class=MsoNormal>+
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></P>
<P class=MsoNormal>+
port_info.base_lid = p_port->base_lid;<o:p></o:p></P>
<P class=MsoNormal>+ status =
__endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></P>
<P class=MsoNormal>+ if( status !=
IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
goto err;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->leave_mcast(
p_mcast_rec->h_mcast, __leave_error_mcast_cb );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></P>
<P
class=MsoNormal>-
goto err;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ status = __endpt_mgr_add_bcast( p_port,
p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( status
== IB_SUCCESS );<o:p></o:p></P>
<P class=MsoNormal>+ goto
err;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Get the QP ready for action. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = __ib_mgr_activate( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__ib_mgr_activate returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ /* Get the QP ready for action.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status = __ib_mgr_activate( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__ib_mgr_activate returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> err:<o:p></o:p></P>
<P
class=MsoNormal>-
/* Flag the adapter as hung. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_ERROR;
<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_bcast_error );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Flag the
adapter as hung. */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state
= IB_QPS_ERROR; <o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_bcast_error );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Only change the state if we're still in INIT. */<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( p_port->state == IB_QPS_INIT || p_port->state ==
IB_QPS_ERROR);<o:p></o:p></P>
<P
class=MsoNormal>-
if (p_port->state == IB_QPS_INIT) {<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_RTS;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Only change the state if we're still
in INIT. */<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT( p_port->state == IB_QPS_INIT
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></P>
<P class=MsoNormal>+ if (p_port->state == IB_QPS_INIT)
{<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state
= IB_QPS_RTS;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Prepost receives. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
__recv_mgr_repost( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ /* Prepost receives. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ __recv_mgr_repost( p_port
);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Notify the adapter that we now have an active connection. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_set_active( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ib_qp_mod_t
qp_mod;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status
)));<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->ib_mgr.h_query )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ /* Notify the adapter that we now have an
active connection. */<o:p></o:p></P>
<P class=MsoNormal>+ status = ipoib_set_active(
p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
ib_qp_mod_t
qp_mod;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status
)));<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ p_port->state
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->ib_mgr.h_query )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->ib_mgr.h_query = NULL;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></P>
<P
class=MsoNormal>-
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
p_port->ib_mgr.h_qp );<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr(
&qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P class=MsoNormal>+ qp_mod.req_state
= IB_QPS_ERROR;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></P>
<P class=MsoNormal>+
__endpt_mgr_reset_all( p_port );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_join_bcast );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #if 0 //CM<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P
class=MsoNormal>-
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Port CM Listen failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>-
/*keep going with UD only */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></P>
<P class=MsoNormal>+
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if(
ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Port CM Listen failed\n" ) );<o:p></o:p></P>
<P
class=MsoNormal>+
/*keep going with UD only */<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>-
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></P>
<P
class=MsoNormal>+
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P
class=MsoNormal>-
/* garbage collector timer is needed when link is active */<o:p></o:p></P>
<P
class=MsoNormal>-
gc_due_time.QuadPart =
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000)
* 10);<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></P>
<P
class=MsoNormal>-
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></P>
<P class=MsoNormal>+ /* garbage collector timer is needed when
link is active */<o:p></o:p></P>
<P class=MsoNormal>+ gc_due_time.QuadPart =
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan * 2000000)
* 10);<o:p></o:p></P>
<P class=MsoNormal>+
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></P>
<P
class=MsoNormal>+
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent( &p_port->sa_event,
EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port, ref_join_bcast
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __qp_event(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( p_event_rec );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_event_rec->context );<o:p></o:p></P>
<P
class=MsoNormal>-
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung =
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM( p_event_rec
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_event_rec->context
);<o:p></o:p></P>
<P class=MsoNormal>+
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung =
TRUE;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __cq_event(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_async_event_rec_t
*p_event_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_async_event_rec_t *p_event_rec
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
UNUSED_PARAM( p_event_rec );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( p_event_rec->context );<o:p></o:p></P>
<P
class=MsoNormal>-
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung =
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ UNUSED_PARAM( p_event_rec
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( p_event_rec->context
);<o:p></o:p></P>
<P class=MsoNormal>+
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung =
TRUE;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> __ib_mgr_activate(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_dgrm_info_t
dgrm_info;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_qp_mod_t
qp_mod;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t status;<o:p></o:p></P>
<P class=MsoNormal>+ ib_dgrm_info_t
dgrm_info;<o:p></o:p></P>
<P class=MsoNormal>+ ib_qp_mod_t
qp_mod;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Move the QP to RESET. This allows us to reclaim any<o:p></o:p></P>
<P
class=MsoNormal>-
* unflushed receives.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P
class=MsoNormal>-
qp_mod.req_state = IB_QPS_RESET;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_modify_qp returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Move the QP to RESET. This
allows us to reclaim any<o:p></o:p></P>
<P class=MsoNormal>+ * unflushed
receives.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &qp_mod,
sizeof(ib_qp_mod_t) );<o:p></o:p></P>
<P class=MsoNormal>+ qp_mod.req_state =
IB_QPS_RESET;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_modify_qp returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Move the QP to RTS. */<o:p></o:p></P>
<P
class=MsoNormal>-
dgrm_info.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P
class=MsoNormal>-
dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P
class=MsoNormal>-
dgrm_info.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->init_dgrm_svc(
p_port->ib_mgr.h_qp, &dgrm_info );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Move the QP to RTS. */<o:p></o:p></P>
<P class=MsoNormal>+ dgrm_info.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+ dgrm_info.qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></P>
<P class=MsoNormal>+ dgrm_info.pkey_index =
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp,
&dgrm_info );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Rearm the CQs. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_rearm_cq for send returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Rearm the CQs. */<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_recv_cq, FALSE
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_send_cq, FALSE
);<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_rearm_cq for send returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_INIT
);<o:p></o:p></P>
<P class=MsoNormal>+ return IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* Transition to a passive level thread.
*/<o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_join_mcast(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
uint8_t
state)<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
mac_addr_t
mac,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
uint8_t
state)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_mcast_req_t
mcast_req;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ib_mcast_req_t mcast_req;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Join Multicast request: \n"<o:p></o:p></P>
<P
class=MsoNormal>-
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[0], mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[2], mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
mac.addr[4], mac.addr[5]));<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P class=MsoNormal>+ ("Join Multicast
request: \n"<o:p></o:p></P>
<P class=MsoNormal>+ "\tsrc MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[0],
mac.addr[1],<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[2],
mac.addr[3],<o:p></o:p></P>
<P class=MsoNormal>+ mac.addr[4],
mac.addr[5]));<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P class=MsoNormal>+ switch( __endpt_mgr_ref( p_port, mac,
&p_endpt ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ case
NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></P>
<P class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Fall through */<o:p></o:p></P>
<P class=MsoNormal>+ case NDIS_STATUS_SUCCESS:<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_deref( p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ /* Fall through
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
case NDIS_STATUS_PENDING:<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_endpt));<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_endpt));<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Issue the mcast request, using the parameters of the broadcast
group.<o:p></o:p></P>
<P
class=MsoNormal>-
* This allows us to do a create request that should always succeed
since<o:p></o:p></P>
<P
class=MsoNormal>-
* the required parameters are known.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.create = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ case NDIS_STATUS_PENDING:<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n",
p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", p_endpt));<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Issue the mcast request, using
the parameters of the broadcast group.<o:p></o:p></P>
<P class=MsoNormal>+ * This allows us to do a create
request that should always succeed since<o:p></o:p></P>
<P class=MsoNormal>+ * the required parameters are
known.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.create = TRUE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Copy the settings from the broadcast group. */<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec = p_port->ib_mgr.bcast_rec;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Clear fields that aren't specified in the join */<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mlid = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
ib_member_set_state(
&mcast_req.member_rec.scope_state,state);<o:p></o:p></P>
<P class=MsoNormal>+ /* Copy the settings from the broadcast
group. */<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec =
p_port->ib_mgr.bcast_rec;<o:p></o:p></P>
<P class=MsoNormal>+ /* Clear fields that aren't specified in
the join */<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.mlid =
0;<o:p></o:p></P>
<P class=MsoNormal>+ ib_member_set_state(
&mcast_req.member_rec.scope_state,state);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E ))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Update the address portion of the MGID with the 28 lower bits of
the<o:p></o:p></P>
<P
class=MsoNormal>-
* IP address. Since we're given a MAC address, we are using
<o:p></o:p></P>
<P
class=MsoNormal>-
* 24 lower bits of that network-byte-ordered value (assuming MSb<o:p></o:p></P>
<P
class=MsoNormal>-
* is zero) and 4 lsb bits of the first byte of IP address.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[13] = mac.addr[3];<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* Handle non IP mutlicast MAC addresses. */<o:p></o:p></P>
<P
class=MsoNormal>-
/* Update the signature to use the lower 2 bytes of the OpenIB OUI.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></P>
<P
class=MsoNormal>-
/* Now copy the MAC address into the last 6 bytes of the GID. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( &mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( (mac.addr[0] == 1) &&
(mac.addr[2] == 0x5E ))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Update
the address portion of the MGID with the 28 lower bits of the<o:p></o:p></P>
<P class=MsoNormal>+ * IP
address. Since we're given a MAC address, we are using <o:p></o:p></P>
<P class=MsoNormal>+ * 24 lower
bits of that network-byte-ordered value (assuming MSb<o:p></o:p></P>
<P class=MsoNormal>+ * is zero)
and 4 lsb bits of the first byte of IP address.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[13] = mac.addr[3];<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /* Handle non IP
mutlicast MAC addresses. */<o:p></o:p></P>
<P class=MsoNormal>+ /* Update the
signature to use the lower 2 bytes of the OpenIB OUI. */<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></P>
<P class=MsoNormal>+ /* Now copy the
MAC address into the last 6 bytes of the GID. */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy(
&mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.mcast_context = p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.pfn_mcast_cb = __mcast_cb;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* Create the endpoint and insert it in the port. Since we don't wait
for<o:p></o:p></P>
<P
class=MsoNormal>-
* the mcast SA operations to complete before returning from the
multicast<o:p></o:p></P>
<P
class=MsoNormal>-
* list set OID asynchronously, it is possible for the mcast entry to
be<o:p></o:p></P>
<P
class=MsoNormal>-
* cleared before the SA interaction completes. In this case, when
the<o:p></o:p></P>
<P
class=MsoNormal>-
* mcast callback is invoked, it would not find the corresponding
endpoint<o:p></o:p></P>
<P
class=MsoNormal>-
* and would be undone.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = ipoib_endpt_create(<o:p></o:p></P>
<P
class=MsoNormal>-
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_endpt )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.mcast_context =
p_port;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.pfn_mcast_cb =
__mcast_cb;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></P>
<P class=MsoNormal>+ mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * Create the endpoint and insert it
in the port. Since we don't wait for<o:p></o:p></P>
<P class=MsoNormal>+ * the mcast SA operations to
complete before returning from the multicast<o:p></o:p></P>
<P class=MsoNormal>+ * list set OID asynchronously, it
is possible for the mcast entry to be<o:p></o:p></P>
<P class=MsoNormal>+ * cleared before the SA interaction
completes. In this case, when the<o:p></o:p></P>
<P class=MsoNormal>+ * mcast callback is invoked, it
would not find the corresponding endpoint<o:p></o:p></P>
<P class=MsoNormal>+ * and would be
undone.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
ipoib_endpt_create(<o:p></o:p></P>
<P class=MsoNormal>+
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_endpt )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_endpt_create failed.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ status = __endpt_mgr_insert_locked(
p_port, mac, p_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* reference the object for the multicast join request. */<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref( p_port, ref_join_mcast );<o:p></o:p></P>
<P class=MsoNormal>+ /* reference the object for the multicast
join request. */<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_ref( p_port, ref_join_mcast
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_join_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Joined MCAST group with MGID[10:15]= %0x %0x %0x %0x %0x
%0x\n",<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></P>
<P
class=MsoNormal>-
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></P>
<P class=MsoNormal>+ status =
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_mcast_join_failed );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("ib_join_mcast returned %s\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST,<o:p></o:p></P>
<P class=MsoNormal>+ ("Joined MCAST group with MGID[10:15]=
%0x %0x %0x %0x %0x %0x\n",<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></P>
<P class=MsoNormal>+
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal>+ return status;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __mcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ib_mcast_rec_t
*p_mcast_rec )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ib_api_status_t
status;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_item_t
*p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ ib_api_status_t
status;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal>+
cl_fmap_item_t *p_item;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_port->state != IB_QPS_RTS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( p_port->state != IB_QPS_RTS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_inv_state );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid state -
Aborting.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state -
Aborting.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_mcast_inv_state );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid state - Aborting.\n")
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state - Aborting.\n")
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P
class=MsoNormal>-
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
__pending_list_destroy( p_port );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></P>
<P class=MsoNormal>+
__pending_list_destroy( p_port );<o:p></o:p></P>
<P class=MsoNormal>+
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_mcast_rec->status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Multicast join request failed with status %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status ))
);<o:p></o:p></P>
<P
class=MsoNormal>-
/* Flag the adapter as hung. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung =TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_req_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( p_mcast_rec->status != IB_SUCCESS
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Multicast join request failed with status %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status ))
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Flag the
adapter as hung. */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung =TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_mcast_req_failed );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_fmap_get(<o:p></o:p></P>
<P
class=MsoNormal>-
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* The endpoint must have been flushed while the join request<o:p></o:p></P>
<P
class=MsoNormal>-
* was outstanding. Just leave the group and return.
This<o:p></o:p></P>
<P
class=MsoNormal>-
* is not an error.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to find endpoint for update.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_fmap_get(<o:p></o:p></P>
<P class=MsoNormal>+
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid
);<o:p></o:p></P>
<P class=MsoNormal>+ if( p_item == cl_fmap_end(
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * The
endpoint must have been flushed while the join request<o:p></o:p></P>
<P class=MsoNormal>+ * was
outstanding. Just leave the group and return. This<o:p></o:p></P>
<P class=MsoNormal>+ * is not an
error.<o:p></o:p></P>
<P class=MsoNormal>+
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to find endpoint for update.\n") );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_no_endpt );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_mcast_no_endpt );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt->p_ifc =
p_port->p_adapter->p_ifc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Setup the endpoint for use. */<o:p></o:p></P>
<P
class=MsoNormal>-
status = ipoib_endpt_set_mcast(<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( status != IB_SUCCESS )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Flag the adapter as hung. */<o:p></o:p></P>
<P
class=MsoNormal>-
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_mcast_av_failed );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Setup the endpoint for use.
*/<o:p></o:p></P>
<P class=MsoNormal>+ status =
ipoib_endpt_set_mcast(<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt,
p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );<o:p></o:p></P>
<P class=MsoNormal>+ if( status != IB_SUCCESS )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></P>
<P
class=MsoNormal>+
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></P>
<P class=MsoNormal>+ /* Flag the
adapter as hung. */<o:p></o:p></P>
<P class=MsoNormal>+
p_port->p_adapter->hung = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref(
p_port, ref_mcast_av_failed );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/*<o:p></o:p></P>
<P
class=MsoNormal>-
* The endpoint is already in the GID and MAC maps.<o:p></o:p></P>
<P
class=MsoNormal>-
* mast endpoint are not used in the LID map.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT(p_endpt->dlid == 0);<o:p></o:p></P>
<P
class=MsoNormal>-
/* set flag that endpoint is use */<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->is_in_use = TRUE;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* Try to send all pending sends. */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("Calling
ipoib_port_resume from mcast_cb\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_resume(p_port , FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ /*<o:p></o:p></P>
<P class=MsoNormal>+ * The endpoint is already in the
GID and MAC maps.<o:p></o:p></P>
<P class=MsoNormal>+ * mast endpoint are not used in the
LID map.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(p_endpt->dlid ==
0);<o:p></o:p></P>
<P class=MsoNormal>+ /* set flag that endpoint is use
*/<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt->is_in_use =
TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* Try to send all pending sends.
*/<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST, ("Calling ipoib_port_resume from mcast_cb\n"));<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_resume(p_port ,
FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_join_mcast );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port, ref_join_mcast
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_leave_mcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*context )<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt =
%d\n", p_port->mcast_cnt));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>-
//It happens<o:p></o:p></P>
<P
class=MsoNormal>-
//ASSERT(p_port->mcast_cnt > 0);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_atomic_dec( &p_port->mcast_cnt);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if(0 == p_port->mcast_cnt)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_MCAST,("p_port->mcast_cnt = %d\n",
p_port->mcast_cnt));<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port,
ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+ //It happens<o:p></o:p></P>
<P class=MsoNormal>+ //ASSERT(p_port->mcast_cnt >
0);<o:p></o:p></P>
<P class=MsoNormal>+ cl_atomic_dec(
&p_port->mcast_cnt);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if(0 ==
p_port->mcast_cnt)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ KeSetEvent(
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
void
*context )<o:p></o:p></P>
<P class=MsoNormal>+
IN
void
*context )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t
*p_port;<o:p></o:p></P>
<P class=MsoNormal>+
ipoib_port_t *p_port;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_port = (ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal>+ p_port =
(ipoib_port_t*)context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>-
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_deref( p_port,
ref_leave_mcast);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></P>
<P
class=MsoNormal>+
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_MCAST
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /*++<o:p></o:p></P>
<P class=MsoNormal>@@ -7874,336 +7921,336 @@<o:p></o:p></P>
<P class=MsoNormal> --*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> NDIS_STATUS GetLsoHeaderSize(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
PNET_BUFFER
pNetBuffer,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
LsoData
*pLsoData,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
UINT
*IndexOfData,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_hdr_t *ipoib_hdr<o:p></o:p></P>
<P
class=MsoNormal>-
)<o:p></o:p></P>
<P class=MsoNormal>+ IN
PNET_BUFFER pNetBuffer,<o:p></o:p></P>
<P class=MsoNormal>+ IN
LsoData
*pLsoData,<o:p></o:p></P>
<P class=MsoNormal>+ OUT
UINT
*IndexOfData,<o:p></o:p></P>
<P class=MsoNormal>+ IN
ipoib_hdr_t *ipoib_hdr<o:p></o:p></P>
<P class=MsoNormal>+ )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
UINT
CurrLength;<o:p></o:p></P>
<P
class=MsoNormal>-
PUCHAR
pSrc;<o:p></o:p></P>
<P
class=MsoNormal>-
PUCHAR
pCopiedData = pLsoData->coppied_data;<o:p></o:p></P>
<P
class=MsoNormal>-
ip_hdr_t
UNALIGNED *IpHdr;<o:p></o:p></P>
<P
class=MsoNormal>-
tcp_hdr_t UNALIGNED
*TcpHdr;<o:p></o:p></P>
<P
class=MsoNormal>-
uint16_t
TcpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
uint16_t
IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
uint16_t
IpOffset;<o:p></o:p></P>
<P
class=MsoNormal>-
INT
FullBuffers = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
PMDL
pMDL;<o:p></o:p></P>
<P
class=MsoNormal>-
NDIS_STATUS status =
NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+
UINT CurrLength;<o:p></o:p></P>
<P class=MsoNormal>+ PUCHAR
pSrc;<o:p></o:p></P>
<P class=MsoNormal>+ PUCHAR
pCopiedData = pLsoData->coppied_data;<o:p></o:p></P>
<P class=MsoNormal>+ ip_hdr_t
UNALIGNED *IpHdr;<o:p></o:p></P>
<P class=MsoNormal>+ tcp_hdr_t UNALIGNED
*TcpHdr;<o:p></o:p></P>
<P class=MsoNormal>+ uint16_t
TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ uint16_t
IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ uint16_t
IpOffset;<o:p></o:p></P>
<P class=MsoNormal>+
INT FullBuffers =
0;<o:p></o:p></P>
<P class=MsoNormal>+
PMDL pMDL;<o:p></o:p></P>
<P class=MsoNormal>+ NDIS_STATUS status =
NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> #define IP_OFFSET 14;<o:p></o:p></P>
<P
class=MsoNormal>-
//<o:p></o:p></P>
<P
class=MsoNormal>-
// This Flag indicates the way we gets the headers<o:p></o:p></P>
<P
class=MsoNormal>-
// RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer
<o:p></o:p></P>
<P
class=MsoNormal>-
// in sequence.<o:p></o:p></P>
<P
class=MsoNormal>-
//<o:p></o:p></P>
<P
class=MsoNormal>-
boolean_t
IsRegularFlow = TRUE;<o:p></o:p></P>
<P class=MsoNormal>+ //<o:p></o:p></P>
<P class=MsoNormal>+ // This Flag indicates the way we gets
the headers<o:p></o:p></P>
<P class=MsoNormal>+ // RegularFlow = we get the headers
(ETH+IP+TCP) in the same Buffer <o:p></o:p></P>
<P class=MsoNormal>+ // in sequence.<o:p></o:p></P>
<P class=MsoNormal>+ //<o:p></o:p></P>
<P class=MsoNormal>+
boolean_t
IsRegularFlow = TRUE;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
const uint16_t
ETH_OFFSET = IP_OFFSET; <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoHeaderSize = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
IpOffset = IP_OFFSET;
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></P>
<P
class=MsoNormal>-
*IndexOfData = 0;<o:p></o:p></P>
<P class=MsoNormal>+ const
uint16_t ETH_OFFSET = IP_OFFSET; <o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ pLsoData->LsoHeaderSize =
0;<o:p></o:p></P>
<P class=MsoNormal>+ IpOffset = IP_OFFSET;
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></P>
<P class=MsoNormal>+ *IndexOfData = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl(pMDL, &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (pSrc == NULL) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ULONG DataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></P>
<P
class=MsoNormal>-
pSrc += DataOffset;<o:p></o:p></P>
<P
class=MsoNormal>-
CurrLength -= DataOffset;<o:p></o:p></P>
<P class=MsoNormal>+ pMDL =
NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+ NdisQueryMdl(pMDL, &pSrc,
&CurrLength, NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if (pSrc == NULL) {<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ULONG DataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+ pSrc += DataOffset;<o:p></o:p></P>
<P class=MsoNormal>+ CurrLength -= DataOffset;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
// We start by looking for the ethernet and the IP<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength < ETH_OFFSET) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
//pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize +
ETH_OFFSET;<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength == ETH_OFFSET) {
<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
IsRegularFlow = FALSE; <o:p></o:p></P>
<P
class=MsoNormal>-
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></P>
<P
class=MsoNormal>-
pCopiedData += ETH_OFFSET;
<o:p></o:p></P>
<P
class=MsoNormal>-
FullBuffers++;<o:p></o:p></P>
<P
class=MsoNormal>-
// First buffer was only ethernet<o:p></o:p></P>
<P
class=MsoNormal>-
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+ // We start by looking for the ethernet
and the IP<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength < ETH_OFFSET)
{<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ //pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength == ETH_OFFSET)
{ <o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ IsRegularFlow =
FALSE; <o:p></o:p></P>
<P class=MsoNormal>+
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></P>
<P class=MsoNormal>+ pCopiedData +=
ETH_OFFSET; <o:p></o:p></P>
<P class=MsoNormal>+
FullBuffers++;<o:p></o:p></P>
<P class=MsoNormal>+ // First buffer
was only ethernet<o:p></o:p></P>
<P class=MsoNormal>+ pNetBuffer =
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>-
if (pSrc == NULL) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
// This is ETH + IP together (at least)<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof
(ipoib_hdr_t));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
//IMPORTANT: we de-facto replace ETH header by IPoIB header here<o:p></o:p></P>
<P
class=MsoNormal>-
memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof
(ipoib_hdr_t));<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
CurrLength -= ETH_OFFSET;<o:p></o:p></P>
<P
class=MsoNormal>-
pSrc = pSrc + ETH_OFFSET;<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof
(ipoib_hdr_t);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
// we should now be having at least the size of ethernet data<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></P>
<P
class=MsoNormal>-
IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength < IpHeaderLen) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize +
IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
// We now start to find where the TCP header starts<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength == IpHeaderLen) {<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE);<o:p></o:p></P>
<P
class=MsoNormal>-
// two options : <o:p></o:p></P>
<P
class=MsoNormal>-
// if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two
buffers<o:p></o:p></P>
<P
class=MsoNormal>-
// if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer
<o:p></o:p></P>
<P
class=MsoNormal>-
// TCP will start at next buffer<o:p></o:p></P>
<P
class=MsoNormal>-
if(IsRegularFlow){<o:p></o:p></P>
<P
class=MsoNormal>-
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>-
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>-
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if (pSrc == NULL)
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+ // This is ETH +
IP together (at least)<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof
(ipoib_hdr_t));<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ //IMPORTANT: we
de-facto replace ETH header by IPoIB header here<o:p></o:p></P>
<P class=MsoNormal>+ memcpy
(pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof
(ipoib_hdr_t));<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ CurrLength -=
ETH_OFFSET;<o:p></o:p></P>
<P class=MsoNormal>+ pSrc = pSrc +
ETH_OFFSET;<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof
(ipoib_hdr_t);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ // we should now be having at least the
size of ethernet data<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength < sizeof (ip_hdr_t))
{<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ IpHdr = (ip_hdr_t
UNALIGNED*)pSrc;<o:p></o:p></P>
<P class=MsoNormal>+ IpHeaderLen =
(uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(IpHdr->prot ==
IP_PROT_TCP);<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength < IpHeaderLen)
{<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ // We now start to find where the TCP
header starts<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength == IpHeaderLen)
{<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(FALSE);<o:p></o:p></P>
<P class=MsoNormal>+ // two options :
<o:p></o:p></P>
<P class=MsoNormal>+ //
if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two
buffers<o:p></o:p></P>
<P class=MsoNormal>+ //
if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer <o:p></o:p></P>
<P class=MsoNormal>+ // TCP will start
at next buffer<o:p></o:p></P>
<P class=MsoNormal>+
if(IsRegularFlow){<o:p></o:p></P>
<P
class=MsoNormal>+
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>+
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></P>
<P class=MsoNormal>+ } else
{<o:p></o:p></P>
<P
class=MsoNormal>+
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>+
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
FullBuffers++;<o:p></o:p></P>
<P
class=MsoNormal>-
IsRegularFlow = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>-
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></P>
<P
class=MsoNormal>-
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength,
NormalPagePriority );<o:p></o:p></P>
<P
class=MsoNormal>-
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></P>
<P
class=MsoNormal>-
if (pSrc == NULL) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
// if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same
buffer <o:p></o:p></P>
<P
class=MsoNormal>-
// if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the
same buffer<o:p></o:p></P>
<P
class=MsoNormal>-
if (IsRegularFlow)
{
<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
} else {
<o:p></o:p></P>
<P
class=MsoNormal>-
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>-
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+
FullBuffers++;<o:p></o:p></P>
<P class=MsoNormal>+ IsRegularFlow =
FALSE;<o:p></o:p></P>
<P class=MsoNormal>+
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></P>
<P class=MsoNormal>+
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength,
NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+ pNetBuffer =
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></P>
<P class=MsoNormal>+
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></P>
<P class=MsoNormal>+ if (pSrc == NULL)
{<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>+
return status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+ //
if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same
buffer <o:p></o:p></P>
<P class=MsoNormal>+ //
if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the
same buffer<o:p></o:p></P>
<P class=MsoNormal>+ if
(IsRegularFlow)
{
<o:p></o:p></P>
<P
class=MsoNormal>+
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ } else
{
<o:p></o:p></P>
<P
class=MsoNormal>+
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>+
pCopiedData += IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CurrLength -= IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
pSrc = pSrc + IpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength < sizeof (tcp_hdr_t)) {<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
// We have finaly found the TCP header<o:p></o:p></P>
<P
class=MsoNormal>-
TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></P>
<P
class=MsoNormal>-
TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></P>
<P class=MsoNormal>+ CurrLength -=
IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ pSrc = pSrc +
IpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength < sizeof (tcp_hdr_t))
{<o:p></o:p></P>
<P class=MsoNormal>+
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ // We have finaly found the TCP
header<o:p></o:p></P>
<P class=MsoNormal>+ TcpHdr = (tcp_hdr_t UNALIGNED
*)pSrc;<o:p></o:p></P>
<P class=MsoNormal>+ TcpHeaderLen =
TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
//ASSERT(TcpHeaderLen == 20);<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength < TcpHeaderLen) {<o:p></o:p></P>
<P
class=MsoNormal>-
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P
class=MsoNormal>-
return status;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize +
TcpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
if(IsRegularFlow){<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else{<o:p></o:p></P>
<P
class=MsoNormal>-
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></P>
<P
class=MsoNormal>-
pCopiedData += TcpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if (CurrLength == TcpHeaderLen) {<o:p></o:p></P>
<P
class=MsoNormal>-
FullBuffers++;<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></P>
<P
class=MsoNormal>-
*IndexOfData = FullBuffers ;<o:p></o:p></P>
<P
class=MsoNormal>-
} else {<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></P>
<P
class=MsoNormal>-
*IndexOfData = FullBuffers - 1;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->FullBuffers = FullBuffers; <o:p></o:p></P>
<P
class=MsoNormal>-
if (!IsRegularFlow){<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></P>
<P
class=MsoNormal>-
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen +
TcpHeaderLen;<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal>+ //ASSERT(TcpHeaderLen ==
20);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength < TcpHeaderLen)
{<o:p></o:p></P>
<P class=MsoNormal>+
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing
packets\n"));<o:p></o:p></P>
<P class=MsoNormal>+ return
status;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ if(IsRegularFlow){<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else{<o:p></o:p></P>
<P class=MsoNormal>+
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></P>
<P class=MsoNormal>+ pCopiedData +=
TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if (CurrLength == TcpHeaderLen)
{<o:p></o:p></P>
<P class=MsoNormal>+
FullBuffers++;<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></P>
<P class=MsoNormal>+ *IndexOfData =
FullBuffers ;<o:p></o:p></P>
<P class=MsoNormal>+ } else {<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></P>
<P class=MsoNormal>+ *IndexOfData =
FullBuffers - 1;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ pLsoData->FullBuffers = FullBuffers;
<o:p></o:p></P>
<P class=MsoNormal>+ if (!IsRegularFlow){<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></P>
<P class=MsoNormal>+
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen +
TcpHeaderLen;<o:p></o:p></P>
<P class=MsoNormal>+
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t*
const p_port)<o:p></o:p></P>
<P class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const
p_port)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P class=MsoNormal> const mac_addr_t DEFAULT_MCAST_GROUP
= {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01};<o:p></o:p></P>
<P
class=MsoNormal>-
/* Do garbage collecting... */<o:p></o:p></P>
<P class=MsoNormal>+ /* Do garbage collecting...
*/<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_map_item_t *p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t *p_endpt;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_t
destroy_mc_list;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t
cnt;<o:p></o:p></P>
<P
class=MsoNormal>-
const static GC_MAX_LEAVE_NUM = 80;<o:p></o:p></P>
<P class=MsoNormal>+ cl_map_item_t
*p_item;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_endpt_t
*p_endpt;<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_t
destroy_mc_list;<o:p></o:p></P>
<P class=MsoNormal>+
uint8_t cnt;<o:p></o:p></P>
<P class=MsoNormal>+ const static GC_MAX_LEAVE_NUM =
80;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &destroy_mc_list );<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &destroy_mc_list
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
/* Wait for all readers to finish */<o:p></o:p></P>
<P
class=MsoNormal>-
while( p_port->endpt_rdr )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_lock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cnt = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P
class=MsoNormal>-
while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ))
&& (cnt < GC_MAX_LEAVE_NUM))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = cl_qmap_next( p_item );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal>+ /* Wait for all readers to finish
*/<o:p></o:p></P>
<P class=MsoNormal>+ while( p_port->endpt_rdr
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_lock(
&p_port->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cnt = 0;<o:p></o:p></P>
<P class=MsoNormal>+ p_item = cl_qmap_head(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></P>
<P class=MsoNormal>+ while( (p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts )) && (cnt <
GC_MAX_LEAVE_NUM))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></P>
<P class=MsoNormal>+ p_item =
cl_qmap_next( p_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Check if the current endpoint is not a multicast listener */<o:p></o:p></P>
<P class=MsoNormal>+ /* Check if the
current endpoint is not a multicast listener */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->h_mcast && <o:p></o:p></P>
<P
class=MsoNormal>-
(!p_endpt->is_mcast_listener) &&<o:p></o:p></P>
<P
class=MsoNormal>-
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t)
) &&<o:p></o:p></P>
<P
class=MsoNormal>-
(!p_endpt->is_in_use) ))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal>+ if(
p_endpt->h_mcast && <o:p></o:p></P>
<P
class=MsoNormal>+
(!p_endpt->is_mcast_listener) &&<o:p></o:p></P>
<P
class=MsoNormal>+
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t)
) &&<o:p></o:p></P>
<P
class=MsoNormal>+
(!p_endpt->is_in_use) ))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->mac_item );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->gid_item );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_endpt->dlid )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>-
&p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->dlid = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_endpt->dlid )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></P>
<P
class=MsoNormal>+
&p_endpt->lid_item );<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->dlid = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail(<o:p></o:p></P>
<P
class=MsoNormal>-
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
cnt++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_unlock( &p_port->obj );<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_insert_tail(<o:p></o:p></P>
<P
class=MsoNormal>+
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
cnt++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->is_in_use = FALSE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_unlock( &p_port->obj
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* Destroy all multicast endpoints now that we have released the lock.
*/<o:p></o:p></P>
<P
class=MsoNormal>-
while( cl_qlist_count( &destroy_mc_list ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list
),<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>-
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x
\n", <o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[0],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[2],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[4],<o:p></o:p></P>
<P
class=MsoNormal>-
p_endpt->mac.addr[5]) );<o:p></o:p></P>
<P
class=MsoNormal>-
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ /* Destroy all multicast endpoints now
that we have released the lock. */<o:p></o:p></P>
<P class=MsoNormal>+ while( cl_qlist_count(
&destroy_mc_list ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_endpt =
PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),<o:p></o:p></P>
<P
class=MsoNormal>+
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></P>
<P
class=MsoNormal>+
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x
\n", <o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[0],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[1],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[2],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[3],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[4],<o:p></o:p></P>
<P
class=MsoNormal>+
p_endpt->mac.addr[5]) );<o:p></o:p></P>
<P class=MsoNormal>+ cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_port_t *p_port = (ipoib_port_t *)
context;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></P>
<P
class=MsoNormal>-
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></P>
<P class=MsoNormal>+
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal>+
__port_do_mcast_garbage(p_port);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_get_by_gid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ib_gid_t*
const
p_gid )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ib_gid_t*
const
p_gid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
return __endpt_mgr_get_by_gid( p_port, p_gid );<o:p></o:p></P>
<P class=MsoNormal>+ return __endpt_mgr_get_by_gid( p_port,
p_gid );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_t*<o:p></o:p></P>
<P class=MsoNormal> ipoib_endpt_get_by_lid(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const
net16_t
lid )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const
net16_t
lid )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
return __endpt_mgr_get_by_lid( p_port, lid );<o:p></o:p></P>
<P class=MsoNormal>+ return __endpt_mgr_get_by_lid( p_port,
lid );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> ib_api_status_t<o:p></o:p></P>
<P class=MsoNormal> ipoib_recv_dhcp(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P
class=MsoNormal>-
OUT
eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_src,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_endpt_t*
const
p_dst )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const
p_port,<o:p></o:p></P>
<P class=MsoNormal>+ IN
const ipoib_pkt_t*
const
p_ipoib,<o:p></o:p></P>
<P class=MsoNormal>+
OUT eth_pkt_t*
const
p_eth,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const
p_src,<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_endpt_t* const p_dst
)<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
return __recv_dhcp(<o:p></o:p></P>
<P
class=MsoNormal>-
p_port, p_ipoib, p_eth, p_src,p_dst );<o:p></o:p></P>
<P class=MsoNormal>+ return __recv_dhcp(<o:p></o:p></P>
<P class=MsoNormal>+ p_port, p_ipoib,
p_eth, p_src,p_dst );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> void<o:p></o:p></P>
<P class=MsoNormal> ipoib_port_cancel_xmit(<o:p></o:p></P>
<P
class=MsoNormal>-
IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-
IN
PVOID
cancel_id )<o:p></o:p></P>
<P class=MsoNormal>+
IN
ipoib_port_t* const p_port,<o:p></o:p></P>
<P class=MsoNormal>+
IN
PVOID
cancel_id )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
cl_list_item_t
*p_item, *p_next;<o:p></o:p></P>
<P
class=MsoNormal>-
ipoib_send_NB_SG
*s_buf;<o:p></o:p></P>
<P
class=MsoNormal>-
PVOID
nbl_id;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_t
cancel_list;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+
cl_list_item_t *p_item, *p_next;<o:p></o:p></P>
<P class=MsoNormal>+ ipoib_send_NB_SG
*s_buf;<o:p></o:p></P>
<P class=MsoNormal>+
PVOID
nbl_id;<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_t
cancel_list;<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_init( &cancel_list );<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT(FALSE); //TODO ???????????????? Do we reach here
????????????<o:p></o:p></P>
<P class=MsoNormal>+ cl_qlist_init( &cancel_list
);<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ ASSERT(FALSE); //TODO ???????????????? Do
we reach here ????????????<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P
class=MsoNormal>-
p_item = p_next )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_next = cl_qlist_next( p_item );<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this
casting<o:p></o:p></P>
<P
class=MsoNormal>-
nbl_id = NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></P>
<P
class=MsoNormal>-
if( nbl_id == cancel_id )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>-
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED
;<o:p></o:p></P>
<P
class=MsoNormal>-
cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal>+ for( p_item = cl_qlist_head(
&p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ p_item !=
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></P>
<P class=MsoNormal>+ p_item = p_next
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ p_next =
cl_qlist_next( p_item );<o:p></o:p></P>
<P class=MsoNormal>+ s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></P>
<P class=MsoNormal>+ nbl_id =
NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></P>
<P class=MsoNormal>+ if( nbl_id ==
cancel_id )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item
);<o:p></o:p></P>
<P
class=MsoNormal>+
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED
;<o:p></o:p></P>
<P class=MsoNormal>+
cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf
);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( cl_qlist_count( &cancel_list ) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
while( ( p_item = cl_qlist_remove_head( &cancel_list )) <o:p></o:p></P>
<P
class=MsoNormal>-
!= cl_qlist_end( &cancel_list ))<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal>+ if( cl_qlist_count( &cancel_list )
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ while( ( p_item =
cl_qlist_remove_head( &cancel_list )) <o:p></o:p></P>
<P
class=MsoNormal>+
!= cl_qlist_end( &cancel_list ))<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
//TODO don't use DISPATCH LEVEL<o:p></o:p></P>
<P
class=MsoNormal>-
__send_complete_net_buffer(<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
TRUE);<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
//TODO don't use DISPATCH LEVEL<o:p></o:p></P>
<P
class=MsoNormal>+
__send_complete_net_buffer(<o:p></o:p></P>
<P
class=MsoNormal>+
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
TRUE);<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> /* <o:p></o:p></P>
<P class=MsoNormal>@@ -8215,305 +8262,305 @@<o:p></o:p></P>
<P class=MsoNormal> #if 0<o:p></o:p></P>
<P class=MsoNormal> static NDIS_STATUS<o:p></o:p></P>
<P class=MsoNormal> __send_fragments(<o:p></o:p></P>
<P
class=MsoNormal>-IN
ipoib_port_t*
const
p_port,<o:p></o:p></P>
<P
class=MsoNormal>-IN
ipoib_send_desc_t* const
p_desc,<o:p></o:p></P>
<P
class=MsoNormal>-IN
eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint32_t
buf_len,<o:p></o:p></P>
<P
class=MsoNormal>-IN
NDIS_BUFFER*
p_ndis_buf )<o:p></o:p></P>
<P class=MsoNormal>+IN ipoib_port_t*
const p_port,<o:p></o:p></P>
<P class=MsoNormal>+IN ipoib_send_desc_t*
const p_desc,<o:p></o:p></P>
<P class=MsoNormal>+IN eth_hdr_t*
const
p_eth_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN
uint32_t
buf_len,<o:p></o:p></P>
<P class=MsoNormal>+IN
NDIS_BUFFER*
p_ndis_buf )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
ds_idx = 1;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
wr_idx = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
sgl_idx = 2; //skip eth hdr, ip hdr<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
options_len = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t*
p_options = NULL;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t*
p_buf;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
frag_offset = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
next_sge;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
wr_size = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
total_ip_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t ds_idx =
1;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t wr_idx =
0;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t sgl_idx = 2;
//skip eth hdr, ip hdr<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t options_len =
0;<o:p></o:p></P>
<P class=MsoNormal>+ uint8_t* p_options =
NULL;<o:p></o:p></P>
<P class=MsoNormal>+ uint8_t*
p_buf;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t frag_offset =
0;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t
next_sge;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t wr_size =
0;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t ip_hdr_len =
IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t total_ip_len =
cl_ntoh16( p_ip_hdr->length );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
SCATTER_GATHER_LIST
*p_sgl;<o:p></o:p></P>
<P class=MsoNormal>+
SCATTER_GATHER_LIST *p_sgl;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_ENTER( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( IP_DONT_FRAGMENT(p_ip_hdr) )<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt,
ScatterGatherListPacketInfo );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_sgl )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
ASSERT( p_sgl );<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||<o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Too many SG Elements in packet.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_buf = (uint8_t *)<o:p></o:p></P>
<P
class=MsoNormal>-
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list
);<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
s_buf->p_send_buf = (send_buf_t*)p_buf;<o:p></o:p></P>
<P class=MsoNormal>+ if( IP_DONT_FRAGMENT(p_ip_hdr)
)<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET(
p_desc->p_pkt, ScatterGatherListPacketInfo );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_sgl )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ ASSERT( p_sgl
);<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get SGL from packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( ( p_sgl->NumberOfElements >
MAX_SEND_SGE ||<o:p></o:p></P>
<P class=MsoNormal>+
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Too many SG Elements in packet.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_buf = (uint8_t *)<o:p></o:p></P>
<P class=MsoNormal>+
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list
);<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_buf )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ s_buf->p_send_buf =
(send_buf_t*)p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( buf_len < ip_hdr_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{ /* ip
options in a separate buffer */<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P
class=MsoNormal>-
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_ndis_buf )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to get IP options buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len,
NormalPagePriority );<o:p></o:p></P>
<P
class=MsoNormal>-
if( !p_options )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>-
("Failed to query IP options buffer address.\n") );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_options && options_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{ <o:p></o:p></P>
<P
class=MsoNormal>-
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P
class=MsoNormal>-
p_options, options_len, TRUE );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size = buf_len + options_len;<o:p></o:p></P>
<P
class=MsoNormal>-
sgl_idx++;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{
/*options probably in the same buffer */<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( p_buf, p_ip_hdr, buf_len );<o:p></o:p></P>
<P
class=MsoNormal>-
options_len = ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></P>
<P
class=MsoNormal>-
if( options_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
frag_offset += ( buf_len - ip_hdr_len );<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size = buf_len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P class=MsoNormal>+ if( buf_len < ip_hdr_len
)<o:p></o:p></P>
<P class=MsoNormal>+ { /* ip options in a separate
buffer */<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT(
buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P class=MsoNormal>+
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_ndis_buf
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to get IP options buffer.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len,
NormalPagePriority );<o:p></o:p></P>
<P class=MsoNormal>+ if( !p_options
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></P>
<P
class=MsoNormal>+
("Failed to query IP options buffer address.\n") );<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_FAILURE;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( p_buf,
p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P class=MsoNormal>+ if( p_options
&& options_len )<o:p></o:p></P>
<P class=MsoNormal>+ { <o:p></o:p></P>
<P
class=MsoNormal>+
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P
class=MsoNormal>+
p_options, options_len, TRUE );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ wr_size = buf_len
+ options_len;<o:p></o:p></P>
<P class=MsoNormal>+
sgl_idx++;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ { /*options probably in the
same buffer */<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( p_buf,
p_ip_hdr, buf_len );<o:p></o:p></P>
<P class=MsoNormal>+ options_len =
ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></P>
<P class=MsoNormal>+ if( options_len
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ frag_offset += (
buf_len - ip_hdr_len );<o:p></o:p></P>
<P class=MsoNormal>+ wr_size =
buf_len;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
/* count how much data can be put into the first WR beside IP
header.<o:p></o:p></P>
<P
class=MsoNormal>-
* other protocols headers possibly supplied in subsequent
buffers.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf
);<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ /* count how much data can be put into
the first WR beside IP header.<o:p></o:p></P>
<P class=MsoNormal>+ * other protocols headers possibly
supplied in subsequent buffers.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ for( sgl_idx; sgl_idx <
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ next_sge =
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* add sgl if it can fit into the same WR <o:p></o:p></P>
<P
class=MsoNormal>-
* Note: so far not going to split large SGE between WRs,<o:p></o:p></P>
<P
class=MsoNormal>-
* so first fragment could be a smaller size.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size )
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
++ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size += next_sge;<o:p></o:p></P>
<P
class=MsoNormal>-
frag_offset += next_sge;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></P>
<P
class=MsoNormal>-
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* fix ip hdr for the first fragment and move on */<o:p></o:p></P>
<P
class=MsoNormal>-
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></P>
<P
class=MsoNormal>-
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></P>
<P class=MsoNormal>+ /* add sgl if it
can fit into the same WR <o:p></o:p></P>
<P class=MsoNormal>+ * Note: so far
not going to split large SGE between WRs,<o:p></o:p></P>
<P class=MsoNormal>+ * so first
fragment could be a smaller size.<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ if( next_sge
<= ( p_port->p_adapter->params.payload_mtu - wr_size ) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
++ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>+
wr_size += next_sge;<o:p></o:p></P>
<P
class=MsoNormal>+
frag_offset += next_sge;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></P>
<P class=MsoNormal>+
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+
else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
/* fix ip hdr for the first fragment and move on */<o:p></o:p></P>
<P
class=MsoNormal>+
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></P>
<P
class=MsoNormal>+
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></P>
<P
class=MsoNormal>-
p_buf += ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ):
0);<o:p></o:p></P>
<P
class=MsoNormal>-
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></P>
<P
class=MsoNormal>-
++wr_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
ds_idx = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
total_ip_len -= wr_size;<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></P>
<P
class=MsoNormal>+
p_buf += ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>+
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ):
0);<o:p></o:p></P>
<P
class=MsoNormal>+
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></P>
<P
class=MsoNormal>+
++wr_idx;<o:p></o:p></P>
<P
class=MsoNormal>+
ds_idx = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ total_ip_len -= wr_size;<o:p></o:p></P>
<P class=MsoNormal>+ wr_size = 0;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++
)<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
seg_len;<o:p></o:p></P>
<P
class=MsoNormal>-
uint64_t
next_sgl_addr;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P
class=MsoNormal>-
next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P class=MsoNormal>+ for( sgl_idx, wr_idx; sgl_idx <
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
uint32_t seg_len;<o:p></o:p></P>
<P class=MsoNormal>+
uint64_t next_sgl_addr;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ if( wr_idx >=
( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></P>
<P
class=MsoNormal>+
return NDIS_STATUS_RESOURCES;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ next_sge =
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></P>
<P class=MsoNormal>+ next_sgl_addr =
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
while( next_sge )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( ds_idx == 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{
/* new ipoib + ip header */<o:p></o:p></P>
<P
class=MsoNormal>-
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></P>
<P
class=MsoNormal>-
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></P>
<P
class=MsoNormal>-
++ds_idx;<o:p></o:p></P>
<P class=MsoNormal>+ while( next_sge
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
if( ds_idx == 0 )<o:p></o:p></P>
<P
class=MsoNormal>+
{ /* new ipoib + ip header */<o:p></o:p></P>
<P
class=MsoNormal>+
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></P>
<P
class=MsoNormal>+
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf
);<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t
);<o:p></o:p></P>
<P
class=MsoNormal>+
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></P>
<P
class=MsoNormal>+
++ds_idx;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P
class=MsoNormal>-
if( p_options && options_len )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
/* copy ip options if needed */<o:p></o:p></P>
<P
class=MsoNormal>-
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P
class=MsoNormal>-
p_options, options_len, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size = ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( ds_idx == 1 )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
++ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>+
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></P>
<P
class=MsoNormal>+
if( p_options && options_len )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
/* copy ip options if needed */<o:p></o:p></P>
<P
class=MsoNormal>+
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></P>
<P
class=MsoNormal>+
p_options, options_len, FALSE );<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
wr_size = ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
if( ds_idx == 1 )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf
);<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
++ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu -
wr_size ) )?<o:p></o:p></P>
<P
class=MsoNormal>-
( p_port->p_adapter->params.payload_mtu - wr_size ) :
next_sge;<o:p></o:p></P>
<P
class=MsoNormal>+
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu -
wr_size ) )?<o:p></o:p></P>
<P
class=MsoNormal>+
( p_port->p_adapter->params.payload_mtu - wr_size ) :
next_sge;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr =
next_sgl_addr;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>-
++ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size += seg_len;<o:p></o:p></P>
<P
class=MsoNormal>-
total_ip_len -= seg_len;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr =
next_sgl_addr;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></P>
<P
class=MsoNormal>+
++ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>+
<o:p></o:p></P>
<P
class=MsoNormal>+
wr_size += seg_len;<o:p></o:p></P>
<P
class=MsoNormal>+
total_ip_len -= seg_len;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len ==
0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{
/* fix ip hdr for that fragment */<o:p></o:p></P>
<P
class=MsoNormal>-
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,
(uint16_t)wr_size,<o:p></o:p></P>
<P
class=MsoNormal>-
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></P>
<P
class=MsoNormal>-
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr))
);<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
if( total_ip_len > 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
++wr_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></P>
<P
class=MsoNormal>-
wr_size = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
ds_idx = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_buf += ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
next_sge -= seg_len;<o:p></o:p></P>
<P
class=MsoNormal>-
if( next_sge > 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
next_sgl_addr += seg_len;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_desc->num_wrs += wr_idx;<o:p></o:p></P>
<P
class=MsoNormal>-
<o:p></o:p></P>
<P
class=MsoNormal>-
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></P>
<P
class=MsoNormal>-
return NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P
class=MsoNormal>+
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len ==
0 )<o:p></o:p></P>
<P
class=MsoNormal>+
{ /* fix ip hdr for that fragment */<o:p></o:p></P>
<P
class=MsoNormal>+
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,
(uint16_t)wr_size,<o:p></o:p></P>
<P
class=MsoNormal>+
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></P>
<P
class=MsoNormal>+
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr))
);<o:p></o:p></P>
<P
class=MsoNormal>+
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></P>
<P
class=MsoNormal>+
if( total_ip_len > 0 )<o:p></o:p></P>
<P class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
++wr_idx;<o:p></o:p></P>
<P
class=MsoNormal>+
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></P>
<P
class=MsoNormal>+
wr_size = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
ds_idx = 0;<o:p></o:p></P>
<P
class=MsoNormal>+
p_buf += ip_hdr_len;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P
class=MsoNormal>+
next_sge -= seg_len;<o:p></o:p></P>
<P
class=MsoNormal>+
if( next_sge > 0 )<o:p></o:p></P>
<P
class=MsoNormal>+
{<o:p></o:p></P>
<P
class=MsoNormal>+
next_sgl_addr += seg_len;<o:p></o:p></P>
<P
class=MsoNormal>+
}<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_desc->num_wrs +=
wr_idx;<o:p></o:p></P>
<P class=MsoNormal>+ <o:p></o:p></P>
<P class=MsoNormal>+ IPOIB_EXIT( IPOIB_DBG_SEND
);<o:p></o:p></P>
<P class=MsoNormal>+ return
NDIS_STATUS_SUCCESS;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></P>
<P
class=MsoNormal>-IN
ip_hdr_t*
const
p_ip_hdr,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint16_t
fragment_size, <o:p></o:p></P>
<P
class=MsoNormal>-IN
uint16_t
fragment_offset, <o:p></o:p></P>
<P
class=MsoNormal>-IN
BOOLEAN
more_fragments )<o:p></o:p></P>
<P class=MsoNormal>+IN ip_hdr_t*
const p_ip_hdr,<o:p></o:p></P>
<P class=MsoNormal>+IN
uint16_t
fragment_size, <o:p></o:p></P>
<P class=MsoNormal>+IN
uint16_t
fragment_offset, <o:p></o:p></P>
<P class=MsoNormal>+IN
BOOLEAN
more_fragments )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
uint16_t*
p_hdr = (uint16_t*)p_ip_hdr;<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr->length = cl_hton16( fragment_size ); // bytes<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte
units<o:p></o:p></P>
<P
class=MsoNormal>-
if( more_fragments )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
else<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr->chksum = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
p_ip_hdr->chksum = ipchksum( p_hdr, IP_HEADER_LENGTH(p_ip_hdr)
);<o:p></o:p></P>
<P class=MsoNormal>+ uint16_t* p_hdr =
(uint16_t*)p_ip_hdr;<o:p></o:p></P>
<P class=MsoNormal>+ p_ip_hdr->length = cl_hton16(
fragment_size ); // bytes<o:p></o:p></P>
<P class=MsoNormal>+ p_ip_hdr->offset = cl_hton16(
fragment_offset ); // 8-byte units<o:p></o:p></P>
<P class=MsoNormal>+ if( more_fragments )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ else<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ p_ip_hdr->chksum = 0;<o:p></o:p></P>
<P class=MsoNormal>+ p_ip_hdr->chksum = ipchksum( p_hdr,
IP_HEADER_LENGTH(p_ip_hdr) );<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P class=MsoNormal> static void<o:p></o:p></P>
<P class=MsoNormal> __copy_ip_options(<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint8_t*
p_buf,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint8_t*
p_options,<o:p></o:p></P>
<P
class=MsoNormal>-IN
uint32_t
options_len,<o:p></o:p></P>
<P
class=MsoNormal>-IN
BOOLEAN
copy_all )<o:p></o:p></P>
<P class=MsoNormal>+IN uint8_t*
p_buf,<o:p></o:p></P>
<P class=MsoNormal>+IN uint8_t*
p_options,<o:p></o:p></P>
<P class=MsoNormal>+IN uint32_t
options_len,<o:p></o:p></P>
<P class=MsoNormal>+IN
BOOLEAN copy_all )<o:p></o:p></P>
<P class=MsoNormal> {<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
option_length;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
total_length = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t
copied_length = 0;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t*
p_src = p_options;<o:p></o:p></P>
<P
class=MsoNormal>-
uint8_t*
p_dst = p_buf;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t
option_length;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t total_length =
0;<o:p></o:p></P>
<P class=MsoNormal>+ uint32_t copied_length
= 0;<o:p></o:p></P>
<P class=MsoNormal>+ uint8_t* p_src =
p_options;<o:p></o:p></P>
<P class=MsoNormal>+ uint8_t* p_dst =
p_buf;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( p_options == NULL || options_len == 0 )<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
if( copy_all )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( p_dst, p_src, options_len );<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
do<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
if( ( *p_src ) == 0 ) // end of options list<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
total_length++;<o:p></o:p></P>
<P
class=MsoNormal>-
break;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
if( ( *p_src ) == 0x1 ) // no op<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
p_src++;<o:p></o:p></P>
<P
class=MsoNormal>-
total_length++;<o:p></o:p></P>
<P
class=MsoNormal>-
continue;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
/*from RFC791: <o:p></o:p></P>
<P
class=MsoNormal>-
* This option may be used between options, for example, to align<o:p></o:p></P>
<P class=MsoNormal>+ if( p_options == NULL || options_len == 0
)<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ if( copy_all )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_memcpy( p_dst,
p_src, options_len );<o:p></o:p></P>
<P class=MsoNormal>+
return;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ do<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ if( ( *p_src ) ==
0 ) // end of options list<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
total_length++;<o:p></o:p></P>
<P
class=MsoNormal>+
break;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ if( ( *p_src ) ==
0x1 ) // no op<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
p_src++;<o:p></o:p></P>
<P
class=MsoNormal>+
total_length++;<o:p></o:p></P>
<P
class=MsoNormal>+
continue;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ /*from RFC791:
<o:p></o:p></P>
<P class=MsoNormal>+ * This option may
be used between options, for example, to align<o:p></o:p></P>
<P class=MsoNormal> * the
beginning of a subsequent option on a 32 bit boundary.<o:p></o:p></P>
<P
class=MsoNormal>-
*/<o:p></o:p></P>
<P
class=MsoNormal>-
if( copied_length && (copied_length % 4) )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst += align;<o:p></o:p></P>
<P
class=MsoNormal>-
copied_length += align;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
option_length = *(p_src + 1);<o:p></o:p></P>
<P class=MsoNormal>+ */<o:p></o:p></P>
<P class=MsoNormal>+ if( copied_length
&& (copied_length % 4) )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></P>
<P
class=MsoNormal>+
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></P>
<P
class=MsoNormal>+
p_dst += align;<o:p></o:p></P>
<P
class=MsoNormal>+
copied_length += align;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ option_length =
*(p_src + 1);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
if( *p_src & 0x80 )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></P>
<P
class=MsoNormal>-
p_dst += option_length;<o:p></o:p></P>
<P
class=MsoNormal>-
copied_length += option_length;<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
total_length += option_length;<o:p></o:p></P>
<P
class=MsoNormal>-
p_src += option_length;<o:p></o:p></P>
<P class=MsoNormal>+ if( *p_src &
0x80 )<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P
class=MsoNormal>+
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></P>
<P
class=MsoNormal>+
p_dst += option_length;<o:p></o:p></P>
<P
class=MsoNormal>+
copied_length += option_length;<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ total_length +=
option_length;<o:p></o:p></P>
<P class=MsoNormal>+ p_src +=
option_length;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
}while( total_length < options_len );<o:p></o:p></P>
<P class=MsoNormal>+ }while( total_length < options_len
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( total_length == options_len );<o:p></o:p></P>
<P
class=MsoNormal>-
CL_ASSERT( copied_length <= 40 );<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( total_length == options_len
);<o:p></o:p></P>
<P class=MsoNormal>+ CL_ASSERT( copied_length <= 40
);<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
/* padding the rest */<o:p></o:p></P>
<P
class=MsoNormal>-
if( options_len > copied_length )<o:p></o:p></P>
<P
class=MsoNormal>-
{<o:p></o:p></P>
<P
class=MsoNormal>-
cl_memclr( p_dst, ( options_len - copied_length ) );<o:p></o:p></P>
<P
class=MsoNormal>-
}<o:p></o:p></P>
<P
class=MsoNormal>-
return;<o:p></o:p></P>
<P class=MsoNormal>+ /* padding the rest */<o:p></o:p></P>
<P class=MsoNormal>+ if( options_len > copied_length
)<o:p></o:p></P>
<P class=MsoNormal>+ {<o:p></o:p></P>
<P class=MsoNormal>+ cl_memclr( p_dst,
( options_len - copied_length ) );<o:p></o:p></P>
<P class=MsoNormal>+ }<o:p></o:p></P>
<P class=MsoNormal>+ return;<o:p></o:p></P>
<P class=MsoNormal> }<o:p></o:p></P>
<P class=MsoNormal> #endif<o:p></o:p></P>
<P class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h<o:p></o:p></P>
<P
class=MsoNormal>===================================================================<o:p></o:p></P>
<P class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h (revision
6314)<o:p></o:p></P>
<P class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h (working
copy)<o:p></o:p></P>
<P class=MsoNormal>@@ -607,8 +607,6 @@<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_send_mgr_t
send_mgr;<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_send_desc_t
*
p_desc;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>-
KDPC
recv_dpc;<o:p></o:p></P>
<P class=MsoNormal>-<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_endpt_mgr_t
endpt_mgr;<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal>
endpt_buf_mgr_t
cm_buf_mgr;<o:p></o:p></P>
<P class=MsoNormal>@@ -629,6 +627,7 @@<o:p></o:p></P>
<P
class=MsoNormal>
uint32_t
bc_join_retry_cnt;<o:p></o:p></P>
<P
class=MsoNormal>
ib_net16_t
base_lid;<o:p></o:p></P>
<P
class=MsoNormal>
LONG
n_no_progress;<o:p></o:p></P>
<P
class=MsoNormal>+
PIO_WORKITEM
pPoWorkItem;<o:p></o:p></P>
<P
class=MsoNormal>
ipoib_hdr_t
hdr[1]; /* Must be last! */<o:p></o:p></P>
<P class=MsoNormal> <o:p></o:p></P>
<P
class=MsoNormal> }
ipoib_port_t;<o:p></o:p></P></DIV></DIV></BODY></HTML>