Jump to content

Updated drivers for Windows XP SP3 and Windows 2003 SP2 (x32/x64) for modern hardware


Recommended Posts


Posted (edited)

@reboot12

There may be differences on i219-LM chips.

Mine works with

CTRL kick
setup rings
write RCTL
set EN bit

But Intel tells for Industrial boards this

CTRL.SLU is set AFTER link-up
RFCTL is written AFTER RCTL
RXDCTL queue enable is set

Just set up a Windbg session with this.

During running this in KD,

ping yourrouterIP -t   from command line on the compi, where Windbg runs.

 

.logopen /t c:\i219LMbest_kd.txt
.symfix
.reload /f
lm m i219
r $t0=0
r $t1=0
r $t2=0
r $t3=0
r $t4=0
r $t5=0
bc *

bu i219!I219TxRxStart "r $t0=poi(@esp+4); r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs)); .echo --- I219TxRxStart ---; dt i219!_I219_ADAPTER $t0; dt i219!_I219_TXRX_CTX i219!g_TxRx; dd $t1+0x00000 L8; dd $t1+0x00018 L2; dd $t1+0x000C0 L1; dd $t1+0x000D0 L1; dd $t1+0x000D8 L1; dd $t1+0x00100 L1; dd $t1+0x05008 L1; dd $t1+0x02800 L12; dd $t1+0x02828 L2; dd $t1+0x03800 L12; gc"

bu i219!I219DoCtrlKickLate "r $t0=poi(@esp+4); r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs)); .echo --- CtrlKickLate ---; dd $t1+0x00000 L2; dd $t1+0x00008 L1; dd $t1+0x00100 L1; gc"

bu i219!I219PollTimerFunc "r $t0=poi(@esp+8); r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs)); .echo --- PollTimer ---; dd $t1+0x00008 L1; dd $t1+0x02810 L2; dd $t1+0x02828 L1; gc"

bu i219!I219RxPoll "r $t0=poi(@esp+4); r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs)); r $t3=poi(i219!g_TxRx+@@c++(&((i219!_I219_TXRX_CTX*)0)->RxDesc)); r $t4=poi(i219!g_TxRx+@@c++(&((i219!_I219_TXRX_CTX*)0)->RxNext)); r $t5=$t3+($t4*0x10); .echo --- RxPoll ---; dd $t1+0x02810 L2; dd $t1+0x00100 L1; dd $t1+0x05008 L1; dd $t1+0x02828 L1; dd $t5 L4; db $t5+0x0C L4; gc"

bu i219!I219MiniportISR "r $t0=poi(@esp+0xC); r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs)); .echo --- ISR ---; dd $t1+0x000C0 L1; dd $t1+0x000D0 L1; dd $t1+0x02810 L2; gc"

bu i219!I219MiniportHandleInterrupt "r $t0=poi(@esp+4); r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs)); .echo --- HINT ---; dd $t1+0x000C0 L1; dd $t1+0x02810 L2; gc"

g

 

Edited by Dietmar
Posted

@reboot12

Ok, next try. Start NEW Windbg session and type this as one block in KD.

Then in cmd on the compi that runs Windbg:

ping yourrouterIP -t

 

.logopen /t c:\i219LMbest_kd_diag.txt
.symfix
.reload /f
lm m i219
bc *

bu i219!I219DoCtrlKickLate "
r $t2=poi(@esp+4);
r $t0=@ecx;
.printf \"CtrlKickLate ecx=%08x stk=%08x\n\", @ecx, $t2;
.if ($t0<0x80000000) { r $t0=$t2; }
.if ($t0<0x80000000) { .echo CtrlKickLate NO_ADAPTER_PTR; gc; }
r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs));
.printf \"a=%08x regs=%08x\n\", $t0, $t1;
.if ($t1==0) { .echo CtrlKickLate REGS_NULL; gc; }
dd $t1+0x0000 L2
dd $t1+0x0008 L1
dd $t1+0x00C0 L1
dd $t1+0x00D0 L1
dd $t1+0x00D8 L1
dd $t1+0x0100 L1
dd $t1+0x05008 L1
dd $t1+0x02800 L12
dd $t1+0x02810 L2
dd $t1+0x02828 L1
dd $t1+0x03800 L12
gc
"

