35#include <sys/kernel.h>
38#include <sys/module.h>
40#include <sys/condvar.h>
41#include <sys/malloc.h>
44#include <sys/sysctl.h>
90 memset(tsoftc, 0,
sizeof(*tsoftc));
103 printf(
"%s: tpc port registration failed\n", __func__);
109 M_CTL, M_WAITOK | M_ZERO);
129 printf(
"%s: tpc port deregistration failed\n", __func__);
138 int ext_sg_entries, kern_sg_entries;
139 int ext_sg_start, ext_offset;
141 int kern_watermark, ext_watermark;
169 for (i = 0; i < ext_sg_entries; i++) {
170 if ((len_seen + ext_sglist[i].
len) >=
176 len_seen += ext_sglist[i].
len;
179 ext_sglist = &ext_entry;
191 kern_sglist = &kern_entry;
198 ext_watermark = ext_offset;
199 for (i = ext_sg_start, j = 0;
200 i < ext_sg_entries && j < kern_sg_entries;) {
201 uint8_t *ext_ptr, *kern_ptr;
203 len_to_copy = min(ext_sglist[i].
len - ext_watermark,
204 kern_sglist[j].
len - kern_watermark);
206 ext_ptr = (uint8_t *)ext_sglist[i].
addr;
207 ext_ptr = ext_ptr + ext_watermark;
212 panic(
"need to implement bus address support");
214 kern_ptr = bus_to_virt(kern_sglist[j].
addr);
217 kern_ptr = (uint8_t *)kern_sglist[j].
addr;
218 kern_ptr = kern_ptr + kern_watermark;
223 __func__, len_to_copy));
226 memcpy(ext_ptr, kern_ptr, len_to_copy);
229 __func__, len_to_copy));
232 memcpy(kern_ptr, ext_ptr, len_to_copy);
238 ext_watermark += len_to_copy;
239 if (ext_sglist[i].
len == ext_watermark) {
244 kern_watermark += len_to_copy;
245 if (kern_sglist[j].
len == kern_watermark) {
252 __func__, ext_sg_entries, kern_sg_entries));
269 struct scsi_ec_cscd *cscd, uint32_t *ss, uint32_t *ps, uint32_t *pso)
274 uint64_t lunid = UINT64_MAX;
287 STAILQ_FOREACH(lun, &softc->lun_list, links) {
295 cscdid->
length + 4) == 0) {
uint32_t ctl_lun_map_to_port(struct ctl_port *port, uint32_t lun_id)
void ctl_datamove_done(union ctl_io *io, bool samethr)
int ctl_queue(union ctl_io *io)
union ctl_io * ctl_alloc_io(void *pool_ref)
#define CTL_DEBUG_PRINT(X)
int ctl_port_deregister(struct ctl_port *port)
void ctl_port_offline(struct ctl_port *port)
void ctl_port_online(struct ctl_port *port)
int ctl_port_register(struct ctl_port *port)
void tpc_done(union ctl_io *io)
static int tpcl_init(void)
uint64_t tpcl_resolve(struct ctl_softc *softc, int init_port, struct scsi_ec_cscd *cscd, uint32_t *ss, uint32_t *ps, uint32_t *pso)
static void tpcl_done(union ctl_io *io)
static int tpcl_shutdown(void)
union ctl_io * tpcl_alloc_io(void)
static void tpcl_datamove(union ctl_io *io)
CTL_FRONTEND_DECLARE(ctltpc, tpcl_frontend)
static struct tpcl_softc tpcl_softc
static struct ctl_frontend tpcl_frontend
int tpcl_queue(union ctl_io *io, uint64_t lun)
int scsi_devid_match(uint8_t *lhs, size_t lhs_len, uint8_t *rhs, size_t rhs_len)
#define SCSI_TRN_SPI_FORMAT_DEFAULT
static __inline void scsi_ulto2b(u_int32_t val, u_int8_t *bytes)
char name[CTL_DRIVER_NAME_LEN]
struct ctl_devid * lun_devid
struct ctl_be_lun * be_lun
struct ctl_frontend * frontend
void(* fe_datamove)(union ctl_io *io)
struct ctl_devid * init_devid
void(* fe_done)(union ctl_io *io)
struct ctl_port ** ctl_ports
uint8_t rel_trgt_port_id[2]