diff options
-rw-r--r-- | sys/cam/ctl/ctl.c | 234 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend.c | 118 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend.h | 65 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend_cam_sim.c | 114 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend_internal.c | 83 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend_iscsi.c | 89 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_frontend_iscsi.h | 2 | ||||
-rw-r--r-- | sys/cam/ctl/ctl_private.h | 7 | ||||
-rw-r--r-- | sys/cam/ctl/scsi_ctl.c | 138 |
9 files changed, 438 insertions, 412 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c index d2f5b84..85e43e2 100644 --- a/sys/cam/ctl/ctl.c +++ b/sys/cam/ctl/ctl.c @@ -466,6 +466,11 @@ static moduledata_t ctl_moduledata = { DECLARE_MODULE(ctl, ctl_moduledata, SI_SUB_CONFIGURE, SI_ORDER_THIRD); MODULE_VERSION(ctl, 1); +static struct ctl_frontend ioctl_frontend = +{ + .name = "ioctl", +}; + static void ctl_isc_handler_finish_xfer(struct ctl_softc *ctl_softc, union ctl_ha_msg *msg_info) @@ -926,7 +931,7 @@ ctl_init(void) { struct ctl_softc *softc; struct ctl_io_pool *internal_pool, *emergency_pool, *other_pool; - struct ctl_frontend *fe; + struct ctl_port *port; uint8_t sc_id =0; int i, error, retval; //int isc_retval; @@ -1006,6 +1011,7 @@ ctl_init(void) STAILQ_INIT(&softc->lun_list); STAILQ_INIT(&softc->pending_lun_queue); STAILQ_INIT(&softc->fe_list); + STAILQ_INIT(&softc->port_list); STAILQ_INIT(&softc->be_list); STAILQ_INIT(&softc->io_pools); @@ -1083,23 +1089,25 @@ ctl_init(void) /* * Initialize the ioctl front end. */ - fe = &softc->ioctl_info.fe; - sprintf(softc->ioctl_info.port_name, "CTL ioctl"); - fe->port_type = CTL_PORT_IOCTL; - fe->num_requested_ctl_io = 100; - fe->port_name = softc->ioctl_info.port_name; - fe->port_online = ctl_ioctl_online; - fe->port_offline = ctl_ioctl_offline; - fe->onoff_arg = &softc->ioctl_info; - fe->lun_enable = ctl_ioctl_lun_enable; - fe->lun_disable = ctl_ioctl_lun_disable; - fe->targ_lun_arg = &softc->ioctl_info; - fe->fe_datamove = ctl_ioctl_datamove; - fe->fe_done = ctl_ioctl_done; - fe->max_targets = 15; - fe->max_target_id = 15; - - if (ctl_frontend_register(&softc->ioctl_info.fe, + ctl_frontend_register(&ioctl_frontend); + port = &softc->ioctl_info.port; + port->frontend = &ioctl_frontend; + sprintf(softc->ioctl_info.port_name, "ioctl"); + port->port_type = CTL_PORT_IOCTL; + port->num_requested_ctl_io = 100; + port->port_name = softc->ioctl_info.port_name; + port->port_online = ctl_ioctl_online; + port->port_offline = ctl_ioctl_offline; + port->onoff_arg = &softc->ioctl_info; + port->lun_enable = ctl_ioctl_lun_enable; + port->lun_disable = ctl_ioctl_lun_disable; + port->targ_lun_arg = &softc->ioctl_info; + port->fe_datamove = ctl_ioctl_datamove; + port->fe_done = ctl_ioctl_done; + port->max_targets = 15; + port->max_target_id = 15; + + if (ctl_port_register(&softc->ioctl_info.port, (softc->flags & CTL_FLAG_MASTER_SHELF)) != 0) { printf("ctl: ioctl front end registration failed, will " "continue anyway\n"); @@ -1125,7 +1133,7 @@ ctl_shutdown(void) softc = (struct ctl_softc *)control_softc; - if (ctl_frontend_deregister(&softc->ioctl_info.fe) != 0) + if (ctl_port_deregister(&softc->ioctl_info.port) != 0) printf("ctl: ioctl front end deregistration failed\n"); mtx_lock(&softc->ctl_lock); @@ -1140,6 +1148,8 @@ ctl_shutdown(void) mtx_unlock(&softc->ctl_lock); + ctl_frontend_deregister(&ioctl_frontend); + /* * This will rip the rug out from under any FETDs or anyone else * that has a pool allocated. Since we increment our module @@ -1204,7 +1214,7 @@ int ctl_port_enable(ctl_port_type port_type) { struct ctl_softc *softc; - struct ctl_frontend *fe; + struct ctl_port *port; if (ctl_is_single == 0) { union ctl_ha_msg msg_info; @@ -1233,13 +1243,13 @@ ctl_port_enable(ctl_port_type port_type) softc = control_softc; - STAILQ_FOREACH(fe, &softc->fe_list, links) { - if (port_type & fe->port_type) + STAILQ_FOREACH(port, &softc->port_list, links) { + if (port_type & port->port_type) { #if 0 - printf("port %d\n", fe->targ_port); + printf("port %d\n", port->targ_port); #endif - ctl_frontend_online(fe); + ctl_port_online(port); } } @@ -1250,13 +1260,13 @@ int ctl_port_disable(ctl_port_type port_type) { struct ctl_softc *softc; - struct ctl_frontend *fe; + struct ctl_port *port; softc = control_softc; - STAILQ_FOREACH(fe, &softc->fe_list, links) { - if (port_type & fe->port_type) - ctl_frontend_offline(fe); + STAILQ_FOREACH(port, &softc->port_list, links) { + if (port_type & port->port_type) + ctl_port_offline(port); } return (0); @@ -1274,7 +1284,7 @@ ctl_port_list(struct ctl_port_entry *entries, int num_entries_alloced, ctl_port_type port_type, int no_virtual) { struct ctl_softc *softc; - struct ctl_frontend *fe; + struct ctl_port *port; int entries_dropped, entries_filled; int retval; int i; @@ -1287,14 +1297,14 @@ ctl_port_list(struct ctl_port_entry *entries, int num_entries_alloced, i = 0; mtx_lock(&softc->ctl_lock); - STAILQ_FOREACH(fe, &softc->fe_list, links) { + STAILQ_FOREACH(port, &softc->port_list, links) { struct ctl_port_entry *entry; - if ((fe->port_type & port_type) == 0) + if ((port->port_type & port_type) == 0) continue; if ((no_virtual != 0) - && (fe->virtual_port != 0)) + && (port->virtual_port != 0)) continue; if (entries_filled >= num_entries_alloced) { @@ -1303,13 +1313,13 @@ ctl_port_list(struct ctl_port_entry *entries, int num_entries_alloced, } entry = &entries[i]; - entry->port_type = fe->port_type; - strlcpy(entry->port_name, fe->port_name, + entry->port_type = port->port_type; + strlcpy(entry->port_name, port->port_name, sizeof(entry->port_name)); - entry->physical_port = fe->physical_port; - entry->virtual_port = fe->virtual_port; - entry->wwnn = fe->wwnn; - entry->wwpn = fe->wwpn; + entry->physical_port = port->physical_port; + entry->virtual_port = port->virtual_port; + entry->wwnn = port->wwnn; + entry->wwpn = port->wwpn; i++; entries_filled++; @@ -2134,7 +2144,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, break; } - io = ctl_alloc_io(softc->ioctl_info.fe.ctl_pool_ref); + io = ctl_alloc_io(softc->ioctl_info.port.ctl_pool_ref); if (io == NULL) { printf("ctl_ioctl: can't allocate ctl_io!\n"); retval = ENOSPC; @@ -2158,7 +2168,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, /* * The user sets the initiator ID, target and LUN IDs. */ - io->io_hdr.nexus.targ_port = softc->ioctl_info.fe.targ_port; + io->io_hdr.nexus.targ_port = softc->ioctl_info.port.targ_port; io->io_hdr.flags |= CTL_FLAG_USER_REQ; if ((io->io_hdr.io_type == CTL_IO_SCSI) && (io->scsiio.tag_type != CTL_TAG_UNTAGGED)) @@ -2181,20 +2191,20 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, case CTL_ENABLE_PORT: case CTL_DISABLE_PORT: case CTL_SET_PORT_WWNS: { - struct ctl_frontend *fe; + struct ctl_port *port; struct ctl_port_entry *entry; entry = (struct ctl_port_entry *)addr; mtx_lock(&softc->ctl_lock); - STAILQ_FOREACH(fe, &softc->fe_list, links) { + STAILQ_FOREACH(port, &softc->port_list, links) { int action, done; action = 0; done = 0; if ((entry->port_type == CTL_PORT_NONE) - && (entry->targ_port == fe->targ_port)) { + && (entry->targ_port == port->targ_port)) { /* * If the user only wants to enable or * disable or set WWNs on a specific port, @@ -2202,7 +2212,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, */ action = 1; done = 1; - } else if (entry->port_type & fe->port_type) { + } else if (entry->port_type & port->port_type) { /* * Compare the user's type mask with the * particular frontend type to see if we @@ -2237,21 +2247,21 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, STAILQ_FOREACH(lun, &softc->lun_list, links) { - fe->lun_enable(fe->targ_lun_arg, + port->lun_enable(port->targ_lun_arg, lun->target, lun->lun); } - ctl_frontend_online(fe); + ctl_port_online(port); } else if (cmd == CTL_DISABLE_PORT) { struct ctl_lun *lun; - ctl_frontend_offline(fe); + ctl_port_offline(port); STAILQ_FOREACH(lun, &softc->lun_list, links) { - fe->lun_disable( - fe->targ_lun_arg, + port->lun_disable( + port->targ_lun_arg, lun->target, lun->lun); } @@ -2260,7 +2270,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, mtx_lock(&softc->ctl_lock); if (cmd == CTL_SET_PORT_WWNS) - ctl_frontend_set_wwns(fe, + ctl_port_set_wwns(port, (entry->flags & CTL_PORT_WWNN_VALID) ? 1 : 0, entry->wwnn, (entry->flags & CTL_PORT_WWPN_VALID) ? @@ -2273,7 +2283,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, break; } case CTL_GET_PORT_LIST: { - struct ctl_frontend *fe; + struct ctl_port *port; struct ctl_port_list *list; int i; @@ -2293,7 +2303,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, list->dropped_num = 0; i = 0; mtx_lock(&softc->ctl_lock); - STAILQ_FOREACH(fe, &softc->fe_list, links) { + STAILQ_FOREACH(port, &softc->port_list, links) { struct ctl_port_entry entry, *list_entry; if (list->fill_num >= list->alloc_num) { @@ -2301,15 +2311,15 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, continue; } - entry.port_type = fe->port_type; - strlcpy(entry.port_name, fe->port_name, + entry.port_type = port->port_type; + strlcpy(entry.port_name, port->port_name, sizeof(entry.port_name)); - entry.targ_port = fe->targ_port; - entry.physical_port = fe->physical_port; - entry.virtual_port = fe->virtual_port; - entry.wwnn = fe->wwnn; - entry.wwpn = fe->wwpn; - if (fe->status & CTL_PORT_STATUS_ONLINE) + entry.targ_port = port->targ_port; + entry.physical_port = port->physical_port; + entry.virtual_port = port->virtual_port; + entry.wwnn = port->wwnn; + entry.wwpn = port->wwpn; + if (port->status & CTL_PORT_STATUS_ONLINE) entry.online = 1; else entry.online = 0; @@ -2844,6 +2854,7 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, } case CTL_DUMP_STRUCTS: { int i, j, k; + struct ctl_port *port; struct ctl_frontend *fe; printf("CTL IID to WWPN map start:\n"); @@ -2881,26 +2892,25 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, } } printf("CTL Persistent Reservation information end\n"); - printf("CTL Frontends:\n"); + printf("CTL Ports:\n"); /* * XXX KDM calling this without a lock. We'd likely want * to drop the lock before calling the frontend's dump * routine anyway. */ + STAILQ_FOREACH(port, &softc->port_list, links) { + printf("Port %s Frontend %s Type %u pport %d vport %d WWNN " + "%#jx WWPN %#jx\n", port->port_name, + port->frontend->name, port->port_type, + port->physical_port, port->virtual_port, + (uintmax_t)port->wwnn, (uintmax_t)port->wwpn); + } + printf("CTL Port information end\n"); + printf("CTL Frontends:\n"); STAILQ_FOREACH(fe, &softc->fe_list, links) { - printf("Frontend %s Type %u pport %d vport %d WWNN " - "%#jx WWPN %#jx\n", fe->port_name, fe->port_type, - fe->physical_port, fe->virtual_port, - (uintmax_t)fe->wwnn, (uintmax_t)fe->wwpn); - - /* - * Frontends are not required to support the dump - * routine. - */ - if (fe->fe_dump == NULL) - continue; - - fe->fe_dump(); + printf("Frontend %s\n", fe->name); + if (fe->fe_dump != NULL) + fe->fe_dump(); } printf("CTL Frontend information end\n"); break; @@ -3112,14 +3122,15 @@ ctl_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, mtx_lock(&softc->ctl_lock); STAILQ_FOREACH(fe, &softc->fe_list, links) { - if (strcmp(fe->port_name, "iscsi") == 0) + if (strcmp(fe->name, "iscsi") == 0) break; } mtx_unlock(&softc->ctl_lock); if (fe == NULL) { ci->status = CTL_ISCSI_ERROR; - snprintf(ci->error_str, sizeof(ci->error_str), "Backend \"iscsi\" not found."); + snprintf(ci->error_str, sizeof(ci->error_str), + "Frontend \"iscsi\" not found."); break; } @@ -3378,7 +3389,6 @@ ctl_pool_create(struct ctl_softc *ctl_softc, ctl_pool_type pool_type, #if 0 if ((pool_type != CTL_POOL_EMERGENCY) && (pool_type != CTL_POOL_INTERNAL) - && (pool_type != CTL_POOL_IOCTL) && (pool_type != CTL_POOL_4OTHERSC)) MOD_INC_USE_COUNT; #endif @@ -3432,7 +3442,7 @@ ctl_pool_release(struct ctl_io_pool *pool) #if 0 if ((pool->type != CTL_POOL_EMERGENCY) && (pool->type != CTL_POOL_INTERNAL) - && (pool->type != CTL_POOL_IOCTL)) + && (pool->type != CTL_POOL_4OTHERSC)) MOD_DEC_USE_COUNT; #endif @@ -4138,7 +4148,7 @@ ctl_alloc_lun(struct ctl_softc *ctl_softc, struct ctl_lun *ctl_lun, struct ctl_be_lun *const be_lun, struct ctl_id target_id) { struct ctl_lun *nlun, *lun; - struct ctl_frontend *fe; + struct ctl_port *port; int lun_number, i, lun_malloced; if (be_lun == NULL) @@ -4287,17 +4297,17 @@ ctl_alloc_lun(struct ctl_softc *ctl_softc, struct ctl_lun *ctl_lun, * already. Enable the target ID if it hasn't been enabled, and * enable this particular LUN. */ - STAILQ_FOREACH(fe, &ctl_softc->fe_list, links) { + STAILQ_FOREACH(port, &ctl_softc->port_list, links) { int retval; - retval = fe->lun_enable(fe->targ_lun_arg, target_id,lun_number); + retval = port->lun_enable(port->targ_lun_arg, target_id,lun_number); if (retval != 0) { printf("ctl_alloc_lun: FETD %s port %d returned error " "%d for lun_enable on target %ju lun %d\n", - fe->port_name, fe->targ_port, retval, + port->port_name, port->targ_port, retval, (uintmax_t)target_id.id, lun_number); } else - fe->status |= CTL_PORT_STATUS_LUN_ONLINE; + port->status |= CTL_PORT_STATUS_LUN_ONLINE; } return (0); } @@ -4313,7 +4323,7 @@ ctl_free_lun(struct ctl_lun *lun) { struct ctl_softc *softc; #if 0 - struct ctl_frontend *fe; + struct ctl_port *port; #endif struct ctl_lun *nlun; int i; @@ -4337,7 +4347,7 @@ ctl_free_lun(struct ctl_lun *lun) * XXX KDM this scheme only works for a single target/multiple LUN * setup. It needs to be revamped for a multiple target scheme. * - * XXX KDM this results in fe->lun_disable() getting called twice, + * XXX KDM this results in port->lun_disable() getting called twice, * once when ctl_disable_lun() is called, and a second time here. * We really need to re-think the LUN disable semantics. There * should probably be several steps/levels to LUN removal: @@ -4349,37 +4359,37 @@ ctl_free_lun(struct ctl_lun *lun) * the front end ports, at least for individual LUNs. */ #if 0 - STAILQ_FOREACH(fe, &softc->fe_list, links) { + STAILQ_FOREACH(port, &softc->port_list, links) { int retval; - retval = fe->lun_disable(fe->targ_lun_arg, lun->target, + retval = port->lun_disable(port->targ_lun_arg, lun->target, lun->lun); if (retval != 0) { printf("ctl_free_lun: FETD %s port %d returned error " "%d for lun_disable on target %ju lun %jd\n", - fe->port_name, fe->targ_port, retval, + port->port_name, port->targ_port, retval, (uintmax_t)lun->target.id, (intmax_t)lun->lun); } if (STAILQ_FIRST(&softc->lun_list) == NULL) { - fe->status &= ~CTL_PORT_STATUS_LUN_ONLINE; + port->status &= ~CTL_PORT_STATUS_LUN_ONLINE; - retval = fe->targ_disable(fe->targ_lun_arg,lun->target); + retval = port->targ_disable(port->targ_lun_arg,lun->target); if (retval != 0) { printf("ctl_free_lun: FETD %s port %d " "returned error %d for targ_disable on " - "target %ju\n", fe->port_name, - fe->targ_port, retval, + "target %ju\n", port->port_name, + port->targ_port, retval, (uintmax_t)lun->target.id); } else - fe->status &= ~CTL_PORT_STATUS_TARG_ONLINE; + port->status &= ~CTL_PORT_STATUS_TARG_ONLINE; - if ((fe->status & CTL_PORT_STATUS_TARG_ONLINE) != 0) + if ((port->status & CTL_PORT_STATUS_TARG_ONLINE) != 0) continue; #if 0 - fe->port_offline(fe->onoff_arg); - fe->status &= ~CTL_PORT_STATUS_ONLINE; + port->port_offline(port->onoff_arg); + port->status &= ~CTL_PORT_STATUS_ONLINE; #endif } } @@ -4434,7 +4444,7 @@ int ctl_enable_lun(struct ctl_be_lun *be_lun) { struct ctl_softc *ctl_softc; - struct ctl_frontend *fe, *nfe; + struct ctl_port *port, *nport; struct ctl_lun *lun; int retval; @@ -4456,8 +4466,8 @@ ctl_enable_lun(struct ctl_be_lun *be_lun) lun->flags &= ~CTL_LUN_DISABLED; mtx_unlock(&lun->lun_lock); - for (fe = STAILQ_FIRST(&ctl_softc->fe_list); fe != NULL; fe = nfe) { - nfe = STAILQ_NEXT(fe, links); + for (port = STAILQ_FIRST(&ctl_softc->port_list); port != NULL; port = nport) { + nport = STAILQ_NEXT(port, links); /* * Drop the lock while we call the FETD's enable routine. @@ -4465,18 +4475,18 @@ ctl_enable_lun(struct ctl_be_lun *be_lun) * case of the internal initiator frontend. */ mtx_unlock(&ctl_softc->ctl_lock); - retval = fe->lun_enable(fe->targ_lun_arg, lun->target,lun->lun); + retval = port->lun_enable(port->targ_lun_arg, lun->target,lun->lun); mtx_lock(&ctl_softc->ctl_lock); if (retval != 0) { printf("%s: FETD %s port %d returned error " "%d for lun_enable on target %ju lun %jd\n", - __func__, fe->port_name, fe->targ_port, retval, + __func__, port->port_name, port->targ_port, retval, (uintmax_t)lun->target.id, (intmax_t)lun->lun); } #if 0 else { /* NOTE: TODO: why does lun enable affect port status? */ - fe->status |= CTL_PORT_STATUS_LUN_ONLINE; + port->status |= CTL_PORT_STATUS_LUN_ONLINE; } #endif } @@ -4490,7 +4500,7 @@ int ctl_disable_lun(struct ctl_be_lun *be_lun) { struct ctl_softc *ctl_softc; - struct ctl_frontend *fe; + struct ctl_port *port; struct ctl_lun *lun; int retval; @@ -4508,7 +4518,7 @@ ctl_disable_lun(struct ctl_be_lun *be_lun) lun->flags |= CTL_LUN_DISABLED; mtx_unlock(&lun->lun_lock); - STAILQ_FOREACH(fe, &ctl_softc->fe_list, links) { + STAILQ_FOREACH(port, &ctl_softc->port_list, links) { mtx_unlock(&ctl_softc->ctl_lock); /* * Drop the lock before we call the frontend's disable @@ -4517,13 +4527,13 @@ ctl_disable_lun(struct ctl_be_lun *be_lun) * XXX KDM what happens if the frontend list changes while * we're traversing it? It's unlikely, but should be handled. */ - retval = fe->lun_disable(fe->targ_lun_arg, lun->target, + retval = port->lun_disable(port->targ_lun_arg, lun->target, lun->lun); mtx_lock(&ctl_softc->ctl_lock); if (retval != 0) { printf("ctl_alloc_lun: FETD %s port %d returned error " "%d for lun_disable on target %ju lun %jd\n", - fe->port_name, fe->targ_port, retval, + port->port_name, port->targ_port, retval, (uintmax_t)lun->target.id, (intmax_t)lun->lun); } } @@ -9475,16 +9485,16 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) struct scsi_vpd_id_t10 *t10id; struct ctl_softc *ctl_softc; struct ctl_lun *lun; - struct ctl_frontend *fe; + struct ctl_port *port; char *val; int data_len, devid_len; ctl_softc = control_softc; - fe = ctl_softc->ctl_ports[ctl_port_idx(ctsio->io_hdr.nexus.targ_port)]; + port = ctl_softc->ctl_ports[ctl_port_idx(ctsio->io_hdr.nexus.targ_port)]; - if (fe->devid != NULL) - return ((fe->devid)(ctsio, alloc_len)); + if (port->devid != NULL) + return ((port->devid)(ctsio, alloc_len)); lun = (struct ctl_lun *)ctsio->io_hdr.ctl_private[CTL_PRIV_LUN].ptr; @@ -9547,7 +9557,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) /* * For Fibre channel, */ - if (fe->port_type == CTL_PORT_FC) + if (port->port_type == CTL_PORT_FC) { desc->proto_codeset = (SCSI_PROTO_FC << 4) | SVPD_ID_CODESET_ASCII; @@ -9596,7 +9606,7 @@ ctl_inquiry_evpd_devid(struct ctl_scsiio *ctsio, int alloc_len) desc1->identifier[7] += ctsio->io_hdr.nexus.targ_port; #endif - be64enc(desc1->identifier, fe->wwpn); + be64enc(desc1->identifier, port->wwpn); /* * desc2 is for the Relative Target Port(type 4h) identifier diff --git a/sys/cam/ctl/ctl_frontend.c b/sys/cam/ctl/ctl_frontend.c index 2bc6ade..817b2bc 100644 --- a/sys/cam/ctl/ctl_frontend.c +++ b/sys/cam/ctl/ctl_frontend.c @@ -66,7 +66,60 @@ __FBSDID("$FreeBSD$"); extern struct ctl_softc *control_softc; int -ctl_frontend_register(struct ctl_frontend *fe, int master_shelf) +ctl_frontend_register(struct ctl_frontend *fe) +{ + struct ctl_frontend *fe_tmp; + + KASSERT(control_softc != NULL, ("CTL is not initialized")); + + /* + * Sanity check, make sure this isn't a duplicate registration. + */ + mtx_lock(&control_softc->ctl_lock); + STAILQ_FOREACH(fe_tmp, &control_softc->fe_list, links) { + if (strcmp(fe_tmp->name, fe->name) == 0) { + mtx_unlock(&control_softc->ctl_lock); + return (-1); + } + } + mtx_unlock(&control_softc->ctl_lock); + STAILQ_INIT(&fe->port_list); + + /* + * Call the frontend's initialization routine. + */ + if (fe->init != NULL) + fe->init(); + + mtx_lock(&control_softc->ctl_lock); + control_softc->num_frontends++; + STAILQ_INSERT_TAIL(&control_softc->fe_list, fe, links); + mtx_unlock(&control_softc->ctl_lock); + return (0); +} + +int +ctl_frontend_deregister(struct ctl_frontend *fe) +{ + + if (!STAILQ_EMPTY(&fe->port_list)) + return (-1); + + mtx_lock(&control_softc->ctl_lock); + STAILQ_REMOVE(&control_softc->fe_list, fe, ctl_frontend, links); + control_softc->num_frontends--; + mtx_unlock(&control_softc->ctl_lock); + + /* + * Call the frontend's shutdown routine. + */ + if (fe->shutdown != NULL) + fe->shutdown(); + return (0); +} + +int +ctl_port_register(struct ctl_port *port, int master_shelf) { struct ctl_io_pool *pool; int port_num; @@ -80,13 +133,13 @@ ctl_frontend_register(struct ctl_frontend *fe, int master_shelf) port_num = ctl_ffz(&control_softc->ctl_port_mask, CTL_MAX_PORTS); if ((port_num == -1) || (ctl_set_mask(&control_softc->ctl_port_mask, port_num) == -1)) { - fe->targ_port = -1; + port->targ_port = -1; mtx_unlock(&control_softc->ctl_lock); return (1); } - control_softc->num_frontends++; - + control_softc->num_ports++; mtx_unlock(&control_softc->ctl_lock); + /* * We add 20 to whatever the caller requests, so he doesn't get * burned by queueing things back to the pending sense queue. In @@ -95,36 +148,30 @@ ctl_frontend_register(struct ctl_frontend *fe, int master_shelf) * pending sense queue on the next command, whether or not it is * a REQUEST SENSE. */ - retval = ctl_pool_create(control_softc, - (fe->port_type != CTL_PORT_IOCTL) ? - CTL_POOL_FETD : CTL_POOL_IOCTL, - fe->num_requested_ctl_io + 20, &pool); + retval = ctl_pool_create(control_softc, CTL_POOL_FETD, + port->num_requested_ctl_io + 20, &pool); if (retval != 0) { - fe->targ_port = -1; + port->targ_port = -1; mtx_lock(&control_softc->ctl_lock); ctl_clear_mask(&control_softc->ctl_port_mask, port_num); mtx_unlock(&control_softc->ctl_lock); return (retval); } + port->ctl_pool_ref = pool; mtx_lock(&control_softc->ctl_lock); - - /* For now assume master shelf */ - //fe->targ_port = port_num; - fe->targ_port = port_num + (master_shelf!=0 ? 0 : CTL_MAX_PORTS); - fe->max_initiators = CTL_MAX_INIT_PER_PORT; - STAILQ_INSERT_TAIL(&control_softc->fe_list, fe, links); - control_softc->ctl_ports[port_num] = fe; - + port->targ_port = port_num + (master_shelf != 0 ? 0 : CTL_MAX_PORTS); + port->max_initiators = CTL_MAX_INIT_PER_PORT; + STAILQ_INSERT_TAIL(&port->frontend->port_list, port, links); + STAILQ_INSERT_TAIL(&control_softc->port_list, port, links); + control_softc->ctl_ports[port_num] = port; mtx_unlock(&control_softc->ctl_lock); - fe->ctl_pool_ref = pool; - return (retval); } int -ctl_frontend_deregister(struct ctl_frontend *fe) +ctl_port_deregister(struct ctl_port *port) { struct ctl_io_pool *pool; int port_num; @@ -132,18 +179,19 @@ ctl_frontend_deregister(struct ctl_frontend *fe) retval = 0; - pool = (struct ctl_io_pool *)fe->ctl_pool_ref; + pool = (struct ctl_io_pool *)port->ctl_pool_ref; - if (fe->targ_port == -1) { + if (port->targ_port == -1) { retval = 1; goto bailout; } mtx_lock(&control_softc->ctl_lock); - STAILQ_REMOVE(&control_softc->fe_list, fe, ctl_frontend, links); - control_softc->num_frontends--; - port_num = (fe->targ_port < CTL_MAX_PORTS) ? fe->targ_port : - fe->targ_port - CTL_MAX_PORTS; + STAILQ_REMOVE(&control_softc->port_list, port, ctl_port, links); + STAILQ_REMOVE(&port->frontend->port_list, port, ctl_port, fe_links); + control_softc->num_ports--; + port_num = (port->targ_port < CTL_MAX_PORTS) ? port->targ_port : + port->targ_port - CTL_MAX_PORTS; ctl_clear_mask(&control_softc->ctl_port_mask, port_num); control_softc->ctl_ports[port_num] = NULL; mtx_unlock(&control_softc->ctl_lock); @@ -155,30 +203,30 @@ bailout: } void -ctl_frontend_set_wwns(struct ctl_frontend *fe, int wwnn_valid, uint64_t wwnn, +ctl_port_set_wwns(struct ctl_port *port, int wwnn_valid, uint64_t wwnn, int wwpn_valid, uint64_t wwpn) { if (wwnn_valid) - fe->wwnn = wwnn; + port->wwnn = wwnn; if (wwpn_valid) - fe->wwpn = wwpn; + port->wwpn = wwpn; } void -ctl_frontend_online(struct ctl_frontend *fe) +ctl_port_online(struct ctl_port *port) { - fe->port_online(fe->onoff_arg); + port->port_online(port->onoff_arg); /* XXX KDM need a lock here? */ - fe->status |= CTL_PORT_STATUS_ONLINE; + port->status |= CTL_PORT_STATUS_ONLINE; } void -ctl_frontend_offline(struct ctl_frontend *fe) +ctl_port_offline(struct ctl_port *port) { - fe->port_offline(fe->onoff_arg); + port->port_offline(port->onoff_arg); /* XXX KDM need a lock here? */ - fe->status &= ~CTL_PORT_STATUS_ONLINE; + port->status &= ~CTL_PORT_STATUS_ONLINE; } /* diff --git a/sys/cam/ctl/ctl_frontend.h b/sys/cam/ctl/ctl_frontend.h index bd01e5d8..97fde88 100644 --- a/sys/cam/ctl/ctl_frontend.h +++ b/sys/cam/ctl/ctl_frontend.h @@ -39,6 +39,8 @@ #ifndef _CTL_FRONTEND_H_ #define _CTL_FRONTEND_H_ +#define CTL_FE_NAME_LEN 32 + typedef enum { CTL_PORT_STATUS_NONE = 0x00, CTL_PORT_STATUS_ONLINE = 0x01, @@ -46,6 +48,8 @@ typedef enum { CTL_PORT_STATUS_LUN_ONLINE = 0x04 } ctl_port_status; +typedef int (*fe_init_t)(void); +typedef void (*fe_shutdown_t)(void); typedef void (*port_func_t)(void *onoff_arg); typedef int (*targ_func_t)(void *arg, struct ctl_id targ_id); typedef int (*lun_func_t)(void *arg, struct ctl_id targ_id, int lun_id); @@ -53,6 +57,31 @@ typedef int (*fe_ioctl_t)(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td); typedef int (*fe_devid_t)(struct ctl_scsiio *ctsio, int alloc_len); +#define CTL_FRONTEND_DECLARE(name, driver) \ + static int name ## _modevent(module_t mod, int type, void *data) \ + { \ + switch (type) { \ + case MOD_LOAD: \ + ctl_frontend_register( \ + (struct ctl_frontend *)data); \ + break; \ + case MOD_UNLOAD: \ + printf(#name " module unload - not possible for this module type\n"); \ + return EINVAL; \ + default: \ + return EOPNOTSUPP; \ + } \ + return 0; \ + } \ + static moduledata_t name ## _mod = { \ + #name, \ + name ## _modevent, \ + (void *)&driver \ + }; \ + DECLARE_MODULE(name, name ## _mod, SI_SUB_CONFIGURE, SI_ORDER_FOURTH); \ + MODULE_DEPEND(name, ctl, 1, 1, 1); \ + MODULE_DEPEND(name, cam, 1, 1, 1) + /* * The ctl_frontend structure is the registration mechanism between a FETD * (Front End Target Driver) and the CTL layer. Here is a description of @@ -179,7 +208,8 @@ typedef int (*fe_devid_t)(struct ctl_scsiio *ctsio, int alloc_len); * links: Linked list pointers, used by CTL. The FETD * shouldn't touch this field. */ -struct ctl_frontend { +struct ctl_port { + struct ctl_frontend *frontend; ctl_port_type port_type; /* passed to CTL */ int num_requested_ctl_io; /* passed to CTL */ char *port_name; /* passed to CTL */ @@ -190,12 +220,10 @@ struct ctl_frontend { void *onoff_arg; /* passed to CTL */ lun_func_t lun_enable; /* passed to CTL */ lun_func_t lun_disable; /* passed to CTL */ - fe_ioctl_t ioctl; /* passed to CTL */ fe_devid_t devid; /* passed to CTL */ void *targ_lun_arg; /* passed to CTL */ void (*fe_datamove)(union ctl_io *io); /* passed to CTL */ void (*fe_done)(union ctl_io *io); /* passed to CTL */ - void (*fe_dump)(void); /* passed to CTL */ int max_targets; /* passed to CTL */ int max_target_id; /* passed to CTL */ int32_t targ_port; /* passed back to FETD */ @@ -204,6 +232,17 @@ struct ctl_frontend { uint64_t wwnn; /* set by CTL before online */ uint64_t wwpn; /* set by CTL before online */ ctl_port_status status; /* used by CTL */ + STAILQ_ENTRY(ctl_port) fe_links; /* used by CTL */ + STAILQ_ENTRY(ctl_port) links; /* used by CTL */ +}; + +struct ctl_frontend { + char name[CTL_FE_NAME_LEN]; /* passed to CTL */ + fe_init_t init; /* passed to CTL */ + fe_ioctl_t ioctl; /* passed to CTL */ + void (*fe_dump)(void); /* passed to CTL */ + fe_shutdown_t shutdown; /* passed to CTL */ + STAILQ_HEAD(, ctl_port) port_list; /* used by CTL */ STAILQ_ENTRY(ctl_frontend) links; /* used by CTL */ }; @@ -211,7 +250,7 @@ struct ctl_frontend { * This may block until resources are allocated. Called at FETD module load * time. Returns 0 for success, non-zero for failure. */ -int ctl_frontend_register(struct ctl_frontend *fe, int master_SC); +int ctl_frontend_register(struct ctl_frontend *fe); /* * Called at FETD module unload time. @@ -220,20 +259,32 @@ int ctl_frontend_register(struct ctl_frontend *fe, int master_SC); int ctl_frontend_deregister(struct ctl_frontend *fe); /* + * This may block until resources are allocated. Called at FETD module load + * time. Returns 0 for success, non-zero for failure. + */ +int ctl_port_register(struct ctl_port *fe, int master_SC); + +/* + * Called at FETD module unload time. + * Returns 0 for success, non-zero for failure. + */ +int ctl_port_deregister(struct ctl_port *fe); + +/* * Called to set the WWNN and WWPN for a particular frontend. */ -void ctl_frontend_set_wwns(struct ctl_frontend *fe, int wwnn_valid, +void ctl_port_set_wwns(struct ctl_port *port, int wwnn_valid, uint64_t wwnn, int wwpn_valid, uint64_t wwpn); /* * Called to bring a particular frontend online. */ -void ctl_frontend_online(struct ctl_frontend *fe); +void ctl_port_online(struct ctl_port *fe); /* * Called to take a particular frontend offline. */ -void ctl_frontend_offline(struct ctl_frontend *fe); +void ctl_port_offline(struct ctl_port *fe); /* * This routine queues I/O and task management requests from the FETD to the diff --git a/sys/cam/ctl/ctl_frontend_cam_sim.c b/sys/cam/ctl/ctl_frontend_cam_sim.c index 7461356..2cea264 100644 --- a/sys/cam/ctl/ctl_frontend_cam_sim.c +++ b/sys/cam/ctl/ctl_frontend_cam_sim.c @@ -74,13 +74,12 @@ struct cfcs_io { }; struct cfcs_softc { - struct ctl_frontend fe; + struct ctl_port port; char port_name[32]; struct cam_sim *sim; struct cam_devq *devq; struct cam_path *path; struct mtx lock; - char lock_desc[32]; uint64_t wwnn; uint64_t wwpn; uint32_t cur_tag_num; @@ -97,7 +96,6 @@ struct cfcs_softc { CAM_SENSE_PHYS) int cfcs_init(void); -void cfcs_shutdown(void); static void cfcs_poll(struct cam_sim *sim); static void cfcs_online(void *arg); static void cfcs_offline(void *arg); @@ -122,25 +120,19 @@ SYSCTL_NODE(_kern_cam, OID_AUTO, ctl2cam, CTLFLAG_RD, 0, SYSCTL_INT(_kern_cam_ctl2cam, OID_AUTO, max_sense, CTLFLAG_RW, &cfcs_max_sense, 0, "Maximum sense data size"); -static int cfcs_module_event_handler(module_t, int /*modeventtype_t*/, void *); - -static moduledata_t cfcs_moduledata = { - "ctlcfcs", - cfcs_module_event_handler, - NULL +static struct ctl_frontend cfcs_frontend = +{ + .name = "camsim", + .init = cfcs_init, }; - -DECLARE_MODULE(ctlcfcs, cfcs_moduledata, SI_SUB_CONFIGURE, SI_ORDER_FOURTH); -MODULE_VERSION(ctlcfcs, 1); -MODULE_DEPEND(ctlcfi, ctl, 1, 1, 1); -MODULE_DEPEND(ctlcfi, cam, 1, 1, 1); +CTL_FRONTEND_DECLARE(ctlcfcs, cfcs_frontend); int cfcs_init(void) { struct cfcs_softc *softc; struct ccb_setasync csa; - struct ctl_frontend *fe; + struct ctl_port *port; #ifdef NEEDTOPORT char wwnn[8]; #endif @@ -149,32 +141,32 @@ cfcs_init(void) softc = &cfcs_softc; retval = 0; bzero(softc, sizeof(*softc)); - sprintf(softc->lock_desc, "ctl2cam"); - mtx_init(&softc->lock, softc->lock_desc, NULL, MTX_DEF); - fe = &softc->fe; + mtx_init(&softc->lock, "ctl2cam", NULL, MTX_DEF); + port = &softc->port; - fe->port_type = CTL_PORT_INTERNAL; + port->frontend = &cfcs_frontend; + port->port_type = CTL_PORT_INTERNAL; /* XXX KDM what should the real number be here? */ - fe->num_requested_ctl_io = 4096; - snprintf(softc->port_name, sizeof(softc->port_name), "ctl2cam"); - fe->port_name = softc->port_name; - fe->port_online = cfcs_online; - fe->port_offline = cfcs_offline; - fe->onoff_arg = softc; - fe->lun_enable = cfcs_lun_enable; - fe->lun_disable = cfcs_lun_disable; - fe->targ_lun_arg = softc; - fe->fe_datamove = cfcs_datamove; - fe->fe_done = cfcs_done; + port->num_requested_ctl_io = 4096; + snprintf(softc->port_name, sizeof(softc->port_name), "camsim"); + port->port_name = softc->port_name; + port->port_online = cfcs_online; + port->port_offline = cfcs_offline; + port->onoff_arg = softc; + port->lun_enable = cfcs_lun_enable; + port->lun_disable = cfcs_lun_disable; + port->targ_lun_arg = softc; + port->fe_datamove = cfcs_datamove; + port->fe_done = cfcs_done; /* XXX KDM what should we report here? */ /* XXX These should probably be fetched from CTL. */ - fe->max_targets = 1; - fe->max_target_id = 15; + port->max_targets = 1; + port->max_target_id = 15; - retval = ctl_frontend_register(fe, /*master_SC*/ 1); + retval = ctl_port_register(port, /*master_SC*/ 1); if (retval != 0) { - printf("%s: ctl_frontend_register() failed with error %d!\n", + printf("%s: ctl_port_register() failed with error %d!\n", __func__, retval); mtx_destroy(&softc->lock); return (retval); @@ -186,30 +178,30 @@ cfcs_init(void) #ifdef NEEDTOPORT ddb_GetWWNN((char *)wwnn); softc->wwnn = be64dec(wwnn); - softc->wwpn = softc->wwnn + (softc->fe.targ_port & 0xff); + softc->wwpn = softc->wwnn + (softc->port.targ_port & 0xff); #endif /* * If the CTL frontend didn't tell us what our WWNN/WWPN is, go * ahead and set something random. */ - if (fe->wwnn == 0) { + if (port->wwnn == 0) { uint64_t random_bits; arc4rand(&random_bits, sizeof(random_bits), 0); softc->wwnn = (random_bits & 0x0000000fffffff00ULL) | /* Company ID */ 0x5000000000000000ULL | /* NL-Port */ 0x0300; - softc->wwpn = softc->wwnn + fe->targ_port + 1; - fe->wwnn = softc->wwnn; - fe->wwpn = softc->wwpn; + softc->wwpn = softc->wwnn + port->targ_port + 1; + port->wwnn = softc->wwnn; + port->wwpn = softc->wwpn; } else { - softc->wwnn = fe->wwnn; - softc->wwpn = fe->wwpn; + softc->wwnn = port->wwnn; + softc->wwpn = port->wwpn; } mtx_lock(&softc->lock); - softc->devq = cam_simq_alloc(fe->num_requested_ctl_io); + softc->devq = cam_simq_alloc(port->num_requested_ctl_io); if (softc->devq == NULL) { printf("%s: error allocating devq\n", __func__); retval = ENOMEM; @@ -218,7 +210,7 @@ cfcs_init(void) softc->sim = cam_sim_alloc(cfcs_action, cfcs_poll, softc->port_name, softc, /*unit*/ 0, &softc->lock, 1, - fe->num_requested_ctl_io, softc->devq); + port->num_requested_ctl_io, softc->devq); if (softc->sim == NULL) { printf("%s: error allocating SIM\n", __func__); retval = ENOMEM; @@ -269,26 +261,6 @@ cfcs_poll(struct cam_sim *sim) } -void -cfcs_shutdown(void) -{ - -} - -static int -cfcs_module_event_handler(module_t mod, int what, void *arg) -{ - - switch (what) { - case MOD_LOAD: - return (cfcs_init()); - case MOD_UNLOAD: - return (EBUSY); - default: - return (EOPNOTSUPP); - } -} - static void cfcs_onoffline(void *arg, int online) { @@ -570,7 +542,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) return; } - io = ctl_alloc_io(softc->fe.ctl_pool_ref); + io = ctl_alloc_io(softc->port.ctl_pool_ref); if (io == NULL) { printf("%s: can't allocate ctl_io\n", __func__); ccb->ccb_h.status = CAM_BUSY | CAM_DEV_QFRZN; @@ -589,7 +561,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) */ io->io_hdr.io_type = CTL_IO_SCSI; io->io_hdr.nexus.initid.id = 1; - io->io_hdr.nexus.targ_port = softc->fe.targ_port; + io->io_hdr.nexus.targ_port = softc->port.targ_port; /* * XXX KDM how do we handle target IDs? */ @@ -665,7 +637,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) return; } - io = ctl_alloc_io(softc->fe.ctl_pool_ref); + io = ctl_alloc_io(softc->port.ctl_pool_ref); if (io == NULL) { ccb->ccb_h.status = CAM_BUSY | CAM_DEV_QFRZN; xpt_freeze_devq(ccb->ccb_h.path, 1); @@ -680,7 +652,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) io->io_hdr.io_type = CTL_IO_TASK; io->io_hdr.nexus.initid.id = 1; - io->io_hdr.nexus.targ_port = softc->fe.targ_port; + io->io_hdr.nexus.targ_port = softc->port.targ_port; io->io_hdr.nexus.targ_target.id = ccb->ccb_h.target_id; io->io_hdr.nexus.targ_lun = ccb->ccb_h.target_lun; io->taskio.task_action = CTL_TASK_ABORT_TASK; @@ -737,7 +709,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) fc->bitrate = 800000; fc->wwnn = softc->wwnn; fc->wwpn = softc->wwpn; - fc->port = softc->fe.targ_port; + fc->port = softc->port.targ_port; fc->valid |= CTS_FC_VALID_WWNN | CTS_FC_VALID_WWPN | CTS_FC_VALID_PORT; ccb->ccb_h.status = CAM_REQ_CMP; @@ -760,7 +732,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) return; } - io = ctl_alloc_io(softc->fe.ctl_pool_ref); + io = ctl_alloc_io(softc->port.ctl_pool_ref); if (io == NULL) { ccb->ccb_h.status = CAM_BUSY | CAM_DEV_QFRZN; xpt_freeze_devq(ccb->ccb_h.path, 1); @@ -775,7 +747,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) io->io_hdr.io_type = CTL_IO_TASK; io->io_hdr.nexus.initid.id = 0; - io->io_hdr.nexus.targ_port = softc->fe.targ_port; + io->io_hdr.nexus.targ_port = softc->port.targ_port; io->io_hdr.nexus.targ_target.id = ccb->ccb_h.target_id; io->io_hdr.nexus.targ_lun = ccb->ccb_h.target_lun; if (ccb->ccb_h.func_code == XPT_RESET_BUS) @@ -829,7 +801,7 @@ cfcs_action(struct cam_sim *sim, union ccb *ccb) cpi->transport_version = 0; cpi->xport_specific.fc.wwnn = softc->wwnn; cpi->xport_specific.fc.wwpn = softc->wwpn; - cpi->xport_specific.fc.port = softc->fe.targ_port; + cpi->xport_specific.fc.port = softc->port.targ_port; cpi->xport_specific.fc.bitrate = 8 * 1000 * 1000; cpi->ccb_h.status = CAM_REQ_CMP; break; diff --git a/sys/cam/ctl/ctl_frontend_internal.c b/sys/cam/ctl/ctl_frontend_internal.c index c40d4f9..ac972f3 100644 --- a/sys/cam/ctl/ctl_frontend_internal.c +++ b/sys/cam/ctl/ctl_frontend_internal.c @@ -173,7 +173,7 @@ typedef enum { } cfi_flags; struct cfi_softc { - struct ctl_frontend fe; + struct ctl_port port; char fe_name[40]; struct mtx lock; cfi_flags flags; @@ -214,28 +214,24 @@ static void cfi_metatask_io_done(union ctl_io *io); static void cfi_err_recovery_done(union ctl_io *io); static void cfi_lun_io_done(union ctl_io *io); -static int cfi_module_event_handler(module_t, int /*modeventtype_t*/, void *); - -static moduledata_t cfi_moduledata = { - "ctlcfi", - cfi_module_event_handler, - NULL +static struct ctl_frontend cfi_frontend = +{ + .name = "kernel", + .init = cfi_init, + .shutdown = cfi_shutdown, }; - -DECLARE_MODULE(ctlcfi, cfi_moduledata, SI_SUB_CONFIGURE, SI_ORDER_FOURTH); -MODULE_VERSION(ctlcfi, 1); -MODULE_DEPEND(ctlcfi, ctl, 1, 1, 1); +CTL_FRONTEND_DECLARE(ctlcfi, cfi_frontend); int cfi_init(void) { struct cfi_softc *softc; - struct ctl_frontend *fe; + struct ctl_port *port; int retval; softc = &fetd_internal_softc; - fe = &softc->fe; + port = &softc->port; retval = 0; @@ -252,22 +248,23 @@ cfi_init(void) STAILQ_INIT(&softc->lun_list); STAILQ_INIT(&softc->metatask_list); - sprintf(softc->fe_name, "CTL internal"); - fe->port_type = CTL_PORT_INTERNAL; - fe->num_requested_ctl_io = 100; - fe->port_name = softc->fe_name; - fe->port_online = cfi_online; - fe->port_offline = cfi_offline; - fe->onoff_arg = softc; - fe->lun_enable = cfi_lun_enable; - fe->lun_disable = cfi_lun_disable; - fe->targ_lun_arg = softc; - fe->fe_datamove = cfi_datamove; - fe->fe_done = cfi_done; - fe->max_targets = 15; - fe->max_target_id = 15; - - if (ctl_frontend_register(fe, (softc->flags & CTL_FLAG_MASTER_SHELF)) != 0) + sprintf(softc->fe_name, "kernel"); + port->frontend = &cfi_frontend; + port->port_type = CTL_PORT_INTERNAL; + port->num_requested_ctl_io = 100; + port->port_name = softc->fe_name; + port->port_online = cfi_online; + port->port_offline = cfi_offline; + port->onoff_arg = softc; + port->lun_enable = cfi_lun_enable; + port->lun_disable = cfi_lun_disable; + port->targ_lun_arg = softc; + port->fe_datamove = cfi_datamove; + port->fe_done = cfi_done; + port->max_targets = 15; + port->max_target_id = 15; + + if (ctl_port_register(port, (softc->flags & CTL_FLAG_MASTER_SHELF)) != 0) { printf("%s: internal frontend registration failed\n", __func__); return (0); @@ -291,27 +288,13 @@ cfi_shutdown(void) /* * XXX KDM need to clear out any I/O pending on each LUN. */ - if (ctl_frontend_deregister(&softc->fe) != 0) + if (ctl_port_deregister(&softc->port) != 0) printf("%s: ctl_frontend_deregister() failed\n", __func__); uma_zdestroy(cfi_lun_zone); uma_zdestroy(cfi_metatask_zone); } -static int -cfi_module_event_handler(module_t mod, int what, void *arg) -{ - - switch (what) { - case MOD_LOAD: - return (cfi_init()); - case MOD_UNLOAD: - return (EBUSY); - default: - return (EOPNOTSUPP); - } -} - static void cfi_online(void *arg) { @@ -718,7 +701,7 @@ cfi_init_io(union ctl_io *io, struct cfi_lun *lun, struct cfi_lun_io *lun_io; io->io_hdr.nexus.initid.id = 7; - io->io_hdr.nexus.targ_port = lun->softc->fe.targ_port; + io->io_hdr.nexus.targ_port = lun->softc->port.targ_port; io->io_hdr.nexus.targ_target.id = lun->target_id.id; io->io_hdr.nexus.targ_lun = lun->lun_id; io->io_hdr.retries = retries; @@ -779,7 +762,7 @@ cfi_done(union ctl_io *io) union ctl_io *new_io; struct cfi_lun_io *new_lun_io; - new_io = ctl_alloc_io(softc->fe.ctl_pool_ref); + new_io = ctl_alloc_io(softc->port.ctl_pool_ref); if (new_io == NULL) { printf("%s: unable to allocate ctl_io for " "error recovery\n", __func__); @@ -985,7 +968,7 @@ cfi_lun_probe(struct cfi_lun *lun, int have_lock) struct cfi_lun_io *lun_io; union ctl_io *io; - io = ctl_alloc_io(lun->softc->fe.ctl_pool_ref); + io = ctl_alloc_io(lun->softc->port.ctl_pool_ref); if (io == NULL) { printf("%s: unable to alloc ctl_io for target %ju " "lun %d probe\n", __func__, @@ -1032,7 +1015,7 @@ cfi_lun_probe(struct cfi_lun *lun, int have_lock) uint8_t *dataptr; union ctl_io *io; - io = ctl_alloc_io(lun->softc->fe.ctl_pool_ref); + io = ctl_alloc_io(lun->softc->port.ctl_pool_ref); if (io == NULL) { printf("%s: unable to alloc ctl_io for target %ju " "lun %d probe\n", __func__, @@ -1413,7 +1396,7 @@ cfi_action(struct cfi_metatask *metatask) if (SID_TYPE(&lun->inq_data) != T_DIRECT) continue; da_luns++; - io = ctl_alloc_io(softc->fe.ctl_pool_ref); + io = ctl_alloc_io(softc->port.ctl_pool_ref); if (io != NULL) { ios_allocated++; STAILQ_INSERT_TAIL(&tmp_io_list, &io->io_hdr, @@ -1567,7 +1550,7 @@ cfi_action(struct cfi_metatask *metatask) } - io = ctl_alloc_io(softc->fe.ctl_pool_ref); + io = ctl_alloc_io(softc->port.ctl_pool_ref); if (io == NULL) { metatask->status = CFI_MT_ERROR; metatask->taskinfo.bbrread.status = CFI_BBR_NO_MEM; diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c index 70b54ba..2e610ba 100644 --- a/sys/cam/ctl/ctl_frontend_iscsi.c +++ b/sys/cam/ctl/ctl_frontend_iscsi.c @@ -170,18 +170,13 @@ static void cfiscsi_session_delete(struct cfiscsi_session *cs); static struct cfiscsi_softc cfiscsi_softc; extern struct ctl_softc *control_softc; -static int cfiscsi_module_event_handler(module_t, int /*modeventtype_t*/, void *); - -static moduledata_t cfiscsi_moduledata = { - "ctlcfiscsi", - cfiscsi_module_event_handler, - NULL +static struct ctl_frontend cfiscsi_frontend = +{ + .name = "iscsi", + .init = cfiscsi_init, + .ioctl = cfiscsi_ioctl, }; - -DECLARE_MODULE(ctlcfiscsi, cfiscsi_moduledata, SI_SUB_CONFIGURE, SI_ORDER_FOURTH); -MODULE_VERSION(ctlcfiscsi, 1); -MODULE_DEPEND(ctlcfiscsi, ctl, 1, 1, 1); -MODULE_DEPEND(ctlcfiscsi, icl, 1, 1, 1); +CTL_FRONTEND_DECLARE(ctlcfiscsi, cfiscsi_frontend); static struct icl_pdu * cfiscsi_pdu_new_response(struct icl_pdu *request, int flags) @@ -541,7 +536,7 @@ cfiscsi_pdu_handle_scsi_command(struct icl_pdu *request) cfiscsi_session_terminate(cs); return; } - io = ctl_alloc_io(cs->cs_target->ct_softc->fe.ctl_pool_ref); + io = ctl_alloc_io(cs->cs_target->ct_softc->port.ctl_pool_ref); if (io == NULL) { CFISCSI_SESSION_WARN(cs, "can't allocate ctl_io; " "dropping connection"); @@ -553,7 +548,7 @@ cfiscsi_pdu_handle_scsi_command(struct icl_pdu *request) io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = request; io->io_hdr.io_type = CTL_IO_SCSI; io->io_hdr.nexus.initid.id = cs->cs_ctl_initid; - io->io_hdr.nexus.targ_port = cs->cs_target->ct_softc->fe.targ_port; + io->io_hdr.nexus.targ_port = cs->cs_target->ct_softc->port.targ_port; io->io_hdr.nexus.targ_target.id = 0; io->io_hdr.nexus.targ_lun = cfiscsi_decode_lun(bhssc->bhssc_lun); io->io_hdr.nexus.lun_map_fn = cfiscsi_map_lun; @@ -607,7 +602,7 @@ cfiscsi_pdu_handle_task_request(struct icl_pdu *request) cs = PDU_SESSION(request); bhstmr = (struct iscsi_bhs_task_management_request *)request->ip_bhs; - io = ctl_alloc_io(cs->cs_target->ct_softc->fe.ctl_pool_ref); + io = ctl_alloc_io(cs->cs_target->ct_softc->port.ctl_pool_ref); if (io == NULL) { CFISCSI_SESSION_WARN(cs, "can't allocate ctl_io;" "dropping connection"); @@ -619,7 +614,7 @@ cfiscsi_pdu_handle_task_request(struct icl_pdu *request) io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = request; io->io_hdr.io_type = CTL_IO_TASK; io->io_hdr.nexus.initid.id = cs->cs_ctl_initid; - io->io_hdr.nexus.targ_port = cs->cs_target->ct_softc->fe.targ_port; + io->io_hdr.nexus.targ_port = cs->cs_target->ct_softc->port.targ_port; io->io_hdr.nexus.targ_target.id = 0; io->io_hdr.nexus.targ_lun = cfiscsi_decode_lun(bhstmr->bhstmr_lun); io->io_hdr.nexus.lun_map_fn = cfiscsi_map_lun; @@ -1041,7 +1036,7 @@ cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs) int error, last; #ifdef notyet - io = ctl_alloc_io(cs->cs_target->ct_softc->fe.ctl_pool_ref); + io = ctl_alloc_io(cs->cs_target->ct_softc->port.ctl_pool_ref); if (io == NULL) { CFISCSI_SESSION_WARN(cs, "can't allocate ctl_io"); return; @@ -1050,7 +1045,7 @@ cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs) io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = NULL; io->io_hdr.io_type = CTL_IO_TASK; io->io_hdr.nexus.initid.id = cs->cs_ctl_initid; - io->io_hdr.nexus.targ_port = cs->cs_target->ct_softc->fe.targ_port; + io->io_hdr.nexus.targ_port = cs->cs_target->ct_softc->port.targ_port; io->io_hdr.nexus.targ_target.id = 0; io->io_hdr.nexus.targ_lun = lun; io->taskio.tag_type = CTL_TAG_SIMPLE; /* XXX */ @@ -1069,7 +1064,7 @@ cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs) CFISCSI_SESSION_LOCK(cs); TAILQ_FOREACH_SAFE(cdw, &cs->cs_waiting_for_data_out, cdw_next, tmpcdw) { - io = ctl_alloc_io(cs->cs_target->ct_softc->fe.ctl_pool_ref); + io = ctl_alloc_io(cs->cs_target->ct_softc->port.ctl_pool_ref); if (io == NULL) { CFISCSI_SESSION_WARN(cs, "can't allocate ctl_io"); return; @@ -1079,7 +1074,7 @@ cfiscsi_session_terminate_tasks(struct cfiscsi_session *cs) io->io_hdr.io_type = CTL_IO_TASK; io->io_hdr.nexus.initid.id = cs->cs_ctl_initid; io->io_hdr.nexus.targ_port = - cs->cs_target->ct_softc->fe.targ_port; + cs->cs_target->ct_softc->port.targ_port; io->io_hdr.nexus.targ_target.id = 0; //io->io_hdr.nexus.targ_lun = lun; /* Not needed? */ io->taskio.tag_type = CTL_TAG_SIMPLE; /* XXX */ @@ -1202,7 +1197,7 @@ cfiscsi_session_register_initiator(struct cfiscsi_session *cs) i, softc->max_initiators); #endif cs->cs_ctl_initid = i; - error = ctl_add_initiator(0x0, softc->fe.targ_port, cs->cs_ctl_initid); + error = ctl_add_initiator(0x0, softc->port.targ_port, cs->cs_ctl_initid); if (error != 0) { CFISCSI_SESSION_WARN(cs, "ctl_add_initiator failed with error %d", error); mtx_lock(&softc->lock); @@ -1226,7 +1221,7 @@ cfiscsi_session_unregister_initiator(struct cfiscsi_session *cs) softc = &cfiscsi_softc; - error = ctl_remove_initiator(softc->fe.targ_port, cs->cs_ctl_initid); + error = ctl_remove_initiator(softc->port.targ_port, cs->cs_ctl_initid); if (error != 0) { CFISCSI_SESSION_WARN(cs, "ctl_remove_initiator failed with error %d", error); @@ -1317,7 +1312,7 @@ int cfiscsi_init(void) { struct cfiscsi_softc *softc; - struct ctl_frontend *fe; + struct ctl_port *port; int retval; softc = &cfiscsi_softc; @@ -1331,29 +1326,29 @@ cfiscsi_init(void) TAILQ_INIT(&softc->sessions); TAILQ_INIT(&softc->targets); - fe = &softc->fe; - fe->port_type = CTL_PORT_ISCSI; + port = &softc->port; + port->frontend = &cfiscsi_frontend; + port->port_type = CTL_PORT_ISCSI; /* XXX KDM what should the real number be here? */ - fe->num_requested_ctl_io = 4096; + port->num_requested_ctl_io = 4096; snprintf(softc->port_name, sizeof(softc->port_name), "iscsi"); - fe->port_name = softc->port_name; - fe->port_online = cfiscsi_online; - fe->port_offline = cfiscsi_offline; - fe->onoff_arg = softc; - fe->lun_enable = cfiscsi_lun_enable; - fe->lun_disable = cfiscsi_lun_disable; - fe->targ_lun_arg = softc; - fe->ioctl = cfiscsi_ioctl; - fe->devid = cfiscsi_devid; - fe->fe_datamove = cfiscsi_datamove; - fe->fe_done = cfiscsi_done; + port->port_name = softc->port_name; + port->port_online = cfiscsi_online; + port->port_offline = cfiscsi_offline; + port->onoff_arg = softc; + port->lun_enable = cfiscsi_lun_enable; + port->lun_disable = cfiscsi_lun_disable; + port->targ_lun_arg = softc; + port->devid = cfiscsi_devid; + port->fe_datamove = cfiscsi_datamove; + port->fe_done = cfiscsi_done; /* XXX KDM what should we report here? */ /* XXX These should probably be fetched from CTL. */ - fe->max_targets = 1; - fe->max_target_id = 15; + port->max_targets = 1; + port->max_target_id = 15; - retval = ctl_frontend_register(fe, /*master_SC*/ 1); + retval = ctl_port_register(port, /*master_SC*/ 1); if (retval != 0) { CFISCSI_WARN("ctl_frontend_register() failed with error %d", retval); @@ -1361,7 +1356,7 @@ cfiscsi_init(void) goto bailout; } - softc->max_initiators = fe->max_initiators; + softc->max_initiators = port->max_initiators; cfiscsi_data_wait_zone = uma_zcreate("cfiscsi_data_wait", sizeof(struct cfiscsi_data_wait), NULL, NULL, NULL, NULL, @@ -1373,20 +1368,6 @@ bailout: return (retval); } -static int -cfiscsi_module_event_handler(module_t mod, int what, void *arg) -{ - - switch (what) { - case MOD_LOAD: - return (cfiscsi_init()); - case MOD_UNLOAD: - return (EBUSY); - default: - return (EOPNOTSUPP); - } -} - #ifdef ICL_KERNEL_PROXY static void cfiscsi_accept(struct socket *so, struct sockaddr *sa, int portal_id) diff --git a/sys/cam/ctl/ctl_frontend_iscsi.h b/sys/cam/ctl/ctl_frontend_iscsi.h index 77391fc..02e77d4 100644 --- a/sys/cam/ctl/ctl_frontend_iscsi.h +++ b/sys/cam/ctl/ctl_frontend_iscsi.h @@ -96,7 +96,7 @@ struct icl_listen; #endif struct cfiscsi_softc { - struct ctl_frontend fe; + struct ctl_port port; struct mtx lock; char port_name[32]; int online; diff --git a/sys/cam/ctl/ctl_private.h b/sys/cam/ctl/ctl_private.h index 570826c..3b2069f 100644 --- a/sys/cam/ctl/ctl_private.h +++ b/sys/cam/ctl/ctl_private.h @@ -79,7 +79,6 @@ typedef enum { CTL_POOL_INTERNAL, CTL_POOL_FETD, CTL_POOL_EMERGENCY, - CTL_POOL_IOCTL, CTL_POOL_4OTHERSC } ctl_pool_type; @@ -110,7 +109,7 @@ typedef enum { struct ctl_ioctl_info { ctl_ioctl_flags flags; uint32_t cur_tag_num; - struct ctl_frontend fe; + struct ctl_port port; char port_name[24]; }; @@ -456,7 +455,9 @@ struct ctl_softc { STAILQ_HEAD(, ctl_be_lun) pending_lun_queue; uint32_t num_frontends; STAILQ_HEAD(, ctl_frontend) fe_list; - struct ctl_frontend *ctl_ports[CTL_MAX_PORTS]; + uint32_t num_ports; + STAILQ_HEAD(, ctl_port) port_list; + struct ctl_port *ctl_ports[CTL_MAX_PORTS]; uint32_t num_backends; STAILQ_HEAD(, ctl_backend_driver) be_list; struct mtx pool_lock; diff --git a/sys/cam/ctl/scsi_ctl.c b/sys/cam/ctl/scsi_ctl.c index 9983f58..4a81abf 100644 --- a/sys/cam/ctl/scsi_ctl.c +++ b/sys/cam/ctl/scsi_ctl.c @@ -77,7 +77,7 @@ typedef enum { } ctlfe_ccb_types; struct ctlfe_softc { - struct ctl_frontend fe; + struct ctl_port port; path_id_t path_id; u_int maxio; struct cam_sim *sim; @@ -198,7 +198,7 @@ MALLOC_DEFINE(M_CTLFE, "CAM CTL FE", "CAM CTL FE interface"); int ctlfeinitialize(void); void ctlfeshutdown(void); -static periph_init_t ctlfeinit; +static periph_init_t ctlfeperiphinit; static void ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg); static periph_ctor_t ctlferegister; @@ -223,26 +223,18 @@ static void ctlfe_dump(void); static struct periph_driver ctlfe_driver = { - ctlfeinit, "ctl", + ctlfeperiphinit, "ctl", TAILQ_HEAD_INITIALIZER(ctlfe_driver.units), /*generation*/ 0 }; -static int ctlfe_module_event_handler(module_t, int /*modeventtype_t*/, void *); - -/* - * We're not using PERIPHDRIVER_DECLARE(), because it runs at SI_SUB_DRIVERS, - * and that happens before CTL gets initialised. - */ -static moduledata_t ctlfe_moduledata = { - "ctlfe", - ctlfe_module_event_handler, - NULL +static struct ctl_frontend ctlfe_frontend = +{ + .name = "camtarget", + .init = ctlfeinitialize, + .fe_dump = ctlfe_dump, + .shutdown = ctlfeshutdown, }; - -DECLARE_MODULE(ctlfe, ctlfe_moduledata, SI_SUB_CONFIGURE, SI_ORDER_FOURTH); -MODULE_VERSION(ctlfe, 1); -MODULE_DEPEND(ctlfe, ctl, 1, 1, 1); -MODULE_DEPEND(ctlfe, cam, 1, 1, 1); +CTL_FRONTEND_DECLARE(ctlfe, ctlfe_frontend); extern struct ctl_softc *control_softc; @@ -252,41 +244,29 @@ ctlfeshutdown(void) return; } -void -ctlfeinit(void) +int +ctlfeinitialize(void) { - cam_status status; STAILQ_INIT(&ctlfe_softc_list); - mtx_init(&ctlfe_list_mtx, ctlfe_mtx_desc, NULL, MTX_DEF); + periphdriver_register(&ctlfe_driver); + return (0); +} - KASSERT(control_softc != NULL, ("CTL is not initialized!")); +void +ctlfeperiphinit(void) +{ + cam_status status; status = xpt_register_async(AC_PATH_REGISTERED | AC_PATH_DEREGISTERED | AC_CONTRACT, ctlfeasync, NULL, NULL); - if (status != CAM_REQ_CMP) { printf("ctl: Failed to attach async callback due to CAM " "status 0x%x!\n", status); } } -static int -ctlfe_module_event_handler(module_t mod, int what, void *arg) -{ - - switch (what) { - case MOD_LOAD: - periphdriver_register(&ctlfe_driver); - return (0); - case MOD_UNLOAD: - return (EBUSY); - default: - return (EOPNOTSUPP); - } -} - static void ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) { @@ -302,7 +282,7 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) */ switch (code) { case AC_PATH_REGISTERED: { - struct ctl_frontend *fe; + struct ctl_port *port; struct ctlfe_softc *bus_softc; struct ccb_pathinq *cpi; int retval; @@ -384,54 +364,54 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) MTX_DEF); STAILQ_INIT(&bus_softc->lun_softc_list); - fe = &bus_softc->fe; + port = &bus_softc->port; + port->frontend = &ctlfe_frontend; /* * XXX KDM should we be more accurate here ? */ if (cpi->transport == XPORT_FC) - fe->port_type = CTL_PORT_FC; + port->port_type = CTL_PORT_FC; else - fe->port_type = CTL_PORT_SCSI; + port->port_type = CTL_PORT_SCSI; /* XXX KDM what should the real number be here? */ - fe->num_requested_ctl_io = 4096; + port->num_requested_ctl_io = 4096; snprintf(bus_softc->port_name, sizeof(bus_softc->port_name), "%s%d", cpi->dev_name, cpi->unit_number); /* * XXX KDM it would be nice to allocate storage in the * frontend structure itself. */ - fe->port_name = bus_softc->port_name; - fe->physical_port = cpi->unit_number; - fe->virtual_port = cpi->bus_id; - fe->port_online = ctlfe_online; - fe->port_offline = ctlfe_offline; - fe->onoff_arg = bus_softc; - fe->lun_enable = ctlfe_lun_enable; - fe->lun_disable = ctlfe_lun_disable; - fe->targ_lun_arg = bus_softc; - fe->fe_datamove = ctlfe_datamove_done; - fe->fe_done = ctlfe_datamove_done; - fe->fe_dump = ctlfe_dump; + port->port_name = bus_softc->port_name; + port->physical_port = cpi->unit_number; + port->virtual_port = cpi->bus_id; + port->port_online = ctlfe_online; + port->port_offline = ctlfe_offline; + port->onoff_arg = bus_softc; + port->lun_enable = ctlfe_lun_enable; + port->lun_disable = ctlfe_lun_disable; + port->targ_lun_arg = bus_softc; + port->fe_datamove = ctlfe_datamove_done; + port->fe_done = ctlfe_datamove_done; /* * XXX KDM the path inquiry doesn't give us the maximum * number of targets supported. */ - fe->max_targets = cpi->max_target; - fe->max_target_id = cpi->max_target; + port->max_targets = cpi->max_target; + port->max_target_id = cpi->max_target; /* * XXX KDM need to figure out whether we're the master or * slave. */ #ifdef CTLFEDEBUG - printf("%s: calling ctl_frontend_register() for %s%d\n", + printf("%s: calling ctl_port_register() for %s%d\n", __func__, cpi->dev_name, cpi->unit_number); #endif - retval = ctl_frontend_register(fe, /*master_SC*/ 1); + retval = ctl_port_register(port, /*master_SC*/ 1); if (retval != 0) { - printf("%s: ctl_frontend_register() failed with " + printf("%s: ctl_port_register() failed with " "error %d!\n", __func__, retval); mtx_destroy(&bus_softc->lun_softc_mtx); free(bus_softc, M_CTLFE); @@ -462,7 +442,7 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) * XXX KDM are we certain at this point that there * are no outstanding commands for this frontend? */ - ctl_frontend_deregister(&softc->fe); + ctl_port_deregister(&softc->port); mtx_destroy(&softc->lun_softc_mtx); free(softc, M_CTLFE); } @@ -505,17 +485,17 @@ ctlfeasync(void *callback_arg, uint32_t code, struct cam_path *path, void *arg) } if (dev_chg->arrived != 0) { retval = ctl_add_initiator(dev_chg->wwpn, - softc->fe.targ_port, dev_chg->target); + softc->port.targ_port, dev_chg->target); } else { retval = ctl_remove_initiator( - softc->fe.targ_port, dev_chg->target); + softc->port.targ_port, dev_chg->target); } if (retval != 0) { printf("%s: could not %s port %d iid %u " "WWPN %#jx!\n", __func__, (dev_chg->arrived != 0) ? "add" : - "remove", softc->fe.targ_port, + "remove", softc->port.targ_port, dev_chg->target, (uintmax_t)dev_chg->wwpn); } @@ -1202,7 +1182,7 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb) * Allocate a ctl_io, pass it to CTL, and wait for the * datamove or done. */ - io = ctl_alloc_io(bus_softc->fe.ctl_pool_ref); + io = ctl_alloc_io(bus_softc->port.ctl_pool_ref); if (io == NULL) { atio->ccb_h.flags &= ~CAM_DIR_MASK; atio->ccb_h.flags |= CAM_DIR_NONE; @@ -1235,7 +1215,7 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb) */ io->io_hdr.io_type = CTL_IO_SCSI; io->io_hdr.nexus.initid.id = atio->init_id; - io->io_hdr.nexus.targ_port = bus_softc->fe.targ_port; + io->io_hdr.nexus.targ_port = bus_softc->port.targ_port; io->io_hdr.nexus.targ_target.id = atio->ccb_h.target_id; io->io_hdr.nexus.targ_lun = atio->ccb_h.target_lun; io->scsiio.tag_num = atio->tag_id; @@ -1507,7 +1487,7 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb) "seq %#x\n", __func__, inot->ccb_h.status, inot->tag_id, inot->seq_id); - io = ctl_alloc_io(bus_softc->fe.ctl_pool_ref); + io = ctl_alloc_io(bus_softc->port.ctl_pool_ref); if (io != NULL) { int send_ctl_io; @@ -1518,7 +1498,7 @@ ctlfedone(struct cam_periph *periph, union ccb *done_ccb) io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr =done_ccb; inot->ccb_h.io_ptr = io; io->io_hdr.nexus.initid.id = inot->initiator_id; - io->io_hdr.nexus.targ_port = bus_softc->fe.targ_port; + io->io_hdr.nexus.targ_port = bus_softc->port.targ_port; io->io_hdr.nexus.targ_target.id = inot->ccb_h.target_id; io->io_hdr.nexus.targ_lun = inot->ccb_h.target_lun; /* XXX KDM should this be the tag_id? */ @@ -1730,7 +1710,7 @@ ctlfe_onoffline(void *arg, int online) * This should be replaced later with ddb_GetWWNN, * or possibly a more centralized scheme. (It * would be nice to have the WWNN/WWPN for each - * port stored in the ctl_frontend structure.) + * port stored in the ctl_port structure.) */ #ifdef RANDOM_WWNN ccb->knob.xport_specific.fc.wwnn = @@ -1743,7 +1723,7 @@ ctlfe_onoffline(void *arg, int online) 0x0000000fffffff00ULL) | /* Company ID */ 0x5000ED5000000000ULL | /* NL-Port */ 0x3000 | - /* Port Num */ (bus_softc->fe.targ_port & 0xff); + /* Port Num */ (bus_softc->port.targ_port & 0xff); /* * This is a bit of an API break/reversal, but if @@ -1752,9 +1732,9 @@ ctlfe_onoffline(void *arg, int online) * using with the frontend code so it's reported * accurately. */ - bus_softc->fe.wwnn = + bus_softc->port.wwnn = ccb->knob.xport_specific.fc.wwnn; - bus_softc->fe.wwpn = + bus_softc->port.wwpn = ccb->knob.xport_specific.fc.wwpn; set_wwnn = 1; #else /* RANDOM_WWNN */ @@ -1763,17 +1743,17 @@ ctlfe_onoffline(void *arg, int online) * down to the SIM. Otherwise, record what the SIM * has reported. */ - if ((bus_softc->fe.wwnn != 0) - && (bus_softc->fe.wwpn != 0)) { + if ((bus_softc->port.wwnn != 0) + && (bus_softc->port.wwpn != 0)) { ccb->knob.xport_specific.fc.wwnn = - bus_softc->fe.wwnn; + bus_softc->port.wwnn; ccb->knob.xport_specific.fc.wwpn = - bus_softc->fe.wwpn; + bus_softc->port.wwpn; set_wwnn = 1; } else { - bus_softc->fe.wwnn = + bus_softc->port.wwnn = ccb->knob.xport_specific.fc.wwnn; - bus_softc->fe.wwpn = + bus_softc->port.wwpn = ccb->knob.xport_specific.fc.wwpn; } #endif /* RANDOM_WWNN */ |