]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/net/qeth_l2_main.c
Merge branch 'for-2.6.28' of git://linux-nfs.org/~bfields/linux
[linux-2.6-omap-h63xx.git] / drivers / s390 / net / qeth_l2_main.c
index 3ac3cc1e03ccfc1ee7db35a63be8b643711036b3..1b1e80336d2c516deffc59eff87e08b9e03706cf 100644 (file)
@@ -373,8 +373,6 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 
        qeth_set_allowed_threads(card, 0, 1);
-       if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD))
-               return -ERESTARTSYS;
        if (card->read.state == CH_STATE_UP &&
            card->write.state == CH_STATE_UP &&
            (card->state == CARD_STATE_UP)) {
@@ -395,7 +393,8 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)
        }
        if (card->state == CARD_STATE_SOFTSETUP) {
                qeth_l2_process_vlans(card, 1);
-               qeth_l2_del_all_mc(card);
+               if (!card->use_hard_stop)
+                       qeth_l2_del_all_mc(card);
                qeth_clear_ipacmd_list(card);
                card->state = CARD_STATE_HARDSETUP;
        }
@@ -450,12 +449,15 @@ static void qeth_l2_process_inbound_buffer(struct qeth_card *card,
                        netif_rx(skb);
                        break;
                case QETH_HEADER_TYPE_OSN:
-                       skb_push(skb, sizeof(struct qeth_hdr));
-                       skb_copy_to_linear_data(skb, hdr,
+                       if (card->info.type == QETH_CARD_TYPE_OSN) {
+                               skb_push(skb, sizeof(struct qeth_hdr));
+                               skb_copy_to_linear_data(skb, hdr,
                                                sizeof(struct qeth_hdr));
-                       len = skb->len;
-                       card->osn_info.data_cb(skb);
-                       break;
+                               len = skb->len;
+                               card->osn_info.data_cb(skb);
+                               break;
+                       }
+                       /* else unknown */
                default:
                        dev_kfree_skb_any(skb);
                        QETH_DBF_TEXT(TRACE, 3, "inbunkno");
@@ -559,7 +561,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card)
                        "device %s: x%x\n", CARD_BUS_ID(card), rc);
        }
 
-       if (card->info.guestlan) {
+       if ((card->info.type == QETH_CARD_TYPE_IQD) || 
+           (card->info.guestlan)) {
                rc = qeth_setadpparms_change_macaddr(card);
                if (rc) {
                        QETH_DBF_MESSAGE(2, "couldn't get MAC address on "
@@ -825,7 +828,6 @@ static int qeth_l2_open(struct net_device *dev)
        }
        card->data.state = CH_STATE_UP;
        card->state = CARD_STATE_UP;
-       card->dev->flags |= IFF_UP;
        netif_start_queue(dev);
 
        if (!card->lan_online && netif_carrier_ok(dev))
@@ -840,7 +842,6 @@ static int qeth_l2_stop(struct net_device *dev)
 
        QETH_DBF_TEXT(TRACE, 4, "qethstop");
        netif_tx_disable(dev);
-       card->dev->flags &= ~IFF_UP;
        if (card->state == CARD_STATE_UP)
                card->state = CARD_STATE_SOFTSETUP;
        return 0;
@@ -975,12 +976,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
 
        qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1);
-       if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) {
-               PRINT_WARN("set_online of card %s interrupted by user!\n",
-                          CARD_BUS_ID(card));
-               return -ERESTARTSYS;
-       }
-
        recover_flag = card->state;
        rc = ccw_device_set_online(CARD_RDEV(card));
        if (rc) {
@@ -1091,11 +1086,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
        if (card->dev && netif_carrier_ok(card->dev))
                netif_carrier_off(card->dev);
        recover_flag = card->state;
-       if (qeth_l2_stop_card(card, recovery_mode) == -ERESTARTSYS) {
-               PRINT_WARN("Stopping card %s interrupted by user!\n",
-                          CARD_BUS_ID(card));
-               return -ERESTARTSYS;
-       }
+       qeth_l2_stop_card(card, recovery_mode);
        rc  = ccw_device_set_offline(CARD_DDEV(card));
        rc2 = ccw_device_set_offline(CARD_WDEV(card));
        rc3 = ccw_device_set_offline(CARD_RDEV(card));
@@ -1137,9 +1128,13 @@ static int qeth_l2_recover(void *ptr)
        if (!rc)
                PRINT_INFO("Device %s successfully recovered!\n",
                           CARD_BUS_ID(card));
-       else
+       else {
+               rtnl_lock();
+               dev_close(card->dev);
+               rtnl_unlock();
                PRINT_INFO("Device %s could not be recovered!\n",
                           CARD_BUS_ID(card));
+       }
        return 0;
 }