q->request_fn(request_queue_t * q)를 호출하게 되면 ide disk의 경우 do_ide_request 함수를 호출한다.
* void void do_ide_request (request_queue_t *q)
설명 >> 이 함수는 단순히 ide_do_request (실제 request 전송을 담당) 를 호출한다.
*void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq)
설명 >> Issue a new request to a drive from hwgroup
hardware 상태를 check하고, request queue로부터 하나의 request를 얻기 위해서 elv_next_request를 호출한다. 그리고나서 start_request를 호출.
* ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)
설명 >> start of I/O and command issuing for IDE
request의 cmd_type 에 따라 다른 handler를 호출한다.
예를 들어, blk_fs_request의 경우에는 drv->do_request(drive,rq,block) 를 호출하는데, 이는 결국 ide_do_rw_disk를 부른다.
*ide_startstop_t ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block)
설명 >> 이 함수도 간단하다. __ide_do_rw_disk 호출한다.
* ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, sector_t block)
설명 >> issues READ and WRITE commands to a disk. IDE task register의 field를 request의 내용을 가지고 채운다. 그리고 이를 hwif->OUTB()를 통해서 disk로 issue한다. 여기서는 READ와 WRITE에 따라 callback function을 등록하는 방법에 차이가 있다. Read request인 경우, ide_execute_command를 호출하면서 callback function으로 task_in_intr을 등록. Write request인 경우 pre_task_out_intr을 호출하여, task_out_intr을 등록하고 ide_pio_datablock으로 실제 data를 전송.
* ide_startstop_t task_out_intr (ide_drive_t *drive)
설명 >> Handler for command with PIO data-out phase (Write/Write Multiple).
Error handling을 하고, 에러가 없고 모든 data를 읽었으면 task_end_request를 호출.
* void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat)
설명 >> disk request의 경우 drv->end_request 를 호출하는데, ide의 경우 ide_end_request가 불림.
* int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors)
설명 >> 단순히 __ide_end_request 호출하고 끝.
* int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, in nr_sectors)
설명 >> end_that_request_first를 호출한다. 성공적으로 끝나고 list가 empty가 아니면 blkdev_dequeue_request를 호출해서 dispatch queue에서 request를 꺼낸다. 끝으로 end_that_request_last를 호출한다.
end_that_request_first(last) 관련 함수들은 Block IO Completion Handling 에서 계속 설명한다.
[Kernel] Ide Disk Driver 함수 분석