Lines Matching +full:sierra +full:- +full:phy
2 * PMC-Sierra PM8001/8081/8088/8089 SAS/SATA based host adapters driver
4 * Copyright (c) 2008-2009 USI Co., Ltd.
18 * 3. Neither the names of the above-listed copyright holders nor the names
46 * pm8001_find_tag - from sas task to find out tag that belongs to this task
52 if (task->lldd_task) { in pm8001_find_tag()
54 ccb = task->lldd_task; in pm8001_find_tag()
55 *tag = ccb->ccb_tag; in pm8001_find_tag()
62 * pm8001_tag_free - free the no more needed tag
68 void *bitmap = pm8001_ha->tags; in pm8001_tag_free()
71 spin_lock_irqsave(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_free()
73 spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_free()
77 * pm8001_tag_alloc - allocate a empty tag for task used.
83 void *bitmap = pm8001_ha->tags; in pm8001_tag_alloc()
87 spin_lock_irqsave(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_alloc()
88 tag = find_first_zero_bit(bitmap, pm8001_ha->tags_num); in pm8001_tag_alloc()
89 if (tag >= pm8001_ha->tags_num) { in pm8001_tag_alloc()
90 spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_alloc()
91 return -SAS_QUEUE_FULL; in pm8001_tag_alloc()
94 spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_alloc()
102 for (i = 0; i < pm8001_ha->tags_num; ++i) in pm8001_tag_init()
107 * pm8001_mem_alloc - allocate memory for pm8001.
125 align_offset = (dma_addr_t)align - 1; in pm8001_mem_alloc()
126 mem_virt_alloc = dma_alloc_coherent(&pdev->dev, mem_size + align, in pm8001_mem_alloc()
129 return -ENOMEM; in pm8001_mem_alloc()
132 *virt_addr = (void *)mem_virt_alloc + phys_align - *pphys_addr; in pm8001_mem_alloc()
139 * pm8001_find_ha_by_dev - from domain device which come from sas layer to
146 struct sas_ha_struct *sha = dev->port->ha; in pm8001_find_ha_by_dev()
147 struct pm8001_hba_info *pm8001_ha = sha->lldd_ha; in pm8001_find_ha_by_dev()
152 * pm8001_phy_control - this function should be registered to
154 * control the HBA phy rather than other expander phy if you want control
155 * other phy, you should use SMP command.
156 * @sas_phy: which phy in HBA phys.
163 int rc = 0, phy_id = sas_phy->id; in pm8001_phy_control()
166 struct pm8001_phy *phy; in pm8001_phy_control() local
169 pm8001_ha = sas_phy->ha->lldd_ha; in pm8001_phy_control()
170 phy = &pm8001_ha->phy[phy_id]; in pm8001_phy_control()
171 pm8001_ha->phy[phy_id].enable_completion = &completion; in pm8001_phy_control()
175 if (rates->minimum_linkrate) { in pm8001_phy_control()
176 pm8001_ha->phy[phy_id].minimum_linkrate = in pm8001_phy_control()
177 rates->minimum_linkrate; in pm8001_phy_control()
179 if (rates->maximum_linkrate) { in pm8001_phy_control()
180 pm8001_ha->phy[phy_id].maximum_linkrate = in pm8001_phy_control()
181 rates->maximum_linkrate; in pm8001_phy_control()
183 if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { in pm8001_phy_control()
184 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); in pm8001_phy_control()
187 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
191 if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { in pm8001_phy_control()
192 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); in pm8001_phy_control()
195 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
199 if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { in pm8001_phy_control()
200 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); in pm8001_phy_control()
203 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
207 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
211 if (pm8001_ha->chip_id != chip_8001) { in pm8001_phy_control()
212 if (pm8001_ha->phy[phy_id].phy_state == in pm8001_phy_control()
214 sas_phy_disconnected(&phy->sas_phy); in pm8001_phy_control()
215 sas_notify_phy_event(&phy->sas_phy, in pm8001_phy_control()
217 phy->phy_attached = 0; in pm8001_phy_control()
220 if (pm8001_ha->phy[phy_id].phy_state == in pm8001_phy_control()
222 sas_phy_disconnected(&phy->sas_phy); in pm8001_phy_control()
223 sas_notify_phy_event(&phy->sas_phy, in pm8001_phy_control()
225 phy->phy_attached = 0; in pm8001_phy_control()
228 PM8001_CHIP_DISP->phy_stop_req(pm8001_ha, phy_id); in pm8001_phy_control()
231 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_phy_control()
232 if (pm8001_ha->chip_id == chip_8001) { in pm8001_phy_control()
233 if (-1 == pm8001_bar4_shift(pm8001_ha, in pm8001_phy_control()
235 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_phy_control()
236 return -EINVAL; in pm8001_phy_control()
240 struct sas_phy *phy = sas_phy->phy; in pm8001_phy_control() local
241 u32 __iomem *qp = pm8001_ha->io_mem[2].memvirtaddr in pm8001_phy_control()
244 phy->invalid_dword_count = readl(qp); in pm8001_phy_control()
245 phy->running_disparity_error_count = readl(&qp[1]); in pm8001_phy_control()
246 phy->loss_of_dword_sync_count = readl(&qp[3]); in pm8001_phy_control()
247 phy->phy_reset_problem_count = readl(&qp[4]); in pm8001_phy_control()
249 if (pm8001_ha->chip_id == chip_8001) in pm8001_phy_control()
251 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_phy_control()
255 rc = -EOPNOTSUPP; in pm8001_phy_control()
262 * pm8001_scan_start - we should enable all HBA phys by sending the phy_start
272 pm8001_ha = sha->lldd_ha; in pm8001_scan_start()
274 if (pm8001_ha->chip_id == chip_8001) in pm8001_scan_start()
275 PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha); in pm8001_scan_start()
276 for (i = 0; i < pm8001_ha->chip->n_phy; ++i) { in pm8001_scan_start()
277 pm8001_ha->phy[i].enable_completion = &completion; in pm8001_scan_start()
278 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i); in pm8001_scan_start()
288 /* give the phy enabling interrupt event time to come in (1s in pm8001_scan_finished()
298 * pm8001_task_prep_smp - the dispatcher function, prepare data for smp task
305 return PM8001_CHIP_DISP->smp_req(pm8001_ha, ccb); in pm8001_task_prep_smp()
310 struct ata_queued_cmd *qc = task->uldd_task; in pm8001_get_ncq_tag()
312 if (qc && ata_is_ncq(qc->tf.protocol)) { in pm8001_get_ncq_tag()
313 *tag = qc->tag; in pm8001_get_ncq_tag()
321 * pm8001_task_prep_ata - the dispatcher function, prepare data for sata task
328 return PM8001_CHIP_DISP->sata_req(pm8001_ha, ccb); in pm8001_task_prep_ata()
332 * pm8001_task_prep_internal_abort - the dispatcher function, prepare data
340 return PM8001_CHIP_DISP->task_abort(pm8001_ha, ccb); in pm8001_task_prep_internal_abort()
344 * pm8001_task_prep_ssp_tm - the dispatcher function, prepare task management data
352 return PM8001_CHIP_DISP->ssp_tm_req(pm8001_ha, ccb, tmf); in pm8001_task_prep_ssp_tm()
356 * pm8001_task_prep_ssp - the dispatcher function, prepare ssp data for ssp task
363 return PM8001_CHIP_DISP->ssp_io_req(pm8001_ha, ccb); in pm8001_task_prep_ssp()
369 struct domain_device *pdev = dev->parent; in sas_find_local_port_id()
373 return dev->port->id; in sas_find_local_port_id()
375 struct domain_device *pdev_p = pdev->parent; in sas_find_local_port_id()
377 return pdev->port->id; in sas_find_local_port_id()
378 pdev = pdev->parent; in sas_find_local_port_id()
384 ((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)))
390 struct sas_task *task = ccb->task; in pm8001_deliver_command()
391 enum sas_protocol task_proto = task->task_proto; in pm8001_deliver_command()
392 struct sas_tmf_task *tmf = task->tmf; in pm8001_deliver_command()
408 dev_err(pm8001_ha->dev, "unknown sas_task proto: 0x%x\n", in pm8001_deliver_command()
412 return -EINVAL; in pm8001_deliver_command()
416 * pm8001_queue_command - register for upper layer used, all IO commands sent
423 struct task_status_struct *ts = &task->task_status; in pm8001_queue_command()
424 enum sas_protocol task_proto = task->task_proto; in pm8001_queue_command()
425 struct domain_device *dev = task->dev; in pm8001_queue_command()
426 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_queue_command()
435 if (!internal_abort && !dev->port) { in pm8001_queue_command()
436 ts->resp = SAS_TASK_UNDELIVERED; in pm8001_queue_command()
437 ts->stat = SAS_PHY_DOWN; in pm8001_queue_command()
438 if (dev->dev_type != SAS_SATA_DEV) in pm8001_queue_command()
439 task->task_done(task); in pm8001_queue_command()
444 if (pm8001_ha->controller_fatal_error) { in pm8001_queue_command()
445 ts->resp = SAS_TASK_UNDELIVERED; in pm8001_queue_command()
446 task->task_done(task); in pm8001_queue_command()
452 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_queue_command()
454 pm8001_dev = dev->lldd_dev; in pm8001_queue_command()
455 port = &pm8001_ha->port[sas_find_local_port_id(dev)]; in pm8001_queue_command()
458 (DEV_IS_GONE(pm8001_dev) || !port->port_attached)) { in pm8001_queue_command()
459 ts->resp = SAS_TASK_UNDELIVERED; in pm8001_queue_command()
460 ts->stat = SAS_PHY_DOWN; in pm8001_queue_command()
462 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_queue_command()
463 task->task_done(task); in pm8001_queue_command()
464 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_queue_command()
466 task->task_done(task); in pm8001_queue_command()
468 rc = -ENODEV; in pm8001_queue_command()
474 rc = -SAS_QUEUE_FULL; in pm8001_queue_command()
479 if (task->num_scatter) { in pm8001_queue_command()
480 n_elem = dma_map_sg(pm8001_ha->dev, task->scatter, in pm8001_queue_command()
481 task->num_scatter, task->data_dir); in pm8001_queue_command()
483 rc = -ENOMEM; in pm8001_queue_command()
488 n_elem = task->num_scatter; in pm8001_queue_command()
491 task->lldd_task = ccb; in pm8001_queue_command()
492 ccb->n_elem = n_elem; in pm8001_queue_command()
494 atomic_inc(&pm8001_dev->running_req); in pm8001_queue_command()
498 atomic_dec(&pm8001_dev->running_req); in pm8001_queue_command()
500 dma_unmap_sg(pm8001_ha->dev, task->scatter, in pm8001_queue_command()
501 task->num_scatter, task->data_dir); in pm8001_queue_command()
509 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_queue_command()
515 * pm8001_ccb_task_free - free the sg for ssp and smp command, free the ccb.
522 struct sas_task *task = ccb->task; in pm8001_ccb_task_free()
529 if (!sas_protocol_ata(task->task_proto) && ccb->n_elem) in pm8001_ccb_task_free()
530 dma_unmap_sg(pm8001_ha->dev, task->scatter, in pm8001_ccb_task_free()
531 task->num_scatter, task->data_dir); in pm8001_ccb_task_free()
533 switch (task->task_proto) { in pm8001_ccb_task_free()
535 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1, in pm8001_ccb_task_free()
537 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1, in pm8001_ccb_task_free()
549 if (sas_protocol_ata(task->task_proto)) { in pm8001_ccb_task_free()
551 qc = task->uldd_task; in pm8001_ccb_task_free()
552 pm8001_dev = ccb->device; in pm8001_ccb_task_free()
553 trace_pm80xx_request_complete(pm8001_ha->id, in pm8001_ccb_task_free()
554 pm8001_dev ? pm8001_dev->attached_phy : PM8001_MAX_PHYS, in pm8001_ccb_task_free()
555 ccb->ccb_tag, 0 /* ctlr_opcode not known */, in pm8001_ccb_task_free()
556 qc ? qc->tf.command : 0, // ata opcode in pm8001_ccb_task_free()
557 pm8001_dev ? atomic_read(&pm8001_dev->running_req) : -1); in pm8001_ccb_task_free()
560 task->lldd_task = NULL; in pm8001_ccb_task_free()
565 * pm8001_alloc_dev - find a empty pm8001_device
572 if (pm8001_ha->devices[dev].dev_type == SAS_PHY_UNUSED) { in pm8001_alloc_dev()
573 pm8001_ha->devices[dev].id = dev; in pm8001_alloc_dev()
574 return &pm8001_ha->devices[dev]; in pm8001_alloc_dev()
585 * pm8001_find_dev - find a matching pm8001_device
594 if (pm8001_ha->devices[dev].device_id == device_id) in pm8001_find_dev()
595 return &pm8001_ha->devices[dev]; in pm8001_find_dev()
605 u32 id = pm8001_dev->id; in pm8001_free_dev()
607 pm8001_dev->id = id; in pm8001_free_dev()
608 pm8001_dev->dev_type = SAS_PHY_UNUSED; in pm8001_free_dev()
609 pm8001_dev->device_id = PM8001_MAX_DEVICES; in pm8001_free_dev()
610 pm8001_dev->sas_device = NULL; in pm8001_free_dev()
614 * pm8001_dev_found_notify - libsas notify a device is found.
630 struct domain_device *parent_dev = dev->parent; in pm8001_dev_found_notify()
635 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_found_notify()
639 res = -1; in pm8001_dev_found_notify()
642 pm8001_device->sas_device = dev; in pm8001_dev_found_notify()
643 dev->lldd_dev = pm8001_device; in pm8001_dev_found_notify()
644 pm8001_device->dev_type = dev->dev_type; in pm8001_dev_found_notify()
645 pm8001_device->dcompletion = &completion; in pm8001_dev_found_notify()
646 if (parent_dev && dev_is_expander(parent_dev->dev_type)) { in pm8001_dev_found_notify()
648 struct ex_phy *phy; in pm8001_dev_found_notify() local
649 for (phy_id = 0; phy_id < parent_dev->ex_dev.num_phys; in pm8001_dev_found_notify()
651 phy = &parent_dev->ex_dev.ex_phy[phy_id]; in pm8001_dev_found_notify()
652 if (SAS_ADDR(phy->attached_sas_addr) in pm8001_dev_found_notify()
653 == SAS_ADDR(dev->sas_addr)) { in pm8001_dev_found_notify()
654 pm8001_device->attached_phy = phy_id; in pm8001_dev_found_notify()
658 if (phy_id == parent_dev->ex_dev.num_phys) { in pm8001_dev_found_notify()
661 SAS_ADDR(dev->sas_addr), in pm8001_dev_found_notify()
662 SAS_ADDR(parent_dev->sas_addr)); in pm8001_dev_found_notify()
663 res = -1; in pm8001_dev_found_notify()
666 if (dev->dev_type == SAS_SATA_DEV) { in pm8001_dev_found_notify()
667 pm8001_device->attached_phy = in pm8001_dev_found_notify()
668 dev->rphy->identify.phy_identifier; in pm8001_dev_found_notify()
673 PM8001_CHIP_DISP->reg_dev_req(pm8001_ha, pm8001_device, flag); in pm8001_dev_found_notify()
674 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_found_notify()
676 if (dev->dev_type == SAS_END_DEVICE) in pm8001_dev_found_notify()
678 pm8001_ha->flags = PM8001F_RUN_TIME; in pm8001_dev_found_notify()
681 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_found_notify()
692 del_timer(&task->slow_task->timer); in pm8001_task_done()
693 complete(&task->slow_task->completion); in pm8001_task_done()
699 * pm8001_dev_gone_notify - see the comments for "pm8001_dev_found_notify"
706 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_dev_gone_notify()
709 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
711 u32 device_id = pm8001_dev->device_id; in pm8001_dev_gone_notify()
714 pm8001_dev->device_id, pm8001_dev->dev_type); in pm8001_dev_gone_notify()
715 if (atomic_read(&pm8001_dev->running_req)) { in pm8001_dev_gone_notify()
716 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
718 while (atomic_read(&pm8001_dev->running_req)) in pm8001_dev_gone_notify()
720 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
722 PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); in pm8001_dev_gone_notify()
727 dev->lldd_dev = NULL; in pm8001_dev_gone_notify()
728 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
748 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
755 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[i]; in pm8001_open_reject_retry()
757 if (ccb->ccb_tag == PM8001_INVALID_TAG) in pm8001_open_reject_retry()
760 pm8001_dev = ccb->device; in pm8001_open_reject_retry()
761 if (!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)) in pm8001_open_reject_retry()
765 - (uintptr_t)&pm8001_ha->devices; in pm8001_open_reject_retry()
771 task = ccb->task; in pm8001_open_reject_retry()
772 if (!task || !task->task_done) in pm8001_open_reject_retry()
776 ts = &task->task_status; in pm8001_open_reject_retry()
777 ts->resp = SAS_TASK_COMPLETE; in pm8001_open_reject_retry()
779 ts->stat = SAS_OPEN_REJECT; in pm8001_open_reject_retry()
780 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in pm8001_open_reject_retry()
782 atomic_dec(&pm8001_dev->running_req); in pm8001_open_reject_retry()
783 spin_lock_irqsave(&task->task_state_lock, flags1); in pm8001_open_reject_retry()
784 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_open_reject_retry()
785 task->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_open_reject_retry()
786 if (unlikely((task->task_state_flags in pm8001_open_reject_retry()
788 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
792 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
796 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
797 task->task_done(task); in pm8001_open_reject_retry()
798 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
802 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
806 * pm8001_I_T_nexus_reset() - reset the initiator/target connection
817 struct sas_phy *phy; in pm8001_I_T_nexus_reset() local
819 if (!dev || !dev->lldd_dev) in pm8001_I_T_nexus_reset()
820 return -ENODEV; in pm8001_I_T_nexus_reset()
822 pm8001_dev = dev->lldd_dev; in pm8001_I_T_nexus_reset()
824 phy = sas_get_local_phy(dev); in pm8001_I_T_nexus_reset()
827 if (scsi_is_sas_phy_local(phy)) { in pm8001_I_T_nexus_reset()
831 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_reset()
834 "phy reset failed for device %x\n" in pm8001_I_T_nexus_reset()
835 "with rc %d\n", pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
843 "with rc %d\n", pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
847 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_reset()
851 pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
853 sas_put_local_phy(phy); in pm8001_I_T_nexus_reset()
866 struct sas_phy *phy; in pm8001_I_T_nexus_event_handler() local
868 if (!dev || !dev->lldd_dev) in pm8001_I_T_nexus_event_handler()
869 return -1; in pm8001_I_T_nexus_event_handler()
871 pm8001_dev = dev->lldd_dev; in pm8001_I_T_nexus_event_handler()
876 phy = sas_get_local_phy(dev); in pm8001_I_T_nexus_event_handler()
880 if (scsi_is_sas_phy_local(phy)) { in pm8001_I_T_nexus_event_handler()
892 /*send phy reset to hard reset target */ in pm8001_I_T_nexus_event_handler()
893 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_event_handler()
895 pm8001_dev->setds_completion = &completion_setstate; in pm8001_I_T_nexus_event_handler()
907 /*send phy reset to hard reset target */ in pm8001_I_T_nexus_event_handler()
908 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_event_handler()
912 pm8001_dev->device_id, rc); in pm8001_I_T_nexus_event_handler()
914 sas_put_local_phy(phy); in pm8001_I_T_nexus_event_handler()
918 /* mandatory SAM-3, the task reset the specified LUN*/
922 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_lu_reset()
926 struct sas_phy *phy = sas_get_local_phy(dev); in pm8001_lu_reset() local
928 rc = sas_phy_reset(phy, 1); in pm8001_lu_reset()
929 sas_put_local_phy(phy); in pm8001_lu_reset()
930 pm8001_dev->setds_completion = &completion_setstate; in pm8001_lu_reset()
931 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_lu_reset()
937 /* If failed, fall-through I_T_Nexus reset */ in pm8001_lu_reset()
939 pm8001_dev->device_id, rc); in pm8001_lu_reset()
943 /* optional SAM-3 */
948 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_query_task()
951 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_query_task()
952 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_query_task()
953 struct domain_device *dev = task->dev; in pm8001_query_task()
962 pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd); in pm8001_query_task()
971 /* The task is not in Lun or failed, reset the phy */ in pm8001_query_task()
975 "The task is not in Lun or failed, reset the phy\n"); in pm8001_query_task()
983 /* mandatory SAM-3, still need free task/ccb info, abort the specified task */
995 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_abort_task()
998 dev = task->dev; in pm8001_abort_task()
999 pm8001_dev = dev->lldd_dev; in pm8001_abort_task()
1001 phy_id = pm8001_dev->attached_phy; in pm8001_abort_task()
1003 if (PM8001_CHIP_DISP->fatal_errors(pm8001_ha)) { in pm8001_abort_task()
1014 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1015 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in pm8001_abort_task()
1016 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1019 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_abort_task()
1020 if (task->slow_task == NULL) { in pm8001_abort_task()
1022 task->slow_task = &slow_task; in pm8001_abort_task()
1024 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1025 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_abort_task()
1028 } else if (task->task_proto & SAS_PROTOCOL_SATA || in pm8001_abort_task()
1029 task->task_proto & SAS_PROTOCOL_STP) { in pm8001_abort_task()
1030 if (pm8001_ha->chip_id == chip_8006) { in pm8001_abort_task()
1033 struct pm8001_phy *phy = pm8001_ha->phy + phy_id; in pm8001_abort_task() local
1034 port_id = phy->port->port_id; in pm8001_abort_task()
1037 pm8001_dev->setds_completion = &completion; in pm8001_abort_task()
1038 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_abort_task()
1042 /* 2. Send Phy Control Hard Reset */ in pm8001_abort_task()
1044 phy->port_reset_status = PORT_RESET_TMO; in pm8001_abort_task()
1045 phy->reset_success = false; in pm8001_abort_task()
1046 phy->enable_completion = &completion; in pm8001_abort_task()
1047 phy->reset_completion = &completion_reset; in pm8001_abort_task()
1048 ret = PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_abort_task()
1051 phy->enable_completion = NULL; in pm8001_abort_task()
1052 phy->reset_completion = NULL; in pm8001_abort_task()
1065 "Waiting for local phy ctl\n"); in pm8001_abort_task()
1068 if (!ret || !phy->reset_success) { in pm8001_abort_task()
1069 phy->enable_completion = NULL; in pm8001_abort_task()
1070 phy->reset_completion = NULL; in pm8001_abort_task()
1081 phy->reset_completion = NULL; in pm8001_abort_task()
1082 WARN_ON(phy->port_reset_status == in pm8001_abort_task()
1084 if (phy->port_reset_status == PORT_RESET_TMO) { in pm8001_abort_task()
1086 PM8001_CHIP_DISP->hw_event_ack_req( in pm8001_abort_task()
1104 &task->slow_task->completion, in pm8001_abort_task()
1111 pm8001_dev->setds_completion = &completion; in pm8001_abort_task()
1112 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_abort_task()
1119 } else if (task->task_proto & SAS_PROTOCOL_SMP) { in pm8001_abort_task()
1125 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1126 if (task->slow_task == &slow_task) in pm8001_abort_task()
1127 task->slow_task = NULL; in pm8001_abort_task()
1128 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1136 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_clear_task_set()
1140 pm8001_dev->device_id); in pm8001_clear_task_set()
1146 struct sas_ha_struct *sas_ha = sas_phy->ha; in pm8001_port_formed()
1147 struct pm8001_hba_info *pm8001_ha = sas_ha->lldd_ha; in pm8001_port_formed()
1148 struct pm8001_phy *phy = sas_phy->lldd_phy; in pm8001_port_formed() local
1149 struct asd_sas_port *sas_port = sas_phy->port; in pm8001_port_formed()
1150 struct pm8001_port *port = phy->port; in pm8001_port_formed()
1156 sas_port->lldd_port = port; in pm8001_port_formed()
1162 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_setds_completion()
1165 if (pm8001_ha->chip_id != chip_8001) { in pm8001_setds_completion()
1166 pm8001_dev->setds_completion = &completion_setstate; in pm8001_setds_completion()
1167 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_setds_completion()
1175 struct pm8001_ccb_info *ccb = task->lldd_task; in pm8001_tmf_aborted()
1178 ccb->task = NULL; in pm8001_tmf_aborted()