Lines Matching refs:bus

7 	Part of Open SCSI bus manager
11 Whenever a controller driver publishes a new controller, a new SCSI bus
13 bus is told to rescan for devices. For each device, there is a
23 // bus service should hurry up a bit - good controllers don't take much time
35 scsi_do_service(scsi_bus_info *bus)
41 if (scsi_check_exec_dpc(bus))
44 if (scsi_check_exec_service(bus))
57 scsi_bus_info *bus = (scsi_bus_info *)arg;
60 SHOW_FLOW(3, "bus = %p", bus);
68 acquire_sem_etc(bus->start_service, processed_notifications + 1, 0, 0);
72 if (bus->shutting_down)
77 get_sem_count(bus->start_service, &processed_notifications);
79 scsi_do_service(bus);
89 scsi_bus_info *bus;
94 bus = (scsi_bus_info *)malloc(sizeof(*bus));
95 if (bus == NULL)
98 memset(bus, 0, sizeof(*bus));
100 bus->path_id = path_id;
102 if (pnp->get_attr_uint32(node, SCSI_DEVICE_MAX_TARGET_COUNT, &bus->max_target_count, true) != B_OK)
103 bus->max_target_count = MAX_TARGET_ID + 1;
104 if (pnp->get_attr_uint32(node, SCSI_DEVICE_MAX_LUN_COUNT, &bus->max_lun_count, true) != B_OK)
105 bus->max_lun_count = MAX_LUN_ID + 1;
108 if (bus->max_target_count > 256)
109 bus->max_target_count = 256;
111 if (bus->max_lun_count > 256)
112 bus->max_lun_count = 256;
114 bus->node = node;
115 bus->lock_count = bus->blocked[0] = bus->blocked[1] = 0;
116 bus->sim_overflow = 0;
117 bus->shutting_down = false;
119 bus->waiting_devices = NULL;
120 //bus->resubmitted_req = NULL;
122 bus->dpc_list = NULL;
124 if ((bus->scan_lun_lock = create_sem(1, "scsi_scan_lun_lock")) < 0) {
125 res = bus->scan_lun_lock;
129 bus->start_service = create_sem(0, "scsi_start_service");
130 if (bus->start_service < 0) {
131 res = bus->start_service;
135 mutex_init(&bus->mutex, "scsi_bus_mutex");
136 spinlock_irq_init(&bus->dpc_lock);
138 res = scsi_init_ccb_alloc(bus);
142 bus->service_thread = spawn_kernel_thread(scsi_service_threadproc,
143 "scsi_bus_service", BUS_SERVICE_PRIORITY, bus);
145 if (bus->service_thread < 0) {
146 res = bus->service_thread;
150 resume_thread(bus->service_thread);
152 return bus;
155 scsi_uninit_ccb_alloc(bus);
157 mutex_destroy(&bus->mutex);
158 delete_sem(bus->start_service);
160 delete_sem(bus->scan_lun_lock);
162 free(bus);
168 scsi_destroy_bus(scsi_bus_info *bus)
172 // noone is using this bus now, time to clean it up
173 bus->shutting_down = true;
174 release_sem(bus->start_service);
176 wait_for_thread(bus->service_thread, &retcode);
178 delete_sem(bus->start_service);
179 mutex_destroy(&bus->mutex);
180 delete_sem(bus->scan_lun_lock);
182 scsi_uninit_ccb_alloc(bus);
192 scsi_bus_info *bus;
200 bus = scsi_create_bus(node, path_id);
201 if (bus == NULL)
205 if (pnp->get_attr_uint32(node, B_DMA_ALIGNMENT, &bus->dma_params.alignment,
207 bus->dma_params.alignment = 0;
209 &bus->dma_params.max_blocks, true) != B_OK)
210 bus->dma_params.max_blocks = 0xffffffff;
212 &bus->dma_params.dma_boundary, true) != B_OK)
213 bus->dma_params.dma_boundary = ~0;
215 &bus->dma_params.max_sg_block_size, true) != B_OK)
216 bus->dma_params.max_sg_block_size = 0xffffffff;
218 &bus->dma_params.max_sg_blocks, true) != B_OK)
219 bus->dma_params.max_sg_blocks = ~0;
222 bus->dma_params.max_sg_block_size &= ~bus->dma_params.alignment;
224 if (bus->dma_params.alignment > B_PAGE_SIZE) {
226 "B_PAGE_SIZE", bus->dma_params.alignment);
231 if (bus->dma_params.max_sg_block_size < 1) {
233 bus->dma_params.max_sg_block_size);
238 if (bus->dma_params.dma_boundary < B_PAGE_SIZE - 1) {
240 "B_PAGE_SIZE", bus->dma_params.dma_boundary);
245 if (bus->dma_params.max_blocks < 1 || bus->dma_params.max_sg_blocks < 1) {
247 B_PRIu32 ") must be at least 1", bus->dma_params.max_blocks,
248 bus->dma_params.max_sg_blocks);
255 pnp->get_driver(parent, (driver_module_info **)&bus->interface,
256 (void **)&bus->sim_cookie);
259 bus->interface->set_scsi_bus(bus->sim_cookie, bus);
263 scsi_inquiry_path(bus, &bus->inquiry_data);
265 // get max. number of commands on bus
266 bus->left_slots = bus->inquiry_data.hba_queue_size;
267 SHOW_FLOW( 3, "Bus has %d slots", bus->left_slots );
269 *cookie = bus;
274 scsi_destroy_bus(bus);
280 scsi_uninit_bus(scsi_bus_info *bus)
282 scsi_destroy_bus(bus);
287 scsi_inquiry_path(scsi_bus bus, scsi_path_inquiry *inquiry_data)
289 SHOW_FLOW(4, "path_id=%d", bus->path_id);
290 return bus->interface->path_inquiry(bus->sim_cookie, inquiry_data);
295 scsi_reset_bus(scsi_bus_info *bus)
297 return bus->interface->reset_bus(bus->sim_cookie);