123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- #ifndef _SCIC_SDS_UNSOLICITED_FRAME_CONTROL_H_
- #define _SCIC_SDS_UNSOLICITED_FRAME_CONTROL_H_
- #include "isci.h"
- #define SCU_UNSOLICITED_FRAME_HEADER_DATA_DWORDS 15
- struct scu_unsolicited_frame_header {
-
- u32 iit_exists:1;
-
- u32 protocol_type:3;
-
- u32 is_address_frame:1;
-
- u32 connection_rate:4;
- u32 reserved:23;
-
- u32 data[SCU_UNSOLICITED_FRAME_HEADER_DATA_DWORDS];
- };
- enum unsolicited_frame_state {
-
- UNSOLICITED_FRAME_EMPTY,
-
- UNSOLICITED_FRAME_IN_USE,
-
- UNSOLICITED_FRAME_RELEASED,
- UNSOLICITED_FRAME_MAX_STATES
- };
- struct sci_unsolicited_frame {
-
- enum unsolicited_frame_state state;
-
- struct scu_unsolicited_frame_header *header;
-
- void *buffer;
- };
- struct sci_uf_header_array {
-
- struct scu_unsolicited_frame_header *array;
-
- dma_addr_t physical_address;
- };
- struct sci_uf_buffer_array {
-
- struct sci_unsolicited_frame array[SCU_MAX_UNSOLICITED_FRAMES];
-
- dma_addr_t physical_address;
- };
- struct sci_uf_address_table_array {
-
- u64 *array;
-
- dma_addr_t physical_address;
- };
- struct sci_unsolicited_frame_control {
-
- u32 get;
-
- struct sci_uf_header_array headers;
-
- struct sci_uf_buffer_array buffers;
-
- struct sci_uf_address_table_array address_table;
- };
- #define SCI_UFI_BUF_SIZE (SCU_MAX_UNSOLICITED_FRAMES * SCU_UNSOLICITED_FRAME_BUFFER_SIZE)
- #define SCI_UFI_HDR_SIZE (SCU_MAX_UNSOLICITED_FRAMES * sizeof(struct scu_unsolicited_frame_header))
- #define SCI_UFI_TOTAL_SIZE (SCI_UFI_BUF_SIZE + SCI_UFI_HDR_SIZE + SCU_MAX_UNSOLICITED_FRAMES * sizeof(u64))
- struct isci_host;
- void sci_unsolicited_frame_control_construct(struct isci_host *ihost);
- enum sci_status sci_unsolicited_frame_control_get_header(
- struct sci_unsolicited_frame_control *uf_control,
- u32 frame_index,
- void **frame_header);
- enum sci_status sci_unsolicited_frame_control_get_buffer(
- struct sci_unsolicited_frame_control *uf_control,
- u32 frame_index,
- void **frame_buffer);
- bool sci_unsolicited_frame_control_release_frame(
- struct sci_unsolicited_frame_control *uf_control,
- u32 frame_index);
- #endif
|