1 /* 2 * Copyright (c) 2017-2018 Cavium, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 * 29 */ 30 31 #ifndef __ECORE_OOO_H__ 32 #define __ECORE_OOO_H__ 33 34 #include "ecore.h" 35 36 #define ECORE_MAX_NUM_ISLES 256 37 #define ECORE_MAX_NUM_OOO_HISTORY_ENTRIES 512 38 39 #define ECORE_OOO_LEFT_BUF 0 40 #define ECORE_OOO_RIGHT_BUF 1 41 42 struct ecore_ooo_buffer { 43 osal_list_entry_t list_entry; 44 void *rx_buffer_virt_addr; 45 dma_addr_t rx_buffer_phys_addr; 46 u32 rx_buffer_size; 47 u16 packet_length; 48 u16 parse_flags; 49 u16 vlan; 50 u8 placement_offset; 51 }; 52 53 struct ecore_ooo_isle { 54 osal_list_entry_t list_entry; 55 osal_list_t buffers_list; 56 }; 57 58 struct ecore_ooo_archipelago { 59 osal_list_t isles_list; 60 }; 61 62 struct ecore_ooo_history { 63 struct ooo_opaque *p_cqes; 64 u32 head_idx; 65 u32 num_of_cqes; 66 }; 67 68 struct ecore_ooo_info { 69 osal_list_t free_buffers_list; 70 osal_list_t ready_buffers_list; 71 osal_list_t free_isles_list; 72 struct ecore_ooo_archipelago *p_archipelagos_mem; 73 struct ecore_ooo_isle *p_isles_mem; 74 struct ecore_ooo_history ooo_history; 75 u32 cur_isles_number; 76 u32 max_isles_number; 77 u32 gen_isles_number; 78 u16 max_num_archipelagos; 79 u16 cid_base; 80 }; 81 82 #if defined(CONFIG_ECORE_ISCSI) || defined(CONFIG_ECORE_IWARP) 83 enum _ecore_status_t ecore_ooo_alloc(struct ecore_hwfn *p_hwfn); 84 85 void ecore_ooo_setup(struct ecore_hwfn *p_hwfn); 86 87 void ecore_ooo_free(struct ecore_hwfn *p_hwfn); 88 #else 89 static inline enum _ecore_status_t 90 ecore_ooo_alloc(struct ecore_hwfn OSAL_UNUSED *p_hwfn) 91 { 92 return ECORE_INVAL; 93 } 94 95 static inline void 96 ecore_ooo_setup(struct ecore_hwfn OSAL_UNUSED *p_hwfn) {} 97 98 static inline void 99 ecore_ooo_free(struct ecore_hwfn OSAL_UNUSED *p_hwfn) {} 100 #endif 101 102 void ecore_ooo_save_history_entry(struct ecore_ooo_info *p_ooo_info, 103 struct ooo_opaque *p_cqe); 104 105 void ecore_ooo_release_connection_isles(struct ecore_ooo_info *p_ooo_info, 106 u32 cid); 107 108 void ecore_ooo_release_all_isles(struct ecore_ooo_info *p_ooo_info); 109 110 void ecore_ooo_put_free_buffer(struct ecore_ooo_info *p_ooo_info, 111 struct ecore_ooo_buffer *p_buffer); 112 113 struct ecore_ooo_buffer * 114 ecore_ooo_get_free_buffer(struct ecore_ooo_info *p_ooo_info); 115 116 void ecore_ooo_put_ready_buffer(struct ecore_ooo_info *p_ooo_info, 117 struct ecore_ooo_buffer *p_buffer, u8 on_tail); 118 119 struct ecore_ooo_buffer * 120 ecore_ooo_get_ready_buffer(struct ecore_ooo_info *p_ooo_info); 121 122 void ecore_ooo_delete_isles(struct ecore_hwfn *p_hwfn, 123 struct ecore_ooo_info *p_ooo_info, 124 u32 cid, 125 u8 drop_isle, 126 u8 drop_size); 127 128 void ecore_ooo_add_new_isle(struct ecore_hwfn *p_hwfn, 129 struct ecore_ooo_info *p_ooo_info, 130 u32 cid, 131 u8 ooo_isle, 132 struct ecore_ooo_buffer *p_buffer); 133 134 void ecore_ooo_add_new_buffer(struct ecore_hwfn *p_hwfn, 135 struct ecore_ooo_info *p_ooo_info, 136 u32 cid, 137 u8 ooo_isle, 138 struct ecore_ooo_buffer *p_buffer, 139 u8 buffer_side); 140 141 void ecore_ooo_join_isles(struct ecore_hwfn *p_hwfn, 142 struct ecore_ooo_info *p_ooo_info, 143 u32 cid, 144 u8 left_isle); 145 146 void ecore_ooo_dump_rx_event(struct ecore_hwfn *p_hwfn, 147 struct ooo_opaque *iscsi_ooo, 148 struct ecore_ooo_buffer *p_buffer); 149 150 #endif /*__ECORE_OOO_H__*/ 151