Commit 86aaf9ad authored by Ron Mercer's avatar Ron Mercer Committed by David S. Miller

qlge: Fix lock/mutex warnings.

Get rid of spinlock and private mutex usage for exclusive access to the
HW semaphore register.  rtnl_lock already creates exclusive access to
this register in all driver API.
Add rtnl to firmware worker threads that also use the HW semaphore register.
Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5ee22a5a
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/rtnetlink.h>
/* /*
* General definitions... * General definitions...
...@@ -1477,7 +1478,6 @@ struct ql_adapter { ...@@ -1477,7 +1478,6 @@ struct ql_adapter {
u32 mailbox_in; u32 mailbox_in;
u32 mailbox_out; u32 mailbox_out;
struct mbox_params idc_mbc; struct mbox_params idc_mbc;
struct mutex mpi_mutex;
int tx_ring_size; int tx_ring_size;
int rx_ring_size; int rx_ring_size;
......
...@@ -45,7 +45,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) ...@@ -45,7 +45,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
if (!netif_running(qdev->ndev)) if (!netif_running(qdev->ndev))
return status; return status;
spin_lock(&qdev->hw_lock);
/* Skip the default queue, and update the outbound handler /* Skip the default queue, and update the outbound handler
* queues if they changed. * queues if they changed.
*/ */
...@@ -92,7 +91,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev) ...@@ -92,7 +91,6 @@ static int ql_update_ring_coalescing(struct ql_adapter *qdev)
} }
} }
exit: exit:
spin_unlock(&qdev->hw_lock);
return status; return status;
} }
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/rtnetlink.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mm.h> #include <linux/mm.h>
...@@ -1926,12 +1925,10 @@ static void ql_vlan_rx_add_vid(struct net_device *ndev, u16 vid) ...@@ -1926,12 +1925,10 @@ static void ql_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
if (status) if (status)
return; return;
spin_lock(&qdev->hw_lock);
if (ql_set_mac_addr_reg if (ql_set_mac_addr_reg
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n"); QPRINTK(qdev, IFUP, ERR, "Failed to init vlan address.\n");
} }
spin_unlock(&qdev->hw_lock);
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
} }
...@@ -1945,12 +1942,10 @@ static void ql_vlan_rx_kill_vid(struct net_device *ndev, u16 vid) ...@@ -1945,12 +1942,10 @@ static void ql_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
if (status) if (status)
return; return;
spin_lock(&qdev->hw_lock);
if (ql_set_mac_addr_reg if (ql_set_mac_addr_reg
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { (qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) {
QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n"); QPRINTK(qdev, IFUP, ERR, "Failed to clear vlan address.\n");
} }
spin_unlock(&qdev->hw_lock);
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
} }
...@@ -3587,7 +3582,6 @@ static void qlge_set_multicast_list(struct net_device *ndev) ...@@ -3587,7 +3582,6 @@ static void qlge_set_multicast_list(struct net_device *ndev)
status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK); status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
if (status) if (status)
return; return;
spin_lock(&qdev->hw_lock);
/* /*
* Set or clear promiscuous mode if a * Set or clear promiscuous mode if a
* transition is taking place. * transition is taking place.
...@@ -3664,7 +3658,6 @@ static void qlge_set_multicast_list(struct net_device *ndev) ...@@ -3664,7 +3658,6 @@ static void qlge_set_multicast_list(struct net_device *ndev)
} }
} }
exit: exit:
spin_unlock(&qdev->hw_lock);
ql_sem_unlock(qdev, SEM_RT_IDX_MASK); ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
} }
...@@ -3684,10 +3677,8 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p) ...@@ -3684,10 +3677,8 @@ static int qlge_set_mac_address(struct net_device *ndev, void *p)
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
if (status) if (status)
return status; return status;
spin_lock(&qdev->hw_lock);
status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr, status = ql_set_mac_addr_reg(qdev, (u8 *) ndev->dev_addr,
MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ); MAC_ADDR_TYPE_CAM_MAC, qdev->func * MAX_CQ);
spin_unlock(&qdev->hw_lock);
if (status) if (status)
QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n"); QPRINTK(qdev, HW, ERR, "Failed to load MAC address.\n");
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
...@@ -3930,7 +3921,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev, ...@@ -3930,7 +3921,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work); INIT_DELAYED_WORK(&qdev->mpi_work, ql_mpi_work);
INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work); INIT_DELAYED_WORK(&qdev->mpi_port_cfg_work, ql_mpi_port_cfg_work);
INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work); INIT_DELAYED_WORK(&qdev->mpi_idc_work, ql_mpi_idc_work);
mutex_init(&qdev->mpi_mutex);
init_completion(&qdev->ide_completion); init_completion(&qdev->ide_completion);
if (!cards_found) { if (!cards_found) {
......
...@@ -472,7 +472,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) ...@@ -472,7 +472,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
{ {
int status, count; int status, count;
mutex_lock(&qdev->mpi_mutex);
/* Begin polled mode for MPI */ /* Begin polled mode for MPI */
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
...@@ -541,7 +540,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) ...@@ -541,7 +540,6 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
status = -EIO; status = -EIO;
} }
end: end:
mutex_unlock(&qdev->mpi_mutex);
/* End polled mode for MPI */ /* End polled mode for MPI */
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI); ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
return status; return status;
...@@ -776,7 +774,9 @@ static int ql_idc_wait(struct ql_adapter *qdev) ...@@ -776,7 +774,9 @@ static int ql_idc_wait(struct ql_adapter *qdev)
static int ql_set_port_cfg(struct ql_adapter *qdev) static int ql_set_port_cfg(struct ql_adapter *qdev)
{ {
int status; int status;
rtnl_lock();
status = ql_mb_set_port_cfg(qdev); status = ql_mb_set_port_cfg(qdev);
rtnl_unlock();
if (status) if (status)
return status; return status;
status = ql_idc_wait(qdev); status = ql_idc_wait(qdev);
...@@ -797,7 +797,9 @@ void ql_mpi_port_cfg_work(struct work_struct *work) ...@@ -797,7 +797,9 @@ void ql_mpi_port_cfg_work(struct work_struct *work)
container_of(work, struct ql_adapter, mpi_port_cfg_work.work); container_of(work, struct ql_adapter, mpi_port_cfg_work.work);
int status; int status;
rtnl_lock();
status = ql_mb_get_port_cfg(qdev); status = ql_mb_get_port_cfg(qdev);
rtnl_unlock();
if (status) { if (status) {
QPRINTK(qdev, DRV, ERR, QPRINTK(qdev, DRV, ERR,
"Bug: Failed to get port config data.\n"); "Bug: Failed to get port config data.\n");
...@@ -855,7 +857,9 @@ void ql_mpi_idc_work(struct work_struct *work) ...@@ -855,7 +857,9 @@ void ql_mpi_idc_work(struct work_struct *work)
* needs to be set. * needs to be set.
* */ * */
set_bit(QL_CAM_RT_SET, &qdev->flags); set_bit(QL_CAM_RT_SET, &qdev->flags);
rtnl_lock();
status = ql_mb_idc_ack(qdev); status = ql_mb_idc_ack(qdev);
rtnl_unlock();
if (status) { if (status) {
QPRINTK(qdev, DRV, ERR, QPRINTK(qdev, DRV, ERR,
"Bug: No pending IDC!\n"); "Bug: No pending IDC!\n");
...@@ -871,7 +875,7 @@ void ql_mpi_work(struct work_struct *work) ...@@ -871,7 +875,7 @@ void ql_mpi_work(struct work_struct *work)
struct mbox_params *mbcp = &mbc; struct mbox_params *mbcp = &mbc;
int err = 0; int err = 0;
mutex_lock(&qdev->mpi_mutex); rtnl_lock();
while (ql_read32(qdev, STS) & STS_PI) { while (ql_read32(qdev, STS) & STS_PI) {
memset(mbcp, 0, sizeof(struct mbox_params)); memset(mbcp, 0, sizeof(struct mbox_params));
...@@ -884,7 +888,7 @@ void ql_mpi_work(struct work_struct *work) ...@@ -884,7 +888,7 @@ void ql_mpi_work(struct work_struct *work)
break; break;
} }
mutex_unlock(&qdev->mpi_mutex); rtnl_unlock();
ql_enable_completion_interrupt(qdev, 0); ql_enable_completion_interrupt(qdev, 0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment