Merge branch 'x86-mpx-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / drivers / scsi / ipr.c
index 2a9578c..5402943 100644 (file)
@@ -3942,8 +3942,9 @@ static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
                return -EIO;
        }
 
-       sglist->num_dma_sg = pci_map_sg(ioa_cfg->pdev, sglist->scatterlist,
-                                       sglist->num_sg, DMA_TO_DEVICE);
+       sglist->num_dma_sg = dma_map_sg(&ioa_cfg->pdev->dev,
+                                       sglist->scatterlist, sglist->num_sg,
+                                       DMA_TO_DEVICE);
 
        if (!sglist->num_dma_sg) {
                spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
@@ -4327,16 +4328,12 @@ static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg) { return 0; };
  * Return value:
  *     actual depth set
  **/
-static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth,
-                                 int reason)
+static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth)
 {
        struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata;
        struct ipr_resource_entry *res;
        unsigned long lock_flags = 0;
 
-       if (reason != SCSI_QDEPTH_DEFAULT)
-               return -EOPNOTSUPP;
-
        spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
        res = (struct ipr_resource_entry *)sdev->hostdata;
 
@@ -4344,7 +4341,7 @@ static int ipr_change_queue_depth(struct scsi_device *sdev, int qdepth,
                qdepth = IPR_MAX_CMD_PER_ATA_LUN;
        spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
 
-       scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth);
+       scsi_change_queue_depth(sdev, qdepth);
        return sdev->queue_depth;
 }
 
@@ -4364,24 +4361,10 @@ static int ipr_change_queue_type(struct scsi_device *sdev, int tag_type)
 
        spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
        res = (struct ipr_resource_entry *)sdev->hostdata;
-
-       if (res) {
-               if (ipr_is_gscsi(res) && sdev->tagged_supported) {
-                       /*
-                        * We don't bother quiescing the device here since the
-                        * adapter firmware does it for us.
-                        */
-                       scsi_set_tag_type(sdev, tag_type);
-
-                       if (tag_type)
-                               scsi_activate_tcq(sdev, sdev->queue_depth);
-                       else
-                               scsi_deactivate_tcq(sdev, sdev->queue_depth);
-               } else
-                       tag_type = 0;
-       } else
+       if (res && ipr_is_gscsi(res))
+               tag_type = scsi_change_queue_type(sdev, tag_type);
+       else
                tag_type = 0;
-
        spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
        return tag_type;
 }
