tag | line | file | source code |
cd | 138 | drivers/block/cm206.c | #define stats(i) ++cd->stats[st_ ## i]; \ |
cd | 139 | drivers/block/cm206.c | cd->last_stat[st_ ## i] = cd->stat_counter++; |
cd | 188 | drivers/block/cm206.c | #define DISC_STATUS cd->disc_status[0] |
cd | 189 | drivers/block/cm206.c | #define FIRST_TRACK cd->disc_status[1] |
cd | 190 | drivers/block/cm206.c | #define LAST_TRACK cd->disc_status[2] |
cd | 191 | drivers/block/cm206.c | #define PAUSED cd->audio_status[0] /* misuse this memory byte! */ |
cd | 192 | drivers/block/cm206.c | #define PLAY_TO cd->toc[0] /* toc[0] records end-time in play */ |
cd | 194 | drivers/block/cm206.c | static struct cm206_struct * cd; |
cd | 236 | drivers/block/cm206.c | cd->intr_ds = inw(r_data_status); /* resets data_ready, data_error, |
cd | 239 | drivers/block/cm206.c | cd->intr_ls = inw(r_line_status); /* resets overrun bit */ |
cd | 241 | drivers/block/cm206.c | if (cd->intr_ls & ls_receive_buffer_full) { |
cd | 242 | drivers/block/cm206.c | cd->intr_ur = inb(r_uart_receive); /* get order right! */ |
cd | 243 | drivers/block/cm206.c | cd->intr_ls = inw(r_line_status); /* resets rbf interrupt */ |
cd | 244 | drivers/block/cm206.c | if (!cd->background && cd->uart) wake_up_interruptible(&cd->uart); |
cd | 247 | drivers/block/cm206.c | else if (cd->intr_ds & ds_data_ready) { |
cd | 248 | drivers/block/cm206.c | if (cd->background) ++cd->adapter_last; |
cd | 249 | drivers/block/cm206.c | if ((cd->wait_back || !cd->background) && cd->data) |
cd | 250 | drivers/block/cm206.c | wake_up_interruptible(&cd->data); |
cd | 254 | drivers/block/cm206.c | else if (cd->command && cd->intr_ls & ls_transmitter_buffer_empty) { |
cd | 256 | drivers/block/cm206.c | outw(cd->command, r_uart_transmit); |
cd | 257 | drivers/block/cm206.c | cd->command=0; |
cd | 258 | drivers/block/cm206.c | if (!cd->background) wake_up_interruptible(&cd->uart); |
cd | 261 | drivers/block/cm206.c | else if (cd->intr_ds & ds_fifo_overflow) { |
cd | 262 | drivers/block/cm206.c | debug(("Fifo overflow at sectors 0x%x\n", cd->sector_first)); |
cd | 264 | drivers/block/cm206.c | cd->fifo_overflowed=1; /* signal one word less should be read */ |
cd | 267 | drivers/block/cm206.c | else if (cd->intr_ds & ds_data_error) { |
cd | 268 | drivers/block/cm206.c | debug(("Data error at sector 0x%x\n", cd->sector_first)); |
cd | 271 | drivers/block/cm206.c | else if (cd->intr_ds & ds_crc_error) { |
cd | 272 | drivers/block/cm206.c | debug(("CRC error at sector 0x%x\n", cd->sector_first)); |
cd | 275 | drivers/block/cm206.c | else if (cd->intr_ds & ds_sync_error) { |
cd | 276 | drivers/block/cm206.c | debug(("Sync at sector 0x%x\n", cd->sector_first)); |
cd | 279 | drivers/block/cm206.c | else if (cd->intr_ds & ds_toc_ready) { |
cd | 287 | drivers/block/cm206.c | if (cd->background && (cd->adapter_last-cd->adapter_first == cd->max_sectors |
cd | 288 | drivers/block/cm206.c | || cd->fifo_overflowed)) |
cd | 296 | drivers/block/cm206.c | cd->timed_out = 1; |
cd | 304 | drivers/block/cm206.c | cd->timer.data=(unsigned long) wait; |
cd | 305 | drivers/block/cm206.c | cd->timer.expires = jiffies + timeout; |
cd | 306 | drivers/block/cm206.c | add_timer(&cd->timer); |
cd | 308 | drivers/block/cm206.c | del_timer(&cd->timer); |
cd | 309 | drivers/block/cm206.c | if (cd->timed_out) { |
cd | 310 | drivers/block/cm206.c | cd->timed_out = 0; |
cd | 325 | drivers/block/cm206.c | cd->command = command; |
cd | 330 | drivers/block/cm206.c | if (sleep_or_timeout(&cd->uart, UART_TIMEOUT)) { |
cd | 342 | drivers/block/cm206.c | sleep_or_timeout(&cd->uart, UART_TIMEOUT)) { |
cd | 347 | drivers/block/cm206.c | return cd->intr_ur; |
cd | 359 | drivers/block/cm206.c | sleep_or_timeout(&cd->uart, DSB_TIMEOUT)) { |
cd | 364 | drivers/block/cm206.c | return cd->intr_ur; |
cd | 376 | drivers/block/cm206.c | cd->dsb = wait_dsb(); /* wait for command to finish */ |
cd | 450 | drivers/block/cm206.c | if (cd->background) return -1; /* can't do twice */ |
cd | 453 | drivers/block/cm206.c | cd->adapter_first = cd->adapter_last = start; |
cd | 454 | drivers/block/cm206.c | cd->background = 1; /* flag a read is going on */ |
cd | 460 | drivers/block/cm206.c | if (cd->background) { |
cd | 461 | drivers/block/cm206.c | cd->background=0; |
cd | 462 | drivers/block/cm206.c | cd->adapter_last = -1; /* invalidate adapter memory */ |
cd | 465 | drivers/block/cm206.c | cd->fifo_overflowed=0; |
cd | 468 | drivers/block/cm206.c | if (sleep_or_timeout(&cd->data, DATA_TIMEOUT)) { |
cd | 474 | drivers/block/cm206.c | insw(r_fifo_output_buffer, cd->sector, READ_AHEAD*RAW_SECTOR_SIZE/2); |
cd | 476 | drivers/block/cm206.c | cd->sector_first = start; cd->sector_last = start+READ_AHEAD; |
cd | 493 | drivers/block/cm206.c | debug(("bh: %d\n", cd->background)); |
cd | 494 | drivers/block/cm206.c | switch (cd->background) { |
cd | 497 | drivers/block/cm206.c | if (!(cd->intr_ls & ls_transmitter_buffer_empty)) { |
cd | 498 | drivers/block/cm206.c | cd->command = c_stop; |
cd | 501 | drivers/block/cm206.c | cd->background=2; |
cd | 508 | drivers/block/cm206.c | cd->background=3; |
cd | 511 | drivers/block/cm206.c | if (cd->intr_ur != c_stop) { |
cd | 512 | drivers/block/cm206.c | debug(("cm206_bh: c_stop echoed 0x%x\n", cd->intr_ur)); |
cd | 515 | drivers/block/cm206.c | cd->background++; |
cd | 518 | drivers/block/cm206.c | if (cd->intr_ur != 0xff) { |
cd | 519 | drivers/block/cm206.c | debug(("cm206_bh: c_stop reacted with 0x%x\n", cd->intr_ur)); |
cd | 522 | drivers/block/cm206.c | cd->background=0; |
cd | 530 | drivers/block/cm206.c | cd->dsb=status[0]; |
cd | 531 | drivers/block/cm206.c | cd->cc=status[1]; |
cd | 536 | drivers/block/cm206.c | if (type_1_command(c_disc_status, 7, cd->disc_status)) { |
cd | 543 | drivers/block/cm206.c | if (!cd->openfiles) { |
cd | 544 | drivers/block/cm206.c | cd->background=0; |
cd | 546 | drivers/block/cm206.c | cd->adapter_last = -1; /* invalidate adapter memory */ |
cd | 547 | drivers/block/cm206.c | cd->sector_last = -1; |
cd | 549 | drivers/block/cm206.c | if (cd->dsb & dsb_tray_not_closed) { |
cd | 552 | drivers/block/cm206.c | while (i++<10 && cd->dsb & dsb_drive_not_ready) { |
cd | 557 | drivers/block/cm206.c | if (cd->dsb & (dsb_not_useful)) return -EIO; |
cd | 558 | drivers/block/cm206.c | if (!(cd->dsb & dsb_disc_present)) return -ENODATA; |
cd | 559 | drivers/block/cm206.c | if (cd->dsb & dsb_possible_media_change) { |
cd | 560 | drivers/block/cm206.c | memset(cd->toc, 0, sizeof(cd->toc)); |
cd | 561 | drivers/block/cm206.c | memset(cd->audio_status, 0, sizeof(cd->audio_status)); |
cd | 565 | drivers/block/cm206.c | if (!(cd->dsb & dsb_tray_locked)) { |
cd | 573 | drivers/block/cm206.c | ++cd->openfiles; MOD_INC_USE_COUNT; |
cd | 580 | drivers/block/cm206.c | if (cd->openfiles==1) { |
cd | 581 | drivers/block/cm206.c | if (cd->background) { |
cd | 582 | drivers/block/cm206.c | cd->background=0; |
cd | 586 | drivers/block/cm206.c | cd->sector_last = -1; /* Make our internal buffer invalid */ |
cd | 591 | drivers/block/cm206.c | --cd->openfiles; MOD_DEC_USE_COUNT; |
cd | 599 | drivers/block/cm206.c | insw(r_fifo_output_buffer, cd->sector + cd->fifo_overflowed, |
cd | 600 | drivers/block/cm206.c | RAW_SECTOR_SIZE/2 - cd->fifo_overflowed); |
cd | 602 | drivers/block/cm206.c | ++cd->adapter_first; /* update the current adapter sector */ |
cd | 603 | drivers/block/cm206.c | cd->fifo_overflowed=0; /* reset overflow bit */ |
cd | 606 | drivers/block/cm206.c | cd->sector_first=cd->adapter_first-1; |
cd | 607 | drivers/block/cm206.c | cd->sector_last=cd->adapter_first; /* update the buffer sector */ |
cd | 615 | drivers/block/cm206.c | if (cd->adapter_first <= sector && sector < cd->adapter_last) { |
cd | 617 | drivers/block/cm206.c | empty_buffer(sector - cd->adapter_first); |
cd | 620 | drivers/block/cm206.c | else if (cd->background==1 && cd->adapter_first <= sector |
cd | 621 | drivers/block/cm206.c | && sector < cd->adapter_first+cd->max_sectors) { |
cd | 623 | drivers/block/cm206.c | cd->wait_back=1; |
cd | 624 | drivers/block/cm206.c | while (sector >= cd->adapter_last) { |
cd | 625 | drivers/block/cm206.c | if (sleep_or_timeout(&cd->data, DATA_TIMEOUT)) { |
cd | 627 | drivers/block/cm206.c | cd->adapter_last, cd->adapter_first, cd->background)); |
cd | 629 | drivers/block/cm206.c | cd->wait_back=0; |
cd | 633 | drivers/block/cm206.c | cd->wait_back=0; |
cd | 634 | drivers/block/cm206.c | empty_buffer(sector - cd->adapter_first); |
cd | 663 | drivers/block/cm206.c | if (cd->sector_first <= cd_sec_no && cd_sec_no < cd->sector_last) { |
cd | 664 | drivers/block/cm206.c | source = ((uch *) cd->sector) + 16 + |
cd | 665 | drivers/block/cm206.c | quarter*512 + (cd_sec_no-cd->sector_first)*RAW_SECTOR_SIZE; |
cd | 669 | drivers/block/cm206.c | source = ((uch *) cd->sector)+16+quarter*512; |
cd | 686 | drivers/block/cm206.c | mssp->addr.lba = fsm2lba(&cd->disc_status[3]); |
cd | 688 | drivers/block/cm206.c | mssp->addr.msf.frame = cd->disc_status[3]; |
cd | 689 | drivers/block/cm206.c | mssp->addr.msf.second = cd->disc_status[4]; |
cd | 690 | drivers/block/cm206.c | mssp->addr.msf.minute = cd->disc_status[5]; |
cd | 722 | drivers/block/cm206.c | cd->dsb = wait_dsb(); |
cd | 744 | drivers/block/cm206.c | uch * q = cd->q; |
cd | 749 | drivers/block/cm206.c | for (i=track; i>0; i--) if (cd->toc[i].track) { |
cd | 750 | drivers/block/cm206.c | min = fsm2lba(cd->toc[i].fsm); |
cd | 758 | drivers/block/cm206.c | if (!cd->toc[ct].track) { |
cd | 761 | drivers/block/cm206.c | cd->toc[ct].track=q[1]; /* lead out still 0xaa */ |
cd | 762 | drivers/block/cm206.c | fsm(l, cd->toc[ct].fsm); |
cd | 763 | drivers/block/cm206.c | cd->toc[ct].q0 = q[0]; /* contains adr and ctrl info */ |
cd | 790 | drivers/block/cm206.c | if (!cd->toc[track].track) get_toc_lba(track); |
cd | 800 | drivers/block/cm206.c | cd->toc[1].track=1; /* fill in first track position */ |
cd | 801 | drivers/block/cm206.c | for (i=0; i<3; i++) cd->toc[1].fsm[i] = cd->disc_status[3+i]; |
cd | 818 | drivers/block/cm206.c | cd->dsb = wait_dsb(); |
cd | 828 | drivers/block/cm206.c | play_command[i+1] = cd->audio_status[i+2]; |
cd | 834 | drivers/block/cm206.c | play_command[i+1] = cd->toc[from].fsm[i]; |
cd | 835 | drivers/block/cm206.c | PLAY_TO.fsm[i] = play_command[i+4] = cd->toc[to+1].fsm[i]; |
cd | 841 | drivers/block/cm206.c | cd->dsb = wait_dsb(); |
cd | 847 | drivers/block/cm206.c | uch * q = cd->q; |
cd | 865 | drivers/block/cm206.c | if (cd->dsb & dsb_play_in_progress) |
cd | 878 | drivers/block/cm206.c | ep->cdte_addr.msf.frame = cd->toc[track].fsm[0]; |
cd | 879 | drivers/block/cm206.c | ep->cdte_addr.msf.second = cd->toc[track].fsm[1]; |
cd | 880 | drivers/block/cm206.c | ep->cdte_addr.msf.minute = cd->toc[track].fsm[2]; |
cd | 882 | drivers/block/cm206.c | else ep->cdte_addr.lba = fsm2lba(cd->toc[track].fsm); |
cd | 883 | drivers/block/cm206.c | ep->cdte_adr = cd->toc[track].q0 & 0xf; |
cd | 884 | drivers/block/cm206.c | ep->cdte_ctrl = cd->toc[track].q0 >> 4; |
cd | 900 | drivers/block/cm206.c | else return cd->stats[arg]; |
cd | 903 | drivers/block/cm206.c | else return cd->last_stat[arg]; |
cd | 926 | drivers/block/cm206.c | cd->sector_last = -1; /* flag no data buffered */ |
cd | 927 | drivers/block/cm206.c | cd->adapter_last = -1; |
cd | 932 | drivers/block/cm206.c | if (cd->dsb & (dsb_drive_not_ready | dsb_tray_not_closed) ) |
cd | 981 | drivers/block/cm206.c | if (cd->dsb & dsb_play_in_progress) return type_0_command(c_stop, 1); |
cd | 984 | drivers/block/cm206.c | if (cd->dsb & dsb_play_in_progress) { |
cd | 986 | drivers/block/cm206.c | type_1_command(c_audio_status, 5, cd->audio_status); |
cd | 996 | drivers/block/cm206.c | if (cd->openfiles == 1) { /* Must do an open before an eject! */ |
cd | 998 | drivers/block/cm206.c | memset(cd->toc, 0, sizeof(cd->toc)); |
cd | 999 | drivers/block/cm206.c | memset(cd->disc_status, 0, sizeof(cd->disc_status)); |
cd | 1067 | drivers/block/cm206.c | kfree(cd); |
cd | 1178 | drivers/block/cm206.c | cd = (struct cm206_struct *) kmalloc(size, GFP_KERNEL); |
cd | 1179 | drivers/block/cm206.c | if (!cd) return ERROR; |
cd | 1181 | drivers/block/cm206.c | cd = (struct cm206_struct *) mem_start; |
cd | 1226 | drivers/block/cm206.c | memset(cd, 0, sizeof(*cd)); /* give'm some reasonable value */ |
cd | 1227 | drivers/block/cm206.c | cd->sector_last = -1; /* flag no data buffered */ |
cd | 1228 | drivers/block/cm206.c | cd->adapter_last = -1; |
cd | 1229 | drivers/block/cm206.c | cd->timer.function = cm206_timeout; |
cd | 1230 | drivers/block/cm206.c | cd->max_sectors = (inw(r_data_status) & ds_ram_size) ? 24 : 97; |
cd | 1232 | drivers/block/cm206.c | " %ld bytes kernel memory used.\n", cd->max_sectors*2, size); |