aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Wifi.cpp67
1 files changed, 34 insertions, 33 deletions
diff --git a/src/Wifi.cpp b/src/Wifi.cpp
index 0e24722..d49fef8 100644
--- a/src/Wifi.cpp
+++ b/src/Wifi.cpp
@@ -389,12 +389,12 @@ void SendMPReply(u16 clienttime, u16 clientmask)
{
TXSlot* slot = &TXSlots[5];
- slot->Addr = (IOPORT(W_TXSlotReply2) & 0x0FFF) << 1;
- slot->Length = *(u16*)&RAM[slot->Addr + 0xA] & 0x3FFF;
+ // mark the last packet as success. dunno what the MSB is, it changes.
+ if (IOPORT(W_TXSlotReply2) & 0x8000)
+ *(u16*)&RAM[slot->Addr] = 0x1201;
- u8 rate = RAM[slot->Addr + 0x8];
- if (rate == 0x14) slot->Rate = 2;
- else slot->Rate = 1;
+ IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
+ IOPORT(W_TXSlotReply1) = 0;
u16 clientnum = 0;
for (int i = 1; i < IOPORT(W_AIDLow); i++)
@@ -475,6 +475,29 @@ bool ProcessTX(TXSlot* slot, int num)
{
case 0: // preamble done
{
+ SetIRQ(7);
+
+ if (num == 5)
+ {
+ // MP reply slot
+ // setup needs to be done now as port 098 can get changed in the meantime
+
+ // can be cancelled, but IRQ7 is still triggered
+ if (!(IOPORT(W_TXSlotReply2) & 0x8000))
+ {
+ IOPORT(W_TXBusy) &= ~0x80;
+ FireTX();
+ return true;
+ }
+
+ slot->Addr = (IOPORT(W_TXSlotReply2) & 0x0FFF) << 1;
+ slot->Length = *(u16*)&RAM[slot->Addr + 0xA] & 0x3FFF;
+
+ u8 rate = RAM[slot->Addr + 0x8];
+ if (rate == 0x14) slot->Rate = 2;
+ else slot->Rate = 1;
+ }
+
u32 len = slot->Length;
if (slot->Rate == 2) len *= 4;
else len *= 8;
@@ -482,18 +505,6 @@ bool ProcessTX(TXSlot* slot, int num)
slot->CurPhase = 1;
slot->CurPhaseTime = len;
- // CHECKME
- // hardware seems to do this automatically?
- // I saw it done on captured packets, but saw no code to do it
- /*if (num == 1)
- {
- if (slot->Length > 32)
- {
- *(u16*)&RAM[slot->Addr + 0xC + (slot->Length-6)] = *(u16*)&RAM[slot->Addr + 0x26];
- }
- }*/
-
- SetIRQ(7);
*(u16*)&RAM[slot->Addr + 0xC + 22] = IOPORT(W_TXSeqNo) << 4;
IOPORT(W_TXSeqNo) = (IOPORT(W_TXSeqNo) + 1) & 0x0FFF;
@@ -538,7 +549,6 @@ printf("tx done. listen to replies\n");
}
IOPORT(W_TXBusy) &= ~0x80;
- IOPORT(W_TXSlotReply2) &= 0x7FFF;
FireTX();
return true;
}
@@ -768,7 +778,7 @@ void MSTimer()
//if (!IOPORT(W_TXBusy))
// CheckRX(false);
}
-u64 mpreplywindow;
+
void USTimer(u32 param)
{
if (IOPORT(W_USCountCnt))
@@ -863,21 +873,12 @@ void USTimer(u32 param)
if ((RXBuffer[0] & 0x0F) == 0x0C)
{
u16 clientmask = *(u16*)&RXBuffer[0xC + 26];
- if (clientmask & (1 << IOPORT(W_AIDLow)))
+ if (IOPORT(W_AIDLow) && (RXBuffer[0xC + 4] & 0x01) && (clientmask & (1 << IOPORT(W_AIDLow))))
{
printf("MP: attempting to reply: %04X %04X, delay=%04X\n",
IOPORT(W_TXSlotReply1), IOPORT(W_TXSlotReply2), *(u16*)&RXBuffer[0xC + 24]);
- mpreplywindow = USCounter;
- // this is a big fat guess
- if (IOPORT(W_TXSlotReply1) & 0x8000)
- {
- IOPORT(W_TXSlotReply2) = IOPORT(W_TXSlotReply1);
- IOPORT(W_TXSlotReply1) = 0;
-
- SendMPReply(*(u16*)&RXBuffer[0xC + 24], *(u16*)&RXBuffer[0xC + 26]);
- }
- //if (IOPORT(W_TXSlotReply2) & 0x8000)
- // SendMPReply(*(u16*)&RXBuffer[0xC + 24]);
+
+ SendMPReply(*(u16*)&RXBuffer[0xC + 24], *(u16*)&RXBuffer[0xC + 26]);
}
}
}
@@ -1290,8 +1291,8 @@ void Write(u32 addr, u16 val)
return;
case 0x094:
- printf("wifi: trying to send packet. %08X=%04X. TXREQ=%04X. delay=%08X\n",
- addr, val, IOPORT(W_TXReqRead), (u32)(USCounter-mpreplywindow));
+ printf("wifi: trying to send packet. %08X=%04X. TXREQ=%04X.\n",
+ addr, val, IOPORT(W_TXReqRead));
break;
case 0x228: