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.
118 align_offset = (dma_addr_t)align - 1; in pm8001_mem_alloc()
119 mem_virt_alloc = dma_alloc_coherent(&pdev->dev, mem_size + align, in pm8001_mem_alloc()
123 return -1; 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()
756 struct pm8001_ccb_info *ccb = task->lldd_task; in pm8001_exec_internal_tmf_task()
759 tmf->tmf); in pm8001_exec_internal_tmf_task()
762 ccb->task = NULL; in pm8001_exec_internal_tmf_task()
766 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
767 task->task_status.stat == SAS_SAM_STAT_GOOD) { in pm8001_exec_internal_tmf_task()
772 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
773 task->task_status.stat == SAS_DATA_UNDERRUN) { in pm8001_exec_internal_tmf_task()
776 res = task->task_status.residual; in pm8001_exec_internal_tmf_task()
780 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
781 task->task_status.stat == SAS_DATA_OVERRUN) { in pm8001_exec_internal_tmf_task()
783 res = -EMSGSIZE; in pm8001_exec_internal_tmf_task()
788 SAS_ADDR(dev->sas_addr), in pm8001_exec_internal_tmf_task()
789 task->task_status.resp, in pm8001_exec_internal_tmf_task()
790 task->task_status.stat); in pm8001_exec_internal_tmf_task()
814 return -ENOMEM; in pm8001_exec_internal_task_abort()
816 task->dev = dev; in pm8001_exec_internal_task_abort()
817 task->task_proto = dev->tproto; in pm8001_exec_internal_task_abort()
818 task->task_done = pm8001_task_done; in pm8001_exec_internal_task_abort()
819 task->slow_task->timer.function = pm8001_tmf_timedout; in pm8001_exec_internal_task_abort()
820 task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT * HZ; in pm8001_exec_internal_task_abort()
821 add_timer(&task->slow_task->timer); in pm8001_exec_internal_task_abort()
826 ccb = &pm8001_ha->ccb_info[ccb_tag]; in pm8001_exec_internal_task_abort()
827 ccb->device = pm8001_dev; in pm8001_exec_internal_task_abort()
828 ccb->ccb_tag = ccb_tag; in pm8001_exec_internal_task_abort()
829 ccb->task = task; in pm8001_exec_internal_task_abort()
830 ccb->n_elem = 0; in pm8001_exec_internal_task_abort()
832 res = PM8001_CHIP_DISP->task_abort(pm8001_ha, in pm8001_exec_internal_task_abort()
835 del_timer(&task->slow_task->timer); in pm8001_exec_internal_task_abort()
840 wait_for_completion(&task->slow_task->completion); in pm8001_exec_internal_task_abort()
843 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { in pm8001_exec_internal_task_abort()
848 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_task_abort()
849 task->task_status.stat == SAS_SAM_STAT_GOOD) { in pm8001_exec_internal_task_abort()
856 SAS_ADDR(dev->sas_addr), in pm8001_exec_internal_task_abort()
857 task->task_status.resp, in pm8001_exec_internal_task_abort()
858 task->task_status.stat); in pm8001_exec_internal_task_abort()
870 * pm8001_dev_gone_notify - see the comments for "pm8001_dev_found_notify"
877 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_dev_gone_notify()
880 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
882 u32 device_id = pm8001_dev->device_id; in pm8001_dev_gone_notify()
885 pm8001_dev->device_id, pm8001_dev->dev_type); in pm8001_dev_gone_notify()
886 if (atomic_read(&pm8001_dev->running_req)) { in pm8001_dev_gone_notify()
887 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
890 while (atomic_read(&pm8001_dev->running_req)) in pm8001_dev_gone_notify()
892 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
894 PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id); in pm8001_dev_gone_notify()
899 dev->lldd_dev = NULL; in pm8001_dev_gone_notify()
900 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_dev_gone_notify()
912 if (!(dev->tproto & SAS_PROTOCOL_SSP)) in pm8001_issue_ssp_tmf()
932 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
940 struct pm8001_ccb_info *ccb = &pm8001_ha->ccb_info[i]; in pm8001_open_reject_retry()
942 pm8001_dev = ccb->device; in pm8001_open_reject_retry()
943 if (!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)) in pm8001_open_reject_retry()
947 - (uintptr_t)&pm8001_ha->devices; in pm8001_open_reject_retry()
953 tag = ccb->ccb_tag; in pm8001_open_reject_retry()
956 task = ccb->task; in pm8001_open_reject_retry()
957 if (!task || !task->task_done) in pm8001_open_reject_retry()
961 ts = &task->task_status; in pm8001_open_reject_retry()
962 ts->resp = SAS_TASK_COMPLETE; in pm8001_open_reject_retry()
964 ts->stat = SAS_OPEN_REJECT; in pm8001_open_reject_retry()
965 ts->open_rej_reason = SAS_OREJ_RSVD_RETRY; in pm8001_open_reject_retry()
967 atomic_dec(&pm8001_dev->running_req); in pm8001_open_reject_retry()
968 spin_lock_irqsave(&task->task_state_lock, flags1); in pm8001_open_reject_retry()
969 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_open_reject_retry()
970 task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in pm8001_open_reject_retry()
971 task->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_open_reject_retry()
972 if (unlikely((task->task_state_flags in pm8001_open_reject_retry()
974 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
978 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
982 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
983 task->task_done(task); in pm8001_open_reject_retry()
984 spin_lock_irqsave(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
988 spin_unlock_irqrestore(&pm8001_ha->lock, flags); in pm8001_open_reject_retry()
1001 struct sas_phy *phy; in pm8001_I_T_nexus_reset() local
1003 if (!dev || !dev->lldd_dev) in pm8001_I_T_nexus_reset()
1004 return -ENODEV; in pm8001_I_T_nexus_reset()
1006 pm8001_dev = dev->lldd_dev; in pm8001_I_T_nexus_reset()
1008 phy = sas_get_local_phy(dev); in pm8001_I_T_nexus_reset()
1011 if (scsi_is_sas_phy_local(phy)) { in pm8001_I_T_nexus_reset()
1015 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_reset()
1018 "phy reset failed for device %x\n" in pm8001_I_T_nexus_reset()
1019 "with rc %d\n", pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
1028 "with rc %d\n", pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
1032 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_reset()
1036 pm8001_dev->device_id, rc); in pm8001_I_T_nexus_reset()
1038 sas_put_local_phy(phy); in pm8001_I_T_nexus_reset()
1051 struct sas_phy *phy; in pm8001_I_T_nexus_event_handler() local
1053 if (!dev || !dev->lldd_dev) in pm8001_I_T_nexus_event_handler()
1054 return -1; in pm8001_I_T_nexus_event_handler()
1056 pm8001_dev = dev->lldd_dev; in pm8001_I_T_nexus_event_handler()
1061 phy = sas_get_local_phy(dev); in pm8001_I_T_nexus_event_handler()
1065 if (scsi_is_sas_phy_local(phy)) { in pm8001_I_T_nexus_event_handler()
1078 /*send phy reset to hard reset target */ in pm8001_I_T_nexus_event_handler()
1079 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_event_handler()
1081 pm8001_dev->setds_completion = &completion_setstate; in pm8001_I_T_nexus_event_handler()
1094 /*send phy reset to hard reset target */ in pm8001_I_T_nexus_event_handler()
1095 rc = sas_phy_reset(phy, 1); in pm8001_I_T_nexus_event_handler()
1099 pm8001_dev->device_id, rc); in pm8001_I_T_nexus_event_handler()
1101 sas_put_local_phy(phy); in pm8001_I_T_nexus_event_handler()
1105 /* mandatory SAM-3, the task reset the specified LUN*/
1110 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_lu_reset()
1114 struct sas_phy *phy = sas_get_local_phy(dev); in pm8001_lu_reset() local
1117 rc = sas_phy_reset(phy, 1); in pm8001_lu_reset()
1118 sas_put_local_phy(phy); in pm8001_lu_reset()
1119 pm8001_dev->setds_completion = &completion_setstate; in pm8001_lu_reset()
1120 rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_lu_reset()
1127 /* If failed, fall-through I_T_Nexus reset */ in pm8001_lu_reset()
1129 pm8001_dev->device_id, rc); in pm8001_lu_reset()
1133 /* optional SAM-3 */
1140 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_query_task()
1143 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_query_task()
1144 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_query_task()
1145 struct domain_device *dev = task->dev; in pm8001_query_task()
1149 int_to_scsilun(cmnd->device->lun, &lun); in pm8001_query_task()
1155 pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd); in pm8001_query_task()
1166 /* The task is not in Lun or failed, reset the phy */ in pm8001_query_task()
1170 "The task is not in Lun or failed, reset the phy\n"); in pm8001_query_task()
1178 /* mandatory SAM-3, still need free task/ccb info, abort the specified task */
1191 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_abort_task()
1193 dev = task->dev; in pm8001_abort_task()
1194 pm8001_dev = dev->lldd_dev; in pm8001_abort_task()
1196 phy_id = pm8001_dev->attached_phy; in pm8001_abort_task()
1202 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1203 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in pm8001_abort_task()
1204 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1207 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_abort_task()
1208 if (task->slow_task == NULL) { in pm8001_abort_task()
1210 task->slow_task = &slow_task; in pm8001_abort_task()
1212 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1213 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_abort_task()
1214 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_abort_task()
1215 int_to_scsilun(cmnd->device->lun, &lun); in pm8001_abort_task()
1220 pm8001_dev->sas_device, 0, tag); in pm8001_abort_task()
1221 } else if (task->task_proto & SAS_PROTOCOL_SATA || in pm8001_abort_task()
1222 task->task_proto & SAS_PROTOCOL_STP) { in pm8001_abort_task()
1223 if (pm8001_ha->chip_id == chip_8006) { in pm8001_abort_task()
1226 struct pm8001_phy *phy = pm8001_ha->phy + phy_id; in pm8001_abort_task() local
1229 pm8001_dev->setds_completion = &completion; in pm8001_abort_task()
1230 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_abort_task()
1234 /* 2. Send Phy Control Hard Reset */ in pm8001_abort_task()
1236 phy->port_reset_status = PORT_RESET_TMO; in pm8001_abort_task()
1237 phy->reset_success = false; in pm8001_abort_task()
1238 phy->enable_completion = &completion; in pm8001_abort_task()
1239 phy->reset_completion = &completion_reset; in pm8001_abort_task()
1240 ret = PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id, in pm8001_abort_task()
1243 phy->enable_completion = NULL; in pm8001_abort_task()
1244 phy->reset_completion = NULL; in pm8001_abort_task()
1257 "Waiting for local phy ctl\n"); in pm8001_abort_task()
1260 if (!ret || !phy->reset_success) { in pm8001_abort_task()
1261 phy->enable_completion = NULL; in pm8001_abort_task()
1262 phy->reset_completion = NULL; in pm8001_abort_task()
1273 phy->reset_completion = NULL; in pm8001_abort_task()
1274 WARN_ON(phy->port_reset_status == in pm8001_abort_task()
1276 if (phy->port_reset_status == PORT_RESET_TMO) { in pm8001_abort_task()
1289 pm8001_dev, pm8001_dev->sas_device, 1, tag); in pm8001_abort_task()
1293 &task->slow_task->completion, in pm8001_abort_task()
1300 pm8001_dev->setds_completion = &completion; in pm8001_abort_task()
1301 PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, in pm8001_abort_task()
1306 pm8001_dev, pm8001_dev->sas_device, 0, tag); in pm8001_abort_task()
1309 } else if (task->task_proto & SAS_PROTOCOL_SMP) { in pm8001_abort_task()
1312 pm8001_dev->sas_device, 0, tag); in pm8001_abort_task()
1316 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1317 if (task->slow_task == &slow_task) in pm8001_abort_task()
1318 task->slow_task = NULL; in pm8001_abort_task()
1319 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1344 struct pm8001_device *pm8001_dev = dev->lldd_dev; in pm8001_clear_task_set()
1348 pm8001_dev->device_id); in pm8001_clear_task_set()