zfcp_sysfs_adapter.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /*
  2. * zfcp device driver
  3. *
  4. * sysfs attributes for CCW device.
  5. *
  6. * Copyright IBM Corporation 2002, 2008
  7. */
  8. #include "zfcp_ext.h"
  9. /**
  10. * ZFCP_DEFINE_ADAPTER_ATTR
  11. * @_name: name of show attribute
  12. * @_format: format string
  13. * @_value: value to print
  14. *
  15. * Generates attributes for an adapter.
  16. */
  17. #define ZFCP_DEFINE_ADAPTER_ATTR(_name, _format, _value) \
  18. static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, struct device_attribute *attr, \
  19. char *buf) \
  20. { \
  21. struct zfcp_adapter *adapter; \
  22. \
  23. adapter = dev_get_drvdata(dev); \
  24. return sprintf(buf, _format, _value); \
  25. } \
  26. \
  27. static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_adapter_##_name##_show, NULL);
  28. ZFCP_DEFINE_ADAPTER_ATTR(status, "0x%08x\n", atomic_read(&adapter->status));
  29. ZFCP_DEFINE_ADAPTER_ATTR(peer_wwnn, "0x%016llx\n", adapter->peer_wwnn);
  30. ZFCP_DEFINE_ADAPTER_ATTR(peer_wwpn, "0x%016llx\n", adapter->peer_wwpn);
  31. ZFCP_DEFINE_ADAPTER_ATTR(peer_d_id, "0x%06x\n", adapter->peer_d_id);
  32. ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version);
  33. ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version);
  34. ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n",
  35. adapter->hardware_version);
  36. ZFCP_DEFINE_ADAPTER_ATTR(in_recovery, "%d\n", atomic_test_mask
  37. (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status));
  38. /**
  39. * zfcp_sysfs_port_rescan - trigger manual port rescan
  40. * @dev: pointer to belonging device
  41. * @attr: pointer to struct device_attribute
  42. * @buf: pointer to input buffer
  43. * @count: number of bytes in buffer
  44. */
  45. static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev,
  46. struct device_attribute *attr,
  47. const char *buf, size_t count)
  48. {
  49. struct zfcp_adapter *adapter;
  50. int ret;
  51. adapter = dev_get_drvdata(dev);
  52. if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status))
  53. return -EBUSY;
  54. ret = zfcp_scan_ports(adapter);
  55. return ret ? ret : (ssize_t) count;
  56. }
  57. static DEVICE_ATTR(port_rescan, S_IWUSR, NULL, zfcp_sysfs_port_rescan_store);
  58. /**
  59. * zfcp_sysfs_port_remove_store - remove a port from sysfs tree
  60. * @dev: pointer to belonging device
  61. * @buf: pointer to input buffer
  62. * @count: number of bytes in buffer
  63. *
  64. * Store function of the "port_remove" attribute of an adapter.
  65. */
  66. static ssize_t
  67. zfcp_sysfs_port_remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
  68. {
  69. struct zfcp_adapter *adapter;
  70. struct zfcp_port *port;
  71. wwn_t wwpn;
  72. char *endp;
  73. int retval = 0;
  74. down(&zfcp_data.config_sema);
  75. adapter = dev_get_drvdata(dev);
  76. if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status)) {
  77. retval = -EBUSY;
  78. goto out;
  79. }
  80. wwpn = simple_strtoull(buf, &endp, 0);
  81. if ((endp + 1) < (buf + count)) {
  82. retval = -EINVAL;
  83. goto out;
  84. }
  85. write_lock_irq(&zfcp_data.config_lock);
  86. port = zfcp_get_port_by_wwpn(adapter, wwpn);
  87. if (port && (atomic_read(&port->refcount) == 0)) {
  88. zfcp_port_get(port);
  89. atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
  90. list_move(&port->list, &adapter->port_remove_lh);
  91. }
  92. else {
  93. port = NULL;
  94. }
  95. write_unlock_irq(&zfcp_data.config_lock);
  96. if (!port) {
  97. retval = -ENXIO;
  98. goto out;
  99. }
  100. zfcp_erp_port_shutdown(port, 0, 92, NULL);
  101. zfcp_erp_wait(adapter);
  102. zfcp_port_put(port);
  103. zfcp_port_dequeue(port);
  104. out:
  105. up(&zfcp_data.config_sema);
  106. return retval ? retval : (ssize_t) count;
  107. }
  108. static DEVICE_ATTR(port_remove, S_IWUSR, NULL, zfcp_sysfs_port_remove_store);
  109. /**
  110. * zfcp_sysfs_adapter_failed_store - failed state of adapter
  111. * @dev: pointer to belonging device
  112. * @buf: pointer to input buffer
  113. * @count: number of bytes in buffer
  114. *
  115. * Store function of the "failed" attribute of an adapter.
  116. * If a "0" gets written to "failed", error recovery will be
  117. * started for the belonging adapter.
  118. */
  119. static ssize_t
  120. zfcp_sysfs_adapter_failed_store(struct device *dev, struct device_attribute *attr,
  121. const char *buf, size_t count)
  122. {
  123. struct zfcp_adapter *adapter;
  124. unsigned int val;
  125. char *endp;
  126. int retval = 0;
  127. down(&zfcp_data.config_sema);
  128. adapter = dev_get_drvdata(dev);
  129. if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status)) {
  130. retval = -EBUSY;
  131. goto out;
  132. }
  133. val = simple_strtoul(buf, &endp, 0);
  134. if (((endp + 1) < (buf + count)) || (val != 0)) {
  135. retval = -EINVAL;
  136. goto out;
  137. }
  138. zfcp_erp_modify_adapter_status(adapter, 44, NULL,
  139. ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
  140. zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, 93,
  141. NULL);
  142. zfcp_erp_wait(adapter);
  143. out:
  144. up(&zfcp_data.config_sema);
  145. return retval ? retval : (ssize_t) count;
  146. }
  147. /**
  148. * zfcp_sysfs_adapter_failed_show - failed state of adapter
  149. * @dev: pointer to belonging device
  150. * @buf: pointer to input buffer
  151. *
  152. * Show function of "failed" attribute of adapter. Will be
  153. * "0" if adapter is working, otherwise "1".
  154. */
  155. static ssize_t
  156. zfcp_sysfs_adapter_failed_show(struct device *dev, struct device_attribute *attr, char *buf)
  157. {
  158. struct zfcp_adapter *adapter;
  159. adapter = dev_get_drvdata(dev);
  160. if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status))
  161. return sprintf(buf, "1\n");
  162. else
  163. return sprintf(buf, "0\n");
  164. }
  165. static DEVICE_ATTR(failed, S_IWUSR | S_IRUGO, zfcp_sysfs_adapter_failed_show,
  166. zfcp_sysfs_adapter_failed_store);
  167. static struct attribute *zfcp_adapter_attrs[] = {
  168. &dev_attr_failed.attr,
  169. &dev_attr_in_recovery.attr,
  170. &dev_attr_port_remove.attr,
  171. &dev_attr_port_rescan.attr,
  172. &dev_attr_peer_wwnn.attr,
  173. &dev_attr_peer_wwpn.attr,
  174. &dev_attr_peer_d_id.attr,
  175. &dev_attr_card_version.attr,
  176. &dev_attr_lic_version.attr,
  177. &dev_attr_status.attr,
  178. &dev_attr_hardware_version.attr,
  179. NULL
  180. };
  181. static struct attribute_group zfcp_adapter_attr_group = {
  182. .attrs = zfcp_adapter_attrs,
  183. };
  184. /**
  185. * zfcp_sysfs_create_adapter_files - create sysfs adapter files
  186. * @dev: pointer to belonging device
  187. *
  188. * Create all attributes of the sysfs representation of an adapter.
  189. */
  190. int
  191. zfcp_sysfs_adapter_create_files(struct device *dev)
  192. {
  193. return sysfs_create_group(&dev->kobj, &zfcp_adapter_attr_group);
  194. }
  195. /**
  196. * zfcp_sysfs_remove_adapter_files - remove sysfs adapter files
  197. * @dev: pointer to belonging device
  198. *
  199. * Remove all attributes of the sysfs representation of an adapter.
  200. */
  201. void
  202. zfcp_sysfs_adapter_remove_files(struct device *dev)
  203. {
  204. sysfs_remove_group(&dev->kobj, &zfcp_adapter_attr_group);
  205. }