Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.18 3249 lines 87 kB view raw
1/* 2* Sony CDU-31A CDROM interface device driver. 3* 4* Corey Minyard (minyard@wf-rch.cirr.com) 5* 6* Colossians 3:17 7* 8* See Documentation/cdrom/cdu31a for additional details about this driver. 9* 10* The Sony interface device driver handles Sony interface CDROM 11* drives and provides a complete block-level interface as well as an 12* ioctl() interface compatible with the Sun (as specified in 13* include/linux/cdrom.h). With this interface, CDROMs can be 14* accessed and standard audio CDs can be played back normally. 15* 16* WARNING - All autoprobes have been removed from the driver. 17* You MUST configure the CDU31A via a LILO config 18* at boot time or in lilo.conf. I have the 19* following in my lilo.conf: 20* 21* append="cdu31a=0x1f88,0,PAS" 22* 23* The first number is the I/O base address of the 24* card. The second is the interrupt (0 means none). 25 * The third should be "PAS" if on a Pro-Audio 26 * spectrum, or nothing if on something else. 27 * 28 * This interface is (unfortunately) a polled interface. This is 29 * because most Sony interfaces are set up with DMA and interrupts 30 * disables. Some (like mine) do not even have the capability to 31 * handle interrupts or DMA. For this reason you will see a lot of 32 * the following: 33 * 34 * retry_count = jiffies+ SONY_JIFFIES_TIMEOUT; 35 * while (time_before(jiffies, retry_count) && (! <some condition to wait for)) 36 * { 37 * while (handle_sony_cd_attention()) 38 * ; 39 * 40 * sony_sleep(); 41 * } 42 * if (the condition not met) 43 * { 44 * return an error; 45 * } 46 * 47 * This ugly hack waits for something to happen, sleeping a little 48 * between every try. it also handles attentions, which are 49 * asynchronous events from the drive informing the driver that a disk 50 * has been inserted, removed, etc. 51 * 52 * NEWS FLASH - The driver now supports interrupts but they are 53 * turned off by default. Use of interrupts is highly encouraged, it 54 * cuts CPU usage down to a reasonable level. I had DMA in for a while 55 * but PC DMA is just too slow. Better to just insb() it. 56 * 57 * One thing about these drives: They talk in MSF (Minute Second Frame) format. 58 * There are 75 frames a second, 60 seconds a minute, and up to 75 minutes on a 59 * disk. The funny thing is that these are sent to the drive in BCD, but the 60 * interface wants to see them in decimal. A lot of conversion goes on. 61 * 62 * DRIVER SPECIAL FEATURES 63 * ----------------------- 64 * 65 * This section describes features beyond the normal audio and CD-ROM 66 * functions of the drive. 67 * 68 * XA compatibility 69 * 70 * The driver should support XA disks for both the CDU31A and CDU33A. 71 * It does this transparently, the using program doesn't need to set it. 72 * 73 * Multi-Session 74 * 75 * A multi-session disk looks just like a normal disk to the user. 76 * Just mount one normally, and all the data should be there. 77 * A special thanks to Koen for help with this! 78 * 79 * Raw sector I/O 80 * 81 * Using the CDROMREADAUDIO it is possible to read raw audio and data 82 * tracks. Both operations return 2352 bytes per sector. On the data 83 * tracks, the first 12 bytes is not returned by the drive and the value 84 * of that data is indeterminate. 85 * 86 * 87 * Copyright (C) 1993 Corey Minyard 88 * 89 * This program is free software; you can redistribute it and/or modify 90 * it under the terms of the GNU General Public License as published by 91 * the Free Software Foundation; either version 2 of the License, or 92 * (at your option) any later version. 93 * 94 * This program is distributed in the hope that it will be useful, 95 * but WITHOUT ANY WARRANTY; without even the implied warranty of 96 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 97 * GNU General Public License for more details. 98 * 99 * You should have received a copy of the GNU General Public License 100 * along with this program; if not, write to the Free Software 101 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 102 * 103 * TODO: 104 * CDs with form1 and form2 sectors cause problems 105 * with current read-ahead strategy. 106 * 107 * Credits: 108 * Heiko Eissfeldt <heiko@colossus.escape.de> 109 * For finding abug in the return of the track numbers. 110 * TOC processing redone for proper multisession support. 111 * 112 * 113 * It probably a little late to be adding a history, but I guess I 114 * will start. 115 * 116 * 10/24/95 - Added support for disabling the eject button when the 117 * drive is open. Note that there is a small problem 118 * still here, if the eject button is pushed while the 119 * drive light is flashing, the drive will return a bad 120 * status and be reset. It recovers, though. 121 * 122 * 03/07/97 - Fixed a problem with timers. 123 * 124 * 125 * 18 Spetember 1997 -- Ported to Uniform CD-ROM driver by 126 * Heiko Eissfeldt <heiko@colossus.escape.de> with additional 127 * changes by Erik Andersen <andersee@debian.org> 128 * 129 * 24 January 1998 -- Removed the scd_disc_status() function, which was now 130 * just dead code left over from the port. 131 * Erik Andersen <andersee@debian.org> 132 * 133 * 16 July 1998 -- Drive donated to Erik Andersen by John Kodis 134 * <kodis@jagunet.com>. Work begun on fixing driver to 135 * work under 2.1.X. Added temporary extra printks 136 * which seem to slow it down enough to work. 137 * 138 * 9 November 1999 -- Make kernel-parameter implementation work with 2.3.x 139 * Removed init_module & cleanup_module in favor of 140 * module_init & module_exit. 141 * Torben Mathiasen <tmm@image.dk> 142 * 143 * 22 October 2004 -- Make the driver work in 2.6.X 144 * Added workaround to fix hard lockups on eject 145 * Fixed door locking problem after mounting empty drive 146 * Set double-speed drives to double speed by default 147 * Removed all readahead things - not needed anymore 148 * Ondrej Zary <rainbow@rainbow-software.org> 149*/ 150 151#define DEBUG 1 152 153#include <linux/major.h> 154#include <linux/module.h> 155#include <linux/errno.h> 156#include <linux/signal.h> 157#include <linux/sched.h> 158#include <linux/timer.h> 159#include <linux/fs.h> 160#include <linux/kernel.h> 161#include <linux/hdreg.h> 162#include <linux/genhd.h> 163#include <linux/ioport.h> 164#include <linux/string.h> 165#include <linux/slab.h> 166#include <linux/init.h> 167#include <linux/interrupt.h> 168#include <linux/cdrom.h> 169 170#include <asm/system.h> 171#include <asm/io.h> 172#include <asm/uaccess.h> 173#include <asm/dma.h> 174 175#include "cdu31a.h" 176 177#define MAJOR_NR CDU31A_CDROM_MAJOR 178#include <linux/blkdev.h> 179 180#define CDU31A_MAX_CONSECUTIVE_ATTENTIONS 10 181 182#define PFX "CDU31A: " 183 184/* 185** Edit the following data to change interrupts, DMA channels, etc. 186** Default is polled and no DMA. DMA is not recommended for double-speed 187** drives. 188*/ 189static struct { 190 unsigned short base; /* I/O Base Address */ 191 short int_num; /* Interrupt Number (-1 means scan for it, 192 0 means don't use) */ 193} cdu31a_addresses[] __initdata = { 194 {0} 195}; 196 197static int handle_sony_cd_attention(void); 198static int read_subcode(void); 199static void sony_get_toc(void); 200static int scd_spinup(void); 201/*static int scd_open(struct inode *inode, struct file *filp);*/ 202static int scd_open(struct cdrom_device_info *, int); 203static void do_sony_cd_cmd(unsigned char cmd, 204 unsigned char *params, 205 unsigned int num_params, 206 unsigned char *result_buffer, 207 unsigned int *result_size); 208static void size_to_buf(unsigned int size, unsigned char *buf); 209 210/* Parameters for the read-ahead. */ 211static unsigned int sony_next_block; /* Next 512 byte block offset */ 212static unsigned int sony_blocks_left = 0; /* Number of 512 byte blocks left 213 in the current read command. */ 214 215 216/* The base I/O address of the Sony Interface. This is a variable (not a 217 #define) so it can be easily changed via some future ioctl() */ 218static unsigned int cdu31a_port = 0; 219module_param(cdu31a_port, uint, 0); 220 221/* 222 * The following are I/O addresses of the various registers for the drive. The 223 * comment for the base address also applies here. 224 */ 225static volatile unsigned short sony_cd_cmd_reg; 226static volatile unsigned short sony_cd_param_reg; 227static volatile unsigned short sony_cd_write_reg; 228static volatile unsigned short sony_cd_control_reg; 229static volatile unsigned short sony_cd_status_reg; 230static volatile unsigned short sony_cd_result_reg; 231static volatile unsigned short sony_cd_read_reg; 232static volatile unsigned short sony_cd_fifost_reg; 233 234static struct request_queue *cdu31a_queue; 235static DEFINE_SPINLOCK(cdu31a_lock); /* queue lock */ 236 237static int sony_spun_up = 0; /* Has the drive been spun up? */ 238 239static int sony_speed = 0; /* Last wanted speed */ 240 241static int sony_xa_mode = 0; /* Is an XA disk in the drive 242 and the drive a CDU31A? */ 243 244static int sony_raw_data_mode = 1; /* 1 if data tracks, 0 if audio. 245 For raw data reads. */ 246 247static unsigned int sony_usage = 0; /* How many processes have the 248 drive open. */ 249 250static int sony_pas_init = 0; /* Initialize the Pro-Audio 251 Spectrum card? */ 252 253static struct s_sony_session_toc single_toc; /* Holds the 254 table of 255 contents. */ 256 257static struct s_all_sessions_toc sony_toc; /* entries gathered from all 258 sessions */ 259 260static int sony_toc_read = 0; /* Has the TOC been read for 261 the drive? */ 262 263static struct s_sony_subcode last_sony_subcode; /* Points to the last 264 subcode address read */ 265 266static DECLARE_MUTEX(sony_sem); /* Semaphore for drive hardware access */ 267 268static int is_double_speed = 0; /* does the drive support double speed ? */ 269 270static int is_auto_eject = 1; /* Door has been locked? 1=No/0=Yes */ 271 272/* 273 * The audio status uses the values from read subchannel data as specified 274 * in include/linux/cdrom.h. 275 */ 276static volatile int sony_audio_status = CDROM_AUDIO_NO_STATUS; 277 278/* 279 * The following are a hack for pausing and resuming audio play. The drive 280 * does not work as I would expect it, if you stop it then start it again, 281 * the drive seeks back to the beginning and starts over. This holds the 282 * position during a pause so a resume can restart it. It uses the 283 * audio status variable above to tell if it is paused. 284 */ 285static unsigned volatile char cur_pos_msf[3] = { 0, 0, 0 }; 286static unsigned volatile char final_pos_msf[3] = { 0, 0, 0 }; 287 288/* What IRQ is the drive using? 0 if none. */ 289static int cdu31a_irq = 0; 290module_param(cdu31a_irq, int, 0); 291 292/* The interrupt handler will wake this queue up when it gets an 293 interrupts. */ 294static DECLARE_WAIT_QUEUE_HEAD(cdu31a_irq_wait); 295static int irq_flag = 0; 296 297static int curr_control_reg = 0; /* Current value of the control register */ 298 299/* A disk changed variable. When a disk change is detected, it will 300 all be set to TRUE. As the upper layers ask for disk_changed status 301 it will be cleared. */ 302static char disk_changed; 303 304/* This was readahead_buffer once... Now it's used only for audio reads */ 305static char audio_buffer[CD_FRAMESIZE_RAW]; 306 307/* Used to time a short period to abort an operation after the 308 drive has been idle for a while. This keeps the light on 309 the drive from flashing for very long. */ 310static struct timer_list cdu31a_abort_timer; 311 312/* Marks if the timeout has started an abort read. This is used 313 on entry to the drive to tell the code to read out the status 314 from the abort read. */ 315static int abort_read_started = 0; 316 317/* 318 * Uniform cdrom interface function 319 * report back, if disc has changed from time of last request. 320 */ 321static int scd_media_changed(struct cdrom_device_info *cdi, int disc_nr) 322{ 323 int retval; 324 325 retval = disk_changed; 326 disk_changed = 0; 327 328 return retval; 329} 330 331/* 332 * Uniform cdrom interface function 333 * report back, if drive is ready 334 */ 335static int scd_drive_status(struct cdrom_device_info *cdi, int slot_nr) 336{ 337 if (CDSL_CURRENT != slot_nr) 338 /* we have no changer support */ 339 return -EINVAL; 340 if (sony_spun_up) 341 return CDS_DISC_OK; 342 if (down_interruptible(&sony_sem)) 343 return -ERESTARTSYS; 344 if (scd_spinup() == 0) 345 sony_spun_up = 1; 346 up(&sony_sem); 347 return sony_spun_up ? CDS_DISC_OK : CDS_DRIVE_NOT_READY; 348} 349 350static inline void enable_interrupts(void) 351{ 352 curr_control_reg |= (SONY_ATTN_INT_EN_BIT 353 | SONY_RES_RDY_INT_EN_BIT 354 | SONY_DATA_RDY_INT_EN_BIT); 355 outb(curr_control_reg, sony_cd_control_reg); 356} 357 358static inline void disable_interrupts(void) 359{ 360 curr_control_reg &= ~(SONY_ATTN_INT_EN_BIT 361 | SONY_RES_RDY_INT_EN_BIT 362 | SONY_DATA_RDY_INT_EN_BIT); 363 outb(curr_control_reg, sony_cd_control_reg); 364} 365 366/* 367 * Wait a little while (used for polling the drive). If in initialization, 368 * setting a timeout doesn't work, so just loop for a while. 369 */ 370static inline void sony_sleep(void) 371{ 372 if (cdu31a_irq <= 0) { 373 yield(); 374 } else { /* Interrupt driven */ 375 DEFINE_WAIT(w); 376 int first = 1; 377 378 while (1) { 379 prepare_to_wait(&cdu31a_irq_wait, &w, 380 TASK_INTERRUPTIBLE); 381 if (first) { 382 enable_interrupts(); 383 first = 0; 384 } 385 386 if (irq_flag != 0) 387 break; 388 if (!signal_pending(current)) { 389 schedule(); 390 continue; 391 } else 392 disable_interrupts(); 393 break; 394 } 395 finish_wait(&cdu31a_irq_wait, &w); 396 irq_flag = 0; 397 } 398} 399 400 401/* 402 * The following are convenience routine to read various status and set 403 * various conditions in the drive. 404 */ 405static inline int is_attention(void) 406{ 407 return (inb(sony_cd_status_reg) & SONY_ATTN_BIT) != 0; 408} 409 410static inline int is_busy(void) 411{ 412 return (inb(sony_cd_status_reg) & SONY_BUSY_BIT) != 0; 413} 414 415static inline int is_data_ready(void) 416{ 417 return (inb(sony_cd_status_reg) & SONY_DATA_RDY_BIT) != 0; 418} 419 420static inline int is_data_requested(void) 421{ 422 return (inb(sony_cd_status_reg) & SONY_DATA_REQUEST_BIT) != 0; 423} 424 425static inline int is_result_ready(void) 426{ 427 return (inb(sony_cd_status_reg) & SONY_RES_RDY_BIT) != 0; 428} 429 430static inline int is_param_write_rdy(void) 431{ 432 return (inb(sony_cd_fifost_reg) & SONY_PARAM_WRITE_RDY_BIT) != 0; 433} 434 435static inline int is_result_reg_not_empty(void) 436{ 437 return (inb(sony_cd_fifost_reg) & SONY_RES_REG_NOT_EMP_BIT) != 0; 438} 439 440static inline void reset_drive(void) 441{ 442 curr_control_reg = 0; 443 sony_toc_read = 0; 444 outb(SONY_DRIVE_RESET_BIT, sony_cd_control_reg); 445} 446 447/* 448 * Uniform cdrom interface function 449 * reset drive and return when it is ready 450 */ 451static int scd_reset(struct cdrom_device_info *cdi) 452{ 453 unsigned long retry_count; 454 455 if (down_interruptible(&sony_sem)) 456 return -ERESTARTSYS; 457 reset_drive(); 458 459 retry_count = jiffies + SONY_RESET_TIMEOUT; 460 while (time_before(jiffies, retry_count) && (!is_attention())) { 461 sony_sleep(); 462 } 463 464 up(&sony_sem); 465 return 0; 466} 467 468static inline void clear_attention(void) 469{ 470 outb(curr_control_reg | SONY_ATTN_CLR_BIT, sony_cd_control_reg); 471} 472 473static inline void clear_result_ready(void) 474{ 475 outb(curr_control_reg | SONY_RES_RDY_CLR_BIT, sony_cd_control_reg); 476} 477 478static inline void clear_data_ready(void) 479{ 480 outb(curr_control_reg | SONY_DATA_RDY_CLR_BIT, 481 sony_cd_control_reg); 482} 483 484static inline void clear_param_reg(void) 485{ 486 outb(curr_control_reg | SONY_PARAM_CLR_BIT, sony_cd_control_reg); 487} 488 489static inline unsigned char read_status_register(void) 490{ 491 return inb(sony_cd_status_reg); 492} 493 494static inline unsigned char read_result_register(void) 495{ 496 return inb(sony_cd_result_reg); 497} 498 499static inline unsigned char read_data_register(void) 500{ 501 return inb(sony_cd_read_reg); 502} 503 504static inline void write_param(unsigned char param) 505{ 506 outb(param, sony_cd_param_reg); 507} 508 509static inline void write_cmd(unsigned char cmd) 510{ 511 outb(curr_control_reg | SONY_RES_RDY_INT_EN_BIT, 512 sony_cd_control_reg); 513 outb(cmd, sony_cd_cmd_reg); 514} 515 516static irqreturn_t cdu31a_interrupt(int irq, void *dev_id, struct pt_regs *regs) 517{ 518 unsigned char val; 519 520 if (abort_read_started) { 521 /* We might be waiting for an abort to finish. Don't 522 disable interrupts yet, though, because we handle 523 this one here. */ 524 /* Clear out the result registers. */ 525 while (is_result_reg_not_empty()) { 526 val = read_result_register(); 527 } 528 clear_data_ready(); 529 clear_result_ready(); 530 531 /* Clear out the data */ 532 while (is_data_requested()) { 533 val = read_data_register(); 534 } 535 abort_read_started = 0; 536 537 /* If something was waiting, wake it up now. */ 538 if (waitqueue_active(&cdu31a_irq_wait)) { 539 disable_interrupts(); 540 irq_flag = 1; 541 wake_up_interruptible(&cdu31a_irq_wait); 542 } 543 } else if (waitqueue_active(&cdu31a_irq_wait)) { 544 disable_interrupts(); 545 irq_flag = 1; 546 wake_up_interruptible(&cdu31a_irq_wait); 547 } else { 548 disable_interrupts(); 549 printk(KERN_NOTICE PFX 550 "Got an interrupt but nothing was waiting\n"); 551 } 552 return IRQ_HANDLED; 553} 554 555/* 556 * give more verbose error messages 557 */ 558static unsigned char *translate_error(unsigned char err_code) 559{ 560 static unsigned char errbuf[80]; 561 562 switch (err_code) { 563 case 0x10: return "illegal command "; 564 case 0x11: return "illegal parameter "; 565 566 case 0x20: return "not loaded "; 567 case 0x21: return "no disc "; 568 case 0x22: return "not spinning "; 569 case 0x23: return "spinning "; 570 case 0x25: return "spindle servo "; 571 case 0x26: return "focus servo "; 572 case 0x29: return "eject mechanism "; 573 case 0x2a: return "audio playing "; 574 case 0x2c: return "emergency eject "; 575 576 case 0x30: return "focus "; 577 case 0x31: return "frame sync "; 578 case 0x32: return "subcode address "; 579 case 0x33: return "block sync "; 580 case 0x34: return "header address "; 581 582 case 0x40: return "illegal track read "; 583 case 0x41: return "mode 0 read "; 584 case 0x42: return "illegal mode read "; 585 case 0x43: return "illegal block size read "; 586 case 0x44: return "mode read "; 587 case 0x45: return "form read "; 588 case 0x46: return "leadout read "; 589 case 0x47: return "buffer overrun "; 590 591 case 0x53: return "unrecoverable CIRC "; 592 case 0x57: return "unrecoverable LECC "; 593 594 case 0x60: return "no TOC "; 595 case 0x61: return "invalid subcode data "; 596 case 0x63: return "focus on TOC read "; 597 case 0x64: return "frame sync on TOC read "; 598 case 0x65: return "TOC data "; 599 600 case 0x70: return "hardware failure "; 601 case 0x91: return "leadin "; 602 case 0x92: return "leadout "; 603 case 0x93: return "data track "; 604 } 605 sprintf(errbuf, "unknown 0x%02x ", err_code); 606 return errbuf; 607} 608 609/* 610 * Set the drive parameters so the drive will auto-spin-up when a 611 * disk is inserted. 612 */ 613static void set_drive_params(int want_doublespeed) 614{ 615 unsigned char res_reg[12]; 616 unsigned int res_size; 617 unsigned char params[3]; 618 619 620 params[0] = SONY_SD_AUTO_SPIN_DOWN_TIME; 621 params[1] = 0x00; /* Never spin down the drive. */ 622 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 623 params, 2, res_reg, &res_size); 624 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) { 625 printk(KERN_NOTICE PFX 626 "Unable to set spin-down time: 0x%2.2x\n", res_reg[1]); 627 } 628 629 params[0] = SONY_SD_MECH_CONTROL; 630 params[1] = SONY_AUTO_SPIN_UP_BIT; /* Set auto spin up */ 631 632 if (is_auto_eject) 633 params[1] |= SONY_AUTO_EJECT_BIT; 634 635 if (is_double_speed && want_doublespeed) { 636 params[1] |= SONY_DOUBLE_SPEED_BIT; /* Set the drive to double speed if 637 possible */ 638 } 639 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 640 params, 2, res_reg, &res_size); 641 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) { 642 printk(KERN_NOTICE PFX "Unable to set mechanical " 643 "parameters: 0x%2.2x\n", res_reg[1]); 644 } 645} 646 647/* 648 * Uniform cdrom interface function 649 * select reading speed for data access 650 */ 651static int scd_select_speed(struct cdrom_device_info *cdi, int speed) 652{ 653 if (speed == 0) 654 sony_speed = 1; 655 else 656 sony_speed = speed - 1; 657 658 if (down_interruptible(&sony_sem)) 659 return -ERESTARTSYS; 660 set_drive_params(sony_speed); 661 up(&sony_sem); 662 return 0; 663} 664 665/* 666 * Uniform cdrom interface function 667 * lock or unlock eject button 668 */ 669static int scd_lock_door(struct cdrom_device_info *cdi, int lock) 670{ 671 if (lock == 0) { 672 is_auto_eject = 1; 673 } else { 674 is_auto_eject = 0; 675 } 676 if (down_interruptible(&sony_sem)) 677 return -ERESTARTSYS; 678 set_drive_params(sony_speed); 679 up(&sony_sem); 680 return 0; 681} 682 683/* 684 * This code will reset the drive and attempt to restore sane parameters. 685 */ 686static void restart_on_error(void) 687{ 688 unsigned char res_reg[12]; 689 unsigned int res_size; 690 unsigned long retry_count; 691 692 693 printk(KERN_NOTICE PFX "Resetting drive on error\n"); 694 reset_drive(); 695 retry_count = jiffies + SONY_RESET_TIMEOUT; 696 while (time_before(jiffies, retry_count) && (!is_attention())) { 697 sony_sleep(); 698 } 699 set_drive_params(sony_speed); 700 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size); 701 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) { 702 printk(KERN_NOTICE PFX "Unable to spin up drive: 0x%2.2x\n", 703 res_reg[1]); 704 } 705 706 msleep(2000); 707 708 sony_get_toc(); 709} 710 711/* 712 * This routine writes data to the parameter register. Since this should 713 * happen fairly fast, it is polled with no OS waits between. 714 */ 715static int write_params(unsigned char *params, int num_params) 716{ 717 unsigned int retry_count; 718 719 720 retry_count = SONY_READY_RETRIES; 721 while ((retry_count > 0) && (!is_param_write_rdy())) { 722 retry_count--; 723 } 724 if (!is_param_write_rdy()) { 725 return -EIO; 726 } 727 728 while (num_params > 0) { 729 write_param(*params); 730 params++; 731 num_params--; 732 } 733 734 return 0; 735} 736 737 738/* 739 * The following reads data from the command result register. It is a 740 * fairly complex routine, all status info flows back through this 741 * interface. The algorithm is stolen directly from the flowcharts in 742 * the drive manual. 743 */ 744static void 745get_result(unsigned char *result_buffer, unsigned int *result_size) 746{ 747 unsigned char a, b; 748 int i; 749 unsigned long retry_count; 750 751 752 while (handle_sony_cd_attention()); 753 /* Wait for the result data to be ready */ 754 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 755 while (time_before(jiffies, retry_count) 756 && (is_busy() || (!(is_result_ready())))) { 757 sony_sleep(); 758 759 while (handle_sony_cd_attention()); 760 } 761 if (is_busy() || (!(is_result_ready()))) { 762 pr_debug(PFX "timeout out %d\n", __LINE__); 763 result_buffer[0] = 0x20; 764 result_buffer[1] = SONY_TIMEOUT_OP_ERR; 765 *result_size = 2; 766 return; 767 } 768 769 /* 770 * Get the first two bytes. This determines what else needs 771 * to be done. 772 */ 773 clear_result_ready(); 774 a = read_result_register(); 775 *result_buffer = a; 776 result_buffer++; 777 778 /* Check for block error status result. */ 779 if ((a & 0xf0) == 0x50) { 780 *result_size = 1; 781 return; 782 } 783 784 b = read_result_register(); 785 *result_buffer = b; 786 result_buffer++; 787 *result_size = 2; 788 789 /* 790 * 0x20 means an error occurred. Byte 2 will have the error code. 791 * Otherwise, the command succeeded, byte 2 will have the count of 792 * how many more status bytes are coming. 793 * 794 * The result register can be read 10 bytes at a time, a wait for 795 * result ready to be asserted must be done between every 10 bytes. 796 */ 797 if ((a & 0xf0) != 0x20) { 798 if (b > 8) { 799 for (i = 0; i < 8; i++) { 800 *result_buffer = read_result_register(); 801 result_buffer++; 802 (*result_size)++; 803 } 804 b = b - 8; 805 806 while (b > 10) { 807 retry_count = SONY_READY_RETRIES; 808 while ((retry_count > 0) 809 && (!is_result_ready())) { 810 retry_count--; 811 } 812 if (!is_result_ready()) { 813 pr_debug(PFX "timeout out %d\n", 814 __LINE__); 815 result_buffer[0] = 0x20; 816 result_buffer[1] = 817 SONY_TIMEOUT_OP_ERR; 818 *result_size = 2; 819 return; 820 } 821 822 clear_result_ready(); 823 824 for (i = 0; i < 10; i++) { 825 *result_buffer = 826 read_result_register(); 827 result_buffer++; 828 (*result_size)++; 829 } 830 b = b - 10; 831 } 832 833 if (b > 0) { 834 retry_count = SONY_READY_RETRIES; 835 while ((retry_count > 0) 836 && (!is_result_ready())) { 837 retry_count--; 838 } 839 if (!is_result_ready()) { 840 pr_debug(PFX "timeout out %d\n", 841 __LINE__); 842 result_buffer[0] = 0x20; 843 result_buffer[1] = 844 SONY_TIMEOUT_OP_ERR; 845 *result_size = 2; 846 return; 847 } 848 } 849 } 850 851 while (b > 0) { 852 *result_buffer = read_result_register(); 853 result_buffer++; 854 (*result_size)++; 855 b--; 856 } 857 } 858} 859 860/* 861 * Do a command that does not involve data transfer. This routine must 862 * be re-entrant from the same task to support being called from the 863 * data operation code when an error occurs. 864 */ 865static void 866do_sony_cd_cmd(unsigned char cmd, 867 unsigned char *params, 868 unsigned int num_params, 869 unsigned char *result_buffer, unsigned int *result_size) 870{ 871 unsigned long retry_count; 872 int num_retries = 0; 873 874retry_cd_operation: 875 876 while (handle_sony_cd_attention()); 877 878 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 879 while (time_before(jiffies, retry_count) && (is_busy())) { 880 sony_sleep(); 881 882 while (handle_sony_cd_attention()); 883 } 884 if (is_busy()) { 885 pr_debug(PFX "timeout out %d\n", __LINE__); 886 result_buffer[0] = 0x20; 887 result_buffer[1] = SONY_TIMEOUT_OP_ERR; 888 *result_size = 2; 889 } else { 890 clear_result_ready(); 891 clear_param_reg(); 892 893 write_params(params, num_params); 894 write_cmd(cmd); 895 896 get_result(result_buffer, result_size); 897 } 898 899 if (((result_buffer[0] & 0xf0) == 0x20) 900 && (num_retries < MAX_CDU31A_RETRIES)) { 901 num_retries++; 902 msleep(100); 903 goto retry_cd_operation; 904 } 905} 906 907 908/* 909 * Handle an attention from the drive. This will return 1 if it found one 910 * or 0 if not (if one is found, the caller might want to call again). 911 * 912 * This routine counts the number of consecutive times it is called 913 * (since this is always called from a while loop until it returns 914 * a 0), and returns a 0 if it happens too many times. This will help 915 * prevent a lockup. 916 */ 917static int handle_sony_cd_attention(void) 918{ 919 unsigned char atten_code; 920 static int num_consecutive_attentions = 0; 921 volatile int val; 922 923 924#if 0 925 pr_debug(PFX "Entering %s\n", __FUNCTION__); 926#endif 927 if (is_attention()) { 928 if (num_consecutive_attentions > 929 CDU31A_MAX_CONSECUTIVE_ATTENTIONS) { 930 printk(KERN_NOTICE PFX "Too many consecutive " 931 "attentions: %d\n", num_consecutive_attentions); 932 num_consecutive_attentions = 0; 933 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, 934 __LINE__); 935 return 0; 936 } 937 938 clear_attention(); 939 atten_code = read_result_register(); 940 941 switch (atten_code) { 942 /* Someone changed the CD. Mark it as changed */ 943 case SONY_MECH_LOADED_ATTN: 944 disk_changed = 1; 945 sony_toc_read = 0; 946 sony_audio_status = CDROM_AUDIO_NO_STATUS; 947 sony_blocks_left = 0; 948 break; 949 950 case SONY_SPIN_DOWN_COMPLETE_ATTN: 951 /* Mark the disk as spun down. */ 952 sony_spun_up = 0; 953 break; 954 955 case SONY_AUDIO_PLAY_DONE_ATTN: 956 sony_audio_status = CDROM_AUDIO_COMPLETED; 957 read_subcode(); 958 break; 959 960 case SONY_EJECT_PUSHED_ATTN: 961 if (is_auto_eject) { 962 sony_audio_status = CDROM_AUDIO_INVALID; 963 } 964 break; 965 966 case SONY_LEAD_IN_ERR_ATTN: 967 case SONY_LEAD_OUT_ERR_ATTN: 968 case SONY_DATA_TRACK_ERR_ATTN: 969 case SONY_AUDIO_PLAYBACK_ERR_ATTN: 970 sony_audio_status = CDROM_AUDIO_ERROR; 971 break; 972 } 973 974 num_consecutive_attentions++; 975 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 976 return 1; 977 } else if (abort_read_started) { 978 while (is_result_reg_not_empty()) { 979 val = read_result_register(); 980 } 981 clear_data_ready(); 982 clear_result_ready(); 983 /* Clear out the data */ 984 while (is_data_requested()) { 985 val = read_data_register(); 986 } 987 abort_read_started = 0; 988 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 989 return 1; 990 } 991 992 num_consecutive_attentions = 0; 993#if 0 994 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 995#endif 996 return 0; 997} 998 999 1000/* Convert from an integer 0-99 to BCD */ 1001static inline unsigned int int_to_bcd(unsigned int val) 1002{ 1003 int retval; 1004 1005 1006 retval = (val / 10) << 4; 1007 retval = retval | val % 10; 1008 return retval; 1009} 1010 1011 1012/* Convert from BCD to an integer from 0-99 */ 1013static unsigned int bcd_to_int(unsigned int bcd) 1014{ 1015 return (((bcd >> 4) & 0x0f) * 10) + (bcd & 0x0f); 1016} 1017 1018 1019/* 1020 * Convert a logical sector value (like the OS would want to use for 1021 * a block device) to an MSF format. 1022 */ 1023static void log_to_msf(unsigned int log, unsigned char *msf) 1024{ 1025 log = log + LOG_START_OFFSET; 1026 msf[0] = int_to_bcd(log / 4500); 1027 log = log % 4500; 1028 msf[1] = int_to_bcd(log / 75); 1029 msf[2] = int_to_bcd(log % 75); 1030} 1031 1032 1033/* 1034 * Convert an MSF format to a logical sector. 1035 */ 1036static unsigned int msf_to_log(unsigned char *msf) 1037{ 1038 unsigned int log; 1039 1040 1041 log = msf[2]; 1042 log += msf[1] * 75; 1043 log += msf[0] * 4500; 1044 log = log - LOG_START_OFFSET; 1045 1046 return log; 1047} 1048 1049 1050/* 1051 * Take in integer size value and put it into a buffer like 1052 * the drive would want to see a number-of-sector value. 1053 */ 1054static void size_to_buf(unsigned int size, unsigned char *buf) 1055{ 1056 buf[0] = size / 65536; 1057 size = size % 65536; 1058 buf[1] = size / 256; 1059 buf[2] = size % 256; 1060} 1061 1062/* Starts a read operation. Returns 0 on success and 1 on failure. 1063 The read operation used here allows multiple sequential sectors 1064 to be read and status returned for each sector. The driver will 1065 read the output one at a time as the requests come and abort the 1066 operation if the requested sector is not the next one from the 1067 drive. */ 1068static int 1069start_request(unsigned int sector, unsigned int nsect) 1070{ 1071 unsigned char params[6]; 1072 unsigned long retry_count; 1073 1074 1075 pr_debug(PFX "Entering %s\n", __FUNCTION__); 1076 log_to_msf(sector, params); 1077 size_to_buf(nsect, &params[3]); 1078 1079 /* 1080 * Clear any outstanding attentions and wait for the drive to 1081 * complete any pending operations. 1082 */ 1083 while (handle_sony_cd_attention()); 1084 1085 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 1086 while (time_before(jiffies, retry_count) && (is_busy())) { 1087 sony_sleep(); 1088 1089 while (handle_sony_cd_attention()); 1090 } 1091 1092 if (is_busy()) { 1093 printk(KERN_NOTICE PFX "Timeout while waiting " 1094 "to issue command\n"); 1095 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 1096 return 1; 1097 } else { 1098 /* Issue the command */ 1099 clear_result_ready(); 1100 clear_param_reg(); 1101 1102 write_params(params, 6); 1103 write_cmd(SONY_READ_BLKERR_STAT_CMD); 1104 1105 sony_blocks_left = nsect * 4; 1106 sony_next_block = sector * 4; 1107 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 1108 return 0; 1109 } 1110 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 1111} 1112 1113/* Abort a pending read operation. Clear all the drive status variables. */ 1114static void abort_read(void) 1115{ 1116 unsigned char result_reg[2]; 1117 int result_size; 1118 volatile int val; 1119 1120 1121 do_sony_cd_cmd(SONY_ABORT_CMD, NULL, 0, result_reg, &result_size); 1122 if ((result_reg[0] & 0xf0) == 0x20) { 1123 printk(KERN_ERR PFX "Aborting read, %s error\n", 1124 translate_error(result_reg[1])); 1125 } 1126 1127 while (is_result_reg_not_empty()) { 1128 val = read_result_register(); 1129 } 1130 clear_data_ready(); 1131 clear_result_ready(); 1132 /* Clear out the data */ 1133 while (is_data_requested()) { 1134 val = read_data_register(); 1135 } 1136 1137 sony_blocks_left = 0; 1138} 1139 1140/* Called when the timer times out. This will abort the 1141 pending read operation. */ 1142static void handle_abort_timeout(unsigned long data) 1143{ 1144 pr_debug(PFX "Entering %s\n", __FUNCTION__); 1145 /* If it is in use, ignore it. */ 1146 if (down_trylock(&sony_sem) == 0) { 1147 /* We can't use abort_read(), because it will sleep 1148 or schedule in the timer interrupt. Just start 1149 the operation, finish it on the next access to 1150 the drive. */ 1151 clear_result_ready(); 1152 clear_param_reg(); 1153 write_cmd(SONY_ABORT_CMD); 1154 1155 sony_blocks_left = 0; 1156 abort_read_started = 1; 1157 up(&sony_sem); 1158 } 1159 pr_debug(PFX "Leaving %s\n", __FUNCTION__); 1160} 1161 1162/* Actually get one sector of data from the drive. */ 1163static void 1164input_data_sector(char *buffer) 1165{ 1166 pr_debug(PFX "Entering %s\n", __FUNCTION__); 1167 1168 /* If an XA disk on a CDU31A, skip the first 12 bytes of data from 1169 the disk. The real data is after that. We can use audio_buffer. */ 1170 if (sony_xa_mode) 1171 insb(sony_cd_read_reg, audio_buffer, CD_XA_HEAD); 1172 1173 clear_data_ready(); 1174 1175 insb(sony_cd_read_reg, buffer, 2048); 1176 1177 /* If an XA disk, we have to clear out the rest of the unused 1178 error correction data. We can use audio_buffer for that. */ 1179 if (sony_xa_mode) 1180 insb(sony_cd_read_reg, audio_buffer, CD_XA_TAIL); 1181 1182 pr_debug(PFX "Leaving %s\n", __FUNCTION__); 1183} 1184 1185/* read data from the drive. Note the nsect must be <= 4. */ 1186static void 1187read_data_block(char *buffer, 1188 unsigned int block, 1189 unsigned int nblocks, 1190 unsigned char res_reg[], int *res_size) 1191{ 1192 unsigned long retry_count; 1193 1194 pr_debug(PFX "Entering %s\n", __FUNCTION__); 1195 1196 res_reg[0] = 0; 1197 res_reg[1] = 0; 1198 *res_size = 0; 1199 1200 /* Wait for the drive to tell us we have something */ 1201 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 1202 while (time_before(jiffies, retry_count) && !(is_data_ready())) { 1203 while (handle_sony_cd_attention()); 1204 1205 sony_sleep(); 1206 } 1207 if (!(is_data_ready())) { 1208 if (is_result_ready()) { 1209 get_result(res_reg, res_size); 1210 if ((res_reg[0] & 0xf0) != 0x20) { 1211 printk(KERN_NOTICE PFX "Got result that should" 1212 " have been error: %d\n", res_reg[0]); 1213 res_reg[0] = 0x20; 1214 res_reg[1] = SONY_BAD_DATA_ERR; 1215 *res_size = 2; 1216 } 1217 abort_read(); 1218 } else { 1219 pr_debug(PFX "timeout out %d\n", __LINE__); 1220 res_reg[0] = 0x20; 1221 res_reg[1] = SONY_TIMEOUT_OP_ERR; 1222 *res_size = 2; 1223 abort_read(); 1224 } 1225 } else { 1226 input_data_sector(buffer); 1227 sony_blocks_left -= nblocks; 1228 sony_next_block += nblocks; 1229 1230 /* Wait for the status from the drive. */ 1231 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 1232 while (time_before(jiffies, retry_count) 1233 && !(is_result_ready())) { 1234 while (handle_sony_cd_attention()); 1235 1236 sony_sleep(); 1237 } 1238 1239 if (!is_result_ready()) { 1240 pr_debug(PFX "timeout out %d\n", __LINE__); 1241 res_reg[0] = 0x20; 1242 res_reg[1] = SONY_TIMEOUT_OP_ERR; 1243 *res_size = 2; 1244 abort_read(); 1245 } else { 1246 get_result(res_reg, res_size); 1247 1248 /* If we got a buffer status, handle that. */ 1249 if ((res_reg[0] & 0xf0) == 0x50) { 1250 1251 if ((res_reg[0] == 1252 SONY_NO_CIRC_ERR_BLK_STAT) 1253 || (res_reg[0] == 1254 SONY_NO_LECC_ERR_BLK_STAT) 1255 || (res_reg[0] == 1256 SONY_RECOV_LECC_ERR_BLK_STAT)) { 1257 /* nothing here */ 1258 } else { 1259 printk(KERN_ERR PFX "Data block " 1260 "error: 0x%x\n", res_reg[0]); 1261 res_reg[0] = 0x20; 1262 res_reg[1] = SONY_BAD_DATA_ERR; 1263 *res_size = 2; 1264 } 1265 1266 /* Final transfer is done for read command, get final result. */ 1267 if (sony_blocks_left == 0) { 1268 get_result(res_reg, res_size); 1269 } 1270 } else if ((res_reg[0] & 0xf0) != 0x20) { 1271 /* The drive gave me bad status, I don't know what to do. 1272 Reset the driver and return an error. */ 1273 printk(KERN_ERR PFX "Invalid block " 1274 "status: 0x%x\n", res_reg[0]); 1275 restart_on_error(); 1276 res_reg[0] = 0x20; 1277 res_reg[1] = SONY_BAD_DATA_ERR; 1278 *res_size = 2; 1279 } 1280 } 1281 } 1282 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 1283} 1284 1285 1286/* 1287 * The OS calls this to perform a read or write operation to the drive. 1288 * Write obviously fail. Reads to a read ahead of sony_buffer_size 1289 * bytes to help speed operations. This especially helps since the OS 1290 * uses 1024 byte blocks and the drive uses 2048 byte blocks. Since most 1291 * data access on a CD is done sequentially, this saves a lot of operations. 1292 */ 1293static void do_cdu31a_request(request_queue_t * q) 1294{ 1295 struct request *req; 1296 int block, nblock, num_retries; 1297 unsigned char res_reg[12]; 1298 unsigned int res_size; 1299 1300 pr_debug(PFX "Entering %s\n", __FUNCTION__); 1301 1302 spin_unlock_irq(q->queue_lock); 1303 if (down_interruptible(&sony_sem)) { 1304 spin_lock_irq(q->queue_lock); 1305 return; 1306 } 1307 1308 /* Get drive status before doing anything. */ 1309 while (handle_sony_cd_attention()); 1310 1311 /* Make sure we have a valid TOC. */ 1312 sony_get_toc(); 1313 1314 1315 /* Make sure the timer is cancelled. */ 1316 del_timer(&cdu31a_abort_timer); 1317 1318 while (1) { 1319 /* 1320 * The beginning here is stolen from the hard disk driver. I hope 1321 * it's right. 1322 */ 1323 req = elv_next_request(q); 1324 if (!req) 1325 goto end_do_cdu31a_request; 1326 1327 if (!sony_spun_up) 1328 scd_spinup(); 1329 1330 block = req->sector; 1331 nblock = req->nr_sectors; 1332 pr_debug(PFX "request at block %d, length %d blocks\n", 1333 block, nblock); 1334 if (!sony_toc_read) { 1335 printk(KERN_NOTICE PFX "TOC not read\n"); 1336 end_request(req, 0); 1337 continue; 1338 } 1339 1340 /* WTF??? */ 1341 if (!(req->flags & REQ_CMD)) 1342 continue; 1343 if (rq_data_dir(req) == WRITE) { 1344 end_request(req, 0); 1345 continue; 1346 } 1347 1348 /* 1349 * If the block address is invalid or the request goes beyond the end of 1350 * the media, return an error. 1351 */ 1352 if (((block + nblock) / 4) >= sony_toc.lead_out_start_lba) { 1353 printk(KERN_NOTICE PFX "Request past end of media\n"); 1354 end_request(req, 0); 1355 continue; 1356 } 1357 1358 if (nblock > 4) 1359 nblock = 4; 1360 num_retries = 0; 1361 1362 try_read_again: 1363 while (handle_sony_cd_attention()); 1364 1365 if (!sony_toc_read) { 1366 printk(KERN_NOTICE PFX "TOC not read\n"); 1367 end_request(req, 0); 1368 continue; 1369 } 1370 1371 /* If no data is left to be read from the drive, start the 1372 next request. */ 1373 if (sony_blocks_left == 0) { 1374 if (start_request(block / 4, nblock / 4)) { 1375 end_request(req, 0); 1376 continue; 1377 } 1378 } 1379 /* If the requested block is not the next one waiting in 1380 the driver, abort the current operation and start a 1381 new one. */ 1382 else if (block != sony_next_block) { 1383 pr_debug(PFX "Read for block %d, expected %d\n", 1384 block, sony_next_block); 1385 abort_read(); 1386 if (!sony_toc_read) { 1387 printk(KERN_NOTICE PFX "TOC not read\n"); 1388 end_request(req, 0); 1389 continue; 1390 } 1391 if (start_request(block / 4, nblock / 4)) { 1392 printk(KERN_NOTICE PFX "start request failed\n"); 1393 end_request(req, 0); 1394 continue; 1395 } 1396 } 1397 1398 read_data_block(req->buffer, block, nblock, res_reg, &res_size); 1399 1400 if (res_reg[0] != 0x20) { 1401 if (!end_that_request_first(req, 1, nblock)) { 1402 spin_lock_irq(q->queue_lock); 1403 blkdev_dequeue_request(req); 1404 end_that_request_last(req, 1); 1405 spin_unlock_irq(q->queue_lock); 1406 } 1407 continue; 1408 } 1409 1410 if (num_retries > MAX_CDU31A_RETRIES) { 1411 end_request(req, 0); 1412 continue; 1413 } 1414 1415 num_retries++; 1416 if (res_reg[1] == SONY_NOT_SPIN_ERR) { 1417 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, 1418 &res_size); 1419 } else { 1420 printk(KERN_NOTICE PFX "%s error for block %d, nblock %d\n", 1421 translate_error(res_reg[1]), block, nblock); 1422 } 1423 goto try_read_again; 1424 } 1425 end_do_cdu31a_request: 1426#if 0 1427 /* After finished, cancel any pending operations. */ 1428 abort_read(); 1429#else 1430 /* Start a timer to time out after a while to disable 1431 the read. */ 1432 cdu31a_abort_timer.expires = jiffies + 2 * HZ; /* Wait 2 seconds */ 1433 add_timer(&cdu31a_abort_timer); 1434#endif 1435 1436 up(&sony_sem); 1437 spin_lock_irq(q->queue_lock); 1438 pr_debug(PFX "Leaving %s at %d\n", __FUNCTION__, __LINE__); 1439} 1440 1441 1442/* 1443 * Read the table of contents from the drive and set up TOC if 1444 * successful. 1445 */ 1446static void sony_get_toc(void) 1447{ 1448 unsigned char res_reg[2]; 1449 unsigned int res_size; 1450 unsigned char parms[1]; 1451 int session; 1452 int num_spin_ups; 1453 int totaltracks = 0; 1454 int mint = 99; 1455 int maxt = 0; 1456 1457 pr_debug(PFX "Entering %s\n", __FUNCTION__); 1458 1459 num_spin_ups = 0; 1460 if (!sony_toc_read) { 1461 respinup_on_gettoc: 1462 /* Ignore the result, since it might error if spinning already. */ 1463 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, 1464 &res_size); 1465 1466 do_sony_cd_cmd(SONY_READ_TOC_CMD, NULL, 0, res_reg, 1467 &res_size); 1468 1469 /* The drive sometimes returns error 0. I don't know why, but ignore 1470 it. It seems to mean the drive has already done the operation. */ 1471 if ((res_size < 2) 1472 || ((res_reg[0] != 0) && (res_reg[1] != 0))) { 1473 /* If the drive is already playing, it's ok. */ 1474 if ((res_reg[1] == SONY_AUDIO_PLAYING_ERR) 1475 || (res_reg[1] == 0)) { 1476 goto gettoc_drive_spinning; 1477 } 1478 1479 /* If the drive says it is not spun up (even though we just did it!) 1480 then retry the operation at least a few times. */ 1481 if ((res_reg[1] == SONY_NOT_SPIN_ERR) 1482 && (num_spin_ups < MAX_CDU31A_RETRIES)) { 1483 num_spin_ups++; 1484 goto respinup_on_gettoc; 1485 } 1486 1487 printk("cdu31a: Error reading TOC: %x %s\n", 1488 res_reg[0], translate_error(res_reg[1])); 1489 return; 1490 } 1491 1492 gettoc_drive_spinning: 1493 1494 /* The idea here is we keep asking for sessions until the command 1495 fails. Then we know what the last valid session on the disk is. 1496 No need to check session 0, since session 0 is the same as session 1497 1; the command returns different information if you give it 0. 1498 */ 1499#if DEBUG 1500 memset(&sony_toc, 0x0e, sizeof(sony_toc)); 1501 memset(&single_toc, 0x0f, sizeof(single_toc)); 1502#endif 1503 session = 1; 1504 while (1) { 1505/* This seems to slow things down enough to make it work. This 1506 * appears to be a problem in do_sony_cd_cmd. This printk seems 1507 * to address the symptoms... -Erik */ 1508 pr_debug(PFX "Trying session %d\n", session); 1509 parms[0] = session; 1510 do_sony_cd_cmd(SONY_READ_TOC_SPEC_CMD, 1511 parms, 1, res_reg, &res_size); 1512 1513 pr_debug(PFX "%2.2x %2.2x\n", res_reg[0], res_reg[1]); 1514 1515 if ((res_size < 2) 1516 || ((res_reg[0] & 0xf0) == 0x20)) { 1517 /* An error reading the TOC, this must be past the last session. */ 1518 if (session == 1) 1519 printk 1520 ("Yikes! Couldn't read any sessions!"); 1521 break; 1522 } 1523 pr_debug(PFX "Reading session %d\n", session); 1524 1525 parms[0] = session; 1526 do_sony_cd_cmd(SONY_REQ_TOC_DATA_SPEC_CMD, 1527 parms, 1528 1, 1529 (unsigned char *) &single_toc, 1530 &res_size); 1531 if ((res_size < 2) 1532 || ((single_toc.exec_status[0] & 0xf0) == 1533 0x20)) { 1534 printk(KERN_ERR PFX "Error reading " 1535 "session %d: %x %s\n", 1536 session, single_toc.exec_status[0], 1537 translate_error(single_toc. 1538 exec_status[1])); 1539 /* An error reading the TOC. Return without sony_toc_read 1540 set. */ 1541 return; 1542 } 1543 pr_debug(PFX "add0 %01x, con0 %01x, poi0 %02x, " 1544 "1st trk %d, dsktyp %x, dum0 %x\n", 1545 single_toc.address0, single_toc.control0, 1546 single_toc.point0, 1547 bcd_to_int(single_toc.first_track_num), 1548 single_toc.disk_type, single_toc.dummy0); 1549 pr_debug(PFX "add1 %01x, con1 %01x, poi1 %02x, " 1550 "lst trk %d, dummy1 %x, dum2 %x\n", 1551 single_toc.address1, single_toc.control1, 1552 single_toc.point1, 1553 bcd_to_int(single_toc.last_track_num), 1554 single_toc.dummy1, single_toc.dummy2); 1555 pr_debug(PFX "add2 %01x, con2 %01x, poi2 %02x " 1556 "leadout start min %d, sec %d, frame %d\n", 1557 single_toc.address2, single_toc.control2, 1558 single_toc.point2, 1559 bcd_to_int(single_toc.lead_out_start_msf[0]), 1560 bcd_to_int(single_toc.lead_out_start_msf[1]), 1561 bcd_to_int(single_toc.lead_out_start_msf[2])); 1562 if (res_size > 18 && single_toc.pointb0 > 0xaf) 1563 pr_debug(PFX "addb0 %01x, conb0 %01x, poib0 %02x, nextsession min %d, sec %d, frame %d\n" 1564 "#mode5_ptrs %02d, max_start_outer_leadout_msf min %d, sec %d, frame %d\n", 1565 single_toc.addressb0, 1566 single_toc.controlb0, 1567 single_toc.pointb0, 1568 bcd_to_int(single_toc. 1569 next_poss_prog_area_msf 1570 [0]), 1571 bcd_to_int(single_toc. 1572 next_poss_prog_area_msf 1573 [1]), 1574 bcd_to_int(single_toc. 1575 next_poss_prog_area_msf 1576 [2]), 1577 single_toc.num_mode_5_pointers, 1578 bcd_to_int(single_toc. 1579 max_start_outer_leadout_msf 1580 [0]), 1581 bcd_to_int(single_toc. 1582 max_start_outer_leadout_msf 1583 [1]), 1584 bcd_to_int(single_toc. 1585 max_start_outer_leadout_msf 1586 [2])); 1587 if (res_size > 27 && single_toc.pointb1 > 0xaf) 1588 pr_debug(PFX "addb1 %01x, conb1 %01x, poib1 %02x, %x %x %x %x #skipint_ptrs %d, #skiptrkassign %d %x\n", 1589 single_toc.addressb1, 1590 single_toc.controlb1, 1591 single_toc.pointb1, 1592 single_toc.dummyb0_1[0], 1593 single_toc.dummyb0_1[1], 1594 single_toc.dummyb0_1[2], 1595 single_toc.dummyb0_1[3], 1596 single_toc.num_skip_interval_pointers, 1597 single_toc.num_skip_track_assignments, 1598 single_toc.dummyb0_2); 1599 if (res_size > 36 && single_toc.pointb2 > 0xaf) 1600 pr_debug(PFX "addb2 %01x, conb2 %01x, poib2 %02x, %02x %02x %02x %02x %02x %02x %02x\n", 1601 single_toc.addressb2, 1602 single_toc.controlb2, 1603 single_toc.pointb2, 1604 single_toc.tracksb2[0], 1605 single_toc.tracksb2[1], 1606 single_toc.tracksb2[2], 1607 single_toc.tracksb2[3], 1608 single_toc.tracksb2[4], 1609 single_toc.tracksb2[5], 1610 single_toc.tracksb2[6]); 1611 if (res_size > 45 && single_toc.pointb3 > 0xaf) 1612 pr_debug(PFX "addb3 %01x, conb3 %01x, poib3 %02x, %02x %02x %02x %02x %02x %02x %02x\n", 1613 single_toc.addressb3, 1614 single_toc.controlb3, 1615 single_toc.pointb3, 1616 single_toc.tracksb3[0], 1617 single_toc.tracksb3[1], 1618 single_toc.tracksb3[2], 1619 single_toc.tracksb3[3], 1620 single_toc.tracksb3[4], 1621 single_toc.tracksb3[5], 1622 single_toc.tracksb3[6]); 1623 if (res_size > 54 && single_toc.pointb4 > 0xaf) 1624 pr_debug(PFX "addb4 %01x, conb4 %01x, poib4 %02x, %02x %02x %02x %02x %02x %02x %02x\n", 1625 single_toc.addressb4, 1626 single_toc.controlb4, 1627 single_toc.pointb4, 1628 single_toc.tracksb4[0], 1629 single_toc.tracksb4[1], 1630 single_toc.tracksb4[2], 1631 single_toc.tracksb4[3], 1632 single_toc.tracksb4[4], 1633 single_toc.tracksb4[5], 1634 single_toc.tracksb4[6]); 1635 if (res_size > 63 && single_toc.pointc0 > 0xaf) 1636 pr_debug(PFX "addc0 %01x, conc0 %01x, poic0 %02x, %02x %02x %02x %02x %02x %02x %02x\n", 1637 single_toc.addressc0, 1638 single_toc.controlc0, 1639 single_toc.pointc0, 1640 single_toc.dummyc0[0], 1641 single_toc.dummyc0[1], 1642 single_toc.dummyc0[2], 1643 single_toc.dummyc0[3], 1644 single_toc.dummyc0[4], 1645 single_toc.dummyc0[5], 1646 single_toc.dummyc0[6]); 1647#undef DEBUG 1648#define DEBUG 0 1649 1650 sony_toc.lead_out_start_msf[0] = 1651 bcd_to_int(single_toc.lead_out_start_msf[0]); 1652 sony_toc.lead_out_start_msf[1] = 1653 bcd_to_int(single_toc.lead_out_start_msf[1]); 1654 sony_toc.lead_out_start_msf[2] = 1655 bcd_to_int(single_toc.lead_out_start_msf[2]); 1656 sony_toc.lead_out_start_lba = 1657 single_toc.lead_out_start_lba = 1658 msf_to_log(sony_toc.lead_out_start_msf); 1659 1660 /* For points that do not exist, move the data over them 1661 to the right location. */ 1662 if (single_toc.pointb0 != 0xb0) { 1663 memmove(((char *) &single_toc) + 27, 1664 ((char *) &single_toc) + 18, 1665 res_size - 18); 1666 res_size += 9; 1667 } else if (res_size > 18) { 1668 sony_toc.lead_out_start_msf[0] = 1669 bcd_to_int(single_toc. 1670 max_start_outer_leadout_msf 1671 [0]); 1672 sony_toc.lead_out_start_msf[1] = 1673 bcd_to_int(single_toc. 1674 max_start_outer_leadout_msf 1675 [1]); 1676 sony_toc.lead_out_start_msf[2] = 1677 bcd_to_int(single_toc. 1678 max_start_outer_leadout_msf 1679 [2]); 1680 sony_toc.lead_out_start_lba = 1681 msf_to_log(sony_toc. 1682 lead_out_start_msf); 1683 } 1684 if (single_toc.pointb1 != 0xb1) { 1685 memmove(((char *) &single_toc) + 36, 1686 ((char *) &single_toc) + 27, 1687 res_size - 27); 1688 res_size += 9; 1689 } 1690 if (single_toc.pointb2 != 0xb2) { 1691 memmove(((char *) &single_toc) + 45, 1692 ((char *) &single_toc) + 36, 1693 res_size - 36); 1694 res_size += 9; 1695 } 1696 if (single_toc.pointb3 != 0xb3) { 1697 memmove(((char *) &single_toc) + 54, 1698 ((char *) &single_toc) + 45, 1699 res_size - 45); 1700 res_size += 9; 1701 } 1702 if (single_toc.pointb4 != 0xb4) { 1703 memmove(((char *) &single_toc) + 63, 1704 ((char *) &single_toc) + 54, 1705 res_size - 54); 1706 res_size += 9; 1707 } 1708 if (single_toc.pointc0 != 0xc0) { 1709 memmove(((char *) &single_toc) + 72, 1710 ((char *) &single_toc) + 63, 1711 res_size - 63); 1712 res_size += 9; 1713 } 1714#if DEBUG 1715 printk(PRINT_INFO PFX "start track lba %u, " 1716 "leadout start lba %u\n", 1717 single_toc.start_track_lba, 1718 single_toc.lead_out_start_lba); 1719 { 1720 int i; 1721 for (i = 0; 1722 i < 1723 1 + 1724 bcd_to_int(single_toc.last_track_num) 1725 - 1726 bcd_to_int(single_toc. 1727 first_track_num); i++) { 1728 printk(KERN_INFO PFX "trk %02d: add 0x%01x, con 0x%01x, track %02d, start min %02d, sec %02d, frame %02d\n", 1729 i, 1730 single_toc.tracks[i].address, 1731 single_toc.tracks[i].control, 1732 bcd_to_int(single_toc. 1733 tracks[i].track), 1734 bcd_to_int(single_toc. 1735 tracks[i]. 1736 track_start_msf 1737 [0]), 1738 bcd_to_int(single_toc. 1739 tracks[i]. 1740 track_start_msf 1741 [1]), 1742 bcd_to_int(single_toc. 1743 tracks[i]. 1744 track_start_msf 1745 [2])); 1746 if (mint > 1747 bcd_to_int(single_toc. 1748 tracks[i].track)) 1749 mint = 1750 bcd_to_int(single_toc. 1751 tracks[i]. 1752 track); 1753 if (maxt < 1754 bcd_to_int(single_toc. 1755 tracks[i].track)) 1756 maxt = 1757 bcd_to_int(single_toc. 1758 tracks[i]. 1759 track); 1760 } 1761 printk(KERN_INFO PFX "min track number %d, " 1762 "max track number %d\n", 1763 mint, maxt); 1764 } 1765#endif 1766 1767 /* prepare a special table of contents for a CD-I disc. They don't have one. */ 1768 if (single_toc.disk_type == 0x10 && 1769 single_toc.first_track_num == 2 && 1770 single_toc.last_track_num == 2 /* CD-I */ ) { 1771 sony_toc.tracks[totaltracks].address = 1; 1772 sony_toc.tracks[totaltracks].control = 4; /* force data tracks */ 1773 sony_toc.tracks[totaltracks].track = 1; 1774 sony_toc.tracks[totaltracks]. 1775 track_start_msf[0] = 0; 1776 sony_toc.tracks[totaltracks]. 1777 track_start_msf[1] = 2; 1778 sony_toc.tracks[totaltracks]. 1779 track_start_msf[2] = 0; 1780 mint = maxt = 1; 1781 totaltracks++; 1782 } else 1783 /* gather track entries from this session */ 1784 { 1785 int i; 1786 for (i = 0; 1787 i < 1788 1 + 1789 bcd_to_int(single_toc.last_track_num) 1790 - 1791 bcd_to_int(single_toc. 1792 first_track_num); 1793 i++, totaltracks++) { 1794 sony_toc.tracks[totaltracks]. 1795 address = 1796 single_toc.tracks[i].address; 1797 sony_toc.tracks[totaltracks]. 1798 control = 1799 single_toc.tracks[i].control; 1800 sony_toc.tracks[totaltracks]. 1801 track = 1802 bcd_to_int(single_toc. 1803 tracks[i].track); 1804 sony_toc.tracks[totaltracks]. 1805 track_start_msf[0] = 1806 bcd_to_int(single_toc. 1807 tracks[i]. 1808 track_start_msf[0]); 1809 sony_toc.tracks[totaltracks]. 1810 track_start_msf[1] = 1811 bcd_to_int(single_toc. 1812 tracks[i]. 1813 track_start_msf[1]); 1814 sony_toc.tracks[totaltracks]. 1815 track_start_msf[2] = 1816 bcd_to_int(single_toc. 1817 tracks[i]. 1818 track_start_msf[2]); 1819 if (i == 0) 1820 single_toc. 1821 start_track_lba = 1822 msf_to_log(sony_toc. 1823 tracks 1824 [totaltracks]. 1825 track_start_msf); 1826 if (mint > 1827 sony_toc.tracks[totaltracks]. 1828 track) 1829 mint = 1830 sony_toc. 1831 tracks[totaltracks]. 1832 track; 1833 if (maxt < 1834 sony_toc.tracks[totaltracks]. 1835 track) 1836 maxt = 1837 sony_toc. 1838 tracks[totaltracks]. 1839 track; 1840 } 1841 } 1842 sony_toc.first_track_num = mint; 1843 sony_toc.last_track_num = maxt; 1844 /* Disk type of last session wins. For example: 1845 CD-Extra has disk type 0 for the first session, so 1846 a dumb HiFi CD player thinks it is a plain audio CD. 1847 We are interested in the disk type of the last session, 1848 which is 0x20 (XA) for CD-Extra, so we can access the 1849 data track ... */ 1850 sony_toc.disk_type = single_toc.disk_type; 1851 sony_toc.sessions = session; 1852 1853 /* don't believe everything :-) */ 1854 if (session == 1) 1855 single_toc.start_track_lba = 0; 1856 sony_toc.start_track_lba = 1857 single_toc.start_track_lba; 1858 1859 if (session > 1 && single_toc.pointb0 == 0xb0 && 1860 sony_toc.lead_out_start_lba == 1861 single_toc.lead_out_start_lba) { 1862 break; 1863 } 1864 1865 /* Let's not get carried away... */ 1866 if (session > 40) { 1867 printk(KERN_NOTICE PFX "too many sessions: " 1868 "%d\n", session); 1869 break; 1870 } 1871 session++; 1872 } 1873 sony_toc.track_entries = totaltracks; 1874 /* add one entry for the LAST track with track number CDROM_LEADOUT */ 1875 sony_toc.tracks[totaltracks].address = single_toc.address2; 1876 sony_toc.tracks[totaltracks].control = single_toc.control2; 1877 sony_toc.tracks[totaltracks].track = CDROM_LEADOUT; 1878 sony_toc.tracks[totaltracks].track_start_msf[0] = 1879 sony_toc.lead_out_start_msf[0]; 1880 sony_toc.tracks[totaltracks].track_start_msf[1] = 1881 sony_toc.lead_out_start_msf[1]; 1882 sony_toc.tracks[totaltracks].track_start_msf[2] = 1883 sony_toc.lead_out_start_msf[2]; 1884 1885 sony_toc_read = 1; 1886 1887 pr_debug(PFX "Disk session %d, start track: %d, " 1888 "stop track: %d\n", 1889 session, single_toc.start_track_lba, 1890 single_toc.lead_out_start_lba); 1891 } 1892 pr_debug(PFX "Leaving %s\n", __FUNCTION__); 1893} 1894 1895 1896/* 1897 * Uniform cdrom interface function 1898 * return multisession offset and sector information 1899 */ 1900static int scd_get_last_session(struct cdrom_device_info *cdi, 1901 struct cdrom_multisession *ms_info) 1902{ 1903 if (ms_info == NULL) 1904 return 1; 1905 1906 if (!sony_toc_read) { 1907 if (down_interruptible(&sony_sem)) 1908 return -ERESTARTSYS; 1909 sony_get_toc(); 1910 up(&sony_sem); 1911 } 1912 1913 ms_info->addr_format = CDROM_LBA; 1914 ms_info->addr.lba = sony_toc.start_track_lba; 1915 ms_info->xa_flag = sony_toc.disk_type == SONY_XA_DISK_TYPE || 1916 sony_toc.disk_type == 0x10 /* CDI */ ; 1917 1918 return 0; 1919} 1920 1921/* 1922 * Search for a specific track in the table of contents. 1923 */ 1924static int find_track(int track) 1925{ 1926 int i; 1927 1928 for (i = 0; i <= sony_toc.track_entries; i++) { 1929 if (sony_toc.tracks[i].track == track) { 1930 return i; 1931 } 1932 } 1933 1934 return -1; 1935} 1936 1937 1938/* 1939 * Read the subcode and put it in last_sony_subcode for future use. 1940 */ 1941static int read_subcode(void) 1942{ 1943 unsigned int res_size; 1944 1945 1946 do_sony_cd_cmd(SONY_REQ_SUBCODE_ADDRESS_CMD, 1947 NULL, 1948 0, (unsigned char *) &last_sony_subcode, &res_size); 1949 if ((res_size < 2) 1950 || ((last_sony_subcode.exec_status[0] & 0xf0) == 0x20)) { 1951 printk(KERN_ERR PFX "Sony CDROM error %s (read_subcode)\n", 1952 translate_error(last_sony_subcode.exec_status[1])); 1953 return -EIO; 1954 } 1955 1956 last_sony_subcode.track_num = 1957 bcd_to_int(last_sony_subcode.track_num); 1958 last_sony_subcode.index_num = 1959 bcd_to_int(last_sony_subcode.index_num); 1960 last_sony_subcode.abs_msf[0] = 1961 bcd_to_int(last_sony_subcode.abs_msf[0]); 1962 last_sony_subcode.abs_msf[1] = 1963 bcd_to_int(last_sony_subcode.abs_msf[1]); 1964 last_sony_subcode.abs_msf[2] = 1965 bcd_to_int(last_sony_subcode.abs_msf[2]); 1966 1967 last_sony_subcode.rel_msf[0] = 1968 bcd_to_int(last_sony_subcode.rel_msf[0]); 1969 last_sony_subcode.rel_msf[1] = 1970 bcd_to_int(last_sony_subcode.rel_msf[1]); 1971 last_sony_subcode.rel_msf[2] = 1972 bcd_to_int(last_sony_subcode.rel_msf[2]); 1973 return 0; 1974} 1975 1976/* 1977 * Uniform cdrom interface function 1978 * return the media catalog number found on some older audio cds 1979 */ 1980static int 1981scd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn) 1982{ 1983 unsigned char resbuffer[2 + 14]; 1984 unsigned char *mcnp = mcn->medium_catalog_number; 1985 unsigned char *resp = resbuffer + 3; 1986 unsigned int res_size; 1987 1988 memset(mcn->medium_catalog_number, 0, 14); 1989 if (down_interruptible(&sony_sem)) 1990 return -ERESTARTSYS; 1991 do_sony_cd_cmd(SONY_REQ_UPC_EAN_CMD, 1992 NULL, 0, resbuffer, &res_size); 1993 up(&sony_sem); 1994 if ((res_size < 2) || ((resbuffer[0] & 0xf0) == 0x20)); 1995 else { 1996 /* packed bcd to single ASCII digits */ 1997 *mcnp++ = (*resp >> 4) + '0'; 1998 *mcnp++ = (*resp++ & 0x0f) + '0'; 1999 *mcnp++ = (*resp >> 4) + '0'; 2000 *mcnp++ = (*resp++ & 0x0f) + '0'; 2001 *mcnp++ = (*resp >> 4) + '0'; 2002 *mcnp++ = (*resp++ & 0x0f) + '0'; 2003 *mcnp++ = (*resp >> 4) + '0'; 2004 *mcnp++ = (*resp++ & 0x0f) + '0'; 2005 *mcnp++ = (*resp >> 4) + '0'; 2006 *mcnp++ = (*resp++ & 0x0f) + '0'; 2007 *mcnp++ = (*resp >> 4) + '0'; 2008 *mcnp++ = (*resp++ & 0x0f) + '0'; 2009 *mcnp++ = (*resp >> 4) + '0'; 2010 } 2011 *mcnp = '\0'; 2012 return 0; 2013} 2014 2015 2016/* 2017 * Get the subchannel info like the CDROMSUBCHNL command wants to see it. If 2018 * the drive is playing, the subchannel needs to be read (since it would be 2019 * changing). If the drive is paused or completed, the subcode information has 2020 * already been stored, just use that. The ioctl call wants things in decimal 2021 * (not BCD), so all the conversions are done. 2022 */ 2023static int sony_get_subchnl_info(struct cdrom_subchnl *schi) 2024{ 2025 /* Get attention stuff */ 2026 while (handle_sony_cd_attention()); 2027 2028 sony_get_toc(); 2029 if (!sony_toc_read) { 2030 return -EIO; 2031 } 2032 2033 switch (sony_audio_status) { 2034 case CDROM_AUDIO_NO_STATUS: 2035 case CDROM_AUDIO_PLAY: 2036 if (read_subcode() < 0) { 2037 return -EIO; 2038 } 2039 break; 2040 2041 case CDROM_AUDIO_PAUSED: 2042 case CDROM_AUDIO_COMPLETED: 2043 break; 2044 2045#if 0 2046 case CDROM_AUDIO_NO_STATUS: 2047 schi->cdsc_audiostatus = sony_audio_status; 2048 return 0; 2049 break; 2050#endif 2051 case CDROM_AUDIO_INVALID: 2052 case CDROM_AUDIO_ERROR: 2053 default: 2054 return -EIO; 2055 } 2056 2057 schi->cdsc_audiostatus = sony_audio_status; 2058 schi->cdsc_adr = last_sony_subcode.address; 2059 schi->cdsc_ctrl = last_sony_subcode.control; 2060 schi->cdsc_trk = last_sony_subcode.track_num; 2061 schi->cdsc_ind = last_sony_subcode.index_num; 2062 if (schi->cdsc_format == CDROM_MSF) { 2063 schi->cdsc_absaddr.msf.minute = 2064 last_sony_subcode.abs_msf[0]; 2065 schi->cdsc_absaddr.msf.second = 2066 last_sony_subcode.abs_msf[1]; 2067 schi->cdsc_absaddr.msf.frame = 2068 last_sony_subcode.abs_msf[2]; 2069 2070 schi->cdsc_reladdr.msf.minute = 2071 last_sony_subcode.rel_msf[0]; 2072 schi->cdsc_reladdr.msf.second = 2073 last_sony_subcode.rel_msf[1]; 2074 schi->cdsc_reladdr.msf.frame = 2075 last_sony_subcode.rel_msf[2]; 2076 } else if (schi->cdsc_format == CDROM_LBA) { 2077 schi->cdsc_absaddr.lba = 2078 msf_to_log(last_sony_subcode.abs_msf); 2079 schi->cdsc_reladdr.lba = 2080 msf_to_log(last_sony_subcode.rel_msf); 2081 } 2082 2083 return 0; 2084} 2085 2086/* Get audio data from the drive. This is fairly complex because I 2087 am looking for status and data at the same time, but if I get status 2088 then I just look for data. I need to get the status immediately so 2089 the switch from audio to data tracks will happen quickly. */ 2090static void 2091read_audio_data(char *buffer, unsigned char res_reg[], int *res_size) 2092{ 2093 unsigned long retry_count; 2094 int result_read; 2095 2096 2097 res_reg[0] = 0; 2098 res_reg[1] = 0; 2099 *res_size = 0; 2100 result_read = 0; 2101 2102 /* Wait for the drive to tell us we have something */ 2103 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 2104 continue_read_audio_wait: 2105 while (time_before(jiffies, retry_count) && !(is_data_ready()) 2106 && !(is_result_ready() || result_read)) { 2107 while (handle_sony_cd_attention()); 2108 2109 sony_sleep(); 2110 } 2111 if (!(is_data_ready())) { 2112 if (is_result_ready() && !result_read) { 2113 get_result(res_reg, res_size); 2114 2115 /* Read block status and continue waiting for data. */ 2116 if ((res_reg[0] & 0xf0) == 0x50) { 2117 result_read = 1; 2118 goto continue_read_audio_wait; 2119 } 2120 /* Invalid data from the drive. Shut down the operation. */ 2121 else if ((res_reg[0] & 0xf0) != 0x20) { 2122 printk(KERN_WARNING PFX "Got result that " 2123 "should have been error: %d\n", 2124 res_reg[0]); 2125 res_reg[0] = 0x20; 2126 res_reg[1] = SONY_BAD_DATA_ERR; 2127 *res_size = 2; 2128 } 2129 abort_read(); 2130 } else { 2131 pr_debug(PFX "timeout out %d\n", __LINE__); 2132 res_reg[0] = 0x20; 2133 res_reg[1] = SONY_TIMEOUT_OP_ERR; 2134 *res_size = 2; 2135 abort_read(); 2136 } 2137 } else { 2138 clear_data_ready(); 2139 2140 /* If data block, then get 2340 bytes offset by 12. */ 2141 if (sony_raw_data_mode) { 2142 insb(sony_cd_read_reg, buffer + CD_XA_HEAD, 2143 CD_FRAMESIZE_RAW1); 2144 } else { 2145 /* Audio gets the whole 2352 bytes. */ 2146 insb(sony_cd_read_reg, buffer, CD_FRAMESIZE_RAW); 2147 } 2148 2149 /* If I haven't already gotten the result, get it now. */ 2150 if (!result_read) { 2151 /* Wait for the drive to tell us we have something */ 2152 retry_count = jiffies + SONY_JIFFIES_TIMEOUT; 2153 while (time_before(jiffies, retry_count) 2154 && !(is_result_ready())) { 2155 while (handle_sony_cd_attention()); 2156 2157 sony_sleep(); 2158 } 2159 2160 if (!is_result_ready()) { 2161 pr_debug(PFX "timeout out %d\n", __LINE__); 2162 res_reg[0] = 0x20; 2163 res_reg[1] = SONY_TIMEOUT_OP_ERR; 2164 *res_size = 2; 2165 abort_read(); 2166 return; 2167 } else { 2168 get_result(res_reg, res_size); 2169 } 2170 } 2171 2172 if ((res_reg[0] & 0xf0) == 0x50) { 2173 if ((res_reg[0] == SONY_NO_CIRC_ERR_BLK_STAT) 2174 || (res_reg[0] == SONY_NO_LECC_ERR_BLK_STAT) 2175 || (res_reg[0] == SONY_RECOV_LECC_ERR_BLK_STAT) 2176 || (res_reg[0] == SONY_NO_ERR_DETECTION_STAT)) { 2177 /* Ok, nothing to do. */ 2178 } else { 2179 printk(KERN_ERR PFX "Data block error: 0x%x\n", 2180 res_reg[0]); 2181 res_reg[0] = 0x20; 2182 res_reg[1] = SONY_BAD_DATA_ERR; 2183 *res_size = 2; 2184 } 2185 } else if ((res_reg[0] & 0xf0) != 0x20) { 2186 /* The drive gave me bad status, I don't know what to do. 2187 Reset the driver and return an error. */ 2188 printk(KERN_NOTICE PFX "Invalid block status: 0x%x\n", 2189 res_reg[0]); 2190 restart_on_error(); 2191 res_reg[0] = 0x20; 2192 res_reg[1] = SONY_BAD_DATA_ERR; 2193 *res_size = 2; 2194 } 2195 } 2196} 2197 2198/* Perform a raw data read. This will automatically detect the 2199 track type and read the proper data (audio or data). */ 2200static int read_audio(struct cdrom_read_audio *ra) 2201{ 2202 int retval; 2203 unsigned char params[2]; 2204 unsigned char res_reg[12]; 2205 unsigned int res_size; 2206 unsigned int cframe; 2207 2208 if (down_interruptible(&sony_sem)) 2209 return -ERESTARTSYS; 2210 if (!sony_spun_up) 2211 scd_spinup(); 2212 2213 /* Set the drive to do raw operations. */ 2214 params[0] = SONY_SD_DECODE_PARAM; 2215 params[1] = 0x06 | sony_raw_data_mode; 2216 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 2217 params, 2, res_reg, &res_size); 2218 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) { 2219 printk(KERN_ERR PFX "Unable to set decode params: 0x%2.2x\n", 2220 res_reg[1]); 2221 retval = -EIO; 2222 goto out_up; 2223 } 2224 2225 /* From here down, we have to goto exit_read_audio instead of returning 2226 because the drive parameters have to be set back to data before 2227 return. */ 2228 2229 retval = 0; 2230 if (start_request(ra->addr.lba, ra->nframes)) { 2231 retval = -EIO; 2232 goto exit_read_audio; 2233 } 2234 2235 /* For every requested frame. */ 2236 cframe = 0; 2237 while (cframe < ra->nframes) { 2238 read_audio_data(audio_buffer, res_reg, &res_size); 2239 if ((res_reg[0] & 0xf0) == 0x20) { 2240 if (res_reg[1] == SONY_BAD_DATA_ERR) { 2241 printk(KERN_ERR PFX "Data error on audio " 2242 "sector %d\n", 2243 ra->addr.lba + cframe); 2244 } else if (res_reg[1] == SONY_ILL_TRACK_R_ERR) { 2245 /* Illegal track type, change track types and start over. */ 2246 sony_raw_data_mode = 2247 (sony_raw_data_mode) ? 0 : 1; 2248 2249 /* Set the drive mode. */ 2250 params[0] = SONY_SD_DECODE_PARAM; 2251 params[1] = 0x06 | sony_raw_data_mode; 2252 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 2253 params, 2254 2, res_reg, &res_size); 2255 if ((res_size < 2) 2256 || ((res_reg[0] & 0xf0) == 0x20)) { 2257 printk(KERN_ERR PFX "Unable to set " 2258 "decode params: 0x%2.2x\n", 2259 res_reg[1]); 2260 retval = -EIO; 2261 goto exit_read_audio; 2262 } 2263 2264 /* Restart the request on the current frame. */ 2265 if (start_request 2266 (ra->addr.lba + cframe, 2267 ra->nframes - cframe)) { 2268 retval = -EIO; 2269 goto exit_read_audio; 2270 } 2271 2272 /* Don't go back to the top because don't want to get into 2273 and infinite loop. A lot of code gets duplicated, but 2274 that's no big deal, I don't guess. */ 2275 read_audio_data(audio_buffer, res_reg, 2276 &res_size); 2277 if ((res_reg[0] & 0xf0) == 0x20) { 2278 if (res_reg[1] == 2279 SONY_BAD_DATA_ERR) { 2280 printk(KERN_ERR PFX "Data error" 2281 " on audio sector %d\n", 2282 ra->addr.lba + 2283 cframe); 2284 } else { 2285 printk(KERN_ERR PFX "Error reading audio data on sector %d: %s\n", 2286 ra->addr.lba + cframe, 2287 translate_error 2288 (res_reg[1])); 2289 retval = -EIO; 2290 goto exit_read_audio; 2291 } 2292 } else if (copy_to_user(ra->buf + 2293 (CD_FRAMESIZE_RAW 2294 * cframe), 2295 audio_buffer, 2296 CD_FRAMESIZE_RAW)) { 2297 retval = -EFAULT; 2298 goto exit_read_audio; 2299 } 2300 } else { 2301 printk(KERN_ERR PFX "Error reading audio " 2302 "data on sector %d: %s\n", 2303 ra->addr.lba + cframe, 2304 translate_error(res_reg[1])); 2305 retval = -EIO; 2306 goto exit_read_audio; 2307 } 2308 } else if (copy_to_user(ra->buf + (CD_FRAMESIZE_RAW * cframe), 2309 (char *)audio_buffer, 2310 CD_FRAMESIZE_RAW)) { 2311 retval = -EFAULT; 2312 goto exit_read_audio; 2313 } 2314 2315 cframe++; 2316 } 2317 2318 get_result(res_reg, &res_size); 2319 if ((res_reg[0] & 0xf0) == 0x20) { 2320 printk(KERN_ERR PFX "Error return from audio read: %s\n", 2321 translate_error(res_reg[1])); 2322 retval = -EIO; 2323 goto exit_read_audio; 2324 } 2325 2326 exit_read_audio: 2327 2328 /* Set the drive mode back to the proper one for the disk. */ 2329 params[0] = SONY_SD_DECODE_PARAM; 2330 if (!sony_xa_mode) { 2331 params[1] = 0x0f; 2332 } else { 2333 params[1] = 0x07; 2334 } 2335 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 2336 params, 2, res_reg, &res_size); 2337 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) { 2338 printk(KERN_ERR PFX "Unable to reset decode params: 0x%2.2x\n", 2339 res_reg[1]); 2340 retval = -EIO; 2341 } 2342 2343 out_up: 2344 up(&sony_sem); 2345 2346 return retval; 2347} 2348 2349static int 2350do_sony_cd_cmd_chk(const char *name, 2351 unsigned char cmd, 2352 unsigned char *params, 2353 unsigned int num_params, 2354 unsigned char *result_buffer, unsigned int *result_size) 2355{ 2356 do_sony_cd_cmd(cmd, params, num_params, result_buffer, 2357 result_size); 2358 if ((*result_size < 2) || ((result_buffer[0] & 0xf0) == 0x20)) { 2359 printk(KERN_ERR PFX "Error %s (CDROM%s)\n", 2360 translate_error(result_buffer[1]), name); 2361 return -EIO; 2362 } 2363 return 0; 2364} 2365 2366/* 2367 * Uniform cdrom interface function 2368 * open the tray 2369 */ 2370static int scd_tray_move(struct cdrom_device_info *cdi, int position) 2371{ 2372 int retval; 2373 2374 if (down_interruptible(&sony_sem)) 2375 return -ERESTARTSYS; 2376 if (position == 1 /* open tray */ ) { 2377 unsigned char res_reg[12]; 2378 unsigned int res_size; 2379 2380 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg, 2381 &res_size); 2382 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, 2383 &res_size); 2384 2385 sony_audio_status = CDROM_AUDIO_INVALID; 2386 retval = do_sony_cd_cmd_chk("EJECT", SONY_EJECT_CMD, NULL, 0, 2387 res_reg, &res_size); 2388 } else { 2389 if (0 == scd_spinup()) 2390 sony_spun_up = 1; 2391 retval = 0; 2392 } 2393 up(&sony_sem); 2394 return retval; 2395} 2396 2397/* 2398 * The big ugly ioctl handler. 2399 */ 2400static int scd_audio_ioctl(struct cdrom_device_info *cdi, 2401 unsigned int cmd, void *arg) 2402{ 2403 unsigned char res_reg[12]; 2404 unsigned int res_size; 2405 unsigned char params[7]; 2406 int i, retval; 2407 2408 if (down_interruptible(&sony_sem)) 2409 return -ERESTARTSYS; 2410 switch (cmd) { 2411 case CDROMSTART: /* Spin up the drive */ 2412 retval = do_sony_cd_cmd_chk("START", SONY_SPIN_UP_CMD, NULL, 2413 0, res_reg, &res_size); 2414 break; 2415 2416 case CDROMSTOP: /* Spin down the drive */ 2417 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg, 2418 &res_size); 2419 2420 /* 2421 * Spin the drive down, ignoring the error if the disk was 2422 * already not spinning. 2423 */ 2424 sony_audio_status = CDROM_AUDIO_NO_STATUS; 2425 retval = do_sony_cd_cmd_chk("STOP", SONY_SPIN_DOWN_CMD, NULL, 2426 0, res_reg, &res_size); 2427 break; 2428 2429 case CDROMPAUSE: /* Pause the drive */ 2430 if (do_sony_cd_cmd_chk 2431 ("PAUSE", SONY_AUDIO_STOP_CMD, NULL, 0, res_reg, 2432 &res_size)) { 2433 retval = -EIO; 2434 break; 2435 } 2436 /* Get the current position and save it for resuming */ 2437 if (read_subcode() < 0) { 2438 retval = -EIO; 2439 break; 2440 } 2441 cur_pos_msf[0] = last_sony_subcode.abs_msf[0]; 2442 cur_pos_msf[1] = last_sony_subcode.abs_msf[1]; 2443 cur_pos_msf[2] = last_sony_subcode.abs_msf[2]; 2444 sony_audio_status = CDROM_AUDIO_PAUSED; 2445 retval = 0; 2446 break; 2447 2448 case CDROMRESUME: /* Start the drive after being paused */ 2449 if (sony_audio_status != CDROM_AUDIO_PAUSED) { 2450 retval = -EINVAL; 2451 break; 2452 } 2453 2454 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, 2455 &res_size); 2456 2457 /* Start the drive at the saved position. */ 2458 params[1] = int_to_bcd(cur_pos_msf[0]); 2459 params[2] = int_to_bcd(cur_pos_msf[1]); 2460 params[3] = int_to_bcd(cur_pos_msf[2]); 2461 params[4] = int_to_bcd(final_pos_msf[0]); 2462 params[5] = int_to_bcd(final_pos_msf[1]); 2463 params[6] = int_to_bcd(final_pos_msf[2]); 2464 params[0] = 0x03; 2465 if (do_sony_cd_cmd_chk 2466 ("RESUME", SONY_AUDIO_PLAYBACK_CMD, params, 7, res_reg, 2467 &res_size) < 0) { 2468 retval = -EIO; 2469 break; 2470 } 2471 sony_audio_status = CDROM_AUDIO_PLAY; 2472 retval = 0; 2473 break; 2474 2475 case CDROMPLAYMSF: /* Play starting at the given MSF address. */ 2476 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, 2477 &res_size); 2478 2479 /* The parameters are given in int, must be converted */ 2480 for (i = 1; i < 7; i++) { 2481 params[i] = 2482 int_to_bcd(((unsigned char *) arg)[i - 1]); 2483 } 2484 params[0] = 0x03; 2485 if (do_sony_cd_cmd_chk 2486 ("PLAYMSF", SONY_AUDIO_PLAYBACK_CMD, params, 7, 2487 res_reg, &res_size) < 0) { 2488 retval = -EIO; 2489 break; 2490 } 2491 2492 /* Save the final position for pauses and resumes */ 2493 final_pos_msf[0] = bcd_to_int(params[4]); 2494 final_pos_msf[1] = bcd_to_int(params[5]); 2495 final_pos_msf[2] = bcd_to_int(params[6]); 2496 sony_audio_status = CDROM_AUDIO_PLAY; 2497 retval = 0; 2498 break; 2499 2500 case CDROMREADTOCHDR: /* Read the table of contents header */ 2501 { 2502 struct cdrom_tochdr *hdr; 2503 2504 sony_get_toc(); 2505 if (!sony_toc_read) { 2506 retval = -EIO; 2507 break; 2508 } 2509 2510 hdr = (struct cdrom_tochdr *) arg; 2511 hdr->cdth_trk0 = sony_toc.first_track_num; 2512 hdr->cdth_trk1 = sony_toc.last_track_num; 2513 } 2514 retval = 0; 2515 break; 2516 2517 case CDROMREADTOCENTRY: /* Read a given table of contents entry */ 2518 { 2519 struct cdrom_tocentry *entry; 2520 int track_idx; 2521 unsigned char *msf_val = NULL; 2522 2523 sony_get_toc(); 2524 if (!sony_toc_read) { 2525 retval = -EIO; 2526 break; 2527 } 2528 2529 entry = (struct cdrom_tocentry *) arg; 2530 2531 track_idx = find_track(entry->cdte_track); 2532 if (track_idx < 0) { 2533 retval = -EINVAL; 2534 break; 2535 } 2536 2537 entry->cdte_adr = 2538 sony_toc.tracks[track_idx].address; 2539 entry->cdte_ctrl = 2540 sony_toc.tracks[track_idx].control; 2541 msf_val = 2542 sony_toc.tracks[track_idx].track_start_msf; 2543 2544 /* Logical buffer address or MSF format requested? */ 2545 if (entry->cdte_format == CDROM_LBA) { 2546 entry->cdte_addr.lba = msf_to_log(msf_val); 2547 } else if (entry->cdte_format == CDROM_MSF) { 2548 entry->cdte_addr.msf.minute = *msf_val; 2549 entry->cdte_addr.msf.second = 2550 *(msf_val + 1); 2551 entry->cdte_addr.msf.frame = 2552 *(msf_val + 2); 2553 } 2554 } 2555 retval = 0; 2556 break; 2557 2558 case CDROMPLAYTRKIND: /* Play a track. This currently ignores index. */ 2559 { 2560 struct cdrom_ti *ti = (struct cdrom_ti *) arg; 2561 int track_idx; 2562 2563 sony_get_toc(); 2564 if (!sony_toc_read) { 2565 retval = -EIO; 2566 break; 2567 } 2568 2569 if ((ti->cdti_trk0 < sony_toc.first_track_num) 2570 || (ti->cdti_trk0 > sony_toc.last_track_num) 2571 || (ti->cdti_trk1 < ti->cdti_trk0)) { 2572 retval = -EINVAL; 2573 break; 2574 } 2575 2576 track_idx = find_track(ti->cdti_trk0); 2577 if (track_idx < 0) { 2578 retval = -EINVAL; 2579 break; 2580 } 2581 params[1] = 2582 int_to_bcd(sony_toc.tracks[track_idx]. 2583 track_start_msf[0]); 2584 params[2] = 2585 int_to_bcd(sony_toc.tracks[track_idx]. 2586 track_start_msf[1]); 2587 params[3] = 2588 int_to_bcd(sony_toc.tracks[track_idx]. 2589 track_start_msf[2]); 2590 2591 /* 2592 * If we want to stop after the last track, use the lead-out 2593 * MSF to do that. 2594 */ 2595 if (ti->cdti_trk1 >= sony_toc.last_track_num) { 2596 track_idx = find_track(CDROM_LEADOUT); 2597 } else { 2598 track_idx = find_track(ti->cdti_trk1 + 1); 2599 } 2600 if (track_idx < 0) { 2601 retval = -EINVAL; 2602 break; 2603 } 2604 params[4] = 2605 int_to_bcd(sony_toc.tracks[track_idx]. 2606 track_start_msf[0]); 2607 params[5] = 2608 int_to_bcd(sony_toc.tracks[track_idx]. 2609 track_start_msf[1]); 2610 params[6] = 2611 int_to_bcd(sony_toc.tracks[track_idx]. 2612 track_start_msf[2]); 2613 params[0] = 0x03; 2614 2615 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, 2616 &res_size); 2617 2618 do_sony_cd_cmd(SONY_AUDIO_PLAYBACK_CMD, params, 7, 2619 res_reg, &res_size); 2620 2621 if ((res_size < 2) 2622 || ((res_reg[0] & 0xf0) == 0x20)) { 2623 printk(KERN_ERR PFX 2624 "Params: %x %x %x %x %x %x %x\n", 2625 params[0], params[1], params[2], 2626 params[3], params[4], params[5], 2627 params[6]); 2628 printk(KERN_ERR PFX 2629 "Error %s (CDROMPLAYTRKIND)\n", 2630 translate_error(res_reg[1])); 2631 retval = -EIO; 2632 break; 2633 } 2634 2635 /* Save the final position for pauses and resumes */ 2636 final_pos_msf[0] = bcd_to_int(params[4]); 2637 final_pos_msf[1] = bcd_to_int(params[5]); 2638 final_pos_msf[2] = bcd_to_int(params[6]); 2639 sony_audio_status = CDROM_AUDIO_PLAY; 2640 retval = 0; 2641 break; 2642 } 2643 2644 case CDROMVOLCTRL: /* Volume control. What volume does this change, anyway? */ 2645 { 2646 struct cdrom_volctrl *volctrl = 2647 (struct cdrom_volctrl *) arg; 2648 2649 params[0] = SONY_SD_AUDIO_VOLUME; 2650 params[1] = volctrl->channel0; 2651 params[2] = volctrl->channel1; 2652 retval = do_sony_cd_cmd_chk("VOLCTRL", 2653 SONY_SET_DRIVE_PARAM_CMD, 2654 params, 3, res_reg, 2655 &res_size); 2656 break; 2657 } 2658 case CDROMSUBCHNL: /* Get subchannel info */ 2659 retval = sony_get_subchnl_info((struct cdrom_subchnl *) arg); 2660 break; 2661 2662 default: 2663 retval = -EINVAL; 2664 break; 2665 } 2666 up(&sony_sem); 2667 return retval; 2668} 2669 2670static int scd_read_audio(struct cdrom_device_info *cdi, 2671 unsigned int cmd, unsigned long arg) 2672{ 2673 void __user *argp = (void __user *)arg; 2674 int retval; 2675 2676 if (down_interruptible(&sony_sem)) 2677 return -ERESTARTSYS; 2678 switch (cmd) { 2679 case CDROMREADAUDIO: /* Read 2352 byte audio tracks and 2340 byte 2680 raw data tracks. */ 2681 { 2682 struct cdrom_read_audio ra; 2683 2684 2685 sony_get_toc(); 2686 if (!sony_toc_read) { 2687 retval = -EIO; 2688 break; 2689 } 2690 2691 if (copy_from_user(&ra, argp, sizeof(ra))) { 2692 retval = -EFAULT; 2693 break; 2694 } 2695 2696 if (ra.nframes == 0) { 2697 retval = 0; 2698 break; 2699 } 2700 2701 if (!access_ok(VERIFY_WRITE, ra.buf, 2702 CD_FRAMESIZE_RAW * ra.nframes)) 2703 return -EFAULT; 2704 2705 if (ra.addr_format == CDROM_LBA) { 2706 if ((ra.addr.lba >= 2707 sony_toc.lead_out_start_lba) 2708 || (ra.addr.lba + ra.nframes >= 2709 sony_toc.lead_out_start_lba)) { 2710 retval = -EINVAL; 2711 break; 2712 } 2713 } else if (ra.addr_format == CDROM_MSF) { 2714 if ((ra.addr.msf.minute >= 75) 2715 || (ra.addr.msf.second >= 60) 2716 || (ra.addr.msf.frame >= 75)) { 2717 retval = -EINVAL; 2718 break; 2719 } 2720 2721 ra.addr.lba = ((ra.addr.msf.minute * 4500) 2722 + (ra.addr.msf.second * 75) 2723 + ra.addr.msf.frame); 2724 if ((ra.addr.lba >= 2725 sony_toc.lead_out_start_lba) 2726 || (ra.addr.lba + ra.nframes >= 2727 sony_toc.lead_out_start_lba)) { 2728 retval = -EINVAL; 2729 break; 2730 } 2731 2732 /* I know, this can go negative on an unsigned. However, 2733 the first thing done to the data is to add this value, 2734 so this should compensate and allow direct msf access. */ 2735 ra.addr.lba -= LOG_START_OFFSET; 2736 } else { 2737 retval = -EINVAL; 2738 break; 2739 } 2740 2741 retval = read_audio(&ra); 2742 break; 2743 } 2744 retval = 0; 2745 break; 2746 2747 default: 2748 retval = -EINVAL; 2749 } 2750 up(&sony_sem); 2751 return retval; 2752} 2753 2754static int scd_spinup(void) 2755{ 2756 unsigned char res_reg[12]; 2757 unsigned int res_size; 2758 int num_spin_ups; 2759 2760 num_spin_ups = 0; 2761 2762 respinup_on_open: 2763 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size); 2764 2765 /* The drive sometimes returns error 0. I don't know why, but ignore 2766 it. It seems to mean the drive has already done the operation. */ 2767 if ((res_size < 2) || ((res_reg[0] != 0) && (res_reg[1] != 0))) { 2768 printk(KERN_ERR PFX "%s error (scd_open, spin up)\n", 2769 translate_error(res_reg[1])); 2770 return 1; 2771 } 2772 2773 do_sony_cd_cmd(SONY_READ_TOC_CMD, NULL, 0, res_reg, &res_size); 2774 2775 /* The drive sometimes returns error 0. I don't know why, but ignore 2776 it. It seems to mean the drive has already done the operation. */ 2777 if ((res_size < 2) || ((res_reg[0] != 0) && (res_reg[1] != 0))) { 2778 /* If the drive is already playing, it's ok. */ 2779 if ((res_reg[1] == SONY_AUDIO_PLAYING_ERR) 2780 || (res_reg[1] == 0)) { 2781 return 0; 2782 } 2783 2784 /* If the drive says it is not spun up (even though we just did it!) 2785 then retry the operation at least a few times. */ 2786 if ((res_reg[1] == SONY_NOT_SPIN_ERR) 2787 && (num_spin_ups < MAX_CDU31A_RETRIES)) { 2788 num_spin_ups++; 2789 goto respinup_on_open; 2790 } 2791 2792 printk(KERN_ERR PFX "Error %s (scd_open, read toc)\n", 2793 translate_error(res_reg[1])); 2794 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, 2795 &res_size); 2796 return 1; 2797 } 2798 return 0; 2799} 2800 2801/* 2802 * Open the drive for operations. Spin the drive up and read the table of 2803 * contents if these have not already been done. 2804 */ 2805static int scd_open(struct cdrom_device_info *cdi, int purpose) 2806{ 2807 unsigned char res_reg[12]; 2808 unsigned int res_size; 2809 unsigned char params[2]; 2810 2811 if (purpose == 1) { 2812 /* Open for IOCTLs only - no media check */ 2813 sony_usage++; 2814 return 0; 2815 } 2816 2817 if (sony_usage == 0) { 2818 if (scd_spinup() != 0) 2819 return -EIO; 2820 sony_get_toc(); 2821 if (!sony_toc_read) { 2822 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, 2823 res_reg, &res_size); 2824 return -EIO; 2825 } 2826 2827 /* For XA on the CDU31A only, we have to do special reads. 2828 The CDU33A handles XA automagically. */ 2829 /* if ( (sony_toc.disk_type == SONY_XA_DISK_TYPE) */ 2830 if ((sony_toc.disk_type != 0x00) 2831 && (!is_double_speed)) { 2832 params[0] = SONY_SD_DECODE_PARAM; 2833 params[1] = 0x07; 2834 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 2835 params, 2, res_reg, &res_size); 2836 if ((res_size < 2) 2837 || ((res_reg[0] & 0xf0) == 0x20)) { 2838 printk(KERN_WARNING PFX "Unable to set " 2839 "XA params: 0x%2.2x\n", res_reg[1]); 2840 } 2841 sony_xa_mode = 1; 2842 } 2843 /* A non-XA disk. Set the parms back if necessary. */ 2844 else if (sony_xa_mode) { 2845 params[0] = SONY_SD_DECODE_PARAM; 2846 params[1] = 0x0f; 2847 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, 2848 params, 2, res_reg, &res_size); 2849 if ((res_size < 2) 2850 || ((res_reg[0] & 0xf0) == 0x20)) { 2851 printk(KERN_WARNING PFX "Unable to reset " 2852 "XA params: 0x%2.2x\n", res_reg[1]); 2853 } 2854 sony_xa_mode = 0; 2855 } 2856 2857 sony_spun_up = 1; 2858 } 2859 2860 sony_usage++; 2861 2862 return 0; 2863} 2864 2865 2866/* 2867 * Close the drive. Spin it down if no task is using it. The spin 2868 * down will fail if playing audio, so audio play is OK. 2869 */ 2870static void scd_release(struct cdrom_device_info *cdi) 2871{ 2872 if (sony_usage == 1) { 2873 unsigned char res_reg[12]; 2874 unsigned int res_size; 2875 2876 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, 2877 &res_size); 2878 2879 sony_spun_up = 0; 2880 } 2881 sony_usage--; 2882} 2883 2884static struct cdrom_device_ops scd_dops = { 2885 .open = scd_open, 2886 .release = scd_release, 2887 .drive_status = scd_drive_status, 2888 .media_changed = scd_media_changed, 2889 .tray_move = scd_tray_move, 2890 .lock_door = scd_lock_door, 2891 .select_speed = scd_select_speed, 2892 .get_last_session = scd_get_last_session, 2893 .get_mcn = scd_get_mcn, 2894 .reset = scd_reset, 2895 .audio_ioctl = scd_audio_ioctl, 2896 .capability = CDC_OPEN_TRAY | CDC_CLOSE_TRAY | CDC_LOCK | 2897 CDC_SELECT_SPEED | CDC_MULTI_SESSION | 2898 CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | 2899 CDC_RESET | CDC_DRIVE_STATUS, 2900 .n_minors = 1, 2901}; 2902 2903static struct cdrom_device_info scd_info = { 2904 .ops = &scd_dops, 2905 .speed = 2, 2906 .capacity = 1, 2907 .name = "cdu31a" 2908}; 2909 2910static int scd_block_open(struct inode *inode, struct file *file) 2911{ 2912 return cdrom_open(&scd_info, inode, file); 2913} 2914 2915static int scd_block_release(struct inode *inode, struct file *file) 2916{ 2917 return cdrom_release(&scd_info, file); 2918} 2919 2920static int scd_block_ioctl(struct inode *inode, struct file *file, 2921 unsigned cmd, unsigned long arg) 2922{ 2923 int retval; 2924 2925 /* The eject and close commands should be handled by Uniform CD-ROM 2926 * driver - but I always got hard lockup instead of eject 2927 * until I put this here. 2928 */ 2929 switch (cmd) { 2930 case CDROMEJECT: 2931 scd_lock_door(&scd_info, 0); 2932 retval = scd_tray_move(&scd_info, 1); 2933 break; 2934 case CDROMCLOSETRAY: 2935 retval = scd_tray_move(&scd_info, 0); 2936 break; 2937 case CDROMREADAUDIO: 2938 retval = scd_read_audio(&scd_info, CDROMREADAUDIO, arg); 2939 break; 2940 default: 2941 retval = cdrom_ioctl(file, &scd_info, inode, cmd, arg); 2942 } 2943 return retval; 2944} 2945 2946static int scd_block_media_changed(struct gendisk *disk) 2947{ 2948 return cdrom_media_changed(&scd_info); 2949} 2950 2951static struct block_device_operations scd_bdops = 2952{ 2953 .owner = THIS_MODULE, 2954 .open = scd_block_open, 2955 .release = scd_block_release, 2956 .ioctl = scd_block_ioctl, 2957 .media_changed = scd_block_media_changed, 2958}; 2959 2960static struct gendisk *scd_gendisk; 2961 2962/* The different types of disc loading mechanisms supported */ 2963static char *load_mech[] __initdata = 2964 { "caddy", "tray", "pop-up", "unknown" }; 2965 2966static int __init 2967get_drive_configuration(unsigned short base_io, 2968 unsigned char res_reg[], unsigned int *res_size) 2969{ 2970 unsigned long retry_count; 2971 2972 2973 if (!request_region(base_io, 4, "cdu31a")) 2974 return 0; 2975 2976 /* Set the base address */ 2977 cdu31a_port = base_io; 2978 2979 /* Set up all the register locations */ 2980 sony_cd_cmd_reg = cdu31a_port + SONY_CMD_REG_OFFSET; 2981 sony_cd_param_reg = cdu31a_port + SONY_PARAM_REG_OFFSET; 2982 sony_cd_write_reg = cdu31a_port + SONY_WRITE_REG_OFFSET; 2983 sony_cd_control_reg = cdu31a_port + SONY_CONTROL_REG_OFFSET; 2984 sony_cd_status_reg = cdu31a_port + SONY_STATUS_REG_OFFSET; 2985 sony_cd_result_reg = cdu31a_port + SONY_RESULT_REG_OFFSET; 2986 sony_cd_read_reg = cdu31a_port + SONY_READ_REG_OFFSET; 2987 sony_cd_fifost_reg = cdu31a_port + SONY_FIFOST_REG_OFFSET; 2988 2989 /* 2990 * Check to see if anything exists at the status register location. 2991 * I don't know if this is a good way to check, but it seems to work 2992 * ok for me. 2993 */ 2994 if (read_status_register() != 0xff) { 2995 /* 2996 * Reset the drive and wait for attention from it (to say it's reset). 2997 * If you don't wait, the next operation will probably fail. 2998 */ 2999 reset_drive(); 3000 retry_count = jiffies + SONY_RESET_TIMEOUT; 3001 while (time_before(jiffies, retry_count) 3002 && (!is_attention())) { 3003 sony_sleep(); 3004 } 3005 3006#if 0 3007 /* If attention is never seen probably not a CDU31a present */ 3008 if (!is_attention()) { 3009 res_reg[0] = 0x20; 3010 goto out_err; 3011 } 3012#endif 3013 3014 /* 3015 * Get the drive configuration. 3016 */ 3017 do_sony_cd_cmd(SONY_REQ_DRIVE_CONFIG_CMD, 3018 NULL, 3019 0, (unsigned char *) res_reg, res_size); 3020 if (*res_size <= 2 || (res_reg[0] & 0xf0) != 0) 3021 goto out_err; 3022 return 1; 3023 } 3024 3025 /* Return an error */ 3026 res_reg[0] = 0x20; 3027out_err: 3028 release_region(cdu31a_port, 4); 3029 cdu31a_port = 0; 3030 return 0; 3031} 3032 3033#ifndef MODULE 3034/* 3035 * Set up base I/O and interrupts, called from main.c. 3036 */ 3037 3038static int __init cdu31a_setup(char *strings) 3039{ 3040 int ints[4]; 3041 3042 (void) get_options(strings, ARRAY_SIZE(ints), ints); 3043 3044 if (ints[0] > 0) { 3045 cdu31a_port = ints[1]; 3046 } 3047 if (ints[0] > 1) { 3048 cdu31a_irq = ints[2]; 3049 } 3050 if ((strings != NULL) && (*strings != '\0')) { 3051 if (strcmp(strings, "PAS") == 0) { 3052 sony_pas_init = 1; 3053 } else { 3054 printk(KERN_NOTICE PFX "Unknown interface type: %s\n", 3055 strings); 3056 } 3057 } 3058 3059 return 1; 3060} 3061 3062__setup("cdu31a=", cdu31a_setup); 3063 3064#endif 3065 3066/* 3067 * Initialize the driver. 3068 */ 3069int __init cdu31a_init(void) 3070{ 3071 struct s_sony_drive_config drive_config; 3072 struct gendisk *disk; 3073 int deficiency = 0; 3074 unsigned int res_size; 3075 char msg[255]; 3076 char buf[40]; 3077 int i; 3078 int tmp_irq; 3079 3080 /* 3081 * According to Alex Freed (freed@europa.orion.adobe.com), this is 3082 * required for the Fusion CD-16 package. If the sound driver is 3083 * loaded, it should work fine, but just in case... 3084 * 3085 * The following turn on the CD-ROM interface for a Fusion CD-16. 3086 */ 3087 if (sony_pas_init) { 3088 outb(0xbc, 0x9a01); 3089 outb(0xe2, 0x9a01); 3090 } 3091 3092 /* Setting the base I/O address to 0xffff will disable it. */ 3093 if (cdu31a_port == 0xffff) 3094 goto errout3; 3095 3096 if (cdu31a_port != 0) { 3097 /* Need IRQ 0 because we can't sleep here. */ 3098 tmp_irq = cdu31a_irq; 3099 cdu31a_irq = 0; 3100 if (!get_drive_configuration(cdu31a_port, 3101 drive_config.exec_status, 3102 &res_size)) 3103 goto errout3; 3104 cdu31a_irq = tmp_irq; 3105 } else { 3106 cdu31a_irq = 0; 3107 for (i = 0; cdu31a_addresses[i].base; i++) { 3108 if (get_drive_configuration(cdu31a_addresses[i].base, 3109 drive_config.exec_status, 3110 &res_size)) { 3111 cdu31a_irq = cdu31a_addresses[i].int_num; 3112 break; 3113 } 3114 } 3115 if (!cdu31a_port) 3116 goto errout3; 3117 } 3118 3119 if (register_blkdev(MAJOR_NR, "cdu31a")) 3120 goto errout2; 3121 3122 disk = alloc_disk(1); 3123 if (!disk) 3124 goto errout1; 3125 disk->major = MAJOR_NR; 3126 disk->first_minor = 0; 3127 sprintf(disk->disk_name, "cdu31a"); 3128 disk->fops = &scd_bdops; 3129 disk->flags = GENHD_FL_CD; 3130 3131 if (SONY_HWC_DOUBLE_SPEED(drive_config)) 3132 is_double_speed = 1; 3133 3134 tmp_irq = cdu31a_irq; /* Need IRQ 0 because we can't sleep here. */ 3135 cdu31a_irq = 0; 3136 3137 sony_speed = is_double_speed; /* Set 2X drives to 2X by default */ 3138 set_drive_params(sony_speed); 3139 3140 cdu31a_irq = tmp_irq; 3141 3142 if (cdu31a_irq > 0) { 3143 if (request_irq 3144 (cdu31a_irq, cdu31a_interrupt, IRQF_DISABLED, 3145 "cdu31a", NULL)) { 3146 printk(KERN_WARNING PFX "Unable to grab IRQ%d for " 3147 "the CDU31A driver\n", cdu31a_irq); 3148 cdu31a_irq = 0; 3149 } 3150 } 3151 3152 sprintf(msg, "Sony I/F CDROM : %8.8s %16.16s %8.8s\n", 3153 drive_config.vendor_id, 3154 drive_config.product_id, 3155 drive_config.product_rev_level); 3156 sprintf(buf, " Capabilities: %s", 3157 load_mech[SONY_HWC_GET_LOAD_MECH(drive_config)]); 3158 strcat(msg, buf); 3159 if (SONY_HWC_AUDIO_PLAYBACK(drive_config)) 3160 strcat(msg, ", audio"); 3161 else 3162 deficiency |= CDC_PLAY_AUDIO; 3163 if (SONY_HWC_EJECT(drive_config)) 3164 strcat(msg, ", eject"); 3165 else 3166 deficiency |= CDC_OPEN_TRAY; 3167 if (SONY_HWC_LED_SUPPORT(drive_config)) 3168 strcat(msg, ", LED"); 3169 if (SONY_HWC_ELECTRIC_VOLUME(drive_config)) 3170 strcat(msg, ", elec. Vol"); 3171 if (SONY_HWC_ELECTRIC_VOLUME_CTL(drive_config)) 3172 strcat(msg, ", sep. Vol"); 3173 if (is_double_speed) 3174 strcat(msg, ", double speed"); 3175 else 3176 deficiency |= CDC_SELECT_SPEED; 3177 if (cdu31a_irq > 0) { 3178 sprintf(buf, ", irq %d", cdu31a_irq); 3179 strcat(msg, buf); 3180 } 3181 strcat(msg, "\n"); 3182 printk(KERN_INFO PFX "%s",msg); 3183 3184 cdu31a_queue = blk_init_queue(do_cdu31a_request, &cdu31a_lock); 3185 if (!cdu31a_queue) 3186 goto errout0; 3187 blk_queue_hardsect_size(cdu31a_queue, 2048); 3188 3189 init_timer(&cdu31a_abort_timer); 3190 cdu31a_abort_timer.function = handle_abort_timeout; 3191 3192 scd_info.mask = deficiency; 3193 scd_gendisk = disk; 3194 if (register_cdrom(&scd_info)) 3195 goto err; 3196 disk->queue = cdu31a_queue; 3197 add_disk(disk); 3198 3199 disk_changed = 1; 3200 return 0; 3201 3202err: 3203 blk_cleanup_queue(cdu31a_queue); 3204errout0: 3205 if (cdu31a_irq) 3206 free_irq(cdu31a_irq, NULL); 3207 printk(KERN_ERR PFX "Unable to register with Uniform cdrom driver\n"); 3208 put_disk(disk); 3209errout1: 3210 if (unregister_blkdev(MAJOR_NR, "cdu31a")) { 3211 printk(KERN_WARNING PFX "Can't unregister block device\n"); 3212 } 3213errout2: 3214 release_region(cdu31a_port, 4); 3215errout3: 3216 return -EIO; 3217} 3218 3219 3220static void __exit cdu31a_exit(void) 3221{ 3222 del_gendisk(scd_gendisk); 3223 put_disk(scd_gendisk); 3224 if (unregister_cdrom(&scd_info)) { 3225 printk(KERN_WARNING PFX "Can't unregister from Uniform " 3226 "cdrom driver\n"); 3227 return; 3228 } 3229 if ((unregister_blkdev(MAJOR_NR, "cdu31a") == -EINVAL)) { 3230 printk(KERN_WARNING PFX "Can't unregister\n"); 3231 return; 3232 } 3233 3234 blk_cleanup_queue(cdu31a_queue); 3235 3236 if (cdu31a_irq > 0) 3237 free_irq(cdu31a_irq, NULL); 3238 3239 release_region(cdu31a_port, 4); 3240 printk(KERN_INFO PFX "module released.\n"); 3241} 3242 3243#ifdef MODULE 3244module_init(cdu31a_init); 3245#endif 3246module_exit(cdu31a_exit); 3247 3248MODULE_LICENSE("GPL"); 3249MODULE_ALIAS_BLOCKDEV_MAJOR(CDU31A_CDROM_MAJOR);