qed: Acquire/release ptt_ptp lock when enabling/disabling PTP.
authorsudarsana.kalluru@cavium.com <sudarsana.kalluru@cavium.com>
Wed, 26 Apr 2017 16:00:53 +0000 (09:00 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 27 Apr 2017 20:51:34 +0000 (16:51 -0400)
Move the code for acquiring/releasing ptt_ptp lock to ptp specific
implementations i.e., ptp_enable()/disable() respectively.

Signed-off-by: Sudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com>
Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed.h
drivers/net/ethernet/qlogic/qed/qed_main.c
drivers/net/ethernet/qlogic/qed/qed_ptp.c

index 3f8d07bddf4dd045fba8bcfe9325b64f9b5f65c6..c07191cb76313adf45603b922da7fc91fdd709b5 100644 (file)
@@ -474,6 +474,11 @@ struct qed_hwfn {
        struct qed_ptt                  *p_main_ptt;
        struct qed_ptt                  *p_dpc_ptt;
 
+       /* PTP will be used only by the leading function.
+        * Usage of all PTP-apis should be synchronized as result.
+        */
+       struct qed_ptt *p_ptp_ptt;
+
        struct qed_sb_sp_info           *p_sp_sb;
        struct qed_sb_attn_info         *p_sb_attn;
 
@@ -532,8 +537,6 @@ struct qed_hwfn {
 
        struct qed_ptt *p_arfs_ptt;
 
-       /* p_ptp_ptt is valid for leading HWFN only */
-       struct qed_ptt *p_ptp_ptt;
        struct qed_simd_fp_handler      simd_proto_handler[64];
 
 #ifdef CONFIG_QED_SRIOV
index a919260b68f2b67f7cc3cc916e559e08e1f88ef7..8a5a0649fc4ac0ef77396c6cade94bffbd41b272 100644 (file)
@@ -956,13 +956,6 @@ static int qed_slowpath_start(struct qed_dev *cdev,
                        }
                }
 #endif
-               p_ptt = qed_ptt_acquire(QED_LEADING_HWFN(cdev));
-               if (p_ptt) {
-                       QED_LEADING_HWFN(cdev)->p_ptp_ptt = p_ptt;
-               } else {
-                       DP_NOTICE(cdev, "Failed to acquire PTT for PTP\n");
-                       goto err;
-               }
        }
 
        cdev->rx_coalesce_usecs = QED_DEFAULT_RX_USECS;
@@ -1076,9 +1069,6 @@ err:
                qed_ptt_release(QED_LEADING_HWFN(cdev),
                                QED_LEADING_HWFN(cdev)->p_arfs_ptt);
 #endif
-       if (IS_PF(cdev) && QED_LEADING_HWFN(cdev)->p_ptp_ptt)
-               qed_ptt_release(QED_LEADING_HWFN(cdev),
-                               QED_LEADING_HWFN(cdev)->p_ptp_ptt);
 
        qed_iov_wq_stop(cdev, false);
 
@@ -1098,8 +1088,6 @@ static int qed_slowpath_stop(struct qed_dev *cdev)
                        qed_ptt_release(QED_LEADING_HWFN(cdev),
                                        QED_LEADING_HWFN(cdev)->p_arfs_ptt);
 #endif
-               qed_ptt_release(QED_LEADING_HWFN(cdev),
-                               QED_LEADING_HWFN(cdev)->p_ptp_ptt);
                qed_free_stream_mem(cdev);
                if (IS_QED_ETH_IF(cdev))
                        qed_sriov_disable(cdev, true);
index c0a3cbdfadfab646b4e762ba4091bbe8e5ee704b..1871ebfdb793f5064cd0cbaf28953635908306ec 100644 (file)
@@ -324,13 +324,23 @@ static int qed_ptp_hw_adjfreq(struct qed_dev *cdev, s32 ppb)
 static int qed_ptp_hw_enable(struct qed_dev *cdev)
 {
        struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev);
-       struct qed_ptt *p_ptt = p_hwfn->p_ptp_ptt;
+       struct qed_ptt *p_ptt;
        int rc;
 
+       p_ptt = qed_ptt_acquire(p_hwfn);
+       if (!p_ptt) {
+               DP_NOTICE(p_hwfn, "Failed to acquire PTT for PTP\n");
+               return -EBUSY;
+       }
+
+       p_hwfn->p_ptp_ptt = p_ptt;
+
        rc = qed_ptp_res_lock(p_hwfn, p_ptt);
        if (rc) {
                DP_INFO(p_hwfn,
                        "Couldn't acquire the resource lock, skip ptp enable for this PF\n");
+               qed_ptt_release(p_hwfn, p_ptt);
+               p_hwfn->p_ptp_ptt = NULL;
                return rc;
        }
 
@@ -402,6 +412,9 @@ static int qed_ptp_hw_disable(struct qed_dev *cdev)
        qed_wr(p_hwfn, p_ptt, NIG_REG_RX_PTP_EN, 0x0);
        qed_wr(p_hwfn, p_ptt, NIG_REG_TX_PTP_EN, 0x0);
 
+       qed_ptt_release(p_hwfn, p_ptt);
+       p_hwfn->p_ptp_ptt = NULL;
+
        return 0;
 }