diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 55 |
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 | ||
1496 | static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter) | 1499 | void 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 | ||
1529 | static 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 | |||
1540 | static void netxen_watchdog(unsigned long v) | 1552 | static 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); |