[syslinux] [syslinux:master] PXE ISR: Force polling on select hardware WORKAROUND

Gene Cumm gene.cumm at gmail.com
Sun Jul 13 20:15:13 PDT 2014


On Sun, Jul 13, 2014 at 10:26 PM, H. Peter Anvin <hpa at zytor.com> wrote:
> On 07/13/2014 10:54 AM, syslinux-bot for Gene Cumm wrote:
>> Commit-ID:  3741886cb700e1017d70f1753f013fa10f4d9272
>> Gitweb:     http://www.syslinux.org/commit/3741886cb700e1017d70f1753f013fa10f4d9272
>> Author:     Gene Cumm <gene.cumm at gmail.com>
>> AuthorDate: Sun, 13 Jul 2014 11:18:50 -0400
>> Committer:  Gene Cumm <gene.cumm at gmail.com>
>> CommitDate: Sun, 13 Jul 2014 11:18:50 -0400
>>
>> PXE ISR: Force polling on select hardware WORKAROUND
>>
>> Like 2fe3a7bd, certain Dell machines (OptiPlex 990) state interrupts
>> should work but effectively don't.  Force polling.
>>
>> Reported-by: Alexander Perlis <aperlis at math.lsu.edu>
>> Signed-off-by: Gene Cumm <gene.cumm at gmail.com>
>>
>> ---
>>  core/fs/pxe/isr.c | 5 ++---
>>  1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/core/fs/pxe/isr.c b/core/fs/pxe/isr.c
>> index d0a0bf9..ddaadf9 100644
>> --- a/core/fs/pxe/isr.c
>> +++ b/core/fs/pxe/isr.c
>> @@ -266,11 +266,10 @@ void pxe_start_isr(void)
>>       dprintf("pxe_start_isr: trying poll by model\n");
>>       int hwad = ((int)MAC[0] << 16) + ((int)MAC[1] << 8) + MAC[2];
>>       dprintf("pxe_start_isr: got %06x %04x\n", hwad, pxe_undi_iface.ServiceFlags);
>> -     if (hwad == 0x000023ae) {
>> -         if (pxe_undi_iface.ServiceFlags == 0xdc1b) {
>> +     if ((hwad == 0x000023ae) && (pxe_undi_iface.ServiceFlags == 0xdc1b) ||
>> +         (hwad == 0x00180373) && (pxe_undi_iface.ServiceFlags == 0xdc1b)) {
>>               asm volatile("orb $1,%0" : "+m" (pxe_need_poll));
>>               dprintf("pxe_start_isr: forcing pxe_need_poll by model\n");
>> -         }
>>       }
>>      }
>
> Thank you.  I'm wondering if we also should force polling on if we have
> gotten no interrupts after a number of transmit attempts.
>
>         -hpa
>

core/lwip/src/netif/undiif.c:513 is supposed to address this at least
in part but in at least this instance did not.  I wonder if it's even
doing its job.  Basing the timer on last interrupt is probably a
better idea.

-- 
-Gene


More information about the Syslinux mailing list