bu i219!I219TxRxStart "
r $t2=poi(@esp+4);
r $t0=@ecx;
.printf \"TxRxStart ecx=%08x stk=%08x\n\", @ecx, $t2;
.if ($t0<0x80000000) { r $t0=$t2; }
.if ($t0<0x80000000) { .echo TxRxStart NO_ADAPTER_PTR; gc; }
r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs));
.printf \"a=%08x regs=%08x\n\", $t0, $t1;
dt i219!_I219_ADAPTER $t0
dt i219!_I219_TXRX_CTX i219!g_TxRx
.if ($t1==0) { .echo TxRxStart REGS_NULL; gc; }
dd $t1+0x0000 L2
dd $t1+0x0008 L1
dd $t1+0x00C0 L1
dd $t1+0x00D0 L1
dd $t1+0x00D8 L1
dd $t1+0x0100 L1
dd $t1+0x05008 L1
dd $t1+0x02800 L12
dd $t1+0x02810 L2
dd $t1+0x02828 L1
dd $t1+0x03800 L12
gc
"

bu i219!I219PollTimerFunc "
r $t2=poi(@esp+8);
r $t0=@ecx;
.printf \"PollTimer ecx=%08x ctx=%08x\n\", @ecx, $t2;
.if ($t0<0x80000000) { r $t0=$t2; }
.if ($t0<0x80000000) { .echo PollTimer NO_ADAPTER_PTR; gc; }
r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs));
.if ($t1==0) { .echo PollTimer REGS_NULL; gc; }
.printf \"RDH=%08x RDT=%08x RCTL=%08x RFCTL=%08x RXDCTL0=%08x IMS=%08x ICR=%08x\n\", poi($t1+0x2810), poi($t1+0x2818), poi($t1+0x0100), poi($t1+0x5008), poi($t1+0x2828), poi($t1+0x00D0), poi($t1+0x00C0);
gc
"

bu i219!I219RxPoll "
r $t2=poi(@esp+4);
r $t0=@ecx;
.printf \"RxPoll ecx=%08x stk=%08x\n\", @ecx, $t2;
.if ($t0<0x80000000) { r $t0=$t2; }
.if ($t0<0x80000000) { .echo RxPoll NO_ADAPTER_PTR; gc; }
r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs));
.if ($t1==0) { .echo RxPoll REGS_NULL; gc; }
r $t3=poi(i219!g_TxRx+@@c++(&((i219!_I219_TXRX_CTX*)0)->RxDesc));
r $t4=poi(i219!g_TxRx+@@c++(&((i219!_I219_TXRX_CTX*)0)->RxNext));
r $t5=$t3+($t4*0x10);
.printf \"RDH=%08x RDT=%08x RCTL=%08x RFCTL=%08x RXDCTL0=%08x\n\", poi($t1+0x2810), poi($t1+0x2818), poi($t1+0x0100), poi($t1+0x5008), poi($t1+0x2828);
dd $t5 L4
db $t5+0x0C L4
gc
"

bu i219!I219MiniportISR "
r $t0=poi(@esp+0x0C);
.if ($t0<0x80000000) { .echo ISR BAD_CTX; gc; }
r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs));
.if ($t1==0) { .echo ISR REGS_NULL; gc; }
.printf \"ISR ICR=%08x IMS=%08x RDH=%08x RDT=%08x\n\", poi($t1+0x00C0), poi($t1+0x00D0), poi($t1+0x2810), poi($t1+0x2818);
gc
"

bu i219!I219MiniportHandleInterrupt "
r $t0=poi(@esp+4);
.if ($t0<0x80000000) { .echo HINT BAD_CTX; gc; }
r $t1=poi($t0+@@c++(&((i219!_I219_ADAPTER*)0)->Regs));
.if ($t1==0) { .echo HINT REGS_NULL; gc; }
.printf \"HINT ICR=%08x RDH=%08x RDT=%08x\n\", poi($t1+0x00C0), poi($t1+0x2810), poi($t1+0x2818);
gc
"

g

 

Posted

@reboot12

ok, please again NEW Windbg session, type this as ONE block in KD

.logopen /t c:\i219LMbest_kd_diag_fixed.txt
.symfix
.reload /f
lm m i219
bc *
r $t0=0
r $t1=0
r $t2=0
r $t3=0
r $t4=0
r $t5=0
r $t6=0
r $t7=0

