{ NVMF_TREQ_NOT_REQUIRED,       "not required" },
 };
 
+static inline u8 nvmet_port_disc_addr_treq_mask(struct nvmet_port *port)
+{
+       return (port->disc_addr.treq & ~NVME_TREQ_SECURE_CHANNEL_MASK);
+}
+
 static ssize_t nvmet_addr_treq_show(struct config_item *item, char *page)
 {
        u8 treq = to_nvmet_port(item)->disc_addr.treq &
                const char *page, size_t count)
 {
        struct nvmet_port *port = to_nvmet_port(item);
-       u8 treq = port->disc_addr.treq & ~NVME_TREQ_SECURE_CHANNEL_MASK;
+       u8 treq = nvmet_port_disc_addr_treq_mask(port);
        int i;
 
        if (nvmet_is_port_enabled(port, __func__))
        port->disc_addr.tsas.rdma.cms = NVMF_RDMA_CMS_RDMA_CM;
 }
 
+static void nvmet_port_init_tsas_tcp(struct nvmet_port *port, int sectype)
+{
+       port->disc_addr.tsas.tcp.sectype = sectype;
+}
+
 static ssize_t nvmet_addr_trtype_store(struct config_item *item,
                const char *page, size_t count)
 {
        port->disc_addr.trtype = nvmet_transport[i].type;
        if (port->disc_addr.trtype == NVMF_TRTYPE_RDMA)
                nvmet_port_init_tsas_rdma(port);
+       else if (port->disc_addr.trtype == NVMF_TRTYPE_TCP)
+               nvmet_port_init_tsas_tcp(port, NVMF_TCP_SECTYPE_NONE);
        return count;
 }
 
 CONFIGFS_ATTR(nvmet_, addr_trtype);
 
+static const struct nvmet_type_name_map nvmet_addr_tsas_tcp[] = {
+       { NVMF_TCP_SECTYPE_NONE,        "none" },
+       { NVMF_TCP_SECTYPE_TLS13,       "tls1.3" },
+};
+
+static const struct nvmet_type_name_map nvmet_addr_tsas_rdma[] = {
+       { NVMF_RDMA_QPTYPE_CONNECTED,   "connected" },
+       { NVMF_RDMA_QPTYPE_DATAGRAM,    "datagram"  },
+};
+
+static ssize_t nvmet_addr_tsas_show(struct config_item *item,
+               char *page)
+{
+       struct nvmet_port *port = to_nvmet_port(item);
+       int i;
+
+       if (port->disc_addr.trtype == NVMF_TRTYPE_TCP) {
+               for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_tcp); i++) {
+                       if (port->disc_addr.tsas.tcp.sectype == nvmet_addr_tsas_tcp[i].type)
+                               return sprintf(page, "%s\n", nvmet_addr_tsas_tcp[i].name);
+               }
+       } else if (port->disc_addr.trtype == NVMF_TRTYPE_RDMA) {
+               for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_rdma); i++) {
+                       if (port->disc_addr.tsas.rdma.qptype == nvmet_addr_tsas_rdma[i].type)
+                               return sprintf(page, "%s\n", nvmet_addr_tsas_rdma[i].name);
+               }
+       }
+       return sprintf(page, "reserved\n");
+}
+
+static ssize_t nvmet_addr_tsas_store(struct config_item *item,
+               const char *page, size_t count)
+{
+       struct nvmet_port *port = to_nvmet_port(item);
+       u8 sectype;
+       int i;
+
+       if (nvmet_is_port_enabled(port, __func__))
+               return -EACCES;
+
+       if (port->disc_addr.trtype != NVMF_TRTYPE_TCP)
+               return -EINVAL;
+
+       for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_tcp); i++) {
+               if (sysfs_streq(page, nvmet_addr_tsas_tcp[i].name)) {
+                       sectype = nvmet_addr_tsas_tcp[i].type;
+                       goto found;
+               }
+       }
+
+       pr_err("Invalid value '%s' for tsas\n", page);
+       return -EINVAL;
+
+found:
+       nvmet_port_init_tsas_tcp(port, sectype);
+       return count;
+}
+
+CONFIGFS_ATTR(nvmet_, addr_tsas);
+
 /*
  * Namespace structures & file operation functions below
  */
        &nvmet_attr_addr_traddr,
        &nvmet_attr_addr_trsvcid,
        &nvmet_attr_addr_trtype,
+       &nvmet_attr_addr_tsas,
        &nvmet_attr_param_inline_data_size,
 #ifdef CONFIG_BLK_DEV_INTEGRITY
        &nvmet_attr_param_pi_enable,