.. | .. |
---|
116 | 116 | u64 align_offset = 0; |
---|
117 | 117 | if (align) |
---|
118 | 118 | align_offset = (dma_addr_t)align - 1; |
---|
119 | | - mem_virt_alloc = pci_zalloc_consistent(pdev, mem_size + align, |
---|
120 | | - &mem_dma_handle); |
---|
| 119 | + mem_virt_alloc = dma_alloc_coherent(&pdev->dev, mem_size + align, |
---|
| 120 | + &mem_dma_handle, GFP_KERNEL); |
---|
121 | 121 | if (!mem_virt_alloc) { |
---|
122 | | - pm8001_printk("memory allocation error\n"); |
---|
| 122 | + pr_err("pm80xx: memory allocation error\n"); |
---|
123 | 123 | return -1; |
---|
124 | 124 | } |
---|
125 | 125 | *pphys_addr = mem_dma_handle; |
---|
.. | .. |
---|
129 | 129 | *pphys_addr_lo = lower_32_bits(phys_align); |
---|
130 | 130 | return 0; |
---|
131 | 131 | } |
---|
| 132 | + |
---|
132 | 133 | /** |
---|
133 | 134 | * pm8001_find_ha_by_dev - from domain device which come from sas layer to |
---|
134 | 135 | * find out our hba struct. |
---|
.. | .. |
---|
157 | 158 | int rc = 0, phy_id = sas_phy->id; |
---|
158 | 159 | struct pm8001_hba_info *pm8001_ha = NULL; |
---|
159 | 160 | struct sas_phy_linkrates *rates; |
---|
| 161 | + struct pm8001_phy *phy; |
---|
160 | 162 | DECLARE_COMPLETION_ONSTACK(completion); |
---|
161 | 163 | unsigned long flags; |
---|
162 | 164 | pm8001_ha = sas_phy->ha->lldd_ha; |
---|
| 165 | + phy = &pm8001_ha->phy[phy_id]; |
---|
163 | 166 | pm8001_ha->phy[phy_id].enable_completion = &completion; |
---|
164 | 167 | switch (func) { |
---|
165 | 168 | case PHY_FUNC_SET_LINK_RATE: |
---|
.. | .. |
---|
172 | 175 | pm8001_ha->phy[phy_id].maximum_linkrate = |
---|
173 | 176 | rates->maximum_linkrate; |
---|
174 | 177 | } |
---|
175 | | - if (pm8001_ha->phy[phy_id].phy_state == 0) { |
---|
| 178 | + if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { |
---|
176 | 179 | PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); |
---|
177 | 180 | wait_for_completion(&completion); |
---|
178 | 181 | } |
---|
.. | .. |
---|
180 | 183 | PHY_LINK_RESET); |
---|
181 | 184 | break; |
---|
182 | 185 | case PHY_FUNC_HARD_RESET: |
---|
183 | | - if (pm8001_ha->phy[phy_id].phy_state == 0) { |
---|
| 186 | + if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { |
---|
184 | 187 | PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); |
---|
185 | 188 | wait_for_completion(&completion); |
---|
186 | 189 | } |
---|
.. | .. |
---|
188 | 191 | PHY_HARD_RESET); |
---|
189 | 192 | break; |
---|
190 | 193 | case PHY_FUNC_LINK_RESET: |
---|
191 | | - if (pm8001_ha->phy[phy_id].phy_state == 0) { |
---|
| 194 | + if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { |
---|
192 | 195 | PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); |
---|
193 | 196 | wait_for_completion(&completion); |
---|
194 | 197 | } |
---|
.. | .. |
---|
200 | 203 | PHY_LINK_RESET); |
---|
201 | 204 | break; |
---|
202 | 205 | case PHY_FUNC_DISABLE: |
---|
| 206 | + if (pm8001_ha->chip_id != chip_8001) { |
---|
| 207 | + if (pm8001_ha->phy[phy_id].phy_state == |
---|
| 208 | + PHY_STATE_LINK_UP_SPCV) { |
---|
| 209 | + sas_phy_disconnected(&phy->sas_phy); |
---|
| 210 | + sas_notify_phy_event(&phy->sas_phy, |
---|
| 211 | + PHYE_LOSS_OF_SIGNAL); |
---|
| 212 | + phy->phy_attached = 0; |
---|
| 213 | + } |
---|
| 214 | + } else { |
---|
| 215 | + if (pm8001_ha->phy[phy_id].phy_state == |
---|
| 216 | + PHY_STATE_LINK_UP_SPC) { |
---|
| 217 | + sas_phy_disconnected(&phy->sas_phy); |
---|
| 218 | + sas_notify_phy_event(&phy->sas_phy, |
---|
| 219 | + PHYE_LOSS_OF_SIGNAL); |
---|
| 220 | + phy->phy_attached = 0; |
---|
| 221 | + } |
---|
| 222 | + } |
---|
203 | 223 | PM8001_CHIP_DISP->phy_stop_req(pm8001_ha, phy_id); |
---|
204 | 224 | break; |
---|
205 | 225 | case PHY_FUNC_GET_EVENTS: |
---|
.. | .. |
---|
227 | 247 | spin_unlock_irqrestore(&pm8001_ha->lock, flags); |
---|
228 | 248 | return 0; |
---|
229 | 249 | default: |
---|
| 250 | + pm8001_dbg(pm8001_ha, DEVIO, "func 0x%x\n", func); |
---|
230 | 251 | rc = -EOPNOTSUPP; |
---|
231 | 252 | } |
---|
232 | 253 | msleep(300); |
---|
.. | .. |
---|
243 | 264 | int i; |
---|
244 | 265 | struct pm8001_hba_info *pm8001_ha; |
---|
245 | 266 | struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost); |
---|
| 267 | + DECLARE_COMPLETION_ONSTACK(completion); |
---|
246 | 268 | pm8001_ha = sha->lldd_ha; |
---|
247 | 269 | /* SAS_RE_INITIALIZATION not available in SPCv/ve */ |
---|
248 | 270 | if (pm8001_ha->chip_id == chip_8001) |
---|
249 | 271 | PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha); |
---|
250 | | - for (i = 0; i < pm8001_ha->chip->n_phy; ++i) |
---|
| 272 | + for (i = 0; i < pm8001_ha->chip->n_phy; ++i) { |
---|
| 273 | + pm8001_ha->phy[i].enable_completion = &completion; |
---|
251 | 274 | PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i); |
---|
| 275 | + wait_for_completion(&completion); |
---|
| 276 | + msleep(300); |
---|
| 277 | + } |
---|
252 | 278 | } |
---|
253 | 279 | |
---|
254 | 280 | int pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time) |
---|
.. | .. |
---|
342 | 368 | return 0; |
---|
343 | 369 | } |
---|
344 | 370 | |
---|
| 371 | +#define DEV_IS_GONE(pm8001_dev) \ |
---|
| 372 | + ((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED))) |
---|
345 | 373 | /** |
---|
346 | 374 | * pm8001_task_exec - queue the task(ssp, smp && ata) to the hardware. |
---|
347 | 375 | * @task: the task to be execute. |
---|
348 | | - * @num: if can_queue great than 1, the task can be queued up. for SMP task, |
---|
349 | | - * we always execute one one time. |
---|
350 | 376 | * @gfp_flags: gfp_flags. |
---|
351 | 377 | * @is_tmf: if it is task management task. |
---|
352 | 378 | * @tmf: the task management IU |
---|
353 | 379 | */ |
---|
354 | | -#define DEV_IS_GONE(pm8001_dev) \ |
---|
355 | | - ((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED))) |
---|
356 | 380 | static int pm8001_task_exec(struct sas_task *task, |
---|
357 | 381 | gfp_t gfp_flags, int is_tmf, struct pm8001_tmf_task *tmf) |
---|
358 | 382 | { |
---|
.. | .. |
---|
362 | 386 | struct pm8001_port *port = NULL; |
---|
363 | 387 | struct sas_task *t = task; |
---|
364 | 388 | struct pm8001_ccb_info *ccb; |
---|
365 | | - u32 tag = 0xdeadbeef, rc, n_elem = 0; |
---|
| 389 | + u32 tag = 0xdeadbeef, rc = 0, n_elem = 0; |
---|
366 | 390 | unsigned long flags = 0; |
---|
| 391 | + enum sas_protocol task_proto = t->task_proto; |
---|
367 | 392 | |
---|
368 | 393 | if (!dev->port) { |
---|
369 | 394 | struct task_status_struct *tsm = &t->task_status; |
---|
.. | .. |
---|
381 | 406 | t->task_done(t); |
---|
382 | 407 | return 0; |
---|
383 | 408 | } |
---|
384 | | - PM8001_IO_DBG(pm8001_ha, pm8001_printk("pm8001_task_exec device \n ")); |
---|
| 409 | + pm8001_dbg(pm8001_ha, IO, "pm8001_task_exec device\n"); |
---|
385 | 410 | spin_lock_irqsave(&pm8001_ha->lock, flags); |
---|
386 | 411 | do { |
---|
387 | 412 | dev = t->dev; |
---|
388 | 413 | pm8001_dev = dev->lldd_dev; |
---|
389 | 414 | port = &pm8001_ha->port[sas_find_local_port_id(dev)]; |
---|
390 | 415 | if (DEV_IS_GONE(pm8001_dev) || !port->port_attached) { |
---|
391 | | - if (sas_protocol_ata(t->task_proto)) { |
---|
| 416 | + if (sas_protocol_ata(task_proto)) { |
---|
392 | 417 | struct task_status_struct *ts = &t->task_status; |
---|
393 | 418 | ts->resp = SAS_TASK_UNDELIVERED; |
---|
394 | 419 | ts->stat = SAS_PHY_DOWN; |
---|
.. | .. |
---|
410 | 435 | goto err_out; |
---|
411 | 436 | ccb = &pm8001_ha->ccb_info[tag]; |
---|
412 | 437 | |
---|
413 | | - if (!sas_protocol_ata(t->task_proto)) { |
---|
| 438 | + if (!sas_protocol_ata(task_proto)) { |
---|
414 | 439 | if (t->num_scatter) { |
---|
415 | 440 | n_elem = dma_map_sg(pm8001_ha->dev, |
---|
416 | 441 | t->scatter, |
---|
.. | .. |
---|
430 | 455 | ccb->ccb_tag = tag; |
---|
431 | 456 | ccb->task = t; |
---|
432 | 457 | ccb->device = pm8001_dev; |
---|
433 | | - switch (t->task_proto) { |
---|
| 458 | + switch (task_proto) { |
---|
434 | 459 | case SAS_PROTOCOL_SMP: |
---|
| 460 | + atomic_inc(&pm8001_dev->running_req); |
---|
435 | 461 | rc = pm8001_task_prep_smp(pm8001_ha, ccb); |
---|
436 | 462 | break; |
---|
437 | 463 | case SAS_PROTOCOL_SSP: |
---|
| 464 | + atomic_inc(&pm8001_dev->running_req); |
---|
438 | 465 | if (is_tmf) |
---|
439 | 466 | rc = pm8001_task_prep_ssp_tm(pm8001_ha, |
---|
440 | 467 | ccb, tmf); |
---|
.. | .. |
---|
443 | 470 | break; |
---|
444 | 471 | case SAS_PROTOCOL_SATA: |
---|
445 | 472 | case SAS_PROTOCOL_STP: |
---|
| 473 | + atomic_inc(&pm8001_dev->running_req); |
---|
446 | 474 | rc = pm8001_task_prep_ata(pm8001_ha, ccb); |
---|
447 | 475 | break; |
---|
448 | 476 | default: |
---|
449 | 477 | dev_printk(KERN_ERR, pm8001_ha->dev, |
---|
450 | | - "unknown sas_task proto: 0x%x\n", |
---|
451 | | - t->task_proto); |
---|
| 478 | + "unknown sas_task proto: 0x%x\n", task_proto); |
---|
452 | 479 | rc = -EINVAL; |
---|
453 | 480 | break; |
---|
454 | 481 | } |
---|
455 | 482 | |
---|
456 | 483 | if (rc) { |
---|
457 | | - PM8001_IO_DBG(pm8001_ha, |
---|
458 | | - pm8001_printk("rc is %x\n", rc)); |
---|
| 484 | + pm8001_dbg(pm8001_ha, IO, "rc is %x\n", rc); |
---|
| 485 | + atomic_dec(&pm8001_dev->running_req); |
---|
459 | 486 | goto err_out_tag; |
---|
460 | 487 | } |
---|
461 | 488 | /* TODO: select normal or high priority */ |
---|
462 | 489 | spin_lock(&t->task_state_lock); |
---|
463 | 490 | t->task_state_flags |= SAS_TASK_AT_INITIATOR; |
---|
464 | 491 | spin_unlock(&t->task_state_lock); |
---|
465 | | - pm8001_dev->running_req++; |
---|
466 | 492 | } while (0); |
---|
467 | 493 | rc = 0; |
---|
468 | 494 | goto out_done; |
---|
.. | .. |
---|
471 | 497 | pm8001_tag_free(pm8001_ha, tag); |
---|
472 | 498 | err_out: |
---|
473 | 499 | dev_printk(KERN_ERR, pm8001_ha->dev, "pm8001 exec failed[%d]!\n", rc); |
---|
474 | | - if (!sas_protocol_ata(t->task_proto)) |
---|
| 500 | + if (!sas_protocol_ata(task_proto)) |
---|
475 | 501 | if (n_elem) |
---|
476 | 502 | dma_unmap_sg(pm8001_ha->dev, t->scatter, t->num_scatter, |
---|
477 | 503 | t->data_dir); |
---|
.. | .. |
---|
511 | 537 | switch (task->task_proto) { |
---|
512 | 538 | case SAS_PROTOCOL_SMP: |
---|
513 | 539 | dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1, |
---|
514 | | - PCI_DMA_FROMDEVICE); |
---|
| 540 | + DMA_FROM_DEVICE); |
---|
515 | 541 | dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1, |
---|
516 | | - PCI_DMA_TODEVICE); |
---|
| 542 | + DMA_TO_DEVICE); |
---|
517 | 543 | break; |
---|
518 | 544 | |
---|
519 | 545 | case SAS_PROTOCOL_SATA: |
---|
.. | .. |
---|
544 | 570 | } |
---|
545 | 571 | } |
---|
546 | 572 | if (dev == PM8001_MAX_DEVICES) { |
---|
547 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
548 | | - pm8001_printk("max support %d devices, ignore ..\n", |
---|
549 | | - PM8001_MAX_DEVICES)); |
---|
| 573 | + pm8001_dbg(pm8001_ha, FAIL, |
---|
| 574 | + "max support %d devices, ignore ..\n", |
---|
| 575 | + PM8001_MAX_DEVICES); |
---|
550 | 576 | } |
---|
551 | 577 | return NULL; |
---|
552 | 578 | } |
---|
553 | 579 | /** |
---|
554 | 580 | * pm8001_find_dev - find a matching pm8001_device |
---|
555 | 581 | * @pm8001_ha: our hba card information |
---|
| 582 | + * @device_id: device ID to match against |
---|
556 | 583 | */ |
---|
557 | 584 | struct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha, |
---|
558 | 585 | u32 device_id) |
---|
.. | .. |
---|
563 | 590 | return &pm8001_ha->devices[dev]; |
---|
564 | 591 | } |
---|
565 | 592 | if (dev == PM8001_MAX_DEVICES) { |
---|
566 | | - PM8001_FAIL_DBG(pm8001_ha, pm8001_printk("NO MATCHING " |
---|
567 | | - "DEVICE FOUND !!!\n")); |
---|
| 593 | + pm8001_dbg(pm8001_ha, FAIL, "NO MATCHING DEVICE FOUND !!!\n"); |
---|
568 | 594 | } |
---|
569 | 595 | return NULL; |
---|
570 | 596 | } |
---|
.. | .. |
---|
612 | 638 | dev->lldd_dev = pm8001_device; |
---|
613 | 639 | pm8001_device->dev_type = dev->dev_type; |
---|
614 | 640 | pm8001_device->dcompletion = &completion; |
---|
615 | | - if (parent_dev && DEV_IS_EXPANDER(parent_dev->dev_type)) { |
---|
| 641 | + if (parent_dev && dev_is_expander(parent_dev->dev_type)) { |
---|
616 | 642 | int phy_id; |
---|
617 | 643 | struct ex_phy *phy; |
---|
618 | 644 | for (phy_id = 0; phy_id < parent_dev->ex_dev.num_phys; |
---|
.. | .. |
---|
625 | 651 | } |
---|
626 | 652 | } |
---|
627 | 653 | if (phy_id == parent_dev->ex_dev.num_phys) { |
---|
628 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
629 | | - pm8001_printk("Error: no attached dev:%016llx" |
---|
630 | | - " at ex:%016llx.\n", SAS_ADDR(dev->sas_addr), |
---|
631 | | - SAS_ADDR(parent_dev->sas_addr))); |
---|
| 654 | + pm8001_dbg(pm8001_ha, FAIL, |
---|
| 655 | + "Error: no attached dev:%016llx at ex:%016llx.\n", |
---|
| 656 | + SAS_ADDR(dev->sas_addr), |
---|
| 657 | + SAS_ADDR(parent_dev->sas_addr)); |
---|
632 | 658 | res = -1; |
---|
633 | 659 | } |
---|
634 | 660 | } else { |
---|
635 | 661 | if (dev->dev_type == SAS_SATA_DEV) { |
---|
636 | 662 | pm8001_device->attached_phy = |
---|
637 | 663 | dev->rphy->identify.phy_identifier; |
---|
638 | | - flag = 1; /* directly sata*/ |
---|
| 664 | + flag = 1; /* directly sata */ |
---|
639 | 665 | } |
---|
640 | 666 | } /*register this device to HBA*/ |
---|
641 | | - PM8001_DISC_DBG(pm8001_ha, pm8001_printk("Found device\n")); |
---|
| 667 | + pm8001_dbg(pm8001_ha, DISC, "Found device\n"); |
---|
642 | 668 | PM8001_CHIP_DISP->reg_dev_req(pm8001_ha, pm8001_device, flag); |
---|
643 | 669 | spin_unlock_irqrestore(&pm8001_ha->lock, flags); |
---|
644 | 670 | wait_for_completion(&completion); |
---|
.. | .. |
---|
658 | 684 | |
---|
659 | 685 | void pm8001_task_done(struct sas_task *task) |
---|
660 | 686 | { |
---|
661 | | - if (!del_timer(&task->slow_task->timer)) |
---|
662 | | - return; |
---|
| 687 | + del_timer(&task->slow_task->timer); |
---|
663 | 688 | complete(&task->slow_task->completion); |
---|
664 | 689 | } |
---|
665 | 690 | |
---|
.. | .. |
---|
667 | 692 | { |
---|
668 | 693 | struct sas_task_slow *slow = from_timer(slow, t, timer); |
---|
669 | 694 | struct sas_task *task = slow->task; |
---|
| 695 | + unsigned long flags; |
---|
670 | 696 | |
---|
671 | | - task->task_state_flags |= SAS_TASK_STATE_ABORTED; |
---|
672 | | - complete(&task->slow_task->completion); |
---|
| 697 | + spin_lock_irqsave(&task->task_state_lock, flags); |
---|
| 698 | + if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { |
---|
| 699 | + task->task_state_flags |= SAS_TASK_STATE_ABORTED; |
---|
| 700 | + complete(&task->slow_task->completion); |
---|
| 701 | + } |
---|
| 702 | + spin_unlock_irqrestore(&task->task_state_lock, flags); |
---|
673 | 703 | } |
---|
674 | 704 | |
---|
675 | 705 | #define PM8001_TASK_TIMEOUT 20 |
---|
.. | .. |
---|
710 | 740 | |
---|
711 | 741 | if (res) { |
---|
712 | 742 | del_timer(&task->slow_task->timer); |
---|
713 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
714 | | - pm8001_printk("Executing internal task " |
---|
715 | | - "failed\n")); |
---|
| 743 | + pm8001_dbg(pm8001_ha, FAIL, "Executing internal task failed\n"); |
---|
716 | 744 | goto ex_err; |
---|
717 | 745 | } |
---|
718 | 746 | wait_for_completion(&task->slow_task->completion); |
---|
719 | 747 | if (pm8001_ha->chip_id != chip_8001) { |
---|
720 | 748 | pm8001_dev->setds_completion = &completion_setstate; |
---|
721 | | - PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, |
---|
722 | | - pm8001_dev, 0x01); |
---|
| 749 | + PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, |
---|
| 750 | + pm8001_dev, 0x01); |
---|
723 | 751 | wait_for_completion(&completion_setstate); |
---|
724 | 752 | } |
---|
725 | 753 | res = -TMF_RESP_FUNC_FAILED; |
---|
726 | 754 | /* Even TMF timed out, return direct. */ |
---|
727 | | - if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { |
---|
728 | | - if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { |
---|
729 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
730 | | - pm8001_printk("TMF task[%x]timeout.\n", |
---|
731 | | - tmf->tmf)); |
---|
732 | | - goto ex_err; |
---|
733 | | - } |
---|
| 755 | + if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { |
---|
| 756 | + struct pm8001_ccb_info *ccb = task->lldd_task; |
---|
| 757 | + |
---|
| 758 | + pm8001_dbg(pm8001_ha, FAIL, "TMF task[%x]timeout.\n", |
---|
| 759 | + tmf->tmf); |
---|
| 760 | + |
---|
| 761 | + if (ccb) |
---|
| 762 | + ccb->task = NULL; |
---|
| 763 | + goto ex_err; |
---|
734 | 764 | } |
---|
735 | 765 | |
---|
736 | 766 | if (task->task_status.resp == SAS_TASK_COMPLETE && |
---|
737 | | - task->task_status.stat == SAM_STAT_GOOD) { |
---|
| 767 | + task->task_status.stat == SAS_SAM_STAT_GOOD) { |
---|
738 | 768 | res = TMF_RESP_FUNC_COMPLETE; |
---|
739 | 769 | break; |
---|
740 | 770 | } |
---|
.. | .. |
---|
749 | 779 | |
---|
750 | 780 | if (task->task_status.resp == SAS_TASK_COMPLETE && |
---|
751 | 781 | task->task_status.stat == SAS_DATA_OVERRUN) { |
---|
752 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
753 | | - pm8001_printk("Blocked task error.\n")); |
---|
| 782 | + pm8001_dbg(pm8001_ha, FAIL, "Blocked task error.\n"); |
---|
754 | 783 | res = -EMSGSIZE; |
---|
755 | 784 | break; |
---|
756 | 785 | } else { |
---|
757 | | - PM8001_EH_DBG(pm8001_ha, |
---|
758 | | - pm8001_printk(" Task to dev %016llx response:" |
---|
759 | | - "0x%x status 0x%x\n", |
---|
760 | | - SAS_ADDR(dev->sas_addr), |
---|
761 | | - task->task_status.resp, |
---|
762 | | - task->task_status.stat)); |
---|
| 786 | + pm8001_dbg(pm8001_ha, EH, |
---|
| 787 | + " Task to dev %016llx response:0x%x status 0x%x\n", |
---|
| 788 | + SAS_ADDR(dev->sas_addr), |
---|
| 789 | + task->task_status.resp, |
---|
| 790 | + task->task_status.stat); |
---|
763 | 791 | sas_free_task(task); |
---|
764 | 792 | task = NULL; |
---|
765 | 793 | } |
---|
.. | .. |
---|
803 | 831 | |
---|
804 | 832 | res = PM8001_CHIP_DISP->task_abort(pm8001_ha, |
---|
805 | 833 | pm8001_dev, flag, task_tag, ccb_tag); |
---|
806 | | - |
---|
807 | 834 | if (res) { |
---|
808 | 835 | del_timer(&task->slow_task->timer); |
---|
809 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
810 | | - pm8001_printk("Executing internal task " |
---|
811 | | - "failed\n")); |
---|
| 836 | + pm8001_dbg(pm8001_ha, FAIL, "Executing internal task failed\n"); |
---|
| 837 | + pm8001_tag_free(pm8001_ha, ccb_tag); |
---|
812 | 838 | goto ex_err; |
---|
813 | 839 | } |
---|
814 | 840 | wait_for_completion(&task->slow_task->completion); |
---|
815 | 841 | res = TMF_RESP_FUNC_FAILED; |
---|
816 | 842 | /* Even TMF timed out, return direct. */ |
---|
817 | | - if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { |
---|
818 | | - if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { |
---|
819 | | - PM8001_FAIL_DBG(pm8001_ha, |
---|
820 | | - pm8001_printk("TMF task timeout.\n")); |
---|
821 | | - goto ex_err; |
---|
822 | | - } |
---|
| 843 | + if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { |
---|
| 844 | + pm8001_dbg(pm8001_ha, FAIL, "TMF task timeout.\n"); |
---|
| 845 | + goto ex_err; |
---|
823 | 846 | } |
---|
824 | 847 | |
---|
825 | 848 | if (task->task_status.resp == SAS_TASK_COMPLETE && |
---|
826 | | - task->task_status.stat == SAM_STAT_GOOD) { |
---|
| 849 | + task->task_status.stat == SAS_SAM_STAT_GOOD) { |
---|
827 | 850 | res = TMF_RESP_FUNC_COMPLETE; |
---|
828 | 851 | break; |
---|
829 | 852 | |
---|
830 | 853 | } else { |
---|
831 | | - PM8001_EH_DBG(pm8001_ha, |
---|
832 | | - pm8001_printk(" Task to dev %016llx response: " |
---|
833 | | - "0x%x status 0x%x\n", |
---|
834 | | - SAS_ADDR(dev->sas_addr), |
---|
835 | | - task->task_status.resp, |
---|
836 | | - task->task_status.stat)); |
---|
| 854 | + pm8001_dbg(pm8001_ha, EH, |
---|
| 855 | + " Task to dev %016llx response: 0x%x status 0x%x\n", |
---|
| 856 | + SAS_ADDR(dev->sas_addr), |
---|
| 857 | + task->task_status.resp, |
---|
| 858 | + task->task_status.stat); |
---|
837 | 859 | sas_free_task(task); |
---|
838 | 860 | task = NULL; |
---|
839 | 861 | } |
---|
.. | .. |
---|
859 | 881 | if (pm8001_dev) { |
---|
860 | 882 | u32 device_id = pm8001_dev->device_id; |
---|
861 | 883 | |
---|
862 | | - PM8001_DISC_DBG(pm8001_ha, |
---|
863 | | - pm8001_printk("found dev[%d:%x] is gone.\n", |
---|
864 | | - pm8001_dev->device_id, pm8001_dev->dev_type)); |
---|
865 | | - if (pm8001_dev->running_req) { |
---|
| 884 | + pm8001_dbg(pm8001_ha, DISC, "found dev[%d:%x] is gone.\n", |
---|
| 885 | + pm8001_dev->device_id, pm8001_dev->dev_type); |
---|
| 886 | + if (atomic_read(&pm8001_dev->running_req)) { |
---|
866 | 887 | spin_unlock_irqrestore(&pm8001_ha->lock, flags); |
---|
867 | 888 | pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev , |
---|
868 | 889 | dev, 1, 0); |
---|
869 | | - while (pm8001_dev->running_req) |
---|
| 890 | + while (atomic_read(&pm8001_dev->running_req)) |
---|
870 | 891 | msleep(20); |
---|
871 | 892 | spin_lock_irqsave(&pm8001_ha->lock, flags); |
---|
872 | 893 | } |
---|
873 | 894 | PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); |
---|
874 | 895 | pm8001_free_dev(pm8001_dev); |
---|
875 | 896 | } else { |
---|
876 | | - PM8001_DISC_DBG(pm8001_ha, |
---|
877 | | - pm8001_printk("Found dev has gone.\n")); |
---|
| 897 | + pm8001_dbg(pm8001_ha, DISC, "Found dev has gone.\n"); |
---|
878 | 898 | } |
---|
879 | 899 | dev->lldd_dev = NULL; |
---|
880 | 900 | spin_unlock_irqrestore(&pm8001_ha->lock, flags); |
---|
.. | .. |
---|
944 | 964 | ts->stat = SAS_OPEN_REJECT; |
---|
945 | 965 | ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; |
---|
946 | 966 | if (pm8001_dev) |
---|
947 | | - pm8001_dev->running_req--; |
---|
| 967 | + atomic_dec(&pm8001_dev->running_req); |
---|
948 | 968 | spin_lock_irqsave(&task->task_state_lock, flags1); |
---|
949 | 969 | task->task_state_flags &= ~SAS_TASK_STATE_PENDING; |
---|
950 | 970 | task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; |
---|
.. | .. |
---|
971 | 991 | /** |
---|
972 | 992 | * Standard mandates link reset for ATA (type 0) and hard reset for |
---|
973 | 993 | * SSP (type 1) , only for RECOVERY |
---|
| 994 | + * @dev: the device structure for the device to reset. |
---|
974 | 995 | */ |
---|
975 | 996 | int pm8001_I_T_nexus_reset(struct domain_device *dev) |
---|
976 | 997 | { |
---|
.. | .. |
---|
993 | 1014 | } |
---|
994 | 1015 | rc = sas_phy_reset(phy, 1); |
---|
995 | 1016 | if (rc) { |
---|
996 | | - PM8001_EH_DBG(pm8001_ha, |
---|
997 | | - pm8001_printk("phy reset failed for device %x\n" |
---|
998 | | - "with rc %d\n", pm8001_dev->device_id, rc)); |
---|
| 1017 | + pm8001_dbg(pm8001_ha, EH, |
---|
| 1018 | + "phy reset failed for device %x\n" |
---|
| 1019 | + "with rc %d\n", pm8001_dev->device_id, rc); |
---|
999 | 1020 | rc = TMF_RESP_FUNC_FAILED; |
---|
1000 | 1021 | goto out; |
---|
1001 | 1022 | } |
---|
.. | .. |
---|
1003 | 1024 | rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev , |
---|
1004 | 1025 | dev, 1, 0); |
---|
1005 | 1026 | if (rc) { |
---|
1006 | | - PM8001_EH_DBG(pm8001_ha, |
---|
1007 | | - pm8001_printk("task abort failed %x\n" |
---|
1008 | | - "with rc %d\n", pm8001_dev->device_id, rc)); |
---|
| 1027 | + pm8001_dbg(pm8001_ha, EH, "task abort failed %x\n" |
---|
| 1028 | + "with rc %d\n", pm8001_dev->device_id, rc); |
---|
1009 | 1029 | rc = TMF_RESP_FUNC_FAILED; |
---|
1010 | 1030 | } |
---|
1011 | 1031 | } else { |
---|
1012 | 1032 | rc = sas_phy_reset(phy, 1); |
---|
1013 | 1033 | msleep(2000); |
---|
1014 | 1034 | } |
---|
1015 | | - PM8001_EH_DBG(pm8001_ha, pm8001_printk(" for device[%x]:rc=%d\n", |
---|
1016 | | - pm8001_dev->device_id, rc)); |
---|
| 1035 | + pm8001_dbg(pm8001_ha, EH, " for device[%x]:rc=%d\n", |
---|
| 1036 | + pm8001_dev->device_id, rc); |
---|
1017 | 1037 | out: |
---|
1018 | 1038 | sas_put_local_phy(phy); |
---|
1019 | 1039 | return rc; |
---|
.. | .. |
---|
1029 | 1049 | struct pm8001_device *pm8001_dev; |
---|
1030 | 1050 | struct pm8001_hba_info *pm8001_ha; |
---|
1031 | 1051 | struct sas_phy *phy; |
---|
1032 | | - u32 device_id = 0; |
---|
1033 | 1052 | |
---|
1034 | 1053 | if (!dev || !dev->lldd_dev) |
---|
1035 | 1054 | return -1; |
---|
1036 | 1055 | |
---|
1037 | 1056 | pm8001_dev = dev->lldd_dev; |
---|
1038 | | - device_id = pm8001_dev->device_id; |
---|
1039 | 1057 | pm8001_ha = pm8001_find_ha_by_dev(dev); |
---|
1040 | 1058 | |
---|
1041 | | - PM8001_EH_DBG(pm8001_ha, |
---|
1042 | | - pm8001_printk("I_T_Nexus handler invoked !!")); |
---|
| 1059 | + pm8001_dbg(pm8001_ha, EH, "I_T_Nexus handler invoked !!\n"); |
---|
1043 | 1060 | |
---|
1044 | 1061 | phy = sas_get_local_phy(dev); |
---|
1045 | 1062 | |
---|
.. | .. |
---|
1078 | 1095 | rc = sas_phy_reset(phy, 1); |
---|
1079 | 1096 | msleep(2000); |
---|
1080 | 1097 | } |
---|
1081 | | - PM8001_EH_DBG(pm8001_ha, pm8001_printk(" for device[%x]:rc=%d\n", |
---|
1082 | | - pm8001_dev->device_id, rc)); |
---|
| 1098 | + pm8001_dbg(pm8001_ha, EH, " for device[%x]:rc=%d\n", |
---|
| 1099 | + pm8001_dev->device_id, rc); |
---|
1083 | 1100 | out: |
---|
1084 | 1101 | sas_put_local_phy(phy); |
---|
1085 | 1102 | |
---|
.. | .. |
---|
1108 | 1125 | rc = pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1109 | 1126 | } |
---|
1110 | 1127 | /* If failed, fall-through I_T_Nexus reset */ |
---|
1111 | | - PM8001_EH_DBG(pm8001_ha, pm8001_printk("for device[%x]:rc=%d\n", |
---|
1112 | | - pm8001_dev->device_id, rc)); |
---|
| 1128 | + pm8001_dbg(pm8001_ha, EH, "for device[%x]:rc=%d\n", |
---|
| 1129 | + pm8001_dev->device_id, rc); |
---|
1113 | 1130 | return rc; |
---|
1114 | 1131 | } |
---|
1115 | 1132 | |
---|
.. | .. |
---|
1117 | 1134 | int pm8001_query_task(struct sas_task *task) |
---|
1118 | 1135 | { |
---|
1119 | 1136 | u32 tag = 0xdeadbeef; |
---|
1120 | | - int i = 0; |
---|
1121 | 1137 | struct scsi_lun lun; |
---|
1122 | 1138 | struct pm8001_tmf_task tmf_task; |
---|
1123 | 1139 | int rc = TMF_RESP_FUNC_FAILED; |
---|
.. | .. |
---|
1136 | 1152 | rc = TMF_RESP_FUNC_FAILED; |
---|
1137 | 1153 | return rc; |
---|
1138 | 1154 | } |
---|
1139 | | - PM8001_EH_DBG(pm8001_ha, pm8001_printk("Query:[")); |
---|
1140 | | - for (i = 0; i < 16; i++) |
---|
1141 | | - printk(KERN_INFO "%02x ", cmnd->cmnd[i]); |
---|
1142 | | - printk(KERN_INFO "]\n"); |
---|
| 1155 | + pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd); |
---|
1143 | 1156 | tmf_task.tmf = TMF_QUERY_TASK; |
---|
1144 | 1157 | tmf_task.tag_of_task_to_be_managed = tag; |
---|
1145 | 1158 | |
---|
.. | .. |
---|
1147 | 1160 | switch (rc) { |
---|
1148 | 1161 | /* The task is still in Lun, release it then */ |
---|
1149 | 1162 | case TMF_RESP_FUNC_SUCC: |
---|
1150 | | - PM8001_EH_DBG(pm8001_ha, |
---|
1151 | | - pm8001_printk("The task is still in Lun\n")); |
---|
| 1163 | + pm8001_dbg(pm8001_ha, EH, |
---|
| 1164 | + "The task is still in Lun\n"); |
---|
1152 | 1165 | break; |
---|
1153 | 1166 | /* The task is not in Lun or failed, reset the phy */ |
---|
1154 | 1167 | case TMF_RESP_FUNC_FAILED: |
---|
1155 | 1168 | case TMF_RESP_FUNC_COMPLETE: |
---|
1156 | | - PM8001_EH_DBG(pm8001_ha, |
---|
1157 | | - pm8001_printk("The task is not in Lun or failed," |
---|
1158 | | - " reset the phy\n")); |
---|
| 1169 | + pm8001_dbg(pm8001_ha, EH, |
---|
| 1170 | + "The task is not in Lun or failed, reset the phy\n"); |
---|
1159 | 1171 | break; |
---|
1160 | 1172 | } |
---|
1161 | 1173 | } |
---|
1162 | | - pm8001_printk(":rc= %d\n", rc); |
---|
| 1174 | + pr_err("pm80xx: rc= %d\n", rc); |
---|
1163 | 1175 | return rc; |
---|
1164 | 1176 | } |
---|
1165 | 1177 | |
---|
1166 | | -/* mandatory SAM-3, still need free task/ccb info, abord the specified task */ |
---|
| 1178 | +/* mandatory SAM-3, still need free task/ccb info, abort the specified task */ |
---|
1167 | 1179 | int pm8001_abort_task(struct sas_task *task) |
---|
1168 | 1180 | { |
---|
1169 | 1181 | unsigned long flags; |
---|
1170 | 1182 | u32 tag; |
---|
1171 | | - u32 device_id; |
---|
1172 | 1183 | struct domain_device *dev ; |
---|
1173 | 1184 | struct pm8001_hba_info *pm8001_ha; |
---|
1174 | 1185 | struct scsi_lun lun; |
---|
.. | .. |
---|
1182 | 1193 | dev = task->dev; |
---|
1183 | 1194 | pm8001_dev = dev->lldd_dev; |
---|
1184 | 1195 | pm8001_ha = pm8001_find_ha_by_dev(dev); |
---|
1185 | | - device_id = pm8001_dev->device_id; |
---|
1186 | 1196 | phy_id = pm8001_dev->attached_phy; |
---|
1187 | 1197 | ret = pm8001_find_tag(task, &tag); |
---|
1188 | 1198 | if (ret == 0) { |
---|
.. | .. |
---|
1243 | 1253 | * leaking the task in libsas or losing the race and |
---|
1244 | 1254 | * getting a double free. |
---|
1245 | 1255 | */ |
---|
1246 | | - PM8001_MSG_DBG(pm8001_ha, |
---|
1247 | | - pm8001_printk("Waiting for local phy ctl\n")); |
---|
| 1256 | + pm8001_dbg(pm8001_ha, MSG, |
---|
| 1257 | + "Waiting for local phy ctl\n"); |
---|
1248 | 1258 | ret = wait_for_completion_timeout(&completion, |
---|
1249 | 1259 | PM8001_TASK_TIMEOUT * HZ); |
---|
1250 | 1260 | if (!ret || !phy->reset_success) { |
---|
.. | .. |
---|
1254 | 1264 | /* 3. Wait for Port Reset complete or |
---|
1255 | 1265 | * Port reset TMO |
---|
1256 | 1266 | */ |
---|
1257 | | - PM8001_MSG_DBG(pm8001_ha, |
---|
1258 | | - pm8001_printk("Waiting for Port reset\n")); |
---|
| 1267 | + pm8001_dbg(pm8001_ha, MSG, |
---|
| 1268 | + "Waiting for Port reset\n"); |
---|
1259 | 1269 | ret = wait_for_completion_timeout( |
---|
1260 | 1270 | &completion_reset, |
---|
1261 | 1271 | PM8001_TASK_TIMEOUT * HZ); |
---|
.. | .. |
---|
1314 | 1324 | |
---|
1315 | 1325 | int pm8001_abort_task_set(struct domain_device *dev, u8 *lun) |
---|
1316 | 1326 | { |
---|
1317 | | - int rc = TMF_RESP_FUNC_FAILED; |
---|
1318 | 1327 | struct pm8001_tmf_task tmf_task; |
---|
1319 | 1328 | |
---|
1320 | 1329 | tmf_task.tmf = TMF_ABORT_TASK_SET; |
---|
1321 | | - rc = pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1322 | | - return rc; |
---|
| 1330 | + return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1323 | 1331 | } |
---|
1324 | 1332 | |
---|
1325 | 1333 | int pm8001_clear_aca(struct domain_device *dev, u8 *lun) |
---|
1326 | 1334 | { |
---|
1327 | | - int rc = TMF_RESP_FUNC_FAILED; |
---|
1328 | 1335 | struct pm8001_tmf_task tmf_task; |
---|
1329 | 1336 | |
---|
1330 | 1337 | tmf_task.tmf = TMF_CLEAR_ACA; |
---|
1331 | | - rc = pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1332 | | - |
---|
1333 | | - return rc; |
---|
| 1338 | + return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1334 | 1339 | } |
---|
1335 | 1340 | |
---|
1336 | 1341 | int pm8001_clear_task_set(struct domain_device *dev, u8 *lun) |
---|
1337 | 1342 | { |
---|
1338 | | - int rc = TMF_RESP_FUNC_FAILED; |
---|
1339 | 1343 | struct pm8001_tmf_task tmf_task; |
---|
1340 | 1344 | struct pm8001_device *pm8001_dev = dev->lldd_dev; |
---|
1341 | 1345 | struct pm8001_hba_info *pm8001_ha = pm8001_find_ha_by_dev(dev); |
---|
1342 | 1346 | |
---|
1343 | | - PM8001_EH_DBG(pm8001_ha, |
---|
1344 | | - pm8001_printk("I_T_L_Q clear task set[%x]\n", |
---|
1345 | | - pm8001_dev->device_id)); |
---|
| 1347 | + pm8001_dbg(pm8001_ha, EH, "I_T_L_Q clear task set[%x]\n", |
---|
| 1348 | + pm8001_dev->device_id); |
---|
1346 | 1349 | tmf_task.tmf = TMF_CLEAR_TASK_SET; |
---|
1347 | | - rc = pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1348 | | - return rc; |
---|
| 1350 | + return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); |
---|
1349 | 1351 | } |
---|
1350 | 1352 | |
---|