aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-10-13 01:31:44 -0400
committerDavid S. Miller <davem@davemloft.net>2009-10-13 14:48:21 -0400
commitf03b0ebd8e7132bd9adb41348070813feb280300 (patch)
treec7606724b4dcd84857980797c9d948f00cbeb185 /drivers
parent907fa1201c76f426a13bdff5be2747fb62c2353f (diff)
netxen: separate register and memory access lock
Since register and onboard memory access has separate window registers, they need not be kept under same lock. Also, memory is always accessed from process context (mostly for firmware init and diagnostic tools). Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/netxen/netxen_nic.h5
-rw-r--r--drivers/net/netxen/netxen_nic_ethtool.c2
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c63
-rw-r--r--drivers/net/netxen/netxen_nic_init.c6
-rw-r--r--drivers/net/netxen/netxen_nic_main.c4
5 files changed, 38 insertions, 42 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 2a42132b9799..1047609ef51b 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -551,6 +551,9 @@ struct netxen_hardware_context {
551 u32 ocm_win; 551 u32 ocm_win;
552 u32 crb_win; 552 u32 crb_win;
553 553
554 rwlock_t crb_lock;
555 spinlock_t mem_lock;
556
554 u8 cut_through; 557 u8 cut_through;
555 u8 revision_id; 558 u8 revision_id;
556 u8 pci_func; 559 u8 pci_func;
@@ -1115,8 +1118,6 @@ struct netxen_adapter {
1115 struct pci_dev *pdev; 1118 struct pci_dev *pdev;
1116 struct list_head mac_list; 1119 struct list_head mac_list;
1117 1120
1118 rwlock_t adapter_lock;
1119
1120 spinlock_t tx_clean_lock; 1121 spinlock_t tx_clean_lock;
1121 1122
1122 u16 num_txd; 1123 u16 num_txd;
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c
index 714f38791a9a..a3b18e0c9670 100644
--- a/drivers/net/netxen/netxen_nic_ethtool.c
+++ b/drivers/net/netxen/netxen_nic_ethtool.c
@@ -85,11 +85,9 @@ netxen_nic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo)
85 85
86 strncpy(drvinfo->driver, netxen_nic_driver_name, 32); 86 strncpy(drvinfo->driver, netxen_nic_driver_name, 32);
87 strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32); 87 strncpy(drvinfo->version, NETXEN_NIC_LINUX_VERSIONID, 32);
88 read_lock(&adapter->adapter_lock);
89 fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); 88 fw_major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
90 fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); 89 fw_minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
91 fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); 90 fw_build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
92 read_unlock(&adapter->adapter_lock);
93 sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build); 91 sprintf(drvinfo->fw_version, "%d.%d.%d", fw_major, fw_minor, fw_build);
94 92
95 strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); 93 strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index 37f47660dcdd..d067bee87cd5 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -41,6 +41,11 @@
41#define CRB_HI(off) ((crb_hub_agt[CRB_BLK(off)] << 20) | ((off) & 0xf0000)) 41#define CRB_HI(off) ((crb_hub_agt[CRB_BLK(off)] << 20) | ((off) & 0xf0000))
42#define CRB_INDIRECT_2M (0x1e0000UL) 42#define CRB_INDIRECT_2M (0x1e0000UL)
43 43
44static void netxen_nic_io_write_128M(struct netxen_adapter *adapter,
45 void __iomem *addr, u32 data);
46static u32 netxen_nic_io_read_128M(struct netxen_adapter *adapter,
47 void __iomem *addr);
48
44#ifndef readq 49#ifndef readq
45static inline u64 readq(void __iomem *addr) 50static inline u64 readq(void __iomem *addr)
46{ 51{
@@ -1164,17 +1169,15 @@ netxen_nic_hw_write_wx_128M(struct netxen_adapter *adapter, ulong off, u32 data)
1164 BUG_ON(!addr); 1169 BUG_ON(!addr);
1165 1170
1166 if (ADDR_IN_WINDOW1(off)) { /* Window 1 */ 1171 if (ADDR_IN_WINDOW1(off)) { /* Window 1 */
1167 read_lock(&adapter->adapter_lock); 1172 netxen_nic_io_write_128M(adapter, addr, data);
1168 writel(data, addr);
1169 read_unlock(&adapter->adapter_lock);
1170 } else { /* Window 0 */ 1173 } else { /* Window 0 */
1171 write_lock_irqsave(&adapter->adapter_lock, flags); 1174 write_lock_irqsave(&adapter->ahw.crb_lock, flags);
1172 addr = pci_base_offset(adapter, off); 1175 addr = pci_base_offset(adapter, off);
1173 netxen_nic_pci_set_crbwindow_128M(adapter, 0); 1176 netxen_nic_pci_set_crbwindow_128M(adapter, 0);
1174 writel(data, addr); 1177 writel(data, addr);
1175 netxen_nic_pci_set_crbwindow_128M(adapter, 1178 netxen_nic_pci_set_crbwindow_128M(adapter,
1176 NETXEN_WINDOW_ONE); 1179 NETXEN_WINDOW_ONE);
1177 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1180 write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
1178 } 1181 }
1179 1182
1180 return 0; 1183 return 0;
@@ -1195,16 +1198,14 @@ netxen_nic_hw_read_wx_128M(struct netxen_adapter *adapter, ulong off)
1195 BUG_ON(!addr); 1198 BUG_ON(!addr);
1196 1199
1197 if (ADDR_IN_WINDOW1(off)) { /* Window 1 */ 1200 if (ADDR_IN_WINDOW1(off)) { /* Window 1 */
1198 read_lock(&adapter->adapter_lock); 1201 data = netxen_nic_io_read_128M(adapter, addr);
1199 data = readl(addr);
1200 read_unlock(&adapter->adapter_lock);
1201 } else { /* Window 0 */ 1202 } else { /* Window 0 */
1202 write_lock_irqsave(&adapter->adapter_lock, flags); 1203 write_lock_irqsave(&adapter->ahw.crb_lock, flags);
1203 netxen_nic_pci_set_crbwindow_128M(adapter, 0); 1204 netxen_nic_pci_set_crbwindow_128M(adapter, 0);
1204 data = readl(addr); 1205 data = readl(addr);
1205 netxen_nic_pci_set_crbwindow_128M(adapter, 1206 netxen_nic_pci_set_crbwindow_128M(adapter,
1206 NETXEN_WINDOW_ONE); 1207 NETXEN_WINDOW_ONE);
1207 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1208 write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
1208 } 1209 }
1209 1210
1210 return data; 1211 return data;
@@ -1226,12 +1227,12 @@ netxen_nic_hw_write_wx_2M(struct netxen_adapter *adapter, ulong off, u32 data)
1226 } 1227 }
1227 1228
1228 if (rv == 1) { 1229 if (rv == 1) {
1229 write_lock_irqsave(&adapter->adapter_lock, flags); 1230 write_lock_irqsave(&adapter->ahw.crb_lock, flags);
1230 crb_win_lock(adapter); 1231 crb_win_lock(adapter);
1231 netxen_nic_pci_set_crbwindow_2M(adapter, &off); 1232 netxen_nic_pci_set_crbwindow_2M(adapter, &off);
1232 writel(data, (void __iomem *)off); 1233 writel(data, (void __iomem *)off);
1233 crb_win_unlock(adapter); 1234 crb_win_unlock(adapter);
1234 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1235 write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
1235 } else 1236 } else
1236 writel(data, (void __iomem *)off); 1237 writel(data, (void __iomem *)off);
1237 1238
@@ -1256,12 +1257,12 @@ netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter, ulong off)
1256 } 1257 }
1257 1258
1258 if (rv == 1) { 1259 if (rv == 1) {
1259 write_lock_irqsave(&adapter->adapter_lock, flags); 1260 write_lock_irqsave(&adapter->ahw.crb_lock, flags);
1260 crb_win_lock(adapter); 1261 crb_win_lock(adapter);
1261 netxen_nic_pci_set_crbwindow_2M(adapter, &off); 1262 netxen_nic_pci_set_crbwindow_2M(adapter, &off);
1262 data = readl((void __iomem *)off); 1263 data = readl((void __iomem *)off);
1263 crb_win_unlock(adapter); 1264 crb_win_unlock(adapter);
1264 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1265 write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
1265 } else 1266 } else
1266 data = readl((void __iomem *)off); 1267 data = readl((void __iomem *)off);
1267 1268
@@ -1272,9 +1273,9 @@ netxen_nic_hw_read_wx_2M(struct netxen_adapter *adapter, ulong off)
1272static void netxen_nic_io_write_128M(struct netxen_adapter *adapter, 1273static void netxen_nic_io_write_128M(struct netxen_adapter *adapter,
1273 void __iomem *addr, u32 data) 1274 void __iomem *addr, u32 data)
1274{ 1275{
1275 read_lock(&adapter->adapter_lock); 1276 read_lock(&adapter->ahw.crb_lock);
1276 writel(data, addr); 1277 writel(data, addr);
1277 read_unlock(&adapter->adapter_lock); 1278 read_unlock(&adapter->ahw.crb_lock);
1278} 1279}
1279 1280
1280static u32 netxen_nic_io_read_128M(struct netxen_adapter *adapter, 1281static u32 netxen_nic_io_read_128M(struct netxen_adapter *adapter,
@@ -1282,9 +1283,9 @@ static u32 netxen_nic_io_read_128M(struct netxen_adapter *adapter,
1282{ 1283{
1283 u32 val; 1284 u32 val;
1284 1285
1285 read_lock(&adapter->adapter_lock); 1286 read_lock(&adapter->ahw.crb_lock);
1286 val = readl(addr); 1287 val = readl(addr);
1287 read_unlock(&adapter->adapter_lock); 1288 read_unlock(&adapter->ahw.crb_lock);
1288 1289
1289 return val; 1290 return val;
1290} 1291}
@@ -1366,11 +1367,10 @@ netxen_nic_pci_mem_access_direct(struct netxen_adapter *adapter, u64 off,
1366{ 1367{
1367 void __iomem *addr, *mem_ptr = NULL; 1368 void __iomem *addr, *mem_ptr = NULL;
1368 resource_size_t mem_base; 1369 resource_size_t mem_base;
1369 unsigned long flags;
1370 int ret = -EIO; 1370 int ret = -EIO;
1371 u32 start; 1371 u32 start;
1372 1372
1373 write_lock_irqsave(&adapter->adapter_lock, flags); 1373 spin_lock(&adapter->ahw.mem_lock);
1374 1374
1375 ret = adapter->pci_set_window(adapter, off, &start); 1375 ret = adapter->pci_set_window(adapter, off, &start);
1376 if (ret != 0) 1376 if (ret != 0)
@@ -1397,7 +1397,8 @@ noremap:
1397 writeq(*data, addr); 1397 writeq(*data, addr);
1398 1398
1399unlock: 1399unlock:
1400 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1400 spin_unlock(&adapter->ahw.mem_lock);
1401
1401 if (mem_ptr) 1402 if (mem_ptr)
1402 iounmap(mem_ptr); 1403 iounmap(mem_ptr);
1403 return ret; 1404 return ret;
@@ -1409,7 +1410,6 @@ static int
1409netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter, 1410netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter,
1410 u64 off, u64 data) 1411 u64 off, u64 data)
1411{ 1412{
1412 unsigned long flags;
1413 int j, ret; 1413 int j, ret;
1414 u32 temp, off_lo, off_hi, addr_hi, data_hi, data_lo; 1414 u32 temp, off_lo, off_hi, addr_hi, data_hi, data_lo;
1415 void __iomem *mem_crb; 1415 void __iomem *mem_crb;
@@ -1453,7 +1453,7 @@ netxen_nic_pci_mem_write_128M(struct netxen_adapter *adapter,
1453 return -EIO; 1453 return -EIO;
1454 1454
1455correct: 1455correct:
1456 write_lock_irqsave(&adapter->adapter_lock, flags); 1456 spin_lock(&adapter->ahw.mem_lock);
1457 netxen_nic_pci_set_crbwindow_128M(adapter, 0); 1457 netxen_nic_pci_set_crbwindow_128M(adapter, 0);
1458 1458
1459 writel(off_lo, (mem_crb + MIU_TEST_AGT_ADDR_LO)); 1459 writel(off_lo, (mem_crb + MIU_TEST_AGT_ADDR_LO));
@@ -1479,7 +1479,7 @@ correct:
1479 ret = 0; 1479 ret = 0;
1480 1480
1481 netxen_nic_pci_set_crbwindow_128M(adapter, NETXEN_WINDOW_ONE); 1481 netxen_nic_pci_set_crbwindow_128M(adapter, NETXEN_WINDOW_ONE);
1482 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1482 spin_unlock(&adapter->ahw.mem_lock);
1483 return ret; 1483 return ret;
1484} 1484}
1485 1485
@@ -1487,7 +1487,6 @@ static int
1487netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter, 1487netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter,
1488 u64 off, u64 *data) 1488 u64 off, u64 *data)
1489{ 1489{
1490 unsigned long flags;
1491 int j, ret; 1490 int j, ret;
1492 u32 temp, off_lo, off_hi, addr_hi, data_hi, data_lo; 1491 u32 temp, off_lo, off_hi, addr_hi, data_hi, data_lo;
1493 u64 val; 1492 u64 val;
@@ -1532,7 +1531,7 @@ netxen_nic_pci_mem_read_128M(struct netxen_adapter *adapter,
1532 return -EIO; 1531 return -EIO;
1533 1532
1534correct: 1533correct:
1535 write_lock_irqsave(&adapter->adapter_lock, flags); 1534 spin_lock(&adapter->ahw.mem_lock);
1536 netxen_nic_pci_set_crbwindow_128M(adapter, 0); 1535 netxen_nic_pci_set_crbwindow_128M(adapter, 0);
1537 1536
1538 writel(off_lo, (mem_crb + MIU_TEST_AGT_ADDR_LO)); 1537 writel(off_lo, (mem_crb + MIU_TEST_AGT_ADDR_LO));
@@ -1561,7 +1560,7 @@ correct:
1561 } 1560 }
1562 1561
1563 netxen_nic_pci_set_crbwindow_128M(adapter, NETXEN_WINDOW_ONE); 1562 netxen_nic_pci_set_crbwindow_128M(adapter, NETXEN_WINDOW_ONE);
1564 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1563 spin_unlock(&adapter->ahw.mem_lock);
1565 1564
1566 return ret; 1565 return ret;
1567} 1566}
@@ -1570,7 +1569,6 @@ static int
1570netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter, 1569netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter,
1571 u64 off, u64 data) 1570 u64 off, u64 data)
1572{ 1571{
1573 unsigned long flags;
1574 int j, ret; 1572 int j, ret;
1575 u32 temp, off8; 1573 u32 temp, off8;
1576 void __iomem *mem_crb; 1574 void __iomem *mem_crb;
@@ -1601,7 +1599,7 @@ netxen_nic_pci_mem_write_2M(struct netxen_adapter *adapter,
1601correct: 1599correct:
1602 off8 = off & MIU_TEST_AGT_ADDR_MASK; 1600 off8 = off & MIU_TEST_AGT_ADDR_MASK;
1603 1601
1604 write_lock_irqsave(&adapter->adapter_lock, flags); 1602 spin_lock(&adapter->ahw.mem_lock);
1605 1603
1606 writel(off8, (mem_crb + MIU_TEST_AGT_ADDR_LO)); 1604 writel(off8, (mem_crb + MIU_TEST_AGT_ADDR_LO));
1607 writel(0, (mem_crb + MIU_TEST_AGT_ADDR_HI)); 1605 writel(0, (mem_crb + MIU_TEST_AGT_ADDR_HI));
@@ -1625,7 +1623,7 @@ correct:
1625 } else 1623 } else
1626 ret = 0; 1624 ret = 0;
1627 1625
1628 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1626 spin_unlock(&adapter->ahw.mem_lock);
1629 1627
1630 return ret; 1628 return ret;
1631} 1629}
@@ -1634,7 +1632,6 @@ static int
1634netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter, 1632netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter,
1635 u64 off, u64 *data) 1633 u64 off, u64 *data)
1636{ 1634{
1637 unsigned long flags;
1638 int j, ret; 1635 int j, ret;
1639 u32 temp, off8; 1636 u32 temp, off8;
1640 u64 val; 1637 u64 val;
@@ -1668,7 +1665,7 @@ netxen_nic_pci_mem_read_2M(struct netxen_adapter *adapter,
1668correct: 1665correct:
1669 off8 = off & MIU_TEST_AGT_ADDR_MASK; 1666 off8 = off & MIU_TEST_AGT_ADDR_MASK;
1670 1667
1671 write_lock_irqsave(&adapter->adapter_lock, flags); 1668 spin_lock(&adapter->ahw.mem_lock);
1672 1669
1673 writel(off8, (mem_crb + MIU_TEST_AGT_ADDR_LO)); 1670 writel(off8, (mem_crb + MIU_TEST_AGT_ADDR_LO));
1674 writel(0, (mem_crb + MIU_TEST_AGT_ADDR_HI)); 1671 writel(0, (mem_crb + MIU_TEST_AGT_ADDR_HI));
@@ -1694,7 +1691,7 @@ correct:
1694 ret = 0; 1691 ret = 0;
1695 } 1692 }
1696 1693
1697 write_unlock_irqrestore(&adapter->adapter_lock, flags); 1694 spin_unlock(&adapter->ahw.mem_lock);
1698 1695
1699 return ret; 1696 return ret;
1700} 1697}
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index 424b456c5c82..83387c791d5f 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -1513,10 +1513,8 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid,
1513 (rds_ring->num_desc - 1))); 1513 (rds_ring->num_desc - 1)));
1514 netxen_set_msg_ctxid(msg, adapter->portnum); 1514 netxen_set_msg_ctxid(msg, adapter->portnum);
1515 netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid)); 1515 netxen_set_msg_opcode(msg, NETXEN_RCV_PRODUCER(ringid));
1516 read_lock(&adapter->adapter_lock); 1516 NXWRIO(adapter, DB_NORMALIZE(adapter,
1517 writel(msg, DB_NORMALIZE(adapter, 1517 NETXEN_RCV_PRODUCER_OFFSET), msg);
1518 NETXEN_RCV_PRODUCER_OFFSET));
1519 read_unlock(&adapter->adapter_lock);
1520 } 1518 }
1521 } 1519 }
1522} 1520}
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 6695e5473027..38529ee55be9 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -1240,7 +1240,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1240 revision_id = pdev->revision; 1240 revision_id = pdev->revision;
1241 adapter->ahw.revision_id = revision_id; 1241 adapter->ahw.revision_id = revision_id;
1242 1242
1243 rwlock_init(&adapter->adapter_lock); 1243 rwlock_init(&adapter->ahw.crb_lock);
1244 spin_lock_init(&adapter->ahw.mem_lock);
1245
1244 spin_lock_init(&adapter->tx_clean_lock); 1246 spin_lock_init(&adapter->tx_clean_lock);
1245 INIT_LIST_HEAD(&adapter->mac_list); 1247 INIT_LIST_HEAD(&adapter->mac_list);
1246 1248