|
@@ -1292,13 +1292,14 @@ int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
|
|
QETH_QDIO_CLEANING)) {
|
|
QETH_QDIO_CLEANING)) {
|
|
case QETH_QDIO_ESTABLISHED:
|
|
case QETH_QDIO_ESTABLISHED:
|
|
if (card->info.type == QETH_CARD_TYPE_IQD)
|
|
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);
|
|
QDIO_FLAG_CLEANUP_USING_HALT);
|
|
else
|
|
else
|
|
- rc = qdio_cleanup(CARD_DDEV(card),
|
|
|
|
|
|
+ rc = qdio_shutdown(CARD_DDEV(card),
|
|
QDIO_FLAG_CLEANUP_USING_CLEAR);
|
|
QDIO_FLAG_CLEANUP_USING_CLEAR);
|
|
if (rc)
|
|
if (rc)
|
|
QETH_DBF_TEXT_(TRACE, 3, "1err%d", rc);
|
|
QETH_DBF_TEXT_(TRACE, 3, "1err%d", rc);
|
|
|
|
+ qdio_free(CARD_DDEV(card));
|
|
atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
|
|
atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
|
|
break;
|
|
break;
|
|
case QETH_QDIO_CLEANING:
|
|
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,
|
|
if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
|
|
QETH_QDIO_ESTABLISHED) == 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);
|
|
atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
|
|
|
|
+ qdio_free(CARD_DDEV(card));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+out:
|
|
kfree(out_sbal_ptrs);
|
|
kfree(out_sbal_ptrs);
|
|
kfree(in_sbal_ptrs);
|
|
kfree(in_sbal_ptrs);
|
|
kfree(qib_param_field);
|
|
kfree(qib_param_field);
|