From 2a9f557adc7124524398bf5bf4502ba872e945f8 Mon Sep 17 00:00:00 2001
From: shefty
Date: Wed, 24 Jun 2009 18:19:31 +0000
Subject: [PATCH] winverbs branch: update to trunk svn 2267
git-svn-id: svn://openib.tc.cornell.edu/gen1@2268 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86
---
branches/winverbs/WinOF/BuildRelease.bat | 16 +-
branches/winverbs/WinOF/WIX/CustomActions.vbs | 664 +-
.../winverbs/WinOF/WIX/README_release.txt | 69 +-
branches/winverbs/WinOF/WIX/Release_notes.htm | 372 +-
branches/winverbs/WinOF/WIX/common/IBcore.inc | 85 +-
.../winverbs/WinOF/WIX/common/hca_filters.inc | 78 +
branches/winverbs/WinOF/WIX/common/iou.inc | 27 +
branches/winverbs/WinOF/WIX/common/ipoib.inc | 23 +-
.../WinOF/WIX/common/mlnx_drivers.inc | 133 +-
.../winverbs/WinOF/WIX/common/qlgc_vnic.inc | 18 +-
branches/winverbs/WinOF/WIX/common/srp.inc | 35 +-
.../WinOF/WIX/common/winverbs_drivers.inc | 39 +-
branches/winverbs/WinOF/WIX/dat.conf | 13 +-
branches/winverbs/WinOF/WIX/ia64/DPInst.exe | Bin 1115704 -> 0 bytes
.../winverbs/WinOF/WIX/win7/ia64/Makefile | 19 +-
branches/winverbs/WinOF/WIX/win7/ia64/wof.wxs | 36 +-
branches/winverbs/WinOF/WIX/win7/x64/Makefile | 23 +-
branches/winverbs/WinOF/WIX/win7/x64/wof.wxs | 45 +-
branches/winverbs/WinOF/WIX/win7/x86/Makefile | 21 +-
branches/winverbs/WinOF/WIX/win7/x86/wof.wxs | 32 +-
branches/winverbs/WinOF/WIX/wlh/ia64/Makefile | 19 +-
branches/winverbs/WinOF/WIX/wlh/ia64/wof.wxs | 28 +-
branches/winverbs/WinOF/WIX/wlh/x64/Makefile | 23 +-
branches/winverbs/WinOF/WIX/wlh/x64/wof.wxs | 24 +-
branches/winverbs/WinOF/WIX/wlh/x86/Makefile | 21 +-
branches/winverbs/WinOF/WIX/wlh/x86/wof.wxs | 24 +-
.../winverbs/WinOF/WIX/wnet/ia64/Makefile | 19 +-
branches/winverbs/WinOF/WIX/wnet/ia64/wof.wxs | 42 +-
branches/winverbs/WinOF/WIX/wnet/x64/Makefile | 23 +-
branches/winverbs/WinOF/WIX/wnet/x64/wof.wxs | 41 +-
branches/winverbs/WinOF/WIX/wnet/x86/Makefile | 19 +-
branches/winverbs/WinOF/WIX/wnet/x86/wof.wxs | 43 +-
branches/winverbs/WinOF/WIX/wxp/x86/Makefile | 19 +-
branches/winverbs/WinOF/WIX/wxp/x86/wof.wxs | 49 +-
branches/winverbs/WinOF/WIX/x64/DPInst.exe | Bin 684600 -> 0 bytes
branches/winverbs/WinOF/WIX/x86/DPInst.exe | Bin 549944 -> 0 bytes
.../winverbs/core/complib/user/cl_timer.c | 2 +-
branches/winverbs/docs/Manual.htm | 2113 ++++-
branches/winverbs/etc/makebin.bat | 53 +-
.../winverbs/hw/mlx4/kernel/bus/drv/drv.c | 73 +-
.../winverbs/hw/mlx4/kernel/bus/drv/drv.h | 10 +-
.../winverbs/hw/mlx4/kernel/bus/drv/pci.c | 167 +-
.../winverbs/hw/mlx4/kernel/bus/drv/pdo.c | 10 +-
branches/winverbs/hw/mlx4/kernel/bus/ib/cq.c | 4 +-
.../winverbs/hw/mlx4/kernel/bus/net/mlx4.h | 3 +-
branches/winverbs/hw/mlx4/kernel/inc/l2w.h | 5 +
.../inc/kernel/complib/cl_timer_osd.h | 4 +-
.../dapl2/test/dapltest/scripts/dt-cli.bat | 120 +-
branches/winverbs/ulp/ipoib/kernel6/SOURCES | 59 +
branches/winverbs/ulp/ipoib/kernel6/ipoib.cdf | 13 +
branches/winverbs/ulp/ipoib/kernel6/ipoib.rc | 48 +
.../winverbs/ulp/ipoib/kernel6/ipoib32-xp.cdf | 10 +
.../winverbs/ulp/ipoib/kernel6/ipoib32.cdf | 11 +
.../ulp/ipoib/kernel6/ipoib_adapter.c | 1632 ++++
.../ulp/ipoib/kernel6/ipoib_adapter.h | 483 +
.../winverbs/ulp/ipoib/kernel6/ipoib_cm.c | 0
.../winverbs/ulp/ipoib/kernel6/ipoib_debug.h | 303 +
.../winverbs/ulp/ipoib/kernel6/ipoib_driver.c | 4057 ++++++++
.../winverbs/ulp/ipoib/kernel6/ipoib_driver.h | 162 +
.../ulp/ipoib/kernel6/ipoib_endpoint.c | 1170 +++
.../ulp/ipoib/kernel6/ipoib_endpoint.h | 257 +
.../winverbs/ulp/ipoib/kernel6/ipoib_ibat.c | 666 ++
.../winverbs/ulp/ipoib/kernel6/ipoib_ibat.h | 45 +
.../winverbs/ulp/ipoib/kernel6/ipoib_log.mc | 334 +
.../winverbs/ulp/ipoib/kernel6/ipoib_port.c | 8098 ++++++++++++++++
.../winverbs/ulp/ipoib/kernel6/ipoib_port.h | 827 ++
.../ulp/ipoib/kernel6/ipoib_xfr_mgr.c | 74 +
.../ulp/ipoib/kernel6/ipoib_xfr_mgr.h | 513 ++
branches/winverbs/ulp/ipoib/kernel6/makefile | 7 +
.../winverbs/ulp/ipoib/kernel6/makefile.inc | 17 +
.../ulp/ipoib/kernel6/netipoib-xp32.inf | 280 +
.../winverbs/ulp/ipoib/kernel6/netipoib.inx | 295 +
branches/winverbs/ulp/ipoib/kernel6/offload.h | 47 +
branches/winverbs/ulp/ipoib_NDIS6_CM/dirs | 2 +
.../winverbs/ulp/ipoib_NDIS6_CM/ip_stats.h | 150 +
.../ulp/ipoib_NDIS6_CM/kernel/SOURCES | 59 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib.cdf | 13 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib.rc | 48 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib32.cdf | 11 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.c | 1642 ++++
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h | 483 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h | 303 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.c | 4708 ++++++++++
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.h | 166 +
.../ipoib_NDIS6_CM/kernel/ipoib_endpoint.c | 1170 +++
.../ipoib_NDIS6_CM/kernel/ipoib_endpoint.h | 257 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.c | 693 ++
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.h | 45 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_log.mc | 334 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_port.c | 8123 +++++++++++++++++
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h | 827 ++
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.c | 74 +
.../ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.h | 513 ++
.../ulp/ipoib_NDIS6_CM/kernel/makefile | 7 +
.../ulp/ipoib_NDIS6_CM/kernel/makefile.inc | 17 +
.../ulp/ipoib_NDIS6_CM/kernel/netipoib.inx | 295 +
.../ulp/ipoib_NDIS6_CM/kernel/offload.h | 47 +
97 files changed, 42733 insertions(+), 1368 deletions(-)
create mode 100644 branches/winverbs/WinOF/WIX/common/hca_filters.inc
create mode 100644 branches/winverbs/WinOF/WIX/common/iou.inc
delete mode 100644 branches/winverbs/WinOF/WIX/ia64/DPInst.exe
delete mode 100644 branches/winverbs/WinOF/WIX/x64/DPInst.exe
delete mode 100644 branches/winverbs/WinOF/WIX/x86/DPInst.exe
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/SOURCES
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib.cdf
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib.rc
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib32-xp.cdf
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib32.cdf
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_adapter.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_adapter.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_cm.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_debug.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_driver.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_driver.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_endpoint.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_endpoint.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_ibat.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_ibat.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_log.mc
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_port.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_port.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_xfr_mgr.c
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/ipoib_xfr_mgr.h
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/makefile
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/makefile.inc
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/netipoib-xp32.inf
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/netipoib.inx
create mode 100644 branches/winverbs/ulp/ipoib/kernel6/offload.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/dirs
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/ip_stats.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/SOURCES
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib.cdf
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib.rc
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib32.cdf
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.c
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_adapter.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_debug.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.c
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_driver.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.c
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_endpoint.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.c
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_ibat.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_log.mc
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.c
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.c
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/ipoib_xfr_mgr.h
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/makefile
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/makefile.inc
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/netipoib.inx
create mode 100644 branches/winverbs/ulp/ipoib_NDIS6_CM/kernel/offload.h
diff --git a/branches/winverbs/WinOF/BuildRelease.bat b/branches/winverbs/WinOF/BuildRelease.bat
index ead390fd..1b97fee1 100644
--- a/branches/winverbs/WinOF/BuildRelease.bat
+++ b/branches/winverbs/WinOF/BuildRelease.bat
@@ -533,25 +533,25 @@ mkdir %RBIN_WXP%
if EXIST "%BSE%\etc\makebin.bat" (
if "%WIN7%" == "yes" (
- call %BSE%\etc\makebin.bat %BSE% %RBIN_W7% win7 %_DDK_VER% %_COIN_VER%
+ call %BSE%\etc\makebin.bat %BSE% %RBIN_W7% win7 %_DDK% %_COIN_VER%
if ERRORLEVEL 1 (
- echo %0: Err in makebin.bat %BSE% %RBIN_W7% wlh
+ echo %0: Err in makebin.bat %BSE% %RBIN_W7% wlh %_DDK% %_COIN_VER%
exit /B 1
)
)
- call %BSE%\etc\makebin.bat %BSE% %RBIN_WLH% wlh %_DDK_VER% %_COIN_VER%
+ call %BSE%\etc\makebin.bat %BSE% %RBIN_WLH% wlh %_DDK% %_COIN_VER%
if ERRORLEVEL 1 (
- echo %0: Err in makebin.bat %BSE% %RBIN_WLH% wlh
+ echo %0: Err in makebin.bat %BSE% %RBIN_WLH% wlh %_DDK% %_COIN_VER%
exit /B 1
)
- call %BSE%\etc\makebin.bat %BSE% %RBIN_WNET% wnet %_DDK_VER% %_COIN_VER%
+ call %BSE%\etc\makebin.bat %BSE% %RBIN_WNET% wnet %_DDK% %_COIN_VER%
if ERRORLEVEL 1 (
- echo %0: Err in makebin.bat %BSE% %RBIN_WNET% wnet
+ echo %0: Err in makebin.bat %BSE% %RBIN_WNET% wnet %_DDK% %_COIN_VER%
exit /B 1
)
- call %BSE%\etc\makebin.bat %BSE% %RBIN_WXP% wxp %_DDK_VER% %_COIN_VER%
+ call %BSE%\etc\makebin.bat %BSE% %RBIN_WXP% wxp %_DDK% %_COIN_VER%
if ERRORLEVEL 1 (
- echo %0: Err in makebin.bat %BSE% %RBIN_WXP% wxp
+ echo %0: Err in makebin.bat %BSE% %RBIN_WXP% wxp %_DDK% %_COIN_VER%
exit /B 1
)
)
diff --git a/branches/winverbs/WinOF/WIX/CustomActions.vbs b/branches/winverbs/WinOF/WIX/CustomActions.vbs
index 7baa4037..c973131b 100644
--- a/branches/winverbs/WinOF/WIX/CustomActions.vbs
+++ b/branches/winverbs/WinOF/WIX/CustomActions.vbs
@@ -41,7 +41,7 @@ Const WindowsVista ="600"
Const WindowsSvr2008 ="600"
Const Windows7 ="601"
-Const UseDPinst = "600" ' use DPinst.exe to install drivers for
+Const UseDPinst = "501" ' use DPinst.exe to install drivers for
' Windows VersionNT >= this value.
' Global debug flag: Session.Property from msiexec.exe cmd line DBG=1
@@ -89,40 +89,14 @@ Sub WinOF_setup
AddLocal = Session.Property("ADDLOCAL")
' The WIX UI (UserInterface) sets up ADDLOCAL. When cmd-line msiexec.exe is
- ' run with a deprecited UI, then ADDLOCAL is not setup; default it's value
- ' here.
+ ' run with a minimal UI (/passive), then ADDLOCAL is not setup correctly;
+ ' default it's value here.
+
If AddLocal = "" AND Installed = "" Then
' Enable default features.
AddLocal = "IBcore,hca_mthca,fIPoIB,fWSD,fDAPL,fDatBASIC1,fDatBASIC2"
End If
- ' Process msiexec cmd line arg HCA=cx or HCA=+cx
- ' Pre WLH OS only (Server 2003/XP)
- ' Replace default InfiniHost HCA driver with ConnectX HCA driver if
- ' requested 'HCA=cx' or add ConnectX '+cx'.
-
- If VersionNT < UseDPinst Then
- use_this_HCA = Session.Property("HCA")
- If use_this_HCA <> "" Then
- ' down-case if required.
- If Instr(use_this_HCA,"CX") <> 0 Then
- use_this_HCA = Replace(use_this_HCA,"CX","cx")
- End if
- If Instr(use_this_HCA,"+cx") <> 0 Then
- ' Add ConnectX HCA drivers
- AddLocal = AddLocal & ",hca_connectX"
- Else
- If Instr(use_this_HCA,"cx") <> 0 Then
- If Instr(AddLocal,"hca_mthca") <> 0 Then
- AddLocal = Replace(AddLocal,"hca_mthca","hca_connectX")
- Else
- AddLocal = AddLocal & ",hca_connectX"
- End If
- End If
- End If
- End If
- End If
-
If Session.Property("OSM") = "1" OR Session.Property("OSMS") = "1" Then
AddLocal = AddLocal & ",fOSMS"
End If
@@ -224,10 +198,8 @@ Sub DriverFileDelete(fso,WshShell,filename,VersionNT)
' allow continuation after 'permission denied' error
On Error Resume Next
' unlock the driver file by deleting PnPLocked reg entry.
- If VersionNT >= UseDPinst Then
- base = "reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles /v "
- Return = WshShell.Run (base & filename & " /f", 0, true)
- End If
+ base = "reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles /v "
+ Return = WshShell.Run (base & filename & " /f", 0, true)
fso.DeleteFile(filename),True
If (Err And Err.Number <> 70) Then ' tolerate protection errors
ErrMsg ("Could not delete: " & filename)
@@ -299,8 +271,7 @@ End Sub
''''''''''' Remove Driver Files ''''''''''''
' Attempt to clean out driver installed files which fail to be uninstalled
-' when the driver is uninstalled. Win2K3/x64 files persist, XP & Win2K3/x86
-' the driver files are correctly remove?
+' when the driver is uninstalled.
Sub RemoveDriverFiles(fso,WshShell,VersionNT)
@@ -650,61 +621,17 @@ Function Find_Dev_by_Tag(WshShell,exe,sFindHow,tag)
End Function
-Function IsInfiniHost(ID)
- Dim dID
- HCAs = Array("5A44","5A45","5E8C","5E8D","6264","6274","6275","6278",_
- "6279","6282")
-
- For each dID in HCAs
- If dID = ID Then
- IsInfiniHost = 1
-'msgbox "match ID " & ID & " dID " & dID
- Exit Function
- End if
- Next
-'msgbox "NO match ID " & ID
- IsInfiniHost = 0
-
-End Function
-
-
-' Install Qlogic VNIC Driver using devman.exe (aka devcon)
-
-Sub devman_Install_VNIC(WshShell,sInstalldir)
-
- Dim devID, rc
-
- devmanQL = "cmd.exe /c cd /d " & sInstalldir & "qlgcvnic & " & _
- "..\IBcore\devman.exe "
-
- Err.clear
- devID = "IBA\V00066AP00000030"
- rc = WshShell.Run (devmanQL & "disable " & devID, 0, true)
- rc = WshShell.Run (devmanQL & "update netvnic.inf " & devID,0,true)
- ' Display error number and description if applicable
- If rc <> 0 Then
- msgbox "Install_VNIC Err(" & rc & ") - devman update qlgcvnic.sys " _
- & devID,,"devman_install_VNIC"
- Else
- rc = WshShell.Run (devmanQL & "enable " & devID, 0, true)
- If sDBG >= "1" Then
- msgbox "VNIC Install OK",,"devman_Install_VNIC"
- End If
- End if
-
-End Sub
-
Function dpinst_Install_VNIC(WshShell,sInstalldir)
- Dim dpinstSRP,cmd,rc
+ Dim dpinstVNIC,cmd,rc
dpinst_Install_VNIC = 0
dpinstVNIC = "cmd.exe /c cd /d " & sInstalldir & _
- "qlgcvnic & ..\ibcore\dpinst.exe "
+ "qlgcvnic & ..\dpinst.exe "
- cmd = dpinstVNIC & "/S /F /SA /PATH """ & sInstalldir & "qlgcvnic""" & _
- " /SE /SW"
+ cmd = dpinstVNIC & "/S /F /SA /PATH """ & sInstalldir & _
+ "Drivers\qlgcvnic"" /SE /SW"
rc = WshShell.Run (cmd,0,true)
If (rc AND DPINST_INSTALLED) = 0 Then
dpinst_status "qlgcvnic Install failed",cmd,rc,"dpinst_Install_VNIC"
@@ -716,75 +643,14 @@ Function dpinst_Install_VNIC(WshShell,sInstalldir)
End Function
-' Install SRP (SCSI RDMA Protocol) Driver
-
-' QLogic Virtual FC I/O controller or
-' InfiniBand SRP Miniport: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108
-' OFED SRP target: IBA\V000002P00005A44
-' one driver handles all three. Definition also used for SRP uninstall.
-
-SRP_IDS = Array(_
- "IBA\V000002P00005A44",_
- "IBA\C0100C609EP0108",_
- "IBA\CFF00C609EP0108",_
- "IBA\V00066AP00000038",_
- "IBA\V000006P00006282")
-
-Function devman_Install_SRP(WshShell,sInstalldir)
-
- Dim Devices,devID,rc,found
-
- devmanSRP = "cmd.exe /c cd /d " & sInstalldir & "SRP & " & _
- "..\IBcore\devman.exe "
- Err.clear
- found = 0
-
- On Error Resume Next
-
- Devices = Find_IBA_Devices(WshShell,sInstalldir)
- If IsNull(Devices) Then
- msgbox "missing SRP [IBA\*] devices?",,"devman_Install_SRP"
- devman_Install_SRP = -1
- Exit Function
- End If
-
- For each ID in SRP_IDS
- For each devID in Devices
- If Instr(1,devID,ID) = 1 Then
- found = 1
- rc = WshShell.Run (devmanSRP & "update ib_srp.inf " & ID,0,true)
- ' Display error number and description if applicable
- If rc <> 0 Then
- msgbox "Err(" & rc & ") devman update ib_srp.inf " & _
- ID,,"devman_Install_SRP"
- ElseIf sDBG >= "1" Then
- msgbox "SRP install OK.",,"devman_Install_SRP"
- End If
- Exit For
- End If
- Next
-' One driver handles all SRP devices - install once?
-' If found = 1 Then
-' Exit For
-' End If
- Next
-
- If found = 0 Then
- devman_Install_SRP = -1
- Else
- devman_Install_SRP = 0
- End If
-
-End Function
-
Function dpinst_Install_SRP(WshShell,sInstalldir)
Dim dpinstSRP,cmd,rc
dpinst_Install_SRP = 0
dpinstSRP = "cmd.exe /c cd /d " & sInstalldir _
- & "SRP & ..\ibcore\dpinst.exe "
- cmd = dpinstSRP & "/S /F /SA /PATH """ & sInstalldir & "SRP""" & " /SE /SW"
+ & "SRP & ..\dpinst.exe "
+ cmd = dpinstSRP & "/S /F /SA /PATH """ & sInstalldir & "Drivers\SRP""" & " /SE /SW"
rc = WshShell.Run (cmd,0,true)
If (rc AND DPINST_INSTALLED) = 0 Then
dpinst_status "SRP Install failed",cmd,rc,"dpinst_Install_SRP"
@@ -796,29 +662,6 @@ Function dpinst_Install_SRP(WshShell,sInstalldir)
End Function
-Sub devman_Install_IOU(WshShell,sInstalldir)
-
- Dim rc,devman
-
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
-
- On Error Resume Next
-
- dev_list = Find_Dev_by_Tag(WshShell,devman,"find","InfiniBand I/O Unit")
-
- ' if no IB_IOU device found, install ibiou.sys driver
- If IsNull(dev_list) Then
- rc = WshShell.Run (devman & "update ib_iou.inf IBA\IB_IOU",0,true)
- If rc <> 0 Then
- msgbox "Install_IOU Err(" & rc & ")" & _
- "devman update ib_iou.inf IBA\IB_IOU"
- End If
-' Else
-' msgbox "IOU driver already loaded [" & dev_list(0) & "]"
- End If
-
-End Sub
-
' For installer error codes see
' http://msdn2.microsoft.com/en-us/library/aa368542(VS.85).aspx
@@ -873,267 +716,13 @@ Sub dpinst_status(umsg,cmd,err,title)
End Sub
-Function dpinst_install(WshShell,sInstalldir,localSM,IPOIB,VNIC,SRP)
-
- Dim dpinst,dpinstNET,cmd,rc
-
- err.clear
- On Error Resume Next
-
- cmdspec = "cmd.exe /c cd /d " & sInstalldir
- dpinst = cmdspec & "IBcore & dpinst.exe "
- dpinstNET = cmdspec & "net & ..\ibcore\dpinst.exe "
-
- cmd = dpinst & "/F /SA /SE /SW"
-
- ' HCA driver install - mlx4 or mthca, dpinst does all .inf files in
- ' the current folder.
-
- rc = WshShell.Run (cmd,0,true)
-
- If (rc AND DPINST_INSTALLED) = 0 Then
- dpinst_status "HCA driver Install failed",cmd,rc,"dpinst_install"
- dpinst_install=ERROR_INSTALL_FAILURE
- Exit Function
- ElseIf sDBG >= "1" Then
- dpinst_status "IB Core Drivers [HCA] Install OK.",cmd,rc,_
- "dpinst_install"
- End If
-
- ' Check/install IPoIB driver
- If IPOIB Then
- cmd = dpinstNET & "/S /F /SA /PATH """ & sInstalldir & "net""" & _
- " /SE /SW"
- rc = WshShell.Run (cmd,0,true)
- If (rc AND DPINST_INSTALLED) = 0 Then
- dpinst_status "IPoIB Install failed",cmd,rc,"dpinst_install"
- dpinst_install=ERROR_INSTALL_FAILURE
- Exit Function
-
- ElseIf sDBG >= "1" Then
- dpinst_status "IPoIB Install OK.",cmd,rc,"dpinst_install"
- End If
- End If
-
- ' Start the Local OpenSM Subnet Manager service?
- If localSM Then
- OpenSM_StartMeUp WshShell,sInstalldir
- If sDBG >= "1" Then
- msgbox "Local Subnet Management Service [OpenSM] started.",,_
- "dpinst_install"
- End If
- End If
-
- ' IOU driver is installed (loaded into driver store) by default as the
- ' driver (ibiou.sys) is located in IBcore; side-effect of dpinst.exe.
-
- If VNIC Then
- rc = dpinst_Install_VNIC(WshShell,sInstalldir)
- End If
-
- If SRP Then
- rc = dpinst_Install_SRP(WshShell,sInstalldir)
- End If
-
- dpinst_install = 0
-
-End Function
-
-
-Function devman_install(WshShell,sInstalldir,have_mthca,have_mlx4,localSM,IPOIB,VNIC,SRP)
-
- Dim devman,cmd,Return,rc
-
- ' an HCA driver is 'required' for devman/devcon installs.
- If have_mlx4 = 0 AND have_mthca = 0 Then
- msgbox "devman_install - No HCA Driver Selected to Install?" & _
- " Aborting Installation."
- ' Force installer cleanup (real magic).
- devman_install=ERROR_INSTALL_SOURCE_ABSENT
- Exit Function
- End If
-
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
-
- dev_list = Find_Dev_by_Tag(WshShell,devman,"find","VEN_15B3")
-
- If IsNull(dev_list) Then
- msgbox "HCA driver install - No HCA devices to install?"
- devman_install=ERROR_INSTALL_FAILURE
- Exit Function
- End If
-
- ' Install ConnectX (mlx4) HCA driver?
-
- If have_mlx4 Then
-
- ' install ConnectX/mlx4 bus driver
- cmd = ""
- For each Dev in dev_list
- If Dev <> "" Then
- mlxdev = Left(Dev,(Instr(dev,"SUBSYS")-2))
- devID = Right(mlxdev,4)
- If IsInfiniHost( devID ) = 0 Then
- ' Mixed HCA types? if not, then Vendor_ID install
- If have_mthca = 0 Then
- mlxdev = "PCI\VEN_15B3"
- End If
- cmd = devman & "update mlx4_bus.inf """ & mlxdev & """"
- Return = WshShell.Run (cmd,0,true)
- If Return = 0 Then
- DrvInstalled = true
- Exit For
- End If
- ' one time install attempt if not mixed HCA types present.
- ' Otherwise, continue with next mlx4 DEV_ID
- If have_mthca = 0 Then
- Exit For
- End If
- End if
- End if
- Next
-
- If DrvInstalled <> true Then
- msgbox "mlx4_bus Install failed(" & Return & ") " & cmd
- devman_install=ERROR_INSTALL_FAILURE
- Exit Function
- End if
-
- ' Install ConnectX HCA
- cmd = devman & "update mlx4_hca.inf MLX4\CONNECTX_HCA"
- Return = WshShell.Run (cmd,0,true)
-
- ' Display error number and description if applicable
- If Return <> 0 Then
- msgbox "mlx4_hca Install Err(" & Return & ") " & cmd
- devman_install=ERROR_INSTALL_FAILURE
- Exit Function
- End if
- End If
-
- ' InfiniHost (mthca) HCA driver?
-
- If have_mthca Then
- DrvInstalled = false
-
- cmd = ""
- For each dev in dev_list
- If dev <> "" Then
- idev = Left(dev,(Instr(dev,"SUBSYS")-2))
- devID = Right(idev,4)
- If IsInfiniHost( devID ) = 1 Then
- ' Mixed HCA types? if not, then Vendor_ID install
- If have_mlx4 = 0 Then
- idev = "PCI\VEN_15B3"
- End If
- cmd = devman & "update mthca.inf """ & idev & """"
- Return = WshShell.Run (cmd,0,true)
- If Return = 0 Then
- DrvInstalled = true
- Exit For
- End If
- ' one time install attempt if no mlx4 present
- ' otherwise, continue with next DEV_ID
- If have_mlx4 = 0 Then
- Exit For
- End If
- End if
- End if
- Next
-
- If DrvInstalled <> true Then
- msgbox "InfiniHost(mthca) Install Err(" & Return & ") " & cmd
- devman_install=ERROR_INSTALL_FAILURE
- Exit Function
- End if
- End if
-
- ' an HCA driver is 'required'.
-
- If DrvInstalled = false Then
- msgbox "No HCA Driver Selected to Install? Aborting Installation.",,_
- "devman_install"
- ' Force installer cleanup (real magic).
- devman_install=ERROR_INSTALL_SOURCE_ABSENT
- Exit Function
- ElseIf sDBG >= "1" Then
- msgbox "IB Core Drivers [HCA] installed OK.",,"devman_install"
- End if
-
- ' Start a Local OpenSM Subnet Manager service?
- If localSM Then
- OpenSM_StartMeUp WshShell,sInstalldir
- If sDBG >= "1" Then
- msgbox "Local Subnet Management Service [OpenSM] started.",,_
- "devman_install"
- End If
- End If
-
- ' Check/install IPoIB driver
- If IPOIB Then
- devmanNET = "cmd.exe /c cd /d " & sInstalldir & _
- "net & ..\IBcore\devman.exe "
- cmd = devmanNET & "update netipoib.inf IBA\IPoIB"
- rc = WshShell.Run (cmd,0,true)
- If rc <> 0 Then
- msgbox "IPoIB Install Err(" & rc & ") " & cmd
- devman_install=ERROR_INSTALL_FAILURE
- Exit Function
- ElseIf sDBG >= "1" Then
- msgbox "IPoIB Install OK.",,"devman_install"
- End If
- End If
-
- ' IB I/O Unit driver installed only if required by VNIC or SRP.
-
- If VNIC OR SRP Then
- rc = WshShell.Run (devman & "update ib_iou.inf IBA\IB_IOU",0,true)
- If rc <> 0 Then
- msgbox "IOU Install Err(" & rc & ") update ib_iou.inf IBA\IB_IOU"
- devman_install=ERROR_INSTALL_FAILURE
- Exit Function
- ElseIf sDBG >= "1" Then
- msgbox "IOU driver Install OK.",,"devman_install"
- End If
- End If
-
- ' Install Qlogic VNIC Driver?
- If VNIC Then
- devman_Install_VNIC WshShell,sInstalldir
- End if
-
- ' Install SRP (SCSI RDMA Protocol) Driver?
- If SRP Then
- For cnt=1 To 3
- rc = devman_Install_SRP(WshShell,sInstalldir)
- If rc <> -1 Then
- Exit For
- End If
- WshShell.popup "Waiting 10 seconds for SRP device(s) to appear",10,_
- "WinOF - SRP Install"
- Next
- If rc = -1 Then
- msgbox "WinOF: Missing SRP device?" & vbCrLf _
- & "cd /d " & sInstalldir & "SRP" & vbCrLf _
- & "..\IBcore\devman find IBA\*" & vbCrLf _
- & "..\IBcore\devman update ib_srp.inf found-SRP-DevID" & vbCrLf
- End If
- End If
-
- devman_install = 0
-
-End Function
-
-
''''''''''' Device Driver Install ''''''''''''
Function DriverInstall()
- Dim PropArray
- Dim devman, devmanEXE
- Dim rc, cmd, CheckMode, sInstalldir, fso
- Dim DrvInstalled, idev, mlxdev, dev, dev_list
- Dim VersionNT,IPOIB,SRP,VNIC,localSM
+ Dim CheckMode, PropArray
+ Dim VersionNT, InstallThis, localSM
+ Dim rc, cmd, sInstalldir, fso
On Error Resume Next
@@ -1168,112 +757,43 @@ Function DriverInstall()
VersionNT = PropArray(4)
InstallThis = PropArray(5)
sDBG = PropArray(8) ' set global debug flag.
-
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
+ localSM = instr(InstallThis,"fOSMS")
Set WshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
- If Not fso.FileExists(sInstalldir & "IBcore\devman.exe") Then
- msgbox "DriverInstall: missing " & sInstalldir & "IBcore\devman.exe"
- DriverInstall=ERROR_FUNCTION_FAILED
- Exit Function
- End if
-
- If Not fso.FileExists(sInstalldir & "IBcore\dpinst.exe") Then
- msgbox "DriverInstall: missing " & sInstalldir & "IBcore\dpinst.exe"
- DriverInstall=ERROR_FUNCTION_FAILED
- Exit Function
- End if
-
err.clear
-
- ' rescan system buses
- Return = WshShell.Run (devman & "rescan", 0, true)
- ' Install HCA (Host Channel Adapter) Driver(s)
- DrvInstalled = false
-
- ' Which HCAs are selected to install?
- ' Both InfiniHost(mthca) and ConnectX(mlx4) have the same
- ' Vendor ID VEN_15B3, so a generic by 'Vendor ID' install will not suceed.
- ' In the case of both InfiniHost and ConnectX (mixed) HCAs present, install
- ' using VENDOR_ID and DEV_ID.
-
- have_mlx4 = 0
- have_mthca = 0
-
- ' msgbox "InstallThis " & InstallThis
+ ' DIFxApp (Driver Install Frameworks for Applications)
+ ' http://www.microsoft.com/whdc/driver/install/DIFxFAQ.mspx#E4AAC
+ ' DIFxApp.wixlib has already installed driver to Driver Store; PNP will
+ ' handle the actual device driver install/rollback on failure.
- have_mlx4 = instr(InstallThis,"hca_connectX")
- have_mthca = instr(InstallThis,"hca_mthca")
- IPOIB = instr(InstallThis,"fIPoIB")
- localSM = instr(InstallThis,"fOSMS")
-
- SRP = instr(InstallThis,"fSRP") _
- AND fso.FileExists(sInstalldir & "SRP\ib_srp.inf")
-
- VNIC = instr(InstallThis,"fVNIC") _
- AND fso.FileExists(sInstalldir & "qlgcvnic\netvnic.inf")
-
- ' Flag Windows LongHorn Install (aka Vista | Server 2008)
-
- ' Use DPINST.EXE for Svr 2008 & Vista Driver Install (Windows LongHorn)
- ' otherwise use devman.
-
- If VersionNT >= UseDPinst Then
- DriverInstall = dpinst_install(WshShell,sInstalldir,localSM,IPOIB,_
- VNIC,SRP)
- Else
- DriverInstall = devman_install(WshShell,sInstalldir,have_mthca,_
- have_mlx4,localSM,IPOIB,VNIC,SRP)
- End If
-
- If DriverInstall <> 0 Then
- DriverUninstall
- If VersionNT >= UseDPinst Then
- ' dpinst.exe removes from the 'Driver Store'
- dpinst = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "
- If VNIC then
- find_remove_INF_file WshShell,dpinst,"netvnic.cat"
- End If
-
- If SRP then
- find_remove_INF_file WshShell,dpinst,"ib_srp.cat"
- End If
- find_remove_INF_file WshShell,dpinst,"ib_iou.cat"
- find_remove_INF_file WshShell,dpinst,"ipoib.cat"
- find_remove_INF_file WshShell,dpinst,"mthca.cat"
- find_remove_INF_file WshShell,dpinst,"mlx4"
- End If
-
- If VNIC then
- find_remove_INF_file WshShell,devman,"netvnic.cat"
- End If
+ ' OpenSM Subnet Manager service was already created in the disabled state.
+ ' Should the Local OpenSM Subnet Manager service be started/enabled?
- If SRP then
- find_remove_INF_file WshShell,devman,"ib_srp.cat"
+ If localSM Then
+ OpenSM_StartMeUp WshShell,sInstalldir
+ If sDBG >= "1" Then
+ msgbox "Local Subnet Management Service [OpenSM] started.",,_
+ "DriverInstall"
End If
- find_remove_INF_file WshShell,devman,"ib_iou.cat"
- find_remove_INF_file WshShell,devman,"ipoib.cat"
- find_remove_INF_file WshShell,devman,"mthca.cat"
- find_remove_INF_file WshShell,devman,"mlx4"
End If
+ DriverInstall = 0
+
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
-' Find IBA devices using Devcon
+' Find IBA devices using devman.exe
Function Find_IBA_Devices(WshShell,sInstalldir)
Dim dev
- Set ibaDevicesExec = WshShell.Exec ("cmd.exe /c cd " & sInstalldir & "IBcore & devman.exe findall * | FIND ""IBA""")
-
- ' Set ibaDevicesExec = WshShell.Exec ("cmd.exe /c cd " & sInstalldir & "IBcore & devman.exe find IBA\*")
+ Set ibaDevicesExec = WshShell.Exec ("cmd.exe /c cd " & sInstalldir & "Drivers & devman.exe findall * | FIND ""IBA""")
ibaDevices = split(ibaDevicesExec.StdOut.ReadAll, vbCrLF)
@@ -1541,7 +1061,7 @@ Function GetDeviceInstallInfo(WshShell,sInstalldir,Dev)
Dim devman,tmp,s,StrStart,StrEnd,FileCnt,INF
devman = "cmd.exe /c cd /d " & sInstalldir & _
- "IBcore & devman.exe driverfiles ""@"
+ "Drivers & devman.exe driverfiles ""@"
Set connExec = WshShell.Exec(devman & Dev & """")
cmdout = split(connExec.StdOut.ReadAll, vbCrLF)
@@ -1594,21 +1114,14 @@ End Function
' remove IB I/O Unit driver
Sub Uninstall_IOU(fso,WshShell,devList,sInstalldir,VersionNT)
-
- Dim devman,tool
+ Dim tool
RemoveDevice fso,WshShell,sInstalldir,devList,"InfiniBand I/O Unit",VersionNT
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
+ tool = "cmd.exe /c cd /d " & sInstalldir & "Drivers & dpinst.exe "
- If VersionNT >= UseDPinst Then
- ' use dpinst.exe instead of devman.exe for Windows LongHorn++
- tool = replace(devman,"devman","dpinst")
- Else
- tool = devman
- End If
+ ' dpinst (loads the driver store) not load the driver (no srp/vnic)
- ' dpinst can install and not load the driver (no srp/vnic)
find_remove_INF_file WshShell,tool,"ib_iou.cat"
End Sub
@@ -1621,7 +1134,7 @@ Sub Uninstall_VNIC(fso,WshShell,devices,sInstalldir,VersionNT)
Dim devman,Return,device,dt,sDRIVERS,tool,devInfo
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
+ devman = "cmd.exe /c cd /d " & sInstalldir & "Drivers & devman.exe "
If IsNull(devices) Then
' create a list of IBA\* devices via "devcon find"
@@ -1646,12 +1159,8 @@ Sub Uninstall_VNIC(fso,WshShell,devices,sInstalldir,VersionNT)
End if
Next
- If VersionNT >= UseDPinst Then
- ' use dpinst.exe instead of devman.exe for Windows LongHorn++
- tool = replace(devman,"devman","dpinst")
- Else
- tool = devman
- End If
+ ' use dpinst.exe instead of devman.exe for Windows LongHorn++
+ tool = replace(devman,"devman","dpinst")
If IsNull(devInfo) Then
find_remove_INF_file WshShell,tool,"netvnic.cat"
@@ -1663,6 +1172,19 @@ Sub Uninstall_VNIC(fso,WshShell,devices,sInstalldir,VersionNT)
End Sub
+' QLogic Virtual FC I/O controller or
+' InfiniBand SRP Miniport: IBA\C0100C609EP0108 or IBA\CFF00C609EP0108
+' OFED SRP target: IBA\V000002P00005A44
+' one driver handles all three.
+
+SRP_IDS = Array(_
+ "IBA\V000002P00005A44",_
+ "IBA\C0100C609EP0108",_
+ "IBA\CFF00C609EP0108",_
+ "IBA\V00066AP00000038",_
+ "IBA\V000006P00006282")
+
+
Sub Uninstall_SRP(fso,WshShell,devices,sInstalldir,VersionNT)
Dim devman,devmanRMAT,devmanDAAT,Return,device,sDRIVERS,tool,devInfo
@@ -1672,7 +1194,7 @@ Sub Uninstall_SRP(fso,WshShell,devices,sInstalldir,VersionNT)
' one driver handles all three.
' See previous SRP_IDS definition @ Install_SRP.
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
+ devman = "cmd.exe /c cd /d " & sInstalldir & "Drivers & devman.exe "
devmanRMAT = devman & "remove @"
devmanDAAT = devman & "disable @"
devInfo = Null
@@ -1706,12 +1228,8 @@ Sub Uninstall_SRP(fso,WshShell,devices,sInstalldir,VersionNT)
Next
Next
- If VersionNT >= UseDPinst Then
- ' use dpinst.exe instead of devman.exe for Windows LongHorn++
- tool = replace(devman,"devman","dpinst")
- Else
- tool = devman
- End If
+ ' use dpinst.exe instead of devman.exe for Windows LongHorn++
+ tool = replace(devman,"devman","dpinst")
'No SRP device - check/clear to be safe.
If IsNull(devInfo) Then
@@ -1728,7 +1246,7 @@ Sub RemoveDevice(fso,WshShell,sInstalldir,devList,DeviceTag,VersionNT)
dim device,devman,devmanRMAT,devTarget,dt,Return,devInfo
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
+ devman = "cmd.exe /c cd /d " & sInstalldir & "Drivers & devman.exe "
devmanRMAT = devman & "remove ""@"
devmanDAAT = devman & "disable ""@"
devInfo = Null
@@ -1760,12 +1278,8 @@ Sub RemoveDevice(fso,WshShell,sInstalldir,devList,DeviceTag,VersionNT)
Exit Sub
End If
- If VersionNT >= UseDPinst Then
- ' use dpinst.exe instead of devman.exe for Windows LongHorn++
- tool = replace(devman,"devman","dpinst")
- Else
- tool = devman
- End If
+ ' use dpinst.exe instead of devman.exe for Windows LongHorn++
+ tool = replace(devman,"devman","dpinst")
cleanup_driver_files fso,WshShell,sInstalldir,tool,VersionNT,devInfo
@@ -1777,7 +1291,7 @@ Sub remove_all_HCA_devices(fso,WshShell,sInstalldir,VersionNT)
Dim devman,tool
- devman = "cmd.exe /c cd /d " & sInstalldir & "IBcore & devman.exe "
+ devman = "cmd.exe /c cd /d " & sInstalldir & "Drivers & devman.exe "
' Old (CoInstaller version) ibbus GUID - just in case.
Return = WshShell.Run (devman & "remove {94F41CED-78EB-407C-B5DF-958040AF0FD8",0,true)
@@ -1787,12 +1301,8 @@ Sub remove_all_HCA_devices(fso,WshShell,sInstalldir,VersionNT)
' VEN_15B3 covers devices: mthca & mlx4_bus
RemoveDevice fso,WshShell,sInstalldir,Null,"PCI\VEN_15B3",VersionNT
- If VersionNT >= UseDPinst Then
- ' use dpinst.exe instead of devman.exe for Windows LongHorn++
- tool = "cmd.exe /c cd /d " & sInstalldir & "IBcore & dpinst.exe "
- Else
- tool = devman
- End If
+ ' use dpinst.exe instead of devman.exe for Windows LongHorn++
+ tool = "cmd.exe /c cd /d " & sInstalldir & "Drivers & dpinst.exe "
find_remove_INF_file WshShell,tool,"mthca"
find_remove_INF_file WshShell,tool,"mlx4_hca"
@@ -1809,11 +1319,11 @@ Sub Uninstall_IB_Devices(fso,WshShell,sInstalldir,VersionNT)
Dim devList
- If (fso.FileExists(sInstalldir & "IBcore\dpinst.exe") = False) Then
+ If (fso.FileExists(sInstalldir & "Drivers\dpinst.exe") = False) Then
Exit Sub ' no reason to continue without the tool.
End if
- If (fso.FileExists(sInstalldir & "IBcore\devman.exe") = False) Then
+ If (fso.FileExists(sInstalldir & "Drivers\devman.exe") = False) Then
Exit Sub ' no reason to continue without the tool.
End if
@@ -1867,9 +1377,9 @@ Sub DriverUninstall()
sRemove = "ALL"
End If
- If fso.FileExists(sInstalldir & "net\ndinstall.exe") Then
+ If fso.FileExists(sInstalldir & "Drivers\net\ndinstall.exe") Then
Return = WshShell.Run ("cmd.exe /c cd /d " & sInstalldir & _
- "net & ndinstall.exe -r", 0, true)
+ "Drivers\net & ndinstall.exe -r", 0, true)
End If
If sVersionNT <> WindowsXP AND fso.FileExists(sInstalldir & "installsp.exe") Then
@@ -2116,7 +1626,7 @@ Sub RunOnceCleanup(fso,sInstalldir)
End if
script = "RunOnceWinOFcleanup.bat"
- src = sInstalldir & "IBcore\" & script
+ src = sInstalldir & "Drivers\" & script
If Not fso.FileExists(src) Then
msgbox "Missing " & src
@@ -2232,7 +1742,7 @@ End Function
Function InstallChanged
- Dim rc, sInstalldir, sAddLocal, sRemove, sDRIVERS, NeedReboot, WLH
+ Dim rc, sInstalldir, sRemove, sDRIVERS, NeedReboot
Err.clear
sRemove = Session.Property("REMOVE")
@@ -2248,50 +1758,14 @@ Function InstallChanged
NeedReboot = 0
sInstalldir = Session.Property("INSTALLDIR")
- sAddLocal = Session.Property("ADDLOCAL")
- ' Flag Windows LongHorn Install (aka Vista | Server 2008)
VersionNT = Session.Property("VersionNT")
- If VersionNT >= UseDPinst Then
- WLH = 1
- Else
- WLH = 0
- End if
On Error Resume Next
- If (Not IsNull(sAddLocal)) AND (sAddLocal <> "") Then
- If Instr(sAddLocal,"fSRP") OR Instr(sAddLocal,"fVNIC") Then
- ' IOU driver loaded into driver store when HCA driver installed.
- If WLH = 0 Then
- devman_Install_IOU WshShell,sInstalldir
- End If
- End If
-
- If Instr(sAddLocal,"fSRP") Then
- If fso.FileExists(sInstalldir & "SRP\ib_srp.inf") Then
- If WLH Then
- rc = dpinst_Install_SRP(WshShell,sInstalldir)
- Else
- rc = devman_Install_SRP(WshShell,sInstalldir)
- End If
- Else
- msgbox "ERR: missing " & sInstalldir & "SRP\ib_srp.inf"
- End If
- End If
+ ' Nothing to do for ADD as DIFxAPP has loaded drivers into Driver Store.
- If Instr(sAddLocal,"fVNIC") Then
- If fso.FileExists(sInstalldir & "qlgcvnic\netvnic.inf") Then
- If WLH Then
- rc = dpinst_Install_VNIC(WshShell,sInstalldir)
- Else
- devman_Install_VNIC WshShell,sInstalldir
- End If
- Else
- msgbox "Err: missing " & sInstalldir & "qlgcvnic\netvnic.inf"
- End If
- End If
- End If
+ ' For REMOVE - cleanup
If (Not IsNull(sRemove)) AND (sRemove <> "") Then
diff --git a/branches/winverbs/WinOF/WIX/README_release.txt b/branches/winverbs/WinOF/WIX/README_release.txt
index adf1d899..d6458823 100644
--- a/branches/winverbs/WinOF/WIX/README_release.txt
+++ b/branches/winverbs/WinOF/WIX/README_release.txt
@@ -1,5 +1,5 @@
-[4-17-09] WinOF 2.1 (RC0) release
+[6-04-09] WinOF 2.1 (pre-RC0) release
Downloads available at http://www.openfabrics.org/downloads/WinOF/v2.1_rc0
@@ -8,9 +8,9 @@ WinOF 2.1 Summary Changes
-------------------------
1) The WinOF 2.1 release is based on openib-windows source svn revision
- (branches\WOF2-1 svn.xxxx).
+ (branches\WOF2-1 svn.2250).
- Last WinOF release (2.0.1) based on svn.1932.
+ Last WinOF release (2.0.2) based on svn.1975.
2) Bug fixes in
@@ -20,10 +20,11 @@ WinOF 2.1 Summary Changes
SRP
DAT/DAPL
WinVerbs
+ WinMAD
OFED (Open Fabrics Enterprise Distribution [Linux]) verbs API
- OFED Diagnostics
+ OFED Diagnostic utilities
-3) New Functionality
+3) Integrated Functionality
- OFED Compatibility layers allow for easy porting of OFED applications
into the WinOF environment.
@@ -32,27 +33,38 @@ WinOF 2.1 Summary Changes
libumad - IB MAD exported user-mode interface library.
librdmacm - OFED RDMA CM (Comunications Manager).
- - OFED fabric diagnostic utilities are available.
- ibstat - display HCA information.
+ - OFED Fabric Diagnostics available ( for usage info, see --help ).
+ ibaddr - query InfiniBand address(es)
ibnetdiscover - generate a fabric topology.
- portinfo - display InfiniBand port specific information.
+ iblinkinfo - report link info for all links in the fabric
+ ibping - ping an InfiniBand address
+ ibportstate - manage port (physical) state and link speed of an InfiniBand port
+ ibqueryerrors - query and report non-zero IB port counters
+ ibroute - query InfiniBand switch forwarding tables
+ ibstat - display HCA information.
+ ibsysstat - system status for an InfiniBand address
+ ibtracert - trace InfiniBand path
saquery - SA (Subnet Administrator) query test.
+ sminfo - query InfiniBand SMInfo attributes
+ smpdump - dump InfiniBand subnet management attributes
+ smpquery - query InfiniBand subnet management attributes
+ vendstat - query InfiniBand vendor specific functions
- Connected mode IPoIB ensures higher performance IPoIB transfers in
addition to OFED (Linux) IPoIB compatibility.
- Windows Server 2008/Vista WinOF installs now utilize Windows Plug-n-Play
(PNP) to install the correct HCA driver(s). Selection of a specific HCA
- device type is no longer required for Server 2008/Vista/HPC.
+ device driver type is no longer required for Server 2008/Vista/HPC.
Windows Server 2003 & XP installs require an explicit HCA device
- type selection; the default HCA device type is Mellanox InfiniHost.
+ driver type selection; the default HCA device type is Mellanox InfiniHost.
- Windows Server 2003/XP WinOF unattended installs can override the install
- default HCA device 'InfiniHost' via the msiexe.exe command line override
+ Windows Server 2003/XP WinOF unattended installs can override the default
+ HCA device type 'InfiniHost' via the msiexe.exe command line override
'HCA=cx'; where 'cx' implies Mellanox ConnectX HCA device(s).
Specifing 'HCA=+cx' will install the ConnectX HCA driver in addition to
- the InfiniHost HCA driver; mixed HCA environment.
+ the InfiniHost HCA driver; a mixed HCA environment.
Example unattended installs:
Server 2003 with ConnectX HCA
@@ -68,17 +80,19 @@ WinOF 2.1 Summary Changes
- Server 2008-HPC install support has been enhanced to provide a no-drivers
- installed mode. Device driver '.inf' files are not processed during the
- WinOF install.
- The base assumption is that a WDM node provisioning template will install
- WinOF drivers. All other WinOF files are installed to the standard WinOF
- location '%ProgramFiles(x86)%\WinOF'.
+ installed mode to ease WinOF installation using WDM. Device driver '.inf'
+ files are not processed during the WinOF install.
+ The base assumption is that a WDM node provisioning template (see cluster
+ Manager) will install WinOF drivers. All other WinOF files are installed
+ to the standard WinOF location '%ProgramFiles(x86)%\WinOF'.
Examples
- unattended install: start/wait msiexec /I WOF.msi /quiet NODRV=1
+ unattended install for use with clusrun.bat
+ start/wait msiexec /I WOF.msi /quiet NODRV=1
- fast attended install: start/wait msiexec /I WOF.msi /passive NODRV=1
+ console based non-interactive install:
+ start/wait msiexec /I WOF.msi /passive NODRV=1
install selectable features: start/wait msiexec /I WOF.msi NODRV=1
@@ -87,17 +101,20 @@ WinOF 2.1 Summary Changes
The folder %TEMP%\PFiles\WinOF will be created.
- unattended uninstall with auto-reboot:
+ console based unattended uninstall with auto-reboot:
start/wait msiexec /X WOF.msi /passive
- - SRP and VNIC drivers are command line selectable:
+ clusrun unattended uninstall with auto-reboot
+ start/wait msiexec /X WOF.msi /quiet /forcereboot
+
+ - SRP and VNIC drivers are command line install selectable:
start/wait msiexec /I WOF.msi /passive SRP=1
start/wait msiexec /I WOF.msi /passive VNIC=1
- Subnet Management started as a local Windows Service from a command line:
start/wait msiexec /I WOF.msi /passive OSMS=1
- - HCA drivers load WinVerbs and WinMad filter drivers by default.
+ - HCA drivers loads filter drivers WinVerbs and WinMad by default.
@@ -106,7 +123,7 @@ Note on Vista installs Only:
Vista installs must be performed from an Administrator priviledged command
window. Right-clicking the .msi installer file for a Vista installation
will fail due to insufficent privileges to install the HCA driver!
- From the Administrator privileged cmd-window say
+ From the Administrator privileged cmd-window (Interactive install) say
start/wait msiexec /I WinOF_wlh_xxx.msi
-or-
@@ -137,5 +154,7 @@ Please:
make 'sure' your HCA firmware is recent; vstat.exe displays HCA firmware
version.
-thank you.
+thank you,
+
+WinOF Developers.
diff --git a/branches/winverbs/WinOF/WIX/Release_notes.htm b/branches/winverbs/WinOF/WIX/Release_notes.htm
index c8ceb7d1..cf495e94 100644
--- a/branches/winverbs/WinOF/WIX/Release_notes.htm
+++ b/branches/winverbs/WinOF/WIX/Release_notes.htm
@@ -92,7 +92,7 @@ src=openfabrics.gif>
-04/10/2009
+06/08/2009
@@ -110,8 +110,8 @@ How to Install
-
+
+
The
@@ -150,7 +151,7 @@ InfiniBand fabric.
Binary
files generated from the OpenIB-windows developers subversion (svn) source tree
'svn://openib.tc.cornell.edu'
-(branches\WOF2-0 svn revision 1835)
+(branches\WOF2-1 svn revision 1835)
are packaged into a WIX 2.0
(Windows Installer Xml) single file install package referred to as the
Windows OpenFabrics (WinOF) release 2.1.
@@ -163,7 +164,7 @@ to numerous components along with full Winverbs and OFED integration modules:
Windows Server
- 2008 and Vista are supported.
+ 2008, HPC and Vista are supported.
Network Direct
supported on Server 2008/HPC.
@@ -171,8 +172,21 @@ to numerous components along with full Winverbs and OFED integration modules:Mellanox ConnectX(mlx4) drivers
enhanced for increased performance and stability.
+ WInVerbs and WinMad HCA
+ filter drivers are automatically loaded in support of OFED verbs and
+ diagnostics.
+
+ OFED verbs library
+ enables easy porting of Linux OFED applications into the WinOF environment.
+
+
QLogic has
- enhanced VNIC & SRP for increased performance and stability.
+ enhanced VNIC & SRP for increased performance and stability.
+
+
+ uDAT/DAPL is now a
+ common code base with OFED uDAT/DAPL; supported DAPL providers: IBAL,
+ socket-cm and rdma-cm.
Bug fixes for stability in IBcore, WSD, VNIC, SRP, IPoIB, DAT/DAPL
@@ -197,7 +211,8 @@ supported devices below
- Infiniband Core components
+ Infiniband Core components: IBAL,
+ WInverbs, Winmad, OFED verbs and rdma_cm.
Upper Layer Protocols:
IPoIB, WSD, ND, VNIC, SRP Initiator and DAT/DAPL
@@ -213,7 +228,8 @@ supported devices below
Performance
tests
- Diagnostic tools
+
+ OFED Diagnostic tools
@@ -231,6 +247,7 @@ supported devices below
<Return-to-Top>
+
CPU architectures
@@ -259,22 +276,18 @@ supported devices below
Server 2008 R2
- Windows 7
- (Server/Ultimate/Professional)
-
+
+ Vista
- Vista
-
+
+ Windows Server 2008 HPC Edition
- Windows Server 2008 HPC Edition
-
-
- Windows Server 2003
- / XP64
-
+
+ Windows Server 2003
+ / XP64
- Windows XP/32 (SP2)
-
+
+ Windows XP32 (SP2)
Supported HCAs (Host Channel Adapters)
@@ -300,11 +313,11 @@ tab-stops:list .5in'>
MT25408 - ConnectX DDR Channel Adapter, not
+tab-stops:list .5in'>MT25408 - ConnectX Channel Adapters, not
yet supported on IA64 platforms.
-Both SDR and DDR mode of the InfiniHost III family are supported.
For official Firmware (FW) versions and update tools please see:
+Both SDR, DDR and QDR modes of the InfiniHost III models are supported.
For official Firmware (FW) versions and update tools please see:
http://www.mellanox.com/support/firmware_table.php
Current HCA firmware version can be viewed from the 'vstat' command.
@@ -333,6 +346,7 @@ Current HCA firmware version can be viewed from the 'vstat' command.
<Return-to-Top>
+
@@ -375,8 +389,15 @@ OpenFabrics manual.
<Return-to-Top>
+
+Summary
+
+ - Double-click the .msi installer file. Except for
+ Vista: from an administrator command window, execute 'msiexec /I
+ WinOF_2-1_wlh_xxx.msi'.
+
Requirements
Install HCA hardware prior to installing the Windows OpenFabrics Release
@@ -487,11 +508,13 @@ hardware vendors who participate in the open source WinOF development process.
InfiniBand Core:
- HCA driver - Mellanox: InfiniHost or ConnectX
Server 2008 or Vista - installation will select the correct HCA driver.
- Server 2003 or XP - default HCA driver selection is Mellanox InfiniHost,
+ Server 2003 or XP - HCA driver selection is required; default HCA driver selection is Mellanox InfiniHost,
otherwise select from install features.
- - IB core stack and libraries.
+ - IB core stack and libraries - includes winverbs,
+ winmad and OFED verbs library.
- Release Notes, Manual
- - Subnet Management service [OpenSM] (installed & disabled), Performance & Diagnostic tools
+ - Subnet Management service [OpenSM] (installed & disabled), Performance &
+ OFED Diagnostic tools
Optional:
IPoIB - Internet Protocols over
@@ -503,7 +526,6 @@ hardware vendors who participate in the open source WinOF development process.
(header files & link files).
- DAT/DAPL v2.0 runtime libraries
- DAT v2.0 application build environment
OpenSM_service_started - InfiniBand Subnet Management
enabled and started as a Windows Service.
By default OpenSM is installed as a disabled Windows Service.
- WinVerbs - OFED verbs API for Windows.
Checked versions of driver files.
The 'default' installation includes IB core, IPoIB, WSD (Win2K3 only),
@@ -514,7 +536,8 @@ hardware vendors who participate in the open source WinOF development process.
<Return-to-Top>
-
+
+
WinOF Server 2008 / Vista device driver installation operates somewhat
differently than Server 2003/XP device driver installation.
Server 2008 uses the device driver installation program dpinst.exe (Driver
@@ -548,62 +571,77 @@ default HCA device type (case of ConnectX HCA hardware):
The result is the installation of HCA drivers for ConnectX and InfiniHost.
-
+
+
-
To perform a silent unattended installation for Server
- 2003/XP for Mellanox InfiniHost HCA hardware, invoke the following command
- from a command window.
- start/wait msiexec.exe /i WinOF_2-0_wnet_x64.msi /qn /quiet /log
- %TEMP%\WOF-install.log
- '/log dev:path\logFilename.log' is optional.
- msiexec.exe /? for all options.
-
-
An unattended Server 2003/XP install will install the following 'default' options
-
- - Infiniband Core modules - Mellanox InfiniHost HCA driver, IB core stack and libraries,
- documentation
- default HCA driver selection is Mellanox InfiniHost, otherwise override
- default InfiniHost HCA type with 'HCA=cx'.
+
+
+
An unattended WinOF install will install the following 'default' options
+ - Infiniband Core modules - Mellanox HCA driver
+ (see HCA driver selection note), IB core stack, libraries, utilities and
+ documentation.
- IPoIB - Internet Protocols over InfiniBand
- WSD - (Win2K8/3 only, not installed on XP) Win Sock Direct
- - ND - Network Direct [started automatically (via ndinstall.exe) only for Server
+
- ND - NetworkDirect [started automatically (via ndinstall.exe) only for Server
2008/HPC and Vista].
- DAT & DAPL (v1.1 & v2.0) runtime libraries + dapltest.exe
(dt-svr & dt-cli).
-Should WSD not be a desirable unattended install option (Win2008/3 only),
+HCA Driver Selection for Server 2003/XP
+
+ Default HCA driver selection is Mellanox InfiniHost, otherwise override
+ default InfiniHost HCA type with msiexec command option 'HCA=cx'.
+
+ HCA selection for all other Windows variants
+ (Server 2008, HPC & Vista)
+
+ Default HCA driver selection is driven by the
+ Windows PNP subsystem; no user selection required or supported.
+
+ Should WSD not be a desirable unattended install option (Win2008/3 only),
currently you would install unattended then execute the
command 'installsp -r'
on each node to remove WSD.
+ To perform a silent unattended installation for Server
+ 2003/XP for Mellanox InfiniHost HCA hardware, invoke the following command
+ from a command window.
+
+ start/wait msiexec.exe /i WinOF_2-1_wnet_x64.msi /qn /quiet /log
+ %TEMP%\WOF-install.log
+ '/log dev:path\logFilename.log' is optional.
+ msiexec.exe /? for all options.
+
+
Examples:
-Server 2003 - Mellanox HCA Hardware
+Server 2003 - Mellanox HCA Hardware
- InfiniHost HCA
- start/wait msiexec.exe /i WinOF_2-0_wnet_x64.msi /qb /quiet
+ start/wait msiexec.exe /i WinOF_2-1_wnet_x64.msi /qb /quiet
- ConnectX HCA
- start/wait msiexec.exe /i WinOF_2-0_wnet_x64.msi /qb /quiet HCA=cx
+ start/wait msiexec.exe /i WinOF_2-1_wnet_x64.msi /qb /quiet HCA=cx
- InfiniHost and ConnectX
- start/wait msiexec.exe /i WinOF_2-0_wnet_x64.msi /qb /quiet HCA=+cx
+ start/wait msiexec.exe /i WinOF_2-1_wnet_x64.msi /qb /quiet HCA=+cx
-
Windows XP - Mellanox HCA Hardware - same as above with .msi
+Windows XP - Mellanox HCA Hardware - same as above with .msi
name change (wnet --> wxp).
- ConnectX HCA
- start/wait msiexec.exe /i WinOF_2-0_wxp_x86.msi /qb /quiet HCA=cx
+ start/wait msiexec.exe /i WinOF_2-1_wxp_x86.msi /qb /quiet HCA=cx
-Server 2008 / Vista - HCA Hardware
+Server 2008 / Vista - any Mellanox HCA Hardware
- No need to specify HCA type as PNP (Plug-n-Play)
figures out the correct HCA to install.
- start/wait msiexec.exe /i WinOF_2-0_wlh_x64.msi /qb /quiet
+ start/wait msiexec.exe /i WinOF_2-1_wlh_x64.msi /qb /quiet
-Non-HCA Install Features added to above examples:
+Non-HCA Install Features added to above msiexec command
+line examples:
- Start a Subnet Manager running on the local system:
add 'OSMS=1'
@@ -613,41 +651,114 @@ name change (wnet --> wxp).
Default install + SRP + VNIC + OpenSM Started on local
system
- - Server 2003, ConnectX - start/wait msiexec.exe /i WinOF_2-0_wnet_x64.msi
+
- Server 2003, ConnectX - start/wait msiexec.exe /i WinOF_2-1_wnet_x64.msi
/qb /quiet HCA=cx SRP=1 VNIC=1 OSMS=1
<Return-to-Top>
-
+
+
Device drivers in WinOF 2.0 and later releases are Digitally
signed by the OpenFabrics Alliance, although they are not WHQL'ed (Windows Quality Hardware Labs) certified.
The WinOF source code is used by hardware vendors to achieve WHQL
-certification. This lack
-of WinOF WHQL certification impacts unattended installs by requiring the user to
-'accept' installation of non-WHQL'ed drivers the 'first' time a compute node
-installs WinOF drivers via the WinOF .msi installer.
-Additionally the non-WHQL
-driver notifier box has a
-checkbox which allows establishing a trust for software from the publisher
-'OpenFabrics Alliance'. Checking the 'Trust Software from the OpenFabrics
-Alliance publisher' box allows future WinOF driver installs to proceed
-without user intervention as you have indicated to Windows that you trust non-WHQL'ed
-drivers from the OpenFabrics Alliance software publisher.
-***** Warning *****
-WinOF .msi installs on compute nodes the first time require human input to 'accept'
-installation of non-WHQL'ed drivers along with establishing a trust for the SW
-publisher 'OpenFabrics Alliance'.
-If one attempts an unattended WinOF .msi install using 'clusrun.bat msiexec /i
-WinOF.....msi /quiet', the install will
-silently hang waiting for user input.
-First time unattended WinOF .msi installs need mouse input to complete.
-Once the Openfabrics Alliance SW publisher trust has been established, future unattended WinOF .msi
-installs procees without human input.
+certification.
+The lack of WHQL driver certification places WinOF drivers
+in the 'unknown 3rd party SW publishers' category.
+When installing 'Unknown 3rd party SW publishers' drivers, Windows prompts on
+the install console for instructions as what to do (Install, Trust or not)?
+This prompting results in a failed remote node install when performing a
+first-time unattended WinOF install.
+By preloading the remote node's Trusted 3rd party Software Publisher certificate
+store, the unattended install will proceed without prompting, thus allowing the
+WinOF install to complete.
Be aware: if a node is reimaged (same or different template applied) the
-established trust of OpenFabric Alliance is destroyed, thus the non-WHQL driver
-notifier box and muse-click input is again required on the first WinOF .msi
-install
+established trust of the OpenFabric Alliance is destroyed, thus the OFA certificate
+needs to be reinstalled.
+How to install WinOF drivers and components in the HPC
+Server 2008 environment.
+
+ - Add the OpenFabrics Alliance public key digital
+ certificate to the head-node's Trusted Publisher Certificate store by
+ - Installing WinOF on the head node - start Open Subnet
+ Manager if needed, otherwise depend on another OpenSM on the IB fabric.
+ - Our recommendation is to install WinOF on the
+ head-node; Set head-node IPoIB interface IPv4 address after WinOF install.
+ - Or - Installing the OFA certificate from the
+ installer .msi file by
+ - right-clicking the .msi file, select Properties
+ - Select the Digital Signatures tab
+ - Highlight the OpenFabrics Alliance
+ - Details
+ - View Certificate
+ - Install certificate
+ - Trusted Publisher certificate store
+
+
+
+
+
+ - Once the OFA certificate is installed, it will remain
+ until the node is wiped clean by WDM reprovisioning.
+
+ - If remote nodes are operational (booted &
+ network accessible), then run the digital certificate install script 'cert-add.bat'
+ to 'add' the 'Open fabrics Alliance' as a Trusted 3rd party Software Publisher
+ to the remote node 's certificate stores.
+ - Get your administrator command window to the WinOF
+ folder which contains the 'cert-add.bat' script file.
+ - If WinOF was installed on the head-node, then 'cd /d
+ %ProgramFiles(x86)%\WinOF
+ - Otherwise unpack, not install, the WinOF files to
+ gain access to cert-add.bat file by executing the following commands:
+ - msiexec /A WinOF_2-1_wlh.msi TARGETDIR=%TEMP%
+ - cd /d %TEMP%\PFiles\WinOF
+
+
+
+ - Select a filesystem share folder which is
+ accessible from the head-node and all remote nodes specified in the
+ cert-add command; cert-add will write a batch script to this folder
+ which the remote node will execute.
+ - Cert add command format: cert-add
+ share-folder list-of-remote-nodes
+ - example: cert-add
+ \\orion-hn\winof cn01 cn02 cn03 cn04
+ cn05
+
+
+ - If remote nodes are not yet provisioned (not
+ running Windows), then do the following:
+ - From the head node, extract OFA certificate to a
+ file:
+ certutil -store TRUSTEDPUBLISHER 71175fca6b85d5c2e0864df16349ad84 OFA_TP.cer
+ - Place OFA_TP.cer in a remote node accessible share.
+ - As part of the node provisioning template process
+ before loading WinOF drivers, execute the certutil command on the remote
+ node:
+ certutil -addstore TRUSTEDPUBLISHER
+ \\share\OFA_TP.cer
+
+
+ - Run the cluster manager tool to create compute node
+ templates using WinOF drivers in %ProgramFiles(x86)%\Winof\IBcore and net.
+ - Use 'cluster manager' to provision all compute nodes.
+ - Set IPoIB interface IPv4 address on all compute
+ nodes.
+ - At this juncture, the WinOF drivers are installed and
+ operational, although additional WInOF components are not; IB diags, DAPL &
+ docs.
+ - To install remaining WinOF components without
+ installing device drivers, use the
+ unattended install process:
+ - Place WinOF_wlh_x64.msi in a remote node accessible
+ share
+ - Use the Cluster Manager tool to execute the
+ misexec command on all remote nodes to perform the WinOF install:
+ 'msiexec /I \\share-name\WinOF_wlh_x64.msi /qn /quiet NODRV=1'
+
+
+
Windows Deployment Manager usage for HPC compute node provisioning
Microsoft has chosen WDM to provision HPC
cluster compute nodes; see
@@ -656,8 +767,11 @@ installs for details.
In support of the new Microsoft WDM HPC cluster
provisioning process, WinOF now supports an administrative install mode which is
a method to extract WinOF files to the local filesystem without actually installing them;
-thus making WinOF driver files accessible to WDM provisioning.
-msiexec /A WinOF_2-0_wlh_x64.msi TARGETDIR=dev:\path-to-extracted-files
+thus making WinOF driver files accessible to WDM provisioning; the other
+approach is to install WinOF on the head-node and point Cluster Manager node
+template creation at the WinOF device driver .inf files located in
+%ProgramFiles(x86)%\WinOF\IBcore and net folders.
+msiexec /A WinOF_2-1_wlh_x64.msi TARGETDIR=dev:\path-to-extracted-files
example: msiexec /A WinOF_2-1_wlh_x64.msi TARGETDIR=%TEMP%
(note: TARGETDIR is case sensitive)
The above command creates the following folder structure:
@@ -675,16 +789,17 @@ QLogic VNIC (Virtual Ethernet controller over InfiniBand)
Normally WinOF device driver files are installed by processing the driver '.inf'
files. To install the WinOF package by selecting install features without
installing any device drivers [HCA, IPoIB, ND, WSD, SRP or VNIC] (assumed
-reliance on WDM to install drivers) can be accomplished with the following
-command:
-start/wait msiexec /i WinOF_2-0-1_wlh_x64.msi NODRV=1
+reliance on WDM to install device drivers) can be accomplished with the following
+interactive install command:
+start/wait msiexec /i WinOF_2-1_wlh_x64.msi NODRV=1
To skip driver installation for an unattended install
- start/wait msiexec /i WinOF_2-0-1_wlh_x64.msi /qn /quiet NODRV=1
+ start/wait msiexec /i WinOF_2-1_wlh_x64.msi /qn /quiet NODRV=1
See Unattended
Installations for further references.
<Return-to-Top>
-
+
+
The Windows command 'netsh' will assist in assigning an IP address to an
IPoIB interface.
By default, an IPoIB interface is configured to use DHCP. The following
@@ -711,6 +826,7 @@ with a netmask of 255.255.255.0, the gateway is 10.10.4.1 metric is 2.
<Return-to-Top>
+
To uninstall a WinOF package from a single node
@@ -727,7 +843,7 @@ occur after the uninstall.
/quiet
/forcerestart
- or -
- start/wait msiexec.exe /x WinOF_wlh_2-0_x64.msi /quiet /forcerestart
+ start/wait msiexec.exe /x WinOF_wlh_2-1_x64.msi /quiet /forcerestart
# WinOF_xxxx.msi is the file used to install WinOF.
msiexec.exe /help for details.
'/log dev:path\logfilename.log' if you wish to later view the install
@@ -764,6 +880,7 @@ occur after the uninstall.
<Return-to-Top>
+
A Vista WinOF installation can fail due to protection failures when
installing the HCA driver. Vista HCA driver installation failure can be caused
@@ -931,6 +1048,7 @@ Window
<Return-to-Top>
+
Limit the number of Subnet Managers on your fabric; one SM per fabric is
sufficient, although redundant Subnet Managers are supported.
@@ -952,6 +1070,7 @@ sufficient, although redundant Subnet Managers are supported.
<Return-to-Top>
+
Local Network Adapter ordering, which results in the IP address advertised
for the system, can be managed from
'My Network Places-> Advanced Tab-> Advanced settings'
From the Advanced settings display, the ordering
@@ -961,6 +1080,7 @@ check for your desired adapter ordering.
<Return-to-Top>
+
- Add/Remove Programs entry identifies the WinOF release version.
@@ -984,10 +1104,11 @@ the file version; [WinOF-Major.Minor.not-used.svn revision number].
- WinOF 2.0 is based on (svn.1763 branches\WOF2-0)
- - WinOF 2.1 is based on (svn.1763 branches\WOF2-1)
+ - WinOF 2.1 is based on (svn.2210 branches\WOF2-1)
<Return-to-Top>
+
The QLogic VNIC
@@ -1070,6 +1191,7 @@ for the setting to take effect.
<Return-to-Top>
+
In order for DAT/DAPL programs to execute correctly, the 'dat.dll'
file must be present in the current directory,
@@ -1104,6 +1226,7 @@ manual for further details.
<Return-to-Top>
+
The WinOF installer does not install the SRP driver as part of a default
installation.
@@ -1148,40 +1271,28 @@ when the WinOF uninstall attempts to delete the files the operation fails.
-
WinVerbs technology preview
+
+
WinVerbs is a userspace verbs and communication management interface
-optimized
-for the Windows operating system. Its lower interface is designed to support
-any RDMA based device, including Infiniband and iWarp. Its upper interface is
-capable of providing a low latency verbs interface, plus supports Microsoft's
-Network Direct Interface, DAPL, and OFED libibverbs interfaces. It consists of
+optimized
+for the Windows operating system. Its lower interface is designed to support
+any RDMA based device, including Infiniband and iWarp. Its upper interface is
+capable of providing a low latency verbs interface, plus supports Microsoft's
+NetworkDirect Interface, DAPL, and OFED libibverbs interfaces. It consists of
a userspace library and a kernel filter driver.
-The WinVerbs driver loads as an upper filter driver for Infiniband HCA.
-(Open source iWarp drivers for Windows are not yet available.) A corresponding
-userspace library installs as part of the Winverbs driver installation package.
-Additionally, a Windows port of the OFED libibverbs library and several test
-programs are also included.
-
To install WinVerbs and it's test applications, select the 'WinVerbs' feature
-from the WinOF installer (.msi).
-WinVerbs drivers are installed to %ProgramFiles(x86)%\WinOF\WinVerbs, although
-the drivers are not automatically loaded.
-In order to make WinVerbs test applications usable, WinVerbs drivers must be
-manually loaded.
-cd %ProgramFiles(x86)%\WinOF\WinVerbs
-right-click on winverbs.inf, select 'install'.
-Once WinVerbs is right-click installed, the HCA driver must be disabled and then
-enabled in order for the winverbs upper filter driver to be integrated into the
-HCA driver stack; see HCA driver properties->details, look for winverbs.
-
-Check if winverbs filter driver is active
- %ProgramFiles(x86)%\WinOF\IBcore\devman classfilter
-InfiniBandController upper
-
-Remove winverbs filter driver
- %ProgramFiles(x86)%\WinOF\IBcore\devman classfilter
-InfiniBandController upper !winverbs
-
+The WinVerbs and WinMAD drivers load as upper filter drivers for the Infiniband HCA
+device.
+(Open source iWarp drivers for Windows are not yet available.) A corresponding
+WinVerbs.dll and libibmad.dll
+userspace libraries install as part of the Winverbs driver installation package.
+Additionally, a Windows port of the OFED libibverbs library, several test
+programs and OFED InfiniBand diagnostic utilities are also included.
+
As of WinOF 2.1, Winverbs components are now integral
+components of a default WinOF installation.
+Although WinVerbs, WinMAD drivers, OFED libraries and utilities are install
+selectable features, they are automatically included as part of the default
+WinOF install.
@@ -1189,18 +1300,10 @@ InfiniBandController upper !winverbs
<Return-to-Top>
-
+
+
- -
-
In a multi HCA
- (Host Channel Adapter) system, disabling HCA devices works correctly EXCEPT
- for disabling the first HCA while other HCAs are operational. Once the first
- HCA is disabled, existing HCAs and user-mode applications lose the
- connection to the kernel mode IB stack and will fail when attempting access
- to the IB stack or hardware.
- Problem will be addressed in the next WinOF 2.0 release.
-
-
IPoIB partition
multicast
@@ -1280,7 +1383,7 @@ InfiniBandController upper !winverbs
x64 Windows platforms do not exhibit
the following SRP behavior.
SRP when run on a Windows 32-bit platform (x86) will exhibit SRP read
- transfer hangs when the size of the SRP read is greater-than (>) 4096
+ transfer hangs when the size of the SRP read is greater-than 4096
bytes.
@@ -1288,12 +1391,7 @@ InfiniBandController upper !winverbs
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ibsrp\Parameters\ModeFlags
to 1 will
- enable > 4KB transfers to proceed without hanging.
-
- -
-
Winsock Direct
- hotfix xxxxxxx for Windows Server 2003 is a good patch to apply if you are
- using WSD/IPoIB.
+ enable > 4KB transfers to proceed without hanging.
<Return-to-Top>
diff --git a/branches/winverbs/WinOF/WIX/common/IBcore.inc b/branches/winverbs/WinOF/WIX/common/IBcore.inc
index 6a0da213..5b93f015 100644
--- a/branches/winverbs/WinOF/WIX/common/IBcore.inc
+++ b/branches/winverbs/WinOF/WIX/common/IBcore.inc
@@ -1,94 +1,21 @@
+
+ LongName="DPInst.exe" Name="DPInst.exe"
+ Source="..\bin\misc\$(var.ARCH)\DPInst.exe" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
-
-
-
-
-
+
-
diff --git a/branches/winverbs/WinOF/WIX/common/hca_filters.inc b/branches/winverbs/WinOF/WIX/common/hca_filters.inc
new file mode 100644
index 00000000..eeaa49ed
--- /dev/null
+++ b/branches/winverbs/WinOF/WIX/common/hca_filters.inc
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/branches/winverbs/WinOF/WIX/common/iou.inc b/branches/winverbs/WinOF/WIX/common/iou.inc
new file mode 100644
index 00000000..21c4f56f
--- /dev/null
+++ b/branches/winverbs/WinOF/WIX/common/iou.inc
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/branches/winverbs/WinOF/WIX/common/ipoib.inc b/branches/winverbs/WinOF/WIX/common/ipoib.inc
index 72335bd6..7d11e9ef 100644
--- a/branches/winverbs/WinOF/WIX/common/ipoib.inc
+++ b/branches/winverbs/WinOF/WIX/common/ipoib.inc
@@ -1,6 +1,16 @@
-
+
+
+
+
+
@@ -35,9 +45,6 @@
Name="ibwsd32.dll" LongName='ibwsd32.dll' />
-
@@ -64,6 +71,12 @@
+
+
@@ -72,4 +85,6 @@
Name="ndinstal.exe" LongName='ndinstall.exe' />
+
+
diff --git a/branches/winverbs/WinOF/WIX/common/mlnx_drivers.inc b/branches/winverbs/WinOF/WIX/common/mlnx_drivers.inc
index cd3b5942..9335a608 100644
--- a/branches/winverbs/WinOF/WIX/common/mlnx_drivers.inc
+++ b/branches/winverbs/WinOF/WIX/common/mlnx_drivers.inc
@@ -1,17 +1,19 @@
+
+
+
+ Guid="BE4ED061-C852-40a2-A240-F06DBBE1159F"
+ DriverDeleteFiles="yes"
+ DriverForceInstall="yes"
+ DriverLegacy="no"
+ DriverPlugAndPlayPrompt="no"
+ DriverAddRemovePrograms="no"
+ DriverSequence="1" >
-
-
-
-
+
-
+
+
+
+
+
-
+
-
-
+
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
@@ -83,6 +102,9 @@
+
@@ -97,12 +119,65 @@
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/branches/winverbs/WinOF/WIX/common/qlgc_vnic.inc b/branches/winverbs/WinOF/WIX/common/qlgc_vnic.inc
index d810dcd2..f8a92399 100644
--- a/branches/winverbs/WinOF/WIX/common/qlgc_vnic.inc
+++ b/branches/winverbs/WinOF/WIX/common/qlgc_vnic.inc
@@ -1,12 +1,16 @@
-
-
+
-
-
+
+
@@ -20,5 +24,5 @@
LongName="netvnic.cat" Name="NETVNIC.cat"
Source="..\bin\net\$(var.ARCH)\netvnic.cat" />
-
+
diff --git a/branches/winverbs/WinOF/WIX/common/srp.inc b/branches/winverbs/WinOF/WIX/common/srp.inc
index 42c2aae3..2c3ac4d8 100644
--- a/branches/winverbs/WinOF/WIX/common/srp.inc
+++ b/branches/winverbs/WinOF/WIX/common/srp.inc
@@ -1,26 +1,33 @@
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
diff --git a/branches/winverbs/WinOF/WIX/common/winverbs_drivers.inc b/branches/winverbs/WinOF/WIX/common/winverbs_drivers.inc
index 1b147a76..7f58e5cc 100644
--- a/branches/winverbs/WinOF/WIX/common/winverbs_drivers.inc
+++ b/branches/winverbs/WinOF/WIX/common/winverbs_drivers.inc
@@ -1,30 +1,47 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/branches/winverbs/WinOF/WIX/dat.conf b/branches/winverbs/WinOF/WIX/dat.conf
index 1e627692..3dfce3a9 100644
--- a/branches/winverbs/WinOF/WIX/dat.conf
+++ b/branches/winverbs/WinOF/WIX/dat.conf
@@ -1,12 +1,13 @@
#
-# DAT (DAPL) configuration file
+# DAT (DAPL Provider) configuration file
#
-# Entries scanned sequentially - first entry to open is used.
+# Entries scanned sequentially - first entry to open is used unless explicit
+# DAPL interface name specified.
#
# Each entry requires the following fields:
#
-# \
-#
+# \
+#
#
# DAT v1.1 dapl provider configuration for HCA0 port 1
ibnic0 u1.1 threadsafe default C:\Windows\dapl.dll ri.1.1 "IbalHca0 1" ""
@@ -32,7 +33,7 @@ ibnic0v2-scmd u2.0 nonthreadsafe default "C:\\Program Files (x86)\\WinOF\\dapl2-
#
# DAT 2.0 RDMA-CM
# connection; supports DAT Windows <==> Linux over IB connections.
-ibnic0v2-cma u2.0 nonthreadsafe default C:\Windows\dapl2-ofa-cma.dll ri.2.0 "ibv_device0 1" ""
+ibnic0v2-cma u2.0 nonthreadsafe default C:\Windows\dapl2-ofa-cma.dll ri.2.0 "rdma_dev0 1" ""
#
# DAT 2.0 RDMA-CM (debug)
-ibnic0v2-cmad u2.0 nonthreadsafe default "C:\\Program Files (x86)\\WinOF\\dapl2-ofa-cmad.dll" ri.2.0 "ibv_device0 1" ""
+ibnic0v2-cmad u2.0 nonthreadsafe default "C:\\Program Files (x86)\\WinOF\\dapl2-ofa-cmad.dll" ri.2.0 "rdma_dev0 1" ""
diff --git a/branches/winverbs/WinOF/WIX/ia64/DPInst.exe b/branches/winverbs/WinOF/WIX/ia64/DPInst.exe
deleted file mode 100644
index d2295f9047bda34b67dd38b3453cec30893d3633..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1115704
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
@_#3^%-HrCt-?>@zlhhCCu16&HVx#>>
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