| From foo@baz Sat Jun 13 09:48:35 PDT 2015 |
| From: Richard Cochran <richardcochran@gmail.com> |
| Date: Mon, 25 May 2015 11:55:44 +0200 |
| Subject: net: dp83640: reinforce locking rules. |
| |
| From: Richard Cochran <richardcochran@gmail.com> |
| |
| [ Upstream commit a935865c828c8cd20501f618c69f659a5b6d6a5f ] |
| |
| Callers of the ext_write function are supposed to hold a mutex that |
| protects the state of the dialed page, but one caller was missing the |
| lock from the very start, and over time the code has been changed |
| without following the rule. This patch cleans up the call sites in |
| violation of the rule. |
| |
| Signed-off-by: Richard Cochran <richardcochran@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/phy/dp83640.c | 17 ++++++++++++++++- |
| 1 file changed, 16 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/phy/dp83640.c |
| +++ b/drivers/net/phy/dp83640.c |
| @@ -495,7 +495,9 @@ static int ptp_dp83640_enable(struct ptp |
| else |
| evnt |= EVNT_RISE; |
| } |
| + mutex_lock(&clock->extreg_lock); |
| ext_write(0, phydev, PAGE5, PTP_EVNT, evnt); |
| + mutex_unlock(&clock->extreg_lock); |
| return 0; |
| |
| case PTP_CLK_REQ_PEROUT: |
| @@ -531,6 +533,8 @@ static u8 status_frame_src[6] = { 0x08, |
| |
| static void enable_status_frames(struct phy_device *phydev, bool on) |
| { |
| + struct dp83640_private *dp83640 = phydev->priv; |
| + struct dp83640_clock *clock = dp83640->clock; |
| u16 cfg0 = 0, ver; |
| |
| if (on) |
| @@ -538,9 +542,13 @@ static void enable_status_frames(struct |
| |
| ver = (PSF_PTPVER & VERSIONPTP_MASK) << VERSIONPTP_SHIFT; |
| |
| + mutex_lock(&clock->extreg_lock); |
| + |
| ext_write(0, phydev, PAGE5, PSF_CFG0, cfg0); |
| ext_write(0, phydev, PAGE6, PSF_CFG1, ver); |
| |
| + mutex_unlock(&clock->extreg_lock); |
| + |
| if (!phydev->attached_dev) { |
| pr_warn("expected to find an attached netdevice\n"); |
| return; |
| @@ -1172,11 +1180,18 @@ static int dp83640_config_init(struct ph |
| |
| if (clock->chosen && !list_empty(&clock->phylist)) |
| recalibrate(clock); |
| - else |
| + else { |
| + mutex_lock(&clock->extreg_lock); |
| enable_broadcast(phydev, clock->page, 1); |
| + mutex_unlock(&clock->extreg_lock); |
| + } |
| |
| enable_status_frames(phydev, true); |
| + |
| + mutex_lock(&clock->extreg_lock); |
| ext_write(0, phydev, PAGE4, PTP_CTL, PTP_ENABLE); |
| + mutex_unlock(&clock->extreg_lock); |
| + |
| return 0; |
| } |
| |