bu i219!I219DoCtrlKickLate "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .printf \"KICK a=%08x regs=%08x\\n\",$t0,$t1; .if ($t1==0) { .echo KICK REGS_NULL; gc; } .printf \"RDH=%08x RDT=%08x RCTL=%08x RFCTL=%08x RXDCTL0=%08x IMS=%08x ICR=%08x\\n\", poi($t1+0x2810),poi($t1+0x2818),poi($t1+0x0100),poi($t1+0x5008),poi($t1+0x2828),poi($t1+0x00D0),poi($t1+0x00C0); dd $t1+0x2800 L12; dd $t1+0x2828 L1; dd $t1+0x0100 L1; dd $t1+0x5008 L1; dd $t1+0x00D0 L1; dd $t1+0x00C0 L1; gc"

bu i219!I219TxRxStart "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .printf \"START a=%08x regs=%08x\\n\",$t0,$t1; .if ($t1==0) { .echo START REGS_NULL; gc; } .printf \"RDH=%08x RDT=%08x RCTL=%08x RFCTL=%08x RXDCTL0=%08x IMS=%08x ICR=%08x\\n\", poi($t1+0x2810),poi($t1+0x2818),poi($t1+0x0100),poi($t1+0x5008),poi($t1+0x2828),poi($t1+0x00D0),poi($t1+0x00C0); dd $t1+0x2800 L12; dd $t1+0x2828 L1; dd $t1+0x0100 L1; dd $t1+0x5008 L1; dd $t1+0x00D0 L1; dd $t1+0x00C0 L1; gc"

bu i219!I219PollTimerFunc "r $t0=poi(@esp+8); r $t1=poi($t0+0xDC); .if ($t1==0) { .echo PT REGS_NULL; gc; } .printf \"PT a=%08x regs=%08x RDH=%08x RDT=%08x\\n\",$t0,$t1,poi($t1+0x2810),poi($t1+0x2818); .printf \"RCTL=%08x RFCTL=%08x RXDCTL0=%08x IMS=%08x ICR=%08x\\n\", poi($t1+0x0100),poi($t1+0x5008),poi($t1+0x2828),poi($t1+0x00D0),poi($t1+0x00C0); r $t7=0; r $t7=i219!g_TxRx; .if ($t7!=0) { r $t3=poi($t7+0x1C); r $t4=poi($t7+0x0D4); r $t5=$t3+($t4*0x10); .printf \"RXDESC=%08x RXNEXT=%08x CUR=%08x\\n\",$t3,$t4,$t5; dd $t5 L4; db $t5+0x0C L4; } gc"

bu i219!I219RxPoll "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .if ($t1==0) { .echo RXP REGS_NULL; gc; } .printf \"RXP RDH=%08x RDT=%08x RCTL=%08x\\n\", poi($t1+0x2810),poi($t1+0x2818),poi($t1+0x0100); r $t7=0; r $t7=i219!g_TxRx; .if ($t7!=0) { r $t3=poi($t7+0x1C); r $t4=poi($t7+0x0D4); r $t5=$t3+($t4*0x10); dd $t5 L4; db $t5+0x0C L4; } gc"

bu i219!I219MiniportISR "r $t0=poi(@esp+0x0C); r $t1=poi($t0+0xDC); .if ($t1==0) { .echo ISR REGS_NULL; gc; } .printf \"ISR ICR=%08x IMS=%08x RDH=%08x RDT=%08x\\n\", poi($t1+0x00C0),poi($t1+0x00D0),poi($t1+0x2810),poi($t1+0x2818); gc"

bu i219!I219MiniportHandleInterrupt "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .if ($t1==0) { .echo HINT REGS_NULL; gc; } .printf \"HINT ICR=%08x RDH=%08x RDT=%08x\\n\", poi($t1+0x00C0),poi($t1+0x2810),poi($t1+0x2818); gc"

g

 

Posted (edited)
11 hours ago, Dietmar said:

type this as ONE block in KD

So I can copy and paste all the code at once and you wrote earlier that I have to enter it line by line <_<

Now I can use WinDbg conveniently and pleasantly :)

