Deleted Added
full compact
mcd.c (104519) mcd.c (104545)
1#include "opt_geom.h"
2#ifndef NO_GEOM
3#warning "The mcd driver is currently not compatible with GEOM"
4#else
5/*
6 * Copyright 1993 by Holger Veit (data part)
7 * Copyright 1993 by Brian Moore (audio part)
8 * Changes Copyright 1993 by Gary Clark II
9 * Changes Copyright (C) 1994-1995 by Andrey A. Chernov, Moscow, Russia
10 *
11 * Rewrote probe routine to work on newer Mitsumi drives.
12 * Additional changes (C) 1994 by Jordan K. Hubbard

--- 26 unchanged lines hidden (view full) ---

39 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
40 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
41 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
42 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46 *
1/*
2 * Copyright 1993 by Holger Veit (data part)
3 * Copyright 1993 by Brian Moore (audio part)
4 * Changes Copyright 1993 by Gary Clark II
5 * Changes Copyright (C) 1994-1995 by Andrey A. Chernov, Moscow, Russia
6 *
7 * Rewrote probe routine to work on newer Mitsumi drives.
8 * Additional changes (C) 1994 by Jordan K. Hubbard

--- 26 unchanged lines hidden (view full) ---

35 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
36 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
37 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
38 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 *
47 * $FreeBSD: head/sys/dev/mcd/mcd.c 104519 2002-10-05 16:35:33Z phk $
43 * $FreeBSD: head/sys/dev/mcd/mcd.c 104545 2002-10-06 00:19:38Z mdodd $
48 */
49static const char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
50
51#include <sys/param.h>
52#include <sys/systm.h>
53#include <sys/kernel.h>
54#include <sys/conf.h>
55#include <sys/fcntl.h>
56#include <sys/bio.h>
57#include <sys/cdio.h>
44 */
45static const char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";
46
47#include <sys/param.h>
48#include <sys/systm.h>
49#include <sys/kernel.h>
50#include <sys/conf.h>
51#include <sys/fcntl.h>
52#include <sys/bio.h>
53#include <sys/cdio.h>
58#include <sys/disklabel.h>
54#include
59#include <sys/bus.h>
60
61#include <machine/bus_pio.h>
62#include <machine/bus.h>
63#include <machine/resource.h>
64#include <sys/rman.h>
65
66#include <isa/isavar.h>

--- 5 unchanged lines hidden (view full) ---

