Skip to content

Commit d025da9

Browse files
julianwiedmanndavem330
authored andcommitted
s390/qeth: consistently re-enable device features
commit e830baa ("qeth: restore device features after recovery") and commit ce34435 ("s390/qeth: rely on kernel for feature recovery") made sure that the HW functions for device features get re-programmed after recovery. But we missed that the same handling is also required when a card is first set offline (destroying all HW context), and then online again. Fix this by moving the re-enable action out of the recovery-only path. Signed-off-by: Julian Wiedmann <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ce28867 commit d025da9

File tree

4 files changed

+16
-17
lines changed

4 files changed

+16
-17
lines changed

drivers/s390/net/qeth_core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *,
10401040
__u16, __u16,
10411041
enum qeth_prot_versions);
10421042
int qeth_set_features(struct net_device *, netdev_features_t);
1043-
void qeth_recover_features(struct net_device *dev);
1043+
void qeth_enable_hw_features(struct net_device *dev);
10441044
netdev_features_t qeth_fix_features(struct net_device *, netdev_features_t);
10451045
netdev_features_t qeth_features_check(struct sk_buff *skb,
10461046
struct net_device *dev,

drivers/s390/net/qeth_core_main.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6469,28 +6469,27 @@ static int qeth_set_ipa_rx_csum(struct qeth_card *card, bool on)
64696469
#define QETH_HW_FEATURES (NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_TSO | \
64706470
NETIF_F_IPV6_CSUM)
64716471
/**
6472-
* qeth_recover_features() - Restore device features after recovery
6473-
* @dev: the recovering net_device
6474-
*
6475-
* Caller must hold rtnl lock.
6472+
* qeth_enable_hw_features() - (Re-)Enable HW functions for device features
6473+
* @dev: a net_device
64766474
*/
6477-
void qeth_recover_features(struct net_device *dev)
6475+
void qeth_enable_hw_features(struct net_device *dev)
64786476
{
6479-
netdev_features_t features = dev->features;
64806477
struct qeth_card *card = dev->ml_priv;
6478+
netdev_features_t features;
64816479

6480+
rtnl_lock();
6481+
features = dev->features;
64826482
/* force-off any feature that needs an IPA sequence.
64836483
* netdev_update_features() will restart them.
64846484
*/
64856485
dev->features &= ~QETH_HW_FEATURES;
64866486
netdev_update_features(dev);
6487-
6488-
if (features == dev->features)
6489-
return;
6490-
dev_warn(&card->gdev->dev,
6491-
"Device recovery failed to restore all offload features\n");
6487+
if (features != dev->features)
6488+
dev_warn(&card->gdev->dev,
6489+
"Device recovery failed to restore all offload features\n");
6490+
rtnl_unlock();
64926491
}
6493-
EXPORT_SYMBOL_GPL(qeth_recover_features);
6492+
EXPORT_SYMBOL_GPL(qeth_enable_hw_features);
64946493

64956494
int qeth_set_features(struct net_device *dev, netdev_features_t features)
64966495
{

drivers/s390/net/qeth_l2_main.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,8 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
11191119
netif_carrier_off(card->dev);
11201120

11211121
qeth_set_allowed_threads(card, 0xffffffff, 0);
1122+
1123+
qeth_enable_hw_features(card->dev);
11221124
if (recover_flag == CARD_STATE_RECOVER) {
11231125
if (recovery_mode &&
11241126
card->info.type != QETH_CARD_TYPE_OSN) {
@@ -1130,9 +1132,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
11301132
}
11311133
/* this also sets saved unicast addresses */
11321134
qeth_l2_set_rx_mode(card->dev);
1133-
rtnl_lock();
1134-
qeth_recover_features(card->dev);
1135-
rtnl_unlock();
11361135
}
11371136
/* let user_space know that device is online */
11381137
kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);

drivers/s390/net/qeth_l3_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2662,14 +2662,15 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
26622662
netif_carrier_on(card->dev);
26632663
else
26642664
netif_carrier_off(card->dev);
2665+
2666+
qeth_enable_hw_features(card->dev);
26652667
if (recover_flag == CARD_STATE_RECOVER) {
26662668
rtnl_lock();
26672669
if (recovery_mode)
26682670
__qeth_l3_open(card->dev);
26692671
else
26702672
dev_open(card->dev);
26712673
qeth_l3_set_rx_mode(card->dev);
2672-
qeth_recover_features(card->dev);
26732674
rtnl_unlock();
26742675
}
26752676
qeth_trace_features(card);

0 commit comments

Comments
 (0)