@@ -4765,10 +4748,10 @@ static int ipr_slave_configure(struct scsi_device *sdev)
                spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
 
                if (ap) {
-                       scsi_adjust_queue_depth(sdev, 0, IPR_MAX_CMD_PER_ATA_LUN);
+                       scsi_change_queue_depth(sdev, IPR_MAX_CMD_PER_ATA_LUN);
                        ata_sas_slave_configure(sdev, ap);
-               } else
-                       scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
+               }
+
                if (ioa_cfg->sis64)
                        sdev_printk(KERN_INFO, sdev, "Resource path: %s\n",
                                    ipr_format_res_path(ioa_cfg,
@@ -5585,7 +5568,7 @@ static int ipr_build_ioadl64(struct ipr_ioa_cfg *ioa_cfg,
        nseg = scsi_dma_map(scsi_cmd);
        if (nseg < 0) {
                if (printk_ratelimit())
-                       dev_err(&ioa_cfg->pdev->dev, "pci_map_sg failed!\n");
+                       dev_err(&ioa_cfg->pdev->dev, "scsi_dma_map failed!\n");
                return -1;
        }
 
@@ -5636,7 +5619,7 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg,
 
        nseg = scsi_dma_map(scsi_cmd);
        if (nseg < 0) {
-               dev_err(&ioa_cfg->pdev->dev, "pci_map_sg failed!\n");
+               dev_err(&ioa_cfg->pdev->dev, "scsi_dma_map failed!\n");
                return -1;
        }
 
@@ -5672,35 +5655,6 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg,
        return 0;
 }
 
-/**
- * ipr_get_task_attributes - Translate SPI Q-Tag to task attributes
- * @scsi_cmd:  scsi command struct
- *
- * Return value:
- *     task attributes
- **/
-static u8 ipr_get_task_attributes(struct scsi_cmnd *scsi_cmd)
-{
-       u8 tag[2];
-       u8 rc = IPR_FLAGS_LO_UNTAGGED_TASK;
-
-       if (scsi_populate_tag_msg(scsi_cmd, tag)) {
-               switch (tag[0]) {
-               case MSG_SIMPLE_TAG:
-                       rc = IPR_FLAGS_LO_SIMPLE_TASK;
-                       break;
-               case MSG_HEAD_TAG:
-                       rc = IPR_FLAGS_LO_HEAD_OF_Q_TASK;
-                       break;
-               case MSG_ORDERED_TAG:
-                       rc = IPR_FLAGS_LO_ORDERED_TASK;
-                       break;
-               };
-       }
-
-       return rc;
-}
-
 /**
  * ipr_erp_done - Process completion of ERP for a device
  * @ipr_cmd:           ipr command struct
@@ -6236,7 +6190,10 @@ static int ipr_queuecommand(struct Scsi_Host *shost,
                        ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_DELAY_AFTER_RST;
                }
                ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_ALIGNED_BFR;
-               ioarcb->cmd_pkt.flags_lo |= ipr_get_task_attributes(scsi_cmd);
+               if (scsi_cmd->flags & SCMD_TAGGED)
+                       ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_SIMPLE_TASK;
+               else
+                       ioarcb->cmd_pkt.flags_lo |= IPR_FLAGS_LO_UNTAGGED_TASK;
        }
 
        if (scsi_cmd->cmnd[0] >= 0xC0 &&
@@ -6357,6 +6314,7 @@ static struct scsi_host_template driver_template = {
        .sdev_attrs = ipr_dev_attrs,
        .proc_name = IPR_NAME,
        .no_write_same = 1,
+       .use_blk_tags = 1,
 };
 
 /**
@@ -8431,7 +8389,7 @@ static int ipr_reset_ucode_download_done(struct ipr_cmnd *ipr_cmd)
        struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
        struct ipr_sglist *sglist = ioa_cfg->ucode_sglist;
 
-       pci_unmap_sg(ioa_cfg->pdev, sglist->scatterlist,
+       dma_unmap_sg(&ioa_cfg->pdev->dev, sglist->scatterlist,
                     sglist->num_sg, DMA_TO_DEVICE);
 
        ipr_cmd->job_step = ipr_reset_alert;
@@ -8871,7 +8829,7 @@ static void ipr_free_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
 
        for (i = 0; i < IPR_NUM_CMD_BLKS; i++) {
                if (ioa_cfg->ipr_cmnd_list[i])
-                       pci_pool_free(ioa_cfg->ipr_cmd_pool,
+                       dma_pool_free(ioa_cfg->ipr_cmd_pool,
                                      ioa_cfg->ipr_cmnd_list[i],
                                      ioa_cfg->ipr_cmnd_list_dma[i]);
 
@@ -8879,7 +8837,7 @@ static void ipr_free_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
        }
 
        if (ioa_cfg->ipr_cmd_pool)
-               pci_pool_destroy(ioa_cfg->ipr_cmd_pool);
+               dma_pool_destroy(ioa_cfg->ipr_cmd_pool);
 
        kfree(ioa_cfg->ipr_cmnd_list);
        kfree(ioa_cfg->ipr_cmnd_list_dma);
@@ -8900,25 +8858,24 @@ static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg)
        int i;
 
        kfree(ioa_cfg->res_entries);
-       pci_free_consistent(ioa_cfg->pdev, sizeof(struct ipr_misc_cbs),
-                           ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma);
+       dma_free_coherent(&ioa_cfg->pdev->dev, sizeof(struct ipr_misc_cbs),
+                         ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma);
        ipr_free_cmd_blks(ioa_cfg);
 
        for (i = 0; i < ioa_cfg->hrrq_num; i++)
-               pci_free_consistent(ioa_cfg->pdev,
-                                       sizeof(u32) * ioa_cfg->hrrq[i].size,
-                                       ioa_cfg->hrrq[i].host_rrq,
-                                       ioa_cfg->hrrq[i].host_rrq_dma);
+               dma_free_coherent(&ioa_cfg->pdev->dev,
+                                 sizeof(u32) * ioa_cfg->hrrq[i].size,
+                                 ioa_cfg->hrrq[i].host_rrq,
+                                 ioa_cfg->hrrq[i].host_rrq_dma);
 
-       pci_free_consistent(ioa_cfg->pdev, ioa_cfg->cfg_table_size,
-                           ioa_cfg->u.cfg_table,
-                           ioa_cfg->cfg_table_dma);
+       dma_free_coherent(&ioa_cfg->pdev->dev, ioa_cfg->cfg_table_size,
+                         ioa_cfg->u.cfg_table, ioa_cfg->cfg_table_dma);
 
        for (i = 0; i < IPR_NUM_HCAMS; i++) {
-               pci_free_consistent(ioa_cfg->pdev,
-                                   sizeof(struct ipr_hostrcb),
-                                   ioa_cfg->hostrcb[i],
-                                   ioa_cfg->hostrcb_dma[i]);
+               dma_free_coherent(&ioa_cfg->pdev->dev,
+                                 sizeof(struct ipr_hostrcb),
+                                 ioa_cfg->hostrcb[i],
+                                 ioa_cfg->hostrcb_dma[i]);
        }
 
        ipr_free_dump(ioa_cfg);
@@ -8979,7 +8936,7 @@ static int ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
        dma_addr_t dma_addr;
        int i, entries_each_hrrq, hrrq_id = 0;
 
-       ioa_cfg->ipr_cmd_pool = pci_pool_create(IPR_NAME, ioa_cfg->pdev,
+       ioa_cfg->ipr_cmd_pool = dma_pool_create(IPR_NAME, &ioa_cfg->pdev->dev,
                                                sizeof(struct ipr_cmnd), 512, 0);
 
        if (!ioa_cfg->ipr_cmd_pool)
@@ -9029,7 +8986,7 @@ static int ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg)
        }
 
        for (i = 0; i < IPR_NUM_CMD_BLKS; i++) {
-               ipr_cmd = pci_pool_alloc(ioa_cfg->ipr_cmd_pool, GFP_KERNEL, &dma_addr);
+               ipr_cmd = dma_pool_alloc(ioa_cfg->ipr_cmd_pool, GFP_KERNEL, &dma_addr);
 
                if (!ipr_cmd) {
                        ipr_free_cmd_blks(ioa_cfg);
@@ -9100,9 +9057,10 @@ static int ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
                ioa_cfg->res_entries[i].ioa_cfg = ioa_cfg;
        }
 
-       ioa_cfg->vpd_cbs = pci_alloc_consistent(ioa_cfg->pdev,
-                                               sizeof(struct ipr_misc_cbs),
-                                               &ioa_cfg->vpd_cbs_dma);
+       ioa_cfg->vpd_cbs = dma_alloc_coherent(&pdev->dev,
+                                             sizeof(struct ipr_misc_cbs),
+                                             &ioa_cfg->vpd_cbs_dma,
+                                             GFP_KERNEL);
 
        if (!ioa_cfg->vpd_cbs)
                goto out_free_res_entries;
@@ -9111,13 +9069,14 @@ static int ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
                goto out_free_vpd_cbs;
 
        for (i = 0; i < ioa_cfg->hrrq_num; i++) {
-               ioa_cfg->hrrq[i].host_rrq = pci_alloc_consistent(ioa_cfg->pdev,
+               ioa_cfg->hrrq[i].host_rrq = dma_alloc_coherent(&pdev->dev,
                                        sizeof(u32) * ioa_cfg->hrrq[i].size,
-                                       &ioa_cfg->hrrq[i].host_rrq_dma);
+                                       &ioa_cfg->hrrq[i].host_rrq_dma,
+                                       GFP_KERNEL);
 
                if (!ioa_cfg->hrrq[i].host_rrq)  {
                        while (--i > 0)
-                               pci_free_consistent(pdev,
+                               dma_free_coherent(&pdev->dev,
                                        sizeof(u32) * ioa_cfg->hrrq[i].size,
                                        ioa_cfg->hrrq[i].host_rrq,
                                        ioa_cfg->hrrq[i].host_rrq_dma);
@@ -9126,17 +9085,19 @@ static int ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg)
                ioa_cfg->hrrq[i].ioa_cfg = ioa_cfg;
        }
 
-       ioa_cfg->u.cfg_table = pci_alloc_consistent(ioa_cfg->pdev,
-                                                   ioa_cfg->cfg_table_size,
-                                                   &ioa_cfg->cfg_table_dma);
+       ioa_cfg->u.cfg_table = dma_alloc_coherent(&pdev->dev,
+                                                 ioa_cfg->cfg_table_size,
+                                                 &ioa_cfg->cfg_table_dma,
+                                                 GFP_KERNEL);
 
        if (!ioa_cfg->u.cfg_table)
                goto out_free_host_rrq;
 
        for (i = 0; i < IPR_NUM_HCAMS; i++) {
-               ioa_cfg->hostrcb[i] = pci_alloc_consistent(ioa_cfg->pdev,
-                                                          sizeof(struct ipr_hostrcb),
-                                                          &ioa_cfg->hostrcb_dma[i]);
+               ioa_cfg->hostrcb[i] = dma_alloc_coherent(&pdev->dev,
+                                                        sizeof(struct ipr_hostrcb),
+                                                        &ioa_cfg->hostrcb_dma[i],
+                                                        GFP_KERNEL);
 
                if (!ioa_cfg->hostrcb[i])
                        goto out_free_hostrcb_dma;
@@ -9160,25 +9121,24 @@ out:
 
 out_free_hostrcb_dma:
        while (i-- > 0) {
-               pci_free_consistent(pdev, sizeof(struct ipr_hostrcb),
-                                   ioa_cfg->hostrcb[i],
-                                   ioa_cfg->hostrcb_dma[i]);
+               dma_free_coherent(&pdev->dev, sizeof(struct ipr_hostrcb),
+                                 ioa_cfg->hostrcb[i],
+                                 ioa_cfg->hostrcb_dma[i]);
        }
-       pci_free_consistent(pdev, ioa_cfg->cfg_table_size,
-                           ioa_cfg->u.cfg_table,
-                           ioa_cfg->cfg_table_dma);
+       dma_free_coherent(&pdev->dev, ioa_cfg->cfg_table_size,
+                         ioa_cfg->u.cfg_table, ioa_cfg->cfg_table_dma);
 out_free_host_rrq:
        for (i = 0; i < ioa_cfg->hrrq_num; i++) {
-               pci_free_consistent(pdev,
-                               sizeof(u32) * ioa_cfg->hrrq[i].size,
-                               ioa_cfg->hrrq[i].host_rrq,
-                               ioa_cfg->hrrq[i].host_rrq_dma);
+               dma_free_coherent(&pdev->dev,
+                                 sizeof(u32) * ioa_cfg->hrrq[i].size,
+                                 ioa_cfg->hrrq[i].host_rrq,
+                                 ioa_cfg->hrrq[i].host_rrq_dma);
        }
 out_ipr_free_cmd_blocks:
        ipr_free_cmd_blks(ioa_cfg);
 out_free_vpd_cbs:
-       pci_free_consistent(pdev, sizeof(struct ipr_misc_cbs),
-                           ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma);
+       dma_free_coherent(&pdev->dev, sizeof(struct ipr_misc_cbs),
+                         ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma);
 out_free_res_entries:
        kfree(ioa_cfg->res_entries);
        goto out;
@@ -9618,16 +9578,17 @@ static int ipr_probe_ioa(struct pci_dev *pdev,
        ipr_init_regs(ioa_cfg);
 
        if (ioa_cfg->sis64) {
-               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
+               rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
                if (rc < 0) {
-                       dev_dbg(&pdev->dev, "Failed to set 64 bit PCI DMA mask\n");
-                       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+                       dev_dbg(&pdev->dev, "Failed to set 64 bit DMA mask\n");
+                       rc = dma_set_mask_and_coherent(&pdev->dev,
+                                                      DMA_BIT_MASK(32));
                }
        } else
-               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+               rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
 
        if (rc < 0) {
-               dev_err(&pdev->dev, "Failed to set PCI DMA mask\n");
+               dev_err(&pdev->dev, "Failed to set DMA mask\n");
                goto cleanup_nomem;
        }