mirror of https://github.com/ipxe/ipxe.git
Arbitrary alignment is now available.
Use shared symbols. Correct other symbol violations.pull/1/head
parent
68e90c75b6
commit
3c2851e563
|
@ -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++) {
|
||||||
|
|
Loading…
Reference in New Issue