aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c35
-rw-r--r--include/scsi/iscsi_if.h8
-rw-r--r--include/scsi/scsi_transport_iscsi.h5
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
38struct iscsi_internal { 38struct iscsi_internal {
@@ -1197,6 +1197,25 @@ static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \
1197 NULL) 1197 NULL)
1198iscsi_priv_session_attr(recovery_tmo, "%d"); 1198iscsi_priv_session_attr(recovery_tmo, "%d");
1199 1199
1200/*
1201 * iSCSI host attrs
1202 */
1203#define iscsi_host_attr_show(param) \
1204static ssize_t \
1205show_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) \
1214static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param, \
1215 NULL);
1216
1217iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
1218
1200#define SETUP_PRIV_SESSION_RD_ATTR(field) \ 1219#define SETUP_PRIV_SESSION_RD_ATTR(field) \
1201do { \ 1220do { \
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) \
1243do { \
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
1223static int iscsi_session_match(struct attribute_container *cont, 1250static 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 */
254enum 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,