root/usr/src/uts/common/sys/usb/hcd/openhci/ohci_polled.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_USB_OHCI_POLLED_H
#define _SYS_USB_OHCI_POLLED_H

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Open Host Controller Driver (OHCI)
 *
 * The USB Open Host Controller driver is a software driver which interfaces
 * to the Universal Serial Bus layer (USBA) and the USB Open Host Controller.
 * The interface to USB Open Host Controller is defined by the OpenHCI  Host
 * Controller Interface.
 *
 * This header file describes the data structures required for the USB Open
 * Host Controller Driver to work in POLLED mode which will be either OBP
 * mode for Sparc architecture or PC PROM mode for X86 architecture
 */

#define POLLED_RAW_BUF_SIZE     8

/*
 * These two  flags are used to determine if this structure is already
 * in use.
 */
#define POLLED_INPUT_MODE               0x01
#define POLLED_OUTPUT_MODE              0x10

/*
 * These two flags are used to determine if this structure is already in
 * use. We should only save off the controller state information once,
 * restore it once.  These flags are used for the ohci_polled_flags below.
 */
#define POLLED_INPUT_MODE_INUSE         0x04
#define POLLED_OUTPUT_MODE_INUSE        0x40

/*
 * For ohci bandwidth of low speed interrupt devices limits,
 * one host controller can support 6 keyboards only.
 */
#define MAX_NUM_FOR_KEYBOARD            0x6
/*
 * State structure for the POLLED switch off
 */
typedef struct ohci_polled {
        /*
         * Pointer to the ohcip structure for the device that is to  be
         * used as input in polled mode.
         */
        ohci_state_t    *ohci_polled_ohcip;

        /*
         * Pipe handle for the pipe that is to be used as input device
         * in POLLED mode.
         */
        usba_pipe_handle_data_t  *ohci_polled_input_pipe_handle;

        /* Dummy endpoint descriptor */
        ohci_ed_t       *ohci_polled_dummy_ed;

        /* Interrupt Endpoint descriptor */
        ohci_ed_t       *ohci_polled_ed;        /* Interrupt endpoint */

        /*
         * The buffer that the usb scancodes are copied into.
         */
        uchar_t         *ohci_polled_buf;

        /*
         * This flag is used to determine if the state of the controller
         * has already been saved (enter) or doesn't need to be restored
         * yet (exit).
         */
        uint_t          ohci_polled_flags;

        /*
         * The read or write routines may take TD's of the done head that
         * are not intended for them.
         */
        ohci_td_t       *ohci_polled_input_done_head;

        /*
         * This is the tail for the above ohci_polled_input_done_head;
         */
        ohci_td_t       *ohci_polled_input_done_tail;

        /*
         * ohci_hcdi_polled_input_enter() may be called
         * multiple times before the ohci_hcdi_polled_input_exit() is called.
         * For example, the system may:
         *      - go down to kmdb (ohci_hcdi_polled_input_enter())
         *      - down to the ok prompt, $q (ohci_hcdi_polled_input_enter())
         *      - back to kmdb, "go" (ohci_hcdi_polled_input_exit())
         *      - back to the OS, :c at kmdb (ohci_hcdi_polled_input_exit())
         *
         * polled_entry keeps track of how  many times
         * ohci_polled_input_enter/ohci_polled_input_exit have been
         * called so that the host controller isn't switched back to OS mode
         * prematurely.
         */
        uint_t          ohci_polled_entry;

        /*
         * Save the pointer usb device structure and the endpoint number
         * during the polled initilization.
         */
        usba_device_t   *ohci_polled_usb_dev;   /* USB device */

        uint8_t         ohci_polled_ep_addr;

        boolean_t       ohci_polled_no_sync_flag; /* For schizo bug */
} ohci_polled_t;

_NOTE(SCHEME_PROTECTS_DATA("Only accessed in POLLED mode",
        ohci_polled_t::ohci_polled_flags))
_NOTE(DATA_READABLE_WITHOUT_LOCK(ohci_polled_t::ohci_polled_ohcip))
_NOTE(SCHEME_PROTECTS_DATA("Only accessed in POLLED mode",
        ohci_polled_t::ohci_polled_entry))


#ifdef __cplusplus
}
#endif

#endif  /* _SYS_USB_OHCI_POLLED_H */