diff options
author | Ming Lei <ming.lei@canonical.com> | 2013-02-21 22:05:03 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-02-25 15:49:51 -0500 |
commit | 7643721471117d5f62ca36f328d3dc8d84af4402 (patch) | |
tree | ed2b949b490332f95c6f802ad1a45b1ea6ba6f8a /drivers | |
parent | 70a737b795d1d2fa0c1b54b8b7870c86cedd03ac (diff) |
usbnet: smsc95xx: fix suspend failure
The three below functions:
smsc95xx_enter_suspend0()
smsc95xx_enter_suspend1()
smsc95xx_enter_suspend2()
return > 0 in case of success, so they will cause smsc95xx_suspend()
to return > 0 and cause suspend failure.
The bug is introduced in commit 3b9f7d(smsc95xx: fix error handling
in suspend failure case).
Cc: <stable@vger.kernel.org> [3.8]
Cc: Steve Glendinning <steve.glendinning@shawell.net>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/usb/smsc95xx.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index ff4fa37dfd1d..b2721bc87283 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -1247,10 +1247,12 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev) | |||
1247 | 1247 | ||
1248 | /* read back PM_CTRL */ | 1248 | /* read back PM_CTRL */ |
1249 | ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1249 | ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); |
1250 | if (ret < 0) | ||
1251 | return ret; | ||
1250 | 1252 | ||
1251 | pdata->suspend_flags |= SUSPEND_SUSPEND0; | 1253 | pdata->suspend_flags |= SUSPEND_SUSPEND0; |
1252 | 1254 | ||
1253 | return ret; | 1255 | return 0; |
1254 | } | 1256 | } |
1255 | 1257 | ||
1256 | static int smsc95xx_enter_suspend1(struct usbnet *dev) | 1258 | static int smsc95xx_enter_suspend1(struct usbnet *dev) |
@@ -1293,10 +1295,12 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev) | |||
1293 | val |= (PM_CTL_WUPS_ED_ | PM_CTL_ED_EN_); | 1295 | val |= (PM_CTL_WUPS_ED_ | PM_CTL_ED_EN_); |
1294 | 1296 | ||
1295 | ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1297 | ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); |
1298 | if (ret < 0) | ||
1299 | return ret; | ||
1296 | 1300 | ||
1297 | pdata->suspend_flags |= SUSPEND_SUSPEND1; | 1301 | pdata->suspend_flags |= SUSPEND_SUSPEND1; |
1298 | 1302 | ||
1299 | return ret; | 1303 | return 0; |
1300 | } | 1304 | } |
1301 | 1305 | ||
1302 | static int smsc95xx_enter_suspend2(struct usbnet *dev) | 1306 | static int smsc95xx_enter_suspend2(struct usbnet *dev) |
@@ -1313,10 +1317,12 @@ static int smsc95xx_enter_suspend2(struct usbnet *dev) | |||
1313 | val |= PM_CTL_SUS_MODE_2; | 1317 | val |= PM_CTL_SUS_MODE_2; |
1314 | 1318 | ||
1315 | ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1319 | ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); |
1320 | if (ret < 0) | ||
1321 | return ret; | ||
1316 | 1322 | ||
1317 | pdata->suspend_flags |= SUSPEND_SUSPEND2; | 1323 | pdata->suspend_flags |= SUSPEND_SUSPEND2; |
1318 | 1324 | ||
1319 | return ret; | 1325 | return 0; |
1320 | } | 1326 | } |
1321 | 1327 | ||
1322 | static int smsc95xx_enter_suspend3(struct usbnet *dev) | 1328 | static int smsc95xx_enter_suspend3(struct usbnet *dev) |