summaryrefslogtreecommitdiffstats
path: root/src/drivers/net/r8169.c
diff options
context:
space:
mode:
authorMichael Brown2005-05-03 11:56:57 +0200
committerMichael Brown2005-05-03 11:56:57 +0200
commit3c2851e5639b2b15e8d76b3ed6124a6f68c90f09 (patch)
treec1928d463df5a17da584fc129039e1a7eef3d9e4 /src/drivers/net/r8169.c
parentRemoved spurious semicolon (diff)
downloadipxe-3c2851e5639b2b15e8d76b3ed6124a6f68c90f09.tar.gz
ipxe-3c2851e5639b2b15e8d76b3ed6124a6f68c90f09.tar.xz
ipxe-3c2851e5639b2b15e8d76b3ed6124a6f68c90f09.zip
Arbitrary alignment is now available.
Use shared symbols. Correct other symbol violations.
Diffstat (limited to 'src/drivers/net/r8169.c')
-rw-r--r--src/drivers/net/r8169.c80
1 files changed, 28 insertions, 52 deletions
diff --git a/src/drivers/net/r8169.c b/src/drivers/net/r8169.c
index de86bdd8..ad3b62bd 100644
--- a/src/drivers/net/r8169.c
+++ b/src/drivers/net/r8169.c
@@ -282,34 +282,32 @@ struct RxDesc {
u32 buf_Haddr;
};
-/* The descriptors for this card are required to be aligned on
-256 byte boundaries. As the align attribute does not do more than
-16 bytes of alignment it requires some extra steps. Add 256 to the
-size of the array and the init_ring adjusts the alignment */
-
-/* Define the TX Descriptor */
-static u8 tx_ring[NUM_TX_DESC * sizeof(struct TxDesc) + 256];
-
-/* Create a static buffer of size RX_BUF_SZ for each
-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 {
+/* The descriptors for this card are required to be aligned on 256
+ * byte boundaries. As the align attribute does not do more than 16
+ * bytes of alignment it requires some extra steps. Add 256 to the
+ * 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 and RX Descriptors and Buffers */
+#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
+
+static struct rtl8169_private {
void *mmio_addr; /* memory map physical address */
int chipset;
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 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 RxDesc *RxDescArray; /* Index of 256-alignment Rx Descriptor buffer */
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 =
(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;
@@ -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;
@@ -416,7 +414,7 @@ static int rtl8169_init_board(struct pci_device *pdev)
/**************************************************************************
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 interested = RxUnderrun | RxOverflow | RxFIFOOver | RxErr | RxOK;
@@ -641,29 +639,9 @@ RESET - Finish setting up the ethernet interface
static void r8169_reset(struct nic *nic)
{
int i;
- u8 diff;
- u32 TxPhyAddr, RxPhyAddr;
-
- tpc->TxDescArrays = tx_ring;
- if (tpc->TxDescArrays == 0)
- 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;
- }
+
+ tpc->TxDescArray = tx_ring;
+ tpc->RxDescArray = rx_ring;
rtl8169_init_ring(nic);
rtl8169_hw_start(nic);
@@ -693,8 +671,6 @@ static void r8169_disable ( struct nic *nic __unused ) {
RTL_W32(RxMissed, 0);
- tpc->TxDescArrays = NULL;
- tpc->RxDescArrays = NULL;
tpc->TxDescArray = NULL;
tpc->RxDescArray = NULL;
for (i = 0; i < NUM_RX_DESC; i++) {