Typing line by line was very tiring :crazy:

https://www.upload.ee/files/19111494/i219LMbest_kd_diag_fixed_05d4_2026-02-26_07-14-11-281.txt.html

i219LMv7 - 100 Mbps but 0/0

Edited by reboot12
Posted

@reboot12

Type the following in one block to KD. If the output stops, type g .

 

!sym noisy
.reload /f
sxe ld:i219
sxe ud:i219
g
.reload /f i219.sys
lm m i219
bc *
bu i219!I219MiniportInitialize ".echo INIT; gc"
bu i219!I219MiniportQueryInformation ".printf \"QRY OID=%08x LEN=%u\\n\", poi(@esp+8), poi(@esp+0x10); gc"
bu i219!I219MiniportSetInformation ".printf \"SET OID=%08x LEN=%u\\n\", poi(@esp+8), poi(@esp+0x10); gc"
bu i219!I219DoCtrlKickLate ".echo CTRLKICK; gc"
bu i219!I219TxRxStart "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .printf \"TXRXSTART a=%p regs=%p\\n\", $t0, $t1; dd $t1+0x0008 L1; dd $t1+0x00d0 L1; dd $t1+0x0100 L1; dd $t1+0x2810 L1; dd $t1+0x2818 L1; gc"
bu i219!I219MiniportSendPackets ".printf \"SEND CNT=%u\\n\", poi(@esp+0x0c); gc"
bu i219!I219RxPoll "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .printf \"RXPOLL regs=%p\\n\", $t1; dd $t1+0x2810 L1; dd $t1+0x2818 L1; gc"
bu i219!I219MiniportISR ".echo ISR; gc"
bu i219!I219MiniportHandleInterrupt ".echo HINT; gc"
g

 

Posted (edited)

@reboot12

Yes, mostly. I noticed, that Windbg sometimes out of nowhere changed the path to C:\symbols to something other.

This you see at once, when you kept all those comands

Dietmar

PS: Now I look at your output. Everything is ok, only RX does not act for to get packages.

Now I look for next commands for KD, WHY this happens.

Edited by Dietmar
Posted (edited)

@Dietmar

I noticed that WinDbg remembers the path to the symbols after starting, so there is no need to set it in the KD each time.

I tested the commands without !sym noisy & .reload /f and the results are the same but the log is clearer without the DBGHELP messages so I think this commands are unnecessary.

From now on I will start debugging with the commands:
 

sxe ld:i219
sxe ud:i219
g
.reload /f i219.sys
lm m i219

and put your new commands there

This is full WinDbg log if try from start WinDbg and from command sxe ld:i219 (after auto break from boot.ini switch) > https://pastebin.com/3HSAFxjG

Edited by reboot12
Posted (edited)

@reboot12

Here it is,

good luck, When it does not work, use those KD commands as before

Dietmar

https://www.upload.ee/files/19111729/i219v9.zip.html

bc *
bu i219!I219MiniportInitialize ".echo INIT; gc"
bu i219!I219MiniportQueryInformation ".printf \"QRY OID=%08x LEN=%u\\n\", poi(@esp+8), poi(@esp+0x10); gc"
bu i219!I219MiniportSetInformation ".printf \"SET OID=%08x LEN=%u\\n\", poi(@esp+8), poi(@esp+0x10); gc"
bu i219!I219DoCtrlKickLate ".echo CTRLKICK; gc"
bu i219!I219TxRxStart "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .printf \"TXRXSTART a=%p regs=%p\\n\", $t0, $t1; dd $t1+0x0008 L1; dd $t1+0x00d0 L1; dd $t1+0x0100 L1; dd $t1+0x2810 L1; dd $t1+0x2818 L1; gc"
bu i219!I219MiniportSendPackets ".printf \"SEND CNT=%u\\n\", poi(@esp+0x0c); gc"
bu i219!I219RxPoll "r $t0=poi(@esp+4); r $t1=poi($t0+0xDC); .printf \"RXPOLL regs=%p\\n\", $t1; dd $t1+0x2810 L1; dd $t1+0x2818 L1; gc"
bu i219!I219MiniportISR ".echo ISR; gc"
bu i219!I219MiniportHandleInterrupt ".echo HINT; gc"
g

 

Edited by Dietmar

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...