Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * Copyright Gavin Shan, IBM Corporation 2016.
  4 */
  5
  6#ifndef __NCSI_INTERNAL_H__
  7#define __NCSI_INTERNAL_H__
  8
  9enum {
 10	NCSI_CAP_BASE		= 0,
 11	NCSI_CAP_GENERIC	= 0,
 12	NCSI_CAP_BC,
 13	NCSI_CAP_MC,
 14	NCSI_CAP_BUFFER,
 15	NCSI_CAP_AEN,
 16	NCSI_CAP_VLAN,
 17	NCSI_CAP_MAX
 18};
 19
 20enum {
 21	NCSI_CAP_GENERIC_HWA             = 0x01, /* HW arbitration           */
 22	NCSI_CAP_GENERIC_HDS             = 0x02, /* HNC driver status change */
 23	NCSI_CAP_GENERIC_FC              = 0x04, /* HNC to MC flow control   */
 24	NCSI_CAP_GENERIC_FC1             = 0x08, /* MC to HNC flow control   */
 25	NCSI_CAP_GENERIC_MC              = 0x10, /* Global MC filtering      */
 26	NCSI_CAP_GENERIC_HWA_UNKNOWN     = 0x00, /* Unknown HW arbitration   */
 27	NCSI_CAP_GENERIC_HWA_SUPPORT     = 0x20, /* Supported HW arbitration */
 28	NCSI_CAP_GENERIC_HWA_NOT_SUPPORT = 0x40, /* No HW arbitration        */
 29	NCSI_CAP_GENERIC_HWA_RESERVED    = 0x60, /* Reserved HW arbitration  */
 30	NCSI_CAP_GENERIC_HWA_MASK        = 0x60, /* Mask for HW arbitration  */
 31	NCSI_CAP_GENERIC_MASK            = 0x7f,
 32	NCSI_CAP_BC_ARP                  = 0x01, /* ARP packet filtering     */
 33	NCSI_CAP_BC_DHCPC                = 0x02, /* DHCP client filtering    */
 34	NCSI_CAP_BC_DHCPS                = 0x04, /* DHCP server filtering    */
 35	NCSI_CAP_BC_NETBIOS              = 0x08, /* NetBIOS packet filtering */
 36	NCSI_CAP_BC_MASK                 = 0x0f,
 37	NCSI_CAP_MC_IPV6_NEIGHBOR        = 0x01, /* IPv6 neighbor filtering  */
 38	NCSI_CAP_MC_IPV6_ROUTER          = 0x02, /* IPv6 router filering     */
 39	NCSI_CAP_MC_DHCPV6_RELAY         = 0x04, /* DHCPv6 relay / server MC */
 40	NCSI_CAP_MC_DHCPV6_WELL_KNOWN    = 0x08, /* DHCPv6 well-known MC     */
 41	NCSI_CAP_MC_IPV6_MLD             = 0x10, /* IPv6 MLD filtering       */
 42	NCSI_CAP_MC_IPV6_NEIGHBOR_S      = 0x20, /* IPv6 neighbour filtering */
 43	NCSI_CAP_MC_MASK                 = 0x3f,
 44	NCSI_CAP_AEN_LSC                 = 0x01, /* Link status change       */
 45	NCSI_CAP_AEN_CR                  = 0x02, /* Configuration required   */
 46	NCSI_CAP_AEN_HDS                 = 0x04, /* HNC driver status        */
 47	NCSI_CAP_AEN_MASK                = 0x07,
 48	NCSI_CAP_VLAN_ONLY               = 0x01, /* Filter VLAN packet only  */
 49	NCSI_CAP_VLAN_NO                 = 0x02, /* Filter VLAN and non-VLAN */
 50	NCSI_CAP_VLAN_ANY                = 0x04, /* Filter Any-and-non-VLAN  */
 51	NCSI_CAP_VLAN_MASK               = 0x07
 52};
 53
 54enum {
 55	NCSI_MODE_BASE		= 0,
 56	NCSI_MODE_ENABLE	= 0,
 57	NCSI_MODE_TX_ENABLE,
 58	NCSI_MODE_LINK,
 59	NCSI_MODE_VLAN,
 60	NCSI_MODE_BC,
 61	NCSI_MODE_MC,
 62	NCSI_MODE_AEN,
 63	NCSI_MODE_FC,
 64	NCSI_MODE_MAX
 65};
 66
 67/* OEM Vendor Manufacture ID */
 68#define NCSI_OEM_MFR_MLX_ID             0x8119
 69#define NCSI_OEM_MFR_BCM_ID             0x113d
 70/* Broadcom specific OEM Command */
 71#define NCSI_OEM_BCM_CMD_GMA            0x01   /* CMD ID for Get MAC */
 72/* Mellanox specific OEM Command */
 73#define NCSI_OEM_MLX_CMD_GMA            0x00   /* CMD ID for Get MAC */
 74#define NCSI_OEM_MLX_CMD_GMA_PARAM      0x1b   /* Parameter for GMA  */
 75/* OEM Command payload lengths*/
 76#define NCSI_OEM_BCM_CMD_GMA_LEN        12
 77#define NCSI_OEM_MLX_CMD_GMA_LEN        8
 78/* Mac address offset in OEM response */
 79#define BCM_MAC_ADDR_OFFSET             28
 80#define MLX_MAC_ADDR_OFFSET             8
 81
 82
 83struct ncsi_channel_version {
 84	u32 version;		/* Supported BCD encoded NCSI version */
 85	u32 alpha2;		/* Supported BCD encoded NCSI version */
 86	u8  fw_name[12];	/* Firware name string                */
 87	u32 fw_version;		/* Firmware version                   */
 88	u16 pci_ids[4];		/* PCI identification                 */
 89	u32 mf_id;		/* Manufacture ID                     */
 90};
 91
 92struct ncsi_channel_cap {
 93	u32 index;	/* Index of channel capabilities */
 94	u32 cap;	/* NCSI channel capability       */
 95};
 96
 97struct ncsi_channel_mode {
 98	u32 index;	/* Index of channel modes      */
 99	u32 enable;	/* Enabled or disabled         */
100	u32 size;	/* Valid entries in ncm_data[] */
101	u32 data[8];	/* Data entries                */
102};
103
104struct ncsi_channel_mac_filter {
105	u8	n_uc;
106	u8	n_mc;
107	u8	n_mixed;
108	u64	bitmap;
109	unsigned char	*addrs;
110};
111
112struct ncsi_channel_vlan_filter {
113	u8	n_vids;
114	u64	bitmap;
115	u16	*vids;
116};
117
118struct ncsi_channel_stats {
119	u32 hnc_cnt_hi;		/* Counter cleared            */
120	u32 hnc_cnt_lo;		/* Counter cleared            */
121	u32 hnc_rx_bytes;	/* Rx bytes                   */
122	u32 hnc_tx_bytes;	/* Tx bytes                   */
123	u32 hnc_rx_uc_pkts;	/* Rx UC packets              */
124	u32 hnc_rx_mc_pkts;     /* Rx MC packets              */
125	u32 hnc_rx_bc_pkts;	/* Rx BC packets              */
126	u32 hnc_tx_uc_pkts;	/* Tx UC packets              */
127	u32 hnc_tx_mc_pkts;	/* Tx MC packets              */
128	u32 hnc_tx_bc_pkts;	/* Tx BC packets              */
129	u32 hnc_fcs_err;	/* FCS errors                 */
130	u32 hnc_align_err;	/* Alignment errors           */
131	u32 hnc_false_carrier;	/* False carrier detection    */
132	u32 hnc_runt_pkts;	/* Rx runt packets            */
133	u32 hnc_jabber_pkts;	/* Rx jabber packets          */
134	u32 hnc_rx_pause_xon;	/* Rx pause XON frames        */
135	u32 hnc_rx_pause_xoff;	/* Rx XOFF frames             */
136	u32 hnc_tx_pause_xon;	/* Tx XON frames              */
137	u32 hnc_tx_pause_xoff;	/* Tx XOFF frames             */
138	u32 hnc_tx_s_collision;	/* Single collision frames    */
139	u32 hnc_tx_m_collision;	/* Multiple collision frames  */
140	u32 hnc_l_collision;	/* Late collision frames      */
141	u32 hnc_e_collision;	/* Excessive collision frames */
142	u32 hnc_rx_ctl_frames;	/* Rx control frames          */
143	u32 hnc_rx_64_frames;	/* Rx 64-bytes frames         */
144	u32 hnc_rx_127_frames;	/* Rx 65-127 bytes frames     */
145	u32 hnc_rx_255_frames;	/* Rx 128-255 bytes frames    */
146	u32 hnc_rx_511_frames;	/* Rx 256-511 bytes frames    */
147	u32 hnc_rx_1023_frames;	/* Rx 512-1023 bytes frames   */
148	u32 hnc_rx_1522_frames;	/* Rx 1024-1522 bytes frames  */
149	u32 hnc_rx_9022_frames;	/* Rx 1523-9022 bytes frames  */
150	u32 hnc_tx_64_frames;	/* Tx 64-bytes frames         */
151	u32 hnc_tx_127_frames;	/* Tx 65-127 bytes frames     */
152	u32 hnc_tx_255_frames;	/* Tx 128-255 bytes frames    */
153	u32 hnc_tx_511_frames;	/* Tx 256-511 bytes frames    */
154	u32 hnc_tx_1023_frames;	/* Tx 512-1023 bytes frames   */
155	u32 hnc_tx_1522_frames;	/* Tx 1024-1522 bytes frames  */
156	u32 hnc_tx_9022_frames;	/* Tx 1523-9022 bytes frames  */
157	u32 hnc_rx_valid_bytes;	/* Rx valid bytes             */
158	u32 hnc_rx_runt_pkts;	/* Rx error runt packets      */
159	u32 hnc_rx_jabber_pkts;	/* Rx error jabber packets    */
160	u32 ncsi_rx_cmds;	/* Rx NCSI commands           */
161	u32 ncsi_dropped_cmds;	/* Dropped commands           */
162	u32 ncsi_cmd_type_errs;	/* Command type errors        */
163	u32 ncsi_cmd_csum_errs;	/* Command checksum errors    */
164	u32 ncsi_rx_pkts;	/* Rx NCSI packets            */
165	u32 ncsi_tx_pkts;	/* Tx NCSI packets            */
166	u32 ncsi_tx_aen_pkts;	/* Tx AEN packets             */
167	u32 pt_tx_pkts;		/* Tx packets                 */
168	u32 pt_tx_dropped;	/* Tx dropped packets         */
169	u32 pt_tx_channel_err;	/* Tx channel errors          */
170	u32 pt_tx_us_err;	/* Tx undersize errors        */
171	u32 pt_rx_pkts;		/* Rx packets                 */
172	u32 pt_rx_dropped;	/* Rx dropped packets         */
173	u32 pt_rx_channel_err;	/* Rx channel errors          */
174	u32 pt_rx_us_err;	/* Rx undersize errors        */
175	u32 pt_rx_os_err;	/* Rx oversize errors         */
176};
177
178struct ncsi_dev_priv;
179struct ncsi_package;
180
181#define NCSI_PACKAGE_SHIFT	5
182#define NCSI_PACKAGE_INDEX(c)	(((c) >> NCSI_PACKAGE_SHIFT) & 0x7)
183#define NCSI_RESERVED_CHANNEL	0x1f
184#define NCSI_CHANNEL_INDEX(c)	((c) & ((1 << NCSI_PACKAGE_SHIFT) - 1))
185#define NCSI_TO_CHANNEL(p, c)	(((p) << NCSI_PACKAGE_SHIFT) | (c))
186#define NCSI_MAX_PACKAGE	8
187#define NCSI_MAX_CHANNEL	32
188
189struct ncsi_channel {
190	unsigned char               id;
191	int                         state;
192#define NCSI_CHANNEL_INACTIVE		1
193#define NCSI_CHANNEL_ACTIVE		2
194#define NCSI_CHANNEL_INVISIBLE		3
195	bool                        reconfigure_needed;
196	spinlock_t                  lock;	/* Protect filters etc */
197	struct ncsi_package         *package;
198	struct ncsi_channel_version version;
199	struct ncsi_channel_cap	    caps[NCSI_CAP_MAX];
200	struct ncsi_channel_mode    modes[NCSI_MODE_MAX];
201	/* Filtering Settings */
202	struct ncsi_channel_mac_filter	mac_filter;
203	struct ncsi_channel_vlan_filter	vlan_filter;
204	struct ncsi_channel_stats   stats;
205	struct {
206		struct timer_list   timer;
207		bool                enabled;
208		unsigned int        state;
209#define NCSI_CHANNEL_MONITOR_START	0
210#define NCSI_CHANNEL_MONITOR_RETRY	1
211#define NCSI_CHANNEL_MONITOR_WAIT	2
212#define NCSI_CHANNEL_MONITOR_WAIT_MAX	5
213	} monitor;
214	struct list_head            node;
215	struct list_head            link;
216};
217
218struct ncsi_package {
219	unsigned char        id;          /* NCSI 3-bits package ID */
220	unsigned char        uuid[16];    /* UUID                   */
221	struct ncsi_dev_priv *ndp;        /* NCSI device            */
222	spinlock_t           lock;        /* Protect the package    */
223	unsigned int         channel_num; /* Number of channels     */
224	struct list_head     channels;    /* List of chanels        */
225	struct list_head     node;        /* Form list of packages  */
226
227	bool                 multi_channel; /* Enable multiple channels  */
228	u32                  channel_whitelist; /* Channels to configure */
229	struct ncsi_channel  *preferred_channel; /* Primary channel      */
230};
231
232struct ncsi_request {
233	unsigned char        id;      /* Request ID - 0 to 255           */
234	bool                 used;    /* Request that has been assigned  */
235	unsigned int         flags;   /* NCSI request property           */
236#define NCSI_REQ_FLAG_EVENT_DRIVEN	1
237#define NCSI_REQ_FLAG_NETLINK_DRIVEN	2
238	struct ncsi_dev_priv *ndp;    /* Associated NCSI device          */
239	struct sk_buff       *cmd;    /* Associated NCSI command packet  */
240	struct sk_buff       *rsp;    /* Associated NCSI response packet */
241	struct timer_list    timer;   /* Timer on waiting for response   */
242	bool                 enabled; /* Time has been enabled or not    */
243	u32                  snd_seq;     /* netlink sending sequence number */
244	u32                  snd_portid;  /* netlink portid of sender        */
245	struct nlmsghdr      nlhdr;       /* netlink message header          */
246};
247
248enum {
249	ncsi_dev_state_major		= 0xff00,
250	ncsi_dev_state_minor		= 0x00ff,
251	ncsi_dev_state_probe_deselect	= 0x0201,
252	ncsi_dev_state_probe_package,
253	ncsi_dev_state_probe_channel,
254	ncsi_dev_state_probe_cis,
255	ncsi_dev_state_probe_gvi,
256	ncsi_dev_state_probe_gc,
257	ncsi_dev_state_probe_gls,
258	ncsi_dev_state_probe_dp,
259	ncsi_dev_state_config_sp	= 0x0301,
260	ncsi_dev_state_config_cis,
261	ncsi_dev_state_config_oem_gma,
262	ncsi_dev_state_config_clear_vids,
263	ncsi_dev_state_config_svf,
264	ncsi_dev_state_config_ev,
265	ncsi_dev_state_config_sma,
266	ncsi_dev_state_config_ebf,
267	ncsi_dev_state_config_dgmf,
268	ncsi_dev_state_config_ecnt,
269	ncsi_dev_state_config_ec,
270	ncsi_dev_state_config_ae,
271	ncsi_dev_state_config_gls,
272	ncsi_dev_state_config_done,
273	ncsi_dev_state_suspend_select	= 0x0401,
274	ncsi_dev_state_suspend_gls,
275	ncsi_dev_state_suspend_dcnt,
276	ncsi_dev_state_suspend_dc,
277	ncsi_dev_state_suspend_deselect,
278	ncsi_dev_state_suspend_done
279};
280
281struct vlan_vid {
282	struct list_head list;
283	__be16 proto;
284	u16 vid;
285};
286
287struct ncsi_dev_priv {
288	struct ncsi_dev     ndev;            /* Associated NCSI device     */
289	unsigned int        flags;           /* NCSI device flags          */
290#define NCSI_DEV_PROBED		1            /* Finalized NCSI topology    */
291#define NCSI_DEV_HWA		2            /* Enabled HW arbitration     */
292#define NCSI_DEV_RESHUFFLE	4
293#define NCSI_DEV_RESET		8            /* Reset state of NC          */
294	unsigned int        gma_flag;        /* OEM GMA flag               */
295	spinlock_t          lock;            /* Protect the NCSI device    */
296	unsigned int        package_probe_id;/* Current ID during probe    */
297	unsigned int        package_num;     /* Number of packages         */
298	struct list_head    packages;        /* List of packages           */
299	struct ncsi_channel *hot_channel;    /* Channel was ever active    */
300	struct ncsi_request requests[256];   /* Request table              */
301	unsigned int        request_id;      /* Last used request ID       */
302#define NCSI_REQ_START_IDX	1
303	unsigned int        pending_req_num; /* Number of pending requests */
304	struct ncsi_package *active_package; /* Currently handled package  */
305	struct ncsi_channel *active_channel; /* Currently handled channel  */
306	struct list_head    channel_queue;   /* Config queue of channels   */
307	struct work_struct  work;            /* For channel management     */
308	struct packet_type  ptype;           /* NCSI packet Rx handler     */
309	struct list_head    node;            /* Form NCSI device list      */
310#define NCSI_MAX_VLAN_VIDS	15
311	struct list_head    vlan_vids;       /* List of active VLAN IDs */
312
313	bool                multi_package;   /* Enable multiple packages   */
314	u32                 package_whitelist; /* Packages to configure    */
315};
316
317struct ncsi_cmd_arg {
318	struct ncsi_dev_priv *ndp;        /* Associated NCSI device        */
319	unsigned char        type;        /* Command in the NCSI packet    */
320	unsigned char        id;          /* Request ID (sequence number)  */
321	unsigned char        package;     /* Destination package ID        */
322	unsigned char        channel;     /* Detination channel ID or 0x1f */
323	unsigned short       payload;     /* Command packet payload length */
324	unsigned int         req_flags;   /* NCSI request properties       */
325	union {
326		unsigned char  bytes[16]; /* Command packet specific data  */
327		unsigned short words[8];
328		unsigned int   dwords[4];
329	};
330	unsigned char        *data;       /* NCSI OEM data                 */
331	struct genl_info     *info;       /* Netlink information           */
332};
333
334extern struct list_head ncsi_dev_list;
335extern spinlock_t ncsi_dev_lock;
336
337#define TO_NCSI_DEV_PRIV(nd) \
338	container_of(nd, struct ncsi_dev_priv, ndev)
339#define NCSI_FOR_EACH_DEV(ndp) \
340	list_for_each_entry_rcu(ndp, &ncsi_dev_list, node)
341#define NCSI_FOR_EACH_PACKAGE(ndp, np) \
342	list_for_each_entry_rcu(np, &ndp->packages, node)
343#define NCSI_FOR_EACH_CHANNEL(np, nc) \
344	list_for_each_entry_rcu(nc, &np->channels, node)
345
346/* Resources */
347int ncsi_reset_dev(struct ncsi_dev *nd);
348void ncsi_start_channel_monitor(struct ncsi_channel *nc);
349void ncsi_stop_channel_monitor(struct ncsi_channel *nc);
350struct ncsi_channel *ncsi_find_channel(struct ncsi_package *np,
351				       unsigned char id);
352struct ncsi_channel *ncsi_add_channel(struct ncsi_package *np,
353				      unsigned char id);
354struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp,
355				       unsigned char id);
356struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp,
357				      unsigned char id);
358void ncsi_remove_package(struct ncsi_package *np);
359void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp,
360				   unsigned char id,
361				   struct ncsi_package **np,
362				   struct ncsi_channel **nc);
363struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp,
364					unsigned int req_flags);
365void ncsi_free_request(struct ncsi_request *nr);
366struct ncsi_dev *ncsi_find_dev(struct net_device *dev);
367int ncsi_process_next_channel(struct ncsi_dev_priv *ndp);
368bool ncsi_channel_has_link(struct ncsi_channel *channel);
369bool ncsi_channel_is_last(struct ncsi_dev_priv *ndp,
370			  struct ncsi_channel *channel);
371int ncsi_update_tx_channel(struct ncsi_dev_priv *ndp,
372			   struct ncsi_package *np,
373			   struct ncsi_channel *disable,
374			   struct ncsi_channel *enable);
375
376/* Packet handlers */
377u32 ncsi_calculate_checksum(unsigned char *data, int len);
378int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca);
379int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev,
380		 struct packet_type *pt, struct net_device *orig_dev);
381int ncsi_aen_handler(struct ncsi_dev_priv *ndp, struct sk_buff *skb);
382
383#endif /* __NCSI_INTERNAL_H__ */