1 | /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ |
2 | /* |
3 | * Copyright(c) 2020 Intel Corporation. |
4 | * |
5 | */ |
6 | |
7 | #ifndef HFI1_NETDEV_H |
8 | #define HFI1_NETDEV_H |
9 | |
10 | #include "hfi.h" |
11 | |
12 | #include <linux/netdevice.h> |
13 | #include <linux/xarray.h> |
14 | |
15 | /** |
16 | * struct hfi1_netdev_rxq - Receive Queue for HFI |
17 | * Both IPoIB and VNIC netdevices will be working on the rx abstraction. |
18 | * @napi: napi object |
19 | * @rx: ptr to netdev_rx |
20 | * @rcd: ptr to receive context data |
21 | */ |
22 | struct hfi1_netdev_rxq { |
23 | struct napi_struct napi; |
24 | struct hfi1_netdev_rx *rx; |
25 | struct hfi1_ctxtdata *rcd; |
26 | }; |
27 | |
28 | /* |
29 | * Number of netdev contexts used. Ensure it is less than or equal to |
30 | * max queues supported by VNIC (HFI1_VNIC_MAX_QUEUE). |
31 | */ |
32 | #define HFI1_MAX_NETDEV_CTXTS 8 |
33 | |
34 | /* Number of NETDEV RSM entries */ |
35 | #define NUM_NETDEV_MAP_ENTRIES HFI1_MAX_NETDEV_CTXTS |
36 | |
37 | /** |
38 | * struct hfi1_netdev_rx: data required to setup and run HFI netdev. |
39 | * @rx_napi: the dummy netdevice to support "polling" the receive contexts |
40 | * @dd: hfi1_devdata |
41 | * @rxq: pointer to dummy netdev receive queues. |
42 | * @num_rx_q: number of receive queues |
43 | * @rmt_index: first free index in RMT Array |
44 | * @msix_start: first free MSI-X interrupt vector. |
45 | * @dev_tbl: netdev table for unique identifier VNIC and IPoIb VLANs. |
46 | * @enabled: atomic counter of netdevs enabling receive queues. |
47 | * When 0 NAPI will be disabled. |
48 | * @netdevs: atomic counter of netdevs using dummy netdev. |
49 | * When 0 receive queues will be freed. |
50 | */ |
51 | struct hfi1_netdev_rx { |
52 | struct net_device rx_napi; |
53 | struct hfi1_devdata *dd; |
54 | struct hfi1_netdev_rxq *rxq; |
55 | int num_rx_q; |
56 | int rmt_start; |
57 | struct xarray dev_tbl; |
58 | /* count of enabled napi polls */ |
59 | atomic_t enabled; |
60 | /* count of netdevs on top */ |
61 | atomic_t netdevs; |
62 | }; |
63 | |
64 | static inline |
65 | int hfi1_netdev_ctxt_count(struct hfi1_devdata *dd) |
66 | { |
67 | return dd->netdev_rx->num_rx_q; |
68 | } |
69 | |
70 | static inline |
71 | struct hfi1_ctxtdata *hfi1_netdev_get_ctxt(struct hfi1_devdata *dd, int ctxt) |
72 | { |
73 | return dd->netdev_rx->rxq[ctxt].rcd; |
74 | } |
75 | |
76 | static inline |
77 | int hfi1_netdev_get_free_rmt_idx(struct hfi1_devdata *dd) |
78 | { |
79 | return dd->netdev_rx->rmt_start; |
80 | } |
81 | |
82 | static inline |
83 | void hfi1_netdev_set_free_rmt_idx(struct hfi1_devdata *dd, int rmt_idx) |
84 | { |
85 | dd->netdev_rx->rmt_start = rmt_idx; |
86 | } |
87 | |
88 | u32 hfi1_num_netdev_contexts(struct hfi1_devdata *dd, u32 available_contexts, |
89 | struct cpumask *cpu_mask); |
90 | |
91 | void hfi1_netdev_enable_queues(struct hfi1_devdata *dd); |
92 | void hfi1_netdev_disable_queues(struct hfi1_devdata *dd); |
93 | int hfi1_netdev_rx_init(struct hfi1_devdata *dd); |
94 | int hfi1_netdev_rx_destroy(struct hfi1_devdata *dd); |
95 | int hfi1_alloc_rx(struct hfi1_devdata *dd); |
96 | void hfi1_free_rx(struct hfi1_devdata *dd); |
97 | int hfi1_netdev_add_data(struct hfi1_devdata *dd, int id, void *data); |
98 | void *hfi1_netdev_remove_data(struct hfi1_devdata *dd, int id); |
99 | void *hfi1_netdev_get_data(struct hfi1_devdata *dd, int id); |
100 | void *hfi1_netdev_get_first_data(struct hfi1_devdata *dd, int *start_id); |
101 | |
102 | /* chip.c */ |
103 | int hfi1_netdev_rx_napi(struct napi_struct *napi, int budget); |
104 | |
105 | #endif /* HFI1_NETDEV_H */ |
106 | |