diff options
author | Steve Glendinning <steve.glendinning@shawell.net> | 2012-11-28 00:59:46 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-11-28 11:17:31 -0500 |
commit | 9deb2757b80fded37af33394d4d97e8341108525 (patch) | |
tree | ac387842229ea5fcc271bb85703c85082cee2b96 /drivers/net | |
parent | 33763b79a1a0c351b81817748d40160f25200ebd (diff) |
smsc75xx: refactor entering suspend modes
This patch splits out the logic for entering suspend modes
to separate functions, to reduce the complexity of the
smsc75xx_suspend function.
Signed-off-by: Steve Glendinning <steve.glendinning@shawell.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/usb/smsc75xx.c | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c index a36648bb1da..c26aeba1838 100644 --- a/drivers/net/usb/smsc75xx.c +++ b/drivers/net/usb/smsc75xx.c | |||
@@ -1214,6 +1214,42 @@ static int smsc75xx_write_wuff(struct usbnet *dev, int filter, u32 wuf_cfg, | |||
1214 | return 0; | 1214 | return 0; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | static int smsc75xx_enter_suspend0(struct usbnet *dev) | ||
1218 | { | ||
1219 | u32 val; | ||
1220 | int ret; | ||
1221 | |||
1222 | ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val); | ||
1223 | check_warn_return(ret, "Error reading PMT_CTL\n"); | ||
1224 | |||
1225 | val &= (~(PMT_CTL_SUS_MODE | PMT_CTL_PHY_RST)); | ||
1226 | val |= PMT_CTL_SUS_MODE_0 | PMT_CTL_WOL_EN | PMT_CTL_WUPS; | ||
1227 | |||
1228 | ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val); | ||
1229 | check_warn_return(ret, "Error writing PMT_CTL\n"); | ||
1230 | |||
1231 | smsc75xx_set_feature(dev, USB_DEVICE_REMOTE_WAKEUP); | ||
1232 | |||
1233 | return 0; | ||
1234 | } | ||
1235 | |||
1236 | static int smsc75xx_enter_suspend2(struct usbnet *dev) | ||
1237 | { | ||
1238 | u32 val; | ||
1239 | int ret; | ||
1240 | |||
1241 | ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val); | ||
1242 | check_warn_return(ret, "Error reading PMT_CTL\n"); | ||
1243 | |||
1244 | val &= ~(PMT_CTL_SUS_MODE | PMT_CTL_WUPS | PMT_CTL_PHY_RST); | ||
1245 | val |= PMT_CTL_SUS_MODE_2; | ||
1246 | |||
1247 | ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val); | ||
1248 | check_warn_return(ret, "Error writing PMT_CTL\n"); | ||
1249 | |||
1250 | return 0; | ||
1251 | } | ||
1252 | |||
1217 | static int smsc75xx_suspend(struct usb_interface *intf, pm_message_t message) | 1253 | static int smsc75xx_suspend(struct usb_interface *intf, pm_message_t message) |
1218 | { | 1254 | { |
1219 | struct usbnet *dev = usb_get_intfdata(intf); | 1255 | struct usbnet *dev = usb_get_intfdata(intf); |
@@ -1245,17 +1281,7 @@ static int smsc75xx_suspend(struct usb_interface *intf, pm_message_t message) | |||
1245 | ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val); | 1281 | ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val); |
1246 | check_warn_return(ret, "Error writing PMT_CTL\n"); | 1282 | check_warn_return(ret, "Error writing PMT_CTL\n"); |
1247 | 1283 | ||
1248 | /* enter suspend2 mode */ | 1284 | return smsc75xx_enter_suspend2(dev); |
1249 | ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val); | ||
1250 | check_warn_return(ret, "Error reading PMT_CTL\n"); | ||
1251 | |||
1252 | val &= ~(PMT_CTL_SUS_MODE | PMT_CTL_WUPS | PMT_CTL_PHY_RST); | ||
1253 | val |= PMT_CTL_SUS_MODE_2; | ||
1254 | |||
1255 | ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val); | ||
1256 | check_warn_return(ret, "Error writing PMT_CTL\n"); | ||
1257 | |||
1258 | return 0; | ||
1259 | } | 1285 | } |
1260 | 1286 | ||
1261 | if (pdata->wolopts & (WAKE_MCAST | WAKE_ARP)) { | 1287 | if (pdata->wolopts & (WAKE_MCAST | WAKE_ARP)) { |
@@ -1369,19 +1395,7 @@ static int smsc75xx_suspend(struct usb_interface *intf, pm_message_t message) | |||
1369 | 1395 | ||
1370 | /* some wol options are enabled, so enter SUSPEND0 */ | 1396 | /* some wol options are enabled, so enter SUSPEND0 */ |
1371 | netdev_info(dev->net, "entering SUSPEND0 mode\n"); | 1397 | netdev_info(dev->net, "entering SUSPEND0 mode\n"); |
1372 | 1398 | return smsc75xx_enter_suspend0(dev); | |
1373 | ret = smsc75xx_read_reg_nopm(dev, PMT_CTL, &val); | ||
1374 | check_warn_return(ret, "Error reading PMT_CTL\n"); | ||
1375 | |||
1376 | val &= (~(PMT_CTL_SUS_MODE | PMT_CTL_PHY_RST)); | ||
1377 | val |= PMT_CTL_SUS_MODE_0 | PMT_CTL_WOL_EN | PMT_CTL_WUPS; | ||
1378 | |||
1379 | ret = smsc75xx_write_reg_nopm(dev, PMT_CTL, val); | ||
1380 | check_warn_return(ret, "Error writing PMT_CTL\n"); | ||
1381 | |||
1382 | smsc75xx_set_feature(dev, USB_DEVICE_REMOTE_WAKEUP); | ||
1383 | |||
1384 | return 0; | ||
1385 | } | 1399 | } |
1386 | 1400 | ||
1387 | static int smsc75xx_resume(struct usb_interface *intf) | 1401 | static int smsc75xx_resume(struct usb_interface *intf) |