ISCSI_PERSISTENT_ADDRESS |
                                  ISCSI_TARGET_NAME |
                                  ISCSI_TPGT,
+       .host_param_mask        = ISCSI_HOST_HWADDRESS,
        .host_template          = &iscsi_iser_sht,
        .conndata_size          = sizeof(struct iscsi_conn),
        .max_lun                = ISCSI_ISER_MAX_LUN,
        .get_session_param      = iscsi_session_get_param,
        .start_conn             = iscsi_iser_conn_start,
        .stop_conn              = iscsi_conn_stop,
+       /* iscsi host params */
+       .get_host_param         = iscsi_host_get_param,
+       .set_host_param         = iscsi_host_set_param,
        /* IO */
        .send_pdu               = iscsi_conn_send_pdu,
        .get_stats              = iscsi_iser_conn_get_stats,
 
                                  ISCSI_PERSISTENT_ADDRESS |
                                  ISCSI_TARGET_NAME |
                                  ISCSI_TPGT,
+       .host_param_mask        = ISCSI_HOST_HWADDRESS,
        .host_template          = &iscsi_sht,
        .conndata_size          = sizeof(struct iscsi_conn),
        .max_conn               = 1,
        .get_session_param      = iscsi_session_get_param,
        .start_conn             = iscsi_conn_start,
        .stop_conn              = iscsi_tcp_conn_stop,
+       /* iscsi host params */
+       .get_host_param         = iscsi_host_get_param,
+       .set_host_param         = iscsi_host_set_param,
        /* IO */
        .send_pdu               = iscsi_conn_send_pdu,
        .get_stats              = iscsi_conn_get_stats,
 
        iscsi_pool_free(&session->cmdpool, (void**)session->cmds);
 
        kfree(session->targetname);
+       kfree(session->hwaddress);
 
        iscsi_destroy_session(cls_session);
        scsi_host_put(shost);
 }
 EXPORT_SYMBOL_GPL(iscsi_conn_get_param);
 
+int iscsi_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param,
+                        char *buf)
+{
+       struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
+       int len;
+
+       switch (param) {
+       case ISCSI_HOST_PARAM_HWADDRESS:
+               if (!session->hwaddress)
+                       len = sprintf(buf, "%s\n", "default");
+               else
+                       len = sprintf(buf, "%s\n", session->hwaddress);
+               break;
+       default:
+               return -ENOSYS;
+       }
+
+       return len;
+}
+EXPORT_SYMBOL_GPL(iscsi_host_get_param);
+
+int iscsi_host_set_param(struct Scsi_Host *shost, enum iscsi_host_param param,
+                        char *buf, int buflen)
+{
+       struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
+
+       switch (param) {
+       case ISCSI_HOST_PARAM_HWADDRESS:
+               if (!session->hwaddress)
+                       session->hwaddress = kstrdup(buf, GFP_KERNEL);
+               break;
+       default:
+               return -ENOSYS;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(iscsi_host_set_param);
+
 MODULE_AUTHOR("Mike Christie");
 MODULE_DESCRIPTION("iSCSI library functions");
 MODULE_LICENSE("GPL");
 
        int                     erl;
        int                     tpgt;
        char                    *targetname;
-
+       /* hw address being used for iscsi connection */
+       char                    *hwaddress;
        /* control data */
        struct iscsi_transport  *tt;
        struct Scsi_Host        *host;
 extern int iscsi_queuecommand(struct scsi_cmnd *sc,
                              void (*done)(struct scsi_cmnd *));
 
+
+/*
+ * iSCSI host helpers.
+ */
+extern int iscsi_host_set_param(struct Scsi_Host *shost,
+                               enum iscsi_host_param param, char *buf,
+                               int buflen);
+extern int iscsi_host_get_param(struct Scsi_Host *shost,
+                               enum iscsi_host_param param, char *buf);
+
 /*
  * session management
  */