Tighten representation of DbC context type
authorAdrian-Ken Rueegsegger <ken@codelabs.ch>
Tue, 24 Oct 2017 15:22:27 +0000 (17:22 +0200)
committerAdrian-Ken Rueegsegger <ken@codelabs.ch>
Fri, 27 Oct 2017 10:43:28 +0000 (12:43 +0200)
Instead of packing the DbC_Context type use a representation clause to
make sure it conforms to the specification given in "eXtensible Host
Controller Interface for Universal Serial Bus" revision 1.1, section
7.6.9, figure 120.

It was discovered that the latest GNAT version 18.0 generated a
different representation for this type which lead to broken data
transfer: only the first 4096 bytes (Max_Bulk_Size) would be transfered.

Note: The pragma Warnings is required to be compatible with older GNAT
      versions such as GPL 2016.

Signed-off-by: Adrian-Ken Rueegsegger <ken@codelabs.ch>
src/hw-dbc-contexts.ads

index 92f8735ad746d5bcf1d96b888fbea8f034292b19..53882ac1b6939ae873fdd258fd8591cd3cb56e8d 100644 (file)
@@ -17,6 +17,8 @@ is
 
    Context_Size : constant := 64;
 
+   Endpoint_Context_Alignment : constant := 32;
+
    ----------------------------------------------------------------------------
 
    type DbC_Info_Context is record
@@ -34,8 +36,8 @@ is
       Reserved_Z_4                 : Word64;
    end record
    with
-      Pack,
       Volatile,
+      Size      => Context_Size * 8,
       Alignment => Context_Size;
 
    ----------------------------------------------------------------------------
@@ -80,6 +82,7 @@ is
       Bulk_I      => 6,
       Interrupt_I => 7);
 
+   pragma Warnings (Off, "* bits of * unused");
    type Endpoint_Context is record
       EP_State              : Endpoint_State;
       Reserved_Z            : Word5;
@@ -107,7 +110,8 @@ is
    end record
    with
       Volatile,
-      Alignment => Context_Size;
+      Size      => Context_Size * 8,
+      Alignment => Endpoint_Context_Alignment;
    for Endpoint_Context use record
       EP_State              at 16#00# range 0 .. 2;
       Reserved_Z            at 16#00# range 3 .. 7;
@@ -133,9 +137,12 @@ is
       reserved2             at 16#18# range 0 .. 31;
       reserved3             at 16#1c# range 0 .. 31;
    end record;
+   pragma Warnings (On, "* bits of * unused");
 
    ----------------------------------------------------------------------------
 
+   --  See "eXtensible Host Controller Interface for Universal Serial Bus"
+   --  revision 1.1, section 7.6.9, figure 120.
    type DbC_Context is record
       DbC_Info : DbC_Info_Context;
       OUT_EP   : Endpoint_Context;
@@ -143,11 +150,16 @@ is
    end record
    with
       Volatile,
-      Pack,
       Alignment => Context_Size;
    -- Use size for alignment:
    -- It always fullfills page crossing requirements.
 
+   for DbC_Context use record
+      DbC_Info at 16#00# range 0 .. Context_Size * 8 - 1;
+      OUT_EP   at 16#40# range 0 .. Context_Size * 8 - 1;
+      IN_EP    at 16#80# range 0 .. Context_Size * 8 - 1;
+   end record;
+
    -----------------------------------------------------------------------
 
    procedure Clear_DbC_Context (Context : out DbC_Context);