mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
bnxt_en: Prevent kernel panic when receiving unexpected PHC_UPDATE event
[ Upstream commit319a7827df] The firmware can send PHC_RTC_UPDATE async event on a PF that may not have PTP registered. In such a case, there will be a null pointer deference for bp->ptp_cfg when we try to handle the event. Fix it by not registering for this event with the firmware if !bp->ptp_cfg. Also, check that bp->ptp_cfg is valid before proceeding when we receive the event. Fixes:8bcf6f04d4("bnxt_en: Handle async event when the PHC is updated in RTC mode") Signed-off-by: Pavan Chebbi <pavan.chebbi@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5ce24936d5
commit
abc7062313
@@ -2389,6 +2389,9 @@ static int bnxt_async_event_process(struct bnxt *bp,
|
|||||||
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
|
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
|
||||||
u64 ns;
|
u64 ns;
|
||||||
|
|
||||||
|
if (!ptp)
|
||||||
|
goto async_event_process_exit;
|
||||||
|
|
||||||
spin_lock_bh(&ptp->ptp_lock);
|
spin_lock_bh(&ptp->ptp_lock);
|
||||||
bnxt_ptp_update_current_time(bp);
|
bnxt_ptp_update_current_time(bp);
|
||||||
ns = (((u64)BNXT_EVENT_PHC_RTC_UPDATE(data1) <<
|
ns = (((u64)BNXT_EVENT_PHC_RTC_UPDATE(data1) <<
|
||||||
@@ -4787,6 +4790,9 @@ int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp, unsigned long *bmap, int bmap_size,
|
|||||||
if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY &&
|
if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY &&
|
||||||
!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
|
!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
|
||||||
continue;
|
continue;
|
||||||
|
if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE &&
|
||||||
|
!bp->ptp_cfg)
|
||||||
|
continue;
|
||||||
__set_bit(bnxt_async_events_arr[i], async_events_bmap);
|
__set_bit(bnxt_async_events_arr[i], async_events_bmap);
|
||||||
}
|
}
|
||||||
if (bmap && bmap_size) {
|
if (bmap && bmap_size) {
|
||||||
|
|||||||
@@ -929,6 +929,7 @@ int bnxt_ptp_init(struct bnxt *bp, bool phc_cfg)
|
|||||||
} else {
|
} else {
|
||||||
bnxt_ptp_timecounter_init(bp, true);
|
bnxt_ptp_timecounter_init(bp, true);
|
||||||
}
|
}
|
||||||
|
bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, true);
|
||||||
|
|
||||||
ptp->ptp_info = bnxt_ptp_caps;
|
ptp->ptp_info = bnxt_ptp_caps;
|
||||||
if ((bp->fw_cap & BNXT_FW_CAP_PTP_PPS)) {
|
if ((bp->fw_cap & BNXT_FW_CAP_PTP_PPS)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user