xref: /haiku/src/add-ons/kernel/bus_managers/scsi/bus_raw.cpp (revision 4535495d80c86e19e2610e7444a4fcefe3e0f8e6)
1 /*
2  * Copyright 2002-04, Thomas Kurschel. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 //!	Devfs entry for raw bus access.
8 
9 
10 #include "scsi_internal.h"
11 
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 
16 #include <device/scsi_bus_raw_driver.h>
17 
18 
19 // info about bus
20 // (used both as bus cookie and file handle cookie)
21 typedef struct bus_raw_info {
22 	scsi_bus_interface *interface;
23 	scsi_bus cookie;
24 	device_node *node;
25 } bus_raw_info;
26 
27 
28 static status_t
scsi_bus_raw_init(void * driverCookie,void ** _cookie)29 scsi_bus_raw_init(void *driverCookie, void **_cookie)
30 {
31 	device_node *node = (device_node *)driverCookie;
32 	device_node *parent;
33 	bus_raw_info *bus;
34 
35 	bus = (bus_raw_info*)malloc(sizeof(*bus));
36 	if (bus == NULL)
37 		return B_NO_MEMORY;
38 
39 	parent = pnp->get_parent_node(node);
40 	pnp->get_driver(parent,
41 		(driver_module_info **)&bus->interface, (void **)&bus->cookie);
42 	pnp->put_node(parent);
43 
44 	bus->node = node;
45 
46 	*_cookie = bus;
47 	return B_OK;
48 }
49 
50 
51 static void
scsi_bus_raw_uninit(void * bus)52 scsi_bus_raw_uninit(void *bus)
53 {
54 	free(bus);
55 }
56 
57 
58 static status_t
scsi_bus_raw_open(void * bus,const char * path,int openMode,void ** handle_cookie)59 scsi_bus_raw_open(void *bus, const char *path, int openMode,
60 	void **handle_cookie)
61 {
62 	*handle_cookie = bus;
63 	return B_OK;
64 }
65 
66 
67 static status_t
scsi_bus_raw_close(void * cookie)68 scsi_bus_raw_close(void *cookie)
69 {
70 	return B_OK;
71 }
72 
73 
74 static status_t
scsi_bus_raw_free(void * cookie)75 scsi_bus_raw_free(void *cookie)
76 {
77 	return B_OK;
78 }
79 
80 
81 static status_t
scsi_bus_raw_control(void * _cookie,uint32 op,void * data,size_t length)82 scsi_bus_raw_control(void *_cookie, uint32 op, void *data, size_t length)
83 {
84 	bus_raw_info *bus = (bus_raw_info*)_cookie;
85 
86 	switch (op) {
87 		case B_SCSI_BUS_RAW_RESET:
88 			return bus->interface->reset_bus(bus->cookie);
89 
90 		case B_SCSI_BUS_RAW_PATH_INQUIRY:
91 			return bus->interface->path_inquiry(bus->cookie,
92 				(scsi_path_inquiry*)data);
93 	}
94 
95 	return B_ERROR;
96 }
97 
98 
99 static status_t
scsi_bus_raw_read(void * cookie,off_t position,void * data,size_t * numBytes)100 scsi_bus_raw_read(void *cookie, off_t position, void *data,
101 	size_t *numBytes)
102 {
103 	*numBytes = 0;
104 	return B_ERROR;
105 }
106 
107 
108 static status_t
scsi_bus_raw_write(void * cookie,off_t position,const void * data,size_t * numBytes)109 scsi_bus_raw_write(void *cookie, off_t position,
110 	const void *data, size_t *numBytes)
111 {
112 	*numBytes = 0;
113 	return B_ERROR;
114 }
115 
116 
117 struct device_module_info gSCSIBusRawModule = {
118 	{
119 		SCSI_BUS_RAW_MODULE_NAME,
120 		0,
121 		NULL
122 	},
123 
124 	scsi_bus_raw_init,
125 	scsi_bus_raw_uninit,
126 	NULL,	// removed
127 
128 	scsi_bus_raw_open,
129 	scsi_bus_raw_close,
130 	scsi_bus_raw_free,
131 	scsi_bus_raw_read,
132 	scsi_bus_raw_write,
133 	NULL,	// io
134 	scsi_bus_raw_control,
135 	NULL,	// select
136 	NULL	// deselect
137 };
138