patch-2.4.23 linux-2.4.23/arch/ppc/8xx_io/fec.c
Next file: linux-2.4.23/arch/ppc/8xx_io/uart.c
Previous file: linux-2.4.23/arch/ppc/8xx_io/enet.c
Back to the patch index
Back to the overall index
- Lines: 105
- Date:
2003-11-28 10:26:19.000000000 -0800
- Orig file:
linux-2.4.22/arch/ppc/8xx_io/fec.c
- Orig date:
2003-08-25 04:44:40.000000000 -0700
diff -urN linux-2.4.22/arch/ppc/8xx_io/fec.c linux-2.4.23/arch/ppc/8xx_io/fec.c
@@ -161,7 +161,12 @@
cbd_t *tx_bd_base;
cbd_t *cur_rx, *cur_tx; /* The next free ring entry */
cbd_t *dirty_tx; /* The ring entries to be free()ed. */
- scc_t *sccp;
+
+ /* Virtual addresses for the receive buffers because we can't
+ * do a __va() on them anymore.
+ */
+ unsigned char *rx_vaddr[RX_RING_SIZE];
+
struct net_device_stats stats;
uint tx_free;
spinlock_t lock;
@@ -587,7 +592,7 @@
fep->stats.rx_packets++;
pkt_len = bdp->cbd_datlen;
fep->stats.rx_bytes += pkt_len;
- data = (__u8*)__va(bdp->cbd_bufaddr);
+ data = fep->rx_vaddr[bdp - fep->rx_bd_base];
/* This does 16 byte alignment, exactly what we need.
* The packet length includes FCS, but we don't want to
@@ -602,9 +607,7 @@
} else {
skb->dev = dev;
skb_put(skb,pkt_len-4); /* Make room */
- eth_copy_and_sum(skb,
- (unsigned char *)__va(bdp->cbd_bufaddr),
- pkt_len-4, 0);
+ eth_copy_and_sum(skb, data, pkt_len-4, 0);
skb->protocol=eth_type_trans(skb,dev);
netif_rx(skb);
}
@@ -1700,10 +1703,9 @@
{
struct net_device *dev;
struct fec_enet_private *fep;
- int i, j;
- unsigned char *eap, *iap;
- unsigned long mem_addr;
- pte_t *pte;
+ int i, j, k;
+ unsigned char *eap, *iap, *ba;
+ dma_addr_t mem_addr;
volatile cbd_t *bdp;
cbd_t *cbd_base;
volatile immap_t *immap;
@@ -1774,14 +1776,7 @@
printk("FEC initialization failed.\n");
return 1;
}
- mem_addr = __get_free_page(GFP_KERNEL);
- cbd_base = (cbd_t *)mem_addr;
-
- /* Make it uncached.
- */
- pte = va_to_pte(mem_addr);
- pte_val(*pte) |= _PAGE_NO_CACHE;
- flush_tlb_page(init_mm.mmap, mem_addr);
+ cbd_base = (cbd_t *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
/* Set receive and transmit descriptor base.
*/
@@ -1793,24 +1788,21 @@
/* Initialize the receive buffer descriptors.
*/
bdp = fep->rx_bd_base;
+ k = 0;
for (i=0; i<FEC_ENET_RX_PAGES; i++) {
/* Allocate a page.
*/
- mem_addr = __get_free_page(GFP_KERNEL);
-
- /* Make it uncached.
- */
- pte = va_to_pte(mem_addr);
- pte_val(*pte) |= _PAGE_NO_CACHE;
- flush_tlb_page(init_mm.mmap, mem_addr);
+ ba = (unsigned char *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
/* Initialize the BD for every fragment in the page.
*/
for (j=0; j<FEC_ENET_RX_FRPPG; j++) {
bdp->cbd_sc = BD_ENET_RX_EMPTY;
- bdp->cbd_bufaddr = __pa(mem_addr);
+ bdp->cbd_bufaddr = mem_addr;
+ fep->rx_vaddr[k++] = ba;
mem_addr += FEC_ENET_RX_FRSIZE;
+ ba += FEC_ENET_RX_FRSIZE;
bdp++;
}
}
@@ -1974,8 +1966,8 @@
/* Set receive and transmit descriptor base.
*/
- fecp->fec_r_des_start = __pa((uint)(fep->rx_bd_base));
- fecp->fec_x_des_start = __pa((uint)(fep->tx_bd_base));
+ fecp->fec_r_des_start = iopa((uint)(fep->rx_bd_base));
+ fecp->fec_x_des_start = iopa((uint)(fep->tx_bd_base));
fep->dirty_tx = fep->cur_tx = fep->tx_bd_base;
fep->tx_free = TX_RING_SIZE;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)