"available\n", dev_name(&card->gdev->dev));
                return -ENOMEM;
        }
-       qeth_setup_ccw(&channel->ccw, CCW_CMD_READ, QETH_BUFSIZE, iob->data);
+       qeth_setup_ccw(channel->ccw, CCW_CMD_READ, QETH_BUFSIZE, iob->data);
        QETH_CARD_TEXT(card, 6, "noirqpnd");
-       rc = ccw_device_start(channel->ccwdev, &channel->ccw,
+       rc = ccw_device_start(channel->ccwdev, channel->ccw,
                              (addr_t) iob, 0, 0);
        if (rc) {
                QETH_DBF_MESSAGE(2, "%s error in starting next read ccw! "
 
        QETH_DBF_TEXT(SETUP, 2, "setupch");
 
+       channel->ccw = kmalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA);
+       if (!channel->ccw)
+               return -ENOMEM;
        channel->state = CH_STATE_DOWN;
        atomic_set(&channel->irq_pending, 0);
        init_waitqueue_head(&channel->wait_q);
                channel->iob[cnt].rc = 0;
        }
        if (cnt < QETH_CMD_BUFFER_NO) {
+               kfree(channel->ccw);
                while (cnt-- > 0)
                        kfree(channel->iob[cnt].data);
                return -ENOMEM;
        QETH_DBF_TEXT(SETUP, 2, "freech");
        for (cnt = 0; cnt < QETH_CMD_BUFFER_NO; cnt++)
                kfree(channel->iob[cnt].data);
+       kfree(channel->ccw);
 }
 
 static void qeth_set_single_write_queues(struct qeth_card *card)
        struct qeth_card *card;
 
        QETH_DBF_TEXT(SETUP, 2, "alloccrd");
-       card = kzalloc(sizeof(struct qeth_card), GFP_DMA|GFP_KERNEL);
+       card = kzalloc(sizeof(*card), GFP_KERNEL);
        if (!card)
                goto out;
        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
        if (!rcd_buf)
                return -ENOMEM;
 
-       qeth_setup_ccw(&channel->ccw, ciw->cmd, ciw->count, rcd_buf);
+       qeth_setup_ccw(channel->ccw, ciw->cmd, ciw->count, rcd_buf);
        channel->state = CH_STATE_RCD;
        spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
-       ret = ccw_device_start_timeout(channel->ccwdev, &channel->ccw,
+       ret = ccw_device_start_timeout(channel->ccwdev, channel->ccw,
                                       QETH_RCD_PARM, LPM_ANYPATH, 0,
                                       QETH_RCD_TIMEOUT);
        spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
        if (!iob)
                return -ENOMEM;
        iob->callback = idx_reply_cb;
-       qeth_setup_ccw(&channel->ccw, CCW_CMD_READ, QETH_BUFSIZE, iob->data);
+       qeth_setup_ccw(channel->ccw, CCW_CMD_READ, QETH_BUFSIZE, iob->data);
 
        wait_event(card->wait_q,
                   atomic_cmpxchg(&channel->irq_pending, 0, 1) == 0);
        QETH_DBF_TEXT(SETUP, 6, "noirqpnd");
        spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
-       rc = ccw_device_start_timeout(channel->ccwdev, &channel->ccw,
+       rc = ccw_device_start_timeout(channel->ccwdev, channel->ccw,
                                      (addr_t) iob, 0, 0, QETH_TIMEOUT);
        spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
 
        if (!iob)
                return -ENOMEM;
        iob->callback = idx_reply_cb;
-       qeth_setup_ccw(&channel->ccw, CCW_CMD_WRITE, IDX_ACTIVATE_SIZE,
+       qeth_setup_ccw(channel->ccw, CCW_CMD_WRITE, IDX_ACTIVATE_SIZE,
                       iob->data);
        if (channel == &card->write) {
                memcpy(iob->data, IDX_ACTIVATE_WRITE, IDX_ACTIVATE_SIZE);
                   atomic_cmpxchg(&channel->irq_pending, 0, 1) == 0);
        QETH_DBF_TEXT(SETUP, 6, "noirqpnd");
        spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
-       rc = ccw_device_start_timeout(channel->ccwdev, &channel->ccw,
+       rc = ccw_device_start_timeout(channel->ccwdev, channel->ccw,
                                      (addr_t) iob, 0, 0, QETH_TIMEOUT);
        spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
 
 void qeth_prepare_control_data(struct qeth_card *card, int len,
                struct qeth_cmd_buffer *iob)
 {
-       qeth_setup_ccw(&iob->channel->ccw, CCW_CMD_WRITE, len, iob->data);
+       qeth_setup_ccw(iob->channel->ccw, CCW_CMD_WRITE, len, iob->data);
        iob->callback = qeth_release_buffer;
 
        memcpy(QETH_TRANSPORT_HEADER_SEQ_NO(iob->data),
 
        QETH_CARD_TEXT(card, 6, "noirqpnd");
        spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
-       rc = ccw_device_start_timeout(channel->ccwdev, &channel->ccw,
+       rc = ccw_device_start_timeout(channel->ccwdev, channel->ccw,
                                      (addr_t) iob, 0, 0, event_timeout);
        spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
        if (rc) {
 
 static void qeth_core_free_card(struct qeth_card *card)
 {
-
        QETH_DBF_TEXT(SETUP, 2, "freecrd");
        QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
        qeth_clean_channel(&card->read);
        qeth_clean_channel(&card->write);
+       qeth_clean_channel(&card->data);
        qeth_free_qdio_buffers(card);
        unregister_service_level(&card->qeth_service_level);
        kfree(card);