• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/sparc/include/asm/
1#ifndef _SPARC64_VIO_H
2#define _SPARC64_VIO_H
3
4#include <linux/kernel.h>
5#include <linux/device.h>
6#include <linux/mod_devicetable.h>
7#include <linux/timer.h>
8#include <linux/spinlock.h>
9#include <linux/completion.h>
10#include <linux/list.h>
11#include <linux/log2.h>
12
13#include <asm/ldc.h>
14#include <asm/mdesc.h>
15
16struct vio_msg_tag {
17	u8			type;
18#define VIO_TYPE_CTRL		0x01
19#define VIO_TYPE_DATA		0x02
20#define VIO_TYPE_ERR		0x04
21
22	u8			stype;
23#define VIO_SUBTYPE_INFO	0x01
24#define VIO_SUBTYPE_ACK		0x02
25#define VIO_SUBTYPE_NACK	0x04
26
27	u16			stype_env;
28#define VIO_VER_INFO		0x0001
29#define VIO_ATTR_INFO		0x0002
30#define VIO_DRING_REG		0x0003
31#define VIO_DRING_UNREG		0x0004
32#define VIO_RDX			0x0005
33#define VIO_PKT_DATA		0x0040
34#define VIO_DESC_DATA		0x0041
35#define VIO_DRING_DATA		0x0042
36#define VNET_MCAST_INFO		0x0101
37
38	u32		sid;
39};
40
41struct vio_rdx {
42	struct vio_msg_tag	tag;
43	u64			resv[6];
44};
45
46struct vio_ver_info {
47	struct vio_msg_tag	tag;
48	u16			major;
49	u16			minor;
50	u8			dev_class;
51#define VDEV_NETWORK		0x01
52#define VDEV_NETWORK_SWITCH	0x02
53#define VDEV_DISK		0x03
54#define VDEV_DISK_SERVER	0x04
55
56	u8			resv1[3];
57	u64			resv2[5];
58};
59
60struct vio_dring_register {
61	struct vio_msg_tag	tag;
62	u64			dring_ident;
63	u32			num_descr;
64	u32			descr_size;
65	u16			options;
66#define VIO_TX_DRING		0x0001
67#define VIO_RX_DRING		0x0002
68	u16			resv;
69	u32			num_cookies;
70	struct ldc_trans_cookie	cookies[0];
71};
72
73struct vio_dring_unregister {
74	struct vio_msg_tag	tag;
75	u64			dring_ident;
76	u64			resv[5];
77};
78
79/* Data transfer modes */
80#define VIO_PKT_MODE		0x01 /* Packet based transfer	*/
81#define VIO_DESC_MODE		0x02 /* In-band descriptors	*/
82#define VIO_DRING_MODE		0x03 /* Descriptor rings	*/
83
84struct vio_dring_data {
85	struct vio_msg_tag	tag;
86	u64			seq;
87	u64			dring_ident;
88	u32			start_idx;
89	u32			end_idx;
90	u8			state;
91#define VIO_DRING_ACTIVE	0x01
92#define VIO_DRING_STOPPED	0x02
93
94	u8			__pad1;
95	u16			__pad2;
96	u32			__pad3;
97	u64			__par4[2];
98};
99
100struct vio_dring_hdr {
101	u8			state;
102#define VIO_DESC_FREE		0x01
103#define VIO_DESC_READY		0x02
104#define VIO_DESC_ACCEPTED	0x03
105#define VIO_DESC_DONE		0x04
106	u8			ack;
107#define VIO_ACK_ENABLE		0x01
108#define VIO_ACK_DISABLE		0x00
109
110	u16			__pad1;
111	u32			__pad2;
112};
113
114/* VIO disk specific structures and defines */
115struct vio_disk_attr_info {
116	struct vio_msg_tag	tag;
117	u8			xfer_mode;
118	u8			vdisk_type;
119#define VD_DISK_TYPE_SLICE	0x01 /* Slice in block device	*/
120#define VD_DISK_TYPE_DISK	0x02 /* Entire block device	*/
121	u16			resv1;
122	u32			vdisk_block_size;
123	u64			operations;
124	u64			vdisk_size;
125	u64			max_xfer_size;
126	u64			resv2[2];
127};
128
129struct vio_disk_desc {
130	struct vio_dring_hdr	hdr;
131	u64			req_id;
132	u8			operation;
133#define VD_OP_BREAD		0x01 /* Block read			*/
134#define VD_OP_BWRITE		0x02 /* Block write			*/
135#define VD_OP_FLUSH		0x03 /* Flush disk contents		*/
136#define VD_OP_GET_WCE		0x04 /* Get write-cache status		*/
137#define VD_OP_SET_WCE		0x05 /* Enable/disable write-cache	*/
138#define VD_OP_GET_VTOC		0x06 /* Get VTOC			*/
139#define VD_OP_SET_VTOC		0x07 /* Set VTOC			*/
140#define VD_OP_GET_DISKGEOM	0x08 /* Get disk geometry		*/
141#define VD_OP_SET_DISKGEOM	0x09 /* Set disk geometry		*/
142#define VD_OP_SCSICMD		0x0a /* SCSI control command		*/
143#define VD_OP_GET_DEVID		0x0b /* Get device ID			*/
144#define VD_OP_GET_EFI		0x0c /* Get EFI				*/
145#define VD_OP_SET_EFI		0x0d /* Set EFI				*/
146	u8			slice;
147	u16			resv1;
148	u32			status;
149	u64			offset;
150	u64			size;
151	u32			ncookies;
152	u32			resv2;
153	struct ldc_trans_cookie	cookies[0];
154};
155
156#define VIO_DISK_VNAME_LEN	8
157#define VIO_DISK_ALABEL_LEN	128
158#define VIO_DISK_NUM_PART	8
159
160struct vio_disk_vtoc {
161	u8			volume_name[VIO_DISK_VNAME_LEN];
162	u16			sector_size;
163	u16			num_partitions;
164	u8			ascii_label[VIO_DISK_ALABEL_LEN];
165	struct {
166		u16		id;
167		u16		perm_flags;
168		u32		resv;
169		u64		start_block;
170		u64		num_blocks;
171	} partitions[VIO_DISK_NUM_PART];
172};
173
174struct vio_disk_geom {
175	u16			num_cyl; /* Num data cylinders		*/
176	u16			alt_cyl; /* Num alternate cylinders	*/
177	u16			beg_cyl; /* Cyl off of fixed head area	*/
178	u16			num_hd;  /* Num heads			*/
179	u16			num_sec; /* Num sectors			*/
180	u16			ifact;   /* Interleave factor		*/
181	u16			apc;     /* Alts per cylinder (SCSI)	*/
182	u16			rpm;	 /* Revolutions per minute	*/
183	u16			phy_cyl; /* Num physical cylinders	*/
184	u16			wr_skip; /* Num sects to skip, writes	*/
185	u16			rd_skip; /* Num sects to skip, writes	*/
186};
187
188struct vio_disk_devid {
189	u16			resv;
190	u16			type;
191	u32			len;
192	char			id[0];
193};
194
195struct vio_disk_efi {
196	u64			lba;
197	u64			len;
198	char			data[0];
199};
200
201/* VIO net specific structures and defines */
202struct vio_net_attr_info {
203	struct vio_msg_tag	tag;
204	u8			xfer_mode;
205	u8			addr_type;
206#define VNET_ADDR_ETHERMAC	0x01
207	u16			ack_freq;
208	u32			resv1;
209	u64			addr;
210	u64			mtu;
211	u64			resv2[3];
212};
213
214#define VNET_NUM_MCAST		7
215
216struct vio_net_mcast_info {
217	struct vio_msg_tag	tag;
218	u8			set;
219	u8			count;
220	u8			mcast_addr[VNET_NUM_MCAST * 6];
221	u32			resv;
222};
223
224struct vio_net_desc {
225	struct vio_dring_hdr	hdr;
226	u32			size;
227	u32			ncookies;
228	struct ldc_trans_cookie	cookies[0];
229};
230
231#define VIO_MAX_RING_COOKIES	24
232
233struct vio_dring_state {
234	u64			ident;
235	void			*base;
236	u64			snd_nxt;
237	u64			rcv_nxt;
238	u32			entry_size;
239	u32			num_entries;
240	u32			prod;
241	u32			cons;
242	u32			pending;
243	int			ncookies;
244	struct ldc_trans_cookie	cookies[VIO_MAX_RING_COOKIES];
245};
246
247static inline void *vio_dring_cur(struct vio_dring_state *dr)
248{
249	return dr->base + (dr->entry_size * dr->prod);
250}
251
252static inline void *vio_dring_entry(struct vio_dring_state *dr,
253				    unsigned int index)
254{
255	return dr->base + (dr->entry_size * index);
256}
257
258static inline u32 vio_dring_avail(struct vio_dring_state *dr,
259				  unsigned int ring_size)
260{
261	return (dr->pending -
262		((dr->prod - dr->cons) & (ring_size - 1)));
263}
264
265#define VIO_MAX_TYPE_LEN	32
266#define VIO_MAX_COMPAT_LEN	64
267
268struct vio_dev {
269	u64			mp;
270	struct device_node	*dp;
271
272	char			type[VIO_MAX_TYPE_LEN];
273	char			compat[VIO_MAX_COMPAT_LEN];
274	int			compat_len;
275
276	u64			dev_no;
277
278	unsigned long		channel_id;
279
280	unsigned int		tx_irq;
281	unsigned int		rx_irq;
282
283	struct device		dev;
284};
285
286struct vio_driver {
287	struct list_head		node;
288	const struct vio_device_id	*id_table;
289	int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
290	int (*remove)(struct vio_dev *dev);
291	void (*shutdown)(struct vio_dev *dev);
292	unsigned long			driver_data;
293	struct device_driver		driver;
294};
295
296struct vio_version {
297	u16		major;
298	u16		minor;
299};
300
301struct vio_driver_state;
302struct vio_driver_ops {
303	int	(*send_attr)(struct vio_driver_state *vio);
304	int	(*handle_attr)(struct vio_driver_state *vio, void *pkt);
305	void	(*handshake_complete)(struct vio_driver_state *vio);
306};
307
308struct vio_completion {
309	struct completion	com;
310	int			err;
311	int			waiting_for;
312};
313
314struct vio_driver_state {
315	/* Protects VIO handshake and, optionally, driver private state.  */
316	spinlock_t		lock;
317
318	struct ldc_channel	*lp;
319
320	u32			_peer_sid;
321	u32			_local_sid;
322	struct vio_dring_state	drings[2];
323#define VIO_DRIVER_TX_RING	0
324#define VIO_DRIVER_RX_RING	1
325
326	u8			hs_state;
327#define VIO_HS_INVALID		0x00
328#define VIO_HS_GOTVERS		0x01
329#define VIO_HS_GOT_ATTR		0x04
330#define VIO_HS_SENT_DREG	0x08
331#define VIO_HS_SENT_RDX		0x10
332#define VIO_HS_GOT_RDX_ACK	0x20
333#define VIO_HS_GOT_RDX		0x40
334#define VIO_HS_SENT_RDX_ACK	0x80
335#define VIO_HS_COMPLETE		(VIO_HS_GOT_RDX_ACK | VIO_HS_SENT_RDX_ACK)
336
337	u8			dev_class;
338
339	u8			dr_state;
340#define VIO_DR_STATE_TXREG	0x01
341#define VIO_DR_STATE_RXREG	0x02
342#define VIO_DR_STATE_TXREQ	0x10
343#define VIO_DR_STATE_RXREQ	0x20
344
345	u8			debug;
346#define VIO_DEBUG_HS		0x01
347#define VIO_DEBUG_DATA		0x02
348
349	void			*desc_buf;
350	unsigned int		desc_buf_len;
351
352	struct vio_completion	*cmp;
353
354	struct vio_dev		*vdev;
355
356	struct timer_list	timer;
357
358	struct vio_version	ver;
359
360	struct vio_version	*ver_table;
361	int			ver_table_entries;
362
363	char			*name;
364
365	struct vio_driver_ops	*ops;
366};
367
368#define viodbg(TYPE, f, a...) \
369do {	if (vio->debug & VIO_DEBUG_##TYPE) \
370		printk(KERN_INFO "vio: ID[%lu] " f, \
371		       vio->vdev->channel_id, ## a); \
372} while (0)
373
374extern int vio_register_driver(struct vio_driver *drv);
375extern void vio_unregister_driver(struct vio_driver *drv);
376
377static inline struct vio_driver *to_vio_driver(struct device_driver *drv)
378{
379	return container_of(drv, struct vio_driver, driver);
380}
381
382static inline struct vio_dev *to_vio_dev(struct device *dev)
383{
384	return container_of(dev, struct vio_dev, dev);
385}
386
387extern int vio_ldc_send(struct vio_driver_state *vio, void *data, int len);
388extern void vio_link_state_change(struct vio_driver_state *vio, int event);
389extern void vio_conn_reset(struct vio_driver_state *vio);
390extern int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt);
391extern int vio_validate_sid(struct vio_driver_state *vio,
392			    struct vio_msg_tag *tp);
393extern u32 vio_send_sid(struct vio_driver_state *vio);
394extern int vio_ldc_alloc(struct vio_driver_state *vio,
395			 struct ldc_channel_config *base_cfg, void *event_arg);
396extern void vio_ldc_free(struct vio_driver_state *vio);
397extern int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
398			   u8 dev_class, struct vio_version *ver_table,
399			   int ver_table_size, struct vio_driver_ops *ops,
400			   char *name);
401
402extern void vio_port_up(struct vio_driver_state *vio);
403
404#endif /* _SPARC64_VIO_H */
405