Linux Audio

Check our new training course

Loading...
v3.5.6
  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	const char			*name;
288	struct list_head		node;
289	const struct vio_device_id	*id_table;
290	int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
291	int (*remove)(struct vio_dev *dev);
292	void (*shutdown)(struct vio_dev *dev);
293	unsigned long			driver_data;
294	struct device_driver		driver;
295};
296
297struct vio_version {
298	u16		major;
299	u16		minor;
300};
301
302struct vio_driver_state;
303struct vio_driver_ops {
304	int	(*send_attr)(struct vio_driver_state *vio);
305	int	(*handle_attr)(struct vio_driver_state *vio, void *pkt);
306	void	(*handshake_complete)(struct vio_driver_state *vio);
307};
308
309struct vio_completion {
310	struct completion	com;
311	int			err;
312	int			waiting_for;
313};
314
315struct vio_driver_state {
316	/* Protects VIO handshake and, optionally, driver private state.  */
317	spinlock_t		lock;
318
319	struct ldc_channel	*lp;
320
321	u32			_peer_sid;
322	u32			_local_sid;
323	struct vio_dring_state	drings[2];
324#define VIO_DRIVER_TX_RING	0
325#define VIO_DRIVER_RX_RING	1
326
327	u8			hs_state;
328#define VIO_HS_INVALID		0x00
329#define VIO_HS_GOTVERS		0x01
330#define VIO_HS_GOT_ATTR		0x04
331#define VIO_HS_SENT_DREG	0x08
332#define VIO_HS_SENT_RDX		0x10
333#define VIO_HS_GOT_RDX_ACK	0x20
334#define VIO_HS_GOT_RDX		0x40
335#define VIO_HS_SENT_RDX_ACK	0x80
336#define VIO_HS_COMPLETE		(VIO_HS_GOT_RDX_ACK | VIO_HS_SENT_RDX_ACK)
337
338	u8			dev_class;
339
340	u8			dr_state;
341#define VIO_DR_STATE_TXREG	0x01
342#define VIO_DR_STATE_RXREG	0x02
343#define VIO_DR_STATE_TXREQ	0x10
344#define VIO_DR_STATE_RXREQ	0x20
345
346	u8			debug;
347#define VIO_DEBUG_HS		0x01
348#define VIO_DEBUG_DATA		0x02
349
350	void			*desc_buf;
351	unsigned int		desc_buf_len;
352
353	struct vio_completion	*cmp;
354
355	struct vio_dev		*vdev;
356
357	struct timer_list	timer;
358
359	struct vio_version	ver;
360
361	struct vio_version	*ver_table;
362	int			ver_table_entries;
363
364	char			*name;
365
366	struct vio_driver_ops	*ops;
367};
368
369#define viodbg(TYPE, f, a...) \
370do {	if (vio->debug & VIO_DEBUG_##TYPE) \
371		printk(KERN_INFO "vio: ID[%lu] " f, \
372		       vio->vdev->channel_id, ## a); \
373} while (0)
374
375extern int __vio_register_driver(struct vio_driver *drv, struct module *owner,
376				 const char *mod_name);
377/*
378 * vio_register_driver must be a macro so that KBUILD_MODNAME can be expanded
379 */
380#define vio_register_driver(driver)		\
381	__vio_register_driver(driver, THIS_MODULE, KBUILD_MODNAME)
382extern void vio_unregister_driver(struct vio_driver *drv);
383
384static inline struct vio_driver *to_vio_driver(struct device_driver *drv)
385{
386	return container_of(drv, struct vio_driver, driver);
387}
388
389static inline struct vio_dev *to_vio_dev(struct device *dev)
390{
391	return container_of(dev, struct vio_dev, dev);
392}
393
394extern int vio_ldc_send(struct vio_driver_state *vio, void *data, int len);
395extern void vio_link_state_change(struct vio_driver_state *vio, int event);
396extern void vio_conn_reset(struct vio_driver_state *vio);
397extern int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt);
398extern int vio_validate_sid(struct vio_driver_state *vio,
399			    struct vio_msg_tag *tp);
400extern u32 vio_send_sid(struct vio_driver_state *vio);
401extern int vio_ldc_alloc(struct vio_driver_state *vio,
402			 struct ldc_channel_config *base_cfg, void *event_arg);
403extern void vio_ldc_free(struct vio_driver_state *vio);
404extern int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
405			   u8 dev_class, struct vio_version *ver_table,
406			   int ver_table_size, struct vio_driver_ops *ops,
407			   char *name);
408
409extern void vio_port_up(struct vio_driver_state *vio);
410
411#endif /* _SPARC64_VIO_H */
v3.1
  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 */