Skip to content

Commit

Permalink
netxen : fix debug tools access for NX2031
Browse files Browse the repository at this point in the history
Driver maps only some part of the MMIO bar 0 in case of
NX2031. This is sufficient for tx and rx by the driver.
When debug tools need to access resources in
unmapped regions, driver needs to map these on the fly
in order to complete read/write request.

Signed-off-by: Narender Kumar <narender.kumar@qlogic.com>
Signed-off-by: Dhananjay Phadke <dhananjay.phadke@qlogic.com>
Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Narender Kumar authored and David S. Miller committed Dec 3, 2009
1 parent 0be8401 commit f58dbd7
Showing 1 changed file with 44 additions and 19 deletions.
63 changes: 44 additions & 19 deletions drivers/net/netxen/netxen_nic_hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -1175,51 +1175,73 @@ netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong off)
adapter->ahw.crb_win = window;
}

static void __iomem *
netxen_nic_map_indirect_address_128M(struct netxen_adapter *adapter,
ulong win_off, void __iomem **mem_ptr)
{
ulong off = win_off;
void __iomem *addr;
resource_size_t mem_base;

if (ADDR_IN_WINDOW1(win_off))
off = NETXEN_CRB_NORMAL(win_off);

addr = pci_base_offset(adapter, off);
if (addr)
return addr;

if (adapter->ahw.pci_len0 == 0)
off -= NETXEN_PCI_CRBSPACE;

mem_base = pci_resource_start(adapter->pdev, 0);
*mem_ptr = ioremap(mem_base + (off & PAGE_MASK), PAGE_SIZE);
if (*mem_ptr)
addr = *mem_ptr + (off & (PAGE_SIZE - 1));

return addr;
}

static int
netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter, ulong off, u32 data)
{
unsigned long flags;
void __iomem *addr;

if (ADDR_IN_WINDOW1(off))
addr = NETXEN_CRB_NORMALIZE(adapter, off);
else
addr = pci_base_offset(adapter, off);
void __iomem *addr, *mem_ptr = NULL;

BUG_ON(!addr);
addr = netxen_nic_map_indirect_address_128M(adapter, off, &mem_ptr);
if (!addr)
return -EIO;

if (ADDR_IN_WINDOW1(off)) { /* Window 1 */
if (ADDR_IN_WINDOW1(off)) { /* Window 1 */
netxen_nic_io_write_128M(adapter, addr, data);
} else { /* Window 0 */
} else { /* Window 0 */
write_lock_irqsave(&adapter->ahw.crb_lock, flags);
addr = pci_base_offset(adapter, off);
netxen_nic_pci_set_crbwindow_128M(adapter, 0);
writel(data, addr);
netxen_nic_pci_set_crbwindow_128M(adapter,
NETXEN_WINDOW_ONE);
write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
}

if (mem_ptr)
iounmap(mem_ptr);

return 0;
}

static u32
netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter, ulong off)
{
unsigned long flags;
void __iomem *addr;
void __iomem *addr, *mem_ptr = NULL;
u32 data;

if (ADDR_IN_WINDOW1(off))
addr = NETXEN_CRB_NORMALIZE(adapter, off);
else
addr = pci_base_offset(adapter, off);

BUG_ON(!addr);
addr = netxen_nic_map_indirect_address_128M(adapter, off, &mem_ptr);
if (!addr)
return -EIO;

if (ADDR_IN_WINDOW1(off)) { /* Window 1 */
if (ADDR_IN_WINDOW1(off)) { /* Window 1 */
data = netxen_nic_io_read_128M(adapter, addr);
} else { /* Window 0 */
} else { /* Window 0 */
write_lock_irqsave(&adapter->ahw.crb_lock, flags);
netxen_nic_pci_set_crbwindow_128M(adapter, 0);
data = readl(addr);
Expand All @@ -1228,6 +1250,9 @@ netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter, ulong off)
write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
}

if (mem_ptr)
iounmap(mem_ptr);

return data;
}

Expand Down

0 comments on commit f58dbd7

Please sign in to comment.