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: Ron Mercer <ron.mercer@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5ee22a5aa9
commit
86aaf9ad82
@ -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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
spin_unlock(&qdev->hw_lock);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&qdev->mpi_mutex);
|
rtnl_unlock();
|
||||||
ql_enable_completion_interrupt(qdev, 0);
|
ql_enable_completion_interrupt(qdev, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user