aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen
diff options
context:
space:
mode:
authorAmit Kumar Salecha <amit.salecha@qlogic.com>2010-05-11 19:53:05 -0400
committerDavid S. Miller <davem@davemloft.net>2010-05-13 02:02:31 -0400
commit0b9715e64f7d46a9620d4d5042a5e28f5595ed54 (patch)
treeb9cf3eda5387342052cac82712184777a59ef906 /drivers/net/netxen
parent14e2cfbb79712f07962be027016868ba487c696b (diff)
netxen: handle queue manager access
Check the access by tools for hardware queue engine and handle it separately than other block registers, otherwise incorrect data is returned. Support for only NX3031 based cards. Acked-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>
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r--drivers/net/netxen/netxen_nic.h5
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c25
-rw-r--r--drivers/net/netxen/netxen_nic_main.c44
3 files changed, 63 insertions, 11 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 174ac8ef82fa..ffa1b9ce1cc5 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -95,6 +95,9 @@
95#define ADDR_IN_WINDOW1(off) \ 95#define ADDR_IN_WINDOW1(off) \
96 ((off > NETXEN_CRB_PCIX_HOST2) && (off < NETXEN_CRB_MAX)) ? 1 : 0 96 ((off > NETXEN_CRB_PCIX_HOST2) && (off < NETXEN_CRB_MAX)) ? 1 : 0
97 97
98#define ADDR_IN_RANGE(addr, low, high) \
99 (((addr) < (high)) && ((addr) >= (low)))
100
98/* 101/*
99 * normalize a 64MB crb address to 32MB PCI window 102 * normalize a 64MB crb address to 32MB PCI window
100 * To use NETXEN_CRB_NORMALIZE, window _must_ be set to 1 103 * To use NETXEN_CRB_NORMALIZE, window _must_ be set to 1
@@ -1352,6 +1355,8 @@ int netxen_config_rss(struct netxen_adapter *adapter, int enable);
1352int netxen_config_ipaddr(struct netxen_adapter *adapter, u32 ip, int cmd); 1355int netxen_config_ipaddr(struct netxen_adapter *adapter, u32 ip, int cmd);
1353int netxen_linkevent_request(struct netxen_adapter *adapter, int enable); 1356int netxen_linkevent_request(struct netxen_adapter *adapter, int enable);
1354void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup); 1357void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup);
1358void netxen_pci_camqm_read_2M(struct netxen_adapter *, u64, u64 *);
1359void netxen_pci_camqm_write_2M(struct netxen_adapter *, u64, u64);
1355 1360
1356int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu); 1361int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu);
1357int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu); 1362int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu);
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index be6398860781..5c496f8d7c49 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -62,9 +62,6 @@ static inline void writeq(u64 val, void __iomem *addr)
62} 62}
63#endif 63#endif
64 64
65#define ADDR_IN_RANGE(addr, low, high) \
66 (((addr) < (high)) && ((addr) >= (low)))
67
68#define PCI_OFFSET_FIRST_RANGE(adapter, off) \ 65#define PCI_OFFSET_FIRST_RANGE(adapter, off) \
69 ((adapter)->ahw.pci_base0 + (off)) 66 ((adapter)->ahw.pci_base0 + (off))
70#define PCI_OFFSET_SECOND_RANGE(adapter, off) \ 67#define PCI_OFFSET_SECOND_RANGE(adapter, off) \
@@ -1448,6 +1445,28 @@ unlock:
1448 return ret; 1445 return ret;
1449} 1446}
1450 1447
1448void
1449netxen_pci_camqm_read_2M(struct netxen_adapter *adapter, u64 off, u64 *data)
1450{
1451 void __iomem *addr = adapter->ahw.pci_base0 +
1452 NETXEN_PCI_CAMQM_2M_BASE + (off - NETXEN_PCI_CAMQM);
1453
1454 spin_lock(&adapter->ahw.mem_lock);
1455 *data = readq(addr);
1456 spin_unlock(&adapter->ahw.mem_lock);
1457}
1458
1459void
1460netxen_pci_camqm_write_2M(struct netxen_adapter *adapter, u64 off, u64 data)
1461{
1462 void __iomem *addr = adapter->ahw.pci_base0 +
1463 NETXEN_PCI_CAMQM_2M_BASE + (off - NETXEN_PCI_CAMQM);
1464
1465 spin_lock(&adapter->ahw.mem_lock);
1466 writeq(data, addr);
1467 spin_unlock(&adapter->ahw.mem_lock);
1468}
1469
1451#define MAX_CTL_CHECK 1000 1470#define MAX_CTL_CHECK 1000
1452 1471
1453static int 1472static int
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index b665b420a4f2..692e672d303d 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -2537,14 +2537,24 @@ static int
2537netxen_sysfs_validate_crb(struct netxen_adapter *adapter, 2537netxen_sysfs_validate_crb(struct netxen_adapter *adapter,
2538 loff_t offset, size_t size) 2538 loff_t offset, size_t size)
2539{ 2539{
2540 size_t crb_size = 4;
2541
2540 if (!(adapter->flags & NETXEN_NIC_DIAG_ENABLED)) 2542 if (!(adapter->flags & NETXEN_NIC_DIAG_ENABLED))
2541 return -EIO; 2543 return -EIO;
2542 2544
2543 if ((size != 4) || (offset & 0x3)) 2545 if (offset < NETXEN_PCI_CRBSPACE) {
2544 return -EINVAL; 2546 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
2547 return -EINVAL;
2545 2548
2546 if (offset < NETXEN_PCI_CRBSPACE) 2549 if (ADDR_IN_RANGE(offset, NETXEN_PCI_CAMQM,
2547 return -EINVAL; 2550 NETXEN_PCI_CAMQM_2M_END))
2551 crb_size = 8;
2552 else
2553 return -EINVAL;
2554 }
2555
2556 if ((size != crb_size) || (offset & (crb_size-1)))
2557 return -EINVAL;
2548 2558
2549 return 0; 2559 return 0;
2550} 2560}
@@ -2556,14 +2566,23 @@ netxen_sysfs_read_crb(struct kobject *kobj, struct bin_attribute *attr,
2556 struct device *dev = container_of(kobj, struct device, kobj); 2566 struct device *dev = container_of(kobj, struct device, kobj);
2557 struct netxen_adapter *adapter = dev_get_drvdata(dev); 2567 struct netxen_adapter *adapter = dev_get_drvdata(dev);
2558 u32 data; 2568 u32 data;
2569 u64 qmdata;
2559 int ret; 2570 int ret;
2560 2571
2561 ret = netxen_sysfs_validate_crb(adapter, offset, size); 2572 ret = netxen_sysfs_validate_crb(adapter, offset, size);
2562 if (ret != 0) 2573 if (ret != 0)
2563 return ret; 2574 return ret;
2564 2575
2565 data = NXRD32(adapter, offset); 2576 if (NX_IS_REVISION_P3(adapter->ahw.revision_id) &&
2566 memcpy(buf, &data, size); 2577 ADDR_IN_RANGE(offset, NETXEN_PCI_CAMQM,
2578 NETXEN_PCI_CAMQM_2M_END)) {
2579 netxen_pci_camqm_read_2M(adapter, offset, &qmdata);
2580 memcpy(buf, &qmdata, size);
2581 } else {
2582 data = NXRD32(adapter, offset);
2583 memcpy(buf, &data, size);
2584 }
2585
2567 return size; 2586 return size;
2568} 2587}
2569 2588
@@ -2574,14 +2593,23 @@ netxen_sysfs_write_crb(struct kobject *kobj, struct bin_attribute *attr,
2574 struct device *dev = container_of(kobj, struct device, kobj); 2593 struct device *dev = container_of(kobj, struct device, kobj);
2575 struct netxen_adapter *adapter = dev_get_drvdata(dev); 2594 struct netxen_adapter *adapter = dev_get_drvdata(dev);
2576 u32 data; 2595 u32 data;
2596 u64 qmdata;
2577 int ret; 2597 int ret;
2578 2598
2579 ret = netxen_sysfs_validate_crb(adapter, offset, size); 2599 ret = netxen_sysfs_validate_crb(adapter, offset, size);
2580 if (ret != 0) 2600 if (ret != 0)
2581 return ret; 2601 return ret;
2582 2602
2583 memcpy(&data, buf, size); 2603 if (NX_IS_REVISION_P3(adapter->ahw.revision_id) &&
2584 NXWR32(adapter, offset, data); 2604 ADDR_IN_RANGE(offset, NETXEN_PCI_CAMQM,
2605 NETXEN_PCI_CAMQM_2M_END)) {
2606 memcpy(&qmdata, buf, size);
2607 netxen_pci_camqm_write_2M(adapter, offset, qmdata);
2608 } else {
2609 memcpy(&data, buf, size);
2610 NXWR32(adapter, offset, data);
2611 }
2612
2585 return size; 2613 return size;
2586} 2614}
2587 2615