summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/atapi-cd.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2002-08-08 07:59:24 +0000
committersos <sos@FreeBSD.org>2002-08-08 07:59:24 +0000
commit12355fce849b88ec85106092c90e813493705508 (patch)
tree020fde6a5b99212c341268e55e3b6576b1a95553 /sys/dev/ata/atapi-cd.c
parent77f180ef672e189c01b122b1bea1a933f7f8002b (diff)
downloadFreeBSD-src-12355fce849b88ec85106092c90e813493705508.zip
FreeBSD-src-12355fce849b88ec85106092c90e813493705508.tar.gz
Add DVD+RW support to the ATA driver and burncd. This also closes
PR40430 by "Peter Haight <peterh@sapros.com>" that has semilar patches included and which I merged with my own work. HW sponsored by: FreeBSD Foundation & FreeBSD Mall Inc Enjoy!
Diffstat (limited to 'sys/dev/ata/atapi-cd.c')
-rw-r--r--sys/dev/ata/atapi-cd.c62
1 files changed, 50 insertions, 12 deletions
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index 333305d..c209065 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -102,6 +102,8 @@ static int acd_mode_sense(struct acd_softc *, int, caddr_t, int);
static int acd_mode_select(struct acd_softc *, caddr_t, int);
static int acd_set_speed(struct acd_softc *, int, int);
static void acd_get_cap(struct acd_softc *);
+static int acd_read_format_caps(struct acd_softc *, struct cdr_format_capacities *);
+static int acd_format(struct acd_softc *, struct cdr_format_params *);
/* internal vars */
static u_int32_t acd_lun_map = 0;
@@ -1029,6 +1031,14 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
error = acd_send_cue(cdp, (struct cdr_cuesheet *)addr);
break;
+ case CDRIOCREADFORMATCAPS:
+ error = acd_read_format_caps(cdp, (struct cdr_format_capacities *)addr);
+ break;
+
+ case CDRIOCFORMAT:
+ error = acd_format(cdp, (struct cdr_format_params *)addr);
+ break;
+
case DVDIOCREPORTKEY:
if (!cdp->cap.read_dvdrom)
error = EINVAL;
@@ -1184,7 +1194,7 @@ acd_start(struct ata_device *atadev)
ccb[9] = 0x10;
}
}
- else
+ else
ccb[0] = ATAPI_WRITE_BIG;
ccb[1] = 0;
@@ -1563,21 +1573,23 @@ acd_read_track_info(struct acd_softc *cdp,
static int
acd_get_progress(struct acd_softc *cdp, int *finished)
{
- int8_t ccb[16] = { ATAPI_READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0,
+ int8_t ccb[16] = { ATAPI_REQUEST_SENSE, 0, 0, 0,
+ sizeof(struct atapi_reqsense), 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 };
- struct atapi_reqsense *sense = cdp->device->result;
- char tmp[8];
+ struct atapi_reqsense sense;
+ int error;
+
+ error = atapi_queue_cmd(cdp->device, ccb,
+ (caddr_t)&sense, sizeof(struct atapi_reqsense),
+ ATPR_F_READ, 30, NULL, NULL);
- if (atapi_test_ready(cdp->device) != EBUSY) {
- if (atapi_queue_cmd(cdp->device, ccb, tmp, sizeof(tmp),
- ATPR_F_READ, 30, NULL, NULL) != EBUSY) {
+ if (error) {
+ if (error != EBUSY)
*finished = 100;
- return 0;
- }
+ return error;
}
- if (sense->sksv)
- *finished =
- ((sense->sk_specific2 | (sense->sk_specific1 << 8)) * 100) / 65535;
+ if (sense.sksv)
+ *finished = ((sense.sk_specific2|(sense.sk_specific1<<8))*100)/65535;
else
*finished = 0;
return 0;
@@ -2000,3 +2012,29 @@ acd_get_cap(struct acd_softc *cdp)
cdp->cap.max_vol_levels = ntohs(cdp->cap.max_vol_levels);
cdp->cap.buf_size = ntohs(cdp->cap.buf_size);
}
+
+static int
+acd_read_format_caps(struct acd_softc *cdp, struct cdr_format_capacities *caps)
+{
+ int8_t ccb[16] = { ATAPI_READ_FORMAT_CAPACITIES, 0, 0, 0, 0, 0, 0,
+ (sizeof(struct cdr_format_capacities) >> 8) & 0xff,
+ sizeof(struct cdr_format_capacities) & 0xff,
+ 0, 0, 0, 0, 0, 0, 0 };
+
+ return atapi_queue_cmd(cdp->device, ccb, (caddr_t)caps,
+ sizeof(struct cdr_format_capacities),
+ ATPR_F_READ, 30, NULL, NULL);
+}
+
+static int
+acd_format(struct acd_softc *cdp, struct cdr_format_params* params)
+{
+ int error;
+ int8_t ccb[16] = { ATAPI_FORMAT, 0x11, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0 };
+
+ error = atapi_queue_cmd(cdp->device, ccb, (u_int8_t *)params,
+ sizeof(struct cdr_format_params), 0, 30, NULL,NULL);
+
+ return error;
+}
OpenPOWER on IntegriCloud