Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fix from James Bottomley:
"One driver fix: the pm8001 has never actually worked on a system with
an IOMMU and this fixes that use case"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: pm8001: Fix phys_to_virt() usage on dma_addr_t

+21 -17
+21 -17
drivers/scsi/pm8001/pm80xx_hwi.c
··· 3053 3053 struct smp_completion_resp *psmpPayload; 3054 3054 struct task_status_struct *ts; 3055 3055 struct pm8001_device *pm8001_dev; 3056 - char *pdma_respaddr = NULL; 3057 3056 3058 3057 psmpPayload = (struct smp_completion_resp *)(piomb + 4); 3059 3058 status = le32_to_cpu(psmpPayload->status); ··· 3079 3080 if (pm8001_dev) 3080 3081 atomic_dec(&pm8001_dev->running_req); 3081 3082 if (pm8001_ha->smp_exp_mode == SMP_DIRECT) { 3083 + struct scatterlist *sg_resp = &t->smp_task.smp_resp; 3084 + u8 *payload; 3085 + void *to; 3086 + 3082 3087 pm8001_dbg(pm8001_ha, IO, 3083 3088 "DIRECT RESPONSE Length:%d\n", 3084 3089 param); 3085 - pdma_respaddr = (char *)(phys_to_virt(cpu_to_le64 3086 - ((u64)sg_dma_address 3087 - (&t->smp_task.smp_resp)))); 3090 + to = kmap_atomic(sg_page(sg_resp)); 3091 + payload = to + sg_resp->offset; 3088 3092 for (i = 0; i < param; i++) { 3089 - *(pdma_respaddr+i) = psmpPayload->_r_a[i]; 3093 + *(payload + i) = psmpPayload->_r_a[i]; 3090 3094 pm8001_dbg(pm8001_ha, IO, 3091 3095 "SMP Byte%d DMA data 0x%x psmp 0x%x\n", 3092 - i, *(pdma_respaddr + i), 3096 + i, *(payload + i), 3093 3097 psmpPayload->_r_a[i]); 3094 3098 } 3099 + kunmap_atomic(to); 3095 3100 } 3096 3101 break; 3097 3102 case IO_ABORTED: ··· 4239 4236 struct sas_task *task = ccb->task; 4240 4237 struct domain_device *dev = task->dev; 4241 4238 struct pm8001_device *pm8001_dev = dev->lldd_dev; 4242 - struct scatterlist *sg_req, *sg_resp; 4239 + struct scatterlist *sg_req, *sg_resp, *smp_req; 4243 4240 u32 req_len, resp_len; 4244 4241 struct smp_req smp_cmd; 4245 4242 u32 opc; 4246 4243 struct inbound_queue_table *circularQ; 4247 - char *preq_dma_addr = NULL; 4248 - __le64 tmp_addr; 4249 4244 u32 i, length; 4245 + u8 *payload; 4246 + u8 *to; 4250 4247 4251 4248 memset(&smp_cmd, 0, sizeof(smp_cmd)); 4252 4249 /* ··· 4283 4280 pm8001_ha->smp_exp_mode = SMP_INDIRECT; 4284 4281 4285 4282 4286 - tmp_addr = cpu_to_le64((u64)sg_dma_address(&task->smp_task.smp_req)); 4287 - preq_dma_addr = (char *)phys_to_virt(tmp_addr); 4283 + smp_req = &task->smp_task.smp_req; 4284 + to = kmap_atomic(sg_page(smp_req)); 4285 + payload = to + smp_req->offset; 4288 4286 4289 4287 /* INDIRECT MODE command settings. Use DMA */ 4290 4288 if (pm8001_ha->smp_exp_mode == SMP_INDIRECT) { ··· 4293 4289 /* for SPCv indirect mode. Place the top 4 bytes of 4294 4290 * SMP Request header here. */ 4295 4291 for (i = 0; i < 4; i++) 4296 - smp_cmd.smp_req16[i] = *(preq_dma_addr + i); 4292 + smp_cmd.smp_req16[i] = *(payload + i); 4297 4293 /* exclude top 4 bytes for SMP req header */ 4298 4294 smp_cmd.long_smp_req.long_req_addr = 4299 4295 cpu_to_le64((u64)sg_dma_address ··· 4324 4320 pm8001_dbg(pm8001_ha, IO, "SMP REQUEST DIRECT MODE\n"); 4325 4321 for (i = 0; i < length; i++) 4326 4322 if (i < 16) { 4327 - smp_cmd.smp_req16[i] = *(preq_dma_addr+i); 4323 + smp_cmd.smp_req16[i] = *(payload + i); 4328 4324 pm8001_dbg(pm8001_ha, IO, 4329 4325 "Byte[%d]:%x (DMA data:%x)\n", 4330 4326 i, smp_cmd.smp_req16[i], 4331 - *(preq_dma_addr)); 4327 + *(payload)); 4332 4328 } else { 4333 - smp_cmd.smp_req[i] = *(preq_dma_addr+i); 4329 + smp_cmd.smp_req[i] = *(payload + i); 4334 4330 pm8001_dbg(pm8001_ha, IO, 4335 4331 "Byte[%d]:%x (DMA data:%x)\n", 4336 4332 i, smp_cmd.smp_req[i], 4337 - *(preq_dma_addr)); 4333 + *(payload)); 4338 4334 } 4339 4335 } 4340 - 4336 + kunmap_atomic(to); 4341 4337 build_smp_cmd(pm8001_dev->device_id, smp_cmd.tag, 4342 4338 &smp_cmd, pm8001_ha->smp_exp_mode, length); 4343 4339 rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &smp_cmd,