Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input
[pandora-kernel.git] / drivers / block / cciss.c
index 3e9fb6e..418b146 100644 (file)
@@ -1135,7 +1135,7 @@ static int revalidate_allvol(ctlr_info_t *host)
                /* this is for the online array utilities */
                if (!drv->heads && i)
                        continue;
-               blk_queue_hardsect_size(host->queue, drv->block_size);
+               blk_queue_hardsect_size(drv->queue, drv->block_size);
                set_capacity(disk, drv->nr_blocks);
                add_disk(disk);
        }
@@ -1691,7 +1691,7 @@ static int cciss_revalidate(struct gendisk *disk)
        cciss_read_capacity(h->ctlr, logvol, size_buff, 1, &total_size, &block_size);
        cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, inq_buff, drv);
 
-       blk_queue_hardsect_size(h->queue, drv->block_size);
+       blk_queue_hardsect_size(drv->queue, drv->block_size);
        set_capacity(disk, drv->nr_blocks);
 
        kfree(size_buff);
@@ -2248,12 +2248,12 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
         * them up.  We will also keep track of the next queue to run so
         * that every queue gets a chance to be started first.
        */
-       for (j=0; j < NWD; j++){
-               int curr_queue = (start_queue + j) % NWD;
+       for (j=0; j < h->highest_lun + 1; j++){
+               int curr_queue = (start_queue + j) % (h->highest_lun + 1);
                /* make sure the disk has been added and the drive is real
                 * because this can be called from the middle of init_one.
                */
-               if(!(h->gendisk[curr_queue]->queue) ||
+               if(!(h->drv[curr_queue].queue) ||
                                   !(h->drv[curr_queue].heads))
                        continue;
                blk_start_queue(h->gendisk[curr_queue]->queue);
@@ -2264,14 +2264,14 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
                if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
                {
                        if (curr_queue == start_queue){
-                               h->next_to_run = (start_queue + 1) % NWD;
+                               h->next_to_run = (start_queue + 1) % (h->highest_lun + 1);
                                goto cleanup;
                        } else {
                                h->next_to_run = curr_queue;
                                goto cleanup;
        }
                } else {
-                       curr_queue = (curr_queue + 1) % NWD;
+                       curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
                }
        }
 
@@ -2279,7 +2279,6 @@ cleanup:
        spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
        return IRQ_HANDLED;
 }
-
 /* 
  *  We cannot read the structure directly, for portablity we must use 
  *   the io functions.
@@ -2789,13 +2788,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
        }
 
        spin_lock_init(&hba[i]->lock);
-       q = blk_init_queue(do_cciss_request, &hba[i]->lock);
-       if (!q)
-               goto clean4;
-
-       q->backing_dev_info.ra_pages = READ_AHEAD;
-       hba[i]->queue = q;
-       q->queuedata = hba[i];
 
        /* Initialize the pdev driver private data. 
                have it point to hba[i].  */
@@ -2817,6 +2809,20 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
 
        cciss_procinit(i);
 
+       for(j=0; j < NWD; j++) { /* mfm */
+               drive_info_struct *drv = &(hba[i]->drv[j]);
+               struct gendisk *disk = hba[i]->gendisk[j];
+
+               q = blk_init_queue(do_cciss_request, &hba[i]->lock);
+               if (!q) {
+                       printk(KERN_ERR
+                          "cciss:  unable to allocate queue for disk %d\n",
+                          j);
+                       break;
+               }
+               drv->queue = q;
+
+               q->backing_dev_info.ra_pages = READ_AHEAD;
        blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
 
        /* This is a hardware imposed limit. */
@@ -2827,26 +2833,23 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
 
        blk_queue_max_sectors(q, 512);
 
-
-       for(j=0; j<NWD; j++) {
-               drive_info_struct *drv = &(hba[i]->drv[j]);
-               struct gendisk *disk = hba[i]->gendisk[j];
-
+               q->queuedata = hba[i];
                sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
                sprintf(disk->devfs_name, "cciss/host%d/target%d", i, j);
                disk->major = hba[i]->major;
                disk->first_minor = j << NWD_SHIFT;
                disk->fops = &cciss_fops;
-               disk->queue = hba[i]->queue;
+               disk->queue = q;
                disk->private_data = drv;
                /* we must register the controller even if no disks exist */
                /* this is for the online array utilities */
                if(!drv->heads && j)
                        continue;
-               blk_queue_hardsect_size(hba[i]->queue, drv->block_size);
+               blk_queue_hardsect_size(q, drv->block_size);
                set_capacity(disk, drv->nr_blocks);
                add_disk(disk);
        }
+
        return(1);
 
 clean4:
@@ -2912,10 +2915,10 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
        for (j = 0; j < NWD; j++) {
                struct gendisk *disk = hba[i]->gendisk[j];
                if (disk->flags & GENHD_FL_UP)
+                       blk_cleanup_queue(disk->queue);
                        del_gendisk(disk);
        }
 
-       blk_cleanup_queue(hba[i]->queue);
        pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
                            hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
        pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),