1 /* QLogic qed NIC Driver 2 * Copyright (c) 2015 QLogic Corporation 3 * 4 * This software is available under the terms of the GNU General Public License 5 * (GPL) Version 2, available from the file COPYING in the main directory of 6 * this source tree. 7 */ 8 9 #ifndef _QED_OOO_H 10 #define _QED_OOO_H 11 #include <linux/types.h> 12 #include <linux/list.h> 13 #include <linux/slab.h> 14 #include "qed.h" 15 16 #define QED_MAX_NUM_ISLES 256 17 #define QED_MAX_NUM_OOO_HISTORY_ENTRIES 512 18 19 #define QED_OOO_LEFT_BUF 0 20 #define QED_OOO_RIGHT_BUF 1 21 22 struct qed_ooo_buffer { 23 struct list_head list_entry; 24 void *rx_buffer_virt_addr; 25 dma_addr_t rx_buffer_phys_addr; 26 u32 rx_buffer_size; 27 u16 packet_length; 28 u16 parse_flags; 29 u16 vlan; 30 u8 placement_offset; 31 }; 32 33 struct qed_ooo_isle { 34 struct list_head list_entry; 35 struct list_head buffers_list; 36 }; 37 38 struct qed_ooo_archipelago { 39 struct list_head list_entry; 40 struct list_head isles_list; 41 u32 cid; 42 }; 43 44 struct qed_ooo_history { 45 struct ooo_opaque *p_cqes; 46 u32 head_idx; 47 u32 num_of_cqes; 48 }; 49 50 struct qed_ooo_info { 51 struct list_head free_buffers_list; 52 struct list_head ready_buffers_list; 53 struct list_head free_isles_list; 54 struct list_head free_archipelagos_list; 55 struct list_head archipelagos_list; 56 struct qed_ooo_archipelago *p_archipelagos_mem; 57 struct qed_ooo_isle *p_isles_mem; 58 struct qed_ooo_history ooo_history; 59 u32 cur_isles_number; 60 u32 max_isles_number; 61 u32 gen_isles_number; 62 }; 63 64 #if IS_ENABLED(CONFIG_QED_ISCSI) 65 void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn, 66 struct qed_ooo_info *p_ooo_info, 67 struct ooo_opaque *p_cqe); 68 69 struct qed_ooo_info *qed_ooo_alloc(struct qed_hwfn *p_hwfn); 70 71 void qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 72 struct qed_ooo_info *p_ooo_info, 73 u32 cid); 74 75 void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 76 struct qed_ooo_info *p_ooo_info); 77 78 void qed_ooo_setup(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info); 79 80 void qed_ooo_free(struct qed_hwfn *p_hwfn, struct qed_ooo_info *p_ooo_info); 81 82 void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn, 83 struct qed_ooo_info *p_ooo_info, 84 struct qed_ooo_buffer *p_buffer); 85 86 struct qed_ooo_buffer * 87 qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, 88 struct qed_ooo_info *p_ooo_info); 89 90 void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn, 91 struct qed_ooo_info *p_ooo_info, 92 struct qed_ooo_buffer *p_buffer, u8 on_tail); 93 94 struct qed_ooo_buffer * 95 qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, 96 struct qed_ooo_info *p_ooo_info); 97 98 void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn, 99 struct qed_ooo_info *p_ooo_info, 100 u32 cid, u8 drop_isle, u8 drop_size); 101 102 void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn, 103 struct qed_ooo_info *p_ooo_info, 104 u32 cid, 105 u8 ooo_isle, struct qed_ooo_buffer *p_buffer); 106 107 void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn, 108 struct qed_ooo_info *p_ooo_info, 109 u32 cid, 110 u8 ooo_isle, 111 struct qed_ooo_buffer *p_buffer, u8 buffer_side); 112 113 void qed_ooo_join_isles(struct qed_hwfn *p_hwfn, 114 struct qed_ooo_info *p_ooo_info, u32 cid, 115 u8 left_isle); 116 #else /* IS_ENABLED(CONFIG_QED_ISCSI) */ 117 static inline void qed_ooo_save_history_entry(struct qed_hwfn *p_hwfn, 118 struct qed_ooo_info *p_ooo_info, 119 struct ooo_opaque *p_cqe) {} 120 121 static inline struct qed_ooo_info *qed_ooo_alloc( 122 struct qed_hwfn *p_hwfn) { return NULL; } 123 124 static inline void 125 qed_ooo_release_connection_isles(struct qed_hwfn *p_hwfn, 126 struct qed_ooo_info *p_ooo_info, 127 u32 cid) {} 128 129 static inline void qed_ooo_release_all_isles(struct qed_hwfn *p_hwfn, 130 struct qed_ooo_info *p_ooo_info) 131 {} 132 133 static inline void qed_ooo_setup(struct qed_hwfn *p_hwfn, 134 struct qed_ooo_info *p_ooo_info) {} 135 136 static inline void qed_ooo_free(struct qed_hwfn *p_hwfn, 137 struct qed_ooo_info *p_ooo_info) {} 138 139 static inline void qed_ooo_put_free_buffer(struct qed_hwfn *p_hwfn, 140 struct qed_ooo_info *p_ooo_info, 141 struct qed_ooo_buffer *p_buffer) {} 142 143 static inline struct qed_ooo_buffer * 144 qed_ooo_get_free_buffer(struct qed_hwfn *p_hwfn, 145 struct qed_ooo_info *p_ooo_info) { return NULL; } 146 147 static inline void qed_ooo_put_ready_buffer(struct qed_hwfn *p_hwfn, 148 struct qed_ooo_info *p_ooo_info, 149 struct qed_ooo_buffer *p_buffer, 150 u8 on_tail) {} 151 152 static inline struct qed_ooo_buffer * 153 qed_ooo_get_ready_buffer(struct qed_hwfn *p_hwfn, 154 struct qed_ooo_info *p_ooo_info) { return NULL; } 155 156 static inline void qed_ooo_delete_isles(struct qed_hwfn *p_hwfn, 157 struct qed_ooo_info *p_ooo_info, 158 u32 cid, u8 drop_isle, u8 drop_size) {} 159 160 static inline void qed_ooo_add_new_isle(struct qed_hwfn *p_hwfn, 161 struct qed_ooo_info *p_ooo_info, 162 u32 cid, u8 ooo_isle, 163 struct qed_ooo_buffer *p_buffer) {} 164 165 static inline void qed_ooo_add_new_buffer(struct qed_hwfn *p_hwfn, 166 struct qed_ooo_info *p_ooo_info, 167 u32 cid, u8 ooo_isle, 168 struct qed_ooo_buffer *p_buffer, 169 u8 buffer_side) {} 170 171 static inline void qed_ooo_join_isles(struct qed_hwfn *p_hwfn, 172 struct qed_ooo_info *p_ooo_info, u32 cid, 173 u8 left_isle) {} 174 #endif /* IS_ENABLED(CONFIG_QED_ISCSI) */ 175 176 #endif 177