Skip to content

Commit

Permalink
qeth: postpone open till recovery is finished
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ursula Braun authored and David S. Miller committed Jan 16, 2011
1 parent 0f73f2c commit 3942344
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 4 deletions.
18 changes: 16 additions & 2 deletions drivers/s390/net/qeth_l2_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -831,12 +831,14 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}

static int qeth_l2_open(struct net_device *dev)
static int __qeth_l2_open(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
int rc = 0;

QETH_CARD_TEXT(card, 4, "qethopen");
if (card->state == CARD_STATE_UP)
return rc;
if (card->state != CARD_STATE_SOFTSETUP)
return -ENODEV;

Expand All @@ -857,6 +859,18 @@ static int qeth_l2_open(struct net_device *dev)
return rc;
}

static int qeth_l2_open(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;

QETH_CARD_TEXT(card, 5, "qethope_");
if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
QETH_CARD_TEXT(card, 3, "openREC");
return -ERESTARTSYS;
}
return __qeth_l2_open(dev);
}

static int qeth_l2_stop(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
Expand Down Expand Up @@ -1046,7 +1060,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
if (recover_flag == CARD_STATE_RECOVER) {
if (recovery_mode &&
card->info.type != QETH_CARD_TYPE_OSN) {
qeth_l2_open(card->dev);
__qeth_l2_open(card->dev);
} else {
rtnl_lock();
dev_open(card->dev);
Expand Down
18 changes: 16 additions & 2 deletions drivers/s390/net/qeth_l3_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3240,12 +3240,14 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}

static int qeth_l3_open(struct net_device *dev)
static int __qeth_l3_open(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
int rc = 0;

QETH_CARD_TEXT(card, 4, "qethopen");
if (card->state == CARD_STATE_UP)
return rc;
if (card->state != CARD_STATE_SOFTSETUP)
return -ENODEV;
card->data.state = CH_STATE_UP;
Expand All @@ -3260,6 +3262,18 @@ static int qeth_l3_open(struct net_device *dev)
return rc;
}

static int qeth_l3_open(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;

QETH_CARD_TEXT(card, 5, "qethope_");
if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
QETH_CARD_TEXT(card, 3, "openREC");
return -ERESTARTSYS;
}
return __qeth_l3_open(dev);
}

static int qeth_l3_stop(struct net_device *dev)
{
struct qeth_card *card = dev->ml_priv;
Expand Down Expand Up @@ -3564,7 +3578,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
netif_carrier_off(card->dev);
if (recover_flag == CARD_STATE_RECOVER) {
if (recovery_mode)
qeth_l3_open(card->dev);
__qeth_l3_open(card->dev);
else {
rtnl_lock();
dev_open(card->dev);
Expand Down

0 comments on commit 3942344

Please sign in to comment.