diff options
author | Chien Tung <chien.tin.tung@intel.com> | 2010-03-09 16:50:40 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2010-04-21 18:46:40 -0400 |
commit | ce6e74f23d8018f50609f694b6177c139486ebe5 (patch) | |
tree | 5d7f07be071eae07a1c047f8f0ba322a44abd8db /drivers/infiniband | |
parent | 0eddb519b9127c73d53db4bf3ec1d45b13f844d1 (diff) |
RDMA/nes: Make nesadapter->phy_lock usage consistent
nes_{read,write}_1G_phy_reg() are using phy_lock while
nes_{read,write}_10G_phy_reg() leave that to the caller.
Remove phy_lock from 1G routines and leave the locking to the caller.
Add additional phy_lock calls around 1G read/write.
Signed-off-by: Chien Tung <chien.tin.tung@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 8 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_nic.c | 16 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_utils.c | 10 |
3 files changed, 14 insertions, 20 deletions
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index c36a3f51492..8b67207c707 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -2458,7 +2458,6 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) | |||
2458 | return; | 2458 | return; |
2459 | } | 2459 | } |
2460 | nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_INTERRUPT; | 2460 | nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_INTERRUPT; |
2461 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | ||
2462 | 2461 | ||
2463 | /* ack the MAC interrupt */ | 2462 | /* ack the MAC interrupt */ |
2464 | mac_status = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (mac_index * 0x200)); | 2463 | mac_status = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (mac_index * 0x200)); |
@@ -2469,11 +2468,9 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) | |||
2469 | 2468 | ||
2470 | if (mac_status & (NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT)) { | 2469 | if (mac_status & (NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT)) { |
2471 | nesdev->link_status_interrupts++; | 2470 | nesdev->link_status_interrupts++; |
2472 | if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS))) { | 2471 | if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS))) |
2473 | spin_lock_irqsave(&nesadapter->phy_lock, flags); | ||
2474 | nes_reset_link(nesdev, mac_index); | 2472 | nes_reset_link(nesdev, mac_index); |
2475 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | 2473 | |
2476 | } | ||
2477 | /* read the PHY interrupt status register */ | 2474 | /* read the PHY interrupt status register */ |
2478 | if ((nesadapter->OneG_Mode) && | 2475 | if ((nesadapter->OneG_Mode) && |
2479 | (nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) { | 2476 | (nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) { |
@@ -2587,6 +2584,7 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number) | |||
2587 | break; | 2584 | break; |
2588 | } | 2585 | } |
2589 | } | 2586 | } |
2587 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | ||
2590 | 2588 | ||
2591 | if (phy_data & 0x0004) { | 2589 | if (phy_data & 0x0004) { |
2592 | if (wide_ppm_offset && | 2590 | if (wide_ppm_offset && |
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index b7c813f4be4..9f4cadf9f85 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c | |||
@@ -1461,11 +1461,14 @@ static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd | |||
1461 | et_cmd->transceiver = XCVR_INTERNAL; | 1461 | et_cmd->transceiver = XCVR_INTERNAL; |
1462 | et_cmd->phy_address = mac_index; | 1462 | et_cmd->phy_address = mac_index; |
1463 | } else { | 1463 | } else { |
1464 | unsigned long flags; | ||
1464 | et_cmd->supported = SUPPORTED_1000baseT_Full | 1465 | et_cmd->supported = SUPPORTED_1000baseT_Full |
1465 | | SUPPORTED_Autoneg; | 1466 | | SUPPORTED_Autoneg; |
1466 | et_cmd->advertising = ADVERTISED_1000baseT_Full | 1467 | et_cmd->advertising = ADVERTISED_1000baseT_Full |
1467 | | ADVERTISED_Autoneg; | 1468 | | ADVERTISED_Autoneg; |
1469 | spin_lock_irqsave(&nesadapter->phy_lock, flags); | ||
1468 | nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); | 1470 | nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); |
1471 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | ||
1469 | if (phy_data & 0x1000) | 1472 | if (phy_data & 0x1000) |
1470 | et_cmd->autoneg = AUTONEG_ENABLE; | 1473 | et_cmd->autoneg = AUTONEG_ENABLE; |
1471 | else | 1474 | else |
@@ -1503,12 +1506,15 @@ static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd | |||
1503 | struct nes_vnic *nesvnic = netdev_priv(netdev); | 1506 | struct nes_vnic *nesvnic = netdev_priv(netdev); |
1504 | struct nes_device *nesdev = nesvnic->nesdev; | 1507 | struct nes_device *nesdev = nesvnic->nesdev; |
1505 | struct nes_adapter *nesadapter = nesdev->nesadapter; | 1508 | struct nes_adapter *nesadapter = nesdev->nesadapter; |
1506 | u16 phy_data; | ||
1507 | 1509 | ||
1508 | if ((nesadapter->OneG_Mode) && | 1510 | if ((nesadapter->OneG_Mode) && |
1509 | (nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) { | 1511 | (nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) { |
1510 | nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index], | 1512 | unsigned long flags; |
1511 | &phy_data); | 1513 | u16 phy_data; |
1514 | u8 phy_index = nesadapter->phy_index[nesdev->mac_index]; | ||
1515 | |||
1516 | spin_lock_irqsave(&nesadapter->phy_lock, flags); | ||
1517 | nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data); | ||
1512 | if (et_cmd->autoneg) { | 1518 | if (et_cmd->autoneg) { |
1513 | /* Turn on Full duplex, Autoneg, and restart autonegotiation */ | 1519 | /* Turn on Full duplex, Autoneg, and restart autonegotiation */ |
1514 | phy_data |= 0x1300; | 1520 | phy_data |= 0x1300; |
@@ -1516,8 +1522,8 @@ static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd | |||
1516 | /* Turn off autoneg */ | 1522 | /* Turn off autoneg */ |
1517 | phy_data &= ~0x1000; | 1523 | phy_data &= ~0x1000; |
1518 | } | 1524 | } |
1519 | nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index], | 1525 | nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data); |
1520 | phy_data); | 1526 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); |
1521 | } | 1527 | } |
1522 | 1528 | ||
1523 | return 0; | 1529 | return 0; |
diff --git a/drivers/infiniband/hw/nes/nes_utils.c b/drivers/infiniband/hw/nes/nes_utils.c index 186623d8695..a9f5dd272f1 100644 --- a/drivers/infiniband/hw/nes/nes_utils.c +++ b/drivers/infiniband/hw/nes/nes_utils.c | |||
@@ -381,12 +381,8 @@ static u16 nes_read16_eeprom(void __iomem *addr, u16 offset) | |||
381 | */ | 381 | */ |
382 | void nes_write_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 data) | 382 | void nes_write_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 data) |
383 | { | 383 | { |
384 | struct nes_adapter *nesadapter = nesdev->nesadapter; | ||
385 | u32 u32temp; | 384 | u32 u32temp; |
386 | u32 counter; | 385 | u32 counter; |
387 | unsigned long flags; | ||
388 | |||
389 | spin_lock_irqsave(&nesadapter->phy_lock, flags); | ||
390 | 386 | ||
391 | nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL, | 387 | nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL, |
392 | 0x50020000 | data | ((u32)phy_reg << 18) | ((u32)phy_addr << 23)); | 388 | 0x50020000 | data | ((u32)phy_reg << 18) | ((u32)phy_addr << 23)); |
@@ -402,8 +398,6 @@ void nes_write_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u1 | |||
402 | if (!(u32temp & 1)) | 398 | if (!(u32temp & 1)) |
403 | nes_debug(NES_DBG_PHY, "Phy is not responding. interrupt status = 0x%X.\n", | 399 | nes_debug(NES_DBG_PHY, "Phy is not responding. interrupt status = 0x%X.\n", |
404 | u32temp); | 400 | u32temp); |
405 | |||
406 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | ||
407 | } | 401 | } |
408 | 402 | ||
409 | 403 | ||
@@ -414,14 +408,11 @@ void nes_write_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u1 | |||
414 | */ | 408 | */ |
415 | void nes_read_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 *data) | 409 | void nes_read_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 *data) |
416 | { | 410 | { |
417 | struct nes_adapter *nesadapter = nesdev->nesadapter; | ||
418 | u32 u32temp; | 411 | u32 u32temp; |
419 | u32 counter; | 412 | u32 counter; |
420 | unsigned long flags; | ||
421 | 413 | ||
422 | /* nes_debug(NES_DBG_PHY, "phy addr = %d, mac_index = %d\n", | 414 | /* nes_debug(NES_DBG_PHY, "phy addr = %d, mac_index = %d\n", |
423 | phy_addr, nesdev->mac_index); */ | 415 | phy_addr, nesdev->mac_index); */ |
424 | spin_lock_irqsave(&nesadapter->phy_lock, flags); | ||
425 | 416 | ||
426 | nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL, | 417 | nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL, |
427 | 0x60020000 | ((u32)phy_reg << 18) | ((u32)phy_addr << 23)); | 418 | 0x60020000 | ((u32)phy_reg << 18) | ((u32)phy_addr << 23)); |
@@ -441,7 +432,6 @@ void nes_read_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 | |||
441 | } else { | 432 | } else { |
442 | *data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); | 433 | *data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL); |
443 | } | 434 | } |
444 | spin_unlock_irqrestore(&nesadapter->phy_lock, flags); | ||
445 | } | 435 | } |
446 | 436 | ||
447 | 437 | ||