diff options
Diffstat (limited to 'drivers/net/ethernet/ti/cpsw.c')
| -rw-r--r-- | drivers/net/ethernet/ti/cpsw.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 90d41d26ec6d..7536a4c01293 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
| @@ -967,14 +967,19 @@ static inline void cpsw_add_dual_emac_def_ale_entries( | |||
| 967 | priv->host_port, ALE_VLAN, slave->port_vlan); | 967 | priv->host_port, ALE_VLAN, slave->port_vlan); |
| 968 | } | 968 | } |
| 969 | 969 | ||
| 970 | static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv) | 970 | static void soft_reset_slave(struct cpsw_slave *slave) |
| 971 | { | 971 | { |
| 972 | char name[32]; | 972 | char name[32]; |
| 973 | u32 slave_port; | ||
| 974 | |||
| 975 | sprintf(name, "slave-%d", slave->slave_num); | ||
| 976 | 973 | ||
| 974 | snprintf(name, sizeof(name), "slave-%d", slave->slave_num); | ||
| 977 | soft_reset(name, &slave->sliver->soft_reset); | 975 | soft_reset(name, &slave->sliver->soft_reset); |
| 976 | } | ||
| 977 | |||
| 978 | static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv) | ||
| 979 | { | ||
| 980 | u32 slave_port; | ||
| 981 | |||
| 982 | soft_reset_slave(slave); | ||
| 978 | 983 | ||
| 979 | /* setup priority mapping */ | 984 | /* setup priority mapping */ |
| 980 | __raw_writel(RX_PRIORITY_MAPPING, &slave->sliver->rx_pri_map); | 985 | __raw_writel(RX_PRIORITY_MAPPING, &slave->sliver->rx_pri_map); |
| @@ -1323,6 +1328,10 @@ static int cpsw_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
| 1323 | struct cpts *cpts = priv->cpts; | 1328 | struct cpts *cpts = priv->cpts; |
| 1324 | struct hwtstamp_config cfg; | 1329 | struct hwtstamp_config cfg; |
| 1325 | 1330 | ||
| 1331 | if (priv->version != CPSW_VERSION_1 && | ||
| 1332 | priv->version != CPSW_VERSION_2) | ||
| 1333 | return -EOPNOTSUPP; | ||
| 1334 | |||
| 1326 | if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) | 1335 | if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) |
| 1327 | return -EFAULT; | 1336 | return -EFAULT; |
| 1328 | 1337 | ||
| @@ -1330,16 +1339,8 @@ static int cpsw_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
| 1330 | if (cfg.flags) | 1339 | if (cfg.flags) |
| 1331 | return -EINVAL; | 1340 | return -EINVAL; |
| 1332 | 1341 | ||
| 1333 | switch (cfg.tx_type) { | 1342 | if (cfg.tx_type != HWTSTAMP_TX_OFF && cfg.tx_type != HWTSTAMP_TX_ON) |
| 1334 | case HWTSTAMP_TX_OFF: | ||
| 1335 | cpts->tx_enable = 0; | ||
| 1336 | break; | ||
| 1337 | case HWTSTAMP_TX_ON: | ||
| 1338 | cpts->tx_enable = 1; | ||
| 1339 | break; | ||
| 1340 | default: | ||
| 1341 | return -ERANGE; | 1343 | return -ERANGE; |
| 1342 | } | ||
| 1343 | 1344 | ||
| 1344 | switch (cfg.rx_filter) { | 1345 | switch (cfg.rx_filter) { |
| 1345 | case HWTSTAMP_FILTER_NONE: | 1346 | case HWTSTAMP_FILTER_NONE: |
| @@ -1366,6 +1367,8 @@ static int cpsw_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
| 1366 | return -ERANGE; | 1367 | return -ERANGE; |
| 1367 | } | 1368 | } |
| 1368 | 1369 | ||
| 1370 | cpts->tx_enable = cfg.tx_type == HWTSTAMP_TX_ON; | ||
| 1371 | |||
| 1369 | switch (priv->version) { | 1372 | switch (priv->version) { |
| 1370 | case CPSW_VERSION_1: | 1373 | case CPSW_VERSION_1: |
| 1371 | cpsw_hwtstamp_v1(priv); | 1374 | cpsw_hwtstamp_v1(priv); |
| @@ -1374,7 +1377,7 @@ static int cpsw_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr) | |||
| 1374 | cpsw_hwtstamp_v2(priv); | 1377 | cpsw_hwtstamp_v2(priv); |
| 1375 | break; | 1378 | break; |
| 1376 | default: | 1379 | default: |
| 1377 | return -ENOTSUPP; | 1380 | WARN_ON(1); |
| 1378 | } | 1381 | } |
| 1379 | 1382 | ||
| 1380 | return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; | 1383 | return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; |
| @@ -2173,8 +2176,9 @@ static int cpsw_suspend(struct device *dev) | |||
| 2173 | 2176 | ||
| 2174 | if (netif_running(ndev)) | 2177 | if (netif_running(ndev)) |
| 2175 | cpsw_ndo_stop(ndev); | 2178 | cpsw_ndo_stop(ndev); |
| 2176 | soft_reset("sliver 0", &priv->slaves[0].sliver->soft_reset); | 2179 | |
| 2177 | soft_reset("sliver 1", &priv->slaves[1].sliver->soft_reset); | 2180 | for_each_slave(priv, soft_reset_slave); |
| 2181 | |||
| 2178 | pm_runtime_put_sync(&pdev->dev); | 2182 | pm_runtime_put_sync(&pdev->dev); |
| 2179 | 2183 | ||
| 2180 | /* Select sleep pin state */ | 2184 | /* Select sleep pin state */ |
