netxen: onchip memory access change
authorAmit Kumar Salecha <amit@netxen.com>
Fri, 16 Oct 2009 15:50:09 +0000 (15:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 18 Oct 2009 06:44:42 +0000 (23:44 -0700)
Add support for different windowing scheme for on chip
memory in future chip revisions. This is required by
diagnostic tools.

Signed-off-by: Amit Kumar Salecha <amit@netxen.com>
Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/netxen/netxen_nic_hdr.h
drivers/net/netxen/netxen_nic_hw.c
drivers/net/netxen/netxen_nic_main.c

index d40fe33a4d840f3074fb9a0ec8ffabb671a62094..7386a7cce2baac3413c182356b8fa57303957ff2 100644 (file)
@@ -867,6 +867,9 @@ enum {
                (PCIX_SN_WINDOW_F0 + (0x20 * (func))) :\
                (PCIX_SN_WINDOW_F4 + (0x10 * ((func)-4))))
 
+#define PCIX_OCM_WINDOW                (0x10800)
+#define PCIX_OCM_WINDOW_REG(func)      (PCIX_OCM_WINDOW + 0x20 * (func))
+
 #define PCIX_TARGET_STATUS     (0x10118)
 #define PCIX_TARGET_STATUS_F1  (0x10160)
 #define PCIX_TARGET_STATUS_F2  (0x10164)
index 52a2f2d675524e80488a60bd990e101528cbccf9..a63324613430c9d803404c975f8c36bdb5eb3e12 100644 (file)
@@ -31,6 +31,7 @@
 #define MASK(n) ((1ULL<<(n))-1)
 #define MN_WIN(addr) (((addr & 0x1fc0000) >> 1) | ((addr >> 25) & 0x3ff))
 #define OCM_WIN(addr) (((addr & 0x1ff0000) >> 1) | ((addr >> 25) & 0x3ff))
+#define OCM_WIN_P3P(addr) (addr & 0xffc0000)
 #define MS_WIN(addr) (addr & 0x0ffc0000)
 
 #define GET_MEM_OFFS_2M(addr) (addr & MASK(18))
@@ -1338,7 +1339,7 @@ static int
 netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter,
                u64 addr, u32 *start)
 {
-       u32 win_read, window;
+       u32 window;
        struct pci_dev *pdev = adapter->pdev;
 
        if ((addr & 0x00ff800) == 0xff800) {
@@ -1347,14 +1348,14 @@ netxen_nic_pci_set_window_2M(struct netxen_adapter *adapter,
                return -EIO;
        }
 
-       window = OCM_WIN(addr);
+       if (NX_IS_REVISION_P3P(adapter->ahw.revision_id))
+               window = OCM_WIN_P3P(addr);
+       else
+               window = OCM_WIN(addr);
+
        writel(window, adapter->ahw.ocm_win_crb);
-       win_read = readl(adapter->ahw.ocm_win_crb);
-       if ((win_read >> 7) != window) {
-               if (printk_ratelimit())
-                       dev_warn(&pdev->dev, "failed to set OCM window\n");
-               return -EIO;
-       }
+       /* read back to flush */
+       readl(adapter->ahw.ocm_win_crb);
 
        adapter->ahw.ocm_win = window;
        *start = NETXEN_PCI_OCM0_2M + GET_MEM_OFFS_2M(addr);
index 2d772dd381fe770ab42047596c9da63e7fd11ce3..30d9afe7366a56b127ca3ccd0f2eea994105c3f1 100644 (file)
@@ -649,7 +649,11 @@ netxen_setup_pci_map(struct netxen_adapter *adapter)
        adapter->ahw.pci_base1 = mem_ptr1;
        adapter->ahw.pci_base2 = mem_ptr2;
 
-       if (!NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
+       if (NX_IS_REVISION_P3P(adapter->ahw.revision_id)) {
+               adapter->ahw.ocm_win_crb = netxen_get_ioaddr(adapter,
+                       NETXEN_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(pci_func)));
+
+       } else if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
                adapter->ahw.ocm_win_crb = netxen_get_ioaddr(adapter,
                        NETXEN_PCIX_PS_REG(PCIE_MN_WINDOW_REG(pci_func)));
        }