]> Git Repo - J-linux.git/blob - drivers/net/ethernet/freescale/fman/fman_mac.h
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / net / ethernet / freescale / fman / fman_mac.h
1 /*
2  * Copyright 2008-2015 Freescale Semiconductor Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 /* FM MAC ... */
34 #ifndef __FM_MAC_H
35 #define __FM_MAC_H
36
37 #include "fman.h"
38
39 #include <linux/slab.h>
40 #include <linux/phy.h>
41 #include <linux/if_ether.h>
42
43 struct fman_mac;
44 struct mac_device;
45
46 /* Ethernet Address */
47 typedef u8 enet_addr_t[ETH_ALEN];
48
49 #define ENET_ADDR_TO_UINT64(_enet_addr)         \
50         (u64)(((u64)(_enet_addr)[0] << 40) |            \
51               ((u64)(_enet_addr)[1] << 32) |            \
52               ((u64)(_enet_addr)[2] << 24) |            \
53               ((u64)(_enet_addr)[3] << 16) |            \
54               ((u64)(_enet_addr)[4] << 8) |             \
55               ((u64)(_enet_addr)[5]))
56
57 #define MAKE_ENET_ADDR_FROM_UINT64(_addr64, _enet_addr) \
58         do { \
59                 int i; \
60                 for (i = 0; i < ETH_ALEN; i++) \
61                         (_enet_addr)[i] = \
62                         (u8)((_addr64) >> ((5 - i) * 8)); \
63         } while (0)
64
65 /* defaults */
66 #define DEFAULT_RESET_ON_INIT                 false
67
68 /* PFC defines */
69 #define FSL_FM_PAUSE_TIME_ENABLE        0xf000
70 #define FSL_FM_PAUSE_TIME_DISABLE       0
71 #define FSL_FM_PAUSE_THRESH_DEFAULT     0
72
73 #define FM_MAC_NO_PFC   0xff
74
75 /* HASH defines */
76 #define ETH_HASH_ENTRY_OBJ(ptr) \
77         hlist_entry_safe(ptr, struct eth_hash_entry, node)
78
79 /* FM MAC Exceptions */
80 enum fman_mac_exceptions {
81         FM_MAC_EX_10G_MDIO_SCAN_EVENT = 0
82         /* 10GEC MDIO scan event interrupt */
83         , FM_MAC_EX_10G_MDIO_CMD_CMPL
84         /* 10GEC MDIO command completion interrupt */
85         , FM_MAC_EX_10G_REM_FAULT
86         /* 10GEC, mEMAC Remote fault interrupt */
87         , FM_MAC_EX_10G_LOC_FAULT
88         /* 10GEC, mEMAC Local fault interrupt */
89         , FM_MAC_EX_10G_TX_ECC_ER
90         /* 10GEC, mEMAC Transmit frame ECC error interrupt */
91         , FM_MAC_EX_10G_TX_FIFO_UNFL
92         /* 10GEC, mEMAC Transmit FIFO underflow interrupt */
93         , FM_MAC_EX_10G_TX_FIFO_OVFL
94         /* 10GEC, mEMAC Transmit FIFO overflow interrupt */
95         , FM_MAC_EX_10G_TX_ER
96         /* 10GEC Transmit frame error interrupt */
97         , FM_MAC_EX_10G_RX_FIFO_OVFL
98         /* 10GEC, mEMAC Receive FIFO overflow interrupt */
99         , FM_MAC_EX_10G_RX_ECC_ER
100         /* 10GEC, mEMAC Receive frame ECC error interrupt */
101         , FM_MAC_EX_10G_RX_JAB_FRM
102         /* 10GEC Receive jabber frame interrupt */
103         , FM_MAC_EX_10G_RX_OVRSZ_FRM
104         /* 10GEC Receive oversized frame interrupt */
105         , FM_MAC_EX_10G_RX_RUNT_FRM
106         /* 10GEC Receive runt frame interrupt */
107         , FM_MAC_EX_10G_RX_FRAG_FRM
108         /* 10GEC Receive fragment frame interrupt */
109         , FM_MAC_EX_10G_RX_LEN_ER
110         /* 10GEC Receive payload length error interrupt */
111         , FM_MAC_EX_10G_RX_CRC_ER
112         /* 10GEC Receive CRC error interrupt */
113         , FM_MAC_EX_10G_RX_ALIGN_ER
114         /* 10GEC Receive alignment error interrupt */
115         , FM_MAC_EX_1G_BAB_RX
116         /* dTSEC Babbling receive error */
117         , FM_MAC_EX_1G_RX_CTL
118         /* dTSEC Receive control (pause frame) interrupt */
119         , FM_MAC_EX_1G_GRATEFUL_TX_STP_COMPLET
120         /* dTSEC Graceful transmit stop complete */
121         , FM_MAC_EX_1G_BAB_TX
122         /* dTSEC Babbling transmit error */
123         , FM_MAC_EX_1G_TX_CTL
124         /* dTSEC Transmit control (pause frame) interrupt */
125         , FM_MAC_EX_1G_TX_ERR
126         /* dTSEC Transmit error */
127         , FM_MAC_EX_1G_LATE_COL
128         /* dTSEC Late collision */
129         , FM_MAC_EX_1G_COL_RET_LMT
130         /* dTSEC Collision retry limit */
131         , FM_MAC_EX_1G_TX_FIFO_UNDRN
132         /* dTSEC Transmit FIFO underrun */
133         , FM_MAC_EX_1G_MAG_PCKT
134         /* dTSEC Magic Packet detection */
135         , FM_MAC_EX_1G_MII_MNG_RD_COMPLET
136         /* dTSEC MII management read completion */
137         , FM_MAC_EX_1G_MII_MNG_WR_COMPLET
138         /* dTSEC MII management write completion */
139         , FM_MAC_EX_1G_GRATEFUL_RX_STP_COMPLET
140         /* dTSEC Graceful receive stop complete */
141         , FM_MAC_EX_1G_DATA_ERR
142         /* dTSEC Internal data error on transmit */
143         , FM_MAC_1G_RX_DATA_ERR
144         /* dTSEC Internal data error on receive */
145         , FM_MAC_EX_1G_1588_TS_RX_ERR
146         /* dTSEC Time-Stamp Receive Error */
147         , FM_MAC_EX_1G_RX_MIB_CNT_OVFL
148         /* dTSEC MIB counter overflow */
149         , FM_MAC_EX_TS_FIFO_ECC_ERR
150         /* mEMAC Time-stamp FIFO ECC error interrupt;
151          * not supported on T4240/B4860 rev1 chips
152          */
153         , FM_MAC_EX_MAGIC_PACKET_INDICATION = FM_MAC_EX_1G_MAG_PCKT
154         /* mEMAC Magic Packet Indication Interrupt */
155 };
156
157 struct eth_hash_entry {
158         u64 addr;               /* Ethernet Address  */
159         struct list_head node;
160 };
161
162 typedef void (fman_mac_exception_cb)(struct mac_device *dev_id,
163                                      enum fman_mac_exceptions exceptions);
164
165 /* FMan MAC config input */
166 struct fman_mac_params {
167         /* MAC ID; numbering of dTSEC and 1G-mEMAC:
168          * 0 - FM_MAX_NUM_OF_1G_MACS;
169          * numbering of 10G-MAC (TGEC) and 10G-mEMAC:
170          * 0 - FM_MAX_NUM_OF_10G_MACS
171          */
172         u8 mac_id;
173         /* A handle to the FM object this port related to */
174         void *fm;
175         fman_mac_exception_cb *event_cb;    /* MDIO Events Callback Routine */
176         fman_mac_exception_cb *exception_cb;/* Exception Callback Routine */
177 };
178
179 struct eth_hash_t {
180         u16 size;
181         struct list_head *lsts;
182 };
183
184 static inline struct eth_hash_entry
185 *dequeue_addr_from_hash_entry(struct list_head *addr_lst)
186 {
187         struct eth_hash_entry *hash_entry = NULL;
188
189         if (!list_empty(addr_lst)) {
190                 hash_entry = ETH_HASH_ENTRY_OBJ(addr_lst->next);
191                 list_del_init(&hash_entry->node);
192         }
193         return hash_entry;
194 }
195
196 static inline void free_hash_table(struct eth_hash_t *hash)
197 {
198         struct eth_hash_entry *hash_entry;
199         int i = 0;
200
201         if (hash) {
202                 if (hash->lsts) {
203                         for (i = 0; i < hash->size; i++) {
204                                 hash_entry =
205                                 dequeue_addr_from_hash_entry(&hash->lsts[i]);
206                                 while (hash_entry) {
207                                         kfree(hash_entry);
208                                         hash_entry =
209                                         dequeue_addr_from_hash_entry(&hash->
210                                                                      lsts[i]);
211                                 }
212                         }
213
214                         kfree(hash->lsts);
215                 }
216
217                 kfree(hash);
218         }
219 }
220
221 static inline struct eth_hash_t *alloc_hash_table(u16 size)
222 {
223         u32 i;
224         struct eth_hash_t *hash;
225
226         /* Allocate address hash table */
227         hash = kmalloc(sizeof(*hash), GFP_KERNEL);
228         if (!hash)
229                 return NULL;
230
231         hash->size = size;
232
233         hash->lsts = kmalloc_array(hash->size, sizeof(struct list_head),
234                                    GFP_KERNEL);
235         if (!hash->lsts) {
236                 kfree(hash);
237                 return NULL;
238         }
239
240         for (i = 0; i < hash->size; i++)
241                 INIT_LIST_HEAD(&hash->lsts[i]);
242
243         return hash;
244 }
245
246 #endif /* __FM_MAC_H */
This page took 0.041113 seconds and 4 git commands to generate.