RDMA/nes: Make nesadapter->phy_lock usage consistent
authorChien Tung <chien.tin.tung@intel.com>
Tue, 9 Mar 2010 21:50:40 +0000 (21:50 +0000)
committerRoland Dreier <rolandd@cisco.com>
Wed, 21 Apr 2010 22:46:40 +0000 (15:46 -0700)
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>
drivers/infiniband/hw/nes/nes_hw.c
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/hw/nes/nes_utils.c

index c36a3f5..8b67207 100644 (file)
@@ -2458,7 +2458,6 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
                return;
        }
        nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_INTERRUPT;
-       spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
 
        /* ack the MAC interrupt */
        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)
 
        if (mac_status & (NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT)) {
                nesdev->link_status_interrupts++;
-               if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS))) {
-                       spin_lock_irqsave(&nesadapter->phy_lock, flags);
+               if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS)))
                        nes_reset_link(nesdev, mac_index);
-                       spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
-               }
+
                /* read the PHY interrupt status register */
                if ((nesadapter->OneG_Mode) &&
                (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)
                                break;
                        }
                }
+               spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
 
                if (phy_data & 0x0004) {
                        if (wide_ppm_offset &&
index b7c813f..9f4cadf 100644 (file)
@@ -1461,11 +1461,14 @@ static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd
                        et_cmd->transceiver = XCVR_INTERNAL;
                        et_cmd->phy_address = mac_index;
                } else {
+                       unsigned long flags;
                        et_cmd->supported   = SUPPORTED_1000baseT_Full
                                            | SUPPORTED_Autoneg;
                        et_cmd->advertising = ADVERTISED_1000baseT_Full
                                            | ADVERTISED_Autoneg;
+                       spin_lock_irqsave(&nesadapter->phy_lock, flags);
                        nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
+                       spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
                        if (phy_data & 0x1000)
                                et_cmd->autoneg = AUTONEG_ENABLE;
                        else
@@ -1503,12 +1506,15 @@ static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd
        struct nes_vnic *nesvnic = netdev_priv(netdev);
        struct nes_device *nesdev = nesvnic->nesdev;
        struct nes_adapter *nesadapter = nesdev->nesadapter;
-       u16 phy_data;
 
        if ((nesadapter->OneG_Mode) &&
            (nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) {
-               nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index],
-                               &phy_data);
+               unsigned long flags;
+               u16 phy_data;
+               u8 phy_index = nesadapter->phy_index[nesdev->mac_index];
+
+               spin_lock_irqsave(&nesadapter->phy_lock, flags);
+               nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
                if (et_cmd->autoneg) {
                        /* Turn on Full duplex, Autoneg, and restart autonegotiation */
                        phy_data |= 0x1300;
@@ -1516,8 +1522,8 @@ static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd
                        /* Turn off autoneg */
                        phy_data &= ~0x1000;
                }
-               nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index],
-                               phy_data);
+               nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data);
+               spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
        }
 
        return 0;
index 186623d..a9f5dd2 100644 (file)
@@ -381,12 +381,8 @@ static u16 nes_read16_eeprom(void __iomem *addr, u16 offset)
  */
 void nes_write_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 data)
 {
-       struct nes_adapter *nesadapter = nesdev->nesadapter;
        u32 u32temp;
        u32 counter;
-       unsigned long flags;
-
-       spin_lock_irqsave(&nesadapter->phy_lock, flags);
 
        nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL,
                        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
        if (!(u32temp & 1))
                nes_debug(NES_DBG_PHY, "Phy is not responding. interrupt status = 0x%X.\n",
                                u32temp);
-
-       spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
 }
 
 
@@ -414,14 +408,11 @@ void nes_write_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u1
  */
 void nes_read_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16 *data)
 {
-       struct nes_adapter *nesadapter = nesdev->nesadapter;
        u32 u32temp;
        u32 counter;
-       unsigned long flags;
 
        /* nes_debug(NES_DBG_PHY, "phy addr = %d, mac_index = %d\n",
                        phy_addr, nesdev->mac_index); */
-       spin_lock_irqsave(&nesadapter->phy_lock, flags);
 
        nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL,
                        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
        } else {
                *data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
        }
-       spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
 }