diff options
author | Eric Andersen <andersen@codepoet.org> | 2006-03-25 19:09:09 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2006-03-25 19:09:09 +0000 |
commit | ba46d4d7caf5ec6c89fbbde4bb19a86a272c4611 (patch) | |
tree | ad16141328c9251d4ce5461e63bb831c9806a140 /target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch | |
parent | 7aa8096f080eb0bf8db862741e57a21285ab4c61 (diff) | |
download | buildroot-novena-ba46d4d7caf5ec6c89fbbde4bb19a86a272c4611.tar.gz buildroot-novena-ba46d4d7caf5ec6c89fbbde4bb19a86a272c4611.zip |
update to linux 2.4.16 and current uClibc.
Diffstat (limited to 'target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch')
-rw-r--r-- | target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch b/target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch new file mode 100644 index 000000000..90c2961ba --- /dev/null +++ b/target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch @@ -0,0 +1,109 @@ +--- orig/include/linux/cdrom.h 2005-10-28 10:14:52.000000000 -0600 ++++ linux-2.6.14/include/linux/cdrom.h 2005-10-28 10:14:52.000000000 -0600 +@@ -946,7 +946,8 @@ + char name[20]; /* name of the device type */ + /* per-device flags */ + __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */ +- __u8 reserved : 6; /* not used yet */ ++ __u8 use_read10 : 1; /* Use READ10 instead of READCD */ ++ __u8 reserved : 5; /* not used yet */ + int cdda_method; /* see flags */ + __u8 last_sense; + __u8 media_written; /* dirty flag, DVD+RW bookkeeping */ +--- orig/drivers/cdrom/cdrom.c 2005-10-28 10:14:52.000000000 -0600 ++++ linux-2.6.14/drivers/cdrom/cdrom.c 2005-10-28 10:14:52.000000000 -0600 +@@ -1982,6 +1982,8 @@ + return 0; + } + ++static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size); ++ + /* + * Specific READ_10 interface + */ +@@ -1990,6 +1992,7 @@ + int blocksize, int nblocks) + { + struct cdrom_device_ops *cdo = cdi->ops; ++ int ret = 0; + + memset(&cgc->cmd, 0, sizeof(cgc->cmd)); + cgc->cmd[0] = GPCMD_READ_10; +@@ -2001,7 +2004,22 @@ + cgc->cmd[7] = (nblocks >> 8) & 0xff; + cgc->cmd[8] = nblocks & 0xff; + cgc->buflen = blocksize * nblocks; +- return cdo->generic_packet(cdi, cgc); ++ ++ if (blocksize != CD_FRAMESIZE) { ++ ret = cdrom_switch_blocksize(cdi, blocksize); ++ ret |= cdo->generic_packet(cdi, cgc); ++ ret |= cdrom_switch_blocksize(cdi, CD_FRAMESIZE); ++ } else ret = cdo->generic_packet(cdi, cgc); ++ ++ /* ++ * Switch cdrom_read_block back to default behaviour ++ * if we get an error. ++ * FIXME: Maybe this should not be done on all errors. ++ */ ++ if (ret != 0) ++ cdi->use_read10 = 0; ++ ++ return ret; + } + + /* very generic interface for reading the various types of blocks */ +@@ -2010,8 +2028,15 @@ + int lba, int nblocks, int format, int blksize) + { + struct cdrom_device_ops *cdo = cdi->ops; ++ int ret; ++ ++ if (cdi->use_read10) ++ return cdrom_read_cd(cdi, cgc, lba, blksize, nblocks); + + memset(&cgc->cmd, 0, sizeof(cgc->cmd)); ++ /* ++ * SCSI-II devices are not required to support READ_CD. ++ */ + cgc->cmd[0] = GPCMD_READ_CD; + /* expected sector size - cdda,mode1,etc. */ + cgc->cmd[1] = format << 2; +@@ -2034,7 +2059,15 @@ + default : cgc->cmd[9] = 0x10; + } + +- return cdo->generic_packet(cdi, cgc); ++ ret = cdo->generic_packet(cdi, cgc); ++ if (ret && cgc->sense && cgc->sense->sense_key==0x05 && cgc->sense->asc==0x20 && cgc->sense->ascq==0x00) { ++ ret = cdrom_read_cd(cdi, cgc, lba, blksize, nblocks); ++ if (ret == 0) { ++ cdi->use_read10 = 1; ++ printk(KERN_INFO "cdrom.c: drive does not like READ_CD for blksize=%d, switching to READ_10.\n", blksize); ++ } ++ } ++ return ret; + } + + static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf, +@@ -2671,20 +2704,6 @@ + cgc.sense = &sense; + cgc.data_direction = CGC_DATA_READ; + ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize); +- if (ret && sense.sense_key==0x05 && sense.asc==0x20 && sense.ascq==0x00) { +- /* +- * SCSI-II devices are not required to support +- * READ_CD, so let's try switching block size +- */ +- /* FIXME: switch back again... */ +- if ((ret = cdrom_switch_blocksize(cdi, blocksize))) { +- kfree(cgc.buffer); +- return ret; +- } +- cgc.sense = NULL; +- ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1); +- ret |= cdrom_switch_blocksize(cdi, blocksize); +- } + if (!ret && copy_to_user((char __user *)arg, cgc.buffer, blocksize)) + ret = -EFAULT; + kfree(cgc.buffer); |