static void ibmvfc_channel_setup_done(struct ibmvfc_event *evt)
 {
        struct ibmvfc_host *vhost = evt->vhost;
+       struct ibmvfc_channel_setup *setup = vhost->channel_setup_buf;
+       struct ibmvfc_scsi_channels *scrqs = &vhost->scsi_scrqs;
        u32 mad_status = be16_to_cpu(evt->xfer_iu->channel_setup.common.status);
        int level = IBMVFC_DEFAULT_LOG_LEVEL;
+       int flags, active_queues, i;
 
        ibmvfc_free_event(evt);
 
        switch (mad_status) {
        case IBMVFC_MAD_SUCCESS:
                ibmvfc_dbg(vhost, "Channel Setup succeded\n");
+               flags = be32_to_cpu(setup->flags);
                vhost->do_enquiry = 0;
+               active_queues = be32_to_cpu(setup->num_scsi_subq_channels);
+               scrqs->active_queues = active_queues;
+
+               if (flags & IBMVFC_CHANNELS_CANCELED) {
+                       ibmvfc_dbg(vhost, "Channels Canceled\n");
+                       vhost->using_channels = 0;
+               } else {
+                       if (active_queues)
+                               vhost->using_channels = 1;
+                       for (i = 0; i < active_queues; i++)
+                               scrqs->scrqs[i].vios_cookie =
+                                       be64_to_cpu(setup->channel_handles[i]);
+
+                       ibmvfc_dbg(vhost, "Using %u channels\n",
+                                  vhost->scsi_scrqs.active_queues);
+               }
                break;
        case IBMVFC_MAD_FAILED:
                level += ibmvfc_retry_host_init(vhost);
        struct ibmvfc_channel_setup_mad *mad;
        struct ibmvfc_channel_setup *setup_buf = vhost->channel_setup_buf;
        struct ibmvfc_event *evt = ibmvfc_get_event(&vhost->crq);
+       struct ibmvfc_scsi_channels *scrqs = &vhost->scsi_scrqs;
+       unsigned int num_channels =
+               min(vhost->client_scsi_channels, vhost->max_vios_scsi_channels);
+       int i;
 
        memset(setup_buf, 0, sizeof(*setup_buf));
-       setup_buf->flags = cpu_to_be32(IBMVFC_CANCEL_CHANNELS);
+       if (num_channels == 0)
+               setup_buf->flags = cpu_to_be32(IBMVFC_CANCEL_CHANNELS);
+       else {
+               setup_buf->num_scsi_subq_channels = cpu_to_be32(num_channels);
+               for (i = 0; i < num_channels; i++)
+                       setup_buf->channel_handles[i] = cpu_to_be64(scrqs->scrqs[i].cookie);
+       }
 
        ibmvfc_init_event(evt, ibmvfc_channel_setup_done, IBMVFC_MAD_FORMAT);
        mad = &evt->iu.channel_setup;