smsc95xx.c (7b960c967f2aa01ab8f45c5a0bd78e754cffdeee) | smsc95xx.c (3147242980c5f849978b424cf79dda4fef20716f) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2 /*************************************************************************** 3 * 4 * Copyright (C) 2007-2008 SMSC 5 * 6 *****************************************************************************/ 7 8#include <linux/module.h> --- 64 unchanged lines hidden (view full) --- 73 struct phy_device *phydev; 74 struct task_struct *pm_task; 75}; 76 77static bool turbo_mode = true; 78module_param(turbo_mode, bool, 0644); 79MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); 80 | 1// SPDX-License-Identifier: GPL-2.0-or-later 2 /*************************************************************************** 3 * 4 * Copyright (C) 2007-2008 SMSC 5 * 6 *****************************************************************************/ 7 8#include <linux/module.h> --- 64 unchanged lines hidden (view full) --- 73 struct phy_device *phydev; 74 struct task_struct *pm_task; 75}; 76 77static bool turbo_mode = true; 78module_param(turbo_mode, bool, 0644); 79MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); 80 |
81static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index, 82 u32 *data, int in_pm) | 81static int __must_check smsc95xx_read_reg(struct usbnet *dev, u32 index, 82 u32 *data) |
83{ 84 struct smsc95xx_priv *pdata = dev->driver_priv; 85 u32 buf; 86 int ret; 87 int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); 88 89 BUG_ON(!dev); 90 --- 13 unchanged lines hidden (view full) --- 104 } 105 106 le32_to_cpus(&buf); 107 *data = buf; 108 109 return ret; 110} 111 | 83{ 84 struct smsc95xx_priv *pdata = dev->driver_priv; 85 u32 buf; 86 int ret; 87 int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); 88 89 BUG_ON(!dev); 90 --- 13 unchanged lines hidden (view full) --- 104 } 105 106 le32_to_cpus(&buf); 107 *data = buf; 108 109 return ret; 110} 111 |
112static int __must_check __smsc95xx_write_reg(struct usbnet *dev, u32 index, 113 u32 data, int in_pm) | 112static int __must_check smsc95xx_write_reg(struct usbnet *dev, u32 index, 113 u32 data) |
114{ 115 struct smsc95xx_priv *pdata = dev->driver_priv; 116 u32 buf; 117 int ret; 118 int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); 119 120 BUG_ON(!dev); 121 --- 10 unchanged lines hidden (view full) --- 132 0, index, &buf, 4); 133 if (ret < 0 && ret != -ENODEV) 134 netdev_warn(dev->net, "Failed to write reg index 0x%08x: %d\n", 135 index, ret); 136 137 return ret; 138} 139 | 114{ 115 struct smsc95xx_priv *pdata = dev->driver_priv; 116 u32 buf; 117 int ret; 118 int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); 119 120 BUG_ON(!dev); 121 --- 10 unchanged lines hidden (view full) --- 132 0, index, &buf, 4); 133 if (ret < 0 && ret != -ENODEV) 134 netdev_warn(dev->net, "Failed to write reg index 0x%08x: %d\n", 135 index, ret); 136 137 return ret; 138} 139 |
140static int __must_check smsc95xx_read_reg_nopm(struct usbnet *dev, u32 index, 141 u32 *data) 142{ 143 return __smsc95xx_read_reg(dev, index, data, 1); 144} 145 146static int __must_check smsc95xx_write_reg_nopm(struct usbnet *dev, u32 index, 147 u32 data) 148{ 149 return __smsc95xx_write_reg(dev, index, data, 1); 150} 151 152static int __must_check smsc95xx_read_reg(struct usbnet *dev, u32 index, 153 u32 *data) 154{ 155 return __smsc95xx_read_reg(dev, index, data, 0); 156} 157 158static int __must_check smsc95xx_write_reg(struct usbnet *dev, u32 index, 159 u32 data) 160{ 161 return __smsc95xx_write_reg(dev, index, data, 0); 162} 163 | |
164/* Loop until the read is completed with timeout 165 * called with phy_mutex held */ | 140/* Loop until the read is completed with timeout 141 * called with phy_mutex held */ |
166static int __must_check __smsc95xx_phy_wait_not_busy(struct usbnet *dev, 167 int in_pm) | 142static int __must_check smsc95xx_phy_wait_not_busy(struct usbnet *dev) |
168{ 169 unsigned long start_time = jiffies; 170 u32 val; 171 int ret; 172 173 do { | 143{ 144 unsigned long start_time = jiffies; 145 u32 val; 146 int ret; 147 148 do { |
174 ret = __smsc95xx_read_reg(dev, MII_ADDR, &val, in_pm); | 149 ret = smsc95xx_read_reg(dev, MII_ADDR, &val); |
175 if (ret < 0) { 176 /* Ignore -ENODEV error during disconnect() */ 177 if (ret == -ENODEV) 178 return 0; 179 netdev_warn(dev->net, "Error reading MII_ACCESS\n"); 180 return ret; 181 } 182 --- 4 unchanged lines hidden (view full) --- 187 return -EIO; 188} 189 190static u32 mii_address_cmd(int phy_id, int idx, u16 op) 191{ 192 return (phy_id & 0x1f) << 11 | (idx & 0x1f) << 6 | op; 193} 194 | 150 if (ret < 0) { 151 /* Ignore -ENODEV error during disconnect() */ 152 if (ret == -ENODEV) 153 return 0; 154 netdev_warn(dev->net, "Error reading MII_ACCESS\n"); 155 return ret; 156 } 157 --- 4 unchanged lines hidden (view full) --- 162 return -EIO; 163} 164 165static u32 mii_address_cmd(int phy_id, int idx, u16 op) 166{ 167 return (phy_id & 0x1f) << 11 | (idx & 0x1f) << 6 | op; 168} 169 |
195static int __smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx, 196 int in_pm) | 170static int smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx) |
197{ 198 u32 val, addr; 199 int ret; 200 201 mutex_lock(&dev->phy_mutex); 202 203 /* confirm MII not busy */ | 171{ 172 u32 val, addr; 173 int ret; 174 175 mutex_lock(&dev->phy_mutex); 176 177 /* confirm MII not busy */ |
204 ret = __smsc95xx_phy_wait_not_busy(dev, in_pm); | 178 ret = smsc95xx_phy_wait_not_busy(dev); |
205 if (ret < 0) { 206 netdev_warn(dev->net, "%s: MII is busy\n", __func__); 207 goto done; 208 } 209 210 /* set the address, index & direction (read from PHY) */ 211 addr = mii_address_cmd(phy_id, idx, MII_READ_ | MII_BUSY_); | 179 if (ret < 0) { 180 netdev_warn(dev->net, "%s: MII is busy\n", __func__); 181 goto done; 182 } 183 184 /* set the address, index & direction (read from PHY) */ 185 addr = mii_address_cmd(phy_id, idx, MII_READ_ | MII_BUSY_); |
212 ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm); | 186 ret = smsc95xx_write_reg(dev, MII_ADDR, addr); |
213 if (ret < 0) { 214 if (ret != -ENODEV) 215 netdev_warn(dev->net, "Error writing MII_ADDR\n"); 216 goto done; 217 } 218 | 187 if (ret < 0) { 188 if (ret != -ENODEV) 189 netdev_warn(dev->net, "Error writing MII_ADDR\n"); 190 goto done; 191 } 192 |
219 ret = __smsc95xx_phy_wait_not_busy(dev, in_pm); | 193 ret = smsc95xx_phy_wait_not_busy(dev); |
220 if (ret < 0) { 221 netdev_warn(dev->net, "Timed out reading MII reg %02X\n", idx); 222 goto done; 223 } 224 | 194 if (ret < 0) { 195 netdev_warn(dev->net, "Timed out reading MII reg %02X\n", idx); 196 goto done; 197 } 198 |
225 ret = __smsc95xx_read_reg(dev, MII_DATA, &val, in_pm); | 199 ret = smsc95xx_read_reg(dev, MII_DATA, &val); |
226 if (ret < 0) { 227 if (ret != -ENODEV) 228 netdev_warn(dev->net, "Error reading MII_DATA\n"); 229 goto done; 230 } 231 232 ret = (u16)(val & 0xFFFF); 233 234done: 235 mutex_unlock(&dev->phy_mutex); 236 237 /* Ignore -ENODEV error during disconnect() */ 238 if (ret == -ENODEV) 239 return 0; 240 return ret; 241} 242 | 200 if (ret < 0) { 201 if (ret != -ENODEV) 202 netdev_warn(dev->net, "Error reading MII_DATA\n"); 203 goto done; 204 } 205 206 ret = (u16)(val & 0xFFFF); 207 208done: 209 mutex_unlock(&dev->phy_mutex); 210 211 /* Ignore -ENODEV error during disconnect() */ 212 if (ret == -ENODEV) 213 return 0; 214 return ret; 215} 216 |
243static void __smsc95xx_mdio_write(struct usbnet *dev, int phy_id, 244 int idx, int regval, int in_pm) | 217static void smsc95xx_mdio_write(struct usbnet *dev, int phy_id, int idx, 218 int regval) |
245{ 246 u32 val, addr; 247 int ret; 248 249 mutex_lock(&dev->phy_mutex); 250 251 /* confirm MII not busy */ | 219{ 220 u32 val, addr; 221 int ret; 222 223 mutex_lock(&dev->phy_mutex); 224 225 /* confirm MII not busy */ |
252 ret = __smsc95xx_phy_wait_not_busy(dev, in_pm); | 226 ret = smsc95xx_phy_wait_not_busy(dev); |
253 if (ret < 0) { 254 netdev_warn(dev->net, "%s: MII is busy\n", __func__); 255 goto done; 256 } 257 258 val = regval; | 227 if (ret < 0) { 228 netdev_warn(dev->net, "%s: MII is busy\n", __func__); 229 goto done; 230 } 231 232 val = regval; |
259 ret = __smsc95xx_write_reg(dev, MII_DATA, val, in_pm); | 233 ret = smsc95xx_write_reg(dev, MII_DATA, val); |
260 if (ret < 0) { 261 if (ret != -ENODEV) 262 netdev_warn(dev->net, "Error writing MII_DATA\n"); 263 goto done; 264 } 265 266 /* set the address, index & direction (write to PHY) */ 267 addr = mii_address_cmd(phy_id, idx, MII_WRITE_ | MII_BUSY_); | 234 if (ret < 0) { 235 if (ret != -ENODEV) 236 netdev_warn(dev->net, "Error writing MII_DATA\n"); 237 goto done; 238 } 239 240 /* set the address, index & direction (write to PHY) */ 241 addr = mii_address_cmd(phy_id, idx, MII_WRITE_ | MII_BUSY_); |
268 ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm); | 242 ret = smsc95xx_write_reg(dev, MII_ADDR, addr); |
269 if (ret < 0) { 270 if (ret != -ENODEV) 271 netdev_warn(dev->net, "Error writing MII_ADDR\n"); 272 goto done; 273 } 274 | 243 if (ret < 0) { 244 if (ret != -ENODEV) 245 netdev_warn(dev->net, "Error writing MII_ADDR\n"); 246 goto done; 247 } 248 |
275 ret = __smsc95xx_phy_wait_not_busy(dev, in_pm); | 249 ret = smsc95xx_phy_wait_not_busy(dev); |
276 if (ret < 0) { 277 netdev_warn(dev->net, "Timed out writing MII reg %02X\n", idx); 278 goto done; 279 } 280 281done: 282 mutex_unlock(&dev->phy_mutex); 283} 284 | 250 if (ret < 0) { 251 netdev_warn(dev->net, "Timed out writing MII reg %02X\n", idx); 252 goto done; 253 } 254 255done: 256 mutex_unlock(&dev->phy_mutex); 257} 258 |
285static int smsc95xx_mdio_read_nopm(struct usbnet *dev, int idx) 286{ 287 struct smsc95xx_priv *pdata = dev->driver_priv; 288 289 return __smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, idx, 1); 290} 291 292static void smsc95xx_mdio_write_nopm(struct usbnet *dev, int idx, int regval) 293{ 294 struct smsc95xx_priv *pdata = dev->driver_priv; 295 296 __smsc95xx_mdio_write(dev, pdata->phydev->mdio.addr, idx, regval, 1); 297} 298 | |
299static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx) 300{ 301 struct usbnet *dev = bus->priv; 302 | 259static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx) 260{ 261 struct usbnet *dev = bus->priv; 262 |
303 return __smsc95xx_mdio_read(dev, phy_id, idx, 0); | 263 return smsc95xx_mdio_read(dev, phy_id, idx); |
304} 305 306static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx, 307 u16 regval) 308{ 309 struct usbnet *dev = bus->priv; 310 | 264} 265 266static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx, 267 u16 regval) 268{ 269 struct usbnet *dev = bus->priv; 270 |
311 __smsc95xx_mdio_write(dev, phy_id, idx, regval, 0); | 271 smsc95xx_mdio_write(dev, phy_id, idx, regval); |
312 return 0; 313} 314 315static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev) 316{ 317 unsigned long start_time = jiffies; 318 u32 val; 319 int ret; --- 543 unchanged lines hidden (view full) --- 863 if (ret < 0) 864 return ret; 865 866 /* Enable Tx at SCSRs */ 867 return smsc95xx_write_reg(dev, TX_CFG, TX_CFG_ON_); 868} 869 870/* Starts the Receive path */ | 272 return 0; 273} 274 275static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev) 276{ 277 unsigned long start_time = jiffies; 278 u32 val; 279 int ret; --- 543 unchanged lines hidden (view full) --- 823 if (ret < 0) 824 return ret; 825 826 /* Enable Tx at SCSRs */ 827 return smsc95xx_write_reg(dev, TX_CFG, TX_CFG_ON_); 828} 829 830/* Starts the Receive path */ |
871static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm) | 831static int smsc95xx_start_rx_path(struct usbnet *dev) |
872{ 873 struct smsc95xx_priv *pdata = dev->driver_priv; 874 unsigned long flags; 875 876 spin_lock_irqsave(&pdata->mac_cr_lock, flags); 877 pdata->mac_cr |= MAC_CR_RXEN_; 878 spin_unlock_irqrestore(&pdata->mac_cr_lock, flags); 879 | 832{ 833 struct smsc95xx_priv *pdata = dev->driver_priv; 834 unsigned long flags; 835 836 spin_lock_irqsave(&pdata->mac_cr_lock, flags); 837 pdata->mac_cr |= MAC_CR_RXEN_; 838 spin_unlock_irqrestore(&pdata->mac_cr_lock, flags); 839 |
880 return __smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr, in_pm); | 840 return smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr); |
881} 882 883static int smsc95xx_reset(struct usbnet *dev) 884{ 885 struct smsc95xx_priv *pdata = dev->driver_priv; 886 u32 read_buf, write_buf, burst_cap; 887 int ret = 0, timeout; 888 --- 166 unchanged lines hidden (view full) --- 1055 return ret; 1056 1057 ret = smsc95xx_start_tx_path(dev); 1058 if (ret < 0) { 1059 netdev_warn(dev->net, "Failed to start TX path\n"); 1060 return ret; 1061 } 1062 | 841} 842 843static int smsc95xx_reset(struct usbnet *dev) 844{ 845 struct smsc95xx_priv *pdata = dev->driver_priv; 846 u32 read_buf, write_buf, burst_cap; 847 int ret = 0, timeout; 848 --- 166 unchanged lines hidden (view full) --- 1015 return ret; 1016 1017 ret = smsc95xx_start_tx_path(dev); 1018 if (ret < 0) { 1019 netdev_warn(dev->net, "Failed to start TX path\n"); 1020 return ret; 1021 } 1022 |
1063 ret = smsc95xx_start_rx_path(dev, 0); | 1023 ret = smsc95xx_start_rx_path(dev); |
1064 if (ret < 0) { 1065 netdev_warn(dev->net, "Failed to start RX path\n"); 1066 return ret; 1067 } 1068 1069 netif_dbg(dev, ifup, dev->net, "smsc95xx_reset, return 0\n"); 1070 return 0; 1071} --- 217 unchanged lines hidden (view full) --- 1289} 1290 1291static u32 smsc_crc(const u8 *buffer, size_t len, int filter) 1292{ 1293 u32 crc = bitrev16(crc16(0xFFFF, buffer, len)); 1294 return crc << ((filter % 2) * 16); 1295} 1296 | 1024 if (ret < 0) { 1025 netdev_warn(dev->net, "Failed to start RX path\n"); 1026 return ret; 1027 } 1028 1029 netif_dbg(dev, ifup, dev->net, "smsc95xx_reset, return 0\n"); 1030 return 0; 1031} --- 217 unchanged lines hidden (view full) --- 1249} 1250 1251static u32 smsc_crc(const u8 *buffer, size_t len, int filter) 1252{ 1253 u32 crc = bitrev16(crc16(0xFFFF, buffer, len)); 1254 return crc << ((filter % 2) * 16); 1255} 1256 |
1297static int smsc95xx_link_ok_nopm(struct usbnet *dev) | 1257static int smsc95xx_link_ok(struct usbnet *dev) |
1298{ | 1258{ |
1259 struct smsc95xx_priv *pdata = dev->driver_priv; |
|
1299 int ret; 1300 1301 /* first, a dummy read, needed to latch some MII phys */ | 1260 int ret; 1261 1262 /* first, a dummy read, needed to latch some MII phys */ |
1302 ret = smsc95xx_mdio_read_nopm(dev, MII_BMSR); | 1263 ret = smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, MII_BMSR); |
1303 if (ret < 0) 1304 return ret; 1305 | 1264 if (ret < 0) 1265 return ret; 1266 |
1306 ret = smsc95xx_mdio_read_nopm(dev, MII_BMSR); | 1267 ret = smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, MII_BMSR); |
1307 if (ret < 0) 1308 return ret; 1309 1310 return !!(ret & BMSR_LSTATUS); 1311} 1312 1313static int smsc95xx_enter_suspend0(struct usbnet *dev) 1314{ 1315 struct smsc95xx_priv *pdata = dev->driver_priv; 1316 u32 val; 1317 int ret; 1318 | 1268 if (ret < 0) 1269 return ret; 1270 1271 return !!(ret & BMSR_LSTATUS); 1272} 1273 1274static int smsc95xx_enter_suspend0(struct usbnet *dev) 1275{ 1276 struct smsc95xx_priv *pdata = dev->driver_priv; 1277 u32 val; 1278 int ret; 1279 |
1319 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1280 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1320 if (ret < 0) 1321 return ret; 1322 1323 val &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_)); 1324 val |= PM_CTL_SUS_MODE_0; 1325 | 1281 if (ret < 0) 1282 return ret; 1283 1284 val &= (~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_)); 1285 val |= PM_CTL_SUS_MODE_0; 1286 |
1326 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1287 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1327 if (ret < 0) 1328 return ret; 1329 1330 /* clear wol status */ 1331 val &= ~PM_CTL_WUPS_; 1332 val |= PM_CTL_WUPS_WOL_; 1333 1334 /* enable energy detection */ 1335 if (pdata->wolopts & WAKE_PHY) 1336 val |= PM_CTL_WUPS_ED_; 1337 | 1288 if (ret < 0) 1289 return ret; 1290 1291 /* clear wol status */ 1292 val &= ~PM_CTL_WUPS_; 1293 val |= PM_CTL_WUPS_WOL_; 1294 1295 /* enable energy detection */ 1296 if (pdata->wolopts & WAKE_PHY) 1297 val |= PM_CTL_WUPS_ED_; 1298 |
1338 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1299 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1339 if (ret < 0) 1340 return ret; 1341 1342 /* read back PM_CTRL */ | 1300 if (ret < 0) 1301 return ret; 1302 1303 /* read back PM_CTRL */ |
1343 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1304 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1344 if (ret < 0) 1345 return ret; 1346 1347 pdata->suspend_flags |= SUSPEND_SUSPEND0; 1348 1349 return 0; 1350} 1351 1352static int smsc95xx_enter_suspend1(struct usbnet *dev) 1353{ 1354 struct smsc95xx_priv *pdata = dev->driver_priv; | 1305 if (ret < 0) 1306 return ret; 1307 1308 pdata->suspend_flags |= SUSPEND_SUSPEND0; 1309 1310 return 0; 1311} 1312 1313static int smsc95xx_enter_suspend1(struct usbnet *dev) 1314{ 1315 struct smsc95xx_priv *pdata = dev->driver_priv; |
1316 int ret, phy_id = pdata->phydev->mdio.addr; |
|
1355 u32 val; | 1317 u32 val; |
1356 int ret; | |
1357 1358 /* reconfigure link pulse detection timing for 1359 * compatibility with non-standard link partners 1360 */ 1361 if (pdata->features & FEATURE_PHY_NLP_CROSSOVER) | 1318 1319 /* reconfigure link pulse detection timing for 1320 * compatibility with non-standard link partners 1321 */ 1322 if (pdata->features & FEATURE_PHY_NLP_CROSSOVER) |
1362 smsc95xx_mdio_write_nopm(dev, PHY_EDPD_CONFIG, 1363 PHY_EDPD_CONFIG_DEFAULT); | 1323 smsc95xx_mdio_write(dev, phy_id, PHY_EDPD_CONFIG, 1324 PHY_EDPD_CONFIG_DEFAULT); |
1364 1365 /* enable energy detect power-down mode */ | 1325 1326 /* enable energy detect power-down mode */ |
1366 ret = smsc95xx_mdio_read_nopm(dev, PHY_MODE_CTRL_STS); | 1327 ret = smsc95xx_mdio_read(dev, phy_id, PHY_MODE_CTRL_STS); |
1367 if (ret < 0) 1368 return ret; 1369 1370 ret |= MODE_CTRL_STS_EDPWRDOWN_; 1371 | 1328 if (ret < 0) 1329 return ret; 1330 1331 ret |= MODE_CTRL_STS_EDPWRDOWN_; 1332 |
1372 smsc95xx_mdio_write_nopm(dev, PHY_MODE_CTRL_STS, ret); | 1333 smsc95xx_mdio_write(dev, phy_id, PHY_MODE_CTRL_STS, ret); |
1373 1374 /* enter SUSPEND1 mode */ | 1334 1335 /* enter SUSPEND1 mode */ |
1375 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1336 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1376 if (ret < 0) 1377 return ret; 1378 1379 val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_); 1380 val |= PM_CTL_SUS_MODE_1; 1381 | 1337 if (ret < 0) 1338 return ret; 1339 1340 val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_); 1341 val |= PM_CTL_SUS_MODE_1; 1342 |
1382 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1343 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1383 if (ret < 0) 1384 return ret; 1385 1386 /* clear wol status, enable energy detection */ 1387 val &= ~PM_CTL_WUPS_; 1388 val |= (PM_CTL_WUPS_ED_ | PM_CTL_ED_EN_); 1389 | 1344 if (ret < 0) 1345 return ret; 1346 1347 /* clear wol status, enable energy detection */ 1348 val &= ~PM_CTL_WUPS_; 1349 val |= (PM_CTL_WUPS_ED_ | PM_CTL_ED_EN_); 1350 |
1390 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1351 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1391 if (ret < 0) 1392 return ret; 1393 1394 pdata->suspend_flags |= SUSPEND_SUSPEND1; 1395 1396 return 0; 1397} 1398 1399static int smsc95xx_enter_suspend2(struct usbnet *dev) 1400{ 1401 struct smsc95xx_priv *pdata = dev->driver_priv; 1402 u32 val; 1403 int ret; 1404 | 1352 if (ret < 0) 1353 return ret; 1354 1355 pdata->suspend_flags |= SUSPEND_SUSPEND1; 1356 1357 return 0; 1358} 1359 1360static int smsc95xx_enter_suspend2(struct usbnet *dev) 1361{ 1362 struct smsc95xx_priv *pdata = dev->driver_priv; 1363 u32 val; 1364 int ret; 1365 |
1405 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1366 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1406 if (ret < 0) 1407 return ret; 1408 1409 val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_); 1410 val |= PM_CTL_SUS_MODE_2; 1411 | 1367 if (ret < 0) 1368 return ret; 1369 1370 val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_); 1371 val |= PM_CTL_SUS_MODE_2; 1372 |
1412 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1373 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1413 if (ret < 0) 1414 return ret; 1415 1416 pdata->suspend_flags |= SUSPEND_SUSPEND2; 1417 1418 return 0; 1419} 1420 1421static int smsc95xx_enter_suspend3(struct usbnet *dev) 1422{ 1423 struct smsc95xx_priv *pdata = dev->driver_priv; 1424 u32 val; 1425 int ret; 1426 | 1374 if (ret < 0) 1375 return ret; 1376 1377 pdata->suspend_flags |= SUSPEND_SUSPEND2; 1378 1379 return 0; 1380} 1381 1382static int smsc95xx_enter_suspend3(struct usbnet *dev) 1383{ 1384 struct smsc95xx_priv *pdata = dev->driver_priv; 1385 u32 val; 1386 int ret; 1387 |
1427 ret = smsc95xx_read_reg_nopm(dev, RX_FIFO_INF, &val); | 1388 ret = smsc95xx_read_reg(dev, RX_FIFO_INF, &val); |
1428 if (ret < 0) 1429 return ret; 1430 1431 if (val & RX_FIFO_INF_USED_) { 1432 netdev_info(dev->net, "rx fifo not empty in autosuspend\n"); 1433 return -EBUSY; 1434 } 1435 | 1389 if (ret < 0) 1390 return ret; 1391 1392 if (val & RX_FIFO_INF_USED_) { 1393 netdev_info(dev->net, "rx fifo not empty in autosuspend\n"); 1394 return -EBUSY; 1395 } 1396 |
1436 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1397 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1437 if (ret < 0) 1438 return ret; 1439 1440 val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_); 1441 val |= PM_CTL_SUS_MODE_3 | PM_CTL_RES_CLR_WKP_STS; 1442 | 1398 if (ret < 0) 1399 return ret; 1400 1401 val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_); 1402 val |= PM_CTL_SUS_MODE_3 | PM_CTL_RES_CLR_WKP_STS; 1403 |
1443 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1404 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1444 if (ret < 0) 1445 return ret; 1446 1447 /* clear wol status */ 1448 val &= ~PM_CTL_WUPS_; 1449 val |= PM_CTL_WUPS_WOL_; 1450 | 1405 if (ret < 0) 1406 return ret; 1407 1408 /* clear wol status */ 1409 val &= ~PM_CTL_WUPS_; 1410 val |= PM_CTL_WUPS_WOL_; 1411 |
1451 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1412 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1452 if (ret < 0) 1453 return ret; 1454 1455 pdata->suspend_flags |= SUSPEND_SUSPEND3; 1456 1457 return 0; 1458} 1459 --- 42 unchanged lines hidden (view full) --- 1502 return ret; 1503 } 1504 1505 if (pdata->suspend_flags) { 1506 netdev_warn(dev->net, "error during last resume\n"); 1507 pdata->suspend_flags = 0; 1508 } 1509 | 1413 if (ret < 0) 1414 return ret; 1415 1416 pdata->suspend_flags |= SUSPEND_SUSPEND3; 1417 1418 return 0; 1419} 1420 --- 42 unchanged lines hidden (view full) --- 1463 return ret; 1464 } 1465 1466 if (pdata->suspend_flags) { 1467 netdev_warn(dev->net, "error during last resume\n"); 1468 pdata->suspend_flags = 0; 1469 } 1470 |
1510 /* determine if link is up using only _nopm functions */ 1511 link_up = smsc95xx_link_ok_nopm(dev); | 1471 link_up = smsc95xx_link_ok(dev); |
1512 1513 if (message.event == PM_EVENT_AUTO_SUSPEND && 1514 (pdata->features & FEATURE_REMOTE_WAKEUP)) { 1515 ret = smsc95xx_autosuspend(dev, link_up); 1516 goto done; 1517 } 1518 1519 /* if we get this far we're not autosuspending */ 1520 /* if no wol options set, or if link is down and we're not waking on 1521 * PHY activity, enter lowest power SUSPEND2 mode 1522 */ 1523 if (!(pdata->wolopts & SUPPORTED_WAKE) || 1524 !(link_up || (pdata->wolopts & WAKE_PHY))) { 1525 netdev_info(dev->net, "entering SUSPEND2 mode\n"); 1526 1527 /* disable energy detect (link up) & wake up events */ | 1472 1473 if (message.event == PM_EVENT_AUTO_SUSPEND && 1474 (pdata->features & FEATURE_REMOTE_WAKEUP)) { 1475 ret = smsc95xx_autosuspend(dev, link_up); 1476 goto done; 1477 } 1478 1479 /* if we get this far we're not autosuspending */ 1480 /* if no wol options set, or if link is down and we're not waking on 1481 * PHY activity, enter lowest power SUSPEND2 mode 1482 */ 1483 if (!(pdata->wolopts & SUPPORTED_WAKE) || 1484 !(link_up || (pdata->wolopts & WAKE_PHY))) { 1485 netdev_info(dev->net, "entering SUSPEND2 mode\n"); 1486 1487 /* disable energy detect (link up) & wake up events */ |
1528 ret = smsc95xx_read_reg_nopm(dev, WUCSR, &val); | 1488 ret = smsc95xx_read_reg(dev, WUCSR, &val); |
1529 if (ret < 0) 1530 goto done; 1531 1532 val &= ~(WUCSR_MPEN_ | WUCSR_WAKE_EN_); 1533 | 1489 if (ret < 0) 1490 goto done; 1491 1492 val &= ~(WUCSR_MPEN_ | WUCSR_WAKE_EN_); 1493 |
1534 ret = smsc95xx_write_reg_nopm(dev, WUCSR, val); | 1494 ret = smsc95xx_write_reg(dev, WUCSR, val); |
1535 if (ret < 0) 1536 goto done; 1537 | 1495 if (ret < 0) 1496 goto done; 1497 |
1538 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1498 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1539 if (ret < 0) 1540 goto done; 1541 1542 val &= ~(PM_CTL_ED_EN_ | PM_CTL_WOL_EN_); 1543 | 1499 if (ret < 0) 1500 goto done; 1501 1502 val &= ~(PM_CTL_ED_EN_ | PM_CTL_WOL_EN_); 1503 |
1544 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1504 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1545 if (ret < 0) 1546 goto done; 1547 1548 ret = smsc95xx_enter_suspend2(dev); 1549 goto done; 1550 } 1551 1552 if (pdata->wolopts & WAKE_PHY) { --- 74 unchanged lines hidden (view full) --- 1627 filter_mask[filter * 4 + 3] = 0x00; 1628 command[filter/4] |= 0x01UL << ((filter % 4) * 8); 1629 offset[filter/4] |= 0x00 << ((filter % 4) * 8); 1630 crc[filter/2] |= smsc_crc(dev->net->dev_addr, ETH_ALEN, filter); 1631 filter++; 1632 } 1633 1634 for (i = 0; i < (wuff_filter_count * 4); i++) { | 1505 if (ret < 0) 1506 goto done; 1507 1508 ret = smsc95xx_enter_suspend2(dev); 1509 goto done; 1510 } 1511 1512 if (pdata->wolopts & WAKE_PHY) { --- 74 unchanged lines hidden (view full) --- 1587 filter_mask[filter * 4 + 3] = 0x00; 1588 command[filter/4] |= 0x01UL << ((filter % 4) * 8); 1589 offset[filter/4] |= 0x00 << ((filter % 4) * 8); 1590 crc[filter/2] |= smsc_crc(dev->net->dev_addr, ETH_ALEN, filter); 1591 filter++; 1592 } 1593 1594 for (i = 0; i < (wuff_filter_count * 4); i++) { |
1635 ret = smsc95xx_write_reg_nopm(dev, WUFF, filter_mask[i]); | 1595 ret = smsc95xx_write_reg(dev, WUFF, filter_mask[i]); |
1636 if (ret < 0) { 1637 kfree(filter_mask); 1638 goto done; 1639 } 1640 } 1641 kfree(filter_mask); 1642 1643 for (i = 0; i < (wuff_filter_count / 4); i++) { | 1596 if (ret < 0) { 1597 kfree(filter_mask); 1598 goto done; 1599 } 1600 } 1601 kfree(filter_mask); 1602 1603 for (i = 0; i < (wuff_filter_count / 4); i++) { |
1644 ret = smsc95xx_write_reg_nopm(dev, WUFF, command[i]); | 1604 ret = smsc95xx_write_reg(dev, WUFF, command[i]); |
1645 if (ret < 0) 1646 goto done; 1647 } 1648 1649 for (i = 0; i < (wuff_filter_count / 4); i++) { | 1605 if (ret < 0) 1606 goto done; 1607 } 1608 1609 for (i = 0; i < (wuff_filter_count / 4); i++) { |
1650 ret = smsc95xx_write_reg_nopm(dev, WUFF, offset[i]); | 1610 ret = smsc95xx_write_reg(dev, WUFF, offset[i]); |
1651 if (ret < 0) 1652 goto done; 1653 } 1654 1655 for (i = 0; i < (wuff_filter_count / 2); i++) { | 1611 if (ret < 0) 1612 goto done; 1613 } 1614 1615 for (i = 0; i < (wuff_filter_count / 2); i++) { |
1656 ret = smsc95xx_write_reg_nopm(dev, WUFF, crc[i]); | 1616 ret = smsc95xx_write_reg(dev, WUFF, crc[i]); |
1657 if (ret < 0) 1658 goto done; 1659 } 1660 1661 /* clear any pending pattern match packet status */ | 1617 if (ret < 0) 1618 goto done; 1619 } 1620 1621 /* clear any pending pattern match packet status */ |
1662 ret = smsc95xx_read_reg_nopm(dev, WUCSR, &val); | 1622 ret = smsc95xx_read_reg(dev, WUCSR, &val); |
1663 if (ret < 0) 1664 goto done; 1665 1666 val |= WUCSR_WUFR_; 1667 | 1623 if (ret < 0) 1624 goto done; 1625 1626 val |= WUCSR_WUFR_; 1627 |
1668 ret = smsc95xx_write_reg_nopm(dev, WUCSR, val); | 1628 ret = smsc95xx_write_reg(dev, WUCSR, val); |
1669 if (ret < 0) 1670 goto done; 1671 } 1672 1673 if (pdata->wolopts & WAKE_MAGIC) { 1674 /* clear any pending magic packet status */ | 1629 if (ret < 0) 1630 goto done; 1631 } 1632 1633 if (pdata->wolopts & WAKE_MAGIC) { 1634 /* clear any pending magic packet status */ |
1675 ret = smsc95xx_read_reg_nopm(dev, WUCSR, &val); | 1635 ret = smsc95xx_read_reg(dev, WUCSR, &val); |
1676 if (ret < 0) 1677 goto done; 1678 1679 val |= WUCSR_MPR_; 1680 | 1636 if (ret < 0) 1637 goto done; 1638 1639 val |= WUCSR_MPR_; 1640 |
1681 ret = smsc95xx_write_reg_nopm(dev, WUCSR, val); | 1641 ret = smsc95xx_write_reg(dev, WUCSR, val); |
1682 if (ret < 0) 1683 goto done; 1684 } 1685 1686 /* enable/disable wakeup sources */ | 1642 if (ret < 0) 1643 goto done; 1644 } 1645 1646 /* enable/disable wakeup sources */ |
1687 ret = smsc95xx_read_reg_nopm(dev, WUCSR, &val); | 1647 ret = smsc95xx_read_reg(dev, WUCSR, &val); |
1688 if (ret < 0) 1689 goto done; 1690 1691 if (pdata->wolopts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)) { 1692 netdev_info(dev->net, "enabling pattern match wakeup\n"); 1693 val |= WUCSR_WAKE_EN_; 1694 } else { 1695 netdev_info(dev->net, "disabling pattern match wakeup\n"); 1696 val &= ~WUCSR_WAKE_EN_; 1697 } 1698 1699 if (pdata->wolopts & WAKE_MAGIC) { 1700 netdev_info(dev->net, "enabling magic packet wakeup\n"); 1701 val |= WUCSR_MPEN_; 1702 } else { 1703 netdev_info(dev->net, "disabling magic packet wakeup\n"); 1704 val &= ~WUCSR_MPEN_; 1705 } 1706 | 1648 if (ret < 0) 1649 goto done; 1650 1651 if (pdata->wolopts & (WAKE_BCAST | WAKE_MCAST | WAKE_ARP | WAKE_UCAST)) { 1652 netdev_info(dev->net, "enabling pattern match wakeup\n"); 1653 val |= WUCSR_WAKE_EN_; 1654 } else { 1655 netdev_info(dev->net, "disabling pattern match wakeup\n"); 1656 val &= ~WUCSR_WAKE_EN_; 1657 } 1658 1659 if (pdata->wolopts & WAKE_MAGIC) { 1660 netdev_info(dev->net, "enabling magic packet wakeup\n"); 1661 val |= WUCSR_MPEN_; 1662 } else { 1663 netdev_info(dev->net, "disabling magic packet wakeup\n"); 1664 val &= ~WUCSR_MPEN_; 1665 } 1666 |
1707 ret = smsc95xx_write_reg_nopm(dev, WUCSR, val); | 1667 ret = smsc95xx_write_reg(dev, WUCSR, val); |
1708 if (ret < 0) 1709 goto done; 1710 1711 /* enable wol wakeup source */ | 1668 if (ret < 0) 1669 goto done; 1670 1671 /* enable wol wakeup source */ |
1712 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1672 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1713 if (ret < 0) 1714 goto done; 1715 1716 val |= PM_CTL_WOL_EN_; 1717 1718 /* phy energy detect wakeup source */ 1719 if (pdata->wolopts & WAKE_PHY) 1720 val |= PM_CTL_ED_EN_; 1721 | 1673 if (ret < 0) 1674 goto done; 1675 1676 val |= PM_CTL_WOL_EN_; 1677 1678 /* phy energy detect wakeup source */ 1679 if (pdata->wolopts & WAKE_PHY) 1680 val |= PM_CTL_ED_EN_; 1681 |
1722 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1682 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1723 if (ret < 0) 1724 goto done; 1725 1726 /* enable receiver to enable frame reception */ | 1683 if (ret < 0) 1684 goto done; 1685 1686 /* enable receiver to enable frame reception */ |
1727 smsc95xx_start_rx_path(dev, 1); | 1687 smsc95xx_start_rx_path(dev); |
1728 1729 /* some wol options are enabled, so enter SUSPEND0 */ 1730 netdev_info(dev->net, "entering SUSPEND0 mode\n"); 1731 ret = smsc95xx_enter_suspend0(dev); 1732 1733done: 1734 /* 1735 * TODO: resume() might need to handle the suspend failure --- 22 unchanged lines hidden (view full) --- 1758 1759 /* do this first to ensure it's cleared even in error case */ 1760 pdata->suspend_flags = 0; 1761 1762 pdata->pm_task = current; 1763 1764 if (suspend_flags & SUSPEND_ALLMODES) { 1765 /* clear wake-up sources */ | 1688 1689 /* some wol options are enabled, so enter SUSPEND0 */ 1690 netdev_info(dev->net, "entering SUSPEND0 mode\n"); 1691 ret = smsc95xx_enter_suspend0(dev); 1692 1693done: 1694 /* 1695 * TODO: resume() might need to handle the suspend failure --- 22 unchanged lines hidden (view full) --- 1718 1719 /* do this first to ensure it's cleared even in error case */ 1720 pdata->suspend_flags = 0; 1721 1722 pdata->pm_task = current; 1723 1724 if (suspend_flags & SUSPEND_ALLMODES) { 1725 /* clear wake-up sources */ |
1766 ret = smsc95xx_read_reg_nopm(dev, WUCSR, &val); | 1726 ret = smsc95xx_read_reg(dev, WUCSR, &val); |
1767 if (ret < 0) 1768 goto done; 1769 1770 val &= ~(WUCSR_WAKE_EN_ | WUCSR_MPEN_); 1771 | 1727 if (ret < 0) 1728 goto done; 1729 1730 val &= ~(WUCSR_WAKE_EN_ | WUCSR_MPEN_); 1731 |
1772 ret = smsc95xx_write_reg_nopm(dev, WUCSR, val); | 1732 ret = smsc95xx_write_reg(dev, WUCSR, val); |
1773 if (ret < 0) 1774 goto done; 1775 1776 /* clear wake-up status */ | 1733 if (ret < 0) 1734 goto done; 1735 1736 /* clear wake-up status */ |
1777 ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val); | 1737 ret = smsc95xx_read_reg(dev, PM_CTRL, &val); |
1778 if (ret < 0) 1779 goto done; 1780 1781 val &= ~PM_CTL_WOL_EN_; 1782 val |= PM_CTL_WUPS_; 1783 | 1738 if (ret < 0) 1739 goto done; 1740 1741 val &= ~PM_CTL_WOL_EN_; 1742 val |= PM_CTL_WUPS_; 1743 |
1784 ret = smsc95xx_write_reg_nopm(dev, PM_CTRL, val); | 1744 ret = smsc95xx_write_reg(dev, PM_CTRL, val); |
1785 if (ret < 0) 1786 goto done; 1787 } 1788 1789 phy_init_hw(pdata->phydev); 1790 1791 ret = usbnet_resume(intf); 1792 if (ret < 0) --- 339 unchanged lines hidden --- | 1745 if (ret < 0) 1746 goto done; 1747 } 1748 1749 phy_init_hw(pdata->phydev); 1750 1751 ret = usbnet_resume(intf); 1752 if (ret < 0) --- 339 unchanged lines hidden --- |