1df1bfde4SAndrew Rybchenko /*- 2df1bfde4SAndrew Rybchenko * BSD LICENSE 3df1bfde4SAndrew Rybchenko * 4df1bfde4SAndrew Rybchenko * Copyright (c) 2017 Solarflare Communications Inc. 5df1bfde4SAndrew Rybchenko * All rights reserved. 6df1bfde4SAndrew Rybchenko * 7df1bfde4SAndrew Rybchenko * This software was jointly developed between OKTET Labs (under contract 8df1bfde4SAndrew Rybchenko * for Solarflare) and Solarflare Communications, Inc. 9df1bfde4SAndrew Rybchenko * 10df1bfde4SAndrew Rybchenko * Redistribution and use in source and binary forms, with or without 11df1bfde4SAndrew Rybchenko * modification, are permitted provided that the following conditions are met: 12df1bfde4SAndrew Rybchenko * 13df1bfde4SAndrew Rybchenko * 1. Redistributions of source code must retain the above copyright notice, 14df1bfde4SAndrew Rybchenko * this list of conditions and the following disclaimer. 15df1bfde4SAndrew Rybchenko * 2. Redistributions in binary form must reproduce the above copyright notice, 16df1bfde4SAndrew Rybchenko * this list of conditions and the following disclaimer in the documentation 17df1bfde4SAndrew Rybchenko * and/or other materials provided with the distribution. 18df1bfde4SAndrew Rybchenko * 19df1bfde4SAndrew Rybchenko * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20df1bfde4SAndrew Rybchenko * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21df1bfde4SAndrew Rybchenko * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22df1bfde4SAndrew Rybchenko * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23df1bfde4SAndrew Rybchenko * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24df1bfde4SAndrew Rybchenko * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25df1bfde4SAndrew Rybchenko * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26df1bfde4SAndrew Rybchenko * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27df1bfde4SAndrew Rybchenko * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28df1bfde4SAndrew Rybchenko * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 29df1bfde4SAndrew Rybchenko * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30df1bfde4SAndrew Rybchenko */ 31df1bfde4SAndrew Rybchenko 32df1bfde4SAndrew Rybchenko #include <sys/queue.h> 33df1bfde4SAndrew Rybchenko #include <string.h> 34df1bfde4SAndrew Rybchenko #include <errno.h> 35df1bfde4SAndrew Rybchenko 36df1bfde4SAndrew Rybchenko #include <rte_log.h> 37df1bfde4SAndrew Rybchenko 38df1bfde4SAndrew Rybchenko #include "sfc_dp.h" 39df1bfde4SAndrew Rybchenko 40df1bfde4SAndrew Rybchenko void 41df1bfde4SAndrew Rybchenko sfc_dp_queue_init(struct sfc_dp_queue *dpq, uint16_t port_id, uint16_t queue_id, 42df1bfde4SAndrew Rybchenko const struct rte_pci_addr *pci_addr) 43df1bfde4SAndrew Rybchenko { 44df1bfde4SAndrew Rybchenko dpq->port_id = port_id; 45df1bfde4SAndrew Rybchenko dpq->queue_id = queue_id; 46df1bfde4SAndrew Rybchenko dpq->pci_addr = *pci_addr; 47df1bfde4SAndrew Rybchenko } 48df1bfde4SAndrew Rybchenko 49df1bfde4SAndrew Rybchenko struct sfc_dp * 50df1bfde4SAndrew Rybchenko sfc_dp_find_by_name(struct sfc_dp_list *head, enum sfc_dp_type type, 51df1bfde4SAndrew Rybchenko const char *name) 52df1bfde4SAndrew Rybchenko { 53df1bfde4SAndrew Rybchenko struct sfc_dp *entry; 54df1bfde4SAndrew Rybchenko 55df1bfde4SAndrew Rybchenko TAILQ_FOREACH(entry, head, links) { 56df1bfde4SAndrew Rybchenko if (entry->type != type) 57df1bfde4SAndrew Rybchenko continue; 58df1bfde4SAndrew Rybchenko 59df1bfde4SAndrew Rybchenko if (strcmp(entry->name, name) == 0) 60df1bfde4SAndrew Rybchenko return entry; 61df1bfde4SAndrew Rybchenko } 62df1bfde4SAndrew Rybchenko 63df1bfde4SAndrew Rybchenko return NULL; 64df1bfde4SAndrew Rybchenko } 65df1bfde4SAndrew Rybchenko 66df1bfde4SAndrew Rybchenko struct sfc_dp * 67df1bfde4SAndrew Rybchenko sfc_dp_find_by_caps(struct sfc_dp_list *head, enum sfc_dp_type type, 68df1bfde4SAndrew Rybchenko unsigned int avail_caps) 69df1bfde4SAndrew Rybchenko { 70df1bfde4SAndrew Rybchenko struct sfc_dp *entry; 71df1bfde4SAndrew Rybchenko 72df1bfde4SAndrew Rybchenko TAILQ_FOREACH(entry, head, links) { 73df1bfde4SAndrew Rybchenko if (entry->type != type) 74df1bfde4SAndrew Rybchenko continue; 75df1bfde4SAndrew Rybchenko 76df1bfde4SAndrew Rybchenko /* Take the first matching */ 77df1bfde4SAndrew Rybchenko if (sfc_dp_match_hw_fw_caps(entry, avail_caps)) 78df1bfde4SAndrew Rybchenko return entry; 79df1bfde4SAndrew Rybchenko } 80df1bfde4SAndrew Rybchenko 81df1bfde4SAndrew Rybchenko return NULL; 82df1bfde4SAndrew Rybchenko } 83df1bfde4SAndrew Rybchenko 84df1bfde4SAndrew Rybchenko int 85df1bfde4SAndrew Rybchenko sfc_dp_register(struct sfc_dp_list *head, struct sfc_dp *entry) 86df1bfde4SAndrew Rybchenko { 87df1bfde4SAndrew Rybchenko if (sfc_dp_find_by_name(head, entry->type, entry->name) != NULL) { 88df1bfde4SAndrew Rybchenko rte_log(RTE_LOG_ERR, RTE_LOGTYPE_PMD, 89df1bfde4SAndrew Rybchenko "sfc %s dapapath '%s' already registered\n", 90*dbdc8241SAndrew Rybchenko entry->type == SFC_DP_RX ? "Rx" : 91*dbdc8241SAndrew Rybchenko entry->type == SFC_DP_TX ? "Tx" : 92*dbdc8241SAndrew Rybchenko "unknown", 93df1bfde4SAndrew Rybchenko entry->name); 94df1bfde4SAndrew Rybchenko return EEXIST; 95df1bfde4SAndrew Rybchenko } 96df1bfde4SAndrew Rybchenko 97df1bfde4SAndrew Rybchenko TAILQ_INSERT_TAIL(head, entry, links); 98df1bfde4SAndrew Rybchenko 99df1bfde4SAndrew Rybchenko return 0; 100df1bfde4SAndrew Rybchenko } 101