fctio
memset(&fctio, 0, sizeof (fctio));
fctio.fctio_cmd = FCTIO_GET_ADAPTER_ATTRIBUTES;
fctio.fctio_olen = (uint32_t)(sizeof (attrs));
fctio.fctio_xfer = FCTIO_XFER_READ;
fctio.fctio_obuf = (uint64_t)(uintptr_t)&attrs;
fctio.fctio_ilen = 8;
fctio.fctio_ibuf = (uint64_t)(uintptr_t)&en_wwn;
if (ioctl(fd, FCTIO_CMD, &fctio) != 0) {
fctio_t fctio;
memset(&fctio, 0, sizeof (fctio));
fctio.fctio_cmd = FCTIO_FORCE_LIP;
fctio.fctio_xfer = FCTIO_XFER_READ;
fctio.fctio_ilen = 8;
fctio.fctio_ibuf = (uint64_t)(uintptr_t)&en_wwn;
if (ioctl(fd, FCTIO_CMD, &fctio) != 0) {
return ((int)fctio.fctio_errno);
fctio_t fctio;
memset(&fctio, 0, sizeof (fctio_t));
fctio.fctio_cmd = FCTIO_ADAPTER_LIST;
fctio.fctio_xfer = FCTIO_XFER_RW;
fctio.fctio_olen = bufSize;
fctio.fctio_obuf = (uint64_t)(uintptr_t)tgthbaList;
if (ioctl(fd, FCTIO_CMD, &fctio) != 0) {
fctio_t fctio;
fctio_t fctio;
memset(&fctio, 0, sizeof (fctio));
fctio.fctio_cmd = FCTIO_GET_ADAPTER_PORT_ATTRIBUTES;
fctio.fctio_ilen = 8;
fctio.fctio_ibuf = (uint64_t)(uintptr_t)&en_wwn;
fctio.fctio_xfer = FCTIO_XFER_READ;
fctio.fctio_olen = (uint32_t)(sizeof (attrs));
fctio.fctio_obuf = (uint64_t)(uintptr_t)&attrs;
fct_ioctl(FCTIO_CMD, &fctio);
fctio_t fctio;
memset(&fctio, 0, sizeof (fctio));
fctio.fctio_cmd = FCTIO_GET_DISCOVERED_PORT_ATTRIBUTES;
fctio.fctio_ilen = 8;
fctio.fctio_ibuf = (uint64_t)(uintptr_t)&en_wwn;
fctio.fctio_xfer = FCTIO_XFER_READ;
fctio.fctio_olen = (uint32_t)(sizeof (attrs));
fctio.fctio_obuf = (uint64_t)(uintptr_t)&attrs;
fctio.fctio_alen = (uint32_t)(sizeof (discoveredport));
fctio.fctio_abuf = (uint64_t)(uintptr_t)&discoveredport;
fct_ioctl(FCTIO_CMD, &fctio);
fctio_t fctio;
memset(&fctio, 0, sizeof (fctio));
fctio.fctio_cmd = FCTIO_GET_PORT_ATTRIBUTES;
fctio.fctio_olen = (uint32_t)(sizeof (attrs));
fctio.fctio_xfer = FCTIO_XFER_READ;
fctio.fctio_obuf = (uint64_t)(uintptr_t)&attrs;
fctio.fctio_ilen = (uint32_t)(sizeof (wwn));
fctio.fctio_ibuf = (uint64_t)(uintptr_t)&en_wwn;
fct_ioctl(FCTIO_CMD, &fctio);
fctio_t fctio;
memset(&fctio, 0, sizeof (fctio));
fctio.fctio_cmd = FCTIO_GET_LINK_STATUS;
fctio.fctio_ibuf = (uint64_t)(uintptr_t)&en_portWWN;
fctio.fctio_ilen = (uint32_t)(sizeof (en_portWWN));
fctio.fctio_abuf = (uint64_t)(uintptr_t)&DestPortID;
fctio.fctio_alen = (uint32_t)(sizeof (DestPortID));
fctio.fctio_xfer = FCTIO_XFER_READ;
fctio.fctio_flags = 0;
fctio.fctio_obuf = (uint64_t)(uintptr_t)new uchar_t[*pRspBufferSize];
fctio.fctio_olen = *pRspBufferSize;
if (fctio.fctio_obuf == 0) {
fct_ioctl(FCTIO_CMD, &fctio);
memcpy(pRspBuffer, (uchar_t *)(uintptr_t)fctio.fctio_obuf,
if (fctio.fctio_obuf != 0) {
delete((uchar_t *)(uintptr_t)fctio.fctio_obuf);
void TgtFCHBAPort::fct_ioctl(int cmd, fctio_t *fctio) {
HBA::_ioctl(fd, cmd, (uchar_t *)fctio);
if (fctio->fctio_errno) {
transportError(fctio->fctio_errno, fcioErrorString);
switch (fctio->fctio_errno) {
fct_copyin_iocdata(intptr_t data, int mode, fctio_t **fctio,
*fctio = kmem_zalloc(sizeof (fctio_t), KM_SLEEP);
if (ddi_copyin((void *)data, *fctio, sizeof (fctio_t), mode)) {
if ((*fctio)->fctio_ilen) {
*ibuf = kmem_zalloc((*fctio)->fctio_ilen, KM_SLEEP);
if (ddi_copyin((void *)(unsigned long)(*fctio)->fctio_ibuf,
*ibuf, (*fctio)->fctio_ilen, mode)) {
if ((*fctio)->fctio_alen) {
*abuf = kmem_zalloc((*fctio)->fctio_alen, KM_SLEEP);
if (ddi_copyin((void *)(unsigned long)(*fctio)->fctio_abuf,
*abuf, (*fctio)->fctio_alen, mode)) {
if ((*fctio)->fctio_olen)
*obuf = kmem_zalloc((*fctio)->fctio_olen, KM_SLEEP);
kmem_free(*obuf, (*fctio)->fctio_olen);
kmem_free(*abuf, (*fctio)->fctio_alen);
kmem_free(*ibuf, (*fctio)->fctio_ilen);
kmem_free(*fctio, sizeof (fctio_t));
fct_copyout_iocdata(intptr_t data, int mode, fctio_t *fctio, void *obuf)
if (fctio->fctio_olen) {
(void *)(unsigned long)fctio->fctio_obuf, fctio->fctio_olen,
ret = ddi_copyout(fctio, (void *)data, sizeof (fctio_t), mode);
fctio_t *fctio;
ret = fct_copyin_iocdata(data, mode, &fctio, &ibuf, &abuf, &obuf);
switch (fctio->fctio_cmd) {
if (fctio->fctio_olen < sizeof (fc_tgt_hba_list_t)) {
list->numPorts = (fctio->fctio_olen -
fctio->fctio_errno = FCTIO_MOREDATA;
if (fctio->fctio_olen < attr_length ||
fctio->fctio_xfer != FCTIO_XFER_READ) {
&fctio->fctio_errno);
if (fctio->fctio_olen < attr_length ||
fctio->fctio_xfer != FCTIO_XFER_READ) {
&fctio->fctio_errno);
if (fctio->fctio_olen < attr_length ||
fctio->fctio_xfer != FCTIO_XFER_READ) {
*port_index, port_attr, &fctio->fctio_errno);
if (fctio->fctio_olen < attr_length ||
fctio->fctio_xfer != FCTIO_XFER_READ) {
&fctio->fctio_errno);
&fctio->fctio_errno);
&fctio->fctio_errno);
ret = fct_forcelip((uint8_t *)ibuf, &fctio->fctio_errno);
ret = fct_copyout_iocdata(data, mode, fctio, obuf);
} else if (fctio->fctio_errno) {
(void) fct_copyout_iocdata(data, mode, fctio, obuf);
kmem_free(obuf, fctio->fctio_olen);
kmem_free(abuf, fctio->fctio_alen);
kmem_free(ibuf, fctio->fctio_ilen);
kmem_free(fctio, sizeof (fctio_t));