// Queue\r
INITIALIZE_LIST_HEAD_VARIABLE (gSdMmcPciHcTemplate.Queue),\r
{ // Slot\r
- {0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0},\r
- {0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0}\r
+ {0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0},\r
+ {0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0}\r
},\r
{ // Capability\r
{0},\r
Link = GetFirstNode (&Private->Queue);\r
if (!IsNull (&Private->Queue, Link)) {\r
Trb = SD_MMC_HC_TRB_FROM_THIS (Link);\r
- if (Private->Slot[Trb->Slot].MediaPresent == FALSE) {\r
+ if (!Private->Slot[Trb->Slot].MediaPresent) {\r
Status = EFI_NO_MEDIA;\r
goto Done;\r
}\r
Trb->Packet->TransactionStatus = EFI_TIMEOUT;\r
TrbEvent = Trb->Event;\r
SdMmcFreeTrb (Trb);\r
- DEBUG ((EFI_D_VERBOSE, "ProcessAsyncTaskList(): Signal Event %p EFI_TIMEOUT\n", TrbEvent));\r
+ DEBUG ((DEBUG_VERBOSE, "ProcessAsyncTaskList(): Signal Event %p EFI_TIMEOUT\n", TrbEvent));\r
gBS->SignalEvent (TrbEvent);\r
return;\r
}\r
Trb->Packet->TransactionStatus = Status;\r
TrbEvent = Trb->Event;\r
SdMmcFreeTrb (Trb);\r
- DEBUG ((EFI_D_VERBOSE, "ProcessAsyncTaskList(): Signal Event %p with %r\n", TrbEvent, Status));\r
+ DEBUG ((DEBUG_VERBOSE, "ProcessAsyncTaskList(): Signal Event %p with %r\n", TrbEvent, Status));\r
gBS->SignalEvent (TrbEvent);\r
}\r
return;\r
LIST_ENTRY *Link;\r
LIST_ENTRY *NextLink;\r
SD_MMC_HC_TRB *Trb;\r
+ EFI_TPL OldTpl;\r
\r
Private = (SD_MMC_HC_PRIVATE_DATA*)Context;\r
\r
for (Slot = 0; Slot < SD_MMC_HC_MAX_SLOT; Slot++) {\r
if ((Private->Slot[Slot].Enable) && (Private->Slot[Slot].SlotType == RemovableSlot)) {\r
Status = SdMmcHcCardDetect (Private->PciIo, Slot, &MediaPresent);\r
- if ((Status == EFI_MEDIA_CHANGED) && (MediaPresent == FALSE)) {\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcEnumerateDevice: device disconnected at slot %d of pci %p\n", Slot, Private->PciIo));\r
+ if ((Status == EFI_MEDIA_CHANGED) && !MediaPresent) {\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcEnumerateDevice: device disconnected at slot %d of pci %p\n", Slot, Private->PciIo));\r
Private->Slot[Slot].MediaPresent = FALSE;\r
+ Private->Slot[Slot].Initialized = FALSE;\r
//\r
// Signal all async task events at the slot with EFI_NO_MEDIA status.\r
//\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
for (Link = GetFirstNode (&Private->Queue);\r
!IsNull (&Private->Queue, Link);\r
Link = NextLink) {\r
SdMmcFreeTrb (Trb);\r
}\r
}\r
+ gBS->RestoreTPL (OldTpl);\r
//\r
// Notify the upper layer the connect state change through ReinstallProtocolInterface.\r
//\r
&Private->PassThru\r
);\r
}\r
- if ((Status == EFI_MEDIA_CHANGED) && (MediaPresent == TRUE)) {\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcEnumerateDevice: device connected at slot %d of pci %p\n", Slot, Private->PciIo));\r
+ if ((Status == EFI_MEDIA_CHANGED) && MediaPresent) {\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcEnumerateDevice: device connected at slot %d of pci %p\n", Slot, Private->PciIo));\r
+ //\r
+ // Reset the specified slot of the SD/MMC Pci Host Controller\r
+ //\r
+ Status = SdMmcHcReset (Private->PciIo, Slot);\r
+ if (EFI_ERROR (Status)) {\r
+ continue;\r
+ }\r
//\r
// Reinitialize slot and restart identification process for the new attached device\r
//\r
}\r
\r
Private->Slot[Slot].MediaPresent = TRUE;\r
+ Private->Slot[Slot].Initialized = TRUE;\r
RoutineNum = sizeof (mCardTypeDetectRoutineTable) / sizeof (CARD_TYPE_DETECT_ROUTINE);\r
for (Index = 0; Index < RoutineNum; Index++) {\r
Routine = &mCardTypeDetectRoutineTable[Index];\r
}\r
}\r
}\r
+ //\r
+ // This card doesn't get initialized correctly.\r
+ //\r
+ if (Index == RoutineNum) {\r
+ Private->Slot[Slot].Initialized = FALSE;\r
+ }\r
\r
//\r
// Notify the upper layer the connect state change through ReinstallProtocolInterface.\r
CARD_TYPE_DETECT_ROUTINE *Routine;\r
UINT32 RoutineNum;\r
BOOLEAN MediaPresent;\r
+ BOOLEAN Support64BitDma;\r
\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcDriverBindingStart: Start\n"));\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcDriverBindingStart: Start\n"));\r
\r
//\r
// Open PCI I/O Protocol and save pointer to open protocol\r
goto Done;\r
}\r
\r
+ Support64BitDma = TRUE;\r
for (Slot = FirstBar; Slot < (FirstBar + SlotNum); Slot++) {\r
Private->Slot[Slot].Enable = TRUE;\r
\r
}\r
DumpCapabilityReg (Slot, &Private->Capability[Slot]);\r
\r
+ Support64BitDma &= Private->Capability[Slot].SysBus64;\r
+\r
Status = SdMmcHcGetMaxCurrent (PciIo, Slot, &Private->MaxCurrent[Slot]);\r
if (EFI_ERROR (Status)) {\r
continue;\r
\r
Private->Slot[Slot].SlotType = Private->Capability[Slot].SlotType;\r
if ((Private->Slot[Slot].SlotType != RemovableSlot) && (Private->Slot[Slot].SlotType != EmbeddedSlot)) {\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcDxe doesn't support the slot type [%d]!!!\n", Private->Slot[Slot].SlotType));\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcDxe doesn't support the slot type [%d]!!!\n", Private->Slot[Slot].SlotType));\r
continue;\r
}\r
\r
Status = SdMmcHcCardDetect (PciIo, Slot, &MediaPresent);\r
if (EFI_ERROR (Status) && (Status != EFI_MEDIA_CHANGED)) {\r
continue;\r
- } else if (MediaPresent == FALSE) {\r
- DEBUG ((EFI_D_ERROR, "SdMmcHcCardDetect: No device attached in Slot[%d]!!!\n", Slot));\r
+ } else if (!MediaPresent) {\r
+ DEBUG ((DEBUG_INFO, "SdMmcHcCardDetect: No device attached in Slot[%d]!!!\n", Slot));\r
continue;\r
}\r
\r
}\r
\r
Private->Slot[Slot].MediaPresent = TRUE;\r
+ Private->Slot[Slot].Initialized = TRUE;\r
RoutineNum = sizeof (mCardTypeDetectRoutineTable) / sizeof (CARD_TYPE_DETECT_ROUTINE);\r
for (Index = 0; Index < RoutineNum; Index++) {\r
Routine = &mCardTypeDetectRoutineTable[Index];\r
}\r
}\r
}\r
+ //\r
+ // This card doesn't get initialized correctly.\r
+ //\r
+ if (Index == RoutineNum) {\r
+ Private->Slot[Slot].Initialized = FALSE;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Enable 64-bit DMA support in the PCI layer if this controller\r
+ // supports it.\r
+ //\r
+ if (Support64BitDma) {\r
+ Status = PciIo->Attributes (\r
+ PciIo,\r
+ EfiPciIoAttributeOperationEnable,\r
+ EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE,\r
+ NULL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_WARN, "SdMmcPciHcDriverBindingStart: failed to enable 64-bit DMA (%r)\n", Status));\r
+ }\r
}\r
\r
//\r
//\r
Status = gBS->CreateEvent (\r
EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
- TPL_CALLBACK,\r
+ TPL_NOTIFY,\r
ProcessAsyncTaskList,\r
Private,\r
&Private->TimerEvent\r
NULL\r
);\r
\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcDriverBindingStart: %r End on %x\n", Status, Controller));\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcDriverBindingStart: %r End on %x\n", Status, Controller));\r
\r
Done:\r
if (EFI_ERROR (Status)) {\r
LIST_ENTRY *NextLink;\r
SD_MMC_HC_TRB *Trb;\r
\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcDriverBindingStop: Start\n"));\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcDriverBindingStop: Start\n"));\r
\r
Status = gBS->OpenProtocol (\r
Controller,\r
\r
FreePool (Private);\r
\r
- DEBUG ((EFI_D_INFO, "SdMmcPciHcDriverBindingStop: End with %r\n", Status));\r
+ DEBUG ((DEBUG_INFO, "SdMmcPciHcDriverBindingStop: End with %r\n", Status));\r
\r
return Status;\r
}\r
return EFI_NO_MEDIA;\r
}\r
\r
+ if (!Private->Slot[Slot].Initialized) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
+\r
Trb = SdMmcCreateTrb (Private, Slot, Packet, Event);\r
if (Trb == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
// Wait async I/O list is empty before execute sync I/O operation.\r
//\r
while (TRUE) {\r
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
if (IsListEmpty (&Private->Queue)) {\r
gBS->RestoreTPL (OldTpl);\r
break;\r
}\r
\r
Done:\r
- if ((Trb != NULL) && (Trb->AdmaDesc != NULL)) {\r
- FreePages (Trb->AdmaDesc, Trb->AdmaPages);\r
- }\r
-\r
- if (Trb != NULL) {\r
- FreePool (Trb);\r
- }\r
+ SdMmcFreeTrb (Trb);\r
\r
return Status;\r
}\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (!Private->Slot[Slot].MediaPresent) {\r
- return EFI_NO_MEDIA;\r
- }\r
+ if (!Private->Slot[Slot].MediaPresent) {\r
+ return EFI_NO_MEDIA;\r
+ }\r
+\r
+ if (!Private->Slot[Slot].Initialized) {\r
+ return EFI_DEVICE_ERROR;\r
+ }\r
//\r
// Free all async I/O requests in the queue\r
//\r
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
for (Link = GetFirstNode (&Private->Queue);\r
!IsNull (&Private->Queue, Link);\r