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