Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ixl/i40e_osdep.c
Show All 27 Lines | /****************************************************************************** | ||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
POSSIBILITY OF SUCH DAMAGE. | POSSIBILITY OF SUCH DAMAGE. | ||||
******************************************************************************/ | ******************************************************************************/ | ||||
/*$FreeBSD$*/ | /*$FreeBSD$*/ | ||||
#include <sys/limits.h> | #include <sys/limits.h> | ||||
#include <sys/time.h> | |||||
#include "ixl.h" | #include "ixl.h" | ||||
/******************************************************************** | /******************************************************************** | ||||
* Manage DMA'able memory. | * Manage DMA'able memory. | ||||
*******************************************************************/ | *******************************************************************/ | ||||
static void | static void | ||||
i40e_dmamap_cb(void *arg, bus_dma_segment_t * segs, int nseg, int error) | i40e_dmamap_cb(void *arg, bus_dma_segment_t * segs, int nseg, int error) | ||||
{ | { | ||||
if (error) | if (error) | ||||
return; | return; | ||||
*(bus_addr_t *) arg = segs->ds_addr; | *(bus_addr_t *) arg = segs->ds_addr; | ||||
return; | |||||
} | } | ||||
i40e_status | i40e_status | ||||
i40e_allocate_virt_mem(struct i40e_hw *hw, struct i40e_virt_mem *mem, u32 size) | i40e_allocate_virt_mem(struct i40e_hw *hw, struct i40e_virt_mem *mem, u32 size) | ||||
{ | { | ||||
mem->va = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); | mem->va = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); | ||||
return(mem->va == NULL); | return (mem->va == NULL); | ||||
} | } | ||||
i40e_status | i40e_status | ||||
i40e_free_virt_mem(struct i40e_hw *hw, struct i40e_virt_mem *mem) | i40e_free_virt_mem(struct i40e_hw *hw, struct i40e_virt_mem *mem) | ||||
{ | { | ||||
free(mem->va, M_DEVBUF); | free(mem->va, M_DEVBUF); | ||||
mem->va = NULL; | mem->va = NULL; | ||||
return(0); | return (I40E_SUCCESS); | ||||
} | } | ||||
i40e_status | i40e_status | ||||
i40e_allocate_dma_mem(struct i40e_hw *hw, struct i40e_dma_mem *mem, | i40e_allocate_dma_mem(struct i40e_hw *hw, struct i40e_dma_mem *mem, | ||||
enum i40e_memory_type type __unused, u64 size, u32 alignment) | enum i40e_memory_type type __unused, u64 size, u32 alignment) | ||||
{ | { | ||||
device_t dev = ((struct i40e_osdep *)hw->back)->dev; | device_t dev = ((struct i40e_osdep *)hw->back)->dev; | ||||
int err; | int err; | ||||
Show All 35 Lines | device_printf(dev, | ||||
"i40e_allocate_dma: bus_dmamap_load failed, " | "i40e_allocate_dma: bus_dmamap_load failed, " | ||||
"error %u\n", err); | "error %u\n", err); | ||||
goto fail_2; | goto fail_2; | ||||
} | } | ||||
mem->nseg = 1; | mem->nseg = 1; | ||||
mem->size = size; | mem->size = size; | ||||
bus_dmamap_sync(mem->tag, mem->map, | bus_dmamap_sync(mem->tag, mem->map, | ||||
BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); | BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); | ||||
return (0); | return (I40E_SUCCESS); | ||||
fail_2: | fail_2: | ||||
bus_dmamem_free(mem->tag, mem->va, mem->map); | bus_dmamem_free(mem->tag, mem->va, mem->map); | ||||
fail_1: | fail_1: | ||||
bus_dma_tag_destroy(mem->tag); | bus_dma_tag_destroy(mem->tag); | ||||
fail_0: | fail_0: | ||||
mem->map = NULL; | mem->map = NULL; | ||||
mem->tag = NULL; | mem->tag = NULL; | ||||
return (err); | return (err); | ||||
Show All 31 Lines | |||||
void | void | ||||
i40e_destroy_spinlock(struct i40e_spinlock *lock) | i40e_destroy_spinlock(struct i40e_spinlock *lock) | ||||
{ | { | ||||
if (mtx_initialized(&lock->mutex)) | if (mtx_initialized(&lock->mutex)) | ||||
mtx_destroy(&lock->mutex); | mtx_destroy(&lock->mutex); | ||||
} | } | ||||
static inline int | #ifndef MSEC_2_TICKS | ||||
ixl_ms_scale(int x) | #define MSEC_2_TICKS(m) max(1, (uint32_t)((hz == 1000) ? \ | ||||
{ | (m) : ((uint64_t)(m) * (uint64_t)hz)/(uint64_t)1000)) | ||||
if (hz == 1000) | #endif | ||||
return (x); | |||||
else if (hz > 1000) | |||||
return (x*(hz/1000)); | |||||
else | |||||
return (max(1, x/(1000/hz))); | |||||
} | |||||
void | void | ||||
i40e_msec_pause(int msecs) | i40e_msec_pause(int msecs) | ||||
{ | { | ||||
if (cold || SCHEDULER_STOPPED()) | pause("i40e_msec_pause", MSEC_2_TICKS(msecs)); | ||||
i40e_msec_delay(msecs); | |||||
else | |||||
// ERJ: (msecs * hz) could overflow | |||||
pause("ixl", ixl_ms_scale(msecs)); | |||||
} | } | ||||
/* | /* | ||||
* Helper function for debug statement printing | * Helper function for debug statement printing | ||||
*/ | */ | ||||
void | void | ||||
i40e_debug_shared(struct i40e_hw *hw, enum i40e_debug_mask mask, char *fmt, ...) | i40e_debug_shared(struct i40e_hw *hw, enum i40e_debug_mask mask, char *fmt, ...) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 84 Lines • Show Last 20 Lines |