Lines Matching refs:dev

22 void sas_init_dev(struct domain_device *dev)  in sas_init_dev()  argument
24 switch (dev->dev_type) { in sas_init_dev()
26 INIT_LIST_HEAD(&dev->ssp_dev.eh_list_node); in sas_init_dev()
30 INIT_LIST_HEAD(&dev->ex_dev.children); in sas_init_dev()
31 mutex_init(&dev->ex_dev.cmd_mutex); in sas_init_dev()
53 struct domain_device *dev; in sas_get_port_device() local
56 dev = sas_alloc_device(); in sas_get_port_device()
57 if (!dev) in sas_get_port_device()
63 sas_put_device(dev); in sas_get_port_device()
68 memcpy(dev->frame_rcvd, phy->frame_rcvd, min(sizeof(dev->frame_rcvd), in sas_get_port_device()
73 if (dev->frame_rcvd[0] == 0x34 && port->oob_mode == SATA_OOB_MODE) { in sas_get_port_device()
75 (struct dev_to_host_fis *) dev->frame_rcvd; in sas_get_port_device()
79 dev->dev_type = SAS_SATA_PM; in sas_get_port_device()
81 dev->dev_type = SAS_SATA_DEV; in sas_get_port_device()
82 dev->tproto = SAS_PROTOCOL_SATA; in sas_get_port_device()
85 (struct sas_identify_frame *) dev->frame_rcvd; in sas_get_port_device()
86 dev->dev_type = id->dev_type; in sas_get_port_device()
87 dev->iproto = id->initiator_bits; in sas_get_port_device()
88 dev->tproto = id->target_bits; in sas_get_port_device()
94 sas_put_device(dev); in sas_get_port_device()
100 sas_init_dev(dev); in sas_get_port_device()
102 dev->port = port; in sas_get_port_device()
103 switch (dev->dev_type) { in sas_get_port_device()
105 rc = sas_ata_init(dev); in sas_get_port_device()
123 pr_warn("ERROR: Unidentified device type %d\n", dev->dev_type); in sas_get_port_device()
129 sas_put_device(dev); in sas_get_port_device()
134 memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE); in sas_get_port_device()
135 sas_fill_in_rphy(dev, rphy); in sas_get_port_device()
136 sas_hash_addr(dev->hashed_sas_addr, dev->sas_addr); in sas_get_port_device()
137 port->port_dev = dev; in sas_get_port_device()
138 dev->linkrate = port->linkrate; in sas_get_port_device()
139 dev->min_linkrate = port->linkrate; in sas_get_port_device()
140 dev->max_linkrate = port->linkrate; in sas_get_port_device()
141 dev->pathways = port->num_phys; in sas_get_port_device()
146 sas_device_set_phy(dev, port->port); in sas_get_port_device()
148 dev->rphy = rphy; in sas_get_port_device()
149 get_device(&dev->rphy->dev); in sas_get_port_device()
151 if (dev_is_sata(dev) || dev->dev_type == SAS_END_DEVICE) in sas_get_port_device()
152 list_add_tail(&dev->disco_list_node, &port->disco_list); in sas_get_port_device()
155 list_add_tail(&dev->dev_list_node, &port->dev_list); in sas_get_port_device()
161 sas_phy_set_target(phy, dev); in sas_get_port_device()
169 int sas_notify_lldd_dev_found(struct domain_device *dev) in sas_notify_lldd_dev_found() argument
172 struct sas_ha_struct *sas_ha = dev->port->ha; in sas_notify_lldd_dev_found()
179 res = i->dft->lldd_dev_found(dev); in sas_notify_lldd_dev_found()
182 dev_name(sas_ha->dev), in sas_notify_lldd_dev_found()
183 SAS_ADDR(dev->sas_addr), res); in sas_notify_lldd_dev_found()
186 set_bit(SAS_DEV_FOUND, &dev->state); in sas_notify_lldd_dev_found()
187 kref_get(&dev->kref); in sas_notify_lldd_dev_found()
192 void sas_notify_lldd_dev_gone(struct domain_device *dev) in sas_notify_lldd_dev_gone() argument
194 struct sas_ha_struct *sas_ha = dev->port->ha; in sas_notify_lldd_dev_gone()
201 if (test_and_clear_bit(SAS_DEV_FOUND, &dev->state)) { in sas_notify_lldd_dev_gone()
202 i->dft->lldd_dev_gone(dev); in sas_notify_lldd_dev_gone()
203 sas_put_device(dev); in sas_notify_lldd_dev_gone()
209 struct domain_device *dev, *n; in sas_probe_devices() local
212 list_for_each_entry(dev, &port->disco_list, disco_list_node) { in sas_probe_devices()
214 list_add_tail(&dev->dev_list_node, &port->dev_list); in sas_probe_devices()
220 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) { in sas_probe_devices()
223 err = sas_rphy_add(dev->rphy); in sas_probe_devices()
225 sas_fail_probe(dev, __func__, err); in sas_probe_devices()
227 list_del_init(&dev->disco_list_node); in sas_probe_devices()
234 struct domain_device *dev; in sas_suspend_devices() local
248 list_for_each_entry(dev, &port->dev_list, dev_list_node) in sas_suspend_devices()
249 sas_notify_lldd_dev_gone(dev); in sas_suspend_devices()
278 int sas_discover_end_dev(struct domain_device *dev) in sas_discover_end_dev() argument
280 return sas_notify_lldd_dev_found(dev); in sas_discover_end_dev()
287 struct domain_device *dev = container_of(kref, typeof(*dev), kref); in sas_free_device() local
289 put_device(&dev->rphy->dev); in sas_free_device()
290 dev->rphy = NULL; in sas_free_device()
292 if (dev->parent) in sas_free_device()
293 sas_put_device(dev->parent); in sas_free_device()
295 sas_port_put_phy(dev->phy); in sas_free_device()
296 dev->phy = NULL; in sas_free_device()
299 if (dev_is_expander(dev->dev_type)) in sas_free_device()
300 kfree(dev->ex_dev.ex_phy); in sas_free_device()
302 if (dev_is_sata(dev) && dev->sata_dev.ap) { in sas_free_device()
303 ata_sas_tport_delete(dev->sata_dev.ap); in sas_free_device()
304 ata_port_free(dev->sata_dev.ap); in sas_free_device()
305 ata_host_put(dev->sata_dev.ata_host); in sas_free_device()
306 dev->sata_dev.ata_host = NULL; in sas_free_device()
307 dev->sata_dev.ap = NULL; in sas_free_device()
310 kfree(dev); in sas_free_device()
313 static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_device *dev) in sas_unregister_common_dev() argument
317 sas_notify_lldd_dev_gone(dev); in sas_unregister_common_dev()
318 if (!dev->parent) in sas_unregister_common_dev()
319 dev->port->port_dev = NULL; in sas_unregister_common_dev()
321 list_del_init(&dev->siblings); in sas_unregister_common_dev()
324 list_del_init(&dev->dev_list_node); in sas_unregister_common_dev()
325 if (dev_is_sata(dev)) in sas_unregister_common_dev()
326 sas_ata_end_eh(dev->sata_dev.ap); in sas_unregister_common_dev()
330 if (dev->dev_type == SAS_END_DEVICE && in sas_unregister_common_dev()
331 !list_empty(&dev->ssp_dev.eh_list_node)) { in sas_unregister_common_dev()
332 list_del_init(&dev->ssp_dev.eh_list_node); in sas_unregister_common_dev()
337 sas_put_device(dev); in sas_unregister_common_dev()
342 struct domain_device *dev, *n; in sas_destruct_devices() local
344 list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) { in sas_destruct_devices()
345 list_del_init(&dev->disco_list_node); in sas_destruct_devices()
347 sas_remove_children(&dev->rphy->dev); in sas_destruct_devices()
348 sas_rphy_delete(dev->rphy); in sas_destruct_devices()
349 sas_unregister_common_dev(port, dev); in sas_destruct_devices()
366 struct domain_device *dev = data; in sas_abort_cmd() local
368 if (dev == cmd_to_domain_dev(cmd)) in sas_abort_cmd()
373 static void sas_abort_device_scsi_cmds(struct domain_device *dev) in sas_abort_device_scsi_cmds() argument
375 struct sas_ha_struct *sas_ha = dev->port->ha; in sas_abort_device_scsi_cmds()
378 if (dev_is_expander(dev->dev_type)) in sas_abort_device_scsi_cmds()
387 blk_mq_tagset_busy_iter(&shost->tag_set, sas_abort_cmd, dev); in sas_abort_device_scsi_cmds()
390 void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev) in sas_unregister_dev() argument
392 if (!test_bit(SAS_DEV_DESTROY, &dev->state) && in sas_unregister_dev()
393 !list_empty(&dev->disco_list_node)) { in sas_unregister_dev()
395 list_del_init(&dev->disco_list_node); in sas_unregister_dev()
396 sas_rphy_free(dev->rphy); in sas_unregister_dev()
397 sas_unregister_common_dev(port, dev); in sas_unregister_dev()
401 if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) { in sas_unregister_dev()
402 if (test_bit(SAS_DEV_GONE, &dev->state)) in sas_unregister_dev()
403 sas_abort_device_scsi_cmds(dev); in sas_unregister_dev()
404 sas_rphy_unlink(dev->rphy); in sas_unregister_dev()
405 list_move_tail(&dev->disco_list_node, &port->destroy_list); in sas_unregister_dev()
411 struct domain_device *dev, *n; in sas_unregister_domain_devices() local
413 list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) { in sas_unregister_domain_devices()
415 set_bit(SAS_DEV_GONE, &dev->state); in sas_unregister_domain_devices()
416 sas_unregister_dev(port, dev); in sas_unregister_domain_devices()
419 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) in sas_unregister_domain_devices()
420 sas_unregister_dev(port, dev); in sas_unregister_domain_devices()
426 void sas_device_set_phy(struct domain_device *dev, struct sas_port *port) in sas_device_set_phy() argument
431 if (!dev) in sas_device_set_phy()
434 ha = dev->port->ha; in sas_device_set_phy()
440 sas_port_put_phy(dev->phy); in sas_device_set_phy()
441 dev->phy = new_phy; in sas_device_set_phy()
459 struct domain_device *dev; in sas_discover_domain() local
472 dev = port->port_dev; in sas_discover_domain()
477 switch (dev->dev_type) { in sas_discover_domain()
479 error = sas_discover_end_dev(dev); in sas_discover_domain()
483 error = sas_discover_root_expander(dev); in sas_discover_domain()
487 error = sas_discover_sata(dev); in sas_discover_domain()
491 pr_err("unhandled device %d\n", dev->dev_type); in sas_discover_domain()
496 sas_rphy_free(dev->rphy); in sas_discover_domain()
497 list_del_init(&dev->disco_list_node); in sas_discover_domain()
499 list_del_init(&dev->dev_list_node); in sas_discover_domain()
502 sas_put_device(dev); in sas_discover_domain()