# HG changeset patch
# User Jimi Xenidis <[EMAIL PROTECTED]>
# Node ID d2b37a151f5b27924e5aa59b4701ae8a7a623b25
# Parent  f18ec562c11cabed94d448a12754660c63497fac
[LINUX][XEN][POWERPC] Enable PowerPC use of netback

This patch uses ifdefs heavilty simply to identify areas of change so
that arch independent interfaces can be introduced later as we update
with upstream changes.

Signed-off-by: Jimi Xenidis <[EMAIL PROTECTED]>
---
 drivers/xen/netback/netback.c |   72 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 60 insertions(+), 12 deletions(-)

diff -r f18ec562c11c -r d2b37a151f5b drivers/xen/netback/netback.c
--- a/drivers/xen/netback/netback.c     Tue Oct 10 09:48:33 2006 -0400
+++ b/drivers/xen/netback/netback.c     Tue Oct 10 09:57:12 2006 -0400
@@ -71,9 +71,35 @@ static struct sk_buff_head rx_queue;
 static struct sk_buff_head rx_queue;
 
 static unsigned long mmap_vstart;
+#ifdef CONFIG_PPC_XEN
+
+
+static ulong mmap_vaddrs[MAX_PENDING_REQS];
+#define MMAP_VADDR(_req) (mmap_vaddrs[(_req)])
+
+static inline void PPC_map_vaddrs(int idx, gnttab_map_grant_ref_t *mop)
+{
+       struct page *page;
+       ulong virt = mop->host_addr;
+
+       page = virt_to_page(virt);
+       get_page(page);
+
+#if 0
+       SetPageForeign(page, netif_page_release);
+#else
+       (void)netif_page_release;
+#endif
+       mmap_vaddrs[idx] = virt;
+}
+#define _mmap_vaddrs(i,op) do { mmap_vaddrs[(i)] = mop->host_addr;
+#else
 #define MMAP_VADDR(_req) (mmap_vstart + ((_req) * PAGE_SIZE))
-
+#endif
+
+#ifndef CONFIG_PPC_XEN
 static void *rx_mmap_area;
+#endif
 
 #define PKT_PROT_LEN 64
 
@@ -939,9 +965,13 @@ static int netbk_tx_check_mop(struct sk_
                pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
                netif_put(netif);
        } else {
+#ifdef CONFIG_PPC_XEN
+               PPC_map_vaddrs(pending_idx, mop);
+#else
                set_phys_to_machine(
                        __pa(MMAP_VADDR(pending_idx)) >> PAGE_SHIFT,
                        FOREIGN_FRAME(mop->dev_bus_addr >> PAGE_SHIFT));
+#endif
                grant_tx_handle[pending_idx] = mop->handle;
        }
 
@@ -956,9 +986,13 @@ static int netbk_tx_check_mop(struct sk_
                /* Check error status: if okay then remember grant handle. */
                newerr = (++mop)->status;
                if (likely(!newerr)) {
+#ifdef CONFIG_PPC_XEN
+                       PPC_map_vaddrs(pending_idx, mop);
+#else
                        set_phys_to_machine(
                                __pa(MMAP_VADDR(pending_idx))>>PAGE_SHIFT,
                                FOREIGN_FRAME(mop->dev_bus_addr>>PAGE_SHIFT));
+#endif
                        grant_tx_handle[pending_idx] = mop->handle;
                        /* Had a previous error? Invalidate this fragment. */
                        if (unlikely(err))
@@ -1317,17 +1351,20 @@ static void netif_page_release(struct pa
 {
        u16 pending_idx = page - virt_to_page(mmap_vstart);
 
+#ifdef CONFIG_PPC_XEN  /* Ready for next use. */
+       BUG();
+#endif 
+       init_page_count(page);
+       netif_idx_release(pending_idx);
+}
+
+#ifndef CONFIG_PPC_XEN
+static void netif_rx_page_release(struct page *page)
+{
        /* Ready for next use. */
        init_page_count(page);
-
-       netif_idx_release(pending_idx);
-}
-
-static void netif_rx_page_release(struct page *page)
-{
-       /* Ready for next use. */
-       init_page_count(page);
-}
+}
+#endif
 
 irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
 {
@@ -1437,6 +1474,10 @@ static int __init netback_init(void)
        if (!is_running_on_xen())
                return -ENODEV;
 
+#ifdef CONFIG_PPC_XEN
+       if (!(xen_start_info->flags & SIF_INITDOMAIN))
+               return -ENODEV;
+#endif
        /* We can increase reservation by this much in net_rx_action(). */
        balloon_update_driver_allowance(NET_RX_RING_SIZE);
 
@@ -1446,7 +1487,11 @@ static int __init netback_init(void)
        init_timer(&net_timer);
        net_timer.data = 0;
        net_timer.function = net_alarm;
-    
+
+#ifdef CONFIG_PPC_XEN
+       (void)page;
+       mmap_vstart = foreign_alloc_empty_page_range(MAX_PENDING_REQS);
+#else
        page = balloon_alloc_empty_page_range(MAX_PENDING_REQS);
        if (page == NULL)
                return -ENOMEM;
@@ -1458,7 +1503,9 @@ static int __init netback_init(void)
                init_page_count(page);
                SetPageForeign(page, netif_page_release);
        }
-
+#endif
+
+#ifndef CONFIG_PPC_XEN
        page = balloon_alloc_empty_page_range(NET_RX_RING_SIZE);
        BUG_ON(page == NULL);
        rx_mmap_area = pfn_to_kaddr(page_to_pfn(page));
@@ -1468,6 +1515,7 @@ static int __init netback_init(void)
                init_page_count(page);
                SetPageForeign(page, netif_rx_page_release);
        }
+#endif
 
        pending_cons = 0;
        pending_prod = MAX_PENDING_REQS;

_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@lists.xensource.com
http://lists.xensource.com/xen-ppc-devel

Reply via email to