static void do_pd_request (request_queue_t * q) { int unit; if (pd_busy) return; repeat: if (QUEUE_EMPTY || (CURRENT->rq_status == RQ_INACTIVE)) return; INIT_REQUEST; pd_dev = minor(CURRENT->rq_dev); pd_unit = unit = DEVICE_NR(CURRENT->rq_dev); pd_block = CURRENT->sector; pd_run = CURRENT->nr_sectors; pd_count = CURRENT->current_nr_sectors; if ((pd_dev >= PD_DEVS) || ((pd_block+pd_count) > pd_hd[pd_dev].nr_sects)) { end_request(0); goto repeat; } pd_cmd = rq_data_dir(CURRENT); pd_buf = CURRENT->buffer; pd_retries = 0; pd_busy = 1; if (pd_cmd == READ) pi_do_claimed(PI,do_pd_read); else if (pd_cmd == WRITE) pi_do_claimed(PI,do_pd_write); else { pd_busy = 0; end_request(0); goto repeat; } }
static void do_pd_read_drq( void ) { int unit = pd_unit; long saved_flags; while (1) { if (pd_wait_for(unit,STAT_DRQ,"do_pd_read_drq") & STAT_ERR) { pi_disconnect(PI); if (pd_retries < PD_MAX_RETRIES) { pd_retries++; pi_do_claimed(PI,do_pd_read_start); return; } spin_lock_irqsave(&io_request_lock,saved_flags); end_request(0); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); return; } pi_read_block(PI,pd_buf,512); pd_count--; pd_run--; pd_buf += 512; pd_block++; if (!pd_run) break; if (!pd_count) pd_next_buf(unit); } pi_disconnect(PI); spin_lock_irqsave(&io_request_lock,saved_flags); end_request(1); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); }
static void do_pd_read_start( void ) { int unit = pd_unit; long saved_flags; pd_busy = 1; pi_connect(PI); if (pd_wait_for(unit,STAT_READY,"do_pd_read") & STAT_ERR) { pi_disconnect(PI); if (pd_retries < PD_MAX_RETRIES) { pd_retries++; pi_do_claimed(PI,do_pd_read_start); return; } spin_lock_irqsave(&io_request_lock,saved_flags); end_request(0); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); return; } pd_ide_command(unit,IDE_READ,pd_block,pd_run); ps_set_intr(do_pd_read_drq,pd_ready,PD_TMO,nice); }
static void do_pd_write_done( void ) { int unit = pd_unit; long saved_flags; if (pd_wait_for(unit,STAT_READY,"do_pd_write_done") & STAT_ERR) { pi_disconnect(PI); if (pd_retries < PD_MAX_RETRIES) { pd_retries++; pi_do_claimed(PI,do_pd_write_start); return; } spin_lock_irqsave(&io_request_lock,saved_flags); end_request(0); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); return; } pi_disconnect(PI); spin_lock_irqsave(&io_request_lock,saved_flags); end_request(1); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); }
static void do_pd_write_start( void ) { int unit = pd_unit; long saved_flags; pd_busy = 1; pi_connect(PI); if (pd_wait_for(unit,STAT_READY,"do_pd_write") & STAT_ERR) { pi_disconnect(PI); if (pd_retries < PD_MAX_RETRIES) { pd_retries++; pi_do_claimed(PI,do_pd_write_start); return; } spin_lock_irqsave(&io_request_lock,saved_flags); end_request(0); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); return; } pd_ide_command(unit,IDE_WRITE,pd_block,pd_run); while (1) { if (pd_wait_for(unit,STAT_DRQ,"do_pd_write_drq") & STAT_ERR) { pi_disconnect(PI); if (pd_retries < PD_MAX_RETRIES) { pd_retries++; pi_do_claimed(PI,do_pd_write_start); return; } spin_lock_irqsave(&io_request_lock,saved_flags); end_request(0); pd_busy = 0; do_pd_request(NULL); spin_unlock_irqrestore(&io_request_lock,saved_flags); return; } pi_write_block(PI,pd_buf,512); pd_count--; pd_run--; pd_buf += 512; pd_block++; if (!pd_run) break; if (!pd_count) pd_next_buf(unit); } ps_set_intr(do_pd_write_done,pd_ready,PD_TMO,nice); }