diff options
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 35 | ||||
-rw-r--r-- | include/scsi/iscsi_if.h | 8 | ||||
-rw-r--r-- | include/scsi/scsi_transport_iscsi.h | 5 |
3 files changed, 45 insertions, 3 deletions
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 4fbd8e1a0695..1ba98d255fac 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -32,7 +32,7 @@ | |||
32 | 32 | ||
33 | #define ISCSI_SESSION_ATTRS 11 | 33 | #define ISCSI_SESSION_ATTRS 11 |
34 | #define ISCSI_CONN_ATTRS 11 | 34 | #define ISCSI_CONN_ATTRS 11 |
35 | #define ISCSI_HOST_ATTRS 0 | 35 | #define ISCSI_HOST_ATTRS 1 |
36 | #define ISCSI_TRANSPORT_VERSION "2.0-724" | 36 | #define ISCSI_TRANSPORT_VERSION "2.0-724" |
37 | 37 | ||
38 | struct iscsi_internal { | 38 | struct iscsi_internal { |
@@ -1197,6 +1197,25 @@ static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \ | |||
1197 | NULL) | 1197 | NULL) |
1198 | iscsi_priv_session_attr(recovery_tmo, "%d"); | 1198 | iscsi_priv_session_attr(recovery_tmo, "%d"); |
1199 | 1199 | ||
1200 | /* | ||
1201 | * iSCSI host attrs | ||
1202 | */ | ||
1203 | #define iscsi_host_attr_show(param) \ | ||
1204 | static ssize_t \ | ||
1205 | show_host_param_##param(struct class_device *cdev, char *buf) \ | ||
1206 | { \ | ||
1207 | struct Scsi_Host *shost = transport_class_to_shost(cdev); \ | ||
1208 | struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \ | ||
1209 | return priv->iscsi_transport->get_host_param(shost, param, buf); \ | ||
1210 | } | ||
1211 | |||
1212 | #define iscsi_host_attr(field, param) \ | ||
1213 | iscsi_host_attr_show(param) \ | ||
1214 | static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param, \ | ||
1215 | NULL); | ||
1216 | |||
1217 | iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS); | ||
1218 | |||
1200 | #define SETUP_PRIV_SESSION_RD_ATTR(field) \ | 1219 | #define SETUP_PRIV_SESSION_RD_ATTR(field) \ |
1201 | do { \ | 1220 | do { \ |
1202 | priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \ | 1221 | priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \ |
@@ -1220,6 +1239,14 @@ do { \ | |||
1220 | } \ | 1239 | } \ |
1221 | } while (0) | 1240 | } while (0) |
1222 | 1241 | ||
1242 | #define SETUP_HOST_RD_ATTR(field, param_flag) \ | ||
1243 | do { \ | ||
1244 | if (tt->host_param_mask & param_flag) { \ | ||
1245 | priv->host_attrs[count] = &class_device_attr_host_##field; \ | ||
1246 | count++; \ | ||
1247 | } \ | ||
1248 | } while (0) | ||
1249 | |||
1223 | static int iscsi_session_match(struct attribute_container *cont, | 1250 | static int iscsi_session_match(struct attribute_container *cont, |
1224 | struct device *dev) | 1251 | struct device *dev) |
1225 | { | 1252 | { |
@@ -1321,9 +1348,13 @@ iscsi_register_transport(struct iscsi_transport *tt) | |||
1321 | priv->t.host_attrs.ac.class = &iscsi_host_class.class; | 1348 | priv->t.host_attrs.ac.class = &iscsi_host_class.class; |
1322 | priv->t.host_attrs.ac.match = iscsi_host_match; | 1349 | priv->t.host_attrs.ac.match = iscsi_host_match; |
1323 | priv->t.host_size = sizeof(struct iscsi_host); | 1350 | priv->t.host_size = sizeof(struct iscsi_host); |
1324 | priv->host_attrs[0] = NULL; | ||
1325 | transport_container_register(&priv->t.host_attrs); | 1351 | transport_container_register(&priv->t.host_attrs); |
1326 | 1352 | ||
1353 | SETUP_HOST_RD_ATTR(hwaddress, ISCSI_HOST_HWADDRESS); | ||
1354 | BUG_ON(count > ISCSI_HOST_ATTRS); | ||
1355 | priv->host_attrs[count] = NULL; | ||
1356 | count = 0; | ||
1357 | |||
1327 | /* connection parameters */ | 1358 | /* connection parameters */ |
1328 | priv->conn_cont.ac.attrs = &priv->conn_attrs[0]; | 1359 | priv->conn_cont.ac.attrs = &priv->conn_attrs[0]; |
1329 | priv->conn_cont.ac.class = &iscsi_connection_class.class; | 1360 | priv->conn_cont.ac.class = &iscsi_connection_class.class; |
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h index 55ebf035e620..fba211743729 100644 --- a/include/scsi/iscsi_if.h +++ b/include/scsi/iscsi_if.h | |||
@@ -250,6 +250,14 @@ enum iscsi_param { | |||
250 | #define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT) | 250 | #define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT) |
251 | #define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS) | 251 | #define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS) |
252 | 252 | ||
253 | /* iSCSI HBA params */ | ||
254 | enum iscsi_host_param { | ||
255 | ISCSI_HOST_PARAM_HWADDRESS, | ||
256 | ISCSI_HOST_PARAM_MAX, | ||
257 | }; | ||
258 | |||
259 | #define ISCSI_HOST_HWADDRESS (1 << ISCSI_HOST_PARAM_HWADDRESS) | ||
260 | |||
253 | #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) | 261 | #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) |
254 | #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) | 262 | #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) |
255 | #define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) | 263 | #define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) |
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index d5c218ddc527..e962c5357eef 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -79,7 +79,8 @@ struct iscsi_transport { | |||
79 | char *name; | 79 | char *name; |
80 | unsigned int caps; | 80 | unsigned int caps; |
81 | /* LLD sets this to indicate what values it can export to sysfs */ | 81 | /* LLD sets this to indicate what values it can export to sysfs */ |
82 | unsigned int param_mask; | 82 | uint64_t param_mask; |
83 | uint64_t host_param_mask; | ||
83 | struct scsi_host_template *host_template; | 84 | struct scsi_host_template *host_template; |
84 | /* LLD connection data size */ | 85 | /* LLD connection data size */ |
85 | int conndata_size; | 86 | int conndata_size; |
@@ -105,6 +106,8 @@ struct iscsi_transport { | |||
105 | enum iscsi_param param, char *buf); | 106 | enum iscsi_param param, char *buf); |
106 | int (*get_session_param) (struct iscsi_cls_session *session, | 107 | int (*get_session_param) (struct iscsi_cls_session *session, |
107 | enum iscsi_param param, char *buf); | 108 | enum iscsi_param param, char *buf); |
109 | int (*get_host_param) (struct Scsi_Host *shost, | ||
110 | enum iscsi_host_param param, char *buf); | ||
108 | int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, | 111 | int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
109 | char *data, uint32_t data_size); | 112 | char *data, uint32_t data_size); |
110 | void (*get_stats) (struct iscsi_cls_conn *conn, | 113 | void (*get_stats) (struct iscsi_cls_conn *conn, |