docs/develop: More reorganization.

* There is now a 'busses' folder, and the extant USB/SDHCI/Bluetooth/etc.
   docs now live in it, instead of various other places.
 * kernel/ports is now kernel/arch, like it is in src/system.
   SPARC documentation is now in there, too.
 * VM files (these are rather outdated) are now in kernel/vm.
 * SCSI ASC info removed, this is easily available online and
   it doesn't seem to be very relevant.
This commit is contained in:
Augustin Cavalier
2019-03-30 18:00:46 -04:00
parent 454b04ca27
commit 18a8edbf0e
36 changed files with 0 additions and 728 deletions
-18
View File
@@ -1,18 +0,0 @@
INSIDE THE USB STACK
==============
For all of you who have been over my code and thought: "What is this guy doing?", I can firmly respond that I sometimes haven't a clue either. But when I'm actually reviewing my own code, I occassionally get the feeling that I do have a direction I'm persueing. In order to define this direction more, and share you in the fun, I have written this document. It's a rather superficial account (without actually quoting any code), but it should be enough to get you started.
First of all, it's always good to know that the USB stack is modularised. This means that there is a backend - a module - which connects to a whole range of modules that are in touch with the host controllers (the actual USB hardware). The combination of these modules is what we call the USB stack. The job of the backend (in CVS at /current/src/add-ons/kernel/bus_managers/usb) is to perform generic operations like managing device connects and disconnects, and pushing commands from drivers to the host-controller modules. The host controller modules are in direct contact with the hardware, meaning that they translate actual commands into something the host controller can work with and can transmit over the wires. Additionally, these host controller modules simulate the root hub: they provide a seamless interface for the backend module to communicate with the root hub.
In the first experiments of my USB stack, there was a special 'C' interface for the host controller modules. This interface was clumsy, because all the objects (the backend is in C++) were constantly harvesting data all over the place because they couldn't simply send references of themselves. The second attempt of the USB stack introduces a libusb.a (the kernel doesn't support shared libraries), which contains the basic structure of the stack, and which is linked in by both the backend and the host controller modules. Instead of having a host_controller_module struct with function pointers, the host controller modules now simply returned an extended 'class Busmanager'. The downside is that whenever the libusb.a is changed, all the host controller modules have to be relinked in order to avoid disasters. (This is also something which prevents me from providing a nice C++ interface for drivers). However, this limitation is much easier to work around than the separate C-interface.
The basic structure of the stack (and of libusb.a) can be found in the usb_p.h file in the CVS location of the backend. You'll notice a few objects which I'll quickly go over. First of all, there's stack, which is basically a container for the individual Bus managers. The Busmanager class encapsulates a bus manager. The Device class represents a connected device, and the Hub class (inherits Device), manages the communication with the hubs. For the area of communication there are a few classes that are interesting. The Pipe class represents a data pipe. A 'pipe' is more an interface than something that is actually interesting during USB communication. A pipe encapsulates the properties regarding what kind of data is transmitted to where. Each Pipe type (corresponding to the four types of transfer), will be a subclass of Pipe. The objects of Pipe will all be associated with a device. Finally there's the Transfer class. The objects of this class are created by the Pipes, and contain the actual data for the transfers (including references to the callbacks).
All these classes would be useless, if they weren't interacting with each other. The basic idea of the stack is the following. As soon as the USB bus_manager module is opened by a driver (for the first time), a Stack object is initialized. This object starts looking for host controller modules. Every host controller tries to find and initialize their cards, and if they succeed, they add a BusManager object to the stack. This bus manager object contains an object of the hub class, and the default pipes. The generic backend implementation starts a usb_explore thread, which will poll the status of the hubs and keep the internal administration up to date. As soon as a hub signals that a new device is connected, the Busmanager starts a procedure to connect the device. If it's a hub, a Hub is created, else a Device is created. This device object creates the default pipe, and contains all the data related to it.
New transfers are initialized by Pipes. The Transfer objects will be created by the Pipe subclasses only, and the ownership of the objects will go to the Busmanager that has to transmit them (that will take care of deletion). The SubmitTransfer function of the Busmanagers are the gate to the actual transfer. What happens is host controller dependent. The implementation of the host controller should take care of finishing a transfer.
As for closing, this design lacks some objects that correspond to USB objects. For example, there are no special Endpoint objects. At the moment, passing adresses is sufficient, but perhaps it should change in order to complete the design. Also, there is currently no idea how locking should work. Finally, the Stack class currently includes some memory management for usb, however, checking from the specs, only UHCI requires manual scheduling, OHCI and EHCI manage the scheduling and packaging itself. That should move. But at the moment, this design works.
Finally, this document gives an idea of how it should work. For details: check the USB specs, host controller specs and the code. If anything stays unclear, please comment on my weblog, or e-mail me.
+48
View File
@@ -0,0 +1,48 @@
Notes on long double support
============================
The "long double" type is different on each architecture. Depending on the
available hardware and ABI conventions, performance compromises, etc, there
may be many implementations of it. Here is a summary for our convenience.
128-bit IEEE
------------
Platforms: Sparc, ARM64, RISC-V
This is the standard long double type from IEEE754. It has 1 sign bit,
15 exponent bit, and 112 fractional part bits. It is the natural extension
of the 64bit double.
Sparc specifies this type in their ABI but no implementation actually has
the instructions, they instead trigger a trap which would software emulate
them. However, gcc short circuits this by default and calls C library
support functions directly.
64-bit IEEE
-----------
Platforms: ARM
This is the same representation as plain "double". ARM uses this for simplicity.
80-bit
------
Platform: x86, x86\_64, m68k
This intermediate format is used by x86 CPUs internally. It may end up being
faster than plain double there. It consists of a 64bit fractional part, 15
exponent bits, and 1 sign bit. This is convenient because the fractional part
is a relatively easy to handle 64bit number.
m68k uses a similar format, but padded to 96 bits (the extra 16 bits are unused).
double double
-------------
Platforms: PowerPC?
This is also a 128bit type, but the representation is just two 64bit doubles.
The value is the sum of the two halves. This format allows faster emulation
than a "true" 128bit long double, and the precision is almost as good.
+32
View File
@@ -0,0 +1,32 @@
The SPARC architecture has 32 integer registers, divided as follows:
- global registers (g0-g7)
- input (i0-i7)
- local (l0-l7)
- output (o0-o7)
Parameter passing and return is done using the output registers, which are
generally considered scratch registers and can be corrupted by the callee. The
caller must take care of preserving them.
The input and local registers are callee-saved, but we have hardware assistance
in the form of a register window. There is an instruction to shift the registers
so that:
- o registers become i registers
- local and output registers are replaced with fresh sets, for use by the
current function
- global registers are not affected
Note that as a side-effect, o7 is moved to i7, this is convenient because these
are usually the stack and frame pointers, respectively. So basically this sets
the frame pointer for free.
Simple enough functions may end up using just the o registers, in that case
nothing special is necessary, of course.
When shifting the register window, the extra registers come from the register
stack in the CPU. This is not infinite, however, most implementations of SPARC
will only have 8 windows available. When the internal stack is full, an overflow
trap is raised, and the handler must free up old windows by storing them on the
stack, likewise, when the internal stack is empty, an underflow trap must fill
it back from the stack-saved data.
@@ -0,0 +1,37 @@
The SPARC CPU is not designed to gracefully handle misaligned accesses.
You can access a single byte at any address, but 16-bit access only at even
addresses, 32bit access at multiple of 4 addresses, etc.
For example, on x86, such accesses are not a problem, it is allowed and handled
directly by the instructions doing the access. So there is no performance cost.
On SPARC, however, such accesses will cause a SIGBUS. This means a trap handler
has to catch the misaligned access and do it in software, byte by byte, then
give back control to the application. This is, of course, very slow, so we
should avoid it when possible.
Fortunately, gcc knows about this, and will normally do the right thing:
- For usual variables and structures, it will make sure to lay them out so that
they are aligned. It relies on stack alignment, as well as malloc returning
sufficiently aligned memory (as required by the C standard).
- On packed structure, gcc knows the data is misaligned, and will automatically
use the appropriate way to access it (most likely, byte-by-byte).
This leaves us with two undesirable cases:
- Pointer arithmetics and casting. When computing addresses manually, it's
possible to generate a misaligned address and cast it to a type with a wider
alignment requirement. In this case, gcc may access the pointer using a
multi byte instruction and cause a SIGBUS. Solution: make sure the struct
is aligned, or declare it as packed so unaligned access are used instead.
- Access to hardware: it is a common pattern to declare a struct as packed,
and map it to hardware registers. If the alignment isn't known, gcc will use
byte by byte access. It seems volatile would cause gcc to use the proper way
to access the struct, assuming that a volatile value is necessarily
aligned as it should.
In the end, we just need to be careful about pointer math resulting in unalined
access. -Wcast-align helps with that, but it also raises a lot of false positives
(where the alignment is preserved even when casting to other types). So we
enable it only as a warning for now. We will need to ceck the sigbus handler to
identify places where we do a lot of misaligned accesses that trigger it, and
rework the code as needed. But in general, except for these cases, we're fine.
@@ -0,0 +1,12 @@
The SPARC instruction set specifies instruction for handling long double
values, however, no hardware implementation actually provides them. They
generate a trap, which is expected to be handled by the softfloat library.
Since traps are slow, and gcc knows better, it will never generate those
instructions. Instead it directly calls into the C library, to functions
specified in the ABI and used to do long double math using softfloats.
The support code for this is, in our case, compiled into both the kernel and
libroot. It lives in src/system/libroot/os/arch/sparc/softfloat.c (and other
support files). This code was extracted from FreeBSD, rather than the glibc,
because that made it much easier to get it building in the kernel.
@@ -1,728 +0,0 @@
File: ASC-NUM.TXT
SCSI ASC/ASCQ Assignments
Numeric Sorted Listing
as of 9/19/13
D - DIRECT ACCESS DEVICE (SBC-3) device column key
.T - SEQUENTIAL ACCESS DEVICE (SSC-3) -------------------
. L - PRINTER DEVICE (SSC) blank = reserved
. P - PROCESSOR DEVICE (SPC-2) not blank = allowed
. .W - WRITE ONCE READ MULTIPLE DEVICE (SBC)
. . R - C/DVD DEVICE (MMC-6)
. . O - OPTICAL MEMORY DEVICE (SBC)
. . .M - MEDIA CHANGER DEVICE (SMC-3)
. . . A - STORAGE ARRAY DEVICE (SCC-2)
. . . E - ENCLOSURE SERVICES DEVICE (SES-2)
. . . .B - SIMPLIFIED DIRECT-ACCESS DEVICE (RBC)
. . . . K - OPTICAL CARD READER/WRITER DEVICE (OCRW)
. . . . V - AUTOMATION/DRIVE INTERFACE (ADC-2)
. . . . .F - OBJECT-BASED STORAGE (OSD-2)
ASC/ASCQ DTLPWROMAEBKVF Description
------- -------------- ----------------------------------------------------
00h/00h DTLPWROMAEBKVF NO ADDITIONAL SENSE INFORMATION
00h/01h T FILEMARK DETECTED
00h/02h T END-OF-PARTITION/MEDIUM DETECTED
00h/03h T SETMARK DETECTED
00h/04h T BEGINNING-OF-PARTITION/MEDIUM DETECTED
00h/05h TL END-OF-DATA DETECTED
00h/06h DTLPWROMAEBKVF I/O PROCESS TERMINATED
00h/07h T PROGRAMMABLE EARLY WARNING DETECTED
00h/11h R AUDIO PLAY OPERATION IN PROGRESS
00h/12h R AUDIO PLAY OPERATION PAUSED
00h/13h R AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED
00h/14h R AUDIO PLAY OPERATION STOPPED DUE TO ERROR
00h/15h R NO CURRENT AUDIO STATUS TO RETURN
00h/16h DTLPWROMAEBKVF OPERATION IN PROGRESS
00h/17h DTL WROMAEBKVF CLEANING REQUESTED
00h/18h T ERASE OPERATION IN PROGRESS
00h/19h T LOCATE OPERATION IN PROGRESS
00h/1Ah T REWIND OPERATION IN PROGRESS
00h/1Bh T SET CAPACITY OPERATION IN PROGRESS
00h/1Ch T VERIFY OPERATION IN PROGRESS
00h/1Dh DT B ATA PASS THROUGH INFORMATION AVAILABLE
00h/1Eh DT R MAEBKV CONFLICTING SA CREATION REQUEST
00h/1Fh DT B LOGICAL UNIT TRANSITIONING TO ANOTHER POWER CONDITION
00h/20h DT P B EXTENDED COPY INFORMATION AVAILABLE
01h/00h D W O BK NO INDEX/SECTOR SIGNAL
02h/00h D WRO BK NO SEEK COMPLETE
03h/00h DTL W O BK PERIPHERAL DEVICE WRITE FAULT
03h/01h T NO WRITE CURRENT
03h/02h T EXCESSIVE WRITE ERRORS
04h/00h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE
04h/01h DTLPWROMAEBKVF LOGICAL UNIT IS IN PROCESS OF BECOMING READY
04h/02h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED
04h/03h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED
04h/04h DTL RO B LOGICAL UNIT NOT READY, FORMAT IN PROGRESS
04h/05h DT W O A BK F LOGICAL UNIT NOT READY, REBUILD IN PROGRESS
04h/06h DT W O A BK LOGICAL UNIT NOT READY, RECALCULATION IN PROGRESS
04h/07h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, OPERATION IN PROGRESS
04h/08h R LOGICAL UNIT NOT READY, LONG WRITE IN PROGRESS
04h/09h DTLPWROMAEBKVF LOGICAL UNIT NOT READY, SELF-TEST IN PROGRESS
04h/0Ah DTLPWROMAEBKVF LOGICAL UNIT NOT ACCESSIBLE, ASYMMETRIC ACCESS STATE TRANSITION
04h/0Bh DTLPWROMAEBKVF LOGICAL UNIT NOT ACCESSIBLE, TARGET PORT IN STANDBY STATE
04h/0Ch DTLPWROMAEBKVF LOGICAL UNIT NOT ACCESSIBLE, TARGET PORT IN UNAVAILABLE STATE
04h/0Dh F LOGICAL UNIT NOT READY, STRUCTURE CHECK REQUIRED
04h/10h DT WROM B LOGICAL UNIT NOT READY, AUXILIARY MEMORY NOT ACCESSIBLE
04h/11h DT WRO AEB VF LOGICAL UNIT NOT READY, NOTIFY (ENABLE SPINUP) REQUIRED
04h/12h M V LOGICAL UNIT NOT READY, OFFLINE
04h/13h DT R MAEBKV LOGICAL UNIT NOT READY, SA CREATION IN PROGRESS
04h/14h D B LOGICAL UNIT NOT READY, SPACE ALLOCATION IN PROGRESS
04h/15h M LOGICAL UNIT NOT READY, ROBOTICS DISABLED
04h/16h M LOGICAL UNIT NOT READY, CONFIGURATION REQUIRED
04h/17h M LOGICAL UNIT NOT READY, CALIBRATION REQUIRED
04h/18h M LOGICAL UNIT NOT READY, A DOOR IS OPEN
04h/19h M LOGICAL UNIT NOT READY, OPERATING IN SEQUENTIAL MODE
04h/1Ah D B LOGICAL UNIT NOT READY, START STOP UNIT COMMAND IN PROGRESS
04h/1Bh D B LOGICAL UNIT NOT READY, SANITIZE IN PROGRESS
04h/1Ch DT MAEB LOGICAL UNIT NOT READY, ADDITIONAL POWER USE NOT YET GRANTED
04h/1Dh D LOGICAL UNIT NOT READY, CONFIGURATION IN PROGRESS
04h/1Eh D LOGICAL UNIT NOT READY, MICROCODE ACTIVATION REQUIRED
05h/00h DTL WROMAEBKVF LOGICAL UNIT DOES NOT RESPOND TO SELECTION
06h/00h D WROM BK NO REFERENCE POSITION FOUND
07h/00h DTL WROM BK MULTIPLE PERIPHERAL DEVICES SELECTED
08h/00h DTL WROMAEBKVF LOGICAL UNIT COMMUNICATION FAILURE
08h/01h DTL WROMAEBKVF LOGICAL UNIT COMMUNICATION TIME-OUT
08h/02h DTL WROMAEBKVF LOGICAL UNIT COMMUNICATION PARITY ERROR
08h/03h DT ROM BK LOGICAL UNIT COMMUNICATION CRC ERROR (ULTRA-DMA/32)
08h/04h DTLPWRO K UNREACHABLE COPY TARGET
09h/00h DT WRO B TRACK FOLLOWING ERROR
09h/01h WRO K TRACKING SERVO FAILURE
09h/02h WRO K FOCUS SERVO FAILURE
09h/03h WRO SPINDLE SERVO FAILURE
09h/04h DT WRO B HEAD SELECT FAULT
0Ah/00h DTLPWROMAEBKVF ERROR LOG OVERFLOW
0Bh/00h DTLPWROMAEBKVF WARNING
0Bh/01h DTLPWROMAEBKVF WARNING - SPECIFIED TEMPERATURE EXCEEDED
0Bh/02h DTLPWROMAEBKVF WARNING - ENCLOSURE DEGRADED
0Bh/03h DTLPWROMAEBKVF WARNING - BACKGROUND SELF-TEST FAILED
0Bh/04h DTLPWRO AEBKVF WARNING - BACKGROUND PRE-SCAN DETECTED MEDIUM ERROR
0Bh/05h DTLPWRO AEBKVF WARNING - BACKGROUND MEDIUM SCAN DETECTED MEDIUM ERROR
0Bh/06h DTLPWROMAEBKVF WARNING - NON-VOLATILE CACHE NOW VOLATILE
0Bh/07h DTLPWROMAEBKVF WARNING - DEGRADED POWER TO NON-VOLATILE CACHE
0Bh/08h DTLPWROMAEBKVF WARNING - POWER LOSS EXPECTED
0Bh/09h D WARNING - DEVICE STATISTICS NOTIFICATION ACTIVE
0Ch/00h T R WRITE ERROR
0Ch/01h K WRITE ERROR - RECOVERED WITH AUTO REALLOCATION
0Ch/02h D W O BK WRITE ERROR - AUTO REALLOCATION FAILED
0Ch/03h D W O BK WRITE ERROR - RECOMMEND REASSIGNMENT
0Ch/04h DT W O B COMPRESSION CHECK MISCOMPARE ERROR
0Ch/05h DT W O B DATA EXPANSION OCCURRED DURING COMPRESSION
0Ch/06h DT W O B BLOCK NOT COMPRESSIBLE
0Ch/07h R WRITE ERROR - RECOVERY NEEDED
0Ch/08h R WRITE ERROR - RECOVERY FAILED
0Ch/09h R WRITE ERROR - LOSS OF STREAMING
0Ch/0Ah R WRITE ERROR - PADDING BLOCKS ADDED
0Ch/0Bh DT WROM B AUXILIARY MEMORY WRITE ERROR
0Ch/0Ch DTLPWRO AEBKVF WRITE ERROR - UNEXPECTED UNSOLICITED DATA
0Ch/0Dh DTLPWRO AEBKVF WRITE ERROR - NOT ENOUGH UNSOLICITED DATA
0Ch/0Eh DT W O BK MULTIPLE WRITE ERRORS
0Ch/0Fh R DEFECTS IN ERROR WINDOW
0Dh/00h DTLPWRO A K ERROR DETECTED BY THIRD PARTY TEMPORARY INITIATOR
0Dh/01h DTLPWRO A K THIRD PARTY DEVICE FAILURE
0Dh/02h DTLPWRO A K COPY TARGET DEVICE NOT REACHABLE
0Dh/03h DTLPWRO A K INCORRECT COPY TARGET DEVICE TYPE
0Dh/04h DTLPWRO A K COPY TARGET DEVICE DATA UNDERRUN
0Dh/05h DTLPWRO A K COPY TARGET DEVICE DATA OVERRUN
0Eh/00h DT PWROMAEBK F INVALID INFORMATION UNIT
0Eh/01h DT PWROMAEBK F INFORMATION UNIT TOO SHORT
0Eh/02h DT PWROMAEBK F INFORMATION UNIT TOO LONG
0Eh/03h DT P R MAEBK F INVALID FIELD IN COMMAND INFORMATION UNIT
0Fh/00h
10h/00h D W O BK ID CRC OR ECC ERROR
10h/01h DT W O LOGICAL BLOCK GUARD CHECK FAILED
10h/02h DT W O LOGICAL BLOCK APPLICATION TAG CHECK FAILED
10h/03h DT W O LOGICAL BLOCK REFERENCE TAG CHECK FAILED
10h/04h T LOGICAL BLOCK PROTECTION ERROR ON RECOVER BUFFERED DATA
10h/05h T LOGICAL BLOCK PROTECTION METHOD ERROR
11h/00h DT WRO BK UNRECOVERED READ ERROR
11h/01h DT WRO BK READ RETRIES EXHAUSTED
11h/02h DT WRO BK ERROR TOO LONG TO CORRECT
11h/03h DT W O BK MULTIPLE READ ERRORS
11h/04h D W O BK UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED
11h/05h WRO B L-EC UNCORRECTABLE ERROR
11h/06h WRO B CIRC UNRECOVERED ERROR
11h/07h W O B DATA RE-SYNCHRONIZATION ERROR
11h/08h T INCOMPLETE BLOCK READ
11h/09h T NO GAP FOUND
11h/0Ah DT O BK MISCORRECTED ERROR
11h/0Bh D W O BK UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT
11h/0Ch D W O BK UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA
11h/0Dh DT WRO B DE-COMPRESSION CRC ERROR
11h/0Eh DT WRO B CANNOT DECOMPRESS USING DECLARED ALGORITHM
11h/0Fh R ERROR READING UPC/EAN NUMBER
11h/10h R ERROR READING ISRC NUMBER
11h/11h R READ ERROR - LOSS OF STREAMING
11h/12h DT WROM B AUXILIARY MEMORY READ ERROR
11h/13h DTLPWRO AEBKVF READ ERROR - FAILED RETRANSMISSION REQUEST
11h/14h D READ ERROR - LBA MARKED BAD BY APPLICATION CLIENT
11h/15h D WRITE AFTER SANITIZE REQUIRED
12h/00h D W O BK ADDRESS MARK NOT FOUND FOR ID FIELD
13h/00h D W O BK ADDRESS MARK NOT FOUND FOR DATA FIELD
14h/00h DTL WRO BK RECORDED ENTITY NOT FOUND
14h/01h DT WRO BK RECORD NOT FOUND
14h/02h T FILEMARK OR SETMARK NOT FOUND
14h/03h T END-OF-DATA NOT FOUND
14h/04h T BLOCK SEQUENCE ERROR
14h/05h DT W O BK RECORD NOT FOUND - RECOMMEND REASSIGNMENT
14h/06h DT W O BK RECORD NOT FOUND - DATA AUTO-REALLOCATED
14h/07h T LOCATE OPERATION FAILURE
15h/00h DTL WROM BK RANDOM POSITIONING ERROR
15h/01h DTL WROM BK MECHANICAL POSITIONING ERROR
15h/02h DT WRO BK POSITIONING ERROR DETECTED BY READ OF MEDIUM
16h/00h D W O BK DATA SYNCHRONIZATION MARK ERROR
16h/01h D W O BK DATA SYNC ERROR - DATA REWRITTEN
16h/02h D W O BK DATA SYNC ERROR - RECOMMEND REWRITE
16h/03h D W O BK DATA SYNC ERROR - DATA AUTO-REALLOCATED
16h/04h D W O BK DATA SYNC ERROR - RECOMMEND REASSIGNMENT
17h/00h DT WRO BK RECOVERED DATA WITH NO ERROR CORRECTION APPLIED
17h/01h DT WRO BK RECOVERED DATA WITH RETRIES
17h/02h DT WRO BK RECOVERED DATA WITH POSITIVE HEAD OFFSET
17h/03h DT WRO BK RECOVERED DATA WITH NEGATIVE HEAD OFFSET
17h/04h WRO B RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED
17h/05h D WRO BK RECOVERED DATA USING PREVIOUS SECTOR ID
17h/06h D W O BK RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED
17h/07h D WRO BK RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT
17h/08h D WRO BK RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE
17h/09h D WRO BK RECOVERED DATA WITHOUT ECC - DATA REWRITTEN
18h/00h DT WRO BK RECOVERED DATA WITH ERROR CORRECTION APPLIED
18h/01h D WRO BK RECOVERED DATA WITH ERROR CORR. & RETRIES APPLIED
18h/02h D WRO BK RECOVERED DATA - DATA AUTO-REALLOCATED
18h/03h R RECOVERED DATA WITH CIRC
18h/04h R RECOVERED DATA WITH L-EC
18h/05h D WRO BK RECOVERED DATA - RECOMMEND REASSIGNMENT
18h/06h D WRO BK RECOVERED DATA - RECOMMEND REWRITE
18h/07h D W O BK RECOVERED DATA WITH ECC - DATA REWRITTEN
18h/08h R RECOVERED DATA WITH LINKING
19h/00h D O K DEFECT LIST ERROR
19h/01h D O K DEFECT LIST NOT AVAILABLE
19h/02h D O K DEFECT LIST ERROR IN PRIMARY LIST
19h/03h D O K DEFECT LIST ERROR IN GROWN LIST
1Ah/00h DTLPWROMAEBKVF PARAMETER LIST LENGTH ERROR
1Bh/00h DTLPWROMAEBKVF SYNCHRONOUS DATA TRANSFER ERROR
1Ch/00h D O BK DEFECT LIST NOT FOUND
1Ch/01h D O BK PRIMARY DEFECT LIST NOT FOUND
1Ch/02h D O BK GROWN DEFECT LIST NOT FOUND
1Dh/00h DT WRO BK MISCOMPARE DURING VERIFY OPERATION
1Dh/01h D B MISCOMPARE VERIFY OF UNMAPPED LBA
1Eh/00h D W O BK RECOVERED ID WITH ECC CORRECTION
1Fh/00h D O K PARTIAL DEFECT LIST TRANSFER
20h/00h DTLPWROMAEBKVF INVALID COMMAND OPERATION CODE
20h/01h DT PWROMAEBK ACCESS DENIED - INITIATOR PENDING-ENROLLED
20h/02h DT PWROMAEBK ACCESS DENIED - NO ACCESS RIGHTS
20h/03h DT PWROMAEBK ACCESS DENIED - INVALID MGMT ID KEY
20h/04h T ILLEGAL COMMAND WHILE IN WRITE CAPABLE STATE
20h/05h T Obsolete
20h/06h T ILLEGAL COMMAND WHILE IN EXPLICIT ADDRESS MODE
20h/07h T ILLEGAL COMMAND WHILE IN IMPLICIT ADDRESS MODE
20h/08h DT PWROMAEBK ACCESS DENIED - ENROLLMENT CONFLICT
20h/09h DT PWROMAEBK ACCESS DENIED - INVALID LU IDENTIFIER
20h/0Ah DT PWROMAEBK ACCESS DENIED - INVALID PROXY TOKEN
20h/0Bh DT PWROMAEBK ACCESS DENIED - ACL LUN CONFLICT
20h/0Ch T ILLEGAL COMMAND WHEN NOT IN APPEND-ONLY MODE
21h/00h DT WRO BK LOGICAL BLOCK ADDRESS OUT OF RANGE
21h/01h DT WROM BK INVALID ELEMENT ADDRESS
21h/02h R INVALID ADDRESS FOR WRITE
21h/03h R INVALID WRITE CROSSING LAYER JUMP
22h/00h D ILLEGAL FUNCTION (USE 20 00, 24 00, OR 26 00)
23h/00h DT P B INVALID TOKEN OPERATION, CAUSE NOT REPORTABLE
23h/01h DT P B INVALID TOKEN OPERATION, UNSUPPORTED TOKEN TYPE
23h/02h DT P B INVALID TOKEN OPERATION, REMOTE TOKEN USAGE NOT SUPPORTED
23h/03h DT P B INVALID TOKEN OPERATION, REMOTE ROD TOKEN CREATION NOT SUPPORTED
23h/04h DT P B INVALID TOKEN OPERATION, TOKEN UNKNOWN
23h/05h DT P B INVALID TOKEN OPERATION, TOKEN CORRUPT
23h/06h DT P B INVALID TOKEN OPERATION, TOKEN REVOKED
23h/07h DT P B INVALID TOKEN OPERATION, TOKEN EXPIRED
23h/08h DT P B INVALID TOKEN OPERATION, TOKEN CANCELLED
23h/09h DT P B INVALID TOKEN OPERATION, TOKEN DELETED
23h/0Ah DT P B INVALID TOKEN OPERATION, INVALID TOKEN LENGTH
24h/00h DTLPWROMAEBKVF INVALID FIELD IN CDB
24h/01h DTLPWRO AEBKVF CDB DECRYPTION ERROR
24h/02h T Obsolete
24h/03h T Obsolete
24h/04h F SECURITY AUDIT VALUE FROZEN
24h/05h F SECURITY WORKING KEY FROZEN
24h/06h F NONCE NOT UNIQUE
24h/07h F NONCE TIMESTAMP OUT OF RANGE
24h/08h DT R MAEBKV INVALID XCDB
25h/00h DTLPWROMAEBKVF LOGICAL UNIT NOT SUPPORTED
26h/00h DTLPWROMAEBKVF INVALID FIELD IN PARAMETER LIST
26h/01h DTLPWROMAEBKVF PARAMETER NOT SUPPORTED
26h/02h DTLPWROMAEBKVF PARAMETER VALUE INVALID
26h/03h DTLPWROMAE K THRESHOLD PARAMETERS NOT SUPPORTED
26h/04h DTLPWROMAEBKVF INVALID RELEASE OF PERSISTENT RESERVATION
26h/05h DTLPWRO A BK DATA DECRYPTION ERROR
26h/06h DTLPWRO K TOO MANY TARGET DESCRIPTORS
26h/07h DTLPWRO K UNSUPPORTED TARGET DESCRIPTOR TYPE CODE
26h/08h DTLPWRO K TOO MANY SEGMENT DESCRIPTORS
26h/09h DTLPWRO K UNSUPPORTED SEGMENT DESCRIPTOR TYPE CODE
26h/0Ah DTLPWRO K UNEXPECTED INEXACT SEGMENT
26h/0Bh DTLPWRO K INLINE DATA LENGTH EXCEEDED
26h/0Ch DTLPWRO K INVALID OPERATION FOR COPY SOURCE OR DESTINATION
26h/0Dh DTLPWRO K COPY SEGMENT GRANULARITY VIOLATION
26h/0Eh DT PWROMAEBK INVALID PARAMETER WHILE PORT IS ENABLED
26h/0Fh F INVALID DATA-OUT BUFFER INTEGRITY CHECK VALUE
26h/10h T DATA DECRYPTION KEY FAIL LIMIT REACHED
26h/11h T INCOMPLETE KEY-ASSOCIATED DATA SET
26h/12h T VENDOR SPECIFIC KEY REFERENCE NOT FOUND
27h/00h DT WRO BK WRITE PROTECTED
27h/01h DT WRO BK HARDWARE WRITE PROTECTED
27h/02h DT WRO BK LOGICAL UNIT SOFTWARE WRITE PROTECTED
27h/03h T R ASSOCIATED WRITE PROTECT
27h/04h T R PERSISTENT WRITE PROTECT
27h/05h T R PERMANENT WRITE PROTECT
27h/06h R F CONDITIONAL WRITE PROTECT
27h/07h D B SPACE ALLOCATION FAILED WRITE PROTECT
28h/00h DTLPWROMAEBKVF NOT READY TO READY CHANGE, MEDIUM MAY HAVE CHANGED
28h/01h DT WROM B IMPORT OR EXPORT ELEMENT ACCESSED
28h/02h R FORMAT-LAYER MAY HAVE CHANGED
28h/03h M IMPORT/EXPORT ELEMENT ACCESSED, MEDIUM CHANGED
29h/00h DTLPWROMAEBKVF POWER ON, RESET, OR BUS DEVICE RESET OCCURRED
29h/01h DTLPWROMAEBKVF POWER ON OCCURRED
29h/02h DTLPWROMAEBKVF SCSI BUS RESET OCCURRED
29h/03h DTLPWROMAEBKVF BUS DEVICE RESET FUNCTION OCCURRED
29h/04h DTLPWROMAEBKVF DEVICE INTERNAL RESET
29h/05h DTLPWROMAEBKVF TRANSCEIVER MODE CHANGED TO SINGLE-ENDED
29h/06h DTLPWROMAEBKVF TRANSCEIVER MODE CHANGED TO LVD
29h/07h DTLPWROMAEBKVF I_T NEXUS LOSS OCCURRED
2Ah/00h DTL WROMAEBKVF PARAMETERS CHANGED
2Ah/01h DTL WROMAEBKVF MODE PARAMETERS CHANGED
2Ah/02h DTL WROMAE K LOG PARAMETERS CHANGED
2Ah/03h DTLPWROMAE K RESERVATIONS PREEMPTED
2Ah/04h DTLPWROMAE RESERVATIONS RELEASED
2Ah/05h DTLPWROMAE REGISTRATIONS PREEMPTED
2Ah/06h DTLPWROMAEBKVF ASYMMETRIC ACCESS STATE CHANGED
2Ah/07h DTLPWROMAEBKVF IMPLICIT ASYMMETRIC ACCESS STATE TRANSITION FAILED
2Ah/08h DT WROMAEBKVF PRIORITY CHANGED
2Ah/09h D CAPACITY DATA HAS CHANGED
2Ah/0Ah DT ERROR HISTORY I_T NEXUS CLEARED
2Ah/0Bh DT ERROR HISTORY SNAPSHOT RELEASED
2Ah/0Ch F ERROR RECOVERY ATTRIBUTES HAVE CHANGED
2Ah/0Dh T DATA ENCRYPTION CAPABILITIES CHANGED
2Ah/10h DT M E V TIMESTAMP CHANGED
2Ah/11h T DATA ENCRYPTION PARAMETERS CHANGED BY ANOTHER I_T NEXUS
2Ah/12h T DATA ENCRYPTION PARAMETERS CHANGED BY VENDOR SPECIFIC EVENT
2Ah/13h T DATA ENCRYPTION KEY INSTANCE COUNTER HAS CHANGED
2Ah/14h DT R MAEBKV SA CREATION CAPABILITIES DATA HAS CHANGED
2Ah/15h T M V MEDIUM REMOVAL PREVENTION PREEMPTED
2Bh/00h DTLPWRO K COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT
2Ch/00h DTLPWROMAEBKVF COMMAND SEQUENCE ERROR
2Ch/01h TOO MANY WINDOWS SPECIFIED
2Ch/02h INVALID COMBINATION OF WINDOWS SPECIFIED
2Ch/03h R CURRENT PROGRAM AREA IS NOT EMPTY
2Ch/04h R CURRENT PROGRAM AREA IS EMPTY
2Ch/05h B ILLEGAL POWER CONDITION REQUEST
2Ch/06h R PERSISTENT PREVENT CONFLICT
2Ch/07h DTLPWROMAEBKVF PREVIOUS BUSY STATUS
2Ch/08h DTLPWROMAEBKVF PREVIOUS TASK SET FULL STATUS
2Ch/09h DTLPWROM EBKVF PREVIOUS RESERVATION CONFLICT STATUS
2Ch/0Ah F PARTITION OR COLLECTION CONTAINS USER OBJECTS
2Ch/0Bh T NOT RESERVED
2Ch/0Ch D ORWRITE GENERATION DOES NOT MATCH
2Dh/00h T OVERWRITE ERROR ON UPDATE IN PLACE
2Eh/00h D WROM B INSUFFICIENT TIME FOR OPERATION
2Eh/01h D W OM B COMMAND TIMEOUT BEFORE PROCESSING
2Eh/02h D W OM B COMMAND TIMEOUT DURING PROCESSING
2Eh/03h D W OM B COMMAND TIMEOUT DURING PROCESSING DUE TO ERROR RECOVERY
2Fh/00h DTLPWROMAEBKVF COMMANDS CLEARED BY ANOTHER INITIATOR
2Fh/01h D COMMANDS CLEARED BY POWER LOSS NOTIFICATION
2Fh/02h DTLPWROMAEBKVF COMMANDS CLEARED BY DEVICE SERVER
2Fh/03h DTLPWROMAEBKVF SOME COMMANDS CLEARED BY QUEUING LAYER EVENT
30h/00h DT WROM BK INCOMPATIBLE MEDIUM INSTALLED
30h/01h DT WRO BK CANNOT READ MEDIUM - UNKNOWN FORMAT
30h/02h DT WRO BK CANNOT READ MEDIUM - INCOMPATIBLE FORMAT
30h/03h DT R M K CLEANING CARTRIDGE INSTALLED
30h/04h DT WRO BK CANNOT WRITE MEDIUM - UNKNOWN FORMAT
30h/05h DT WRO BK CANNOT WRITE MEDIUM - INCOMPATIBLE FORMAT
30h/06h DT WRO B CANNOT FORMAT MEDIUM - INCOMPATIBLE MEDIUM
30h/07h DTL WROMAEBKVF CLEANING FAILURE
30h/08h R CANNOT WRITE - APPLICATION CODE MISMATCH
30h/09h R CURRENT SESSION NOT FIXATED FOR APPEND
30h/0Ah DT WRO AEBK CLEANING REQUEST REJECTED
30h/0Ch T WORM MEDIUM - OVERWRITE ATTEMPTED
30h/0Dh T WORM MEDIUM - INTEGRITY CHECK
30h/10h R MEDIUM NOT FORMATTED
30h/11h M INCOMPATIBLE VOLUME TYPE
30h/12h M INCOMPATIBLE VOLUME QUALIFIER
30h/13h M CLEANING VOLUME EXPIRED
31h/00h DT WRO BK MEDIUM FORMAT CORRUPTED
31h/01h D L RO B FORMAT COMMAND FAILED
31h/02h R ZONED FORMATTING FAILED DUE TO SPARE LINKING
31h/03h D B SANITIZE COMMAND FAILED
32h/00h D W O BK NO DEFECT SPARE LOCATION AVAILABLE
32h/01h D W O BK DEFECT LIST UPDATE FAILURE
33h/00h T TAPE LENGTH ERROR
34h/00h DTLPWROMAEBKVF ENCLOSURE FAILURE
35h/00h DTLPWROMAEBKVF ENCLOSURE SERVICES FAILURE
35h/01h DTLPWROMAEBKVF UNSUPPORTED ENCLOSURE FUNCTION
35h/02h DTLPWROMAEBKVF ENCLOSURE SERVICES UNAVAILABLE
35h/03h DTLPWROMAEBKVF ENCLOSURE SERVICES TRANSFER FAILURE
35h/04h DTLPWROMAEBKVF ENCLOSURE SERVICES TRANSFER REFUSED
35h/05h DTL WROMAEBKVF ENCLOSURE SERVICES CHECKSUM ERROR
36h/00h L RIBBON, INK, OR TONER FAILURE
37h/00h DTL WROMAEBKVF ROUNDED PARAMETER
38h/00h B EVENT STATUS NOTIFICATION
38h/02h B ESN - POWER MANAGEMENT CLASS EVENT
38h/04h B ESN - MEDIA CLASS EVENT
38h/06h B ESN - DEVICE BUSY CLASS EVENT
38h/07h D THIN PROVISIONING SOFT THRESHOLD REACHED
39h/00h DTL WROMAE K SAVING PARAMETERS NOT SUPPORTED
3Ah/00h DTL WROM BK MEDIUM NOT PRESENT
3Ah/01h DT WROM BK MEDIUM NOT PRESENT - TRAY CLOSED
3Ah/02h DT WROM BK MEDIUM NOT PRESENT - TRAY OPEN
3Ah/03h DT WROM B MEDIUM NOT PRESENT - LOADABLE
3Ah/04h DT WRO B MEDIUM NOT PRESENT - MEDIUM AUXILIARY MEMORY ACCESSIBLE
3Bh/00h TL SEQUENTIAL POSITIONING ERROR
3Bh/01h T TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM
3Bh/02h T TAPE POSITION ERROR AT END-OF-MEDIUM
3Bh/03h L TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY
3Bh/04h L SLEW FAILURE
3Bh/05h L PAPER JAM
3Bh/06h L FAILED TO SENSE TOP-OF-FORM
3Bh/07h L FAILED TO SENSE BOTTOM-OF-FORM
3Bh/08h T REPOSITION ERROR
3Bh/09h READ PAST END OF MEDIUM
3Bh/0Ah READ PAST BEGINNING OF MEDIUM
3Bh/0Bh POSITION PAST END OF MEDIUM
3Bh/0Ch T POSITION PAST BEGINNING OF MEDIUM
3Bh/0Dh DT WROM BK MEDIUM DESTINATION ELEMENT FULL
3Bh/0Eh DT WROM BK MEDIUM SOURCE ELEMENT EMPTY
3Bh/0Fh R END OF MEDIUM REACHED
3Bh/11h DT WROM BK MEDIUM MAGAZINE NOT ACCESSIBLE
3Bh/12h DT WROM BK MEDIUM MAGAZINE REMOVED
3Bh/13h DT WROM BK MEDIUM MAGAZINE INSERTED
3Bh/14h DT WROM BK MEDIUM MAGAZINE LOCKED
3Bh/15h DT WROM BK MEDIUM MAGAZINE UNLOCKED
3Bh/16h R MECHANICAL POSITIONING OR CHANGER ERROR
3Bh/17h F READ PAST END OF USER OBJECT
3Bh/18h M ELEMENT DISABLED
3Bh/19h M ELEMENT ENABLED
3Bh/1Ah M DATA TRANSFER DEVICE REMOVED
3Bh/1Bh M DATA TRANSFER DEVICE INSERTED
3Bh/1Ch T TOO MANY LOGICAL OBJECTS ON PARTITION TO SUPPORT OPERATION
3Ch/00h
3Dh/00h DTLPWROMAE K INVALID BITS IN IDENTIFY MESSAGE
3Eh/00h DTLPWROMAEBKVF LOGICAL UNIT HAS NOT SELF-CONFIGURED YET
3Eh/01h DTLPWROMAEBKVF LOGICAL UNIT FAILURE
3Eh/02h DTLPWROMAEBKVF TIMEOUT ON LOGICAL UNIT
3Eh/03h DTLPWROMAEBKVF LOGICAL UNIT FAILED SELF-TEST
3Eh/04h DTLPWROMAEBKVF LOGICAL UNIT UNABLE TO UPDATE SELF-TEST LOG
3Fh/00h DTLPWROMAEBKVF TARGET OPERATING CONDITIONS HAVE CHANGED
3Fh/01h DTLPWROMAEBKVF MICROCODE HAS BEEN CHANGED
3Fh/02h DTLPWROM BK CHANGED OPERATING DEFINITION
3Fh/03h DTLPWROMAEBKVF INQUIRY DATA HAS CHANGED
3Fh/04h DT WROMAEBK COMPONENT DEVICE ATTACHED
3Fh/05h DT WROMAEBK DEVICE IDENTIFIER CHANGED
3Fh/06h DT WROMAEB REDUNDANCY GROUP CREATED OR MODIFIED
3Fh/07h DT WROMAEB REDUNDANCY GROUP DELETED
3Fh/08h DT WROMAEB SPARE CREATED OR MODIFIED
3Fh/09h DT WROMAEB SPARE DELETED
3Fh/0Ah DT WROMAEBK VOLUME SET CREATED OR MODIFIED
3Fh/0Bh DT WROMAEBK VOLUME SET DELETED
3Fh/0Ch DT WROMAEBK VOLUME SET DEASSIGNED
3Fh/0Dh DT WROMAEBK VOLUME SET REASSIGNED
3Fh/0Eh DTLPWROMAE REPORTED LUNS DATA HAS CHANGED
3Fh/0Fh DTLPWROMAEBKVF ECHO BUFFER OVERWRITTEN
3Fh/10h DT WROM B MEDIUM LOADABLE
3Fh/11h DT WROM B MEDIUM AUXILIARY MEMORY ACCESSIBLE
3Fh/12h DTLPWR MAEBK F iSCSI IP ADDRESS ADDED
3Fh/13h DTLPWR MAEBK F iSCSI IP ADDRESS REMOVED
3Fh/14h DTLPWR MAEBK F iSCSI IP ADDRESS CHANGED
3Fh/15h DTLPWR MAEBK INSPECT REFERRALS SENSE DESCRIPTORS
40h/00h D RAM FAILURE (SHOULD USE 40 NN)
40h/NNh DTLPWROMAEBKVF DIAGNOSTIC FAILURE ON COMPONENT NN (80h-FFh)
41h/00h D DATA PATH FAILURE (SHOULD USE 40 NN)
42h/00h D POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN)
43h/00h DTLPWROMAEBKVF MESSAGE ERROR
44h/00h DTLPWROMAEBKVF INTERNAL TARGET FAILURE
44h/01h DT P MAEBKVF PERSISTENT RESERVATION INFORMATION LOST
44h/71h DT B ATA DEVICE FAILED SET FEATURES
45h/00h DTLPWROMAEBKVF SELECT OR RESELECT FAILURE
46h/00h DTLPWROM BK UNSUCCESSFUL SOFT RESET
47h/00h DTLPWROMAEBKVF SCSI PARITY ERROR
47h/01h DTLPWROMAEBKVF DATA PHASE CRC ERROR DETECTED
47h/02h DTLPWROMAEBKVF SCSI PARITY ERROR DETECTED DURING ST DATA PHASE
47h/03h DTLPWROMAEBKVF INFORMATION UNIT iuCRC ERROR DETECTED
47h/04h DTLPWROMAEBKVF ASYNCHRONOUS INFORMATION PROTECTION ERROR DETECTED
47h/05h DTLPWROMAEBKVF PROTOCOL SERVICE CRC ERROR
47h/06h DT MAEBKVF PHY TEST FUNCTION IN PROGRESS
47h/7Fh DT PWROMAEBK SOME COMMANDS CLEARED BY ISCSI PROTOCOL EVENT
48h/00h DTLPWROMAEBKVF INITIATOR DETECTED ERROR MESSAGE RECEIVED
49h/00h DTLPWROMAEBKVF INVALID MESSAGE ERROR
4Ah/00h DTLPWROMAEBKVF COMMAND PHASE ERROR
4Bh/00h DTLPWROMAEBKVF DATA PHASE ERROR
4Bh/01h DT PWROMAEBK INVALID TARGET PORT TRANSFER TAG RECEIVED
4Bh/02h DT PWROMAEBK TOO MUCH WRITE DATA
4Bh/03h DT PWROMAEBK ACK/NAK TIMEOUT
4Bh/04h DT PWROMAEBK NAK RECEIVED
4Bh/05h DT PWROMAEBK DATA OFFSET ERROR
4Bh/06h DT PWROMAEBK INITIATOR RESPONSE TIMEOUT
4Bh/07h DT PWROMAEBK F CONNECTION LOST
4Bh/08h DT PWROMAEBK F DATA-IN BUFFER OVERFLOW - DATA BUFFER SIZE
4Bh/09h DT PWROMAEBK F DATA-IN BUFFER OVERFLOW - DATA BUFFER DESCRIPTOR AREA
4Bh/0Ah DT PWROMAEBK F DATA-IN BUFFER ERROR
4Bh/0Bh DT PWROMAEBK F DATA-OUT BUFFER OVERFLOW - DATA BUFFER SIZE
4Bh/0Ch DT PWROMAEBK F DATA-OUT BUFFER OVERFLOW - DATA BUFFER DESCRIPTOR AREA
4Bh/0Dh DT PWROMAEBK F DATA-OUT BUFFER ERROR
4Bh/0Eh DT PWROMAEBK F PCIE FABRIC ERROR
4Bh/0Fh DT PWROMAEBK F PCIE COMPLETION TIMEOUT
4Bh/10h DT PWROMAEBK F PCIE COMPLETER ABORT
4Bh/11h DT PWROMAEBK F PCIE POISONED TLP RECEIVED
4Bh/12h DT PWROMAEBK F PCIE ECRC CHECK FAILED
4Bh/13h DT PWROMAEBK F PCIE UNSUPPORTED REQUEST
4Bh/14h DT PWROMAEBK F PCIE ACS VIOLATION
4Bh/15h DT PWROMAEBK F PCIE TLP PREFIX BLOCKED
4Ch/00h DTLPWROMAEBKVF LOGICAL UNIT FAILED SELF-CONFIGURATION
4Dh/NNh DTLPWROMAEBKVF TAGGED OVERLAPPED COMMANDS (NN = TASK TAG)
4Eh/00h DTLPWROMAEBKVF OVERLAPPED COMMANDS ATTEMPTED
4Fh/00h
50h/00h T WRITE APPEND ERROR
50h/01h T WRITE APPEND POSITION ERROR
50h/02h T POSITION ERROR RELATED TO TIMING
51h/00h T RO ERASE FAILURE
51h/01h R ERASE FAILURE - INCOMPLETE ERASE OPERATION DETECTED
52h/00h T CARTRIDGE FAULT
53h/00h DTL WROM BK MEDIA LOAD OR EJECT FAILED
53h/01h T UNLOAD TAPE FAILURE
53h/02h DT WROM BK MEDIUM REMOVAL PREVENTED
53h/03h M MEDIUM REMOVAL PREVENTED BY DATA TRANSFER ELEMENT
53h/04h T MEDIUM THREAD OR UNTHREAD FAILURE
53h/05h M VOLUME IDENTIFIER INVALID
53h/06h M VOLUME IDENTIFIER MISSING
53h/07h M DUPLICATE VOLUME IDENTIFIER
53h/08h M ELEMENT STATUS UNKNOWN
54h/00h P SCSI TO HOST SYSTEM INTERFACE FAILURE
55h/00h P SYSTEM RESOURCE FAILURE
55h/01h D O BK SYSTEM BUFFER FULL
55h/02h DTLPWROMAE K INSUFFICIENT RESERVATION RESOURCES
55h/03h DTLPWROMAE K INSUFFICIENT RESOURCES
55h/04h DTLPWROMAE K INSUFFICIENT REGISTRATION RESOURCES
55h/05h DT PWROMAEBK INSUFFICIENT ACCESS CONTROL RESOURCES
55h/06h DT WROM B AUXILIARY MEMORY OUT OF SPACE
55h/07h F QUOTA ERROR
55h/08h T MAXIMUM NUMBER OF SUPPLEMENTAL DECRYPTION KEYS EXCEEDED
55h/09h M MEDIUM AUXILIARY MEMORY NOT ACCESSIBLE
55h/0Ah M DATA CURRENTLY UNAVAILABLE
55h/0Bh DTLPWROMAEBKVF INSUFFICIENT POWER FOR OPERATION
55h/0Ch DT P B INSUFFICIENT RESOURCES TO CREATE ROD
55h/0Dh DT P B INSUFFICIENT RESOURCES TO CREATE ROD TOKEN
56h/00h
57h/00h R UNABLE TO RECOVER TABLE-OF-CONTENTS
58h/00h O GENERATION DOES NOT EXIST
59h/00h O UPDATED BLOCK READ
5Ah/00h DTLPWRO BK OPERATOR REQUEST OR STATE CHANGE INPUT
5Ah/01h DT WROM BK OPERATOR MEDIUM REMOVAL REQUEST
5Ah/02h DT WRO A BK OPERATOR SELECTED WRITE PROTECT
5Ah/03h DT WRO A BK OPERATOR SELECTED WRITE PERMIT
5Bh/00h DTLPWROM K LOG EXCEPTION
5Bh/01h DTLPWROM K THRESHOLD CONDITION MET
5Bh/02h DTLPWROM K LOG COUNTER AT MAXIMUM
5Bh/03h DTLPWROM K LOG LIST CODES EXHAUSTED
5Ch/00h D O RPL STATUS CHANGE
5Ch/01h D O SPINDLES SYNCHRONIZED
5Ch/02h D O SPINDLES NOT SYNCHRONIZED
5Dh/00h DTLPWROMAEBKVF FAILURE PREDICTION THRESHOLD EXCEEDED
5Dh/01h R B MEDIA FAILURE PREDICTION THRESHOLD EXCEEDED
5Dh/02h R LOGICAL UNIT FAILURE PREDICTION THRESHOLD EXCEEDED
5Dh/03h R SPARE AREA EXHAUSTION PREDICTION THRESHOLD EXCEEDED
5Dh/10h D B HARDWARE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/11h D B HARDWARE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/12h D B HARDWARE IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/13h D B HARDWARE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/14h D B HARDWARE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/15h D B HARDWARE IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/16h D B HARDWARE IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/17h D B HARDWARE IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/18h D B HARDWARE IMPENDING FAILURE CONTROLLER DETECTED
5Dh/19h D B HARDWARE IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/1Ah D B HARDWARE IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/1Bh D B HARDWARE IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/1Ch D B HARDWARE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/20h D B CONTROLLER IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/21h D B CONTROLLER IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/22h D B CONTROLLER IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/23h D B CONTROLLER IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/24h D B CONTROLLER IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/25h D B CONTROLLER IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/26h D B CONTROLLER IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/27h D B CONTROLLER IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/28h D B CONTROLLER IMPENDING FAILURE CONTROLLER DETECTED
5Dh/29h D B CONTROLLER IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/2Ah D B CONTROLLER IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/2Bh D B CONTROLLER IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/2Ch D B CONTROLLER IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/30h D B DATA CHANNEL IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/31h D B DATA CHANNEL IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/32h D B DATA CHANNEL IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/33h D B DATA CHANNEL IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/34h D B DATA CHANNEL IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/35h D B DATA CHANNEL IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/36h D B DATA CHANNEL IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/37h D B DATA CHANNEL IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/38h D B DATA CHANNEL IMPENDING FAILURE CONTROLLER DETECTED
5Dh/39h D B DATA CHANNEL IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/3Ah D B DATA CHANNEL IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/3Bh D B DATA CHANNEL IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/3Ch D B DATA CHANNEL IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/40h D B SERVO IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/41h D B SERVO IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/42h D B SERVO IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/43h D B SERVO IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/44h D B SERVO IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/45h D B SERVO IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/46h D B SERVO IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/47h D B SERVO IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/48h D B SERVO IMPENDING FAILURE CONTROLLER DETECTED
5Dh/49h D B SERVO IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/4Ah D B SERVO IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/4Bh D B SERVO IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/4Ch D B SERVO IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/50h D B SPINDLE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/51h D B SPINDLE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/52h D B SPINDLE IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/53h D B SPINDLE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/54h D B SPINDLE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/55h D B SPINDLE IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/56h D B SPINDLE IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/57h D B SPINDLE IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/58h D B SPINDLE IMPENDING FAILURE CONTROLLER DETECTED
5Dh/59h D B SPINDLE IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/5Ah D B SPINDLE IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/5Bh D B SPINDLE IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/5Ch D B SPINDLE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/60h D B FIRMWARE IMPENDING FAILURE GENERAL HARD DRIVE FAILURE
5Dh/61h D B FIRMWARE IMPENDING FAILURE DRIVE ERROR RATE TOO HIGH
5Dh/62h D B FIRMWARE IMPENDING FAILURE DATA ERROR RATE TOO HIGH
5Dh/63h D B FIRMWARE IMPENDING FAILURE SEEK ERROR RATE TOO HIGH
5Dh/64h D B FIRMWARE IMPENDING FAILURE TOO MANY BLOCK REASSIGNS
5Dh/65h D B FIRMWARE IMPENDING FAILURE ACCESS TIMES TOO HIGH
5Dh/66h D B FIRMWARE IMPENDING FAILURE START UNIT TIMES TOO HIGH
5Dh/67h D B FIRMWARE IMPENDING FAILURE CHANNEL PARAMETRICS
5Dh/68h D B FIRMWARE IMPENDING FAILURE CONTROLLER DETECTED
5Dh/69h D B FIRMWARE IMPENDING FAILURE THROUGHPUT PERFORMANCE
5Dh/6Ah D B FIRMWARE IMPENDING FAILURE SEEK TIME PERFORMANCE
5Dh/6Bh D B FIRMWARE IMPENDING FAILURE SPIN-UP RETRY COUNT
5Dh/6Ch D B FIRMWARE IMPENDING FAILURE DRIVE CALIBRATION RETRY COUNT
5Dh/FFh DTLPWROMAEBKVF FAILURE PREDICTION THRESHOLD EXCEEDED (FALSE)
5Eh/00h DTLPWRO A K LOW POWER CONDITION ON
5Eh/01h DTLPWRO A K IDLE CONDITION ACTIVATED BY TIMER
5Eh/02h DTLPWRO A K STANDBY CONDITION ACTIVATED BY TIMER
5Eh/03h DTLPWRO A K IDLE CONDITION ACTIVATED BY COMMAND
5Eh/04h DTLPWRO A K STANDBY CONDITION ACTIVATED BY COMMAND
5Eh/05h DTLPWRO A K IDLE_B CONDITION ACTIVATED BY TIMER
5Eh/06h DTLPWRO A K IDLE_B CONDITION ACTIVATED BY COMMAND
5Eh/07h DTLPWRO A K IDLE_C CONDITION ACTIVATED BY TIMER
5Eh/08h DTLPWRO A K IDLE_C CONDITION ACTIVATED BY COMMAND
5Eh/09h DTLPWRO A K STANDBY_Y CONDITION ACTIVATED BY TIMER
5Eh/0Ah DTLPWRO A K STANDBY_Y CONDITION ACTIVATED BY COMMAND
5Eh/41h B POWER STATE CHANGE TO ACTIVE
5Eh/42h B POWER STATE CHANGE TO IDLE
5Eh/43h B POWER STATE CHANGE TO STANDBY
5Eh/45h B POWER STATE CHANGE TO SLEEP
5Eh/47h BK POWER STATE CHANGE TO DEVICE CONTROL
5Fh/00h
60h/00h LAMP FAILURE
61h/00h VIDEO ACQUISITION ERROR
61h/01h UNABLE TO ACQUIRE VIDEO
61h/02h OUT OF FOCUS
62h/00h SCAN HEAD POSITIONING ERROR
63h/00h R END OF USER AREA ENCOUNTERED ON THIS TRACK
63h/01h R PACKET DOES NOT FIT IN AVAILABLE SPACE
64h/00h R ILLEGAL MODE FOR THIS TRACK
64h/01h R INVALID PACKET SIZE
65h/00h DTLPWROMAEBKVF VOLTAGE FAULT
66h/00h AUTOMATIC DOCUMENT FEEDER COVER UP
66h/01h AUTOMATIC DOCUMENT FEEDER LIFT UP
66h/02h DOCUMENT JAM IN AUTOMATIC DOCUMENT FEEDER
66h/03h DOCUMENT MISS FEED AUTOMATIC IN DOCUMENT FEEDER
67h/00h A CONFIGURATION FAILURE
67h/01h A CONFIGURATION OF INCAPABLE LOGICAL UNITS FAILED
67h/02h A ADD LOGICAL UNIT FAILED
67h/03h A MODIFICATION OF LOGICAL UNIT FAILED
67h/04h A EXCHANGE OF LOGICAL UNIT FAILED
67h/05h A REMOVE OF LOGICAL UNIT FAILED
67h/06h A ATTACHMENT OF LOGICAL UNIT FAILED
67h/07h A CREATION OF LOGICAL UNIT FAILED
67h/08h A ASSIGN FAILURE OCCURRED
67h/09h A MULTIPLY ASSIGNED LOGICAL UNIT
67h/0Ah DTLPWROMAEBKVF SET TARGET PORT GROUPS COMMAND FAILED
67h/0Bh DT B ATA DEVICE FEATURE NOT ENABLED
68h/00h A LOGICAL UNIT NOT CONFIGURED
68h/01h D SUBSIDIARY LOGICAL UNIT NOT CONFIGURED
69h/00h A DATA LOSS ON LOGICAL UNIT
69h/01h A MULTIPLE LOGICAL UNIT FAILURES
69h/02h A PARITY/DATA MISMATCH
6Ah/00h A INFORMATIONAL, REFER TO LOG
6Bh/00h A STATE CHANGE HAS OCCURRED
6Bh/01h A REDUNDANCY LEVEL GOT BETTER
6Bh/02h A REDUNDANCY LEVEL GOT WORSE
6Ch/00h A REBUILD FAILURE OCCURRED
6Dh/00h A RECALCULATE FAILURE OCCURRED
6Eh/00h A COMMAND TO LOGICAL UNIT FAILED
6Fh/00h R COPY PROTECTION KEY EXCHANGE FAILURE - AUTHENTICATION FAILURE
6Fh/01h R COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT PRESENT
6Fh/02h R COPY PROTECTION KEY EXCHANGE FAILURE - KEY NOT ESTABLISHED
6Fh/03h R READ OF SCRAMBLED SECTOR WITHOUT AUTHENTICATION
6Fh/04h R MEDIA REGION CODE IS MISMATCHED TO LOGICAL UNIT REGION
6Fh/05h R DRIVE REGION MUST BE PERMANENT/REGION RESET COUNT ERROR
6Fh/06h R INSUFFICIENT BLOCK COUNT FOR BINDING NONCE RECORDING
6Fh/07h R CONFLICT IN BINDING NONCE RECORDING
70h/NNh T DECOMPRESSION EXCEPTION SHORT ALGORITHM ID OF NN
71h/00h T DECOMPRESSION EXCEPTION LONG ALGORITHM ID
72h/00h R SESSION FIXATION ERROR
72h/01h R SESSION FIXATION ERROR WRITING LEAD-IN
72h/02h R SESSION FIXATION ERROR WRITING LEAD-OUT
72h/03h R SESSION FIXATION ERROR - INCOMPLETE TRACK IN SESSION
72h/04h R EMPTY OR PARTIALLY WRITTEN RESERVED TRACK
72h/05h R NO MORE TRACK RESERVATIONS ALLOWED
72h/06h R RMZ EXTENSION IS NOT ALLOWED
72h/07h R NO MORE TEST ZONE EXTENSIONS ARE ALLOWED
73h/00h R CD CONTROL ERROR
73h/01h R POWER CALIBRATION AREA ALMOST FULL
73h/02h R POWER CALIBRATION AREA IS FULL
73h/03h R POWER CALIBRATION AREA ERROR
73h/04h R PROGRAM MEMORY AREA UPDATE FAILURE
73h/05h R PROGRAM MEMORY AREA IS FULL
73h/06h R RMA/PMA IS ALMOST FULL
73h/10h R CURRENT POWER CALIBRATION AREA ALMOST FULL
73h/11h R CURRENT POWER CALIBRATION AREA IS FULL
73h/17h R RDZ IS FULL
74h/00h T SECURITY ERROR
74h/01h T UNABLE TO DECRYPT DATA
74h/02h T UNENCRYPTED DATA ENCOUNTERED WHILE DECRYPTING
74h/03h T INCORRECT DATA ENCRYPTION KEY
74h/04h T CRYPTOGRAPHIC INTEGRITY VALIDATION FAILED
74h/05h T ERROR DECRYPTING DATA
74h/06h T UNKNOWN SIGNATURE VERIFICATION KEY
74h/07h T ENCRYPTION PARAMETERS NOT USEABLE
74h/08h DT R M E VF DIGITAL SIGNATURE VALIDATION FAILURE
74h/09h T ENCRYPTION MODE MISMATCH ON READ
74h/0Ah T ENCRYPTED BLOCK NOT RAW READ ENABLED
74h/0Bh T INCORRECT ENCRYPTION PARAMETERS
74h/0Ch DT R MAEBKV UNABLE TO DECRYPT PARAMETER LIST
74h/0Dh T ENCRYPTION ALGORITHM DISABLED
74h/10h DT R MAEBKV SA CREATION PARAMETER VALUE INVALID
74h/11h DT R MAEBKV SA CREATION PARAMETER VALUE REJECTED
74h/12h DT R MAEBKV INVALID SA USAGE
74h/21h T DATA ENCRYPTION CONFIGURATION PREVENTED
74h/30h DT R MAEBKV SA CREATION PARAMETER NOT SUPPORTED
74h/40h DT R MAEBKV AUTHENTICATION FAILED
74h/61h V EXTERNAL DATA ENCRYPTION KEY MANAGER ACCESS ERROR
74h/62h V EXTERNAL DATA ENCRYPTION KEY MANAGER ERROR
74h/63h V EXTERNAL DATA ENCRYPTION KEY NOT FOUND
74h/64h V EXTERNAL DATA ENCRYPTION REQUEST NOT AUTHORIZED
74h/6Eh T EXTERNAL DATA ENCRYPTION CONTROL TIMEOUT
74h/6Fh T EXTERNAL DATA ENCRYPTION CONTROL ERROR
74h/71h DT R M E V LOGICAL UNIT ACCESS NOT AUTHORIZED
74h/79h D SECURITY CONFLICT IN TRANSLATED DEVICE
75h/00h
76h/00h
77h/00h
78h/00h
79h/00h
7Ah/00h
7Bh/00h
7Ch/00h
7Dh/00h
7Eh/00h
7Fh/00h
-175
View File
@@ -1,175 +0,0 @@
# SDHCI MMC Driver
This driver project is a part of GSoC'18 and is aimed at providing support for
PCI devices with class 8 and subclass 5 over x86 architecture. This document
will make you familiar with the [code produced during GSoC](https://review.haiku-os.org/#/c/haiku/+/318/),
loading and testing the driver(including hardware emulation), insight into the
code and future tasks.
For detailed explanations about the project, you can refer the
[weekly reports](https://www.haiku-os.org/blog/krish_iyer) and comment issues
if any. For this project we have referred [SD Host Controller Spec Version 1.00](https://www.sdcard.org/downloads/pls/pdf/index.php?p=PartA2_SD_Host_Controller_Simplified_Specification_Ver1.00.jpg&f=PartA2_SD_Host_Controller_Simplified_Specification_Ver1.00.pdf&e=EN_A2100)
and [Physical Layer Spec Version 1.10](https://www.sdcard.org/downloads/pls/pdf/index.php?p=Part1_Physical_Layer_Simplified_Specification_Ver1.10.jpg&f=Part1_Physical_Layer_Simplified_Specification_Ver1.10.pdf&e=EN_P1110).
## Loading and testing the driver
### Emulating the hardware
We will emulate a SDHC device using qemu as all system may not have the device.
These days systems provide transfer to SD/ MMC card over USB. The document will
not instruct you on how to build haiku but you can refer the link to
[compile and build the haiku images](https://www.haiku-os.org/guides/building/)
or the [week #1 and #2](https://www.haiku-os.org/blog/krish_iyer/2018-05-06_gsoc_2018_sdhci_mmc_driver_week_1_and_2/)
project report will also work.
After building the image, we will emulate the hardware and host haiku on top of that.
#### Emulation
For emulating a sdhci-pci device
qemu-img create sd-card.img 10G
qemu-system-x86_64 ~/haiku/generated.x86_64/haiku.image -hdd haiku_drive_2.img -device sdhci-pci -device sd-card,drive=mydrive -drive if=sd,index=0,file=sd.img,format=raw,id=mydrive -m 512M -enable-kvm
### Testing and loading the driver
The code is merged but not part of the default build
because it's not useful for end users currently. In order to add the drivers
to the image and load them, we need to adjust some buildfiles.
The required changes are in [this changeset](https://review.haiku-os.org/c/haiku/+/448/8).
## Insight into the code and future tasks
### Directory and files where all the code related to the project resides
#### MMC Bus
* src/add-ons/kernel/busses/mmc
* sdhci-pci.cpp
* sdhci-pci.h
* Jamfile
#### The Bus Manager
* src/add-ons/kernel/bus_managers/mmc
* mmc_bus.cpp
* mmc_module.cpp
* mmc_bus.h
* Jamfile
#### Disk Driver
* src/add-ons/kernel/drivers/disk/mmc
* mmc_disk.cpp
* mmc_disk.h
* Jamfile
#### Hardcoding the driver
* src/system/kernel/device_manager
* device_manager.cpp
### Insight into the code
#### MMC Bus management overview
The device tree for MMC support looks like this:
* PCI bus manager
* (other PCI devices)
* SDHCI controller
* SDHCI bus
* MMC bus manager
* MMC device
* mmc\_disk device
* MMC device
* (other SDIO driver)
* MMC bus manager (second MMC bus)
* MMC device
* mmc\_disk device
At the first level, the PCI bus manager publishes a device node for each device
found. One of them is our SDHCI controller, identified either by the PCI device
class and subclass, or for not completely SDHCI compatible device, by the
device and vendor IDs.
The SDHCI bus driver attaches to this device and publishes his own node. It
then scans the device and publishes an MMC bus node for each slot (there may
be multiple SD slots attached to a single PCI controller).
The MMC bus manager then attach to each of these slots, and send the appropriate
commands for enumerating the SD cards (there may be multiple cards in a "slot"),
and publishes a device node for each of them. Finally, the mmc\_disk driver can
bind itself to one of these device nodes, and publish the corresponding disk
node, which is also be made available in /dev/disk/mmc.
Currently the mmc bus does not publish anything in the devfs, but this could be
added if sending raw SD/MMC commands to SD cards from userland is considered
desirable.
#### SDHCI driver
The SDHCI driver is the lowest level of the MMC stack. It provides abstraction
of the SDHCI device. Later on, different way to access an SD bus may be added,
for example for ARM devices which decided to use a different register interface.
The entry point is as usual **supports\_device()**. This method is called only
for devices which may be SDHCI controllers, thanks to filtering done in the
device manager to probe only the relevant devices. The probing is done on-demand,
currently when the system is enumerating /dev/disk in the devfs. Later on, when
we have SDIO support, probing will also be triggered in other cases.
The function identifies the device by checking the class and subclass, as well
as a limited set of hardcoded PCI device and vendor IDs for devices that do not
use the assigned subclass.
Once a compatible device is found, **register\_child\_devices()** is used to
publish device nodes for each slot to be controlled by the mmc bus manager.
The registers for each device are mapped into virtual memory, using the
information from the PCI bar registers. **struct registers** is defined so that
it matches the register layout, and provide a little abstraction to raw register
access.
An SdhciBus object is created to manage each of these busses at the SDHCI level.
It will be responsible for executing SD commands on that bus, and dealing with
the resulting interrupts.
#### The Bus Manager
The MMC bus manager manages the MMC bus (duh). Its tasks are:
* enumerating SD cards on the bus
* assigning RCAs to the cards for identifying them when sending commands
* setting the bus clock speed according to what the cards can handle
* remember which SD card is currently active (CMD7)
* manage cards state
* publish device nodes for each card
#### Disk Driver
The disk driver is attached to devices implementing SDSC or SDHC/SDXC commands.
There will be other drivers for non-storage (SDIO) cards.
To help with this, the MMC bus manager provides the device with the information
it gathered while initializing the device. According to the commands recognized
by the card during the initialization sequence, it's possible to know if it's
SDSC, SDHC/SDXC, or something else (SDIO, legacy MMC, etc).
The disk driver publishes devfs entries in /dev/disk/mmc and implements the
usual interface for disk devices. From this point on, the device can be used
just like any other mass storage device.
#### Getting everything loaded
The device manager is not completely implemented yet. As a result, some
decisions about which drivers to load are hardcoded in device\_manager.cpp.
It has been adjusted to handover SDHCI devices to the MMC bus. Whenever a
"disk" device is requested, the MMC busses are searched, which results in
loading the SDHCI driver and probing for SD cards. When we get support for
other types of SDIO devices, we will need to adjust the device manager to
probe the SDHCI bus when these type of devices are requested, too.
### Tasks to be completed
The SDHCI driver is able to send and receive commands. However it does not
handle card insertion and removal interrupts yet, so the card must be already
inserted when the driver is loaded.
As a proof of concept, the initialization sequence has been implemented up
until assigning an RCA to a single card (SDHC only).
Once we get everything in place at the mmc bus level, we can proceed as
documented in the GSoC project [third phase outline](https://www.haiku-os.org/blog/krish_iyer/2018-07-12_gsoc_2018_sdhci_mmc_driver_third_phase_plan/).
If you find it difficult to understand the driver development and it's
functioning and role, please refer *docs/develop/kernel/device_manager_introduction.html*