Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
scsi_transport_sas.c
Go to the documentation of this file.
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_device.h>
37 #include <scsi/scsi_host.h>
38 #include <scsi/scsi_transport.h>
40 
41 #include "scsi_sas_internal.h"
44  struct mutex lock;
45  struct request_queue *q;
49 };
50 #define to_sas_host_attrs(host) ((struct sas_host_attrs *)(host)->shost_data)
51 
52 
53 /*
54  * Hack to allow attributes of the same name in different objects.
55  */
56 #define SAS_DEVICE_ATTR(_prefix,_name,_mode,_show,_store) \
57  struct device_attribute dev_attr_##_prefix##_##_name = \
58  __ATTR(_name,_mode,_show,_store)
59 
60 
61 /*
62  * Pretty printing helpers
63  */
64 
65 #define sas_bitfield_name_match(title, table) \
66 static ssize_t \
67 get_sas_##title##_names(u32 table_key, char *buf) \
68 { \
69  char *prefix = ""; \
70  ssize_t len = 0; \
71  int i; \
72  \
73  for (i = 0; i < ARRAY_SIZE(table); i++) { \
74  if (table[i].value & table_key) { \
75  len += sprintf(buf + len, "%s%s", \
76  prefix, table[i].name); \
77  prefix = ", "; \
78  } \
79  } \
80  len += sprintf(buf + len, "\n"); \
81  return len; \
82 }
83 
84 #define sas_bitfield_name_set(title, table) \
85 static ssize_t \
86 set_sas_##title##_names(u32 *table_key, const char *buf) \
87 { \
88  ssize_t len = 0; \
89  int i; \
90  \
91  for (i = 0; i < ARRAY_SIZE(table); i++) { \
92  len = strlen(table[i].name); \
93  if (strncmp(buf, table[i].name, len) == 0 && \
94  (buf[len] == '\n' || buf[len] == '\0')) { \
95  *table_key = table[i].value; \
96  return 0; \
97  } \
98  } \
99  return -EINVAL; \
100 }
101 
102 #define sas_bitfield_name_search(title, table) \
103 static ssize_t \
104 get_sas_##title##_names(u32 table_key, char *buf) \
105 { \
106  ssize_t len = 0; \
107  int i; \
108  \
109  for (i = 0; i < ARRAY_SIZE(table); i++) { \
110  if (table[i].value == table_key) { \
111  len += sprintf(buf + len, "%s", \
112  table[i].name); \
113  break; \
114  } \
115  } \
116  len += sprintf(buf + len, "\n"); \
117  return len; \
118 }
119 
120 static struct {
122  char *name;
123 } sas_device_type_names[] = {
124  { SAS_PHY_UNUSED, "unused" },
125  { SAS_END_DEVICE, "end device" },
126  { SAS_EDGE_EXPANDER_DEVICE, "edge expander" },
127  { SAS_FANOUT_EXPANDER_DEVICE, "fanout expander" },
128 };
129 sas_bitfield_name_search(device_type, sas_device_type_names)
130 
131 
132 static struct {
133  u32 value;
134  char *name;
136  { SAS_PROTOCOL_SATA, "sata" },
137  { SAS_PROTOCOL_SMP, "smp" },
138  { SAS_PROTOCOL_STP, "stp" },
139  { SAS_PROTOCOL_SSP, "ssp" },
140 };
142 
143 static struct {
144  u32 value;
145  char *name;
147  { SAS_LINK_RATE_UNKNOWN, "Unknown" },
148  { SAS_PHY_DISABLED, "Phy disabled" },
149  { SAS_LINK_RATE_FAILED, "Link Rate failed" },
150  { SAS_SATA_SPINUP_HOLD, "Spin-up hold" },
151  { SAS_LINK_RATE_1_5_GBPS, "1.5 Gbit" },
152  { SAS_LINK_RATE_3_0_GBPS, "3.0 Gbit" },
153  { SAS_LINK_RATE_6_0_GBPS, "6.0 Gbit" },
154 };
157 
158 static struct sas_end_device *sas_sdev_to_rdev(struct scsi_device *sdev)
159 {
160  struct sas_rphy *rphy = target_to_rphy(sdev->sdev_target);
161  struct sas_end_device *rdev;
162 
163  BUG_ON(rphy->identify.device_type != SAS_END_DEVICE);
164 
165  rdev = rphy_to_end_device(rphy);
166  return rdev;
167 }
168 
169 static void sas_smp_request(struct request_queue *q, struct Scsi_Host *shost,
170  struct sas_rphy *rphy)
171 {
172  struct request *req;
173  int ret;
174  int (*handler)(struct Scsi_Host *, struct sas_rphy *, struct request *);
175 
176  while ((req = blk_fetch_request(q)) != NULL) {
177  spin_unlock_irq(q->queue_lock);
178 
179  handler = to_sas_internal(shost->transportt)->f->smp_handler;
180  ret = handler(shost, rphy, req);
181  req->errors = ret;
182 
183  blk_end_request_all(req, ret);
184 
185  spin_lock_irq(q->queue_lock);
186  }
187 }
188 
189 static void sas_host_smp_request(struct request_queue *q)
190 {
191  sas_smp_request(q, (struct Scsi_Host *)q->queuedata, NULL);
192 }
193 
194 static void sas_non_host_smp_request(struct request_queue *q)
195 {
196  struct sas_rphy *rphy = q->queuedata;
197  sas_smp_request(q, rphy_to_shost(rphy), rphy);
198 }
199 
200 static void sas_host_release(struct device *dev)
201 {
202  struct Scsi_Host *shost = dev_to_shost(dev);
203  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
204  struct request_queue *q = sas_host->q;
205 
206  if (q)
208 }
209 
210 static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
211 {
212  struct request_queue *q;
213  int error;
214  struct device *dev;
215  char namebuf[20];
216  const char *name;
217  void (*release)(struct device *);
218 
219  if (!to_sas_internal(shost->transportt)->f->smp_handler) {
220  printk("%s can't handle SMP requests\n", shost->hostt->name);
221  return 0;
222  }
223 
224  if (rphy) {
225  q = blk_init_queue(sas_non_host_smp_request, NULL);
226  dev = &rphy->dev;
227  name = dev_name(dev);
228  release = NULL;
229  } else {
230  q = blk_init_queue(sas_host_smp_request, NULL);
231  dev = &shost->shost_gendev;
232  snprintf(namebuf, sizeof(namebuf),
233  "sas_host%d", shost->host_no);
234  name = namebuf;
235  release = sas_host_release;
236  }
237  if (!q)
238  return -ENOMEM;
239 
240  error = bsg_register_queue(q, dev, name, release);
241  if (error) {
243  return -ENOMEM;
244  }
245 
246  if (rphy)
247  rphy->q = q;
248  else
249  to_sas_host_attrs(shost)->q = q;
250 
251  if (rphy)
252  q->queuedata = rphy;
253  else
254  q->queuedata = shost;
255 
256  queue_flag_set_unlocked(QUEUE_FLAG_BIDI, q);
257  return 0;
258 }
259 
260 static void sas_bsg_remove(struct Scsi_Host *shost, struct sas_rphy *rphy)
261 {
262  struct request_queue *q;
263 
264  if (rphy)
265  q = rphy->q;
266  else
267  q = to_sas_host_attrs(shost)->q;
268 
269  if (!q)
270  return;
271 
273 }
274 
275 /*
276  * SAS host attributes
277  */
278 
279 static int sas_host_setup(struct transport_container *tc, struct device *dev,
280  struct device *cdev)
281 {
282  struct Scsi_Host *shost = dev_to_shost(dev);
283  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
284 
285  INIT_LIST_HEAD(&sas_host->rphy_list);
286  mutex_init(&sas_host->lock);
287  sas_host->next_target_id = 0;
288  sas_host->next_expander_id = 0;
289  sas_host->next_port_id = 0;
290 
291  if (sas_bsg_initialize(shost, NULL))
292  dev_printk(KERN_ERR, dev, "fail to a bsg device %d\n",
293  shost->host_no);
294 
295  return 0;
296 }
297 
298 static int sas_host_remove(struct transport_container *tc, struct device *dev,
299  struct device *cdev)
300 {
301  struct Scsi_Host *shost = dev_to_shost(dev);
302 
303  sas_bsg_remove(shost, NULL);
304 
305  return 0;
306 }
307 
308 static DECLARE_TRANSPORT_CLASS(sas_host_class,
309  "sas_host", sas_host_setup, sas_host_remove, NULL);
310 
311 static int sas_host_match(struct attribute_container *cont,
312  struct device *dev)
313 {
314  struct Scsi_Host *shost;
315  struct sas_internal *i;
316 
317  if (!scsi_is_host_device(dev))
318  return 0;
319  shost = dev_to_shost(dev);
320 
321  if (!shost->transportt)
322  return 0;
323  if (shost->transportt->host_attrs.ac.class !=
324  &sas_host_class.class)
325  return 0;
326 
327  i = to_sas_internal(shost->transportt);
328  return &i->t.host_attrs.ac == cont;
329 }
330 
331 static int do_sas_phy_delete(struct device *dev, void *data)
332 {
333  int pass = (int)(unsigned long)data;
334 
335  if (pass == 0 && scsi_is_sas_port(dev))
337  else if (pass == 1 && scsi_is_sas_phy(dev))
339  return 0;
340 }
341 
348 void sas_remove_children(struct device *dev)
349 {
350  device_for_each_child(dev, (void *)0, do_sas_phy_delete);
351  device_for_each_child(dev, (void *)1, do_sas_phy_delete);
352 }
354 
362 void sas_remove_host(struct Scsi_Host *shost)
363 {
364  sas_remove_children(&shost->shost_gendev);
365 }
367 
376 unsigned int
378 {
379  const int vpd_len = 32;
380  struct sas_end_device *rdev = sas_sdev_to_rdev(sdev);
381  char *buffer = kzalloc(vpd_len, GFP_KERNEL);
382  int ret = 0;
383 
384  if (scsi_get_vpd_page(sdev, 0x90, buffer, vpd_len))
385  goto out;
386 
387  /*
388  * Magic numbers: the VPD Protocol page (0x90)
389  * has a 4 byte header and then one entry per device port
390  * the TLR bit is at offset 8 on each port entry
391  * if we take the first port, that's at total offset 12
392  */
393  ret = buffer[12] & 0x01;
394 
395  out:
396  kfree(buffer);
397  rdev->tlr_supported = ret;
398  return ret;
399 
400 }
402 
410 void
412 {
413  struct sas_end_device *rdev = sas_sdev_to_rdev(sdev);
414 
415  rdev->tlr_enabled = 0;
416 }
418 
426 void sas_enable_tlr(struct scsi_device *sdev)
427 {
428  unsigned int tlr_supported = 0;
429  tlr_supported = sas_tlr_supported(sdev);
430 
431  if (tlr_supported) {
432  struct sas_end_device *rdev = sas_sdev_to_rdev(sdev);
433 
434  rdev->tlr_enabled = 1;
435  }
436 
437  return;
438 }
440 
441 unsigned int sas_is_tlr_enabled(struct scsi_device *sdev)
442 {
443  struct sas_end_device *rdev = sas_sdev_to_rdev(sdev);
444  return rdev->tlr_enabled;
445 }
447 
448 /*
449  * SAS Phy attributes
450  */
451 
452 #define sas_phy_show_simple(field, name, format_string, cast) \
453 static ssize_t \
454 show_sas_phy_##name(struct device *dev, \
455  struct device_attribute *attr, char *buf) \
456 { \
457  struct sas_phy *phy = transport_class_to_phy(dev); \
458  \
459  return snprintf(buf, 20, format_string, cast phy->field); \
460 }
461 
462 #define sas_phy_simple_attr(field, name, format_string, type) \
463  sas_phy_show_simple(field, name, format_string, (type)) \
464 static DEVICE_ATTR(name, S_IRUGO, show_sas_phy_##name, NULL)
465 
466 #define sas_phy_show_protocol(field, name) \
467 static ssize_t \
468 show_sas_phy_##name(struct device *dev, \
469  struct device_attribute *attr, char *buf) \
470 { \
471  struct sas_phy *phy = transport_class_to_phy(dev); \
472  \
473  if (!phy->field) \
474  return snprintf(buf, 20, "none\n"); \
475  return get_sas_protocol_names(phy->field, buf); \
476 }
477 
478 #define sas_phy_protocol_attr(field, name) \
479  sas_phy_show_protocol(field, name) \
480 static DEVICE_ATTR(name, S_IRUGO, show_sas_phy_##name, NULL)
481 
482 #define sas_phy_show_linkspeed(field) \
483 static ssize_t \
484 show_sas_phy_##field(struct device *dev, \
485  struct device_attribute *attr, char *buf) \
486 { \
487  struct sas_phy *phy = transport_class_to_phy(dev); \
488  \
489  return get_sas_linkspeed_names(phy->field, buf); \
490 }
491 
492 /* Fudge to tell if we're minimum or maximum */
493 #define sas_phy_store_linkspeed(field) \
494 static ssize_t \
495 store_sas_phy_##field(struct device *dev, \
496  struct device_attribute *attr, \
497  const char *buf, size_t count) \
498 { \
499  struct sas_phy *phy = transport_class_to_phy(dev); \
500  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); \
501  struct sas_internal *i = to_sas_internal(shost->transportt); \
502  u32 value; \
503  struct sas_phy_linkrates rates = {0}; \
504  int error; \
505  \
506  error = set_sas_linkspeed_names(&value, buf); \
507  if (error) \
508  return error; \
509  rates.field = value; \
510  error = i->f->set_phy_speed(phy, &rates); \
511  \
512  return error ? error : count; \
513 }
514 
515 #define sas_phy_linkspeed_rw_attr(field) \
516  sas_phy_show_linkspeed(field) \
517  sas_phy_store_linkspeed(field) \
518 static DEVICE_ATTR(field, S_IRUGO, show_sas_phy_##field, \
519  store_sas_phy_##field)
520 
521 #define sas_phy_linkspeed_attr(field) \
522  sas_phy_show_linkspeed(field) \
523 static DEVICE_ATTR(field, S_IRUGO, show_sas_phy_##field, NULL)
524 
525 
526 #define sas_phy_show_linkerror(field) \
527 static ssize_t \
528 show_sas_phy_##field(struct device *dev, \
529  struct device_attribute *attr, char *buf) \
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  int error; \
535  \
536  error = i->f->get_linkerrors ? i->f->get_linkerrors(phy) : 0; \
537  if (error) \
538  return error; \
539  return snprintf(buf, 20, "%u\n", phy->field); \
540 }
541 
542 #define sas_phy_linkerror_attr(field) \
543  sas_phy_show_linkerror(field) \
544 static DEVICE_ATTR(field, S_IRUGO, show_sas_phy_##field, NULL)
545 
546 
547 static ssize_t
548 show_sas_device_type(struct device *dev,
549  struct device_attribute *attr, char *buf)
550 {
551  struct sas_phy *phy = transport_class_to_phy(dev);
552 
553  if (!phy->identify.device_type)
554  return snprintf(buf, 20, "none\n");
555  return get_sas_device_type_names(phy->identify.device_type, buf);
556 }
557 static DEVICE_ATTR(device_type, S_IRUGO, show_sas_device_type, NULL);
558 
559 static ssize_t do_sas_phy_enable(struct device *dev,
560  size_t count, int enable)
561 {
562  struct sas_phy *phy = transport_class_to_phy(dev);
563  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
564  struct sas_internal *i = to_sas_internal(shost->transportt);
565  int error;
566 
567  error = i->f->phy_enable(phy, enable);
568  if (error)
569  return error;
570  phy->enabled = enable;
571  return count;
572 };
573 
574 static ssize_t
575 store_sas_phy_enable(struct device *dev, struct device_attribute *attr,
576  const char *buf, size_t count)
577 {
578  if (count < 1)
579  return -EINVAL;
580 
581  switch (buf[0]) {
582  case '0':
583  do_sas_phy_enable(dev, count, 0);
584  break;
585  case '1':
586  do_sas_phy_enable(dev, count, 1);
587  break;
588  default:
589  return -EINVAL;
590  }
591 
592  return count;
593 }
594 
595 static ssize_t
596 show_sas_phy_enable(struct device *dev, struct device_attribute *attr,
597  char *buf)
598 {
599  struct sas_phy *phy = transport_class_to_phy(dev);
600 
601  return snprintf(buf, 20, "%d", phy->enabled);
602 }
603 
604 static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, show_sas_phy_enable,
605  store_sas_phy_enable);
606 
607 static ssize_t
608 do_sas_phy_reset(struct device *dev, size_t count, int hard_reset)
609 {
610  struct sas_phy *phy = transport_class_to_phy(dev);
611  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
612  struct sas_internal *i = to_sas_internal(shost->transportt);
613  int error;
614 
615  error = i->f->phy_reset(phy, hard_reset);
616  if (error)
617  return error;
618  phy->enabled = 1;
619  return count;
620 };
621 
622 static ssize_t
623 store_sas_link_reset(struct device *dev, struct device_attribute *attr,
624  const char *buf, size_t count)
625 {
626  return do_sas_phy_reset(dev, count, 0);
627 }
628 static DEVICE_ATTR(link_reset, S_IWUSR, NULL, store_sas_link_reset);
629 
630 static ssize_t
631 store_sas_hard_reset(struct device *dev, struct device_attribute *attr,
632  const char *buf, size_t count)
633 {
634  return do_sas_phy_reset(dev, count, 1);
635 }
636 static DEVICE_ATTR(hard_reset, S_IWUSR, NULL, store_sas_hard_reset);
637 
638 sas_phy_protocol_attr(identify.initiator_port_protocols,
639  initiator_port_protocols);
640 sas_phy_protocol_attr(identify.target_port_protocols,
641  target_port_protocols);
642 sas_phy_simple_attr(identify.sas_address, sas_address, "0x%016llx\n",
643  unsigned long long);
644 sas_phy_simple_attr(identify.phy_identifier, phy_identifier, "%d\n", u8);
645 //sas_phy_simple_attr(port_identifier, port_identifier, "%d\n", int);
646 sas_phy_linkspeed_attr(negotiated_linkrate);
647 sas_phy_linkspeed_attr(minimum_linkrate_hw);
648 sas_phy_linkspeed_rw_attr(minimum_linkrate);
649 sas_phy_linkspeed_attr(maximum_linkrate_hw);
650 sas_phy_linkspeed_rw_attr(maximum_linkrate);
651 sas_phy_linkerror_attr(invalid_dword_count);
652 sas_phy_linkerror_attr(running_disparity_error_count);
653 sas_phy_linkerror_attr(loss_of_dword_sync_count);
654 sas_phy_linkerror_attr(phy_reset_problem_count);
655 
656 static int sas_phy_setup(struct transport_container *tc, struct device *dev,
657  struct device *cdev)
658 {
659  struct sas_phy *phy = dev_to_phy(dev);
660  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
661  struct sas_internal *i = to_sas_internal(shost->transportt);
662 
663  if (i->f->phy_setup)
664  i->f->phy_setup(phy);
665 
666  return 0;
667 }
668 
669 static DECLARE_TRANSPORT_CLASS(sas_phy_class,
670  "sas_phy", sas_phy_setup, NULL, NULL);
671 
672 static int sas_phy_match(struct attribute_container *cont, struct device *dev)
673 {
674  struct Scsi_Host *shost;
675  struct sas_internal *i;
676 
677  if (!scsi_is_sas_phy(dev))
678  return 0;
679  shost = dev_to_shost(dev->parent);
680 
681  if (!shost->transportt)
682  return 0;
683  if (shost->transportt->host_attrs.ac.class !=
684  &sas_host_class.class)
685  return 0;
686 
687  i = to_sas_internal(shost->transportt);
688  return &i->phy_attr_cont.ac == cont;
689 }
690 
691 static void sas_phy_release(struct device *dev)
692 {
693  struct sas_phy *phy = dev_to_phy(dev);
694  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
695  struct sas_internal *i = to_sas_internal(shost->transportt);
696 
697  if (i->f->phy_release)
698  i->f->phy_release(phy);
699  put_device(dev->parent);
700  kfree(phy);
701 }
702 
715 struct sas_phy *sas_phy_alloc(struct device *parent, int number)
716 {
717  struct Scsi_Host *shost = dev_to_shost(parent);
718  struct sas_phy *phy;
719 
720  phy = kzalloc(sizeof(*phy), GFP_KERNEL);
721  if (!phy)
722  return NULL;
723 
724  phy->number = number;
725  phy->enabled = 1;
726 
727  device_initialize(&phy->dev);
728  phy->dev.parent = get_device(parent);
729  phy->dev.release = sas_phy_release;
730  INIT_LIST_HEAD(&phy->port_siblings);
731  if (scsi_is_sas_expander_device(parent)) {
732  struct sas_rphy *rphy = dev_to_rphy(parent);
733  dev_set_name(&phy->dev, "phy-%d:%d:%d", shost->host_no,
734  rphy->scsi_target_id, number);
735  } else
736  dev_set_name(&phy->dev, "phy-%d:%d", shost->host_no, number);
737 
739 
740  return phy;
741 }
743 
750 int sas_phy_add(struct sas_phy *phy)
751 {
752  int error;
753 
754  error = device_add(&phy->dev);
755  if (!error) {
756  transport_add_device(&phy->dev);
758  }
759 
760  return error;
761 }
763 
774 void sas_phy_free(struct sas_phy *phy)
775 {
777  put_device(&phy->dev);
778 }
780 
788 void
790 {
791  struct device *dev = &phy->dev;
792 
793  /* this happens if the phy is still part of a port when deleted */
794  BUG_ON(!list_empty(&phy->port_siblings));
795 
797  device_del(dev);
799  put_device(dev);
800 }
802 
810 int scsi_is_sas_phy(const struct device *dev)
811 {
812  return dev->release == sas_phy_release;
813 }
815 
816 /*
817  * SAS Port attributes
818  */
819 #define sas_port_show_simple(field, name, format_string, cast) \
820 static ssize_t \
821 show_sas_port_##name(struct device *dev, \
822  struct device_attribute *attr, char *buf) \
823 { \
824  struct sas_port *port = transport_class_to_sas_port(dev); \
825  \
826  return snprintf(buf, 20, format_string, cast port->field); \
827 }
828 
829 #define sas_port_simple_attr(field, name, format_string, type) \
830  sas_port_show_simple(field, name, format_string, (type)) \
831 static DEVICE_ATTR(name, S_IRUGO, show_sas_port_##name, NULL)
832 
833 sas_port_simple_attr(num_phys, num_phys, "%d\n", int);
834 
835 static DECLARE_TRANSPORT_CLASS(sas_port_class,
836  "sas_port", NULL, NULL, NULL);
837 
838 static int sas_port_match(struct attribute_container *cont, struct device *dev)
839 {
840  struct Scsi_Host *shost;
841  struct sas_internal *i;
842 
843  if (!scsi_is_sas_port(dev))
844  return 0;
845  shost = dev_to_shost(dev->parent);
846 
847  if (!shost->transportt)
848  return 0;
849  if (shost->transportt->host_attrs.ac.class !=
850  &sas_host_class.class)
851  return 0;
852 
853  i = to_sas_internal(shost->transportt);
854  return &i->port_attr_cont.ac == cont;
855 }
856 
857 
858 static void sas_port_release(struct device *dev)
859 {
860  struct sas_port *port = dev_to_sas_port(dev);
861 
862  BUG_ON(!list_empty(&port->phy_list));
863 
864  put_device(dev->parent);
865  kfree(port);
866 }
867 
868 static void sas_port_create_link(struct sas_port *port,
869  struct sas_phy *phy)
870 {
871  int res;
872 
873  res = sysfs_create_link(&port->dev.kobj, &phy->dev.kobj,
874  dev_name(&phy->dev));
875  if (res)
876  goto err;
877  res = sysfs_create_link(&phy->dev.kobj, &port->dev.kobj, "port");
878  if (res)
879  goto err;
880  return;
881 err:
882  printk(KERN_ERR "%s: Cannot create port links, err=%d\n",
883  __func__, res);
884 }
885 
886 static void sas_port_delete_link(struct sas_port *port,
887  struct sas_phy *phy)
888 {
889  sysfs_remove_link(&port->dev.kobj, dev_name(&phy->dev));
890  sysfs_remove_link(&phy->dev.kobj, "port");
891 }
892 
904 struct sas_port *sas_port_alloc(struct device *parent, int port_id)
905 {
906  struct Scsi_Host *shost = dev_to_shost(parent);
907  struct sas_port *port;
908 
909  port = kzalloc(sizeof(*port), GFP_KERNEL);
910  if (!port)
911  return NULL;
912 
913  port->port_identifier = port_id;
914 
915  device_initialize(&port->dev);
916 
917  port->dev.parent = get_device(parent);
918  port->dev.release = sas_port_release;
919 
920  mutex_init(&port->phy_list_mutex);
921  INIT_LIST_HEAD(&port->phy_list);
922 
923  if (scsi_is_sas_expander_device(parent)) {
924  struct sas_rphy *rphy = dev_to_rphy(parent);
925  dev_set_name(&port->dev, "port-%d:%d:%d", shost->host_no,
926  rphy->scsi_target_id, port->port_identifier);
927  } else
928  dev_set_name(&port->dev, "port-%d:%d", shost->host_no,
929  port->port_identifier);
930 
931  transport_setup_device(&port->dev);
932 
933  return port;
934 }
936 
949 struct sas_port *sas_port_alloc_num(struct device *parent)
950 {
951  int index;
952  struct Scsi_Host *shost = dev_to_shost(parent);
953  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
954 
955  /* FIXME: use idr for this eventually */
956  mutex_lock(&sas_host->lock);
957  if (scsi_is_sas_expander_device(parent)) {
958  struct sas_rphy *rphy = dev_to_rphy(parent);
960 
961  index = exp->next_port_id++;
962  } else
963  index = sas_host->next_port_id++;
964  mutex_unlock(&sas_host->lock);
965  return sas_port_alloc(parent, index);
966 }
968 
975 int sas_port_add(struct sas_port *port)
976 {
977  int error;
978 
979  /* No phys should be added until this is made visible */
980  BUG_ON(!list_empty(&port->phy_list));
981 
982  error = device_add(&port->dev);
983 
984  if (error)
985  return error;
986 
987  transport_add_device(&port->dev);
989 
990  return 0;
991 }
993 
1004 void sas_port_free(struct sas_port *port)
1005 {
1006  transport_destroy_device(&port->dev);
1007  put_device(&port->dev);
1008 }
1010 
1018 void sas_port_delete(struct sas_port *port)
1019 {
1020  struct device *dev = &port->dev;
1021  struct sas_phy *phy, *tmp_phy;
1022 
1023  if (port->rphy) {
1024  sas_rphy_delete(port->rphy);
1025  port->rphy = NULL;
1026  }
1027 
1028  mutex_lock(&port->phy_list_mutex);
1029  list_for_each_entry_safe(phy, tmp_phy, &port->phy_list,
1030  port_siblings) {
1031  sas_port_delete_link(port, phy);
1032  list_del_init(&phy->port_siblings);
1033  }
1034  mutex_unlock(&port->phy_list_mutex);
1035 
1036  if (port->is_backlink) {
1037  struct device *parent = port->dev.parent;
1038 
1039  sysfs_remove_link(&port->dev.kobj, dev_name(parent));
1040  port->is_backlink = 0;
1041  }
1042 
1044  device_del(dev);
1046  put_device(dev);
1047 }
1049 
1057 int scsi_is_sas_port(const struct device *dev)
1058 {
1059  return dev->release == sas_port_release;
1060 }
1062 
1067 struct sas_phy *sas_port_get_phy(struct sas_port *port)
1068 {
1069  struct sas_phy *phy;
1070 
1071  mutex_lock(&port->phy_list_mutex);
1072  if (list_empty(&port->phy_list))
1073  phy = NULL;
1074  else {
1075  struct list_head *ent = port->phy_list.next;
1076 
1077  phy = list_entry(ent, typeof(*phy), port_siblings);
1078  get_device(&phy->dev);
1079  }
1080  mutex_unlock(&port->phy_list_mutex);
1081 
1082  return phy;
1083 }
1085 
1098 void sas_port_add_phy(struct sas_port *port, struct sas_phy *phy)
1099 {
1100  mutex_lock(&port->phy_list_mutex);
1101  if (unlikely(!list_empty(&phy->port_siblings))) {
1102  /* make sure we're already on this port */
1103  struct sas_phy *tmp;
1104 
1106  if (tmp == phy)
1107  break;
1108  /* If this trips, you added a phy that was already
1109  * part of a different port */
1110  if (unlikely(tmp != phy)) {
1111  dev_printk(KERN_ERR, &port->dev, "trying to add phy %s fails: it's already part of another port\n",
1112  dev_name(&phy->dev));
1113  BUG();
1114  }
1115  } else {
1116  sas_port_create_link(port, phy);
1117  list_add_tail(&phy->port_siblings, &port->phy_list);
1118  port->num_phys++;
1119  }
1120  mutex_unlock(&port->phy_list_mutex);
1121 }
1123 
1132 void sas_port_delete_phy(struct sas_port *port, struct sas_phy *phy)
1133 {
1134  mutex_lock(&port->phy_list_mutex);
1135  sas_port_delete_link(port, phy);
1136  list_del_init(&phy->port_siblings);
1137  port->num_phys--;
1138  mutex_unlock(&port->phy_list_mutex);
1139 }
1141 
1143 {
1144  int res;
1145  struct device *parent = port->dev.parent->parent->parent;
1146 
1147  if (port->is_backlink)
1148  return;
1149  port->is_backlink = 1;
1150  res = sysfs_create_link(&port->dev.kobj, &parent->kobj,
1151  dev_name(parent));
1152  if (res)
1153  goto err;
1154  return;
1155 err:
1156  printk(KERN_ERR "%s: Cannot create port backlink, err=%d\n",
1157  __func__, res);
1158 
1159 }
1161 
1162 /*
1163  * SAS remote PHY attributes.
1164  */
1165 
1166 #define sas_rphy_show_simple(field, name, format_string, cast) \
1167 static ssize_t \
1168 show_sas_rphy_##name(struct device *dev, \
1169  struct device_attribute *attr, char *buf) \
1170 { \
1171  struct sas_rphy *rphy = transport_class_to_rphy(dev); \
1172  \
1173  return snprintf(buf, 20, format_string, cast rphy->field); \
1174 }
1175 
1176 #define sas_rphy_simple_attr(field, name, format_string, type) \
1177  sas_rphy_show_simple(field, name, format_string, (type)) \
1178 static SAS_DEVICE_ATTR(rphy, name, S_IRUGO, \
1179  show_sas_rphy_##name, NULL)
1180 
1181 #define sas_rphy_show_protocol(field, name) \
1182 static ssize_t \
1183 show_sas_rphy_##name(struct device *dev, \
1184  struct device_attribute *attr, char *buf) \
1185 { \
1186  struct sas_rphy *rphy = transport_class_to_rphy(dev); \
1187  \
1188  if (!rphy->field) \
1189  return snprintf(buf, 20, "none\n"); \
1190  return get_sas_protocol_names(rphy->field, buf); \
1191 }
1192 
1193 #define sas_rphy_protocol_attr(field, name) \
1194  sas_rphy_show_protocol(field, name) \
1195 static SAS_DEVICE_ATTR(rphy, name, S_IRUGO, \
1196  show_sas_rphy_##name, NULL)
1197 
1198 static ssize_t
1199 show_sas_rphy_device_type(struct device *dev,
1200  struct device_attribute *attr, char *buf)
1201 {
1202  struct sas_rphy *rphy = transport_class_to_rphy(dev);
1203 
1204  if (!rphy->identify.device_type)
1205  return snprintf(buf, 20, "none\n");
1206  return get_sas_device_type_names(
1207  rphy->identify.device_type, buf);
1208 }
1209 
1210 static SAS_DEVICE_ATTR(rphy, device_type, S_IRUGO,
1211  show_sas_rphy_device_type, NULL);
1212 
1213 static ssize_t
1214 show_sas_rphy_enclosure_identifier(struct device *dev,
1215  struct device_attribute *attr, char *buf)
1216 {
1217  struct sas_rphy *rphy = transport_class_to_rphy(dev);
1218  struct sas_phy *phy = dev_to_phy(rphy->dev.parent);
1219  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
1220  struct sas_internal *i = to_sas_internal(shost->transportt);
1221  u64 identifier;
1222  int error;
1223 
1224  /*
1225  * Only devices behind an expander are supported, because the
1226  * enclosure identifier is a SMP feature.
1227  */
1228  if (scsi_is_sas_phy_local(phy))
1229  return -EINVAL;
1230 
1231  error = i->f->get_enclosure_identifier(rphy, &identifier);
1232  if (error)
1233  return error;
1234  return sprintf(buf, "0x%llx\n", (unsigned long long)identifier);
1235 }
1236 
1237 static SAS_DEVICE_ATTR(rphy, enclosure_identifier, S_IRUGO,
1238  show_sas_rphy_enclosure_identifier, NULL);
1239 
1240 static ssize_t
1241 show_sas_rphy_bay_identifier(struct device *dev,
1242  struct device_attribute *attr, char *buf)
1243 {
1244  struct sas_rphy *rphy = transport_class_to_rphy(dev);
1245  struct sas_phy *phy = dev_to_phy(rphy->dev.parent);
1246  struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
1247  struct sas_internal *i = to_sas_internal(shost->transportt);
1248  int val;
1249 
1250  if (scsi_is_sas_phy_local(phy))
1251  return -EINVAL;
1252 
1253  val = i->f->get_bay_identifier(rphy);
1254  if (val < 0)
1255  return val;
1256  return sprintf(buf, "%d\n", val);
1257 }
1258 
1259 static SAS_DEVICE_ATTR(rphy, bay_identifier, S_IRUGO,
1260  show_sas_rphy_bay_identifier, NULL);
1261 
1262 sas_rphy_protocol_attr(identify.initiator_port_protocols,
1263  initiator_port_protocols);
1264 sas_rphy_protocol_attr(identify.target_port_protocols, target_port_protocols);
1265 sas_rphy_simple_attr(identify.sas_address, sas_address, "0x%016llx\n",
1266  unsigned long long);
1267 sas_rphy_simple_attr(identify.phy_identifier, phy_identifier, "%d\n", u8);
1268 
1269 /* only need 8 bytes of data plus header (4 or 8) */
1270 #define BUF_SIZE 64
1271 
1273 {
1274  char *buffer = kzalloc(BUF_SIZE, GFP_KERNEL), *msdata;
1275  struct sas_end_device *rdev = sas_sdev_to_rdev(sdev);
1276  struct scsi_mode_data mode_data;
1277  int res, error;
1278 
1279  if (!buffer)
1280  return -ENOMEM;
1281 
1282  res = scsi_mode_sense(sdev, 1, 0x19, buffer, BUF_SIZE, 30*HZ, 3,
1283  &mode_data, NULL);
1284 
1285  error = -EINVAL;
1286  if (!scsi_status_is_good(res))
1287  goto out;
1288 
1289  msdata = buffer + mode_data.header_length +
1290  mode_data.block_descriptor_length;
1291 
1292  if (msdata - buffer > BUF_SIZE - 8)
1293  goto out;
1294 
1295  error = 0;
1296 
1297  rdev->ready_led_meaning = msdata[2] & 0x10 ? 1 : 0;
1298  rdev->I_T_nexus_loss_timeout = (msdata[4] << 8) + msdata[5];
1299  rdev->initiator_response_timeout = (msdata[6] << 8) + msdata[7];
1300 
1301  out:
1302  kfree(buffer);
1303  return error;
1304 }
1306 
1307 static DECLARE_TRANSPORT_CLASS(sas_end_dev_class,
1308  "sas_end_device", NULL, NULL, NULL);
1309 
1310 #define sas_end_dev_show_simple(field, name, format_string, cast) \
1311 static ssize_t \
1312 show_sas_end_dev_##name(struct device *dev, \
1313  struct device_attribute *attr, char *buf) \
1314 { \
1315  struct sas_rphy *rphy = transport_class_to_rphy(dev); \
1316  struct sas_end_device *rdev = rphy_to_end_device(rphy); \
1317  \
1318  return snprintf(buf, 20, format_string, cast rdev->field); \
1319 }
1320 
1321 #define sas_end_dev_simple_attr(field, name, format_string, type) \
1322  sas_end_dev_show_simple(field, name, format_string, (type)) \
1323 static SAS_DEVICE_ATTR(end_dev, name, S_IRUGO, \
1324  show_sas_end_dev_##name, NULL)
1325 
1326 sas_end_dev_simple_attr(ready_led_meaning, ready_led_meaning, "%d\n", int);
1327 sas_end_dev_simple_attr(I_T_nexus_loss_timeout, I_T_nexus_loss_timeout,
1328  "%d\n", int);
1329 sas_end_dev_simple_attr(initiator_response_timeout, initiator_response_timeout,
1330  "%d\n", int);
1331 sas_end_dev_simple_attr(tlr_supported, tlr_supported,
1332  "%d\n", int);
1333 sas_end_dev_simple_attr(tlr_enabled, tlr_enabled,
1334  "%d\n", int);
1335 
1336 static DECLARE_TRANSPORT_CLASS(sas_expander_class,
1337  "sas_expander", NULL, NULL, NULL);
1338 
1339 #define sas_expander_show_simple(field, name, format_string, cast) \
1340 static ssize_t \
1341 show_sas_expander_##name(struct device *dev, \
1342  struct device_attribute *attr, char *buf) \
1343 { \
1344  struct sas_rphy *rphy = transport_class_to_rphy(dev); \
1345  struct sas_expander_device *edev = rphy_to_expander_device(rphy); \
1346  \
1347  return snprintf(buf, 20, format_string, cast edev->field); \
1348 }
1349 
1350 #define sas_expander_simple_attr(field, name, format_string, type) \
1351  sas_expander_show_simple(field, name, format_string, (type)) \
1352 static SAS_DEVICE_ATTR(expander, name, S_IRUGO, \
1353  show_sas_expander_##name, NULL)
1354 
1355 sas_expander_simple_attr(vendor_id, vendor_id, "%s\n", char *);
1357 sas_expander_simple_attr(product_rev, product_rev, "%s\n", char *);
1358 sas_expander_simple_attr(component_vendor_id, component_vendor_id,
1359  "%s\n", char *);
1360 sas_expander_simple_attr(component_id, component_id, "%u\n", unsigned int);
1361 sas_expander_simple_attr(component_revision_id, component_revision_id, "%u\n",
1362  unsigned int);
1363 sas_expander_simple_attr(level, level, "%d\n", int);
1364 
1365 static DECLARE_TRANSPORT_CLASS(sas_rphy_class,
1366  "sas_device", NULL, NULL, NULL);
1367 
1368 static int sas_rphy_match(struct attribute_container *cont, struct device *dev)
1369 {
1370  struct Scsi_Host *shost;
1371  struct sas_internal *i;
1372 
1373  if (!scsi_is_sas_rphy(dev))
1374  return 0;
1375  shost = dev_to_shost(dev->parent->parent);
1376 
1377  if (!shost->transportt)
1378  return 0;
1379  if (shost->transportt->host_attrs.ac.class !=
1380  &sas_host_class.class)
1381  return 0;
1382 
1383  i = to_sas_internal(shost->transportt);
1384  return &i->rphy_attr_cont.ac == cont;
1385 }
1386 
1387 static int sas_end_dev_match(struct attribute_container *cont,
1388  struct device *dev)
1389 {
1390  struct Scsi_Host *shost;
1391  struct sas_internal *i;
1392  struct sas_rphy *rphy;
1393 
1394  if (!scsi_is_sas_rphy(dev))
1395  return 0;
1396  shost = dev_to_shost(dev->parent->parent);
1397  rphy = dev_to_rphy(dev);
1398 
1399  if (!shost->transportt)
1400  return 0;
1401  if (shost->transportt->host_attrs.ac.class !=
1402  &sas_host_class.class)
1403  return 0;
1404 
1405  i = to_sas_internal(shost->transportt);
1406  return &i->end_dev_attr_cont.ac == cont &&
1407  rphy->identify.device_type == SAS_END_DEVICE;
1408 }
1409 
1410 static int sas_expander_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->expander_attr_cont.ac == cont &&
1430  (rphy->identify.device_type == SAS_EDGE_EXPANDER_DEVICE ||
1431  rphy->identify.device_type == SAS_FANOUT_EXPANDER_DEVICE);
1432 }
1433 
1434 static void sas_expander_release(struct device *dev)
1435 {
1436  struct sas_rphy *rphy = dev_to_rphy(dev);
1437  struct sas_expander_device *edev = rphy_to_expander_device(rphy);
1438 
1439  if (rphy->q)
1440  blk_cleanup_queue(rphy->q);
1441 
1442  put_device(dev->parent);
1443  kfree(edev);
1444 }
1445 
1446 static void sas_end_device_release(struct device *dev)
1447 {
1448  struct sas_rphy *rphy = dev_to_rphy(dev);
1449  struct sas_end_device *edev = rphy_to_end_device(rphy);
1450 
1451  if (rphy->q)
1452  blk_cleanup_queue(rphy->q);
1453 
1454  put_device(dev->parent);
1455  kfree(edev);
1456 }
1457 
1465 static void sas_rphy_initialize(struct sas_rphy *rphy)
1466 {
1467  INIT_LIST_HEAD(&rphy->list);
1468 }
1469 
1479 struct sas_rphy *sas_end_device_alloc(struct sas_port *parent)
1480 {
1481  struct Scsi_Host *shost = dev_to_shost(&parent->dev);
1482  struct sas_end_device *rdev;
1483 
1484  rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
1485  if (!rdev) {
1486  return NULL;
1487  }
1488 
1489  device_initialize(&rdev->rphy.dev);
1490  rdev->rphy.dev.parent = get_device(&parent->dev);
1491  rdev->rphy.dev.release = sas_end_device_release;
1492  if (scsi_is_sas_expander_device(parent->dev.parent)) {
1493  struct sas_rphy *rphy = dev_to_rphy(parent->dev.parent);
1494  dev_set_name(&rdev->rphy.dev, "end_device-%d:%d:%d",
1495  shost->host_no, rphy->scsi_target_id,
1496  parent->port_identifier);
1497  } else
1498  dev_set_name(&rdev->rphy.dev, "end_device-%d:%d",
1499  shost->host_no, parent->port_identifier);
1500  rdev->rphy.identify.device_type = SAS_END_DEVICE;
1501  sas_rphy_initialize(&rdev->rphy);
1502  transport_setup_device(&rdev->rphy.dev);
1503 
1504  return &rdev->rphy;
1505 }
1507 
1518 struct sas_rphy *sas_expander_alloc(struct sas_port *parent,
1519  enum sas_device_type type)
1520 {
1521  struct Scsi_Host *shost = dev_to_shost(&parent->dev);
1522  struct sas_expander_device *rdev;
1523  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
1524 
1525  BUG_ON(type != SAS_EDGE_EXPANDER_DEVICE &&
1526  type != SAS_FANOUT_EXPANDER_DEVICE);
1527 
1528  rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
1529  if (!rdev) {
1530  return NULL;
1531  }
1532 
1533  device_initialize(&rdev->rphy.dev);
1534  rdev->rphy.dev.parent = get_device(&parent->dev);
1535  rdev->rphy.dev.release = sas_expander_release;
1536  mutex_lock(&sas_host->lock);
1537  rdev->rphy.scsi_target_id = sas_host->next_expander_id++;
1538  mutex_unlock(&sas_host->lock);
1539  dev_set_name(&rdev->rphy.dev, "expander-%d:%d",
1540  shost->host_no, rdev->rphy.scsi_target_id);
1541  rdev->rphy.identify.device_type = type;
1542  sas_rphy_initialize(&rdev->rphy);
1543  transport_setup_device(&rdev->rphy.dev);
1544 
1545  return &rdev->rphy;
1546 }
1548 
1555 int sas_rphy_add(struct sas_rphy *rphy)
1556 {
1557  struct sas_port *parent = dev_to_sas_port(rphy->dev.parent);
1558  struct Scsi_Host *shost = dev_to_shost(parent->dev.parent);
1559  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
1560  struct sas_identify *identify = &rphy->identify;
1561  int error;
1562 
1563  if (parent->rphy)
1564  return -ENXIO;
1565  parent->rphy = rphy;
1566 
1567  error = device_add(&rphy->dev);
1568  if (error)
1569  return error;
1570  transport_add_device(&rphy->dev);
1572  if (sas_bsg_initialize(shost, rphy))
1573  printk("fail to a bsg device %s\n", dev_name(&rphy->dev));
1574 
1575 
1576  mutex_lock(&sas_host->lock);
1577  list_add_tail(&rphy->list, &sas_host->rphy_list);
1578  if (identify->device_type == SAS_END_DEVICE &&
1579  (identify->target_port_protocols &
1581  rphy->scsi_target_id = sas_host->next_target_id++;
1582  else if (identify->device_type == SAS_END_DEVICE)
1583  rphy->scsi_target_id = -1;
1584  mutex_unlock(&sas_host->lock);
1585 
1586  if (identify->device_type == SAS_END_DEVICE &&
1587  rphy->scsi_target_id != -1) {
1588  int lun;
1589 
1590  if (identify->target_port_protocols & SAS_PROTOCOL_SSP)
1591  lun = SCAN_WILD_CARD;
1592  else
1593  lun = 0;
1594 
1595  scsi_scan_target(&rphy->dev, 0, rphy->scsi_target_id, lun, 0);
1596  }
1597 
1598  return 0;
1599 }
1601 
1613 void sas_rphy_free(struct sas_rphy *rphy)
1614 {
1615  struct device *dev = &rphy->dev;
1616  struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent);
1617  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
1618 
1619  mutex_lock(&sas_host->lock);
1620  list_del(&rphy->list);
1621  mutex_unlock(&sas_host->lock);
1622 
1623  sas_bsg_remove(shost, rphy);
1624 
1626 
1627  put_device(dev);
1628 }
1630 
1637 void
1639 {
1640  sas_rphy_remove(rphy);
1641  sas_rphy_free(rphy);
1642 }
1644 
1651 void sas_rphy_unlink(struct sas_rphy *rphy)
1652 {
1653  struct sas_port *parent = dev_to_sas_port(rphy->dev.parent);
1654 
1655  parent->rphy = NULL;
1656 }
1658 
1665 void
1667 {
1668  struct device *dev = &rphy->dev;
1669 
1670  switch (rphy->identify.device_type) {
1671  case SAS_END_DEVICE:
1672  scsi_remove_target(dev);
1673  break;
1676  sas_remove_children(dev);
1677  break;
1678  default:
1679  break;
1680  }
1681 
1682  sas_rphy_unlink(rphy);
1684  device_del(dev);
1685 }
1687 
1695 int scsi_is_sas_rphy(const struct device *dev)
1696 {
1697  return dev->release == sas_end_device_release ||
1698  dev->release == sas_expander_release;
1699 }
1701 
1702 
1703 /*
1704  * SCSI scan helper
1705  */
1706 
1707 static int sas_user_scan(struct Scsi_Host *shost, uint channel,
1708  uint id, uint lun)
1709 {
1710  struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
1711  struct sas_rphy *rphy;
1712 
1713  mutex_lock(&sas_host->lock);
1714  list_for_each_entry(rphy, &sas_host->rphy_list, list) {
1715  if (rphy->identify.device_type != SAS_END_DEVICE ||
1716  rphy->scsi_target_id == -1)
1717  continue;
1718 
1719  if ((channel == SCAN_WILD_CARD || channel == 0) &&
1720  (id == SCAN_WILD_CARD || id == rphy->scsi_target_id)) {
1721  scsi_scan_target(&rphy->dev, 0,
1722  rphy->scsi_target_id, lun, 1);
1723  }
1724  }
1725  mutex_unlock(&sas_host->lock);
1726 
1727  return 0;
1728 }
1729 
1730 
1731 /*
1732  * Setup / Teardown code
1733  */
1734 
1735 #define SETUP_TEMPLATE(attrb, field, perm, test) \
1736  i->private_##attrb[count] = dev_attr_##field; \
1737  i->private_##attrb[count].attr.mode = perm; \
1738  i->attrb[count] = &i->private_##attrb[count]; \
1739  if (test) \
1740  count++
1741 
1742 #define SETUP_TEMPLATE_RW(attrb, field, perm, test, ro_test, ro_perm) \
1743  i->private_##attrb[count] = dev_attr_##field; \
1744  i->private_##attrb[count].attr.mode = perm; \
1745  if (ro_test) { \
1746  i->private_##attrb[count].attr.mode = ro_perm; \
1747  i->private_##attrb[count].store = NULL; \
1748  } \
1749  i->attrb[count] = &i->private_##attrb[count]; \
1750  if (test) \
1751  count++
1752 
1753 #define SETUP_RPORT_ATTRIBUTE(field) \
1754  SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, 1)
1755 
1756 #define SETUP_OPTIONAL_RPORT_ATTRIBUTE(field, func) \
1757  SETUP_TEMPLATE(rphy_attrs, field, S_IRUGO, i->f->func)
1758 
1759 #define SETUP_PHY_ATTRIBUTE(field) \
1760  SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, 1)
1761 
1762 #define SETUP_PHY_ATTRIBUTE_RW(field) \
1763  SETUP_TEMPLATE_RW(phy_attrs, field, S_IRUGO | S_IWUSR, 1, \
1764  !i->f->set_phy_speed, S_IRUGO)
1765 
1766 #define SETUP_OPTIONAL_PHY_ATTRIBUTE_RW(field, func) \
1767  SETUP_TEMPLATE_RW(phy_attrs, field, S_IRUGO | S_IWUSR, 1, \
1768  !i->f->func, S_IRUGO)
1769 
1770 #define SETUP_PORT_ATTRIBUTE(field) \
1771  SETUP_TEMPLATE(port_attrs, field, S_IRUGO, 1)
1772 
1773 #define SETUP_OPTIONAL_PHY_ATTRIBUTE(field, func) \
1774  SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, i->f->func)
1775 
1776 #define SETUP_PHY_ATTRIBUTE_WRONLY(field) \
1777  SETUP_TEMPLATE(phy_attrs, field, S_IWUSR, 1)
1778 
1779 #define SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(field, func) \
1780  SETUP_TEMPLATE(phy_attrs, field, S_IWUSR, i->f->func)
1781 
1782 #define SETUP_END_DEV_ATTRIBUTE(field) \
1783  SETUP_TEMPLATE(end_dev_attrs, field, S_IRUGO, 1)
1784 
1785 #define SETUP_EXPANDER_ATTRIBUTE(field) \
1786  SETUP_TEMPLATE(expander_attrs, expander_##field, S_IRUGO, 1)
1787 
1792 struct scsi_transport_template *
1794 {
1795  struct sas_internal *i;
1796  int count;
1797 
1798  i = kzalloc(sizeof(struct sas_internal), GFP_KERNEL);
1799  if (!i)
1800  return NULL;
1801 
1802  i->t.user_scan = sas_user_scan;
1803 
1804  i->t.host_attrs.ac.attrs = &i->host_attrs[0];
1805  i->t.host_attrs.ac.class = &sas_host_class.class;
1806  i->t.host_attrs.ac.match = sas_host_match;
1807  transport_container_register(&i->t.host_attrs);
1808  i->t.host_size = sizeof(struct sas_host_attrs);
1809 
1810  i->phy_attr_cont.ac.class = &sas_phy_class.class;
1811  i->phy_attr_cont.ac.attrs = &i->phy_attrs[0];
1812  i->phy_attr_cont.ac.match = sas_phy_match;
1813  transport_container_register(&i->phy_attr_cont);
1814 
1815  i->port_attr_cont.ac.class = &sas_port_class.class;
1816  i->port_attr_cont.ac.attrs = &i->port_attrs[0];
1817  i->port_attr_cont.ac.match = sas_port_match;
1818  transport_container_register(&i->port_attr_cont);
1819 
1820  i->rphy_attr_cont.ac.class = &sas_rphy_class.class;
1821  i->rphy_attr_cont.ac.attrs = &i->rphy_attrs[0];
1822  i->rphy_attr_cont.ac.match = sas_rphy_match;
1823  transport_container_register(&i->rphy_attr_cont);
1824 
1825  i->end_dev_attr_cont.ac.class = &sas_end_dev_class.class;
1826  i->end_dev_attr_cont.ac.attrs = &i->end_dev_attrs[0];
1827  i->end_dev_attr_cont.ac.match = sas_end_dev_match;
1828  transport_container_register(&i->end_dev_attr_cont);
1829 
1830  i->expander_attr_cont.ac.class = &sas_expander_class.class;
1831  i->expander_attr_cont.ac.attrs = &i->expander_attrs[0];
1832  i->expander_attr_cont.ac.match = sas_expander_match;
1833  transport_container_register(&i->expander_attr_cont);
1834 
1835  i->f = ft;
1836 
1837  count = 0;
1838  SETUP_PHY_ATTRIBUTE(initiator_port_protocols);
1839  SETUP_PHY_ATTRIBUTE(target_port_protocols);
1841  SETUP_PHY_ATTRIBUTE(sas_address);
1842  SETUP_PHY_ATTRIBUTE(phy_identifier);
1843  //SETUP_PHY_ATTRIBUTE(port_identifier);
1844  SETUP_PHY_ATTRIBUTE(negotiated_linkrate);
1845  SETUP_PHY_ATTRIBUTE(minimum_linkrate_hw);
1846  SETUP_PHY_ATTRIBUTE_RW(minimum_linkrate);
1847  SETUP_PHY_ATTRIBUTE(maximum_linkrate_hw);
1848  SETUP_PHY_ATTRIBUTE_RW(maximum_linkrate);
1849 
1850  SETUP_PHY_ATTRIBUTE(invalid_dword_count);
1851  SETUP_PHY_ATTRIBUTE(running_disparity_error_count);
1852  SETUP_PHY_ATTRIBUTE(loss_of_dword_sync_count);
1853  SETUP_PHY_ATTRIBUTE(phy_reset_problem_count);
1854  SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(link_reset, phy_reset);
1855  SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(hard_reset, phy_reset);
1856  SETUP_OPTIONAL_PHY_ATTRIBUTE_RW(enable, phy_enable);
1857  i->phy_attrs[count] = NULL;
1858 
1859  count = 0;
1861  i->port_attrs[count] = NULL;
1862 
1863  count = 0;
1864  SETUP_RPORT_ATTRIBUTE(rphy_initiator_port_protocols);
1865  SETUP_RPORT_ATTRIBUTE(rphy_target_port_protocols);
1866  SETUP_RPORT_ATTRIBUTE(rphy_device_type);
1867  SETUP_RPORT_ATTRIBUTE(rphy_sas_address);
1868  SETUP_RPORT_ATTRIBUTE(rphy_phy_identifier);
1869  SETUP_OPTIONAL_RPORT_ATTRIBUTE(rphy_enclosure_identifier,
1870  get_enclosure_identifier);
1871  SETUP_OPTIONAL_RPORT_ATTRIBUTE(rphy_bay_identifier,
1872  get_bay_identifier);
1873  i->rphy_attrs[count] = NULL;
1874 
1875  count = 0;
1876  SETUP_END_DEV_ATTRIBUTE(end_dev_ready_led_meaning);
1877  SETUP_END_DEV_ATTRIBUTE(end_dev_I_T_nexus_loss_timeout);
1878  SETUP_END_DEV_ATTRIBUTE(end_dev_initiator_response_timeout);
1879  SETUP_END_DEV_ATTRIBUTE(end_dev_tlr_supported);
1880  SETUP_END_DEV_ATTRIBUTE(end_dev_tlr_enabled);
1881  i->end_dev_attrs[count] = NULL;
1882 
1883  count = 0;
1886  SETUP_EXPANDER_ATTRIBUTE(product_rev);
1887  SETUP_EXPANDER_ATTRIBUTE(component_vendor_id);
1888  SETUP_EXPANDER_ATTRIBUTE(component_id);
1889  SETUP_EXPANDER_ATTRIBUTE(component_revision_id);
1891  i->expander_attrs[count] = NULL;
1892 
1893  return &i->t;
1894 }
1896 
1902 {
1903  struct sas_internal *i = to_sas_internal(t);
1904 
1905  transport_container_unregister(&i->t.host_attrs);
1906  transport_container_unregister(&i->phy_attr_cont);
1907  transport_container_unregister(&i->port_attr_cont);
1908  transport_container_unregister(&i->rphy_attr_cont);
1909  transport_container_unregister(&i->end_dev_attr_cont);
1910  transport_container_unregister(&i->expander_attr_cont);
1911 
1912  kfree(i);
1913 }
1915 
1916 static __init int sas_transport_init(void)
1917 {
1918  int error;
1919 
1920  error = transport_class_register(&sas_host_class);
1921  if (error)
1922  goto out;
1923  error = transport_class_register(&sas_phy_class);
1924  if (error)
1925  goto out_unregister_transport;
1926  error = transport_class_register(&sas_port_class);
1927  if (error)
1928  goto out_unregister_phy;
1929  error = transport_class_register(&sas_rphy_class);
1930  if (error)
1931  goto out_unregister_port;
1932  error = transport_class_register(&sas_end_dev_class);
1933  if (error)
1934  goto out_unregister_rphy;
1935  error = transport_class_register(&sas_expander_class);
1936  if (error)
1937  goto out_unregister_end_dev;
1938 
1939  return 0;
1940 
1941  out_unregister_end_dev:
1942  transport_class_unregister(&sas_end_dev_class);
1943  out_unregister_rphy:
1944  transport_class_unregister(&sas_rphy_class);
1945  out_unregister_port:
1946  transport_class_unregister(&sas_port_class);
1947  out_unregister_phy:
1948  transport_class_unregister(&sas_phy_class);
1949  out_unregister_transport:
1950  transport_class_unregister(&sas_host_class);
1951  out:
1952  return error;
1953 
1954 }
1955 
1956 static void __exit sas_transport_exit(void)
1957 {
1958  transport_class_unregister(&sas_host_class);
1959  transport_class_unregister(&sas_phy_class);
1960  transport_class_unregister(&sas_port_class);
1961  transport_class_unregister(&sas_rphy_class);
1962  transport_class_unregister(&sas_end_dev_class);
1963  transport_class_unregister(&sas_expander_class);
1964 }
1965 
1966 MODULE_AUTHOR("Christoph Hellwig");
1967 MODULE_DESCRIPTION("SAS Transport Attributes");
1968 MODULE_LICENSE("GPL");
1969 
1970 module_init(sas_transport_init);
1971 module_exit(sas_transport_exit);