aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/net
diff options
context:
space:
mode:
authorUrsula Braun <ursula.braun@de.ibm.com>2011-01-12 15:42:24 -0500
committerDavid S. Miller <davem@davemloft.net>2011-01-15 23:45:56 -0500
commit394234406c7a8a6b947d230b115c918c0a1def68 (patch)
tree6c680f03c20b758016ff69ba6ff1e7dec7cdae6a /drivers/s390/net
parent0f73f2c5a3ebb957ee66718c903c17ed71a4fc2e (diff)
qeth: postpone open till recovery is finished
The open function of qeth is not executed if the qeth device is in state DOWN or HARDSETUP. A recovery switches from state SOFTSETUP to HARDSETUP to DOWN to HARDSETUP and back to SOFTSETUP. If open and recover are running concurrently, open fails if it hits the states HARDSETUP or DOWN. This patch inserts waiting for recovery finish in the qeth open functions to enable successful qeth device opening in spite of a running recovery. Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com> Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/s390/net')
-rw-r--r--drivers/s390/net/qeth_l2_main.c18
-rw-r--r--drivers/s390/net/qeth_l3_main.c18
2 files changed, 32 insertions, 4 deletions
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 7a7a1b66478..2ac8f6aff5a 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -831,12 +831,14 @@ tx_drop:
831 return NETDEV_TX_OK; 831 return NETDEV_TX_OK;
832} 832}
833 833
834static int qeth_l2_open(struct net_device *dev) 834static int __qeth_l2_open(struct net_device *dev)
835{ 835{
836 struct qeth_card *card = dev->ml_priv; 836 struct qeth_card *card = dev->ml_priv;
837 int rc = 0; 837 int rc = 0;
838 838
839 QETH_CARD_TEXT(card, 4, "qethopen"); 839 QETH_CARD_TEXT(card, 4, "qethopen");
840 if (card->state == CARD_STATE_UP)
841 return rc;
840 if (card->state != CARD_STATE_SOFTSETUP) 842 if (card->state != CARD_STATE_SOFTSETUP)
841 return -ENODEV; 843 return -ENODEV;
842 844
@@ -857,6 +859,18 @@ static int qeth_l2_open(struct net_device *dev)
857 return rc; 859 return rc;
858} 860}
859 861
862static int qeth_l2_open(struct net_device *dev)
863{
864 struct qeth_card *card = dev->ml_priv;
865
866 QETH_CARD_TEXT(card, 5, "qethope_");
867 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
868 QETH_CARD_TEXT(card, 3, "openREC");
869 return -ERESTARTSYS;
870 }
871 return __qeth_l2_open(dev);
872}
873
860static int qeth_l2_stop(struct net_device *dev) 874static int qeth_l2_stop(struct net_device *dev)
861{ 875{
862 struct qeth_card *card = dev->ml_priv; 876 struct qeth_card *card = dev->ml_priv;
@@ -1046,7 +1060,7 @@ contin:
1046 if (recover_flag == CARD_STATE_RECOVER) { 1060 if (recover_flag == CARD_STATE_RECOVER) {
1047 if (recovery_mode && 1061 if (recovery_mode &&
1048 card->info.type != QETH_CARD_TYPE_OSN) { 1062 card->info.type != QETH_CARD_TYPE_OSN) {
1049 qeth_l2_open(card->dev); 1063 __qeth_l2_open(card->dev);
1050 } else { 1064 } else {
1051 rtnl_lock(); 1065 rtnl_lock();
1052 dev_open(card->dev); 1066 dev_open(card->dev);
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index e227e465bfc..988255b443e 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -3240,12 +3240,14 @@ tx_drop:
3240 return NETDEV_TX_OK; 3240 return NETDEV_TX_OK;
3241} 3241}
3242 3242
3243static int qeth_l3_open(struct net_device *dev) 3243static int __qeth_l3_open(struct net_device *dev)
3244{ 3244{
3245 struct qeth_card *card = dev->ml_priv; 3245 struct qeth_card *card = dev->ml_priv;
3246 int rc = 0; 3246 int rc = 0;
3247 3247
3248 QETH_CARD_TEXT(card, 4, "qethopen"); 3248 QETH_CARD_TEXT(card, 4, "qethopen");
3249 if (card->state == CARD_STATE_UP)
3250 return rc;
3249 if (card->state != CARD_STATE_SOFTSETUP) 3251 if (card->state != CARD_STATE_SOFTSETUP)
3250 return -ENODEV; 3252 return -ENODEV;
3251 card->data.state = CH_STATE_UP; 3253 card->data.state = CH_STATE_UP;
@@ -3260,6 +3262,18 @@ static int qeth_l3_open(struct net_device *dev)
3260 return rc; 3262 return rc;
3261} 3263}
3262 3264
3265static int qeth_l3_open(struct net_device *dev)
3266{
3267 struct qeth_card *card = dev->ml_priv;
3268
3269 QETH_CARD_TEXT(card, 5, "qethope_");
3270 if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
3271 QETH_CARD_TEXT(card, 3, "openREC");
3272 return -ERESTARTSYS;
3273 }
3274 return __qeth_l3_open(dev);
3275}
3276
3263static int qeth_l3_stop(struct net_device *dev) 3277static int qeth_l3_stop(struct net_device *dev)
3264{ 3278{
3265 struct qeth_card *card = dev->ml_priv; 3279 struct qeth_card *card = dev->ml_priv;
@@ -3564,7 +3578,7 @@ contin:
3564 netif_carrier_off(card->dev); 3578 netif_carrier_off(card->dev);
3565 if (recover_flag == CARD_STATE_RECOVER) { 3579 if (recover_flag == CARD_STATE_RECOVER) {
3566 if (recovery_mode) 3580 if (recovery_mode)
3567 qeth_l3_open(card->dev); 3581 __qeth_l3_open(card->dev);
3568 else { 3582 else {
3569 rtnl_lock(); 3583 rtnl_lock();
3570 dev_open(card->dev); 3584 dev_open(card->dev);