Lines Matching refs:controller

245 	      ide_controller *controller)  in set_interrupt()  argument
247 if ((controller->reg[ide_control_reg] & 0x2) == 0) { in set_interrupt()
248 DTRACE(ide, ("controller %d - interrupt set\n", controller->nr)); in set_interrupt()
249 device_interrupt_event(me, controller->nr, 1, NULL, 0); in set_interrupt()
250 controller->is_interrupting = 1; in set_interrupt()
257 ide_controller *controller) in clear_interrupt() argument
259 if (controller->is_interrupting) { in clear_interrupt()
260 DTRACE(ide, ("controller %d - interrupt clear\n", controller->nr)); in clear_interrupt()
261 device_interrupt_event(me, controller->nr, 0, NULL, 0); in clear_interrupt()
262 controller->is_interrupting = 0; in clear_interrupt()
270 ide_controller *controller = data; in do_event() local
271 device *me = controller->me; in do_event()
272 controller->event_tag = 0; in do_event()
273 switch (controller->state) { in do_event()
276 if (controller->current_transfer > 0) { in do_event()
277 controller->state = (controller->state == busy_loaded_state in do_event()
281 controller->state = idle_state; in do_event()
283 set_interrupt(me, controller); in do_event()
286 device_error(me, "controller %d - unexpected event", controller->nr); in do_event()
294 ide_controller *controller) in schedule_ready_event() argument
296 if (controller->event_tag != 0) in schedule_ready_event()
298 controller->nr); in schedule_ready_event()
299 controller->event_tag = in schedule_ready_event()
300 device_event_queue_schedule(me, controller->ready_delay, in schedule_ready_event()
301 do_event, controller); in schedule_ready_event()
307 ide_controller *controller, in do_fifo_read() argument
311 if (controller->state != draining_state) in do_fifo_read()
313 controller->nr, in do_fifo_read()
314 ide_state_name(controller->state)); in do_fifo_read()
315 if (controller->fifo_pos + nr_bytes > controller->fifo_size) in do_fifo_read()
316 device_error(me, "controller %d - fifo underflow", controller->nr); in do_fifo_read()
318 memcpy(dest, &controller->fifo[controller->fifo_pos], nr_bytes); in do_fifo_read()
319 controller->fifo_pos += nr_bytes; in do_fifo_read()
321 if (controller->fifo_pos == controller->fifo_size) { in do_fifo_read()
322 controller->current_transfer -= 1; in do_fifo_read()
323 if (controller->current_transfer > 0 in do_fifo_read()
324 && controller->current_drive != NULL) { in do_fifo_read()
326 controller->nr, in do_fifo_read()
327 controller->current_drive->nr, in do_fifo_read()
328 controller->fifo_size, in do_fifo_read()
329 controller->current_byte)); in do_fifo_read()
330 if (device_io_read_buffer(controller->current_drive->device, in do_fifo_read()
331 controller->fifo, in do_fifo_read()
332 0, controller->current_byte, in do_fifo_read()
333 controller->fifo_size, in do_fifo_read()
335 != controller->fifo_size) in do_fifo_read()
337 controller->nr, in do_fifo_read()
338 device_path(controller->current_drive->device)); in do_fifo_read()
340 controller->state = busy_drained_state; in do_fifo_read()
341 controller->fifo_pos = 0; in do_fifo_read()
342 controller->current_byte += controller->fifo_size; in do_fifo_read()
343 schedule_ready_event(me, controller); in do_fifo_read()
350 ide_controller *controller, in do_fifo_write() argument
354 if (controller->state != loading_state) in do_fifo_write()
356 controller->nr, in do_fifo_write()
357 ide_state_name(controller->state)); in do_fifo_write()
358 if (controller->fifo_pos + nr_bytes > controller->fifo_size) in do_fifo_write()
359 device_error(me, "controller %d - fifo overflow", controller->nr); in do_fifo_write()
361 memcpy(&controller->fifo[controller->fifo_pos], source, nr_bytes); in do_fifo_write()
362 controller->fifo_pos += nr_bytes; in do_fifo_write()
364 if (controller->fifo_pos == controller->fifo_size) { in do_fifo_write()
365 if (controller->current_transfer > 0 in do_fifo_write()
366 && controller->current_drive != NULL) { in do_fifo_write()
368 controller->nr, in do_fifo_write()
369 controller->current_drive->nr, in do_fifo_write()
370 controller->fifo_size, in do_fifo_write()
371 controller->current_byte)); in do_fifo_write()
372 if (device_io_write_buffer(controller->current_drive->device, in do_fifo_write()
373 controller->fifo, in do_fifo_write()
374 0, controller->current_byte, in do_fifo_write()
375 controller->fifo_size, in do_fifo_write()
377 != controller->fifo_size) in do_fifo_write()
379 controller->nr, in do_fifo_write()
380 device_path(controller->current_drive->device)); in do_fifo_write()
382 controller->current_transfer -= 1; in do_fifo_write()
383 controller->fifo_pos = 0; in do_fifo_write()
384 controller->current_byte += controller->fifo_size; in do_fifo_write()
385 controller->state = busy_loaded_state; in do_fifo_write()
386 schedule_ready_event(me, controller); in do_fifo_write()
393 ide_controller *controller, in setup_fifo() argument
400 int drive_nr = (controller->reg[ide_drive_head_reg] & 0x10) != 0; in setup_fifo()
401 controller->current_drive = &controller->drive[drive_nr]; in setup_fifo()
404 controller->current_drive = NULL; in setup_fifo()
409 controller->current_transfer = 1; in setup_fifo()
411 int sector_count = controller->reg[ide_sector_count_reg]; in setup_fifo()
413 controller->current_transfer = 256; in setup_fifo()
415 controller->current_transfer = sector_count; in setup_fifo()
419 if (controller->current_drive == NULL) in setup_fifo()
420 controller->fifo_size = 512; in setup_fifo()
422 controller->fifo_size = controller->current_drive->geometry.byte; in setup_fifo()
425 controller->fifo_pos = 0; in setup_fifo()
428 if (controller->current_drive == NULL) in setup_fifo()
429 controller->current_byte = 0; in setup_fifo()
430 else if (controller->reg[ide_drive_head_reg] & 0x40) { in setup_fifo()
432 controller->current_byte = controller->fifo_size in setup_fifo()
433 * (((controller->reg[ide_drive_head_reg] & 0xf) << 24) in setup_fifo()
434 | (controller->reg[ide_cylinder_reg1] << 16) in setup_fifo()
435 | (controller->reg[ide_cylinder_reg0] << 8) in setup_fifo()
436 | (controller->reg[ide_sector_number_reg])); in setup_fifo()
438 else if (controller->current_drive->geometry.head != 0 in setup_fifo()
439 && controller->current_drive->geometry.sector != 0) { in setup_fifo()
441 int head_nr = controller->reg[ide_drive_head_reg] & 0xf; in setup_fifo()
442 int cylinder_nr = ((controller->reg[ide_cylinder_reg1] << 8) in setup_fifo()
443 | controller->reg[ide_cylinder_reg0]); in setup_fifo()
444 int sector_nr = controller->reg[ide_sector_number_reg]; in setup_fifo()
445 controller->current_byte = controller->fifo_size in setup_fifo()
446 * ((cylinder_nr * controller->current_drive->geometry.head + head_nr) in setup_fifo()
447 * controller->current_drive->geometry.sector + sector_nr - 1); in setup_fifo()
451 controller->nr, controller->current_drive->nr); in setup_fifo()
453 (long)controller->nr, in setup_fifo()
454 controller->current_drive == NULL ? -1L : (long)controller->current_drive->nr, in setup_fifo()
456 (long)controller->current_transfer, in setup_fifo()
457 (long)controller->fifo_size, in setup_fifo()
458 (unsigned long)controller->current_byte)); in setup_fifo()
462 controller->current_transfer += 1; in setup_fifo()
463 controller->state = draining_state; in setup_fifo()
464 controller->fifo_pos = controller->fifo_size; in setup_fifo()
465 do_fifo_read(me, controller, NULL, 0); in setup_fifo()
468 controller->state = loading_state; in setup_fifo()
476 ide_controller *controller, in do_command() argument
479 if (controller->state != idle_state) in do_command()
480 device_error(me, "controller %d - command when not idle", controller->nr); in do_command()
483 setup_fifo(me, controller, 0/*is_simple*/, 1/*is_with_disk*/, is_read); in do_command()
486 setup_fifo(me, controller, 0/*is_simple*/, 1/*is_with_disk*/, is_write); in do_command()
493 ide_controller *controller) in get_status() argument
495 switch (controller->state) { in get_status()
522 int controller; member
535 int *controller, in decode_address() argument
544 *controller = decoder->block[i].controller; in decode_address()
590 decoder->block[reg-1].controller = (reg + 1) % nr_ide_controllers; in build_address_decoder()
593 decoder->block[reg-1].controller, in build_address_decoder()
606 decoder->block[reg-1].controller = (reg + 1) % nr_ide_controllers; in build_address_decoder()
609 decoder->block[reg-1].controller, in build_address_decoder()
622 decoder->block[reg-1].controller = 0; in build_address_decoder()
624 decoder->block[reg-1].controller, in build_address_decoder()
631 decoder->block[reg].controller = 1; in build_address_decoder()
634 decoder->block[reg].controller, in build_address_decoder()
649 ide_controller controller[nr_ide_controllers]; member
658 int controller; in hw_ide_init_address() local
662 for (controller = 0; controller < nr_ide_controllers; controller++) { in hw_ide_init_address()
663 memset(&ide->controller[controller], 0, sizeof(ide_controller)); in hw_ide_init_address()
665 ide->controller[controller].drive[drive].nr = drive; in hw_ide_init_address()
667 ide->controller[controller].me = me; in hw_ide_init_address()
669 ide->controller[controller].ready_delay = in hw_ide_init_address()
694 ide_controller *controller; in hw_ide_attach_address() local
700 controller = &ide->controller[controller_nr]; in hw_ide_attach_address()
701 drive = &controller->drive[drive_nr]; in hw_ide_attach_address()
734 ide_controller *controller; in hw_ide_io_read_buffer() local
738 controller = & ide->controller[control_nr]; in hw_ide_io_read_buffer()
744 do_fifo_read(me, controller, dest, nr_bytes); in hw_ide_io_read_buffer()
747 *(uint8_t*)dest = get_status(me, controller); in hw_ide_io_read_buffer()
748 clear_interrupt(me, controller); in hw_ide_io_read_buffer()
751 *(uint8_t*)dest = get_status(me, controller); in hw_ide_io_read_buffer()
766 *(uint8_t*)dest = controller->reg[reg]; in hw_ide_io_read_buffer()
788 ide_controller *controller; in hw_ide_io_write_buffer() local
792 controller = &ide->controller[control_nr]; in hw_ide_io_write_buffer()
797 do_fifo_write(me, controller, source, nr_bytes); in hw_ide_io_write_buffer()
800 do_command(me, controller, *(uint8_t*)source); in hw_ide_io_write_buffer()
803 controller->reg[reg] = *(uint8_t*)source; in hw_ide_io_write_buffer()
805 if ((controller->reg[reg] & 0x02) == 0x02) in hw_ide_io_write_buffer()
806 clear_interrupt(me, controller); in hw_ide_io_write_buffer()
820 controller->reg[reg] = *(uint8_t*)source; in hw_ide_io_write_buffer()