Master IRQ should be EOIed first, I think.
[people/lynusvaz/gpxe.git] / src / arch / i386 / drivers / net / undiisr.S
1 #define PXENV_UNDI_ISR 0x0014
2 #define PXENV_UNDI_ISR_IN_START 1
3 #define PXENV_UNDI_ISR_OUT_OURS 0
4 #define PXENV_UNDI_ISR_OUT_NOT_OURS 1
5
6 #define IRQ_PIC_CUTOFF 8
7 #define ICR_EOI_NON_SPECIFIC 0x20
8 #define PIC1_ICR 0x20
9 #define PIC2_ICR 0xa0
10         
11         .text
12         .arch i386
13         .section ".text16", "ax", @progbits
14         .section ".data16", "aw", @progbits
15         .code16
16
17         .section ".text16"
18         .globl undiisr
19 undiisr:
20         
21         /* Preserve registers */
22         pushw   %ds
23         pushw   %es
24         pusha
25         
26         /* Issue UNDI API call */
27         movw    %cs:rm_ds, %ax
28         movw    %ax, %ds
29         movw    %ax, %es
30         movw    $undinet_params, %di
31         movw    $PXENV_UNDI_ISR, %bx
32         movw    $PXENV_UNDI_ISR_IN_START, funcflag
33         pushw   %es
34         pushw   %di
35         pushw   %bx
36         lcall   *undinet_entry_point
37         addw    $6, %sp
38         cmpw    $PXENV_UNDI_ISR_OUT_OURS, funcflag
39         jne     chain
40         
41 ack:    /* Record interrupt occurence */
42         incb    undiisr_trigger_count
43         /* Send EOI */
44         movb    $ICR_EOI_NON_SPECIFIC, %al
45         cmpb    $IRQ_PIC_CUTOFF, undiisr_irq
46         jb      1f
47         outb    %al, $PIC2_ICR
48 1:      outb    %al, $PIC1_ICR
49         jmp     exit
50         
51 chain:  /* Chain to next handler */
52         pushfw
53         lcall   *undiisr_next_handler
54         
55 exit:   /* Restore registers and return */
56         popa
57         popw    %es
58         popw    %ds
59         iret
60
61         .section ".data16"
62 undinet_params:
63 status:                 .word   0
64 funcflag:               .word   0
65 bufferlength:           .word   0
66 framelength:            .word   0
67 frameheaderlength:      .word   0
68 frame:                  .word   0, 0
69 prottype:               .byte   0
70 pkttype:                .byte   0