72{ \
73 if (sc->debug) { \
74 device_printf(sc->dev, "status=0x%02x: ", \
75 sc->data.status); \
76 printf(format, ## args); \
77 } \
78}
79
55#include <sys/bus.h>
56
57#include <machine/bus_pio.h>
58#include <machine/bus.h>
59#include <machine/resource.h>
60#include <sys/rman.h>
61
62#include <isa/isavar.h>

--- 5 unchanged lines hidden (view full) ---

68{ \
69 if (sc->debug) { \
70 device_printf(sc->dev, "status=0x%02x: ", \
71 sc->data.status); \
72 printf(format, ## args); \
73 } \
74}
75
80#define mcd_part(dev) ((minor(dev)) & 7)
81#define mcd_unit(dev) (((minor(dev)) & 0x38) >> 3)
82#define mcd_phys(dev) (((minor(dev)) & 0x40) >> 6)
83#define RAW_PART 2
84
85/* flags */
86#define MCDVALID 0x0001 /* parameters loaded */
87#define MCDINIT 0x0002 /* device is init'd */
88#define MCDNEWMODEL 0x0004 /* device is new model */
89#define MCDLABEL 0x0008 /* label is read */
90#define MCDPROBING 0x0010 /* probing */

--- 27 unchanged lines hidden (view full) ---

118#define MCD_S_BEGIN 0
119#define MCD_S_BEGIN1 1
120#define MCD_S_WAITSTAT 2
121#define MCD_S_WAITMODE 3
122#define MCD_S_WAITREAD 4
123
124/* prototypes */
125static void mcd_start(struct mcd_softc *);
76#define RAW_PART 2
77
78/* flags */
79#define MCDVALID 0x0001 /* parameters loaded */
80#define MCDINIT 0x0002 /* device is init'd */
81#define MCDNEWMODEL 0x0004 /* device is new model */
82#define MCDLABEL 0x0008 /* label is read */
83#define MCDPROBING 0x0010 /* probing */

--- 27 unchanged lines hidden (view full) ---

111#define MCD_S_BEGIN 0
112#define MCD_S_BEGIN1 1
113#define MCD_S_WAITSTAT 2
114#define MCD_S_WAITMODE 3
115#define MCD_S_WAITREAD 4
116
117/* prototypes */
118static void mcd_start(struct mcd_softc *);
126static int mcd_getdisklabel(struct mcd_softc *);
127#ifdef NOTYET
128static void mcd_configure(struct mcd_softc *sc);
129#endif
130static int mcd_get(struct mcd_softc *, char *buf, int nmax);
131static int mcd_setflags(struct mcd_softc *);
132static int mcd_getstat(struct mcd_softc *,int sflg);
133static int mcd_send(struct mcd_softc *, int cmd,int nretrys);
134static void hsg2msf(int hsg, bcd_t *msf);

--- 77 unchanged lines hidden (view full) ---

212 mcd_soft_reset(sc);
213 bioq_init(&cd->head);
214
215#ifdef NOTYET
216 /* wire controller for interrupts and dma */
217 mcd_configure(sc);
218#endif
219 /* name filled in probe */
119#ifdef NOTYET
120static void mcd_configure(struct mcd_softc *sc);
121#endif
122static int mcd_get(struct mcd_softc *, char *buf, int nmax);
123static int mcd_setflags(struct mcd_softc *);
124static int mcd_getstat(struct mcd_softc *,int sflg);
125static int mcd_send(struct mcd_softc *, int cmd,int nretrys);
126static void hsg2msf(int hsg, bcd_t *msf);

--- 77 unchanged lines hidden (view full) ---

204 mcd_soft_reset(sc);
205 bioq_init(&cd->head);
206
207#ifdef NOTYET
208 /* wire controller for interrupts and dma */
209 mcd_configure(sc);
210#endif
211 /* name filled in probe */
220 sc->mcd_dev_t[0] = make_dev(&mcd_cdevsw, 0,
212 sc->mcd_dev_t = make_dev(&mcd_cdevsw, 8 * unit,
221 UID_ROOT, GID_OPERATOR, 0640, "mcd%d", unit);
213 UID_ROOT, GID_OPERATOR, 0640, "mcd%d", unit);
222 sc->mcd_dev_t[1] = make_dev_alias(sc->mcd_dev_t[0], "mcd%da", unit);
223 sc->mcd_dev_t[2] = make_dev_alias(sc->mcd_dev_t[0], "mcd%dc", unit);
224
214
225 sc->mcd_dev_t[0]->si_drv1 = sc->mcd_dev_t[1]->si_drv1 =
226 sc->mcd_dev_t[2]->si_drv1 = (void *)sc;
215 sc->mcd_dev_t->si_drv1 = (void *)sc;
227
228 return 0;
229}
230
231static int
232mcdopen(dev_t dev, int flags, int fmt, struct thread *td)
233{
234 struct mcd_softc *sc;
235 struct mcd_data *cd;
216
217 return 0;
218}
219
220static int
221mcdopen(dev_t dev, int flags, int fmt, struct thread *td)
222{
223 struct mcd_softc *sc;
224 struct mcd_data *cd;
236 int part,phys,r,retry;
225 int r,retry;
237
238 sc = (struct mcd_softc *)dev->si_drv1;
239 cd = &sc->data;
226
227 sc = (struct mcd_softc *)dev->si_drv1;
228 cd = &sc->data;
240 part = mcd_part(dev);
241 phys = mcd_phys(dev);
242
243 /* not initialized*/
244 if (!(cd->flags & MCDINIT))
245 return ENXIO;
246
247 /* invalidated in the meantime? mark all open part's invalid */
248 if (!(cd->flags & MCDVALID) && cd->openflags)
249 return ENXIO;

--- 6 unchanged lines hidden (view full) ---

256 for (retry = 0; retry < DISK_SENSE_SECS * WAIT_FRAC; retry++) {
257 (void) tsleep((caddr_t)cd, PSOCK | PCATCH, "mcdsn1", hz/WAIT_FRAC);
258 if ((r = mcd_getstat(sc, 1)) == -1)
259 return EIO;
260 if (r != -2)
261 break;
262 }
263
229
230 /* not initialized*/
231 if (!(cd->flags & MCDINIT))
232 return ENXIO;
233
234 /* invalidated in the meantime? mark all open part's invalid */
235 if (!(cd->flags & MCDVALID) && cd->openflags)
236 return ENXIO;

--- 6 unchanged lines hidden (view full) ---

243 for (retry = 0; retry < DISK_SENSE_SECS * WAIT_FRAC; retry++) {
244 (void) tsleep((caddr_t)cd, PSOCK | PCATCH, "mcdsn1", hz/WAIT_FRAC);
245 if ((r = mcd_getstat(sc, 1)) == -1)
246 return EIO;
247 if (r != -2)
248 break;
249 }
250
264 if (( (cd->status & (MCDDOOROPEN|MCDDSKCHNG))
265 || !(cd->status & MCDDSKIN)
266 )
267 && major(dev) == CDEV_MAJOR && part == RAW_PART
268 ) {
269 cd->openflags |= (1<<part);
270 if (phys)
271 cd->partflags[part] |= MCDREADRAW;
272 return 0;
273 }
274 if (cd->status & MCDDOOROPEN) {
275 device_printf(sc->dev, "door is open\n");
276 return ENXIO;
277 }
278 if (!(cd->status & MCDDSKIN)) {
279 device_printf(sc->dev, "no CD inside\n");
280 return ENXIO;
281 }
282 if (cd->status & MCDDSKCHNG) {
283 device_printf(sc->dev, "CD not sensed\n");
284 return ENXIO;
285 }
286
287 if (mcdsize(dev) < 0) {
251 if (cd->status & MCDDOOROPEN) {
252 device_printf(sc->dev, "door is open\n");
253 return ENXIO;
254 }
255 if (!(cd->status & MCDDSKIN)) {
256 device_printf(sc->dev, "no CD inside\n");
257 return ENXIO;
258 }
259 if (cd->status & MCDDSKCHNG) {
260 device_printf(sc->dev, "CD not sensed\n");
261 return ENXIO;
262 }
263
264 if (mcdsize(dev) < 0) {
288 if (major(dev) == CDEV_MAJOR && part == RAW_PART) {
289 cd->openflags |= (1<<part);
290 if (phys)
291 cd->partflags[part] |= MCDREADRAW;
292 return 0;
293 }
294 device_printf(sc->dev, "failed to get disk size\n");
295 return ENXIO;
265 device_printf(sc->dev, "failed to get disk size\n");
266 return ENXIO;
296 } else
297 cd->flags |= MCDVALID;
267 }
298
268
299 /* XXX get a default disklabel */
300 mcd_getdisklabel(sc);
301
302MCD_TRACE("open: partition=%d, disksize = %ld, blksize=%d\n",
303 part, cd->disksize, cd->blksize);
304
305 dev->si_bsize_phys = cd->blksize;
306
269 dev->si_bsize_phys = cd->blksize;
270
307 if (part == RAW_PART ||
308 (part < cd->dlabel.d_npartitions &&
309 cd->dlabel.d_partitions[part].p_fstype != FS_UNUSED)) {
310 cd->openflags |= (1<<part);
311 if (part == RAW_PART && phys)
312 cd->partflags[part] |= MCDREADRAW;
313 (void) mcd_lock_door(sc, MCD_LK_LOCK);
314 if (!(cd->flags & MCDVALID))
315 return ENXIO;
316 return 0;
317 }
271 cd->openflags = 1;
272 cd->partflags |= MCDREADRAW;
273 cd->flags |= MCDVALID;
318
274
319 return ENXIO;
275 (void) mcd_lock_door(sc, MCD_LK_LOCK);
276 if (!(cd->flags & MCDVALID))
277 return ENXIO;
278
279 return (mcd_read_toc(sc));
320}
321
322static int
323mcdclose(dev_t dev, int flags, int fmt, struct thread *td)
324{
325 struct mcd_softc *sc;
326 struct mcd_data *cd;
280}
281
282static int
283mcdclose(dev_t dev, int flags, int fmt, struct thread *td)
284{
285 struct mcd_softc *sc;
286 struct mcd_data *cd;
327 int part;
328
329 sc = (struct mcd_softc *)dev->si_drv1;
330 cd = &sc->data;
287
288 sc = (struct mcd_softc *)dev->si_drv1;
289 cd = &sc->data;
331 part = mcd_part(dev);
332
290
333 if (!(cd->flags & MCDINIT) || !(cd->openflags & (1<<part)))
291 if (!(cd->flags & MCDINIT) || !cd->openflags)
334 return ENXIO;
335
292 return ENXIO;
293
336 MCD_TRACE("close: partition=%d\n", part);
337
338 (void) mcd_lock_door(sc, MCD_LK_UNLOCK);
294 (void) mcd_lock_door(sc, MCD_LK_UNLOCK);
339 cd->openflags &= ~(1<<part);
340 cd->partflags[part] &= ~MCDREADRAW;
295 cd->openflags = 0;
296 cd->partflags &= ~MCDREADRAW;
341
342 return 0;
343}
344
345static void
346mcdstrategy(struct bio *bp)
347{
348 struct mcd_softc *sc;
349 struct mcd_data *cd;
350 int s;
351
297
298 return 0;
299}
300
301static void
302mcdstrategy(struct bio *bp)
303{
304 struct mcd_softc *sc;
305 struct mcd_data *cd;
306 int s;
307
352 int unit = mcd_unit(bp->bio_dev);
353
354 sc = (struct mcd_softc *)bp->bio_dev->si_drv1;
355 cd = &sc->data;
356
357 /* test validity */
358/*MCD_TRACE("strategy: buf=0x%lx, unit=%ld, block#=%ld bcount=%ld\n",
359 bp,unit,bp->bio_blkno,bp->bio_bcount);*/
308 sc = (struct mcd_softc *)bp->bio_dev->si_drv1;
309 cd = &sc->data;
310
311 /* test validity */
312/*MCD_TRACE("strategy: buf=0x%lx, unit=%ld, block#=%ld bcount=%ld\n",
313 bp,unit,bp->bio_blkno,bp->bio_bcount);*/
314
360 if (bp->bio_blkno < 0) {
315 if (bp->bio_blkno < 0) {
361 printf("mcdstrategy: unit = %d, blkno = %ld, bcount = %ld\n",
362 unit, (long)bp->bio_blkno, bp->bio_bcount);
363 printf("mcd: mcdstratregy failure");
316 device_printf(sc->dev, "strategy failure: blkno = %ld, bcount = %ld\n",
317 (long)bp->bio_blkno, bp->bio_bcount);
364 bp->bio_error = EINVAL;
365 bp->bio_flags |= BIO_ERROR;
366 goto bad;
367 }
368
369 /* if device invalidated (e.g. media change, door open), error */
370 if (!(cd->flags & MCDVALID)) {
318 bp->bio_error = EINVAL;
319 bp->bio_flags |= BIO_ERROR;
320 goto bad;
321 }
322
323 /* if device invalidated (e.g. media change, door open), error */
324 if (!(cd->flags & MCDVALID)) {
371MCD_TRACE("strategy: drive not valid\n");
325 device_printf(sc->dev, "media changed\n");
372 bp->bio_error = EIO;
373 goto bad;
374 }
375
376 /* read only */
377 if (!(bp->bio_cmd == BIO_READ)) {
378 bp->bio_error = EROFS;
379 goto bad;
380 }
381
382 /* no data to read */
383 if (bp->bio_bcount == 0)
384 goto done;
385
326 bp->bio_error = EIO;
327 goto bad;
328 }
329
330 /* read only */
331 if (!(bp->bio_cmd == BIO_READ)) {
332 bp->bio_error = EROFS;
333 goto bad;
334 }
335
336 /* no data to read */
337 if (bp->bio_bcount == 0)
338 goto done;
339
386 /* for non raw access, check partition limits */
387 if (mcd_part(bp->bio_dev) != RAW_PART) {
388 if (!(cd->flags & MCDLABEL)) {
389 bp->bio_error = EIO;
390 goto bad;
391 }
392 /* adjust transfer if necessary */
393 if (bounds_check_with_label(bp,&cd->dlabel,1) <= 0) {
394 goto done;
395 }
396 } else {
397 bp->bio_pblkno = bp->bio_blkno;
398 bp->bio_resid = 0;
340 if (!(cd->flags & MCDTOC)) {
341 bp->bio_error = EIO;
342 goto bad;
399 }
400
343 }
344
345 bp->bio_pblkno = bp->bio_blkno;
346 bp->bio_resid = 0;
347
401 /* queue it */
402 s = splbio();
403 bioqdisksort(&cd->head, bp);
404 splx(s);
405
406 /* now check whether we can perform processing */
407 mcd_start(sc);
408 return;

--- 5 unchanged lines hidden (view full) ---

414 biodone(bp);
415 return;
416}
417
418static void
419mcd_start(struct mcd_softc *sc)
420{
421 struct mcd_data *cd = &sc->data;
348 /* queue it */
349 s = splbio();
350 bioqdisksort(&cd->head, bp);
351 splx(s);
352
353 /* now check whether we can perform processing */
354 mcd_start(sc);
355 return;

--- 5 unchanged lines hidden (view full) ---

361 biodone(bp);
362 return;
363}
364
365static void
366mcd_start(struct mcd_softc *sc)
367{
368 struct mcd_data *cd = &sc->data;
422 struct partition *p;
423 struct bio *bp;
424 int s = splbio();
425
426 if (cd->flags & MCDMBXBSY) {
427 splx(s);
428 return;
429 }
430
431 bp = bioq_first(&cd->head);
432 if (bp != 0) {
433 /* block found to process, dequeue */
434 /*MCD_TRACE("mcd_start: found block bp=0x%x\n",bp,0,0,0);*/
435 bioq_remove(&cd->head, bp);
369 struct bio *bp;
370 int s = splbio();
371
372 if (cd->flags & MCDMBXBSY) {
373 splx(s);
374 return;
375 }
376
377 bp = bioq_first(&cd->head);
378 if (bp != 0) {
379 /* block found to process, dequeue */
380 /*MCD_TRACE("mcd_start: found block bp=0x%x\n",bp,0,0,0);*/
381 bioq_remove(&cd->head, bp);
382 cd->flags |= MCDMBXBSY;
436 splx(s);
437 } else {
438 /* nothing to do */
439 splx(s);
440 return;
441 }
442
383 splx(s);
384 } else {
385 /* nothing to do */
386 splx(s);
387 return;
388 }
389
443 /* changed media? */
444 if (!(cd->flags & MCDVALID)) {
445 MCD_TRACE("mcd_start: drive not valid\n");
446 return;
447 }
448
449 p = cd->dlabel.d_partitions + mcd_part(bp->bio_dev);
450
451 cd->flags |= MCDMBXBSY;
452 if (cd->partflags[mcd_part(bp->bio_dev)] & MCDREADRAW)
453 cd->flags |= MCDREADRAW;
454 cd->mbx.unit = device_get_unit(sc->dev);
455 cd->mbx.retry = MCD_RETRYS;
456 cd->mbx.bp = bp;
390 cd->mbx.retry = MCD_RETRYS;
391 cd->mbx.bp = bp;
457 cd->mbx.p_offset = p->p_offset;
458
392
459 /* calling the read routine */
460 mcd_doread(sc, MCD_S_BEGIN,&(cd->mbx));
393 mcd_doread(sc, MCD_S_BEGIN,&(cd->mbx));
461 /* triggers mcd_start, when successful finished */
462 return;
463}
464
465static int
466mcdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
467{
468 struct mcd_softc *sc;
469 struct mcd_data *cd;
394 return;
395}
396
397static int
398mcdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
399{
400 struct mcd_softc *sc;
401 struct mcd_data *cd;
470 int unit,part,retry,r;
402 int retry,r;
471
403
472 unit = mcd_unit(dev);
473 part = mcd_part(dev);
474 sc = (struct mcd_softc *)dev->si_drv1;
475 cd = &sc->data;
476
477 if (mcd_getstat(sc, 1) == -1) /* detect disk change too */
478 return EIO;
479MCD_TRACE("ioctl called 0x%lx\n", cmd);
480
481 switch (cmd) {

--- 20 unchanged lines hidden (view full) ---

502 return mcd_lock_door(sc, MCD_LK_UNLOCK);
503 case CDIOCPREVENT:
504 return mcd_lock_door(sc, MCD_LK_LOCK);
505 case CDIOCCLOSE:
506 return mcd_inject(sc);
507 }
508
509 if (!(cd->flags & MCDVALID)) {
404 sc = (struct mcd_softc *)dev->si_drv1;
405 cd = &sc->data;
406
407 if (mcd_getstat(sc, 1) == -1) /* detect disk change too */
408 return EIO;
409MCD_TRACE("ioctl called 0x%lx\n", cmd);
410
411 switch (cmd) {

--- 20 unchanged lines hidden (view full) ---

432 return mcd_lock_door(sc, MCD_LK_UNLOCK);
433 case CDIOCPREVENT:
434 return mcd_lock_door(sc, MCD_LK_LOCK);
435 case CDIOCCLOSE:
436 return mcd_inject(sc);
437 }
438
439 if (!(cd->flags & MCDVALID)) {
510 if ( major(dev) != CDEV_MAJOR
511 || part != RAW_PART
512 || !(cd->openflags & (1<<RAW_PART))
513 )
514 return ENXIO;
515 if ( (cd->status & (MCDDSKCHNG|MCDDOOROPEN))
516 || !(cd->status & MCDDSKIN))
517 for (retry = 0; retry < DISK_SENSE_SECS * WAIT_FRAC; retry++) {
518 (void) tsleep((caddr_t)cd, PSOCK | PCATCH, "mcdsn2", hz/WAIT_FRAC);
519 if ((r = mcd_getstat(sc, 1)) == -1)
520 return EIO;
521 if (r != -2)
522 break;
523 }
524 if ( (cd->status & (MCDDOOROPEN|MCDDSKCHNG))
525 || !(cd->status & MCDDSKIN)
526 || mcdsize(dev) < 0
527 )
528 return ENXIO;
529 cd->flags |= MCDVALID;
440 if ( (cd->status & (MCDDSKCHNG|MCDDOOROPEN))
441 || !(cd->status & MCDDSKIN))
442 for (retry = 0; retry < DISK_SENSE_SECS * WAIT_FRAC; retry++) {
443 (void) tsleep((caddr_t)cd, PSOCK | PCATCH, "mcdsn2", hz/WAIT_FRAC);
444 if ((r = mcd_getstat(sc, 1)) == -1)
445 return EIO;
446 if (r != -2)
447 break;
448 }
449 if ( (cd->status & (MCDDOOROPEN|MCDDSKCHNG))
450 || !(cd->status & MCDDSKIN)
451 || mcdsize(dev) < 0
452 )
453 return ENXIO;
454 cd->flags |= MCDVALID;
530 mcd_getdisklabel(sc);
531 if (mcd_phys(dev))
532 cd->partflags[part] |= MCDREADRAW;
455 cd->partflags |= MCDREADRAW;
533 (void) mcd_lock_door(sc, MCD_LK_LOCK);
534 if (!(cd->flags & MCDVALID))
535 return ENXIO;
536 }
537
538 switch (cmd) {
456 (void) mcd_lock_door(sc, MCD_LK_LOCK);
457 if (!(cd->flags & MCDVALID))
458 return ENXIO;
459 }
460
461 switch (cmd) {
539 case DIOCGDINFO:
540 *(struct disklabel *) addr = cd->dlabel;
541 return 0;
542 /*
543 * a bit silly, but someone might want to test something on a
544 * section of cdrom.
545 */
546 case DIOCWDINFO:
547 case DIOCSDINFO:
548 if ((flags & FWRITE) == 0)
549 return EBADF;
550 else {
551 return setdisklabel(&cd->dlabel,
552 (struct disklabel *) addr,
553 0);
554 }
555 case DIOCWLABEL:
556 return EBADF;
462 case DIOCGMEDIASIZE:
463 *(off_t *)addr = (off_t)cd->disksize * cd->blksize;
464 return (0);
465 break;
466 case DIOCGSECTORSIZE:
467 *(u_int *)addr = cd->blksize;
468 return (0);
469 break;
470
557 case CDIOCPLAYTRACKS:
558 return mcd_playtracks(sc, (struct ioc_play_track *) addr);
559 case CDIOCPLAYBLOCKS:
560 return mcd_playblocks(sc, (struct ioc_play_blocks *) addr);
561 case CDIOCPLAYMSF:
562 return mcd_playmsf(sc, (struct ioc_play_msf *) addr);
563 case CDIOCREADSUBCHANNEL:
564 return mcd_subchan(sc, (struct ioc_read_subchannel *) addr);

--- 12 unchanged lines hidden (view full) ---

577 case CDIOCSTOP:
578 return mcd_stop(sc);
579 default:
580 return ENOTTY;
581 }
582 /*NOTREACHED*/
583}
584
471 case CDIOCPLAYTRACKS:
472 return mcd_playtracks(sc, (struct ioc_play_track *) addr);
473 case CDIOCPLAYBLOCKS:
474 return mcd_playblocks(sc, (struct ioc_play_blocks *) addr);
475 case CDIOCPLAYMSF:
476 return mcd_playmsf(sc, (struct ioc_play_msf *) addr);
477 case CDIOCREADSUBCHANNEL:
478 return mcd_subchan(sc, (struct ioc_read_subchannel *) addr);

--- 12 unchanged lines hidden (view full) ---

491 case CDIOCSTOP:
492 return mcd_stop(sc);
493 default:
494 return ENOTTY;
495 }
496 /*NOTREACHED*/
497}
498
585/* this could have been taken from scsi/cd.c, but it is not clear
586 * whether the scsi cd driver is linked in
587 */
588static int
499static int
589mcd_getdisklabel(struct mcd_softc *sc)
590{
591 struct mcd_data *cd = &sc->data;
592
593 if (cd->flags & MCDLABEL)
594 return -1;
595
596 bzero(&cd->dlabel,sizeof(struct disklabel));
597 /* filled with spaces first */
598 strncpy(cd->dlabel.d_typename," ",
599 sizeof(cd->dlabel.d_typename));
600 strncpy(cd->dlabel.d_typename, cd->name,
601 min(strlen(cd->name), sizeof(cd->dlabel.d_typename) - 1));
602 strncpy(cd->dlabel.d_packname,"unknown ",
603 sizeof(cd->dlabel.d_packname));
604 cd->dlabel.d_secsize = cd->blksize;
605 cd->dlabel.d_nsectors = 100;
606 cd->dlabel.d_ntracks = 1;
607 cd->dlabel.d_ncylinders = (cd->disksize/100)+1;
608 cd->dlabel.d_secpercyl = 100;
609 cd->dlabel.d_secperunit = cd->disksize;
610 cd->dlabel.d_rpm = 300;
611 cd->dlabel.d_interleave = 1;
612 cd->dlabel.d_flags = D_REMOVABLE;
613 cd->dlabel.d_npartitions= 1;
614 cd->dlabel.d_partitions[0].p_offset = 0;
615 cd->dlabel.d_partitions[0].p_size = cd->disksize;
616 cd->dlabel.d_partitions[0].p_fstype = 9;
617 cd->dlabel.d_magic = DISKMAGIC;
618 cd->dlabel.d_magic2 = DISKMAGIC;
619 cd->dlabel.d_checksum = dkcksum(&cd->dlabel);
620
621 cd->flags |= MCDLABEL;
622 return 0;
623}
624
625static int
626mcdsize(dev_t dev)
627{
628 struct mcd_softc *sc;
629 struct mcd_data *cd;
630 int size;
500mcdsize(dev_t dev)
501{
502 struct mcd_softc *sc;
503 struct mcd_data *cd;
504 int size;
631 int unit;
632
505
633 unit = mcd_unit(dev);
634 sc = (struct mcd_softc *)dev->si_drv1;
635 cd = &sc->data;
636
637 if (mcd_volinfo(sc) == 0) {
638 cd->blksize = MCDBLK;
639 size = msf2hsg(cd->volinfo.vol_msf, 0);
640 cd->disksize = size * (MCDBLK/DEV_BSIZE);
641 return 0;

--- 399 unchanged lines hidden (view full) ---

1041 RDELAY_WAITMODE-mbx->count);
1042modedone:
1043 /* for first block */
1044 mbx->nblk = (bp->bio_bcount + (mbx->sz-1)) / mbx->sz;
1045 mbx->skip = 0;
1046
1047nextblock:
1048 blknum = (bp->bio_blkno / (mbx->sz/DEV_BSIZE))
506 sc = (struct mcd_softc *)dev->si_drv1;
507 cd = &sc->data;
508
509 if (mcd_volinfo(sc) == 0) {
510 cd->blksize = MCDBLK;
511 size = msf2hsg(cd->volinfo.vol_msf, 0);
512 cd->disksize = size * (MCDBLK/DEV_BSIZE);
513 return 0;

--- 399 unchanged lines hidden (view full) ---

913 RDELAY_WAITMODE-mbx->count);
914modedone:
915 /* for first block */
916 mbx->nblk = (bp->bio_bcount + (mbx->sz-1)) / mbx->sz;
917 mbx->skip = 0;
918
919nextblock:
920 blknum = (bp->bio_blkno / (mbx->sz/DEV_BSIZE))
1049 + mbx->p_offset + mbx->skip/mbx->sz;
921 + mbx->skip/mbx->sz;
1050
1051 MCD_TRACE("mcd_doread: read blknum=%d for bp=%p\n",
1052 blknum, bp);
1053
1054 /* build parameter block */
1055 hsg2msf(blknum,rbuf.start_msf);
1056retry_read:
1057 /* send the read command */

--- 182 unchanged lines hidden (view full) ---

1240 cd->audio_status = CD_AS_AUDIO_INVALID;
1241 return 0;
1242}
1243
1244static void
1245mcd_soft_reset(struct mcd_softc *sc)
1246{
1247 struct mcd_data *cd = &sc->data;
922
923 MCD_TRACE("mcd_doread: read blknum=%d for bp=%p\n",
924 blknum, bp);
925
926 /* build parameter block */
927 hsg2msf(blknum,rbuf.start_msf);
928retry_read:
929 /* send the read command */

--- 182 unchanged lines hidden (view full) ---

1112 cd->audio_status = CD_AS_AUDIO_INVALID;
1113 return 0;
1114}
1115
1116static void
1117mcd_soft_reset(struct mcd_softc *sc)
1118{
1119 struct mcd_data *cd = &sc->data;
1248 int i;
1249
1250 cd->flags &= (MCDINIT|MCDPROBING|MCDNEWMODEL);
1251 cd->curr_mode = MCD_MD_UNKNOWN;
1120
1121 cd->flags &= (MCDINIT|MCDPROBING|MCDNEWMODEL);
1122 cd->curr_mode = MCD_MD_UNKNOWN;
1252 for (i=0; i<MAXPARTITIONS; i++) cd->partflags[i] = 0;
1123 cd->partflags = 0;
1253 cd->audio_status = CD_AS_AUDIO_INVALID;
1254}
1255
1256static int
1257mcd_setmode(struct mcd_softc *sc, int mode)
1258{
1259 struct mcd_data *cd = &sc->data;
1260 int retry, st;

--- 520 unchanged lines hidden (view full) ---

1781mcd_resume(struct mcd_softc *sc)
1782{
1783 struct mcd_data *cd = &sc->data;
1784
1785 if (cd->audio_status != CD_AS_PLAY_PAUSED)
1786 return EINVAL;
1787 return mcd_play(sc, &cd->lastpb);
1788}
1124 cd->audio_status = CD_AS_AUDIO_INVALID;
1125}
1126
1127static int
1128mcd_setmode(struct mcd_softc *sc, int mode)
1129{
1130 struct mcd_data *cd = &sc->data;
1131 int retry, st;

--- 520 unchanged lines hidden (view full) ---

1652mcd_resume(struct mcd_softc *sc)
1653{
1654 struct mcd_data *cd = &sc->data;
1655
1656 if (cd->audio_status != CD_AS_PLAY_PAUSED)
1657 return EINVAL;
1658 return mcd_play(sc, &cd->lastpb);
1659}
1789#endif /* GEOM */