Lines Matching +full:t +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
45 * pm8001_find_tag - from sas task to find out tag that belongs to this task
51 if (task->lldd_task) { in pm8001_find_tag()
53 ccb = task->lldd_task; in pm8001_find_tag()
54 *tag = ccb->ccb_tag; in pm8001_find_tag()
61 * pm8001_tag_free - free the no more needed tag
67 void *bitmap = pm8001_ha->tags; in pm8001_tag_free()
72 * pm8001_tag_alloc - allocate a empty tag for task used.
79 void *bitmap = pm8001_ha->tags; in pm8001_tag_alloc()
82 spin_lock_irqsave(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_alloc()
83 tag = find_first_zero_bit(bitmap, pm8001_ha->tags_num); in pm8001_tag_alloc()
84 if (tag >= pm8001_ha->tags_num) { in pm8001_tag_alloc()
85 spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_alloc()
86 return -SAS_QUEUE_FULL; in pm8001_tag_alloc()
89 spin_unlock_irqrestore(&pm8001_ha->bitmap_lock, flags); in pm8001_tag_alloc()
97 for (i = 0; i < pm8001_ha->tags_num; ++i) in pm8001_tag_init()
102 * pm8001_mem_alloc - allocate memory for pm8001.
120 align_offset = (dma_addr_t)align - 1; in pm8001_mem_alloc()
121 mem_virt_alloc = dma_alloc_coherent(&pdev->dev, mem_size + align, in pm8001_mem_alloc()
124 return -ENOMEM; in pm8001_mem_alloc()
127 *virt_addr = (void *)mem_virt_alloc + phys_align - *pphys_addr; in pm8001_mem_alloc()
134 * pm8001_find_ha_by_dev - from domain device which come from sas layer to
141 struct sas_ha_struct *sha = dev->port->ha; in pm8001_find_ha_by_dev()
142 struct pm8001_hba_info *pm8001_ha = sha->lldd_ha; in pm8001_find_ha_by_dev()
147 * pm8001_phy_control - this function should be registered to
149 * control the HBA phy rather than other expander phy if you want control
150 * other phy, you should use SMP command.
151 * @sas_phy: which phy in HBA phys.
158 int rc = 0, phy_id = sas_phy->id; in pm8001_phy_control()
161 struct pm8001_phy *phy; in pm8001_phy_control() local
164 pm8001_ha = sas_phy->ha->lldd_ha; in pm8001_phy_control()
165 phy = &pm8001_ha->phy[phy_id]; in pm8001_phy_control()
166 pm8001_ha->phy[phy_id].enable_completion = &completion; in pm8001_phy_control()
170 if (rates->minimum_linkrate) { in pm8001_phy_control()
171 pm8001_ha->phy[phy_id].minimum_linkrate = in pm8001_phy_control()
172 rates->minimum_linkrate; in pm8001_phy_control()
174 if (rates->maximum_linkrate) { in pm8001_phy_control()
175 pm8001_ha->phy[phy_id].maximum_linkrate = in pm8001_phy_control()
176 rates->maximum_linkrate; in pm8001_phy_control()
178 if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { in pm8001_phy_control()
179 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); in pm8001_phy_control()
182 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
186 if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { in pm8001_phy_control()
187 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); in pm8001_phy_control()
190 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
194 if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) { in pm8001_phy_control()
195 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id); in pm8001_phy_control()
198 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
202 PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_phy_control()
206 if (pm8001_ha->chip_id != chip_8001) { in pm8001_phy_control()
207 if (pm8001_ha->phy[phy_id].phy_state == in pm8001_phy_control()
209 sas_phy_disconnected(&phy->sas_phy); in pm8001_phy_control()
210 sas_notify_phy_event(&phy->sas_phy, in pm8001_phy_control()
212 phy->phy_attached = 0; in pm8001_phy_control()
215 if (pm8001_ha->phy[phy_id].phy_state == in pm8001_phy_control()
217 sas_phy_disconnected(&phy->sas_phy); in pm8001_phy_control()
218 sas_notify_phy_event(&phy->sas_phy, in pm8001_phy_control()
220 phy->phy_attached = 0; in pm8001_phy_control()
223 PM8001_CHIP_DISP->phy_stop_req(pm8001_ha, phy_id); in pm8001_phy_control()
226 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_phy_control()
227 if (pm8001_ha->chip_id == chip_8001) { in pm8001_phy_control()
228 if (-1 == pm8001_bar4_shift(pm8001_ha, in pm8001_phy_control()
230 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_phy_control()
231 return -EINVAL; in pm8001_phy_control()
235 struct sas_phy *phy = sas_phy->phy; in pm8001_phy_control() local
237 pm8001_ha->io_mem[2].memvirtaddr) in pm8001_phy_control()
240 phy->invalid_dword_count = qp[0]; in pm8001_phy_control()
241 phy->running_disparity_error_count = qp[1]; in pm8001_phy_control()
242 phy->loss_of_dword_sync_count = qp[3]; in pm8001_phy_control()
243 phy->phy_reset_problem_count = qp[4]; in pm8001_phy_control()
245 if (pm8001_ha->chip_id == chip_8001) in pm8001_phy_control()
247 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_phy_control()
251 rc = -EOPNOTSUPP; in pm8001_phy_control()
258 * pm8001_scan_start - we should enable all HBA phys by sending the phy_start
268 pm8001_ha = sha->lldd_ha; in pm8001_scan_start()
270 if (pm8001_ha->chip_id == chip_8001) in pm8001_scan_start()
271 PM8001_CHIP_DISP->sas_re_init_req(pm8001_ha); in pm8001_scan_start()
272 for (i = 0; i < pm8001_ha->chip->n_phy; ++i) { in pm8001_scan_start()
273 pm8001_ha->phy[i].enable_completion = &completion; in pm8001_scan_start()
274 PM8001_CHIP_DISP->phy_start_req(pm8001_ha, i); in pm8001_scan_start()
284 /* give the phy enabling interrupt event time to come in (1s in pm8001_scan_finished()
294 * pm8001_task_prep_smp - the dispatcher function, prepare data for smp task
301 return PM8001_CHIP_DISP->smp_req(pm8001_ha, ccb); in pm8001_task_prep_smp()
306 struct ata_queued_cmd *qc = task->uldd_task; in pm8001_get_ncq_tag()
308 if (qc->tf.command == ATA_CMD_FPDMA_WRITE || in pm8001_get_ncq_tag()
309 qc->tf.command == ATA_CMD_FPDMA_READ || in pm8001_get_ncq_tag()
310 qc->tf.command == ATA_CMD_FPDMA_RECV || in pm8001_get_ncq_tag()
311 qc->tf.command == ATA_CMD_FPDMA_SEND || in pm8001_get_ncq_tag()
312 qc->tf.command == ATA_CMD_NCQ_NON_DATA) { 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_ssp_tm - the dispatcher function, prepare task management data
340 return PM8001_CHIP_DISP->ssp_tm_req(pm8001_ha, ccb, tmf); in pm8001_task_prep_ssp_tm()
344 * pm8001_task_prep_ssp - the dispatcher function, prepare ssp data for ssp task
351 return PM8001_CHIP_DISP->ssp_io_req(pm8001_ha, ccb); in pm8001_task_prep_ssp()
357 struct domain_device *pdev = dev->parent; in sas_find_local_port_id()
361 return dev->port->id; in sas_find_local_port_id()
363 struct domain_device *pdev_p = pdev->parent; in sas_find_local_port_id()
365 return pdev->port->id; in sas_find_local_port_id()
366 pdev = pdev->parent; in sas_find_local_port_id()
372 ((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)))
374 * pm8001_task_exec - queue the task(ssp, smp && ata) to the hardware.
383 struct domain_device *dev = task->dev; in pm8001_task_exec()
387 struct sas_task *t = task; in pm8001_task_exec() local
391 enum sas_protocol task_proto = t->task_proto; in pm8001_task_exec()
393 if (!dev->port) { in pm8001_task_exec()
394 struct task_status_struct *tsm = &t->task_status; in pm8001_task_exec()
395 tsm->resp = SAS_TASK_UNDELIVERED; in pm8001_task_exec()
396 tsm->stat = SAS_PHY_DOWN; in pm8001_task_exec()
397 if (dev->dev_type != SAS_SATA_DEV) in pm8001_task_exec()
398 t->task_done(t); in pm8001_task_exec()
401 pm8001_ha = pm8001_find_ha_by_dev(task->dev); in pm8001_task_exec()
402 if (pm8001_ha->controller_fatal_error) { in pm8001_task_exec()
403 struct task_status_struct *ts = &t->task_status; in pm8001_task_exec()
405 ts->resp = SAS_TASK_UNDELIVERED; in pm8001_task_exec()
406 t->task_done(t); in pm8001_task_exec()
410 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_task_exec()
412 dev = t->dev; in pm8001_task_exec()
413 pm8001_dev = dev->lldd_dev; in pm8001_task_exec()
414 port = &pm8001_ha->port[sas_find_local_port_id(dev)]; in pm8001_task_exec()
415 if (DEV_IS_GONE(pm8001_dev) || !port->port_attached) { in pm8001_task_exec()
417 struct task_status_struct *ts = &t->task_status; in pm8001_task_exec()
418 ts->resp = SAS_TASK_UNDELIVERED; in pm8001_task_exec()
419 ts->stat = SAS_PHY_DOWN; in pm8001_task_exec()
421 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_task_exec()
422 t->task_done(t); in pm8001_task_exec()
423 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_task_exec()
426 struct task_status_struct *ts = &t->task_status; in pm8001_task_exec()
427 ts->resp = SAS_TASK_UNDELIVERED; in pm8001_task_exec()
428 ts->stat = SAS_PHY_DOWN; in pm8001_task_exec()
429 t->task_done(t); in pm8001_task_exec()
436 ccb = &pm8001_ha->ccb_info[tag]; in pm8001_task_exec()
439 if (t->num_scatter) { in pm8001_task_exec()
440 n_elem = dma_map_sg(pm8001_ha->dev, in pm8001_task_exec()
441 t->scatter, in pm8001_task_exec()
442 t->num_scatter, in pm8001_task_exec()
443 t->data_dir); in pm8001_task_exec()
445 rc = -ENOMEM; in pm8001_task_exec()
450 n_elem = t->num_scatter; in pm8001_task_exec()
453 t->lldd_task = ccb; in pm8001_task_exec()
454 ccb->n_elem = n_elem; in pm8001_task_exec()
455 ccb->ccb_tag = tag; in pm8001_task_exec()
456 ccb->task = t; in pm8001_task_exec()
457 ccb->device = pm8001_dev; in pm8001_task_exec()
460 atomic_inc(&pm8001_dev->running_req); in pm8001_task_exec()
464 atomic_inc(&pm8001_dev->running_req); in pm8001_task_exec()
473 atomic_inc(&pm8001_dev->running_req); in pm8001_task_exec()
477 dev_printk(KERN_ERR, pm8001_ha->dev, in pm8001_task_exec()
479 rc = -EINVAL; in pm8001_task_exec()
485 atomic_dec(&pm8001_dev->running_req); in pm8001_task_exec()
489 spin_lock(&t->task_state_lock); in pm8001_task_exec()
490 t->task_state_flags |= SAS_TASK_AT_INITIATOR; in pm8001_task_exec()
491 spin_unlock(&t->task_state_lock); in pm8001_task_exec()
499 dev_printk(KERN_ERR, pm8001_ha->dev, "pm8001 exec failed[%d]!\n", rc); in pm8001_task_exec()
502 dma_unmap_sg(pm8001_ha->dev, t->scatter, t->num_scatter, in pm8001_task_exec()
503 t->data_dir); in pm8001_task_exec()
505 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_task_exec()
510 * pm8001_queue_command - register for upper layer used, all IO commands sent
521 * pm8001_ccb_task_free - free the sg for ssp and smp command, free the ccb.
530 if (!ccb->task) in pm8001_ccb_task_free()
532 if (!sas_protocol_ata(task->task_proto)) in pm8001_ccb_task_free()
533 if (ccb->n_elem) in pm8001_ccb_task_free()
534 dma_unmap_sg(pm8001_ha->dev, task->scatter, in pm8001_ccb_task_free()
535 task->num_scatter, task->data_dir); in pm8001_ccb_task_free()
537 switch (task->task_proto) { in pm8001_ccb_task_free()
539 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1, in pm8001_ccb_task_free()
541 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1, in pm8001_ccb_task_free()
552 task->lldd_task = NULL; in pm8001_ccb_task_free()
553 ccb->task = NULL; in pm8001_ccb_task_free()
554 ccb->ccb_tag = 0xFFFFFFFF; in pm8001_ccb_task_free()
555 ccb->open_retry = 0; in pm8001_ccb_task_free()
560 * pm8001_alloc_dev - find a empty pm8001_device
567 if (pm8001_ha->devices[dev].dev_type == SAS_PHY_UNUSED) { in pm8001_alloc_dev()
568 pm8001_ha->devices[dev].id = dev; in pm8001_alloc_dev()
569 return &pm8001_ha->devices[dev]; in pm8001_alloc_dev()
580 * pm8001_find_dev - find a matching pm8001_device
589 if (pm8001_ha->devices[dev].device_id == device_id) in pm8001_find_dev()
590 return &pm8001_ha->devices[dev]; in pm8001_find_dev()
600 u32 id = pm8001_dev->id; in pm8001_free_dev()
602 pm8001_dev->id = id; in pm8001_free_dev()
603 pm8001_dev->dev_type = SAS_PHY_UNUSED; in pm8001_free_dev()
604 pm8001_dev->device_id = PM8001_MAX_DEVICES; in pm8001_free_dev()
605 pm8001_dev->sas_device = NULL; in pm8001_free_dev()
609 * pm8001_dev_found_notify - libsas notify a device is found.
625 struct domain_device *parent_dev = dev->parent; in pm8001_dev_found_notify()
630 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_found_notify()
634 res = -1; in pm8001_dev_found_notify()
637 pm8001_device->sas_device = dev; in pm8001_dev_found_notify()
638 dev->lldd_dev = pm8001_device; in pm8001_dev_found_notify()
639 pm8001_device->dev_type = dev->dev_type; in pm8001_dev_found_notify()
640 pm8001_device->dcompletion = &completion; in pm8001_dev_found_notify()
641 if (parent_dev && dev_is_expander(parent_dev->dev_type)) { in pm8001_dev_found_notify()
643 struct ex_phy *phy; in pm8001_dev_found_notify() local
644 for (phy_id = 0; phy_id < parent_dev->ex_dev.num_phys; in pm8001_dev_found_notify()
646 phy = &parent_dev->ex_dev.ex_phy[phy_id]; in pm8001_dev_found_notify()
647 if (SAS_ADDR(phy->attached_sas_addr) in pm8001_dev_found_notify()
648 == SAS_ADDR(dev->sas_addr)) { in pm8001_dev_found_notify()
649 pm8001_device->attached_phy = phy_id; in pm8001_dev_found_notify()
653 if (phy_id == parent_dev->ex_dev.num_phys) { in pm8001_dev_found_notify()
656 SAS_ADDR(dev->sas_addr), in pm8001_dev_found_notify()
657 SAS_ADDR(parent_dev->sas_addr)); in pm8001_dev_found_notify()
658 res = -1; in pm8001_dev_found_notify()
661 if (dev->dev_type == SAS_SATA_DEV) { in pm8001_dev_found_notify()
662 pm8001_device->attached_phy = in pm8001_dev_found_notify()
663 dev->rphy->identify.phy_identifier; in pm8001_dev_found_notify()
668 PM8001_CHIP_DISP->reg_dev_req(pm8001_ha, pm8001_device, flag); in pm8001_dev_found_notify()
669 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_found_notify()
671 if (dev->dev_type == SAS_END_DEVICE) in pm8001_dev_found_notify()
673 pm8001_ha->flags = PM8001F_RUN_TIME; in pm8001_dev_found_notify()
676 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_found_notify()
687 del_timer(&task->slow_task->timer); in pm8001_task_done()
688 complete(&task->slow_task->completion); in pm8001_task_done()
691 static void pm8001_tmf_timedout(struct timer_list *t) in pm8001_tmf_timedout() argument
693 struct sas_task_slow *slow = from_timer(slow, t, timer); in pm8001_tmf_timedout()
694 struct sas_task *task = slow->task; in pm8001_tmf_timedout()
697 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_tmf_timedout()
698 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in pm8001_tmf_timedout()
699 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_tmf_timedout()
700 complete(&task->slow_task->completion); in pm8001_tmf_timedout()
702 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_tmf_timedout()
707 * pm8001_exec_internal_tmf_task - execute some task management commands.
723 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_exec_internal_tmf_task()
729 return -ENOMEM; in pm8001_exec_internal_tmf_task()
731 task->dev = dev; in pm8001_exec_internal_tmf_task()
732 task->task_proto = dev->tproto; in pm8001_exec_internal_tmf_task()
733 memcpy(&task->ssp_task, parameter, para_len); in pm8001_exec_internal_tmf_task()
734 task->task_done = pm8001_task_done; in pm8001_exec_internal_tmf_task()
735 task->slow_task->timer.function = pm8001_tmf_timedout; in pm8001_exec_internal_tmf_task()
736 task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT*HZ; in pm8001_exec_internal_tmf_task()
737 add_timer(&task->slow_task->timer); in pm8001_exec_internal_tmf_task()
742 del_timer(&task->slow_task->timer); in pm8001_exec_internal_tmf_task()
746 wait_for_completion(&task->slow_task->completion); in pm8001_exec_internal_tmf_task()
747 if (pm8001_ha->chip_id != chip_8001) { in pm8001_exec_internal_tmf_task()
748 pm8001_dev->setds_completion = &completion_setstate; in pm8001_exec_internal_tmf_task()
749 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_exec_internal_tmf_task()
753 res = -TMF_RESP_FUNC_FAILED; in pm8001_exec_internal_tmf_task()
755 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { in pm8001_exec_internal_tmf_task()
757 tmf->tmf); in pm8001_exec_internal_tmf_task()
761 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
762 task->task_status.stat == SAS_SAM_STAT_GOOD) { in pm8001_exec_internal_tmf_task()
767 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
768 task->task_status.stat == SAS_DATA_UNDERRUN) { in pm8001_exec_internal_tmf_task()
771 res = task->task_status.residual; in pm8001_exec_internal_tmf_task()
775 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
776 task->task_status.stat == SAS_DATA_OVERRUN) { in pm8001_exec_internal_tmf_task()
778 res = -EMSGSIZE; in pm8001_exec_internal_tmf_task()
783 SAS_ADDR(dev->sas_addr), in pm8001_exec_internal_tmf_task()
784 task->task_status.resp, in pm8001_exec_internal_tmf_task()
785 task->task_status.stat); in pm8001_exec_internal_tmf_task()
809 return -ENOMEM; in pm8001_exec_internal_task_abort()
811 task->dev = dev; in pm8001_exec_internal_task_abort()
812 task->task_proto = dev->tproto; in pm8001_exec_internal_task_abort()
813 task->task_done = pm8001_task_done; in pm8001_exec_internal_task_abort()
814 task->slow_task->timer.function = pm8001_tmf_timedout; in pm8001_exec_internal_task_abort()
815 task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT * HZ; in pm8001_exec_internal_task_abort()
816 add_timer(&task->slow_task->timer); in pm8001_exec_internal_task_abort()
821 ccb = &pm8001_ha->ccb_info[ccb_tag]; in pm8001_exec_internal_task_abort()
822 ccb->device = pm8001_dev; in pm8001_exec_internal_task_abort()
823 ccb->ccb_tag = ccb_tag; in pm8001_exec_internal_task_abort()
824 ccb->task = task; in pm8001_exec_internal_task_abort()
825 ccb->n_elem = 0; in pm8001_exec_internal_task_abort()
827 res = PM8001_CHIP_DISP->task_abort(pm8001_ha, in pm8001_exec_internal_task_abort()
831 del_timer(&task->slow_task->timer); in pm8001_exec_internal_task_abort()
835 wait_for_completion(&task->slow_task->completion); in pm8001_exec_internal_task_abort()
838 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { in pm8001_exec_internal_task_abort()
843 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_task_abort()
844 task->task_status.stat == SAS_SAM_STAT_GOOD) { in pm8001_exec_internal_task_abort()
851 SAS_ADDR(dev->sas_addr), in pm8001_exec_internal_task_abort()
852 task->task_status.resp, in pm8001_exec_internal_task_abort()
853 task->task_status.stat); in pm8001_exec_internal_task_abort()
865 * pm8001_dev_gone_notify - see the comments for "pm8001_dev_found_notify"
872 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_dev_gone_notify()
875 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
877 u32 device_id = pm8001_dev->device_id; in pm8001_dev_gone_notify()
880 pm8001_dev->device_id, pm8001_dev->dev_type); in pm8001_dev_gone_notify()
881 if (atomic_read(&pm8001_dev->running_req)) { in pm8001_dev_gone_notify()
882 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
885 while (atomic_read(&pm8001_dev->running_req)) in pm8001_dev_gone_notify()
887 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
889 PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); in pm8001_dev_gone_notify()
894 dev->lldd_dev = NULL; in pm8001_dev_gone_notify()
895 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
907 if (!(dev->tproto & SAS_PROTOCOL_SSP)) in pm8001_issue_ssp_tmf()
927 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
935 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[i]; in pm8001_open_reject_retry()
937 pm8001_dev = ccb->device; in pm8001_open_reject_retry()
938 if (!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)) in pm8001_open_reject_retry()
942 - (uintptr_t)&pm8001_ha->devices; in pm8001_open_reject_retry()
948 tag = ccb->ccb_tag; in pm8001_open_reject_retry()
951 task = ccb->task; in pm8001_open_reject_retry()
952 if (!task || !task->task_done) in pm8001_open_reject_retry()
956 ts = &task->task_status; in pm8001_open_reject_retry()
957 ts->resp = SAS_TASK_COMPLETE; in pm8001_open_reject_retry()
959 ts->stat = SAS_OPEN_REJECT; in pm8001_open_reject_retry()
960 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in pm8001_open_reject_retry()
962 atomic_dec(&pm8001_dev->running_req); in pm8001_open_reject_retry()
963 spin_lock_irqsave(&task->task_state_lock, flags1); in pm8001_open_reject_retry()
964 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_open_reject_retry()
965 task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in pm8001_open_reject_retry()
966 task->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_open_reject_retry()
967 if (unlikely((task->task_state_flags in pm8001_open_reject_retry()
969 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
973 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
977 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
978 task->task_done(task); in pm8001_open_reject_retry()
979 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
983 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
987 * pm8001_I_T_nexus_reset() - reset the initiator/target connection
998 struct sas_phy *phy; in pm8001_I_T_nexus_reset() local
1000 if (!dev || !dev->lldd_dev) in pm8001_I_T_nexus_reset()
1001 return -ENODEV; in pm8001_I_T_nexus_reset()
1003 pm8001_dev = dev->lldd_dev; in pm8001_I_T_nexus_reset()
1005 phy = sas_get_local_phy(dev); in pm8001_I_T_nexus_reset()
1008 if (scsi_is_sas_phy_local(phy)) { in pm8001_I_T_nexus_reset()
1012 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_reset()
1015 "phy reset failed for device %x\n" in pm8001_I_T_nexus_reset()
1016 "with rc %d\n", pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
1025 "with rc %d\n", pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
1029 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_reset()
1033 pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
1035 sas_put_local_phy(phy); in pm8001_I_T_nexus_reset()
1048 struct sas_phy *phy; in pm8001_I_T_nexus_event_handler() local
1050 if (!dev || !dev->lldd_dev) in pm8001_I_T_nexus_event_handler()
1051 return -1; in pm8001_I_T_nexus_event_handler()
1053 pm8001_dev = dev->lldd_dev; in pm8001_I_T_nexus_event_handler()
1058 phy = sas_get_local_phy(dev); in pm8001_I_T_nexus_event_handler()
1062 if (scsi_is_sas_phy_local(phy)) { in pm8001_I_T_nexus_event_handler()
1075 /*send phy reset to hard reset target */ in pm8001_I_T_nexus_event_handler()
1076 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_event_handler()
1078 pm8001_dev->setds_completion = &completion_setstate; in pm8001_I_T_nexus_event_handler()
1091 /*send phy reset to hard reset target */ in pm8001_I_T_nexus_event_handler()
1092 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_event_handler()
1096 pm8001_dev->device_id, rc); in pm8001_I_T_nexus_event_handler()
1098 sas_put_local_phy(phy); in pm8001_I_T_nexus_event_handler()
1102 /* mandatory SAM-3, the task reset the specified LUN*/
1107 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_lu_reset()
1111 struct sas_phy *phy = sas_get_local_phy(dev); in pm8001_lu_reset() local
1114 rc = sas_phy_reset(phy, 1); in pm8001_lu_reset()
1115 sas_put_local_phy(phy); in pm8001_lu_reset()
1116 pm8001_dev->setds_completion = &completion_setstate; in pm8001_lu_reset()
1117 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_lu_reset()
1124 /* If failed, fall-through I_T_Nexus reset */ in pm8001_lu_reset()
1126 pm8001_dev->device_id, rc); in pm8001_lu_reset()
1130 /* optional SAM-3 */
1137 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_query_task()
1140 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_query_task()
1141 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_query_task()
1142 struct domain_device *dev = task->dev; in pm8001_query_task()
1146 int_to_scsilun(cmnd->device->lun, &lun); in pm8001_query_task()
1152 pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd); in pm8001_query_task()
1163 /* The task is not in Lun or failed, reset the phy */ in pm8001_query_task()
1167 "The task is not in Lun or failed, reset the phy\n"); in pm8001_query_task()
1175 /* mandatory SAM-3, still need free task/ccb info, abort the specified task */
1189 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_abort_task()
1192 dev = task->dev; in pm8001_abort_task()
1193 pm8001_dev = dev->lldd_dev; in pm8001_abort_task()
1195 phy_id = pm8001_dev->attached_phy; in pm8001_abort_task()
1197 if (PM8001_CHIP_DISP->fatal_errors(pm8001_ha)) { in pm8001_abort_task()
1208 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1209 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in pm8001_abort_task()
1210 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1213 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_abort_task()
1214 if (task->slow_task == NULL) { in pm8001_abort_task()
1216 task->slow_task = &slow_task; in pm8001_abort_task()
1218 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1219 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_abort_task()
1220 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_abort_task()
1221 int_to_scsilun(cmnd->device->lun, &lun); in pm8001_abort_task()
1226 pm8001_dev->sas_device, 0, tag); in pm8001_abort_task()
1227 } else if (task->task_proto & SAS_PROTOCOL_SATA || in pm8001_abort_task()
1228 task->task_proto & SAS_PROTOCOL_STP) { in pm8001_abort_task()
1229 if (pm8001_ha->chip_id == chip_8006) { in pm8001_abort_task()
1232 struct pm8001_phy *phy = pm8001_ha->phy + phy_id; in pm8001_abort_task() local
1235 pm8001_dev->setds_completion = &completion; in pm8001_abort_task()
1236 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_abort_task()
1240 /* 2. Send Phy Control Hard Reset */ in pm8001_abort_task()
1242 phy->port_reset_status = PORT_RESET_TMO; in pm8001_abort_task()
1243 phy->reset_success = false; in pm8001_abort_task()
1244 phy->enable_completion = &completion; in pm8001_abort_task()
1245 phy->reset_completion = &completion_reset; in pm8001_abort_task()
1246 ret = PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_abort_task()
1249 phy->enable_completion = NULL; in pm8001_abort_task()
1250 phy->reset_completion = NULL; in pm8001_abort_task()
1263 "Waiting for local phy ctl\n"); in pm8001_abort_task()
1266 if (!ret || !phy->reset_success) { in pm8001_abort_task()
1267 phy->enable_completion = NULL; in pm8001_abort_task()
1268 phy->reset_completion = NULL; in pm8001_abort_task()
1279 phy->reset_completion = NULL; in pm8001_abort_task()
1280 WARN_ON(phy->port_reset_status == in pm8001_abort_task()
1282 if (phy->port_reset_status == PORT_RESET_TMO) { in pm8001_abort_task()
1295 pm8001_dev, pm8001_dev->sas_device, 1, tag); in pm8001_abort_task()
1299 &task->slow_task->completion, in pm8001_abort_task()
1306 pm8001_dev->setds_completion = &completion; in pm8001_abort_task()
1307 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_abort_task()
1312 pm8001_dev, pm8001_dev->sas_device, 0, tag); in pm8001_abort_task()
1315 } else if (task->task_proto & SAS_PROTOCOL_SMP) { in pm8001_abort_task()
1318 pm8001_dev->sas_device, 0, tag); in pm8001_abort_task()
1322 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1323 if (task->slow_task == &slow_task) in pm8001_abort_task()
1324 task->slow_task = NULL; in pm8001_abort_task()
1325 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1350 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_clear_task_set()
1354 pm8001_dev->device_id); in pm8001_clear_task_set()