david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Added example of how to use __shared.

Moved transmit before poll, since typically transmit will be implemented first.
This commit is contained in:
Michael Brown 2005-05-03 12:14:29 +00:00
parent ff8e46f2f3
commit 303ff86c75
1 changed files with 47 additions and 25 deletions

View File

@ -21,11 +21,33 @@ Skeleton NIC driver for Etherboot
#include "isapnp.h" #include "isapnp.h"
#include "mca.h" #include "mca.h"
/* NIC specific static variables go here. Try to avoid using static /*
* NIC specific static variables go here. Try to avoid using static
* variables wherever possible. In particular, the I/O address can * variables wherever possible. In particular, the I/O address can
* always be accessed via nic->ioaddr. * always be accessed via nic->ioaddr.
*/ */
/*
* If you have large static variables (e.g. transmit and receive
* buffers), you should place them together in a single structure and
* mark the structure as "shared". This enables this space to be
* shared between drivers in multi-driver images, which can easily
* reduce the runtime size by 50%.
*
*/
#define SKEL_RX_BUFS 1
#define SKEL_TX_BUFS 1
#define SKEL_RX_BUFSIZE 0
#define SKEL_TX_BUFSIZE 0
struct skel_rx_desc {};
struct skel_tx_desc {};
struct {
struct skel_rx_desc rxd[SKEL_RX_BUFS];
unsigned char rxb[SKEL_RX_BUFS][SKEL_RX_BUFSIZE];
struct skel_tx_desc txd[SKEL_TX_BUFS];
unsigned char txb[SKEL_TX_BUFS][SKEL_TX_BUFSIZE];
} skel_bufs __shared;
/* /*
* Don't forget to remove "__unused" from all the function parameters! * Don't forget to remove "__unused" from all the function parameters!
* *
@ -48,6 +70,29 @@ static int skel_connect ( struct nic *nic __unused ) {
return 1; return 1;
} }
/**************************************************************************
* TRANSMIT - Transmit a frame
**************************************************************************
*/
static void skel_transmit ( struct nic *nic __unused,
const char *dest __unused,
unsigned int type __unused,
unsigned int size __unused,
const char *packet __unused ) {
/* Transmit packet to dest MAC address. You will need to
* construct the link-layer header (dest MAC, source MAC,
* type).
*/
/*
unsigned int nstype = htons ( type );
memcpy ( <tx_buffer>, dest, ETH_ALEN );
memcpy ( <tx_buffer> + ETH_ALEN, nic->node_addr, ETH_ALEN );
memcpy ( <tx_buffer> + 2 * ETH_ALEN, &nstype, 2 );
memcpy ( <tx_buffer> + ETH_HLEN, data, size );
<transmit_data> ( <tx_buffer>, size + ETH_HLEN );
*/
}
/************************************************************************** /**************************************************************************
* POLL - Wait for a frame * POLL - Wait for a frame
************************************************************************** **************************************************************************
@ -81,29 +126,6 @@ static int skel_poll ( struct nic *nic __unused, int retrieve __unused ) {
return 0; /* Remove this line once this method is implemented */ return 0; /* Remove this line once this method is implemented */
} }
/**************************************************************************
* TRANSMIT - Transmit a frame
**************************************************************************
*/
static void skel_transmit ( struct nic *nic __unused,
const char *dest __unused,
unsigned int type __unused,
unsigned int size __unused,
const char *packet __unused ) {
/* Transmit packet to dest MAC address. You will need to
* construct the link-layer header (dest MAC, source MAC,
* type).
*/
/*
unsigned int nstype = htons ( type );
memcpy ( <tx_buffer>, dest, ETH_ALEN );
memcpy ( <tx_buffer> + ETH_ALEN, nic->node_addr, ETH_ALEN );
memcpy ( <tx_buffer> + 2 * ETH_ALEN, &nstype, 2 );
memcpy ( <tx_buffer> + ETH_HLEN, data, size );
<transmit_data> ( <tx_buffer>, size + ETH_HLEN );
*/
}
/************************************************************************** /**************************************************************************
* IRQ - handle interrupts * IRQ - handle interrupts
************************************************************************** **************************************************************************
@ -143,8 +165,8 @@ static void skel_irq ( struct nic *nic __unused, irq_action_t action ) {
*/ */
static struct nic_operations skel_operations = { static struct nic_operations skel_operations = {
.connect = skel_connect, .connect = skel_connect,
.poll = skel_poll,
.transmit = skel_transmit, .transmit = skel_transmit,
.poll = skel_poll,
.irq = skel_irq, .irq = skel_irq,
}; };