1 /* 2 * Copyright (C) 2005-2006 Dell Inc. 3 * Released under GPL v2. 4 * 5 * Serial Attached SCSI (SAS) transport class. 6 * 7 * The SAS transport class contains common code to deal with SAS HBAs, 8 * an aproximated representation of SAS topologies in the driver model, 9 * and various sysfs attributes to expose these topologies and management 10 * interfaces to userspace. 11 * 12 * In addition to the basic SCSI core objects this transport class 13 * introduces two additional intermediate objects: The SAS PHY 14 * as represented by struct sas_phy defines an "outgoing" PHY on 15 * a SAS HBA or Expander, and the SAS remote PHY represented by 16 * struct sas_rphy defines an "incoming" PHY on a SAS Expander or 17 * end device. Note that this is purely a software concept, the 18 * underlying hardware for a PHY and a remote PHY is the exactly 19 * the same. 20 * 21 * There is no concept of a SAS port in this code, users can see 22 * what PHYs form a wide port based on the port_identifier attribute, 23 * which is the same for all PHYs in a port. 24 */ 25 26 #include <linux/init.h> 27 #include <linux/module.h> 28 #include <linux/jiffies.h> 29 #include <linux/err.h> 30 #include <linux/slab.h> 31 #include <linux/string.h> 32 #include <linux/blkdev.h> 33 #include <linux/bsg.h> 34 35 #include <scsi/scsi.h> 36 #include <scsi/scsi_request.h> 37 #include <scsi/scsi_device.h> 38 #include <scsi/scsi_host.h> 39 #include <scsi/scsi_transport.h> 40 #include <scsi/scsi_transport_sas.h> 41 42 #include "scsi_sas_internal.h" 43 struct sas_host_attrs { 44 struct list_head rphy_list; 45 struct mutex lock; 46 struct request_queue *q; 47 u32 next_target_id; 48 u32 next_expander_id; 49 int next_port_id; 50 }; 51 #define to_sas_host_attrs(host) ((struct sas_host_attrs *)(host)->shost_data) 52 53 54 /* 55 * Hack to allow attributes of the same name in different objects. 56 */ 57 #define SAS_DEVICE_ATTR(_prefix,_name,_mode,_show,_store) \ 58 struct device_attribute dev_attr_##_prefix##_##_name = \ 59 __ATTR(_name,_mode,_show,_store) 60 61 62 /* 63 * Pretty printing helpers 64 */ 65 66 #define sas_bitfield_name_match(title, table) \ 67 static ssize_t \ 68 get_sas_##title##_names(u32 table_key, char *buf) \ 69 { \ 70 char *prefix = ""; \ 71 ssize_t len = 0; \ 72 int i; \ 73 \ 74 for (i = 0; i < ARRAY_SIZE(table); i++) { \ 75 if (table[i].value & table_key) { \ 76 len += sprintf(buf + len, "%s%s", \ 77 prefix, table[i].name); \ 78 prefix = ", "; \ 79 } \ 80 } \ 81 len += sprintf(buf + len, "\n"); \ 82 return len; \ 83 } 84 85 #define sas_bitfield_name_set(title, table) \ 86 static ssize_t \ 87 set_sas_##title##_names(u32 *table_key, const char *buf) \ 88 { \ 89 ssize_t len = 0; \ 90 int i; \ 91 \ 92 for (i = 0; i < ARRAY_SIZE(table); i++) { \ 93 len = strlen(table[i].name); \ 94 if (strncmp(buf, table[i].name, len) == 0 && \ 95 (buf[len] == '\n' || buf[len] == '\0')) { \ 96 *table_key = table[i].value; \ 97 return 0; \ 98 } \ 99 } \ 100 return -EINVAL; \ 101 } 102 103 #define sas_bitfield_name_search(title, table) \ 104 static ssize_t \ 105 get_sas_##title##_names(u32 table_key, char *buf) \ 106 { \ 107 ssize_t len = 0; \ 108 int i; \ 109 \ 110 for (i = 0; i < ARRAY_SIZE(table); i++) { \ 111 if (table[i].value == table_key) { \ 112 len += sprintf(buf + len, "%s", \ 113 table[i].name); \ 114 break; \ 115 } \ 116 } \ 117 len += sprintf(buf + len, "\n"); \ 118 return len; \ 119 } 120 121 static struct { 122 u32 value; 123 char *name; 124 } sas_device_type_names[] = { 125 { SAS_PHY_UNUSED, "unused" }, 126 { SAS_END_DEVICE, "end device" }, 127 { SAS_EDGE_EXPANDER_DEVICE, "edge expander" }, 128 { SAS_FANOUT_EXPANDER_DEVICE, "fanout expander" }, 129 }; 130 sas_bitfield_name_search(device_type, sas_device_type_names) 131 132 133 static struct { 134 u32 value; 135 char *name; 136 } sas_protocol_names[] = { 137 { SAS_PROTOCOL_SATA, "sata" }, 138 { SAS_PROTOCOL_SMP, "smp" }, 139 { SAS_PROTOCOL_STP, "stp" }, 140 { SAS_PROTOCOL_SSP, "ssp" }, 141 }; 142 sas_bitfield_name_match(protocol, sas_protocol_names) 143 144 static struct { 145 u32 value; 146 char *name; 147 } sas_linkspeed_names[] = { 148 { SAS_LINK_RATE_UNKNOWN, "Unknown" }, 149 { SAS_PHY_DISABLED, "Phy disabled" }, 150 { SAS_LINK_RATE_FAILED, "Link Rate failed" }, 151 { SAS_SATA_SPINUP_HOLD, "Spin-up hold" }, 152 { SAS_LINK_RATE_1_5_GBPS, "1.5 Gbit" }, 153 { SAS_LINK_RATE_3_0_GBPS, "3.0 Gbit" }, 154 { SAS_LINK_RATE_6_0_GBPS, "6.0 Gbit" }, 155 { SAS_LINK_RATE_12_0_GBPS, "12.0 Gbit" }, 156 }; 157 sas_bitfield_name_search(linkspeed, sas_linkspeed_names) 158 sas_bitfield_name_set(linkspeed, sas_linkspeed_names) 159 160 static struct sas_end_device *sas_sdev_to_rdev(struct scsi_device *sdev) 161 { 162 struct sas_rphy *rphy = target_to_rphy(sdev->sdev_target); 163 struct sas_end_device *rdev; 164 165 BUG_ON(rphy->identify.device_type != SAS_END_DEVICE); 166 167 rdev = rphy_to_end_device(rphy); 168 return rdev; 169 } 170 171 static void sas_smp_request(struct request_queue *q, struct Scsi_Host *shost, 172 struct sas_rphy *rphy) 173 { 174 struct request *req; 175 int ret; 176 int (*handler)(struct Scsi_Host *, struct sas_rphy *, struct request *); 177 178 while ((req = blk_fetch_request(q)) != NULL) { 179 spin_unlock_irq(q->queue_lock); 180 181 scsi_req(req)->resid_len = blk_rq_bytes(req); 182 if (req->next_rq) 183 scsi_req(req->next_rq)->resid_len = 184 blk_rq_bytes(req->next_rq); 185 handler = to_sas_internal(shost->transportt)->f->smp_handler; 186 ret = handler(shost, rphy, req); 187 scsi_req(req)->result = ret; 188 189 blk_end_request_all(req, 0); 190 191 spin_lock_irq(q->queue_lock); 192 } 193 } 194 195 static void sas_host_smp_request(struct request_queue *q) 196 { 197 sas_smp_request(q, (struct Scsi_Host *)q->queuedata, NULL); 198 } 199 200 static void sas_non_host_smp_request(struct request_queue *q) 201 { 202 struct sas_rphy *rphy = q->queuedata; 203 sas_smp_request(q, rphy_to_shost(rphy), rphy); 204 } 205 206 static void sas_host_release(struct device *dev) 207 { 208 struct Scsi_Host *shost = dev_to_shost(dev); 209 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 210 struct request_queue *q = sas_host->q; 211 212 if (q) 213 blk_cleanup_queue(q); 214 } 215 216 static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy) 217 { 218 struct request_queue *q; 219 int error; 220 struct device *dev; 221 char namebuf[20]; 222 const char *name; 223 void (*release)(struct device *); 224 225 if (!to_sas_internal(shost->transportt)->f->smp_handler) { 226 printk("%s can't handle SMP requests\n", shost->hostt->name); 227 return 0; 228 } 229 230 q = blk_alloc_queue(GFP_KERNEL); 231 if (!q) 232 return -ENOMEM; 233 q->cmd_size = sizeof(struct scsi_request); 234 235 if (rphy) { 236 q->request_fn = sas_non_host_smp_request; 237 dev = &rphy->dev; 238 name = dev_name(dev); 239 release = NULL; 240 } else { 241 q->request_fn = sas_host_smp_request; 242 dev = &shost->shost_gendev; 243 snprintf(namebuf, sizeof(namebuf), 244 "sas_host%d", shost->host_no); 245 name = namebuf; 246 release = sas_host_release; 247 } 248 error = blk_init_allocated_queue(q); 249 if (error) 250 goto out_cleanup_queue; 251 252 error = bsg_register_queue(q, dev, name, release); 253 if (error) 254 goto out_cleanup_queue; 255 256 if (rphy) 257 rphy->q = q; 258 else 259 to_sas_host_attrs(shost)->q = q; 260 261 if (rphy) 262 q->queuedata = rphy; 263 else 264 q->queuedata = shost; 265 266 queue_flag_set_unlocked(QUEUE_FLAG_BIDI, q); 267 return 0; 268 269 out_cleanup_queue: 270 blk_cleanup_queue(q); 271 return error; 272 } 273 274 static void sas_bsg_remove(struct Scsi_Host *shost, struct sas_rphy *rphy) 275 { 276 struct request_queue *q; 277 278 if (rphy) 279 q = rphy->q; 280 else 281 q = to_sas_host_attrs(shost)->q; 282 283 if (!q) 284 return; 285 286 bsg_unregister_queue(q); 287 } 288 289 /* 290 * SAS host attributes 291 */ 292 293 static int sas_host_setup(struct transport_container *tc, struct device *dev, 294 struct device *cdev) 295 { 296 struct Scsi_Host *shost = dev_to_shost(dev); 297 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 298 299 INIT_LIST_HEAD(&sas_host->rphy_list); 300 mutex_init(&sas_host->lock); 301 sas_host->next_target_id = 0; 302 sas_host->next_expander_id = 0; 303 sas_host->next_port_id = 0; 304 305 if (sas_bsg_initialize(shost, NULL)) 306 dev_printk(KERN_ERR, dev, "fail to a bsg device %d\n", 307 shost->host_no); 308 309 return 0; 310 } 311 312 static int sas_host_remove(struct transport_container *tc, struct device *dev, 313 struct device *cdev) 314 { 315 struct Scsi_Host *shost = dev_to_shost(dev); 316 317 sas_bsg_remove(shost, NULL); 318 319 return 0; 320 } 321 322 static DECLARE_TRANSPORT_CLASS(sas_host_class, 323 "sas_host", sas_host_setup, sas_host_remove, NULL); 324 325 static int sas_host_match(struct attribute_container *cont, 326 struct device *dev) 327 { 328 struct Scsi_Host *shost; 329 struct sas_internal *i; 330 331 if (!scsi_is_host_device(dev)) 332 return 0; 333 shost = dev_to_shost(dev); 334 335 if (!shost->transportt) 336 return 0; 337 if (shost->transportt->host_attrs.ac.class != 338 &sas_host_class.class) 339 return 0; 340 341 i = to_sas_internal(shost->transportt); 342 return &i->t.host_attrs.ac == cont; 343 } 344 345 static int do_sas_phy_delete(struct device *dev, void *data) 346 { 347 int pass = (int)(unsigned long)data; 348 349 if (pass == 0 && scsi_is_sas_port(dev)) 350 sas_port_delete(dev_to_sas_port(dev)); 351 else if (pass == 1 && scsi_is_sas_phy(dev)) 352 sas_phy_delete(dev_to_phy(dev)); 353 return 0; 354 } 355 356 /** 357 * sas_remove_children - tear down a devices SAS data structures 358 * @dev: device belonging to the sas object 359 * 360 * Removes all SAS PHYs and remote PHYs for a given object 361 */ 362 void sas_remove_children(struct device *dev) 363 { 364 device_for_each_child(dev, (void *)0, do_sas_phy_delete); 365 device_for_each_child(dev, (void *)1, do_sas_phy_delete); 366 } 367 EXPORT_SYMBOL(sas_remove_children); 368 369 /** 370 * sas_remove_host - tear down a Scsi_Host's SAS data structures 371 * @shost: Scsi Host that is torn down 372 * 373 * Removes all SAS PHYs and remote PHYs for a given Scsi_Host and remove the 374 * Scsi_Host as well. 375 * 376 * Note: Do not call scsi_remove_host() on the Scsi_Host any more, as it is 377 * already removed. 378 */ 379 void sas_remove_host(struct Scsi_Host *shost) 380 { 381 sas_remove_children(&shost->shost_gendev); 382 scsi_remove_host(shost); 383 } 384 EXPORT_SYMBOL(sas_remove_host); 385 386 /** 387 * sas_get_address - return the SAS address of the device 388 * @sdev: scsi device 389 * 390 * Returns the SAS address of the scsi device 391 */ 392 u64 sas_get_address(struct scsi_device *sdev) 393 { 394 struct sas_end_device *rdev = sas_sdev_to_rdev(sdev); 395 396 return rdev->rphy.identify.sas_address; 397 } 398 EXPORT_SYMBOL(sas_get_address); 399 400 /** 401 * sas_tlr_supported - checking TLR bit in vpd 0x90 402 * @sdev: scsi device struct 403 * 404 * Check Transport Layer Retries are supported or not. 405 * If vpd page 0x90 is present, TRL is supported. 406 * 407 */ 408 unsigned int 409 sas_tlr_supported(struct scsi_device *sdev) 410 { 411 const int vpd_len = 32; 412 struct sas_end_device *rdev = sas_sdev_to_rdev(sdev); 413 char *buffer = kzalloc(vpd_len, GFP_KERNEL); 414 int ret = 0; 415 416 if (scsi_get_vpd_page(sdev, 0x90, buffer, vpd_len)) 417 goto out; 418 419 /* 420 * Magic numbers: the VPD Protocol page (0x90) 421 * has a 4 byte header and then one entry per device port 422 * the TLR bit is at offset 8 on each port entry 423 * if we take the first port, that's at total offset 12 424 */ 425 ret = buffer[12] & 0x01; 426 427 out: 428 kfree(buffer); 429 rdev->tlr_supported = ret; 430 return ret; 431 432 } 433 EXPORT_SYMBOL_GPL(sas_tlr_supported); 434 435 /** 436 * sas_disable_tlr - setting TLR flags 437 * @sdev: scsi device struct 438 * 439 * Seting tlr_enabled flag to 0. 440 * 441 */ 442 void 443 sas_disable_tlr(struct scsi_device *sdev) 444 { 445 struct sas_end_device *rdev = sas_sdev_to_rdev(sdev); 446 447 rdev->tlr_enabled = 0; 448 } 449 EXPORT_SYMBOL_GPL(sas_disable_tlr); 450 451 /** 452 * sas_enable_tlr - setting TLR flags 453 * @sdev: scsi device struct 454 * 455 * Seting tlr_enabled flag 1. 456 * 457 */ 458 void sas_enable_tlr(struct scsi_device *sdev) 459 { 460 unsigned int tlr_supported = 0; 461 tlr_supported = sas_tlr_supported(sdev); 462 463 if (tlr_supported) { 464 struct sas_end_device *rdev = sas_sdev_to_rdev(sdev); 465 466 rdev->tlr_enabled = 1; 467 } 468 469 return; 470 } 471 EXPORT_SYMBOL_GPL(sas_enable_tlr); 472 473 unsigned int sas_is_tlr_enabled(struct scsi_device *sdev) 474 { 475 struct sas_end_device *rdev = sas_sdev_to_rdev(sdev); 476 return rdev->tlr_enabled; 477 } 478 EXPORT_SYMBOL_GPL(sas_is_tlr_enabled); 479 480 /* 481 * SAS Phy attributes 482 */ 483 484 #define sas_phy_show_simple(field, name, format_string, cast) \ 485 static ssize_t \ 486 show_sas_phy_##name(struct device *dev, \ 487 struct device_attribute *attr, char *buf) \ 488 { \ 489 struct sas_phy *phy = transport_class_to_phy(dev); \ 490 \ 491 return snprintf(buf, 20, format_string, cast phy->field); \ 492 } 493 494 #define sas_phy_simple_attr(field, name, format_string, type) \ 495 sas_phy_show_simple(field, name, format_string, (type)) \ 496 static DEVICE_ATTR(name, S_IRUGO, show_sas_phy_##name, NULL) 497 498 #define sas_phy_show_protocol(field, name) \ 499 static ssize_t \ 500 show_sas_phy_##name(struct device *dev, \ 501 struct device_attribute *attr, char *buf) \ 502 { \ 503 struct sas_phy *phy = transport_class_to_phy(dev); \ 504 \ 505 if (!phy->field) \ 506 return snprintf(buf, 20, "none\n"); \ 507 return get_sas_protocol_names(phy->field, buf); \ 508 } 509 510 #define sas_phy_protocol_attr(field, name) \ 511 sas_phy_show_protocol(field, name) \ 512 static DEVICE_ATTR(name, S_IRUGO, show_sas_phy_##name, NULL) 513 514 #define sas_phy_show_linkspeed(field) \ 515 static ssize_t \ 516 show_sas_phy_##field(struct device *dev, \ 517 struct device_attribute *attr, char *buf) \ 518 { \ 519 struct sas_phy *phy = transport_class_to_phy(dev); \ 520 \ 521 return get_sas_linkspeed_names(phy->field, buf); \ 522 } 523 524 /* Fudge to tell if we're minimum or maximum */ 525 #define sas_phy_store_linkspeed(field) \ 526 static ssize_t \ 527 store_sas_phy_##field(struct device *dev, \ 528 struct device_attribute *attr, \ 529 const char *buf, size_t count) \ 530 { \ 531 struct sas_phy *phy = transport_class_to_phy(dev); \ 532 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); \ 533 struct sas_internal *i = to_sas_internal(shost->transportt); \ 534 u32 value; \ 535 struct sas_phy_linkrates rates = {0}; \ 536 int error; \ 537 \ 538 error = set_sas_linkspeed_names(&value, buf); \ 539 if (error) \ 540 return error; \ 541 rates.field = value; \ 542 error = i->f->set_phy_speed(phy, &rates); \ 543 \ 544 return error ? error : count; \ 545 } 546 547 #define sas_phy_linkspeed_rw_attr(field) \ 548 sas_phy_show_linkspeed(field) \ 549 sas_phy_store_linkspeed(field) \ 550 static DEVICE_ATTR(field, S_IRUGO, show_sas_phy_##field, \ 551 store_sas_phy_##field) 552 553 #define sas_phy_linkspeed_attr(field) \ 554 sas_phy_show_linkspeed(field) \ 555 static DEVICE_ATTR(field, S_IRUGO, show_sas_phy_##field, NULL) 556 557 558 #define sas_phy_show_linkerror(field) \ 559 static ssize_t \ 560 show_sas_phy_##field(struct device *dev, \ 561 struct device_attribute *attr, char *buf) \ 562 { \ 563 struct sas_phy *phy = transport_class_to_phy(dev); \ 564 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); \ 565 struct sas_internal *i = to_sas_internal(shost->transportt); \ 566 int error; \ 567 \ 568 error = i->f->get_linkerrors ? i->f->get_linkerrors(phy) : 0; \ 569 if (error) \ 570 return error; \ 571 return snprintf(buf, 20, "%u\n", phy->field); \ 572 } 573 574 #define sas_phy_linkerror_attr(field) \ 575 sas_phy_show_linkerror(field) \ 576 static DEVICE_ATTR(field, S_IRUGO, show_sas_phy_##field, NULL) 577 578 579 static ssize_t 580 show_sas_device_type(struct device *dev, 581 struct device_attribute *attr, char *buf) 582 { 583 struct sas_phy *phy = transport_class_to_phy(dev); 584 585 if (!phy->identify.device_type) 586 return snprintf(buf, 20, "none\n"); 587 return get_sas_device_type_names(phy->identify.device_type, buf); 588 } 589 static DEVICE_ATTR(device_type, S_IRUGO, show_sas_device_type, NULL); 590 591 static ssize_t do_sas_phy_enable(struct device *dev, 592 size_t count, int enable) 593 { 594 struct sas_phy *phy = transport_class_to_phy(dev); 595 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 596 struct sas_internal *i = to_sas_internal(shost->transportt); 597 int error; 598 599 error = i->f->phy_enable(phy, enable); 600 if (error) 601 return error; 602 phy->enabled = enable; 603 return count; 604 }; 605 606 static ssize_t 607 store_sas_phy_enable(struct device *dev, struct device_attribute *attr, 608 const char *buf, size_t count) 609 { 610 if (count < 1) 611 return -EINVAL; 612 613 switch (buf[0]) { 614 case '0': 615 do_sas_phy_enable(dev, count, 0); 616 break; 617 case '1': 618 do_sas_phy_enable(dev, count, 1); 619 break; 620 default: 621 return -EINVAL; 622 } 623 624 return count; 625 } 626 627 static ssize_t 628 show_sas_phy_enable(struct device *dev, struct device_attribute *attr, 629 char *buf) 630 { 631 struct sas_phy *phy = transport_class_to_phy(dev); 632 633 return snprintf(buf, 20, "%d", phy->enabled); 634 } 635 636 static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, show_sas_phy_enable, 637 store_sas_phy_enable); 638 639 static ssize_t 640 do_sas_phy_reset(struct device *dev, size_t count, int hard_reset) 641 { 642 struct sas_phy *phy = transport_class_to_phy(dev); 643 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 644 struct sas_internal *i = to_sas_internal(shost->transportt); 645 int error; 646 647 error = i->f->phy_reset(phy, hard_reset); 648 if (error) 649 return error; 650 phy->enabled = 1; 651 return count; 652 }; 653 654 static ssize_t 655 store_sas_link_reset(struct device *dev, struct device_attribute *attr, 656 const char *buf, size_t count) 657 { 658 return do_sas_phy_reset(dev, count, 0); 659 } 660 static DEVICE_ATTR(link_reset, S_IWUSR, NULL, store_sas_link_reset); 661 662 static ssize_t 663 store_sas_hard_reset(struct device *dev, struct device_attribute *attr, 664 const char *buf, size_t count) 665 { 666 return do_sas_phy_reset(dev, count, 1); 667 } 668 static DEVICE_ATTR(hard_reset, S_IWUSR, NULL, store_sas_hard_reset); 669 670 sas_phy_protocol_attr(identify.initiator_port_protocols, 671 initiator_port_protocols); 672 sas_phy_protocol_attr(identify.target_port_protocols, 673 target_port_protocols); 674 sas_phy_simple_attr(identify.sas_address, sas_address, "0x%016llx\n", 675 unsigned long long); 676 sas_phy_simple_attr(identify.phy_identifier, phy_identifier, "%d\n", u8); 677 //sas_phy_simple_attr(port_identifier, port_identifier, "%d\n", int); 678 sas_phy_linkspeed_attr(negotiated_linkrate); 679 sas_phy_linkspeed_attr(minimum_linkrate_hw); 680 sas_phy_linkspeed_rw_attr(minimum_linkrate); 681 sas_phy_linkspeed_attr(maximum_linkrate_hw); 682 sas_phy_linkspeed_rw_attr(maximum_linkrate); 683 sas_phy_linkerror_attr(invalid_dword_count); 684 sas_phy_linkerror_attr(running_disparity_error_count); 685 sas_phy_linkerror_attr(loss_of_dword_sync_count); 686 sas_phy_linkerror_attr(phy_reset_problem_count); 687 688 static int sas_phy_setup(struct transport_container *tc, struct device *dev, 689 struct device *cdev) 690 { 691 struct sas_phy *phy = dev_to_phy(dev); 692 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 693 struct sas_internal *i = to_sas_internal(shost->transportt); 694 695 if (i->f->phy_setup) 696 i->f->phy_setup(phy); 697 698 return 0; 699 } 700 701 static DECLARE_TRANSPORT_CLASS(sas_phy_class, 702 "sas_phy", sas_phy_setup, NULL, NULL); 703 704 static int sas_phy_match(struct attribute_container *cont, struct device *dev) 705 { 706 struct Scsi_Host *shost; 707 struct sas_internal *i; 708 709 if (!scsi_is_sas_phy(dev)) 710 return 0; 711 shost = dev_to_shost(dev->parent); 712 713 if (!shost->transportt) 714 return 0; 715 if (shost->transportt->host_attrs.ac.class != 716 &sas_host_class.class) 717 return 0; 718 719 i = to_sas_internal(shost->transportt); 720 return &i->phy_attr_cont.ac == cont; 721 } 722 723 static void sas_phy_release(struct device *dev) 724 { 725 struct sas_phy *phy = dev_to_phy(dev); 726 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 727 struct sas_internal *i = to_sas_internal(shost->transportt); 728 729 if (i->f->phy_release) 730 i->f->phy_release(phy); 731 put_device(dev->parent); 732 kfree(phy); 733 } 734 735 /** 736 * sas_phy_alloc - allocates and initialize a SAS PHY structure 737 * @parent: Parent device 738 * @number: Phy index 739 * 740 * Allocates an SAS PHY structure. It will be added in the device tree 741 * below the device specified by @parent, which has to be either a Scsi_Host 742 * or sas_rphy. 743 * 744 * Returns: 745 * SAS PHY allocated or %NULL if the allocation failed. 746 */ 747 struct sas_phy *sas_phy_alloc(struct device *parent, int number) 748 { 749 struct Scsi_Host *shost = dev_to_shost(parent); 750 struct sas_phy *phy; 751 752 phy = kzalloc(sizeof(*phy), GFP_KERNEL); 753 if (!phy) 754 return NULL; 755 756 phy->number = number; 757 phy->enabled = 1; 758 759 device_initialize(&phy->dev); 760 phy->dev.parent = get_device(parent); 761 phy->dev.release = sas_phy_release; 762 INIT_LIST_HEAD(&phy->port_siblings); 763 if (scsi_is_sas_expander_device(parent)) { 764 struct sas_rphy *rphy = dev_to_rphy(parent); 765 dev_set_name(&phy->dev, "phy-%d:%d:%d", shost->host_no, 766 rphy->scsi_target_id, number); 767 } else 768 dev_set_name(&phy->dev, "phy-%d:%d", shost->host_no, number); 769 770 transport_setup_device(&phy->dev); 771 772 return phy; 773 } 774 EXPORT_SYMBOL(sas_phy_alloc); 775 776 /** 777 * sas_phy_add - add a SAS PHY to the device hierarchy 778 * @phy: The PHY to be added 779 * 780 * Publishes a SAS PHY to the rest of the system. 781 */ 782 int sas_phy_add(struct sas_phy *phy) 783 { 784 int error; 785 786 error = device_add(&phy->dev); 787 if (!error) { 788 transport_add_device(&phy->dev); 789 transport_configure_device(&phy->dev); 790 } 791 792 return error; 793 } 794 EXPORT_SYMBOL(sas_phy_add); 795 796 /** 797 * sas_phy_free - free a SAS PHY 798 * @phy: SAS PHY to free 799 * 800 * Frees the specified SAS PHY. 801 * 802 * Note: 803 * This function must only be called on a PHY that has not 804 * successfully been added using sas_phy_add(). 805 */ 806 void sas_phy_free(struct sas_phy *phy) 807 { 808 transport_destroy_device(&phy->dev); 809 put_device(&phy->dev); 810 } 811 EXPORT_SYMBOL(sas_phy_free); 812 813 /** 814 * sas_phy_delete - remove SAS PHY 815 * @phy: SAS PHY to remove 816 * 817 * Removes the specified SAS PHY. If the SAS PHY has an 818 * associated remote PHY it is removed before. 819 */ 820 void 821 sas_phy_delete(struct sas_phy *phy) 822 { 823 struct device *dev = &phy->dev; 824 825 /* this happens if the phy is still part of a port when deleted */ 826 BUG_ON(!list_empty(&phy->port_siblings)); 827 828 transport_remove_device(dev); 829 device_del(dev); 830 transport_destroy_device(dev); 831 put_device(dev); 832 } 833 EXPORT_SYMBOL(sas_phy_delete); 834 835 /** 836 * scsi_is_sas_phy - check if a struct device represents a SAS PHY 837 * @dev: device to check 838 * 839 * Returns: 840 * %1 if the device represents a SAS PHY, %0 else 841 */ 842 int scsi_is_sas_phy(const struct device *dev) 843 { 844 return dev->release == sas_phy_release; 845 } 846 EXPORT_SYMBOL(scsi_is_sas_phy); 847 848 /* 849 * SAS Port attributes 850 */ 851 #define sas_port_show_simple(field, name, format_string, cast) \ 852 static ssize_t \ 853 show_sas_port_##name(struct device *dev, \ 854 struct device_attribute *attr, char *buf) \ 855 { \ 856 struct sas_port *port = transport_class_to_sas_port(dev); \ 857 \ 858 return snprintf(buf, 20, format_string, cast port->field); \ 859 } 860 861 #define sas_port_simple_attr(field, name, format_string, type) \ 862 sas_port_show_simple(field, name, format_string, (type)) \ 863 static DEVICE_ATTR(name, S_IRUGO, show_sas_port_##name, NULL) 864 865 sas_port_simple_attr(num_phys, num_phys, "%d\n", int); 866 867 static DECLARE_TRANSPORT_CLASS(sas_port_class, 868 "sas_port", NULL, NULL, NULL); 869 870 static int sas_port_match(struct attribute_container *cont, struct device *dev) 871 { 872 struct Scsi_Host *shost; 873 struct sas_internal *i; 874 875 if (!scsi_is_sas_port(dev)) 876 return 0; 877 shost = dev_to_shost(dev->parent); 878 879 if (!shost->transportt) 880 return 0; 881 if (shost->transportt->host_attrs.ac.class != 882 &sas_host_class.class) 883 return 0; 884 885 i = to_sas_internal(shost->transportt); 886 return &i->port_attr_cont.ac == cont; 887 } 888 889 890 static void sas_port_release(struct device *dev) 891 { 892 struct sas_port *port = dev_to_sas_port(dev); 893 894 BUG_ON(!list_empty(&port->phy_list)); 895 896 put_device(dev->parent); 897 kfree(port); 898 } 899 900 static void sas_port_create_link(struct sas_port *port, 901 struct sas_phy *phy) 902 { 903 int res; 904 905 res = sysfs_create_link(&port->dev.kobj, &phy->dev.kobj, 906 dev_name(&phy->dev)); 907 if (res) 908 goto err; 909 res = sysfs_create_link(&phy->dev.kobj, &port->dev.kobj, "port"); 910 if (res) 911 goto err; 912 return; 913 err: 914 printk(KERN_ERR "%s: Cannot create port links, err=%d\n", 915 __func__, res); 916 } 917 918 static void sas_port_delete_link(struct sas_port *port, 919 struct sas_phy *phy) 920 { 921 sysfs_remove_link(&port->dev.kobj, dev_name(&phy->dev)); 922 sysfs_remove_link(&phy->dev.kobj, "port"); 923 } 924 925 /** sas_port_alloc - allocate and initialize a SAS port structure 926 * 927 * @parent: parent device 928 * @port_id: port number 929 * 930 * Allocates a SAS port structure. It will be added to the device tree 931 * below the device specified by @parent which must be either a Scsi_Host 932 * or a sas_expander_device. 933 * 934 * Returns %NULL on error 935 */ 936 struct sas_port *sas_port_alloc(struct device *parent, int port_id) 937 { 938 struct Scsi_Host *shost = dev_to_shost(parent); 939 struct sas_port *port; 940 941 port = kzalloc(sizeof(*port), GFP_KERNEL); 942 if (!port) 943 return NULL; 944 945 port->port_identifier = port_id; 946 947 device_initialize(&port->dev); 948 949 port->dev.parent = get_device(parent); 950 port->dev.release = sas_port_release; 951 952 mutex_init(&port->phy_list_mutex); 953 INIT_LIST_HEAD(&port->phy_list); 954 955 if (scsi_is_sas_expander_device(parent)) { 956 struct sas_rphy *rphy = dev_to_rphy(parent); 957 dev_set_name(&port->dev, "port-%d:%d:%d", shost->host_no, 958 rphy->scsi_target_id, port->port_identifier); 959 } else 960 dev_set_name(&port->dev, "port-%d:%d", shost->host_no, 961 port->port_identifier); 962 963 transport_setup_device(&port->dev); 964 965 return port; 966 } 967 EXPORT_SYMBOL(sas_port_alloc); 968 969 /** sas_port_alloc_num - allocate and initialize a SAS port structure 970 * 971 * @parent: parent device 972 * 973 * Allocates a SAS port structure and a number to go with it. This 974 * interface is really for adapters where the port number has no 975 * meansing, so the sas class should manage them. It will be added to 976 * the device tree below the device specified by @parent which must be 977 * either a Scsi_Host or a sas_expander_device. 978 * 979 * Returns %NULL on error 980 */ 981 struct sas_port *sas_port_alloc_num(struct device *parent) 982 { 983 int index; 984 struct Scsi_Host *shost = dev_to_shost(parent); 985 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 986 987 /* FIXME: use idr for this eventually */ 988 mutex_lock(&sas_host->lock); 989 if (scsi_is_sas_expander_device(parent)) { 990 struct sas_rphy *rphy = dev_to_rphy(parent); 991 struct sas_expander_device *exp = rphy_to_expander_device(rphy); 992 993 index = exp->next_port_id++; 994 } else 995 index = sas_host->next_port_id++; 996 mutex_unlock(&sas_host->lock); 997 return sas_port_alloc(parent, index); 998 } 999 EXPORT_SYMBOL(sas_port_alloc_num); 1000 1001 /** 1002 * sas_port_add - add a SAS port to the device hierarchy 1003 * @port: port to be added 1004 * 1005 * publishes a port to the rest of the system 1006 */ 1007 int sas_port_add(struct sas_port *port) 1008 { 1009 int error; 1010 1011 /* No phys should be added until this is made visible */ 1012 BUG_ON(!list_empty(&port->phy_list)); 1013 1014 error = device_add(&port->dev); 1015 1016 if (error) 1017 return error; 1018 1019 transport_add_device(&port->dev); 1020 transport_configure_device(&port->dev); 1021 1022 return 0; 1023 } 1024 EXPORT_SYMBOL(sas_port_add); 1025 1026 /** 1027 * sas_port_free - free a SAS PORT 1028 * @port: SAS PORT to free 1029 * 1030 * Frees the specified SAS PORT. 1031 * 1032 * Note: 1033 * This function must only be called on a PORT that has not 1034 * successfully been added using sas_port_add(). 1035 */ 1036 void sas_port_free(struct sas_port *port) 1037 { 1038 transport_destroy_device(&port->dev); 1039 put_device(&port->dev); 1040 } 1041 EXPORT_SYMBOL(sas_port_free); 1042 1043 /** 1044 * sas_port_delete - remove SAS PORT 1045 * @port: SAS PORT to remove 1046 * 1047 * Removes the specified SAS PORT. If the SAS PORT has an 1048 * associated phys, unlink them from the port as well. 1049 */ 1050 void sas_port_delete(struct sas_port *port) 1051 { 1052 struct device *dev = &port->dev; 1053 struct sas_phy *phy, *tmp_phy; 1054 1055 if (port->rphy) { 1056 sas_rphy_delete(port->rphy); 1057 port->rphy = NULL; 1058 } 1059 1060 mutex_lock(&port->phy_list_mutex); 1061 list_for_each_entry_safe(phy, tmp_phy, &port->phy_list, 1062 port_siblings) { 1063 sas_port_delete_link(port, phy); 1064 list_del_init(&phy->port_siblings); 1065 } 1066 mutex_unlock(&port->phy_list_mutex); 1067 1068 if (port->is_backlink) { 1069 struct device *parent = port->dev.parent; 1070 1071 sysfs_remove_link(&port->dev.kobj, dev_name(parent)); 1072 port->is_backlink = 0; 1073 } 1074 1075 transport_remove_device(dev); 1076 device_del(dev); 1077 transport_destroy_device(dev); 1078 put_device(dev); 1079 } 1080 EXPORT_SYMBOL(sas_port_delete); 1081 1082 /** 1083 * scsi_is_sas_port - check if a struct device represents a SAS port 1084 * @dev: device to check 1085 * 1086 * Returns: 1087 * %1 if the device represents a SAS Port, %0 else 1088 */ 1089 int scsi_is_sas_port(const struct device *dev) 1090 { 1091 return dev->release == sas_port_release; 1092 } 1093 EXPORT_SYMBOL(scsi_is_sas_port); 1094 1095 /** 1096 * sas_port_get_phy - try to take a reference on a port member 1097 * @port: port to check 1098 */ 1099 struct sas_phy *sas_port_get_phy(struct sas_port *port) 1100 { 1101 struct sas_phy *phy; 1102 1103 mutex_lock(&port->phy_list_mutex); 1104 if (list_empty(&port->phy_list)) 1105 phy = NULL; 1106 else { 1107 struct list_head *ent = port->phy_list.next; 1108 1109 phy = list_entry(ent, typeof(*phy), port_siblings); 1110 get_device(&phy->dev); 1111 } 1112 mutex_unlock(&port->phy_list_mutex); 1113 1114 return phy; 1115 } 1116 EXPORT_SYMBOL(sas_port_get_phy); 1117 1118 /** 1119 * sas_port_add_phy - add another phy to a port to form a wide port 1120 * @port: port to add the phy to 1121 * @phy: phy to add 1122 * 1123 * When a port is initially created, it is empty (has no phys). All 1124 * ports must have at least one phy to operated, and all wide ports 1125 * must have at least two. The current code makes no difference 1126 * between ports and wide ports, but the only object that can be 1127 * connected to a remote device is a port, so ports must be formed on 1128 * all devices with phys if they're connected to anything. 1129 */ 1130 void sas_port_add_phy(struct sas_port *port, struct sas_phy *phy) 1131 { 1132 mutex_lock(&port->phy_list_mutex); 1133 if (unlikely(!list_empty(&phy->port_siblings))) { 1134 /* make sure we're already on this port */ 1135 struct sas_phy *tmp; 1136 1137 list_for_each_entry(tmp, &port->phy_list, port_siblings) 1138 if (tmp == phy) 1139 break; 1140 /* If this trips, you added a phy that was already 1141 * part of a different port */ 1142 if (unlikely(tmp != phy)) { 1143 dev_printk(KERN_ERR, &port->dev, "trying to add phy %s fails: it's already part of another port\n", 1144 dev_name(&phy->dev)); 1145 BUG(); 1146 } 1147 } else { 1148 sas_port_create_link(port, phy); 1149 list_add_tail(&phy->port_siblings, &port->phy_list); 1150 port->num_phys++; 1151 } 1152 mutex_unlock(&port->phy_list_mutex); 1153 } 1154 EXPORT_SYMBOL(sas_port_add_phy); 1155 1156 /** 1157 * sas_port_delete_phy - remove a phy from a port or wide port 1158 * @port: port to remove the phy from 1159 * @phy: phy to remove 1160 * 1161 * This operation is used for tearing down ports again. It must be 1162 * done to every port or wide port before calling sas_port_delete. 1163 */ 1164 void sas_port_delete_phy(struct sas_port *port, struct sas_phy *phy) 1165 { 1166 mutex_lock(&port->phy_list_mutex); 1167 sas_port_delete_link(port, phy); 1168 list_del_init(&phy->port_siblings); 1169 port->num_phys--; 1170 mutex_unlock(&port->phy_list_mutex); 1171 } 1172 EXPORT_SYMBOL(sas_port_delete_phy); 1173 1174 void sas_port_mark_backlink(struct sas_port *port) 1175 { 1176 int res; 1177 struct device *parent = port->dev.parent->parent->parent; 1178 1179 if (port->is_backlink) 1180 return; 1181 port->is_backlink = 1; 1182 res = sysfs_create_link(&port->dev.kobj, &parent->kobj, 1183 dev_name(parent)); 1184 if (res) 1185 goto err; 1186 return; 1187 err: 1188 printk(KERN_ERR "%s: Cannot create port backlink, err=%d\n", 1189 __func__, res); 1190 1191 } 1192 EXPORT_SYMBOL(sas_port_mark_backlink); 1193 1194 /* 1195 * SAS remote PHY attributes. 1196 */ 1197 1198 #define sas_rphy_show_simple(field, name, format_string, cast) \ 1199 static ssize_t \ 1200 show_sas_rphy_##name(struct device *dev, \ 1201 struct device_attribute *attr, char *buf) \ 1202 { \ 1203 struct sas_rphy *rphy = transport_class_to_rphy(dev); \ 1204 \ 1205 return snprintf(buf, 20, format_string, cast rphy->field); \ 1206 } 1207 1208 #define sas_rphy_simple_attr(field, name, format_string, type) \ 1209 sas_rphy_show_simple(field, name, format_string, (type)) \ 1210 static SAS_DEVICE_ATTR(rphy, name, S_IRUGO, \ 1211 show_sas_rphy_##name, NULL) 1212 1213 #define sas_rphy_show_protocol(field, name) \ 1214 static ssize_t \ 1215 show_sas_rphy_##name(struct device *dev, \ 1216 struct device_attribute *attr, char *buf) \ 1217 { \ 1218 struct sas_rphy *rphy = transport_class_to_rphy(dev); \ 1219 \ 1220 if (!rphy->field) \ 1221 return snprintf(buf, 20, "none\n"); \ 1222 return get_sas_protocol_names(rphy->field, buf); \ 1223 } 1224 1225 #define sas_rphy_protocol_attr(field, name) \ 1226 sas_rphy_show_protocol(field, name) \ 1227 static SAS_DEVICE_ATTR(rphy, name, S_IRUGO, \ 1228 show_sas_rphy_##name, NULL) 1229 1230 static ssize_t 1231 show_sas_rphy_device_type(struct device *dev, 1232 struct device_attribute *attr, char *buf) 1233 { 1234 struct sas_rphy *rphy = transport_class_to_rphy(dev); 1235 1236 if (!rphy->identify.device_type) 1237 return snprintf(buf, 20, "none\n"); 1238 return get_sas_device_type_names( 1239 rphy->identify.device_type, buf); 1240 } 1241 1242 static SAS_DEVICE_ATTR(rphy, device_type, S_IRUGO, 1243 show_sas_rphy_device_type, NULL); 1244 1245 static ssize_t 1246 show_sas_rphy_enclosure_identifier(struct device *dev, 1247 struct device_attribute *attr, char *buf) 1248 { 1249 struct sas_rphy *rphy = transport_class_to_rphy(dev); 1250 struct sas_phy *phy = dev_to_phy(rphy->dev.parent); 1251 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 1252 struct sas_internal *i = to_sas_internal(shost->transportt); 1253 u64 identifier; 1254 int error; 1255 1256 error = i->f->get_enclosure_identifier(rphy, &identifier); 1257 if (error) 1258 return error; 1259 return sprintf(buf, "0x%llx\n", (unsigned long long)identifier); 1260 } 1261 1262 static SAS_DEVICE_ATTR(rphy, enclosure_identifier, S_IRUGO, 1263 show_sas_rphy_enclosure_identifier, NULL); 1264 1265 static ssize_t 1266 show_sas_rphy_bay_identifier(struct device *dev, 1267 struct device_attribute *attr, char *buf) 1268 { 1269 struct sas_rphy *rphy = transport_class_to_rphy(dev); 1270 struct sas_phy *phy = dev_to_phy(rphy->dev.parent); 1271 struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); 1272 struct sas_internal *i = to_sas_internal(shost->transportt); 1273 int val; 1274 1275 val = i->f->get_bay_identifier(rphy); 1276 if (val < 0) 1277 return val; 1278 return sprintf(buf, "%d\n", val); 1279 } 1280 1281 static SAS_DEVICE_ATTR(rphy, bay_identifier, S_IRUGO, 1282 show_sas_rphy_bay_identifier, NULL); 1283 1284 sas_rphy_protocol_attr(identify.initiator_port_protocols, 1285 initiator_port_protocols); 1286 sas_rphy_protocol_attr(identify.target_port_protocols, target_port_protocols); 1287 sas_rphy_simple_attr(identify.sas_address, sas_address, "0x%016llx\n", 1288 unsigned long long); 1289 sas_rphy_simple_attr(identify.phy_identifier, phy_identifier, "%d\n", u8); 1290 sas_rphy_simple_attr(scsi_target_id, scsi_target_id, "%d\n", u32); 1291 1292 /* only need 8 bytes of data plus header (4 or 8) */ 1293 #define BUF_SIZE 64 1294 1295 int sas_read_port_mode_page(struct scsi_device *sdev) 1296 { 1297 char *buffer = kzalloc(BUF_SIZE, GFP_KERNEL), *msdata; 1298 struct sas_end_device *rdev = sas_sdev_to_rdev(sdev); 1299 struct scsi_mode_data mode_data; 1300 int res, error; 1301 1302 if (!buffer) 1303 return -ENOMEM; 1304 1305 res = scsi_mode_sense(sdev, 1, 0x19, buffer, BUF_SIZE, 30*HZ, 3, 1306 &mode_data, NULL); 1307 1308 error = -EINVAL; 1309 if (!scsi_status_is_good(res)) 1310 goto out; 1311 1312 msdata = buffer + mode_data.header_length + 1313 mode_data.block_descriptor_length; 1314 1315 if (msdata - buffer > BUF_SIZE - 8) 1316 goto out; 1317 1318 error = 0; 1319 1320 rdev->ready_led_meaning = msdata[2] & 0x10 ? 1 : 0; 1321 rdev->I_T_nexus_loss_timeout = (msdata[4] << 8) + msdata[5]; 1322 rdev->initiator_response_timeout = (msdata[6] << 8) + msdata[7]; 1323 1324 out: 1325 kfree(buffer); 1326 return error; 1327 } 1328 EXPORT_SYMBOL(sas_read_port_mode_page); 1329 1330 static DECLARE_TRANSPORT_CLASS(sas_end_dev_class, 1331 "sas_end_device", NULL, NULL, NULL); 1332 1333 #define sas_end_dev_show_simple(field, name, format_string, cast) \ 1334 static ssize_t \ 1335 show_sas_end_dev_##name(struct device *dev, \ 1336 struct device_attribute *attr, char *buf) \ 1337 { \ 1338 struct sas_rphy *rphy = transport_class_to_rphy(dev); \ 1339 struct sas_end_device *rdev = rphy_to_end_device(rphy); \ 1340 \ 1341 return snprintf(buf, 20, format_string, cast rdev->field); \ 1342 } 1343 1344 #define sas_end_dev_simple_attr(field, name, format_string, type) \ 1345 sas_end_dev_show_simple(field, name, format_string, (type)) \ 1346 static SAS_DEVICE_ATTR(end_dev, name, S_IRUGO, \ 1347 show_sas_end_dev_##name, NULL) 1348 1349 sas_end_dev_simple_attr(ready_led_meaning, ready_led_meaning, "%d\n", int); 1350 sas_end_dev_simple_attr(I_T_nexus_loss_timeout, I_T_nexus_loss_timeout, 1351 "%d\n", int); 1352 sas_end_dev_simple_attr(initiator_response_timeout, initiator_response_timeout, 1353 "%d\n", int); 1354 sas_end_dev_simple_attr(tlr_supported, tlr_supported, 1355 "%d\n", int); 1356 sas_end_dev_simple_attr(tlr_enabled, tlr_enabled, 1357 "%d\n", int); 1358 1359 static DECLARE_TRANSPORT_CLASS(sas_expander_class, 1360 "sas_expander", NULL, NULL, NULL); 1361 1362 #define sas_expander_show_simple(field, name, format_string, cast) \ 1363 static ssize_t \ 1364 show_sas_expander_##name(struct device *dev, \ 1365 struct device_attribute *attr, char *buf) \ 1366 { \ 1367 struct sas_rphy *rphy = transport_class_to_rphy(dev); \ 1368 struct sas_expander_device *edev = rphy_to_expander_device(rphy); \ 1369 \ 1370 return snprintf(buf, 20, format_string, cast edev->field); \ 1371 } 1372 1373 #define sas_expander_simple_attr(field, name, format_string, type) \ 1374 sas_expander_show_simple(field, name, format_string, (type)) \ 1375 static SAS_DEVICE_ATTR(expander, name, S_IRUGO, \ 1376 show_sas_expander_##name, NULL) 1377 1378 sas_expander_simple_attr(vendor_id, vendor_id, "%s\n", char *); 1379 sas_expander_simple_attr(product_id, product_id, "%s\n", char *); 1380 sas_expander_simple_attr(product_rev, product_rev, "%s\n", char *); 1381 sas_expander_simple_attr(component_vendor_id, component_vendor_id, 1382 "%s\n", char *); 1383 sas_expander_simple_attr(component_id, component_id, "%u\n", unsigned int); 1384 sas_expander_simple_attr(component_revision_id, component_revision_id, "%u\n", 1385 unsigned int); 1386 sas_expander_simple_attr(level, level, "%d\n", int); 1387 1388 static DECLARE_TRANSPORT_CLASS(sas_rphy_class, 1389 "sas_device", NULL, NULL, NULL); 1390 1391 static int sas_rphy_match(struct attribute_container *cont, struct device *dev) 1392 { 1393 struct Scsi_Host *shost; 1394 struct sas_internal *i; 1395 1396 if (!scsi_is_sas_rphy(dev)) 1397 return 0; 1398 shost = dev_to_shost(dev->parent->parent); 1399 1400 if (!shost->transportt) 1401 return 0; 1402 if (shost->transportt->host_attrs.ac.class != 1403 &sas_host_class.class) 1404 return 0; 1405 1406 i = to_sas_internal(shost->transportt); 1407 return &i->rphy_attr_cont.ac == cont; 1408 } 1409 1410 static int sas_end_dev_match(struct attribute_container *cont, 1411 struct device *dev) 1412 { 1413 struct Scsi_Host *shost; 1414 struct sas_internal *i; 1415 struct sas_rphy *rphy; 1416 1417 if (!scsi_is_sas_rphy(dev)) 1418 return 0; 1419 shost = dev_to_shost(dev->parent->parent); 1420 rphy = dev_to_rphy(dev); 1421 1422 if (!shost->transportt) 1423 return 0; 1424 if (shost->transportt->host_attrs.ac.class != 1425 &sas_host_class.class) 1426 return 0; 1427 1428 i = to_sas_internal(shost->transportt); 1429 return &i->end_dev_attr_cont.ac == cont && 1430 rphy->identify.device_type == SAS_END_DEVICE; 1431 } 1432 1433 static int sas_expander_match(struct attribute_container *cont, 1434 struct device *dev) 1435 { 1436 struct Scsi_Host *shost; 1437 struct sas_internal *i; 1438 struct sas_rphy *rphy; 1439 1440 if (!scsi_is_sas_rphy(dev)) 1441 return 0; 1442 shost = dev_to_shost(dev->parent->parent); 1443 rphy = dev_to_rphy(dev); 1444 1445 if (!shost->transportt) 1446 return 0; 1447 if (shost->transportt->host_attrs.ac.class != 1448 &sas_host_class.class) 1449 return 0; 1450 1451 i = to_sas_internal(shost->transportt); 1452 return &i->expander_attr_cont.ac == cont && 1453 (rphy->identify.device_type == SAS_EDGE_EXPANDER_DEVICE || 1454 rphy->identify.device_type == SAS_FANOUT_EXPANDER_DEVICE); 1455 } 1456 1457 static void sas_expander_release(struct device *dev) 1458 { 1459 struct sas_rphy *rphy = dev_to_rphy(dev); 1460 struct sas_expander_device *edev = rphy_to_expander_device(rphy); 1461 1462 if (rphy->q) 1463 blk_cleanup_queue(rphy->q); 1464 1465 put_device(dev->parent); 1466 kfree(edev); 1467 } 1468 1469 static void sas_end_device_release(struct device *dev) 1470 { 1471 struct sas_rphy *rphy = dev_to_rphy(dev); 1472 struct sas_end_device *edev = rphy_to_end_device(rphy); 1473 1474 if (rphy->q) 1475 blk_cleanup_queue(rphy->q); 1476 1477 put_device(dev->parent); 1478 kfree(edev); 1479 } 1480 1481 /** 1482 * sas_rphy_initialize - common rphy initialization 1483 * @rphy: rphy to initialise 1484 * 1485 * Used by both sas_end_device_alloc() and sas_expander_alloc() to 1486 * initialise the common rphy component of each. 1487 */ 1488 static void sas_rphy_initialize(struct sas_rphy *rphy) 1489 { 1490 INIT_LIST_HEAD(&rphy->list); 1491 } 1492 1493 /** 1494 * sas_end_device_alloc - allocate an rphy for an end device 1495 * @parent: which port 1496 * 1497 * Allocates an SAS remote PHY structure, connected to @parent. 1498 * 1499 * Returns: 1500 * SAS PHY allocated or %NULL if the allocation failed. 1501 */ 1502 struct sas_rphy *sas_end_device_alloc(struct sas_port *parent) 1503 { 1504 struct Scsi_Host *shost = dev_to_shost(&parent->dev); 1505 struct sas_end_device *rdev; 1506 1507 rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); 1508 if (!rdev) { 1509 return NULL; 1510 } 1511 1512 device_initialize(&rdev->rphy.dev); 1513 rdev->rphy.dev.parent = get_device(&parent->dev); 1514 rdev->rphy.dev.release = sas_end_device_release; 1515 if (scsi_is_sas_expander_device(parent->dev.parent)) { 1516 struct sas_rphy *rphy = dev_to_rphy(parent->dev.parent); 1517 dev_set_name(&rdev->rphy.dev, "end_device-%d:%d:%d", 1518 shost->host_no, rphy->scsi_target_id, 1519 parent->port_identifier); 1520 } else 1521 dev_set_name(&rdev->rphy.dev, "end_device-%d:%d", 1522 shost->host_no, parent->port_identifier); 1523 rdev->rphy.identify.device_type = SAS_END_DEVICE; 1524 sas_rphy_initialize(&rdev->rphy); 1525 transport_setup_device(&rdev->rphy.dev); 1526 1527 return &rdev->rphy; 1528 } 1529 EXPORT_SYMBOL(sas_end_device_alloc); 1530 1531 /** 1532 * sas_expander_alloc - allocate an rphy for an end device 1533 * @parent: which port 1534 * @type: SAS_EDGE_EXPANDER_DEVICE or SAS_FANOUT_EXPANDER_DEVICE 1535 * 1536 * Allocates an SAS remote PHY structure, connected to @parent. 1537 * 1538 * Returns: 1539 * SAS PHY allocated or %NULL if the allocation failed. 1540 */ 1541 struct sas_rphy *sas_expander_alloc(struct sas_port *parent, 1542 enum sas_device_type type) 1543 { 1544 struct Scsi_Host *shost = dev_to_shost(&parent->dev); 1545 struct sas_expander_device *rdev; 1546 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 1547 1548 BUG_ON(type != SAS_EDGE_EXPANDER_DEVICE && 1549 type != SAS_FANOUT_EXPANDER_DEVICE); 1550 1551 rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); 1552 if (!rdev) { 1553 return NULL; 1554 } 1555 1556 device_initialize(&rdev->rphy.dev); 1557 rdev->rphy.dev.parent = get_device(&parent->dev); 1558 rdev->rphy.dev.release = sas_expander_release; 1559 mutex_lock(&sas_host->lock); 1560 rdev->rphy.scsi_target_id = sas_host->next_expander_id++; 1561 mutex_unlock(&sas_host->lock); 1562 dev_set_name(&rdev->rphy.dev, "expander-%d:%d", 1563 shost->host_no, rdev->rphy.scsi_target_id); 1564 rdev->rphy.identify.device_type = type; 1565 sas_rphy_initialize(&rdev->rphy); 1566 transport_setup_device(&rdev->rphy.dev); 1567 1568 return &rdev->rphy; 1569 } 1570 EXPORT_SYMBOL(sas_expander_alloc); 1571 1572 /** 1573 * sas_rphy_add - add a SAS remote PHY to the device hierarchy 1574 * @rphy: The remote PHY to be added 1575 * 1576 * Publishes a SAS remote PHY to the rest of the system. 1577 */ 1578 int sas_rphy_add(struct sas_rphy *rphy) 1579 { 1580 struct sas_port *parent = dev_to_sas_port(rphy->dev.parent); 1581 struct Scsi_Host *shost = dev_to_shost(parent->dev.parent); 1582 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 1583 struct sas_identify *identify = &rphy->identify; 1584 int error; 1585 1586 if (parent->rphy) 1587 return -ENXIO; 1588 parent->rphy = rphy; 1589 1590 error = device_add(&rphy->dev); 1591 if (error) 1592 return error; 1593 transport_add_device(&rphy->dev); 1594 transport_configure_device(&rphy->dev); 1595 if (sas_bsg_initialize(shost, rphy)) 1596 printk("fail to a bsg device %s\n", dev_name(&rphy->dev)); 1597 1598 1599 mutex_lock(&sas_host->lock); 1600 list_add_tail(&rphy->list, &sas_host->rphy_list); 1601 if (identify->device_type == SAS_END_DEVICE && 1602 (identify->target_port_protocols & 1603 (SAS_PROTOCOL_SSP|SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA))) 1604 rphy->scsi_target_id = sas_host->next_target_id++; 1605 else if (identify->device_type == SAS_END_DEVICE) 1606 rphy->scsi_target_id = -1; 1607 mutex_unlock(&sas_host->lock); 1608 1609 if (identify->device_type == SAS_END_DEVICE && 1610 rphy->scsi_target_id != -1) { 1611 int lun; 1612 1613 if (identify->target_port_protocols & SAS_PROTOCOL_SSP) 1614 lun = SCAN_WILD_CARD; 1615 else 1616 lun = 0; 1617 1618 scsi_scan_target(&rphy->dev, 0, rphy->scsi_target_id, lun, 1619 SCSI_SCAN_INITIAL); 1620 } 1621 1622 return 0; 1623 } 1624 EXPORT_SYMBOL(sas_rphy_add); 1625 1626 /** 1627 * sas_rphy_free - free a SAS remote PHY 1628 * @rphy: SAS remote PHY to free 1629 * 1630 * Frees the specified SAS remote PHY. 1631 * 1632 * Note: 1633 * This function must only be called on a remote 1634 * PHY that has not successfully been added using 1635 * sas_rphy_add() (or has been sas_rphy_remove()'d) 1636 */ 1637 void sas_rphy_free(struct sas_rphy *rphy) 1638 { 1639 struct device *dev = &rphy->dev; 1640 struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); 1641 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 1642 1643 mutex_lock(&sas_host->lock); 1644 list_del(&rphy->list); 1645 mutex_unlock(&sas_host->lock); 1646 1647 transport_destroy_device(dev); 1648 1649 put_device(dev); 1650 } 1651 EXPORT_SYMBOL(sas_rphy_free); 1652 1653 /** 1654 * sas_rphy_delete - remove and free SAS remote PHY 1655 * @rphy: SAS remote PHY to remove and free 1656 * 1657 * Removes the specified SAS remote PHY and frees it. 1658 */ 1659 void 1660 sas_rphy_delete(struct sas_rphy *rphy) 1661 { 1662 sas_rphy_remove(rphy); 1663 sas_rphy_free(rphy); 1664 } 1665 EXPORT_SYMBOL(sas_rphy_delete); 1666 1667 /** 1668 * sas_rphy_unlink - unlink SAS remote PHY 1669 * @rphy: SAS remote phy to unlink from its parent port 1670 * 1671 * Removes port reference to an rphy 1672 */ 1673 void sas_rphy_unlink(struct sas_rphy *rphy) 1674 { 1675 struct sas_port *parent = dev_to_sas_port(rphy->dev.parent); 1676 1677 parent->rphy = NULL; 1678 } 1679 EXPORT_SYMBOL(sas_rphy_unlink); 1680 1681 /** 1682 * sas_rphy_remove - remove SAS remote PHY 1683 * @rphy: SAS remote phy to remove 1684 * 1685 * Removes the specified SAS remote PHY. 1686 */ 1687 void 1688 sas_rphy_remove(struct sas_rphy *rphy) 1689 { 1690 struct device *dev = &rphy->dev; 1691 1692 switch (rphy->identify.device_type) { 1693 case SAS_END_DEVICE: 1694 scsi_remove_target(dev); 1695 break; 1696 case SAS_EDGE_EXPANDER_DEVICE: 1697 case SAS_FANOUT_EXPANDER_DEVICE: 1698 sas_remove_children(dev); 1699 break; 1700 default: 1701 break; 1702 } 1703 1704 sas_rphy_unlink(rphy); 1705 sas_bsg_remove(NULL, rphy); 1706 transport_remove_device(dev); 1707 device_del(dev); 1708 } 1709 EXPORT_SYMBOL(sas_rphy_remove); 1710 1711 /** 1712 * scsi_is_sas_rphy - check if a struct device represents a SAS remote PHY 1713 * @dev: device to check 1714 * 1715 * Returns: 1716 * %1 if the device represents a SAS remote PHY, %0 else 1717 */ 1718 int scsi_is_sas_rphy(const struct device *dev) 1719 { 1720 return dev->release == sas_end_device_release || 1721 dev->release == sas_expander_release; 1722 } 1723 EXPORT_SYMBOL(scsi_is_sas_rphy); 1724 1725 1726 /* 1727 * SCSI scan helper 1728 */ 1729 1730 static int sas_user_scan(struct Scsi_Host *shost, uint channel, 1731 uint id, u64 lun) 1732 { 1733 struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 1734 struct sas_rphy *rphy; 1735 1736 mutex_lock(&sas_host->lock); 1737 list_for_each_entry(rphy, &sas_host->rphy_list, list) { 1738 if (rphy->identify.device_type != SAS_END_DEVICE || 1739 rphy->scsi_target_id == -1) 1740 continue; 1741 1742 if ((channel == SCAN_WILD_CARD || channel == 0) && 1743 (id == SCAN_WILD_CARD || id == rphy->scsi_target_id)) { 1744 scsi_scan_target(&rphy->dev, 0, rphy->scsi_target_id, 1745 lun, SCSI_SCAN_MANUAL); 1746 } 1747 } 1748 mutex_unlock(&sas_host->lock); 1749 1750 return 0; 1751 } 1752 1753 1754 /* 1755 * Setup / Teardown code 1756 */ 1757 1758 #define SETUP_TEMPLATE(attrb, field, perm, test) \ 1759 i->private_##attrb[count] = dev_attr_##field; \ 1760 i->private_##attrb[count].attr.mode = perm; \ 1761 i->attrb[count] = &i->private_##attrb[count]; \ 1762 if (test) \ 1763 count++ 1764 1765 #define SETUP_TEMPLATE_RW(attrb, field, perm, test, ro_test, ro_perm) \ 1766 i->private_##attrb[count] = dev_attr_##field; \ 1767 i->private_##attrb[count].attr.mode = perm; \ 1768 if (ro_test) { \ 1769 i->private_##attrb[count].attr.mode = ro_perm; \ 1770 i->private_##attrb[count].store = NULL; \ 1771 } \ 1772 i->attrb[count] = &i->private_##attrb[count]; \ 1773 if (test) \ 1774 count++ 1775 1776 #define SETUP_RPORT_ATTRIBUTE(field) \ 1777 SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, 1) 1778 1779 #define SETUP_OPTIONAL_RPORT_ATTRIBUTE(field, func) \ 1780 SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, i->f->func) 1781 1782 #define SETUP_PHY_ATTRIBUTE(field) \ 1783 SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, 1) 1784 1785 #define SETUP_PHY_ATTRIBUTE_RW(field) \ 1786 SETUP_TEMPLATE_RW(phy_attrs, field, S_IRUGO | S_IWUSR, 1, \ 1787 !i->f->set_phy_speed, S_IRUGO) 1788 1789 #define SETUP_OPTIONAL_PHY_ATTRIBUTE_RW(field, func) \ 1790 SETUP_TEMPLATE_RW(phy_attrs, field, S_IRUGO | S_IWUSR, 1, \ 1791 !i->f->func, S_IRUGO) 1792 1793 #define SETUP_PORT_ATTRIBUTE(field) \ 1794 SETUP_TEMPLATE(port_attrs, field, S_IRUGO, 1) 1795 1796 #define SETUP_OPTIONAL_PHY_ATTRIBUTE(field, func) \ 1797 SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, i->f->func) 1798 1799 #define SETUP_PHY_ATTRIBUTE_WRONLY(field) \ 1800 SETUP_TEMPLATE(phy_attrs, field, S_IWUSR, 1) 1801 1802 #define SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(field, func) \ 1803 SETUP_TEMPLATE(phy_attrs, field, S_IWUSR, i->f->func) 1804 1805 #define SETUP_END_DEV_ATTRIBUTE(field) \ 1806 SETUP_TEMPLATE(end_dev_attrs, field, S_IRUGO, 1) 1807 1808 #define SETUP_EXPANDER_ATTRIBUTE(field) \ 1809 SETUP_TEMPLATE(expander_attrs, expander_##field, S_IRUGO, 1) 1810 1811 /** 1812 * sas_attach_transport - instantiate SAS transport template 1813 * @ft: SAS transport class function template 1814 */ 1815 struct scsi_transport_template * 1816 sas_attach_transport(struct sas_function_template *ft) 1817 { 1818 struct sas_internal *i; 1819 int count; 1820 1821 i = kzalloc(sizeof(struct sas_internal), GFP_KERNEL); 1822 if (!i) 1823 return NULL; 1824 1825 i->t.user_scan = sas_user_scan; 1826 1827 i->t.host_attrs.ac.attrs = &i->host_attrs[0]; 1828 i->t.host_attrs.ac.class = &sas_host_class.class; 1829 i->t.host_attrs.ac.match = sas_host_match; 1830 transport_container_register(&i->t.host_attrs); 1831 i->t.host_size = sizeof(struct sas_host_attrs); 1832 1833 i->phy_attr_cont.ac.class = &sas_phy_class.class; 1834 i->phy_attr_cont.ac.attrs = &i->phy_attrs[0]; 1835 i->phy_attr_cont.ac.match = sas_phy_match; 1836 transport_container_register(&i->phy_attr_cont); 1837 1838 i->port_attr_cont.ac.class = &sas_port_class.class; 1839 i->port_attr_cont.ac.attrs = &i->port_attrs[0]; 1840 i->port_attr_cont.ac.match = sas_port_match; 1841 transport_container_register(&i->port_attr_cont); 1842 1843 i->rphy_attr_cont.ac.class = &sas_rphy_class.class; 1844 i->rphy_attr_cont.ac.attrs = &i->rphy_attrs[0]; 1845 i->rphy_attr_cont.ac.match = sas_rphy_match; 1846 transport_container_register(&i->rphy_attr_cont); 1847 1848 i->end_dev_attr_cont.ac.class = &sas_end_dev_class.class; 1849 i->end_dev_attr_cont.ac.attrs = &i->end_dev_attrs[0]; 1850 i->end_dev_attr_cont.ac.match = sas_end_dev_match; 1851 transport_container_register(&i->end_dev_attr_cont); 1852 1853 i->expander_attr_cont.ac.class = &sas_expander_class.class; 1854 i->expander_attr_cont.ac.attrs = &i->expander_attrs[0]; 1855 i->expander_attr_cont.ac.match = sas_expander_match; 1856 transport_container_register(&i->expander_attr_cont); 1857 1858 i->f = ft; 1859 1860 count = 0; 1861 SETUP_PHY_ATTRIBUTE(initiator_port_protocols); 1862 SETUP_PHY_ATTRIBUTE(target_port_protocols); 1863 SETUP_PHY_ATTRIBUTE(device_type); 1864 SETUP_PHY_ATTRIBUTE(sas_address); 1865 SETUP_PHY_ATTRIBUTE(phy_identifier); 1866 //SETUP_PHY_ATTRIBUTE(port_identifier); 1867 SETUP_PHY_ATTRIBUTE(negotiated_linkrate); 1868 SETUP_PHY_ATTRIBUTE(minimum_linkrate_hw); 1869 SETUP_PHY_ATTRIBUTE_RW(minimum_linkrate); 1870 SETUP_PHY_ATTRIBUTE(maximum_linkrate_hw); 1871 SETUP_PHY_ATTRIBUTE_RW(maximum_linkrate); 1872 1873 SETUP_PHY_ATTRIBUTE(invalid_dword_count); 1874 SETUP_PHY_ATTRIBUTE(running_disparity_error_count); 1875 SETUP_PHY_ATTRIBUTE(loss_of_dword_sync_count); 1876 SETUP_PHY_ATTRIBUTE(phy_reset_problem_count); 1877 SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(link_reset, phy_reset); 1878 SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(hard_reset, phy_reset); 1879 SETUP_OPTIONAL_PHY_ATTRIBUTE_RW(enable, phy_enable); 1880 i->phy_attrs[count] = NULL; 1881 1882 count = 0; 1883 SETUP_PORT_ATTRIBUTE(num_phys); 1884 i->port_attrs[count] = NULL; 1885 1886 count = 0; 1887 SETUP_RPORT_ATTRIBUTE(rphy_initiator_port_protocols); 1888 SETUP_RPORT_ATTRIBUTE(rphy_target_port_protocols); 1889 SETUP_RPORT_ATTRIBUTE(rphy_device_type); 1890 SETUP_RPORT_ATTRIBUTE(rphy_sas_address); 1891 SETUP_RPORT_ATTRIBUTE(rphy_phy_identifier); 1892 SETUP_RPORT_ATTRIBUTE(rphy_scsi_target_id); 1893 SETUP_OPTIONAL_RPORT_ATTRIBUTE(rphy_enclosure_identifier, 1894 get_enclosure_identifier); 1895 SETUP_OPTIONAL_RPORT_ATTRIBUTE(rphy_bay_identifier, 1896 get_bay_identifier); 1897 i->rphy_attrs[count] = NULL; 1898 1899 count = 0; 1900 SETUP_END_DEV_ATTRIBUTE(end_dev_ready_led_meaning); 1901 SETUP_END_DEV_ATTRIBUTE(end_dev_I_T_nexus_loss_timeout); 1902 SETUP_END_DEV_ATTRIBUTE(end_dev_initiator_response_timeout); 1903 SETUP_END_DEV_ATTRIBUTE(end_dev_tlr_supported); 1904 SETUP_END_DEV_ATTRIBUTE(end_dev_tlr_enabled); 1905 i->end_dev_attrs[count] = NULL; 1906 1907 count = 0; 1908 SETUP_EXPANDER_ATTRIBUTE(vendor_id); 1909 SETUP_EXPANDER_ATTRIBUTE(product_id); 1910 SETUP_EXPANDER_ATTRIBUTE(product_rev); 1911 SETUP_EXPANDER_ATTRIBUTE(component_vendor_id); 1912 SETUP_EXPANDER_ATTRIBUTE(component_id); 1913 SETUP_EXPANDER_ATTRIBUTE(component_revision_id); 1914 SETUP_EXPANDER_ATTRIBUTE(level); 1915 i->expander_attrs[count] = NULL; 1916 1917 return &i->t; 1918 } 1919 EXPORT_SYMBOL(sas_attach_transport); 1920 1921 /** 1922 * sas_release_transport - release SAS transport template instance 1923 * @t: transport template instance 1924 */ 1925 void sas_release_transport(struct scsi_transport_template *t) 1926 { 1927 struct sas_internal *i = to_sas_internal(t); 1928 1929 transport_container_unregister(&i->t.host_attrs); 1930 transport_container_unregister(&i->phy_attr_cont); 1931 transport_container_unregister(&i->port_attr_cont); 1932 transport_container_unregister(&i->rphy_attr_cont); 1933 transport_container_unregister(&i->end_dev_attr_cont); 1934 transport_container_unregister(&i->expander_attr_cont); 1935 1936 kfree(i); 1937 } 1938 EXPORT_SYMBOL(sas_release_transport); 1939 1940 static __init int sas_transport_init(void) 1941 { 1942 int error; 1943 1944 error = transport_class_register(&sas_host_class); 1945 if (error) 1946 goto out; 1947 error = transport_class_register(&sas_phy_class); 1948 if (error) 1949 goto out_unregister_transport; 1950 error = transport_class_register(&sas_port_class); 1951 if (error) 1952 goto out_unregister_phy; 1953 error = transport_class_register(&sas_rphy_class); 1954 if (error) 1955 goto out_unregister_port; 1956 error = transport_class_register(&sas_end_dev_class); 1957 if (error) 1958 goto out_unregister_rphy; 1959 error = transport_class_register(&sas_expander_class); 1960 if (error) 1961 goto out_unregister_end_dev; 1962 1963 return 0; 1964 1965 out_unregister_end_dev: 1966 transport_class_unregister(&sas_end_dev_class); 1967 out_unregister_rphy: 1968 transport_class_unregister(&sas_rphy_class); 1969 out_unregister_port: 1970 transport_class_unregister(&sas_port_class); 1971 out_unregister_phy: 1972 transport_class_unregister(&sas_phy_class); 1973 out_unregister_transport: 1974 transport_class_unregister(&sas_host_class); 1975 out: 1976 return error; 1977 1978 } 1979 1980 static void __exit sas_transport_exit(void) 1981 { 1982 transport_class_unregister(&sas_host_class); 1983 transport_class_unregister(&sas_phy_class); 1984 transport_class_unregister(&sas_port_class); 1985 transport_class_unregister(&sas_rphy_class); 1986 transport_class_unregister(&sas_end_dev_class); 1987 transport_class_unregister(&sas_expander_class); 1988 } 1989 1990 MODULE_AUTHOR("Christoph Hellwig"); 1991 MODULE_DESCRIPTION("SAS Transport Attributes"); 1992 MODULE_LICENSE("GPL"); 1993 1994 module_init(sas_transport_init); 1995 module_exit(sas_transport_exit); 1996