Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / drivers / s390 / net / qeth_core_main.c
index 3ba738b..28f7134 100644 (file)
@@ -1292,13 +1292,14 @@ int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
                QETH_QDIO_CLEANING)) {
        case QETH_QDIO_ESTABLISHED:
                if (card->info.type == QETH_CARD_TYPE_IQD)
-                       rc = qdio_cleanup(CARD_DDEV(card),
+                       rc = qdio_shutdown(CARD_DDEV(card),
                                QDIO_FLAG_CLEANUP_USING_HALT);
                else
-                       rc = qdio_cleanup(CARD_DDEV(card),
+                       rc = qdio_shutdown(CARD_DDEV(card),
                                QDIO_FLAG_CLEANUP_USING_CLEAR);
                if (rc)
                        QETH_DBF_TEXT_(TRACE, 3, "1err%d", rc);
+               qdio_free(CARD_DDEV(card));
                atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
                break;
        case QETH_QDIO_CLEANING:
@@ -3810,10 +3811,18 @@ static int qeth_qdio_establish(struct qeth_card *card)
 
        if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
                QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) {
-               rc = qdio_initialize(&init_data);
-               if (rc)
+               rc = qdio_allocate(&init_data);
+               if (rc) {
+                       atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
+                       goto out;
+               }
+               rc = qdio_establish(&init_data);
+               if (rc) {
                        atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
+                       qdio_free(CARD_DDEV(card));
+               }
        }
+out:
        kfree(out_sbal_ptrs);
        kfree(in_sbal_ptrs);
        kfree(qib_param_field);