Fix up the automatic modifications.
[people/lynusvaz/gpxe.git] / src / drivers / net / skel.c
1 /**************************************************************************
2 Etherboot -  BOOTP/TFTP Bootstrap Program
3 Skeleton NIC driver for Etherboot
4 ***************************************************************************/
5
6 /*
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2, or (at
10  * your option) any later version.
11  */
12
13 /* to get some global routines like printf */
14 #include "etherboot.h"
15 /* to get the interface to the body of the program */
16 #include "nic.h"
17 /* to get the PCI support functions, if this is a PCI NIC */
18 #include "pci.h"
19 /* to get the ISA support functions, if this is an ISA NIC */
20 #include "isa.h"
21
22 /* NIC specific static variables go here */
23
24 /**************************************************************************
25 POLL - Wait for a frame
26 ***************************************************************************/
27 static int skel_poll(struct nic *nic, int retrieve)
28 {
29         /* Work out whether or not there's an ethernet packet ready to
30          * read.  Return 0 if not.
31          */
32         /* 
33            if ( ! <packet_ready> ) return 0;
34         */
35
36         /* retrieve==0 indicates that we are just checking for the
37          * presence of a packet but don't want to read it just yet.
38          */
39         /*
40           if ( ! retrieve ) return 1;
41         */
42
43         /* Copy data to nic->packet.  Data should include the
44          * link-layer header (dest MAC, source MAC, type).
45          * Store length of data in nic->packetlen.
46          * Return true to indicate a packet has been read.
47          */
48         /* 
49            nic->packetlen = <packet_length>;
50            memcpy ( nic->packet, <packet_data>, <packet_length> );
51            return 1;
52         */
53
54         return 0;       /* Remove this line once this method is implemented */
55 }
56
57 /**************************************************************************
58 TRANSMIT - Transmit a frame
59 ***************************************************************************/
60 static void skel_transmit(
61         struct nic *nic,
62         const char *dest,               /* Destination */
63         unsigned int type,              /* Type */
64         unsigned int size,              /* size */
65         const char *packet)             /* Packet */
66 {
67         /* Transmit packet to dest MAC address.  You will need to
68          * construct the link-layer header (dest MAC, source MAC,
69          * type).
70          */
71         /*
72           unsigned int nstype = htons ( type );
73           memcpy ( <tx_buffer>, dest, ETH_ALEN );
74           memcpy ( <tx_buffer> + ETH_ALEN, nic->node_addr, ETH_ALEN );
75           memcpy ( <tx_buffer> + 2 * ETH_ALEN, &nstype, 2 );
76           memcpy ( <tx_buffer> + ETH_HLEN, data, size );
77           <transmit_data> ( <tx_buffer>, size + ETH_HLEN );
78          */
79 }
80
81 /**************************************************************************
82 DISABLE - Turn off ethernet interface
83 ***************************************************************************/
84 static void skel_disable ( struct nic *nic ) {
85         /* put the card in its initial state */
86         /* This function serves 3 purposes.
87          * This disables DMA and interrupts so we don't receive
88          *  unexpected packets or interrupts from the card after
89          *  etherboot has finished. 
90          * This frees resources so etherboot may use
91          *  this driver on another interface
92          * This allows etherboot to reinitialize the interface
93          *  if something is something goes wrong.
94          */
95 }
96
97 /**************************************************************************
98 IRQ - handle interrupts
99 ***************************************************************************/
100 static void skel_irq(struct nic *nic, irq_action_t action)
101 {
102         /* This routine is somewhat optional.  Etherboot itself
103          * doesn't use interrupts, but they are required under some
104          * circumstances when we're acting as a PXE stack.
105          *
106          * If you don't implement this routine, the only effect will
107          * be that your driver cannot be used via Etherboot's UNDI
108          * API.  This won't affect programs that use only the UDP
109          * portion of the PXE API, such as pxelinux.
110          */
111        
112         switch ( action ) {
113         case DISABLE :
114         case ENABLE :
115                 /* Set receive interrupt enabled/disabled state */
116                 /*
117                   outb ( action == ENABLE ? IntrMaskEnabled : IntrMaskDisabled,
118                          nic->ioaddr + IntrMaskRegister );
119                  */
120                 break;
121         case FORCE :
122                 /* Force NIC to generate a receive interrupt */
123                 /*
124                   outb ( ForceInterrupt, nic->ioaddr + IntrForceRegister );
125                  */
126                 break;
127         }
128 }
129
130 static struct nic_operations skel_operations = {
131         .connect        = dummy_connect,
132         .poll           = skel_poll,
133         .transmit       = skel_transmit,
134         .irq            = skel_irq,
135         .disable        = skel_disable,
136 };
137
138 /**************************************************************************
139 PROBE - Look for an adapter, this routine's visible to the outside
140 ***************************************************************************/
141
142 #define board_found 1
143 #define valid_link 0
144 static int skel_probe ( struct dev *dev, struct pci_device *pci ) {
145
146         struct nic *nic = nic_device ( dev );
147
148         if (board_found && valid_link)
149         {
150                 /* store NIC parameters */
151                 nic->ioaddr = pci->ioaddr;
152                 nic->irqno = pci->irq;
153                 /* point to NIC specific routines */
154                 nic->nic_op     = &skel_operations;
155                 return 1;
156         }
157         /* else */
158         return 0;
159 }
160
161 static struct pci_id skel_nics[] = {
162 PCI_ROM(0x0000, 0x0000, "skel-pci", "Skeleton PCI Adaptor"),
163 };
164
165 static struct pci_driver skel_driver =
166         PCI_DRIVER ( "SKELETON/PCI", skel_nics, PCI_NO_CLASS );
167
168 BOOT_DRIVER ( "SKELETON/PCI", find_pci_boot_device, skel_driver, skel_probe );
169
170 /**************************************************************************
171 PROBE - Look for an adapter, this routine's visible to the outside
172 ***************************************************************************/
173 static int skel_isa_probe(struct dev *dev, unsigned short *probe_addrs)
174 {
175         struct nic *nic = (struct nic *)dev;
176         /* if probe_addrs is 0, then routine can use a hardwired default */
177         if (board_found && valid_link)
178         {
179                 /* point to NIC specific routines */
180 static struct nic_operations skel_operations;
181 static struct nic_operations skel_operations = {
182         .connect        = dummy_connect,
183         .poll           = skel_poll,
184         .transmit       = skel_transmit,
185         .irq            = skel_irq,
186         .disable        = skel_disable,
187 };              nic->nic_op     = &skel_operations;
188
189                 /* Report the ISA pnp id of the board */
190                 dev->devid.vendor_id = htons(GENERIC_ISAPNP_VENDOR);
191                 dev->devid.vendor_id = htons(0x1234);
192                 return 1;
193         }
194         /* else */
195         return 0;
196 }
197
198 ISA_ROM("skel-isa", "Skeleton ISA driver")
199 static struct isa_driver skel_isa_driver __isa_driver = {
200         .type    = NIC_DRIVER,
201         .name    = "SKELETON/ISA",
202         .probe   = skel_isa_probe,
203         .ioaddrs = 0,
204 };
205