aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/pm8001
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/pm8001')
-rw-r--r--drivers/scsi/pm8001/pm8001_hwi.c84
-rw-r--r--drivers/scsi/pm8001/pm8001_sas.h12
-rw-r--r--drivers/scsi/pm8001/pm80xx_hwi.c84
3 files changed, 38 insertions, 142 deletions
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index 561ca2c348d6..a97be015e52e 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -2502,11 +2502,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2502 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2502 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
2503 ts->resp = SAS_TASK_UNDELIVERED; 2503 ts->resp = SAS_TASK_UNDELIVERED;
2504 ts->stat = SAS_QUEUE_FULL; 2504 ts->stat = SAS_QUEUE_FULL;
2505 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2505 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2506 mb();/*in order to force CPU ordering*/
2507 spin_unlock_irq(&pm8001_ha->lock);
2508 t->task_done(t);
2509 spin_lock_irq(&pm8001_ha->lock);
2510 return; 2506 return;
2511 } 2507 }
2512 break; 2508 break;
@@ -2522,11 +2518,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2522 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2518 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
2523 ts->resp = SAS_TASK_UNDELIVERED; 2519 ts->resp = SAS_TASK_UNDELIVERED;
2524 ts->stat = SAS_QUEUE_FULL; 2520 ts->stat = SAS_QUEUE_FULL;
2525 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2521 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2526 mb();/*ditto*/
2527 spin_unlock_irq(&pm8001_ha->lock);
2528 t->task_done(t);
2529 spin_lock_irq(&pm8001_ha->lock);
2530 return; 2522 return;
2531 } 2523 }
2532 break; 2524 break;
@@ -2550,11 +2542,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2550 IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY); 2542 IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY);
2551 ts->resp = SAS_TASK_UNDELIVERED; 2543 ts->resp = SAS_TASK_UNDELIVERED;
2552 ts->stat = SAS_QUEUE_FULL; 2544 ts->stat = SAS_QUEUE_FULL;
2553 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2545 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2554 mb();/* ditto*/
2555 spin_unlock_irq(&pm8001_ha->lock);
2556 t->task_done(t);
2557 spin_lock_irq(&pm8001_ha->lock);
2558 return; 2546 return;
2559 } 2547 }
2560 break; 2548 break;
@@ -2617,11 +2605,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2617 IO_DS_NON_OPERATIONAL); 2605 IO_DS_NON_OPERATIONAL);
2618 ts->resp = SAS_TASK_UNDELIVERED; 2606 ts->resp = SAS_TASK_UNDELIVERED;
2619 ts->stat = SAS_QUEUE_FULL; 2607 ts->stat = SAS_QUEUE_FULL;
2620 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2608 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2621 mb();/*ditto*/
2622 spin_unlock_irq(&pm8001_ha->lock);
2623 t->task_done(t);
2624 spin_lock_irq(&pm8001_ha->lock);
2625 return; 2609 return;
2626 } 2610 }
2627 break; 2611 break;
@@ -2641,11 +2625,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2641 IO_DS_IN_ERROR); 2625 IO_DS_IN_ERROR);
2642 ts->resp = SAS_TASK_UNDELIVERED; 2626 ts->resp = SAS_TASK_UNDELIVERED;
2643 ts->stat = SAS_QUEUE_FULL; 2627 ts->stat = SAS_QUEUE_FULL;
2644 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2628 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2645 mb();/*ditto*/
2646 spin_unlock_irq(&pm8001_ha->lock);
2647 t->task_done(t);
2648 spin_lock_irq(&pm8001_ha->lock);
2649 return; 2629 return;
2650 } 2630 }
2651 break; 2631 break;
@@ -2674,20 +2654,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2674 " resp 0x%x stat 0x%x but aborted by upper layer!\n", 2654 " resp 0x%x stat 0x%x but aborted by upper layer!\n",
2675 t, status, ts->resp, ts->stat)); 2655 t, status, ts->resp, ts->stat));
2676 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2656 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2677 } else if (t->uldd_task) { 2657 } else {
2678 spin_unlock_irqrestore(&t->task_state_lock, flags);
2679 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2680 mb();/* ditto */
2681 spin_unlock_irq(&pm8001_ha->lock);
2682 t->task_done(t);
2683 spin_lock_irq(&pm8001_ha->lock);
2684 } else if (!t->uldd_task) {
2685 spin_unlock_irqrestore(&t->task_state_lock, flags); 2658 spin_unlock_irqrestore(&t->task_state_lock, flags);
2686 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2659 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2687 mb();/*ditto*/
2688 spin_unlock_irq(&pm8001_ha->lock);
2689 t->task_done(t);
2690 spin_lock_irq(&pm8001_ha->lock);
2691 } 2660 }
2692} 2661}
2693 2662
@@ -2796,11 +2765,7 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2796 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2765 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
2797 ts->resp = SAS_TASK_COMPLETE; 2766 ts->resp = SAS_TASK_COMPLETE;
2798 ts->stat = SAS_QUEUE_FULL; 2767 ts->stat = SAS_QUEUE_FULL;
2799 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2768 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2800 mb();/*ditto*/
2801 spin_unlock_irq(&pm8001_ha->lock);
2802 t->task_done(t);
2803 spin_lock_irq(&pm8001_ha->lock);
2804 return; 2769 return;
2805 } 2770 }
2806 break; 2771 break;
@@ -2909,20 +2874,9 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2909 " resp 0x%x stat 0x%x but aborted by upper layer!\n", 2874 " resp 0x%x stat 0x%x but aborted by upper layer!\n",
2910 t, event, ts->resp, ts->stat)); 2875 t, event, ts->resp, ts->stat));
2911 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2876 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2912 } else if (t->uldd_task) { 2877 } else {
2913 spin_unlock_irqrestore(&t->task_state_lock, flags);
2914 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2915 mb();/* ditto */
2916 spin_unlock_irq(&pm8001_ha->lock);
2917 t->task_done(t);
2918 spin_lock_irq(&pm8001_ha->lock);
2919 } else if (!t->uldd_task) {
2920 spin_unlock_irqrestore(&t->task_state_lock, flags); 2878 spin_unlock_irqrestore(&t->task_state_lock, flags);
2921 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2879 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2922 mb();/*ditto*/
2923 spin_unlock_irq(&pm8001_ha->lock);
2924 t->task_done(t);
2925 spin_lock_irq(&pm8001_ha->lock);
2926 } 2880 }
2927} 2881}
2928 2882
@@ -4467,23 +4421,11 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
4467 " stat 0x%x but aborted by upper layer " 4421 " stat 0x%x but aborted by upper layer "
4468 "\n", task, ts->resp, ts->stat)); 4422 "\n", task, ts->resp, ts->stat));
4469 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag); 4423 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
4470 } else if (task->uldd_task) { 4424 } else {
4471 spin_unlock_irqrestore(&task->task_state_lock,
4472 flags);
4473 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
4474 mb();/* ditto */
4475 spin_unlock_irq(&pm8001_ha->lock);
4476 task->task_done(task);
4477 spin_lock_irq(&pm8001_ha->lock);
4478 return 0;
4479 } else if (!task->uldd_task) {
4480 spin_unlock_irqrestore(&task->task_state_lock, 4425 spin_unlock_irqrestore(&task->task_state_lock,
4481 flags); 4426 flags);
4482 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag); 4427 pm8001_ccb_task_free_done(pm8001_ha, task,
4483 mb();/*ditto*/ 4428 ccb, tag);
4484 spin_unlock_irq(&pm8001_ha->lock);
4485 task->task_done(task);
4486 spin_lock_irq(&pm8001_ha->lock);
4487 return 0; 4429 return 0;
4488 } 4430 }
4489 } 4431 }
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 6c5fd5ee22d3..1ee06f21803b 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -708,5 +708,17 @@ ssize_t pm8001_get_gsm_dump(struct device *cdev, u32, char *buf);
708/* ctl shared API */ 708/* ctl shared API */
709extern struct device_attribute *pm8001_host_attrs[]; 709extern struct device_attribute *pm8001_host_attrs[];
710 710
711static inline void
712pm8001_ccb_task_free_done(struct pm8001_hba_info *pm8001_ha,
713 struct sas_task *task, struct pm8001_ccb_info *ccb,
714 u32 ccb_idx)
715{
716 pm8001_ccb_task_free(pm8001_ha, task, ccb, ccb_idx);
717 smp_mb(); /*in order to force CPU ordering*/
718 spin_unlock(&pm8001_ha->lock);
719 task->task_done(task);
720 spin_lock(&pm8001_ha->lock);
721}
722
711#endif 723#endif
712 724
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 9b5414249cc4..d70587f96184 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -2168,11 +2168,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2168 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2168 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
2169 ts->resp = SAS_TASK_UNDELIVERED; 2169 ts->resp = SAS_TASK_UNDELIVERED;
2170 ts->stat = SAS_QUEUE_FULL; 2170 ts->stat = SAS_QUEUE_FULL;
2171 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2171 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2172 mb();/*in order to force CPU ordering*/
2173 spin_unlock_irq(&pm8001_ha->lock);
2174 t->task_done(t);
2175 spin_lock_irq(&pm8001_ha->lock);
2176 return; 2172 return;
2177 } 2173 }
2178 break; 2174 break;
@@ -2188,11 +2184,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2188 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2184 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
2189 ts->resp = SAS_TASK_UNDELIVERED; 2185 ts->resp = SAS_TASK_UNDELIVERED;
2190 ts->stat = SAS_QUEUE_FULL; 2186 ts->stat = SAS_QUEUE_FULL;
2191 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2187 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2192 mb();/*ditto*/
2193 spin_unlock_irq(&pm8001_ha->lock);
2194 t->task_done(t);
2195 spin_lock_irq(&pm8001_ha->lock);
2196 return; 2188 return;
2197 } 2189 }
2198 break; 2190 break;
@@ -2214,11 +2206,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2214 IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY); 2206 IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY);
2215 ts->resp = SAS_TASK_UNDELIVERED; 2207 ts->resp = SAS_TASK_UNDELIVERED;
2216 ts->stat = SAS_QUEUE_FULL; 2208 ts->stat = SAS_QUEUE_FULL;
2217 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2209 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2218 mb();/* ditto*/
2219 spin_unlock_irq(&pm8001_ha->lock);
2220 t->task_done(t);
2221 spin_lock_irq(&pm8001_ha->lock);
2222 return; 2210 return;
2223 } 2211 }
2224 break; 2212 break;
@@ -2281,11 +2269,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2281 IO_DS_NON_OPERATIONAL); 2269 IO_DS_NON_OPERATIONAL);
2282 ts->resp = SAS_TASK_UNDELIVERED; 2270 ts->resp = SAS_TASK_UNDELIVERED;
2283 ts->stat = SAS_QUEUE_FULL; 2271 ts->stat = SAS_QUEUE_FULL;
2284 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2272 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2285 mb();/*ditto*/
2286 spin_unlock_irq(&pm8001_ha->lock);
2287 t->task_done(t);
2288 spin_lock_irq(&pm8001_ha->lock);
2289 return; 2273 return;
2290 } 2274 }
2291 break; 2275 break;
@@ -2305,11 +2289,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2305 IO_DS_IN_ERROR); 2289 IO_DS_IN_ERROR);
2306 ts->resp = SAS_TASK_UNDELIVERED; 2290 ts->resp = SAS_TASK_UNDELIVERED;
2307 ts->stat = SAS_QUEUE_FULL; 2291 ts->stat = SAS_QUEUE_FULL;
2308 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2292 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2309 mb();/*ditto*/
2310 spin_unlock_irq(&pm8001_ha->lock);
2311 t->task_done(t);
2312 spin_lock_irq(&pm8001_ha->lock);
2313 return; 2293 return;
2314 } 2294 }
2315 break; 2295 break;
@@ -2338,20 +2318,9 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
2338 " resp 0x%x stat 0x%x but aborted by upper layer!\n", 2318 " resp 0x%x stat 0x%x but aborted by upper layer!\n",
2339 t, status, ts->resp, ts->stat)); 2319 t, status, ts->resp, ts->stat));
2340 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2320 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2341 } else if (t->uldd_task) { 2321 } else {
2342 spin_unlock_irqrestore(&t->task_state_lock, flags);
2343 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2344 mb();/* ditto */
2345 spin_unlock_irq(&pm8001_ha->lock);
2346 t->task_done(t);
2347 spin_lock_irq(&pm8001_ha->lock);
2348 } else if (!t->uldd_task) {
2349 spin_unlock_irqrestore(&t->task_state_lock, flags); 2322 spin_unlock_irqrestore(&t->task_state_lock, flags);
2350 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2323 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2351 mb();/*ditto*/
2352 spin_unlock_irq(&pm8001_ha->lock);
2353 t->task_done(t);
2354 spin_lock_irq(&pm8001_ha->lock);
2355 } 2324 }
2356} 2325}
2357 2326
@@ -2463,11 +2432,7 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2463 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS); 2432 IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS);
2464 ts->resp = SAS_TASK_COMPLETE; 2433 ts->resp = SAS_TASK_COMPLETE;
2465 ts->stat = SAS_QUEUE_FULL; 2434 ts->stat = SAS_QUEUE_FULL;
2466 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2435 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2467 mb();/*ditto*/
2468 spin_unlock_irq(&pm8001_ha->lock);
2469 t->task_done(t);
2470 spin_lock_irq(&pm8001_ha->lock);
2471 return; 2436 return;
2472 } 2437 }
2473 break; 2438 break;
@@ -2589,20 +2554,9 @@ static void mpi_sata_event(struct pm8001_hba_info *pm8001_ha , void *piomb)
2589 " resp 0x%x stat 0x%x but aborted by upper layer!\n", 2554 " resp 0x%x stat 0x%x but aborted by upper layer!\n",
2590 t, event, ts->resp, ts->stat)); 2555 t, event, ts->resp, ts->stat));
2591 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2556 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2592 } else if (t->uldd_task) { 2557 } else {
2593 spin_unlock_irqrestore(&t->task_state_lock, flags);
2594 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
2595 mb();/* ditto */
2596 spin_unlock_irq(&pm8001_ha->lock);
2597 t->task_done(t);
2598 spin_lock_irq(&pm8001_ha->lock);
2599 } else if (!t->uldd_task) {
2600 spin_unlock_irqrestore(&t->task_state_lock, flags); 2558 spin_unlock_irqrestore(&t->task_state_lock, flags);
2601 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag); 2559 pm8001_ccb_task_free_done(pm8001_ha, t, ccb, tag);
2602 mb();/*ditto*/
2603 spin_unlock_irq(&pm8001_ha->lock);
2604 t->task_done(t);
2605 spin_lock_irq(&pm8001_ha->lock);
2606 } 2560 }
2607} 2561}
2608 2562
@@ -4297,23 +4251,11 @@ static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
4297 "\n", task, ts->resp, ts->stat)); 4251 "\n", task, ts->resp, ts->stat));
4298 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag); 4252 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
4299 return 0; 4253 return 0;
4300 } else if (task->uldd_task) { 4254 } else {
4301 spin_unlock_irqrestore(&task->task_state_lock,
4302 flags);
4303 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
4304 mb();/* ditto */
4305 spin_unlock_irq(&pm8001_ha->lock);
4306 task->task_done(task);
4307 spin_lock_irq(&pm8001_ha->lock);
4308 return 0;
4309 } else if (!task->uldd_task) {
4310 spin_unlock_irqrestore(&task->task_state_lock, 4255 spin_unlock_irqrestore(&task->task_state_lock,
4311 flags); 4256 flags);
4312 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag); 4257 pm8001_ccb_task_free_done(pm8001_ha, task,
4313 mb();/*ditto*/ 4258 ccb, tag);
4314 spin_unlock_irq(&pm8001_ha->lock);
4315 task->task_done(task);
4316 spin_lock_irq(&pm8001_ha->lock);
4317 return 0; 4259 return 0;
4318 } 4260 }
4319 } 4261 }