]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.xen/sfc-sync-headers
Imported linux-2.6.27.39 suse/xen patches.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.xen / sfc-sync-headers
diff --git a/src/patches/suse-2.6.27.31/patches.xen/sfc-sync-headers b/src/patches/suse-2.6.27.31/patches.xen/sfc-sync-headers
deleted file mode 100644 (file)
index 01f6a19..0000000
+++ /dev/null
@@ -1,1070 +0,0 @@
-From: Kieran Mansley <kmansley@solarflare.com>
-Subject: sync Solarflare accelerator headers
-References: bnc#489105
-
-Sync the headers used by sfc_netback and sfc_netutil with those in the
-sfc_resource driver to give a consistent view of cross-module APIs.
-
-Update sfc_netback to use efx_vi_alloc() as defined by the version of
-sfc_resource module in SLES11.  It now takes a net driver interface
-index rather than a NIC index.
-
-efx_vi_hw_resource_get_phys() no longer returns a version.
-
-Set efhw_arch field of device type.
-
-Acked-by: jbeulich@novell.com
-
---- sle11-2009-03-24.orig/drivers/net/sfc/sfc_resource/ci/efhw/common.h        2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/net/sfc/sfc_resource/ci/efhw/common.h     2009-03-30 16:21:54.000000000 +0200
-@@ -41,6 +41,10 @@
- #include <ci/efhw/common_sysdep.h>
-+enum efhw_arch {
-+      EFHW_ARCH_FALCON,
-+};
-+
- typedef uint32_t efhw_buffer_addr_t;
- #define EFHW_BUFFER_ADDR_FMT  "[ba:%"PRIx32"]"
---- sle11-2009-03-24.orig/drivers/net/sfc/sfc_resource/nic.c   2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/net/sfc/sfc_resource/nic.c        2009-03-30 16:21:54.000000000 +0200
-@@ -47,6 +47,7 @@ int efhw_device_type_init(struct efhw_de
-       switch (device_id) {
-       case 0x0703:
-       case 0x6703:
-+              dt->arch = EFHW_ARCH_FALCON;
-               dt->variant = 'A';
-               switch (class_revision) {
-               case 0:
-@@ -60,6 +61,7 @@ int efhw_device_type_init(struct efhw_de
-               }
-               break;
-       case 0x0710:
-+              dt->arch = EFHW_ARCH_FALCON;
-               dt->variant = 'B';
-               switch (class_revision) {
-               case 2:
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/accel.h      2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/accel.h   2009-03-30 16:00:09.000000000 +0200
-@@ -123,8 +123,6 @@ struct netback_accel {
-       enum net_accel_hw_type hw_type;
-       /*! State of allocation */             
-       int hw_state;
--      /*! Index into ci_driver.nics[] for this interface */
--      int nic_index;
-       /*! How to set up the acceleration for this hardware */
-       int (*accel_setup)(struct netback_accel *); 
-       /*! And how to stop it. */
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/accel_solarflare.c   2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/accel_solarflare.c        2009-03-30 16:10:59.000000000 +0200
-@@ -87,7 +87,6 @@ struct driverlink_port {
-       enum net_accel_hw_type type;
-       struct net_device *net_dev;
-       struct efx_dl_device *efx_dl_dev;
--      int nic_index;
-       void *fwd_priv;
- };
-@@ -164,34 +163,6 @@ static struct netback_accel_hooks accel_
- };
--/*
-- * Handy helper which given an efx_dl_device works out which
-- * efab_nic_t index into efrm_nic_table.nics[] it corresponds to 
-- */
--static int efx_device_to_efab_nic_index(struct efx_dl_device *efx_dl_dev) 
--{
--      int i;
--
--      for (i = 0; i < EFHW_MAX_NR_DEVS; i++) {
--              struct efhw_nic *nic = efrm_nic_table.nic[i];
--
--              /*
--               * It's possible for the nic structure to have not
--               * been initialised if the resource driver failed its
--               * driverlink probe
--               */ 
--              if (nic == NULL || nic->net_driver_dev == NULL)
--                      continue;
--
--              /* Work out if these are talking about the same NIC */
--              if (nic->net_driver_dev->pci_dev == efx_dl_dev->pci_dev)
--                      return i;
--      }
--
--      return -1;
--}
--
--
- /* Driver link probe - register our callbacks */
- static int bend_dl_probe(struct efx_dl_device *efx_dl_dev,
-                        const struct net_device *net_dev,
-@@ -225,17 +196,6 @@ static int bend_dl_probe(struct efx_dl_d
-       port->efx_dl_dev = efx_dl_dev;
-       efx_dl_dev->priv = port;
--      port->nic_index = efx_device_to_efab_nic_index(efx_dl_dev);
--      if (port->nic_index < 0) {
--              /*
--               * This can happen in theory if the resource driver
--               * failed to initialise properly
--               */
--              EPRINTK("%s: nic structure not found\n", __FUNCTION__);
--              rc = -EINVAL;
--              goto fail2;
--      }
--
-       port->fwd_priv = netback_accel_init_fwd_port();
-       if (port->fwd_priv == NULL) {
-               EPRINTK("%s: failed to set up forwarding for port\n",
-@@ -377,8 +337,6 @@ int netback_accel_sf_hwtype(struct netba
-                       bend->accel_setup = netback_accel_setup_vnic_hw;
-                       bend->accel_shutdown = netback_accel_shutdown_vnic_hw;
-                       bend->fwd_priv = port->fwd_priv;
--                      /* This is just needed to pass to efx_vi_alloc */
--                      bend->nic_index = port->nic_index;
-                       bend->net_dev = port->net_dev;
-                       mutex_unlock(&accel_mutex);
-                       return 0;
-@@ -505,7 +463,7 @@ static int ef_get_vnic(struct netback_ac
-       accel_hw_priv = bend->accel_hw_priv;
--      rc = efx_vi_alloc(&accel_hw_priv->efx_vih, bend->nic_index);
-+      rc = efx_vi_alloc(&accel_hw_priv->efx_vih, bend->net_dev->ifindex);
-       if (rc != 0) {
-               EPRINTK("%s: efx_vi_alloc failed %d\n", __FUNCTION__, rc);
-               free_page_state(bend);
-@@ -600,9 +558,6 @@ static int ef_bend_hwinfo_falcon_common(
-               return rc;
-       }
--      if (res_mdata.version != 0)
--              return -EPROTO;
--
-       hwinfo->nic_arch = res_mdata.nic_arch;
-       hwinfo->nic_variant = res_mdata.nic_variant;
-       hwinfo->nic_revision = res_mdata.nic_revision;
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h  2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h       2009-03-30 16:00:09.000000000 +0200
-@@ -49,11 +49,11 @@ struct efx_vi_state;
-  * Allocate an efx_vi, including event queue and pt_endpoint
-  *
-  * \param vih_out Pointer to a handle that is set on success
-- * \param nic_index Index of NIC to apply this resource to
-+ * \param ifindex Index of the network interface desired
-  * \return Zero on success (and vih_out set), non-zero on failure.
-  */
- extern int
--efx_vi_alloc(struct efx_vi_state **vih_out, int nic_index);
-+efx_vi_alloc(struct efx_vi_state **vih_out, int ifindex);
- /*!
-  * Free a previously allocated efx_vi
-@@ -190,8 +190,6 @@ efx_vi_filter_stop(struct efx_vi_state *
- /*! Constants for the type field in efx_vi_hw_resource */
- #define EFX_VI_HW_RESOURCE_TXDMAQ    0x0      /* PFN of TX DMA Q */
- #define EFX_VI_HW_RESOURCE_RXDMAQ    0x1      /* PFN of RX DMA Q */
--#define EFX_VI_HW_RESOURCE_TXBELL    0x2      /* PFN of TX Doorbell (EF1) */
--#define EFX_VI_HW_RESOURCE_RXBELL    0x3      /* PFN of RX Doorbell (EF1) */
- #define EFX_VI_HW_RESOURCE_EVQTIMER  0x4      /* Address of event q timer */
- /* Address of event q pointer (EF1) */
-@@ -229,7 +227,6 @@ struct efx_vi_hw_resource {
-  * Metadata concerning the list of hardware resource mappings
-  */
- struct efx_vi_hw_resource_metadata {
--      int version;
-       int evq_order;
-       int evq_offs;
-       int evq_capacity;
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/common.h     2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/common.h  2009-03-30 16:21:54.000000000 +0200
-@@ -43,7 +43,6 @@
- enum efhw_arch {
-       EFHW_ARCH_FALCON,
--      EFHW_ARCH_SIENA,
- };
- typedef uint32_t efhw_buffer_addr_t;
-@@ -56,25 +55,21 @@ typedef union {
-               uint32_t a;
-               uint32_t b;
-       } opaque;
--      struct {
--              uint32_t code;
--              uint32_t status;
--      } ev1002;
- } efhw_event_t;
- /* Flags for TX/RX queues */
--#define EFHW_VI_JUMBO_EN           0x01  /*! scatter RX over multiple desc */
--#define EFHW_VI_ISCSI_RX_HDIG_EN   0x02  /*! iscsi rx header digest */
--#define EFHW_VI_ISCSI_TX_HDIG_EN   0x04  /*! iscsi tx header digest */
--#define EFHW_VI_ISCSI_RX_DDIG_EN   0x08  /*! iscsi rx data digest */
--#define EFHW_VI_ISCSI_TX_DDIG_EN   0x10  /*! iscsi tx data digest */
--#define EFHW_VI_TX_PHYS_ADDR_EN    0x20  /*! TX physical address mode */
--#define EFHW_VI_RX_PHYS_ADDR_EN    0x40  /*! RX physical address mode */
--#define EFHW_VI_RM_WITH_INTERRUPT  0x80  /*! VI with an interrupt */
--#define EFHW_VI_TX_IP_CSUM_DIS     0x100 /*! enable ip checksum generation */
--#define EFHW_VI_TX_TCPUDP_CSUM_DIS 0x200 /*! enable tcp/udp checksum
--                                         generation */
--#define EFHW_VI_TX_TCPUDP_ONLY     0x400 /*! drop non-tcp/udp packets */
-+#define EFHW_VI_JUMBO_EN           0x01    /*! scatter RX over multiple desc */
-+#define EFHW_VI_ISCSI_RX_HDIG_EN   0x02    /*! iscsi rx header digest */
-+#define EFHW_VI_ISCSI_TX_HDIG_EN   0x04    /*! iscsi tx header digest */
-+#define EFHW_VI_ISCSI_RX_DDIG_EN   0x08    /*! iscsi rx data digest */
-+#define EFHW_VI_ISCSI_TX_DDIG_EN   0x10    /*! iscsi tx data digest */
-+#define EFHW_VI_TX_PHYS_ADDR_EN    0x20    /*! TX physical address mode */
-+#define EFHW_VI_RX_PHYS_ADDR_EN    0x40    /*! RX physical address mode */
-+#define EFHW_VI_RM_WITH_INTERRUPT  0x80    /*! VI with an interrupt */
-+#define EFHW_VI_TX_IP_CSUM_DIS     0x100   /*! enable ip checksum generation */
-+#define EFHW_VI_TX_TCPUDP_CSUM_DIS 0x200   /*! enable tcp/udp checksum
-+                                             generation */
-+#define EFHW_VI_TX_TCPUDP_ONLY     0x400   /*! drop non-tcp/udp packets */
- /* Types of hardware filter */
- /* Each of these values implicitly selects scatter filters on B0 - or in
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h      2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h   2009-03-30 16:00:09.000000000 +0200
-@@ -41,7 +41,6 @@
- #define __CI_EFHW_COMMON_LINUX_H__
- #include <linux/types.h>
--#include <linux/version.h>
- /* Dirty hack, but Linux kernel does not provide DMA_ADDR_T_FMT */
- #if BITS_PER_LONG == 64 || defined(CONFIG_HIGHMEM64G)
-@@ -52,16 +51,11 @@
- /* Linux kernel also does not provide PRIx32... Sigh. */
- #define PRIx32 "x"
--#define PRIx64 "llx"
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
--enum {
--      false = 0,
--      true = 1
--};
--
--typedef _Bool bool;
--#endif /* LINUX_VERSION_CODE < 2.6.19 */
-+#ifdef __ia64__
-+# define PRIx64 "lx"
-+#else
-+# define PRIx64 "llx"
-+#endif
- #endif /* __CI_EFHW_COMMON_LINUX_H__ */
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/efhw_types.h 2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/efhw_types.h      2009-03-30 16:00:09.000000000 +0200
-@@ -45,14 +45,6 @@
- /*--------------------------------------------------------------------
-  *
-- * hardware limits used in the types
-- *
-- *--------------------------------------------------------------------*/
--
--#define EFHW_KEVENTQ_MAX    8
--
--/*--------------------------------------------------------------------
-- *
-  * forward type declarations
-  *
-  *--------------------------------------------------------------------*/
-@@ -72,7 +64,7 @@ struct efhw_buffer_table_allocation{
- struct eventq_resource_hardware {
-       /*!iobuffer allocated for eventq - can be larger than eventq */
--      efhw_iopages_t iobuff;
-+      struct efhw_iopages iobuff;
-       unsigned iobuff_off;
-       struct efhw_buffer_table_allocation buf_tbl_alloc;
-       int capacity;           /*!< capacity of event queue */
-@@ -85,7 +77,7 @@ struct eventq_resource_hardware {
-  *--------------------------------------------------------------------*/
- struct efhw_keventq {
--      volatile int lock;
-+      int lock;
-       caddr_t evq_base;
-       int32_t evq_ptr;
-       uint32_t evq_mask;
-@@ -94,6 +86,37 @@ struct efhw_keventq {
-       struct efhw_ev_handler *ev_handlers;
- };
-+/*--------------------------------------------------------------------
-+ *
-+ * filters
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+struct efhw_filter_spec {
-+      uint dmaq_id;
-+      uint32_t saddr_le32;
-+      uint32_t daddr_le32;
-+      uint16_t sport_le16;
-+      uint16_t dport_le16;
-+      unsigned tcp     : 1;
-+      unsigned full    : 1;
-+      unsigned rss     : 1;  /* not supported on A1 */
-+      unsigned scatter : 1;  /* not supported on A1 */
-+};
-+
-+struct efhw_filter_depth {
-+      unsigned needed;
-+      unsigned max;
-+};
-+
-+struct efhw_filter_search_limits {
-+      unsigned tcp_full;
-+      unsigned tcp_wild;
-+      unsigned udp_full;
-+      unsigned udp_wild;
-+};
-+
-+
- /**********************************************************************
-  * Portable HW interface. ***************************************
-  **********************************************************************/
-@@ -115,7 +138,7 @@ struct efhw_func_ops {
-       /*! initialise all hardware functional units */
-       int (*init_hardware) (struct efhw_nic *nic,
-                             struct efhw_ev_handler *,
--                            const uint8_t *mac_addr);
-+                            const uint8_t *mac_addr, int non_irq_evq);
-   /*-------------- Interrupt support  ------------ */
-@@ -130,17 +153,17 @@ struct efhw_func_ops {
-        */
-       int (*interrupt) (struct efhw_nic *nic);
--      /*! Enable given interrupt mask for the given IRQ unit */
--      void (*interrupt_enable) (struct efhw_nic *nic, uint idx);
-+      /*! Enable the interrupt */
-+      void (*interrupt_enable) (struct efhw_nic *nic);
--      /*! Disable given interrupt mask for the given IRQ unit */
--      void (*interrupt_disable) (struct efhw_nic *nic, uint idx);
-+      /*! Disable the interrupt */
-+      void (*interrupt_disable) (struct efhw_nic *nic);
-       /*! Set interrupt moderation strategy for the given IRQ unit
-        ** val is in usec
-        */
--      void (*set_interrupt_moderation)(struct efhw_nic *nic,
--                                       uint idx, uint val);
-+      void (*set_interrupt_moderation)(struct efhw_nic *nic, int evq,
-+                                       uint val);
-   /*-------------- Event support  ------------ */
-@@ -152,7 +175,8 @@ struct efhw_func_ops {
-       void (*event_queue_enable) (struct efhw_nic *nic,
-                                   uint evq,   /* evnt queue index */
-                                   uint evq_size,      /* units of #entries */
--                                  dma_addr_t q_base_addr, uint buf_base_id);
-+                                  dma_addr_t q_base_addr, uint buf_base_id,
-+                                  int interrupting);
-       /*! Disable the given event queue (and any associated timer) */
-       void (*event_queue_disable) (struct efhw_nic *nic, uint evq,
-@@ -165,7 +189,7 @@ struct efhw_func_ops {
-       /*! Push a SW event on a given eventQ */
-       void (*sw_event) (struct efhw_nic *nic, int data, int evq);
--  /*-------------- Filter support  ------------ */
-+  /*-------------- IP Filter API  ------------ */
-       /*! Setup a given filter - The software can request a filter_i,
-        * but some EtherFabric implementations will override with
-@@ -176,13 +200,6 @@ struct efhw_func_ops {
-                            unsigned saddr_be32, unsigned sport_be16,
-                            unsigned daddr_be32, unsigned dport_be16);
--      /*! Attach a given filter to a DMAQ */
--      void (*ipfilter_attach) (struct efhw_nic *nic, int filter_idx,
--                               int dmaq_idx);
--
--      /*! Detach a filter from its DMAQ */
--      void (*ipfilter_detach) (struct efhw_nic *nic, int filter_idx);
--
-       /*! Clear down a given filter */
-       void (*ipfilter_clear) (struct efhw_nic *nic, int filter_idx);
-@@ -231,6 +248,14 @@ struct efhw_func_ops {
-       /*! Commit a buffer table update  */
-       void (*buffer_table_commit) (struct efhw_nic *nic);
-+  /*-------------- New filter API ------------ */
-+
-+      /*! Set a given filter */
-+      int (*filter_set) (struct efhw_nic *nic, struct efhw_filter_spec *spec,
-+                         int *filter_idx_out);
-+
-+      /*! Clear a given filter */
-+      void (*filter_clear) (struct efhw_nic *nic, int filter_idx);
- };
-@@ -255,12 +280,10 @@ struct efhw_device_type {
- /*! */
- struct efhw_nic {
--      /*! zero base index in efrm_nic_table.nic array */
--      volatile int index;
-+      /*! zero base index in efrm_nic_tablep->nic array */
-+      int index;
-       int ifindex;            /*!< OS level nic index */
--#ifdef HAS_NET_NAMESPACE
-       struct net *nd_net;
--#endif
-       struct efhw_device_type devtype;
-@@ -276,14 +299,13 @@ struct efhw_nic {
- # define NIC_FLAG_TRY_MSI               0x02
- # define NIC_FLAG_MSI                   0x04
- # define NIC_FLAG_OS_IRQ_EN             0x08
--# define NIC_FLAG_10G                   0x10
-       unsigned mtu;           /*!< MAC MTU (includes MAC hdr) */
-       /* hardware resources */
-       /*! I/O address of the start of the bar */
--      efhw_ioaddr_t bar_ioaddr;
-+      volatile char __iomem *bar_ioaddr;
-       /*! Bar number of control aperture. */
-       unsigned ctr_ap_bar;
-@@ -295,9 +317,6 @@ struct efhw_nic {
-       /*! EtherFabric Functional Units -- functions */
-       const struct efhw_func_ops *efhw_func;
--      /* Value read from FPGA version register.  Zero for asic. */
--      unsigned fpga_version;
--
-       /*! This lock protects a number of misc NIC resources.  It should
-        * only be used for things that can be at the bottom of the lock
-        * order.  ie. You mustn't attempt to grab any other lock while
-@@ -312,14 +331,17 @@ struct efhw_nic {
-       void (*irq_handler) (struct efhw_nic *, int unit);
-       /*! event queues per driver */
--      struct efhw_keventq evq[EFHW_KEVENTQ_MAX];
-+      struct efhw_keventq interrupting_evq;
- /* for marking when we are not using an IRQ unit
-       - 0 is a valid offset to an IRQ unit on EF1! */
- #define EFHW_IRQ_UNIT_UNUSED  0xffff
--      /*! interrupt unit in use  */
--      unsigned int irq_unit[EFHW_KEVENTQ_MAX];
--      efhw_iopage_t irq_iobuff;       /*!<  Falcon SYSERR interrupt */
-+      /*! interrupt unit in use for the interrupting event queue  */
-+      unsigned int irq_unit;
-+
-+      struct efhw_keventq non_interrupting_evq;
-+
-+      struct efhw_iopage irq_iobuff;  /*!<  Falcon SYSERR interrupt */
-       /* The new driverlink infrastructure. */
-       struct efx_dl_device *net_driver_dev;
-@@ -331,8 +353,26 @@ struct efhw_nic {
-       unsigned rxq_sizes;
-       unsigned txq_sizes;
--      /* Size of filter table (including odd and even banks). */
--      unsigned filter_tbl_size;
-+      /* Size of filter table. */
-+      unsigned ip_filter_tbl_size;
-+
-+      /* Number of filters currently used */
-+      unsigned ip_filter_tbl_used;
-+
-+      /* Dynamically allocated filter state. */
-+      uint8_t *filter_in_use;
-+      struct efhw_filter_spec *filter_spec_cache;
-+
-+      /* Currently required and maximum filter table search depths. */
-+      struct efhw_filter_depth tcp_full_srch;
-+      struct efhw_filter_depth tcp_wild_srch;
-+      struct efhw_filter_depth udp_full_srch;
-+      struct efhw_filter_depth udp_wild_srch;
-+
-+      /* Number of event queues, DMA queues and timers. */
-+      unsigned num_evqs;
-+      unsigned num_dmaqs;
-+      unsigned num_timers;
- };
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h    2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h 2009-03-30 16:00:09.000000000 +0200
-@@ -40,7 +40,7 @@
- #ifndef __CI_EFHW_HARDWARE_LINUX_H__
- #define __CI_EFHW_HARDWARE_LINUX_H__
--#include <asm/io.h>
-+#include <linux/io.h>
- #ifdef __LITTLE_ENDIAN
- #define EFHW_IS_LITTLE_ENDIAN
-@@ -50,23 +50,8 @@
- #error Unknown endianness
- #endif
--#ifndef mmiowb
--      #if defined(__i386__) || defined(__x86_64__)
--              #define mmiowb()
--      #elif defined(__ia64__)
--              #ifndef ia64_mfa
--                      #define ia64_mfa() asm volatile ("mf.a" ::: "memory")
--              #endif
--      #define mmiowb ia64_mfa
--      #else
--      #error "Need definition for mmiowb()"
--      #endif
--#endif
--
--typedef char *efhw_ioaddr_t;
--
- #ifndef readq
--static inline uint64_t __readq(void __iomem *addr)
-+static inline uint64_t __readq(volatile void __iomem *addr)
- {
-       return *(volatile uint64_t *)addr;
- }
-@@ -74,7 +59,7 @@ static inline uint64_t __readq(void __io
- #endif
- #ifndef writeq
--static inline void __writeq(uint64_t v, void __iomem *addr)
-+static inline void __writeq(uint64_t v, volatile void __iomem *addr)
- {
-       *(volatile uint64_t *)addr = v;
- }
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/iopage_types.h       2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/iopage_types.h    2009-03-30 16:00:09.000000000 +0200
-@@ -3,7 +3,8 @@
-  *          resource management for Xen backend, OpenOnload, etc
-  *           (including support for SFE4001 10GBT NIC)
-  *
-- * This file provides efhw_page_t and efhw_iopage_t for Linux kernel.
-+ * This file provides struct efhw_page and struct efhw_iopage for Linux
-+ * kernel.
-  *
-  * Copyright 2005-2007: Solarflare Communications Inc,
-  *                      9501 Jeronimo Road, Suite 250,
-@@ -40,75 +41,76 @@
- #include <linux/gfp.h>
- #include <linux/hardirq.h>
-+#include <linux/errno.h>
- #include <ci/efhw/debug.h>
- /*--------------------------------------------------------------------
-  *
-- * efhw_page_t: A single page of memory.  Directly mapped in the driver,
-- * and can be mapped to userlevel.
-+ * struct efhw_page: A single page of memory.  Directly mapped in the
-+ * driver, and can be mapped to userlevel.
-  *
-  *--------------------------------------------------------------------*/
--typedef struct {
-+struct efhw_page {
-       unsigned long kva;
--} efhw_page_t;
-+};
--static inline int efhw_page_alloc(efhw_page_t *p)
-+static inline int efhw_page_alloc(struct efhw_page *p)
- {
-       p->kva = __get_free_page(in_interrupt()? GFP_ATOMIC : GFP_KERNEL);
-       return p->kva ? 0 : -ENOMEM;
- }
--static inline int efhw_page_alloc_zeroed(efhw_page_t *p)
-+static inline int efhw_page_alloc_zeroed(struct efhw_page *p)
- {
-       p->kva = get_zeroed_page(in_interrupt()? GFP_ATOMIC : GFP_KERNEL);
-       return p->kva ? 0 : -ENOMEM;
- }
--static inline void efhw_page_free(efhw_page_t *p)
-+static inline void efhw_page_free(struct efhw_page *p)
- {
-       free_page(p->kva);
-       EFHW_DO_DEBUG(memset(p, 0, sizeof(*p)));
- }
--static inline char *efhw_page_ptr(efhw_page_t *p)
-+static inline char *efhw_page_ptr(struct efhw_page *p)
- {
-       return (char *)p->kva;
- }
--static inline unsigned efhw_page_pfn(efhw_page_t *p)
-+static inline unsigned efhw_page_pfn(struct efhw_page *p)
- {
-       return (unsigned)(__pa(p->kva) >> PAGE_SHIFT);
- }
--static inline void efhw_page_mark_invalid(efhw_page_t *p)
-+static inline void efhw_page_mark_invalid(struct efhw_page *p)
- {
-       p->kva = 0;
- }
--static inline int efhw_page_is_valid(efhw_page_t *p)
-+static inline int efhw_page_is_valid(struct efhw_page *p)
- {
-       return p->kva != 0;
- }
--static inline void efhw_page_init_from_va(efhw_page_t *p, void *va)
-+static inline void efhw_page_init_from_va(struct efhw_page *p, void *va)
- {
-       p->kva = (unsigned long)va;
- }
- /*--------------------------------------------------------------------
-  *
-- * efhw_iopage_t: A single page of memory.  Directly mapped in the driver,
-+ * struct efhw_iopage: A single page of memory.  Directly mapped in the driver,
-  * and can be mapped to userlevel.  Can also be accessed by the NIC.
-  *
-  *--------------------------------------------------------------------*/
--typedef struct {
--      efhw_page_t p;
-+struct efhw_iopage {
-+      struct efhw_page p;
-       dma_addr_t dma_addr;
--} efhw_iopage_t;
-+};
--static inline dma_addr_t efhw_iopage_dma_addr(efhw_iopage_t *p)
-+static inline dma_addr_t efhw_iopage_dma_addr(struct efhw_iopage *p)
- {
-       return p->dma_addr;
- }
-@@ -120,9 +122,9 @@ static inline dma_addr_t efhw_iopage_dma
- /*--------------------------------------------------------------------
-  *
-- * efhw_iopages_t: A set of pages that are contiguous in physical memory.
-- * Directly mapped in the driver, and can be mapped to userlevel.  Can also
-- * be accessed by the NIC.
-+ * struct efhw_iopages: A set of pages that are contiguous in physical
-+ * memory.  Directly mapped in the driver, and can be mapped to userlevel.
-+ * Can also be accessed by the NIC.
-  *
-  * NB. The O/S may be unwilling to allocate many, or even any of these.  So
-  * only use this type where the NIC really needs a physically contiguous
-@@ -130,44 +132,44 @@ static inline dma_addr_t efhw_iopage_dma
-  *
-  *--------------------------------------------------------------------*/
--typedef struct {
-+struct efhw_iopages {
-       caddr_t kva;
-       unsigned order;
-       dma_addr_t dma_addr;
--} efhw_iopages_t;
-+};
--static inline caddr_t efhw_iopages_ptr(efhw_iopages_t *p)
-+static inline caddr_t efhw_iopages_ptr(struct efhw_iopages *p)
- {
-       return p->kva;
- }
--static inline unsigned efhw_iopages_pfn(efhw_iopages_t *p)
-+static inline unsigned efhw_iopages_pfn(struct efhw_iopages *p)
- {
-       return (unsigned)(__pa(p->kva) >> PAGE_SHIFT);
- }
--static inline dma_addr_t efhw_iopages_dma_addr(efhw_iopages_t *p)
-+static inline dma_addr_t efhw_iopages_dma_addr(struct efhw_iopages *p)
- {
-       return p->dma_addr;
- }
--static inline unsigned efhw_iopages_size(efhw_iopages_t *p)
-+static inline unsigned efhw_iopages_size(struct efhw_iopages *p)
- {
-       return 1u << (p->order + PAGE_SHIFT);
- }
--/* efhw_iopage_t <-> efhw_iopages_t conversions for handling physically
-- * contiguous allocations in iobufsets for iSCSI.  This allows the
-- * essential information about contiguous allocations from
-- * efhw_iopages_alloc() to be saved away in the efhw_iopage_t array in an
-- * iobufset.  (Changing the iobufset resource to use a union type would
-+/* struct efhw_iopage <-> struct efhw_iopages conversions for handling
-+ * physically contiguous allocations in iobufsets for iSCSI.  This allows
-+ * the essential information about contiguous allocations from
-+ * efhw_iopages_alloc() to be saved away in the struct efhw_iopage array in
-+ * an iobufset.  (Changing the iobufset resource to use a union type would
-  * involve a lot of code changes, and make the iobufset's metadata larger
-  * which could be bad as it's supposed to fit into a single page on some
-  * platforms.)
-  */
- static inline void
--efhw_iopage_init_from_iopages(efhw_iopage_t *iopage,
--                          efhw_iopages_t *iopages, unsigned pageno)
-+efhw_iopage_init_from_iopages(struct efhw_iopage *iopage,
-+                            struct efhw_iopages *iopages, unsigned pageno)
- {
-       iopage->p.kva = ((unsigned long)efhw_iopages_ptr(iopages))
-           + (pageno * PAGE_SIZE);
-@@ -176,8 +178,8 @@ efhw_iopage_init_from_iopages(efhw_iopag
- }
- static inline void
--efhw_iopages_init_from_iopage(efhw_iopages_t *iopages,
--                          efhw_iopage_t *iopage, unsigned order)
-+efhw_iopages_init_from_iopage(struct efhw_iopages *iopages,
-+                            struct efhw_iopage *iopage, unsigned order)
- {
-       iopages->kva = (caddr_t) efhw_iopage_ptr(iopage);
-       EFHW_ASSERT(iopages->kva);
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/public.h     2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/public.h  2009-03-30 16:00:09.000000000 +0200
-@@ -70,11 +70,32 @@ int efhw_nic_event_queue_alloc_iobuffer(
- extern void falcon_nic_set_rx_usr_buf_size(struct efhw_nic *,
-                                          int rx_usr_buf_size);
-+/*! Get RX filter search limits from RX_FILTER_CTL_REG.
-+ *  use_raw_values = 0 to get actual depth of search, or 1 to get raw values
-+ *  from register.
-+ */
-+extern void
-+falcon_nic_get_rx_filter_search_limits(struct efhw_nic *nic,
-+                                     struct efhw_filter_search_limits *lim,
-+                                     int use_raw_values);
-+
-+/*! Set RX filter search limits in RX_FILTER_CTL_REG.
-+ *  use_raw_values = 0 if specifying actual depth of search, or 1 if specifying
-+ *  raw values to write to the register.
-+ */
-+extern void
-+falcon_nic_set_rx_filter_search_limits(struct efhw_nic *nic,
-+                                     struct efhw_filter_search_limits *lim,
-+                                     int use_raw_values);
-+
-+
-+/*! Legacy RX IP filter search depth control interface */
- extern void
- falcon_nic_rx_filter_ctl_set(struct efhw_nic *nic, uint32_t tcp_full,
-                            uint32_t tcp_wild,
-                            uint32_t udp_full, uint32_t udp_wild);
-+/*! Legacy RX IP filter search depth control interface */
- extern void
- falcon_nic_rx_filter_ctl_get(struct efhw_nic *nic, uint32_t *tcp_full,
-                            uint32_t *tcp_wild,
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efhw/sysdep.h     2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efhw/sysdep.h  2009-03-30 16:00:09.000000000 +0200
-@@ -39,34 +39,17 @@
- #ifndef __CI_EFHW_SYSDEP_LINUX_H__
- #define __CI_EFHW_SYSDEP_LINUX_H__
--#include <linux/version.h>
- #include <linux/module.h>
- #include <linux/spinlock.h>
- #include <linux/delay.h>
-+#include <linux/vmalloc.h>
- #include <linux/if_ether.h>
- #include <linux/netdevice.h> /* necessary for etherdevice.h on some kernels */
- #include <linux/etherdevice.h>
--#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21)
--static inline int is_local_ether_addr(const u8 *addr)
--{
--      return (0x02 & addr[0]);
--}
--#endif
--
- typedef unsigned long irq_flags_t;
- #define spin_lock_destroy(l_)  do {} while (0)
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
--#define HAS_NET_NAMESPACE
--#endif
--
--/* Funny, but linux has round_up for x86 only, defined in
-- * x86-specific header */
--#ifndef round_up
--#define round_up(x, y) (((x) + (y) - 1) & ~((y)-1))
--#endif
--
- #endif /* __CI_EFHW_SYSDEP_LINUX_H__ */
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efrm/nic_table.h  2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efrm/nic_table.h       2009-03-30 16:09:06.000000000 +0200
-@@ -62,21 +62,21 @@ struct efrm_nic_table {
- };
- /* Resource driver structures used by other drivers as well */
--extern struct efrm_nic_table efrm_nic_table;
-+extern struct efrm_nic_table *efrm_nic_tablep;
- static inline void efrm_nic_table_hold(void)
- {
--      atomic_inc(&efrm_nic_table.ref_count);
-+      atomic_inc(&efrm_nic_tablep->ref_count);
- }
- static inline void efrm_nic_table_rele(void)
- {
--      atomic_dec(&efrm_nic_table.ref_count);
-+      atomic_dec(&efrm_nic_tablep->ref_count);
- }
- static inline int efrm_nic_table_held(void)
- {
--      return (atomic_read(&efrm_nic_table.ref_count) != 0);
-+      return atomic_read(&efrm_nic_tablep->ref_count) != 0;
- }
- /* Run code block _x multiple times with variable nic set to each
-@@ -86,13 +86,13 @@ static inline int efrm_nic_table_held(vo
-       for ((_nic_i) = (efrm_nic_table_hold(), 0);                     \
-            (_nic_i) < EFHW_MAX_NR_DEVS || (efrm_nic_table_rele(), 0); \
-            (_nic_i)++)                                                \
--              if (((_nic) = efrm_nic_table.nic[_nic_i]))
-+              if (((_nic) = efrm_nic_tablep->nic[_nic_i]))
- #define EFRM_FOR_EACH_NIC_IN_SET(_set, _i, _nic)                      \
-       for ((_i) = (efrm_nic_table_hold(), 0);                         \
-            (_i) < EFHW_MAX_NR_DEVS || (efrm_nic_table_rele(), 0);     \
-            ++(_i))                                                    \
--              if (((_nic) = efrm_nic_table.nic[_i]) &&                \
-+              if (((_nic) = efrm_nic_tablep->nic[_i]) &&              \
-                   efrm_nic_set_read((_set), (_i)))
- #endif /* __CI_EFRM_NIC_TABLE_H__ */
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efrm/sysdep.h     2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efrm/sysdep.h  2009-03-30 16:00:09.000000000 +0200
-@@ -41,14 +41,6 @@
- /* Spinlocks are defined in efhw/sysdep.h */
- #include <ci/efhw/sysdep.h>
--#if defined(__linux__) && defined(__KERNEL__)
--
--# include <ci/efrm/sysdep_linux.h>
--
--#else
--
--# include <ci/efrm/sysdep_ci2linux.h>
--
--#endif
-+#include <ci/efrm/sysdep_linux.h>
- #endif /* __CI_EFRM_SYSDEP_H__ */
---- sle11-2009-03-24.orig/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h       2009-03-30 16:16:28.000000000 +0200
-+++ sle11-2009-03-24/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h    2009-03-30 16:00:09.000000000 +0200
-@@ -42,7 +42,6 @@
- #ifndef __CI_EFRM_SYSDEP_LINUX_H__
- #define __CI_EFRM_SYSDEP_LINUX_H__
--#include <linux/version.h>
- #include <linux/list.h>
- #include <linux/vmalloc.h>
- #include <linux/errno.h>
-@@ -55,28 +54,15 @@
- #include <linux/if_ether.h>
- #include <linux/completion.h>
- #include <linux/in.h>
--
--#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
--/* get roundup_pow_of_two(), which was in kernel.h in early kernel versions */
- #include <linux/log2.h>
--#endif
-+#include <linux/kfifo.h>
-+
- /********************************************************************
-  *
-  * List API
-  *
-  ********************************************************************/
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
--static inline void
--list_replace_init(struct list_head *old, struct list_head *new)
--{
--      new->next = old->next;
--      new->next->prev = new;
--      new->prev = old->prev;
--      new->prev->next = new;
--      INIT_LIST_HEAD(old);
--}
--#endif
- static inline struct list_head *list_pop(struct list_head *list)
- {
-@@ -94,151 +80,10 @@ static inline struct list_head *list_pop
- /********************************************************************
-  *
-- * Workqueue API
-- *
-- ********************************************************************/
--
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
--#define NEED_OLD_WORK_API
--
--/**
-- * The old and new work function prototypes just change
-- * the type of the pointer in the only argument, so it's
-- * safe to cast one function type to the other
-- */
--typedef void (*efrm_old_work_func_t) (void *p);
--
--#undef INIT_WORK
--#define INIT_WORK(_work, _func)                                       \
--      do {                                                    \
--              INIT_LIST_HEAD(&(_work)->entry);                \
--              (_work)->pending = 0;                           \
--              PREPARE_WORK((_work),                           \
--                           (efrm_old_work_func_t) (_func),    \
--                           (_work));                          \
--      } while (0)
--
--#endif
--
--/********************************************************************
-- *
-  * Kfifo API
-  *
-  ********************************************************************/
--#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
--
--#if !defined(RHEL_RELEASE_CODE) || (RHEL_RELEASE_CODE < 1029)
--typedef unsigned gfp_t;
--#endif
--
--#define HAS_NO_KFIFO
--
--struct kfifo {
--      unsigned char *buffer;  /* the buffer holding the data */
--      unsigned int size;      /* the size of the allocated buffer */
--      unsigned int in;        /* data is added at offset (in % size) */
--      unsigned int out;       /* data is extracted from off. (out % size) */
--      spinlock_t *lock;       /* protects concurrent modifications */
--};
--
--extern struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
--                              gfp_t gfp_mask, spinlock_t *lock);
--extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,
--                               spinlock_t *lock);
--extern void kfifo_free(struct kfifo *fifo);
--extern unsigned int __kfifo_put(struct kfifo *fifo,
--                              unsigned char *buffer, unsigned int len);
--extern unsigned int __kfifo_get(struct kfifo *fifo,
--                              unsigned char *buffer, unsigned int len);
--
--/**
-- * kfifo_put - puts some data into the FIFO
-- * @fifo: the fifo to be used.
-- * @buffer: the data to be added.
-- * @len: the length of the data to be added.
-- *
-- * This function copies at most @len bytes from the @buffer into
-- * the FIFO depending on the free space, and returns the number of
-- * bytes copied.
-- */
--static inline unsigned int
--kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
--{
--      unsigned long flags;
--      unsigned int ret;
--
--      spin_lock_irqsave(fifo->lock, flags);
--
--      ret = __kfifo_put(fifo, buffer, len);
--
--      spin_unlock_irqrestore(fifo->lock, flags);
--
--      return ret;
--}
--
--/**
-- * kfifo_get - gets some data from the FIFO
-- * @fifo: the fifo to be used.
-- * @buffer: where the data must be copied.
-- * @len: the size of the destination buffer.
-- *
-- * This function copies at most @len bytes from the FIFO into the
-- * @buffer and returns the number of copied bytes.
-- */
--static inline unsigned int
--kfifo_get(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
--{
--      unsigned long flags;
--      unsigned int ret;
--
--      spin_lock_irqsave(fifo->lock, flags);
--
--      ret = __kfifo_get(fifo, buffer, len);
--
--      /*
--       * optimization: if the FIFO is empty, set the indices to 0
--       * so we don't wrap the next time
--       */
--      if (fifo->in == fifo->out)
--              fifo->in = fifo->out = 0;
--
--      spin_unlock_irqrestore(fifo->lock, flags);
--
--      return ret;
--}
--
--/**
-- * __kfifo_len - returns the number of bytes available in the FIFO, no locking version
-- * @fifo: the fifo to be used.
-- */
--static inline unsigned int __kfifo_len(struct kfifo *fifo)
--{
--      return fifo->in - fifo->out;
--}
--
--/**
-- * kfifo_len - returns the number of bytes available in the FIFO
-- * @fifo: the fifo to be used.
-- */
--static inline unsigned int kfifo_len(struct kfifo *fifo)
--{
--      unsigned long flags;
--      unsigned int ret;
--
--      spin_lock_irqsave(fifo->lock, flags);
--
--      ret = __kfifo_len(fifo);
--
--      spin_unlock_irqrestore(fifo->lock, flags);
--
--      return ret;
--}
--
--#else
--#include <linux/kfifo.h>
--#endif
--
- static inline void kfifo_vfree(struct kfifo *fifo)
- {
-       vfree(fifo->buffer);