david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Arbitrary alignment is now available.

Use shared symbols.
Correct other symbol violations.
This commit is contained in:
Michael Brown 2005-05-03 09:56:57 +00:00
parent 68e90c75b6
commit 3c2851e563
1 changed files with 25 additions and 49 deletions

View File

@ -282,34 +282,32 @@ struct RxDesc {
u32 buf_Haddr; u32 buf_Haddr;
}; };
/* The descriptors for this card are required to be aligned on /* The descriptors for this card are required to be aligned on 256
256 byte boundaries. As the align attribute does not do more than * byte boundaries. As the align attribute does not do more than 16
16 bytes of alignment it requires some extra steps. Add 256 to the * bytes of alignment it requires some extra steps. Add 256 to the
size of the array and the init_ring adjusts the alignment */ * size of the array and the init_ring adjusts the alignment.
*
* UPDATE: This is no longer true; we can request arbitrary alignment.
*/
/* Define the TX Descriptor */ /* Define the TX and RX Descriptors and Buffers */
static u8 tx_ring[NUM_TX_DESC * sizeof(struct TxDesc) + 256]; #define __align_256 __attribute__ (( aligned ( 256 ) ))
struct {
struct TxDesc tx_ring[NUM_TX_DESC] __align_256;
unsigned char txb[NUM_TX_DESC * RX_BUF_SIZE];
struct RxDesc rx_ring[NUM_RX_DESC] __align_256;
unsigned char rxb[NUM_RX_DESC * RX_BUF_SIZE];
} r8169_bufs __shared;
#define tx_ring r8169_bufs.tx_ring
#define rx_ring r8169_bufs.rx_ring
#define txb r8169_bufs.txb
#define rxb r8169_bufs.rxb
/* Create a static buffer of size RX_BUF_SZ for each static struct rtl8169_private {
TX Descriptor. All descriptors point to a
part of this buffer */
static unsigned char txb[NUM_TX_DESC * RX_BUF_SIZE];
/* Define the RX Descriptor */
static u8 rx_ring[NUM_RX_DESC * sizeof(struct TxDesc) + 256];
/* Create a static buffer of size RX_BUF_SZ for each
RX Descriptor All descriptors point to a
part of this buffer */
static unsigned char rxb[NUM_RX_DESC * RX_BUF_SIZE];
struct rtl8169_private {
void *mmio_addr; /* memory map physical address */ void *mmio_addr; /* memory map physical address */
int chipset; int chipset;
unsigned long cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */ unsigned long cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
unsigned long cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */ unsigned long cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
unsigned char *TxDescArrays; /* Index of Tx Descriptor buffer */
unsigned char *RxDescArrays; /* Index of Rx Descriptor buffer */
struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */ struct TxDesc *TxDescArray; /* Index of 256-alignment Tx Descriptor buffer */
struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */ struct RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
unsigned char *RxBufferRing[NUM_RX_DESC]; /* Index of Rx Buffer array */ unsigned char *RxBufferRing[NUM_RX_DESC]; /* Index of Rx Buffer array */
@ -324,7 +322,7 @@ static const u16 rtl8169_intr_mask =
static const unsigned int rtl8169_rx_config = static const unsigned int rtl8169_rx_config =
(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
void mdio_write(int RegAddr, int value) static void mdio_write(int RegAddr, int value)
{ {
int i; int i;
@ -341,7 +339,7 @@ void mdio_write(int RegAddr, int value)
} }
} }
int mdio_read(int RegAddr) static int mdio_read(int RegAddr)
{ {
int i, value = -1; int i, value = -1;
@ -416,7 +414,7 @@ static int rtl8169_init_board(struct pci_device *pdev)
/************************************************************************** /**************************************************************************
IRQ - Wait for a frame IRQ - Wait for a frame
***************************************************************************/ ***************************************************************************/
void r8169_irq ( struct nic *nic __unused, irq_action_t action ) { static void r8169_irq ( struct nic *nic __unused, irq_action_t action ) {
int intr_status = 0; int intr_status = 0;
int interested = RxUnderrun | RxOverflow | RxFIFOOver | RxErr | RxOK; int interested = RxUnderrun | RxOverflow | RxFIFOOver | RxErr | RxOK;
@ -641,29 +639,9 @@ RESET - Finish setting up the ethernet interface
static void r8169_reset(struct nic *nic) static void r8169_reset(struct nic *nic)
{ {
int i; int i;
u8 diff;
u32 TxPhyAddr, RxPhyAddr;
tpc->TxDescArrays = tx_ring; tpc->TxDescArray = tx_ring;
if (tpc->TxDescArrays == 0) tpc->RxDescArray = rx_ring;
printf("Allot Error");
/* Tx Desscriptor needs 256 bytes alignment; */
TxPhyAddr = virt_to_bus(tpc->TxDescArrays);
diff = 256 - (TxPhyAddr - ((TxPhyAddr >> 8) << 8));
TxPhyAddr += diff;
tpc->TxDescArray = (struct TxDesc *) (tpc->TxDescArrays + diff);
tpc->RxDescArrays = rx_ring;
/* Rx Desscriptor needs 256 bytes alignment; */
RxPhyAddr = virt_to_bus(tpc->RxDescArrays);
diff = 256 - (RxPhyAddr - ((RxPhyAddr >> 8) << 8));
RxPhyAddr += diff;
tpc->RxDescArray = (struct RxDesc *) (tpc->RxDescArrays + diff);
if (tpc->TxDescArrays == NULL || tpc->RxDescArrays == NULL) {
printf("Allocate RxDescArray or TxDescArray failed\n");
return;
}
rtl8169_init_ring(nic); rtl8169_init_ring(nic);
rtl8169_hw_start(nic); rtl8169_hw_start(nic);
@ -693,8 +671,6 @@ static void r8169_disable ( struct nic *nic __unused ) {
RTL_W32(RxMissed, 0); RTL_W32(RxMissed, 0);
tpc->TxDescArrays = NULL;
tpc->RxDescArrays = NULL;
tpc->TxDescArray = NULL; tpc->TxDescArray = NULL;
tpc->RxDescArray = NULL; tpc->RxDescArray = NULL;
for (i = 0; i < NUM_RX_DESC; i++) { for (i = 0; i < NUM_RX_DESC; i++) {