1/*
2 * Copyright 2009, Colin G��nther, coling@gmx.de. All Rights Reserved.
3 * Copyright 2007, Axel D��rfler, axeld@pinc-software.de. All Rights Reserved.
4 * Copyright 2007, Hugo Santos. All Rights Reserved.
5 * Copyright 2004, Marcus Overhagen. All Rights Reserved.
6 * Distributed under the terms of the MIT License.
7 */
8#ifndef DEVICE_H
9#define DEVICE_H
10
11
12#include <stdint.h>
13#include <stdio.h>
14
15#include <KernelExport.h>
16#include <drivers/PCI.h>
17
18#include <util/list.h>
19
20#include <net_stack.h>
21
22#include <compat/sys/kernel.h>
23#include <compat/net/if.h>
24
25#include "shared.h"
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31struct root_device_softc {
32	enum {
33		BUS_INVALID = 0,
34		BUS_pci,
35		BUS_uhub,
36	} bus;
37
38	struct pci_info	pci_info;
39	bool			is_msi;
40	bool			is_msix;
41
42	struct freebsd_usb_device* usb_dev;
43};
44
45enum {
46	DEVICE_OPEN			= 1 << 0,
47	DEVICE_CLOSED		= 1 << 1,
48	DEVICE_NON_BLOCK	= 1 << 2,
49	DEVICE_DESC_ALLOCED	= 1 << 3,
50	DEVICE_ATTACHED		= 1 << 4,
51	DEVICE_SOFTC_SET	= 1 << 5  // Set through device_set_softc().
52};
53
54
55extern struct net_stack_module_info *gStack;
56extern pci_module_info *gPci;
57extern struct pci_x86_module_info *gPCIx86;
58
59
60static inline void
61__unimplemented(const char *method)
62{
63	char msg[128];
64	snprintf(msg, sizeof(msg), "fbsd compat, unimplemented: %s", method);
65	panic(msg);
66}
67
68#define UNIMPLEMENTED() __unimplemented(__FUNCTION__)
69
70status_t init_mbufs(void);
71void uninit_mbufs(void);
72
73status_t init_mutexes(void);
74void uninit_mutexes(void);
75
76status_t init_taskqueues(void);
77void uninit_taskqueues(void);
78
79status_t init_hard_clock(void);
80void uninit_hard_clock(void);
81
82status_t init_callout(void);
83void uninit_callout(void);
84
85status_t init_pci();
86void uninit_pci();
87
88status_t init_usb();
89void uninit_usb();
90
91status_t get_next_usb_device(uint32* cookie, struct freebsd_usb_device* result);
92status_t get_usb_device_attach_arg(struct freebsd_usb_device* device, struct usb_attach_arg* uaa);
93
94device_t find_root_device(int);
95pci_info* get_device_pci_info(device_t dev);
96
97void driver_printf(const char *format, ...)
98	__attribute__ ((format (__printf__, 1, 2)));
99int driver_vprintf(const char *format, va_list vl);
100
101void device_sprintf_name(device_t dev, const char *format, ...)
102	__attribute__ ((format (__printf__, 2, 3)));
103
104void ifq_init(struct ifqueue *, const char *);
105void ifq_uninit(struct ifqueue *);
106
107#ifdef __cplusplus
108}
109#endif
110
111#endif	/* DEVICE_H */
112