Author: mjmartin
Date: Tue May 17 11:26:25 2011
New Revision: 51808

URL: http://svn.reactos.org/svn/reactos?rev=51808&view=rev
Log:
[USBSTOR]
- Add error handling to USBSTOR_CSWCompletionRoutine for errors that can be 
recovered via reset of pipe/port/controller. Only pipe reset is attempted. WIP.

Modified:
    branches/usb-bringup/drivers/usb/usbstor/error.c
    branches/usb-bringup/drivers/usb/usbstor/scsi.c
    branches/usb-bringup/drivers/usb/usbstor/usbstor.h

Modified: branches/usb-bringup/drivers/usb/usbstor/error.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/error.c?rev=51808&r1=51807&r2=51808&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/error.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/error.c [iso-8859-1] Tue May 17 
11:26:25 2011
@@ -103,7 +103,7 @@
                                break;
                        }
 
-                       DPRINT1("Failed to reset pipe %x\n");
+                       DPRINT1("Failed to reset pipe %x\n", Status);
 
                        //
                        // FIXME: Reset of pipe failed, attempt to reset port

Modified: branches/usb-bringup/drivers/usb/usbstor/scsi.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/scsi.c?rev=51808&r1=51807&r2=51808&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/scsi.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/scsi.c [iso-8859-1] Tue May 17 
11:26:25 2011
@@ -102,6 +102,9 @@
     PREAD_CAPACITY_DATA_EX CapacityDataEx;
     PREAD_CAPACITY_DATA CapacityData;
     PUFI_CAPACITY_RESPONSE Response;
+    PERRORHANDLER_WORKITEM_DATA ErrorHandlerWorkItemData;
+    NTSTATUS Status;
+    PURB Urb;
 
     DPRINT("USBSTOR_CSWCompletionRoutine Irp %p Ctx %p\n", Irp, Ctx);
 
@@ -153,15 +156,74 @@
         Request = (PSCSI_REQUEST_BLOCK)IoStack->Parameters.Others.Argument1;
         ASSERT(Request);
 
-        //
-        // FIXME: check status
-        //
+        Status = Irp->IoStatus.Status;
+
+        Urb = &Context->Urb;
+
+        //
+        // get SCSI command data block
+        //
+        pCDB = (PCDB)Request->Cdb;
+
+        //
+        // check status
+        //
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("Status %x\n", Status);
+            DPRINT1("UrbStatus %x\n", Urb->UrbHeader.Status);
+
+            //
+            // Check for errors that can be handled
+            // FIXME: Verify all usb errors that can be recovered via pipe 
reset/port reset/controller reset
+            //
+            if ((Urb->UrbHeader.Status & USB_RECOVERABLE_ERRORS) == 
Urb->UrbHeader.Status)
+            {
+                DPRINT1("Attempting Error Recovery\n");
+                //
+                // If a Read Capacity Request free TransferBuffer
+                //
+                if (pCDB->AsByte[0] == SCSIOP_READ_CAPACITY)
+                {
+                    FreeItem(Context->TransferData);
+                }
+
+                //
+                // Clean up the rest
+                //
+                FreeItem(Context->cbw);
+                FreeItem(Context);
+
+                //
+                // Allocate Work Item Data
+                //
+                ErrorHandlerWorkItemData = ExAllocatePoolWithTag(NonPagedPool, 
sizeof(ERRORHANDLER_WORKITEM_DATA), USB_STOR_TAG);
+                if (!ErrorHandlerWorkItemData)
+                {
+                    DPRINT1("Failed to allocate memory\n");
+                    Status = STATUS_INSUFFICIENT_RESOURCES;
+                }
+                else
+                {
+                    //
+                    // Initialize and queue the work item to handle the error
+                    //
+                    
ExInitializeWorkItem(&ErrorHandlerWorkItemData->WorkQueueItem,
+                                        ErrorHandlerWorkItemRoutine,
+                                        ErrorHandlerWorkItemData);
+    
+                    ErrorHandlerWorkItemData->DeviceObject = 
Context->FDODeviceExtension->FunctionalDeviceObject;
+                    ErrorHandlerWorkItemData->Irp = Irp;
+                    ErrorHandlerWorkItemData->Context = Context;
+                    DPRINT1("Queuing WorkItemROutine\n");
+                    ExQueueWorkItem(&ErrorHandlerWorkItemData->WorkQueueItem, 
DelayedWorkQueue);
+
+                    return STATUS_MORE_PROCESSING_REQUIRED;
+                }
+            }
+        }
+
         Request->SrbStatus = SRB_STATUS_SUCCESS;
-
-        //
-        // get SCSI command data block
-        //
-        pCDB = (PCDB)Request->Cdb;
 
         //
         // read capacity needs special work

Modified: branches/usb-bringup/drivers/usb/usbstor/usbstor.h
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/usbstor.h?rev=51808&r1=51807&r2=51808&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/usbstor.h [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/usbstor.h [iso-8859-1] Tue May 17 
11:26:25 2011
@@ -34,6 +34,9 @@
                   ((((unsigned long)(n) & 0xFF00)) << 8) | \
                   ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
                   ((((unsigned long)(n) & 0xFF000000)) >> 24))
+
+#define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | 
USBD_STATUS_DEV_NOT_RESPONDING \
+       | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
 
 NTSTATUS NTAPI
 IoAttachDeviceToDeviceStackSafe(
@@ -278,6 +281,13 @@
     PKEVENT Event;
 }IRP_CONTEXT, *PIRP_CONTEXT;
 
+typedef struct _ERRORHANDLER_WORKITEM_DATA
+{
+       PDEVICE_OBJECT DeviceObject;
+       PIRP Irp;
+       PIRP_CONTEXT Context;
+       WORK_QUEUE_ITEM WorkQueueItem;
+} ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA;
 
 
 //---------------------------------------------------------------------
@@ -425,10 +435,15 @@
     PFDO_DEVICE_EXTENSION FDODeviceExtension);
 
 VOID
+NTAPI
+ErrorHandlerWorkItemRoutine(
+       PVOID Context);
+
+VOID
 USBSTOR_QueueNextRequest(
     IN PDEVICE_OBJECT DeviceObject);
 
 VOID
 USBSTOR_QueueTerminateRequest(
     IN PDEVICE_OBJECT DeviceObject,
-    IN BOOLEAN ModifySrbState);
+    IN BOOLEAN ModifySrbState);


Reply via email to