Method of scheduling interrupts to the linked lists of transfer descriptors scheduled at intervals on a serial bus5832492Abstract A computer system including a serial bus host controller and host controller driver. The host controller driver providing data structures for the host controller to operate on. The data structures having a linking mechanism for processing lists of descriptors, and alternate buffer configurations for receiving data from the serial bus devices. Claims I claim: Description SPECIFICATION
TABLE 1
______________________________________
Endpoint Descriptor Fields
Name Description
______________________________________
Function This is the USB address of the function containing the
endpoint that this Endpoint Descriptor controls
EP This is the USB address of the endpoint within the
function
D This two bit field indicates the direction of data flow
(IN or OUT.) If neither IN nor OUT is specified, then
the direction is determined from the PID field of the
Transfer Descriptor. the encoding of the bits of this
field are:
______________________________________
Code Direction
______________________________________
00b From TD
01b OUT
10b IN
11b From TD
______________________________________
S Indicates the speed of the endpoint: full-speed (S = 0)
or low-speed (S = 1.)
C SW set this bit to cause the host controller to cancel
the next TD on the TD list.
F This bit indicates the format of the Transfer
Descriptors linked to this Endpoint Descriptor. If this
is a control, bulk or interrupt endpoint then F = 0
indicating that the general TD format is used. If this
is an isochronous endpoint, then F = 1 indicating that
the isochronous TD format is used.
MaxP This field indicates the maximum number of bytes that
can be sent to or received from the endpoint in a single
packet. This is also the `stride` of the buffer pointer
for bulk, control and interrupt endpoints.
TP If the upper 28 bits of TP and NextTD are the same, then
the list contains no TD that the host controller can
process. If TP and NextTD are different, then he list
contains a TD to be processed.
NextTD Points to the next TD to be processed for this endpoint.
If the LSB of this entry is not 0, then the TD is not
processes even if TP and NextTD are different.
NextED If non zero, then this entry points to the next ED on
the list.
______________________________________
The endpoint descriptors 302 are linked in lists that are processed by the host controller 130. An endpoint descriptor 302a is linked to a next endpoint descriptor 302b when the NextED field 406 is non-zero. If the NextED field 406 is non-zero, then the field is interpreted as the address pointer to the next endpoint descriptor 302b. If the field is zero, or NULL, then this endpoint is interpreted as the last endpoint on the list. Thus, the host controller 130 can process an entire endpoint list 300 once the first endpoint descriptor 302a is known. A new endpoint may be linked to the endpoint list 300 at any point in the list. Linking a new endpoint descriptor to the endpoint list is accomplished by placing the NextED pointer 406 of an existing ED 302 into the NextED field 406 of the new ED and writing the memory address of the new ED into the NextED field 406 of the existing ED 302. Removing or unlinking an endpoint from the list is accomplished by placing the NextED pointer 406 of the retired endpoint into the NextED field 406 of the endpoint presently pointing to the retired endpoint. An endpoint descriptor 302 is the main element in the lists processed by the host controller 130. However, each endpoint descriptor 302 may have a certain number of subelements associated with it, called transfer descriptors (TD) 304a and 304b (FIG. 3). Generally, a transfer descriptor 304 describes a process or operation pertaining to the endpoint. The processes described by the transfer descriptors are processed by the host controller 130 in the order received. For example, if the endpoint is for data transfers, one transfer descriptor 304a may describe the attributes for transferring a certain data block from the host controller 130 to the device, while a next transfer descriptor 304b may describe a different process where a different data block is transferred from the device to the host controller 130. Endpoint descriptors 302 are coupled to the transfer descriptors 304 by linking to one transfer descriptor. If more than one transfer descriptor 304 is in the TD list, the TD's are coupled together in a linked list 306, thus, all transfer descriptors in a linked list belong to a single endpoint descriptor. The TD list 306 has a "head" or first TD 304a and a "tail" or last TD 304c. Once the endpoint descriptor 302b is linked to the head TD 304a, the TD list 306 can be traversed by the host controller 130. When the host controller 130 accesses an endpoint descriptor 302, it determines if there is a transfer descriptor 304 linked to the endpoint descriptor that can be processed. It accomplishes this by examining the TailP 402 and NextTD 404 pointers, as described below. Before continuing with the description of the linked lists, more detail on the transfer descriptors 304 is deemed relevant. A transfer descriptor (TD) 304a is a data structure which describes information necessary for the host controller 130 to transfer a block of data to or from a device endpoint. Transfer descriptors 304 come in two types: general and isochronous, as shown in FIGS. 4B and 4C respectively. General transfer descriptors (GTD's) are used for interrupt, control, and bulk endpoints. Isochronous transfer descriptor's (ITD's) are used only for isochronous endpoints. Referring to FIG. 4B, the transfers for control, bulk, and interrupt all use the same format for their transfer descriptor. This general transfer descriptor 304 is a 16-byte host memory data structure that is aligned to a 16-byte boundary. A general transfer descriptor 304 is comprised of a control field 408, a current buffer pointer field (CBP) 410, a next transfer descriptor (NextTD) field 412, and a buffer end (BE) field 414, as also shown in Table 2.
TABLE 2
______________________________________
Transfer Descriptor Fields
Name R/W Description
______________________________________
PID R This two bit field indicates the PID to be used for
the token. This field is only relevant to the host
controller if the PID field in the Endpoint
Descriptor was set to 00b or 11b indicating that the
PID determination is deferred to the Transfer
Descriptor. The encoding of the bits within the
byte for this field are:
______________________________________
PXD Data
Code Type Direction
______________________________________
00b Setup to
endpoint
01b OUT to
endpoint
10b IN from
11b Reserved
______________________________________
INTD R This field contains the interrupt delay count for
this Transfer Descriptor. When a Transfer
Descriptor is complete and moved to the done list,
INTD is used to determine who long the interrupt
associated with the completion of this Transfer
Descriptor may be delayed. If INTD is not 111b,
then the hose controller may wait the indicated
number of frames before generating an interrupt to
the host processor (a value of 0 indicates that the
interrupt is to be generated at the end of the
current frame.) If INTD is 111b, then there is no
interrupt associated with completion of this
Transfer Descriptor.
T R/W This bit is the data toggle bit. It is used to
generate/compare the data PID value (DATA0 or
DATA1). It is updated (inverted) after each
successful transmission/reception of a data packet.
EC R/W For each transmission error, this value is
incremented. If EC is 2 and another error occurs,
the error type is recorded in the CC field and
placed the done list and when NextTD in the ED is
updated, the LSb will be set. When a transmission
completes without error, EC is reset to zero so that
a Transfer Descriptor will not be cancelled unless
there are three consecutive transmission errors.
CC R/W This field contains the completion code when the
Transfer Descriptor is moved to the done list.
CBP R/W Contains the physical address of the next memory
location that will be accessed for transfer to/from
the endpoint. A value of 0 indicates a zero length
packet or, if the TD is on the done list, that all
bytes of the TD have been transferred.
NextTD
R If non zero, then this value points to the next TD
on the list of transfer descriptors linked to the
endpoint.
BE R Contains physical address of the last byte in the
buffer for this TD.
______________________________________
Referring to FIG. 4C, isochronous descriptors are used for isochronous endpoints. The isochronous descriptor is a 32-byte structure in memory aligned to 32-byte boundaries. The isochronous descriptor contains eight double-words (dwords) consisting of: a control dword 416, a frame field 418, a buffer page 0 (BPO) field 420, a next transfer descriptor dword 422, a buffer page 1 (BP1) field 424, and eight offset/packet status words 426.
TABLE 3
______________________________________
Isochronous Transfer Descriptor Fields
Name R/W Meaning
______________________________________
PID R This two bit field indicates the PID to be used for
the token. This field is only relevant to the host
controller if the PID field in the Endpoint
Descriptor was set to 00 indicating that the PID
determination is deferred to the Transfer
Descriptor. The encoding of the bits within the
byte field for this field are:
______________________________________
PID Data
Code Type Direction
______________________________________
00b Setup to
endpoint
01b OUT to
endpoint
10b IN from
11b Reserved
______________________________________
N R Number of packets (frames) of data described by this
TD. N = 0 implies 1 packet and N = 7 implies 8.
Frame R This field contains the low order five bits of the
frame number in which the first packet of the
Transfer Descriptor is to be sent.
INTD R This field contains the interrupt delay count for
this Transfer Descriptor. When a Transfer
Descriptor is complete and moved to the done list,
INTD is used to determine how long the interrupt
associated with the completion of this Transfer
Descriptor may be delayed. If INTD is not 111b,
then the host controller may wait the indicated
number of frames before generating an interrupt to
the host processor (a value of 0 indicates that the
interrupt is to be generated at the end of the
current frame.) If INTD is 111b, then there is no
interrupt associated with completion of this
Transfer Descriptor.
CC R/W This field contains the completion code when the
BPO R The 20 bits of this field contain the physical page
NextTD
R If non zero, then this value points to the next TD
on the list of transfer descriptors linked to the
endpoint.
BE R Contains physical address of the last byte in the
buffer for this TD.
Offset
R Difference between two offset values is used to
N determine the size of the packet buffer used in a
particular frame. Bit 12 of an entry indicates
whether the address is in the physical memory page
indicated by BPO or BE.
PSWN W Before the indicated packet is transferred by the
host controller, the OffsetN/PSN entry is an Offset.
After the packet is transferred by the host
controller, the entry becomes a Packet Status Word
(PSW) which is written by the host controller.
______________________________________
As mentioned above, an endpoint descriptor 302 may link to a transfer descriptor 304. If in an endpoint descriptor, the upper 28 bits of TailP 402 and NextTD 404 are identical, then the endpoint is interpreted as not having any transfer descriptors to process. If NextTD 404 and TailP 402 are not the same, then there is a transfer descriptor 304 in the TD list 306 available for processing. If there are no transfer descriptors present, then NextTD 404 and TailP 402 are identical and point to the NULL queue which acts as a place holder for when a TD is received. When a new transfer descriptor is added to the TD list 306, the new TD is linked to the end of the TD list and a another place holder is created. This is accomplished by copying the contents of the new transfer descriptor into the existing place holder, setting the NextTD field 404 in the newly added transfer descriptor to a new place holder location, and advancing the TailP pointer 402 of the endpoint descriptor 302 to point to the newly created place holder. Both types of transfer descriptors 304 (general and isochronous) provide a means of specifying a buffer that is up to two pages, or 8,192 bytes long (each page being 4096 bytes long). Additionally, if the data buffer of a transfer descriptor 304 crosses a page boundary, the pages can be physically disjoint pages thereby creating a virtual buffer. In this way, even though the pages are physically disjoined, the transfer descriptor 304 allows the "scattered" buffer to appear as one "gathered" buffer to the host controller 130. The scatter/gather capabilities of the data structure eliminate most of the problems associated with forcing buffers to be physically contiguous. A general transfer descriptor 304 (FIG. 4B) includes a current buffer pointer (CBP) 410 for indicating the next memory location that will be accessed during a data transfer, and a buffer end (BE) 414 for indicating the physical address of the last byte of the buffer. When the host controller 130 fetches a general transfer descriptor 304, it gets the address of the next data storage location from the current buffer pointer 410. If the current buffer pointer 410 is 0, then the packet size will be 0, regardless of the setting of the MaxP field (control 400) in the endpoint descriptor 302. If the data transfer is an IN (meaning from a device to host controller 130), the host controller 130 reads the current buffer pointer 410 from the endpoint descriptor 302 and writes the data to the location specified by the CBP 410. If the transfer is an OUT (meaning from the host controller 130 to a device), the host controller 130 reads from the location specified by the current buffer pointer 410 and sends the data to the endpoint. After each packet is transferred, the current buffer pointer 410 is updated according to the number of bytes transferred, as indicated by MaxP. The buffer end pointer 414 indicates the last byte location of the buffer. Overrun and underrun conditions are reported to the computer system by the host controller 130. As data is transferred to/from the current buffer pointer address, the current buffer pointer value may cross a 4k page boundary. If it does, the upper 20 bits of the buffer end field 414 are substituted for the current value of the current buffer pointer 410. An alternative data structure to the above described "virtual" buffer is a purely "physical" buffer. A bit in the transfer descriptor 304 (not shown) determines whether the buffer fields are interpreted as virtual descriptors or physical descriptors. If set to physical, the buffer is one contiguous buffer extending from the address specified in the current buffer pointer 410 to the buffer end pointer 414. Page boundaries are irrelevant, thus resulting in a buffer that can exceed the two page limitation of the virtual buffer descriptors. The isochronous transfer descriptor (IDT) 304 (FIG. 4C) has buffer page crossing attributes similar to the general transfer descriptor, but since isochronous transfers generally include real time data, the transfers are tied to a particular frame. A frame field 418 in the IDT indicates the frame in which the first packet of the IDT is to be sent or received over the serial bus. The N field (control 416) indicates the number of frames of data (packets) are defined by the IDT with the maximum value for N being lib, meaning 8 packets. When the host controller 130 processes the IDT 304, it first determines which of the defined frames it is processing. This is computed by subtracting the frame field value from the low order 12 bits of the current frame number maintained by the host controller 130, thereby yielding a relative frame number. The relative frame number, denoted herein as R, is used to select two offset values from the IDT 304 (Offset and Offset+1) 426. OffsetR 426 is subtracted from OffsetR+1 426 to get the size of the data buffer. The data buffer should not be larger than the MaxP field of the corresponding endpoint descriptor. The initial address of the transfer is determined by OffsetR 426. If bit 12 (the 13th bit) of OffsetR 426 is zero, then the initial buffer address resides in the physical memory page specified in buffer page 0 (BPO) 420. If bit 12 is one, then the initial buffer address resides in the physical page specified by buffer page 1 (BP1) 424. When the upper 20 bits are selected, the address is completed by using the low 12 bits of OffsetR 426 as the low 12 bits of the address. During a transfer to/from the buffer, the buffer address may cross a page boundary. If this occurs, BP1 424 is used as the buffer pointer page address and the transfer continues at offset 0 within that page. If the transfer is an OUT, then the host controller 130 sends the indicated amount of data from the indicated buffer to the endpoint. If the transfer is an IN, then the host controller 130 receives up to the indicated buffer size bytes and places the data at the indicated buffer address. When the transfer is complete, the host controller overwrites OffsetR 426 with a transfer status word that indicates the condition of the transfer and, in the case of an IN transfer, the number of bytes actually received. The condition code in PSWR 426 is set for both IN and OUT. The size field is only relevant for IN transfers. The process of writing the condition code in OffsetR 426 changes the most significant bit from zero to one. This provides an indication that the packet was processed by the host controller and that the word contains a packet status word (PSW). When the last packet of the IDT 304 is transferred (R=N) and OffsetR 426 is modified to be a PSW, the IDT 304 is moved to a done queue and CC (control 416) in the IDT 304 is set to done without error. The fundamental way work is accomplished on the serial bus by the host controller 130 is via the lists of endpoint descriptors 300 which in turn have a queue of transfer descriptors 306. While the host controller 130 is operating, it traverses the different endpoint descriptor lists 300 each frame. As the host controller processes each endpoint descriptor 302b, it performs work on the first enqueued transfer descriptor 304a for that endpoint descriptor. The transfer descriptor is updated to reflect the work which was done, and the host controller moves onto the next endpoint descriptor 302. At some point the work required by a transfer descriptor 304 is completed by the host controller, and the transfer descriptor 304 is put onto a done queue. The host controller 130 performs periodic processing every serial bus frame, i.e., the interrupt and isochronous lists are processed every frame. However, as described below, the entire interrupt list is not processed each frame. Interrupts on the serial bus are controlled by the host controller 130. Interrupts provide a communication mechanism through which a serial bus device can send a message to the host controller 130. Interrupts are initiated when an interrupt endpoint requests a guaranteed frequency of service. HCD 200 provides a service frequency greater than or equal to that requested by the endpoint. HCD 200 also provides a transfer descriptor 304 for addressing the interrupt endpoint. The model of interrupt transfer types is that HCD 200 initiates a serial bus transaction, at the frequency alloted to the endpoint, according to the TD 304. If the serial bus endpoint does not wish to issue an interrupt, it will NACK the serial bus transaction. When the serial bus endpoint wants to issue an interrupt, it will deliver data to the serial bus transaction the next time the transaction occurs. The data may be valid data, or may be NULL data. HCD 200 continually retries an interrupt transaction until the endpoint successfully delivers data. Interrupts are processed in the HCD 200 according to an interrupt table 500. The interrupt table 500 is a 32 entry table with each entry being a 32-bit pointer to an interrupt list. An entry to the interrupt table may also be NULL. If the entry is NULL, then no interrupts are processed for that frame. The interrupt table 500 is accessed once per frame by the host controller 130 by using the low order 5 bits of the current frame number as an index into the table entries. Thus, each table pointer 502 is accessed once every 32 frames. The table entries 502 are pointers to an interrupt list 504 which is a list of endpoint descriptors 302 with each ED pointing to a queue of transfer descriptors 304 for that endpoint, as described above. An ED 302 for an interrupt endpoint may appear on multiple interrupt lists. The more lists in which an ED is linked, the greater its polling rate. An ED 302 that is in only one list will have a polling rate of once every 32 ms. An ED that is on two lists will have a polling rate of once every 16 ms. If an ED is linked into all 32 lists then it will have a polling rate of once per 1 ms or every frame. This list structure therefore provides a convienient structure for polling intervals of 1, 2, 4, 8, 16, and 32 ms. The interrupt list 504 may be structured in a variety of ways. One way is to have a linked interrupt list with the slower polling rate interrupts linked to faster polling rate interrupts in one long list. With this arrangement, only a portion of the interrupt list is processed depending on the polling rate of the interrupts to be serviced. Since the 1 ms interrupts are linked to the slower polling rate lists, the 1 ms interrupts will be processed each frame. But during other frames the other lists may be traversed. For example, during a first frame only the 1 ms list is processed. During a second frame the 2 ms list is processed, which next causes the 1 ms list to be processed. During another frame, the entire list is processed. An alternative to this single linked list is a structure where several independent linked lists are processed. Each frame an interrupt list comprised of endpoint descriptors is processed as described above. Endpoint descriptors appearing in more than one of the independent lists have a higher polling rate. An interrupt haveing a 32 ms polling rate appears in one interrupt list. It is irrelevant which of the independent lists a 32 ms interrupt is placed as long as it exists in only one list. However, independent endpoint interrupts may be placed in different interrupts lists. A structure that is very versatile and requires less memory than the structures disclosed above is that of FIG. 5. Each frame, the frame number indexes into an interrupt table 500 which contains a pointer 502 to one of thirty-two 32 ms interrupt lists 504. Each of the thirty-two 32 ms interrupt lists link to one of sixteen 16 ms interrupt lists. Each of the sixteen 16 ms lists further link to one of eight 8 ms interrupt lists. Each of the eight 8 ms lists further link to one of four 4 ms interrupt lists. Each of the four 4 ms lists further link to one of two 2 ms lists. Each of the two 2 ms lists further link to a single 1 ms interrupt list. Thus, each frame, interrupts of each polling rate can be serviced. A grouping of endpoint descriptors 302 with the same polling rate that occur in the same frame is a sub-list 504a. The number of sub-lists at each polling rate is the same as the polling rate. For example, there can be two sub-lists 504a with polling rates of 2 ms with each list being processed on alternate frames. Each interrupt list may contain interrupts or may be the NULL list. Preferrably the HCD distributes the interrupts of same polling rates among the different interrupt lists of the same polling rate. Thus, by providing a tree-structure interrupt list, addition and removal of interrupts is very easily accomplished. Access of the interrupt table 500 is the first activity performed by the host controller 130 at the beginning of each frame. This activity may be delayed due to completion of activities from the previous frame. The host controller 130 maintains a register (not shown) which is programmed by software and indicates the latest time in the frame at which processing of the interrupt list 504 may begin and still have an opportunity of completing within the allowed time. If the host controller 130 has not accessed the interrupt table 500 before the SOF timer reaches this value, a behind schedule error condition is flagged and an immediate hardware interrupt is raised into the system. This interrupt is not deferred until the end of the current frame. If the host controller signals this condition, it will not then start processing of the interrupt list 504 and will only scan the isochronous list for transfer descriptors 304 that will complete during the current frame. No interrupt or isochronous transfers will be run on the serial bus until software clears this error condition. The last entry in each of the 32 interrupt lists 504 points to the first entry of the ED 302 of the isochronous list so that the isochronous list is queued up after the interrupts are processed. The host controller 130 schedules transfers to endpoints on serial bus based on the structure of the four endpoint lists; bulk, control, interrupt, and isochronous. Of these lists, only the interrupt list is unique in the way that the list head is found, as described above. For bulk, control, and isochronous, the host controller 130 maintains a software accessible pointer 502 to the head of the list. For interrupt, 32 list heads are kept in memory with a list selected each frame. In addition to the head pointers 502, the host controller maintains three software accessible pointers to a next ED 302 for control, bulk, and an additional pointer that is used for both periodic lists (interrupt and isochronous). The host controller selects a list to process based on a priority algorithm. At the beginning of each frame, the priority of the periodic lists is raised above that of either bulk or control. The next periodic ED pointer is located with a value from the interrupt table 500. As long as this pointer value is non-zero, the host controller will continue to process this list to the exclusion of both control and bulk. The last entry of each of the 32 interrupt lists 504 points to the first entry of the isochronous ED list so that, barring time limits, processing of isochronous endpoints follows that of interrupt processing with the host controller 130 following a single list. When the current pointer for the periodic ED 302 becomes 0, processing of periodic endpoints is complete and the periodic lists have no priority for the remainder of the frame. At this point, control and bulk list processing may resume. Based on a selection criteria described later, the host controller 130 will select either the bulk or control ED list 300 to process. The ED 302 pointed to by the current ED register is loaded and if the ED points to an available TD 304, a transfer to/from the endpoint is attempted. On completion of the transfer attempt, the current ED 302 for the list is updated and the selection criteria is again applied to determine if a control or bulk ED 302 will be processed. When the current ED pointer for either bulk or control becomes 0, the host controller 130 will copy the current value of the corresponding head pointer into the current pointer and continue processing. The least significant bit (1 sb) of the head pointer is a disable bit for the list. If a value with the 1 st set is loaded into a current pointer, processing of that list is immediately suspended. For a transfer to or from an endpoint to occur, a transfer descriptor 304 should be linked to a transfer descriptor queue associated with each ED 302. NextTD 404 and TailP 402 in an ED 302 define the TD queue. If NextTD 404 and TailP 402 are not the same, then NextTD 404 is a pointer to the TD 304 that will be processed when the host controller 130 reaches the ED 302. The host controller driver (HCD) 200 queues to the list by using the value of TailP 402 to obtain the physical address of the last TD 304 queued to the ED 302. Since the TD 304 pointed to by TailP 402 is not accessed by the host controller 130, the HCD 200 can initialize that TD 304 and link at least one other TD 304 to it without creating a coherency or synchronization problem. After the new TD(s) 304 are linked, TailP 402 is updated extending the list of TD's that can be accessed and processed by the host controller, with TailP 402 again pointing to a TD 304 that can be initialized by the HCD 200. The HCD may not alter in any way any of the TD's 304 it has queued prior to the one pointed to by TailP 402 until either (1) they appear on the done queue, or (2) the ED 302 has been halted by the host controller 130 as indicated by the H bit (of next TD field), or (3) the ED 302 is removed from the list. When the host controller 130 finishes processing a TD 304, it copies the NextTD 412 value from the just completed TD 304 into NextTD 404 of the ED 302 and sets the H bit of that value to 0 if the TD 304 completed without error or 1 if an error occurred. When a TD 304 is complete (with or without an error), it is unlinked from the queue that it is on and linked to the done queue. The host controller 130 maintains a register (not shown) to the last TD 304 that was placed on the done queue. When a TD 304 is put on the done queue, the value of the register is written to NextTD 412 of the just completed TD 304 and the register is changed to contain the address of the TD 304 just completed. This causes TD's to be linked at the head of the done queue. The reason for linking at the head is that this allows the hardware to only maintain one pointer for the done queue and also allows the linking to the done queue to be done at the same time a the status update in a completed TD which saves a memory access (i.e., the same write that updates the status of a TD 304 to indicate that it is done can be extended to cause NextTD 412 to be updated to place the TD on the done queue). Periodically, the host controller 130 will write the current value of its done queue head pointer into a memory location so that serial bus driver software 202 can complete processing of a TD 304. Nominally, the done queue is written to memory just before a frame interrupt condition is set. After the done queue head value is written to memory, the host controller 130 sets the value of its hardware head pointer to 0 and sets a done flag located in a host controllers register. As long as that flag is set, the host controller 130 may not write the done queue to memory. The foregoing disclosure and description of the invention are illustrative and explanatory thereof, and various changes in the size, shape, materials, components, circuit elements, wiring connections and contacts, as well as in the details of the illustrated circuitry and construction and method of operation may be made without departing from the spirit of the invention.
|
Same subclass Same class Consider this |
||||||||||
