Merge branch 'for-5.14' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu
[linux-2.6-microblaze.git] / drivers / scsi / libsas / sas_discover.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Serial Attached SCSI (SAS) Discover process
4  *
5  * Copyright (C) 2005 Adaptec, Inc.  All rights reserved.
6  * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
7  */
8
9 #include <linux/scatterlist.h>
10 #include <linux/slab.h>
11 #include <linux/async.h>
12 #include <scsi/scsi_host.h>
13 #include <scsi/scsi_eh.h>
14 #include "sas_internal.h"
15
16 #include <scsi/scsi_transport.h>
17 #include <scsi/scsi_transport_sas.h>
18 #include <scsi/sas_ata.h>
19 #include "../scsi_sas_internal.h"
20
21 /* ---------- Basic task processing for discovery purposes ---------- */
22
23 void sas_init_dev(struct domain_device *dev)
24 {
25         switch (dev->dev_type) {
26         case SAS_END_DEVICE:
27                 INIT_LIST_HEAD(&dev->ssp_dev.eh_list_node);
28                 break;
29         case SAS_EDGE_EXPANDER_DEVICE:
30         case SAS_FANOUT_EXPANDER_DEVICE:
31                 INIT_LIST_HEAD(&dev->ex_dev.children);
32                 mutex_init(&dev->ex_dev.cmd_mutex);
33                 break;
34         default:
35                 break;
36         }
37 }
38
39 /* ---------- Domain device discovery ---------- */
40
41 /**
42  * sas_get_port_device - Discover devices which caused port creation
43  * @port: pointer to struct sas_port of interest
44  *
45  * Devices directly attached to a HA port, have no parent.  This is
46  * how we know they are (domain) "root" devices.  All other devices
47  * do, and should have their "parent" pointer set appropriately as
48  * soon as a child device is discovered.
49  */
50 static int sas_get_port_device(struct asd_sas_port *port)
51 {
52         struct asd_sas_phy *phy;
53         struct sas_rphy *rphy;
54         struct domain_device *dev;
55         int rc = -ENODEV;
56
57         dev = sas_alloc_device();
58         if (!dev)
59                 return -ENOMEM;
60
61         spin_lock_irq(&port->phy_list_lock);
62         if (list_empty(&port->phy_list)) {
63                 spin_unlock_irq(&port->phy_list_lock);
64                 sas_put_device(dev);
65                 return -ENODEV;
66         }
67         phy = container_of(port->phy_list.next, struct asd_sas_phy, port_phy_el);
68         spin_lock(&phy->frame_rcvd_lock);
69         memcpy(dev->frame_rcvd, phy->frame_rcvd, min(sizeof(dev->frame_rcvd),
70                                              (size_t)phy->frame_rcvd_size));
71         spin_unlock(&phy->frame_rcvd_lock);
72         spin_unlock_irq(&port->phy_list_lock);
73
74         if (dev->frame_rcvd[0] == 0x34 && port->oob_mode == SATA_OOB_MODE) {
75                 struct dev_to_host_fis *fis =
76                         (struct dev_to_host_fis *) dev->frame_rcvd;
77                 if (fis->interrupt_reason == 1 && fis->lbal == 1 &&
78                     fis->byte_count_low == 0x69 && fis->byte_count_high == 0x96
79                     && (fis->device & ~0x10) == 0)
80                         dev->dev_type = SAS_SATA_PM;
81                 else
82                         dev->dev_type = SAS_SATA_DEV;
83                 dev->tproto = SAS_PROTOCOL_SATA;
84         } else if (port->oob_mode == SAS_OOB_MODE) {
85                 struct sas_identify_frame *id =
86                         (struct sas_identify_frame *) dev->frame_rcvd;
87                 dev->dev_type = id->dev_type;
88                 dev->iproto = id->initiator_bits;
89                 dev->tproto = id->target_bits;
90         } else {
91                 /* If the oob mode is OOB_NOT_CONNECTED, the port is
92                  * disconnected due to race with PHY down. We cannot
93                  * continue to discover this port
94                  */
95                 sas_put_device(dev);
96                 pr_warn("Port %016llx is disconnected when discovering\n",
97                         SAS_ADDR(port->attached_sas_addr));
98                 return -ENODEV;
99         }
100
101         sas_init_dev(dev);
102
103         dev->port = port;
104         switch (dev->dev_type) {
105         case SAS_SATA_DEV:
106                 rc = sas_ata_init(dev);
107                 if (rc) {
108                         rphy = NULL;
109                         break;
110                 }
111                 fallthrough;
112         case SAS_END_DEVICE:
113                 rphy = sas_end_device_alloc(port->port);
114                 break;
115         case SAS_EDGE_EXPANDER_DEVICE:
116                 rphy = sas_expander_alloc(port->port,
117                                           SAS_EDGE_EXPANDER_DEVICE);
118                 break;
119         case SAS_FANOUT_EXPANDER_DEVICE:
120                 rphy = sas_expander_alloc(port->port,
121                                           SAS_FANOUT_EXPANDER_DEVICE);
122                 break;
123         default:
124                 pr_warn("ERROR: Unidentified device type %d\n", dev->dev_type);
125                 rphy = NULL;
126                 break;
127         }
128
129         if (!rphy) {
130                 sas_put_device(dev);
131                 return rc;
132         }
133
134         rphy->identify.phy_identifier = phy->phy->identify.phy_identifier;
135         memcpy(dev->sas_addr, port->attached_sas_addr, SAS_ADDR_SIZE);
136         sas_fill_in_rphy(dev, rphy);
137         sas_hash_addr(dev->hashed_sas_addr, dev->sas_addr);
138         port->port_dev = dev;
139         dev->linkrate = port->linkrate;
140         dev->min_linkrate = port->linkrate;
141         dev->max_linkrate = port->linkrate;
142         dev->pathways = port->num_phys;
143         memset(port->disc.fanout_sas_addr, 0, SAS_ADDR_SIZE);
144         memset(port->disc.eeds_a, 0, SAS_ADDR_SIZE);
145         memset(port->disc.eeds_b, 0, SAS_ADDR_SIZE);
146         port->disc.max_level = 0;
147         sas_device_set_phy(dev, port->port);
148
149         dev->rphy = rphy;
150         get_device(&dev->rphy->dev);
151
152         if (dev_is_sata(dev) || dev->dev_type == SAS_END_DEVICE)
153                 list_add_tail(&dev->disco_list_node, &port->disco_list);
154         else {
155                 spin_lock_irq(&port->dev_list_lock);
156                 list_add_tail(&dev->dev_list_node, &port->dev_list);
157                 spin_unlock_irq(&port->dev_list_lock);
158         }
159
160         spin_lock_irq(&port->phy_list_lock);
161         list_for_each_entry(phy, &port->phy_list, port_phy_el)
162                 sas_phy_set_target(phy, dev);
163         spin_unlock_irq(&port->phy_list_lock);
164
165         return 0;
166 }
167
168 /* ---------- Discover and Revalidate ---------- */
169
170 int sas_notify_lldd_dev_found(struct domain_device *dev)
171 {
172         int res = 0;
173         struct sas_ha_struct *sas_ha = dev->port->ha;
174         struct Scsi_Host *shost = sas_ha->core.shost;
175         struct sas_internal *i = to_sas_internal(shost->transportt);
176
177         if (!i->dft->lldd_dev_found)
178                 return 0;
179
180         res = i->dft->lldd_dev_found(dev);
181         if (res) {
182                 pr_warn("driver on host %s cannot handle device %016llx, error:%d\n",
183                         dev_name(sas_ha->dev),
184                         SAS_ADDR(dev->sas_addr), res);
185                 return res;
186         }
187         set_bit(SAS_DEV_FOUND, &dev->state);
188         kref_get(&dev->kref);
189         return 0;
190 }
191
192
193 void sas_notify_lldd_dev_gone(struct domain_device *dev)
194 {
195         struct sas_ha_struct *sas_ha = dev->port->ha;
196         struct Scsi_Host *shost = sas_ha->core.shost;
197         struct sas_internal *i = to_sas_internal(shost->transportt);
198
199         if (!i->dft->lldd_dev_gone)
200                 return;
201
202         if (test_and_clear_bit(SAS_DEV_FOUND, &dev->state)) {
203                 i->dft->lldd_dev_gone(dev);
204                 sas_put_device(dev);
205         }
206 }
207
208 static void sas_probe_devices(struct asd_sas_port *port)
209 {
210         struct domain_device *dev, *n;
211
212         /* devices must be domain members before link recovery and probe */
213         list_for_each_entry(dev, &port->disco_list, disco_list_node) {
214                 spin_lock_irq(&port->dev_list_lock);
215                 list_add_tail(&dev->dev_list_node, &port->dev_list);
216                 spin_unlock_irq(&port->dev_list_lock);
217         }
218
219         sas_probe_sata(port);
220
221         list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) {
222                 int err;
223
224                 err = sas_rphy_add(dev->rphy);
225                 if (err)
226                         sas_fail_probe(dev, __func__, err);
227                 else
228                         list_del_init(&dev->disco_list_node);
229         }
230 }
231
232 static void sas_suspend_devices(struct work_struct *work)
233 {
234         struct asd_sas_phy *phy;
235         struct domain_device *dev;
236         struct sas_discovery_event *ev = to_sas_discovery_event(work);
237         struct asd_sas_port *port = ev->port;
238         struct Scsi_Host *shost = port->ha->core.shost;
239         struct sas_internal *si = to_sas_internal(shost->transportt);
240
241         clear_bit(DISCE_SUSPEND, &port->disc.pending);
242
243         sas_suspend_sata(port);
244
245         /* lldd is free to forget the domain_device across the
246          * suspension, we force the issue here to keep the reference
247          * counts aligned
248          */
249         list_for_each_entry(dev, &port->dev_list, dev_list_node)
250                 sas_notify_lldd_dev_gone(dev);
251
252         /* we are suspending, so we know events are disabled and
253          * phy_list is not being mutated
254          */
255         list_for_each_entry(phy, &port->phy_list, port_phy_el) {
256                 if (si->dft->lldd_port_deformed)
257                         si->dft->lldd_port_deformed(phy);
258                 phy->suspended = 1;
259                 port->suspended = 1;
260         }
261 }
262
263 static void sas_resume_devices(struct work_struct *work)
264 {
265         struct sas_discovery_event *ev = to_sas_discovery_event(work);
266         struct asd_sas_port *port = ev->port;
267
268         clear_bit(DISCE_RESUME, &port->disc.pending);
269
270         sas_resume_sata(port);
271 }
272
273 /**
274  * sas_discover_end_dev - discover an end device (SSP, etc)
275  * @dev: pointer to domain device of interest
276  *
277  * See comment in sas_discover_sata().
278  */
279 int sas_discover_end_dev(struct domain_device *dev)
280 {
281         return sas_notify_lldd_dev_found(dev);
282 }
283
284 /* ---------- Device registration and unregistration ---------- */
285
286 void sas_free_device(struct kref *kref)
287 {
288         struct domain_device *dev = container_of(kref, typeof(*dev), kref);
289
290         put_device(&dev->rphy->dev);
291         dev->rphy = NULL;
292
293         if (dev->parent)
294                 sas_put_device(dev->parent);
295
296         sas_port_put_phy(dev->phy);
297         dev->phy = NULL;
298
299         /* remove the phys and ports, everything else should be gone */
300         if (dev_is_expander(dev->dev_type))
301                 kfree(dev->ex_dev.ex_phy);
302
303         if (dev_is_sata(dev) && dev->sata_dev.ap) {
304                 ata_sas_tport_delete(dev->sata_dev.ap);
305                 ata_sas_port_destroy(dev->sata_dev.ap);
306                 ata_host_put(dev->sata_dev.ata_host);
307                 dev->sata_dev.ata_host = NULL;
308                 dev->sata_dev.ap = NULL;
309         }
310
311         kfree(dev);
312 }
313
314 static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_device *dev)
315 {
316         struct sas_ha_struct *ha = port->ha;
317
318         sas_notify_lldd_dev_gone(dev);
319         if (!dev->parent)
320                 dev->port->port_dev = NULL;
321         else
322                 list_del_init(&dev->siblings);
323
324         spin_lock_irq(&port->dev_list_lock);
325         list_del_init(&dev->dev_list_node);
326         if (dev_is_sata(dev))
327                 sas_ata_end_eh(dev->sata_dev.ap);
328         spin_unlock_irq(&port->dev_list_lock);
329
330         spin_lock_irq(&ha->lock);
331         if (dev->dev_type == SAS_END_DEVICE &&
332             !list_empty(&dev->ssp_dev.eh_list_node)) {
333                 list_del_init(&dev->ssp_dev.eh_list_node);
334                 ha->eh_active--;
335         }
336         spin_unlock_irq(&ha->lock);
337
338         sas_put_device(dev);
339 }
340
341 void sas_destruct_devices(struct asd_sas_port *port)
342 {
343         struct domain_device *dev, *n;
344
345         list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) {
346                 list_del_init(&dev->disco_list_node);
347
348                 sas_remove_children(&dev->rphy->dev);
349                 sas_rphy_delete(dev->rphy);
350                 sas_unregister_common_dev(port, dev);
351         }
352 }
353
354 static void sas_destruct_ports(struct asd_sas_port *port)
355 {
356         struct sas_port *sas_port, *p;
357
358         list_for_each_entry_safe(sas_port, p, &port->sas_port_del_list, del_list) {
359                 list_del_init(&sas_port->del_list);
360                 sas_port_delete(sas_port);
361         }
362 }
363
364 void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
365 {
366         if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
367             !list_empty(&dev->disco_list_node)) {
368                 /* this rphy never saw sas_rphy_add */
369                 list_del_init(&dev->disco_list_node);
370                 sas_rphy_free(dev->rphy);
371                 sas_unregister_common_dev(port, dev);
372                 return;
373         }
374
375         if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) {
376                 sas_rphy_unlink(dev->rphy);
377                 list_move_tail(&dev->disco_list_node, &port->destroy_list);
378         }
379 }
380
381 void sas_unregister_domain_devices(struct asd_sas_port *port, int gone)
382 {
383         struct domain_device *dev, *n;
384
385         list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) {
386                 if (gone)
387                         set_bit(SAS_DEV_GONE, &dev->state);
388                 sas_unregister_dev(port, dev);
389         }
390
391         list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node)
392                 sas_unregister_dev(port, dev);
393
394         port->port->rphy = NULL;
395
396 }
397
398 void sas_device_set_phy(struct domain_device *dev, struct sas_port *port)
399 {
400         struct sas_ha_struct *ha;
401         struct sas_phy *new_phy;
402
403         if (!dev)
404                 return;
405
406         ha = dev->port->ha;
407         new_phy = sas_port_get_phy(port);
408
409         /* pin and record last seen phy */
410         spin_lock_irq(&ha->phy_port_lock);
411         if (new_phy) {
412                 sas_port_put_phy(dev->phy);
413                 dev->phy = new_phy;
414         }
415         spin_unlock_irq(&ha->phy_port_lock);
416 }
417
418 /* ---------- Discovery and Revalidation ---------- */
419
420 /**
421  * sas_discover_domain - discover the domain
422  * @work: work structure embedded in port domain device.
423  *
424  * NOTE: this process _must_ quit (return) as soon as any connection
425  * errors are encountered.  Connection recovery is done elsewhere.
426  * Discover process only interrogates devices in order to discover the
427  * domain.
428  */
429 static void sas_discover_domain(struct work_struct *work)
430 {
431         struct domain_device *dev;
432         int error = 0;
433         struct sas_discovery_event *ev = to_sas_discovery_event(work);
434         struct asd_sas_port *port = ev->port;
435
436         clear_bit(DISCE_DISCOVER_DOMAIN, &port->disc.pending);
437
438         if (port->port_dev)
439                 return;
440
441         error = sas_get_port_device(port);
442         if (error)
443                 return;
444         dev = port->port_dev;
445
446         pr_debug("DOING DISCOVERY on port %d, pid:%d\n", port->id,
447                  task_pid_nr(current));
448
449         switch (dev->dev_type) {
450         case SAS_END_DEVICE:
451                 error = sas_discover_end_dev(dev);
452                 break;
453         case SAS_EDGE_EXPANDER_DEVICE:
454         case SAS_FANOUT_EXPANDER_DEVICE:
455                 error = sas_discover_root_expander(dev);
456                 break;
457         case SAS_SATA_DEV:
458         case SAS_SATA_PM:
459 #ifdef CONFIG_SCSI_SAS_ATA
460                 error = sas_discover_sata(dev);
461                 break;
462 #else
463                 pr_notice("ATA device seen but CONFIG_SCSI_SAS_ATA=N so cannot attach\n");
464                 /* Fall through */
465 #endif
466                 /* Fall through - only for the #else condition above. */
467         default:
468                 error = -ENXIO;
469                 pr_err("unhandled device %d\n", dev->dev_type);
470                 break;
471         }
472
473         if (error) {
474                 sas_rphy_free(dev->rphy);
475                 list_del_init(&dev->disco_list_node);
476                 spin_lock_irq(&port->dev_list_lock);
477                 list_del_init(&dev->dev_list_node);
478                 spin_unlock_irq(&port->dev_list_lock);
479
480                 sas_put_device(dev);
481                 port->port_dev = NULL;
482         }
483
484         sas_probe_devices(port);
485
486         pr_debug("DONE DISCOVERY on port %d, pid:%d, result:%d\n", port->id,
487                  task_pid_nr(current), error);
488 }
489
490 static void sas_revalidate_domain(struct work_struct *work)
491 {
492         int res = 0;
493         struct sas_discovery_event *ev = to_sas_discovery_event(work);
494         struct asd_sas_port *port = ev->port;
495         struct sas_ha_struct *ha = port->ha;
496         struct domain_device *ddev = port->port_dev;
497
498         /* prevent revalidation from finding sata links in recovery */
499         mutex_lock(&ha->disco_mutex);
500         if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) {
501                 pr_debug("REVALIDATION DEFERRED on port %d, pid:%d\n",
502                          port->id, task_pid_nr(current));
503                 goto out;
504         }
505
506         clear_bit(DISCE_REVALIDATE_DOMAIN, &port->disc.pending);
507
508         pr_debug("REVALIDATING DOMAIN on port %d, pid:%d\n", port->id,
509                  task_pid_nr(current));
510
511         if (ddev && dev_is_expander(ddev->dev_type))
512                 res = sas_ex_revalidate_domain(ddev);
513
514         pr_debug("done REVALIDATING DOMAIN on port %d, pid:%d, res 0x%x\n",
515                  port->id, task_pid_nr(current), res);
516  out:
517         mutex_unlock(&ha->disco_mutex);
518
519         sas_destruct_devices(port);
520         sas_destruct_ports(port);
521         sas_probe_devices(port);
522 }
523
524 /* ---------- Events ---------- */
525
526 static void sas_chain_work(struct sas_ha_struct *ha, struct sas_work *sw)
527 {
528         /* chained work is not subject to SA_HA_DRAINING or
529          * SAS_HA_REGISTERED, because it is either submitted in the
530          * workqueue, or known to be submitted from a context that is
531          * not racing against draining
532          */
533         queue_work(ha->disco_q, &sw->work);
534 }
535
536 static void sas_chain_event(int event, unsigned long *pending,
537                             struct sas_work *sw,
538                             struct sas_ha_struct *ha)
539 {
540         if (!test_and_set_bit(event, pending)) {
541                 unsigned long flags;
542
543                 spin_lock_irqsave(&ha->lock, flags);
544                 sas_chain_work(ha, sw);
545                 spin_unlock_irqrestore(&ha->lock, flags);
546         }
547 }
548
549 int sas_discover_event(struct asd_sas_port *port, enum discover_event ev)
550 {
551         struct sas_discovery *disc;
552
553         if (!port)
554                 return 0;
555         disc = &port->disc;
556
557         BUG_ON(ev >= DISC_NUM_EVENTS);
558
559         sas_chain_event(ev, &disc->pending, &disc->disc_work[ev].work, port->ha);
560
561         return 0;
562 }
563
564 /**
565  * sas_init_disc - initialize the discovery struct in the port
566  * @disc: port discovery structure
567  * @port: pointer to struct port
568  *
569  * Called when the ports are being initialized.
570  */
571 void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port)
572 {
573         int i;
574
575         static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = {
576                 [DISCE_DISCOVER_DOMAIN] = sas_discover_domain,
577                 [DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain,
578                 [DISCE_SUSPEND] = sas_suspend_devices,
579                 [DISCE_RESUME] = sas_resume_devices,
580         };
581
582         disc->pending = 0;
583         for (i = 0; i < DISC_NUM_EVENTS; i++) {
584                 INIT_SAS_WORK(&disc->disc_work[i].work, sas_event_fns[i]);
585                 disc->disc_work[i].port = port;
586         }
587 }