scd.c (137046) | scd.c (141031) |
---|---|
1/*- 2 * Copyright (c) 1995 Mikael Hybsch 3 * All rights reserved. 4 * 5 * Portions of this file are copied from mcd.c 6 * which has the following copyrights: 7 * 8 * Copyright 1993 by Holger Veit (data part) --- 27 unchanged lines hidden (view full) --- 36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 39 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 */ 42 43#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1995 Mikael Hybsch 3 * All rights reserved. 4 * 5 * Portions of this file are copied from mcd.c 6 * which has the following copyrights: 7 * 8 * Copyright 1993 by Holger Veit (data part) --- 27 unchanged lines hidden (view full) --- 36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 39 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 40 * 41 */ 42 43#include <sys/cdefs.h> |
44__FBSDID("$FreeBSD: head/sys/dev/scd/scd.c 137046 2004-10-29 11:09:50Z phk $"); | 44__FBSDID("$FreeBSD: head/sys/dev/scd/scd.c 141031 2005-01-30 08:12:37Z sobomax $"); |
45 46 47#undef SCD_DEBUG 48 49#include <sys/param.h> 50#include <sys/systm.h> 51#include <sys/kernel.h> 52#include <sys/conf.h> --- 73 unchanged lines hidden (view full) --- 126 127static int scd_eject(struct scd_softc *); 128static int scd_stop(struct scd_softc *); 129static int scd_pause(struct scd_softc *); 130static int scd_resume(struct scd_softc *); 131static int scd_playtracks(struct scd_softc *, struct ioc_play_track *pt); 132static int scd_playmsf(struct scd_softc *, struct ioc_play_msf *msf); 133static int scd_play(struct scd_softc *, struct ioc_play_msf *msf); | 45 46 47#undef SCD_DEBUG 48 49#include <sys/param.h> 50#include <sys/systm.h> 51#include <sys/kernel.h> 52#include <sys/conf.h> --- 73 unchanged lines hidden (view full) --- 126 127static int scd_eject(struct scd_softc *); 128static int scd_stop(struct scd_softc *); 129static int scd_pause(struct scd_softc *); 130static int scd_resume(struct scd_softc *); 131static int scd_playtracks(struct scd_softc *, struct ioc_play_track *pt); 132static int scd_playmsf(struct scd_softc *, struct ioc_play_msf *msf); 133static int scd_play(struct scd_softc *, struct ioc_play_msf *msf); |
134static int scd_subchan(struct scd_softc *, struct ioc_read_subchannel *sch); | 134static int scd_subchan(struct scd_softc *, struct ioc_read_subchannel *sch, int nocopyout); |
135static int read_subcode(struct scd_softc *, struct sony_subchannel_position_data *sch); 136 137/* for xcdplayer */ 138static int scd_toc_header(struct scd_softc *, struct ioc_toc_header *th); 139static int scd_toc_entrys(struct scd_softc *, struct ioc_read_toc_entry *te); 140static int scd_toc_entry(struct scd_softc *, struct ioc_read_toc_single_entry *te); 141#define SCD_LASTPLUS1 170 /* don't ask, xcdplayer passes this in */ 142 --- 202 unchanged lines hidden (view full) --- 345 return (0); 346 break; 347 case CDIOCPLAYTRACKS: 348 return scd_playtracks(sc, (struct ioc_play_track *) addr); 349 case CDIOCPLAYBLOCKS: 350 return (EINVAL); 351 case CDIOCPLAYMSF: 352 return scd_playmsf(sc, (struct ioc_play_msf *) addr); | 135static int read_subcode(struct scd_softc *, struct sony_subchannel_position_data *sch); 136 137/* for xcdplayer */ 138static int scd_toc_header(struct scd_softc *, struct ioc_toc_header *th); 139static int scd_toc_entrys(struct scd_softc *, struct ioc_read_toc_entry *te); 140static int scd_toc_entry(struct scd_softc *, struct ioc_read_toc_single_entry *te); 141#define SCD_LASTPLUS1 170 /* don't ask, xcdplayer passes this in */ 142 --- 202 unchanged lines hidden (view full) --- 345 return (0); 346 break; 347 case CDIOCPLAYTRACKS: 348 return scd_playtracks(sc, (struct ioc_play_track *) addr); 349 case CDIOCPLAYBLOCKS: 350 return (EINVAL); 351 case CDIOCPLAYMSF: 352 return scd_playmsf(sc, (struct ioc_play_msf *) addr); |
353 case CDIOCREADSUBCHANNEL_SYSSPACE: 354 return scd_subchan(sc, (struct ioc_read_subchannel *) addr, 1); |
|
353 case CDIOCREADSUBCHANNEL: | 355 case CDIOCREADSUBCHANNEL: |
354 return scd_subchan(sc, (struct ioc_read_subchannel *) addr); | 356 return scd_subchan(sc, (struct ioc_read_subchannel *) addr, 0); |
355 case CDIOREADTOCHEADER: 356 return scd_toc_header (sc, (struct ioc_toc_header *) addr); 357 case CDIOREADTOCENTRYS: 358 return scd_toc_entrys (sc, (struct ioc_read_toc_entry*) addr); 359 case CDIOREADTOCENTRY: 360 return scd_toc_entry (sc, (struct ioc_read_toc_single_entry*) addr); 361 case CDIOCSETPATCH: 362 case CDIOCGETVOL: --- 176 unchanged lines hidden (view full) --- 539 send_cmd(sc, CMD_EJECT, 0) != 0) 540 { 541 return (EIO); 542 } 543 return (0); 544} 545 546static int | 357 case CDIOREADTOCHEADER: 358 return scd_toc_header (sc, (struct ioc_toc_header *) addr); 359 case CDIOREADTOCENTRYS: 360 return scd_toc_entrys (sc, (struct ioc_read_toc_entry*) addr); 361 case CDIOREADTOCENTRY: 362 return scd_toc_entry (sc, (struct ioc_read_toc_single_entry*) addr); 363 case CDIOCSETPATCH: 364 case CDIOCGETVOL: --- 176 unchanged lines hidden (view full) --- 541 send_cmd(sc, CMD_EJECT, 0) != 0) 542 { 543 return (EIO); 544 } 545 return (0); 546} 547 548static int |
547scd_subchan(struct scd_softc *sc, struct ioc_read_subchannel *sch) | 549scd_subchan(struct scd_softc *sc, struct ioc_read_subchannel *sch, int nocopyout) |
548{ 549 struct sony_subchannel_position_data q; 550 struct cd_sub_channel_info data; 551 552 XDEBUG(sc, 1, "subchan af=%d, df=%d\n", 553 sch->address_format, sch->data_format); 554 555 if (sch->address_format != CD_MSF_FORMAT) --- 12 unchanged lines hidden (view full) --- 568 data.what.position.reladdr.msf.minute = bcd2bin(q.rel_msf[0]); 569 data.what.position.reladdr.msf.second = bcd2bin(q.rel_msf[1]); 570 data.what.position.reladdr.msf.frame = bcd2bin(q.rel_msf[2]); 571 data.what.position.absaddr.msf.unused = 0; 572 data.what.position.absaddr.msf.minute = bcd2bin(q.abs_msf[0]); 573 data.what.position.absaddr.msf.second = bcd2bin(q.abs_msf[1]); 574 data.what.position.absaddr.msf.frame = bcd2bin(q.abs_msf[2]); 575 | 550{ 551 struct sony_subchannel_position_data q; 552 struct cd_sub_channel_info data; 553 554 XDEBUG(sc, 1, "subchan af=%d, df=%d\n", 555 sch->address_format, sch->data_format); 556 557 if (sch->address_format != CD_MSF_FORMAT) --- 12 unchanged lines hidden (view full) --- 570 data.what.position.reladdr.msf.minute = bcd2bin(q.rel_msf[0]); 571 data.what.position.reladdr.msf.second = bcd2bin(q.rel_msf[1]); 572 data.what.position.reladdr.msf.frame = bcd2bin(q.rel_msf[2]); 573 data.what.position.absaddr.msf.unused = 0; 574 data.what.position.absaddr.msf.minute = bcd2bin(q.abs_msf[0]); 575 data.what.position.absaddr.msf.second = bcd2bin(q.abs_msf[1]); 576 data.what.position.absaddr.msf.frame = bcd2bin(q.abs_msf[2]); 577 |
576 if (copyout(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len))!=0) 577 return (EFAULT); | 578 if (nocopyout == 0) { 579 if (copyout(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len))!=0) 580 return (EFAULT); 581 } else { 582 bcopy(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len)); 583 } |
578 return (0); 579} 580 581int 582scd_probe(struct scd_softc *sc) 583{ 584 struct sony_drive_configuration drive_config; 585 int rc; --- 820 unchanged lines hidden --- | 584 return (0); 585} 586 587int 588scd_probe(struct scd_softc *sc) 589{ 590 struct sony_drive_configuration drive_config; 591 int rc; --- 820 unchanged lines hidden --- |