<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns: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="" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<!--[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 Definitions */
 @font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Courier;
        panose-1:2 7 4 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Tms Rmn";
        panose-1:2 2 6 3 4 5 5 2 3 4;}
@font-face
        {font-family:Helv;
        panose-1:2 11 6 4 2 2 2 3 2 4;}
@font-face
        {font-family:"New York";
        panose-1:2 4 5 3 6 5 6 2 3 4;}
@font-face
        {font-family:System;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:Batang;
        panose-1:2 3 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:SimSun;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
        {font-family:Dotum;
        panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:SimHei;
        panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
        {font-family:MingLiU;
        panose-1:2 2 5 9 0 0 0 0 0 0;}
@font-face
        {font-family:Mincho;
        panose-1:2 2 6 9 4 3 5 8 3 5;}
@font-face
        {font-family:Gulim;
        panose-1:2 11 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:Century;
        panose-1:2 4 6 4 5 5 5 2 3 4;}
@font-face
        {font-family:"Angsana New";
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Cordia New";
        panose-1:2 11 3 4 2 2 2 2 2 4;}
@font-face
        {font-family:Mangal;
        panose-1:2 4 5 3 5 2 3 3 2 2;}
@font-face
        {font-family:Latha;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Sylfaen;
        panose-1:1 10 5 2 5 3 6 3 3 3;}
@font-face
        {font-family:Vrinda;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Raavi;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Shruti;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Sendnya;
        panose-1:0 0 4 0 0 0 0 0 0 0;}
@font-face
        {font-family:Gautami;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Tunga;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Estrangelo Edessa";
        panose-1:3 8 6 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:"Arial Unicode MS";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Cambria;
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:\5B8B\4F53;}
@font-face
        {font-family:"\@\5B8B\4F53";}
@font-face
        {font-family:"Segoe Print";
        panose-1:2 0 6 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Trebuchet MS";
        panose-1:2 11 6 3 2 2 2 2 2 4;}
@font-face
        {font-family:"\@SimSun";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"Century Gothic";
        panose-1:2 11 5 2 2 2 2 2 2 4;}
@font-face
        {font-family:"\@MS Mincho";
        panose-1:2 2 6 9 4 2 5 8 3 4;}
@font-face
        {font-family:"Lucida Sans";
        panose-1:2 11 6 2 3 5 4 2 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Arial Black";
        panose-1:2 11 10 4 2 1 2 2 2 4;}
@font-face
        {font-family:"MS PGothic";
        panose-1:2 11 6 0 7 2 5 8 2 4;}
@font-face
        {font-family:"\FF2D\FF33 \660E\671D";}
@font-face
        {font-family:\30E1\30A4\30EA\30AA;}
@font-face
        {font-family:"\@\30E1\30A4\30EA\30AA";}
@font-face
        {font-family:"\@\FF2D\FF33 \660E\671D";}
@font-face
        {font-family:"MS Shell Dlg 2";
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Garamond;
        panose-1:2 2 4 4 3 3 1 1 8 3;}
@font-face
        {font-family:"Lucida Console";
        panose-1:2 11 6 9 4 5 4 2 2 4;}
@font-face
        {font-family:Meiryo;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@Meiryo";
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@MS Gothic";
        panose-1:2 11 6 9 7 2 5 8 2 4;}
@font-face
        {font-family:"Comic Sans MS";
        panose-1:3 15 7 2 3 3 2 2 2 4;}
@font-face
        {font-family:"Script MT Bold";
        panose-1:3 4 6 2 4 6 7 8 9 4;}
@font-face
        {font-family:"Lucida Calligraphy";
        panose-1:3 1 1 1 1 1 1 1 1 1;}
@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";
        panose-1:2 5 6 4 5 5 5 2 2 4;}
@font-face
        {font-family:"Monotype Corsiva";
        panose-1:3 1 1 1 1 2 1 1 1 1;}
@font-face
        {font-family:Huxtable;}
@font-face
        {font-family:Mufferaw;}
@font-face
        {font-family:"Planet Benson 2";}
@font-face
        {font-family:Marlett;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:BatangChe;
        panose-1:2 3 6 9 0 1 1 1 1 1;}
@font-face
        {font-family:Gungsuh;
        panose-1:2 3 6 0 0 1 1 1 1 1;}
@font-face
        {font-family:GungsuhChe;
        panose-1:2 3 6 9 0 1 1 1 1 1;}
@font-face
        {font-family:DaunPenh;
        panose-1:1 1 1 1 1 1 1 1 1 1;}
@font-face
        {font-family:DokChampa;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Euphemia;
        panose-1:2 11 5 3 4 1 2 2 1 4;}
@font-face
        {font-family:Vani;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:GulimChe;
        panose-1:2 11 6 9 0 1 1 1 1 1;}
@font-face
        {font-family:DotumChe;
        panose-1:2 11 6 9 0 1 1 1 1 1;}
@font-face
        {font-family:Impact;
        panose-1:2 11 8 6 3 9 2 5 2 4;}
@font-face
        {font-family:"Iskoola Pota";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Kalinga;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Kartika;
        panose-1:2 2 5 3 3 4 4 6 2 3;}
@font-face
        {font-family:"Khmer UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Lao UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
        {font-family:"Meiryo UI";
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"Microsoft Himalaya";
        panose-1:1 1 1 0 1 1 1 1 1 1;}
@font-face
        {font-family:"Microsoft JhengHei";
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"Microsoft YaHei";
        panose-1:2 11 5 3 2 2 4 2 2 4;}
@font-face
        {font-family:MingLiU_HKSCS;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:MingLiU-ExtB;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:PMingLiU-ExtB;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:MingLiU_HKSCS-ExtB;
        panose-1:2 2 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Mongolian Baiti";
        panose-1:3 0 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS UI Gothic";
        panose-1:2 11 6 0 7 2 5 8 2 4;}
@font-face
        {font-family:"MS PMincho";
        panose-1:2 2 6 0 4 2 5 8 3 4;}
@font-face
        {font-family:"MV Boli";
        panose-1:2 0 5 0 3 2 0 9 0 0;}
@font-face
        {font-family:"Microsoft New Tai Lue";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Nyala;
        panose-1:2 0 5 4 7 3 0 2 0 3;}
@font-face
        {font-family:"Microsoft PhagsPa";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Plantagenet Cherokee";
        panose-1:2 2 6 2 7 1 0 0 0 0;}
@font-face
        {font-family:"Segoe Script";
        panose-1:2 11 5 4 2 0 0 0 0 3;}
@font-face
        {font-family:"Segoe UI Semibold";
        panose-1:2 11 7 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Segoe UI Light";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Segoe UI Symbol";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:NSimSun;
        panose-1:2 1 6 9 3 1 1 1 1 1;}
@font-face
        {font-family:SimSun-ExtB;
        panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
        {font-family:"Microsoft Tai Le";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Shonar Bangla";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Microsoft Yi Baiti";
        panose-1:3 0 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Microsoft Sans Serif";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Aparajita;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Ebrima;
        panose-1:2 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Gisha;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Kokila;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Leelawadee;
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Microsoft Uighur";
        panose-1:2 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:MoolBoran;
        panose-1:2 11 1 0 1 1 1 1 1 1;}
@font-face
        {font-family:Utsaah;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Vijaya;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Andalus;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Arabic Typesetting";
        panose-1:3 2 4 2 4 4 6 3 2 3;}
@font-face
        {font-family:"Simplified Arabic";
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Simplified Arabic Fixed";
        panose-1:2 7 3 9 2 2 5 2 4 4;}
@font-face
        {font-family:"Sakkal Majalla";
        panose-1:2 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Traditional Arabic";
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:Aharoni;
        panose-1:2 1 8 3 2 1 4 3 2 3;}
@font-face
        {font-family:David;
        panose-1:2 14 5 2 6 4 1 1 1 1;}
@font-face
        {font-family:FrankRuehl;
        panose-1:2 14 5 3 6 1 1 1 1 1;}
@font-face
        {font-family:"Levenim MT";
        panose-1:2 1 5 2 6 1 1 1 1 1;}
@font-face
        {font-family:Miriam;
        panose-1:2 11 5 2 5 1 1 1 1 1;}
@font-face
        {font-family:"Miriam Fixed";
        panose-1:2 11 5 9 5 1 1 1 1 1;}
@font-face
        {font-family:Narkisim;
        panose-1:2 14 5 2 5 1 1 1 1 1;}
@font-face
        {font-family:Rod;
        panose-1:2 3 5 9 5 1 1 1 1 1;}
@font-face
        {font-family:FangSong;
        panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
        {font-family:KaiTi;
        panose-1:2 1 6 9 6 1 1 1 1 1;}
@font-face
        {font-family:AngsanaUPC;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Browallia New";
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:BrowalliaUPC;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:CordiaUPC;
        panose-1:2 11 3 4 2 2 2 2 2 4;}
@font-face
        {font-family:DilleniaUPC;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:EucrosiaUPC;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:FreesiaUPC;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:IrisUPC;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:JasmineUPC;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:KodchiangUPC;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:LilyUPC;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:DFKai-SB;
        panose-1:3 0 5 9 0 0 0 0 0 0;}
@font-face
        {font-family:"Lucida Sans Unicode";
        panose-1:2 11 6 2 3 5 4 2 2 4;}
@font-face
        {font-family:Candara;
        panose-1:2 14 5 2 3 3 3 2 2 4;}
@font-face
        {font-family:Constantia;
        panose-1:2 3 6 2 5 3 6 3 3 3;}
@font-face
        {font-family:Corbel;
        panose-1:2 11 5 3 2 2 4 2 2 4;}
@font-face
        {font-family:"Franklin Gothic Medium";
        panose-1:2 11 6 3 2 1 2 2 2 4;}
@font-face
        {font-family:Gabriola;
        panose-1:4 4 6 5 5 16 2 2 13 2;}
@font-face
        {font-family:Georgia;
        panose-1:2 4 5 2 5 4 5 2 3 3;}
@font-face
        {font-family:"Palatino Linotype";
        panose-1:2 4 5 2 5 5 5 3 3 4;}
@font-face
        {font-family:Webdings;
        panose-1:5 3 1 2 1 5 9 6 7 3;}
@font-face
        {font-family:"MT Extra";
        panose-1:5 5 1 2 1 2 5 2 2 2;}
@font-face
        {font-family:"Bookshelf Symbol 7";
        panose-1:5 1 1 1 1 1 1 1 1 1;}
@font-face
        {font-family:"MS Reference Sans Serif";
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"MS Reference Specialty";
        panose-1:5 0 5 0 0 0 0 0 0 0;}
@font-face
        {font-family:"MS Outlook";
        panose-1:5 1 1 0 1 0 0 0 0 0;}
@font-face
        {font-family:"Book Antiqua";
        panose-1:2 4 6 2 5 3 5 3 3 4;}
@font-face
        {font-family:"Wingdings 2";
        panose-1:5 2 1 2 1 5 7 7 7 7;}
@font-face
        {font-family:"Wingdings 3";
        panose-1:5 4 1 2 1 8 7 7 7 7;}
@font-face
        {font-family:"Arial Narrow";
        panose-1:2 11 6 6 2 2 2 3 2 4;}
@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;
        panose-1:2 2 6 3 5 4 5 2 3 4;}
@font-face
        {font-family:"Guttman Stam";}
@font-face
        {font-family:"ms sans serif";}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.msoIns
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:underline;
        color:teal;}
span.msoDel
        {mso-style-type:export-only;
        mso-style-name:"";
        text-decoration:line-through;
        color:red;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
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 class=WordSection1>

<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:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
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></span></p>

</div>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>Resend as original email bounced.</span><span style='font-size:
12.0pt;font-family:"Times New Roman","serif"'><o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'> <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:blue'>stan.</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'> <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:12.0pt;font-family:"Times New Roman","serif"'> <o:p></o:p></span></p>

<div class=MsoNormal align=center style='text-align:center'><span
style='font-size:12.0pt;font-family:"Times New Roman","serif"'>

<hr size=2 width="100%" align=center>

</span></div>

<p class=MsoNormal style='margin-bottom:12.0pt'><b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> 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</span><span style='font-size:12.0pt;
font-family:"Times New Roman","serif"'><o:p></o:p></span></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><span style='font-size:10.0pt;font-family:"Courier New"'>When
processing of receive packet in DPC take too much time the OS throw an assert
warning that too much time is spent in DPC and it may affect the system.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>The
fix move the receive processing to a workitem. so the IPOIB give-up after some
time and return to process receive packet in workitem. that allows other DPCs
and workitems too run in parallel. <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'><o:p> </o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>Uri</span><o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.c<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_adapter.c       (revision
6314)<o:p></o:p></p>

<p class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.c   
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -224,6 +224,9 @@<o:p></o:p></p>

<p class=MsoNormal>                               
}<o:p></o:p></p>

<p class=MsoNormal>               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    NdisMGetDeviceProperty(h_adapter,
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(p_adapter->pdo != NULL);<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>               
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></p>

<p class=MsoNormal>               
if ( p_adapter->p_stat ) <o:p></o:p></p>

<p class=MsoNormal>                               
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_adapter.h<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_adapter.h      (revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++ ulp/ipoib/kernel/ipoib_adapter.h   (working
copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -150,6 +150,7 @@<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>               
cl_obj_t                                                              
obj;<o:p></o:p></p>

<p class=MsoNormal>               
NDIS_HANDLE                                                  
h_adapter;<o:p></o:p></p>

<p class=MsoNormal>+   
PDEVICE_OBJECT          pdo;<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_ifc_data_t                              
guids;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_list_item_t                                   
entry;<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.c<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_port.c             
(revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++
ulp/ipoib/kernel/ipoib_port.c          
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -605,6 +605,8 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
__endpt_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+            
p_port->pPoWorkItem = NULL;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>               
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></p>

<p class=MsoNormal>               
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE
);<o:p></o:p></p>

<p class=MsoNormal>               
<o:p></o:p></p>

<p class=MsoNormal>@@ -626,6 +628,12 @@<o:p></o:p></p>

<p class=MsoNormal>               
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></p>

<p class=MsoNormal>               
p_port->p_adapter = p_adapter;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    p_port->pPoWorkItem =
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></p>

<p class=MsoNormal>+            
if( p_port->pPoWorkItem == NULL ) {<o:p></o:p></p>

<p class=MsoNormal>+                            
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("IoAllocateWorkItem
returned NULL\n") );<o:p></o:p></p>

<p class=MsoNormal>+                            
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+            
}<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>               
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>               
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>@@ -682,9 +690,6 @@<o:p></o:p></p>

<p class=MsoNormal>                               
return status;<o:p></o:p></p>

<p class=MsoNormal>               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>               
 /* Initialize multicast garbage collector timer and DPC object */<o:p></o:p></p>

<p class=MsoNormal>               
 KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></p>

<p class=MsoNormal>               
 KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></p>

<p class=MsoNormal>@@ -795,6 +800,7 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_obj_deinit( p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    IoFreeWorkItem( p_port->pPoWorkItem
);<o:p></o:p></p>

<p class=MsoNormal>               
cl_free( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>@@ -1628,10 +1634,43 @@<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>

<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>

<p class=MsoNormal>+            
IN                          
const     ib_cq_handle_t                                                               
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+            
IN                                                          
void                                                                                      
*cq_context,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
uint32_t*                   
p_recv_cnt );<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal>-__recv_cb(<o:p></o:p></p>

<p class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></p>

<p class=MsoNormal>+            
IN                                                          
DEVICE_OBJECT*                                                            
p_dev_obj,<o:p></o:p></p>

<p class=MsoNormal>+            
IN                                                          
void*                                                                                    
context )<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+            
ipoib_port_t *p_port = ( ipoib_port_t* ) context;<o:p></o:p></p>

<p class=MsoNormal>+    int WorkToDo = true;<o:p></o:p></p>

<p class=MsoNormal>+    KIRQL irql;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t recv_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t total_recv_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+            
UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    while (WorkToDo && total_recv_cnt
< 512) {<o:p></o:p></p>

<p class=MsoNormal>+        irql =
KeRaiseIrqlToDpcLevel();<o:p></o:p></p>

<p class=MsoNormal>+        WorkToDo =
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></p>

<p class=MsoNormal>+       
KeLowerIrql(irql);<o:p></o:p></p>

<p class=MsoNormal>+        total_recv_cnt
+= recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+    if (WorkToDo) {<o:p></o:p></p>

<p class=MsoNormal>+        IoQueueWorkItem(
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, p_port);<o:p></o:p></p>

<p class=MsoNormal>+   
}        <o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>

<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>

<p class=MsoNormal>               
IN                          
const    
ib_cq_handle_t                                                               
h_cq,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*cq_context )<o:p></o:p></p>

<p class=MsoNormal>+            
IN                                                          
void                                                                                      
*cq_context,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
uint32_t*                   
p_recv_cnt)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>               
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>@@ -1639,6 +1678,8 @@<o:p></o:p></p>

<p class=MsoNormal>               
int32_t                                                 
pkt_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></p>

<p class=MsoNormal>               
cl_qlist_t                                             
done_list, bad_list;<o:p></o:p></p>

<p class=MsoNormal>               
size_t                                                   
i;<o:p></o:p></p>

<p class=MsoNormal>+    BOOLEAN WorkToDo =  FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>               
PERF_DECLARE( RecvCompBundle );<o:p></o:p></p>

<p class=MsoNormal>               
PERF_DECLARE( RecvCb );<o:p></o:p></p>

<p class=MsoNormal>               
PERF_DECLARE( PollRecv );<o:p></o:p></p>

<p class=MsoNormal>@@ -1655,8 +1696,6 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_perf_start( RecvCb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( h_cq );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>               
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_qlist_init( &done_list );<o:p></o:p></p>

<p class=MsoNormal>@@ -1785,13 +1824,30 @@<o:p></o:p></p>

<p class=MsoNormal>                               
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>

<p class=MsoNormal>               
} else {<o:p></o:p></p>

<p class=MsoNormal>                               
// Please note the reference is still up<o:p></o:p></p>

<p class=MsoNormal>-                             
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></p>

<p class=MsoNormal>+        if (h_cq) {<o:p></o:p></p>

<p class=MsoNormal>+           
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></p>

<p class=MsoNormal>+           
WorkToDo = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+        } else {<o:p></o:p></p>

<p class=MsoNormal>+           
WorkToDo = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return WorkToDo;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+static void<o:p></o:p></p>

<p class=MsoNormal>+__recv_cb(<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context )<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    __recv_cb_internal(h_cq, cq_context,
&recv_cnt);<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib/kernel/ipoib_port.h<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib/kernel/ipoib_port.h            
(revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++
ulp/ipoib/kernel/ipoib_port.h         
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -502,8 +502,6 @@<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_recv_mgr_t                           
recv_mgr;<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_send_mgr_t                         
send_mgr;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KDPC                                                                    
recv_dpc;<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_endpt_mgr_t                       
endpt_mgr;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
ipoib_endpt_t                                  
*p_local_endpt;<o:p></o:p></p>

<p class=MsoNormal>@@ -520,6 +518,7 @@<o:p></o:p></p>

<p class=MsoNormal>               
KTIMER                                                                               
gc_timer;<o:p></o:p></p>

<p class=MsoNormal>               
uint32_t                                                              
bc_join_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>               
ib_net16_t                                                         
base_lid;<o:p></o:p></p>

<p class=MsoNormal>+            
PIO_WORKITEM                                              
pPoWorkItem;<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_hdr_t                                                       
hdr[1];  /* Must be last! */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> }            
ipoib_port_t;<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp        
(revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.cpp     
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -216,6 +216,9 @@<o:p></o:p></p>

<p class=MsoNormal>                               
}<o:p></o:p></p>

<p class=MsoNormal>               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    NdisMGetDeviceProperty(h_adapter,
&p_adapter->pdo, NULL, NULL, NULL, NULL);<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(p_adapter->pdo != NULL);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>               
p_adapter->p_stat = ipoib_st_dev_add();<o:p></o:p></p>

<p class=MsoNormal>               
if ( p_adapter->p_stat ) <o:p></o:p></p>

<p class=MsoNormal>                               
p_adapter->p_stat->p_adapter = p_adapter;<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>--- ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h            
(revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h         
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -185,6 +185,7 @@<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>               
cl_obj_t                                                              
obj;<o:p></o:p></p>

<p class=MsoNormal>               
NDIS_HANDLE                                                  
h_adapter;<o:p></o:p></p>

<p class=MsoNormal>+   
PDEVICE_OBJECT          pdo;<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_ifc_data_t                              
guids;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
cl_list_item_t                                   
entry;<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp            
(revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++
ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.cpp         
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -3126,7 +3126,7 @@<o:p></o:p></p>

<p class=MsoNormal>               
if( p_adapter->state != IB_PNP_PORT_ACTIVE || !p_adapter->p_port )<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal>                               
cl_obj_unlock( &p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>                                                               
("Got send during port non-active, complete with error \n") );<o:p></o:p></p>

<p class=MsoNormal>                               
status = NDIS_STATUS_FAILURE; <o:p></o:p></p>

<p class=MsoNormal>                               
goto compl_status;<o:p></o:p></p>

<p class=MsoNormal>@@ -3172,7 +3172,7 @@<o:p></o:p></p>

<p class=MsoNormal>     if (status != NDIS_STATUS_SUCCESS)<o:p></o:p></p>

<p class=MsoNormal>               
{<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                            
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>                                                               
("Got bad status, g_NBL=%d, g_NBL_completed=%d \n", g_NBL,
g_NBL_complete) );<o:p></o:p></p>

<p class=MsoNormal>                               
send_complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>               
    <o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp               
(revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.cpp            
(working copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -58,50 +58,48 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-ib_gid_t             
bcast_mgid_template = {<o:p></o:p></p>

<p class=MsoNormal>-             
0xff,                                                                                                                      
/* multicast field */<o:p></o:p></p>

<p class=MsoNormal>-             
0x12,                                                                                                                    
/* scope (to be filled in) */<o:p></o:p></p>

<p class=MsoNormal>-             
0x40,
0x1b,                                                                                                        
/* IPv4 signature */<o:p></o:p></p>

<p class=MsoNormal>-             
0xff,
0xff,                                                                                                           
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></p>

<p class=MsoNormal>-             
0x00, 0x00, 0x00, 0x00, 0x00,
0x00,           /* 48 bits of
zeros */<o:p></o:p></p>

<p class=MsoNormal>-             
0xff, 0xff, 0xff,
0xff,                                                       
/* 32 bit IPv4 broadcast address */<o:p></o:p></p>

<p class=MsoNormal>+ib_gid_t    bcast_mgid_template = {<o:p></o:p></p>

<p class=MsoNormal>+   
0xff,                              
/* multicast field */<o:p></o:p></p>

<p class=MsoNormal>+   
0x12,                              
/* scope (to be filled in) */<o:p></o:p></p>

<p class=MsoNormal>+    0x40,
0x1b,              
          /* IPv4 signature
*/<o:p></o:p></p>

<p class=MsoNormal>+    0xff,
0xff,                        
/* 16 bits of P_Key (to be filled in) */<o:p></o:p></p>

<p class=MsoNormal>+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*
48 bits of zeros */<o:p></o:p></p>

<p class=MsoNormal>+    0xff, 0xff, 0xff,
0xff,            
/* 32 bit IPv4 broadcast address */<o:p></o:p></p>

<p class=MsoNormal> };<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></p>

<p class=MsoNormal> /* Handy pointer for debug use. */<o:p></o:p></p>

<p class=MsoNormal>-ipoib_port_t     *gp_ipoib_port;<o:p></o:p></p>

<p class=MsoNormal>+ipoib_port_t    *gp_ipoib_port;<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2);<o:p></o:p></p>

<p class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t*
const       p_port );<o:p></o:p></p>

<p class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const
p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void
*s_arg1, void *s_arg2);<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> #ifndef _IPOIB_DEBUG_NDIS6<o:p></o:p></p>

<p class=MsoNormal> #define _IPOIB_DEBUG_NDIS6<o:p></o:p></p>

<p class=MsoNormal> CL_INLINE void CL_API<o:p></o:p></p>

<p class=MsoNormal> cl_qlist_check_validity(<o:p></o:p></p>

<p class=MsoNormal>-             
IN           cl_qlist_t*
const              
p_list )<o:p></o:p></p>

<p class=MsoNormal>+    IN  cl_qlist_t* const  
p_list )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_list_item_t    *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
size_t cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    cl_list_item_t  *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    size_t cnt = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* CL_ASSERT that a non-null pointer is provided. */<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_list );<o:p></o:p></p>

<p class=MsoNormal>-             
/* CL_ASSERT that the list was initialized. */<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_list->state == CL_INITIALIZED );<o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qlist_head(p_list);<o:p></o:p></p>

<p class=MsoNormal>-             
while(p_item != cl_qlist_end(p_list)) {<o:p></o:p></p>

<p class=MsoNormal>-                             
++cnt;<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = p_item->p_next;<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT (cnt <= p_list->count);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT (cnt == p_list->count);<o:p></o:p></p>

<p class=MsoNormal>-             
return;<o:p></o:p></p>

<p class=MsoNormal>+    /* CL_ASSERT that a non-null pointer is
provided. */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_list );<o:p></o:p></p>

<p class=MsoNormal>+    /* CL_ASSERT that the list was
initialized. */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_list->state ==
CL_INITIALIZED );<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qlist_head(p_list);<o:p></o:p></p>

<p class=MsoNormal>+    while(p_item != cl_qlist_end(p_list)) {<o:p></o:p></p>

<p class=MsoNormal>+        ++cnt;<o:p></o:p></p>

<p class=MsoNormal>+       
CL_ASSERT(p_item->p_list == p_list);<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
p_item->p_next;<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT (cnt
<= p_list->count);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT (cnt == p_list->count);<o:p></o:p></p>

<p class=MsoNormal>+    return;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>@@ -112,34 +110,34 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_adapter_t* const                               
p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_pnp_port_rec_t* const         
p_pnp_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_adapter_t* const      p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_pnp_port_rec_t* const    p_pnp_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_destroying(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_obj_t* const                                                
p_obj );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_obj_t*
const            
p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_cleanup(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_obj_t* const                                                
p_obj );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_obj_t*
const            
p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_free(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_obj_t* const                                                
p_obj );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_obj_t*
const            
p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ipoib_port_t* const                                                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ib_ca_attr_t**                                                                                 
pp_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ipoib_port_t* const  
              p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ib_ca_attr_t**                     
pp_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __srq_async_event_cb(<o:p></o:p></p>

<p class=MsoNormal>-IN                                         
ib_async_event_rec_t                 
*p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>+IN         
ib_async_event_rec_t        *p_event_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal>@@ -148,27 +146,27 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __qp_event(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_async_event_rec_t                 
*p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_async_event_rec_t        *p_event_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __cq_event(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_async_event_rec_t                 
*p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_async_event_rec_t        *p_event_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_activate(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal>@@ -177,58 +175,58 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static cl_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_ctor(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void* const                                                                        
p_object,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void*                                                                                    
context,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_pool_item_t**
const                               
pp_pool_item );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void*
const                
p_object,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void*                      
context,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         cl_pool_item_t**
const      pp_pool_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_dtor(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     cl_pool_item_t*
const                 
p_pool_item,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*context );<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   cl_pool_item_t* const      
p_pool_item,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*context );<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ipoib_send_desc_t*<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_get_send(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_put_send(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_desc_t* const         
p_desc );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_desc_t* const    p_desc );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t* const           
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NET_BUFFER_LIST* const                           
p_net_buffer_list OPTIONAL );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
        ipoib_port_t*
const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
NET_BUFFER_LIST* const      p_net_buffer_list OPTIONAL
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_qlist_t* const                                              
p_list );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_qlist_t* const          
p_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> //NDIS60<o:p></o:p></p>

<p class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t*
const            p_desc
);<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal>@@ -238,76 +236,76 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /* Posts receive buffers to the receive queue. */<o:p></o:p></p>

<p class=MsoNormal> int32_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_repost(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
ib_cq_handle_t                                                               
h_cq,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*cq_context );<o:p></o:p></p>

<p class=MsoNormal>+    IN      const  
ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_get_endpts(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t* const           
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_wc_t* const                                                
p_wc,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t**
const                
pp_src,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t**
const                
pp_dst );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_wc_t*
const             
p_wc,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_endpt_t**
const       pp_src,<o:p></o:p></p>

<p class=MsoNormal>+        OUT        
ipoib_endpt_t** const       pp_dst );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static int32_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_filter(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_wc_t*
const                                                
p_done_wc_list,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_qlist_t*
const                                              
p_done_list,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_qlist_t*
const                                              
p_bad_list );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_wc_t*
const             
p_done_wc_list,<o:p></o:p></p>

<p class=MsoNormal>+ 
      OUT        
cl_qlist_t* const          
p_done_list,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         cl_qlist_t*
const           p_bad_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_gen(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t*
const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_dst );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ipoib_pkt_t*
const          p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t*
const            p_eth,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_src,<o:p></o:p></p>

<p class=MsoNormal>+    IN  
           ipoib_endpt_t*
const        p_dst );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_dhcp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t*
const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_dst );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ipoib_pkt_t*
const          p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t* const           
p_eth,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_src,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_dst );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_arp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_wc_t* const                                                
p_wc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t*
const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t** const                
p_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_dst );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_wc_t*
const             
p_wc,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ipoib_pkt_t*
const          p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t*
const            p_eth,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t** const       p_src,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_dst );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t*
const            p_desc,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
NET_BUFFER_LIST**
const                         
pp_net_buffer_list );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         NET_BUFFER_LIST**
const     pp_net_buffer_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static uint32_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_qlist_t*                                                                          
p_done_list,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
int32_t*
const                                                  
p_discarded );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+  
     OUT        
cl_qlist_t*                
p_done_list,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         int32_t*
const             
p_discarded );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal>@@ -316,128 +314,128 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_gen(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_NB_SG *                                    
s_buf,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
INT                                                                                        
lso_data_index,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
UINT                                                                                     
lso_header_size OPTIONAL);<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_NB_SG *          s_buf,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
INT                        
lso_data_index,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
UINT                       
lso_header_size OPTIONAL);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG*
const                         
s_buf);<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+    IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT         ipoib_send_NB_SG*
const     s_buf);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></p>

<p class=MsoNormal>-             
IN
                                                         
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-   
IN                     
const     ip_hdr_t*
const                                                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
iph_options_size,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len );<o:p></o:p></p>

<p class=MsoNormal>+    IN  
           ipoib_port_t*
const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ip_hdr_t*
const            
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
iph_options_size,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ip_hdr_t*
const                                                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG*
const                         
s_buf);<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ip_hdr_t* const 
           p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT         ipoib_send_NB_SG*
const     s_buf);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     udp_hdr_t*
const                                          
p_udp_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG*
const                         
s_buf );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   udp_hdr_t*
const           
p_udp_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT         ipoib_send_NB_SG*
const     s_buf );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG*
const                         
s_buf );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT         ipoib_send_NB_SG*
const     s_buf );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline void <o:p></o:p></p>

<p class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
ipoib_send_NB_SG        *s_buf, <o:p></o:p></p>

<p class=MsoNormal>-             
IN           NDIS_STATUS
                  
status,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
ULONG                                                
compl_flags,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
boolean_t                                          
bLock    );<o:p></o:p></p>

<p class=MsoNormal>+    IN 
ipoib_send_NB_SG    *s_buf, <o:p></o:p></p>

<p class=MsoNormal>+    IN 
NDIS_STATUS         status,<o:p></o:p></p>

<p class=MsoNormal>+    IN  ULONG              
compl_flags,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
boolean_t          
bLock   );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_queue(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
eth_hdr_t* const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t** const                
pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_endpt_t**
const       pp_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __build_send_desc(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL* const                                                                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
size_t                                                                                   
mdl_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_NB_SG                                       
*s_buf);<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*
const                 
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
size_t                     
mdl_len,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_NB_SG           
*s_buf);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __send_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
ib_cq_handle_t                                                               
h_cq,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*cq_context );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS <o:p></o:p></p>

<p class=MsoNormal> GetLsoHeaderSize(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
PNET_BUFFER                  
pNetBuffer,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
LsoData                               
*pLsoData,<o:p></o:p></p>

<p class=MsoNormal>-             
OUT      
UINT                                     
*IndexOfData,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
PNET_BUFFER     pNetBuffer,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
LsoData         *pLsoData,<o:p></o:p></p>

<p class=MsoNormal>+    OUT    
UINT           
*IndexOfData,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ipoib_hdr_t *ipoib_hdr );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __build_lso_desc(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ULONG                                                                                
mss,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
int32_t                                                                                 
hdr_idx,<o:p></o:p></p>

<p class=MsoNormal>-             
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NET_BUFFER                                                                     
*p_netbuf);<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ULONG     
                 mss,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
int32_t                    
hdr_idx,<o:p></o:p></p>

<p class=MsoNormal>+    IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO
p_lso_info,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
NET_BUFFER                 
*p_netbuf);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> //TODO CM Restore<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_fragments(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ipoib_port_t* const                                                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ipoib_send_desc_t*
const                                         
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
eth_hdr_t* const                                                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ip_hdr_t* const                                                                                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
uint32_t                                                                                                              
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
NDIS_BUFFER*                                                                                
p_ndis_buf );<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ipoib_port_t*
const                
p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ipoib_send_desc_t*
const            p_desc,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
eth_hdr_t*
const                   
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ip_hdr_t*
const                    
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
uint32_t                           
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
NDIS_BUFFER*                       
p_ndis_buf );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
ip_hdr_t*
const                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint16_t                                              
fragment_size, <o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint16_t                                              
fragment_offset, <o:p></o:p></p>

<p class=MsoNormal>-IN                         
BOOLEAN                                                           
more_fragments );<o:p></o:p></p>

<p class=MsoNormal>+IN      ip_hdr_t*
const     p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+IN     
uint16_t           
fragment_size, <o:p></o:p></p>

<p class=MsoNormal>+IN     
uint16_t           
fragment_offset, <o:p></o:p></p>

<p class=MsoNormal>+IN     
BOOLEAN            
more_fragments );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __copy_ip_options(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint8_t*                                              
p_buf,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint8_t*                                              
p_options,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint32_t                                              
options_len,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
BOOLEAN                                                           
copy_all );<o:p></o:p></p>

<p class=MsoNormal>+IN     
uint8_t*           
p_buf,<o:p></o:p></p>

<p class=MsoNormal>+IN     
uint8_t*           
p_options,<o:p></o:p></p>

<p class=MsoNormal>+IN      uint32_t           
options_len,<o:p></o:p></p>

<p class=MsoNormal>+IN     
BOOLEAN            
copy_all );<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal>@@ -446,85 +444,85 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /****f* IPoIB/__endpt_mgr_remove_all<o:p></o:p></p>

<p class=MsoNormal> * NAME<o:p></o:p></p>

<p class=MsoNormal>-*           
__endpt_mgr_remove_all<o:p></o:p></p>

<p class=MsoNormal>+*   __endpt_mgr_remove_all<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal> * DESCRIPTION<o:p></o:p></p>

<p class=MsoNormal>-*           
Removes all enpoints from the port, dereferencing them to initiate<o:p></o:p></p>

<p class=MsoNormal>-*           
destruction.<o:p></o:p></p>

<p class=MsoNormal>+*   Removes all enpoints from the port, dereferencing
them to initiate<o:p></o:p></p>

<p class=MsoNormal>+*   destruction.<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal> * SYNOPSIS<o:p></o:p></p>

<p class=MsoNormal> */<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+    IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> /*<o:p></o:p></p>

<p class=MsoNormal> ********/<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t**
const                
pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_endpt_t**
const       pp_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ib_gid_t* const                                                
p_gid,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
UNALIGNED net32_t* const       p_qpn );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ib_gid_t*
const            
p_gid,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         UNALIGNED net32_t*
const    p_qpn );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ib_gid_t*
const                                                
p_gid );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ib_gid_t*
const            
p_gid );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
                               
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
net16_t                                                                                               
lid );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   net16_t                    
lid );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_port_info_t* const                  
p_port_info );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_port_info_t* const       p_port_info );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_mcast_rec_t                                                               
*p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_mcast_rec_t             
*p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal> *<o:p></o:p></p>

<p class=MsoNormal>@@ -533,85 +531,85 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_get_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_join_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_member_rec_t* const                           
p_member_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_member_rec_t* const      p_member_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_create_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port );<o:p></o:p></p>

<p class=MsoNormal>+    IN             
ipoib_port_t* const         p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __bcast_get_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_query_rec_t                                                               
*p_query_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_query_rec_t             
*p_query_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __bcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_mcast_rec_t                                                               
*p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_mcast_rec_t             
*p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __mcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_mcast_rec_t                                                               
*p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_mcast_rec_t             
*p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                      
*context );<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void               
*context );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static int<o:p></o:p></p>

<p class=MsoNormal> __gid_cmp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     void*
const                                                                        
p_key1,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     void*
const                                                                        
p_key2 )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   void*
const                
p_key1,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   void*
const                
p_key2 )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
return cl_memcmp( p_key1, p_key2, sizeof(ib_gid_t) );<o:p></o:p></p>

<p class=MsoNormal>+    return cl_memcmp( p_key1, p_key2,
sizeof(ib_gid_t) );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> inline void ipoib_port_ref( ipoib_port_t * p_port, int
type )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_ref( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_ref( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> #if DBG<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->ref[type % ref_mask] );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Port[%d] refcount raised to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc( &p_port->ref[type
% ref_mask] );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+               
("Port[%d] refcount raised to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if ((p_port->obj.ref_cnt % 20)==0)<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                             
("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal>+    if ((p_port->obj.ref_cnt % 20)==0)<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+        ("ref type
%d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal> #else<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(type);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(type);<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> inline void ipoib_port_deref(ipoib_port_t * p_port,
int type)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_deref( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_deref( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> #if DBG<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_dec( &p_port->ref[type % ref_mask] );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Port[%d] refcount decremented to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>

<p class=MsoNormal>-             
if ((p_port->obj.ref_cnt % 20) == 0)<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                             
("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_dec( &p_port->ref[type
% ref_mask] );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+               
("Port[%d] refcount decremented to %d\n", p_port->port_num,
p_port->obj.ref_cnt));<o:p></o:p></p>

<p class=MsoNormal>+    if ((p_port->obj.ref_cnt % 20) == 0)<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+        ("deref
type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal> #else<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(type);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(type);<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /* function returns pointer to payload that is going
after IP header.<o:p></o:p></p>

<p class=MsoNormal> *  asssuming that payload and IP header are in
the same buffer<o:p></o:p></p>

<p class=MsoNormal> */<o:p></o:p></p>

<p class=MsoNormal>-static void*
GetIpPayloadPtr(const        ip_hdr_t*
const               
p_ip_hdr)<o:p></o:p></p>

<p class=MsoNormal>+static void* GetIpPayloadPtr(const  ip_hdr_t* const
p_ip_hdr)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></p>

<p class=MsoNormal>+    return (void*)((uint8_t*)p_ip_hdr +
IP_HEADER_LENGTH(p_ip_hdr));<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /******************************************************************************<o:p></o:p></p>

<p class=MsoNormal>@@ -621,316 +619,324 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> ipoib_create_port(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_adapter_t* const                               
p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_pnp_port_rec_t* const         
p_pnp_rec,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_port_t** const                    
pp_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_adapter_t* const      p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+   
IN           
  ib_pnp_port_rec_t* const    p_pnp_rec,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_port_t**
const        pp_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( !p_adapter->p_port );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( !p_adapter->p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t *) cl_zalloc( sizeof(ipoib_port_t) +<o:p></o:p></p>

<p class=MsoNormal>-                             
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_port )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
sizeof(ipoib_port_t)) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_port = (ipoib_port_t *) cl_zalloc(
sizeof(ipoib_port_t) +<o:p></o:p></p>

<p class=MsoNormal>+       
(sizeof(ipoib_hdr_t) * (p_adapter->params.sq_depth - 1)) );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_port )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to allocate ipoib_port_t (%d bytes)\n",<o:p></o:p></p>

<p class=MsoNormal>+           
sizeof(ipoib_port_t)) );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #ifdef _DEBUG_<o:p></o:p></p>

<p class=MsoNormal>-             
gp_ipoib_port = p_port;<o:p></o:p></p>

<p class=MsoNormal>+    gp_ipoib_port = p_port;<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__port_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __port_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = __port_init( p_port, p_adapter, p_pnp_rec );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_port_init returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
__port_cleanup( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
__port_free( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    status = __port_init( p_port, p_adapter,
p_pnp_rec );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_port_init returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        __port_cleanup(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        __port_free(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_port = p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    *pp_port = p_port;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( !p_port->p_adapter->p_port );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(
!p_port->p_adapter->p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_destroy( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_destroy( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+    IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->state = IB_QPS_RESET;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->state = IB_QPS_RESET;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_construct( &p_port->obj, IPOIB_OBJ_PORT );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_construct( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_construct( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
__ib_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
__buf_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_construct( &p_port->obj,
IPOIB_OBJ_PORT );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_construct(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_construct(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    __ib_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __buf_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__recv_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
__send_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __recv_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __send_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__endpt_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __endpt_mgr_construct( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeInitializeEvent( &p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></p>

<p class=MsoNormal>-             
KeInitializeEvent( &p_port->leave_mcast_event, NotificationEvent, TRUE
);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->pPoWorkItem = NULL;<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+    KeInitializeEvent(
&p_port->sa_event, NotificationEvent, TRUE );<o:p></o:p></p>

<p class=MsoNormal>+    KeInitializeEvent(
&p_port->leave_mcast_event, NotificationEvent, TRUE );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_adapter_t* const                               
p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_pnp_port_rec_t* const         
p_pnp_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_adapter_t* const      p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_pnp_port_rec_t* const    p_pnp_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status_t                                         
cl_status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_status_t         cl_status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->port_num = p_pnp_rec->p_port_attr->port_num;<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_adapter = p_adapter;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->port_num =
p_pnp_rec->p_port_attr->port_num;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_adapter = p_adapter;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_spinlock_init( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_port->pPoWorkItem =
IoAllocateWorkItem(p_adapter->pdo);<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->pPoWorkItem == NULL
)   {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("IoAllocateWorkItem returned NULL\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_spinlock_init( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_spinlock_init(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Initialize the IB resource manager. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = __ib_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__ib_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_spinlock_init(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_spinlock_init returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Initialize the buffer manager. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = __buf_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__buf_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Initialize the IB resource manager.
*/<o:p></o:p></p>

<p class=MsoNormal>+    status = __ib_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__ib_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Initialize the receive manager. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = __recv_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__recv_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
status =__send_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__send_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Initialize the buffer manager. */<o:p></o:p></p>

<p class=MsoNormal>+    status = __buf_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__buf_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Initialize the endpoint manager. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = __endpt_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__endpt_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Initialize the receive manager. */<o:p></o:p></p>

<p class=MsoNormal>+    status = __recv_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__recv_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    status =__send_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__send_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);<o:p></o:p></p>

<p class=MsoNormal>+    /* Initialize the endpoint manager. */<o:p></o:p></p>

<p class=MsoNormal>+    status = __endpt_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__endpt_mgr_init returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+     /* Initialize multicast garbage
collector timer and DPC object */<o:p></o:p></p>

<p class=MsoNormal>+    
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></p>

<p class=MsoNormal>+    
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Initialize multicast garbage collector timer and DPC object */<o:p></o:p></p>

<p class=MsoNormal>-             
KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);<o:p></o:p></p>

<p class=MsoNormal>-             
KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);<o:p></o:p></p>

<p class=MsoNormal>+    /* We only ever destroy from the PnP
callback thread. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_obj_init(
&p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></p>

<p class=MsoNormal>+       
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* We only ever destroy from the PnP callback thread. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,<o:p></o:p></p>

<p class=MsoNormal>-                             
__port_destroying, __port_cleanup, __port_free );<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                             
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc(
&p_port->ref[ref_init] );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+        ("ref type
%d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_obj_init returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj,
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_obj_insert_rel returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_obj_insert_rel(
&p_port->rel, &p_adapter->obj, &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+
           ("cl_obj_insert_rel
returned %#x\n", cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->ref[ref_init] );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                             
("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc(
&p_port->ref[ref_init] );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+        ("ref type
%d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
// The port is started as paused and NDIS calls latter to ipoib_restart. We<o:p></o:p></p>

<p class=MsoNormal>-             
// shut the recv_shuter for now and alive it on ipoib_restart. We did<o:p></o:p></p>

<p class=MsoNormal>-             
// it in this way since MpInitializeInternal also calls in reset and than<o:p></o:p></p>

<p class=MsoNormal>-             
// we need to set the rec ref count to 1 //TODO !!!!!!!!!!1<o:p></o:p></p>

<p class=MsoNormal>-             
//<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if ( p_adapter->ipoib_state == IPOIB_INIT) {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                             
("Shutter shut, state = %d\n", p_adapter->ipoib_state));<o:p></o:p></p>

<p class=MsoNormal>-                             
shutter_shut ( &p_adapter->recv_shutter );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                             
("*****Shutter wasn't shut, state = %d*****\n", p_adapter->ipoib_state));<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    // The port is started as paused and
NDIS calls latter to ipoib_restart. We<o:p></o:p></p>

<p class=MsoNormal>+    // shut the recv_shuter for now and
alive it on ipoib_restart. We did<o:p></o:p></p>

<p class=MsoNormal>+    // it in this way since
MpInitializeInternal also calls in reset and than<o:p></o:p></p>

<p class=MsoNormal>+    // we need to set the rec ref count to 1
//TODO !!!!!!!!!!1<o:p></o:p></p>

<p class=MsoNormal>+    //<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if ( p_adapter->ipoib_state ==
IPOIB_INIT) {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+        ("Shutter
shut, state = %d\n", p_adapter->ipoib_state));<o:p></o:p></p>

<p class=MsoNormal>+        shutter_shut (
&p_adapter->recv_shutter );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_WARNING, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+       
("*****Shutter wasn't shut, state = %d*****\n",
p_adapter->ipoib_state));<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_destroying(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_obj_t* const                                                
p_obj )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_obj_t*
const            
p_obj )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t      *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t    *p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_obj );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>

<p class=MsoNormal>+    p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_down( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_down( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__endpt_mgr_remove_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __endpt_mgr_remove_all( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
endpt_cm_buf_mgr_destroy(  p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_srq_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
endpt_cm_buf_mgr_destroy(  p_port );<o:p></o:p></p>

<p class=MsoNormal>+        ipoib_port_srq_destroy(
p_port );<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->endpt_mgr.thread_is_done = 1;<o:p></o:p></p>

<p class=MsoNormal>+        cl_event_signal(
&p_port->endpt_mgr.event );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_resume( p_port, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>+   
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_resume( p_port, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+   
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_cleanup(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_obj_t* const                                                
p_obj )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_obj_t*
const            
p_obj )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t      *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t    *p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_obj );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>

<p class=MsoNormal>+    p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all sends and receives to get flushed. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->send_mgr.depth || p_port->recv_mgr.depth )<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_thread_suspend( 0 );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all sends and receives to
get flushed. */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->send_mgr.depth ||
p_port->recv_mgr.depth )<o:p></o:p></p>

<p class=MsoNormal>+       
cl_thread_suspend( 0 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Destroy the send and receive managers before closing the CA. */<o:p></o:p></p>

<p class=MsoNormal>-             
__ib_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    /* Destroy the send and receive managers
before closing the CA. */<o:p></o:p></p>

<p class=MsoNormal>+    __ib_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __port_free(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_obj_t* const                                                
p_obj )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_obj_t*
const            
p_obj )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t      *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t    *p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_obj );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = PARENT_STRUCT( p_obj, ipoib_port_t, obj );<o:p></o:p></p>

<p class=MsoNormal>+    p_port = PARENT_STRUCT( p_obj,
ipoib_port_t, obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>

<p class=MsoNormal>-             
KeFlushQueuedDpcs();<o:p></o:p></p>

<p class=MsoNormal>-             
__endpt_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
__recv_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
__send_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
__buf_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>

<p class=MsoNormal>+    KeFlushQueuedDpcs();<o:p></o:p></p>

<p class=MsoNormal>+    __endpt_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __recv_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __send_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    __buf_mgr_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_destroy( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_destroy( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_destroy(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_destroy(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_deinit( p_obj );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_ca_attrs )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_free ( p_port->p_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_free( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_deinit( p_obj );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->p_ca_attrs )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_free (
p_port->p_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IoFreeWorkItem( p_port->pPoWorkItem
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_free( p_port );<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -942,338 +948,338 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &p_port->ib_mgr, sizeof(ipoib_ib_mgr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &p_port->ib_mgr,
sizeof(ipoib_ib_mgr_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_cq_create_t                
cq_create;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_qp_create_t                               
qp_create;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_phys_create_t           
phys_create;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_phys_range_t                            
phys_range;<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                                              
vaddr;<o:p></o:p></p>

<p class=MsoNormal>-             
net32_t                                                               
rkey;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_qp_attr_t                     
qp_attr;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_cq_create_t      cq_create;<o:p></o:p></p>

<p class=MsoNormal>+    ib_qp_create_t     
qp_create;<o:p></o:p></p>

<p class=MsoNormal>+    ib_phys_create_t   
phys_create;<o:p></o:p></p>

<p class=MsoNormal>+    ib_phys_range_t    
phys_range;<o:p></o:p></p>

<p class=MsoNormal>+   
uint64_t           
vaddr;<o:p></o:p></p>

<p class=MsoNormal>+   
net32_t            
rkey;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_qp_attr_t        qp_attr;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Open the CA. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->h_al, p_port->p_adapter->guids.ca_guid,<o:p></o:p></p>

<p class=MsoNormal>-                             
NULL, p_port, &p_port->ib_mgr.h_ca );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_open_ca returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Open the CA. */<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->open_ca(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->h_al, p_port->p_adapter->guids.ca_guid,<o:p></o:p></p>

<p class=MsoNormal>+        NULL, p_port,
&p_port->ib_mgr.h_ca );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_OPEN_CA, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_open_ca returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = __port_query_ca_attrs( p_port, &p_port->p_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Query CA attributes failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    status = __port_query_ca_attrs( p_port,
&p_port->p_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Query CA attributes failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
uint32_t payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu )<o:p></o:p></p>

<p class=MsoNormal>-                                             
- sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-                             
/* adjust ipoib UD payload MTU to actual port MTU size.             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->params.payload_mtu = <o:p></o:p></p>

<p class=MsoNormal>-                                                             
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></p>

<p class=MsoNormal>-                                             
(sizeof(eth_hdr_t) + p_port->p_adapter->params.payload_mtu);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        uint32_t
payload_mtu = __port_attr_to_mtu_size( <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_ca_attrs->p_port_attr[p_port->port_num - 1].mtu )<o:p></o:p></p>

<p class=MsoNormal>+           
- sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+        /* adjust ipoib
UD payload MTU to actual port MTU size. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->params.payload_mtu = <o:p></o:p></p>

<p class=MsoNormal>+               
max( DEFAULT_PAYLOAD_MTU, payload_mtu );<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->params.xfer_block_size = <o:p></o:p></p>

<p class=MsoNormal>+           
(sizeof(eth_hdr_t) + p_port->p_adapter->params.payload_mtu);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_USE_DMA<o:p></o:p></p>

<p class=MsoNormal>-             
/* init DMA only once while running MiniportInitialize */<o:p></o:p></p>

<p class=MsoNormal>-             
if ( !p_port->p_adapter->reset )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ULONG max_phys_mapping;<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
max_phys_mapping = p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( p_port->p_adapter->params.lso )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
               
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
max_phys_mapping = p_port->p_adapter->params.xfer_block_size;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/*if( NdisMInitializeScatterGatherDma( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                             
}*/<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* init DMA only once while running
MiniportInitialize */<o:p></o:p></p>

<p class=MsoNormal>+    if ( !p_port->p_adapter->reset )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ULONG
max_phys_mapping;<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
max_phys_mapping = p_port->p_adapter->params.cm_xfer_block_size;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if(
p_port->p_adapter->params.lso )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
max_phys_mapping = LARGE_SEND_OFFLOAD_SIZE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
max_phys_mapping = p_port->p_adapter->params.xfer_block_size;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /*if(
NdisMInitializeScatterGatherDma( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+                           
TRUE, max_phys_mapping )!= NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("NdisMInitializeScatterGatherDma failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>+           
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+        }*/<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the PD. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_ca, IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_alloc_pd returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the PD. */<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->alloc_pd(<o:p></o:p></p>

<p class=MsoNormal>+        p_port->ib_mgr.h_ca,
IB_PDT_UD, p_port, &p_port->ib_mgr.h_pd );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_ALLOC_PD, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_alloc_pd returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate receive CQ. */<o:p></o:p></p>

<p class=MsoNormal>-             
cq_create.size = p_port->p_adapter->params.rq_depth;<o:p></o:p></p>

<p class=MsoNormal>-             
cq_create.pfn_comp_cb = __recv_cb;<o:p></o:p></p>

<p class=MsoNormal>-             
cq_create.h_wait_obj = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate receive CQ. */<o:p></o:p></p>

<p class=MsoNormal>+    cq_create.size =
p_port->p_adapter->params.rq_depth;<o:p></o:p></p>

<p class=MsoNormal>+    cq_create.pfn_comp_cb = __recv_cb;<o:p></o:p></p>

<p class=MsoNormal>+    cq_create.h_wait_obj = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>

<p class=MsoNormal>-                             
__cq_event, &p_port->ib_mgr.h_recv_cq );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_create_cq returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>

<p class=MsoNormal>+        __cq_event,
&p_port->ib_mgr.h_recv_cq );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_CREATE_RECV_CQ, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_create_cq returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate send CQ. */<o:p></o:p></p>

<p class=MsoNormal>-             
cq_create.size = p_port->p_adapter->params.sq_depth;<o:p></o:p></p>

<p class=MsoNormal>-             
cq_create.pfn_comp_cb = __send_cb;<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate send CQ. */<o:p></o:p></p>

<p class=MsoNormal>+    cq_create.size =
p_port->p_adapter->params.sq_depth;<o:p></o:p></p>

<p class=MsoNormal>+    cq_create.pfn_comp_cb = __send_cb;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>

<p class=MsoNormal>-                             
__cq_event, &p_port->ib_mgr.h_send_cq );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_create_cq returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the QP. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &qp_create, sizeof(qp_create) );<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.qp_type = IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.rq_depth = p_port->p_adapter->params.rq_depth;<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.rq_sge = 2;   /* To support buffers spanning pages. */<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.h_rq_cq = p_port->ib_mgr.h_recv_cq;<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.sq_depth = p_port->p_adapter->params.sq_depth;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->create_cq(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_ca, &cq_create, p_port,<o:p></o:p></p>

<p class=MsoNormal>+        __cq_event,
&p_port->ib_mgr.h_send_cq );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_CREATE_SEND_CQ, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_create_cq returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the QP. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &qp_create,
sizeof(qp_create) );<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.qp_type =
IB_QPT_UNRELIABLE_DGRM;<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.rq_depth =
p_port->p_adapter->params.rq_depth;<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.rq_sge = 2;   /* To
support buffers spanning pages. */<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.h_rq_cq =
p_port->ib_mgr.h_recv_cq;<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.sq_depth =
p_port->p_adapter->params.sq_depth;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #define UD_QP_USED_SGE 3<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.sq_sge = MAX_SEND_SGE < p_port->p_ca_attrs->max_sges ? <o:p></o:p></p>

<p class=MsoNormal>-                                             
MAX_SEND_SGE  : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE );<o:p></o:p></p>

<p class=MsoNormal>-             
if ( !p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></p>

<p class=MsoNormal>-             
{ <o:p></o:p></p>

<p class=MsoNormal>-                             
/* checksum is not supported by device<o:p></o:p></p>

<p class=MsoNormal>-                             
user must specify BYPASS to explicitly cancel checksum calculation */<o:p></o:p></p>

<p class=MsoNormal>-                             
if (p_port->p_adapter->params.send_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>

<p class=MsoNormal>-                             
if (p_port->p_adapter->params.recv_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->params.recv_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.sq_sge = MAX_SEND_SGE <
p_port->p_ca_attrs->max_sges ? <o:p></o:p></p>

<p class=MsoNormal>+           
MAX_SEND_SGE  : ( p_port->p_ca_attrs->max_sges - UD_QP_USED_SGE );<o:p></o:p></p>

<p class=MsoNormal>+    if (
!p_port->p_ca_attrs->ipoib_csum ) <o:p></o:p></p>

<p class=MsoNormal>+    { <o:p></o:p></p>

<p class=MsoNormal>+        /* checksum is
not supported by device<o:p></o:p></p>

<p class=MsoNormal>+        user must
specify BYPASS to explicitly cancel checksum calculation */<o:p></o:p></p>

<p class=MsoNormal>+        if
(p_port->p_adapter->params.send_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>

<p class=MsoNormal>+        if
(p_port->p_adapter->params.recv_chksum_offload == CSUM_ENABLED)<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->params.recv_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
// Now, params struct contains the intersection between the user definition<o:p></o:p></p>

<p class=MsoNormal>-             
// and actual HW capabilites<o:p></o:p></p>

<p class=MsoNormal>-             
// Remember these values for NDIS OID requests<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_adapter->offload_cap.lso =
!!(p_port->p_adapter->params.lso);<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></p>

<p class=MsoNormal>-                             
!! (p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_adapter->offload_cap.recv_chksum_offload = <o:p></o:p></p>

<p class=MsoNormal>-                             
!! (p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;<o:p></o:p></p>

<p class=MsoNormal>-             
qp_create.sq_signaled = FALSE;<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></p>

<p class=MsoNormal>-                             
__qp_event, &p_port->ib_mgr.h_qp );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_create_qp returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* Query the QP so we can get our QPN. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_query_qp returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->ib_mgr.qpn = qp_attr.num;<o:p></o:p></p>

<p class=MsoNormal>+    // Now, params struct contains the
intersection between the user definition<o:p></o:p></p>

<p class=MsoNormal>+    // and actual HW capabilites<o:p></o:p></p>

<p class=MsoNormal>+    // Remember these values for NDIS OID
requests<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_adapter->offload_cap.lso
= !!(p_port->p_adapter->params.lso);<o:p></o:p></p>

<p class=MsoNormal>+   
p_port->p_adapter->offload_cap.send_chksum_offload = <o:p></o:p></p>

<p class=MsoNormal>+        !!
(p_port->p_adapter->params.send_chksum_offload);<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_adapter->offload_cap.recv_chksum_offload
= <o:p></o:p></p>

<p class=MsoNormal>+        !!
(p_port->p_adapter->params.recv_chksum_offload);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    qp_create.h_sq_cq =
p_port->ib_mgr.h_send_cq;<o:p></o:p></p>

<p class=MsoNormal>+    qp_create.sq_signaled = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->create_qp(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_pd, &qp_create, p_port,<o:p></o:p></p>

<p class=MsoNormal>+        __qp_event,
&p_port->ib_mgr.h_qp );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_CREATE_QP, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_create_qp returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* Query the QP so we can get our QPN.
*/<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->query_qp(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_qp, &qp_attr );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_QUERY_QP, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_query_qp returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_port->ib_mgr.qpn = qp_attr.num;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Register all of physical memory */<o:p></o:p></p>

<p class=MsoNormal>-             
phys_create.length = MEM_REG_SIZE;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_create.num_ranges = 1;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_create.range_array = &phys_range;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_create.buf_offset = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_create.hca_page_size = PAGE_SIZE;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_create.access_ctrl = IB_AC_LOCAL_WRITE;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_range.base_addr = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
phys_range.size = MEM_REG_SIZE;<o:p></o:p></p>

<p class=MsoNormal>-             
vaddr = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_reg_phys returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Register all of physical memory */<o:p></o:p></p>

<p class=MsoNormal>+    phys_create.length = MEM_REG_SIZE;<o:p></o:p></p>

<p class=MsoNormal>+    phys_create.num_ranges = 1;<o:p></o:p></p>

<p class=MsoNormal>+    phys_create.range_array =
&phys_range;<o:p></o:p></p>

<p class=MsoNormal>+    phys_create.buf_offset = 0;<o:p></o:p></p>

<p class=MsoNormal>+    phys_create.hca_page_size = PAGE_SIZE;<o:p></o:p></p>

<p class=MsoNormal>+    phys_create.access_ctrl =
IB_AC_LOCAL_WRITE;<o:p></o:p></p>

<p class=MsoNormal>+    phys_range.base_addr = 0;<o:p></o:p></p>

<p class=MsoNormal>+    phys_range.size = MEM_REG_SIZE;<o:p></o:p></p>

<p class=MsoNormal>+    vaddr = 0;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->reg_phys(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_pd, &phys_create, &vaddr,<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->ib_mgr.lkey, &rkey, &p_port->ib_mgr.h_mr );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_REG_PHYS, 1, status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_reg_phys returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = ipoib_port_srq_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_port_srq_init failed %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* disable further CM initialization */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    status = ipoib_port_srq_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_port_srq_init failed %s\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        /* disable
further CM initialization */<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> //CM<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
status = endpt_cm_buf_mgr_init( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_srq_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        status = endpt_cm_buf_mgr_init(
p_port );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("CM Init buf mgr failed status %#x\n", status ) );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_srq_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else <o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
if ( p_port->p_adapter->params.send_chksum_offload )<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else <o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+        
   if ( p_port->p_adapter->params.send_chksum_offload )<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->params.send_chksum_offload = CSUM_DISABLED;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __srq_async_event_cb(<o:p></o:p></p>

<p class=MsoNormal>-IN                                         
ib_async_event_rec_t                 
*p_event_rec )<o:p></o:p></p>

<p class=MsoNormal>+IN          ib_async_event_rec_t       
*p_event_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t* p_port = <o:p></o:p></p>

<p class=MsoNormal>-                             
(ipoib_port_t *)p_event_rec->context;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t* p_port = <o:p></o:p></p>

<p class=MsoNormal>+        (ipoib_port_t
*)p_event_rec->context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( p_event_rec->code )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
case IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
case IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    switch( p_event_rec->code )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    case IB_AE_SRQ_LIMIT_REACHED:<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_event_rec->code, "IB_AE_SRQ_LIMIT_REACHED" ) );<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+    case IB_AE_SRQ_CATAS_ERROR:<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>

<p class=MsoNormal>+               
p_event_rec->code, "IB_AE_SRQ_CATAS_ERROR" ) );<o:p></o:p></p>

<p class=MsoNormal>+           
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>

<p class=MsoNormal>+  
         p_port->p_adapter->hung
= TRUE;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+    case IB_AE_SRQ_QP_LAST_WQE_REACHED:<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("SRQ ASYNC EVENT CODE %d: %s\n", <o:p></o:p></p>

<p class=MsoNormal>+               
p_event_rec->code, "IB_AE_SRQ_QP_LAST_WQE_REACHED" ) );<o:p></o:p></p>

<p class=MsoNormal>+           
/*SRQ is in err state, must reinitialize */<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("ASYNC EVENT CODE ARRIVED %d(%#x)\n", <o:p></o:p></p>

<p class=MsoNormal>+               
p_event_rec->code, p_event_rec->code ) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_srq_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
ib_status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_srq_handle_t                             
h_srq;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_srq_attr_t                    
srq_attr;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
ib_status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_srq_handle_t    
h_srq;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_srq_attr_t       srq_attr;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if(
!p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
srq_attr.max_sge = min( 2, p_port->p_ca_attrs->max_srq_sges );<o:p></o:p></p>

<p class=MsoNormal>-             
srq_attr.srq_limit = 10;<o:p></o:p></p>

<p class=MsoNormal>-             
srq_attr.max_wr = <o:p></o:p></p>

<p class=MsoNormal>-                             
min( (uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></p>

<p class=MsoNormal>+    srq_attr.max_sge = min( 2,
p_port->p_ca_attrs->max_srq_sges );<o:p></o:p></p>

<p class=MsoNormal>+    srq_attr.srq_limit = 10;<o:p></o:p></p>

<p class=MsoNormal>+    srq_attr.max_wr = <o:p></o:p></p>

<p class=MsoNormal>+        min(
(uint32_t)p_port->p_adapter->params.rq_depth * 8,<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_ca_attrs->max_srq_wrs/2 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_status = p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
p_port->ib_mgr.h_pd, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
&srq_attr, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
p_port, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
__srq_async_event_cb, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
&h_srq );<o:p></o:p></p>

<p class=MsoNormal>-             
if( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_create_srq failed status %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return ib_status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->ib_mgr.h_srq = h_srq;<o:p></o:p></p>

<p class=MsoNormal>+    ib_status =
p_port->p_adapter->p_ifc->create_srq( <o:p></o:p></p>

<p class=MsoNormal>+                               
p_port->ib_mgr.h_pd, <o:p></o:p></p>

<p class=MsoNormal>+          
                     &srq_attr,
<o:p></o:p></p>

<p class=MsoNormal>+                               
p_port, <o:p></o:p></p>

<p class=MsoNormal>+                               
__srq_async_event_cb, <o:p></o:p></p>

<p class=MsoNormal>+                               
&h_srq );<o:p></o:p></p>

<p class=MsoNormal>+    if( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_CREATE_QP, 1, ib_status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_create_srq failed status %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return
ib_status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_port->ib_mgr.h_srq = h_srq;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
return ib_status;<o:p></o:p></p>

<p class=MsoNormal>+    return ib_status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /*  __port_query_ca_attrs() <o:p></o:p></p>

<p class=MsoNormal>@@ -1282,82 +1288,82 @@<o:p></o:p></p>

<p class=MsoNormal>  */<o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_query_ca_attrs( <o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ipoib_port_t* const                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ib_ca_attr_t**                                 
pp_ca_attrs )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ipoib_port_t* const     p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ib_ca_attr_t**         
pp_ca_attrs )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
ib_status;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                              
attr_size;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_ca_attr_t*                   
p_ca_attrs;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
ib_status;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t           
attr_size;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_ca_attr_t*       p_ca_attrs;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_ca_attrs = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    *pp_ca_attrs = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_status = <o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, NULL ,
&attr_size );<o:p></o:p></p>

<p class=MsoNormal>-             
if( ib_status != IB_INSUFFICIENT_MEMORY )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_query_ca failed status %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
goto done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( attr_size );<o:p></o:p></p>

<p class=MsoNormal>+    ib_status = <o:p></o:p></p>

<p class=MsoNormal>+        p_port->p_adapter->p_ifc->query_ca(
p_port->ib_mgr.h_ca, NULL , &attr_size );<o:p></o:p></p>

<p class=MsoNormal>+    if( ib_status != IB_INSUFFICIENT_MEMORY
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_query_ca failed status %s\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>

<p class=MsoNormal>+        goto done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( attr_size );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_ca_attrs = (ib_ca_attr_t *) cl_zalloc( attr_size );<o:p></o:p></p>

<p class=MsoNormal>-             
if ( p_ca_attrs == NULL )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></p>

<p class=MsoNormal>-                             
ib_status = IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-                             
goto done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_ca_attrs = (ib_ca_attr_t *) cl_zalloc(
attr_size );<o:p></o:p></p>

<p class=MsoNormal>+    if ( p_ca_attrs == NULL )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Allocate %d bytes failed for CA Attributes\n", attr_size ));<o:p></o:p></p>

<p class=MsoNormal>+        ib_status =
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+        goto done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_status = <o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs
, &attr_size );<o:p></o:p></p>

<p class=MsoNormal>-             
if ( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("CA attributes query failed\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_free ( p_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>-                             
goto done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    ib_status = <o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->p_ifc->query_ca( p_port->ib_mgr.h_ca, p_ca_attrs
, &attr_size );<o:p></o:p></p>

<p class=MsoNormal>+    if ( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("CA attributes query failed\n") );<o:p></o:p></p>

<p class=MsoNormal>+        cl_free (
p_ca_attrs );<o:p></o:p></p>

<p class=MsoNormal>+        goto done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_ca_attrs = p_ca_attrs;<o:p></o:p></p>

<p class=MsoNormal>+    *pp_ca_attrs = p_ca_attrs;<o:p></o:p></p>

<p class=MsoNormal> done:<o:p></o:p></p>

<p class=MsoNormal>-             
return ib_status;<o:p></o:p></p>

<p class=MsoNormal>+    return ib_status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_srq_destroy( <o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->ib_mgr.h_srq )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
status =<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL
);<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->ib_mgr.h_srq )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        status =<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->destroy_srq( p_port->ib_mgr.h_srq, NULL
);<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_srq = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+    IN 
            ipoib_port_t*
const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->ib_mgr.h_ca )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
status =<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->ib_mgr.h_ca )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        status =<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->close_ca( p_port->ib_mgr.h_ca, NULL );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_ca = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -1369,58 +1375,58 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+    IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_construct( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qpool_construct(
&p_port->buf_mgr.recv_pool );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->buf_mgr.h_packet_pool = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->buf_mgr.h_buffer_pool = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->buf_mgr.h_packet_pool = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->buf_mgr.h_buffer_pool = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
NdisInitializeNPagedLookasideList( &p_port->buf_mgr.send_buf_list,<o:p></o:p></p>

<p class=MsoNormal>-                             
NULL, NULL, 0, MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></p>

<p class=MsoNormal>+    NdisInitializeNPagedLookasideList(
&p_port->buf_mgr.send_buf_list,<o:p></o:p></p>

<p class=MsoNormal>+        NULL, NULL, 0,
MAX_LSO_PAYLOAD_MTU, 'bipi', 0 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->buf_mgr.h_send_pkt_pool = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->buf_mgr.h_send_pkt_pool =
NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN        
     ipoib_port_t*
const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status_t                         
cl_status;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_params_t               
*p_params;<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST_POOL_PARAMETERS pool_parameters;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    cl_status_t    
cl_status;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_params_t  *p_params;<o:p></o:p></p>

<p class=MsoNormal>+    NET_BUFFER_LIST_POOL_PARAMETERS
pool_parameters;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_params = &p_port->p_adapter->params;<o:p></o:p></p>

<p class=MsoNormal>+    p_params = &p_port->p_adapter->params;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the receive descriptor pool */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_qpool_init( &p_port->buf_mgr.recv_pool,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the receive descriptor pool
*/<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_qpool_init(
&p_port->buf_mgr.recv_pool,<o:p></o:p></p>

<p class=MsoNormal>+       
p_params->rq_depth * p_params->recv_pool_ratio,<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                             
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                             
0, 0, sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        0, 0,
sizeof(ipoib_recv_desc_t), __recv_ctor, NULL, p_port );<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        0, 0,
sizeof(ipoib_recv_desc_t), __recv_ctor, __recv_dtor, p_port );<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_RECV_POOL, 1, cl_status );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_qpool_init for recvs returned %#x\n",<o:p></o:p></p>

<p class=MsoNormal>+           
cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the NET BUFFER list pools for receive indication. */<o:p></o:p></p>

<p class=MsoNormal>-             
NdisZeroMemory(&pool_parameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the NET BUFFER list pools
for receive indication. */<o:p></o:p></p>

<p class=MsoNormal>+    NdisZeroMemory(&pool_parameters,
sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.Header.Type =
NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.Header.Revision =
NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.Header.Size =
sizeof(pool_parameters);<o:p></o:p></p>

<p class=MsoNormal>@@ -1428,288 +1434,288 @@<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.ContextSize = 0;<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.fAllocateNetBuffer
= TRUE;<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.PoolTag = 'CRPI';<o:p></o:p></p>

<p class=MsoNormal>-             
pool_parameters.DataSize = 0;<o:p></o:p></p>

<p class=MsoNormal>+    pool_parameters.DataSize = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>     p_port->buf_mgr.h_packet_pool =
NdisAllocateNetBufferListPool(<o:p></o:p></p>

<p class=MsoNormal>                
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>                
&pool_parameters); <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES  );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("NdisAllocatePacketPool returned %08X\n",
(UINT)NDIS_STATUS_RESOURCES) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the NET buffer list pool for send formatting. */<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_RECV_PKT_POOL, 1, NDIS_STATUS_RESOURCES  );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("NdisAllocatePacketPool returned %08X\n",
(UINT)NDIS_STATUS_RESOURCES) );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the NET buffer list pool for
send formatting. */<o:p></o:p></p>

<p class=MsoNormal>     pool_parameters.PoolTag = 'XTPI';<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>     p_port->buf_mgr.h_send_pkt_pool
= NdisAllocateNetBufferListPool(<o:p></o:p></p>

<p class=MsoNormal>                
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>                
&pool_parameters); <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_port->buf_mgr.h_send_pkt_pool)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_SEND_PKT_POOL, 1, NDIS_STATUS_RESOURCES );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("NdisAllocatePacketPool returned %08X\n", (UINT)NDIS_STATUS_RESOURCES)
);<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Destroy the send packet and buffer pools. <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->buf_mgr.h_send_buf_pool )<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->buf_mgr.h_send_pkt_pool )<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></p>

<p class=MsoNormal>+    /* Destroy the send packet and buffer
pools. <o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->buf_mgr.h_send_buf_pool )<o:p></o:p></p>

<p class=MsoNormal>+       
NdisFreeBufferPool( p_port->buf_mgr.h_send_buf_pool );*/<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->buf_mgr.h_send_pkt_pool )<o:p></o:p></p>

<p class=MsoNormal>+       
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_send_pkt_pool );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Destroy the receive packet and buffer pools. <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->buf_mgr.h_buffer_pool )<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeNetBufferListPool ( p_port->buf_mgr.h_packet_pool );<o:p></o:p></p>

<p class=MsoNormal>+    /* Destroy the receive packet and buffer
pools. <o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->buf_mgr.h_buffer_pool )<o:p></o:p></p>

<p class=MsoNormal>+       
NdisFreeBufferPool( p_port->buf_mgr.h_buffer_pool );*/<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->buf_mgr.h_packet_pool )<o:p></o:p></p>

<p class=MsoNormal>+        NdisFreeNetBufferListPool
( p_port->buf_mgr.h_packet_pool );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Free the receive and send descriptors. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_destroy( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>

<p class=MsoNormal>+    /* Free the receive and send
descriptors. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_qpool_destroy(
&p_port->buf_mgr.recv_pool );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Free the lookaside list of scratch buffers. */<o:p></o:p></p>

<p class=MsoNormal>-             
NdisDeleteNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>+    /* Free the lookaside list of scratch
buffers. */<o:p></o:p></p>

<p class=MsoNormal>+    NdisDeleteNPagedLookasideList(
&p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT(  IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT(  IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static cl_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_ctor(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void* const                                                                        
p_object,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void*                                                                                    
context,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_pool_item_t**
const                               
pp_pool_item )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void*
const             
   p_object,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void*                      
context,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         cl_pool_item_t**
const      pp_pool_item )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t         
*p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_recv_desc_t   *p_desc;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                              
ds0_len;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t           
ds0_len;<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_object );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( context );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_object );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( context );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc = (ipoib_recv_desc_t*)p_object;<o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)context;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc = (ipoib_recv_desc_t*)p_object;<o:p></o:p></p>

<p class=MsoNormal>+    p_port = (ipoib_port_t*)context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Setup the work request. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->wr.ds_array = p_desc->local_ds;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->wr.wr_id = (uintn_t)p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    /* Setup the work request. */<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->wr.ds_array = p_desc->local_ds;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->wr.wr_id = (uintn_t)p_desc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-             
/* Sanity check on the receive buffer layout */<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( (void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></p>

<p class=MsoNormal>-                             
(void*)&p_desc->buf.ib.pkt.type );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( sizeof(recv_buf_t) == sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );<o:p></o:p></p>

<p class=MsoNormal>+    /* Sanity check on the receive buffer
layout */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(
(void*)&p_desc->buf.eth.pkt.type ==<o:p></o:p></p>

<p class=MsoNormal>+
       (void*)&p_desc->buf.ib.pkt.type
);<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( sizeof(recv_buf_t) ==
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Setup the local data segment. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_desc->buf );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
ds0_len =<o:p></o:p></p>

<p class=MsoNormal>-                             
PAGE_SIZE - ((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));<o:p></o:p></p>

<p class=MsoNormal>-             
if( ds0_len >= sizeof(recv_buf_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* The whole buffer is within a page. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->wr.num_ds = 1;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* The buffer crosses page boundaries. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->local_ds[1].vaddr = cl_get_physaddr( <o:p></o:p></p>

<p class=MsoNormal>-                                             
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->wr.num_ds = 2;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the receive buffer. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->p_buf = (recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_desc->p_buf )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to allocate receive buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return CL_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Setup the local data segment. */<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->local_ds[0].vaddr =
cl_get_physaddr( &p_desc->buf );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->local_ds[0].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+    ds0_len =<o:p></o:p></p>

<p class=MsoNormal>+        PAGE_SIZE -
((uint32_t)p_desc->local_ds[0].vaddr & (PAGE_SIZE - 1));<o:p></o:p></p>

<p class=MsoNormal>+    if( ds0_len >= sizeof(recv_buf_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* The whole
buffer is within a page. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->wr.num_ds = 1;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* The buffer
crosses page boundaries. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->local_ds[0].length = ds0_len;<o:p></o:p></p>

<p class=MsoNormal>+        p_desc->local_ds[1].vaddr
= cl_get_physaddr( <o:p></o:p></p>

<p class=MsoNormal>+           
((uint8_t*)&p_desc->buf) + ds0_len );<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->local_ds[1].length = sizeof(recv_buf_t) - ds0_len;<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->wr.num_ds = 2;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the receive buffer. */<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->p_buf =
(recv_buf_t*)cl_zalloc( sizeof(recv_buf_t) );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_desc->p_buf )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to allocate receive buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
CL_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Sanity check on the receive buffer layout */<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( (void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></p>

<p class=MsoNormal>-                             
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></p>

<p class=MsoNormal>+    /* Sanity check on the receive buffer
layout */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(
(void*)&p_desc->p_buf->eth.pkt.type ==<o:p></o:p></p>

<p class=MsoNormal>+       
(void*)&p_desc->p_buf->ib.pkt.type );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Setup the local data segment. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->local_ds[0].vaddr = cl_get_physaddr( p_desc->p_buf );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->local_ds[0].length = sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->wr.num_ds = 1;<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+    /* Setup the local data segment. */<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->local_ds[0].vaddr =
cl_get_physaddr( p_desc->p_buf );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->local_ds[0].length =
sizeof(ipoib_pkt_t) + sizeof(ib_grh_t);<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->local_ds[0].lkey =
p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->wr.num_ds = 1;<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_pool_item = &p_desc->item;<o:p></o:p></p>

<p class=MsoNormal>+    *pp_pool_item = &p_desc->item;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal>-             
return CL_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal>+    return CL_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if !IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_dtor(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     cl_pool_item_t*
const                 
p_pool_item,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*context )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   cl_pool_item_t* const      
p_pool_item,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*context )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t         
*p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_recv_desc_t   *p_desc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER(  IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER(  IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( context );<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM( context );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc = PARENT_STRUCT( p_pool_item, ipoib_recv_desc_t, item );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc = PARENT_STRUCT( p_pool_item,
ipoib_recv_desc_t, item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_desc->p_buf )<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_free( p_desc->p_buf );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_desc->p_buf )<o:p></o:p></p>

<p class=MsoNormal>+        cl_free(
p_desc->p_buf );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ALLOC );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ipoib_recv_desc_t*<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_get_recv(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t         
*p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc = (ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Reference the port object for the send. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_desc )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_ref( p_port, ref_get_recv );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_recv_desc_t   *p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc =
(ipoib_recv_desc_t*)cl_qpool_get( &p_port->buf_mgr.recv_pool );<o:p></o:p></p>

<p class=MsoNormal>+    /* Reference the port object for the send.
*/<o:p></o:p></p>

<p class=MsoNormal>+    if( p_desc )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ipoib_port_ref(
p_port, ref_get_recv );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_desc->wr.wr_id == (uintn_t)p_desc );<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_desc->local_ds[0].vaddr ==<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_desc->local_ds[0].length ==<o:p></o:p></p>

<p class=MsoNormal>-                                             
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return p_desc;<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_desc->local_ds[0].vaddr ==<o:p></o:p></p>

<p class=MsoNormal>+           
cl_get_physaddr( &p_desc->buf ) );<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_desc->local_ds[0].vaddr ==<o:p></o:p></p>

<p class=MsoNormal>+           
cl_get_physaddr( p_desc->p_buf ) );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_desc->local_ds[0].length ==<o:p></o:p></p>

<p class=MsoNormal>+           
(sizeof(ipoib_pkt_t) + sizeof(ib_grh_t)) );<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_desc->local_ds[0].lkey == p_port->ib_mgr.lkey );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return p_desc;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> //NDIS60<o:p></o:p></p>

<p class=MsoNormal> static inline void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_put_recv(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t* const           
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NET_BUFFER_LIST*
const                           
p_net_buffer_list OPTIONAL )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></p>

<p class=MsoNormal>+
   IN             
NET_BUFFER_LIST* const      p_net_buffer_list OPTIONAL
)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER                     
*p_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
MDL                                                      
*p_mdl = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER(IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    NET_BUFFER     
*p_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    MDL            
*p_mdl = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_buf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_mdl = NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeMdl(p_mdl);<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        p_buf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT( p_buf
);<o:p></o:p></p>

<p class=MsoNormal>+        p_mdl =
NET_BUFFER_FIRST_MDL(p_buf);<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT( p_mdl
);<o:p></o:p></p>

<p class=MsoNormal>+       
NdisFreeMdl(p_mdl);<o:p></o:p></p>

<p class=MsoNormal>+       
NdisFreeNetBufferList(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Return the descriptor to its pools. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_put( &p_port->buf_mgr.recv_pool, &p_desc->item );<o:p></o:p></p>

<p class=MsoNormal>+    /* Return the descriptor to its pools.
*/<o:p></o:p></p>

<p class=MsoNormal>+    cl_qpool_put(
&p_port->buf_mgr.recv_pool, &p_desc->item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Dereference the port object since the receive is no longer outstanding.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_get_recv );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Dereference the port object
since the receive is no longer outstanding.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port, ref_get_recv
);<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline void<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_put_recv_list(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
cl_qlist_t* const                                              
p_list )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
cl_qlist_t* const           p_list
)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
//IPOIB_ENTER(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_put_list( &p_port->buf_mgr.recv_pool, p_list );<o:p></o:p></p>

<p class=MsoNormal>-             
//IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    //IPOIB_ENTER(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qpool_put_list( &p_port->buf_mgr.recv_pool,
p_list );<o:p></o:p></p>

<p class=MsoNormal>+    //IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NET_BUFFER_LIST*<o:p></o:p></p>

<p class=MsoNormal> __buf_mgr_get_NBL(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t* const           
p_desc )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST                                          
*p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>-             
MDL                                                                                      
*p_mdl;<o:p></o:p></p>

<p class=MsoNormal>+   
NET_BUFFER_LIST        
*p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>+    MDL                    
*p_mdl;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_mdl = NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
&p_desc->buf.eth.pkt,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
p_desc->len );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to allocate MDL\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_mdl =
NdisAllocateMdl(p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+          
                 &p_desc->buf.eth.pkt,<o:p></o:p></p>

<p class=MsoNormal>+                           
p_desc->len );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to allocate MDL\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_net_buffer_list = NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_port->buf_mgr.h_packet_pool,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
0,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
0,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
0,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
0);<o:p></o:p></p>

<p class=MsoNormal>+    p_net_buffer_list =
NdisAllocateNetBufferAndNetBufferList(<o:p></o:p></p>

<p class=MsoNormal>+                       
p_port->buf_mgr.h_packet_pool,<o:p></o:p></p>

<p class=MsoNormal>+                       
0,<o:p></o:p></p>

<p class=MsoNormal>+                       
0,<o:p></o:p></p>

<p class=MsoNormal>+                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+                       
0,<o:p></o:p></p>

<p class=MsoNormal>+                       
0);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeMdl(p_mdl);<o:p></o:p></p>

<p class=MsoNormal>-                             
return NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to allocate NET_BUFFER_LIST\n") );<o:p></o:p></p>

<p class=MsoNormal>+      
 NdisFreeMdl(p_mdl);<o:p></o:p></p>

<p class=MsoNormal>+        return NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PORT_FROM_NBL( p_net_buffer_list ) = p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_RECV_FROM_NBL( p_net_buffer_list ) = p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
p_net_buffer_list->SourceHandle = p_port->p_adapter->h_adapter;<o:p></o:p></p>

<p class=MsoNormal>+   
NET_BUFFER_LIST_NEXT_NBL(p_net_buffer_list) = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PORT_FROM_NBL( p_net_buffer_list )
= p_port;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_RECV_FROM_NBL( p_net_buffer_list )
= p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    p_net_buffer_list->SourceHandle =
p_port->p_adapter->h_adapter;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT(  IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -1720,54 +1726,54 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &p_port->recv_mgr.done_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init(
&p_port->recv_mgr.done_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->recv_mgr.recv_NBL_array = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->recv_mgr.recv_NBL_array =
NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the NDIS_PACKET pointer array for indicating receives. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->recv_mgr.recv_NBL_array = (NET_BUFFER_LIST **)cl_malloc(<o:p></o:p></p>

<p class=MsoNormal>-                             
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_port->recv_mgr.recv_NBL_array )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the NDIS_PACKET pointer
array for indicating receives. */<o:p></o:p></p>

<p class=MsoNormal>+    p_port->recv_mgr.recv_NBL_array =
(NET_BUFFER_LIST **)cl_malloc(<o:p></o:p></p>

<p class=MsoNormal>+       
sizeof(NET_BUFFER_LIST*) * p_port->p_adapter->params.rq_depth );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_port->recv_mgr.recv_NBL_array
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+          
 EVENT_IPOIB_RECV_PKT_ARRAY, 0 );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_malloc for PNDIS_PACKET array failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( cl_is_qlist_empty( &p_port->recv_mgr.done_list ) );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( !p_port->recv_mgr.depth );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( cl_is_qlist_empty(
&p_port->recv_mgr.done_list ) );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( !p_port->recv_mgr.depth );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->recv_mgr.recv_NBL_array )<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_free( p_port->recv_mgr.recv_NBL_array );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->recv_mgr.recv_NBL_array )<o:p></o:p></p>

<p class=MsoNormal>+        cl_free(
p_port->recv_mgr.recv_NBL_array );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -1779,1449 +1785,1490 @@<o:p></o:p></p>

<p class=MsoNormal>  */<o:p></o:p></p>

<p class=MsoNormal> int32_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_repost(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t          *p_head
= NULL, *p_tail = NULL, *p_next;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_recv_wr_t                    
*p_failed;<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PostRecv );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_recv_desc_t   *p_head =
NULL, *p_tail = NULL, *p_next;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_recv_wr_t        *p_failed;<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PostRecv );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Port in invalid state.  Not reposting.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return 0;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_repost );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+           
("Port in invalid state.  Not reposting.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return 0;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_repost );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth
)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Pull receives out of the pool and chain them up. */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( GetRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_next = __buf_mgr_get_recv( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, GetRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_next )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Out of receive descriptors! recv queue depth
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->recv_mgr.depth <
p_port->p_adapter->params.rq_depth )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Pull receives
out of the pool and chain them up. */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
GetRecv );<o:p></o:p></p>

<p class=MsoNormal>+        p_next =
__buf_mgr_get_recv( p_port );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, GetRecv );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_next )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+               
("Out of receive descriptors! recv queue depth
0x%x\n",p_port->recv_mgr.depth) );<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_tail )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_tail = p_next;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_next->wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_next->wr.p_next = &p_head->wr;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_tail )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_tail = p_next;<o:p></o:p></p>

<p class=MsoNormal>+           
p_next->wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_next->wr.p_next = &p_head->wr;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_head = p_next;<o:p></o:p></p>

<p class=MsoNormal>+        p_head = p_next;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->recv_mgr.depth++;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->recv_mgr.depth++;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_head )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( PostRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, PostRecv );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_head )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
PostRecv );<o:p></o:p></p>

<p class=MsoNormal>+        status =
p_port->p_adapter->p_ifc->post_recv(<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->ib_mgr.h_qp, &p_head->wr, &p_failed );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, PostRecv );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("ip_post_recv returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* return the descriptors to the pool */<o:p></o:p></p>

<p class=MsoNormal>-                                             
while( p_failed )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_failed = p_failed->p_next;<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("ip_post_recv returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+           
/* return the descriptors to the pool */<o:p></o:p></p>

<p class=MsoNormal>+           
while( p_failed )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
p_head = PARENT_STRUCT( p_failed, ipoib_recv_desc_t, wr );<o:p></o:p></p>

<p class=MsoNormal>+               
p_failed = p_failed->p_next;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                                             
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->recv_mgr.depth--;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+               
__buf_mgr_put_recv( p_port, p_head, NULL );<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->recv_mgr.depth--;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_repost );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port, ref_repost );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return
p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> inline ULONG __free_received_NBL (<o:p></o:p></p>

<p class=MsoNormal>-             
IN ipoib_port_t                
*p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN NET_BUFFER_LIST     *p_net_buffer_lists<o:p></o:p></p>

<p class=MsoNormal>-             
) <o:p></o:p></p>

<p class=MsoNormal>+    IN ipoib_port_t    
*p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN NET_BUFFER_LIST 
*p_net_buffer_lists<o:p></o:p></p>

<p class=MsoNormal>+    ) <o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t         
*p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST                          
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>-             
LONG                                                   
NBL_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_recv_desc_t   *p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    NET_BUFFER_LIST    
*cur_net_buffer_list, *next_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>+ 
  LONG               
NBL_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
for (cur_net_buffer_list = p_net_buffer_lists;<o:p></o:p></p>

<p class=MsoNormal>-                             
cur_net_buffer_list != NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
++NBL_cnt;<o:p></o:p></p>

<p class=MsoNormal>-                             
next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    for (cur_net_buffer_list =
p_net_buffer_lists;<o:p></o:p></p>

<p class=MsoNormal>+        
cur_net_buffer_list != NULL;<o:p></o:p></p>

<p class=MsoNormal>+        
cur_net_buffer_list = next_net_buffer_list)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ++NBL_cnt;<o:p></o:p></p>

<p class=MsoNormal>+       
next_net_buffer_list = NET_BUFFER_LIST_NEXT_NBL(cur_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/* Get the port and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT(p_port == IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc = IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>+        /* Get the port
and descriptor from the NET_BUFFER_LIST. */<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(p_port
== IPOIB_PORT_FROM_NBL( cur_net_buffer_list ));<o:p></o:p></p>

<p class=MsoNormal>+        p_desc =
IPOIB_RECV_FROM_NBL( cur_net_buffer_list );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal> #if 0 //TODO CM flow<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
int32_t
                                
discarded;<o:p></o:p></p>

<p class=MsoNormal>-                                             
uint32_t                                              
NBL_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
ib_api_status_t
              
status = IB_NOT_DONE;<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_desc->type == PKT_TYPE_CM_UCAST )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
int32_t            
discarded;<o:p></o:p></p>

<p class=MsoNormal>+   
        uint32_t           
NBL_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
ib_api_status_t     status = IB_NOT_DONE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
NDIS_BUFFER                   
*p_buf;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+           
NDIS_BUFFER     *p_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Unchain the NDIS buffer. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( p_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisFreeBuffer( p_buf );<o:p></o:p></p>

<p class=MsoNormal>+           
/* Unchain the NDIS buffer. */<o:p></o:p></p>

<p class=MsoNormal>+           
NdisUnchainBufferAtFront( p_packet, &p_buf );<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( p_buf );<o:p></o:p></p>

<p class=MsoNormal>+           
/* Return the NDIS packet and NDIS buffer to their pools. */<o:p></o:p></p>

<p class=MsoNormal>+           
NdisDprFreePacketNonInterlocked( p_packet );<o:p></o:p></p>

<p class=MsoNormal>+           
NdisFreeBuffer( p_buf );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t
*)p_desc );<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = endpt_cm_post_recv( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if(  status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Post Recv QP failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, (ipoib_cm_desc_t
*)p_desc );<o:p></o:p></p>

<p class=MsoNormal>+           
status = endpt_cm_post_recv( p_port );<o:p></o:p></p>

<p class=MsoNormal>+           
if(  status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Post Recv QP failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+          
 return;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( ReturnPutRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
__buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, ReturnPutRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
return NBL_cnt;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
ReturnPutRecv );<o:p></o:p></p>

<p class=MsoNormal>+    
   __buf_mgr_put_recv( p_port, p_desc, cur_net_buffer_list );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, ReturnPutRecv );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    return NBL_cnt;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_return_net_buffer_list(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NDIS_HANDLE                                                                  
adapter_context,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NET_BUFFER_LIST                                                          
*p_net_buffer_lists,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ULONG                                                                                
return_flags)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
NDIS_HANDLE                
adapter_context,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
NET_BUFFER_LIST            
*p_net_buffer_lists,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ULONG                      
return_flags)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
int32_t                                                 
shortage;<o:p></o:p></p>

<p class=MsoNormal>-             
LONG                                                   
NBL_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ReturnPacket );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ReturnPutRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ReturnRepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ReturnPreparePkt );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ReturnNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t       
*p_port;<o:p></o:p></p>

<p class=MsoNormal>+   
int32_t            
shortage;<o:p></o:p></p>

<p class=MsoNormal>+   
LONG               
NBL_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ReturnPacket );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ReturnPutRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ReturnRepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ReturnPreparePkt );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ReturnNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( return_flags );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
p_port = ((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_net_buffer_lists );<o:p></o:p></p>

<p class=MsoNormal>-             
if ( !p_port ) {<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(p_port);<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("return_NBL callback called when port pointer was already
cleared\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM( return_flags );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    p_port =
((ipoib_adapter_t*)adapter_context)->p_port;<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_net_buffer_lists );<o:p></o:p></p>

<p class=MsoNormal>+    if ( !p_port ) {<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(p_port);<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+      
     ("return_NBL callback called when port
pointer was already cleared\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( ReturnPacket );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
NBL_cnt = __free_received_NBL( p_port, p_net_buffer_lists );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( ReturnPacket );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    NBL_cnt = __free_received_NBL( p_port,
p_net_buffer_lists );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
shutter_sub( &p_port->p_adapter->recv_shutter, -NBL_cnt );<o:p></o:p></p>

<p class=MsoNormal>+    shutter_sub(
&p_port->p_adapter->recv_shutter, -NBL_cnt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Repost buffers to HW */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( ReturnRepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
shortage = __recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, ReturnRepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></p>

<p class=MsoNormal>+    /* Repost buffers to HW */<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( ReturnRepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+    shortage = __recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, ReturnRepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release( &p_port->recv_lock
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, ReturnPacket );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void
* s_arg1 , void * s_arg2)<o:p></o:p></p>

<p class=MsoNormal>-{<o:p></o:p></p>

<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>

<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
uint32_t                    
*p_recv_cnt<o:p></o:p></p>

<p class=MsoNormal>+    );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></p>

<p class=MsoNormal>+static void<o:p></o:p></p>

<p class=MsoNormal>+__iopoib_WorkItem(<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
DEVICE_OBJECT*             
p_dev_obj,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void*                      
context )<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t *p_port = ( ipoib_port_t* )
context;<o:p></o:p></p>

<p class=MsoNormal>+    int WorkToDo = true;<o:p></o:p></p>

<p class=MsoNormal>+    KIRQL irql;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t recv_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t total_recv_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__recv_cb(NULL, p_port);<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(p_dev_obj);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    while (WorkToDo &&
total_recv_cnt < 512) {<o:p></o:p></p>

<p class=MsoNormal>+        irql =
KeRaiseIrqlToDpcLevel();<o:p></o:p></p>

<p class=MsoNormal>+        WorkToDo =
__recv_cb_internal(NULL, p_port, &recv_cnt);<o:p></o:p></p>

<p class=MsoNormal>+       
KeLowerIrql(irql);<o:p></o:p></p>

<p class=MsoNormal>+        total_recv_cnt
+= recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>+    if (WorkToDo) {<o:p></o:p></p>

<p class=MsoNormal>+        IoQueueWorkItem(
p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue, p_port);<o:p></o:p></p>

<p class=MsoNormal>+   
}        <o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-static void<o:p></o:p></p>

<p class=MsoNormal>-__recv_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
ib_cq_handle_t                                                               
h_cq,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*cq_context )<o:p></o:p></p>

<p class=MsoNormal>+static BOOLEAN<o:p></o:p></p>

<p class=MsoNormal>+__recv_cb_internal(<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
uint32_t*                   
p_recv_cnt)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_wc_t                                                               
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_wc_t            
wc[MAX_RECV_WC], *p_free, *p_wc;<o:p></o:p></p>

<p class=MsoNormal>               
int32_t                                                 
NBL_cnt, recv_cnt = 0, shortage, discarded;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_t                                             
done_list, bad_list;<o:p></o:p></p>

<p class=MsoNormal>-             
size_t                                                   
i;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                
recv_complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
BOOLEAN                                                           
res;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_qlist_t          done_list,
bad_list;<o:p></o:p></p>

<p class=MsoNormal>+   
size_t             
i;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG              
recv_complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>+    BOOLEAN            
res;<o:p></o:p></p>

<p class=MsoNormal>+    BOOLEAN WorkToDo =  FALSE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvCompBundle );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvCb );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PollRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( FilterRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( BuildNBLArray );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RearmRecv );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PutRecvList );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvCompBundle );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvCb );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PollRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( FilterRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( BuildNBLArray );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RearmRecv );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PutRecvList );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_clr( RecvCompBundle );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_clr( RecvCompBundle );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( RecvCb );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( RecvCb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( h_cq );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags,
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_SET_SEND_COMPLETE_FLAG(recv_complete_flags,
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL );<o:p></o:p></p>

<p class=MsoNormal>+    p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &done_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &bad_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &done_list );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &bad_list );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_recv_cb );<o:p></o:p></p>

<p class=MsoNormal>+    for( i = 0; i < MAX_RECV_WC; i++ )<o:p></o:p></p>

<p class=MsoNormal>+        wc[i].p_next =
&wc[i + 1];<o:p></o:p></p>

<p class=MsoNormal>+    wc[MAX_RECV_WC - 1].p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_recv_cb );<o:p></o:p></p>

<p class=MsoNormal>-             
for( i = 0; i < MAX_RECV_WC; i++ )<o:p></o:p></p>

<p class=MsoNormal>-                             
wc[i].p_next = &wc[i + 1];<o:p></o:p></p>

<p class=MsoNormal>-             
wc[MAX_RECV_WC - 1].p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * We'll be accessing the endpoint
map so take a reference<o:p></o:p></p>

<p class=MsoNormal>+     * on it to prevent modifications.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* We'll be accessing the endpoint map so take a reference<o:p></o:p></p>

<p class=MsoNormal>-             
* on it to prevent modifications.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    do<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* If we get
here, then the list of WCs is intact. */<o:p></o:p></p>

<p class=MsoNormal>+        p_free = wc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
do<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* If we get here, then the list of WCs is intact. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_free = wc;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
PollRecv );<o:p></o:p></p>

<p class=MsoNormal>+        status =
p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, PollRecv );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( PollRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = p_port->p_adapter->p_ifc->poll_cq(<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->ib_mgr.h_recv_cq, &p_free, &p_wc );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, PollRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>

<p class=MsoNormal>+        /* Look at the
payload now and filter ARP and DHCP packets. */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
FilterRecv );<o:p></o:p></p>

<p class=MsoNormal>+        recv_cnt +=
__recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, FilterRecv );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/* Look at the payload now and filter ARP and DHCP packets. */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( FilterRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );<o:p></o:p></p>

<p class=MsoNormal>+    } while( ( !p_free ) && (
recv_cnt < 128 )); //TODO restore back to 128<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
} while( ( !p_free ) && ( recv_cnt < 16 )); //TODO restore back to
128<o:p></o:p></p>

<p class=MsoNormal>+    *p_recv_cnt = (uint32_t)recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* We're done looking at the endpoint
map, release the reference. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* We're done looking at the endpoint map, release the reference. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_log(
&p_port->p_adapter->perf, RecvCompBundle, recv_cnt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_log( &p_port->p_adapter->perf, RecvCompBundle, recv_cnt );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    /* Update our posted depth. */<o:p></o:p></p>

<p class=MsoNormal>+    p_port->recv_mgr.depth -= recv_cnt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Update our posted depth. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->recv_mgr.depth -= recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    /* Return any discarded receives to the
pool */<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( PutRecvList );<o:p></o:p></p>

<p class=MsoNormal>+    __buf_mgr_put_recv_list( p_port,
&bad_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, PutRecvList );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Return any discarded receives to the pool */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( PutRecvList );<o:p></o:p></p>

<p class=MsoNormal>-             
__buf_mgr_put_recv_list( p_port, &bad_list );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, PutRecvList );<o:p></o:p></p>

<p class=MsoNormal>+    do<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        //int32_t cnt;<o:p></o:p></p>

<p class=MsoNormal>+        /* Repost ASAP
so we don't starve the RQ. */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+        shortage =
__recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if( shortage
> 0 )<o:p></o:p></p>

<p class=MsoNormal>+       
{              
<o:p></o:p></p>

<p class=MsoNormal>+           
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+           
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
do<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
//int32_t cnt;<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Repost ASAP so we don't starve the RQ. */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
shortage = __recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if( shortage > 0 )<o:p></o:p></p>

<p class=MsoNormal>-                             
{                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
recv_complete_flags |= NDIS_RECEIVE_FLAGS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_dbg_out("Got SHORTAGE=%d\n",shortage);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
BuildNBLArray );<o:p></o:p></p>

<p class=MsoNormal>+        /* Notify NDIS
of any and all possible receive buffers. */<o:p></o:p></p>

<p class=MsoNormal>+        NBL_cnt =
__recv_mgr_build_NBL_array(<o:p></o:p></p>

<p class=MsoNormal>+           
p_port, &done_list, &discarded);<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, BuildNBLArray );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( BuildNBLArray );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Notify NDIS of any and all possible receive buffers. */<o:p></o:p></p>

<p class=MsoNormal>-                             
NBL_cnt = __recv_mgr_build_NBL_array(<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port, &done_list, &discarded);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, BuildNBLArray );<o:p></o:p></p>

<p class=MsoNormal>+        /* Only indicate
receives if we actually had any. */<o:p></o:p></p>

<p class=MsoNormal>+        if( discarded
&& shortage > 0 )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* We may have thrown away packets, and have a shortage */<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+           
__recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/* Only indicate receives if we actually had any. */<o:p></o:p></p>

<p class=MsoNormal>-                             
if( discarded && shortage > 0 )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* We may have thrown away packets, and have a shortage */<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-                                             
__recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &p_port->p_adapter->perf, RepostRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if( !NBL_cnt ) {<o:p></o:p></p>

<p class=MsoNormal>+           
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( !NBL_cnt ) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
//cl_dbg_out("NBL cnt == 0 :-(\n");<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+       
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
RecvNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if (shortage
<= 0) {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( RecvNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if (shortage <= 0) {<o:p></o:p></p>

<p class=MsoNormal>+           
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt );<o:p></o:p></p>

<p class=MsoNormal>+           
if (res) {<o:p></o:p></p>

<p class=MsoNormal>+               
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>

<p class=MsoNormal>+                   
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>

<p class=MsoNormal>+                   
NBL_cnt,<o:p></o:p></p>

<p class=MsoNormal>+                   
recv_complete_flags);<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else {<o:p></o:p></p>

<p class=MsoNormal>+               
__free_received_NBL (p_port, p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+        } else {<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+           
// If shortage >0, we already set the status to NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></p>

<p class=MsoNormal>+           
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures
immediately<o:p></o:p></p>

<p class=MsoNormal>+           
res = shutter_add( &p_port->p_adapter->recv_shutter, 1 );<o:p></o:p></p>

<p class=MsoNormal>+           
if (res) {<o:p></o:p></p>

<p class=MsoNormal>+               
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>

<p class=MsoNormal>+                   
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>

<p class=MsoNormal>+                   
NBL_cnt,<o:p></o:p></p>

<p class=MsoNormal>+                   
recv_complete_flags);<o:p></o:p></p>

<p class=MsoNormal>+               
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
res = shutter_add( &p_port->p_adapter->recv_shutter, NBL_cnt );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if (res) {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NBL_cnt,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
recv_complete_flags);<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
__free_received_NBL (p_port, p_port->recv_mgr.recv_NBL_array[0]);<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
// If shortage >0, we already set the status to NDIS_RECEIVE_FLAGS_RESOURCES<o:p></o:p></p>

<p class=MsoNormal>-                                             
// That is, IPoIB driver regain ownership of the NET_BUFFER_LIST structures
immediately<o:p></o:p></p>

<p class=MsoNormal>-                                             
res = shutter_add( &p_port->p_adapter->recv_shutter, 1 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if (res) {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
NdisMIndicateReceiveNetBufferLists(<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->recv_mgr.recv_NBL_array[0],<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NDIS_DEFAULT_PORT_NUMBER,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NBL_cnt,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
recv_complete_flags);<o:p></o:p></p>

<p class=MsoNormal>-                                                             
shutter_sub( &p_port->p_adapter->recv_shutter, -1 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, RecvNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, RecvNdisIndicate );<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Cap the
number of receives to put back to what we just indicated<o:p></o:p></p>

<p class=MsoNormal>+         * with
NDIS_STATUS_RESOURCES.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        if( shortage
> 0 )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Cap the number of receives to put back to what we just indicated<o:p></o:p></p>

<p class=MsoNormal>-                             
* with NDIS_STATUS_RESOURCES.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
if( shortage > 0 )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>+           
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></p>

<p class=MsoNormal>+           
/* Return all but the last packet to the pool. */<o:p></o:p></p>

<p class=MsoNormal>+           
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+           
//while( shortage-- > 1 )<o:p></o:p></p>

<p class=MsoNormal>+           
while ( NBL_cnt-- > 0)<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
__buf_mgr_put_recv( p_port,<o:p></o:p></p>

<p class=MsoNormal>+                   
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL(
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
__recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_dbg_out("GOT SHORTAGE <===============\n");<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Return all but the last packet to the pool. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-                                             
//while( shortage-- > 1 )<o:p></o:p></p>

<p class=MsoNormal>-                                             
while ( NBL_cnt-- > 0)<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
__buf_mgr_put_recv( p_port,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
(ipoib_recv_desc_t *)IPOIB_RECV_FROM_NBL(
p_port->recv_mgr.recv_NBL_array[NBL_cnt] ),<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->recv_mgr.recv_NBL_array[NBL_cnt] );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
__recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* Return the last packet as if NDIS returned it, so that we repost<o:p></o:p></p>

<p class=MsoNormal>+            
* and report any other pending receives.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
//ipoib_return_net_buffer_list( p_port,
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+       
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Return the last packet as if NDIS returned it, so that we repost<o:p></o:p></p>

<p class=MsoNormal>-                                             
* and report any other pending receives.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
//ipoib_return_net_buffer_list( p_port,
p_port->recv_mgr.recv_NBL_array[0],recv_complete_flags );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    } while( NBL_cnt );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
} while( NBL_cnt );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    if (p_free ) {<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Rearm
after filtering to prevent contention on the enpoint maps<o:p></o:p></p>

<p class=MsoNormal>+         * and
eliminate the possibility of having a call to<o:p></o:p></p>

<p class=MsoNormal>+         *
__endpt_mgr_insert find a duplicate.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+         <o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(WorkToDo
== FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
RearmRecv );<o:p></o:p></p>

<p class=MsoNormal>+        status = p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, RearmRecv );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if (p_free ) {<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Rearm after filtering to prevent contention on the enpoint maps<o:p></o:p></p>

<p class=MsoNormal>-                             
* and eliminate the possibility of having a call to<o:p></o:p></p>

<p class=MsoNormal>-                             
* __endpt_mgr_insert find a duplicate.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( RearmRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = p_port->p_adapter->p_ifc->rearm_cq(<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+        // Please note
the reference is still up<o:p></o:p></p>

<p class=MsoNormal>+        if (h_cq) {<o:p></o:p></p>

<p class=MsoNormal>+           
IoQueueWorkItem( p_port->pPoWorkItem, __iopoib_WorkItem, DelayedWorkQueue,
p_port);<o:p></o:p></p>

<p class=MsoNormal>+           
WorkToDo = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+        } else {<o:p></o:p></p>

<p class=MsoNormal>+           
WorkToDo = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_recv_cb );<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
// Please note the reference is still up<o:p></o:p></p>

<p class=MsoNormal>-                             
KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop( &p_port->p_adapter->perf,
RecvCb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return WorkToDo;<o:p></o:p></p>

<p class=MsoNormal>+}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+<o:p></o:p></p>

<p class=MsoNormal>+static void<o:p></o:p></p>

<p class=MsoNormal>+__recv_cb(<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context )<o:p></o:p></p>

<p class=MsoNormal>+{<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    __recv_cb_internal(h_cq, cq_context,
&recv_cnt);<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __recv_get_endpts(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t* const           
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_wc_t* const                                                
p_wc,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t**
const                
pp_src,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t** const                
pp_dst )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t* const    p_desc,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_wc_t*
const             
p_wc,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_endpt_t**
const       pp_src,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_endpt_t**
const       pp_dst )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
mac_addr_t                                      
mac;<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEndptByLid );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( EndptInsert );<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
mac_addr_t          mac;<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEndptByLid );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( EndptInsert );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Setup our shortcut pointers based on whether GRH is valid. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_wc->recv.ud.recv_opt & IB_RECV_OPT_GRH_VALID )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Lookup the source endpoints based on GID. */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_src =<o:p></o:p></p>

<p class=MsoNormal>+    /* Setup our shortcut pointers based on
whether GRH is valid. */<o:p></o:p></p>

<p class=MsoNormal>+    if( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_GRH_VALID )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Lookup the
source endpoints based on GID. */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>+        *pp_src =<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid );<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid );<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.src_gid );<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.src_gid );<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Lookup the destination endpoint based on GID.<o:p></o:p></p>

<p class=MsoNormal>-                             
* This is used along with the packet filter to determine<o:p></o:p></p>

<p class=MsoNormal>-                             
* whether to report this to NDIS.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_dst =<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Lookup
the destination endpoint based on GID.<o:p></o:p></p>

<p class=MsoNormal>+         * This is
used along with the packet filter to determine<o:p></o:p></p>

<p class=MsoNormal>+         * whether
to report this to NDIS.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>+        *pp_dst =<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid );<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid );<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_get_by_gid( p_port, &p_desc->buf.ib.grh.dest_gid );<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_get_by_gid( p_port, &p_desc->p_buf->ib.grh.dest_gid );<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByGid );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Create the source endpoint if it does not exist.  Note that we<o:p></o:p></p>

<p class=MsoNormal>-                             
* can only do this for globally routed traffic since we need the<o:p></o:p></p>

<p class=MsoNormal>-                             
* information from the GRH to generate the MAC.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = ipoib_mac_from_guid(<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Create
the source endpoint if it does not exist.  Note that we<o:p></o:p></p>

<p class=MsoNormal>+         * can only
do this for globally routed traffic since we need the<o:p></o:p></p>

<p class=MsoNormal>+         *
information from the GRH to generate the MAC.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
status = ipoib_mac_from_guid(<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->buf.ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->buf.ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->p_buf->ib.grh.src_gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+           
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+               
return;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Create the endpoint. */<o:p></o:p></p>

<p class=MsoNormal>+           
/* Create the endpoint. */<o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src = ipoib_endpt_create( &p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></p>

<p class=MsoNormal>-#endif /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("ipoib_endpt_create failed\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( EndptInsert );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("__endpt_mgr_insert returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Lookup the remote endpoint based on LID.  Note that only<o:p></o:p></p>

<p class=MsoNormal>-                             
* unicast traffic can be LID routed.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( GetEndptByLid );<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_src = __endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, GetEndptByLid );<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_dst = p_port->p_local_endpt;<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( *pp_dst );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src = ipoib_endpt_create( &p_desc->buf.ib.grh.src_gid,<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src = ipoib_endpt_create( &p_desc->p_buf->ib.grh.src_gid,<o:p></o:p></p>

<p class=MsoNormal>+#endif  /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+               
p_wc->recv.ud.remote_lid, p_wc->recv.ud.remote_qp );<o:p></o:p></p>

<p class=MsoNormal>+           
if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("ipoib_endpt_create failed\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
return;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( EndptInsert );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>+       
    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("__endpt_mgr_insert returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+               
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>+               
return;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Lookup
the remote endpoint based on LID.  Note that only<o:p></o:p></p>

<p class=MsoNormal>+         * unicast
traffic can be LID routed.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
GetEndptByLid );<o:p></o:p></p>

<p class=MsoNormal>+        *pp_src =
__endpt_mgr_get_by_lid( p_port, p_wc->recv.ud.remote_lid );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, GetEndptByLid );<o:p></o:p></p>

<p class=MsoNormal>+        *pp_dst =
p_port->p_local_endpt;<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
*pp_dst );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( *pp_src && !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid )
&&<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Update the QPN for the endpoint. */<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>-//                         
(*pp_src)->qpn = p_wc->recv.ud.remote_qp;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( *pp_src &&
!ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Update the
QPN for the endpoint. */<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+           
("Updating QPN for MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>+//      (*pp_src)->qpn =
p_wc->recv.ud.remote_qp;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( *pp_src && *pp_dst )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Recv:\n"<o:p></o:p></p>

<p class=MsoNormal>-                                             
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>

<p class=MsoNormal>-                                             
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_dst )->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( *pp_src && *pp_dst )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+           
("Recv:\n"<o:p></o:p></p>

<p class=MsoNormal>+           
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>

<p class=MsoNormal>+           
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src )->mac.addr[0], (*pp_src )->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src )->mac.addr[2], (*pp_src )->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src )->mac.addr[4], (*pp_src )->mac.addr[5],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_dst )->mac.addr[0], (*pp_dst )->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+ 
          (*pp_dst
)->mac.addr[2], (*pp_dst )->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_dst )->mac.addr[4], (*pp_dst )->mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static int32_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_filter(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_wc_t* const                                                
p_done_wc_list,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_qlist_t*
const                                              
p_done_list,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_qlist_t*
const                                              
p_bad_list )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_wc_t*
const             
p_done_wc_list,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         cl_qlist_t*
const           p_done_list,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         cl_qlist_t*
const           p_bad_list )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t                         
*p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_wc_t                                                                               
*p_wc;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_pkt_t                                                       
*p_ipoib;<o:p></o:p></p>

<p class=MsoNormal>-             
eth_pkt_t                                                          
*p_eth;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t                                  
*p_src, *p_dst;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                                              
len;<o:p></o:p></p>

<p class=MsoNormal>-             
int32_t                                                                 
recv_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetRecvEndpts );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvGen );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvTcp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvUdp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvDhcp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RecvArp );<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_recv_desc_t       *p_desc;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_wc_t                
*p_wc;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_pkt_t            
*p_ipoib;<o:p></o:p></p>

<p class=MsoNormal>+   
eth_pkt_t              
*p_eth;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t          
*p_src, *p_dst;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t        
status;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t               
len;<o:p></o:p></p>

<p class=MsoNormal>+   
int32_t                
recv_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetRecvEndpts );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvGen );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvTcp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvUdp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvDhcp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RecvArp );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
for( p_wc = p_done_wc_list; p_wc; p_wc = p_wc->p_next )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV
);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc = (ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>

<p class=MsoNormal>-                             
recv_cnt++;<o:p></o:p></p>

<p class=MsoNormal>+    for( p_wc = p_done_wc_list; p_wc; p_wc =
p_wc->p_next )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_RECV );<o:p></o:p></p>

<p class=MsoNormal>+        p_desc =
(ipoib_recv_desc_t*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>

<p class=MsoNormal>+        recv_cnt++;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Failed completion %s  (vendor specific %#x)\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
(int)p_wc->vendor_specific) );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Flushed completion %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></p>

<p class=MsoNormal>-                                             
continue;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_wc->status != IB_WCS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_wc->status != IB_WCS_WR_FLUSHED_ERR )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+   
            IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Failed completion %s  (vendor specific %#x)\n",<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>

<p class=MsoNormal>+                   
(int)p_wc->vendor_specific) );<o:p></o:p></p>

<p class=MsoNormal>+               
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Flushed completion %s\n",<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status )) );<o:p></o:p></p>

<p class=MsoNormal>+               
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_DROPPED, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_deref( p_port, ref_failed_recv_wc );<o:p></o:p></p>

<p class=MsoNormal>+           
continue;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
len = p_wc->length - sizeof(ib_grh_t);<o:p></o:p></p>

<p class=MsoNormal>+        len =
p_wc->length - sizeof(ib_grh_t);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( len < sizeof(ipoib_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Received ETH packet < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>

<p class=MsoNormal>-                                             
continue;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if( len <
sizeof(ipoib_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Received ETH packet < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>

<p class=MsoNormal>+           
continue;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if((len - sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>

<p class=MsoNormal>-                                             
continue;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Successful completion.  Get the receive information. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt & IB_RECV_OPT_CSUM_MASK
) >> 8 );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->len = len + 14 - 4 ;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( GetRecvEndpts );<o:p></o:p></p>

<p class=MsoNormal>-                             
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, GetRecvEndpts );<o:p></o:p></p>

<p class=MsoNormal>+        if((len -
sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Received ETH packet len %d > payload MTU (%d)\n",<o:p></o:p></p>

<p class=MsoNormal>+               
(len - sizeof(ipoib_hdr_t)),<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->params.payload_mtu) );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_deref( p_port, ref_recv_inv_len );<o:p></o:p></p>

<p class=MsoNormal>+           
continue;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /* Successful
completion.  Get the receive information. */<o:p></o:p></p>

<p class=MsoNormal>+     
  p_desc->ndis_csum.Value = ( ( p_wc->recv.ud.recv_opt &
IB_RECV_OPT_CSUM_MASK ) >> 8 );<o:p></o:p></p>

<p class=MsoNormal>+        p_desc->len =
len + 14 - 4 ;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
GetRecvEndpts );<o:p></o:p></p>

<p class=MsoNormal>+       
__recv_get_endpts( p_port, p_desc, p_wc, &p_src, &p_dst );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, GetRecvEndpts );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if IPOIB_INLINE_RECV<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ipoib = &p_desc->buf.ib.pkt;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_eth = &p_desc->buf.eth.pkt;<o:p></o:p></p>

<p class=MsoNormal>-#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ipoib = &p_desc->p_buf->ib.pkt;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_eth = &p_desc->p_buf->eth.pkt;<o:p></o:p></p>

<p class=MsoNormal>-#endif /*IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        p_ipoib =
&p_desc->buf.ib.pkt;<o:p></o:p></p>

<p class=MsoNormal>+        p_eth =
&p_desc->buf.eth.pkt;<o:p></o:p></p>

<p class=MsoNormal>+#else   /* IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal>+        p_ipoib =
&p_desc->p_buf->ib.pkt;<o:p></o:p></p>

<p class=MsoNormal>+        p_eth =
&p_desc->p_buf->eth.pkt;<o:p></o:p></p>

<p class=MsoNormal>+#endif  /*IPOIB_INLINE_RECV */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_src )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                                             
* "This is not the packet you're looking for" - don't update<o:p></o:p></p>

<p class=MsoNormal>-                                                             
* receive statistics, the packet never happened.<o:p></o:p></p>

<p class=MsoNormal>-                                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
continue;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if( p_src )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* Don't report loopback traffic - we requested SW loopback. */<o:p></o:p></p>

<p class=MsoNormal>+           
if( !cl_memcmp( &p_port->p_adapter->params.conf_mac,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_src->mac, sizeof(p_port->p_adapter->params.conf_mac) ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/*<o:p></o:p></p>

<p class=MsoNormal>+                
* "This is not the packet you're looking for" - don't update<o:p></o:p></p>

<p class=MsoNormal>+                
* receive statistics, the packet never happened.<o:p></o:p></p>

<p class=MsoNormal>+                
*/<o:p></o:p></p>

<p class=MsoNormal>+               
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+               
/* Dereference the port object on behalf of the failed recv. */<o:p></o:p></p>

<p class=MsoNormal>+               
ipoib_port_deref( p_port, ref_recv_loopback );<o:p></o:p></p>

<p class=MsoNormal>+ 
              continue;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
switch( p_ipoib->hdr.type )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
case ETH_PROT_TYPE_IP:<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Received IP packet < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+        switch(
p_ipoib->hdr.type )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+        case
ETH_PROT_TYPE_IP:<o:p></o:p></p>

<p class=MsoNormal>+           
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Received IP packet < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></p>

<p class=MsoNormal>-             
                                               
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_perf_start( RecvTcp );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_ipoib->type.ip.hdr.offset ||<o:p></o:p></p>

<p class=MsoNormal>+               
p_ipoib->type.ip.hdr.prot != IP_PROT_UDP )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></p>

<p class=MsoNormal>+               
cl_perf_start( RecvTcp );<o:p></o:p></p>

<p class=MsoNormal>+               
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+               
cl_perf_stop( &p_port->p_adapter->perf, RecvTcp );<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* First packet of a UDP transfer. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( len <<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Received UDP packet < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
/* First packet of a UDP transfer. */<o:p></o:p></p>

<p class=MsoNormal>+           
if( len <<o:p></o:p></p>

<p class=MsoNormal>+               
(sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+            
       ("Received UDP packet < min
size\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Check if DHCP conversion is required. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_PROXY_SERVER &&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_PROXY_SERVER))<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("Received DHCP < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
// If there are IP options in this message, we are in trouble in any case<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
break;                                                                  
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_perf_start( RecvDhcp );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_perf_start( RecvUdp );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_perf_stop( &p_port->p_adapter->perf, RecvUdp );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+           
/* Check if DHCP conversion is required. */<o:p></o:p></p>

<p class=MsoNormal>+           
if( (p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_SERVER &&<o:p></o:p></p>

<p class=MsoNormal>+               
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>

<p class=MsoNormal>+               
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>

<p class=MsoNormal>+               
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_SERVER)||<o:p></o:p></p>

<p class=MsoNormal>+   
            (p_ipoib->type.ip.prot.udp.hdr.dst_port
== DHCP_PORT_PROXY_SERVER &&<o:p></o:p></p>

<p class=MsoNormal>+               
p_ipoib->type.ip.prot.udp.hdr.src_port == DHCP_PORT_CLIENT) ||<o:p></o:p></p>

<p class=MsoNormal>+               
(p_ipoib->type.ip.prot.udp.hdr.dst_port == DHCP_PORT_CLIENT &&<o:p></o:p></p>

<p class=MsoNormal>+             
  p_ipoib->type.ip.prot.udp.hdr.src_port ==
DHCP_PORT_PROXY_SERVER))<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
if( len < (sizeof(ipoib_hdr_t) + sizeof(ip_hdr_t) +<o:p></o:p></p>

<p class=MsoNormal>+                   
sizeof(udp_hdr_t) + DHCP_MIN_SIZE) )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("Received DHCP < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>+                   
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+                   
break;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
if ((p_ipoib->type.ip.hdr.ver_hl & 0x0f) != 5 ) {<o:p></o:p></p>

<p class=MsoNormal>+                   
// If there are IP options in this message, we are in trouble in any case<o:p></o:p></p>

<p class=MsoNormal>+                   
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+                   
break;                 
<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
/* UDP packet with BOOTP ports in src/dst port numbers. */<o:p></o:p></p>

<p class=MsoNormal>+               
cl_perf_start( RecvDhcp );<o:p></o:p></p>

<p class=MsoNormal>+               
status = __recv_dhcp( p_port, p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+               
cl_perf_stop( &p_port->p_adapter->perf, RecvDhcp );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></p>

<p class=MsoNormal>+               
cl_perf_start( RecvUdp );<o:p></o:p></p>

<p class=MsoNormal>+               
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+       
        cl_perf_stop( &p_port->p_adapter->perf,
RecvUdp );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
case ETH_PROT_TYPE_ARP:<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Received ARP < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( RecvArp );<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &p_port->p_adapter->perf, RecvArp );<o:p></o:p></p>

<p class=MsoNormal>-                                             
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        case
ETH_PROT_TYPE_ARP:<o:p></o:p></p>

<p class=MsoNormal>+           
if( len < (sizeof(ipoib_hdr_t) + sizeof(ipoib_arp_pkt_t)) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+     
              ("Received
ARP < min size\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
status = IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( RecvArp );<o:p></o:p></p>

<p class=MsoNormal>+           
status = __recv_arp( p_port, p_wc, p_ipoib, p_eth, &p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+  
         cl_perf_stop(
&p_port->p_adapter->perf, RecvArp );<o:p></o:p></p>

<p class=MsoNormal>+           
len = sizeof(ipoib_hdr_t) + sizeof(arp_pkt_t);<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( RecvGen );<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        default:<o:p></o:p></p>

<p class=MsoNormal>+           
/* Unfiltered.  Setup the ethernet header and report. */<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( RecvGen );<o:p></o:p></p>

<p class=MsoNormal>+           
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_stop( &p_port->p_adapter->perf, RecvGen );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Update stats. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ip_stat_sel_t                    
    ip_stat;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->len =<o:p></o:p></p>

<p class=MsoNormal>-                             
                               
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_dst->h_mcast)<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 );  <o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* Update stats. */<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
/* Dereference the port object on behalf of the failed receive. */<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_deref( p_port, ref_recv_filter );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ip_stat_sel_t          
ip_stat;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->len =<o:p></o:p></p>

<p class=MsoNormal>+               
len + sizeof(eth_hdr_t) - sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_dst->h_mcast)<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
if( p_dst->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>+                   
p_dst->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>+                   
p_dst->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>+                   
p_dst->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
p_desc->type = PKT_TYPE_BCAST;<o:p></o:p></p>

<p class=MsoNormal>+                   
ip_stat = IP_STAT_BCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
else<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
p_desc->type = PKT_TYPE_MCAST;<o:p></o:p></p>

<p class=MsoNormal>+                   
ip_stat = IP_STAT_MCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->type = PKT_TYPE_UCAST;<o:p></o:p></p>

<p class=MsoNormal>+               
ip_stat = IP_STAT_UCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail( p_done_list, &p_desc->item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_inc_recv_stat( p_port->p_adapter, ip_stat, p_desc->len, 1 );  <o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return recv_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return recv_cnt;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_gen(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t* const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_dst )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ipoib_pkt_t*
const          p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t*
const            p_eth,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_src,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_dst )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_src || !p_dst )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received packet with no matching endpoints.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_NOT_DONE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_src || !p_dst )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received packet with no matching endpoints.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_NOT_DONE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Fill in the ethernet header.  Note that doing so will overwrite<o:p></o:p></p>

<p class=MsoNormal>-             
* the IPoIB header, so start by moving the information from the IPoIB<o:p></o:p></p>

<p class=MsoNormal>-             
* header.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
p_eth->hdr.type = p_ipoib->hdr.type;<o:p></o:p></p>

<p class=MsoNormal>-             
p_eth->hdr.src = p_src->mac;<o:p></o:p></p>

<p class=MsoNormal>-             
p_eth->hdr.dst = p_dst->mac;<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Fill in the ethernet
header.  Note that doing so will overwrite<o:p></o:p></p>

<p class=MsoNormal>+     * the IPoIB header, so start by
moving the information from the IPoIB<o:p></o:p></p>

<p class=MsoNormal>+     * header.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    p_eth->hdr.type =
p_ipoib->hdr.type;<o:p></o:p></p>

<p class=MsoNormal>+    p_eth->hdr.src = p_src->mac;<o:p></o:p></p>

<p class=MsoNormal>+    p_eth->hdr.dst = p_dst->mac;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if ( p_eth->hdr.dst.addr[0] == 1 && <o:p></o:p></p>

<p class=MsoNormal>-                             
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>

<p class=MsoNormal>-                             
p_eth->hdr.dst.addr[2] == 0x5E)  <o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if (p_dst->h_mcast)<o:p></o:p></p>

<p class=MsoNormal>-                             
p_dst->is_in_use = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    if ( p_eth->hdr.dst.addr[0] == 1
&& <o:p></o:p></p>

<p class=MsoNormal>+        
p_eth->hdr.type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>

<p class=MsoNormal>+        
p_eth->hdr.dst.addr[2] == 0x5E)  <o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_eth->hdr.dst.addr[1] = 0;<o:p></o:p></p>

<p class=MsoNormal>+       
p_eth->hdr.dst.addr[3] = p_eth->hdr.dst.addr[3] & 0x7f;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if (p_dst->h_mcast)<o:p></o:p></p>

<p class=MsoNormal>+       
p_dst->is_in_use = TRUE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_dhcp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t*
const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_dst )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
    const   ipoib_pkt_t*
const          p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t*
const            p_eth,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_src,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_dst )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
dhcp_pkt_t                                       
*p_dhcp;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                                
*p_option;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                                
*p_cid = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                                
msg = 0;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
dhcp_pkt_t          *p_dhcp;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t            
*p_option;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t            
*p_cid = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t            
msg = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Create the ethernet header. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__recv_gen returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Create the ethernet header. */<o:p></o:p></p>

<p class=MsoNormal>+    status = __recv_gen( p_ipoib, p_eth,
p_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__recv_gen returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Fixup the payload. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_dhcp = &p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_dhcp->op != DHCP_REQUEST && p_dhcp->op != DHCP_REPLY )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Invalid DHCP op code.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Fixup the payload. */<o:p></o:p></p>

<p class=MsoNormal>+    p_dhcp =
&p_eth->type.ip.prot.udp.dhcp;<o:p></o:p></p>

<p class=MsoNormal>+    if( p_dhcp->op != DHCP_REQUEST
&& p_dhcp->op != DHCP_REPLY )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Invalid DHCP op code.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Find the client identifier option, making sure to skip<o:p></o:p></p>

<p class=MsoNormal>-             
* the "magic cookie".<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
p_option = &p_dhcp->options[0];<o:p></o:p></p>

<p class=MsoNormal>-             
if ( *(uint32_t *)p_option != DHCP_COOKIE )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("DHCP cookie corrupted.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Find the client identifier
option, making sure to skip<o:p></o:p></p>

<p class=MsoNormal>+     * the "magic cookie".<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    p_option = &p_dhcp->options[0];<o:p></o:p></p>

<p class=MsoNormal>+    if ( *(uint32_t *)p_option !=
DHCP_COOKIE )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("DHCP cookie corrupted.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_option = &p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></p>

<p class=MsoNormal>-             
while( *p_option != DHCP_OPT_END && p_option <
&p_dhcp->options[312] )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
switch( *p_option )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
case DHCP_OPT_PAD:<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_option++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    p_option =
&p_dhcp->options[DHCP_COOKIE_SIZE];<o:p></o:p></p>

<p class=MsoNormal>+    while( *p_option != DHCP_OPT_END
&& p_option < &p_dhcp->options[312] )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        switch(
*p_option )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+        case
DHCP_OPT_PAD:<o:p></o:p></p>

<p class=MsoNormal>+           
p_option++;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
case DHCP_OPT_MSG:<o:p></o:p></p>

<p class=MsoNormal>-                                             
msg = p_option[2];<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_option += 3;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        case
DHCP_OPT_MSG:<o:p></o:p></p>

<p class=MsoNormal>+           
msg = p_option[2];<o:p></o:p></p>

<p class=MsoNormal>+           
p_option += 3;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
case DHCP_OPT_CLIENT_ID:<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_cid = p_option;<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Fall through. */<o:p></o:p></p>

<p class=MsoNormal>+        case
DHCP_OPT_CLIENT_ID:<o:p></o:p></p>

<p class=MsoNormal>+           
p_cid = p_option;<o:p></o:p></p>

<p class=MsoNormal>+           
/* Fall through. */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* All other options have a length byte following the option code.<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Offset by the length to get to the next option.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_option += (p_option[1] + 2);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        default:<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* All other options have a length byte following the option code.<o:p></o:p></p>

<p class=MsoNormal>+            
* Offset by the length to get to the next option.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
p_option += (p_option[1] + 2);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( msg )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
/* message from client */<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPDISCOVER:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPREQUEST:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPDECLINE:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPRELEASE:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPINFORM:<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_cid )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to find required Client-identifier option.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Invalid hardware address type.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
/* message from DHCP server */<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPOFFER:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPACK:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPNAK:<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    switch( msg )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    /* message from client */<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPDISCOVER:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPREQUEST:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPDECLINE:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPRELEASE:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPINFORM:<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_cid )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to find required Client-identifier option.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_dhcp->htype != DHCP_HW_TYPE_IB )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Invalid hardware address type.\n") );<o:p></o:p></p>

<p class=MsoNormal>+         
  return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    /* message from DHCP server */<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPOFFER:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPACK:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPNAK:<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Invalide message type.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_eth->type.ip.prot.udp.hdr.chksum = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
p_dhcp->htype = DHCP_HW_TYPE_ETH;<o:p></o:p></p>

<p class=MsoNormal>-             
p_dhcp->hlen = HW_ADDR_LEN;<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Invalide message type.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_eth->type.ip.prot.udp.hdr.chksum =
0;<o:p></o:p></p>

<p class=MsoNormal>+    p_dhcp->htype = DHCP_HW_TYPE_ETH;<o:p></o:p></p>

<p class=MsoNormal>+    p_dhcp->hlen = HW_ADDR_LEN;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_cid ) /* from client */<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Validate that the length and type of the option is as required. */<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("DHCP CID received is:"));<o:p></o:p></p>

<p class=MsoNormal>-                             
for (int i=0; i < coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                             
               
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_cid[1] != coIPoIB_CID_Len )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Client-identifier length is not equal to %d as
required.\n",coIPoIB_CID_Len) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_cid[2] != coIPoIB_HwTypeIB)<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Client-identifier type is %d <> %d and wrong \n", p_cid[2],
coIPoIB_HwTypeIB) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Copy the GID value from the option so that we can make aligned<o:p></o:p></p>

<p class=MsoNormal>-                             
* accesses to the contents.<o:p></o:p></p>

<p class=MsoNormal>-                             
* Recover CID to standard type.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
p_cid[1] =  sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></p>

<p class=MsoNormal>-                             
p_cid[2] =  DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></p>

<p class=MsoNormal>-                             
//Copy the GUID to the 3-d byte of CID<o:p></o:p></p>

<p class=MsoNormal>-                             
RtlMoveMemory( &p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof
(ib_net64_t)], sizeof (ib_net64_t) );<o:p></o:p></p>

<p class=MsoNormal>-                             
// Clear the rest<o:p></o:p></p>

<p class=MsoNormal>-                             
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3 -sizeof
(ib_net64_t), 0);<o:p></o:p></p>

<p class=MsoNormal>+    if( p_cid ) /* from client */<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Validate that
the length and type of the option is as required. */<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+                   
("DHCP CID received is:"));<o:p></o:p></p>

<p class=MsoNormal>+        for (int i=0; i
< coIPoIB_CID_TotalLen; ++i) {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+               
("[%d] 0x%x: \n",i, p_cid[i]));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if( p_cid[1] !=
coIPoIB_CID_Len )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Client-identifier length is not equal to %d as
required.\n",coIPoIB_CID_Len) );<o:p></o:p></p>

<p class=MsoNormal>+           
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if( p_cid[2] !=
coIPoIB_HwTypeIB)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Client-identifier type is %d <> %d and wrong \n", p_cid[2],
coIPoIB_HwTypeIB) );<o:p></o:p></p>

<p class=MsoNormal>+           
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Copy the
GID value from the option so that we can make aligned<o:p></o:p></p>

<p class=MsoNormal>+         * accesses
to the contents.<o:p></o:p></p>

<p class=MsoNormal>+         * Recover
CID to standard type.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        p_cid[1] = 
sizeof (ib_net64_t) + 1;// CID length <o:p></o:p></p>

<p class=MsoNormal>+        p_cid[2] = 
DHCP_HW_TYPE_ETH;// CID type<o:p></o:p></p>

<p class=MsoNormal>+        //Copy the GUID
to the 3-d byte of CID<o:p></o:p></p>

<p class=MsoNormal>+        RtlMoveMemory(
&p_cid[3], &p_cid[coIPoIB_CID_TotalLen - sizeof (ib_net64_t)], sizeof
(ib_net64_t) );<o:p></o:p></p>

<p class=MsoNormal>+        // Clear the
rest<o:p></o:p></p>

<p class=MsoNormal>+       
RtlFillMemory(&p_cid[3+sizeof (ib_net64_t)],coIPoIB_CID_TotalLen - 3
-sizeof (ib_net64_t), 0);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
RtlCopyMemory( p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );<o:p></o:p></p>

<p class=MsoNormal>-                             
RtlFillMemory( &p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></p>

<p class=MsoNormal>-                                             
       ( sizeof(p_dhcp->chaddr) -
sizeof(p_src->mac) ), 0 );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+        RtlCopyMemory(
p_dhcp->chaddr, &p_src->mac, sizeof(p_src->mac) );<o:p></o:p></p>

<p class=MsoNormal>+        RtlFillMemory(
&p_dhcp->chaddr[sizeof(p_src->mac)],<o:p></o:p></p>

<p class=MsoNormal>+                  
( sizeof(p_dhcp->chaddr) - sizeof(p_src->mac) ), 0 );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_arp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_wc_t* const                                                
p_wc,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t*
const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t**
const                
pp_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_dst )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_wc_t*
const             
p_wc,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ipoib_pkt_t*
const          p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t*
const            p_eth,<o:p></o:p></p>

<p class=MsoNormal>+
   IN             
ipoib_endpt_t** const       pp_src,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_dst )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
arp_pkt_t                                                           
*p_arp;<o:p></o:p></p>

<p class=MsoNormal>-             
const ipoib_arp_pkt_t   *p_ib_arp;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_gid_t                                                              
gid;<o:p></o:p></p>

<p class=MsoNormal>-             
mac_addr_t                                                      
mac;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_hw_addr_t                                            
null_hw = {0};<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                                                
cm_capable = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_api_status_t         status;<o:p></o:p></p>

<p class=MsoNormal>+   
arp_pkt_t              
*p_arp;<o:p></o:p></p>

<p class=MsoNormal>+    const ipoib_arp_pkt_t   *p_ib_arp;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_gid_t               
gid;<o:p></o:p></p>

<p class=MsoNormal>+   
mac_addr_t             
mac;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_hw_addr_t         null_hw = {0};<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t                
cm_capable = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_dst )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Unknown destination endpoint\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_dst )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Unknown destination endpoint\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp = &p_ipoib->type.arp;<o:p></o:p></p>

<p class=MsoNormal>-             
p_arp = &p_eth->type.arp;<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp = &p_ipoib->type.arp;<o:p></o:p></p>

<p class=MsoNormal>+    p_arp = &p_eth->type.arp;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_ib_arp->hw_type != ARP_HW_TYPE_IB )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ARP hardware type is not IB\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_ib_arp->hw_type !=
ARP_HW_TYPE_IB )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ARP hardware type is not IB\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_ib_arp->hw_size != sizeof(ipoib_hw_addr_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_ib_arp->hw_size !=
sizeof(ipoib_hw_addr_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ARP hardware address size is not sizeof(ipoib_hw_addr_t)\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_ib_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ARP protocal type not IP\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_ib_arp->prot_type !=
ETH_PROT_TYPE_IP )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+    
       ("ARP protocal type not
IP\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cm_capable = ipoib_addr_get_flags( &p_ib_arp->src_hw );<o:p></o:p></p>

<p class=MsoNormal>+    cm_capable = ipoib_addr_get_flags(
&p_ib_arp->src_hw );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* If we don't have a source, lookup the endpoint specified in the payload.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_src = __endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * If we don't have a source,
lookup the endpoint specified in the payload.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>+        *pp_src =
__endpt_mgr_get_by_gid( p_port, &p_ib_arp->src_hw.gid );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* If the endpoint exists for the GID, make sure<o:p></o:p></p>

<p class=MsoNormal>-             
* the dlid and qpn match the arp.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
if( *pp_src )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( cl_memcmp( &(*pp_src)->dgid, &p_ib_arp->src_hw.gid,<o:p></o:p></p>

<p class=MsoNormal>-                                             
sizeof(ib_gid_t) ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* GIDs for the endpoint are different.  The ARP must<o:p></o:p></p>

<p class=MsoNormal>-                                             
* have been proxied.  Dereference it.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( (*pp_src)->dlid &&<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if ( ! ((*pp_src)->dlid)) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_wc->recv.ud.remote_qp !=  ipoib_addr_get_qpn(
&p_ib_arp->src_hw ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( (*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * If the endpoint exists for the
GID, make sure<o:p></o:p></p>

<p class=MsoNormal>+     * the dlid and qpn match the arp.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    if( *pp_src )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if( cl_memcmp(
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid,<o:p></o:p></p>

<p class=MsoNormal>+           
sizeof(ib_gid_t) ) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* GIDs for the endpoint are different.  The ARP must<o:p></o:p></p>

<p class=MsoNormal>+            
* have been proxied.  Dereference it.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if(
(*pp_src)->dlid &&<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src)->dlid != p_wc->recv.ud.remote_lid )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if ( !
((*pp_src)->dlid)) {<o:p></o:p></p>

<p class=MsoNormal>+           
/* Out of date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if(
ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
if( (*pp_src)->qpn != ipoib_addr_get_qpn( &p_ib_arp->src_hw )
&&<o:p></o:p></p>

<p class=MsoNormal>+                
p_wc->recv.ud.remote_qp != ipoib_addr_get_qpn( &p_ib_arp->src_hw ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+      
         /* Out of date! 
Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>+               
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>+               
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if(
(*pp_src)->qpn != p_wc->recv.ud.remote_qp )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+
           /* Out of
date!  Destroy the endpoint and replace it. */<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_remove( p_port, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Do we need to create an endpoint for this GID? */<o:p></o:p></p>

<p class=MsoNormal>-             
if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Copy the src GID to allow aligned access */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( &gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = ipoib_mac_from_guid( gid.unicast.interface_id, p_port->p_adapter->params.guid_mask,
&mac );<o:p></o:p></p>

<p class=MsoNormal>-                             
if (status == IB_INVALID_GUID_MASK)<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Invalid GUID mask received, rejecting it") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX,
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Create the endpoint.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>

<p class=MsoNormal>+    /* Do we need to create an endpoint for
this GID? */<o:p></o:p></p>

<p class=MsoNormal>+    if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Copy the src
GID to allow aligned access */<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy(
&gid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) );<o:p></o:p></p>

<p class=MsoNormal>+        status =
ipoib_mac_from_guid( gid.unicast.interface_id,
p_port->p_adapter->params.guid_mask, &mac );<o:p></o:p></p>

<p class=MsoNormal>+        if (status ==
IB_INVALID_GUID_MASK)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Invalid GUID mask received, rejecting it") );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_create_log(p_port->p_adapter->h_adapter, GUID_MASK_LOG_INDEX,
EVENT_IPOIB_WRONG_PARAMETER_WRN);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if( status
!= IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("ipoib_mac_from_guid returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Create
the endpoint.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        *pp_src =
ipoib_endpt_create( &p_ib_arp->src_hw.gid,<o:p></o:p></p>

<p class=MsoNormal>+           
p_wc->recv.ud.remote_lid, ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("ipoib_endpt_create failed\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if( !*pp_src )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("ipoib_endpt_create failed\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __endpt_mgr_insert( p_port, mac, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("__endpt_mgr_insert return %s \n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        status = __endpt_mgr_insert(
p_port, mac, *pp_src );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("__endpt_mgr_insert return %s \n",<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>

<p class=MsoNormal>+    (*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( !cl_memcmp(<o:p></o:p></p>

<p class=MsoNormal>-                             
&(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) ) );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) ||<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( !cl_memcmp(<o:p></o:p></p>

<p class=MsoNormal>+      
 &(*pp_src)->dgid, &p_ib_arp->src_hw.gid, sizeof(ib_gid_t) )
);<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( ipoib_is_voltaire_router_gid(
&(*pp_src)->dgid ) ||<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_src)->qpn == ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ib_arp->op == ARP_OP_REQ &&<o:p></o:p></p>

<p class=MsoNormal>-                             
cm_capable == IPOIB_CM_FLAG_RC )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* if we've got ARP request and RC flag is set, <o:p></o:p></p>

<p class=MsoNormal>-                             
save SID for connect REQ to be sent in ARP reply<o:p></o:p></p>

<p class=MsoNormal>-                             
when requestor's path get resolved */<o:p></o:p></p>

<p class=MsoNormal>-                             
if( endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_addr_set_sid( <o:p></o:p></p>

<p class=MsoNormal>-                                                             
&(*pp_src)->conn.service_id,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>

<p class=MsoNormal>+        p_ib_arp->op
== ARP_OP_REQ &&<o:p></o:p></p>

<p class=MsoNormal>+        cm_capable ==
IPOIB_CM_FLAG_RC )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* if we've got
ARP request and RC flag is set, <o:p></o:p></p>

<p class=MsoNormal>+        save SID for connect
REQ to be sent in ARP reply<o:p></o:p></p>

<p class=MsoNormal>+        when requestor's
path get resolved */<o:p></o:p></p>

<p class=MsoNormal>+        if(
endpt_cm_get_state( (*pp_src) ) == IPOIB_CM_DISCONNECTED )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src)->cm_flag = cm_capable;<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_addr_set_sid( <o:p></o:p></p>

<p class=MsoNormal>+               
&(*pp_src)->conn.service_id,<o:p></o:p></p>

<p class=MsoNormal>+               
ipoib_addr_get_qpn( &p_ib_arp->src_hw ) );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> #if 0 //DBG<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC:
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></p>

<p class=MsoNormal>-                                             
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></p>

<p class=MsoNormal>-                                             
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
(" ARP %s from ENDPT[%p] state %d CM cap: %d QPN: %#x MAC:
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>+           
((p_ib_arp->op == ARP_OP_REQ )? "REQUEST" : "REPLY"),<o:p></o:p></p>

<p class=MsoNormal>+           
*pp_src, endpt_cm_get_state( *pp_src ), <o:p></o:p></p>

<p class=MsoNormal>+           
((cm_capable == IPOIB_CM_FLAG_RC)? 1: 0),<o:p></o:p></p>

<p class=MsoNormal>+           
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->src_hw ) ),<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src)->mac.addr[0], (*pp_src)->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src)->mac.addr[2], (*pp_src)->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+           
(*pp_src)->mac.addr[4], (*pp_src)->mac.addr[5] ));<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Now swizzle the data. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_arp->hw_type = ARP_HW_TYPE_ETH;<o:p></o:p></p>

<p class=MsoNormal>-             
p_arp->hw_size = sizeof(mac_addr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
p_arp->src_hw = (*pp_src)->mac;<o:p></o:p></p>

<p class=MsoNormal>-             
p_arp->src_ip = p_ib_arp->src_ip;<o:p></o:p></p>

<p class=MsoNormal>+    /* Now swizzle the data. */<o:p></o:p></p>

<p class=MsoNormal>+    p_arp->hw_type = ARP_HW_TYPE_ETH;<o:p></o:p></p>

<p class=MsoNormal>+    p_arp->hw_size = sizeof(mac_addr_t);<o:p></o:p></p>

<p class=MsoNormal>+    p_arp->src_hw = (*pp_src)->mac;<o:p></o:p></p>

<p class=MsoNormal>+    p_arp->src_ip = p_ib_arp->src_ip;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_memcmp( &p_ib_arp->dst_hw, &null_hw, sizeof(ipoib_hw_addr_t)
) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( cl_memcmp( &p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t)
) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* We received bcast ARP packet that means<o:p></o:p></p>

<p class=MsoNormal>-                                             
* remote port lets everyone know it was changed IP/MAC<o:p></o:p></p>

<p class=MsoNormal>-                                             
* or just activated<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_memcmp( &p_ib_arp->dst_hw,
&null_hw, sizeof(ipoib_hw_addr_t) ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if( cl_memcmp(
&p_dst->dgid, &p_ib_arp->dst_hw.gid, sizeof(ib_gid_t) ) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* We received bcast ARP packet that means<o:p></o:p></p>

<p class=MsoNormal>+     
       * remote port lets everyone know it
was changed IP/MAC<o:p></o:p></p>

<p class=MsoNormal>+            
* or just activated<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Guy: TODO: Check why this check fails in case of Voltaire IPR */<o:p></o:p></p>

<p class=MsoNormal>+           
/* Guy: TODO: Check why this check fails in case of Voltaire IPR */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("ARP: is not ARP MCAST\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
if ( !ipoib_is_voltaire_router_gid( &(*pp_src)->dgid ) &&<o:p></o:p></p>

<p class=MsoNormal>+                
!ib_gid_is_multicast( (const ib_gid_t*)&p_dst->dgid ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+ 
                  ("ARP:
is not ARP MCAST\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
return IB_INVALID_SETTING;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* we don't care what receiver ip addr is,<o:p></o:p></p>

<p class=MsoNormal>-                                             
* as long as OS' ARP table is global  ???<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_arp->dst_ip = (net32_t)0;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else /* we've got reply to our ARP request */<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_arp->dst_hw = p_dst->mac;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else /* we got ARP reqeust */<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memclr( &p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
p_arp->dst_hw = p_port->p_local_endpt->mac;<o:p></o:p></p>

<p class=MsoNormal>+           
p_dst->mac = p_port->p_local_endpt->mac;<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* we don't care what receiver ip addr is,<o:p></o:p></p>

<p class=MsoNormal>+            
* as long as OS' ARP table is global  ???<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
p_arp->dst_ip = (net32_t)0;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else /* we've
got reply to our ARP request */<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_arp->dst_hw = p_dst->mac;<o:p></o:p></p>

<p class=MsoNormal>+           
p_arp->dst_ip = p_ib_arp->dst_ip;<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( p_dst->qpn == ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else /* we got ARP reqeust */<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_memclr(
&p_arp->dst_hw, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+        p_arp->dst_ip
= p_ib_arp->dst_ip;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Create the ethernet header.  Note that this is done last so that<o:p></o:p></p>

<p class=MsoNormal>-             
* we have a chance to create a new endpoint.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
status = __recv_gen( p_ipoib, p_eth, *pp_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__recv_gen returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Create the ethernet
header.  Note that this is done last so that<o:p></o:p></p>

<p class=MsoNormal>+     * we have a chance to create a new
endpoint.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    status = __recv_gen( p_ipoib, p_eth,
*pp_src, p_dst );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__recv_gen returned %s.\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_prepare_NBL(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_recv_desc_t*        const    
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
NET_BUFFER_LIST** const                         
pp_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_recv_desc_t*  const   p_desc,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         NET_BUFFER_LIST**
const     pp_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                                                                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                                                                                              
pkt_filter;<o:p></o:p></p>

<p class=MsoNormal>-             
//NDIS60<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO      chksum;<o:p></o:p></p>

<p class=MsoNormal>-             
//NDIS_TCP_IP_CHECKSUM_PACKET_INFO       
chksum;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS                        
status;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t                           
pkt_filter;<o:p></o:p></p>

<p class=MsoNormal>+    //NDIS60<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO   chksum;<o:p></o:p></p>

<p class=MsoNormal>+    //NDIS_TCP_IP_CHECKSUM_PACKET_INFO 
chksum;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetNdisPkt );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetNdisPkt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
pkt_filter = p_port->p_adapter->packet_filter;<o:p></o:p></p>

<p class=MsoNormal>-             
/* Check the packet filter. */<o:p></o:p></p>

<p class=MsoNormal>-             
switch( p_desc->type )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-             
case PKT_TYPE_UCAST:<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>

<p class=MsoNormal>-                                             
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></p>

<p class=MsoNormal>-                                             
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></p>

<p class=MsoNormal>-                                             
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* OK to report. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received UCAST PKT.\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
case PKT_TYPE_BCAST:<o:p></o:p></p>

<p class=MsoNormal>-                             
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>

<p class=MsoNormal>-                                             
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* OK to report. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received BCAST PKT.\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
case PKT_TYPE_MCAST:<o:p></o:p></p>

<p class=MsoNormal>-                             
if( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>

<p class=MsoNormal>-                                             
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></p>

<p class=MsoNormal>-                                             
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* OK to report. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received UCAST PKT.\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    pkt_filter =
p_port->p_adapter->packet_filter;<o:p></o:p></p>

<p class=MsoNormal>+    /* Check the packet filter. */<o:p></o:p></p>

<p class=MsoNormal>+    switch( p_desc->type )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+    case PKT_TYPE_UCAST:<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>

<p class=MsoNormal>+           
pkt_filter & NDIS_PACKET_TYPE_ALL_FUNCTIONAL ||<o:p></o:p></p>

<p class=MsoNormal>+           
pkt_filter & NDIS_PACKET_TYPE_SOURCE_ROUTING ||<o:p></o:p></p>

<p class=MsoNormal>+           
pkt_filter & NDIS_PACKET_TYPE_DIRECTED )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* OK to report. */<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received UCAST PKT.\n"));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Received UCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    case PKT_TYPE_BCAST:<o:p></o:p></p>

<p class=MsoNormal>+        if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>

<p class=MsoNormal>+           
pkt_filter & NDIS_PACKET_TYPE_BROADCAST )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* OK to report. */<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received BCAST PKT.\n"));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received BCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    case PKT_TYPE_MCAST:<o:p></o:p></p>

<p class=MsoNormal>+        if( pkt_filter
& NDIS_PACKET_TYPE_PROMISCUOUS ||<o:p></o:p></p>

<p class=MsoNormal>+           
pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ||<o:p></o:p></p>

<p class=MsoNormal>+           
pkt_filter & NDIS_PACKET_TYPE_MULTICAST )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* OK to report. */<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_RECV,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received UCAST PKT.\n"));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received MCAST PKT with ERROR !!!!\n"));<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Return the receive descriptor to the pool. */<o:p></o:p></p>

<p class=MsoNormal>-                             
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Packet filter doesn't match receive.  Dropping.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Return IB_NOT_DONE since the packet has been completed,<o:p></o:p></p>

<p class=MsoNormal>-                             
* but has not consumed an array entry.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_NOT_DONE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Return the
receive descriptor to the pool. */<o:p></o:p></p>

<p class=MsoNormal>+       
__buf_mgr_put_recv( p_port, p_desc, NULL );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Packet filter doesn't match receive.  Dropping.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Return
IB_NOT_DONE since the packet has been completed,<o:p></o:p></p>

<p class=MsoNormal>+         * but has
not consumed an array entry.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_NOT_DONE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( GetNdisPkt );<o:p></o:p></p>

<p class=MsoNormal>-             
*pp_net_buffer_list = __buf_mgr_get_NBL( p_port, p_desc );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !*pp_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( GetNdisPkt );<o:p></o:p></p>

<p class=MsoNormal>+    *pp_net_buffer_list = __buf_mgr_get_NBL(
p_port, p_desc );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, GetNdisPkt );<o:p></o:p></p>

<p class=MsoNormal>+    if( !*pp_net_buffer_list )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__buf_mgr_get_NBL failed\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
chksum.Value = 0;<o:p></o:p></p>

<p class=MsoNormal>+    chksum.Value = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_DATA_LENGTH(NetBuffer) = p_desc->len;<o:p></o:p></p>

<p class=MsoNormal>+    PNET_BUFFER NetBuffer =
NET_BUFFER_LIST_FIRST_NB(*pp_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>+    NET_BUFFER_DATA_LENGTH(NetBuffer) =
p_desc->len;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
switch( p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
  default:<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
  case CSUM_DISABLED:<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = <o:p></o:p></p>

<p class=MsoNormal>-                             
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
  case CSUM_ENABLED:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Get the checksums directly from packet information. */<o:p></o:p></p>

<p class=MsoNormal>-                             
/* In this case, no one of cheksum's cat get false value */<o:p></o:p></p>

<p class=MsoNormal>-                             
/* If hardware checksum failed or wasn't calculated, NDIS will recalculate it
again */<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =<o:p></o:p></p>

<p class=MsoNormal>-                                             
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
  case CSUM_BYPASS:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Flag the checksums as having been calculated. */<o:p></o:p></p>

<p class=MsoNormal>-                             
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></p>

<p class=MsoNormal>-                             
chksum.Receive.UdpChecksumSucceeded = <o:p></o:p></p>

<p class=MsoNormal>-                             
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =<o:p></o:p></p>

<p class=MsoNormal>-                             
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    switch(
p_port->p_adapter->params.recv_chksum_offload )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+      default:<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT( FALSE
);<o:p></o:p></p>

<p class=MsoNormal>+      case CSUM_DISABLED:<o:p></o:p></p>

<p class=MsoNormal>+       
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) = <o:p></o:p></p>

<p class=MsoNormal>+       
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+      case CSUM_ENABLED:<o:p></o:p></p>

<p class=MsoNormal>+        /* Get the
checksums directly from packet information. */<o:p></o:p></p>

<p class=MsoNormal>+        /* In this case,
no one of cheksum's cat get false value */<o:p></o:p></p>

<p class=MsoNormal>+        /* If hardware
checksum failed or wasn't calculated, NDIS will recalculate it again */<o:p></o:p></p>

<p class=MsoNormal>+   
    NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo)
=<o:p></o:p></p>

<p class=MsoNormal>+           
(void*)(uintn_t)(p_desc->ndis_csum.Value);<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+      case CSUM_BYPASS:<o:p></o:p></p>

<p class=MsoNormal>+        /* Flag the
checksums as having been calculated. */<o:p></o:p></p>

<p class=MsoNormal>+       
chksum.Receive.TcpChecksumSucceeded = <o:p></o:p></p>

<p class=MsoNormal>+        chksum.Receive.UdpChecksumSucceeded
= <o:p></o:p></p>

<p class=MsoNormal>+       
chksum.Receive.IpChecksumSucceeded = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+       
NET_BUFFER_LIST_INFO(*pp_net_buffer_list, TcpIpChecksumNetBufferListInfo) =<o:p></o:p></p>

<p class=MsoNormal>+       
(void*)(uintn_t)chksum.Value;<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static uint32_t<o:p></o:p></p>

<p class=MsoNormal> __recv_mgr_build_NBL_array(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
cl_qlist_t*    
                                     
p_done_list OPTIONAL,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
int32_t* const                                                  
p_discarded)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT        
cl_qlist_t*                
p_done_list OPTIONAL,<o:p></o:p></p>

<p class=MsoNormal>+        OUT        
int32_t*
const             
p_discarded)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_list_item_t                                   
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_recv_desc_t                         
*p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                                              
i = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PreparePkt );<o:p></o:p></p>

<p class=MsoNormal>+   
cl_list_item_t          *p_item;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_recv_desc_t       *p_desc;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t               
i = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_api_status_t         status;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PreparePkt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*p_discarded = 0;<o:p></o:p></p>

<p class=MsoNormal>+    *p_discarded = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Move any existing receives to the head of p_done_list to preserve ordering.
*/<o:p></o:p></p>

<p class=MsoNormal>-             
if ( p_done_list ) {<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list );<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
p_done_list = &p_port->recv_mgr.done_list;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_item != cl_qlist_end( p_done_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc = (ipoib_recv_desc_t*)p_item;<o:p></o:p></p>

<p class=MsoNormal>+    /* Move any existing receives to the
head of p_done_list to preserve ordering. */<o:p></o:p></p>

<p class=MsoNormal>+    if ( p_done_list ) {<o:p></o:p></p>

<p class=MsoNormal>+       
cl_qlist_insert_list_head( p_done_list, &p_port->recv_mgr.done_list );<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+        p_done_list =
&p_port->recv_mgr.done_list;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qlist_remove_head(
p_done_list );<o:p></o:p></p>

<p class=MsoNormal>+    while( p_item != cl_qlist_end(
p_done_list ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_desc =
(ipoib_recv_desc_t*)p_item;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( PreparePkt );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __recv_mgr_prepare_NBL( p_port, p_desc,<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, PreparePkt );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
PreparePkt );<o:p></o:p></p>

<p class=MsoNormal>+        status = __recv_mgr_prepare_NBL(
p_port, p_desc,<o:p></o:p></p>

<p class=MsoNormal>+           
&p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, PreparePkt );<o:p></o:p></p>

<p class=MsoNormal>+        if( status ==
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( p_port->recv_mgr.recv_NBL_array[i] );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if (i) {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
// Link NBLs together<o:p></o:p></p>

<p class=MsoNormal>-                                                             
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) = <o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
i++;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( status == IB_NOT_DONE )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
(*p_discarded)++;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Put all completed receives on the port's done list. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list );<o:p></o:p></p>

<p class=MsoNormal>-                                             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
if (i) {<o:p></o:p></p>

<p class=MsoNormal>+               
// Link NBLs together<o:p></o:p></p>

<p class=MsoNormal>+               
NET_BUFFER_LIST_NEXT_NBL(p_port->recv_mgr.recv_NBL_array[i-1]) = <o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->recv_mgr.recv_NBL_array[i];<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+           
i++;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if( status
== IB_NOT_DONE )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
(*p_discarded)++;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("__recv_mgr_prepare_NBL returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+           
/* Put all completed receives on the port's done list. */<o:p></o:p></p>

<p class=MsoNormal>+           
if ( p_done_list != &p_port->recv_mgr.done_list) {<o:p></o:p></p>

<p class=MsoNormal>+               
cl_qlist_insert_tail( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>

<p class=MsoNormal>+               
cl_qlist_insert_list_tail( &p_port->recv_mgr.done_list, p_done_list );<o:p></o:p></p>

<p class=MsoNormal>+           
} else {<o:p></o:p></p>

<p class=MsoNormal>+               
cl_qlist_insert_head( &p_port->recv_mgr.done_list, p_item );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = cl_qlist_remove_head( p_done_list );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
cl_qlist_remove_head( p_done_list );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>-             
return i;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_RECV );<o:p></o:p></p>

<p class=MsoNormal>+    return i;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -3234,180 +3281,180 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->send_mgr.depth = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_construct( &p_port->send_mgr.send_pool );<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_desc = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->send_mgr.depth = 0;<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init(
&p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qpool_construct(
&p_port->send_mgr.send_pool );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_desc = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status_t                         
cl_status;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER(IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    cl_status_t    
cl_status;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER(IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
static const size_t cPoolDeltaSize(1024);<o:p></o:p></p>

<p class=MsoNormal>-             
static const ULONG        
MaxNumBuffers(16384);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the pool for async NETBUF flow (process_sg_list) */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_qpool_init( &p_port->send_mgr.sg_pool,<o:p></o:p></p>

<p class=MsoNormal>-                             
MaxNumBuffers,<o:p></o:p></p>

<p class=MsoNormal>-                             
0, cPoolDeltaSize, sizeof(cl_pool_item_t) + p_port->p_adapter->sg_list_size,
NULL, NULL, p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return  IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    static const size_t
cPoolDeltaSize(1024);<o:p></o:p></p>

<p class=MsoNormal>+    static const ULONG 
MaxNumBuffers(16384);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the pool for async NETBUF
flow (process_sg_list) */<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_qpool_init(
&p_port->send_mgr.sg_pool,<o:p></o:p></p>

<p class=MsoNormal>+        MaxNumBuffers,<o:p></o:p></p>

<p class=MsoNormal>+        0,
cPoolDeltaSize, sizeof(cl_pool_item_t) + p_port->p_adapter->sg_list_size,
NULL, NULL, p_port );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>

<p class=MsoNormal>+           
cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+        return 
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_qpool_init( &p_port->send_mgr.send_pool,<o:p></o:p></p>

<p class=MsoNormal>-                             
MaxNumBuffers,<o:p></o:p></p>

<p class=MsoNormal>-                             
0, cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>

<p class=MsoNormal>-                             
               
cl_status) );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_status = cl_qpool_init(
&p_port->send_mgr.send_pool,<o:p></o:p></p>

<p class=MsoNormal>+        MaxNumBuffers,<o:p></o:p></p>

<p class=MsoNormal>+        0,
cPoolDeltaSize, sizeof(ipoib_send_NB_SG), NULL, NULL, p_port );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_RECV_POOL, 1, cl_status ); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("cl_qpool_init for sends returned %#x\n",<o:p></o:p></p>

<p class=MsoNormal>+           
cl_status) );<o:p></o:p></p>

<p class=MsoNormal>+       
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//This send descriptor can't be allocated on the stack because of boundary
violation !!!<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_desc =  <o:p></o:p></p>

<p class=MsoNormal>-                                             
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></p>

<p class=MsoNormal>-             
if (!p_port->p_desc) {<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Allocation of  send descriptor failed\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    //This send descriptor can't be
allocated on the stack because of boundary violation !!!<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_desc =  <o:p></o:p></p>

<p class=MsoNormal>+           
(ipoib_send_desc_t *)ExAllocatePoolWithTag(NonPagedPool ,sizeof
(ipoib_send_desc_t), 'XMXA');<o:p></o:p></p>

<p class=MsoNormal>+    if (!p_port->p_desc) {<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_RECV_POOL, 1, CL_INSUFFICIENT_MEMORY); //TODO EVENT_IPOIB_SEND_POOL<o:p></o:p></p>

<p class=MsoNormal>+
       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Allocation of  send descriptor failed\n") );<o:p></o:p></p>

<p class=MsoNormal>+       
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>

<p class=MsoNormal>+       
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void <o:p></o:p></p>

<p class=MsoNormal> __pending_list_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_list_item_t                   
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_list_item_t      *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG   
*s_buf;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG              
send_complete_flags = NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Complete any pending packets. */<o:p></o:p></p>

<p class=MsoNormal>-             
for( p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(s_buf->p_port == p_port);<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>+    /* Complete any pending packets. */<o:p></o:p></p>

<p class=MsoNormal>+    for( p_item = cl_qlist_remove_head(
&p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+        p_item !=
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
cl_qlist_remove_head( &p_port->send_mgr.pending_list ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>

<p class=MsoNormal>+       
ASSERT(s_buf->p_port == p_port);<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
//TODO<o:p></o:p></p>

<p class=MsoNormal>-                             
//__send_complete_net_buffer(s_buf, NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                             
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        //TODO<o:p></o:p></p>

<p class=MsoNormal>+       
//__send_complete_net_buffer(s_buf,
NDIS_STATUS_RESET_IN_PROGRESS,send_complete_flags,TRUE);<o:p></o:p></p>

<p class=MsoNormal>+       
__send_complete_net_buffer(s_buf,
NDIS_STATUS_FAILURE,send_complete_flags,TRUE);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>   <o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
//Destroy pending list and put all the send buffers back to pool<o:p></o:p></p>

<p class=MsoNormal>-             
//The list should be already destroyed at this point<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
__pending_list_destroy(p_port);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    //Destroy pending list and put all the
send buffers back to pool<o:p></o:p></p>

<p class=MsoNormal>+    //The list should be already destroyed
at this point<o:p></o:p></p>

<p class=MsoNormal>+   
ASSERT(p_port->send_mgr.pending_list.count == 0);<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    __pending_list_destroy(p_port);<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
// Now, destroy the send pool<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>+    // Now, destroy the send pool<o:p></o:p></p>

<p class=MsoNormal>+   
cl_qpool_destroy(&p_port->send_mgr.send_pool);<o:p></o:p></p>

<p class=MsoNormal>+   
cl_qpool_destroy(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//Now, free port descriptor<o:p></o:p></p>

<p class=MsoNormal>-             
if (p_port->p_desc)<o:p></o:p></p>

<p class=MsoNormal>-                             
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></p>

<p class=MsoNormal>+    //Now, free port descriptor<o:p></o:p></p>

<p class=MsoNormal>+    if (p_port->p_desc)<o:p></o:p></p>

<p class=MsoNormal>+       
ExFreePoolWithTag(p_port->p_desc, 'XMXA');<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//Lookaside list will be destroyed in __buf_mgr_destroy<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    //Lookaside list will be destroyed in
__buf_mgr_destroy<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*
const                                                                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG                                       
*s_buf)<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+    IN             
MDL*
const                 
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT        
ipoib_send_NB_SG           
*s_buf)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                   
status;<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_STATUS    
status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( FilterIp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( FilterArp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendGen );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( FilterIp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( FilterArp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendGen );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* We already checked the ethernet header length, so we know it's safe<o:p></o:p></p>

<p class=MsoNormal>-             
* to decrement the buf_len without underflowing.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * We already checked the ethernet
header length, so we know it's safe<o:p></o:p></p>

<p class=MsoNormal>+     * to decrement the buf_len without
underflowing.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( p_eth_hdr->type )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case ETH_PROT_TYPE_IP:<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( FilterIp );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, FilterIp );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    switch( p_eth_hdr->type )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    case ETH_PROT_TYPE_IP:<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
FilterIp );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_mgr_filter_ip( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, FilterIp );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case ETH_PROT_TYPE_ARP:<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( FilterArp );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, FilterArp );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    case ETH_PROT_TYPE_ARP:<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
FilterArp );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_mgr_filter_arp( p_eth_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, FilterArp );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* The IPoIB spec doesn't define how to send non IP or ARP packets.<o:p></o:p></p>

<p class=MsoNormal>-                             
* Just send the payload and hope for the best.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * The
IPoIB spec doesn't define how to send non IP or ARP packets.<o:p></o:p></p>

<p class=MsoNormal>+         * Just
send the payload and hope for the best.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( SendGen );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_gen( s_buf, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, SendGen );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
SendGen );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_gen( s_buf, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, SendGen );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -3416,7 +3463,7 @@<o:p></o:p></p>

<p class=MsoNormal> ULONG <o:p></o:p></p>

<p class=MsoNormal> CopyNetBuffer(<o:p></o:p></p>

<p class=MsoNormal>     PNET_BUFFER NetBuffer,<o:p></o:p></p>

<p class=MsoNormal>-   
PUCHAR                        
pDest<o:p></o:p></p>

<p class=MsoNormal>+   
PUCHAR       pDest<o:p></o:p></p>

<p class=MsoNormal>     ) <o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>     ULONG  BytesCopied = 0;<o:p></o:p></p>

<p class=MsoNormal>@@ -3429,12 +3476,12 @@<o:p></o:p></p>

<p class=MsoNormal>     ULONG Offset =
NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);<o:p></o:p></p>

<p class=MsoNormal>     ULONG DataLength =
NET_BUFFER_DATA_LENGTH(NetBuffer);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if (DataLength > MAX_LSO_PAYLOAD_MTU) {<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Can't copy buffer of %d because of 64K limitation\n", DataLength));<o:p></o:p></p>

<p class=MsoNormal>-                             
return 0;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if (DataLength > MAX_LSO_PAYLOAD_MTU)
{<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Can't copy buffer of %d because of 64K limitation\n", DataLength));<o:p></o:p></p>

<p class=MsoNormal>+        return 0;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>     while (CurrentMdl &&
DataLength > 0)<o:p></o:p></p>

<p class=MsoNormal>     {<o:p></o:p></p>

<p class=MsoNormal>@@ -3507,93 +3554,93 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_copy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_NB_SG *                                    
s_buf,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
UINT                                                                                     
lso_header_size)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_NB_SG *          s_buf,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
UINT                       
lso_header_size)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                                
tot_len = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG                  
tot_len = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf = <o:p></o:p></p>

<p class=MsoNormal>-                             
(send_buf_t *) NdisAllocateFromNPagedLookasideList(
&p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
tot_len = CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) s_buf->p_send_buf);<o:p></o:p></p>

<p class=MsoNormal>-             
if (tot_len <= lso_header_size) {<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(tot_len > lso_header_size);<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
//TODO Do not copy the ETH header <o:p></o:p></p>

<p class=MsoNormal>-             
/* Setup the work request. */<o:p></o:p></p>

<p class=MsoNormal>-             
int seg_index = lso_header_size ? 0 : 1;<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf = <o:p></o:p></p>

<p class=MsoNormal>+        (send_buf_t *)
NdisAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>+    if( !s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to allocate buffer for packet copy.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    tot_len =
CopyNetBuffer(s_buf->p_curr_nb, (PUCHAR) s_buf->p_send_buf);<o:p></o:p></p>

<p class=MsoNormal>+    if (tot_len <= lso_header_size) {<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(tot_len
> lso_header_size);<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    //TODO Do not copy the ETH header <o:p></o:p></p>

<p class=MsoNormal>+    /* Setup the work request. */<o:p></o:p></p>

<p class=MsoNormal>+    int seg_index = lso_header_size ? 0 : 1;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[seg_index].vaddr = cl_get_physaddr(<o:p></o:p></p>

<p class=MsoNormal>-                             
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[seg_index].length = tot_len - lso_header_size;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[seg_index].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.num_ds = seg_index+1;<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[0].local_ds[seg_index].vaddr = cl_get_physaddr(<o:p></o:p></p>

<p class=MsoNormal>+       
((uint8_t*)s_buf->p_send_buf) + lso_header_size );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[seg_index].length
= tot_len - lso_header_size;<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[0].local_ds[seg_index].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds =
seg_index+1;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_get_eth_hdr(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
PNET_BUFFER                                                                  
p_net_buffer,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
MDL**
const                                                                    
pp_mdl,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_hdr_t**
const                                         
pp_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
UINT*                                                                                  
p_mdl_len)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
PNET_BUFFER                
p_net_buffer,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         MDL**
const                
pp_mdl,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_hdr_t**
const           pp_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT        
UINT*                      
p_mdl_len)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
PUCHAR              
p_head = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    PUCHAR  p_head = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_mdl             
= NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></p>

<p class=MsoNormal>+    *pp_mdl =
NET_BUFFER_FIRST_MDL(p_net_buffer);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>-             
if( ! p_head )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Failed to get first buffer. */<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("NdisQueryMdl failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    NdisQueryMdl(*pp_mdl,&p_head,p_mdl_len,NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>+    if( ! p_head )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Failed to get
first buffer. */<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("NdisQueryMdl failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ULONG MdlDataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></p>

<p class=MsoNormal>-             
*p_mdl_len -= MdlDataOffset; <o:p></o:p></p>

<p class=MsoNormal>+    ULONG MdlDataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(p_net_buffer);<o:p></o:p></p>

<p class=MsoNormal>+    *p_mdl_len -=
MdlDataOffset;    <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( *p_mdl_len < sizeof(eth_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
*p_mdl_len) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( *p_mdl_len < sizeof(eth_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("First buffer in packet smaller than eth_hdr_t: %d.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
*p_mdl_len) );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_eth_hdr = (eth_hdr_t*)(p_head + MdlDataOffset);<o:p></o:p></p>

<p class=MsoNormal>+    *pp_eth_hdr = (eth_hdr_t*)(p_head +
MdlDataOffset);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                             
("Ethernet header:\n"<o:p></o:p></p>

<p class=MsoNormal>-                             
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>

<p class=MsoNormal>-                             
"\tdst MAC: %02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>

<p class=MsoNormal>-                             
"\tprotocol type: %04X\n",<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_ntoh16( (*pp_eth_hdr)->type )) );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+        ("Ethernet
header:\n"<o:p></o:p></p>

<p class=MsoNormal>+        "\tsrc MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>

<p class=MsoNormal>+        "\tdst MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n"<o:p></o:p></p>

<p class=MsoNormal>+        "\tprotocol
type: %04X\n",<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_eth_hdr)->src.addr[0], (*pp_eth_hdr)->src.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_eth_hdr)->src.addr[2], (*pp_eth_hdr)->src.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_eth_hdr)->src.addr[4], (*pp_eth_hdr)->src.addr[5],<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_eth_hdr)->dst.addr[0], (*pp_eth_hdr)->dst.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_eth_hdr)->dst.addr[2], (*pp_eth_hdr)->dst.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_eth_hdr)->dst.addr[4], (*pp_eth_hdr)->dst.addr[5],<o:p></o:p></p>

<p class=MsoNormal>+        cl_ntoh16(
(*pp_eth_hdr)->type )) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -3601,139 +3648,139 @@<o:p></o:p></p>

<p class=MsoNormal> /* Send using the MDL's page information rather than
the SGL. */<o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __send_gen(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_desc_t* const         
p_desc )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_desc_t* const    p_desc )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                                              
i, j = 1;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                                
offset;<o:p></o:p></p>

<p class=MsoNormal>-             
MDL                                                                                      
*p_mdl;<o:p></o:p></p>

<p class=MsoNormal>-             
UINT                                                                     
num_pages, tot_len;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                                
buf_len;<o:p></o:p></p>

<p class=MsoNormal>-             
PPFN_NUMBER                                                               
page_array;<o:p></o:p></p>

<p class=MsoNormal>-             
boolean_t                                                          
hdr_done = FALSE;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
PNET_BUFFER                                                  
p_net_buf;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t               
i, j = 1;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG                  
offset;<o:p></o:p></p>

<p class=MsoNormal>+   
MDL                    
*p_mdl;<o:p></o:p></p>

<p class=MsoNormal>+   
UINT                   
num_pages, tot_len;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG                  
buf_len;<o:p></o:p></p>

<p class=MsoNormal>+   
PPFN_NUMBER            
page_array;<o:p></o:p></p>

<p class=MsoNormal>+   
boolean_t              
hdr_done = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_api_status_t         status;<o:p></o:p></p>

<p class=MsoNormal>+   
PNET_BUFFER            
p_net_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
p_net_buf = NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></p>

<p class=MsoNormal>-             
NdisQueryBuffer( p_net_buf, &num_pages, NULL, &p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-                             
&tot_len );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    p_net_buf =
NET_BUFFER_LIST_FIRST_NB(p_desc->p_netbuf_list);<o:p></o:p></p>

<p class=MsoNormal>+    NdisQueryBuffer( p_net_buf, &num_pages,
NULL, &p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+        &tot_len );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("No buffers associated with packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("No buffers associated with packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Remember that one of the DS entries is reserved for the IPoIB header. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( num_pages >= MAX_SEND_SGE )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Too many buffers to fit in WR ds_array.  Copying data.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_copy( p_port, p_desc );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Remember that one of the DS entries
is reserved for the IPoIB header. */<o:p></o:p></p>

<p class=MsoNormal>+    if( num_pages >= MAX_SEND_SGE )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+           
("Too many buffers to fit in WR ds_array.  Copying data.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_copy( p_port, p_desc );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( tot_len > sizeof(eth_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( tot_len <= p_port->p_adapter->params.xfer_block_size );<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Assume that the ethernet header is always fully contained<o:p></o:p></p>

<p class=MsoNormal>-             
* in the first page of the first MDL.  This makes for much<o:p></o:p></p>

<p class=MsoNormal>-             
* simpler code.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
offset = MmGetMdlByteOffset( p_mdl ) + sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( offset <= PAGE_SIZE );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( tot_len >
sizeof(eth_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( tot_len <=
p_port->p_adapter->params.xfer_block_size );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Assume that the ethernet header
is always fully contained<o:p></o:p></p>

<p class=MsoNormal>+     * in the first page of the first
MDL.  This makes for much<o:p></o:p></p>

<p class=MsoNormal>+     * simpler code.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    offset = MmGetMdlByteOffset( p_mdl ) +
sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( offset <= PAGE_SIZE );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
while( tot_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
buf_len = MmGetMdlByteCount( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
page_array = MmGetMdlPfnArray( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( page_array );<o:p></o:p></p>

<p class=MsoNormal>-                             
i = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !hdr_done )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Skip the ethernet header. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( buf_len )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* The ethernet header is a subset of this MDL. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
CL_ASSERT( i == 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( offset < PAGE_SIZE )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_desc->send_wr[0].local_ds[j].vaddr += offset;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
buf_len = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
/* This data segment is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
j++;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* This page is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
i++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Done handling the ethernet header. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
hdr_done = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    while( tot_len )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        buf_len =
MmGetMdlByteCount( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        page_array =
MmGetMdlPfnArray( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
page_array );<o:p></o:p></p>

<p class=MsoNormal>+        i = 0;<o:p></o:p></p>

<p class=MsoNormal>+        if( !hdr_done )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( buf_len >= sizeof(eth_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>+           
/* Skip the ethernet header. */<o:p></o:p></p>

<p class=MsoNormal>+           
buf_len -= sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( buf_len <= p_port->p_adapter->params.payload_mtu );<o:p></o:p></p>

<p class=MsoNormal>+           
if( buf_len )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/* The ethernet header is a subset of this MDL. */<o:p></o:p></p>

<p class=MsoNormal>+               
CL_ASSERT( i == 0 );<o:p></o:p></p>

<p class=MsoNormal>+               
if( offset < PAGE_SIZE )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+                   
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>

<p class=MsoNormal>+                   
/* Add the byte offset since we're on the 1st page. */<o:p></o:p></p>

<p class=MsoNormal>+       
            p_desc->send_wr[0].local_ds[j].vaddr
+= offset;<o:p></o:p></p>

<p class=MsoNormal>+                   
if( offset + buf_len > PAGE_SIZE )<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;<o:p></o:p></p>

<p class=MsoNormal>+                       
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+                   
else<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>

<p class=MsoNormal>+                       
buf_len = 0;<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+    
               /*
This data segment is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>+                   
j++;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
/* This page is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>+               
i++;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
/* Done handling the ethernet header. */<o:p></o:p></p>

<p class=MsoNormal>+           
hdr_done = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/* Finish this MDL */<o:p></o:p></p>

<p class=MsoNormal>-                             
while( buf_len )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Add the first page's offset if we're on the first page. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( i == 0 )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        /* Finish this
MDL */<o:p></o:p></p>

<p class=MsoNormal>+        while( buf_len )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);<o:p></o:p></p>

<p class=MsoNormal>+           
/* Add the first page's offset if we're on the first page. */<o:p></o:p></p>

<p class=MsoNormal>+           
if( i == 0 )<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Buffers spans pages. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* This page is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
i++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Last page of the buffer. */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
buf_len = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* This data segment is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
j++;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/* Buffers spans pages. */<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>

<p class=MsoNormal>+                   
PAGE_SIZE - MmGetMdlByteOffset( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+               
buf_len -= p_desc->send_wr[0].local_ds[j].length;<o:p></o:p></p>

<p class=MsoNormal>+               
/* This page is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>+               
i++;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/* Last page of the buffer. */<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[0].local_ds[j].length = buf_len;<o:p></o:p></p>

<p class=MsoNormal>+               
buf_len = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
/* This data segment is done.  Move to the next. */<o:p></o:p></p>

<p class=MsoNormal>+           
j++;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
tot_len -= MmGetMdlByteCount( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !tot_len )<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        tot_len -=
MmGetMdlByteCount( p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !tot_len )<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get next buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
NdisGetNextBuffer( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get next buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Set the number of data segments. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>

<p class=MsoNormal>+    /* Set the number of data segments. */<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #else<o:p></o:p></p>

<p class=MsoNormal>@@ -3750,261 +3797,261 @@<o:p></o:p></p>

<p class=MsoNormal>     IN 
PSCATTER_GATHER_LIST    p_sgl,<o:p></o:p></p>

<p class=MsoNormal>     IN 
PVOID                  
context<o:p></o:p></p>

<p class=MsoNormal>     )<o:p></o:p></p>

<p class=MsoNormal>-{            
<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
MDL                                                                                      
*p_mdl;<o:p></o:p></p>

<p class=MsoNormal>-             
eth_hdr_t                                                          
*p_eth_hdr;<o:p></o:p></p>

<p class=MsoNormal>-             
UINT                                                                     
mdl_len;<o:p></o:p></p>

<p class=MsoNormal>-             
bool ret = false;<o:p></o:p></p>

<p class=MsoNormal>+{   <o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS            
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t      
     *p_port;<o:p></o:p></p>

<p class=MsoNormal>+   
MDL                    
*p_mdl;<o:p></o:p></p>

<p class=MsoNormal>+   
eth_hdr_t              
*p_eth_hdr;<o:p></o:p></p>

<p class=MsoNormal>+   
UINT                   
mdl_len;<o:p></o:p></p>

<p class=MsoNormal>+    bool ret = false;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_send_wr_t                                  
*p_wr_failed;<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST                                          
*p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER                                                     
*p_netbuf;<o:p></o:p></p>

<p class=MsoNormal>-             
boolean_t                                                          
from_queue;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                                               
ib_status;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                                
complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_send_wr_t           
*p_wr_failed;<o:p></o:p></p>

<p class=MsoNormal>+   
NET_BUFFER_LIST        
*p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>+    NET_BUFFER             
*p_netbuf;<o:p></o:p></p>

<p class=MsoNormal>+   
boolean_t              
from_queue;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_api_status_t         ib_status;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG                  
complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(p_sgl != NULL);<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(p_sgl != NULL);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(pDO);<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(pDO);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(pIrp);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendCopy );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PostSend );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendCopy );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PostSend );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
++g_ipoib_send_SG_real;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ++g_ipoib_send_SG_real;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//Read Data from the buffer passed as a context<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG *  s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></p>

<p class=MsoNormal>-             
p_net_buffer_list = s_buf->p_nbl;<o:p></o:p></p>

<p class=MsoNormal>-             
p_netbuf =
                                       
s_buf->p_curr_nb;<o:p></o:p></p>

<p class=MsoNormal>-             
p_port =
                                            
s_buf->p_port;<o:p></o:p></p>

<p class=MsoNormal>+    //Read Data from the buffer passed as a
context<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG *  s_buf =
(ipoib_send_NB_SG *)context;<o:p></o:p></p>

<p class=MsoNormal>+    p_net_buffer_list = s_buf->p_nbl;<o:p></o:p></p>

<p class=MsoNormal>+    p_netbuf
=          s_buf->p_curr_nb;<o:p></o:p></p>

<p class=MsoNormal>+    p_port
=            s_buf->p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+               
("Processing netbuffer list: %p \n", p_net_buffer_list) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//TODO Define this function as void if we are not in DBG mode<o:p></o:p></p>

<p class=MsoNormal>-             
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+    //TODO Define this function as void if
we are not in DBG mode<o:p></o:p></p>

<p class=MsoNormal>+    //cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_SET_SEND_COMPLETE_FLAG(complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_desc->p_netbuf_list = p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_desc->p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_desc->num_wrs = 1;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_desc->p_netbuf_list =
p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_desc->p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_desc->num_wrs = 1;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Get the ethernet header so we can find the endpoint. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __send_mgr_get_eth_hdr(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_netbuf, &p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+                       
("\nRECEIVED NB= %p with SG= %p\n********\n", p_netbuf, p_sgl) );<o:p></o:p></p>

<p class=MsoNormal>+    /* Get the ethernet header so we can find
the endpoint. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>+    status = __send_mgr_get_eth_hdr(<o:p></o:p></p>

<p class=MsoNormal>+        p_netbuf,
&p_mdl, &p_eth_hdr, &mdl_len );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* fail  net buffer */<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process
SG list\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                             
ret = true;<o:p></o:p></p>

<p class=MsoNormal>-                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
from_queue = (boolean_t)(s_buf->p_sgl != NULL);<o:p></o:p></p>

<p class=MsoNormal>-             
if (from_queue)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst,
&(p_port->p_desc->p_endpt) );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called
for %p\n", p_port->p_desc->p_endpt));<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status == NDIS_STATUS_PENDING )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
s_buf->p_sgl = p_sgl;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(cl_list_item_t*)s_buf  );<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this
item back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></p>

<p class=MsoNormal>-                                             
ret = false;<o:p></o:p></p>

<p class=MsoNormal>-                                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+        /* fail 
net buffer */<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("Failed send inside process SG
list\n"));<o:p></o:p></p>

<p class=MsoNormal>+       
__send_complete_net_buffer(s_buf, status, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+        ret = true;<o:p></o:p></p>

<p class=MsoNormal>+        goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    from_queue = (boolean_t)(s_buf->p_sgl
!= NULL);<o:p></o:p></p>

<p class=MsoNormal>+    if (from_queue)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__endpt_mgr_ref( p_port, p_eth_hdr->dst,
&(p_port->p_desc->p_endpt) );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_port->p_desc->p_endpt));<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+        if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
s_buf->p_sgl = p_sgl;<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_head( &p_port->send_mgr.pending_list,<o:p></o:p></p>

<p class=MsoNormal>+               
(cl_list_item_t*)s_buf  );<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("We insert this
item back to the pending list: %p \n", p_net_buffer_list));<o:p></o:p></p>

<p class=MsoNormal>+           
ret = false;<o:p></o:p></p>

<p class=MsoNormal>+           
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if( status
!= NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc
packet (from the queue) %p\n", p_net_buffer_list));<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
s_buf->p_sgl = p_sgl;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this
MULTICAST item back to the pending list: %p \n",
p_net_buffer_list));                                                                 
<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*)
s_buf  );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ret = false;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
++g_ipoib_send_SG_pending;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>

<p class=MsoNormal>-                                             
* sends to fail.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and
the packet had not been sent\n"));<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+           
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("recived a mc
packet (from the queue) %p\n", p_net_buffer_list));<o:p></o:p></p>

<p class=MsoNormal>+               
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst,<o:p></o:p></p>

<p class=MsoNormal>+                   
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
s_buf->p_sgl = p_sgl;<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("We insert this
MULTICAST item back to the pending list: %p \n", p_net_buffer_list));                   
<o:p></o:p></p>

<p class=MsoNormal>+                   
cl_qlist_insert_head( &p_port->send_mgr.pending_list, (cl_list_item_t*)
s_buf  );<o:p></o:p></p>

<p class=MsoNormal>+                   
ret = false;<o:p></o:p></p>

<p class=MsoNormal>+                   
++g_ipoib_send_SG_pending;<o:p></o:p></p>

<p class=MsoNormal>+                   
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>

<p class=MsoNormal>+            
* sends to fail.<o:p></o:p></p>

<p class=MsoNormal>+       
     */<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,("We got bad status and
the packet had not been sent\n"));<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
ret = true;<o:p></o:p></p>

<p class=MsoNormal>-                                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else //We got this Net Buffer and its SG list directly from NDIS<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_sgl = p_sgl;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>-                             
if ( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>

<p class=MsoNormal>-                                             
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>+           
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>+           
ret = true;<o:p></o:p></p>

<p class=MsoNormal>+           
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else //We got this Net Buffer and its SG
list directly from NDIS<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ASSERT(s_buf->p_sgl ==NULL);<o:p></o:p></p>

<p class=MsoNormal>+        s_buf->p_sgl
= p_sgl;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>+        if (
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) && <o:p></o:p></p>

<p class=MsoNormal>+            
p_eth_hdr->type == ETH_PROT_TYPE_IP &&<o:p></o:p></p>

<p class=MsoNormal>+            
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) ) <o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+               
("recived a Multicast NBL= %p\n", p_net_buffer_list) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
ip_hdr_t                                             
*p_ip_hdr;<o:p></o:p></p>

<p class=MsoNormal>-                                             
uint8_t                                                
*p_tmp;<o:p></o:p></p>

<p class=MsoNormal>-                                             
MDL                                                                      
*p_ip_hdr_mdl;<o:p></o:p></p>

<p class=MsoNormal>-                                             
UINT                                                     
ip_hdr_mdl_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
g_ipoib_send_mcast++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></p>

<p class=MsoNormal>-                                                             
// Extract the ip hdr <o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( !p_ip_hdr_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("Failed to get IP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
goto mc_end;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( !p_tmp )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("Failed to get IP header.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
goto mc_end;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}                                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
/* This buffer is done for.  Get the next buffer. */<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("Buffer too small for IP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
goto mc_end;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_ip_hdr = (ip_hdr_t*)(p_tmp + NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></p>

<p class=MsoNormal>-                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] &
0x0f;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+           
ip_hdr_t           
*p_ip_hdr;<o:p></o:p></p>

<p class=MsoNormal>+         
  uint8_t            
*p_tmp;<o:p></o:p></p>

<p class=MsoNormal>+           
MDL                
*p_ip_hdr_mdl;<o:p></o:p></p>

<p class=MsoNormal>+           
UINT               
ip_hdr_mdl_len;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
g_ipoib_send_mcast++;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
if(mdl_len >= sizeof(ip_hdr_t) + sizeof(eth_hdr_t))<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
NdisGetNextMdl(p_mdl,&p_ip_hdr_mdl);<o:p></o:p></p>

<p class=MsoNormal>+               
// Extract the ip hdr <o:p></o:p></p>

<p class=MsoNormal>+               
if( !p_ip_hdr_mdl )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("Failed to get IP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+                   
goto mc_end;<o:p></o:p></p>

<p class=MsoNormal>+               
}   <o:p></o:p></p>

<p class=MsoNormal>+               
NdisQueryMdl(p_ip_hdr_mdl,&p_tmp,&ip_hdr_mdl_len,NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>+               
if( !p_tmp )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("Failed to get IP header.\n") );<o:p></o:p></p>

<p class=MsoNormal>+                   
goto mc_end;<o:p></o:p></p>

<p class=MsoNormal>+               
}                  
<o:p></o:p></p>

<p class=MsoNormal>+               
if( ip_hdr_mdl_len < sizeof(ip_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
/* This buffer is done for.  Get the next buffer. */<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("Buffer too small for IP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+                   
goto mc_end;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
p_ip_hdr = (ip_hdr_t*)(p_tmp + NET_BUFFER_CURRENT_MDL_OFFSET(p_netbuf));<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
p_eth_hdr->dst.addr[1] = ((unsigned char*)&p_ip_hdr->dst_ip)[0] &
0x0f;<o:p></o:p></p>

<p class=MsoNormal>+           
p_eth_hdr->dst.addr[3] = ((unsigned char*)&p_ip_hdr->dst_ip)[1];<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> mc_end:<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(s_buf->p_sgl);<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_mgr_queue( p_port, p_eth_hdr, &(p_port->p_desc->p_endpt)
);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status == NDIS_STATUS_PENDING )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Queue net buffer list. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>+     
  ASSERT(s_buf->p_sgl);<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_mgr_queue( p_port, p_eth_hdr, &(p_port->p_desc->p_endpt) );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>+        if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* Queue net buffer list. */<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( QueuePacket );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,
(cl_list_item_t*)s_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB
first time to the pending list\n", p_netbuf));<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>-                                             
++g_ipoib_send_SG_pending;<o:p></o:p></p>

<p class=MsoNormal>-                                             
ret = false;<o:p></o:p></p>

<p class=MsoNormal>-                                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>

<p class=MsoNormal>-                                             
* sends to fail.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
//TODO - check previous comment !<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                                             
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ret = true;<o:p></o:p></p>

<p class=MsoNormal>-                                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __build_send_desc( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,
(cl_list_item_t*)s_buf );<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND, ("Inserting %p NB
first time to the pending list\n", p_netbuf));<o:p></o:p></p>

<p class=MsoNormal>+   
        <o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>+           
++g_ipoib_send_SG_pending;<o:p></o:p></p>

<p class=MsoNormal>+           
ret = false;<o:p></o:p></p>

<p class=MsoNormal>+           
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* Complete the send as if we sent it - WHQL tests don't like the<o:p></o:p></p>

<p class=MsoNormal>+            
* sends to fail.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+            
//TODO - check previous comment !<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+           
__send_complete_net_buffer(s_buf, NDIS_STATUS_SUCCESS, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+           
ret = true;<o:p></o:p></p>

<p class=MsoNormal>+           
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>+    status = __build_send_desc( p_eth_hdr,
p_mdl, mdl_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop( &p_port->p_adapter->perf,
BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-//                         
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                             
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                             
ret = true;<o:p></o:p></p>

<p class=MsoNormal>-                             
goto send_end;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+//      ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+       
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+        ret = true;<o:p></o:p></p>

<p class=MsoNormal>+        goto send_end;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Post the WR. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( PostSend );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("sending packet with wr-id
=0x%p\n",p_net_buffer_list ));<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
ib_status = p_port->p_adapter->p_ifc->post_send(
p_port->ib_mgr.h_qp, &(p_port->p_desc->send_wr[0].wr),
&p_wr_failed );<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->n_no_progress = 0; // IPoIB can send, reset the failure counter<o:p></o:p></p>

<p class=MsoNormal>-             
ret = true;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, PostSend );<o:p></o:p></p>

<p class=MsoNormal>-             
if( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_post_send returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                             
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Flag the adapter as hung since posting is busted. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
++g_ipoib_send;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_atomic_inc( &p_port->send_mgr.depth );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Post the WR. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( PostSend );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND, ("sending packet with wr-id
=0x%p\n",p_net_buffer_list ));<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ib_status =
p_port->p_adapter->p_ifc->post_send( p_port->ib_mgr.h_qp,
&(p_port->p_desc->send_wr[0].wr), &p_wr_failed );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->n_no_progress = 0; // IPoIB
can send, reset the failure counter<o:p></o:p></p>

<p class=MsoNormal>+    ret = true;<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, PostSend );<o:p></o:p></p>

<p class=MsoNormal>+    if( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_post_send returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( ib_status )) );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+       
__send_complete_net_buffer(s_buf, NDIS_STATUS_FAILURE, complete_flags, TRUE);<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+        /* Flag the
adapter as hung since posting is busted. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+        ++g_ipoib_send;<o:p></o:p></p>

<p class=MsoNormal>+        cl_atomic_inc(
&p_port->send_mgr.depth );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-send_end:                       
<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+send_end:       <o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
return ret;<o:p></o:p></p>

<p class=MsoNormal>+    return ret;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -4018,486 +4065,486 @@<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG *  s_buf = (ipoib_send_NB_SG *)context;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t* p_port =
                                               
s_buf->p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG *  s_buf =
(ipoib_send_NB_SG *)context;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t* p_port
=          s_buf->p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
++g_ipoib_send_SG;<o:p></o:p></p>

<p class=MsoNormal>-             
if (g_ipoib_send_SG > 2) {<o:p></o:p></p>

<p class=MsoNormal>-                             
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+
g_ipoib_send_SG_failed);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_process_sg_list_real(pDO, pIrp, p_sgl, context);<o:p></o:p></p>

<p class=MsoNormal>-             
if (g_ipoib_send_SG > 1) {<o:p></o:p></p>

<p class=MsoNormal>-                             
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send + g_ipoib_send_mcast+p_port->send_mgr.pending_list.count
+ g_ipoib_send_SG_failed);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    ++g_ipoib_send_SG;<o:p></o:p></p>

<p class=MsoNormal>+    if (g_ipoib_send_SG > 2) {<o:p></o:p></p>

<p class=MsoNormal>+       
//ASSERT(g_ipoib_send_SG-2 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count+
g_ipoib_send_SG_failed);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_process_sg_list_real(pDO, pIrp,
p_sgl, context);<o:p></o:p></p>

<p class=MsoNormal>+    if (g_ipoib_send_SG > 1) {<o:p></o:p></p>

<p class=MsoNormal>+       
//ASSERT(g_ipoib_send_SG-1 <= g_ipoib_send +
g_ipoib_send_mcast+p_port->send_mgr.pending_list.count +
g_ipoib_send_SG_failed);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release( &p_port->send_lock
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_gen(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_NB_SG *                                    
s_buf,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
INT                                                                                                        
lso_data_index,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
UINT                                                                                     
lso_header_size OPTIONAL)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_NB_SG *          s_buf,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
INT                        
lso_data_index,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
UINT                       
lso_header_size OPTIONAL)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                              
i, j
                         
= 1;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG
                                               
DataOffset          = 0;
        <o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                              
EthHeaderOffset
                           
= sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
static const         EthIPoIBHeaderOffset
  = EthHeaderOffset - sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendCopy );<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_STATUS    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t        i,
j        = 1;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG          
DataOffset  = 0;    <o:p></o:p></p>

<p class=MsoNormal>+ 
  uint32_t       
EthHeaderOffset         =
sizeof(eth_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    static const    EthIPoIBHeaderOffset   
= EthHeaderOffset - sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendCopy );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PSCATTER_GATHER_LIST             
p_sgl = s_buf->p_sgl;<o:p></o:p></p>

<p class=MsoNormal>+    PSCATTER_GATHER_LIST   
p_sgl = s_buf->p_sgl;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_sgl )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT( p_sgl );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to get SGL from packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
//TODO: Copy only essential data<o:p></o:p></p>

<p class=MsoNormal>-             
// That is, copy only 2 chunks of ETH header if it contained in several first
SG elements<o:p></o:p></p>

<p class=MsoNormal>-             
// Copy only N+1-MAX_SEND_SGE, where N is a lenght of SG List<o:p></o:p></p>

<p class=MsoNormal>-             
/* Remember that one of the DS entries is reserved for the IPoIB header. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||<o:p></o:p></p>

<p class=MsoNormal>-                             
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_sgl )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT( p_sgl );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to get SGL from packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    //TODO: Copy only essential data<o:p></o:p></p>

<p class=MsoNormal>+    // That is, copy only 2 chunks of ETH
header if it contained in several first SG elements<o:p></o:p></p>

<p class=MsoNormal>+    // Copy only N+1-MAX_SEND_SGE, where N
is a lenght of SG List<o:p></o:p></p>

<p class=MsoNormal>+    /* Remember that one of the DS entries
is reserved for the IPoIB header. */<o:p></o:p></p>

<p class=MsoNormal>+    if( ( p_sgl->NumberOfElements >=
MAX_SEND_SGE ||<o:p></o:p></p>

<p class=MsoNormal>+       
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Too many buffers %d to fit in WR ds_array[%d] \<o:p></o:p></p>

<p class=MsoNormal>-                             
               
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length )
);<o:p></o:p></p>

<p class=MsoNormal>-                             
status = NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( SendCopy );<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+     
      ("Too many buffers %d to fit in WR
ds_array[%d] \<o:p></o:p></p>

<p class=MsoNormal>+            
Or buffer[0] length %d < Eth header. Copying data.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length )
);<o:p></o:p></p>

<p class=MsoNormal>+        status =
NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+        if(
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_start( SendCopy );<o:p></o:p></p>

<p class=MsoNormal>+           
status = __send_copy( s_buf->p_port, s_buf, lso_header_size );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_stop( &s_buf->p_port->p_adapter->perf, SendCopy );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Skip the ethernet header.  It is either the first element,<o:p></o:p></p>

<p class=MsoNormal>-             
* or part of it.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
i = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
DataOffset= (ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( lso_data_index )<o:p></o:p></p>

<p class=MsoNormal>-             
{ /* we have an LSO packet */<o:p></o:p></p>

<p class=MsoNormal>-                             
i = lso_data_index;<o:p></o:p></p>

<p class=MsoNormal>-                             
j = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT( i <= p_sgl->NumberOfElements);<o:p></o:p></p>

<p class=MsoNormal>-                             
if (i == p_sgl->NumberOfElements) {<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Skip the ethernet header. 
It is either the first element,<o:p></o:p></p>

<p class=MsoNormal>+     * or part of it.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    i = 0;<o:p></o:p></p>

<p class=MsoNormal>+    DataOffset=
(ULONG)(NET_BUFFER_CURRENT_MDL_OFFSET(s_buf->p_curr_nb)); <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if( lso_data_index )<o:p></o:p></p>

<p class=MsoNormal>+    { /* we have an LSO packet */<o:p></o:p></p>

<p class=MsoNormal>+        i =
lso_data_index;<o:p></o:p></p>

<p class=MsoNormal>+        j = 0;<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT( i <=
p_sgl->NumberOfElements);<o:p></o:p></p>

<p class=MsoNormal>+        if (i ==
p_sgl->NumberOfElements) {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/****************************<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Handle the case when there is only one SG element !<o:p></o:p></p>

<p class=MsoNormal>-                                             
****************************/<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset +
EthIPoIBHeaderOffset;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_sgl->Elements[0].Length - lso_header_size - DataOffset -
EthIPoIBHeaderOffset;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Set the number of data segments. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                             
}                             
<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else while( EthHeaderOffset )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_sgl->Elements[i].Address.QuadPart + EthHeaderOffset + DataOffset;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                             
i++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
j++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* Now fill in the rest of the local data segments. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( i < p_sgl->NumberOfElements )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                             
i++;<o:p></o:p></p>

<p class=MsoNormal>-                             
j++;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+            /****************************<o:p></o:p></p>

<p class=MsoNormal>+           
* Handle the case when there is only one SG element !<o:p></o:p></p>

<p class=MsoNormal>+           
****************************/<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].vaddr = <o:p></o:p></p>

<p class=MsoNormal>+               
p_sgl->Elements[0].Address.QuadPart + lso_header_size + DataOffset +
EthIPoIBHeaderOffset;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].length = <o:p></o:p></p>

<p class=MsoNormal>+               
p_sgl->Elements[0].Length - lso_header_size - DataOffset -
EthIPoIBHeaderOffset;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+           
/* Set the number of data segments. */<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].wr.num_ds = 1;<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+       
}       <o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else while( EthHeaderOffset )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_sgl->Elements[i].Length <= EthHeaderOffset )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
EthHeaderOffset -= p_sgl->Elements[i++].Length;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].vaddr =<o:p></o:p></p>

<p class=MsoNormal>+    
           p_sgl->Elements[i].Address.QuadPart
+ EthHeaderOffset + DataOffset;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].length =<o:p></o:p></p>

<p class=MsoNormal>+               
p_sgl->Elements[i].Length - EthHeaderOffset - DataOffset;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+           
i++;<o:p></o:p></p>

<p class=MsoNormal>+           
j++;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* Now fill in the rest of the local
data segments. */<o:p></o:p></p>

<p class=MsoNormal>+    while( i < p_sgl->NumberOfElements
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_wr[0].local_ds[j].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+        i++;<o:p></o:p></p>

<p class=MsoNormal>+        j++;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Set the number of data segments. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>

<p class=MsoNormal>+    /* Set the number of data segments. */<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = j;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_ip(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_NB_SG                                       
*s_buf )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_NB_SG           
*s_buf )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ip_hdr_t                             
*p_ip_hdr;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                              
ip_packet_len;<o:p></o:p></p>

<p class=MsoNormal>-             
size_t                                   
iph_size_in_bytes;<o:p></o:p></p>

<p class=MsoNormal>-             
size_t                                   
iph_options_size;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( QueryIp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendTcp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( FilterUdp );<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_STATUS    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ip_hdr_t        *p_ip_hdr;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t        ip_packet_len;<o:p></o:p></p>

<p class=MsoNormal>+    size_t         
iph_size_in_bytes;<o:p></o:p></p>

<p class=MsoNormal>+   
size_t          iph_options_size;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( QueryIp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendTcp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( FilterUdp );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( QueryIp );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextMdl ( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get IP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
QueryIp );<o:p></o:p></p>

<p class=MsoNormal>+        NdisGetNextMdl (
p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get IP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_ip_hdr )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to query IP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, QueryIp );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ip_hdr = (ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* This buffer is done for.  Get the next buffer. */<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Buffer too small for IP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
NdisQueryMdl(p_mdl, &p_ip_hdr, &buf_len, NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_ip_hdr )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to query IP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, QueryIp );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_ip_hdr =
(ip_hdr_t*)(p_eth_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if( buf_len < sizeof(ip_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* This buffer
is done for.  Get the next buffer. */<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Buffer too small for IP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( p_ip_hdr->prot )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case IP_PROT_UDP:<o:p></o:p></p>

<p class=MsoNormal>+    switch( p_ip_hdr->prot )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    case IP_PROT_UDP:<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( FilterUdp );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)),
s_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status == NDIS_STATUS_PENDING )<o:p></o:p></p>

<p class=MsoNormal>-                             
{  /* not DHCP packet, keep going */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
case IP_PROT_TCP:<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
case IP_PROT_IGMP:<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></p>

<p class=MsoNormal>-                             
1. iph<o:p></o:p></p>

<p class=MsoNormal>-                             
2. ip options<o:p></o:p></p>

<p class=MsoNormal>-                                                             
So to get the IGMP packet we need to skip the ip options NDIS_BUFFER<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></p>

<p class=MsoNormal>-                                             
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
FilterUdp );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_mgr_filter_udp( p_ip_hdr, p_mdl, (buf_len - sizeof(ip_hdr_t)), s_buf );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, FilterUdp );<o:p></o:p></p>

<p class=MsoNormal>+        if( status ==
NDIS_STATUS_PENDING )<o:p></o:p></p>

<p class=MsoNormal>+        {  /* not
DHCP packet, keep going */<o:p></o:p></p>

<p class=MsoNormal>+    
       if( ETH_IS_MULTICAST(
p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    case IP_PROT_TCP:<o:p></o:p></p>

<p class=MsoNormal>+   
    p_desc->send_dir = SEND_RC_QP;<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    case IP_PROT_IGMP:<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+        In igmp packet I
saw that iph arrive in 2 NDIS_BUFFERs:<o:p></o:p></p>

<p class=MsoNormal>+        1. iph<o:p></o:p></p>

<p class=MsoNormal>+        2. ip options<o:p></o:p></p>

<p class=MsoNormal>+               
So to get the IGMP packet we need to skip the ip options NDIS_BUFFER<o:p></o:p></p>

<p class=MsoNormal>+           
*/<o:p></o:p></p>

<p class=MsoNormal>+           
iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;<o:p></o:p></p>

<p class=MsoNormal>+           
iph_options_size = iph_size_in_bytes - buf_len;<o:p></o:p></p>

<p class=MsoNormal>+           
buf_len -= sizeof(ip_hdr_t);//without ipheader<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
Could be a case that arrived igmp packet not from type IGMPv2 ,<o:p></o:p></p>

<p class=MsoNormal>-                             
but IGMPv1 or IGMPv3.<o:p></o:p></p>

<p class=MsoNormal>-                             
We anyway pass it to __send_mgr_filter_igmp_v2().<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
status =<o:p></o:p></p>

<p class=MsoNormal>-                                             
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl,
buf_len );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+        Could be a case that
arrived igmp packet not from type IGMPv2 ,<o:p></o:p></p>

<p class=MsoNormal>+        but IGMPv1 or
IGMPv3.<o:p></o:p></p>

<p class=MsoNormal>+        We anyway pass
it to __send_mgr_filter_igmp_v2().<o:p></o:p></p>

<p class=MsoNormal>+        */<o:p></o:p></p>

<p class=MsoNormal>+        status =<o:p></o:p></p>

<p class=MsoNormal>+           
__send_mgr_filter_igmp_v2( s_buf->p_port, p_ip_hdr, iph_options_size, p_mdl,
buf_len );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case IP_PROT_ICMP:<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( !s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-                             
goto send_gen;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ip_packet_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( ip_packet_len  > s_buf->p_port->p_adapter->params.payload_mtu
)<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
//TODO: NDIS60<o:p></o:p></p>

<p class=MsoNormal>-                                             
#if 0<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                                             
#endif<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    case IP_PROT_ICMP:<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if(
!s_buf->p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+        goto send_gen;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else if( endpt_cm_get_state(
p_desc->p_endpt ) != IPOIB_CM_CONNECTED )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ip_packet_len =
cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>

<p class=MsoNormal>+        if(
ip_packet_len  > s_buf->p_port->p_adapter->params.payload_mtu
)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
//TODO: NDIS60<o:p></o:p></p>

<p class=MsoNormal>+           
#if 0<o:p></o:p></p>

<p class=MsoNormal>+           
status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+                       
(ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+           
#endif<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> send_gen:<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( SendTcp );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __send_gen(  s_buf, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, SendTcp );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( SendTcp );<o:p></o:p></p>

<p class=MsoNormal>+    status = __send_gen(  s_buf, 0, 0
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, SendTcp );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_igmp_v2(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ip_hdr_t*
const                                                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
iph_options_size,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ip_hdr_t* const            
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
iph_options_size,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
igmp_v2_hdr_t                
*p_igmp_v2_hdr = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
endpt_status;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t*
                              
p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
mac_addr_t                                      
fake_mcast_mac;<o:p></o:p></p>

<p class=MsoNormal>+    igmp_v2_hdr_t      
*p_igmp_v2_hdr = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         endpt_status;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t*      p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
mac_addr_t         
fake_mcast_mac;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("buf_len = %d,iph_options_size =
%d\n",(int)buf_len,(int)iph_options_size ) );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+            
("buf_len = %d,iph_options_size =
%d\n",(int)buf_len,(int)iph_options_size ) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
// To get the IGMP packet we need to skip the ip options NDIS_BUFFER (if exists)<o:p></o:p></p>

<p class=MsoNormal>-                             
while ( iph_options_size )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( !p_igmp_v2_hdr )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
iph_options_size-=buf_len;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        // To get the
IGMP packet we need to skip the ip options NDIS_BUFFER (if exists)<o:p></o:p></p>

<p class=MsoNormal>+        while (
iph_options_size )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+           
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+       
    if( !p_igmp_v2_hdr )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
iph_options_size-=buf_len;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>         <o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryMdl( p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_igmp_v2_hdr )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* assuming ip header and options are in the same packet */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_igmp_v2_hdr = (igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* Get the IGMP header length. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( buf_len < sizeof(igmp_v2_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Buffer not large enough for IGMPv2 packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        NdisQueryMdl(
p_mdl, &p_igmp_v2_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+        if(
!p_igmp_v2_hdr )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to query IGMPv2 header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* assuming ip
header and options are in the same packet */<o:p></o:p></p>

<p class=MsoNormal>+        p_igmp_v2_hdr =
(igmp_v2_hdr_t *) GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* Get the IGMP header length. */<o:p></o:p></p>

<p class=MsoNormal>+    if( buf_len < sizeof(igmp_v2_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+     
      ("Buffer not large enough for IGMPv2
packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
// build fake mac from igmp packet group address<o:p></o:p></p>

<p class=MsoNormal>-             
fake_mcast_mac.addr[0] = 1;<o:p></o:p></p>

<p class=MsoNormal>-             
fake_mcast_mac.addr[1] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></p>

<p class=MsoNormal>-             
fake_mcast_mac.addr[2] = 0x5E;<o:p></o:p></p>

<p class=MsoNormal>-             
fake_mcast_mac.addr[3] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></p>

<p class=MsoNormal>-             
fake_mcast_mac.addr[4] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></p>

<p class=MsoNormal>-             
fake_mcast_mac.addr[5] = ((unsigned char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></p>

<p class=MsoNormal>+    // build fake mac from igmp packet group
address<o:p></o:p></p>

<p class=MsoNormal>+    fake_mcast_mac.addr[0] = 1;<o:p></o:p></p>

<p class=MsoNormal>+    fake_mcast_mac.addr[1] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[0] & 0x0f;<o:p></o:p></p>

<p class=MsoNormal>+    fake_mcast_mac.addr[2] = 0x5E;<o:p></o:p></p>

<p class=MsoNormal>+    fake_mcast_mac.addr[3] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[1];<o:p></o:p></p>

<p class=MsoNormal>+    fake_mcast_mac.addr[4] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[2];<o:p></o:p></p>

<p class=MsoNormal>+    fake_mcast_mac.addr[5] = ((unsigned
char*)&p_igmp_v2_hdr->group_address)[3];<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch ( p_igmp_v2_hdr->type )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* <o:p></o:p></p>

<p class=MsoNormal>-                                             
This mean that some body open listener on this group <o:p></o:p></p>

<p class=MsoNormal>-                                             
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector <o:p></o:p></p>

<p class=MsoNormal>-                                             
will not delete this mcast endpt.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>-                             
if ( p_endpt )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    switch ( p_igmp_v2_hdr->type )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    case IGMP_V2_MEMBERSHIP_REPORT:<o:p></o:p></p>

<p class=MsoNormal>+        /* <o:p></o:p></p>

<p class=MsoNormal>+    
       This mean that some body open
listener on this group <o:p></o:p></p>

<p class=MsoNormal>+           
Change type of mcast endpt to SEND_RECV endpt. So mcast garbage collector <o:p></o:p></p>

<p class=MsoNormal>+           
will not delete this mcast endpt.<o:p></o:p></p>

<p class=MsoNormal>+        */<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+           
("Catched IGMP_V2_MEMBERSHIP_REPORT message\n") );<o:p></o:p></p>

<p class=MsoNormal>+        endpt_status =
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>+        if ( p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>            
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case IGMP_V2_LEAVE_GROUP:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* <o:p></o:p></p>

<p class=MsoNormal>-                                             
This mean that somebody CLOSE listener on this group .<o:p></o:p></p>

<p class=MsoNormal>-                             
    Change type of mcast endpt to SEND_ONLY endpt. So mcast <o:p></o:p></p>

<p class=MsoNormal>-                                             
garbage collector will delete this mcast endpt next time.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
     ("Catched IGMP_V2_LEAVE_GROUP message\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
endpt_status = __endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>-                             
if ( p_endpt )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->is_in_use = FALSE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    case IGMP_V2_LEAVE_GROUP:<o:p></o:p></p>

<p class=MsoNormal>+        /* <o:p></o:p></p>

<p class=MsoNormal>+           
This mean that somebody CLOSE listener on this group .<o:p></o:p></p>

<p class=MsoNormal>+           
Change type of mcast endpt to SEND_ONLY endpt. So mcast <o:p></o:p></p>

<p class=MsoNormal>+           
garbage collector will delete this mcast endpt next time.<o:p></o:p></p>

<p class=MsoNormal>+        */<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+                
("Catched IGMP_V2_LEAVE_GROUP message\n") );<o:p></o:p></p>

<p class=MsoNormal>+        endpt_status =
__endpt_mgr_ref( p_port, fake_mcast_mac, &p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>+        if ( p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->is_mcast_listener = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->is_in_use = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
__port_do_mcast_garbage(p_port);<o:p></o:p></p>

<p class=MsoNormal>+        __port_do_mcast_garbage(p_port);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
     ("Send Unknown IGMP message: 0x%x \n",
p_igmp_v2_hdr->type ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+                
("Send Unknown IGMP message: 0x%x \n", p_igmp_v2_hdr->type ) );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_udp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ip_hdr_t* const                                                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN           OUT                                      
ipoib_send_NB_SG*                                     
s_buf )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ip_hdr_t*
const            
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+    IN  
           size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT        
ipoib_send_NB_SG*          
s_buf )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
udp_hdr_t                                         
*p_udp_hdr;<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( QueryUdp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendUdp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( FilterDhcp );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         status;<o:p></o:p></p>

<p class=MsoNormal>+   
udp_hdr_t          
*p_udp_hdr;<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( QueryUdp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendUdp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( FilterDhcp );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( QueryUdp );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get UDP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryMdl( p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_udp_hdr )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to query UDP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &s_buf->p_port->p_adapter->perf, QueryUdp );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_udp_hdr = (udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* Get the UDP header and check the destination port numbers. */<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if (p_ip_hdr->offset > 0) {<o:p></o:p></p>

<p class=MsoNormal>-                             
/* This is a fragmented part of UDP packet<o:p></o:p></p>

<p class=MsoNormal>-                             
* Only first packet will contain UDP header in such case<o:p></o:p></p>

<p class=MsoNormal>-                             
* So, return if offset > 0<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
QueryUdp );<o:p></o:p></p>

<p class=MsoNormal>+        NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get UDP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        NdisQueryMdl(
p_mdl, &p_udp_hdr, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_udp_hdr )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to query UDP header buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&s_buf->p_port->p_adapter->perf, QueryUdp );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_udp_hdr =
(udp_hdr_t*)GetIpPayloadPtr(p_ip_hdr);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* Get the UDP header and check the
destination port numbers. */<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if (p_ip_hdr->offset > 0) {<o:p></o:p></p>

<p class=MsoNormal>+        /* This is a
fragmented part of UDP packet<o:p></o:p></p>

<p class=MsoNormal>+         * Only
first packet will contain UDP header in such case<o:p></o:p></p>

<p class=MsoNormal>+         * So,
return if offset > 0<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+         return
NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+         <o:p></o:p></p>

<p class=MsoNormal>+    if( buf_len < sizeof(udp_hdr_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Buffer not large enough for UDP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( (p_udp_hdr->src_port != DHCP_PORT_CLIENT ||<o:p></o:p></p>

<p class=MsoNormal>-                             
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></p>

<p class=MsoNormal>-                             
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></p>

<p class=MsoNormal>-                             
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Not a DHCP packet. */<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( (p_udp_hdr->src_port !=
DHCP_PORT_CLIENT ||<o:p></o:p></p>

<p class=MsoNormal>+       
p_udp_hdr->dst_port != DHCP_PORT_SERVER) &&<o:p></o:p></p>

<p class=MsoNormal>+       
(p_udp_hdr->src_port != DHCP_PORT_SERVER ||<o:p></o:p></p>

<p class=MsoNormal>+       
p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Not a DHCP
packet. */<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
buf_len -= sizeof(udp_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    buf_len -= sizeof(udp_hdr_t);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate our scratch buffer. */<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>

<p class=MsoNormal>-                             
ExAllocateFromNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list
);<o:p></o:p></p>

<p class=MsoNormal>-             
if( !s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* Copy the IP and UDP headers. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy(<o:p></o:p></p>

<p class=MsoNormal>-                             
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate our scratch buffer. */<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>

<p class=MsoNormal>+       
ExAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>+    if( !s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to query DHCP packet buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* Copy the IP and UDP headers. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy(
&s_buf->p_send_buf->ip.hdr, p_ip_hdr , sizeof(ip_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy(<o:p></o:p></p>

<p class=MsoNormal>+       
&s_buf->p_send_buf->ip.prot.udp.hdr, p_udp_hdr, sizeof(udp_hdr_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( FilterDhcp );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __send_mgr_filter_dhcp( p_udp_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( FilterDhcp );<o:p></o:p></p>

<p class=MsoNormal>+    status = __send_mgr_filter_dhcp(
p_udp_hdr, p_mdl, buf_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, FilterDhcp );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> unsigned short ipchksum(unsigned short *ip, int len)<o:p></o:p></p>

<p class=MsoNormal>@@ -4515,646 +4562,646 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_dhcp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     udp_hdr_t*
const                                          
p_udp_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NDIS_BUFFER*                                                
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG*                                     
s_buf )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   udp_hdr_t*
const           
p_udp_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
NDIS_BUFFER*               
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT        
ipoib_send_NB_SG*          
s_buf )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
dhcp_pkt_t                                       
*p_dhcp;<o:p></o:p></p>

<p class=MsoNormal>-             
dhcp_pkt_t                                       
*p_ib_dhcp;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                                
*p_option, *p_cid = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                                
msg = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
size_t                                                   
len;<o:p></o:p></p>

<p class=MsoNormal>+   
dhcp_pkt_t          *p_dhcp;<o:p></o:p></p>

<p class=MsoNormal>+   
dhcp_pkt_t          *p_ib_dhcp;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t            
*p_option, *p_cid = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t            
msg = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
size_t             
len;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get DHCP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryMdl( p_mdl, &p_dhcp, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_dhcp )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to query DHCP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_dhcp = (dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get DHCP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        NdisQueryMdl(
p_mdl, &p_dhcp, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_dhcp )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+  
             ("Failed
to query DHCP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_dhcp =
(dhcp_pkt_t*)(p_udp_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( buf_len < DHCP_MIN_SIZE )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( buf_len < DHCP_MIN_SIZE )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Buffer not large enough for DHCP packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_dhcp = &s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_dhcp =
&s_buf->p_send_buf->ip.prot.udp.dhcp;<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( p_ib_dhcp, p_dhcp, buf_len );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Now scan through the options looking for the client identifier. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_option = &p_ib_dhcp->options[4];<o:p></o:p></p>

<p class=MsoNormal>-             
while( *p_option != DHCP_OPT_END && p_option <
&p_ib_dhcp->options[312] )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
switch( *p_option )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
case DHCP_OPT_PAD:<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_option++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    /* Now scan through the options looking
for the client identifier. */<o:p></o:p></p>

<p class=MsoNormal>+    p_option =
&p_ib_dhcp->options[4];<o:p></o:p></p>

<p class=MsoNormal>+    while( *p_option != DHCP_OPT_END
&& p_option < &p_ib_dhcp->options[312] )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        switch(
*p_option )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+        case DHCP_OPT_PAD:<o:p></o:p></p>

<p class=MsoNormal>+           
p_option++;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
case DHCP_OPT_MSG:<o:p></o:p></p>

<p class=MsoNormal>-                                             
msg = p_option[2];<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_option += 3;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        case
DHCP_OPT_MSG:<o:p></o:p></p>

<p class=MsoNormal>+           
msg = p_option[2];<o:p></o:p></p>

<p class=MsoNormal>+           
p_option += 3;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
case DHCP_OPT_CLIENT_ID:<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_cid = p_option;<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Fall through. */<o:p></o:p></p>

<p class=MsoNormal>+        case
DHCP_OPT_CLIENT_ID:<o:p></o:p></p>

<p class=MsoNormal>+           
p_cid = p_option;<o:p></o:p></p>

<p class=MsoNormal>+           
/* Fall through. */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* All other options have a length byte following the option code.<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Offset by the length to get to the next option.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_option += (p_option[1] + 2);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        default:<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* All other options have a length byte following the option code.<o:p></o:p></p>

<p class=MsoNormal>+            
* Offset by the length to get to the next option.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
p_option += (p_option[1] + 2);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( msg )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
/* Client messages */<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPDISCOVER:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPREQUEST:<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Fall through */<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPDECLINE:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPRELEASE:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPINFORM:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Fix up the client identifier option */<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_cid )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* do we need to replace it ?  len eq ETH MAC sz 'and' MAC is mine */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Make sure there's room to extend it.  22 is the size of<o:p></o:p></p>

<p class=MsoNormal>-                                                             
* the CID option for IPoIB. (20 is the length, one byte for type and the second
for lenght field)<o:p></o:p></p>

<p class=MsoNormal>-                                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* Move the existing options down, and add a new CID option */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_cid += len;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Make sure there's room to extend it.  23 is the size of<o:p></o:p></p>

<p class=MsoNormal>-                                             
* the CID option for IPoIB.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+    switch( msg )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    /* Client messages */<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPDISCOVER:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPREQUEST:<o:p></o:p></p>

<p class=MsoNormal>+           
p_ib_dhcp->flags |= DHCP_FLAGS_BROADCAST;<o:p></o:p></p>

<p class=MsoNormal>+        /* Fall through
*/<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPDECLINE:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPRELEASE:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPINFORM:<o:p></o:p></p>

<p class=MsoNormal>+        /* Fix up the
client identifier option */<o:p></o:p></p>

<p class=MsoNormal>+        if( p_cid )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* do we need to replace it ?  len eq ETH MAC sz 'and' MAC is mine */<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_cid[1] == HW_ADDR_LEN+1 && !cl_memcmp( &p_cid[3],<o:p></o:p></p>

<p class=MsoNormal>+               
&s_buf->p_port->p_adapter->params.conf_mac.addr, HW_ADDR_LEN ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
/* Make sure there's room to extend it.  22 is the size of<o:p></o:p></p>

<p class=MsoNormal>+                
* the CID option for IPoIB. (20 is the length, one byte for type and the second
for lenght field)<o:p></o:p></p>

<p class=MsoNormal>+                
*/<o:p></o:p></p>

<p class=MsoNormal>+               
if( buf_len + coIPoIB_CID_TotalLen - p_cid[1] > sizeof(dhcp_pkt_t) )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>

<p class=MsoNormal>+                   
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
/* Move the existing options down, and add a new CID option */<o:p></o:p></p>

<p class=MsoNormal>+               
len = p_option - ( p_cid + p_cid[1] + 2 );<o:p></o:p></p>

<p class=MsoNormal>+               
p_option = p_cid + p_cid[1] + 2;<o:p></o:p></p>

<p class=MsoNormal>+               
RtlMoveMemory( p_cid, p_option, len );<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+               
p_cid += len;<o:p></o:p></p>

<p class=MsoNormal>+               
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>

<p class=MsoNormal>+               
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* Make sure there's room to extend it.  23 is the size of<o:p></o:p></p>

<p class=MsoNormal>+            
* the CID option for IPoIB.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
if( buf_len + coIPoIB_CID_TotalLen > sizeof(dhcp_pkt_t) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Can't convert CID to IPoIB format.\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_cid = p_option;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
p_cid = p_option;<o:p></o:p></p>

<p class=MsoNormal>+           
p_cid[0] = DHCP_OPT_CLIENT_ID;<o:p></o:p></p>

<p class=MsoNormal>+           
p_cid[1] = coIPoIB_CID_Len;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
// Copy the default prefix for ALL DHCP messages<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( &p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof coIBDefaultDHCPPrefix);<o:p></o:p></p>

<p class=MsoNormal>-                             
// Copy the GUID into the last 8 bytes of the CID field<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( &p_cid[2+
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid
, <o:p></o:p></p>

<p class=MsoNormal>-                                             
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_cid[1] == coIPoIB_CID_Len);<o:p></o:p></p>

<p class=MsoNormal>+       
p_cid[coIPoIB_CID_TotalLen]= DHCP_OPT_END;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        // Copy the
default prefix for ALL DHCP messages<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy(
&p_cid[2], &coIBDefaultDHCPPrefix[0], sizeof coIBDefaultDHCPPrefix);<o:p></o:p></p>

<p class=MsoNormal>+        // Copy the GUID
into the last 8 bytes of the CID field<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy(
&p_cid[2+
sizeof(coIBDefaultDHCPPrefix)],&s_buf->p_port->p_adapter->guids.port_guid.guid
, <o:p></o:p></p>

<p class=MsoNormal>+           
sizeof(s_buf->p_port->p_adapter->guids.port_guid.guid) );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+       
p_ib_dhcp->htype = DHCP_HW_TYPE_IB;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Server messages. */<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPOFFER:<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ib_dhcp->htype = 0x20;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_ib_dhcp->hlen = 0x8;<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPACK:<o:p></o:p></p>

<p class=MsoNormal>-             
case DHCPNAK:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* don't touch server messages */<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    /* Server messages. */<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPOFFER:<o:p></o:p></p>

<p class=MsoNormal>+       
p_ib_dhcp->htype = 0x20;<o:p></o:p></p>

<p class=MsoNormal>+       
p_ib_dhcp->hlen = 0x8;<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPACK:<o:p></o:p></p>

<p class=MsoNormal>+    case DHCPNAK:<o:p></o:p></p>

<p class=MsoNormal>+        /* don't touch
server messages */<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Invalide message type.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Invalide message type.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf->ip.hdr.length = cl_ntoh16( sizeof(ip_hdr_t) +
sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t)
+ sizeof(dhcp_pkt_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf->ip.hdr.chksum = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf->ip.hdr.chksum = ipchksum((unsigned short*) &s_buf->p_send_buf->ip.hdr,
sizeof(ip_hdr_t));<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf->ip.hdr.length =
cl_ntoh16( sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t) );<o:p></o:p></p>

<p class=MsoNormal>+   
s_buf->p_send_buf->ip.prot.udp.hdr.length = cl_ntoh16( sizeof(udp_hdr_t)
+ sizeof(dhcp_pkt_t) );<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf->ip.hdr.chksum =
0;<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf->ip.hdr.chksum =
ipchksum((unsigned short*) &s_buf->p_send_buf->ip.hdr,
sizeof(ip_hdr_t));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* no chksum for udp, in a case when HW does not support checksum offload */<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( s_buf->p_send_buf
);<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t)
+      sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[1].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* no chksum for udp, in a case when HW
does not support checksum offload */<o:p></o:p></p>

<p class=MsoNormal>+   
s_buf->p_send_buf->ip.prot.udp.hdr.chksum = 0;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].vaddr
= cl_get_physaddr( s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].length
= sizeof(ip_hdr_t) +  sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_filter_arp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*                                                                                   
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
size_t                                                                                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
OUT                                      
ipoib_send_NB_SG*                                     
s_buf )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   eth_hdr_t* const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
size_t                     
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
OUT        
ipoib_send_NB_SG*          
s_buf )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
arp_pkt_t                                           
*p_arp;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_arp_pkt_t                              
*p_ib_arp;<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
mac_addr_t                                      
null_hw = {0};<o:p></o:p></p>

<p class=MsoNormal>+   
arp_pkt_t           *p_arp;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_arp_pkt_t    
*p_ib_arp;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         status;<o:p></o:p></p>

<p class=MsoNormal>+   
mac_addr_t          null_hw = {0};<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextMdl( p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get ARP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryMdl( p_mdl, &p_arp, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_arp )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get query ARP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_arp = (arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if( !buf_len )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        NdisGetNextMdl(
p_mdl, &p_mdl );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_mdl )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get ARP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        NdisQueryMdl(
p_mdl, &p_arp, &buf_len, NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_arp )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get query ARP buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_arp =
(arp_pkt_t*)(p_eth_hdr + 1);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Single buffer ARP packet. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( buf_len < sizeof(arp_pkt_t) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Buffer too short for ARP.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Single buffer ARP packet. */<o:p></o:p></p>

<p class=MsoNormal>+    if( buf_len < sizeof(arp_pkt_t) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Buffer too short for ARP.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_BUFFER_TOO_SHORT;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_arp->prot_type != ETH_PROT_TYPE_IP )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Unsupported protocol type.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_arp->prot_type != ETH_PROT_TYPE_IP
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Unsupported protocol type.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_INVALID_DATA;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate our scratch buffer. */<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisAllocateFromNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list
);<o:p></o:p></p>

<p class=MsoNormal>-             
if( !s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to query ARP packet buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp = (ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate our scratch buffer. */<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(s_buf->p_send_buf == NULL);<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf = (send_buf_t*)<o:p></o:p></p>

<p class=MsoNormal>+       
NdisAllocateFromNPagedLookasideList(
&s_buf->p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>+    if( !s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to query ARP packet buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp =
(ipoib_arp_pkt_t*)s_buf->p_send_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Convert the ARP payload. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->hw_type = ARP_HW_TYPE_IB;<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->prot_type = p_arp->prot_type;<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->hw_size = sizeof(ipoib_hw_addr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->prot_size = p_arp->prot_size;<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->op = p_arp->op;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_addr_set_qpn( &p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn
);<o:p></o:p></p>

<p class=MsoNormal>+    /* Convert the ARP payload. */<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->hw_type = ARP_HW_TYPE_IB;<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->prot_type = p_arp->prot_type;<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->hw_size =
sizeof(ipoib_hw_addr_t);<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->prot_size =
p_arp->prot_size;<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->op = p_arp->op;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ipoib_addr_set_qpn(
&p_ib_arp->src_hw, s_buf->p_port->ib_mgr.qpn );<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_addr_set_flags( &p_ib_arp->src_hw, IPOIB_CM_FLAG_RC );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_gid_set_default( &p_ib_arp->src_hw.gid,<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->src_ip = p_arp->src_ip;<o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_memcmp( &p_arp->dst_hw, &null_hw, sizeof(mac_addr_t) ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Get the endpoint referenced by the dst_hw address. */<o:p></o:p></p>

<p class=MsoNormal>-                             
net32_t               
qpn = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __endpt_mgr_get_gid_qpn( s_buf->p_port, p_arp->dst_hw,<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed lookup of destination HW address\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></p>

<p class=MsoNormal>+    ib_gid_set_default(
&p_ib_arp->src_hw.gid,<o:p></o:p></p>

<p class=MsoNormal>+       
s_buf->p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->src_ip = p_arp->src_ip;<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_memcmp( &p_arp->dst_hw,
&null_hw, sizeof(mac_addr_t) ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Get the
endpoint referenced by the dst_hw address. */<o:p></o:p></p>

<p class=MsoNormal>+        net32_t qpn = 0;<o:p></o:p></p>

<p class=MsoNormal>+        status =
__endpt_mgr_get_gid_qpn( s_buf->p_port, p_arp->dst_hw,<o:p></o:p></p>

<p class=MsoNormal>+           
&p_ib_arp->dst_hw.gid, &qpn );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed lookup of destination HW address\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_addr_set_qpn( &p_ib_arp->dst_hw, qpn );<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_arp->op == ARP_OP_REP && <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->params.cm_enabled && <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cm_state_t         cm_state;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cm_state = <o:p></o:p></p>

<p class=MsoNormal>-                                                             
( cm_state_t )InterlockedCompareExchange( (volatile LONG *)&p_desc->p_endpt->conn.state,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>-                                             
switch( cm_state )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
case IPOIB_CM_DISCONNECTED:<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
               
("ARP REPLY pending Endpt[%p] QPN %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->p_endpt, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                                             
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>

<p class=MsoNormal>+        if( p_arp->op
== ARP_OP_REP && <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->params.cm_enabled && <o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->p_endpt->cm_flag == IPOIB_CM_FLAG_RC )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cm_state_t  cm_state;<o:p></o:p></p>

<p class=MsoNormal>+           
cm_state = <o:p></o:p></p>

<p class=MsoNormal>+               
( cm_state_t )InterlockedCompareExchange( (volatile LONG
*)&p_desc->p_endpt->conn.state,<o:p></o:p></p>

<p class=MsoNormal>+                               
IPOIB_CM_CONNECT, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>+           
switch( cm_state )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+           
case IPOIB_CM_DISCONNECTED:<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+                       
("ARP REPLY pending Endpt[%p] QPN %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->p_endpt, <o:p></o:p></p>

<p class=MsoNormal>+                       
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ) );<o:p></o:p></p>

<p class=MsoNormal>+                   
ipoib_addr_set_sid( &p_desc->p_endpt->conn.service_id,<o:p></o:p></p>

<p class=MsoNormal>+                                       
ipoib_addr_get_qpn( &p_ib_arp->dst_hw ) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NdisFreeToNPagedLookasideList(<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                                                                             
&p_desc->p_endpt->list_item, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                                                                             
&p_port->endpt_mgr.conn_lock );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
case IPOIB_CM_CONNECT:<o:p></o:p></p>

<p class=MsoNormal>-                                                             
/* queue ARP REP packet until connected */<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
NdisFreeToNPagedLookasideList(<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-                                             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+                   
NdisFreeToNPagedLookasideList(<o:p></o:p></p>

<p class=MsoNormal>+                       
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>+                   
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>

<p class=MsoNormal>+                               
IPOIB_LIST_ITEM_FROM_NBL( s_buf->p_send_buf ) );<o:p></o:p></p>

<p class=MsoNormal>+                   
NdisInterlockedInsertTailList( &p_port->endpt_mgr.pending_conns, <o:p></o:p></p>

<p class=MsoNormal>+                                               
&p_desc->p_endpt->list_item, <o:p></o:p></p>

<p class=MsoNormal>+                                               
&p_port->endpt_mgr.conn_lock );<o:p></o:p></p>

<p class=MsoNormal>+                   
cl_event_signal( &p_port->endpt_mgr.event );<o:p></o:p></p>

<p class=MsoNormal>+                   
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
case IPOIB_CM_CONNECT:<o:p></o:p></p>

<p class=MsoNormal>+               
/* queue ARP REP packet until connected */<o:p></o:p></p>

<p class=MsoNormal>+  
                 NdisFreeToNPagedLookasideList(<o:p></o:p></p>

<p class=MsoNormal>+                   
&p_port->buf_mgr.send_buf_list, s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>+                   
cl_qlist_insert_tail( &p_port->send_mgr.pending_list,<o:p></o:p></p>

<p class=MsoNormal>+                               
IPOIB_LIST_ITEM_FROM_NBL( p_desc->p_pkt ) );<o:p></o:p></p>

<p class=MsoNormal>+                   
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+           
default:<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memclr( &p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_memclr(
&p_ib_arp->dst_hw, sizeof(ipoib_hw_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> #if 0 //DBG<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                             
(" ARP %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
( p_ib_arp->op == ARP_OP_REP ? "REP":
"REQ"),                                            
p_desc->p_endpt, <o:p></o:p></p>

<p class=MsoNormal>-                                             
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->p_endpt->cm_flag, <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ));<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+        (" ARP %s
SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC
%02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>+           
( p_ib_arp->op == ARP_OP_REP ? "REP":
"REQ"),          
p_desc->p_endpt, <o:p></o:p></p>

<p class=MsoNormal>+           
endpt_cm_get_state( p_desc->p_endpt ),<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->p_endpt->cm_flag, <o:p></o:p></p>

<p class=MsoNormal>+           
cl_ntoh32( ipoib_addr_get_qpn( &p_ib_arp->dst_hw )),<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->p_endpt->mac.addr[0], p_desc->p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->p_endpt->mac.addr[2], p_desc->p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->p_endpt->mac.addr[4], p_desc->p_endpt->mac.addr[5] ));<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_ib_arp->dst_ip = p_arp->dst_ip;<o:p></o:p></p>

<p class=MsoNormal>+    p_ib_arp->dst_ip = p_arp->dst_ip;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[1].length = sizeof(ipoib_arp_pkt_t);<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[1].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].vaddr
= cl_get_physaddr( p_ib_arp );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].length
= sizeof(ipoib_arp_pkt_t);<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[1].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.num_ds = 2;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_mgr_queue(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
eth_hdr_t* const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t**
const                
pp_endpt )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ipoib_endpt_t**
const       pp_endpt )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
status;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>

<p class=MsoNormal>-             
//No need in spinlock, this function is already under lock <o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_qlist_count( &p_port->send_mgr.pending_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Pending list not empty.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Check the send queue and pend the
request if not empty. */<o:p></o:p></p>

<p class=MsoNormal>+    //No need in spinlock, this function is
already under lock <o:p></o:p></p>

<p class=MsoNormal>+    if( cl_qlist_count(
&p_port->send_mgr.pending_list ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+           
("Pending list not empty.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("No available WQEs.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_dbg_out("HW is full\n");<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Check the send queue and pend the
request if not empty. */<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->send_mgr.depth ==
p_port->p_adapter->params.sq_depth )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+           
("No available WQEs.\n") );<o:p></o:p></p>

<p class=MsoNormal>+       
cl_dbg_out("HW is full\n");<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __endpt_mgr_ref( p_port, p_eth_hdr->dst, pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", *pp_endpt));<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+    status = __endpt_mgr_ref( p_port,
p_eth_hdr->dst, pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", *pp_endpt));<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, GetEndpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></p>

<p class=MsoNormal>-                             
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join
mcast from send_mgr_queue\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
if( ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></p>

<p class=MsoNormal>-                                             
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Multicast Mac - trying to join.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else if ( status == NDIS_STATUS_SUCCESS && <o:p></o:p></p>

<p class=MsoNormal>-                                             
  ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&  <o:p></o:p></p>

<p class=MsoNormal>-                                             
  !ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( (*pp_endpt) );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></p>

<p class=MsoNormal>-                             
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( status ==
NDIS_STATUS_NO_ROUTE_TO_DESTINATION &&<o:p></o:p></p>

<p class=MsoNormal>+       
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,("Calling join
mcast from send_mgr_queue\n"));<o:p></o:p></p>

<p class=MsoNormal>+        if(
ipoib_port_join_mcast( p_port, p_eth_hdr->dst, <o:p></o:p></p>

<p class=MsoNormal>+           
IB_MC_REC_STATE_FULL_MEMBER) == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+               
("Multicast Mac - trying to join.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_PENDING;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else if ( status == NDIS_STATUS_SUCCESS
&& <o:p></o:p></p>

<p class=MsoNormal>+             
ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) &&  <o:p></o:p></p>

<p class=MsoNormal>+             
!ETH_IS_BROADCAST( p_eth_hdr->dst.addr ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
(*pp_endpt) );<o:p></o:p></p>

<p class=MsoNormal>+       
CL_ASSERT((*pp_endpt)->h_mcast != NULL);<o:p></o:p></p>

<p class=MsoNormal>+       
(*pp_endpt)->is_in_use = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __build_send_desc(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
eth_hdr_t* const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
MDL*
const                                                                       
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
size_t                                                                                   
mdl_len,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_send_NB_SG                                       
*s_buf)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
MDL*
const                 
p_mdl,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
size_t                     
mdl_len,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_send_NB_SG           
*s_buf)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
int32_t                                                 
hdr_idx;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG
                                                               
mss = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         status;<o:p></o:p></p>

<p class=MsoNormal>+   
int32_t            
hdr_idx;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG              
mss = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
                                  
p_checksum_list_info = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendMgrFilter );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+   
PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO         
p_checksum_list_info = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO   p_lso_info =
NULL;<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendMgrFilter );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Store context in our reserved area of the packet. */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
s_buf->p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* Store context in our reserved area of
the packet. */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(s_buf == (ipoib_send_NB_SG *) IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_endpt = p_desc->p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
//TODO IMPORTANT: Send buffer should not be allocated within global struct !!!<o:p></o:p></p>

<p class=MsoNormal>-             
// Otherwise, the next send may override its content<o:p></o:p></p>

<p class=MsoNormal>-             
//s_buf->p_send_buf= p_desc->p_buf;<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(s_buf == (ipoib_send_NB_SG *)
IPOIB_INFO_FROM_NB(s_buf->p_curr_nb));<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_endpt = p_desc->p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    //TODO IMPORTANT: Send buffer should not
be allocated within global struct !!!<o:p></o:p></p>

<p class=MsoNormal>+    // Otherwise, the next send may override
its content<o:p></o:p></p>

<p class=MsoNormal>+    //s_buf->p_send_buf=
p_desc->p_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Format the send descriptor. */<o:p></o:p></p>

<p class=MsoNormal>-             
PVOID* ppTemp
                            
= &NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpIpChecksumNetBufferListInfo);<o:p></o:p></p>

<p class=MsoNormal>+    /* Format the send descriptor. */<o:p></o:p></p>

<p class=MsoNormal>+    PVOID*
ppTemp       =
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpIpChecksumNetBufferListInfo);<o:p></o:p></p>

<p class=MsoNormal>     p_checksum_list_info = <o:p></o:p></p>

<p class=MsoNormal>                        
(PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO) ((PULONG)ppTemp); <o:p></o:p></p>

<p class=MsoNormal>-             
// Calculate LSO<o:p></o:p></p>

<p class=MsoNormal>-             
if( s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></p>

<p class=MsoNormal>+    // Calculate LSO<o:p></o:p></p>

<p class=MsoNormal>+    if(
s_buf->p_port->p_adapter->params.lso ) {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_lso_info =<o:p></o:p></p>

<p class=MsoNormal>-                                             
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG)
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpLargeSendNetBufferListInfo);<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(p_lso_info);<o:p></o:p></p>

<p class=MsoNormal>-   
          ULONG LsoType =
p_lso_info->Transmit.Type;<o:p></o:p></p>

<p class=MsoNormal>+        p_lso_info =<o:p></o:p></p>

<p class=MsoNormal>+           
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO) (PULONG)
&NET_BUFFER_LIST_INFO(s_buf->p_nbl, TcpLargeSendNetBufferListInfo);<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(p_lso_info);<o:p></o:p></p>

<p class=MsoNormal>+        ULONG LsoType =
p_lso_info->Transmit.Type;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
    mss = p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></p>

<p class=MsoNormal>-                             
ULONG PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></p>

<p class=MsoNormal>-                             
if  (PacketLength < mss) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
    if(LsoType == NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) {<o:p></o:p></p>

<p class=MsoNormal>-             
       
ASSERT(p_lso_info->LsoV2Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></p>

<p class=MsoNormal>-             
        ASSERT(mss ==
p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></p>

<p class=MsoNormal>-             
       
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset ==
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></p>

<p class=MsoNormal>-             
    }<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Format the send descriptor. */<o:p></o:p></p>

<p class=MsoNormal>-             
hdr_idx = cl_atomic_inc( &s_buf->p_port->hdr_idx );<o:p></o:p></p>

<p class=MsoNormal>-             
hdr_idx &= (s_buf->p_port->p_adapter->params.sq_depth - 1);<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT( hdr_idx < s_buf->p_port->p_adapter->params.sq_depth );<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_port->hdr[hdr_idx].type = p_eth_hdr->type;<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_port->hdr[hdr_idx].resv = 0;<o:p></o:p></p>

<p class=MsoNormal>+        mss =
p_lso_info->LsoV1Transmit.MSS;<o:p></o:p></p>

<p class=MsoNormal>+        ULONG
PacketLength = NET_BUFFER_DATA_LENGTH(s_buf->p_curr_nb);<o:p></o:p></p>

<p class=MsoNormal>+        if 
(PacketLength < mss) {<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if(LsoType ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE) {<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(p_lso_info->LsoV2Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE);<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(mss == p_lso_info->LsoV2Transmit.MSS);<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(p_lso_info->LsoV1Transmit.TcpHeaderOffset ==
p_lso_info->LsoV2Transmit.TcpHeaderOffset);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+    /* Format the send descriptor. */<o:p></o:p></p>

<p class=MsoNormal>+    hdr_idx = cl_atomic_inc(
&s_buf->p_port->hdr_idx );<o:p></o:p></p>

<p class=MsoNormal>+    hdr_idx &=
(s_buf->p_port->p_adapter->params.sq_depth - 1);<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT( hdr_idx <
s_buf->p_port->p_adapter->params.sq_depth );<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_port->hdr[hdr_idx].type =
p_eth_hdr->type;<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_port->hdr[hdr_idx].resv =
0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//TODO why we enter this block for LSO ???<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr(
&s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].local_ds[0].lkey = s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.send_opt = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
//Init send buffer to 0<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    //TODO why we enter this block for LSO
???<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[0].vaddr
= cl_get_physaddr( &s_buf->p_port->hdr[hdr_idx] );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[0].length
= sizeof(ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].local_ds[0].lkey =
s_buf->p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.send_opt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    //Init send buffer to 0<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
if (mss && (p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We
have LSO packet<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT( mss == (p_lso_info->LsoV1Transmit.MSS & p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></p>

<p class=MsoNormal>-                             
//ASSERT ( (mss & (1<<20)) == mss);<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info,
s_buf->p_curr_nb);<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
uint32_t              
i;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( SendMgrFilter );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+    if (mss &&
(p_lso_info->LsoV1Transmit.TcpHeaderOffset != 0)) { //We have LSO packet<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        ASSERT( mss ==
(p_lso_info->LsoV1Transmit.MSS & p_lso_info->LsoV2Transmit.MSS));<o:p></o:p></p>

<p class=MsoNormal>+        //ASSERT ( (mss
& (1<<20)) == mss);<o:p></o:p></p>

<p class=MsoNormal>+        status =
__build_lso_desc( s_buf->p_port, mss, hdr_idx, p_lso_info,
s_buf->p_curr_nb);<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("__build_lso_desc returned 0x%08X.\n", status) );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
uint32_t    i;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
SendMgrFilter );<o:p></o:p></p>

<p class=MsoNormal>+        status =
__send_mgr_filter( p_eth_hdr, p_mdl, mdl_len, s_buf );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, SendMgrFilter );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("__send_mgr_filter returned 0x%08X.\n", status) );<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></p>

<p class=MsoNormal>-                                             
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey =
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i].wr.dgrm.ud.pkey_index = s_buf->p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_desc->send_dir == SEND_UD_QP )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_qp = s_buf->p_port->ib_mgr.h_qp; // UD QP<o:p></o:p></p>

<p class=MsoNormal>+           
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+  
             p_desc->send_wr[i].wr.dgrm.ud.remote_qp
= p_desc->p_endpt->qpn;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[i].wr.dgrm.ud.remote_qkey =
s_buf->p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;<o:p></o:p></p>

<p class=MsoNormal>+ 
              p_desc->send_wr[i].wr.dgrm.ud.pkey_index
= s_buf->p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[i].wr.send_opt = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( s_buf->p_port->p_adapter->params.send_chksum_offload
               
&&<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_checksum_list_info                                                                                                  
&&<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
( p_checksum_list_info->Transmit.IsIPv4  || <o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_checksum_list_info->Transmit.IsIPv6  ))<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
// Set transimition checksum offloading<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
if( p_checksum_list_info->Transmit.TcpChecksum ||
p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else // RC QP<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
for( i = 0; i < p_desc->num_wrs; i++ )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( i )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf ;<o:p></o:p></p>

<p class=MsoNormal>+               
if(
s_buf->p_port->p_adapter->params.send_chksum_offload   
&&<o:p></o:p></p>

<p class=MsoNormal>+                   
p_checksum_list_info                           
&&<o:p></o:p></p>

<p class=MsoNormal>+                   
( p_checksum_list_info->Transmit.IsIPv4  || <o:p></o:p></p>

<p class=MsoNormal>+                   
p_checksum_list_info->Transmit.IsIPv6  ))<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
// Set transimition checksum offloading<o:p></o:p></p>

<p class=MsoNormal>+                   
if( p_checksum_list_info->Transmit.IpHeaderChecksum )<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+                   
if( p_checksum_list_info->Transmit.TcpChecksum || p_checksum_list_info->Transmit.UdpChecksum)<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else // RC QP<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( p_desc->send_dir == SEND_RC_QP );<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        for( i = 0; i
< p_desc->num_wrs; i++ )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[i].wr.wr_type = WR_SEND;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[i].wr.wr_id = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];<o:p></o:p></p>

<p class=MsoNormal>+           
if( i )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_wr[p_desc->num_wrs - 1].wr.wr_id = (uintn_t)s_buf ;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;<o:p></o:p></p>

<p class=MsoNormal>+       
p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __build_lso_desc(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ULONG                                                                                
mss,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
int32_t                                                                                 
hdr_idx, <o:p></o:p></p>

<p class=MsoNormal>-             
IN PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
NET_BUFFER                                                                     
*p_netbuf)<o:p></o:p></p>

<p class=MsoNormal>+   
IN          
   ipoib_port_t*
const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ULONG                      
mss,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
int32_t                    
hdr_idx, <o:p></o:p></p>

<p class=MsoNormal>+    IN
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO p_lso_info,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
NET_BUFFER                 
*p_netbuf)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
LsoData                                                                                                                               
TheLsoData;<o:p></o:p></p>

<p class=MsoNormal>-             
UINT                                                                                                                     
IndexOfData = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         status;<o:p></o:p></p>

<p class=MsoNormal>+   
LsoData                            
TheLsoData;<o:p></o:p></p>

<p class=MsoNormal>+   
UINT             
                  IndexOfData
= 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG * s_buf = IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_desc_t *p_desc = p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG * s_buf =
IPOIB_INFO_FROM_NB(p_netbuf);<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_desc_t *p_desc =
p_port->p_desc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//TODO What if first NB was inserted to pending list ????<o:p></o:p></p>

<p class=MsoNormal>-             
PNET_BUFFER   FirstBuffer  = NET_BUFFER_LIST_FIRST_NB
(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG
                                               
PacketLength = NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></p>

<p class=MsoNormal>+    //TODO What if first NB was inserted to
pending list ????<o:p></o:p></p>

<p class=MsoNormal>+    PNET_BUFFER    
FirstBuffer  = NET_BUFFER_LIST_FIRST_NB (s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG           PacketLength
= NET_BUFFER_DATA_LENGTH(FirstBuffer);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
memset(&TheLsoData, 0, sizeof TheLsoData );<o:p></o:p></p>

<p class=MsoNormal>-             
status = GetLsoHeaderSize(<o:p></o:p></p>

<p class=MsoNormal>-                             
FirstBuffer, <o:p></o:p></p>

<p class=MsoNormal>-                             
&TheLsoData, <o:p></o:p></p>

<p class=MsoNormal>-                             
&IndexOfData,<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->hdr[hdr_idx] );<o:p></o:p></p>

<p class=MsoNormal>+    memset(&TheLsoData, 0, sizeof
TheLsoData );<o:p></o:p></p>

<p class=MsoNormal>+    status = GetLsoHeaderSize(<o:p></o:p></p>

<p class=MsoNormal>+        FirstBuffer, <o:p></o:p></p>

<p class=MsoNormal>+        &TheLsoData,
<o:p></o:p></p>

<p class=MsoNormal>+       
&IndexOfData,<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->hdr[hdr_idx] );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if ((status != NDIS_STATUS_SUCCESS ) || <o:p></o:p></p>

<p class=MsoNormal>-                             
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+    if ((status != NDIS_STATUS_SUCCESS ) || <o:p></o:p></p>

<p class=MsoNormal>+       
(TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) <o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this
packet\n"));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( status == NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></p>

<p class=MsoNormal>-             
// Tell NDIS how much we will send.<o:p></o:p></p>

<p class=MsoNormal>-             
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);<o:p></o:p></p>

<p class=MsoNormal>-             
//p_lso_info->LsoV1TransmitComplete.TcpPayload = PacketLength;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
// Tell NDIS how much we will send.<o:p></o:p></p>

<p class=MsoNormal>-             
if(p_lso_info->LsoV1Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>

<p class=MsoNormal>+        if( status ==
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(TheLsoData.LsoHeaderSize > 0);<o:p></o:p></p>

<p class=MsoNormal>+    // Tell NDIS how much we will send.<o:p></o:p></p>

<p class=MsoNormal>+   
//PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);<o:p></o:p></p>

<p class=MsoNormal>+    //p_lso_info->LsoV1TransmitComplete.TcpPayload
= PacketLength;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    // Tell NDIS how much we will send.<o:p></o:p></p>

<p class=MsoNormal>+    if(p_lso_info->LsoV1Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>

<p class=MsoNormal>     {<o:p></o:p></p>

<p class=MsoNormal>-   
                         
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) += PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>

<p class=MsoNormal>-   
                         
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>

<p class=MsoNormal>-   
                         
<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
//IPOIB_TCP_PAYLOAD_FROM_NB(p_netbuf) += PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>

<p class=MsoNormal>+           
s_buf->tcp_payload = PacketLength-TheLsoData.LsoHeaderSize;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.mss = mss;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.hlen = TheLsoData.LsoHeaderSize
;//lso_header_size; <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.mss =
mss;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.header
= TheLsoData.LsoBuffers[0].pData;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.hlen =
TheLsoData.LsoHeaderSize ;//lso_header_size; <o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[0].wr.dgrm.ud.remote_qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.h_av =
p_desc->p_endpt->h_av;<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.dgrm.ud.rsvd =
NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.wr_id = (uintn_t)s_buf;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.ds_array = p_desc->send_wr[0].local_ds;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.wr_type = WR_LSO;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.send_opt = <o:p></o:p></p>

<p class=MsoNormal>-                             
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_qp = p_port->ib_mgr.h_qp;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>-             
status = __send_gen( s_buf, IndexOfData, TheLsoData.LsoHeaderSize );<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.wr_id =
(uintn_t)s_buf;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.ds_array =
p_desc->send_wr[0].local_ds;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.wr_type =
WR_LSO;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.send_opt = <o:p></o:p></p>

<p class=MsoNormal>+       
(IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_wr[0].wr.p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_qp =
p_port->ib_mgr.h_qp;<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->send_dir = SEND_UD_QP;<o:p></o:p></p>

<p class=MsoNormal>+    status = __send_gen( s_buf, IndexOfData,
TheLsoData.LsoHeaderSize );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -5182,7 +5229,7 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>     ULONG i = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
int j=0;<o:p></o:p></p>

<p class=MsoNormal>+    int j=0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>     UINT  buf_len =
NET_BUFFER_DATA_LENGTH(NetBuff);<o:p></o:p></p>

<p class=MsoNormal>     PMDL pMdl =
NET_BUFFER_CURRENT_MDL(NetBuff);<o:p></o:p></p>

<p class=MsoNormal>@@ -5195,7 +5242,7 @@<o:p></o:p></p>

<p class=MsoNormal> #ifdef DBG<o:p></o:p></p>

<p class=MsoNormal>     ASSERT(PhysBufCount <=
MAX_PHYS_BUF_FRAG_ELEMENTS);<o:p></o:p></p>

<p class=MsoNormal> #else<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(PhysBufCount);<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>     <o:p></o:p></p>

<p class=MsoNormal>     ASSERT(buf_len > 0);<o:p></o:p></p>

<p class=MsoNormal>@@ -5221,7 +5268,7 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>         ASSERT(
(buf_len > 0) && (MdlBytesCount > 0) );<o:p></o:p></p>

<p class=MsoNormal>  <o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList:
pMdl=%p, MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount,
MdlBufCount));<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND, ("CreateFragList: pMdl=%p,
MdlBytesCount=x%x, MdlBufCount=0x%x\n", pMdl, MdlBytesCount,
MdlBufCount));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>         if
(MdlBytesCount > 0)<o:p></o:p></p>

<p class=MsoNormal>         {<o:p></o:p></p>

<p class=MsoNormal>@@ -5274,7 +5321,7 @@<o:p></o:p></p>

<p class=MsoNormal>          
          {<o:p></o:p></p>

<p class=MsoNormal>                        
<o:p></o:p></p>

<p class=MsoNormal>                        
ULONG size = min(PAGE_SIZE, MdlBytesCount);<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
i -= 1;<o:p></o:p></p>

<p class=MsoNormal>+                       
i -= 1;<o:p></o:p></p>

<p class=MsoNormal>                        
pFragList->Elements[i].Length += size;<o:p></o:p></p>

<p class=MsoNormal>                        
MdlBytesCount -= size;<o:p></o:p></p>

<p class=MsoNormal>                    
}<o:p></o:p></p>

<p class=MsoNormal>@@ -5331,517 +5378,517 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_send(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>     IN 
NET_BUFFER_LIST     *p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>     IN 
ULONG              
send_flags)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
PNET_BUFFER                                  
p_netbuf, p_next_netbuf = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
UINT
                                                    
buf_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG                                                
send_complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
KIRQL                                                   
old_irql;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PostSend );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_STATUS         status;<o:p></o:p></p>

<p class=MsoNormal>+   
PNET_BUFFER         p_netbuf,
p_next_netbuf = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
UINT               
buf_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
ULONG              
send_complete_flags = 0;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    KIRQL              
old_irql;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEthHdr );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( QueuePacket );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendMgrQueue );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PostSend );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if (NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
//TODO Tzachid: make an assert here to validate your IRQL<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT (KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>-                             
old_irql = DISPATCH_LEVEL;<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></p>

<p class=MsoNormal>-                             
//ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>-                                             
send_complete_flags);  <o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if
(NDIS_TEST_SEND_AT_DISPATCH_LEVEL(send_flags))<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        //TODO Tzachid:
make an assert here to validate your IRQL<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT
(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+        old_irql =
DISPATCH_LEVEL;<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+       
NDIS_RAISE_IRQL_TO_DISPATCH(&old_irql);<o:p></o:p></p>

<p class=MsoNormal>+        //ASSERT
(KeGetCurrentIrql() == PASSIVE_LEVEL); // Happens<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_SET_SEND_COMPLETE_FLAG(send_complete_flags,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+           
("QP state isnt RTS, exiting from port_send\n"));<o:p></o:p></p>

<p class=MsoNormal>+        NET_BUFFER_LIST_STATUS(p_net_buffer_list)
= NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+       
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>+           
send_complete_flags);  <o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
// You are already here at dispatch<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire( &p_port->send_lock
);<o:p></o:p></p>

<p class=MsoNormal>+    // You are already here at dispatch<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
// We need to init the status here<o:p></o:p></p>

<p class=MsoNormal>-             
// When completing the send, we will set the status NDIS_STATUS_FAILURE if AT
LEAST<o:p></o:p></p>

<p class=MsoNormal>-             
// one of NBs will fail.<o:p></o:p></p>

<p class=MsoNormal>-             
// That is, status can't be updated back to SUCCESS if it previosly was set to
FAILURE<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    // We need to init the status here<o:p></o:p></p>

<p class=MsoNormal>+    // When completing the send, we will set
the status NDIS_STATUS_FAILURE if AT LEAST<o:p></o:p></p>

<p class=MsoNormal>+    // one of NBs will fail.<o:p></o:p></p>

<p class=MsoNormal>+    // That is, status can't be updated back
to SUCCESS if it previosly was set to FAILURE<o:p></o:p></p>

<p class=MsoNormal>+   
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_netbuf != NULL; <o:p></o:p></p>

<p class=MsoNormal>-                             
p_netbuf = NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
++g_ipoib_send_SW;<o:p></o:p></p>

<p class=MsoNormal>-                             
++buf_cnt;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    for (p_netbuf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>+         p_netbuf
!= NULL; <o:p></o:p></p>

<p class=MsoNormal>+         p_netbuf =
NET_BUFFER_NEXT_NB(p_netbuf))<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
++g_ipoib_send_SW;<o:p></o:p></p>

<p class=MsoNormal>+        ++buf_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list,
buf_cnt));<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+               
("Processing netbuffer list: %p buf_cnt = %d\n", p_net_buffer_list,
buf_cnt));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(buf_cnt);<o:p></o:p></p>

<p class=MsoNormal>-             
// Raise reference count of the NBL to the number of its NBs<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) =
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(buf_cnt);<o:p></o:p></p>

<p class=MsoNormal>+    // Raise reference count of the NBL to
the number of its NBs<o:p></o:p></p>

<p class=MsoNormal>+   
IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(p_net_buffer_list) =
(PVOID)(ULONG_PTR)buf_cnt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
for (p_netbuf = NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_netbuf != NULL; <o:p></o:p></p>

<p class=MsoNormal>-                             
p_netbuf = p_next_netbuf)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_next_netbuf = NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></p>

<p class=MsoNormal>+    for (p_netbuf =
NET_BUFFER_LIST_FIRST_NB(p_net_buffer_list);<o:p></o:p></p>

<p class=MsoNormal>+         p_netbuf
!= NULL; <o:p></o:p></p>

<p class=MsoNormal>+         p_netbuf =
p_next_netbuf)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_next_netbuf =
NET_BUFFER_NEXT_NB(p_netbuf);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_send_NB_SG * s_buf = (ipoib_send_NB_SG*) (PVOID)
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></p>

<p class=MsoNormal>-                             
if (s_buf == NULL) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
send_complete_flags); 
              
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>+        ipoib_send_NB_SG
* s_buf = (ipoib_send_NB_SG*) (PVOID)
(cl_qpool_get(&p_port->send_mgr.send_pool));<o:p></o:p></p>

<p class=MsoNormal>+        if (s_buf ==
NULL) {<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+           
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+           
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>+               
send_complete_flags);   <o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
//Set all the data needed for process_sg_list<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_port = p_port;<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_sgl = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_nbl = p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></p>

<p class=MsoNormal>-                             
//TODO remove this line from process_sg_real<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf->p_send_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>+        //Set all the
data needed for process_sg_list<o:p></o:p></p>

<p class=MsoNormal>+        s_buf->p_port
= p_port;<o:p></o:p></p>

<p class=MsoNormal>+        s_buf->p_sgl
= NULL;<o:p></o:p></p>

<p class=MsoNormal>+       
s_buf->p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        s_buf->p_nbl
= p_net_buffer_list;<o:p></o:p></p>

<p class=MsoNormal>+       
s_buf->p_curr_nb = p_netbuf;<o:p></o:p></p>

<p class=MsoNormal>+        //TODO remove
this line from process_sg_real<o:p></o:p></p>

<p class=MsoNormal>+       
s_buf->p_send_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
//We can also define p_sg_buf as a static member of send_buf,<o:p></o:p></p>

<p class=MsoNormal>-                             
// But the problem is that we don't know it's size<o:p></o:p></p>

<p class=MsoNormal>-                             
if (s_buf->p_sg_buf == NULL) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
s_buf->p_sg_buf = (PVOID) cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></p>

<p class=MsoNormal>+        //We can also
define p_sg_buf as a static member of send_buf,<o:p></o:p></p>

<p class=MsoNormal>+        // But the
problem is that we don't know it's size<o:p></o:p></p>

<p class=MsoNormal>+        if
(s_buf->p_sg_buf == NULL) {<o:p></o:p></p>

<p class=MsoNormal>+           
s_buf->p_sg_buf = (PVOID) cl_qpool_get(&p_port->send_mgr.sg_pool);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_INFO_FROM_NB(p_netbuf) = s_buf;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+               
("Netbuf to send = %p\n", p_netbuf) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-                                             
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool ,
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT(pTemp != NULL);<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_sgl = pTemp;<o:p></o:p></p>

<p class=MsoNormal>-                                             
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf,
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
                               
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x,
PhysBufCnt=%ld, NB LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) ,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) );<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, p_netbuf);<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-#else                                  
<o:p></o:p></p>

<p class=MsoNormal>+           
CHAR *pTemp = (CHAR *) ExAllocatePoolWithTag(NonPagedPool ,
p_port->p_adapter->sg_list_size, 'abcd');<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT(pTemp != NULL);<o:p></o:p></p>

<p class=MsoNormal>+           
p_sgl = pTemp;<o:p></o:p></p>

<p class=MsoNormal>+           
CreateFragList(NdisQueryNetBufferPhysicalCount(p_netbuf), p_netbuf,
NET_BUFFER_DATA_LENGTH(p_netbuf), (PMP_FRAG_LIST) p_sgl);<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_FROM_QUEUE(p_netbuf) = NULL;<o:p></o:p></p>

<p class=MsoNormal>+           
/*IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("[%d] Allocation from scratch: Netbuf = %x, found SGL = %x,
PhysBufCnt=%ld, NB LEN = %ld, sg_list_size=%ld\n",<o:p></o:p></p>

<p class=MsoNormal>+                       
buf_cnt, p_netbuf, p_sgl,NdisQueryNetBufferPhysicalCount(p_netbuf) ,<o:p></o:p></p>

<p class=MsoNormal>+                       
NET_BUFFER_DATA_LENGTH(p_netbuf),p_port->p_adapter->sg_list_size) );<o:p></o:p></p>

<p class=MsoNormal>+                       
*/<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_process_sg_list(NULL, NULL, (PSCATTER_GATHER_LIST)p_sgl, p_netbuf);<o:p></o:p></p>

<p class=MsoNormal>+      
     status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+#else          
<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>+           
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
++g_ipoib_send_SW_in_loop;<o:p></o:p></p>

<p class=MsoNormal>+           
++g_ipoib_send_SW_in_loop;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(s_buf->p_sg_buf);<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = NdisMAllocateNetBufferSGList(<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
p_netbuf,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
s_buf,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
p_port->p_adapter->sg_list_size);<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_acquire( &p_port->send_lock
);                      
<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(s_buf->p_sg_buf);<o:p></o:p></p>

<p class=MsoNormal>+           
status = NdisMAllocateNetBufferSGList(<o:p></o:p></p>

<p class=MsoNormal>+                                   
p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>

<p class=MsoNormal>+                                   
p_netbuf,<o:p></o:p></p>

<p class=MsoNormal>+                                   
s_buf,<o:p></o:p></p>

<p class=MsoNormal>+                                   
NDIS_SG_LIST_WRITE_TO_DEVICE,<o:p></o:p></p>

<p class=MsoNormal>+                                   
(PUCHAR )s_buf->p_sg_buf + sizeof(cl_pool_item_t),<o:p></o:p></p>

<p class=MsoNormal>+                                   
p_port->p_adapter->sg_list_size);<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+
           cl_spinlock_acquire(
&p_port->send_lock );      <o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-//                         
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>+//      }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
// TODOD: There is a bug here if we have succeeded in sending some and failed<o:p></o:p></p>

<p class=MsoNormal>-                                             
// with the otheres.<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+           
// TODOD: There is a bug here if we have succeeded in sending some and failed<o:p></o:p></p>

<p class=MsoNormal>+           
// with the otheres.<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* fail net buffer list */<o:p></o:p></p>

<p class=MsoNormal>-                                             
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
send_complete_flags); 
              
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_LOWER_IRQL(old_irql, DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+           
/* fail net buffer list */<o:p></o:p></p>

<p class=MsoNormal>+           
NET_BUFFER_LIST_STATUS(p_net_buffer_list) = status;<o:p></o:p></p>

<p class=MsoNormal>+           
NdisMSendNetBufferListsCompleteX(<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
p_net_buffer_list,<o:p></o:p></p>

<p class=MsoNormal>+               
send_complete_flags);   <o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_LOWER_IRQL(old_irql,
DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline void <o:p></o:p></p>

<p class=MsoNormal> __send_complete_net_buffer(<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
ipoib_send_NB_SG        *s_buf, <o:p></o:p></p>

<p class=MsoNormal>-             
IN           NDIS_STATUS
                  
status,<o:p></o:p></p>

<p class=MsoNormal>-             
IN           ULONG                                                
compl_flags,<o:p></o:p></p>

<p class=MsoNormal>-             
IN          
boolean_t                                          
bLock    ) <o:p></o:p></p>

<p class=MsoNormal>+    IN 
ipoib_send_NB_SG    *s_buf, <o:p></o:p></p>

<p class=MsoNormal>+    IN 
NDIS_STATUS         status,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
ULONG              
compl_flags,<o:p></o:p></p>

<p class=MsoNormal>+    IN 
boolean_t          
bLock   ) <o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( s_buf );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                             
("Processing send completion for NBL=0x%p .\n",  s_buf->p_nbl
));<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
// Free SGL element allocated by NDIS<o:p></o:p></p>

<p class=MsoNormal>-             
// We should do it before freeing the whole NBL<o:p></o:p></p>

<p class=MsoNormal>-             
NdisMFreeNetBufferSGList(<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
s_buf->p_sgl,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
s_buf->p_curr_nb);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
// No need to delete p_sg_buf at this state, we will destroy the whole list at
the end of the execution<o:p></o:p></p>

<p class=MsoNormal>-             
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( s_buf );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT(TRACE_LEVEL_VERBOSE,
IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+       
("Processing send completion for NBL=0x%p .\n",  s_buf->p_nbl
));<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    // Free SGL element allocated by NDIS<o:p></o:p></p>

<p class=MsoNormal>+    // We should do it before freeing the
whole NBL<o:p></o:p></p>

<p class=MsoNormal>+    NdisMFreeNetBufferSGList(<o:p></o:p></p>

<p class=MsoNormal>+                           
s_buf->p_port->p_adapter->NdisMiniportDmaHandle,<o:p></o:p></p>

<p class=MsoNormal>+                           
s_buf->p_sgl,<o:p></o:p></p>

<p class=MsoNormal>+                            s_buf->p_curr_nb);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    // No need to delete p_sg_buf at this
state, we will destroy the whole list at the end of the execution<o:p></o:p></p>

<p class=MsoNormal>+   
//NET_BUFFER_LIST_NEXT_NBL(p_desc->p_netbuf_list) = NULL;<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if (NET_BUFFER_LIST_STATUS(s_buf->p_nbl) != NDIS_STATUS_FAILURE) {<o:p></o:p></p>

<p class=MsoNormal>-                             
//TODO what about other statuses ?????<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if (NET_BUFFER_LIST_STATUS(s_buf->p_nbl)
!= NDIS_STATUS_FAILURE) {<o:p></o:p></p>

<p class=MsoNormal>+        //TODO what
about other statuses ?????<o:p></o:p></p>

<p class=MsoNormal>+       
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>

<p class=MsoNormal>+    NET_BUFFER_LIST_STATUS(s_buf->p_nbl)
= status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch (status) {<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>-                                             
++g_ipoib_send_ack;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></p>

<p class=MsoNormal>-                                             
++g_ipoib_send_reset;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_FAILURE:<o:p></o:p></p>

<p class=MsoNormal>-                                             
++g_ipoib_send_SG_failed;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_PAUSED:<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_SEND_ABORTED:<o:p></o:p></p>

<p class=MsoNormal>-                             
case NDIS_STATUS_RESOURCES:<o:p></o:p></p>

<p class=MsoNormal>-                             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>-             
/* Complete the NBL */<o:p></o:p></p>

<p class=MsoNormal>-             
if (IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></p>

<p class=MsoNormal>-                             
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>

<p class=MsoNormal>-                             
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =         
<o:p></o:p></p>

<p class=MsoNormal>-                                             
(PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></p>

<p class=MsoNormal>+    switch (status) {<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>+           
++g_ipoib_send_ack;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_RESET_IN_PROGRESS:<o:p></o:p></p>

<p class=MsoNormal>+           
++g_ipoib_send_reset;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_FAILURE:<o:p></o:p></p>

<p class=MsoNormal>+           
++g_ipoib_send_SG_failed;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_INVALID_LENGTH:<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_PAUSED:<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_SEND_ABORTED:<o:p></o:p></p>

<p class=MsoNormal>+        case
NDIS_STATUS_RESOURCES:<o:p></o:p></p>

<p class=MsoNormal>+        default:<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+   
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>+    /* Complete the NBL */<o:p></o:p></p>

<p class=MsoNormal>+    if
(IPOIB_GET_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl) == 0) {<o:p></o:p></p>

<p class=MsoNormal>+       
NET_BUFFER_LIST_STATUS(s_buf->p_nbl) = status;<o:p></o:p></p>

<p class=MsoNormal>+       
PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO pLsoInfo =    <o:p></o:p></p>

<p class=MsoNormal>+   
        (PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO)
(PULONG)&NET_BUFFER_LIST_INFO(s_buf->p_nbl,
TcpLargeSendNetBufferListInfo);<o:p></o:p></p>

<p class=MsoNormal>        
if(pLsoInfo->Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE)<o:p></o:p></p>

<p class=MsoNormal>-                             
{            <o:p></o:p></p>

<p class=MsoNormal>-                                             
UINT TcpPayLoad = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
                               
//TODO optimize this code during MSS/LSO building<o:p></o:p></p>

<p class=MsoNormal>-                                             
for (PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>-                                             
     NetBuffer != NULL ; <o:p></o:p></p>

<p class=MsoNormal>-                                             
     NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
pLsoInfo->LsoV1TransmitComplete.TcpPayload =
TcpPayLoad;            <o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
    else if (pLsoInfo->Transmit.Type ==
NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></p>

<p class=MsoNormal>-             
    {<o:p></o:p></p>

<p class=MsoNormal>-             
       
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
       
pLsoInfo->LsoV2TransmitComplete.Type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></p>

<p class=MsoNormal>-             
    }<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if (bLock) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
s_buf->p_nbl, compl_flags );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_spinlock_acquire( &s_buf->p_port->send_lock );  <o:p></o:p></p>

<p class=MsoNormal>-                             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
s_buf->p_nbl, compl_flags );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
} <o:p></o:p></p>

<p class=MsoNormal>+       
{            <o:p></o:p></p>

<p class=MsoNormal>+           
UINT TcpPayLoad = 0;<o:p></o:p></p>

<p class=MsoNormal>+ 
          //TODO optimize
this code during MSS/LSO building<o:p></o:p></p>

<p class=MsoNormal>+           
for (PNET_BUFFER NetBuffer = NET_BUFFER_LIST_FIRST_NB(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>+                
NetBuffer != NULL ; <o:p></o:p></p>

<p class=MsoNormal>+                
NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer))<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+               
TcpPayLoad += s_buf->tcp_payload;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
pLsoInfo->LsoV1TransmitComplete.TcpPayload =
TcpPayLoad;            <o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else if
(pLsoInfo->Transmit.Type == NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
pLsoInfo->LsoV2TransmitComplete.Reserved = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
pLsoInfo->LsoV2TransmitComplete.Type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if (bLock) {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_spinlock_release( &s_buf->p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+           
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
s_buf->p_nbl, compl_flags );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_spinlock_acquire( &s_buf->p_port->send_lock );  <o:p></o:p></p>

<p class=MsoNormal>+        } else {<o:p></o:p></p>

<p class=MsoNormal>+           
NdisMSendNetBufferListsCompleteX( s_buf->p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
s_buf->p_nbl, compl_flags );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    } <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( FreeSendBuf );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisFreeToNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></p>

<p class=MsoNormal>-                                             
s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></p>

<p class=MsoNormal>-             
}             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Dereference the enpoint used for the transfer. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( s_buf->p_endpt ) {<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-#if 0      <o:p></o:p></p>

<p class=MsoNormal>-             
if (status == NDIS_STATUS_SUCCESS) {<o:p></o:p></p>

<p class=MsoNormal>-                             
//++g_ipoib_send_SG_real;<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
++g_ipoib_send_SG_failed;<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+                               
<o:p></o:p></p>

<p class=MsoNormal>+    if( s_buf->p_send_buf )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
FreeSendBuf );<o:p></o:p></p>

<p class=MsoNormal>+       
NdisFreeToNPagedLookasideList( &s_buf->p_port->buf_mgr.send_buf_list,<o:p></o:p></p>

<p class=MsoNormal>+           
s_buf->p_send_buf );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, FreeSendBuf );<o:p></o:p></p>

<p class=MsoNormal>+    }   <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* Dereference the enpoint used for the
transfer. */<o:p></o:p></p>

<p class=MsoNormal>+    if( s_buf->p_endpt ) {<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_endpt_deref( s_buf->p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+#if 0   <o:p></o:p></p>

<p class=MsoNormal>+    if (status == NDIS_STATUS_SUCCESS) {<o:p></o:p></p>

<p class=MsoNormal>+       
//++g_ipoib_send_SG_real;<o:p></o:p></p>

<p class=MsoNormal>+        ipoib_inc_send_stat(
p_port->p_adapter, IP_STAT_SUCCESS, 0 );<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+       
++g_ipoib_send_SG_failed;<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
//Put back into the pool list structure allocated for the NB<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t*
)s_buf);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, SendComp );<o:p></o:p></p>

<p class=MsoNormal>+    //Put back into the pool list structure
allocated for the NB<o:p></o:p></p>

<p class=MsoNormal>+   
cl_qpool_put(&s_buf->p_port->send_mgr.send_pool, (cl_pool_item_t*
)s_buf);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, SendComp );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_resume(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN
boolean_t                                                                                                                    
b_pending )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN
boolean_t                               
b_pending )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_list_item_t                   
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG        *s_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
boolean_t                                          
b_good_port_state = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PostSend );<o:p></o:p></p>

<p class=MsoNormal>+    cl_list_item_t     
*p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG   
*s_buf = NULL;<o:p></o:p></p>

<p class=MsoNormal>+   
boolean_t          
b_good_port_state = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( GetEndpt );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( BuildSendDesc );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( ProcessFailedSends );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PostSend );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM(b_pending);<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM(b_pending);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Invalid port state =%d - Flushing the penging list\n",
p_port->state) );<o:p></o:p></p>

<p class=MsoNormal>-                             
b_good_port_state = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+           
("Invalid port state =%d - Flushing the penging list\n",
p_port->state) );<o:p></o:p></p>

<p class=MsoNormal>+       
b_good_port_state = FALSE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if (p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
};<o:p></o:p></p>

<p class=MsoNormal>-             
p_item =  cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-             
while (p_item != cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>+    if
(p_port->send_mgr.pending_list.count <= 0) {<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    };<o:p></o:p></p>

<p class=MsoNormal>+    p_item =  cl_qlist_remove_head(
&p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+    while (p_item !=
cl_qlist_end(&p_port->send_mgr.pending_list))<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>

<p class=MsoNormal>+        s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if (!b_good_port_state) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
// Port is in error state, flush the list<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
__send_complete_net_buffer(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
} else {<o:p></o:p></p>

<p class=MsoNormal>+        if
(!b_good_port_state) {<o:p></o:p></p>

<p class=MsoNormal>+           
// Port is in error state, flush the list<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>

<p class=MsoNormal>+           
__send_complete_net_buffer(<o:p></o:p></p>

<p class=MsoNormal>+               
s_buf, NDIS_STATUS_FAILURE, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        } else {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
    <o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("No available WQEs.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item  );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL, (PSCATTER_GATHER_LIST)
s_buf->p_sgl, s_buf);<o:p></o:p></p>

<p class=MsoNormal>+           
/* Check the send queue and pend the request if not empty. */<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_port->send_mgr.depth == p_port->p_adapter->params.sq_depth )<o:p></o:p></p>

<p class=MsoNormal>+       
    {<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+                   
("No available WQEs.\n") );<o:p></o:p></p>

<p class=MsoNormal>+               
cl_qlist_insert_head( &p_port->send_mgr.pending_list, p_item  );<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
bool continue_sending = ipoib_process_sg_list_real(NULL, NULL,
(PSCATTER_GATHER_LIST) s_buf->p_sgl, s_buf);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>+           
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if (!continue_sending) {<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list,
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></p>

<p class=MsoNormal>-                                                             
goto Cleanup;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item =  cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
if (!continue_sending) {<o:p></o:p></p>

<p class=MsoNormal>+               
ASSERT (cl_is_item_in_qlist(&p_port->send_mgr.pending_list,
(cl_list_item_t*)(PVOID)s_buf));<o:p></o:p></p>

<p class=MsoNormal>+               
goto Cleanup;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+        p_item = 
cl_qlist_remove_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> Cleanup:<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> //TODO: use s_buf-><data_member> directly,
instead of useless copies<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __send_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
ib_cq_handle_t                                                               
h_cq,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                                                      
*cq_context )<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
ib_cq_handle_t             
h_cq,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void                       
*cq_context )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_wc_t                                                               
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_t                                             
done_list;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t                  
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
ip_stat_sel_t                    
type;<o:p></o:p></p>

<p class=MsoNormal>-             
size_t                                                   
i;<o:p></o:p></p>

<p class=MsoNormal>-             
NET_BUFFER                                     
*p_netbuffer = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+  
 ib_wc_t            
wc[MAX_SEND_WC], *p_wc, *p_free;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_qlist_t          done_list;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t       *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+   
ip_stat_sel_t       type;<o:p></o:p></p>

<p class=MsoNormal>+   
size_t             
i;<o:p></o:p></p>

<p class=MsoNormal>+   
NET_BUFFER          *p_netbuffer =
NULL;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG   
*s_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendCb );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PollSend );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( SendComp );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( FreeSendBuf );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( RearmSend );<o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( PortResume );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendCb );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PollSend );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( SendComp );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( FreeSendBuf );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( RearmSend );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( PortResume );<o:p></o:p></p>

<p class=MsoNormal>  <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(KeGetCurrentIrql() ==
DISPATCH_LEVEL);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_clr( SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_clr( SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( SendCb );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( SendCb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( h_cq );<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM( h_cq );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &done_list );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &done_list );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_send_cb );<o:p></o:p></p>

<p class=MsoNormal>+    p_port = (ipoib_port_t*)cq_context;<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+   
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_send_cb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
for( i = 0; i < MAX_SEND_WC; i++ )<o:p></o:p></p>

<p class=MsoNormal>-                             
wc[i].p_next = &wc[i + 1];<o:p></o:p></p>

<p class=MsoNormal>-             
wc[MAX_SEND_WC - 1].p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    for( i = 0; i < MAX_SEND_WC; i++ )<o:p></o:p></p>

<p class=MsoNormal>+        wc[i].p_next =
&wc[i + 1];<o:p></o:p></p>

<p class=MsoNormal>+    wc[MAX_SEND_WC - 1].p_next = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
do<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_free = wc;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_start( PollSend );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq,
&p_free, &p_wc );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_perf_stop( &p_port->p_adapter->perf, PollSend );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>

<p class=MsoNormal>+    do<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_free = wc;<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_start(
PollSend );<o:p></o:p></p>

<p class=MsoNormal>+        status =
p_port->p_adapter->p_ifc->poll_cq( p_port->ib_mgr.h_send_cq,
&p_free, &p_wc );<o:p></o:p></p>

<p class=MsoNormal>+        cl_perf_stop(
&p_port->p_adapter->perf, PollSend );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
status == IB_SUCCESS || status == IB_NOT_FOUND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
while( p_wc )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_start( SendComp );<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND
|| p_wc->wc_type == IB_WC_LSO);<o:p></o:p></p>

<p class=MsoNormal>-                                             
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Successfull send completion for NBL=0x%p .\n", 
s_buf->p_nbl ));<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( s_buf );<o:p></o:p></p>

<p class=MsoNormal>+        while( p_wc )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+ 
          cl_perf_start(
SendComp );<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( p_wc->status != IB_WCS_SUCCESS || p_wc->wc_type == IB_WC_SEND ||
p_wc->wc_type == IB_WC_LSO);<o:p></o:p></p>

<p class=MsoNormal>+           
s_buf = (ipoib_send_NB_SG*)(uintn_t)p_wc->wr_id;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+               
("Successfull send completion for NBL=0x%p .\n", 
s_buf->p_nbl ));<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( s_buf );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt = s_buf->p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt = s_buf->p_endpt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
switch( p_wc->status )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
case IB_WCS_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( p_endpt->h_mcast )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
p_endpt->dgid.multicast.raw_group_id[13] == 0xFF )<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
type = IP_STAT_BCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
type = IP_STAT_MCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
type = IP_STAT_UCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
NDIS_STATUS status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
switch( p_wc->status )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
case IB_WCS_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>+               
if( p_endpt->h_mcast )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
if( p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>+                       
p_endpt->dgid.multicast.raw_group_id[10] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>+                       
p_endpt->dgid.multicast.raw_group_id[12] == 0xFF &&<o:p></o:p></p>

<p class=MsoNormal>+    
                   p_endpt->dgid.multicast.raw_group_id[13]
== 0xFF )<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
type = IP_STAT_BCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+                   
else<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
type = IP_STAT_MCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
else<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
type = IP_STAT_UCAST_BYTES;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ipoib_inc_send_stat( p_port->p_adapter, type,
NET_BUFFER_DATA_LENGTH(p_netbuffer) );    <o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+               
p_netbuffer = s_buf->p_curr_nb;<o:p></o:p></p>

<p class=MsoNormal>+               
ipoib_inc_send_stat( p_port->p_adapter, type,
NET_BUFFER_DATA_LENGTH(p_netbuffer) );    <o:p></o:p></p>

<p class=MsoNormal>+            
   status = NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Flushed send completion.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>+           
case IB_WCS_WR_FLUSHED_ERR:<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,<o:p></o:p></p>

<p class=MsoNormal>+            
       ("Flushed send
completion.\n") );<o:p></o:p></p>

<p class=MsoNormal>+                   
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_DROPPED, 0 );<o:p></o:p></p>

<p class=MsoNormal>+               
status = NDIS_STATUS_RESET_IN_PROGRESS;<o:p></o:p></p>

<p class=MsoNormal>+               
<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
default:<o:p></o:p></p>

<p class=MsoNormal>-                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
(int)p_wc->vendor_specific) );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
__send_complete_net_buffer(s_buf, status,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></p>

<p class=MsoNormal>+           
default:<o:p></o:p></p>

<p class=MsoNormal>+               
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                   
("Send failed with %s (vendor specific %#x)\n",<o:p></o:p></p>

<p class=MsoNormal>+                   
p_port->p_adapter->p_ifc->get_wc_status_str( p_wc->status ),<o:p></o:p></p>

<p class=MsoNormal>+                   
(int)p_wc->vendor_specific) );<o:p></o:p></p>

<p class=MsoNormal>+                   
ipoib_inc_send_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );<o:p></o:p></p>

<p class=MsoNormal>+               
status = NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+               
break;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
__send_complete_net_buffer(s_buf, status,
NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL, FALSE);<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
cl_atomic_dec( &p_port->send_mgr.depth );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_wc = p_wc->p_next;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_perf_inc( SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/* If we didn't use up every WC, break out. */<o:p></o:p></p>

<p class=MsoNormal>-             
} while( !p_free );<o:p></o:p></p>

<p class=MsoNormal>+           
p_wc = p_wc->p_next;<o:p></o:p></p>

<p class=MsoNormal>+           
cl_perf_inc( SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /* If we didn't
use up every WC, break out. */<o:p></o:p></p>

<p class=MsoNormal>+    } while( !p_free );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Resume any sends awaiting resources. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( PortResume );<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_resume( p_port, TRUE );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, PortResume );<o:p></o:p></p>

<p class=MsoNormal>+    /* Resume any sends awaiting resources.
*/<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( PortResume );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_resume( p_port, TRUE );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, PortResume );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Rearm the CQ. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( RearmSend );<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, RearmSend );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>+    /* Rearm the CQ. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( RearmSend );<o:p></o:p></p>

<p class=MsoNormal>+    status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, RearmSend );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_send_cb );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port, ref_send_cb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, SendCb );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>-             
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, SendCb );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_update_ctr(
&p_port->p_adapter->perf, SendCompBundle );<o:p></o:p></p>

<p class=MsoNormal>+   
//cl_qlist_check_validity(&p_port->send_mgr.pending_list);<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -5853,349 +5900,349 @@<o:p></o:p></p>

<p class=MsoNormal> ******************************************************************************/<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_construct(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qmap_init( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qmap_init( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_init( &p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qmap_init(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qmap_init(
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>

<p class=MsoNormal>+    cl_fmap_init(
&p_port->endpt_mgr.gid_endpts, __gid_cmp );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> //TODO Restore CM<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
void*                    
p_context );<o:p></o:p></p>

<p class=MsoNormal>+IN     
void*       p_context );<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_init(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_fmap_init( &p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisInitializeListHead( &p_port->endpt_mgr.pending_conns );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_event_init( &p_port->endpt_mgr.event, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
               
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_fmap_init(
&p_port->endpt_mgr.conn_endpts, __gid_cmp );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        NdisInitializeListHead(
&p_port->endpt_mgr.pending_conns );<o:p></o:p></p>

<p class=MsoNormal>+       
NdisAllocateSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></p>

<p class=MsoNormal>+        cl_event_init(
&p_port->endpt_mgr.event, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+       
NdisInitializeListHead( &p_port->endpt_mgr.remove_conns );<o:p></o:p></p>

<p class=MsoNormal>+       
NdisAllocateSpinLock( &p_port->endpt_mgr.remove_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_thread_init( &p_port->endpt_mgr.h_thread, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
__endpt_cm_mgr_thread,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
( const void *)p_port, <o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
"CmEndPtMgr" );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        cl_thread_init(
&p_port->endpt_mgr.h_thread, <o:p></o:p></p>

<p class=MsoNormal>+                       
__endpt_cm_mgr_thread,<o:p></o:p></p>

<p class=MsoNormal>+                       
( const void *)p_port, <o:p></o:p></p>

<p class=MsoNormal>+                       
"CmEndPtMgr" );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM(p_port);<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM(p_port);<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> //TODO CM Restore<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_cm_mgr_thread(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
void*                    
p_context )<o:p></o:p></p>

<p class=MsoNormal>+IN     
void*       p_context )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
ib_status;<o:p></o:p></p>

<p class=MsoNormal>-             
LIST_ENTRY                       
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t      *p_port =( ipoib_port_t *)p_context;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>

<p class=MsoNormal>-                             
("Starting Port [%d] Endpt CM thread \n", p_port->port_num ) );<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t ib_status;<o:p></o:p></p>

<p class=MsoNormal>+    LIST_ENTRY     
*p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t    *p_port
=( ipoib_port_t *)p_context;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>

<p class=MsoNormal>+        ("Starting
Port [%d] Endpt CM thread \n", p_port->port_num ) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
while( !p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-                             
while( ( p_item = NdisInterlockedRemoveHeadList( <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
&p_port->endpt_mgr.pending_conns,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>+    while(
!p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
cl_event_wait_on( &p_port->endpt_mgr.event, EVENT_NO_TIMEOUT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+        while( ( p_item
= NdisInterlockedRemoveHeadList( <o:p></o:p></p>

<p class=MsoNormal>+                               
&p_port->endpt_mgr.pending_conns,<o:p></o:p></p>

<p class=MsoNormal>+                               
&p_port->endpt_mgr.conn_lock) ) != NULL )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
continue;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_port->endpt_mgr.thread_is_done )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>+               
continue;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( !p_endpt->conn.h_send_qp )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
               
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                             
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+               
("Endpt[%p] CONNECT REQ to MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt,<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+      
         p_endpt->mac.addr[4],
p_endpt->mac.addr[5] ) );<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
if( !p_endpt->conn.h_send_qp )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );<o:p></o:p></p>

<p class=MsoNormal>+               
if( ib_status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                       
("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status )
);<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+ 
              else<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
ib_status = ipoib_endpt_connect( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+                   
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>

<p class=MsoNormal>+                   
{<o:p></o:p></p>

<p class=MsoNormal>+                       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+                           
("Endpt [ %p ] conn REQ failed status %#x\n", p_endpt, ib_status ) );<o:p></o:p></p>

<p class=MsoNormal>+                   
}<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
if( ib_status != IB_SUCCESS && ib_status != IB_PENDING )<o:p></o:p></p>

<p class=MsoNormal>+            
   {<o:p></o:p></p>

<p class=MsoNormal>+                   
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>

<p class=MsoNormal>+                   
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+                   
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
}//while( p_item != NULL )<o:p></o:p></p>

<p class=MsoNormal>+        }//while( p_item
!= NULL )<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
while( ( p_item = NdisInterlockedRemoveHeadList(<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
&p_port->endpt_mgr.remove_conns,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>

<p class=MsoNormal>+        while( ( p_item
= NdisInterlockedRemoveHeadList(<o:p></o:p></p>

<p class=MsoNormal>+                               
&p_port->endpt_mgr.remove_conns,<o:p></o:p></p>

<p class=MsoNormal>+                               
&p_port->endpt_mgr.remove_lock ) ) != NULL )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, list_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>

<p class=MsoNormal>+           
endpt_cm_set_state( p_endpt, IPOIB_CM_DESTROY );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("\nDESTROYING Endpt[%p]  MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                                             
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+               
("\nDESTROYING Endpt[%p]  MAC %02x:%02x:%02x:%02x:%02x:%02x\n",<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt,<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt->mac.addr[0], p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt->mac.addr[2], p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );<o:p></o:p></p>

<p class=MsoNormal>+           
endpt_cm_flush_recv( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+           
endpt_cm_set_state( p_endpt, IPOIB_CM_DISCONNECTED );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->endpt_mgr.thread_is_done++;<o:p></o:p></p>

<p class=MsoNormal>-             
NdisFreeSpinLock( &p_port->endpt_mgr.conn_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>

<p class=MsoNormal>-                             
(" Port [%d] Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->endpt_mgr.thread_is_done++;<o:p></o:p></p>

<p class=MsoNormal>+    NdisFreeSpinLock(
&p_port->endpt_mgr.conn_lock );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, <o:p></o:p></p>

<p class=MsoNormal>+        (" Port
[%d] Endpt thread is done\n", p_port->port_num ) );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_destroy(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.mac_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( cl_is_qmap_empty( &p_port->endpt_mgr.lid_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.gid_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM(p_port);<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( cl_is_qmap_empty(
&p_port->endpt_mgr.mac_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( cl_is_qmap_empty(
&p_port->endpt_mgr.lid_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( cl_is_fmap_empty(
&p_port->endpt_mgr.gid_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM(p_port);<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
cl_is_fmap_empty( &p_port->endpt_mgr.conn_endpts ) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_remove_all(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all readers to complete. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-                             
;<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* We don't need to initiate destruction - this is called only<o:p></o:p></p>

<p class=MsoNormal>-             
* from the __port_destroying function, and destruction cascades<o:p></o:p></p>

<p class=MsoNormal>-             
* to all child objects.  Just clear all the maps.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qmap_remove_all( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qmap_remove_all( &p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all readers to complete. */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+        ;<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * We don't need to initiate
destruction - this is called only<o:p></o:p></p>

<p class=MsoNormal>+     * from the __port_destroying
function, and destruction cascades<o:p></o:p></p>

<p class=MsoNormal>+     * to all child objects.  Just
clear all the maps.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    cl_qmap_remove_all(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qmap_remove_all(
&p_port->endpt_mgr.lid_endpts );<o:p></o:p></p>

<p class=MsoNormal>+    cl_fmap_remove_all( &p_port->endpt_mgr.gid_endpts
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_reset_all(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t                                
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_item_t                                              
*p_fmap_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t                                  
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_t                                                             
mc_list;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_t                                                             
conn_list;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t                                                              
local_exist = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_LINK_STATE                                          
link_state;<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS_INDICATION       
status_indication;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_map_item_t          
*p_item;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_fmap_item_t         
*p_fmap_item;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t          
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_t     
        mc_list;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_qlist_t             
conn_list;<o:p></o:p></p>

<p class=MsoNormal>+   
uint32_t               
local_exist = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
NDIS_LINK_STATE         link_state;<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_STATUS_INDICATION 
status_indication;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &mc_list );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &conn_list );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all readers to complete. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-                             
;<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &mc_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &conn_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all readers to complete. */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+        ;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_remove_all(p_port);<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_remove_all(p_port);<o:p></o:p></p>

<p class=MsoNormal> #else<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.Header.Size = sizeof(NDIS_LINK_STATE);<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.XmitLinkSpeed = <o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.RcvLinkSpeed  = SET_PORT_RATE_BPS(
p_port->p_adapter->port_rate );<o:p></o:p></p>

<p class=MsoNormal>+           
link_state.Header.Revision = NDIS_LINK_STATE_REVISION_1;<o:p></o:p></p>

<p class=MsoNormal>+           
link_state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;<o:p></o:p></p>

<p class=MsoNormal>+       
    link_state.Header.Size = sizeof(NDIS_LINK_STATE);<o:p></o:p></p>

<p class=MsoNormal>+           
link_state.MediaConnectState = MediaConnectStateDisconnected;<o:p></o:p></p>

<p class=MsoNormal>+           
link_state.MediaDuplexState = MediaDuplexStateFull;<o:p></o:p></p>

<p class=MsoNormal>+           
link_state.XmitLinkSpeed = <o:p></o:p></p>

<p class=MsoNormal>+           
link_state.RcvLinkSpeed  = SET_PORT_RATE_BPS(
p_port->p_adapter->port_rate );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
(PVOID)&link_state,<o:p></o:p></p>

<p class=MsoNormal>-                                             
                                                                               
sizeof(link_state));<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate DISCONNECT!\n")
);<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
(PVOID)&link_state,<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
sizeof(link_state));<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate
Connect\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>

<p class=MsoNormal>+                               
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+                             
  NDIS_STATUS_LINK_STATE,<o:p></o:p></p>

<p class=MsoNormal>+                               
(PVOID)&link_state,<o:p></o:p></p>

<p class=MsoNormal>+                               
sizeof(link_state));<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate
DISCONNECT!\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
link_state.MediaConnectState = MediaConnectStateConnected;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_INIT_NDIS_STATUS_INDICATION(&status_indication,<o:p></o:p></p>

<p class=MsoNormal>+                               
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+                               
NDIS_STATUS_LINK_STATE,<o:p></o:p></p>

<p class=MsoNormal>+                               
(PVOID)&link_state,<o:p></o:p></p>

<p class=MsoNormal>+                               
sizeof(link_state));<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT, ("Indicate
Connect\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
NdisMIndicateStatusEx(p_port->p_adapter->h_adapter,&status_indication);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                                             
//           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
//           
("Link DOWN!\n") );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+               
//  IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+                   
//  ("Link DOWN!\n") );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_local_endpt )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
//TODO: CM RESTORE<o:p></o:p></p>

<p class=MsoNormal>-                             
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->p_local_endpt )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        //TODO: CM
RESTORE<o:p></o:p></p>

<p class=MsoNormal>+       
//ipoib_port_cancel_listen( p_port, p_port->p_local_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_port->p_local_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_port->p_local_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_port->p_local_endpt->dlid ) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_port->p_local_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_local_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qlist_insert_head(<o:p></o:p></p>

<p class=MsoNormal>-                                             
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
local_exist = 1;<o:p></o:p></p>

<p class=MsoNormal>+       
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+           
&p_port->p_local_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+       
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>+           
&p_port->p_local_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_port->p_local_endpt->dlid ) {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_port->p_local_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_local_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+       
cl_qlist_insert_head(<o:p></o:p></p>

<p class=MsoNormal>+           
&mc_list, &p_port->p_local_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+        local_exist = 1;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_local_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_local_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = cl_qmap_next( p_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_endpt->h_mcast )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* We destroy MC endpoints since they will get recreated<o:p></o:p></p>

<p class=MsoNormal>-                                             
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
                               
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_head(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>+    while( p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
cl_qmap_next( p_item );<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_endpt->h_mcast )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* We destroy MC endpoints since they will get recreated<o:p></o:p></p>

<p class=MsoNormal>+            
* when the port comes back up and we rejoin the MC groups.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/* destroy connected endpoints if any */<o:p></o:p></p>

<p class=MsoNormal>-                             
else if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>

<p class=MsoNormal>-                                                             
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>

<p class=MsoNormal>-                                                                             
&p_endpt->conn_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail(<o:p></o:p></p>

<p class=MsoNormal>+               
&mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /* destroy
connected endpoints if any */<o:p></o:p></p>

<p class=MsoNormal>+        else if(
p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>

<p class=MsoNormal>+                
endpt_cm_get_state( p_endpt ) != IPOIB_CM_DISCONNECTED )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>

<p class=MsoNormal>+                   
&p_endpt->conn_item );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_endpt->h_av )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Destroy the AV for all other endpoints. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->h_av = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>-             
               
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        
   cl_qlist_insert_tail(<o:p></o:p></p>

<p class=MsoNormal>+               
&conn_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_endpt->h_av )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* Destroy the AV for all other endpoints. */<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->h_av = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if(
p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+               
("<__endptr_mgr_reset_all: setting p_endpt->dlid to 0\n"));<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//TODO CM<o:p></o:p></p>

<p class=MsoNormal>-             
/*while( cl_qlist_count( &conn_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
endpt_cm_destroy_conn( p_port,<o:p></o:p></p>

<p class=MsoNormal>-                                             
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></p>

<p class=MsoNormal>-             
}*/<o:p></o:p></p>

<p class=MsoNormal>+    //TODO CM<o:p></o:p></p>

<p class=MsoNormal>+    /*while( cl_qlist_count( &conn_list
) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
endpt_cm_destroy_conn( p_port,<o:p></o:p></p>

<p class=MsoNormal>+           
PARENT_STRUCT( cl_qlist_remove_head( &conn_list ),<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_endpt_t, mac_item.pool_item.list_item ) );<o:p></o:p></p>

<p class=MsoNormal>+    }*/<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if(cl_qlist_count( &mc_list ) - local_exist)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->mcast_cnt =  (uint32_t)cl_qlist_count( &mc_list ) - local_exist;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->mcast_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
}             
<o:p></o:p></p>

<p class=MsoNormal>+    if(cl_qlist_count( &mc_list ) -
local_exist)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->mcast_cnt =  (uint32_t)cl_qlist_count( &mc_list ) -
local_exist;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->mcast_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    }   <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt
- local_exist));<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("p_port->mcast_cnt = %d\n", p_port->mcast_cnt
- local_exist));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Destroy all multicast endpoints now that we have released the lock. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( cl_qlist_count( &mc_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_list_item_t    *p_item;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = cl_qlist_remove_head( &mc_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_endpt->obj);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Destroy all multicast endpoints now
that we have released the lock. */<o:p></o:p></p>

<p class=MsoNormal>+    while( cl_qlist_count( &mc_list ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_list_item_t 
*p_item;<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
cl_qlist_remove_head( &mc_list );<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_endpt->obj);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -6207,542 +6254,542 @@<o:p></o:p></p>

<p class=MsoNormal>  */<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_remove(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_endpt )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal> #if 0 //CM<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_item_t*            
p_fmap_item;<o:p></o:p></p>

<p class=MsoNormal>-#endif <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    cl_fmap_item_t* p_fmap_item;<o:p></o:p></p>

<p class=MsoNormal>+#endif  <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* This function must be called from the receive path */<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT(p_port->endpt_rdr > 0);<o:p></o:p></p>

<p class=MsoNormal>+    /* This function must be called from the
receive path */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(p_port->endpt_rdr > 0);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all readers to complete. */    <o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr > 1 )<o:p></o:p></p>

<p class=MsoNormal>-                             
;<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all readers to complete.
*/    <o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr > 1 )<o:p></o:p></p>

<p class=MsoNormal>+        ;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Remove the endpoint from the maps so further requests don't find it. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* The enpoints are *ALWAYS* in both the MAC and GID maps.  They are only<o:p></o:p></p>

<p class=MsoNormal>-             
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    /* Remove the endpoint from the maps so
further requests don't find it. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_qmap_remove_item(
&p_port->endpt_mgr.mac_endpts, &p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * The enpoints are *ALWAYS* in
both the MAC and GID maps.  They are only<o:p></o:p></p>

<p class=MsoNormal>+     * in the LID map if the GID has
the same subnet prefix as us.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    cl_fmap_remove_item(
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->conn_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_fmap_item = cl_fmap_get(
&p_port->endpt_mgr.conn_endpts, &p_endpt->dgid );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if( p_fmap_item
!= cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->conn_item );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+           
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//TODO CM<o:p></o:p></p>

<p class=MsoNormal>-             
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    //TODO CM<o:p></o:p></p>

<p class=MsoNormal>+    //endpt_cm_destroy_conn( p_port, p_endpt
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> NTSTATUS<o:p></o:p></p>

<p class=MsoNormal> ipoib_mac_to_gid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ib_gid_t*                                                                            
p_gid )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT        
ib_gid_t*             
     p_gid )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t*               
p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                              
key = 0;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t*  p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+   
uint64_t        key = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
STATUS_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
*p_gid = p_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    *p_gid = p_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> NTSTATUS<o:p></o:p></p>

<p class=MsoNormal> ipoib_mac_to_path(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ib_path_rec_t*                                                               
p_path )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT        
ib_path_rec_t*   
          p_path )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t*               
p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                              
key = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                
sl;<o:p></o:p></p>

<p class=MsoNormal>-             
net32_t                                               
flow_lbl;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                
hop_limit;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                
pkt_life;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t*  p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    uint64_t     
  key = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t         sl;<o:p></o:p></p>

<p class=MsoNormal>+   
net32_t         flow_lbl;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t         hop_limit;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t         pkt_life;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_local_endpt == NULL )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("No local endpoint.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->p_local_endpt == NULL )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("No local endpoint.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
STATUS_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( mac.addr[0] == 0 && mac.addr[1] == 0 && mac.addr[2] == 0
&&<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[3] == 0 && mac.addr[4] == 0 && mac.addr[5] == 0 )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = p_port->p_local_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( mac.addr[0] == 0 && mac.addr[1]
== 0 && mac.addr[2] == 0 &&<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[3] == 0
&& mac.addr[4] == 0 && mac.addr[5] == 0 )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
p_port->p_local_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>+        if( p_item ==
cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return STATUS_INVALID_PARAMETER;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_path->service_id = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
p_path->dgid = p_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>-             
p_path->sgid = p_port->p_local_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>-             
p_path->dlid = p_endpt->dlid;<o:p></o:p></p>

<p class=MsoNormal>-             
p_path->slid = p_port->p_local_endpt->dlid;<o:p></o:p></p>

<p class=MsoNormal>+    p_path->service_id = 0;<o:p></o:p></p>

<p class=MsoNormal>+    p_path->dgid = p_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>+    p_path->sgid =
p_port->p_local_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>+    p_path->dlid = p_endpt->dlid;<o:p></o:p></p>

<p class=MsoNormal>+    p_path->slid =
p_port->p_local_endpt->dlid;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_member_get_sl_flow_hop(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></p>

<p class=MsoNormal>-                             
&sl,<o:p></o:p></p>

<p class=MsoNormal>-                             
&flow_lbl,<o:p></o:p></p>

<p class=MsoNormal>-                             
&hop_limit<o:p></o:p></p>

<p class=MsoNormal>-                             
);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_path->slid == p_path->dlid )<o:p></o:p></p>

<p class=MsoNormal>-                             
pkt_life = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
pkt_life = p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></p>

<p class=MsoNormal>+    ib_member_get_sl_flow_hop(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.bcast_rec.sl_flow_hop,<o:p></o:p></p>

<p class=MsoNormal>+        &sl,<o:p></o:p></p>

<p class=MsoNormal>+        &flow_lbl,<o:p></o:p></p>

<p class=MsoNormal>+        &hop_limit<o:p></o:p></p>

<p class=MsoNormal>+        );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if( p_path->slid == p_path->dlid )<o:p></o:p></p>

<p class=MsoNormal>+        pkt_life = 0;<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+        pkt_life =
p_port->ib_mgr.bcast_rec.pkt_life;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_path_rec_init_local(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_path,<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_endpt->dgid,<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->p_local_endpt->dgid,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt->dlid,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_local_endpt->dlid,<o:p></o:p></p>

<p class=MsoNormal>-                             
1,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></p>

<p class=MsoNormal>-                             
sl, 0,<o:p></o:p></p>

<p class=MsoNormal>-                             
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></p>

<p class=MsoNormal>-                             
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></p>

<p class=MsoNormal>-                             
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></p>

<p class=MsoNormal>-                             
0 );<o:p></o:p></p>

<p class=MsoNormal>+    ib_path_rec_init_local(<o:p></o:p></p>

<p class=MsoNormal>+        p_path,<o:p></o:p></p>

<p class=MsoNormal>+       
&p_endpt->dgid,<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->p_local_endpt->dgid,<o:p></o:p></p>

<p class=MsoNormal>+       
p_endpt->dlid,<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_local_endpt->dlid,<o:p></o:p></p>

<p class=MsoNormal>+        1,<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.bcast_rec.pkey,<o:p></o:p></p>

<p class=MsoNormal>+        sl, 0,<o:p></o:p></p>

<p class=MsoNormal>+       
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.mtu,<o:p></o:p></p>

<p class=MsoNormal>+       
IB_PATH_SELECTOR_EXACTLY, p_port->ib_mgr.bcast_rec.rate,<o:p></o:p></p>

<p class=MsoNormal>+       
IB_PATH_SELECTOR_EXACTLY, pkt_life,<o:p></o:p></p>

<p class=MsoNormal>+        0 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Set global routing information. */<o:p></o:p></p>

<p class=MsoNormal>-             
ib_path_rec_set_hop_flow_raw( p_path, hop_limit, flow_lbl, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
p_path->tclass = p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></p>

<p class=MsoNormal>+    /* Set global routing information. */<o:p></o:p></p>

<p class=MsoNormal>+    ib_path_rec_set_hop_flow_raw( p_path,
hop_limit, flow_lbl, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    p_path->tclass =
p_port->ib_mgr.bcast_rec.tclass;<o:p></o:p></p>

<p class=MsoNormal>  <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_ref(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ipoib_endpt_t**
const                
pp_endpt )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+ 
      OUT        
ipoib_endpt_t** const       pp_endpt )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS                   
status;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                              
key;<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_STATUS    
status;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+   
uint64_t        key;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
PERF_DECLARE( EndptQueue );<o:p></o:p></p>

<p class=MsoNormal>+    PERF_DECLARE( EndptQueue );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !cl_memcmp( &mac, &p_port->p_adapter->params.conf_mac,
sizeof(mac) ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Discard loopback traffic. */<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Discarding loopback traffic\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !cl_memcmp( &mac,
&p_port->p_adapter->params.conf_mac, sizeof(mac) ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Discard
loopback traffic. */<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Discarding loopback traffic\n") );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
key = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    key = 0;<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                             
("Look for :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE,
IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+        ("Look for
:\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[0],
mac.addr[1], mac.addr[2],<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[3],
mac.addr[4], mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_NO_ROUTE_TO_DESTINATION;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*pp_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_ref( *pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    *pp_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_ref( *pp_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_start( EndptQueue );<o:p></o:p></p>

<p class=MsoNormal>-             
status = ipoib_endpt_queue( *pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_perf_stop( &p_port->p_adapter->perf, EndptQueue );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
*pp_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_start( EndptQueue );<o:p></o:p></p>

<p class=MsoNormal>+    status = ipoib_endpt_queue( *pp_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    cl_perf_stop(
&p_port->p_adapter->perf, EndptQueue );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != NDIS_STATUS_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        *pp_endpt =
NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_get_gid_qpn(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
ib_gid_t*
const                                                
p_gid,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
UNALIGNED net32_t* const       p_qpn )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         ib_gid_t*
const            
p_gid,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         UNALIGNED net32_t*
const    p_qpn )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
UNALIGNED<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                              
key;<o:p></o:p></p>

<p class=MsoNormal>+    UNALIGNED<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+   
uint64_t        key;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
key = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_get( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item == cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    key = 0;<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_get(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item == cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed endpoint lookup.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
*p_gid = p_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>-             
*p_qpn = p_endpt->qpn;<o:p></o:p></p>

<p class=MsoNormal>+    *p_gid = p_endpt->dgid;<o:p></o:p></p>

<p class=MsoNormal>+    *p_qpn = p_endpt->qpn;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static inline ipoib_endpt_t*<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_get_by_gid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ib_gid_t*
const                                                
p_gid )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ib_gid_t*
const            
p_gid )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_item_t              
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    cl_fmap_item_t  *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_fmap_get( &p_port->endpt_mgr.gid_endpts, p_gid );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_fmap_get(
&p_port->endpt_mgr.gid_endpts, p_gid );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item == cl_fmap_end(
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return p_endpt;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ipoib_endpt_t*<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_get_by_lid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
net16_t                                                                                               
lid )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
net16_t                    
lid )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_get( &p_port->endpt_mgr.lid_endpts, lid );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item == cl_qmap_end( &p_port->endpt_mgr.lid_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_get(
&p_port->endpt_mgr.lid_endpts, lid );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item == cl_qmap_end(
&p_port->endpt_mgr.lid_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, lid_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return p_endpt;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> inline ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_insert_locked(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+   
IN          
   ipoib_endpt_t*
const        p_endpt )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                             
("insert  :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[0], mac.addr[1], mac.addr[2],<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[3], mac.addr[4], mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+       
("insert  :\t  MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[0],
mac.addr[1], mac.addr[2],<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[3],
mac.addr[4], mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* __endpt_mgr_insert expects *one* reference to be held when being called. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></p>

<p class=MsoNormal>-             
status= __endpt_mgr_insert( p_port, mac, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* __endpt_mgr_insert expects *one*
reference to be held when being called. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></p>

<p class=MsoNormal>+    status= __endpt_mgr_insert( p_port, mac,
p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> inline ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_insert(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_endpt )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                              
key;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status_t                         
cl_status;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_qitem;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_item_t              
*p_fitem;<o:p></o:p></p>

<p class=MsoNormal>+   
uint64_t        key;<o:p></o:p></p>

<p class=MsoNormal>+    cl_status_t    
cl_status;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_qitem;<o:p></o:p></p>

<p class=MsoNormal>+    cl_fmap_item_t  *p_fitem;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all accesses to the map to complete. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr > 1 )<o:p></o:p></p>

<p class=MsoNormal>-                             
;<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all accesses to the map to
complete. */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr > 1 )<o:p></o:p></p>

<p class=MsoNormal>+        ;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Link the endpoint to the port. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_status = cl_obj_insert_rel_parent_locked(<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_endpt->rel, &p_port->obj, &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Link the endpoint to the port. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_status =
cl_obj_insert_rel_parent_locked(<o:p></o:p></p>

<p class=MsoNormal>+       
&p_endpt->rel, &p_port->obj, &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INVALID_STATE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_status != CL_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_INVALID_STATE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if DBG<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->ref[ref_endpt_track] );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>-                             
("ref  type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc(
&p_port->ref[ref_endpt_track] );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_OBJ,<o:p></o:p></p>

<p class=MsoNormal>+        ("ref 
type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt->mac = mac;<o:p></o:p></p>

<p class=MsoNormal>-             
key = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
p_qitem = cl_qmap_insert(<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_qitem == &p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-             
p_fitem = cl_fmap_insert(<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid, &p_endpt->gid_item
);<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_fitem == &p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_qitem = cl_qmap_insert(<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid,
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_qitem == &p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
if (p_qitem != &p_endpt->lid_item) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
// Since we failed to insert into the list, make sure it is not removed<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->dlid =0;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt->mac = mac;<o:p></o:p></p>

<p class=MsoNormal>+    key = 0;<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    p_qitem = cl_qmap_insert(<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->endpt_mgr.mac_endpts, key, &p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_qitem ==
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+    p_fitem = cl_fmap_insert(<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->endpt_mgr.gid_endpts, &p_endpt->dgid,
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_fitem ==
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_qitem = cl_qmap_insert(<o:p></o:p></p>

<p class=MsoNormal>+           
&p_port->endpt_mgr.lid_endpts, p_endpt->dlid,
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_qitem == &p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+        if (p_qitem !=
&p_endpt->lid_item) {<o:p></o:p></p>

<p class=MsoNormal>+       
    // Since we failed to insert into the list, make sure
it is not removed<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->dlid =0;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_add_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_mcast_rec_t                                                               
*p_mcast_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_mcast_rec_t             
*p_mcast_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
mac_addr_t                      
bcast_mac;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    mac_addr_t     
bcast_mac;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Cache the broadcast group properties for creating future mcast groups.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->ib_mgr.bcast_rec = *p_mcast_rec->p_member_rec;<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Cache the broadcast group
properties for creating future mcast groups.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    p_port->ib_mgr.bcast_rec =
*p_mcast_rec->p_member_rec;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Allocate the broadcast endpoint. */<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt = ipoib_endpt_create( &p_mcast_rec->p_member_rec->mgid,<o:p></o:p></p>

<p class=MsoNormal>-                             
0 , CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_endpt )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
/* set reference to transport to be used while is not attached to the port */<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></p>

<p class=MsoNormal>-             
status = ipoib_endpt_set_mcast( p_endpt, p_port->ib_mgr.h_pd,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->port_num, p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Allocate the broadcast endpoint. */<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt = ipoib_endpt_create(
&p_mcast_rec->p_member_rec->mgid,<o:p></o:p></p>

<p class=MsoNormal>+        0 ,
CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    /* set reference to transport to be used
while is not attached to the port */<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt->is_mcast_listener = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt->p_ifc =
p_port->p_adapter->p_ifc;<o:p></o:p></p>

<p class=MsoNormal>+    status = ipoib_endpt_set_mcast( p_endpt,
p_port->ib_mgr.h_pd,<o:p></o:p></p>

<p class=MsoNormal>+        p_port->port_num,
p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_create_mcast_endpt returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Add the broadcast endpoint to the endpoint map. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    /* Add the broadcast endpoint to the
endpoint map. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memset( &bcast_mac, 0xFF,
sizeof(bcast_mac) );<o:p></o:p></p>

<p class=MsoNormal>+    status = __endpt_mgr_insert_locked(
p_port, bcast_mac, p_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_remove_endpt(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
                               
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                                      
mac )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t                 
mac )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
//TODO CM<o:p></o:p></p>

<p class=MsoNormal>-//         
cl_fmap_item_t  *p_fmap_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
uint64_t                              
key;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    //TODO CM<o:p></o:p></p>

<p class=MsoNormal>+//  cl_fmap_item_t  *p_fmap_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+   
uint64_t        key;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
key = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    key = 0;<o:p></o:p></p>

<p class=MsoNormal>+    cl_memcpy( &key, &mac,
sizeof(mac_addr_t) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Remove the endpoint from the maps so further requests don't find it. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all readers to finish */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-                             
;<o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_remove( &p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Dereference the endpoint.  If the ref count goes to zero, it<o:p></o:p></p>

<p class=MsoNormal>-             
* will get freed.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* The enpoints are *ALWAYS* in both the MAC and GID maps.  They are only<o:p></o:p></p>

<p class=MsoNormal>-                             
* in the LID map if the GID has the same subnet prefix as us.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_fmap_remove_item(<o:p></o:p></p>

<p class=MsoNormal>-                                             
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    /* Remove the endpoint from the maps so
further requests don't find it. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all readers to finish */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+        ;<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_remove(
&p_port->endpt_mgr.mac_endpts, key );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Dereference the endpoint. 
If the ref count goes to zero, it<o:p></o:p></p>

<p class=MsoNormal>+     * will get freed.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * The
enpoints are *ALWAYS* in both the MAC and GID maps.  They are only<o:p></o:p></p>

<p class=MsoNormal>+         * in the
LID map if the GID has the same subnet prefix as us.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+       
cl_fmap_remove_item(<o:p></o:p></p>

<p class=MsoNormal>+           
&p_port->endpt_mgr.gid_endpts, &p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>

<p class=MsoNormal>-                                                                             
&p_endpt->conn_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_port->p_adapter->params.cm_enabled )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_fmap_item = cl_fmap_get( &p_port->endpt_mgr.conn_endpts,
&p_endpt->dgid );<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+           
if( p_fmap_item != cl_fmap_end( &p_port->endpt_mgr.conn_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, <o:p></o:p></p>

<p class=MsoNormal>+                    &p_endpt->conn_item
);<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qmap_remove_item(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+  
         cl_qmap_remove_item(<o:p></o:p></p>

<p class=MsoNormal>+               
&p_port->endpt_mgr.lid_endpts, &p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
//TODO CM<o:p></o:p></p>

<p class=MsoNormal>-                             
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+        //TODO CM<o:p></o:p></p>

<p class=MsoNormal>+       
//endpt_cm_destroy_conn( p_port, p_endpt );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> #if DBG<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_atomic_dec( &p_port->ref[ref_endpt_track] );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></p>

<p class=MsoNormal>+        cl_atomic_dec(
&p_port->ref[ref_endpt_track] );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+           
("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt)
);<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_ENDPT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /*<o:p></o:p></p>

<p class=MsoNormal>  * The sequence for port up is as follows:<o:p></o:p></p>

<p class=MsoNormal>-
*           1. The port goes
active.  This allows the adapter to send SA queries<o:p></o:p></p>

<p class=MsoNormal>-
*           and join the
broadcast group (and other groups).<o:p></o:p></p>

<p class=MsoNormal>+ *  1. The port goes active.  This allows the
adapter to send SA queries<o:p></o:p></p>

<p class=MsoNormal>+ *  and join the broadcast group (and other groups).<o:p></o:p></p>

<p class=MsoNormal>  *<o:p></o:p></p>

<p class=MsoNormal>-
*           2. The adapter
sends an SA query for the broadcast group.<o:p></o:p></p>

<p class=MsoNormal>+ *  2. The adapter sends an SA query for the broadcast
group.<o:p></o:p></p>

<p class=MsoNormal>  *<o:p></o:p></p>

<p class=MsoNormal>- *          
3. Upon completion of the query, the adapter joins the broadcast group.<o:p></o:p></p>

<p class=MsoNormal>+ *  3. Upon completion of the query, the adapter joins
the broadcast group.<o:p></o:p></p>

<p class=MsoNormal>  */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -6751,183 +6798,183 @@<o:p></o:p></p>

<p class=MsoNormal>  */<o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_up(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ib_pnp_port_rec_t*
const          p_pnp_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ib_pnp_port_rec_t* const    p_pnp_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_port_info_t                 
*p_port_info;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_mad_t                                           
*mad_in
             =
NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_mad_t                                           
*mad_out = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status    = IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
static int
                                             
cnt          = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->n_no_progress = 0; // Init the send failure counter<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
if ( p_port->state == IB_QPS_INIT ) <o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("p_port->state = %d - Aborting.\n", p_port->state)
);        <o:p></o:p></p>

<p class=MsoNormal>-                             
goto up_done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else if ( p_port->state == IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
status = IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Port init is done. p_port->state = %d.\n", p_port->state ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
goto up_done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->state = IB_QPS_INIT;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );  <o:p></o:p></p>

<p class=MsoNormal>+   
ib_port_info_t      *p_port_info;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_mad_t           
*mad_in     = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    ib_mad_t           
*mad_out = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status  = IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    static
int         
cnt     = 0;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("[%d] Entering port_up.\n", ++cnt) ); <o:p></o:p></p>

<p class=MsoNormal>+    p_port->n_no_progress = 0; // Init
the send failure counter<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    if ( p_port->state == IB_QPS_INIT ) <o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        status =
IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("p_port->state = %d - Aborting.\n", p_port->state)
);        <o:p></o:p></p>

<p class=MsoNormal>+        goto up_done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else if ( p_port->state == IB_QPS_RTS
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_port->p_adapter->state == IB_PNP_PORT_INIT )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->state = IB_PNP_PORT_ACTIVE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>+        status =
IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Port init is done. p_port->state = %d.\n", p_port->state ) );<o:p></o:p></p>

<p class=MsoNormal>+        goto up_done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_port->state = IB_QPS_INIT;<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj
);  <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all work requests to get flushed. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->recv_mgr.depth || p_port->send_mgr.depth )<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_thread_suspend( 0 );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all work requests to get
flushed. */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->recv_mgr.depth ||
p_port->send_mgr.depth )<o:p></o:p></p>

<p class=MsoNormal>+       
cl_thread_suspend( 0 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeResetEvent( &p_port->sa_event );<o:p></o:p></p>

<p class=MsoNormal>+    KeResetEvent( &p_port->sa_event
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mad_out = (ib_mad_t *) (ib_mad_t*)cl_zalloc(256);<o:p></o:p></p>

<p class=MsoNormal>-             
if(! mad_out)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("failed to allocate mad mad_out\n")); <o:p></o:p></p>

<p class=MsoNormal>-                             
goto up_done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
mad_in = (ib_mad_t *) cl_zalloc(256);<o:p></o:p></p>

<p class=MsoNormal>-             
if(! mad_in)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("failed to allocate mad mad_in\n")); <o:p></o:p></p>

<p class=MsoNormal>-                             
goto up_done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    mad_out = (ib_mad_t *)
(ib_mad_t*)cl_zalloc(256);<o:p></o:p></p>

<p class=MsoNormal>+    if(! mad_out)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("failed to allocate mad mad_out\n")); <o:p></o:p></p>

<p class=MsoNormal>+        goto up_done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    mad_in = (ib_mad_t *) cl_zalloc(256);<o:p></o:p></p>

<p class=MsoNormal>+    if(! mad_in)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("failed to allocate mad mad_in\n")); <o:p></o:p></p>

<p class=MsoNormal>+        goto up_done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;<o:p></o:p></p>

<p class=MsoNormal>-             
mad_in->method = IB_MAD_METHOD_GET;<o:p></o:p></p>

<p class=MsoNormal>-             
mad_in->base_ver = 1;<o:p></o:p></p>

<p class=MsoNormal>-             
mad_in->class_ver =1;<o:p></o:p></p>

<p class=MsoNormal>-             
mad_in->mgmt_class = IB_MCLASS_SUBN_LID;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></p>

<p class=MsoNormal>+    mad_in->attr_id = IB_MAD_ATTR_PORT_INFO;<o:p></o:p></p>

<p class=MsoNormal>+    mad_in->method = IB_MAD_METHOD_GET;<o:p></o:p></p>

<p class=MsoNormal>+    mad_in->base_ver = 1;<o:p></o:p></p>

<p class=MsoNormal>+    mad_in->class_ver =1;<o:p></o:p></p>

<p class=MsoNormal>+    mad_in->mgmt_class =
IB_MCLASS_SUBN_LID;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->local_mad(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_ca ,p_port->port_num ,mad_in ,mad_out);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_local_mad returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
goto up_done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_local_mad returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        goto up_done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port_info = (ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->base_lid = p_pnp_rec->p_port_attr->lid;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Received port info: link width = %d.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port_info->link_width_active) );<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->ib_mgr.rate =<o:p></o:p></p>

<p class=MsoNormal>-                             
ib_port_info_compute_rate( p_port_info );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_set_rate( p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port_info->link_width_active,<o:p></o:p></p>

<p class=MsoNormal>-             
ib_port_info_get_link_speed_active( p_port_info ) );<o:p></o:p></p>

<p class=MsoNormal>+    p_port_info =
(ib_port_info_t*)(((ib_smp_t*)mad_out)->data);<o:p></o:p></p>

<p class=MsoNormal>+    p_port->base_lid =
p_pnp_rec->p_port_attr->lid;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Received port info: link width = %d.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port_info->link_width_active) );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->ib_mgr.rate =<o:p></o:p></p>

<p class=MsoNormal>+        ib_port_info_compute_rate(
p_port_info );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ipoib_set_rate( p_port->p_adapter,<o:p></o:p></p>

<p class=MsoNormal>+       
p_port_info->link_width_active,<o:p></o:p></p>

<p class=MsoNormal>+    ib_port_info_get_link_speed_active(
p_port_info ) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = __port_get_bcast( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if (status != IB_SUCCESS)<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                             
(" __port_get_bcast returned %s\n",p_port->p_adapter->p_ifc->get_err_str(
status )));<o:p></o:p></p>

<p class=MsoNormal>+    status = __port_get_bcast( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if (status != IB_SUCCESS)<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+        ("
__port_get_bcast returned
%s\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> up_done:<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_CANCELED )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_CANCELED )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+       
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>+        p_port->state
= IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if(mad_out)<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_free(mad_out);<o:p></o:p></p>

<p class=MsoNormal>-             
if(mad_in)<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_free(mad_in);<o:p></o:p></p>

<p class=MsoNormal>+    if(mad_out)<o:p></o:p></p>

<p class=MsoNormal>+       
cl_free(mad_out);<o:p></o:p></p>

<p class=MsoNormal>+    if(mad_in)<o:p></o:p></p>

<p class=MsoNormal>+        cl_free(mad_in);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __endpt_mgr_add_local(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_port_info_t*
const                  
p_port_info )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_port_info_t* const       p_port_info )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_gid_t                                                              
gid;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t                                  
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_av_attr_t                                      
av_attr;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_api_status_t         status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_gid_t               
gid;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t          
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_av_attr_t           
av_attr;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ib_gid_set_default( &gid, p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt = ipoib_endpt_create(<o:p></o:p></p>

<p class=MsoNormal>-                             
&gid, p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_endpt )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to create local endpt\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    ib_gid_set_default( &gid,
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt = ipoib_endpt_create(<o:p></o:p></p>

<p class=MsoNormal>+        &gid,
p_port_info->base_lid, p_port->ib_mgr.qpn );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_port->p_adapter->hung
= TRUE;<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to create local endpt\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &av_attr, sizeof(ib_av_attr_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
av_attr.port_num = p_port->port_num;<o:p></o:p></p>

<p class=MsoNormal>-             
av_attr.sl = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                             
(" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid
) ));<o:p></o:p></p>

<p class=MsoNormal>-             
av_attr.dlid = p_port_info->base_lid;<o:p></o:p></p>

<p class=MsoNormal>-             
av_attr.static_rate = p_port->ib_mgr.rate;<o:p></o:p></p>

<p class=MsoNormal>-             
av_attr.path_bits = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->create_av(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &av_attr,
sizeof(ib_av_attr_t) );<o:p></o:p></p>

<p class=MsoNormal>+    av_attr.port_num = p_port->port_num;<o:p></o:p></p>

<p class=MsoNormal>+    av_attr.sl = 0;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+        ("
av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid
) ));<o:p></o:p></p>

<p class=MsoNormal>+    av_attr.dlid = p_port_info->base_lid;<o:p></o:p></p>

<p class=MsoNormal>+    av_attr.static_rate =
p_port->ib_mgr.rate;<o:p></o:p></p>

<p class=MsoNormal>+    av_attr.path_bits = 0;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->create_av(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_pd, &av_attr, &p_endpt->h_av );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_create_av for local endpoint returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* __endpt_mgr_insert expects *one* reference to be held. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_inc( &p_port->endpt_rdr );<o:p></o:p></p>

<p class=MsoNormal>-             
status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac,
p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_dec( &p_port->endpt_rdr );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* __endpt_mgr_insert expects *one*
reference to be held. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_inc( &p_port->endpt_rdr
);<o:p></o:p></p>

<p class=MsoNormal>+    status = __endpt_mgr_insert( p_port,
p_port->p_adapter->params.conf_mac, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_dec( &p_port->endpt_rdr
);<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT_EXIT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__endpt_mgr_insert for local endpoint returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port->p_local_endpt = p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    p_port->p_local_endpt = p_endpt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>@@ -6935,924 +6982,924 @@<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_get_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_query_req_t                               
query;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_user_query_t                             
info;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_member_rec_t                          
member_rec;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_query_req_t      query;<o:p></o:p></p>

<p class=MsoNormal>+    ib_user_query_t    
info;<o:p></o:p></p>

<p class=MsoNormal>+    ib_member_rec_t    
member_rec;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
info.method = IB_MAD_METHOD_GETTABLE;<o:p></o:p></p>

<p class=MsoNormal>-             
info.attr_id = IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></p>

<p class=MsoNormal>-             
info.attr_size = sizeof(ib_member_rec_t);<o:p></o:p></p>

<p class=MsoNormal>-             
info.comp_mask = IB_MCR_COMPMASK_MGID;<o:p></o:p></p>

<p class=MsoNormal>-             
info.p_attr = &member_rec;<o:p></o:p></p>

<p class=MsoNormal>+    info.method = IB_MAD_METHOD_GETTABLE;<o:p></o:p></p>

<p class=MsoNormal>+    info.attr_id =
IB_MAD_ATTR_MCMEMBER_RECORD;<o:p></o:p></p>

<p class=MsoNormal>+    info.attr_size =
sizeof(ib_member_rec_t);<o:p></o:p></p>

<p class=MsoNormal>+    info.comp_mask = IB_MCR_COMPMASK_MGID;<o:p></o:p></p>

<p class=MsoNormal>+    info.p_attr = &member_rec;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Query requires only the MGID. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &member_rec, sizeof(ib_member_rec_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
member_rec.mgid = bcast_mgid_template;<o:p></o:p></p>

<p class=MsoNormal>+    /* Query requires only the MGID. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &member_rec,
sizeof(ib_member_rec_t) );<o:p></o:p></p>

<p class=MsoNormal>+    member_rec.mgid = bcast_mgid_template;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>     member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8) ;<o:p></o:p></p>

<p class=MsoNormal>-             
member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>

<p class=MsoNormal>-             
member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &query, sizeof(ib_query_req_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
query.query_type = IB_QUERY_USER_DEFINED;<o:p></o:p></p>

<p class=MsoNormal>-             
query.p_query_input = &info;<o:p></o:p></p>

<p class=MsoNormal>-             
query.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>-             
query.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>-             
query.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>-             
query.query_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
query.pfn_query_cb = __bcast_get_cb;<o:p></o:p></p>

<p class=MsoNormal>+    member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>

<p class=MsoNormal>+    member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &query,
sizeof(ib_query_req_t) );<o:p></o:p></p>

<p class=MsoNormal>+    query.query_type =
IB_QUERY_USER_DEFINED;<o:p></o:p></p>

<p class=MsoNormal>+    query.p_query_input = &info;<o:p></o:p></p>

<p class=MsoNormal>+    query.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>+    query.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>+    query.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    query.query_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>+    query.pfn_query_cb = __bcast_get_cb;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* reference the object for the multicast query. */<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_get_bcast );<o:p></o:p></p>

<p class=MsoNormal>+    /* reference the object for the
multicast query. */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_get_bcast );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->query(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_get_bcast );<o:p></o:p></p>

<p class=MsoNormal>-//                         
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_query returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_query returned SUCCESS\n"));<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->query(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_get_bcast );<o:p></o:p></p>

<p class=MsoNormal>+//      ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_query returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_ERROR,
IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_query returned SUCCESS\n"));<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /* Callback for the MCMemberRecord Get query for the
IPv4 broadcast group. */<o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __bcast_get_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_query_rec_t                                                               
*p_query_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_query_rec_t             
*p_query_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_member_rec_t                          
*p_mc_req;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ib_member_rec_t    
*p_mc_req;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></p>

<p class=MsoNormal>+    p_port =
(ipoib_port_t*)p_query_rec->query_context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
status = IB_CANCELED;<o:p></o:p></p>

<p class=MsoNormal>-                             
goto done;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_query_rec->status;<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(p_port->state ==
IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        status =
IB_CANCELED;<o:p></o:p></p>

<p class=MsoNormal>+        goto done;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    status = p_query_rec->status;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                             
("status of request %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+        ("status of
request %s\n", <o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( status )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case IB_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_query_rec->result_cnt )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_mc_req = (ib_member_rec_t*)<o:p></o:p></p>

<p class=MsoNormal>-                                                             
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></p>

<p class=MsoNormal>+    switch( status )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    case IB_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_query_rec->result_cnt )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_mc_req = (ib_member_rec_t*)<o:p></o:p></p>

<p class=MsoNormal>+               
ib_get_query_result( p_query_rec->p_result_mad, 0 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
/* Join the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>-                                             
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Fall through. */<o:p></o:p></p>

<p class=MsoNormal>+           
/* Join the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>+           
status = __port_join_bcast( p_port, p_mc_req );<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /* Fall through.
*/<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case IB_REMOTE_ERROR:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* SA failed the query.  Broadcast group doesn't exist, create it. */<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __port_create_bcast( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    case IB_REMOTE_ERROR:<o:p></o:p></p>

<p class=MsoNormal>+        /* SA failed the
query.  Broadcast group doesn't exist, create it. */<o:p></o:p></p>

<p class=MsoNormal>+        status =
__port_create_bcast( p_port );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case IB_CANCELED:<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Instance destroying - Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    case IB_CANCELED:<o:p></o:p></p>

<p class=MsoNormal>+  
     IPOIB_PRINT(TRACE_LEVEL_INFORMATION,
IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Instance destroying - Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
default:<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    default:<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> done:<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_CANCELED )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_CANCELED )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        p_port->state
= IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Return the response MAD to AL. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_query_rec->p_result_mad )<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );<o:p></o:p></p>

<p class=MsoNormal>+    /* Return the response MAD to AL. */<o:p></o:p></p>

<p class=MsoNormal>+    if( p_query_rec->p_result_mad )<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Release the reference taken when issuing the member record query. */<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_bcast_get_cb );<o:p></o:p></p>

<p class=MsoNormal>+    /* Release the reference taken when
issuing the member record query. */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port,
ref_bcast_get_cb );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_join_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_member_rec_t*
const                           
p_member_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_member_rec_t* const      p_member_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_mcast_req_t                               
mcast_req;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_mcast_req_t      mcast_req;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Check that the rate is realizable for our port. */<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->ib_mgr.rate < (p_member_rec->rate & 0x3F) &&<o:p></o:p></p>

<p class=MsoNormal>-                             
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* The MC group rate is higher than our port's rate.  Log an error<o:p></o:p></p>

<p class=MsoNormal>-                             
* and stop.  A port transition will drive the retry.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                             
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></p>

<p class=MsoNormal>-                                             
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></p>

<p class=MsoNormal>-                                             
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Check that the rate is realizable for
our port. */<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->ib_mgr.rate <
(p_member_rec->rate & 0x3F) &&<o:p></o:p></p>

<p class=MsoNormal>+       
(g_ipoib.bypass_check_bcast_rate == 0))<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * The MC group
rate is higher than our port's rate.  Log an error<o:p></o:p></p>

<p class=MsoNormal>+         * and
stop.  A port transition will drive the retry.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Unrealizable join due to rate mismatch.\n") );<o:p></o:p></p>

<p class=MsoNormal>+       
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+           
EVENT_IPOIB_BCAST_RATE, 2,<o:p></o:p></p>

<p class=MsoNormal>+           
(uint32_t)(p_member_rec->rate & 0x3F),<o:p></o:p></p>

<p class=MsoNormal>+           
(uint32_t)p_port->ib_mgr.rate );<o:p></o:p></p>

<p class=MsoNormal>+        return IB_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Join the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Copy the results of the Get to use as parameters. */<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec = *p_member_rec;<o:p></o:p></p>

<p class=MsoNormal>-             
/* We specify our port GID for the join operation. */<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.port_gid.unicast.prefix = IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>+    /* Join the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></p>

<p class=MsoNormal>+    /* Copy the results of the Get to use as
parameters. */<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec = *p_member_rec;<o:p></o:p></p>

<p class=MsoNormal>+    /* We specify our port GID for the join
operation. */<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.port_gid.unicast.prefix
= IB_DEFAULT_SUBNET_PREFIX;<o:p></o:p></p>

<p class=MsoNormal>+   
mcast_req.member_rec.port_gid.unicast.interface_id =<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.mcast_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.mcast_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( ib_member_get_state( mcast_req.member_rec.scope_state ) !=<o:p></o:p></p>

<p class=MsoNormal>-                             
IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></p>

<p class=MsoNormal>-                                             
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( ib_member_get_state(
mcast_req.member_rec.scope_state ) !=<o:p></o:p></p>

<p class=MsoNormal>+     
  IB_MC_REC_STATE_FULL_MEMBER )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Incorrect MC member rec join state in query response.\n") );<o:p></o:p></p>

<p class=MsoNormal>+       
ib_member_set_state( &mcast_req.member_rec.scope_state,<o:p></o:p></p>

<p class=MsoNormal>+           
IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* reference the object for the multicast join request. */<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></p>

<p class=MsoNormal>+    /* reference the object for the
multicast join request. */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_bcast_join_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_join_mcast returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->join_mcast(<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->ib_mgr.h_qp, &mcast_req );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ipoib_port_deref(
p_port, ref_bcast_join_failed );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_join_mcast returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __port_create_bcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_mcast_req_t                               
mcast_req;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_mcast_req_t      mcast_req;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Join the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.create = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Create requires pkey, qkey, SL, flow label, traffic class, joing state<o:p></o:p></p>

<p class=MsoNormal>-             
* and port GID.<o:p></o:p></p>

<p class=MsoNormal>-             
*<o:p></o:p></p>

<p class=MsoNormal>-             
* We specify the MGID since we don't want the SA to generate it for us.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.mgid = bcast_mgid_template;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.mgid.raw[4] = (uint8_t)
(p_port->p_adapter->guids.port_guid.pkey >> 8); <o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.mgid.raw[5] = (uint8_t)
p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_gid_set_default( &mcast_req.member_rec.port_gid,<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* IPOIB spec requires that the QKEY have the MSb set so that the QKEY<o:p></o:p></p>

<p class=MsoNormal>-             
* from the QP is used rather than the QKEY in the send WR.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.qkey =<o:p></o:p></p>

<p class=MsoNormal>-                             
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.mtu =<o:p></o:p></p>

<p class=MsoNormal>-                             
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></p>

<p class=MsoNormal>+    /* Join the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &mcast_req,
sizeof(mcast_req) );<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.create = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Create requires pkey, qkey, SL,
flow label, traffic class, joing state<o:p></o:p></p>

<p class=MsoNormal>+     * and port GID.<o:p></o:p></p>

<p class=MsoNormal>+     *<o:p></o:p></p>

<p class=MsoNormal>+     * We specify the MGID since we
don't want the SA to generate it for us.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.mgid =
bcast_mgid_template;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.mgid.raw[4] =
(uint8_t) (p_port->p_adapter->guids.port_guid.pkey >> 8); <o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.mgid.raw[5] =
(uint8_t) p_port->p_adapter->guids.port_guid.pkey;<o:p></o:p></p>

<p class=MsoNormal>+    ib_gid_set_default(
&mcast_req.member_rec.port_gid,<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->guids.port_guid.guid );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * IPOIB spec requires that the
QKEY have the MSb set so that the QKEY<o:p></o:p></p>

<p class=MsoNormal>+     * from the QP is used rather than
the QKEY in the send WR.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.qkey =<o:p></o:p></p>

<p class=MsoNormal>+       
(uint32_t)(uintn_t)p_port | IB_QP_PRIVILEGED_Q_KEY;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.mtu =<o:p></o:p></p>

<p class=MsoNormal>+       
(IB_PATH_SELECTOR_EXACTLY << 6) | IB_MTU_LEN_2048;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.sl_flow_hop = ib_member_set_sl_flow_hop( 0, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.scope_state =<o:p></o:p></p>

<p class=MsoNormal>-                             
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.sl_flow_hop =
ib_member_set_sl_flow_hop( 0, 0, 0 );<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.scope_state =<o:p></o:p></p>

<p class=MsoNormal>+       
ib_member_set_scope_state( 2, IB_MC_REC_STATE_FULL_MEMBER );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.mcast_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.mcast_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.pfn_mcast_cb = __bcast_cb;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* reference the object for the multicast join request. */<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_join_bcast );<o:p></o:p></p>

<p class=MsoNormal>+    /* reference the object for the
multicast join request. */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_join_bcast
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_bcast_create_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_join_mcast returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_bcast_create_failed );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_join_mcast returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_down(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_qp_mod_t                                   
qp_mod;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_qp_mod_t        
qp_mod;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Mark our state.  This causes all callbacks to abort.<o:p></o:p></p>

<p class=MsoNormal>-             
* Note that we hold the receive lock so that we synchronize<o:p></o:p></p>

<p class=MsoNormal>-             
* with reposting.  We must take the receive lock before the<o:p></o:p></p>

<p class=MsoNormal>-             
* object lock since that is the order taken when reposting.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Mark our state.  This
causes all callbacks to abort.<o:p></o:p></p>

<p class=MsoNormal>+     * Note that we hold the receive
lock so that we synchronize<o:p></o:p></p>

<p class=MsoNormal>+     * with reposting.  We must
take the receive lock before the<o:p></o:p></p>

<p class=MsoNormal>+     * object lock since that is the
order taken when reposting.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__pending_list_destroy(p_port);<o:p></o:p></p>

<p class=MsoNormal>-             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                             
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></p>

<p class=MsoNormal>+    __pending_list_destroy(p_port);<o:p></o:p></p>

<p class=MsoNormal>+    NdisWriteErrorLogEntry(
p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+       
EVENT_IPOIB_PORT_DOWN, 0 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->ib_mgr.h_query )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->ib_mgr.h_query )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>

<p class=MsoNormal>+        p_port->ib_mgr.h_query
= NULL;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeWaitForSingleObject(<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>

<p class=MsoNormal>+    KeWaitForSingleObject(<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->sa_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* garbage collector timer is not needed when link is down */<o:p></o:p></p>

<p class=MsoNormal>-             
KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>

<p class=MsoNormal>-             
KeFlushQueuedDpcs();<o:p></o:p></p>

<p class=MsoNormal>+    /* garbage collector timer is not needed
when link is down */<o:p></o:p></p>

<p class=MsoNormal>+    KeCancelTimer(&p_port->gc_timer);<o:p></o:p></p>

<p class=MsoNormal>+    KeFlushQueuedDpcs();<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Put the QP in the error state.  This removes the need to<o:p></o:p></p>

<p class=MsoNormal>-             
* synchronize with send/receive callbacks.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Put the QP in the error
state.  This removes the need to<o:p></o:p></p>

<p class=MsoNormal>+     * synchronize with send/receive
callbacks.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &qp_mod,
sizeof(ib_qp_mod_t) );<o:p></o:p></p>

<p class=MsoNormal>+    qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_modify_qp to error state returned %s.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></p>

<p class=MsoNormal>+   
KeResetEvent(&p_port->leave_mcast_event);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Reset all endpoints so we don't flush our ARP cache. */<o:p></o:p></p>

<p class=MsoNormal>-             
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    /* Reset all endpoints so we don't flush
our ARP cache. */<o:p></o:p></p>

<p class=MsoNormal>+    __endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeWaitForSingleObject(<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_dereg_addrs( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    KeWaitForSingleObject(<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->leave_mcast_event, Executive, KernelMode, FALSE, NULL );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock(
&p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_dereg_addrs( p_port->p_adapter
);<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock(
&p_port->p_adapter->obj );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __bcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_mcast_rec_t                                                               
*p_mcast_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_mcast_rec_t             
*p_mcast_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t      *p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
LARGE_INTEGER 
            gc_due_time;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t    *p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></p>

<p class=MsoNormal>+    LARGE_INTEGER   gc_due_time;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>

<p class=MsoNormal>+    p_port =
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_bcast_inv_state );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Invalid state - Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_mcast_rec->status;<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Multicast join for broadcast group returned %s.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status == IB_REMOTE_ERROR )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Either:<o:p></o:p></p>

<p class=MsoNormal>-                                             
*            - the join
failed because the group no longer exists<o:p></o:p></p>

<p class=MsoNormal>-                                             
*            - the
create failed because the group already exists<o:p></o:p></p>

<p class=MsoNormal>-                                             
*<o:p></o:p></p>

<p class=MsoNormal>-                                             
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></p>

<p class=MsoNormal>-                                             
* from the top.  Note that as an optimization, it would be<o:p></o:p></p>

<p class=MsoNormal>-                                             
* possible to distinguish between the join and the create.<o:p></o:p></p>

<p class=MsoNormal>-                                             
* If the join fails, try the create.  If the create fails, start<o:p></o:p></p>

<p class=MsoNormal>-                                             
* over with the Get.<o:p></o:p></p>

<p class=MsoNormal>-                                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* TODO: Assert is a place holder.  Can we ever get here if the<o:p></o:p></p>

<p class=MsoNormal>-                                             
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></p>

<p class=MsoNormal>-                                             
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></p>

<p class=MsoNormal>-                                             
if(++p_port->bc_join_retry_cnt <
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
status = __port_get_bcast( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(p_port->state == IB_QPS_INIT
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->state != IB_QPS_INIT )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_bcast_inv_state );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("Invalid state - Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    status = p_mcast_rec->status;<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+   
        ("Multicast join for
broadcast group returned %s.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>

<p class=MsoNormal>+        if( status ==
IB_REMOTE_ERROR )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/*<o:p></o:p></p>

<p class=MsoNormal>+            
* Either:<o:p></o:p></p>

<p class=MsoNormal>+            
*  - the join failed because the group no longer exists<o:p></o:p></p>

<p class=MsoNormal>+            
*  - the create failed because the group already exists<o:p></o:p></p>

<p class=MsoNormal>+            
*<o:p></o:p></p>

<p class=MsoNormal>+            
* Kick off a new Get query to the SA to restart the join process<o:p></o:p></p>

<p class=MsoNormal>+            
* from the top.  Note that as an optimization, it would be<o:p></o:p></p>

<p class=MsoNormal>+            
* possible to distinguish between the join and the create.<o:p></o:p></p>

<p class=MsoNormal>+            
* If the join fails, try the create.  If the create fails, start<o:p></o:p></p>

<p class=MsoNormal>+            
* over with the Get.<o:p></o:p></p>

<p class=MsoNormal>+            
*/<o:p></o:p></p>

<p class=MsoNormal>+           
/* TODO: Assert is a place holder.  Can we ever get here if the<o:p></o:p></p>

<p class=MsoNormal>+           
state isn't IB_PNP_PORT_ADD or PORT_DOWN or PORT_INIT? */<o:p></o:p></p>

<p class=MsoNormal>+           
CL_ASSERT( p_port->p_adapter->state == IB_PNP_PORT_ADD ||<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->state == IB_PNP_PORT_DOWN ||<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->state == IB_PNP_PORT_INIT );<o:p></o:p></p>

<p class=MsoNormal>+           
if(++p_port->bc_join_retry_cnt <
p_port->p_adapter->params.bc_join_retry)<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
status = __port_get_bcast( p_port );<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
else<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+                   
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-                                             
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                                             
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-                                             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_bcast_req_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+           
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>+           
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+           
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_bcast_req_failed );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_port->bc_join_retry_cnt = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_port->p_local_endpt )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ib_port_info_t  port_info;<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></p>

<p class=MsoNormal>-                             
port_info.base_lid = p_port->base_lid;<o:p></o:p></p>

<p class=MsoNormal>-                             
status = __endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                                             
goto err;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_port->p_local_endpt )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ib_port_info_t  port_info;<o:p></o:p></p>

<p class=MsoNormal>+       
cl_memclr(&port_info, sizeof(port_info));<o:p></o:p></p>

<p class=MsoNormal>+       
port_info.base_lid = p_port->base_lid;<o:p></o:p></p>

<p class=MsoNormal>+        status =
__endpt_mgr_add_local( p_port, &port_info );<o:p></o:p></p>

<p class=MsoNormal>+        if( status !=
IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("__endpt_mgr_add_local returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
goto err;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>-                             
status = p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>-                             
goto err;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    status = __endpt_mgr_add_bcast( p_port,
p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__endpt_mgr_add_bcast returned %s\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>+        status =
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
status == IB_SUCCESS );<o:p></o:p></p>

<p class=MsoNormal>+        goto err;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Get the QP ready for action. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = __ib_mgr_activate( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__ib_mgr_activate returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+    /* Get the QP ready for action. */<o:p></o:p></p>

<p class=MsoNormal>+    status = __ib_mgr_activate( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__ib_mgr_activate returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> err:<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Flag the adapter as hung. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->state = IB_QPS_ERROR;        <o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_bcast_error );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+        /* Flag the
adapter as hung. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+       
ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>+        p_port->state
= IB_QPS_ERROR;        <o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_bcast_error );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Only change the state if we're still in INIT. */<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT( p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>-             
if (p_port->state == IB_QPS_INIT) {<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->state = IB_QPS_RTS;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Only change the state if we're still
in INIT. */<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT( p_port->state == IB_QPS_INIT
|| p_port->state == IB_QPS_ERROR);<o:p></o:p></p>

<p class=MsoNormal>+    if (p_port->state == IB_QPS_INIT) {<o:p></o:p></p>

<p class=MsoNormal>+        p_port->state
= IB_QPS_RTS;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Prepost receives. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
__recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    /* Prepost receives. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    __recv_mgr_repost( p_port );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Notify the adapter that we now have an active connection. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = ipoib_set_active( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ib_qp_mod_t                                   
qp_mod;<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_port->ib_mgr.h_query )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_spinlock_release( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+    /* Notify the adapter that we now have
an active connection. */<o:p></o:p></p>

<p class=MsoNormal>+    status = ipoib_set_active(
p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ib_qp_mod_t         qp_mod;<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_set_inactive( p_port->p_adapter );<o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_set_active returned
%s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));<o:p></o:p></p>

<p class=MsoNormal>+       
cl_spinlock_acquire( &p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        p_port->state
= IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_port->ib_mgr.h_query )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->cancel_query(<o:p></o:p></p>

<p class=MsoNormal>+               
p_port->p_adapter->h_al, p_port->ib_mgr.h_query );<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->ib_mgr.h_query = NULL;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_spinlock_release(
&p_port->recv_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( p_port->ib_mgr.h_qp );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>

<p class=MsoNormal>-                             
qp_mod.req_state = IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>-                             
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>

<p class=MsoNormal>-                             
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
p_port->ib_mgr.h_qp );<o:p></o:p></p>

<p class=MsoNormal>+        cl_memclr(
&qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>

<p class=MsoNormal>+        qp_mod.req_state
= IB_QPS_ERROR;<o:p></o:p></p>

<p class=MsoNormal>+        status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>

<p class=MsoNormal>+       
__endpt_mgr_reset_all( p_port );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #if 0 //CM<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->p_adapter->params.cm_enabled &&<o:p></o:p></p>

<p class=MsoNormal>-                             
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Port CM Listen failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>-                                             
/*keep going with UD only */<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->p_adapter->params.cm_enabled
&&<o:p></o:p></p>

<p class=MsoNormal>+       
!p_port->p_local_endpt->conn.h_cm_listen )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if(
ipoib_port_listen( p_port ) != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Port CM Listen failed\n" ) );<o:p></o:p></p>

<p class=MsoNormal>+           
/*keep going with UD only */<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->params.cm_enabled = FALSE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,<o:p></o:p></p>

<p class=MsoNormal>+               
EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>-             
/* garbage collector timer is needed when link is active */<o:p></o:p></p>

<p class=MsoNormal>-             
gc_due_time.QuadPart =
-(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan *
2000000) * 10);<o:p></o:p></p>

<p class=MsoNormal>-             
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></p>

<p class=MsoNormal>-                                             
   
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></p>

<p class=MsoNormal>+    /* garbage collector timer is needed
when link is active */<o:p></o:p></p>

<p class=MsoNormal>+    gc_due_time.QuadPart = -(int64_t)(((uint64_t)p_port->p_adapter->params.mc_leave_rescan
* 2000000) * 10);<o:p></o:p></p>

<p class=MsoNormal>+   
KeSetTimerEx(&p_port->gc_timer,gc_due_time,<o:p></o:p></p>

<p class=MsoNormal>+               
(LONG)p_port->p_adapter->params.mc_leave_rescan*1000,&p_port->gc_dpc);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_join_bcast );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    KeSetEvent( &p_port->sa_event,
EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port, ref_join_bcast
);<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __qp_event(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_async_event_rec_t                 
*p_event_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_async_event_rec_t        *p_event_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_event_rec->context );<o:p></o:p></p>

<p class=MsoNormal>-             
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM( p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_event_rec->context );<o:p></o:p></p>

<p class=MsoNormal>+    ((ipoib_port_t*)p_event_rec->context)->p_adapter->hung
= TRUE;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __cq_event(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_async_event_rec_t                 
*p_event_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_async_event_rec_t        *p_event_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
UNUSED_PARAM( p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( p_event_rec->context );<o:p></o:p></p>

<p class=MsoNormal>-             
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    UNUSED_PARAM( p_event_rec );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( p_event_rec->context );<o:p></o:p></p>

<p class=MsoNormal>+   
((ipoib_port_t*)p_event_rec->context)->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> __ib_mgr_activate(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_dgrm_info_t               
dgrm_info;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_qp_mod_t                   
qp_mod;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t status;<o:p></o:p></p>

<p class=MsoNormal>+    ib_dgrm_info_t  dgrm_info;<o:p></o:p></p>

<p class=MsoNormal>+    ib_qp_mod_t    
qp_mod;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Move the QP to RESET.  This allows us to reclaim any<o:p></o:p></p>

<p class=MsoNormal>-             
* unflushed receives.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );<o:p></o:p></p>

<p class=MsoNormal>-             
qp_mod.req_state = IB_QPS_RESET;<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_modify_qp returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Move the QP to RESET.  This
allows us to reclaim any<o:p></o:p></p>

<p class=MsoNormal>+     * unflushed receives.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &qp_mod,
sizeof(ib_qp_mod_t) );<o:p></o:p></p>

<p class=MsoNormal>+    qp_mod.req_state = IB_QPS_RESET;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp,
&qp_mod );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_modify_qp returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Move the QP to RTS. */<o:p></o:p></p>

<p class=MsoNormal>-             
dgrm_info.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>-             
dgrm_info.qkey = p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>

<p class=MsoNormal>-             
dgrm_info.pkey_index = p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->init_dgrm_svc(
p_port->ib_mgr.h_qp, &dgrm_info );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Move the QP to RTS. */<o:p></o:p></p>

<p class=MsoNormal>+    dgrm_info.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>+    dgrm_info.qkey =
p_port->ib_mgr.bcast_rec.qkey;<o:p></o:p></p>

<p class=MsoNormal>+    dgrm_info.pkey_index =
p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->init_dgrm_svc( p_port->ib_mgr.h_qp,
&dgrm_info );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_init_dgrm_svc returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Rearm the CQs. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_recv_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_rearm_cq for send returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Rearm the CQs. */<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->rearm_cq( p_port->ib_mgr.h_recv_cq, FALSE
);<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+     
  IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_rearm_cq for recv returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    status = p_port->p_adapter->p_ifc->rearm_cq(
p_port->ib_mgr.h_send_cq, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_rearm_cq for send returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>-             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_INIT );<o:p></o:p></p>

<p class=MsoNormal>+    return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /* Transition to a passive level thread. */<o:p></o:p></p>

<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_join_mcast(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
mac_addr_t                                                      
mac,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
uint8_t                                                                
state)<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
mac_addr_t             
mac,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
uint8_t                
state)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_mcast_req_t                               
mcast_req;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t                  
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ib_mcast_req_t      mcast_req;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t       *p_endpt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                             
("Join Multicast request: \n"<o:p></o:p></p>

<p class=MsoNormal>-                             
"\tsrc MAC: %02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[0], mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[2], mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                             
mac.addr[4], mac.addr[5]));<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+        ("Join
Multicast request: \n"<o:p></o:p></p>

<p class=MsoNormal>+        "\tsrc MAC:
%02X-%02X-%02X-%02X-%02X-%02X\n",<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[0],
mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[2],
mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+        mac.addr[4],
mac.addr[5]));<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
switch( __endpt_mgr_ref( p_port, mac, &p_endpt ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-             
case NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
break;<o:p></o:p></p>

<p class=MsoNormal>+    switch( __endpt_mgr_ref( p_port, mac,
&p_endpt ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+    case
NDIS_STATUS_NO_ROUTE_TO_DESTINATION:<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+               
("NDIS_STATUS_NO_ROUTE_TO_DESTINATION\n") );<o:p></o:p></p>

<p class=MsoNormal>+        break;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case NDIS_STATUS_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Fall through */<o:p></o:p></p>

<p class=MsoNormal>+    case NDIS_STATUS_SUCCESS:<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_endpt_deref( p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+        /* Fall through
*/<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
case NDIS_STATUS_PENDING:<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref
called for %p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Issue the mcast request, using the parameters of the broadcast group.<o:p></o:p></p>

<p class=MsoNormal>-             
* This allows us to do a create request that should always succeed since<o:p></o:p></p>

<p class=MsoNormal>-             
* the required parameters are known.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
cl_memclr( &mcast_req, sizeof(mcast_req) );<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.create = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    case NDIS_STATUS_PENDING:<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+           
("<ipoib_port_join_mcast> PENDING\n") );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for
%p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_ENDPT,("__endpt_mgr_ref called for %p\n", p_endpt));<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Issue the mcast request, using
the parameters of the broadcast group.<o:p></o:p></p>

<p class=MsoNormal>+     * This allows us to do a create
request that should always succeed since<o:p></o:p></p>

<p class=MsoNormal>+     * the required parameters are
known.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    cl_memclr( &mcast_req, sizeof(mcast_req)
);<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.create = TRUE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Copy the settings from the broadcast group. */<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec = p_port->ib_mgr.bcast_rec;<o:p></o:p></p>

<p class=MsoNormal>-             
/* Clear fields that aren't specified in the join */<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.mlid = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
ib_member_set_state( &mcast_req.member_rec.scope_state,state);<o:p></o:p></p>

<p class=MsoNormal>+    /* Copy the settings from the broadcast
group. */<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec =
p_port->ib_mgr.bcast_rec;<o:p></o:p></p>

<p class=MsoNormal>+    /* Clear fields that aren't specified in
the join */<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.mlid = 0;<o:p></o:p></p>

<p class=MsoNormal>+    ib_member_set_state(
&mcast_req.member_rec.scope_state,state);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( (mac.addr[0] == 1) && (mac.addr[2] == 0x5E ))<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* Update the address portion of the MGID with the 28 lower bits of the<o:p></o:p></p>

<p class=MsoNormal>-                             
* IP address.  Since we're given a MAC address, we are using <o:p></o:p></p>

<p class=MsoNormal>-                             
* 24 lower bits of that network-byte-ordered value (assuming MSb<o:p></o:p></p>

<p class=MsoNormal>-                             
* is zero) and 4 lsb bits of the first byte of IP address.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[13] = mac.addr[3];<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Handle non IP mutlicast MAC addresses. */<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Update the signature to use the lower 2 bytes of the OpenIB OUI. */<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Now copy the MAC address into the last 6 bytes of the GID. */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( &mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( (mac.addr[0] == 1) &&
(mac.addr[2] == 0x5E ))<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * Update
the address portion of the MGID with the 28 lower bits of the<o:p></o:p></p>

<p class=MsoNormal>+         * IP
address.  Since we're given a MAC address, we are using <o:p></o:p></p>

<p class=MsoNormal>+         * 24 lower
bits of that network-byte-ordered value (assuming MSb<o:p></o:p></p>

<p class=MsoNormal>+         * is zero)
and 4 lsb bits of the first byte of IP address.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[12] = mac.addr[1];<o:p></o:p></p>

<p class=MsoNormal>+        mcast_req.member_rec.mgid.raw[13]
= mac.addr[3];<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[14] = mac.addr[4];<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[15] = mac.addr[5];<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /* Handle non IP
mutlicast MAC addresses. */<o:p></o:p></p>

<p class=MsoNormal>+        /* Update the
signature to use the lower 2 bytes of the OpenIB OUI. */<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[2] = 0x14;<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[3] = 0x05;<o:p></o:p></p>

<p class=MsoNormal>+        /* Now copy the
MAC address into the last 6 bytes of the GID. */<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy(
&mcast_req.member_rec.mgid.raw[10], mac.addr, 6 );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.mcast_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.pfn_mcast_cb = __mcast_cb;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.timeout_ms = p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.retry_cnt = p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.port_guid = p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.pkey_index = p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>-             
mcast_req.member_rec.pkey = cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* Create the endpoint and insert it in the port.  Since we don't wait for<o:p></o:p></p>

<p class=MsoNormal>-             
* the mcast SA operations to complete before returning from the multicast<o:p></o:p></p>

<p class=MsoNormal>-             
* list set OID asynchronously, it is possible for the mcast entry to be<o:p></o:p></p>

<p class=MsoNormal>-             
* cleared before the SA interaction completes.  In this case, when the<o:p></o:p></p>

<p class=MsoNormal>-             
* mcast callback is invoked, it would not find the corresponding endpoint<o:p></o:p></p>

<p class=MsoNormal>-             
* and would be undone.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt = ipoib_endpt_create(<o:p></o:p></p>

<p class=MsoNormal>-                             
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_endpt )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.mcast_context = p_port;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.pfn_mcast_cb = __mcast_cb;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.timeout_ms =
p_port->p_adapter->params.sa_timeout;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.retry_cnt =
p_port->p_adapter->params.sa_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.port_guid =
p_port->p_adapter->guids.port_guid.guid;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.pkey_index =
p_port->pkey_index;<o:p></o:p></p>

<p class=MsoNormal>+    mcast_req.member_rec.pkey =
cl_hton16(p_port->p_adapter->guids.port_guid.pkey);<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * Create the endpoint and insert
it in the port.  Since we don't wait for<o:p></o:p></p>

<p class=MsoNormal>+     * the mcast SA operations to
complete before returning from the multicast<o:p></o:p></p>

<p class=MsoNormal>+     * list set OID asynchronously, it
is possible for the mcast entry to be<o:p></o:p></p>

<p class=MsoNormal>+     * cleared before the SA
interaction completes.  In this case, when the<o:p></o:p></p>

<p class=MsoNormal>+     * mcast callback is invoked, it
would not find the corresponding endpoint<o:p></o:p></p>

<p class=MsoNormal>+     * and would be undone.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt = ipoib_endpt_create(<o:p></o:p></p>

<p class=MsoNormal>+       
&mcast_req.member_rec.mgid, 0, CL_HTON32(0x00FFFFFF) );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_endpt )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_endpt_create failed.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
IB_INSUFFICIENT_MEMORY;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    status = __endpt_mgr_insert_locked(
p_port, mac, p_endpt );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("__endpt_mgr_insert_locked returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* reference the object for the multicast join request. */<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_ref( p_port, ref_join_mcast );<o:p></o:p></p>

<p class=MsoNormal>+    /* reference the object for the
multicast join request. */<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_ref( p_port, ref_join_mcast
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_mcast_join_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ib_join_mcast returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-             
("Joined MCAST group with MGID[10:15]= %0x %0x %0x %0x %0x %0x\n",<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></p>

<p class=MsoNormal>-                             
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></p>

<p class=MsoNormal>+    status =
p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp,
&mcast_req );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_mcast_join_failed );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("ib_join_mcast returned %s\n", <o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+    ("Joined MCAST group with
MGID[10:15]= %0x %0x %0x %0x %0x %0x\n",<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[10],<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[11],<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[12],<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[13],<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[14],<o:p></o:p></p>

<p class=MsoNormal>+       
mcast_req.member_rec.mgid.raw[15]) );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>-             
return status;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    return status;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __mcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ib_mcast_rec_t                                                               
*p_mcast_rec )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ib_mcast_rec_t             
*p_mcast_rec )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ib_api_status_t                               
status;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_fmap_item_t                              
*p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t                  
*p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    ib_api_status_t    
status;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal>+   
cl_fmap_item_t      *p_item;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_endpt_t       *p_endpt;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>

<p class=MsoNormal>+    p_port =
(ipoib_port_t*)p_mcast_rec->mcast_context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if( p_port->state != IB_QPS_RTS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_mcast_rec->status == IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_mcast_inv_state );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid
state - Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state
- Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_mcast_inv_state );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST ,("Invalid
state - Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT ,("Invalid state
- Aborting.\n") );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>-                             
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
__pending_list_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
cl_spinlock_acquire(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>+       
//ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>

<p class=MsoNormal>+       
__pending_list_destroy( p_port );<o:p></o:p></p>

<p class=MsoNormal>+       
cl_spinlock_release(&p_port->send_lock);<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_mcast_rec->status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Multicast join request failed with status %s.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Flag the adapter as hung. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->hung =TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_mcast_req_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( p_mcast_rec->status != IB_SUCCESS
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Multicast join request failed with status %s.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );<o:p></o:p></p>

<p class=MsoNormal>+        /* Flag the
adapter as hung. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->hung =TRUE;<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_mcast_req_failed );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_fmap_get(<o:p></o:p></p>

<p class=MsoNormal>-                             
&p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid
);<o:p></o:p></p>

<p class=MsoNormal>-             
if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
/*<o:p></o:p></p>

<p class=MsoNormal>-                             
* The endpoint must have been flushed while the join request<o:p></o:p></p>

<p class=MsoNormal>-                             
* was outstanding.  Just leave the group and return.  This<o:p></o:p></p>

<p class=MsoNormal>-                             
* is not an error.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to find endpoint for update.\n") );<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_fmap_get(<o:p></o:p></p>

<p class=MsoNormal>+       
&p_port->endpt_mgr.gid_endpts,
&p_mcast_rec->p_member_rec->mgid );<o:p></o:p></p>

<p class=MsoNormal>+    if( p_item == cl_fmap_end(
&p_port->endpt_mgr.gid_endpts ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        /*<o:p></o:p></p>

<p class=MsoNormal>+         * The
endpoint must have been flushed while the join request<o:p></o:p></p>

<p class=MsoNormal>+         * was
outstanding.  Just leave the group and return.  This<o:p></o:p></p>

<p class=MsoNormal>+         * is not
an error.<o:p></o:p></p>

<p class=MsoNormal>+         */<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to find endpoint for update.\n") );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_mcast_no_endpt );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_ref(p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast,
__leave_error_mcast_cb );<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_mcast_no_endpt );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT( IPOIB_DBG_MCAST
);<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, gid_item );<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt->p_ifc = p_port->p_adapter->p_ifc;<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt = PARENT_STRUCT( p_item,
ipoib_endpt_t, gid_item );<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt->p_ifc =
p_port->p_adapter->p_ifc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Setup the endpoint for use. */<o:p></o:p></p>

<p class=MsoNormal>-             
status = ipoib_endpt_set_mcast(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt, p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>-             
if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>-                             
/* Flag the adapter as hung. */<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-                             
ipoib_port_deref( p_port, ref_mcast_av_failed );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Setup the endpoint for use. */<o:p></o:p></p>

<p class=MsoNormal>+    status = ipoib_endpt_set_mcast(<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt,
p_port->ib_mgr.h_pd, p_port->port_num, p_mcast_rec );<o:p></o:p></p>

<p class=MsoNormal>+    if( status != IB_SUCCESS )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_ERROR, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+           
("ipoib_endpt_set_mcast returned %s.\n",<o:p></o:p></p>

<p class=MsoNormal>+           
p_port->p_adapter->p_ifc->get_err_str( status )) );<o:p></o:p></p>

<p class=MsoNormal>+        /* Flag the
adapter as hung. */<o:p></o:p></p>

<p class=MsoNormal>+       
p_port->p_adapter->hung = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+       
ipoib_port_deref( p_port, ref_mcast_av_failed );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_EXIT(
IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/*<o:p></o:p></p>

<p class=MsoNormal>-             
* The endpoint is already in the GID and MAC maps.<o:p></o:p></p>

<p class=MsoNormal>-             
* mast endpoint are not used in the LID map.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT(p_endpt->dlid == 0);<o:p></o:p></p>

<p class=MsoNormal>-             
/* set flag that endpoint is use */<o:p></o:p></p>

<p class=MsoNormal>-             
p_endpt->is_in_use = TRUE;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* Try to send all pending sends. */<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST, ("Calling
ipoib_port_resume from mcast_cb\n"));<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    /*<o:p></o:p></p>

<p class=MsoNormal>+     * The endpoint is already in the
GID and MAC maps.<o:p></o:p></p>

<p class=MsoNormal>+     * mast endpoint are not used in
the LID map.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT(p_endpt->dlid == 0);<o:p></o:p></p>

<p class=MsoNormal>+    /* set flag that endpoint is use */<o:p></o:p></p>

<p class=MsoNormal>+    p_endpt->is_in_use = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* Try to send all pending sends. */<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_INFORMATION,
IPOIB_DBG_MCAST, ("Calling ipoib_port_resume from mcast_cb\n"));<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_resume(p_port , FALSE);<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release( &p_port->send_lock
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_join_mcast );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port, ref_join_mcast
);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_leave_mcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                      
*context )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void               
*context )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t       
*p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)context;<o:p></o:p></p>

<p class=MsoNormal>+    p_port = (ipoib_port_t*)context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt =
%d\n", p_port->mcast_cnt));<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>-             
//It happens<o:p></o:p></p>

<p class=MsoNormal>-             
//ASSERT(p_port->mcast_cnt > 0);<o:p></o:p></p>

<p class=MsoNormal>-             
cl_atomic_dec( &p_port->mcast_cnt);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if(0 == p_port->mcast_cnt)<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
KeSetEvent( &p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_MCAST,("p_port->mcast_cnt
= %d\n", p_port->mcast_cnt));<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port,
ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>+    //It happens<o:p></o:p></p>

<p class=MsoNormal>+    //ASSERT(p_port->mcast_cnt > 0);<o:p></o:p></p>

<p class=MsoNormal>+    cl_atomic_dec(
&p_port->mcast_cnt);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if(0 == p_port->mcast_cnt)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        KeSetEvent(
&p_port->leave_mcast_event, EVENT_INCREMENT, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+           
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> __leave_error_mcast_cb(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
void                                                      
*context )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
void               
*context )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t                     
*p_port;<o:p></o:p></p>

<p class=MsoNormal>+   
ipoib_port_t        *p_port;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_port = (ipoib_port_t*)context;<o:p></o:p></p>

<p class=MsoNormal>+    p_port = (ipoib_port_t*)context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_deref( p_port, ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_deref( p_port,
ref_leave_mcast);<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_PRINT_EXIT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_MCAST,<o:p></o:p></p>

<p class=MsoNormal>+           
("Leave mcast callback deref ipoib_port \n") );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_MCAST );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /*++<o:p></o:p></p>

<p class=MsoNormal>@@ -7874,336 +7921,336 @@<o:p></o:p></p>

<p class=MsoNormal> --*/<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> NDIS_STATUS GetLsoHeaderSize(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
PNET_BUFFER                  
pNetBuffer,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
LsoData                               
*pLsoData,<o:p></o:p></p>

<p class=MsoNormal>-             
OUT      
UINT                                     
*IndexOfData,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
ipoib_hdr_t *ipoib_hdr<o:p></o:p></p>

<p class=MsoNormal>-             
)<o:p></o:p></p>

<p class=MsoNormal>+    IN     
PNET_BUFFER     pNetBuffer,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
LsoData         *pLsoData,<o:p></o:p></p>

<p class=MsoNormal>+    OUT    
UINT           
*IndexOfData,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
ipoib_hdr_t *ipoib_hdr<o:p></o:p></p>

<p class=MsoNormal>+    )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
UINT                     
CurrLength;<o:p></o:p></p>

<p class=MsoNormal>-             
PUCHAR                              
pSrc;<o:p></o:p></p>

<p class=MsoNormal>-             
PUCHAR                              
pCopiedData = pLsoData->coppied_data;<o:p></o:p></p>

<p class=MsoNormal>-             
ip_hdr_t
            
UNALIGNED  *IpHdr;<o:p></o:p></p>

<p class=MsoNormal>-             
tcp_hdr_t           
UNALIGNED *TcpHdr;<o:p></o:p></p>

<p class=MsoNormal>-             
uint16_t              
TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
uint16_t              
IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
uint16_t
             
IpOffset;<o:p></o:p></p>

<p class=MsoNormal>-             
INT                                        
FullBuffers = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
PMDL
                  
pMDL;<o:p></o:p></p>

<p class=MsoNormal>-             
NDIS_STATUS    status = NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    UINT       
CurrLength;<o:p></o:p></p>

<p class=MsoNormal>+    PUCHAR     
pSrc;<o:p></o:p></p>

<p class=MsoNormal>+    PUCHAR     
pCopiedData = pLsoData->coppied_data;<o:p></o:p></p>

<p class=MsoNormal>+    ip_hdr_t   
UNALIGNED  *IpHdr;<o:p></o:p></p>

<p class=MsoNormal>+    tcp_hdr_t   UNALIGNED *TcpHdr;<o:p></o:p></p>

<p class=MsoNormal>+    uint16_t    TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    uint16_t    IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    uint16_t    IpOffset;<o:p></o:p></p>

<p class=MsoNormal>+   
INT         FullBuffers = 0;<o:p></o:p></p>

<p class=MsoNormal>+   
PMDL        pMDL;<o:p></o:p></p>

<p class=MsoNormal>+    NDIS_STATUS status =
NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> #define IP_OFFSET 14;<o:p></o:p></p>

<p class=MsoNormal>-             
//<o:p></o:p></p>

<p class=MsoNormal>-             
// This Flag indicates the way we gets the headers<o:p></o:p></p>

<p class=MsoNormal>-             
// RegularFlow = we get the headers (ETH+IP+TCP) in the same Buffer <o:p></o:p></p>

<p class=MsoNormal>-             
// in sequence.<o:p></o:p></p>

<p class=MsoNormal>-             
//<o:p></o:p></p>

<p class=MsoNormal>-             
boolean_t                                          
IsRegularFlow = TRUE;<o:p></o:p></p>

<p class=MsoNormal>+    //<o:p></o:p></p>

<p class=MsoNormal>+    // This Flag indicates the way we gets
the headers<o:p></o:p></p>

<p class=MsoNormal>+    // RegularFlow = we get the headers
(ETH+IP+TCP) in the same Buffer <o:p></o:p></p>

<p class=MsoNormal>+    // in sequence.<o:p></o:p></p>

<p class=MsoNormal>+    //<o:p></o:p></p>

<p class=MsoNormal>+   
boolean_t          
IsRegularFlow = TRUE;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
const uint16_t
                 
ETH_OFFSET = IP_OFFSET; <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
pLsoData->LsoHeaderSize = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
IpOffset = IP_OFFSET;
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></p>

<p class=MsoNormal>-             
*IndexOfData = 0;<o:p></o:p></p>

<p class=MsoNormal>+    const
uint16_t      ETH_OFFSET = IP_OFFSET; <o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    pLsoData->LsoHeaderSize = 0;<o:p></o:p></p>

<p class=MsoNormal>+    IpOffset = IP_OFFSET;
//(uint16_t)pPort->EncapsulationFormat.EncapsulationHeaderSize;<o:p></o:p></p>

<p class=MsoNormal>+    *IndexOfData = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
pMDL = NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>-             
NdisQueryMdl(pMDL, &pSrc, &CurrLength, NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if (pSrc == NULL) {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
ULONG DataOffset = NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>-             
pSrc += DataOffset;<o:p></o:p></p>

<p class=MsoNormal>-             
CurrLength -= DataOffset;<o:p></o:p></p>

<p class=MsoNormal>+    pMDL =
NET_BUFFER_CURRENT_MDL(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>+    NdisQueryMdl(pMDL, &pSrc,
&CurrLength, NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if (pSrc == NULL) {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ULONG DataOffset =
NET_BUFFER_CURRENT_MDL_OFFSET(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>+    pSrc += DataOffset;<o:p></o:p></p>

<p class=MsoNormal>+    CurrLength -= DataOffset;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
// We start by looking for the ethernet and the IP<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength < ETH_OFFSET) {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
//pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength == ETH_OFFSET) {        <o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
IsRegularFlow = FALSE;        <o:p></o:p></p>

<p class=MsoNormal>-                             
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></p>

<p class=MsoNormal>-                             
pCopiedData += ETH_OFFSET;        <o:p></o:p></p>

<p class=MsoNormal>-                             
FullBuffers++;<o:p></o:p></p>

<p class=MsoNormal>-                             
// First buffer was only ethernet<o:p></o:p></p>

<p class=MsoNormal>-                             
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>+    // We start by looking for the ethernet
and the IP<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength < ETH_OFFSET) {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    //pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + ETH_OFFSET;<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength == ETH_OFFSET)
{        <o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        IsRegularFlow =
FALSE;        <o:p></o:p></p>

<p class=MsoNormal>+       
memcpy(pCopiedData, pSrc, ETH_OFFSET);<o:p></o:p></p>

<p class=MsoNormal>+        pCopiedData +=
ETH_OFFSET;        <o:p></o:p></p>

<p class=MsoNormal>+        FullBuffers++;<o:p></o:p></p>

<p class=MsoNormal>+        // First buffer
was only ethernet<o:p></o:p></p>

<p class=MsoNormal>+        pNetBuffer =
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>         NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer),
&pSrc, &CurrLength, NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>-                             
if (pSrc == NULL) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
    }<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
// This is ETH + IP together (at least)<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
//IMPORTANT: we de-facto replace ETH header by IPoIB header here<o:p></o:p></p>

<p class=MsoNormal>-                             
memcpy (pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
CurrLength -= ETH_OFFSET;<o:p></o:p></p>

<p class=MsoNormal>-                             
pSrc = pSrc + ETH_OFFSET;<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
// we should now be having at least the size of ethernet data<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></p>

<p class=MsoNormal>-             
IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength < IpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
// We now start to find where the TCP header starts<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength == IpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>-                             
// two options : <o:p></o:p></p>

<p class=MsoNormal>-                             
// if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers<o:p></o:p></p>

<p class=MsoNormal>-                             
// if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer <o:p></o:p></p>

<p class=MsoNormal>-                             
// TCP will start at next buffer<o:p></o:p></p>

<p class=MsoNormal>-                             
if(IsRegularFlow){<o:p></o:p></p>

<p class=MsoNormal>-                                             
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>-                                             
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>-                             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                                             
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>-                                             
pCopiedData += IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        if (pSrc ==
NULL) {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+        // This is ETH +
IP together (at least)<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->LsoBuffers[0].pData = pSrc + (ETH_OFFSET - sizeof (ipoib_hdr_t));<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        //IMPORTANT: we
de-facto replace ETH header by IPoIB header here<o:p></o:p></p>

<p class=MsoNormal>+        memcpy
(pLsoData->LsoBuffers[0].pData, ipoib_hdr, sizeof (ipoib_hdr_t));<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        CurrLength -=
ETH_OFFSET;<o:p></o:p></p>

<p class=MsoNormal>+        pSrc = pSrc +
ETH_OFFSET;<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->LsoHeaderSize = pLsoData->LsoHeaderSize + sizeof (ipoib_hdr_t);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    // we should now be having at least the
size of ethernet data<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength < sizeof (ip_hdr_t)) {<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(TRACE_LEVEL_VERBOSE,
IPOIB_DBG_ERROR, ("Error porcessing packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    IpHdr = (ip_hdr_t UNALIGNED*)pSrc;<o:p></o:p></p>

<p class=MsoNormal>+    IpHeaderLen =
(uint16_t)IP_HEADER_LENGTH(IpHdr);<o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(IpHdr->prot == IP_PROT_TCP);<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength < IpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("Error processing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    pLsoData->LsoHeaderSize =
pLsoData->LsoHeaderSize + IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    // We now start to find where the TCP
header starts<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength == IpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT(FALSE);<o:p></o:p></p>

<p class=MsoNormal>+        // two options :
<o:p></o:p></p>

<p class=MsoNormal>+        //
if(IsRegularFlow = FALSE) ==> ETH and IP seperated in two buffers<o:p></o:p></p>

<p class=MsoNormal>+        //
if(IsRegularFlow = TRUE ) ==> ETH and IP in the same buffer <o:p></o:p></p>

<p class=MsoNormal>+        // TCP will
start at next buffer<o:p></o:p></p>

<p class=MsoNormal>+       
if(IsRegularFlow){<o:p></o:p></p>

<p class=MsoNormal>+           
memcpy(pCopiedData, pSrc-ETH_OFFSET ,ETH_OFFSET+IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>+           
pCopiedData += (ETH_OFFSET + IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>+        } else {<o:p></o:p></p>

<p class=MsoNormal>+           
memcpy(pCopiedData, pSrc,IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>+           
pCopiedData += IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
FullBuffers++;<o:p></o:p></p>

<p class=MsoNormal>-                             
IsRegularFlow = FALSE;<o:p></o:p></p>

<p class=MsoNormal>-                             
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></p>

<p class=MsoNormal>-                             
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength,
NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>-                             
pNetBuffer = NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>-                             
if (pSrc == NULL) {<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
// if(IsRegularFlow = TRUE ) ==> the ETH and IP and TCP in the same buffer      
<o:p></o:p></p>

<p class=MsoNormal>-                             
// if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the
same buffer<o:p></o:p></p>

<p class=MsoNormal>-                             
if (IsRegularFlow) {           
<o:p></o:p></p>

<p class=MsoNormal>-                                             
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-                             
} else {            <o:p></o:p></p>

<p class=MsoNormal>-                                             
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>-                                             
pCopiedData += IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>+        FullBuffers++;<o:p></o:p></p>

<p class=MsoNormal>+        IsRegularFlow =
FALSE;<o:p></o:p></p>

<p class=MsoNormal>+       
//NdisGetNextBuffer( CurrBuffer, &CurrBuffer);<o:p></o:p></p>

<p class=MsoNormal>+       
//NdisQueryBufferSafe( CurrBuffer, &pSrc, &CurrLength,
NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+        pNetBuffer =
NET_BUFFER_NEXT_NB(pNetBuffer);<o:p></o:p></p>

<p class=MsoNormal>+       
NdisQueryMdl(NET_BUFFER_CURRENT_MDL(pNetBuffer), &pSrc, &CurrLength,
NormalPagePriority);<o:p></o:p></p>

<p class=MsoNormal>+        if (pSrc ==
NULL) {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+           
return status;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+        // if(IsRegularFlow
= TRUE ) ==> the ETH and IP and TCP in the same
buffer       <o:p></o:p></p>

<p class=MsoNormal>+        //
if(IsRegularFlow = FLASE ) ==> ETH in one buffer , IP+TCP together in the
same buffer<o:p></o:p></p>

<p class=MsoNormal>+        if
(IsRegularFlow)
{            <o:p></o:p></p>

<p class=MsoNormal>+           
pLsoData->LsoBuffers[0].Len += IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+        } else
{            <o:p></o:p></p>

<p class=MsoNormal>+           
memcpy(pCopiedData, pSrc, IpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>+           
pCopiedData += IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
CurrLength -= IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-                             
pSrc = pSrc + IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength < sizeof (tcp_hdr_t)) {<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
// We have finaly found the TCP header<o:p></o:p></p>

<p class=MsoNormal>-             
TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></p>

<p class=MsoNormal>-             
TcpHeaderLen = TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></p>

<p class=MsoNormal>+        CurrLength -=
IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+        pSrc = pSrc +
IpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength < sizeof (tcp_hdr_t))
{<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    // We have finaly found the TCP header<o:p></o:p></p>

<p class=MsoNormal>+    TcpHdr = (tcp_hdr_t UNALIGNED *)pSrc;<o:p></o:p></p>

<p class=MsoNormal>+    TcpHeaderLen =
TCP_HEADER_LENGTH(TcpHdr);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
//ASSERT(TcpHeaderLen == 20);<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength < TcpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>-                             
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing packets\n"));<o:p></o:p></p>

<p class=MsoNormal>-                             
return status;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
pLsoData->LsoHeaderSize =  pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
if(IsRegularFlow){<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else{<o:p></o:p></p>

<p class=MsoNormal>-                             
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>-                             
pCopiedData += TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if (CurrLength == TcpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>-                             
FullBuffers++;<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></p>

<p class=MsoNormal>-                             
*IndexOfData = FullBuffers ;<o:p></o:p></p>

<p class=MsoNormal>-             
} else {<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></p>

<p class=MsoNormal>-                             
*IndexOfData = FullBuffers - 1;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
pLsoData->FullBuffers = FullBuffers; <o:p></o:p></p>

<p class=MsoNormal>-             
if (!IsRegularFlow){<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></p>

<p class=MsoNormal>-                             
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+    //ASSERT(TcpHeaderLen == 20);<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength < TcpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>+       
//IPOIB_PRINT(TRACE_LEVEL_VERBOSE, ETH, ("Error porcessing
packets\n"));<o:p></o:p></p>

<p class=MsoNormal>+        return status;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    pLsoData->LsoHeaderSize = 
pLsoData->LsoHeaderSize + TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    if(IsRegularFlow){<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->LsoBuffers[0].Len += TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else{<o:p></o:p></p>

<p class=MsoNormal>+       
memcpy(pCopiedData, pSrc, TcpHeaderLen);<o:p></o:p></p>

<p class=MsoNormal>+        pCopiedData +=
TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if (CurrLength == TcpHeaderLen) {<o:p></o:p></p>

<p class=MsoNormal>+        FullBuffers++;<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->UsedBuffers = FullBuffers;<o:p></o:p></p>

<p class=MsoNormal>+        *IndexOfData =
FullBuffers ;<o:p></o:p></p>

<p class=MsoNormal>+    } else {<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->UsedBuffers = FullBuffers + 1;<o:p></o:p></p>

<p class=MsoNormal>+        *IndexOfData =
FullBuffers - 1;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    pLsoData->FullBuffers = FullBuffers; <o:p></o:p></p>

<p class=MsoNormal>+    if (!IsRegularFlow){<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->LsoBuffers[0].pData = pLsoData->coppied_data;<o:p></o:p></p>

<p class=MsoNormal>+       
pLsoData->LsoBuffers[0].Len = ETH_OFFSET + IpHeaderLen + TcpHeaderLen;<o:p></o:p></p>

<p class=MsoNormal>+       
ASSERT(pLsoData->LsoBuffers[0].Len <= LSO_MAX_HEADER);<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-static void __port_do_mcast_garbage(ipoib_port_t*
const       p_port)<o:p></o:p></p>

<p class=MsoNormal>+static void __port_do_mcast_garbage(ipoib_port_t* const
p_port)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>     const mac_addr_t
DEFAULT_MCAST_GROUP = {0x01, 0x00, 0x5E, 0x00, 0x00, 0x01};<o:p></o:p></p>

<p class=MsoNormal>-             
/* Do garbage collecting... */<o:p></o:p></p>

<p class=MsoNormal>+    /* Do garbage collecting... */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_map_item_t *p_item;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_t                             
destroy_mc_list;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t                                
cnt;<o:p></o:p></p>

<p class=MsoNormal>-             
const static GC_MAX_LEAVE_NUM = 80;<o:p></o:p></p>

<p class=MsoNormal>+    cl_map_item_t   *p_item;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_endpt_t   *p_endpt;<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_t     
destroy_mc_list;<o:p></o:p></p>

<p class=MsoNormal>+   
uint8_t         cnt;<o:p></o:p></p>

<p class=MsoNormal>+    const static GC_MAX_LEAVE_NUM = 80;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &destroy_mc_list );<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &destroy_mc_list );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
/* Wait for all readers to finish */<o:p></o:p></p>

<p class=MsoNormal>-             
while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>-             
while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ))
&& (cnt < GC_MAX_LEAVE_NUM))<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = cl_qmap_next( p_item );<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_lock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    /* Wait for all readers to finish */<o:p></o:p></p>

<p class=MsoNormal>+    while( p_port->endpt_rdr )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_unlock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_lock(
&p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cnt = 0;<o:p></o:p></p>

<p class=MsoNormal>+    p_item = cl_qmap_head(
&p_port->endpt_mgr.mac_endpts );<o:p></o:p></p>

<p class=MsoNormal>+    while( (p_item != cl_qmap_end(
&p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM))<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );<o:p></o:p></p>

<p class=MsoNormal>+        p_item =
cl_qmap_next( p_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/* Check if the current endpoint is not a multicast listener */<o:p></o:p></p>

<p class=MsoNormal>+        /* Check if the
current endpoint is not a multicast listener */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_endpt->h_mcast && <o:p></o:p></p>

<p class=MsoNormal>-                                             
(!p_endpt->is_mcast_listener) &&<o:p></o:p></p>

<p class=MsoNormal>-                                             
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t)
) &&<o:p></o:p></p>

<p class=MsoNormal>-                                             
(!p_endpt->is_in_use) ))<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal>+        if(
p_endpt->h_mcast && <o:p></o:p></p>

<p class=MsoNormal>+           
(!p_endpt->is_mcast_listener) &&<o:p></o:p></p>

<p class=MsoNormal>+           
( cl_memcmp( &p_endpt->mac, &DEFAULT_MCAST_GROUP, sizeof(mac_addr_t)
) &&<o:p></o:p></p>

<p class=MsoNormal>+            
(!p_endpt->is_in_use) ))<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->mac_item );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+               
&p_endpt->gid_item );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+           
if( p_endpt->dlid )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,<o:p></o:p></p>

<p class=MsoNormal>+                   
&p_endpt->lid_item );<o:p></o:p></p>

<p class=MsoNormal>+               
p_endpt->dlid = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
cnt++;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_endpt->is_in_use = FALSE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_insert_tail(<o:p></o:p></p>

<p class=MsoNormal>+               
&destroy_mc_list, &p_endpt->mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+           
cnt++;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+           
p_endpt->is_in_use = FALSE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_obj_unlock( &p_port->obj );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* Destroy all multicast endpoints now that we have released the lock. */<o:p></o:p></p>

<p class=MsoNormal>-             
while( cl_qlist_count( &destroy_mc_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),<o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("mcast garbage collector: destroying endpoint
%02x:%02x:%02x:%02x:%02x:%02x \n", <o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[0],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[2],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[4],<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_endpt->mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_obj_destroy( &p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    /* Destroy all multicast endpoints now
that we have released the lock. */<o:p></o:p></p>

<p class=MsoNormal>+    while( cl_qlist_count(
&destroy_mc_list ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_endpt =
PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),<o:p></o:p></p>

<p class=MsoNormal>+                                
ipoib_endpt_t, mac_item.pool_item.list_item );<o:p></o:p></p>

<p class=MsoNormal>+        IPOIB_PRINT(
TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,<o:p></o:p></p>

<p class=MsoNormal>+           
("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x
\n", <o:p></o:p></p>

<p class=MsoNormal>+                
p_endpt->mac.addr[0],<o:p></o:p></p>

<p class=MsoNormal>+                
p_endpt->mac.addr[1],<o:p></o:p></p>

<p class=MsoNormal>+                
p_endpt->mac.addr[2],<o:p></o:p></p>

<p class=MsoNormal>+                
p_endpt->mac.addr[3],<o:p></o:p></p>

<p class=MsoNormal>+                
p_endpt->mac.addr[4],<o:p></o:p></p>

<p class=MsoNormal>+                
p_endpt->mac.addr[5]) );<o:p></o:p></p>

<p class=MsoNormal>+        cl_obj_destroy(
&p_endpt->obj );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void __port_mcast_garbage_dpc(KDPC
*p_gc_dpc,void *context,void *s_arg1, void *s_arg2)<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_port_t *p_port = (ipoib_port_t *) context;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_port_t *p_port = (ipoib_port_t *)
context;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></p>

<p class=MsoNormal>-             
UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(p_gc_dpc);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(s_arg1);<o:p></o:p></p>

<p class=MsoNormal>+    UNREFERENCED_PARAMETER(s_arg2);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
__port_do_mcast_garbage(p_port);<o:p></o:p></p>

<p class=MsoNormal>+    __port_do_mcast_garbage(p_port);<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> ipoib_endpt_t*<o:p></o:p></p>

<p class=MsoNormal> ipoib_endpt_get_by_gid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ib_gid_t*
const                                                
p_gid )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ib_gid_t*
const            
p_gid )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
return __endpt_mgr_get_by_gid( p_port, p_gid );<o:p></o:p></p>

<p class=MsoNormal>+    return __endpt_mgr_get_by_gid( p_port,
p_gid );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> ipoib_endpt_t*<o:p></o:p></p>

<p class=MsoNormal> ipoib_endpt_get_by_lid(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const    
net16_t                                                                                               
lid )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const  
net16_t                    
lid )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
return __endpt_mgr_get_by_lid( p_port, lid );<o:p></o:p></p>

<p class=MsoNormal>+    return __endpt_mgr_get_by_lid( p_port,
lid );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> ib_api_status_t<o:p></o:p></p>

<p class=MsoNormal> ipoib_recv_dhcp(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                          
const     ipoib_pkt_t*
const                                         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>-                             
OUT                                      
eth_pkt_t*
const                                            
p_eth,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t*
const                   
p_src,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_endpt_t* const                   
p_dst )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+    IN     
const   ipoib_pkt_t* const         
p_ipoib,<o:p></o:p></p>

<p class=MsoNormal>+       
OUT         eth_pkt_t*
const            p_eth,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_src,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_endpt_t* const        p_dst )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
return __recv_dhcp(<o:p></o:p></p>

<p class=MsoNormal>-                             
p_port, p_ipoib, p_eth, p_src,p_dst );<o:p></o:p></p>

<p class=MsoNormal>+    return __recv_dhcp(<o:p></o:p></p>

<p class=MsoNormal>+        p_port, p_ipoib,
p_eth, p_src,p_dst );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> void<o:p></o:p></p>

<p class=MsoNormal> ipoib_port_cancel_xmit(<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
ipoib_port_t* const                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-             
IN                                                          
PVOID                                                                  
cancel_id )<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
ipoib_port_t* const     p_port,<o:p></o:p></p>

<p class=MsoNormal>+   
IN             
PVOID                   
cancel_id )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
cl_list_item_t                   
*p_item, *p_next;<o:p></o:p></p>

<p class=MsoNormal>-             
ipoib_send_NB_SG        *s_buf;<o:p></o:p></p>

<p class=MsoNormal>-             
PVOID                                  
nbl_id;<o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_t                             
cancel_list;<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+   
cl_list_item_t      *p_item, *p_next;<o:p></o:p></p>

<p class=MsoNormal>+    ipoib_send_NB_SG   
*s_buf;<o:p></o:p></p>

<p class=MsoNormal>+   
PVOID           nbl_id;<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_t     
cancel_list;<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_qlist_init( &cancel_list );<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
ASSERT(FALSE); //TODO ???????????????? Do we reach here ????????????<o:p></o:p></p>

<p class=MsoNormal>+    cl_qlist_init( &cancel_list );<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    ASSERT(FALSE); //TODO ????????????????
Do we reach here ????????????<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_acquire( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_acquire(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
for( p_item = cl_qlist_head( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item != cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>-                             
p_item = p_next )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
p_next = cl_qlist_next( p_item );<o:p></o:p></p>

<p class=MsoNormal>-                             
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>

<p class=MsoNormal>-                             
nbl_id = NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( nbl_id == cancel_id )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>

<p class=MsoNormal>-                                             
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
cl_spinlock_release( &p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal>+    for( p_item = cl_qlist_head(
&p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+        p_item !=
cl_qlist_end( &p_port->send_mgr.pending_list );<o:p></o:p></p>

<p class=MsoNormal>+        p_item = p_next
)<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        p_next =
cl_qlist_next( p_item );<o:p></o:p></p>

<p class=MsoNormal>+        s_buf =
(ipoib_send_NB_SG*) (PVOID) p_item; // TODO: Check this casting<o:p></o:p></p>

<p class=MsoNormal>+        nbl_id =
NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( s_buf->p_nbl );<o:p></o:p></p>

<p class=MsoNormal>+        if( nbl_id ==
cancel_id )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_qlist_remove_item( &p_port->send_mgr.pending_list, p_item );<o:p></o:p></p>

<p class=MsoNormal>+           
NET_BUFFER_LIST_STATUS( s_buf->p_nbl) = NDIS_STATUS_REQUEST_ABORTED ;<o:p></o:p></p>

<p class=MsoNormal>+         
  cl_qlist_insert_tail( &cancel_list, (cl_list_item_t *) s_buf );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    cl_spinlock_release(
&p_port->send_lock );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( cl_qlist_count( &cancel_list ) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
while( ( p_item = cl_qlist_remove_head( &cancel_list )) <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
!= cl_qlist_end( &cancel_list ))<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal>+    if( cl_qlist_count( &cancel_list ) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        while( ( p_item
= cl_qlist_remove_head( &cancel_list )) <o:p></o:p></p>

<p class=MsoNormal>+                               
!= cl_qlist_end( &cancel_list ))<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
s_buf = (ipoib_send_NB_SG*) (PVOID) p_item;<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_DEC_NET_BUFFER_LIST_REF_COUNT(s_buf->p_nbl);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
//TODO don't use DISPATCH LEVEL<o:p></o:p></p>

<p class=MsoNormal>-                                             
__send_complete_net_buffer(<o:p></o:p></p>

<p class=MsoNormal>-                                                             
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
TRUE);<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
//TODO don't use DISPATCH LEVEL<o:p></o:p></p>

<p class=MsoNormal>+           
__send_complete_net_buffer(<o:p></o:p></p>

<p class=MsoNormal>+               
s_buf, NDIS_STATUS_SEND_ABORTED ,NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL,
TRUE);<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> /* <o:p></o:p></p>

<p class=MsoNormal>@@ -8215,305 +8262,305 @@<o:p></o:p></p>

<p class=MsoNormal> #if 0<o:p></o:p></p>

<p class=MsoNormal> static NDIS_STATUS<o:p></o:p></p>

<p class=MsoNormal> __send_fragments(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
ipoib_port_t*
const                                       
p_port,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
ipoib_send_desc_t* const         
p_desc,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
eth_hdr_t*
const                                           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
ip_hdr_t*
const                                                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint32_t                                                                              
buf_len,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
NDIS_BUFFER*                                                
p_ndis_buf )<o:p></o:p></p>

<p class=MsoNormal>+IN      ipoib_port_t*
const         p_port,<o:p></o:p></p>

<p class=MsoNormal>+IN      ipoib_send_desc_t*
const    p_desc,<o:p></o:p></p>

<p class=MsoNormal>+IN      eth_hdr_t*
const           
p_eth_hdr,<o:p></o:p></p>

<p class=MsoNormal>+IN      ip_hdr_t*
const            
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+IN     
uint32_t                   
buf_len,<o:p></o:p></p>

<p class=MsoNormal>+IN     
NDIS_BUFFER*               
p_ndis_buf )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
ds_idx = 1;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
wr_idx = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
sgl_idx = 2; //skip eth hdr, ip hdr<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
options_len = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t*              
p_options = NULL;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t*              
p_buf;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
frag_offset = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
next_sge;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
wr_size = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
total_ip_len = cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    ds_idx = 1;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    wr_idx = 0;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    sgl_idx = 2;
//skip eth hdr, ip hdr<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    options_len =
0;<o:p></o:p></p>

<p class=MsoNormal>+    uint8_t*    p_options =
NULL;<o:p></o:p></p>

<p class=MsoNormal>+    uint8_t*    p_buf;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    frag_offset =
0;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    next_sge;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    wr_size = 0;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    ip_hdr_len =
IP_HEADER_LENGTH( p_ip_hdr );<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    total_ip_len
= cl_ntoh16( p_ip_hdr->length );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
SCATTER_GATHER_LIST                               
*p_sgl;<o:p></o:p></p>

<p class=MsoNormal>+   
SCATTER_GATHER_LIST     *p_sgl;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_ENTER( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( IP_DONT_FRAGMENT(p_ip_hdr) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt,
ScatterGatherListPacketInfo );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_sgl )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
ASSERT( p_sgl );<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to get SGL from packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||<o:p></o:p></p>

<p class=MsoNormal>-                             
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Too many SG Elements in packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_buf = (uint8_t *)<o:p></o:p></p>

<p class=MsoNormal>-                             
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>-             
if( !p_buf )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                             
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
s_buf->p_send_buf = (send_buf_t*)p_buf;<o:p></o:p></p>

<p class=MsoNormal>+    if( IP_DONT_FRAGMENT(p_ip_hdr) )<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_INVALID_PACKET;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    p_sgl =
NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, ScatterGatherListPacketInfo
);<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_sgl )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        ASSERT( p_sgl );<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to get SGL from packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    if( ( p_sgl->NumberOfElements >
MAX_SEND_SGE ||<o:p></o:p></p>

<p class=MsoNormal>+       
p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Too many SG Elements in packet.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_buf = (uint8_t *)<o:p></o:p></p>

<p class=MsoNormal>+       
ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );<o:p></o:p></p>

<p class=MsoNormal>+    if( !p_buf )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+           
("Failed to allocate lookaside buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+        return
NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    s_buf->p_send_buf =
(send_buf_t*)p_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( buf_len < ip_hdr_len )<o:p></o:p></p>

<p class=MsoNormal>-             
{              /*
ip options in a separate buffer */<o:p></o:p></p>

<p class=MsoNormal>-                             
CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_ndis_buf )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to get IP options buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, NormalPagePriority
);<o:p></o:p></p>

<p class=MsoNormal>-                             
if( !p_options )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
("Failed to query IP options buffer address.\n") );<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( p_options && options_len )<o:p></o:p></p>

<p class=MsoNormal>-                             
{ <o:p></o:p></p>

<p class=MsoNormal>-                                             
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
p_options, options_len, TRUE );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
wr_size = buf_len + options_len;<o:p></o:p></p>

<p class=MsoNormal>-                             
sgl_idx++;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{             
/*options probably in the same buffer */<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( p_buf, p_ip_hdr, buf_len );<o:p></o:p></p>

<p class=MsoNormal>-                             
options_len = ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>-                             
if( options_len )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
frag_offset += ( buf_len - ip_hdr_len );<o:p></o:p></p>

<p class=MsoNormal>-                             
wr_size = buf_len;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>+    if( buf_len < ip_hdr_len )<o:p></o:p></p>

<p class=MsoNormal>+    {   /* ip options in a
separate buffer */<o:p></o:p></p>

<p class=MsoNormal>+        CL_ASSERT(
buf_len == sizeof( ip_hdr_t ) );<o:p></o:p></p>

<p class=MsoNormal>+       
NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_ndis_buf
)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to get IP options buffer.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+       
NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len,
NormalPagePriority );<o:p></o:p></p>

<p class=MsoNormal>+        if( !p_options )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,<o:p></o:p></p>

<p class=MsoNormal>+               
("Failed to query IP options buffer address.\n") );<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_FAILURE;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy(
p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>

<p class=MsoNormal>+        if( p_options
&& options_len )<o:p></o:p></p>

<p class=MsoNormal>+        { <o:p></o:p></p>

<p class=MsoNormal>+           
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>

<p class=MsoNormal>+                               
p_options, options_len, TRUE );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        wr_size =
buf_len + options_len;<o:p></o:p></p>

<p class=MsoNormal>+        sgl_idx++;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {   /*options probably in the
same buffer */<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy( p_buf,
p_ip_hdr, buf_len );<o:p></o:p></p>

<p class=MsoNormal>+        options_len =
ip_hdr_len - sizeof( ip_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>+        if( options_len
)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_options = p_buf + sizeof( ip_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        frag_offset += (
buf_len - ip_hdr_len );<o:p></o:p></p>

<p class=MsoNormal>+        wr_size = buf_len;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
/* count how much data can be put into the first WR beside IP header.<o:p></o:p></p>

<p class=MsoNormal>-             
* other protocols headers possibly supplied in subsequent buffers.<o:p></o:p></p>

<p class=MsoNormal>-             
*/<o:p></o:p></p>

<p class=MsoNormal>-             
for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+   
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    /* count how much data can be put into
the first WR beside IP header.<o:p></o:p></p>

<p class=MsoNormal>+     * other protocols headers possibly
supplied in subsequent buffers.<o:p></o:p></p>

<p class=MsoNormal>+     */<o:p></o:p></p>

<p class=MsoNormal>+    for( sgl_idx; sgl_idx <
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        next_sge =
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
/* add sgl if it can fit into the same WR <o:p></o:p></p>

<p class=MsoNormal>-                             
* Note: so far not going to split large SGE between WRs,<o:p></o:p></p>

<p class=MsoNormal>-                             
* so first fragment could be a smaller size.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>-                                             
wr_size += next_sge;<o:p></o:p></p>

<p class=MsoNormal>-                                             
frag_offset += next_sge;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                                             
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
else<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
/* fix ip hdr for the first fragment and move on */<o:p></o:p></p>

<p class=MsoNormal>-                                             
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></p>

<p class=MsoNormal>-                                                             
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></p>

<p class=MsoNormal>+        /* add sgl if it
can fit into the same WR <o:p></o:p></p>

<p class=MsoNormal>+        * Note: so far
not going to split large SGE between WRs,<o:p></o:p></p>

<p class=MsoNormal>+        * so first
fragment could be a smaller size.<o:p></o:p></p>

<p class=MsoNormal>+        */<o:p></o:p></p>

<p class=MsoNormal>+        if( next_sge
<= ( p_port->p_adapter->params.payload_mtu - wr_size ) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>+           
wr_size += next_sge;<o:p></o:p></p>

<p class=MsoNormal>+           
frag_offset += next_sge;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = <o:p></o:p></p>

<p class=MsoNormal>+       
                            p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        else<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
/* fix ip hdr for the first fragment and move on */<o:p></o:p></p>

<p class=MsoNormal>+           
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,<o:p></o:p></p>

<p class=MsoNormal>+               
(uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_buf += ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);<o:p></o:p></p>

<p class=MsoNormal>-                                             
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></p>

<p class=MsoNormal>-                                             
++wr_idx;<o:p></o:p></p>

<p class=MsoNormal>-                                             
ds_idx = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
total_ip_len -= wr_size;<o:p></o:p></p>

<p class=MsoNormal>-             
wr_size = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;<o:p></o:p></p>

<p class=MsoNormal>+           
p_buf += ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>+           
p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);<o:p></o:p></p>

<p class=MsoNormal>+           
frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );<o:p></o:p></p>

<p class=MsoNormal>+           
++wr_idx;<o:p></o:p></p>

<p class=MsoNormal>+           
ds_idx = 0;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    total_ip_len -= wr_size;<o:p></o:p></p>

<p class=MsoNormal>+    wr_size = 0;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
uint32_t              
seg_len;<o:p></o:p></p>

<p class=MsoNormal>-                             
uint64_t              
next_sgl_addr;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></p>

<p class=MsoNormal>-                                             
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>-                             
<o:p></o:p></p>

<p class=MsoNormal>-                             
next_sge = p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>

<p class=MsoNormal>-                             
next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>

<p class=MsoNormal>+    for( sgl_idx, wr_idx; sgl_idx <
p_sgl->NumberOfElements; sgl_idx++ )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
uint32_t    seg_len;<o:p></o:p></p>

<p class=MsoNormal>+       
uint64_t    next_sgl_addr;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        if( wr_idx >=
( MAX_WRS_PER_MSG - 1 ) )<o:p></o:p></p>

<p class=MsoNormal>+           
return NDIS_STATUS_RESOURCES;<o:p></o:p></p>

<p class=MsoNormal>+        <o:p></o:p></p>

<p class=MsoNormal>+        next_sge =
p_sgl->Elements[sgl_idx].Length;<o:p></o:p></p>

<p class=MsoNormal>+        next_sgl_addr =
p_sgl->Elements[sgl_idx].Address.QuadPart;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
while( next_sge )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( ds_idx == 0 )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{             
/* new ipoib + ip header */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>+        while( next_sge
)<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
if( ds_idx == 0 )<o:p></o:p></p>

<p class=MsoNormal>+           
{   /* new ipoib + ip header */<o:p></o:p></p>

<p class=MsoNormal>+               
((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;<o:p></o:p></p>

<p class=MsoNormal>+               
((ipoib_hdr_t*)p_buf)->resv = 0;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>+               
p_buf += sizeof( ipoib_hdr_t );<o:p></o:p></p>

<p class=MsoNormal>+               
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                                             
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( p_options && options_len )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
/* copy ip options if needed */<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>

<p class=MsoNormal>-                                                                                                                             
p_options, options_len, FALSE );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                                             
wr_size = ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( ds_idx == 1 )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>+               
cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );<o:p></o:p></p>

<p class=MsoNormal>+               
if( p_options && options_len )<o:p></o:p></p>

<p class=MsoNormal>+               
{<o:p></o:p></p>

<p class=MsoNormal>+                   
/* copy ip options if needed */<o:p></o:p></p>

<p class=MsoNormal>+                   
__copy_ip_options( &p_buf[sizeof(ip_hdr_t)], <o:p></o:p></p>

<p class=MsoNormal>+                               
p_options, options_len, FALSE );<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+               
wr_size = ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
if( ds_idx == 1 )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+               
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu -
wr_size ) )?<o:p></o:p></p>

<p class=MsoNormal>-                                                             
( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;<o:p></o:p></p>

<p class=MsoNormal>+           
seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu -
wr_size ) )?<o:p></o:p></p>

<p class=MsoNormal>+               
( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>-                                             
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>-                                             
<o:p></o:p></p>

<p class=MsoNormal>-                                             
wr_size += seg_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
total_ip_len -= seg_len;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;<o:p></o:p></p>

<p class=MsoNormal>+           
p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;<o:p></o:p></p>

<p class=MsoNormal>+           
++ds_idx;<o:p></o:p></p>

<p class=MsoNormal>+           
<o:p></o:p></p>

<p class=MsoNormal>+           
wr_size += seg_len;<o:p></o:p></p>

<p class=MsoNormal>+           
total_ip_len -= seg_len;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                                             
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len
== 0 )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{             
/* fix ip hdr for that fragment */<o:p></o:p></p>

<p class=MsoNormal>-                                                             
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></p>

<p class=MsoNormal>-                                                                             
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );<o:p></o:p></p>

<p class=MsoNormal>-                                                             
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
if( total_ip_len > 0 )<o:p></o:p></p>

<p class=MsoNormal>-                                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
++wr_idx;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
wr_size = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
ds_idx = 0;<o:p></o:p></p>

<p class=MsoNormal>-                                                                             
p_buf += ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>-                                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                                             
next_sge -= seg_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
if( next_sge > 0 )<o:p></o:p></p>

<p class=MsoNormal>-                                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                                             
next_sgl_addr += seg_len;<o:p></o:p></p>

<p class=MsoNormal>-                                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_desc->num_wrs += wr_idx;<o:p></o:p></p>

<p class=MsoNormal>-             
<o:p></o:p></p>

<p class=MsoNormal>-             
IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>-             
return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal>+           
if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len
== 0 )<o:p></o:p></p>

<p class=MsoNormal>+           
{   /* fix ip hdr for that fragment */<o:p></o:p></p>

<p class=MsoNormal>+               
__update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,<o:p></o:p></p>

<p class=MsoNormal>+                   
((uint16_t)(frag_offset >> 3 )), <o:p></o:p></p>

<p class=MsoNormal>+                   
(BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );<o:p></o:p></p>

<p class=MsoNormal>+               
p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;<o:p></o:p></p>

<p class=MsoNormal>+               
if( total_ip_len > 0 )<o:p></o:p></p>

<p class=MsoNormal>+         
      {<o:p></o:p></p>

<p class=MsoNormal>+                   
++wr_idx;<o:p></o:p></p>

<p class=MsoNormal>+                   
frag_offset += (wr_size - ip_hdr_len);<o:p></o:p></p>

<p class=MsoNormal>+                   
wr_size = 0;<o:p></o:p></p>

<p class=MsoNormal>+                   
ds_idx = 0;<o:p></o:p></p>

<p class=MsoNormal>+                   
p_buf += ip_hdr_len;<o:p></o:p></p>

<p class=MsoNormal>+               
}<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+           
next_sge -= seg_len;<o:p></o:p></p>

<p class=MsoNormal>+           
if( next_sge > 0 )<o:p></o:p></p>

<p class=MsoNormal>+           
{<o:p></o:p></p>

<p class=MsoNormal>+               
next_sgl_addr += seg_len;<o:p></o:p></p>

<p class=MsoNormal>+           
}<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_desc->num_wrs += wr_idx;<o:p></o:p></p>

<p class=MsoNormal>+    <o:p></o:p></p>

<p class=MsoNormal>+    IPOIB_EXIT( IPOIB_DBG_SEND );<o:p></o:p></p>

<p class=MsoNormal>+    return NDIS_STATUS_SUCCESS;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __update_fragment_ip_hdr(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
ip_hdr_t*
const                               
p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint16_t                                              
fragment_size, <o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint16_t                                              
fragment_offset, <o:p></o:p></p>

<p class=MsoNormal>-IN                         
BOOLEAN                                                           
more_fragments )<o:p></o:p></p>

<p class=MsoNormal>+IN      ip_hdr_t*
const     p_ip_hdr,<o:p></o:p></p>

<p class=MsoNormal>+IN     
uint16_t            fragment_size,
<o:p></o:p></p>

<p class=MsoNormal>+IN     
uint16_t           
fragment_offset, <o:p></o:p></p>

<p class=MsoNormal>+IN     
BOOLEAN            
more_fragments )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
uint16_t*           
p_hdr = (uint16_t*)p_ip_hdr;<o:p></o:p></p>

<p class=MsoNormal>-             
p_ip_hdr->length = cl_hton16( fragment_size ); // bytes<o:p></o:p></p>

<p class=MsoNormal>-             
p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte units<o:p></o:p></p>

<p class=MsoNormal>-             
if( more_fragments )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
else<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
p_ip_hdr->chksum = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
p_ip_hdr->chksum = ipchksum( p_hdr, IP_HEADER_LENGTH(p_ip_hdr) );<o:p></o:p></p>

<p class=MsoNormal>+    uint16_t*   p_hdr =
(uint16_t*)p_ip_hdr;<o:p></o:p></p>

<p class=MsoNormal>+    p_ip_hdr->length = cl_hton16(
fragment_size ); // bytes<o:p></o:p></p>

<p class=MsoNormal>+    p_ip_hdr->offset = cl_hton16(
fragment_offset ); // 8-byte units<o:p></o:p></p>

<p class=MsoNormal>+    if( more_fragments )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IP_SET_MORE_FRAGMENTS( p_ip_hdr );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    else<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+       
IP_SET_LAST_FRAGMENT( p_ip_hdr );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    p_ip_hdr->chksum = 0;<o:p></o:p></p>

<p class=MsoNormal>+    p_ip_hdr->chksum = ipchksum( p_hdr,
IP_HEADER_LENGTH(p_ip_hdr) );<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> static void<o:p></o:p></p>

<p class=MsoNormal> __copy_ip_options(<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint8_t*              
p_buf,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint8_t*              
p_options,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
uint32_t              
options_len,<o:p></o:p></p>

<p class=MsoNormal>-IN                         
BOOLEAN                           
copy_all )<o:p></o:p></p>

<p class=MsoNormal>+IN      uint8_t*   
p_buf,<o:p></o:p></p>

<p class=MsoNormal>+IN      uint8_t*   
p_options,<o:p></o:p></p>

<p class=MsoNormal>+IN      uint32_t   
options_len,<o:p></o:p></p>

<p class=MsoNormal>+IN      BOOLEAN    
copy_all )<o:p></o:p></p>

<p class=MsoNormal> {<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
option_length;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
total_length = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint32_t              
copied_length = 0;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t*              
p_src = p_options;<o:p></o:p></p>

<p class=MsoNormal>-             
uint8_t*              
p_dst = p_buf;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t   
option_length;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    total_length
= 0;<o:p></o:p></p>

<p class=MsoNormal>+    uint32_t    copied_length
= 0;<o:p></o:p></p>

<p class=MsoNormal>+    uint8_t*    p_src =
p_options;<o:p></o:p></p>

<p class=MsoNormal>+    uint8_t*    p_dst =
p_buf;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
if( p_options == NULL || options_len == 0 )<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
if( copy_all )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memcpy( p_dst, p_src, options_len );<o:p></o:p></p>

<p class=MsoNormal>-                             
return;<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
do<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
if( ( *p_src ) == 0 ) // end of options list<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
total_length++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
break;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
if( ( *p_src ) == 0x1 ) // no op<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_src++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
total_length++;<o:p></o:p></p>

<p class=MsoNormal>-                                             
continue;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
/*from RFC791: <o:p></o:p></p>

<p class=MsoNormal>-                             
* This option may be used between options, for example, to align<o:p></o:p></p>

<p class=MsoNormal>+    if( p_options == NULL || options_len ==
0 )<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    if( copy_all )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_memcpy(
p_dst, p_src, options_len );<o:p></o:p></p>

<p class=MsoNormal>+        return;<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    do<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        if( ( *p_src )
== 0 ) // end of options list<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
total_length++;<o:p></o:p></p>

<p class=MsoNormal>+           
break;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        if( ( *p_src )
== 0x1 ) // no op<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
p_src++;<o:p></o:p></p>

<p class=MsoNormal>+           
total_length++;<o:p></o:p></p>

<p class=MsoNormal>+           
continue;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        /*from RFC791: <o:p></o:p></p>

<p class=MsoNormal>+        * This option
may be used between options, for example, to align<o:p></o:p></p>

<p class=MsoNormal>         * the beginning
of a subsequent option on a 32 bit boundary.<o:p></o:p></p>

<p class=MsoNormal>-                             
*/<o:p></o:p></p>

<p class=MsoNormal>-                             
if( copied_length && (copied_length % 4) )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_dst += align;<o:p></o:p></p>

<p class=MsoNormal>-                                             
copied_length += align;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
option_length = *(p_src + 1);<o:p></o:p></p>

<p class=MsoNormal>+        */<o:p></o:p></p>

<p class=MsoNormal>+        if(
copied_length && (copied_length % 4) )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
uint32_t align = 4 - (copied_length % 4);<o:p></o:p></p>

<p class=MsoNormal>+           
cl_memset( p_dst, 0x1, (size_t)align );<o:p></o:p></p>

<p class=MsoNormal>+           
p_dst += align;<o:p></o:p></p>

<p class=MsoNormal>+           
copied_length += align;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        option_length =
*(p_src + 1);<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-                             
if( *p_src & 0x80 )<o:p></o:p></p>

<p class=MsoNormal>-                             
{<o:p></o:p></p>

<p class=MsoNormal>-                                             
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></p>

<p class=MsoNormal>-                                             
p_dst += option_length;<o:p></o:p></p>

<p class=MsoNormal>-                                             
copied_length += option_length;<o:p></o:p></p>

<p class=MsoNormal>-                             
}<o:p></o:p></p>

<p class=MsoNormal>-                             
total_length += option_length;<o:p></o:p></p>

<p class=MsoNormal>-                             
p_src += option_length;<o:p></o:p></p>

<p class=MsoNormal>+        if( *p_src &
0x80 )<o:p></o:p></p>

<p class=MsoNormal>+        {<o:p></o:p></p>

<p class=MsoNormal>+           
cl_memcpy( p_dst, p_src, option_length );<o:p></o:p></p>

<p class=MsoNormal>+           
p_dst += option_length;<o:p></o:p></p>

<p class=MsoNormal>+           
copied_length += option_length;<o:p></o:p></p>

<p class=MsoNormal>+        }<o:p></o:p></p>

<p class=MsoNormal>+        total_length +=
option_length;<o:p></o:p></p>

<p class=MsoNormal>+        p_src +=
option_length;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
}while( total_length < options_len );<o:p></o:p></p>

<p class=MsoNormal>+    }while( total_length < options_len );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( total_length == options_len );<o:p></o:p></p>

<p class=MsoNormal>-             
CL_ASSERT( copied_length <= 40 );<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( total_length == options_len
);<o:p></o:p></p>

<p class=MsoNormal>+    CL_ASSERT( copied_length <= 40 );<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
/* padding the rest */<o:p></o:p></p>

<p class=MsoNormal>-             
if( options_len > copied_length )<o:p></o:p></p>

<p class=MsoNormal>-             
{<o:p></o:p></p>

<p class=MsoNormal>-                             
cl_memclr( p_dst, ( options_len - copied_length ) );<o:p></o:p></p>

<p class=MsoNormal>-             
}<o:p></o:p></p>

<p class=MsoNormal>-             
return;<o:p></o:p></p>

<p class=MsoNormal>+    /* padding the rest */<o:p></o:p></p>

<p class=MsoNormal>+    if( options_len > copied_length )<o:p></o:p></p>

<p class=MsoNormal>+    {<o:p></o:p></p>

<p class=MsoNormal>+        cl_memclr(
p_dst, ( options_len - copied_length ) );<o:p></o:p></p>

<p class=MsoNormal>+    }<o:p></o:p></p>

<p class=MsoNormal>+    return;<o:p></o:p></p>

<p class=MsoNormal> }<o:p></o:p></p>

<p class=MsoNormal> #endif<o:p></o:p></p>

<p class=MsoNormal>Index: ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h<o:p></o:p></p>

<p class=MsoNormal>===================================================================<o:p></o:p></p>

<p class=MsoNormal>---
ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h     (revision 6314)<o:p></o:p></p>

<p class=MsoNormal>+++ ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h  (working
copy)<o:p></o:p></p>

<p class=MsoNormal>@@ -607,8 +607,6 @@<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_send_mgr_t                         
send_mgr;<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_send_desc_t
*                    
p_desc;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>-             
KDPC                                                                    
recv_dpc;<o:p></o:p></p>

<p class=MsoNormal>-<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_endpt_mgr_t                       
endpt_mgr;<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>               
endpt_buf_mgr_t                                          
cm_buf_mgr;<o:p></o:p></p>

<p class=MsoNormal>@@ -629,6 +627,7 @@<o:p></o:p></p>

<p class=MsoNormal>               
uint32_t                                                              
bc_join_retry_cnt;<o:p></o:p></p>

<p class=MsoNormal>               
ib_net16_t                                                         
base_lid;<o:p></o:p></p>

<p class=MsoNormal>               
LONG                                                                   
n_no_progress;<o:p></o:p></p>

<p class=MsoNormal>+            
PIO_WORKITEM                                              
pPoWorkItem;<o:p></o:p></p>

<p class=MsoNormal>               
ipoib_hdr_t                                                       
hdr[1];  /* Must be last! */<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal> }            
ipoib_port_t;<o:p></o:p></p>

</div>

</body>

</html>