aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r--drivers/net/netxen/netxen_nic_main.c55
1 files changed, 34 insertions, 21 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 665fce561d4a..bd93296be4dd 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -787,6 +787,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
787 if (adapter->max_sds_rings > 1) 787 if (adapter->max_sds_rings > 1)
788 netxen_config_rss(adapter, 1); 788 netxen_config_rss(adapter, 1);
789 789
790 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
791 netxen_linkevent_request(adapter, 1);
792
790 return 0; 793 return 0;
791} 794}
792 795
@@ -1493,26 +1496,9 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1493 return rv; 1496 return rv;
1494} 1497}
1495 1498
1496static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) 1499void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
1497{ 1500{
1498 struct net_device *netdev = adapter->netdev; 1501 struct net_device *netdev = adapter->netdev;
1499 u32 val, port, linkup;
1500
1501 port = adapter->physical_port;
1502
1503 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1504 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE_P3);
1505 val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
1506 linkup = (val == XG_LINK_UP_P3);
1507 } else {
1508 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE);
1509 if (adapter->ahw.port_type == NETXEN_NIC_GBE)
1510 linkup = (val >> port) & 1;
1511 else {
1512 val = (val >> port*8) & 0xff;
1513 linkup = (val == XG_LINK_UP);
1514 }
1515 }
1516 1502
1517 if (adapter->ahw.linkup && !linkup) { 1503 if (adapter->ahw.linkup && !linkup) {
1518 printk(KERN_INFO "%s: %s NIC Link is down\n", 1504 printk(KERN_INFO "%s: %s NIC Link is down\n",
@@ -1523,7 +1509,9 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1523 netif_stop_queue(netdev); 1509 netif_stop_queue(netdev);
1524 } 1510 }
1525 1511
1526 netxen_nic_set_link_parameters(adapter); 1512 if (!adapter->has_link_events)
1513 netxen_nic_set_link_parameters(adapter);
1514
1527 } else if (!adapter->ahw.linkup && linkup) { 1515 } else if (!adapter->ahw.linkup && linkup) {
1528 printk(KERN_INFO "%s: %s NIC Link is up\n", 1516 printk(KERN_INFO "%s: %s NIC Link is up\n",
1529 netxen_nic_driver_name, netdev->name); 1517 netxen_nic_driver_name, netdev->name);
@@ -1533,10 +1521,34 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1533 netif_wake_queue(netdev); 1521 netif_wake_queue(netdev);
1534 } 1522 }
1535 1523
1536 netxen_nic_set_link_parameters(adapter); 1524 if (!adapter->has_link_events)
1525 netxen_nic_set_link_parameters(adapter);
1537 } 1526 }
1538} 1527}
1539 1528
1529static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
1530{
1531 u32 val, port, linkup;
1532
1533 port = adapter->physical_port;
1534
1535 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1536 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE_P3);
1537 val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val);
1538 linkup = (val == XG_LINK_UP_P3);
1539 } else {
1540 val = adapter->pci_read_normalize(adapter, CRB_XG_STATE);
1541 if (adapter->ahw.port_type == NETXEN_NIC_GBE)
1542 linkup = (val >> port) & 1;
1543 else {
1544 val = (val >> port*8) & 0xff;
1545 linkup = (val == XG_LINK_UP);
1546 }
1547 }
1548
1549 netxen_advert_link_change(adapter, linkup);
1550}
1551
1540static void netxen_watchdog(unsigned long v) 1552static void netxen_watchdog(unsigned long v)
1541{ 1553{
1542 struct netxen_adapter *adapter = (struct netxen_adapter *)v; 1554 struct netxen_adapter *adapter = (struct netxen_adapter *)v;
@@ -1552,7 +1564,8 @@ void netxen_watchdog_task(struct work_struct *work)
1552 if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter)) 1564 if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter))
1553 return; 1565 return;
1554 1566
1555 netxen_nic_handle_phy_intr(adapter); 1567 if (!adapter->has_link_events)
1568 netxen_nic_handle_phy_intr(adapter);
1556 1569
1557 if (netif_running(adapter->netdev)) 1570 if (netif_running(adapter->netdev))
1558 mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); 1571 mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);