#define USBA_FRAMEWORK
#include <sys/usb/usba.h>
#include <sys/usb/usba/hcdi.h>
#include <sys/usb/usba/genconsole.h>
#include <sys/usb/usba/usba_types.h>
#include <sys/usb/usba/usba_impl.h>
int
usb_console_input_init(dev_info_t *dip, usb_pipe_handle_t pipe_handle,
uchar_t **state_buf, usb_console_info_t *console_input_info)
{
int ret;
usba_device_t *usba_device;
usba_pipe_handle_data_t *ph_data;
usb_console_info_impl_t *usb_console_input;
if (dip == NULL) {
return (USB_INVALID_ARGS);
}
if (DEVI_IS_DEVICE_REMOVED(dip)) {
return (USB_FAILURE);
}
usb_console_input = kmem_zalloc(
sizeof (struct usb_console_info_impl), KM_SLEEP);
usb_console_input->uci_dip = dip;
usba_device = usba_get_usba_device(dip);
if ((ph_data = usba_hold_ph_data(pipe_handle)) == NULL) {
kmem_free(usb_console_input,
sizeof (struct usb_console_info_impl));
return (USB_INVALID_PIPE);
}
ret = usba_device->usb_hcdi_ops->usba_hcdi_console_input_init(
ph_data, state_buf, usb_console_input);
if (ret != USB_SUCCESS) {
kmem_free(usb_console_input,
sizeof (struct usb_console_info_impl));
} else {
*console_input_info = (usb_console_info_t)usb_console_input;
}
usba_release_ph_data((usba_ph_impl_t *)pipe_handle);
return (ret);
}
int
usb_console_input_fini(usb_console_info_t console_input_info)
{
usb_console_info_impl_t *usb_console_input;
usba_device_t *usba_device;
int ret;
usb_console_input = (usb_console_info_impl_t *)console_input_info;
usba_device = usba_get_usba_device(usb_console_input->uci_dip);
ret = usba_device->usb_hcdi_ops->usba_hcdi_console_input_fini(
usb_console_input);
if (ret == USB_FAILURE) {
return (ret);
}
kmem_free(usb_console_input, sizeof (struct usb_console_info_impl));
return (USB_SUCCESS);
}
int
usb_console_input_enter(usb_console_info_t console_input_info)
{
usba_device_t *usba_device;
usb_console_info_impl_t *usb_console_input;
usb_console_input = (usb_console_info_impl_t *)console_input_info;
usba_device = usba_polled_get_usba_device(usb_console_input->uci_dip);
return (usba_device->usb_hcdi_ops->usba_hcdi_console_input_enter(
usb_console_input));
}
int
usb_console_read(usb_console_info_t console_input_info, uint_t *num_characters)
{
usba_device_t *usba_device;
usb_console_info_impl_t *usb_console_input;
usb_console_input = (usb_console_info_impl_t *)console_input_info;
usba_device = usba_polled_get_usba_device(usb_console_input->uci_dip);
return (usba_device->usb_hcdi_ops->usba_hcdi_console_read(
usb_console_input, num_characters));
}
int
usb_console_input_exit(usb_console_info_t console_input_info)
{
usba_device_t *usba_device;
usb_console_info_impl_t *usb_console_input;
usb_console_input = (usb_console_info_impl_t *)console_input_info;
usba_device = usba_polled_get_usba_device(usb_console_input->uci_dip);
return (usba_device->usb_hcdi_ops->usba_hcdi_console_input_exit(
usb_console_input));
}
int
usb_console_output_init(
dev_info_t *dip,
usb_pipe_handle_t pipe_handle,
usb_console_info_t *console_output_info)
{
usba_device_t *usb_device;
usb_console_info_impl_t *usb_console_output;
int ret;
usb_device = usba_get_usba_device(dip);
if (usb_device->usb_hcdi_ops->usba_hcdi_ops_version <
HCDI_OPS_VERSION_1 ||
usb_device->usb_hcdi_ops->usba_hcdi_console_output_init == NULL)
return (USB_FAILURE);
usb_console_output = kmem_zalloc(sizeof (struct usb_console_info_impl),
KM_SLEEP);
usb_console_output->uci_dip = dip;
ret = usb_device->usb_hcdi_ops->usba_hcdi_console_output_init(
usba_get_ph_data(pipe_handle), usb_console_output);
if (ret == USB_FAILURE) {
kmem_free(usb_console_output,
sizeof (struct usb_console_info_impl));
return (ret);
}
*console_output_info = (usb_console_info_t)usb_console_output;
return (USB_SUCCESS);
}
int
usb_console_output_fini(usb_console_info_t console_output_info)
{
usb_console_info_impl_t *usb_console_output;
usba_device_t *usb_device;
int ret;
usb_console_output = (usb_console_info_impl_t *)console_output_info;
usb_device = usba_polled_get_usba_device(usb_console_output->uci_dip);
ret = usb_device->usb_hcdi_ops->usba_hcdi_console_output_fini(
usb_console_output);
if (ret == USB_FAILURE) {
return (ret);
}
kmem_free(usb_console_output, sizeof (struct usb_console_info_impl));
return (USB_SUCCESS);
}
int
usb_console_output_enter(usb_console_info_t console_output_info)
{
usba_device_t *usb_device;
usb_console_info_impl_t *usb_console_output;
usb_console_output = (usb_console_info_impl_t *)console_output_info;
usb_device = usba_polled_get_usba_device(usb_console_output->uci_dip);
return (usb_device->usb_hcdi_ops->usba_hcdi_console_output_enter(
usb_console_output));
}
int
usb_console_write(usb_console_info_t console_output_info,
uchar_t *buf, uint_t num_characters, uint_t *num_characters_written)
{
usba_device_t *usb_device;
usb_console_info_impl_t *usb_console_output;
usb_console_output = (usb_console_info_impl_t *)console_output_info;
usb_device = usba_polled_get_usba_device(usb_console_output->uci_dip);
return (usb_device->usb_hcdi_ops->usba_hcdi_console_write(
usb_console_output, buf, num_characters,
num_characters_written));
}
int
usb_console_output_exit(usb_console_info_t console_output_info)
{
usba_device_t *usb_device;
usb_console_info_impl_t *usb_console_output;
usb_console_output = (usb_console_info_impl_t *)console_output_info;
usb_device = usba_polled_get_usba_device(usb_console_output->uci_dip);
return (usb_device->usb_hcdi_ops->usba_hcdi_console_output_exit(
usb_console_output));
}