X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fnetvsc%2Fhn_rndis.c;h=1b63b27e0c3e2d1d0b5b0a8699d5b7f936cf4dd5;hb=d61138d4f0e2927cc1d0fef6d810fa7f5d1161a1;hp=2b4714042e04b5aabe628ccc9544c9114fd3d7e5;hpb=8b945a7f7dcb688fada7ec8650b8a1f45252ea73;p=dpdk.git diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c index 2b4714042e..1b63b27e0c 100644 --- a/drivers/net/netvsc/hn_rndis.c +++ b/drivers/net/netvsc/hn_rndis.c @@ -10,13 +10,15 @@ #include #include #include +#include -#include +#include #include #include #include #include #include +#include #include #include #include @@ -33,6 +35,9 @@ #include "hn_rndis.h" #include "ndis.h" +#define RNDIS_TIMEOUT_SEC 5 +#define RNDIS_DELAY_MS 10 + #define HN_RNDIS_XFER_SIZE 0x4000 #define HN_NDIS_TXCSUM_CAP_IP4 \ @@ -60,10 +65,9 @@ hn_rndis_rid(struct hn_data *hv) return rid; } -static void *hn_rndis_alloc(struct hn_data *hv, size_t size) +static void *hn_rndis_alloc(size_t size) { - return rte_zmalloc_socket("RNDIS", size, PAGE_SIZE, - hv->vmbus->device.numa_node); + return rte_zmalloc("RNDIS", size, rte_mem_page_size()); } #ifdef RTE_LIBRTE_NETVSC_DEBUG_DUMP @@ -261,18 +265,18 @@ static int hn_nvs_send_rndis_ctrl(struct vmbus_channel *chan, return -EINVAL; } - if (unlikely(reqlen > PAGE_SIZE)) { + if (unlikely(reqlen > rte_mem_page_size())) { PMD_DRV_LOG(ERR, "RNDIS request %u greater than page size", reqlen); return -EINVAL; } - sg.page = addr / PAGE_SIZE; + sg.page = addr / rte_mem_page_size(); sg.ofs = addr & PAGE_MASK; sg.len = reqlen; - if (sg.ofs + reqlen > PAGE_SIZE) { - PMD_DRV_LOG(ERR, "RNDIS request crosses page bounary"); + if (sg.ofs + reqlen > rte_mem_page_size()) { + PMD_DRV_LOG(ERR, "RNDIS request crosses page boundary"); return -EINVAL; } @@ -282,6 +286,15 @@ static int hn_nvs_send_rndis_ctrl(struct vmbus_channel *chan, &nvs_rndis, sizeof(nvs_rndis), 0U, NULL); } +/* + * Alarm callback to process link changed notifications. + * Can not directly since link_status is discovered while reading ring + */ +static void hn_rndis_link_alarm(void *arg) +{ + rte_eth_dev_callback_process(arg, RTE_ETH_EVENT_INTR_LSC, NULL); +} + void hn_rndis_link_status(struct rte_eth_dev *dev, const void *msg) { const struct rndis_status_msg *indicate = msg; @@ -299,11 +312,8 @@ void hn_rndis_link_status(struct rte_eth_dev *dev, const void *msg) case RNDIS_STATUS_LINK_SPEED_CHANGE: case RNDIS_STATUS_MEDIA_CONNECT: case RNDIS_STATUS_MEDIA_DISCONNECT: - if (dev->data->dev_conf.intr_conf.lsc && - hn_dev_link_update(dev, 0) == 0) - _rte_eth_dev_callback_process(dev, - RTE_ETH_EVENT_INTR_LSC, - NULL); + if (dev->data->dev_conf.intr_conf.lsc) + rte_eal_alarm_set(10, hn_rndis_link_alarm, dev); break; default: PMD_DRV_LOG(NOTICE, "unknown RNDIS indication: %#x", @@ -348,7 +358,7 @@ void hn_rndis_receive_response(struct hn_data *hv, rte_smp_wmb(); if (rte_atomic32_cmpset(&hv->rndis_pending, hdr->rid, 0) == 0) { - PMD_DRV_LOG(ERR, + PMD_DRV_LOG(NOTICE, "received id %#x pending id %#x", hdr->rid, (uint32_t)hv->rndis_pending); } @@ -371,6 +381,11 @@ static int hn_rndis_exec1(struct hn_data *hv, return -EIO; } + if (rid == 0) { + PMD_DRV_LOG(ERR, "Invalid request id"); + return -EINVAL; + } + if (comp != NULL && rte_atomic32_cmpset(&hv->rndis_pending, 0, rid) == 0) { PMD_DRV_LOG(ERR, @@ -385,9 +400,26 @@ static int hn_rndis_exec1(struct hn_data *hv, } if (comp) { + time_t start = time(NULL); + /* Poll primary channel until response received */ - while (hv->rndis_pending == rid) + while (hv->rndis_pending == rid) { + if (hv->closed) + return -ENETDOWN; + + if (time(NULL) - start > RNDIS_TIMEOUT_SEC) { + PMD_DRV_LOG(ERR, + "RNDIS response timed out"); + + rte_atomic32_cmpset(&hv->rndis_pending, rid, 0); + return -ETIMEDOUT; + } + + if (rte_vmbus_chan_rx_empty(hv->primary->chan)) + rte_delay_ms(RNDIS_DELAY_MS); + hn_process_events(hv, 0, 1); + } memcpy(comp, hv->rndis_resp, comp_len); } @@ -442,12 +474,12 @@ hn_rndis_query(struct hn_data *hv, uint32_t oid, uint32_t rid; reqlen = sizeof(*req) + idlen; - req = hn_rndis_alloc(hv, reqlen); + req = hn_rndis_alloc(reqlen); if (req == NULL) return -ENOMEM; comp_len = sizeof(*comp) + odlen; - comp = rte_zmalloc("QUERY", comp_len, PAGE_SIZE); + comp = rte_zmalloc("QUERY", comp_len, rte_mem_page_size()); if (!comp) { error = -ENOMEM; goto done; @@ -517,7 +549,7 @@ hn_rndis_halt(struct hn_data *hv) { struct rndis_halt_req *halt; - halt = hn_rndis_alloc(hv, sizeof(*halt)); + halt = hn_rndis_alloc(sizeof(*halt)); if (halt == NULL) return -ENOMEM; @@ -678,15 +710,15 @@ hn_rndis_query_rsscaps(struct hn_data *hv, hv->rss_offloads = 0; if (caps.ndis_caps & NDIS_RSS_CAP_IPV4) - hv->rss_offloads |= ETH_RSS_IPV4 - | ETH_RSS_NONFRAG_IPV4_TCP - | ETH_RSS_NONFRAG_IPV4_UDP; + hv->rss_offloads |= RTE_ETH_RSS_IPV4 + | RTE_ETH_RSS_NONFRAG_IPV4_TCP + | RTE_ETH_RSS_NONFRAG_IPV4_UDP; if (caps.ndis_caps & NDIS_RSS_CAP_IPV6) - hv->rss_offloads |= ETH_RSS_IPV6 - | ETH_RSS_NONFRAG_IPV6_TCP; + hv->rss_offloads |= RTE_ETH_RSS_IPV6 + | RTE_ETH_RSS_NONFRAG_IPV6_TCP; if (caps.ndis_caps & NDIS_RSS_CAP_IPV6_EX) - hv->rss_offloads |= ETH_RSS_IPV6_EX - | ETH_RSS_IPV6_TCP_EX; + hv->rss_offloads |= RTE_ETH_RSS_IPV6_EX + | RTE_ETH_RSS_IPV6_TCP_EX; /* Commit! */ *rxr_cnt0 = rxr_cnt; @@ -704,7 +736,7 @@ hn_rndis_set(struct hn_data *hv, uint32_t oid, const void *data, uint32_t dlen) int error; reqlen = sizeof(*req) + dlen; - req = rte_zmalloc("RNDIS_SET", reqlen, PAGE_SIZE); + req = rte_zmalloc("RNDIS_SET", reqlen, rte_mem_page_size()); if (!req) return -ENOMEM; @@ -768,7 +800,7 @@ int hn_rndis_conf_offload(struct hn_data *hv, params.ndis_hdr.ndis_size = NDIS_OFFLOAD_PARAMS_SIZE; } - if (tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM) { + if (tx_offloads & RTE_ETH_TX_OFFLOAD_TCP_CKSUM) { if (hwcaps.ndis_csum.ndis_ip4_txcsum & NDIS_TXCSUM_CAP_TCP4) params.ndis_tcp4csum = NDIS_OFFLOAD_PARAM_TX; else @@ -780,7 +812,7 @@ int hn_rndis_conf_offload(struct hn_data *hv, goto unsupported; } - if (rx_offloads & DEV_RX_OFFLOAD_TCP_CKSUM) { + if (rx_offloads & RTE_ETH_RX_OFFLOAD_TCP_CKSUM) { if ((hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_TCP4) == NDIS_RXCSUM_CAP_TCP4) params.ndis_tcp4csum |= NDIS_OFFLOAD_PARAM_RX; @@ -794,7 +826,7 @@ int hn_rndis_conf_offload(struct hn_data *hv, goto unsupported; } - if (tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) { + if (tx_offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) { if (hwcaps.ndis_csum.ndis_ip4_txcsum & NDIS_TXCSUM_CAP_UDP4) params.ndis_udp4csum = NDIS_OFFLOAD_PARAM_TX; else @@ -807,7 +839,7 @@ int hn_rndis_conf_offload(struct hn_data *hv, goto unsupported; } - if (rx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM) { + if (rx_offloads & RTE_ETH_TX_OFFLOAD_UDP_CKSUM) { if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_UDP4) params.ndis_udp4csum |= NDIS_OFFLOAD_PARAM_RX; else @@ -819,21 +851,21 @@ int hn_rndis_conf_offload(struct hn_data *hv, goto unsupported; } - if (tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) { + if (tx_offloads & RTE_ETH_TX_OFFLOAD_IPV4_CKSUM) { if ((hwcaps.ndis_csum.ndis_ip4_txcsum & NDIS_TXCSUM_CAP_IP4) == NDIS_TXCSUM_CAP_IP4) params.ndis_ip4csum = NDIS_OFFLOAD_PARAM_TX; else goto unsupported; } - if (rx_offloads & DEV_RX_OFFLOAD_IPV4_CKSUM) { + if (rx_offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) { if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_IP4) params.ndis_ip4csum |= NDIS_OFFLOAD_PARAM_RX; else goto unsupported; } - if (tx_offloads & DEV_TX_OFFLOAD_TCP_TSO) { + if (tx_offloads & RTE_ETH_TX_OFFLOAD_TCP_TSO) { if (hwcaps.ndis_lsov2.ndis_ip4_encap & NDIS_OFFLOAD_ENCAP_8023) params.ndis_lsov2_ip4 = NDIS_OFFLOAD_LSOV2_ON; else @@ -875,41 +907,41 @@ int hn_rndis_get_offload(struct hn_data *hv, return error; } - dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS | - DEV_TX_OFFLOAD_VLAN_INSERT; + dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS | + RTE_ETH_TX_OFFLOAD_VLAN_INSERT; if ((hwcaps.ndis_csum.ndis_ip4_txcsum & HN_NDIS_TXCSUM_CAP_IP4) == HN_NDIS_TXCSUM_CAP_IP4) - dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_IPV4_CKSUM; + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_IPV4_CKSUM; if ((hwcaps.ndis_csum.ndis_ip4_txcsum & HN_NDIS_TXCSUM_CAP_TCP4) == HN_NDIS_TXCSUM_CAP_TCP4 && (hwcaps.ndis_csum.ndis_ip6_txcsum & HN_NDIS_TXCSUM_CAP_TCP6) == HN_NDIS_TXCSUM_CAP_TCP6) - dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_CKSUM; + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_TCP_CKSUM; if ((hwcaps.ndis_csum.ndis_ip4_txcsum & NDIS_TXCSUM_CAP_UDP4) && (hwcaps.ndis_csum.ndis_ip6_txcsum & NDIS_TXCSUM_CAP_UDP6)) - dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_UDP_CKSUM; + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_UDP_CKSUM; if ((hwcaps.ndis_lsov2.ndis_ip4_encap & NDIS_OFFLOAD_ENCAP_8023) && (hwcaps.ndis_lsov2.ndis_ip6_opts & HN_NDIS_LSOV2_CAP_IP6) == HN_NDIS_LSOV2_CAP_IP6) - dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO; + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_TCP_TSO; - dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP | - DEV_RX_OFFLOAD_RSS_HASH; + dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP | + RTE_ETH_RX_OFFLOAD_RSS_HASH; if (hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_IP4) - dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_IPV4_CKSUM; + dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_IPV4_CKSUM; if ((hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_TCP4) && (hwcaps.ndis_csum.ndis_ip6_rxcsum & NDIS_RXCSUM_CAP_TCP6)) - dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_TCP_CKSUM; + dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TCP_CKSUM; if ((hwcaps.ndis_csum.ndis_ip4_rxcsum & NDIS_RXCSUM_CAP_UDP4) && (hwcaps.ndis_csum.ndis_ip6_rxcsum & NDIS_RXCSUM_CAP_UDP6)) - dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_UDP_CKSUM; + dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM; return 0; } @@ -1004,7 +1036,7 @@ static int hn_rndis_init(struct hn_data *hv) uint32_t comp_len, rid; int error; - req = hn_rndis_alloc(hv, sizeof(*req)); + req = hn_rndis_alloc(sizeof(*req)); if (!req) { PMD_DRV_LOG(ERR, "no memory for RNDIS init"); return -ENXIO; @@ -1072,7 +1104,7 @@ hn_rndis_get_eaddr(struct hn_data *hv, uint8_t *eaddr) if (error) return error; - PMD_DRV_LOG(INFO, "MAC address %02x:%02x:%02x:%02x:%02x:%02x", + PMD_DRV_LOG(INFO, "MAC address " RTE_ETHER_ADDR_PRT_FMT, eaddr[0], eaddr[1], eaddr[2], eaddr[3], eaddr[4], eaddr[5]); return 0; @@ -1102,6 +1134,10 @@ hn_rndis_attach(struct hn_data *hv) void hn_rndis_detach(struct hn_data *hv) { + struct rte_eth_dev *dev = &rte_eth_devices[hv->port_id]; + + rte_eal_alarm_cancel(hn_rndis_link_alarm, dev); + /* Halt the RNDIS. */ hn_rndis_halt(hv); }