Selaa lähdekoodia

Updated to new PCI bus interface.

tags/v0.9.3
Michael Brown 19 vuotta sitten
vanhempi
commit
38ea910098
1 muutettua tiedostoa jossa 100 lisäystä ja 89 poistoa
  1. 100
    89
      src/drivers/net/skel.c

+ 100
- 89
src/drivers/net/skel.c Näytä tiedosto

@@ -14,18 +14,45 @@ Skeleton NIC driver for Etherboot
14 14
 #include "etherboot.h"
15 15
 /* to get the interface to the body of the program */
16 16
 #include "nic.h"
17
-/* to get the PCI support functions, if this is a PCI NIC */
17
+/* Drag in support for whichever bus(es) we want for this NIC */
18 18
 #include "pci.h"
19
-/* to get the ISA support functions, if this is an ISA NIC */
20 19
 #include "isa.h"
20
+#include "eisa.h"
21
+#include "isapnp.h"
22
+#include "mca.h"
21 23
 
22
-/* NIC specific static variables go here */
24
+/* NIC specific static variables go here.  Try to avoid using static
25
+ * variables wherever possible.  In particular, the I/O address can
26
+ * always be accessed via nic->ioaddr.
27
+ */
28
+
29
+/*
30
+ * Don't forget to remove "__unused" from all the function parameters!
31
+ *
32
+ */
23 33
 
