1 /** @file 2 OHCI transfer scheduling routines. 3 4 Copyright (c) 2013-2015 Intel Corporation. 5 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 17 #include "OhcPeim.h" 18 19 /** 20 21 Convert Error code from OHCI format to EFI format 22 23 @Param ErrorCode ErrorCode in OHCI format 24 25 @retval ErrorCode in EFI format 26 27 **/ 28 UINT32 29 ConvertErrorCode ( 30 IN UINT32 ErrorCode 31 ) 32 { 33 UINT32 TransferResult; 34 35 switch (ErrorCode) { 36 case TD_NO_ERROR: 37 TransferResult = EFI_USB_NOERROR; 38 break; 39 40 case TD_TOBE_PROCESSED: 41 case TD_TOBE_PROCESSED_2: 42 TransferResult = EFI_USB_ERR_NOTEXECUTE; 43 break; 44 45 case TD_DEVICE_STALL: 46 TransferResult = EFI_USB_ERR_STALL; 47 break; 48 49 case TD_BUFFER_OVERRUN: 50 case TD_BUFFER_UNDERRUN: 51 TransferResult = EFI_USB_ERR_BUFFER; 52 break; 53 54 case TD_CRC_ERROR: 55 TransferResult = EFI_USB_ERR_CRC; 56 break; 57 58 case TD_NO_RESPONSE: 59 TransferResult = EFI_USB_ERR_TIMEOUT; 60 break; 61 62 case TD_BITSTUFFING_ERROR: 63 TransferResult = EFI_USB_ERR_BITSTUFF; 64 break; 65 66 default: 67 TransferResult = EFI_USB_ERR_SYSTEM; 68 } 69 70 return TransferResult; 71 } 72 73 74 /** 75 76 Check TDs Results 77 78 @Param Ohc UHC private data 79 @Param Td TD_DESCRIPTOR 80 @Param Result Result to return 81 82 @retval TRUE means OK 83 @retval FLASE means Error or Short packet 84 85 **/ 86 BOOLEAN 87 OhciCheckTDsResults ( 88 IN USB_OHCI_HC_DEV *Ohc, 89 IN TD_DESCRIPTOR *Td, 90 OUT UINT32 *Result 91 ) 92 { 93 UINT32 TdCompletionCode; 94 95 *Result = EFI_USB_NOERROR; 96 97 while (Td) { 98 TdCompletionCode = Td->Word0.ConditionCode; 99 100 *Result |= ConvertErrorCode(TdCompletionCode); 101 // 102 // if any error encountered, stop processing the left TDs. 103 // 104 if (*Result) { 105 return FALSE; 106 } 107 108 Td = Td->NextTDPointer; 109 } 110 return TRUE; 111 112 } 113 114 115 /** 116 117 Check the task status on an ED 118 119 @Param Ed Pointer to the ED task that TD hooked on 120 @Param HeadTd TD header for current transaction 121 122 @retval Task Status Code 123 124 **/ 125 126 UINT32 127 CheckEDStatus ( 128 IN ED_DESCRIPTOR *Ed, 129 IN TD_DESCRIPTOR *HeadTd 130 ) 131 { 132 while(HeadTd != NULL) { 133 if (HeadTd->Word0.ConditionCode != 0) { 134 return HeadTd->Word0.ConditionCode; 135 } 136 HeadTd = HeadTd->NextTDPointer; 137 } 138 139 if (OhciGetEDField (Ed, ED_TDHEAD_PTR) != OhciGetEDField (Ed, ED_TDTAIL_PTR)) { 140 return TD_TOBE_PROCESSED; 141 } 142 143 return TD_NO_ERROR; 144 } 145 146 /** 147 148 Check the task status 149 150 @Param Ohc UHC private data 151 @Param ListType Pipe type 152 @Param Ed Pointer to the ED task hooked on 153 @Param HeadTd Head of TD corresponding to the task 154 @Param ErrorCode return the ErrorCode 155 156 @retval EFI_SUCCESS Task done 157 @retval EFI_NOT_READY Task on processing 158 @retval EFI_DEVICE_ERROR Some error occured 159 160 **/ 161 EFI_STATUS 162 CheckIfDone ( 163 IN USB_OHCI_HC_DEV *Ohc, 164 IN DESCRIPTOR_LIST_TYPE ListType, 165 IN ED_DESCRIPTOR *Ed, 166 IN TD_DESCRIPTOR *HeadTd, 167 OUT UINT32 *ErrorCode 168 ) 169 { 170 *ErrorCode = TD_TOBE_PROCESSED; 171 172 switch (ListType) { 173 case CONTROL_LIST: 174 if (OhciGetHcCommandStatus (Ohc, CONTROL_LIST_FILLED) != 0) { 175 return EFI_NOT_READY; 176 } 177 break; 178 179 case BULK_LIST: 180 if (OhciGetHcCommandStatus (Ohc, BULK_LIST_FILLED) != 0) { 181 return EFI_NOT_READY; 182 } 183 break; 184 185 default: 186 break; 187 } 188 189 *ErrorCode = CheckEDStatus (Ed, HeadTd); 190 191 192 if (*ErrorCode == TD_NO_ERROR) { 193 return EFI_SUCCESS; 194 } else if (*ErrorCode == TD_TOBE_PROCESSED) { 195 return EFI_NOT_READY; 196 } else { 197 return EFI_DEVICE_ERROR; 198 } 199 } 200 201 202 /** 203 204 Convert TD condition code to Efi Status 205 206 @Param ConditionCode Condition code to convert 207 208 @retval EFI_SUCCESS No error occured 209 @retval EFI_NOT_READY TD still on processing 210 @retval EFI_DEVICE_ERROR Error occured in processing TD 211 212 **/ 213 214 EFI_STATUS 215 OhciTDConditionCodeToStatus ( 216 IN UINT32 ConditionCode 217 ) 218 { 219 if (ConditionCode == TD_NO_ERROR) { 220 return EFI_SUCCESS; 221 } 222 223 if (ConditionCode == TD_TOBE_PROCESSED) { 224 return EFI_NOT_READY; 225 } 226 227 return EFI_DEVICE_ERROR; 228 } 229 230