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