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>
This commit is contained in:
parent
0eddb519b9
commit
ce6e74f23d
3 changed files with 14 additions and 20 deletions
|
@ -2458,7 +2458,6 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_INTERRUPT;
|
nesadapter->mac_sw_state[mac_number] = NES_MAC_SW_INTERRUPT;
|
||||||
spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
|
|
||||||
|
|
||||||
/* ack the MAC interrupt */
|
/* ack the MAC interrupt */
|
||||||
mac_status = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (mac_index * 0x200));
|
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)) {
|
if (mac_status & (NES_MAC_INT_LINK_STAT_CHG | NES_MAC_INT_XGMII_EXT)) {
|
||||||
nesdev->link_status_interrupts++;
|
nesdev->link_status_interrupts++;
|
||||||
if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS))) {
|
if (0 == (++nesadapter->link_interrupt_count[mac_index] % ((u16)NES_MAX_LINK_INTERRUPTS)))
|
||||||
spin_lock_irqsave(&nesadapter->phy_lock, flags);
|
|
||||||
nes_reset_link(nesdev, mac_index);
|
nes_reset_link(nesdev, mac_index);
|
||||||
spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
|
|
||||||
}
|
|
||||||
/* read the PHY interrupt status register */
|
/* read the PHY interrupt status register */
|
||||||
if ((nesadapter->OneG_Mode) &&
|
if ((nesadapter->OneG_Mode) &&
|
||||||
(nesadapter->phy_type[mac_index] != NES_PHY_TYPE_PUMA_1G)) {
|
(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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
|
||||||
|
|
||||||
if (phy_data & 0x0004) {
|
if (phy_data & 0x0004) {
|
||||||
if (wide_ppm_offset &&
|
if (wide_ppm_offset &&
|
||||||
|
|
|
@ -1461,11 +1461,14 @@ static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd
|
||||||
et_cmd->transceiver = XCVR_INTERNAL;
|
et_cmd->transceiver = XCVR_INTERNAL;
|
||||||
et_cmd->phy_address = mac_index;
|
et_cmd->phy_address = mac_index;
|
||||||
} else {
|
} else {
|
||||||
|
unsigned long flags;
|
||||||
et_cmd->supported = SUPPORTED_1000baseT_Full
|
et_cmd->supported = SUPPORTED_1000baseT_Full
|
||||||
| SUPPORTED_Autoneg;
|
| SUPPORTED_Autoneg;
|
||||||
et_cmd->advertising = ADVERTISED_1000baseT_Full
|
et_cmd->advertising = ADVERTISED_1000baseT_Full
|
||||||
| ADVERTISED_Autoneg;
|
| ADVERTISED_Autoneg;
|
||||||
|
spin_lock_irqsave(&nesadapter->phy_lock, flags);
|
||||||
nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
|
nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
|
||||||
|
spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
|
||||||
if (phy_data & 0x1000)
|
if (phy_data & 0x1000)
|
||||||
et_cmd->autoneg = AUTONEG_ENABLE;
|
et_cmd->autoneg = AUTONEG_ENABLE;
|
||||||
else
|
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_vnic *nesvnic = netdev_priv(netdev);
|
||||||
struct nes_device *nesdev = nesvnic->nesdev;
|
struct nes_device *nesdev = nesvnic->nesdev;
|
||||||
struct nes_adapter *nesadapter = nesdev->nesadapter;
|
struct nes_adapter *nesadapter = nesdev->nesadapter;
|
||||||
u16 phy_data;
|
|
||||||
|
|
||||||
if ((nesadapter->OneG_Mode) &&
|
if ((nesadapter->OneG_Mode) &&
|
||||||
(nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) {
|
(nesadapter->phy_type[nesdev->mac_index] != NES_PHY_TYPE_PUMA_1G)) {
|
||||||
nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index],
|
unsigned long flags;
|
||||||
&phy_data);
|
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) {
|
if (et_cmd->autoneg) {
|
||||||
/* Turn on Full duplex, Autoneg, and restart autonegotiation */
|
/* Turn on Full duplex, Autoneg, and restart autonegotiation */
|
||||||
phy_data |= 0x1300;
|
phy_data |= 0x1300;
|
||||||
|
@ -1516,8 +1522,8 @@ static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd
|
||||||
/* Turn off autoneg */
|
/* Turn off autoneg */
|
||||||
phy_data &= ~0x1000;
|
phy_data &= ~0x1000;
|
||||||
}
|
}
|
||||||
nes_write_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index],
|
nes_write_1G_phy_reg(nesdev, 0, phy_index, phy_data);
|
||||||
phy_data);
|
spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -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)
|
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 u32temp;
|
||||||
u32 counter;
|
u32 counter;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&nesadapter->phy_lock, flags);
|
|
||||||
|
|
||||||
nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL,
|
nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL,
|
||||||
0x50020000 | data | ((u32)phy_reg << 18) | ((u32)phy_addr << 23));
|
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))
|
if (!(u32temp & 1))
|
||||||
nes_debug(NES_DBG_PHY, "Phy is not responding. interrupt status = 0x%X.\n",
|
nes_debug(NES_DBG_PHY, "Phy is not responding. interrupt status = 0x%X.\n",
|
||||||
u32temp);
|
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)
|
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 u32temp;
|
||||||
u32 counter;
|
u32 counter;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
/* nes_debug(NES_DBG_PHY, "phy addr = %d, mac_index = %d\n",
|
/* nes_debug(NES_DBG_PHY, "phy addr = %d, mac_index = %d\n",
|
||||||
phy_addr, nesdev->mac_index); */
|
phy_addr, nesdev->mac_index); */
|
||||||
spin_lock_irqsave(&nesadapter->phy_lock, flags);
|
|
||||||
|
|
||||||
nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL,
|
nes_write_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL,
|
||||||
0x60020000 | ((u32)phy_reg << 18) | ((u32)phy_addr << 23));
|
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 {
|
} else {
|
||||||
*data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
*data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue