2 * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 FILE_LICENCE ( GPL2_OR_LATER );
27 #include <ipxe/netdevice.h>
28 #include <ipxe/ethernet.h>
29 #include <ipxe/if_ether.h>
30 #include <ipxe/iobuf.h>
31 #include <ipxe/malloc.h>
38 * Skeleton network driver
42 /******************************************************************************
46 ******************************************************************************
50 * Read from MII register
52 * @v mii MII interface
53 * @v reg Register address
54 * @ret value Data read, or negative error
56 static int skeleton_mii_read ( struct mii_interface *mii, unsigned int reg ) {
57 struct skeleton_nic *skel =
58 container_of ( mii, struct skeleton_nic, mii );
60 DBGC ( skel, "SKELETON %p does not yet support MII read\n", skel );
66 * Write to MII register
68 * @v mii MII interface
69 * @v reg Register address
70 * @v data Data to write
71 * @ret rc Return status code
73 static int skeleton_mii_write ( struct mii_interface *mii, unsigned int reg,
75 struct skeleton_nic *skel =
76 container_of ( mii, struct skeleton_nic, mii );
78 DBGC ( skel, "SKELETON %p does not yet support MII write\n", skel );
84 /** Skeleton MII operations */
85 static struct mii_operations skeleton_mii_operations = {
86 .read = skeleton_mii_read,
87 .write = skeleton_mii_write,
90 /******************************************************************************
94 ******************************************************************************
100 * @v skel Skeleton device
101 * @ret rc Return status code
103 static int skeleton_reset ( struct skeleton_nic *skel ) {
105 DBGC ( skel, "SKELETON %p does not yet support reset\n", skel );
109 /******************************************************************************
113 ******************************************************************************
119 * @v netdev Network device
121 static void skeleton_check_link ( struct net_device *netdev ) {
122 struct skeleton_nic *skel = netdev->priv;
124 DBGC ( skel, "SKELETON %p does not yet support link state\n", skel );
125 netdev_link_err ( netdev, -ENOTSUP );
128 /******************************************************************************
130 * Network device interface
132 ******************************************************************************
136 * Open network device
138 * @v netdev Network device
139 * @ret rc Return status code
141 static int skeleton_open ( struct net_device *netdev ) {
142 struct skeleton_nic *skel = netdev->priv;
144 DBGC ( skel, "SKELETON %p does not yet support open\n", skel );
149 * Close network device
151 * @v netdev Network device
153 static void skeleton_close ( struct net_device *netdev ) {
154 struct skeleton_nic *skel = netdev->priv;
156 DBGC ( skel, "SKELETON %p does not yet support close\n", skel );
162 * @v netdev Network device
163 * @v iobuf I/O buffer
164 * @ret rc Return status code
166 static int skeleton_transmit ( struct net_device *netdev,
167 struct io_buffer *iobuf ) {
168 struct skeleton_nic *skel = netdev->priv;
170 DBGC ( skel, "SKELETON %p does not yet support transmit\n", skel );
176 * Poll for completed and received packets
178 * @v netdev Network device
180 static void skeleton_poll ( struct net_device *netdev ) {
181 struct skeleton_nic *skel = netdev->priv;
183 /* Not yet implemented */
188 * Enable or disable interrupts
190 * @v netdev Network device
191 * @v enable Interrupts should be enabled
193 static void skeleton_irq ( struct net_device *netdev, int enable ) {
194 struct skeleton_nic *skel = netdev->priv;
196 DBGC ( skel, "SKELETON %p does not yet support interrupts\n", skel );
200 /** Skeleton network device operations */
201 static struct net_device_operations skeleton_operations = {
202 .open = skeleton_open,
203 .close = skeleton_close,
204 .transmit = skeleton_transmit,
205 .poll = skeleton_poll,
209 /******************************************************************************
213 ******************************************************************************
220 * @ret rc Return status code
222 static int skeleton_probe ( struct pci_device *pci ) {
223 struct net_device *netdev;
224 struct skeleton_nic *skel;
227 /* Allocate and initialise net device */
228 netdev = alloc_etherdev ( sizeof ( *skel ) );
233 netdev_init ( netdev, &skeleton_operations );
235 pci_set_drvdata ( pci, netdev );
236 netdev->dev = &pci->dev;
237 memset ( skel, 0, sizeof ( *skel ) );
239 /* Fix up PCI device */
240 adjust_pci_device ( pci );
243 skel->regs = ioremap ( pci->membase, SKELETON_BAR_SIZE );
244 if ( ! skel->regs ) {
250 if ( ( rc = skeleton_reset ( skel ) ) != 0 )
253 /* Initialise and reset MII interface */
254 mii_init ( &skel->mii, &skeleton_mii_operations );
255 if ( ( rc = mii_reset ( &skel->mii ) ) != 0 ) {
256 DBGC ( skel, "SKELETON %p could not reset MII: %s\n",
257 skel, strerror ( rc ) );
261 /* Register network device */
262 if ( ( rc = register_netdev ( netdev ) ) != 0 )
263 goto err_register_netdev;
265 /* Set initial link state */
266 skeleton_check_link ( netdev );
270 unregister_netdev ( netdev );
273 skeleton_reset ( skel );
275 iounmap ( skel->regs );
277 netdev_nullify ( netdev );
278 netdev_put ( netdev );
288 static void skeleton_remove ( struct pci_device *pci ) {
289 struct net_device *netdev = pci_get_drvdata ( pci );
290 struct skeleton_nic *skel = netdev->priv;
292 /* Unregister network device */
293 unregister_netdev ( netdev );
296 skeleton_reset ( skel );
298 /* Free network device */
299 iounmap ( skel->regs );
300 netdev_nullify ( netdev );
301 netdev_put ( netdev );
304 /** Skeleton PCI device IDs */
305 static struct pci_device_id skeleton_nics[] = {
306 PCI_ROM ( 0x5ce1, 0x5ce1, "skel", "Skeleton", 0 ),
309 /** Skeleton PCI driver */
310 struct pci_driver skeleton_driver __pci_driver = {
311 .ids = skeleton_nics,
312 .id_count = ( sizeof ( skeleton_nics ) / sizeof ( skeleton_nics[0] ) ),
313 .probe = skeleton_probe,
314 .remove = skeleton_remove,