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