Adding upstream version 3.86+dfsg.
[syslinux-debian/hramrach.git] / core / pxeidle.inc
blob230fb96a61dc75358efbbadbada0372aa1712417
1 ;; -*- fundamental -*- ---------------------------------------------------
2 ;;
3 ;;   Copyright 2008 H. Peter Anvin - All Rights Reserved
4 ;;   Copyright 2009 Intel Corporation; author: H. Peter Anvin
5 ;;
6 ;;   This program is free software; you can redistribute it and/or modify
7 ;;   it under the terms of the GNU General Public License as published by
8 ;;   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
9 ;;   Boston MA 02110-1301, USA; either version 2 of the License, or
10 ;;   (at your option) any later version; incorporated herein by reference.
12 ;; -----------------------------------------------------------------------
15 ;; pxeidle.inc
18 ;; Query for the NIC type, and detect certain special cases.
21                 section .text
24 ;; Initializes the idle mechanism based on the device type
26 ;;      Assumes CS == DS == ES
28 pxe_detect_nic_type:
29                 pushad
31                 mov di,pxenv_get_nic_type
32                 mov bx,PXENV_UNDI_GET_NIC_TYPE
33                 call pxenv
34                 jc .done
35                 cmp word [di],0
36                 jne .done
37                 cmp byte [di+2],2               ; PCI_NIC
38                 jne .done                       ; No list for non-PCI nics
40                 mov cx,pxe_idle_pci_list.len
41                 mov si,pxe_idle_pci_list
42 .look_for_id:
43                 lodsd
44                 cmp eax,[di+3]                  ; VID:DID
45                 je .found_device
46                 loop .look_for_id
47 .done:
48                 popad
49                 ret
51 .found_device:
52                 mov word [IdleHook],check_for_arp
53                 jmp .done
56 ;; List of devices for which we want to actually issue idle calls.
58                 section .data
59                 alignz 4
60 pxe_idle_pci_list:
62 ; Older Broadcom NICs; these need idle calls to avoid FIFO stalls.
64                 dw 0x14e4, 0x1659               ; BCM5721
65                 dw 0x14e4, 0x165a               ; BCM5722
66                 dw 0x14e4, 0x165b               ; BCM5723
67                 dw 0x14e4, 0x1668               ; BCM5714
68                 dw 0x14e4, 0x1669               ; BCM5714S
69                 dw 0x14e4, 0x166a               ; BCM5780
70                 dw 0x14e4, 0x166b               ; BCM5780S
71                 dw 0x14e4, 0x1673               ; BCM5755M
72                 dw 0x14e4, 0x1674               ; BCM5756ME
73                 dw 0x14e4, 0x1678               ; BCM5715
74                 dw 0x14e4, 0x1679               ; BCM5715S
75                 dw 0x14e4, 0x167b               ; BCM5755
77 .len            equ ($-pxe_idle_pci_list) >> 2
79                 section .bss
80 pxenv_get_nic_type:
81 .status:        resw 1
82 .nic_type:      resb 1
83 .vid:           resw 1
84 .did:           resw 1
85 .base_class:    resb 1
86 .sub_class:     resb 1
87 .prog_intf:     resb 1
88 .rev:           resb 1
89 .busdevfunc:    resw 1
90 .svid:          resw 1
91 .sdid:          resw 1
93                 section .text
95 ; Call the receive loop while idle.  This is done mostly so we can respond to
96 ; ARP messages, but perhaps in the future this can be used to do network
97 ; console.
99 ; hpa sez: people using automatic control on the serial port get very
100 ; unhappy if we poll for ARP too often (the PXE stack is pretty slow,
101 ; typically.)  Therefore, only poll if at least 4 BIOS timer ticks have
102 ; passed since the last poll, and reset this when a character is
103 ; received (call reset_idle).
105 ; Note: we only do this if pxe_detect_nic_type has set the IdleHook
106 ; to point to this routine.
108 check_for_arp:
109                 pushad
110                 mov di,packet_buf
111                 mov [pxe_udp_read_pkt.buffer],di
112                 mov [pxe_udp_read_pkt.buffer+2],ds
113                 mov word [pxe_udp_read_pkt.buffersize],packet_buf_size
114                 mov eax,[MyIP]
115                 mov [pxe_udp_read_pkt.dip],eax
116                 mov word [pxe_udp_read_pkt.lport],htons(9)      ; discard port
117                 mov di,pxe_udp_read_pkt
118                 mov bx,PXENV_UDP_READ
119                 call pxenv
120                 ; Ignore result...
121                 popad
122                 ret