#include <sys/conf.h>
#include <sys/ddi.h>
#include <sys/modctl.h>
#include <sys/sunddi.h>
#include <sys/types.h>
#include <sys/mkdev.h>
#include <sys/1394/adapters/hci1394.h>
#include <sys/1394/adapters/hci1394_extern.h>
int
hci1394_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
{
dev_t dev;
hci1394_state_t *soft_state;
minor_t instance;
int status;
switch (cmd) {
case DDI_INFO_DEVT2DEVINFO:
dev = (dev_t)arg;
instance = getminor(dev);
soft_state = ddi_get_soft_state(hci1394_statep, instance);
if (soft_state == NULL) {
return (DDI_FAILURE);
}
*result = (void *)soft_state->drvinfo.di_dip;
status = DDI_SUCCESS;
break;
case DDI_INFO_DEVT2INSTANCE:
dev = (dev_t)arg;
instance = getminor(dev);
*result = (void *)(uintptr_t)instance;
status = DDI_SUCCESS;
break;
default:
status = DDI_FAILURE;
}
return (status);
}
int
hci1394_open(dev_t *devp, int flag, int otyp, cred_t *credp)
{
hci1394_state_t *soft_state;
soft_state = ddi_get_soft_state(hci1394_statep, getminor(*devp));
if (soft_state == NULL) {
return (ENXIO);
}
return (0);
}
int
hci1394_close(dev_t dev, int flag, int otyp, cred_t *credp)
{
return (0);
}
void
hci1394_shutdown(dev_info_t *dip)
{
hci1394_state_t *soft_state;
#ifndef TEST_SHUTDOWN
ASSERT(0);
#endif
soft_state = ddi_get_soft_state(hci1394_statep, ddi_get_instance(dip));
if (soft_state == NULL) {
return;
}
hci1394_ohci_intr_master_disable(soft_state->ohci);
(void) hci1394_state_set(&soft_state->drvinfo, HCI1394_SHUTDOWN);
(void) hci1394_ohci_soft_reset(soft_state->ohci);
hci1394_async_flush(soft_state->async);
}
hci1394_statevar_t
hci1394_state(hci1394_drvinfo_t *drvinfo)
{
hci1394_statevar_t hal_state;
mutex_enter(&drvinfo->di_drvstate.ds_mutex);
hal_state = drvinfo->di_drvstate.ds_state;
mutex_exit(&drvinfo->di_drvstate.ds_mutex);
return (hal_state);
}
int
hci1394_state_set(hci1394_drvinfo_t *drvinfo, hci1394_statevar_t state)
{
mutex_enter(&drvinfo->di_drvstate.ds_mutex);
if (drvinfo->di_drvstate.ds_state == HCI1394_SHUTDOWN) {
mutex_exit(&drvinfo->di_drvstate.ds_mutex);
return (DDI_FAILURE);
}
drvinfo->di_drvstate.ds_state = state;
mutex_exit(&drvinfo->di_drvstate.ds_mutex);
return (DDI_SUCCESS);
}