diff options
author | Tatyana Nikolova <Tatyana.E.Nikolova@intel.com> | 2012-12-06 14:58:27 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-12-08 03:31:02 -0500 |
commit | 7bfcfa51c35cdd2d37e0d70fc11790642dd11fb3 (patch) | |
tree | 5f14eb0d107f2f4a0730144637d07c8f42c76deb /drivers/infiniband | |
parent | 00ad255d17c2d12a035370836cb93630711d48ca (diff) |
RDMA/nes: Fix for terminate timer crash
The terminate timer needs to be initialized just once.
Signed-off-by: Tatyana Nikolova <Tatyana.E.Nikolova@intel.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/nes/nes.h | 1 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 9 | ||||
-rw-r--r-- | drivers/infiniband/hw/nes/nes_verbs.c | 4 |
3 files changed, 6 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index 5cac29e6bc1c..33cc58941a3e 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h | |||
@@ -532,6 +532,7 @@ void nes_iwarp_ce_handler(struct nes_device *, struct nes_hw_cq *); | |||
532 | int nes_destroy_cqp(struct nes_device *); | 532 | int nes_destroy_cqp(struct nes_device *); |
533 | int nes_nic_cm_xmit(struct sk_buff *, struct net_device *); | 533 | int nes_nic_cm_xmit(struct sk_buff *, struct net_device *); |
534 | void nes_recheck_link_status(struct work_struct *work); | 534 | void nes_recheck_link_status(struct work_struct *work); |
535 | void nes_terminate_timeout(unsigned long context); | ||
535 | 536 | ||
536 | /* nes_nic.c */ | 537 | /* nes_nic.c */ |
537 | struct net_device *nes_netdev_init(struct nes_device *, void __iomem *); | 538 | struct net_device *nes_netdev_init(struct nes_device *, void __iomem *); |
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index fe7965ee4096..67647e264611 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -75,7 +75,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev, | |||
75 | static void process_critical_error(struct nes_device *nesdev); | 75 | static void process_critical_error(struct nes_device *nesdev); |
76 | static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number); | 76 | static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number); |
77 | static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode); | 77 | static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode); |
78 | static void nes_terminate_timeout(unsigned long context); | ||
79 | static void nes_terminate_start_timer(struct nes_qp *nesqp); | 78 | static void nes_terminate_start_timer(struct nes_qp *nesqp); |
80 | 79 | ||
81 | #ifdef CONFIG_INFINIBAND_NES_DEBUG | 80 | #ifdef CONFIG_INFINIBAND_NES_DEBUG |
@@ -3520,7 +3519,7 @@ static void nes_terminate_received(struct nes_device *nesdev, | |||
3520 | } | 3519 | } |
3521 | 3520 | ||
3522 | /* Timeout routine in case terminate fails to complete */ | 3521 | /* Timeout routine in case terminate fails to complete */ |
3523 | static void nes_terminate_timeout(unsigned long context) | 3522 | void nes_terminate_timeout(unsigned long context) |
3524 | { | 3523 | { |
3525 | struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context; | 3524 | struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context; |
3526 | 3525 | ||
@@ -3530,11 +3529,7 @@ static void nes_terminate_timeout(unsigned long context) | |||
3530 | /* Set a timer in case hw cannot complete the terminate sequence */ | 3529 | /* Set a timer in case hw cannot complete the terminate sequence */ |
3531 | static void nes_terminate_start_timer(struct nes_qp *nesqp) | 3530 | static void nes_terminate_start_timer(struct nes_qp *nesqp) |
3532 | { | 3531 | { |
3533 | init_timer(&nesqp->terminate_timer); | 3532 | mod_timer(&nesqp->terminate_timer, (jiffies + HZ)); |
3534 | nesqp->terminate_timer.function = nes_terminate_timeout; | ||
3535 | nesqp->terminate_timer.expires = jiffies + HZ; | ||
3536 | nesqp->terminate_timer.data = (unsigned long)nesqp; | ||
3537 | add_timer(&nesqp->terminate_timer); | ||
3538 | } | 3533 | } |
3539 | 3534 | ||
3540 | /** | 3535 | /** |
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index cd0ecb215cca..c47ec2599bc9 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c | |||
@@ -1404,6 +1404,9 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | |||
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | nesqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR); | 1406 | nesqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR); |
1407 | init_timer(&nesqp->terminate_timer); | ||
1408 | nesqp->terminate_timer.function = nes_terminate_timeout; | ||
1409 | nesqp->terminate_timer.data = (unsigned long)nesqp; | ||
1407 | 1410 | ||
1408 | /* update the QP table */ | 1411 | /* update the QP table */ |
1409 | nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp; | 1412 | nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp; |
@@ -1413,7 +1416,6 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | |||
1413 | return &nesqp->ibqp; | 1416 | return &nesqp->ibqp; |
1414 | } | 1417 | } |
1415 | 1418 | ||
1416 | |||
1417 | /** | 1419 | /** |
1418 | * nes_clean_cq | 1420 | * nes_clean_cq |
1419 | */ | 1421 | */ |