1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Serial Attached SCSI (SAS) Expander discovery and configuration
4  *
5  * Copyright (C) 2005 Adaptec, Inc.  All rights reserved.
6  * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
7  *
8  * This file is licensed under GPLv2.
9  */
10 
11 #include <linux/scatterlist.h>
12 #include <linux/blkdev.h>
13 #include <linux/slab.h>
14 #include <asm/unaligned.h>
15 
16 #include "sas_internal.h"
17 
18 #include <scsi/sas_ata.h>
19 #include <scsi/scsi_transport.h>
20 #include <scsi/scsi_transport_sas.h>
21 #include "scsi_sas_internal.h"
22 
23 static int sas_discover_expander(struct domain_device *dev);
24 static int sas_configure_routing(struct domain_device *dev, u8 *sas_addr);
25 static int sas_configure_phy(struct domain_device *dev, int phy_id,
26 			     u8 *sas_addr, int include);
27 static int sas_disable_routing(struct domain_device *dev,  u8 *sas_addr);
28 
29 /* ---------- SMP task management ---------- */
30 
31 /* Give it some long enough timeout. In seconds. */
32 #define SMP_TIMEOUT 10
33 
smp_execute_task_sg(struct domain_device * dev,struct scatterlist * req,struct scatterlist * resp)34 static int smp_execute_task_sg(struct domain_device *dev,
35 		struct scatterlist *req, struct scatterlist *resp)
36 {
37 	int res, retry;
38 	struct sas_task *task = NULL;
39 	struct sas_internal *i =
40 		to_sas_internal(dev->port->ha->shost->transportt);
41 	struct sas_ha_struct *ha = dev->port->ha;
42 
43 	pm_runtime_get_sync(ha->dev);
44 	mutex_lock(&dev->ex_dev.cmd_mutex);
45 	for (retry = 0; retry < 3; retry++) {
46 		if (test_bit(SAS_DEV_GONE, &dev->state)) {
47 			res = -ECOMM;
48 			break;
49 		}
50 
51 		task = sas_alloc_slow_task(GFP_KERNEL);
52 		if (!task) {
53 			res = -ENOMEM;
54 			break;
55 		}
56 		task->dev = dev;
57 		task->task_proto = dev->tproto;
58 		task->smp_task.smp_req = *req;
59 		task->smp_task.smp_resp = *resp;
60 
61 		task->task_done = sas_task_internal_done;
62 
63 		task->slow_task->timer.function = sas_task_internal_timedout;
64 		task->slow_task->timer.expires = jiffies + SMP_TIMEOUT*HZ;
65 		add_timer(&task->slow_task->timer);
66 
67 		res = i->dft->lldd_execute_task(task, GFP_KERNEL);
68 
69 		if (res) {
70 			del_timer_sync(&task->slow_task->timer);
71 			pr_notice("executing SMP task failed:%d\n", res);
72 			break;
73 		}
74 
75 		wait_for_completion(&task->slow_task->completion);
76 		res = -ECOMM;
77 		if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) {
78 			pr_notice("smp task timed out or aborted\n");
79 			i->dft->lldd_abort_task(task);
80 			if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
81 				pr_notice("SMP task aborted and not done\n");
82 				break;
83 			}
84 		}
85 		if (task->task_status.resp == SAS_TASK_COMPLETE &&
86 		    task->task_status.stat == SAS_SAM_STAT_GOOD) {
87 			res = 0;
88 			break;
89 		}
90 		if (task->task_status.resp == SAS_TASK_COMPLETE &&
91 		    task->task_status.stat == SAS_DATA_UNDERRUN) {
92 			/* no error, but return the number of bytes of
93 			 * underrun */
94 			res = task->task_status.residual;
95 			break;
96 		}
97 		if (task->task_status.resp == SAS_TASK_COMPLETE &&
98 		    task->task_status.stat == SAS_DATA_OVERRUN) {
99 			res = -EMSGSIZE;
100 			break;
101 		}
102 		if (task->task_status.resp == SAS_TASK_UNDELIVERED &&
103 		    task->task_status.stat == SAS_DEVICE_UNKNOWN)
104 			break;
105 		else {
106 			pr_notice("%s: task to dev %016llx response: 0x%x status 0x%x\n",
107 				  __func__,
108 				  SAS_ADDR(dev->sas_addr),
109 				  task->task_status.resp,
110 				  task->task_status.stat);
111 			sas_free_task(task);
112 			task = NULL;
113 		}
114 	}
115 	mutex_unlock(&dev->ex_dev.cmd_mutex);
116 	pm_runtime_put_sync(ha->dev);
117 
118 	BUG_ON(retry == 3 && task != NULL);
119 	sas_free_task(task);
120 	return res;
121 }
122 
smp_execute_task(struct domain_device * dev,void * req,int req_size,void * resp,int resp_size)123 static int smp_execute_task(struct domain_device *dev, void *req, int req_size,
124 			    void *resp, int resp_size)
125 {
126 	struct scatterlist req_sg;
127 	struct scatterlist resp_sg;
128 
129 	sg_init_one(&req_sg, req, req_size);
130 	sg_init_one(&resp_sg, resp, resp_size);
131 	return smp_execute_task_sg(dev, &req_sg, &resp_sg);
132 }
133 
134 /* ---------- Allocations ---------- */
135 
alloc_smp_req(int size)136 static inline void *alloc_smp_req(int size)
137 {
138 	u8 *p = kzalloc(ALIGN(size, ARCH_DMA_MINALIGN), GFP_KERNEL);
139 	if (p)
140 		p[0] = SMP_REQUEST;
141 	return p;
142 }
143 
alloc_smp_resp(int size)144 static inline void *alloc_smp_resp(int size)
145 {
146 	return kzalloc(size, GFP_KERNEL);
147 }
148 
sas_route_char(struct domain_device * dev,struct ex_phy * phy)149 static char sas_route_char(struct domain_device *dev, struct ex_phy *phy)
150 {
151 	switch (phy->routing_attr) {
152 	case TABLE_ROUTING:
153 		if (dev->ex_dev.t2t_supp)
154 			return 'U';
155 		else
156 			return 'T';
157 	case DIRECT_ROUTING:
158 		return 'D';
159 	case SUBTRACTIVE_ROUTING:
160 		return 'S';
161 	default:
162 		return '?';
163 	}
164 }
165 
to_dev_type(struct discover_resp * dr)166 static enum sas_device_type to_dev_type(struct discover_resp *dr)
167 {
168 	/* This is detecting a failure to transmit initial dev to host
169 	 * FIS as described in section J.5 of sas-2 r16
170 	 */
171 	if (dr->attached_dev_type == SAS_PHY_UNUSED && dr->attached_sata_dev &&
172 	    dr->linkrate >= SAS_LINK_RATE_1_5_GBPS)
173 		return SAS_SATA_PENDING;
174 	else
175 		return dr->attached_dev_type;
176 }
177 
sas_set_ex_phy(struct domain_device * dev,int phy_id,struct smp_disc_resp * disc_resp)178 static void sas_set_ex_phy(struct domain_device *dev, int phy_id,
179 			   struct smp_disc_resp *disc_resp)
180 {
181 	enum sas_device_type dev_type;
182 	enum sas_linkrate linkrate;
183 	u8 sas_addr[SAS_ADDR_SIZE];
184 	struct discover_resp *dr = &disc_resp->disc;
185 	struct sas_ha_struct *ha = dev->port->ha;
186 	struct expander_device *ex = &dev->ex_dev;
187 	struct ex_phy *phy = &ex->ex_phy[phy_id];
188 	struct sas_rphy *rphy = dev->rphy;
189 	bool new_phy = !phy->phy;
190 	char *type;
191 
192 	if (new_phy) {
193 		if (WARN_ON_ONCE(test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)))
194 			return;
195 		phy->phy = sas_phy_alloc(&rphy->dev, phy_id);
196 
197 		/* FIXME: error_handling */
198 		BUG_ON(!phy->phy);
199 	}
200 
201 	switch (disc_resp->result) {
202 	case SMP_RESP_PHY_VACANT:
203 		phy->phy_state = PHY_VACANT;
204 		break;
205 	default:
206 		phy->phy_state = PHY_NOT_PRESENT;
207 		break;
208 	case SMP_RESP_FUNC_ACC:
209 		phy->phy_state = PHY_EMPTY; /* do not know yet */
210 		break;
211 	}
212 
213 	/* check if anything important changed to squelch debug */
214 	dev_type = phy->attached_dev_type;
215 	linkrate  = phy->linkrate;
216 	memcpy(sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
217 
218 	/* Handle vacant phy - rest of dr data is not valid so skip it */
219 	if (phy->phy_state == PHY_VACANT) {
220 		memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
221 		phy->attached_dev_type = SAS_PHY_UNUSED;
222 		if (!test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state)) {
223 			phy->phy_id = phy_id;
224 			goto skip;
225 		} else
226 			goto out;
227 	}
228 
229 	phy->attached_dev_type = to_dev_type(dr);
230 	if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
231 		goto out;
232 	phy->phy_id = phy_id;
233 	phy->linkrate = dr->linkrate;
234 	phy->attached_sata_host = dr->attached_sata_host;
235 	phy->attached_sata_dev  = dr->attached_sata_dev;
236 	phy->attached_sata_ps   = dr->attached_sata_ps;
237 	phy->attached_iproto = dr->iproto << 1;
238 	phy->attached_tproto = dr->tproto << 1;
239 	/* help some expanders that fail to zero sas_address in the 'no
240 	 * device' case
241 	 */
242 	if (phy->attached_dev_type == SAS_PHY_UNUSED)
243 		memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
244 	else
245 		memcpy(phy->attached_sas_addr, dr->attached_sas_addr, SAS_ADDR_SIZE);
246 	phy->attached_phy_id = dr->attached_phy_id;
247 	phy->phy_change_count = dr->change_count;
248 	phy->routing_attr = dr->routing_attr;
249 	phy->virtual = dr->virtual;
250 	phy->last_da_index = -1;
251 
252 	phy->phy->identify.sas_address = SAS_ADDR(phy->attached_sas_addr);
253 	phy->phy->identify.device_type = dr->attached_dev_type;
254 	phy->phy->identify.initiator_port_protocols = phy->attached_iproto;
255 	phy->phy->identify.target_port_protocols = phy->attached_tproto;
256 	if (!phy->attached_tproto && dr->attached_sata_dev)
257 		phy->phy->identify.target_port_protocols = SAS_PROTOCOL_SATA;
258 	phy->phy->identify.phy_identifier = phy_id;
259 	phy->phy->minimum_linkrate_hw = dr->hmin_linkrate;
260 	phy->phy->maximum_linkrate_hw = dr->hmax_linkrate;
261 	phy->phy->minimum_linkrate = dr->pmin_linkrate;
262 	phy->phy->maximum_linkrate = dr->pmax_linkrate;
263 	phy->phy->negotiated_linkrate = phy->linkrate;
264 	phy->phy->enabled = (phy->linkrate != SAS_PHY_DISABLED);
265 
266  skip:
267 	if (new_phy)
268 		if (sas_phy_add(phy->phy)) {
269 			sas_phy_free(phy->phy);
270 			return;
271 		}
272 
273  out:
274 	switch (phy->attached_dev_type) {
275 	case SAS_SATA_PENDING:
276 		type = "stp pending";
277 		break;
278 	case SAS_PHY_UNUSED:
279 		type = "no device";
280 		break;
281 	case SAS_END_DEVICE:
282 		if (phy->attached_iproto) {
283 			if (phy->attached_tproto)
284 				type = "host+target";
285 			else
286 				type = "host";
287 		} else {
288 			if (dr->attached_sata_dev)
289 				type = "stp";
290 			else
291 				type = "ssp";
292 		}
293 		break;
294 	case SAS_EDGE_EXPANDER_DEVICE:
295 	case SAS_FANOUT_EXPANDER_DEVICE:
296 		type = "smp";
297 		break;
298 	default:
299 		type = "unknown";
300 	}
301 
302 	/* this routine is polled by libata error recovery so filter
303 	 * unimportant messages
304 	 */
305 	if (new_phy || phy->attached_dev_type != dev_type ||
306 	    phy->linkrate != linkrate ||
307 	    SAS_ADDR(phy->attached_sas_addr) != SAS_ADDR(sas_addr))
308 		/* pass */;
309 	else
310 		return;
311 
312 	/* if the attached device type changed and ata_eh is active,
313 	 * make sure we run revalidation when eh completes (see:
314 	 * sas_enable_revalidation)
315 	 */
316 	if (test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state))
317 		set_bit(DISCE_REVALIDATE_DOMAIN, &dev->port->disc.pending);
318 
319 	pr_debug("%sex %016llx phy%02d:%c:%X attached: %016llx (%s)\n",
320 		 test_bit(SAS_HA_ATA_EH_ACTIVE, &ha->state) ? "ata: " : "",
321 		 SAS_ADDR(dev->sas_addr), phy->phy_id,
322 		 sas_route_char(dev, phy), phy->linkrate,
323 		 SAS_ADDR(phy->attached_sas_addr), type);
324 }
325 
326 /* check if we have an existing attached ata device on this expander phy */
sas_ex_to_ata(struct domain_device * ex_dev,int phy_id)327 struct domain_device *sas_ex_to_ata(struct domain_device *ex_dev, int phy_id)
328 {
329 	struct ex_phy *ex_phy = &ex_dev->ex_dev.ex_phy[phy_id];
330 	struct domain_device *dev;
331 	struct sas_rphy *rphy;
332 
333 	if (!ex_phy->port)
334 		return NULL;
335 
336 	rphy = ex_phy->port->rphy;
337 	if (!rphy)
338 		return NULL;
339 
340 	dev = sas_find_dev_by_rphy(rphy);
341 
342 	if (dev && dev_is_sata(dev))
343 		return dev;
344 
345 	return NULL;
346 }
347 
348 #define DISCOVER_REQ_SIZE  16
349 #define DISCOVER_RESP_SIZE sizeof(struct smp_disc_resp)
350 
sas_ex_phy_discover_helper(struct domain_device * dev,u8 * disc_req,struct smp_disc_resp * disc_resp,int single)351 static int sas_ex_phy_discover_helper(struct domain_device *dev, u8 *disc_req,
352 				      struct smp_disc_resp *disc_resp,
353 				      int single)
354 {
355 	struct discover_resp *dr = &disc_resp->disc;
356 	int res;
357 
358 	disc_req[9] = single;
359 
360 	res = smp_execute_task(dev, disc_req, DISCOVER_REQ_SIZE,
361 			       disc_resp, DISCOVER_RESP_SIZE);
362 	if (res)
363 		return res;
364 	if (memcmp(dev->sas_addr, dr->attached_sas_addr, SAS_ADDR_SIZE) == 0) {
365 		pr_notice("Found loopback topology, just ignore it!\n");
366 		return 0;
367 	}
368 	sas_set_ex_phy(dev, single, disc_resp);
369 	return 0;
370 }
371 
sas_ex_phy_discover(struct domain_device * dev,int single)372 int sas_ex_phy_discover(struct domain_device *dev, int single)
373 {
374 	struct expander_device *ex = &dev->ex_dev;
375 	int  res = 0;
376 	u8   *disc_req;
377 	struct smp_disc_resp *disc_resp;
378 
379 	disc_req = alloc_smp_req(DISCOVER_REQ_SIZE);
380 	if (!disc_req)
381 		return -ENOMEM;
382 
383 	disc_resp = alloc_smp_resp(DISCOVER_RESP_SIZE);
384 	if (!disc_resp) {
385 		kfree(disc_req);
386 		return -ENOMEM;
387 	}
388 
389 	disc_req[1] = SMP_DISCOVER;
390 
391 	if (0 <= single && single < ex->num_phys) {
392 		res = sas_ex_phy_discover_helper(dev, disc_req, disc_resp, single);
393 	} else {
394 		int i;
395 
396 		for (i = 0; i < ex->num_phys; i++) {
397 			res = sas_ex_phy_discover_helper(dev, disc_req,
398 							 disc_resp, i);
399 			if (res)
400 				goto out_err;
401 		}
402 	}
403 out_err:
404 	kfree(disc_resp);
405 	kfree(disc_req);
406 	return res;
407 }
408 
sas_expander_discover(struct domain_device * dev)409 static int sas_expander_discover(struct domain_device *dev)
410 {
411 	struct expander_device *ex = &dev->ex_dev;
412 	int res;
413 
414 	ex->ex_phy = kcalloc(ex->num_phys, sizeof(*ex->ex_phy), GFP_KERNEL);
415 	if (!ex->ex_phy)
416 		return -ENOMEM;
417 
418 	res = sas_ex_phy_discover(dev, -1);
419 	if (res)
420 		goto out_err;
421 
422 	return 0;
423  out_err:
424 	kfree(ex->ex_phy);
425 	ex->ex_phy = NULL;
426 	return res;
427 }
428 
429 #define MAX_EXPANDER_PHYS 128
430 
431 #define RG_REQ_SIZE   8
432 #define RG_RESP_SIZE  sizeof(struct smp_rg_resp)
433 
sas_ex_general(struct domain_device * dev)434 static int sas_ex_general(struct domain_device *dev)
435 {
436 	u8 *rg_req;
437 	struct smp_rg_resp *rg_resp;
438 	struct report_general_resp *rg;
439 	int res;
440 	int i;
441 
442 	rg_req = alloc_smp_req(RG_REQ_SIZE);
443 	if (!rg_req)
444 		return -ENOMEM;
445 
446 	rg_resp = alloc_smp_resp(RG_RESP_SIZE);
447 	if (!rg_resp) {
448 		kfree(rg_req);
449 		return -ENOMEM;
450 	}
451 
452 	rg_req[1] = SMP_REPORT_GENERAL;
453 
454 	for (i = 0; i < 5; i++) {
455 		res = smp_execute_task(dev, rg_req, RG_REQ_SIZE, rg_resp,
456 				       RG_RESP_SIZE);
457 
458 		if (res) {
459 			pr_notice("RG to ex %016llx failed:0x%x\n",
460 				  SAS_ADDR(dev->sas_addr), res);
461 			goto out;
462 		} else if (rg_resp->result != SMP_RESP_FUNC_ACC) {
463 			pr_debug("RG:ex %016llx returned SMP result:0x%x\n",
464 				 SAS_ADDR(dev->sas_addr), rg_resp->result);
465 			res = rg_resp->result;
466 			goto out;
467 		}
468 
469 		rg = &rg_resp->rg;
470 		dev->ex_dev.ex_change_count = be16_to_cpu(rg->change_count);
471 		dev->ex_dev.max_route_indexes = be16_to_cpu(rg->route_indexes);
472 		dev->ex_dev.num_phys = min(rg->num_phys, (u8)MAX_EXPANDER_PHYS);
473 		dev->ex_dev.t2t_supp = rg->t2t_supp;
474 		dev->ex_dev.conf_route_table = rg->conf_route_table;
475 		dev->ex_dev.configuring = rg->configuring;
476 		memcpy(dev->ex_dev.enclosure_logical_id,
477 		       rg->enclosure_logical_id, 8);
478 
479 		if (dev->ex_dev.configuring) {
480 			pr_debug("RG: ex %016llx self-configuring...\n",
481 				 SAS_ADDR(dev->sas_addr));
482 			schedule_timeout_interruptible(5*HZ);
483 		} else
484 			break;
485 	}
486 out:
487 	kfree(rg_req);
488 	kfree(rg_resp);
489 	return res;
490 }
491 
ex_assign_manuf_info(struct domain_device * dev,void * _mi_resp)492 static void ex_assign_manuf_info(struct domain_device *dev, void
493 					*_mi_resp)
494 {
495 	u8 *mi_resp = _mi_resp;
496 	struct sas_rphy *rphy = dev->rphy;
497 	struct sas_expander_device *edev = rphy_to_expander_device(rphy);
498 
499 	memcpy(edev->vendor_id, mi_resp + 12, SAS_EXPANDER_VENDOR_ID_LEN);
500 	memcpy(edev->product_id, mi_resp + 20, SAS_EXPANDER_PRODUCT_ID_LEN);
501 	memcpy(edev->product_rev, mi_resp + 36,
502 	       SAS_EXPANDER_PRODUCT_REV_LEN);
503 
504 	if (mi_resp[8] & 1) {
505 		memcpy(edev->component_vendor_id, mi_resp + 40,
506 		       SAS_EXPANDER_COMPONENT_VENDOR_ID_LEN);
507 		edev->component_id = mi_resp[48] << 8 | mi_resp[49];
508 		edev->component_revision_id = mi_resp[50];
509 	}
510 }
511 
512 #define MI_REQ_SIZE   8
513 #define MI_RESP_SIZE 64
514 
sas_ex_manuf_info(struct domain_device * dev)515 static int sas_ex_manuf_info(struct domain_device *dev)
516 {
517 	u8 *mi_req;
518 	u8 *mi_resp;
519 	int res;
520 
521 	mi_req = alloc_smp_req(MI_REQ_SIZE);
522 	if (!mi_req)
523 		return -ENOMEM;
524 
525 	mi_resp = alloc_smp_resp(MI_RESP_SIZE);
526 	if (!mi_resp) {
527 		kfree(mi_req);
528 		return -ENOMEM;
529 	}
530 
531 	mi_req[1] = SMP_REPORT_MANUF_INFO;
532 
533 	res = smp_execute_task(dev, mi_req, MI_REQ_SIZE, mi_resp, MI_RESP_SIZE);
534 	if (res) {
535 		pr_notice("MI: ex %016llx failed:0x%x\n",
536 			  SAS_ADDR(dev->sas_addr), res);
537 		goto out;
538 	} else if (mi_resp[2] != SMP_RESP_FUNC_ACC) {
539 		pr_debug("MI ex %016llx returned SMP result:0x%x\n",
540 			 SAS_ADDR(dev->sas_addr), mi_resp[2]);
541 		goto out;
542 	}
543 
544 	ex_assign_manuf_info(dev, mi_resp);
545 out:
546 	kfree(mi_req);
547 	kfree(mi_resp);
548 	return res;
549 }
550 
551 #define PC_REQ_SIZE  44
552 #define PC_RESP_SIZE 8
553 
sas_smp_phy_control(struct domain_device * dev,int phy_id,enum phy_func phy_func,struct sas_phy_linkrates * rates)554 int sas_smp_phy_control(struct domain_device *dev, int phy_id,
555 			enum phy_func phy_func,
556 			struct sas_phy_linkrates *rates)
557 {
558 	u8 *pc_req;
559 	u8 *pc_resp;
560 	int res;
561 
562 	pc_req = alloc_smp_req(PC_REQ_SIZE);
563 	if (!pc_req)
564 		return -ENOMEM;
565 
566 	pc_resp = alloc_smp_resp(PC_RESP_SIZE);
567 	if (!pc_resp) {
568 		kfree(pc_req);
569 		return -ENOMEM;
570 	}
571 
572 	pc_req[1] = SMP_PHY_CONTROL;
573 	pc_req[9] = phy_id;
574 	pc_req[10] = phy_func;
575 	if (rates) {
576 		pc_req[32] = rates->minimum_linkrate << 4;
577 		pc_req[33] = rates->maximum_linkrate << 4;
578 	}
579 
580 	res = smp_execute_task(dev, pc_req, PC_REQ_SIZE, pc_resp, PC_RESP_SIZE);
581 	if (res) {
582 		pr_err("ex %016llx phy%02d PHY control failed: %d\n",
583 		       SAS_ADDR(dev->sas_addr), phy_id, res);
584 	} else if (pc_resp[2] != SMP_RESP_FUNC_ACC) {
585 		pr_err("ex %016llx phy%02d PHY control failed: function result 0x%x\n",
586 		       SAS_ADDR(dev->sas_addr), phy_id, pc_resp[2]);
587 		res = pc_resp[2];
588 	}
589 	kfree(pc_resp);
590 	kfree(pc_req);
591 	return res;
592 }
593 
sas_ex_disable_phy(struct domain_device * dev,int phy_id)594 static void sas_ex_disable_phy(struct domain_device *dev, int phy_id)
595 {
596 	struct expander_device *ex = &dev->ex_dev;
597 	struct ex_phy *phy = &ex->ex_phy[phy_id];
598 
599 	sas_smp_phy_control(dev, phy_id, PHY_FUNC_DISABLE, NULL);
600 	phy->linkrate = SAS_PHY_DISABLED;
601 }
602 
sas_ex_disable_port(struct domain_device * dev,u8 * sas_addr)603 static void sas_ex_disable_port(struct domain_device *dev, u8 *sas_addr)
604 {
605 	struct expander_device *ex = &dev->ex_dev;
606 	int i;
607 
608 	for (i = 0; i < ex->num_phys; i++) {
609 		struct ex_phy *phy = &ex->ex_phy[i];
610 
611 		if (phy->phy_state == PHY_VACANT ||
612 		    phy->phy_state == PHY_NOT_PRESENT)
613 			continue;
614 
615 		if (SAS_ADDR(phy->attached_sas_addr) == SAS_ADDR(sas_addr))
616 			sas_ex_disable_phy(dev, i);
617 	}
618 }
619 
sas_dev_present_in_domain(struct asd_sas_port * port,u8 * sas_addr)620 static int sas_dev_present_in_domain(struct asd_sas_port *port,
621 					    u8 *sas_addr)
622 {
623 	struct domain_device *dev;
624 
625 	if (SAS_ADDR(port->sas_addr) == SAS_ADDR(sas_addr))
626 		return 1;
627 	list_for_each_entry(dev, &port->dev_list, dev_list_node) {
628 		if (SAS_ADDR(dev->sas_addr) == SAS_ADDR(sas_addr))
629 			return 1;
630 	}
631 	return 0;
632 }
633 
634 #define RPEL_REQ_SIZE	16
635 #define RPEL_RESP_SIZE	32
sas_smp_get_phy_events(struct sas_phy * phy)636 int sas_smp_get_phy_events(struct sas_phy *phy)
637 {
638 	int res;
639 	u8 *req;
640 	u8 *resp;
641 	struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent);
642 	struct domain_device *dev = sas_find_dev_by_rphy(rphy);
643 
644 	req = alloc_smp_req(RPEL_REQ_SIZE);
645 	if (!req)
646 		return -ENOMEM;
647 
648 	resp = alloc_smp_resp(RPEL_RESP_SIZE);
649 	if (!resp) {
650 		kfree(req);
651 		return -ENOMEM;
652 	}
653 
654 	req[1] = SMP_REPORT_PHY_ERR_LOG;
655 	req[9] = phy->number;
656 
657 	res = smp_execute_task(dev, req, RPEL_REQ_SIZE,
658 			       resp, RPEL_RESP_SIZE);
659 
660 	if (res)
661 		goto out;
662 
663 	phy->invalid_dword_count = get_unaligned_be32(&resp[12]);
664 	phy->running_disparity_error_count = get_unaligned_be32(&resp[16]);
665 	phy->loss_of_dword_sync_count = get_unaligned_be32(&resp[20]);
666 	phy->phy_reset_problem_count = get_unaligned_be32(&resp[24]);
667 
668  out:
669 	kfree(req);
670 	kfree(resp);
671 	return res;
672 
673 }
674 
675 #ifdef CONFIG_SCSI_SAS_ATA
676 
677 #define RPS_REQ_SIZE  16
678 #define RPS_RESP_SIZE sizeof(struct smp_rps_resp)
679 
sas_get_report_phy_sata(struct domain_device * dev,int phy_id,struct smp_rps_resp * rps_resp)680 int sas_get_report_phy_sata(struct domain_device *dev, int phy_id,
681 			    struct smp_rps_resp *rps_resp)
682 {
683 	int res;
684 	u8 *rps_req = alloc_smp_req(RPS_REQ_SIZE);
685 	u8 *resp = (u8 *)rps_resp;
686 
687 	if (!rps_req)
688 		return -ENOMEM;
689 
690 	rps_req[1] = SMP_REPORT_PHY_SATA;
691 	rps_req[9] = phy_id;
692 
693 	res = smp_execute_task(dev, rps_req, RPS_REQ_SIZE,
694 			       rps_resp, RPS_RESP_SIZE);
695 
696 	/* 0x34 is the FIS type for the D2H fis.  There's a potential
697 	 * standards cockup here.  sas-2 explicitly specifies the FIS
698 	 * should be encoded so that FIS type is in resp[24].
699 	 * However, some expanders endian reverse this.  Undo the
700 	 * reversal here */
701 	if (!res && resp[27] == 0x34 && resp[24] != 0x34) {
702 		int i;
703 
704 		for (i = 0; i < 5; i++) {
705 			int j = 24 + (i*4);
706 			u8 a, b;
707 			a = resp[j + 0];
708 			b = resp[j + 1];
709 			resp[j + 0] = resp[j + 3];
710 			resp[j + 1] = resp[j + 2];
711 			resp[j + 2] = b;
712 			resp[j + 3] = a;
713 		}
714 	}
715 
716 	kfree(rps_req);
717 	return res;
718 }
719 #endif
720 
sas_ex_get_linkrate(struct domain_device * parent,struct domain_device * child,struct ex_phy * parent_phy)721 static void sas_ex_get_linkrate(struct domain_device *parent,
722 				       struct domain_device *child,
723 				       struct ex_phy *parent_phy)
724 {
725 	struct expander_device *parent_ex = &parent->ex_dev;
726 	struct sas_port *port;
727 	int i;
728 
729 	child->pathways = 0;
730 
731 	port = parent_phy->port;
732 
733 	for (i = 0; i < parent_ex->num_phys; i++) {
734 		struct ex_phy *phy = &parent_ex->ex_phy[i];
735 
736 		if (phy->phy_state == PHY_VACANT ||
737 		    phy->phy_state == PHY_NOT_PRESENT)
738 			continue;
739 
740 		if (sas_phy_match_dev_addr(child, phy)) {
741 			child->min_linkrate = min(parent->min_linkrate,
742 						  phy->linkrate);
743 			child->max_linkrate = max(parent->max_linkrate,
744 						  phy->linkrate);
745 			child->pathways++;
746 			sas_port_add_phy(port, phy->phy);
747 		}
748 	}
749 	child->linkrate = min(parent_phy->linkrate, child->max_linkrate);
750 	child->pathways = min(child->pathways, parent->pathways);
751 }
752 
sas_ex_add_dev(struct domain_device * parent,struct ex_phy * phy,struct domain_device * child,int phy_id)753 static int sas_ex_add_dev(struct domain_device *parent, struct ex_phy *phy,
754 			  struct domain_device *child, int phy_id)
755 {
756 	struct sas_rphy *rphy;
757 	int res;
758 
759 	child->dev_type = SAS_END_DEVICE;
760 	rphy = sas_end_device_alloc(phy->port);
761 	if (!rphy)
762 		return -ENOMEM;
763 
764 	child->tproto = phy->attached_tproto;
765 	sas_init_dev(child);
766 
767 	child->rphy = rphy;
768 	get_device(&rphy->dev);
769 	rphy->identify.phy_identifier = phy_id;
770 	sas_fill_in_rphy(child, rphy);
771 
772 	list_add_tail(&child->disco_list_node, &parent->port->disco_list);
773 
774 	res = sas_notify_lldd_dev_found(child);
775 	if (res) {
776 		pr_notice("notify lldd for device %016llx at %016llx:%02d returned 0x%x\n",
777 			  SAS_ADDR(child->sas_addr),
778 			  SAS_ADDR(parent->sas_addr), phy_id, res);
779 		sas_rphy_free(child->rphy);
780 		list_del(&child->disco_list_node);
781 		return res;
782 	}
783 
784 	return 0;
785 }
786 
sas_ex_discover_end_dev(struct domain_device * parent,int phy_id)787 static struct domain_device *sas_ex_discover_end_dev(
788 	struct domain_device *parent, int phy_id)
789 {
790 	struct expander_device *parent_ex = &parent->ex_dev;
791 	struct ex_phy *phy = &parent_ex->ex_phy[phy_id];
792 	struct domain_device *child = NULL;
793 	int res;
794 
795 	if (phy->attached_sata_host || phy->attached_sata_ps)
796 		return NULL;
797 
798 	child = sas_alloc_device();
799 	if (!child)
800 		return NULL;
801 
802 	kref_get(&parent->kref);
803 	child->parent = parent;
804 	child->port   = parent->port;
805 	child->iproto = phy->attached_iproto;
806 	memcpy(child->sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
807 	sas_hash_addr(child->hashed_sas_addr, child->sas_addr);
808 	if (!phy->port) {
809 		phy->port = sas_port_alloc(&parent->rphy->dev, phy_id);
810 		if (unlikely(!phy->port))
811 			goto out_err;
812 		if (unlikely(sas_port_add(phy->port) != 0)) {
813 			sas_port_free(phy->port);
814 			goto out_err;
815 		}
816 	}
817 	sas_ex_get_linkrate(parent, child, phy);
818 	sas_device_set_phy(child, phy->port);
819 
820 	if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) {
821 		res = sas_ata_add_dev(parent, phy, child, phy_id);
822 	} else if (phy->attached_tproto & SAS_PROTOCOL_SSP) {
823 		res = sas_ex_add_dev(parent, phy, child, phy_id);
824 	} else {
825 		pr_notice("target proto 0x%x at %016llx:0x%x not handled\n",
826 			  phy->attached_tproto, SAS_ADDR(parent->sas_addr),
827 			  phy_id);
828 		res = -ENODEV;
829 	}
830 
831 	if (res)
832 		goto out_free;
833 
834 	list_add_tail(&child->siblings, &parent_ex->children);
835 	return child;
836 
837  out_free:
838 	sas_port_delete(phy->port);
839  out_err:
840 	phy->port = NULL;
841 	sas_put_device(child);
842 	return NULL;
843 }
844 
845 /* See if this phy is part of a wide port */
sas_ex_join_wide_port(struct domain_device * parent,int phy_id)846 static bool sas_ex_join_wide_port(struct domain_device *parent, int phy_id)
847 {
848 	struct ex_phy *phy = &parent->ex_dev.ex_phy[phy_id];
849 	int i;
850 
851 	for (i = 0; i < parent->ex_dev.num_phys; i++) {
852 		struct ex_phy *ephy = &parent->ex_dev.ex_phy[i];
853 
854 		if (ephy == phy)
855 			continue;
856 
857 		if (!memcmp(phy->attached_sas_addr, ephy->attached_sas_addr,
858 			    SAS_ADDR_SIZE) && ephy->port) {
859 			sas_port_add_phy(ephy->port, phy->phy);
860 			phy->port = ephy->port;
861 			phy->phy_state = PHY_DEVICE_DISCOVERED;
862 			return true;
863 		}
864 	}
865 
866 	return false;
867 }
868 
sas_ex_discover_expander(struct domain_device * parent,int phy_id)869 static struct domain_device *sas_ex_discover_expander(
870 	struct domain_device *parent, int phy_id)
871 {
872 	struct sas_expander_device *parent_ex = rphy_to_expander_device(parent->rphy);
873 	struct ex_phy *phy = &parent->ex_dev.ex_phy[phy_id];
874 	struct domain_device *child = NULL;
875 	struct sas_rphy *rphy;
876 	struct sas_expander_device *edev;
877 	struct asd_sas_port *port;
878 	int res;
879 
880 	if (phy->routing_attr == DIRECT_ROUTING) {
881 		pr_warn("ex %016llx:%02d:D <--> ex %016llx:0x%x is not allowed\n",
882 			SAS_ADDR(parent->sas_addr), phy_id,
883 			SAS_ADDR(phy->attached_sas_addr),
884 			phy->attached_phy_id);
885 		return NULL;
886 	}
887 	child = sas_alloc_device();
888 	if (!child)
889 		return NULL;
890 
891 	phy->port = sas_port_alloc(&parent->rphy->dev, phy_id);
892 	/* FIXME: better error handling */
893 	BUG_ON(sas_port_add(phy->port) != 0);
894 
895 
896 	switch (phy->attached_dev_type) {
897 	case SAS_EDGE_EXPANDER_DEVICE:
898 		rphy = sas_expander_alloc(phy->port,
899 					  SAS_EDGE_EXPANDER_DEVICE);
900 		break;
901 	case SAS_FANOUT_EXPANDER_DEVICE:
902 		rphy = sas_expander_alloc(phy->port,
903 					  SAS_FANOUT_EXPANDER_DEVICE);
904 		break;
905 	default:
906 		rphy = NULL;	/* shut gcc up */
907 		BUG();
908 	}
909 	port = parent->port;
910 	child->rphy = rphy;
911 	get_device(&rphy->dev);
912 	edev = rphy_to_expander_device(rphy);
913 	child->dev_type = phy->attached_dev_type;
914 	kref_get(&parent->kref);
915 	child->parent = parent;
916 	child->port = port;
917 	child->iproto = phy->attached_iproto;
918 	child->tproto = phy->attached_tproto;
919 	memcpy(child->sas_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
920 	sas_hash_addr(child->hashed_sas_addr, child->sas_addr);
921 	sas_ex_get_linkrate(parent, child, phy);
922 	edev->level = parent_ex->level + 1;
923 	parent->port->disc.max_level = max(parent->port->disc.max_level,
924 					   edev->level);
925 	sas_init_dev(child);
926 	sas_fill_in_rphy(child, rphy);
927 	sas_rphy_add(rphy);
928 
929 	spin_lock_irq(&parent->port->dev_list_lock);
930 	list_add_tail(&child->dev_list_node, &parent->port->dev_list);
931 	spin_unlock_irq(&parent->port->dev_list_lock);
932 
933 	res = sas_discover_expander(child);
934 	if (res) {
935 		sas_rphy_delete(rphy);
936 		spin_lock_irq(&parent->port->dev_list_lock);
937 		list_del(&child->dev_list_node);
938 		spin_unlock_irq(&parent->port->dev_list_lock);
939 		sas_put_device(child);
940 		sas_port_delete(phy->port);
941 		phy->port = NULL;
942 		return NULL;
943 	}
944 	list_add_tail(&child->siblings, &parent->ex_dev.children);
945 	return child;
946 }
947 
sas_ex_discover_dev(struct domain_device * dev,int phy_id)948 static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
949 {
950 	struct expander_device *ex = &dev->ex_dev;
951 	struct ex_phy *ex_phy = &ex->ex_phy[phy_id];
952 	struct domain_device *child = NULL;
953 	int res = 0;
954 
955 	/* Phy state */
956 	if (ex_phy->linkrate == SAS_SATA_SPINUP_HOLD) {
957 		if (!sas_smp_phy_control(dev, phy_id, PHY_FUNC_LINK_RESET, NULL))
958 			res = sas_ex_phy_discover(dev, phy_id);
959 		if (res)
960 			return res;
961 	}
962 
963 	/* Parent and domain coherency */
964 	if (!dev->parent && sas_phy_match_port_addr(dev->port, ex_phy)) {
965 		sas_add_parent_port(dev, phy_id);
966 		return 0;
967 	}
968 	if (dev->parent && sas_phy_match_dev_addr(dev->parent, ex_phy)) {
969 		sas_add_parent_port(dev, phy_id);
970 		if (ex_phy->routing_attr == TABLE_ROUTING)
971 			sas_configure_phy(dev, phy_id, dev->port->sas_addr, 1);
972 		return 0;
973 	}
974 
975 	if (sas_dev_present_in_domain(dev->port, ex_phy->attached_sas_addr))
976 		sas_ex_disable_port(dev, ex_phy->attached_sas_addr);
977 
978 	if (ex_phy->attached_dev_type == SAS_PHY_UNUSED) {
979 		if (ex_phy->routing_attr == DIRECT_ROUTING) {
980 			memset(ex_phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
981 			sas_configure_routing(dev, ex_phy->attached_sas_addr);
982 		}
983 		return 0;
984 	} else if (ex_phy->linkrate == SAS_LINK_RATE_UNKNOWN)
985 		return 0;
986 
987 	if (ex_phy->attached_dev_type != SAS_END_DEVICE &&
988 	    ex_phy->attached_dev_type != SAS_FANOUT_EXPANDER_DEVICE &&
989 	    ex_phy->attached_dev_type != SAS_EDGE_EXPANDER_DEVICE &&
990 	    ex_phy->attached_dev_type != SAS_SATA_PENDING) {
991 		pr_warn("unknown device type(0x%x) attached to ex %016llx phy%02d\n",
992 			ex_phy->attached_dev_type,
993 			SAS_ADDR(dev->sas_addr),
994 			phy_id);
995 		return 0;
996 	}
997 
998 	res = sas_configure_routing(dev, ex_phy->attached_sas_addr);
999 	if (res) {
1000 		pr_notice("configure routing for dev %016llx reported 0x%x. Forgotten\n",
1001 			  SAS_ADDR(ex_phy->attached_sas_addr), res);
1002 		sas_disable_routing(dev, ex_phy->attached_sas_addr);
1003 		return res;
1004 	}
1005 
1006 	if (sas_ex_join_wide_port(dev, phy_id)) {
1007 		pr_debug("Attaching ex phy%02d to wide port %016llx\n",
1008 			 phy_id, SAS_ADDR(ex_phy->attached_sas_addr));
1009 		return res;
1010 	}
1011 
1012 	switch (ex_phy->attached_dev_type) {
1013 	case SAS_END_DEVICE:
1014 	case SAS_SATA_PENDING:
1015 		child = sas_ex_discover_end_dev(dev, phy_id);
1016 		break;
1017 	case SAS_FANOUT_EXPANDER_DEVICE:
1018 		if (SAS_ADDR(dev->port->disc.fanout_sas_addr)) {
1019 			pr_debug("second fanout expander %016llx phy%02d attached to ex %016llx phy%02d\n",
1020 				 SAS_ADDR(ex_phy->attached_sas_addr),
1021 				 ex_phy->attached_phy_id,
1022 				 SAS_ADDR(dev->sas_addr),
1023 				 phy_id);
1024 			sas_ex_disable_phy(dev, phy_id);
1025 			return res;
1026 		} else
1027 			memcpy(dev->port->disc.fanout_sas_addr,
1028 			       ex_phy->attached_sas_addr, SAS_ADDR_SIZE);
1029 		fallthrough;
1030 	case SAS_EDGE_EXPANDER_DEVICE:
1031 		child = sas_ex_discover_expander(dev, phy_id);
1032 		break;
1033 	default:
1034 		break;
1035 	}
1036 
1037 	if (!child)
1038 		pr_notice("ex %016llx phy%02d failed to discover\n",
1039 			  SAS_ADDR(dev->sas_addr), phy_id);
1040 	return res;
1041 }
1042 
sas_find_sub_addr(struct domain_device * dev,u8 * sub_addr)1043 static int sas_find_sub_addr(struct domain_device *dev, u8 *sub_addr)
1044 {
1045 	struct expander_device *ex = &dev->ex_dev;
1046 	int i;
1047 
1048 	for (i = 0; i < ex->num_phys; i++) {
1049 		struct ex_phy *phy = &ex->ex_phy[i];
1050 
1051 		if (phy->phy_state == PHY_VACANT ||
1052 		    phy->phy_state == PHY_NOT_PRESENT)
1053 			continue;
1054 
1055 		if (dev_is_expander(phy->attached_dev_type) &&
1056 		    phy->routing_attr == SUBTRACTIVE_ROUTING) {
1057 
1058 			memcpy(sub_addr, phy->attached_sas_addr, SAS_ADDR_SIZE);
1059 
1060 			return 1;
1061 		}
1062 	}
1063 	return 0;
1064 }
1065 
sas_check_level_subtractive_boundary(struct domain_device * dev)1066 static int sas_check_level_subtractive_boundary(struct domain_device *dev)
1067 {
1068 	struct expander_device *ex = &dev->ex_dev;
1069 	struct domain_device *child;
1070 	u8 sub_addr[SAS_ADDR_SIZE] = {0, };
1071 
1072 	list_for_each_entry(child, &ex->children, siblings) {
1073 		if (!dev_is_expander(child->dev_type))
1074 			continue;
1075 		if (sub_addr[0] == 0) {
1076 			sas_find_sub_addr(child, sub_addr);
1077 			continue;
1078 		} else {
1079 			u8 s2[SAS_ADDR_SIZE];
1080 
1081 			if (sas_find_sub_addr(child, s2) &&
1082 			    (SAS_ADDR(sub_addr) != SAS_ADDR(s2))) {
1083 
1084 				pr_notice("ex %016llx->%016llx-?->%016llx diverges from subtractive boundary %016llx\n",
1085 					  SAS_ADDR(dev->sas_addr),
1086 					  SAS_ADDR(child->sas_addr),
1087 					  SAS_ADDR(s2),
1088 					  SAS_ADDR(sub_addr));
1089 
1090 				sas_ex_disable_port(child, s2);
1091 			}
1092 		}
1093 	}
1094 	return 0;
1095 }
1096 /**
1097  * sas_ex_discover_devices - discover devices attached to this expander
1098  * @dev: pointer to the expander domain device
1099  * @single: if you want to do a single phy, else set to -1;
1100  *
1101  * Configure this expander for use with its devices and register the
1102  * devices of this expander.
1103  */
sas_ex_discover_devices(struct domain_device * dev,int single)1104 static int sas_ex_discover_devices(struct domain_device *dev, int single)
1105 {
1106 	struct expander_device *ex = &dev->ex_dev;
1107 	int i = 0, end = ex->num_phys;
1108 	int res = 0;
1109 
1110 	if (0 <= single && single < end) {
1111 		i = single;
1112 		end = i+1;
1113 	}
1114 
1115 	for ( ; i < end; i++) {
1116 		struct ex_phy *ex_phy = &ex->ex_phy[i];
1117 
1118 		if (ex_phy->phy_state == PHY_VACANT ||
1119 		    ex_phy->phy_state == PHY_NOT_PRESENT ||
1120 		    ex_phy->phy_state == PHY_DEVICE_DISCOVERED)
1121 			continue;
1122 
1123 		switch (ex_phy->linkrate) {
1124 		case SAS_PHY_DISABLED:
1125 		case SAS_PHY_RESET_PROBLEM:
1126 		case SAS_SATA_PORT_SELECTOR:
1127 			continue;
1128 		default:
1129 			res = sas_ex_discover_dev(dev, i);
1130 			if (res)
1131 				break;
1132 			continue;
1133 		}
1134 	}
1135 
1136 	if (!res)
1137 		sas_check_level_subtractive_boundary(dev);
1138 
1139 	return res;
1140 }
1141 
sas_check_ex_subtractive_boundary(struct domain_device * dev)1142 static int sas_check_ex_subtractive_boundary(struct domain_device *dev)
1143 {
1144 	struct expander_device *ex = &dev->ex_dev;
1145 	int i;
1146 	u8  *sub_sas_addr = NULL;
1147 
1148 	if (dev->dev_type != SAS_EDGE_EXPANDER_DEVICE)
1149 		return 0;
1150 
1151 	for (i = 0; i < ex->num_phys; i++) {
1152 		struct ex_phy *phy = &ex->ex_phy[i];
1153 
1154 		if (phy->phy_state == PHY_VACANT ||
1155 		    phy->phy_state == PHY_NOT_PRESENT)
1156 			continue;
1157 
1158 		if (dev_is_expander(phy->attached_dev_type) &&
1159 		    phy->routing_attr == SUBTRACTIVE_ROUTING) {
1160 
1161 			if (!sub_sas_addr)
1162 				sub_sas_addr = &phy->attached_sas_addr[0];
1163 			else if (SAS_ADDR(sub_sas_addr) !=
1164 				 SAS_ADDR(phy->attached_sas_addr)) {
1165 
1166 				pr_notice("ex %016llx phy%02d diverges(%016llx) on subtractive boundary(%016llx). Disabled\n",
1167 					  SAS_ADDR(dev->sas_addr), i,
1168 					  SAS_ADDR(phy->attached_sas_addr),
1169 					  SAS_ADDR(sub_sas_addr));
1170 				sas_ex_disable_phy(dev, i);
1171 			}
1172 		}
1173 	}
1174 	return 0;
1175 }
1176 
sas_print_parent_topology_bug(struct domain_device * child,struct ex_phy * parent_phy,struct ex_phy * child_phy)1177 static void sas_print_parent_topology_bug(struct domain_device *child,
1178 						 struct ex_phy *parent_phy,
1179 						 struct ex_phy *child_phy)
1180 {
1181 	static const char *ex_type[] = {
1182 		[SAS_EDGE_EXPANDER_DEVICE] = "edge",
1183 		[SAS_FANOUT_EXPANDER_DEVICE] = "fanout",
1184 	};
1185 	struct domain_device *parent = child->parent;
1186 
1187 	pr_notice("%s ex %016llx phy%02d <--> %s ex %016llx phy%02d has %c:%c routing link!\n",
1188 		  ex_type[parent->dev_type],
1189 		  SAS_ADDR(parent->sas_addr),
1190 		  parent_phy->phy_id,
1191 
1192 		  ex_type[child->dev_type],
1193 		  SAS_ADDR(child->sas_addr),
1194 		  child_phy->phy_id,
1195 
1196 		  sas_route_char(parent, parent_phy),
1197 		  sas_route_char(child, child_phy));
1198 }
1199 
sas_eeds_valid(struct domain_device * parent,struct domain_device * child)1200 static bool sas_eeds_valid(struct domain_device *parent,
1201 			   struct domain_device *child)
1202 {
1203 	struct sas_discovery *disc = &parent->port->disc;
1204 
1205 	return (SAS_ADDR(disc->eeds_a) == SAS_ADDR(parent->sas_addr) ||
1206 		SAS_ADDR(disc->eeds_a) == SAS_ADDR(child->sas_addr)) &&
1207 	       (SAS_ADDR(disc->eeds_b) == SAS_ADDR(parent->sas_addr) ||
1208 		SAS_ADDR(disc->eeds_b) == SAS_ADDR(child->sas_addr));
1209 }
1210 
sas_check_eeds(struct domain_device * child,struct ex_phy * parent_phy,struct ex_phy * child_phy)1211 static int sas_check_eeds(struct domain_device *child,
1212 			  struct ex_phy *parent_phy,
1213 			  struct ex_phy *child_phy)
1214 {
1215 	int res = 0;
1216 	struct domain_device *parent = child->parent;
1217 	struct sas_discovery *disc = &parent->port->disc;
1218 
1219 	if (SAS_ADDR(disc->fanout_sas_addr) != 0) {
1220 		res = -ENODEV;
1221 		pr_warn("edge ex %016llx phy S:%02d <--> edge ex %016llx phy S:%02d, while there is a fanout ex %016llx\n",
1222 			SAS_ADDR(parent->sas_addr),
1223 			parent_phy->phy_id,
1224 			SAS_ADDR(child->sas_addr),
1225 			child_phy->phy_id,
1226 			SAS_ADDR(disc->fanout_sas_addr));
1227 	} else if (SAS_ADDR(disc->eeds_a) == 0) {
1228 		memcpy(disc->eeds_a, parent->sas_addr, SAS_ADDR_SIZE);
1229 		memcpy(disc->eeds_b, child->sas_addr, SAS_ADDR_SIZE);
1230 	} else if (!sas_eeds_valid(parent, child)) {
1231 		res = -ENODEV;
1232 		pr_warn("edge ex %016llx phy%02d <--> edge ex %016llx phy%02d link forms a third EEDS!\n",
1233 			SAS_ADDR(parent->sas_addr),
1234 			parent_phy->phy_id,
1235 			SAS_ADDR(child->sas_addr),
1236 			child_phy->phy_id);
1237 	}
1238 
1239 	return res;
1240 }
1241 
sas_check_edge_expander_topo(struct domain_device * child,struct ex_phy * parent_phy)1242 static int sas_check_edge_expander_topo(struct domain_device *child,
1243 					struct ex_phy *parent_phy)
1244 {
1245 	struct expander_device *child_ex = &child->ex_dev;
1246 	struct expander_device *parent_ex = &child->parent->ex_dev;
1247 	struct ex_phy *child_phy;
1248 
1249 	child_phy = &child_ex->ex_phy[parent_phy->attached_phy_id];
1250 
1251 	if (child->dev_type == SAS_FANOUT_EXPANDER_DEVICE) {
1252 		if (parent_phy->routing_attr != SUBTRACTIVE_ROUTING ||
1253 		    child_phy->routing_attr != TABLE_ROUTING)
1254 			goto error;
1255 	} else if (parent_phy->routing_attr == SUBTRACTIVE_ROUTING) {
1256 		if (child_phy->routing_attr == SUBTRACTIVE_ROUTING)
1257 			return sas_check_eeds(child, parent_phy, child_phy);
1258 		else if (child_phy->routing_attr != TABLE_ROUTING)
1259 			goto error;
1260 	} else if (parent_phy->routing_attr == TABLE_ROUTING) {
1261 		if (child_phy->routing_attr != SUBTRACTIVE_ROUTING &&
1262 		    (child_phy->routing_attr != TABLE_ROUTING ||
1263 		     !child_ex->t2t_supp || !parent_ex->t2t_supp))
1264 			goto error;
1265 	}
1266 
1267 	return 0;
1268 error:
1269 	sas_print_parent_topology_bug(child, parent_phy, child_phy);
1270 	return -ENODEV;
1271 }
1272 
sas_check_fanout_expander_topo(struct domain_device * child,struct ex_phy * parent_phy)1273 static int sas_check_fanout_expander_topo(struct domain_device *child,
1274 					  struct ex_phy *parent_phy)
1275 {
1276 	struct expander_device *child_ex = &child->ex_dev;
1277 	struct ex_phy *child_phy;
1278 
1279 	child_phy = &child_ex->ex_phy[parent_phy->attached_phy_id];
1280 
1281 	if (parent_phy->routing_attr == TABLE_ROUTING &&
1282 	    child_phy->routing_attr == SUBTRACTIVE_ROUTING)
1283 		return 0;
1284 
1285 	sas_print_parent_topology_bug(child, parent_phy, child_phy);
1286 
1287 	return -ENODEV;
1288 }
1289 
sas_check_parent_topology(struct domain_device * child)1290 static int sas_check_parent_topology(struct domain_device *child)
1291 {
1292 	struct expander_device *parent_ex;
1293 	int i;
1294 	int res = 0;
1295 
1296 	if (!child->parent)
1297 		return 0;
1298 
1299 	if (!dev_is_expander(child->parent->dev_type))
1300 		return 0;
1301 
1302 	parent_ex = &child->parent->ex_dev;
1303 
1304 	for (i = 0; i < parent_ex->num_phys; i++) {
1305 		struct ex_phy *parent_phy = &parent_ex->ex_phy[i];
1306 
1307 		if (parent_phy->phy_state == PHY_VACANT ||
1308 		    parent_phy->phy_state == PHY_NOT_PRESENT)
1309 			continue;
1310 
1311 		if (!sas_phy_match_dev_addr(child, parent_phy))
1312 			continue;
1313 
1314 		switch (child->parent->dev_type) {
1315 		case SAS_EDGE_EXPANDER_DEVICE:
1316 			if (sas_check_edge_expander_topo(child, parent_phy))
1317 				res = -ENODEV;
1318 			break;
1319 		case SAS_FANOUT_EXPANDER_DEVICE:
1320 			if (sas_check_fanout_expander_topo(child, parent_phy))
1321 				res = -ENODEV;
1322 			break;
1323 		default:
1324 			break;
1325 		}
1326 	}
1327 
1328 	return res;
1329 }
1330 
1331 #define RRI_REQ_SIZE  16
1332 #define RRI_RESP_SIZE 44
1333 
sas_configure_present(struct domain_device * dev,int phy_id,u8 * sas_addr,int * index,int * present)1334 static int sas_configure_present(struct domain_device *dev, int phy_id,
1335 				 u8 *sas_addr, int *index, int *present)
1336 {
1337 	int i, res = 0;
1338 	struct expander_device *ex = &dev->ex_dev;
1339 	struct ex_phy *phy = &ex->ex_phy[phy_id];
1340 	u8 *rri_req;
1341 	u8 *rri_resp;
1342 
1343 	*present = 0;
1344 	*index = 0;
1345 
1346 	rri_req = alloc_smp_req(RRI_REQ_SIZE);
1347 	if (!rri_req)
1348 		return -ENOMEM;
1349 
1350 	rri_resp = alloc_smp_resp(RRI_RESP_SIZE);
1351 	if (!rri_resp) {
1352 		kfree(rri_req);
1353 		return -ENOMEM;
1354 	}
1355 
1356 	rri_req[1] = SMP_REPORT_ROUTE_INFO;
1357 	rri_req[9] = phy_id;
1358 
1359 	for (i = 0; i < ex->max_route_indexes ; i++) {
1360 		*(__be16 *)(rri_req+6) = cpu_to_be16(i);
1361 		res = smp_execute_task(dev, rri_req, RRI_REQ_SIZE, rri_resp,
1362 				       RRI_RESP_SIZE);
1363 		if (res)
1364 			goto out;
1365 		res = rri_resp[2];
1366 		if (res == SMP_RESP_NO_INDEX) {
1367 			pr_warn("overflow of indexes: dev %016llx phy%02d index 0x%x\n",
1368 				SAS_ADDR(dev->sas_addr), phy_id, i);
1369 			goto out;
1370 		} else if (res != SMP_RESP_FUNC_ACC) {
1371 			pr_notice("%s: dev %016llx phy%02d index 0x%x result 0x%x\n",
1372 				  __func__, SAS_ADDR(dev->sas_addr), phy_id,
1373 				  i, res);
1374 			goto out;
1375 		}
1376 		if (SAS_ADDR(sas_addr) != 0) {
1377 			if (SAS_ADDR(rri_resp+16) == SAS_ADDR(sas_addr)) {
1378 				*index = i;
1379 				if ((rri_resp[12] & 0x80) == 0x80)
1380 					*present = 0;
1381 				else
1382 					*present = 1;
1383 				goto out;
1384 			} else if (SAS_ADDR(rri_resp+16) == 0) {
1385 				*index = i;
1386 				*present = 0;
1387 				goto out;
1388 			}
1389 		} else if (SAS_ADDR(rri_resp+16) == 0 &&
1390 			   phy->last_da_index < i) {
1391 			phy->last_da_index = i;
1392 			*index = i;
1393 			*present = 0;
1394 			goto out;
1395 		}
1396 	}
1397 	res = -1;
1398 out:
1399 	kfree(rri_req);
1400 	kfree(rri_resp);
1401 	return res;
1402 }
1403 
1404 #define CRI_REQ_SIZE  44
1405 #define CRI_RESP_SIZE  8
1406 
sas_configure_set(struct domain_device * dev,int phy_id,u8 * sas_addr,int index,int include)1407 static int sas_configure_set(struct domain_device *dev, int phy_id,
1408 			     u8 *sas_addr, int index, int include)
1409 {
1410 	int res;
1411 	u8 *cri_req;
1412 	u8 *cri_resp;
1413 
1414 	cri_req = alloc_smp_req(CRI_REQ_SIZE);
1415 	if (!cri_req)
1416 		return -ENOMEM;
1417 
1418 	cri_resp = alloc_smp_resp(CRI_RESP_SIZE);
1419 	if (!cri_resp) {
1420 		kfree(cri_req);
1421 		return -ENOMEM;
1422 	}
1423 
1424 	cri_req[1] = SMP_CONF_ROUTE_INFO;
1425 	*(__be16 *)(cri_req+6) = cpu_to_be16(index);
1426 	cri_req[9] = phy_id;
1427 	if (SAS_ADDR(sas_addr) == 0 || !include)
1428 		cri_req[12] |= 0x80;
1429 	memcpy(cri_req+16, sas_addr, SAS_ADDR_SIZE);
1430 
1431 	res = smp_execute_task(dev, cri_req, CRI_REQ_SIZE, cri_resp,
1432 			       CRI_RESP_SIZE);
1433 	if (res)
1434 		goto out;
1435 	res = cri_resp[2];
1436 	if (res == SMP_RESP_NO_INDEX) {
1437 		pr_warn("overflow of indexes: dev %016llx phy%02d index 0x%x\n",
1438 			SAS_ADDR(dev->sas_addr), phy_id, index);
1439 	}
1440 out:
1441 	kfree(cri_req);
1442 	kfree(cri_resp);
1443 	return res;
1444 }
1445 
sas_configure_phy(struct domain_device * dev,int phy_id,u8 * sas_addr,int include)1446 static int sas_configure_phy(struct domain_device *dev, int phy_id,
1447 				    u8 *sas_addr, int include)
1448 {
1449 	int index;
1450 	int present;
1451 	int res;
1452 
1453 	res = sas_configure_present(dev, phy_id, sas_addr, &index, &present);
1454 	if (res)
1455 		return res;
1456 	if (include ^ present)
1457 		return sas_configure_set(dev, phy_id, sas_addr, index,
1458 					 include);
1459 
1460 	return res;
1461 }
1462 
1463 /**
1464  * sas_configure_parent - configure routing table of parent
1465  * @parent: parent expander
1466  * @child: child expander
1467  * @sas_addr: SAS port identifier of device directly attached to child
1468  * @include: whether or not to include @child in the expander routing table
1469  */
sas_configure_parent(struct domain_device * parent,struct domain_device * child,u8 * sas_addr,int include)1470 static int sas_configure_parent(struct domain_device *parent,
1471 				struct domain_device *child,
1472 				u8 *sas_addr, int include)
1473 {
1474 	struct expander_device *ex_parent = &parent->ex_dev;
1475 	int res = 0;
1476 	int i;
1477 
1478 	if (parent->parent) {
1479 		res = sas_configure_parent(parent->parent, parent, sas_addr,
1480 					   include);
1481 		if (res)
1482 			return res;
1483 	}
1484 
1485 	if (ex_parent->conf_route_table == 0) {
1486 		pr_debug("ex %016llx has self-configuring routing table\n",
1487 			 SAS_ADDR(parent->sas_addr));
1488 		return 0;
1489 	}
1490 
1491 	for (i = 0; i < ex_parent->num_phys; i++) {
1492 		struct ex_phy *phy = &ex_parent->ex_phy[i];
1493 
1494 		if ((phy->routing_attr == TABLE_ROUTING) &&
1495 		    sas_phy_match_dev_addr(child, phy)) {
1496 			res = sas_configure_phy(parent, i, sas_addr, include);
1497 			if (res)
1498 				return res;
1499 		}
1500 	}
1501 
1502 	return res;
1503 }
1504 
1505 /**
1506  * sas_configure_routing - configure routing
1507  * @dev: expander device
1508  * @sas_addr: port identifier of device directly attached to the expander device
1509  */
sas_configure_routing(struct domain_device * dev,u8 * sas_addr)1510 static int sas_configure_routing(struct domain_device *dev, u8 *sas_addr)
1511 {
1512 	if (dev->parent)
1513 		return sas_configure_parent(dev->parent, dev, sas_addr, 1);
1514 	return 0;
1515 }
1516 
sas_disable_routing(struct domain_device * dev,u8 * sas_addr)1517 static int sas_disable_routing(struct domain_device *dev,  u8 *sas_addr)
1518 {
1519 	if (dev->parent)
1520 		return sas_configure_parent(dev->parent, dev, sas_addr, 0);
1521 	return 0;
1522 }
1523 
1524 /**
1525  * sas_discover_expander - expander discovery
1526  * @dev: pointer to expander domain device
1527  *
1528  * See comment in sas_discover_sata().
1529  */
sas_discover_expander(struct domain_device * dev)1530 static int sas_discover_expander(struct domain_device *dev)
1531 {
1532 	int res;
1533 
1534 	res = sas_notify_lldd_dev_found(dev);
1535 	if (res)
1536 		return res;
1537 
1538 	res = sas_ex_general(dev);
1539 	if (res)
1540 		goto out_err;
1541 	res = sas_ex_manuf_info(dev);
1542 	if (res)
1543 		goto out_err;
1544 
1545 	res = sas_expander_discover(dev);
1546 	if (res) {
1547 		pr_warn("expander %016llx discovery failed(0x%x)\n",
1548 			SAS_ADDR(dev->sas_addr), res);
1549 		goto out_err;
1550 	}
1551 
1552 	sas_check_ex_subtractive_boundary(dev);
1553 	res = sas_check_parent_topology(dev);
1554 	if (res)
1555 		goto out_err;
1556 	return 0;
1557 out_err:
1558 	sas_notify_lldd_dev_gone(dev);
1559 	return res;
1560 }
1561 
sas_ex_level_discovery(struct asd_sas_port * port,const int level)1562 static int sas_ex_level_discovery(struct asd_sas_port *port, const int level)
1563 {
1564 	int res = 0;
1565 	struct domain_device *dev;
1566 
1567 	list_for_each_entry(dev, &port->dev_list, dev_list_node) {
1568 		if (dev_is_expander(dev->dev_type)) {
1569 			struct sas_expander_device *ex =
1570 				rphy_to_expander_device(dev->rphy);
1571 
1572 			if (level == ex->level)
1573 				res = sas_ex_discover_devices(dev, -1);
1574 			else if (level > 0)
1575 				res = sas_ex_discover_devices(port->port_dev, -1);
1576 
1577 		}
1578 	}
1579 
1580 	return res;
1581 }
1582 
sas_ex_bfs_disc(struct asd_sas_port * port)1583 static int sas_ex_bfs_disc(struct asd_sas_port *port)
1584 {
1585 	int res;
1586 	int level;
1587 
1588 	do {
1589 		level = port->disc.max_level;
1590 		res = sas_ex_level_discovery(port, level);
1591 		mb();
1592 	} while (level < port->disc.max_level);
1593 
1594 	return res;
1595 }
1596 
sas_discover_root_expander(struct domain_device * dev)1597 int sas_discover_root_expander(struct domain_device *dev)
1598 {
1599 	int res;
1600 	struct sas_expander_device *ex = rphy_to_expander_device(dev->rphy);
1601 
1602 	res = sas_rphy_add(dev->rphy);
1603 	if (res)
1604 		goto out_err;
1605 
1606 	ex->level = dev->port->disc.max_level; /* 0 */
1607 	res = sas_discover_expander(dev);
1608 	if (res)
1609 		goto out_err2;
1610 
1611 	sas_ex_bfs_disc(dev->port);
1612 
1613 	return res;
1614 
1615 out_err2:
1616 	sas_rphy_remove(dev->rphy);
1617 out_err:
1618 	return res;
1619 }
1620 
1621 /* ---------- Domain revalidation ---------- */
1622 
sas_get_sas_addr_and_dev_type(struct smp_disc_resp * disc_resp,u8 * sas_addr,enum sas_device_type * type)1623 static void sas_get_sas_addr_and_dev_type(struct smp_disc_resp *disc_resp,
1624 					  u8 *sas_addr,
1625 					  enum sas_device_type *type)
1626 {
1627 	memcpy(sas_addr, disc_resp->disc.attached_sas_addr, SAS_ADDR_SIZE);
1628 	*type = to_dev_type(&disc_resp->disc);
1629 	if (*type == SAS_PHY_UNUSED)
1630 		memset(sas_addr, 0, SAS_ADDR_SIZE);
1631 }
1632 
sas_get_phy_discover(struct domain_device * dev,int phy_id,struct smp_disc_resp * disc_resp)1633 static int sas_get_phy_discover(struct domain_device *dev,
1634 				int phy_id, struct smp_disc_resp *disc_resp)
1635 {
1636 	int res;
1637 	u8 *disc_req;
1638 
1639 	disc_req = alloc_smp_req(DISCOVER_REQ_SIZE);
1640 	if (!disc_req)
1641 		return -ENOMEM;
1642 
1643 	disc_req[1] = SMP_DISCOVER;
1644 	disc_req[9] = phy_id;
1645 
1646 	res = smp_execute_task(dev, disc_req, DISCOVER_REQ_SIZE,
1647 			       disc_resp, DISCOVER_RESP_SIZE);
1648 	if (res)
1649 		goto out;
1650 	if (disc_resp->result != SMP_RESP_FUNC_ACC)
1651 		res = disc_resp->result;
1652 out:
1653 	kfree(disc_req);
1654 	return res;
1655 }
1656 
sas_get_phy_change_count(struct domain_device * dev,int phy_id,int * pcc)1657 static int sas_get_phy_change_count(struct domain_device *dev,
1658 				    int phy_id, int *pcc)
1659 {
1660 	int res;
1661 	struct smp_disc_resp *disc_resp;
1662 
1663 	disc_resp = alloc_smp_resp(DISCOVER_RESP_SIZE);
1664 	if (!disc_resp)
1665 		return -ENOMEM;
1666 
1667 	res = sas_get_phy_discover(dev, phy_id, disc_resp);
1668 	if (!res)
1669 		*pcc = disc_resp->disc.change_count;
1670 
1671 	kfree(disc_resp);
1672 	return res;
1673 }
1674 
sas_get_phy_attached_dev(struct domain_device * dev,int phy_id,u8 * sas_addr,enum sas_device_type * type)1675 int sas_get_phy_attached_dev(struct domain_device *dev, int phy_id,
1676 			     u8 *sas_addr, enum sas_device_type *type)
1677 {
1678 	int res;
1679 	struct smp_disc_resp *disc_resp;
1680 
1681 	disc_resp = alloc_smp_resp(DISCOVER_RESP_SIZE);
1682 	if (!disc_resp)
1683 		return -ENOMEM;
1684 
1685 	res = sas_get_phy_discover(dev, phy_id, disc_resp);
1686 	if (res == 0)
1687 		sas_get_sas_addr_and_dev_type(disc_resp, sas_addr, type);
1688 	kfree(disc_resp);
1689 	return res;
1690 }
1691 
sas_find_bcast_phy(struct domain_device * dev,int * phy_id,int from_phy,bool update)1692 static int sas_find_bcast_phy(struct domain_device *dev, int *phy_id,
1693 			      int from_phy, bool update)
1694 {
1695 	struct expander_device *ex = &dev->ex_dev;
1696 	int res = 0;
1697 	int i;
1698 
1699 	for (i = from_phy; i < ex->num_phys; i++) {
1700 		int phy_change_count = 0;
1701 
1702 		res = sas_get_phy_change_count(dev, i, &phy_change_count);
1703 		switch (res) {
1704 		case SMP_RESP_PHY_VACANT:
1705 		case SMP_RESP_NO_PHY:
1706 			continue;
1707 		case SMP_RESP_FUNC_ACC:
1708 			break;
1709 		default:
1710 			return res;
1711 		}
1712 
1713 		if (phy_change_count != ex->ex_phy[i].phy_change_count) {
1714 			if (update)
1715 				ex->ex_phy[i].phy_change_count =
1716 					phy_change_count;
1717 			*phy_id = i;
1718 			return 0;
1719 		}
1720 	}
1721 	return 0;
1722 }
1723 
sas_get_ex_change_count(struct domain_device * dev,int * ecc)1724 static int sas_get_ex_change_count(struct domain_device *dev, int *ecc)
1725 {
1726 	int res;
1727 	u8  *rg_req;
1728 	struct smp_rg_resp  *rg_resp;
1729 
1730 	rg_req = alloc_smp_req(RG_REQ_SIZE);
1731 	if (!rg_req)
1732 		return -ENOMEM;
1733 
1734 	rg_resp = alloc_smp_resp(RG_RESP_SIZE);
1735 	if (!rg_resp) {
1736 		kfree(rg_req);
1737 		return -ENOMEM;
1738 	}
1739 
1740 	rg_req[1] = SMP_REPORT_GENERAL;
1741 
1742 	res = smp_execute_task(dev, rg_req, RG_REQ_SIZE, rg_resp,
1743 			       RG_RESP_SIZE);
1744 	if (res)
1745 		goto out;
1746 	if (rg_resp->result != SMP_RESP_FUNC_ACC) {
1747 		res = rg_resp->result;
1748 		goto out;
1749 	}
1750 
1751 	*ecc = be16_to_cpu(rg_resp->rg.change_count);
1752 out:
1753 	kfree(rg_resp);
1754 	kfree(rg_req);
1755 	return res;
1756 }
1757 /**
1758  * sas_find_bcast_dev -  find the device issue BROADCAST(CHANGE).
1759  * @dev:domain device to be detect.
1760  * @src_dev: the device which originated BROADCAST(CHANGE).
1761  *
1762  * Add self-configuration expander support. Suppose two expander cascading,
1763  * when the first level expander is self-configuring, hotplug the disks in
1764  * second level expander, BROADCAST(CHANGE) will not only be originated
1765  * in the second level expander, but also be originated in the first level
1766  * expander (see SAS protocol SAS 2r-14, 7.11 for detail), it is to say,
1767  * expander changed count in two level expanders will all increment at least
1768  * once, but the phy which chang count has changed is the source device which
1769  * we concerned.
1770  */
1771 
sas_find_bcast_dev(struct domain_device * dev,struct domain_device ** src_dev)1772 static int sas_find_bcast_dev(struct domain_device *dev,
1773 			      struct domain_device **src_dev)
1774 {
1775 	struct expander_device *ex = &dev->ex_dev;
1776 	int ex_change_count = -1;
1777 	int phy_id = -1;
1778 	int res;
1779 	struct domain_device *ch;
1780 
1781 	res = sas_get_ex_change_count(dev, &ex_change_count);
1782 	if (res)
1783 		goto out;
1784 	if (ex_change_count != -1 && ex_change_count != ex->ex_change_count) {
1785 		/* Just detect if this expander phys phy change count changed,
1786 		* in order to determine if this expander originate BROADCAST,
1787 		* and do not update phy change count field in our structure.
1788 		*/
1789 		res = sas_find_bcast_phy(dev, &phy_id, 0, false);
1790 		if (phy_id != -1) {
1791 			*src_dev = dev;
1792 			ex->ex_change_count = ex_change_count;
1793 			pr_info("ex %016llx phy%02d change count has changed\n",
1794 				SAS_ADDR(dev->sas_addr), phy_id);
1795 			return res;
1796 		} else
1797 			pr_info("ex %016llx phys DID NOT change\n",
1798 				SAS_ADDR(dev->sas_addr));
1799 	}
1800 	list_for_each_entry(ch, &ex->children, siblings) {
1801 		if (dev_is_expander(ch->dev_type)) {
1802 			res = sas_find_bcast_dev(ch, src_dev);
1803 			if (*src_dev)
1804 				return res;
1805 		}
1806 	}
1807 out:
1808 	return res;
1809 }
1810 
sas_unregister_ex_tree(struct asd_sas_port * port,struct domain_device * dev)1811 static void sas_unregister_ex_tree(struct asd_sas_port *port, struct domain_device *dev)
1812 {
1813 	struct expander_device *ex = &dev->ex_dev;
1814 	struct domain_device *child, *n;
1815 
1816 	list_for_each_entry_safe(child, n, &ex->children, siblings) {
1817 		set_bit(SAS_DEV_GONE, &child->state);
1818 		if (dev_is_expander(child->dev_type))
1819 			sas_unregister_ex_tree(port, child);
1820 		else
1821 			sas_unregister_dev(port, child);
1822 	}
1823 	sas_unregister_dev(port, dev);
1824 }
1825 
sas_unregister_devs_sas_addr(struct domain_device * parent,int phy_id,bool last)1826 static void sas_unregister_devs_sas_addr(struct domain_device *parent,
1827 					 int phy_id, bool last)
1828 {
1829 	struct expander_device *ex_dev = &parent->ex_dev;
1830 	struct ex_phy *phy = &ex_dev->ex_phy[phy_id];
1831 	struct domain_device *child, *n, *found = NULL;
1832 	if (last) {
1833 		list_for_each_entry_safe(child, n,
1834 			&ex_dev->children, siblings) {
1835 			if (sas_phy_match_dev_addr(child, phy)) {
1836 				set_bit(SAS_DEV_GONE, &child->state);
1837 				if (dev_is_expander(child->dev_type))
1838 					sas_unregister_ex_tree(parent->port, child);
1839 				else
1840 					sas_unregister_dev(parent->port, child);
1841 				found = child;
1842 				break;
1843 			}
1844 		}
1845 		sas_disable_routing(parent, phy->attached_sas_addr);
1846 	}
1847 	memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
1848 	if (phy->port) {
1849 		sas_port_delete_phy(phy->port, phy->phy);
1850 		sas_device_set_phy(found, phy->port);
1851 		if (phy->port->num_phys == 0)
1852 			list_add_tail(&phy->port->del_list,
1853 				&parent->port->sas_port_del_list);
1854 		phy->port = NULL;
1855 	}
1856 }
1857 
sas_discover_bfs_by_root_level(struct domain_device * root,const int level)1858 static int sas_discover_bfs_by_root_level(struct domain_device *root,
1859 					  const int level)
1860 {
1861 	struct expander_device *ex_root = &root->ex_dev;
1862 	struct domain_device *child;
1863 	int res = 0;
1864 
1865 	list_for_each_entry(child, &ex_root->children, siblings) {
1866 		if (dev_is_expander(child->dev_type)) {
1867 			struct sas_expander_device *ex =
1868 				rphy_to_expander_device(child->rphy);
1869 
1870 			if (level > ex->level)
1871 				res = sas_discover_bfs_by_root_level(child,
1872 								     level);
1873 			else if (level == ex->level)
1874 				res = sas_ex_discover_devices(child, -1);
1875 		}
1876 	}
1877 	return res;
1878 }
1879 
sas_discover_bfs_by_root(struct domain_device * dev)1880 static int sas_discover_bfs_by_root(struct domain_device *dev)
1881 {
1882 	int res;
1883 	struct sas_expander_device *ex = rphy_to_expander_device(dev->rphy);
1884 	int level = ex->level+1;
1885 
1886 	res = sas_ex_discover_devices(dev, -1);
1887 	if (res)
1888 		goto out;
1889 	do {
1890 		res = sas_discover_bfs_by_root_level(dev, level);
1891 		mb();
1892 		level += 1;
1893 	} while (level <= dev->port->disc.max_level);
1894 out:
1895 	return res;
1896 }
1897 
sas_discover_new(struct domain_device * dev,int phy_id)1898 static int sas_discover_new(struct domain_device *dev, int phy_id)
1899 {
1900 	struct ex_phy *ex_phy = &dev->ex_dev.ex_phy[phy_id];
1901 	struct domain_device *child;
1902 	int res;
1903 
1904 	pr_debug("ex %016llx phy%02d new device attached\n",
1905 		 SAS_ADDR(dev->sas_addr), phy_id);
1906 	res = sas_ex_phy_discover(dev, phy_id);
1907 	if (res)
1908 		return res;
1909 
1910 	if (sas_ex_join_wide_port(dev, phy_id))
1911 		return 0;
1912 
1913 	res = sas_ex_discover_devices(dev, phy_id);
1914 	if (res)
1915 		return res;
1916 	list_for_each_entry(child, &dev->ex_dev.children, siblings) {
1917 		if (sas_phy_match_dev_addr(child, ex_phy)) {
1918 			if (dev_is_expander(child->dev_type))
1919 				res = sas_discover_bfs_by_root(child);
1920 			break;
1921 		}
1922 	}
1923 	return res;
1924 }
1925 
dev_type_flutter(enum sas_device_type new,enum sas_device_type old)1926 static bool dev_type_flutter(enum sas_device_type new, enum sas_device_type old)
1927 {
1928 	if (old == new)
1929 		return true;
1930 
1931 	/* treat device directed resets as flutter, if we went
1932 	 * SAS_END_DEVICE to SAS_SATA_PENDING the link needs recovery
1933 	 */
1934 	if ((old == SAS_SATA_PENDING && new == SAS_END_DEVICE) ||
1935 	    (old == SAS_END_DEVICE && new == SAS_SATA_PENDING))
1936 		return true;
1937 
1938 	return false;
1939 }
1940 
sas_rediscover_dev(struct domain_device * dev,int phy_id,bool last,int sibling)1941 static int sas_rediscover_dev(struct domain_device *dev, int phy_id,
1942 			      bool last, int sibling)
1943 {
1944 	struct expander_device *ex = &dev->ex_dev;
1945 	struct ex_phy *phy = &ex->ex_phy[phy_id];
1946 	enum sas_device_type type = SAS_PHY_UNUSED;
1947 	struct smp_disc_resp *disc_resp;
1948 	u8 sas_addr[SAS_ADDR_SIZE];
1949 	char msg[80] = "";
1950 	int res;
1951 
1952 	if (!last)
1953 		sprintf(msg, ", part of a wide port with phy%02d", sibling);
1954 
1955 	pr_debug("ex %016llx rediscovering phy%02d%s\n",
1956 		 SAS_ADDR(dev->sas_addr), phy_id, msg);
1957 
1958 	memset(sas_addr, 0, SAS_ADDR_SIZE);
1959 	disc_resp = alloc_smp_resp(DISCOVER_RESP_SIZE);
1960 	if (!disc_resp)
1961 		return -ENOMEM;
1962 
1963 	res = sas_get_phy_discover(dev, phy_id, disc_resp);
1964 	switch (res) {
1965 	case SMP_RESP_NO_PHY:
1966 		phy->phy_state = PHY_NOT_PRESENT;
1967 		sas_unregister_devs_sas_addr(dev, phy_id, last);
1968 		goto out_free_resp;
1969 	case SMP_RESP_PHY_VACANT:
1970 		phy->phy_state = PHY_VACANT;
1971 		sas_unregister_devs_sas_addr(dev, phy_id, last);
1972 		goto out_free_resp;
1973 	case SMP_RESP_FUNC_ACC:
1974 		break;
1975 	case -ECOMM:
1976 		break;
1977 	default:
1978 		goto out_free_resp;
1979 	}
1980 
1981 	if (res == 0)
1982 		sas_get_sas_addr_and_dev_type(disc_resp, sas_addr, &type);
1983 
1984 	if ((SAS_ADDR(sas_addr) == 0) || (res == -ECOMM)) {
1985 		phy->phy_state = PHY_EMPTY;
1986 		sas_unregister_devs_sas_addr(dev, phy_id, last);
1987 		/*
1988 		 * Even though the PHY is empty, for convenience we update
1989 		 * the PHY info, like negotiated linkrate.
1990 		 */
1991 		if (res == 0)
1992 			sas_set_ex_phy(dev, phy_id, disc_resp);
1993 		goto out_free_resp;
1994 	} else if (SAS_ADDR(sas_addr) == SAS_ADDR(phy->attached_sas_addr) &&
1995 		   dev_type_flutter(type, phy->attached_dev_type)) {
1996 		struct domain_device *ata_dev = sas_ex_to_ata(dev, phy_id);
1997 		char *action = "";
1998 
1999 		sas_ex_phy_discover(dev, phy_id);
2000 
2001 		if (ata_dev && phy->attached_dev_type == SAS_SATA_PENDING)
2002 			action = ", needs recovery";
2003 		pr_debug("ex %016llx phy%02d broadcast flutter%s\n",
2004 			 SAS_ADDR(dev->sas_addr), phy_id, action);
2005 		goto out_free_resp;
2006 	}
2007 
2008 	/* we always have to delete the old device when we went here */
2009 	pr_info("ex %016llx phy%02d replace %016llx\n",
2010 		SAS_ADDR(dev->sas_addr), phy_id,
2011 		SAS_ADDR(phy->attached_sas_addr));
2012 	sas_unregister_devs_sas_addr(dev, phy_id, last);
2013 
2014 	res = sas_discover_new(dev, phy_id);
2015 out_free_resp:
2016 	kfree(disc_resp);
2017 	return res;
2018 }
2019 
2020 /**
2021  * sas_rediscover - revalidate the domain.
2022  * @dev:domain device to be detect.
2023  * @phy_id: the phy id will be detected.
2024  *
2025  * NOTE: this process _must_ quit (return) as soon as any connection
2026  * errors are encountered.  Connection recovery is done elsewhere.
2027  * Discover process only interrogates devices in order to discover the
2028  * domain.For plugging out, we un-register the device only when it is
2029  * the last phy in the port, for other phys in this port, we just delete it
2030  * from the port.For inserting, we do discovery when it is the
2031  * first phy,for other phys in this port, we add it to the port to
2032  * forming the wide-port.
2033  */
sas_rediscover(struct domain_device * dev,const int phy_id)2034 static int sas_rediscover(struct domain_device *dev, const int phy_id)
2035 {
2036 	struct expander_device *ex = &dev->ex_dev;
2037 	struct ex_phy *changed_phy = &ex->ex_phy[phy_id];
2038 	int res = 0;
2039 	int i;
2040 	bool last = true;	/* is this the last phy of the port */
2041 
2042 	pr_debug("ex %016llx phy%02d originated BROADCAST(CHANGE)\n",
2043 		 SAS_ADDR(dev->sas_addr), phy_id);
2044 
2045 	if (SAS_ADDR(changed_phy->attached_sas_addr) != 0) {
2046 		for (i = 0; i < ex->num_phys; i++) {
2047 			struct ex_phy *phy = &ex->ex_phy[i];
2048 
2049 			if (i == phy_id)
2050 				continue;
2051 			if (sas_phy_addr_match(phy, changed_phy)) {
2052 				last = false;
2053 				break;
2054 			}
2055 		}
2056 		res = sas_rediscover_dev(dev, phy_id, last, i);
2057 	} else
2058 		res = sas_discover_new(dev, phy_id);
2059 	return res;
2060 }
2061 
2062 /**
2063  * sas_ex_revalidate_domain - revalidate the domain
2064  * @port_dev: port domain device.
2065  *
2066  * NOTE: this process _must_ quit (return) as soon as any connection
2067  * errors are encountered.  Connection recovery is done elsewhere.
2068  * Discover process only interrogates devices in order to discover the
2069  * domain.
2070  */
sas_ex_revalidate_domain(struct domain_device * port_dev)2071 int sas_ex_revalidate_domain(struct domain_device *port_dev)
2072 {
2073 	int res;
2074 	struct domain_device *dev = NULL;
2075 
2076 	res = sas_find_bcast_dev(port_dev, &dev);
2077 	if (res == 0 && dev) {
2078 		struct expander_device *ex = &dev->ex_dev;
2079 		int i = 0, phy_id;
2080 
2081 		do {
2082 			phy_id = -1;
2083 			res = sas_find_bcast_phy(dev, &phy_id, i, true);
2084 			if (phy_id == -1)
2085 				break;
2086 			res = sas_rediscover(dev, phy_id);
2087 			i = phy_id + 1;
2088 		} while (i < ex->num_phys);
2089 	}
2090 	return res;
2091 }
2092 
sas_find_attached_phy_id(struct expander_device * ex_dev,struct domain_device * dev)2093 int sas_find_attached_phy_id(struct expander_device *ex_dev,
2094 			     struct domain_device *dev)
2095 {
2096 	struct ex_phy *phy;
2097 	int phy_id;
2098 
2099 	for (phy_id = 0; phy_id < ex_dev->num_phys; phy_id++) {
2100 		phy = &ex_dev->ex_phy[phy_id];
2101 		if (sas_phy_match_dev_addr(dev, phy))
2102 			return phy_id;
2103 	}
2104 
2105 	return -ENODEV;
2106 }
2107 EXPORT_SYMBOL_GPL(sas_find_attached_phy_id);
2108 
sas_smp_handler(struct bsg_job * job,struct Scsi_Host * shost,struct sas_rphy * rphy)2109 void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
2110 		struct sas_rphy *rphy)
2111 {
2112 	struct domain_device *dev;
2113 	unsigned int rcvlen = 0;
2114 	int ret = -EINVAL;
2115 
2116 	/* no rphy means no smp target support (ie aic94xx host) */
2117 	if (!rphy)
2118 		return sas_smp_host_handler(job, shost);
2119 
2120 	switch (rphy->identify.device_type) {
2121 	case SAS_EDGE_EXPANDER_DEVICE:
2122 	case SAS_FANOUT_EXPANDER_DEVICE:
2123 		break;
2124 	default:
2125 		pr_err("%s: can we send a smp request to a device?\n",
2126 		       __func__);
2127 		goto out;
2128 	}
2129 
2130 	dev = sas_find_dev_by_rphy(rphy);
2131 	if (!dev) {
2132 		pr_err("%s: fail to find a domain_device?\n", __func__);
2133 		goto out;
2134 	}
2135 
2136 	/* do we need to support multiple segments? */
2137 	if (job->request_payload.sg_cnt > 1 ||
2138 	    job->reply_payload.sg_cnt > 1) {
2139 		pr_info("%s: multiple segments req %u, rsp %u\n",
2140 			__func__, job->request_payload.payload_len,
2141 			job->reply_payload.payload_len);
2142 		goto out;
2143 	}
2144 
2145 	ret = smp_execute_task_sg(dev, job->request_payload.sg_list,
2146 			job->reply_payload.sg_list);
2147 	if (ret >= 0) {
2148 		/* bsg_job_done() requires the length received  */
2149 		rcvlen = job->reply_payload.payload_len - ret;
2150 		ret = 0;
2151 	}
2152 
2153 out:
2154 	bsg_job_done(job, ret, rcvlen);
2155 }
2156