qed: Acquire/release ptt_ptp lock when enabling/disabling PTP.

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>
This commit is contained in:
sudarsana.kalluru@cavium.com 2017-04-26 09:00:53 -07:00 committed by David S. Miller
parent 6a3ff0db13
commit d179bd1699
3 changed files with 19 additions and 15 deletions

View File

@ -474,6 +474,11 @@ struct qed_hwfn {
struct qed_ptt *p_main_ptt; struct qed_ptt *p_main_ptt;
struct qed_ptt *p_dpc_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_sp_info *p_sp_sb;
struct qed_sb_attn_info *p_sb_attn; struct qed_sb_attn_info *p_sb_attn;
@ -532,8 +537,6 @@ struct qed_hwfn {
struct qed_ptt *p_arfs_ptt; 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]; struct qed_simd_fp_handler simd_proto_handler[64];
#ifdef CONFIG_QED_SRIOV #ifdef CONFIG_QED_SRIOV

View File

@ -956,13 +956,6 @@ static int qed_slowpath_start(struct qed_dev *cdev,
} }
} }
#endif #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; cdev->rx_coalesce_usecs = QED_DEFAULT_RX_USECS;
@ -1076,9 +1069,6 @@ err:
qed_ptt_release(QED_LEADING_HWFN(cdev), qed_ptt_release(QED_LEADING_HWFN(cdev),
QED_LEADING_HWFN(cdev)->p_arfs_ptt); QED_LEADING_HWFN(cdev)->p_arfs_ptt);
#endif #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); 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_ptt_release(QED_LEADING_HWFN(cdev),
QED_LEADING_HWFN(cdev)->p_arfs_ptt); QED_LEADING_HWFN(cdev)->p_arfs_ptt);
#endif #endif
qed_ptt_release(QED_LEADING_HWFN(cdev),
QED_LEADING_HWFN(cdev)->p_ptp_ptt);
qed_free_stream_mem(cdev); qed_free_stream_mem(cdev);
if (IS_QED_ETH_IF(cdev)) if (IS_QED_ETH_IF(cdev))
qed_sriov_disable(cdev, true); qed_sriov_disable(cdev, true);

View 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) static int qed_ptp_hw_enable(struct qed_dev *cdev)
{ {
struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(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; 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); rc = qed_ptp_res_lock(p_hwfn, p_ptt);
if (rc) { if (rc) {
DP_INFO(p_hwfn, DP_INFO(p_hwfn,
"Couldn't acquire the resource lock, skip ptp enable for this PF\n"); "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; 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_RX_PTP_EN, 0x0);
qed_wr(p_hwfn, p_ptt, NIG_REG_TX_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; return 0;
} }