Home | History | Annotate | Download | only in EhciDxe
      1 /** @file
      2 
      3     This file contains URB request, each request is warpped in a
      4     URB (Usb Request Block).
      5 
      6 Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
      7 This program and the accompanying materials
      8 are licensed and made available under the terms and conditions of the BSD License
      9 which accompanies this distribution.  The full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef _EFI_EHCI_URB_H_
     18 #define _EFI_EHCI_URB_H_
     19 
     20 
     21 typedef struct _EHC_QTD  EHC_QTD;
     22 typedef struct _EHC_QH   EHC_QH;
     23 typedef struct _URB      URB;
     24 
     25 //
     26 // Transfer types, used in URB to identify the transfer type
     27 //
     28 #define EHC_CTRL_TRANSFER       0x01
     29 #define EHC_BULK_TRANSFER       0x02
     30 #define EHC_INT_TRANSFER_SYNC   0x04
     31 #define EHC_INT_TRANSFER_ASYNC  0x08
     32 
     33 #define EHC_QTD_SIG             SIGNATURE_32 ('U', 'S', 'B', 'T')
     34 #define EHC_QH_SIG              SIGNATURE_32 ('U', 'S', 'B', 'H')
     35 #define EHC_URB_SIG             SIGNATURE_32 ('U', 'S', 'B', 'R')
     36 
     37 //
     38 // Hardware related bit definitions
     39 //
     40 #define EHC_TYPE_ITD            0x00
     41 #define EHC_TYPE_QH             0x02
     42 #define EHC_TYPE_SITD           0x04
     43 #define EHC_TYPE_FSTN           0x06
     44 
     45 #define QH_NAK_RELOAD           3
     46 #define QH_HSHBW_MULTI          1
     47 
     48 #define QTD_MAX_ERR             3
     49 #define QTD_PID_OUTPUT          0x00
     50 #define QTD_PID_INPUT           0x01
     51 #define QTD_PID_SETUP           0x02
     52 
     53 #define QTD_STAT_DO_OUT         0
     54 #define QTD_STAT_DO_SS          0
     55 #define QTD_STAT_DO_PING        0x01
     56 #define QTD_STAT_DO_CS          0x02
     57 #define QTD_STAT_TRANS_ERR      0x08
     58 #define QTD_STAT_BABBLE_ERR     0x10
     59 #define QTD_STAT_BUFF_ERR       0x20
     60 #define QTD_STAT_HALTED         0x40
     61 #define QTD_STAT_ACTIVE         0x80
     62 #define QTD_STAT_ERR_MASK       (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
     63 
     64 #define QTD_MAX_BUFFER          4
     65 #define QTD_BUF_LEN             4096
     66 #define QTD_BUF_MASK            0x0FFF
     67 
     68 #define QH_MICROFRAME_0         0x01
     69 #define QH_MICROFRAME_1         0x02
     70 #define QH_MICROFRAME_2         0x04
     71 #define QH_MICROFRAME_3         0x08
     72 #define QH_MICROFRAME_4         0x10
     73 #define QH_MICROFRAME_5         0x20
     74 #define QH_MICROFRAME_6         0x40
     75 #define QH_MICROFRAME_7         0x80
     76 
     77 #define USB_ERR_SHORT_PACKET    0x200
     78 
     79 //
     80 // Fill in the hardware link point: pass in a EHC_QH/QH_HW
     81 // pointer to QH_LINK; A EHC_QTD/QTD_HW pointer to QTD_LINK
     82 //
     83 #define QH_LINK(Addr, Type, Term) \
     84           ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))
     85 
     86 #define QTD_LINK(Addr, Term)      QH_LINK((Addr), 0, (Term))
     87 
     88 //
     89 // The defination of EHCI hardware used data structure for
     90 // little endian architecture. The QTD and QH structures
     91 // are required to be 32 bytes aligned. Don't add members
     92 // to the head of the associated software strucuture.
     93 //
     94 #pragma pack(1)
     95 typedef struct {
     96   UINT32                  NextQtd;
     97   UINT32                  AltNext;
     98 
     99   UINT32                  Status       : 8;
    100   UINT32                  Pid          : 2;
    101   UINT32                  ErrCnt       : 2;
    102   UINT32                  CurPage      : 3;
    103   UINT32                  Ioc          : 1;
    104   UINT32                  TotalBytes   : 15;
    105   UINT32                  DataToggle   : 1;
    106 
    107   UINT32                  Page[5];
    108   UINT32                  PageHigh[5];
    109 } QTD_HW;
    110 
    111 typedef struct {
    112   UINT32                  HorizonLink;
    113   //
    114   // Endpoint capabilities/Characteristics DWord 1 and DWord 2
    115   //
    116   UINT32                  DeviceAddr   : 7;
    117   UINT32                  Inactive     : 1;
    118   UINT32                  EpNum        : 4;
    119   UINT32                  EpSpeed      : 2;
    120   UINT32                  DtCtrl       : 1;
    121   UINT32                  ReclaimHead  : 1;
    122   UINT32                  MaxPacketLen : 11;
    123   UINT32                  CtrlEp       : 1;
    124   UINT32                  NakReload    : 4;
    125 
    126   UINT32                  SMask        : 8;
    127   UINT32                  CMask        : 8;
    128   UINT32                  HubAddr      : 7;
    129   UINT32                  PortNum      : 7;
    130   UINT32                  Multiplier   : 2;
    131 
    132   //
    133   // Transaction execution overlay area
    134   //
    135   UINT32                  CurQtd;
    136   UINT32                  NextQtd;
    137   UINT32                  AltQtd;
    138 
    139   UINT32                  Status       : 8;
    140   UINT32                  Pid          : 2;
    141   UINT32                  ErrCnt       : 2;
    142   UINT32                  CurPage      : 3;
    143   UINT32                  Ioc          : 1;
    144   UINT32                  TotalBytes   : 15;
    145   UINT32                  DataToggle   : 1;
    146 
    147   UINT32                  Page[5];
    148   UINT32                  PageHigh[5];
    149 } QH_HW;
    150 #pragma pack()
    151 
    152 
    153 //
    154 // Endpoint address and its capabilities
    155 //
    156 typedef struct _USB_ENDPOINT {
    157   UINT8                   DevAddr;
    158   UINT8                   EpAddr;     // Endpoint address, no direction encoded in
    159   EFI_USB_DATA_DIRECTION  Direction;
    160   UINT8                   DevSpeed;
    161   UINTN                   MaxPacket;
    162   UINT8                   HubAddr;
    163   UINT8                   HubPort;
    164   UINT8                   Toggle;     // Data toggle, not used for control transfer
    165   UINTN                   Type;
    166   UINTN                   PollRate;   // Polling interval used by EHCI
    167 } USB_ENDPOINT;
    168 
    169 //
    170 // Software QTD strcture, this is used to manage all the
    171 // QTD generated from a URB. Don't add fields before QtdHw.
    172 //
    173 struct _EHC_QTD {
    174   QTD_HW                  QtdHw;
    175   UINT32                  Signature;
    176   LIST_ENTRY              QtdList;   // The list of QTDs to one end point
    177   UINT8                   *Data;     // Buffer of the original data
    178   UINTN                   DataLen;   // Original amount of data in this QTD
    179 };
    180 
    181 //
    182 // Software QH structure. All three different transaction types
    183 // supported by UEFI USB, that is the control/bulk/interrupt
    184 // transfers use the queue head and queue token strcuture.
    185 //
    186 // Interrupt QHs are linked to periodic frame list in the reversed
    187 // 2^N tree. Each interrupt QH is linked to the list starting at
    188 // frame 0. There is a dummy interrupt QH linked to each frame as
    189 // a sentinental whose polling interval is 1. Synchronous interrupt
    190 // transfer is linked after this dummy QH.
    191 //
    192 // For control/bulk transfer, only synchronous (in the sense of UEFI)
    193 // transfer is supported. A dummy QH is linked to EHCI AsyncListAddr
    194 // as the reclamation header. New transfer is inserted after this QH.
    195 //
    196 struct _EHC_QH {
    197   QH_HW                   QhHw;
    198   UINT32                  Signature;
    199   EHC_QH                  *NextQh;    // The queue head pointed to by horizontal link
    200   LIST_ENTRY              Qtds;       // The list of QTDs to this queue head
    201   UINTN                   Interval;
    202 };
    203 
    204 //
    205 // URB (Usb Request Block) contains information for all kinds of
    206 // usb requests.
    207 //
    208 struct _URB {
    209   UINT32                          Signature;
    210   LIST_ENTRY                      UrbList;
    211 
    212   //
    213   // Transaction information
    214   //
    215   USB_ENDPOINT                    Ep;
    216   EFI_USB_DEVICE_REQUEST          *Request;     // Control transfer only
    217   VOID                            *RequestPhy;  // Address of the mapped request
    218   VOID                            *RequestMap;
    219   VOID                            *Data;
    220   UINTN                           DataLen;
    221   VOID                            *DataPhy;     // Address of the mapped user data
    222   VOID                            *DataMap;
    223   EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
    224   VOID                            *Context;
    225 
    226   //
    227   // Schedule data
    228   //
    229   EHC_QH                          *Qh;
    230 
    231   //
    232   // Transaction result
    233   //
    234   UINT32                          Result;
    235   UINTN                           Completed;    // completed data length
    236   UINT8                           DataToggle;
    237 };
    238 
    239 
    240 
    241 /**
    242   Create a single QTD to hold the data.
    243 
    244   @param  Ehc        The EHCI device.
    245   @param  Data       The cpu memory address of current data not associated with a QTD.
    246   @param  DataPhy    The pci bus address of current data not associated with a QTD.
    247   @param  DataLen    The length of the data.
    248   @param  PktId      Packet ID to use in the QTD.
    249   @param  Toggle     Data toggle to use in the QTD.
    250   @param  MaxPacket  Maximu packet length of the endpoint.
    251 
    252   @return Created QTD or NULL if failed to create one.
    253 
    254 **/
    255 EHC_QTD *
    256 EhcCreateQtd (
    257   IN USB2_HC_DEV          *Ehc,
    258   IN UINT8                *Data,
    259   IN UINT8                *DataPhy,
    260   IN UINTN                DataLen,
    261   IN UINT8                PktId,
    262   IN UINT8                Toggle,
    263   IN UINTN                MaxPacket
    264   );
    265 
    266 
    267 
    268 /**
    269   Allocate and initialize a EHCI queue head.
    270 
    271   @param  Ehci       The EHCI device.
    272   @param  Ep         The endpoint to create queue head for.
    273 
    274   @return Created queue head or NULL if failed to create one.
    275 
    276 **/
    277 EHC_QH *
    278 EhcCreateQh (
    279   IN USB2_HC_DEV          *Ehci,
    280   IN USB_ENDPOINT         *Ep
    281   );
    282 
    283 
    284 /**
    285   Free an allocated URB. It is possible for it to be partially inited.
    286 
    287   @param  Ehc        The EHCI device.
    288   @param  Urb        The URB to free.
    289 
    290 **/
    291 VOID
    292 EhcFreeUrb (
    293   IN USB2_HC_DEV          *Ehc,
    294   IN URB                  *Urb
    295   );
    296 
    297 
    298 /**
    299   Create a new URB and its associated QTD.
    300 
    301   @param  Ehc        The EHCI device.
    302   @param  DevAddr    The device address.
    303   @param  EpAddr     Endpoint addrress & its direction.
    304   @param  DevSpeed   The device speed.
    305   @param  Toggle     Initial data toggle to use.
    306   @param  MaxPacket  The max packet length of the endpoint.
    307   @param  Hub        The transaction translator to use.
    308   @param  Type       The transaction type.
    309   @param  Request    The standard USB request for control transfer.
    310   @param  Data       The user data to transfer.
    311   @param  DataLen    The length of data buffer.
    312   @param  Callback   The function to call when data is transferred.
    313   @param  Context    The context to the callback.
    314   @param  Interval   The interval for interrupt transfer.
    315 
    316   @return Created URB or NULL.
    317 
    318 **/
    319 URB *
    320 EhcCreateUrb (
    321   IN USB2_HC_DEV                        *Ehc,
    322   IN UINT8                              DevAddr,
    323   IN UINT8                              EpAddr,
    324   IN UINT8                              DevSpeed,
    325   IN UINT8                              Toggle,
    326   IN UINTN                              MaxPacket,
    327   IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
    328   IN UINTN                              Type,
    329   IN EFI_USB_DEVICE_REQUEST             *Request,
    330   IN VOID                               *Data,
    331   IN UINTN                              DataLen,
    332   IN EFI_ASYNC_USB_TRANSFER_CALLBACK    Callback,
    333   IN VOID                               *Context,
    334   IN UINTN                              Interval
    335   );
    336 #endif
    337