24 34
 /**************************************************************************
25
-POLL - Wait for a frame
26
-***************************************************************************/
27
-static int skel_poll(struct nic *nic, int retrieve)
28
-{
35
+ * CONNECT - Connect to the network
36
+ **************************************************************************
37
+*/
38
+static int skel_connect ( struct nic *nic __unused ) {
39
+	/*
40
+	 * Connect to the network.  For most NICs, this will probably
41
+	 * be a no-op.  For wireless NICs, this should be the point at
42
+	 * which you attempt to join to an access point.
43
+	 *
44
+	 * Return 0 if the connection failed (e.g. no cable plugged
45
+	 * in), 1 for success.
46
+	 *
47
+	 */
48
+	return 1;
49
+}
50
+
51
+/**************************************************************************
52
+ * POLL - Wait for a frame
53
+ **************************************************************************
54
+*/
55
+static int skel_poll ( struct nic *nic __unused, int retrieve __unused ) {
29 56
 	/* Work out whether or not there's an ethernet packet ready to
30 57
 	 * read.  Return 0 if not.
31 58
 	 */
@@ -37,7 +64,7 @@ static int skel_poll(struct nic *nic, int retrieve)
37 64
 	 * presence of a packet but don't want to read it just yet.
38 65
 	 */
39 66
 	/*
40
-	  if ( ! retrieve ) return 1;
67
+	   if ( ! retrieve ) return 1;
41 68
 	*/
42 69
 
43 70
 	/* Copy data to nic->packet.  Data should include the
@@ -55,33 +82,33 @@ static int skel_poll(struct nic *nic, int retrieve)
55 82
 }
56 83
 
57 84
 /**************************************************************************
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
-{
85
+ * TRANSMIT - Transmit a frame
86
+ **************************************************************************
87
+*/
88
+static void skel_transmit ( struct nic *nic __unused,
89
+			    const char *dest __unused,
90
+			    unsigned int type __unused,
91
+			    unsigned int size __unused,
92
+			    const char *packet __unused ) {
67 93
 	/* Transmit packet to dest MAC address.  You will need to
68 94
 	 * construct the link-layer header (dest MAC, source MAC,
69 95
 	 * type).
70 96
 	 */
71 97
 	/*
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 );
98
+	   unsigned int nstype = htons ( type );
99
+	   memcpy ( <tx_buffer>, dest, ETH_ALEN );
100
+	   memcpy ( <tx_buffer> + ETH_ALEN, nic->node_addr, ETH_ALEN );
101
+	   memcpy ( <tx_buffer> + 2 * ETH_ALEN, &nstype, 2 );
102
+	   memcpy ( <tx_buffer> + ETH_HLEN, data, size );
103
+	   <transmit_data> ( <tx_buffer>, size + ETH_HLEN );
78 104
 	 */
79 105
 }
80 106
 
81 107
 /**************************************************************************
82
-DISABLE - Turn off ethernet interface
83
-***************************************************************************/
84
-static void skel_disable ( struct nic *nic ) {
108
+ * DISABLE - Turn off ethernet interface
109
+ **************************************************************************
110
+ */
111
+static void skel_disable ( struct nic *nic __unused ) {
85 112
 	/* put the card in its initial state */
86 113
 	/* This function serves 3 purposes.
87 114
 	 * This disables DMA and interrupts so we don't receive
@@ -95,10 +122,10 @@ static void skel_disable ( struct nic *nic ) {
95 122
 }
96 123
 
97 124
 /**************************************************************************
98
-IRQ - handle interrupts
99
-***************************************************************************/
100
-static void skel_irq(struct nic *nic, irq_action_t action)
101
-{
125
+ * IRQ - handle interrupts
126
+ **************************************************************************
127
+*/
128
+static void skel_irq ( struct nic *nic __unused, irq_action_t action ) {
102 129
 	/* This routine is somewhat optional.  Etherboot itself
103 130
 	 * doesn't use interrupts, but they are required under some
104 131
 	 * circumstances when we're acting as a PXE stack.
@@ -127,8 +154,12 @@ static void skel_irq(struct nic *nic, irq_action_t action)
127 154
 	}
128 155
 }
129 156
 
157
+/**************************************************************************
158
+ * OPERATIONS TABLE - Pointers to all the above methods
159
+ **************************************************************************
160
+ */
130 161
 static struct nic_operations skel_operations = {
131
-	.connect	= dummy_connect,
162
+	.connect	= skel_connect,
132 163
 	.poll		= skel_poll,
133 164
 	.transmit	= skel_transmit,
134 165
 	.irq		= skel_irq,
@@ -136,70 +167,50 @@ static struct nic_operations skel_operations = {
136 167
 };
137 168
 
138 169
 /**************************************************************************
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 ) {
170
+ * PROBE - Look for an adapter
171
+ *
172
+ * You need to define a probe routine for each bus type that your
173
+ * driver supports, together with tables that enable Etherboot to
174
+ * identify that your driver should be used for a particular device.
175
+ *
176
+ * Delete whichever of the following sections you don't need.  For
177
+ * example, most PCI devices will only need the PCI probing section;
178
+ * ISAPnP, EISA, etc. can all be deleted.
179
+ *
180
+ **************************************************************************
181
+ */
145 182
 
183
+/**************************************************************************
184
+ * PCI PROBE - Look for an adapter
185
+ **************************************************************************
186
+ */
187
+static int skel_pci_probe ( struct dev *dev, struct pci_device *pci ) {
146 188
 	struct nic *nic = nic_device ( dev );
147 189
 
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 );
190
+	/* store NIC parameters */
191
+	nic->ioaddr = pci->ioaddr;
192
+	nic->irqno = pci->irq;
169 193
 
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;
194
+	/* Test for physical presence of NIC */
195
+	/*
196
+	  if ( ! my_tests ) {
197
+	  	DBG ( "Could not find NIC: my explanation\n" );
198
+		return 0;
199
+	  }
200
+	*/
188 201
 
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;
202
+	/* point to NIC specific routines */
203
+	nic->nic_op	= &skel_operations;
204
+	return 1;
196 205
 }
197 206
 
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,
207
+static struct pci_id skel_pci_nics[] = {
208
+PCI_ROM ( 0x0000, 0x0000, "skel-pci", "Skeleton PCI Adaptor" ),
204 209
 };
205 210
 
211
+static struct pci_driver skel_pci_driver =
212
+	PCI_DRIVER ( "SKELETON/PCI", skel_pci_nics, PCI_NO_CLASS );
213
+
214
+BOOT_DRIVER ( "SKELETON/PCI", find_pci_boot_device,
215
+	      skel_pci_driver, skel_pci_probe );
216
+

Loading…
Peruuta
Tallenna