/*++

Copyright (c) 2006, Intel Corporation                                                         
All rights reserved. This program and the accompanying materials                          
are licensed and made available under the terms and conditions of the BSD License         
which accompanies this distribution.  The full text of the license may be found at        
http://opensource.org/licenses/bsd-license.php                                            
                                                                                          
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

  Module Name:

    Hub.h
    
  Abstract:

    Constants definitions for Usb Hub

  Revision History

--*/

#ifndef _HUB_H
#define _HUB_H

//
// Hub feature numbers
//
#define C_HUB_LOCAL_POWER   0
#define C_HUB_OVER_CURRENT  1

//
// Hub class code & sub class code
//
#define CLASS_CODE_HUB      0x09
#define SUB_CLASS_CODE_HUB  0

//
// Hub Status & Hub Change bit masks
//
#define HUB_STATUS_LOCAL_POWER  0x0001
#define HUB_STATUS_OVERCURRENT  0x0002

#define HUB_CHANGE_LOCAL_POWER  0x0001
#define HUB_CHANGE_OVERCURRENT  0x0002

//
// Hub Characteristics
//
#define HUB_CHAR_LPSM     0x0003
#define HUB_CHAR_COMPOUND 0x0004
#define HUB_CHAR_OCPM     0x0018

//
// Hub specific request
//
#define HUB_CLEAR_FEATURE               0x01
#define HUB_CLEAR_FEATURE_REQ_TYPE      0x20

#define HUB_CLEAR_FEATURE_PORT          0x01
#define HUB_CLEAR_FEATURE_PORT_REQ_TYPE 0x23

#define HUB_GET_BUS_STATE               0x02
#define HUB_GET_BUS_STATE_REQ_TYPE      0xA3

#define HUB_GET_DESCRIPTOR              0x06
#define HUB_GET_DESCRIPTOR_REQ_TYPE     0xA0

#define HUB_GET_HUB_STATUS              0x00
#define HUB_GET_HUB_STATUS_REQ_TYPE     0xA0

#define HUB_GET_PORT_STATUS             0x00
#define HUB_GET_PORT_STATUS_REQ_TYPE    0xA3

#define HUB_SET_DESCRIPTOR              0x07
#define HUB_SET_DESCRIPTOR_REQ_TYPE     0x20

#define HUB_SET_HUB_FEATURE             0x03
#define HUB_SET_HUB_FEATURE_REQ_TYPE    0x20

#define HUB_SET_PORT_FEATURE            0x03
#define HUB_SET_PORT_FEATURE_REQ_TYPE   0x23

#pragma pack(1)
typedef struct usb_hub_status {
  UINT16  HubStatus;
  UINT16  HubChange;
} EFI_USB_HUB_STATUS;
#pragma pack()

EFI_STATUS
HubGetPortStatus (
  IN  EFI_USB_IO_PROTOCOL     *UsbIo,
  IN  UINT8                   Port,
  OUT UINT32                  *PortStatus
  );

EFI_STATUS
HubSetPortFeature (
  IN EFI_USB_IO_PROTOCOL     *UsbIo,
  IN UINT8                   Port,
  IN UINT8                   Value
  );

EFI_STATUS
HubSetHubFeature (
  IN EFI_USB_IO_PROTOCOL     *UsbIo,
  IN UINT8                   Value
  );

EFI_STATUS
HubGetHubStatus (
  IN  EFI_USB_IO_PROTOCOL     *UsbIo,
  OUT UINT32                  *HubStatus
  );

EFI_STATUS
HubClearPortFeature (
  IN EFI_USB_IO_PROTOCOL     *UsbIo,
  IN UINT8                   Port,
  IN UINT8                   Value
  );

EFI_STATUS
HubClearHubFeature (
  IN EFI_USB_IO_PROTOCOL     *UsbIo,
  IN UINT8                   Value
  );

EFI_STATUS
GetHubDescriptor (
  IN  EFI_USB_IO_PROTOCOL        *UsbIo,
  IN  UINTN                      DescriptorSize,
  OUT EFI_USB_HUB_DESCRIPTOR     *HubDescriptor
  );

#endif
