summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>1999-09-22 12:04:51 +0000
committersos <sos@FreeBSD.org>1999-09-22 12:04:51 +0000
commit2801850d68933ef5c46317fe5cdc9e1a39b51ba3 (patch)
treebdbb23e177d2a2c2c5f04daff165317b09778bb2 /sys
parentf747ad7143b0a20f690cbef43139419cb4f5aee4 (diff)
downloadFreeBSD-src-2801850d68933ef5c46317fe5cdc9e1a39b51ba3.zip
FreeBSD-src-2801850d68933ef5c46317fe5cdc9e1a39b51ba3.tar.gz
Support quad & max speeds in wormcontrol.
A bit more general cleanup.
Diffstat (limited to 'sys')
-rw-r--r--sys/conf/files.i3866
-rw-r--r--sys/dev/ata/ata-all.c4
-rw-r--r--sys/dev/ata/ata-disk.c9
-rw-r--r--sys/dev/ata/ata-dma.c13
-rw-r--r--sys/dev/ata/atapi-all.c7
-rw-r--r--sys/dev/ata/atapi-all.h1
-rw-r--r--sys/dev/ata/atapi-cd.c53
-rw-r--r--sys/dev/ata/atapi-cd.h1
-rw-r--r--sys/dev/ata/atapi-fd.c17
-rw-r--r--sys/dev/ata/atapi-tape.c28
-rw-r--r--sys/i386/conf/files.i3866
11 files changed, 47 insertions, 98 deletions
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index f89ff33..8f21bc2 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -48,10 +48,10 @@ trlld.o optional oltr \
contrib/dev/oltr/trlldbm.c optional oltr
contrib/dev/oltr/trlldhm.c optional oltr
contrib/dev/oltr/trlldmac.c optional oltr
-dev/ata/ata-all.c optional ata
+dev/ata/ata-all.c optional ata atadisk atapicd atapifd atapist
+dev/ata/ata-dma.c optional ata atadisk atapicd atapifd atapist
+dev/ata/atapi-all.c optional atapicd atapifd atapist
dev/ata/ata-disk.c optional atadisk
-dev/ata/ata-dma.c optional ata
-dev/ata/atapi-all.c optional ata
dev/ata/atapi-cd.c optional atapicd
dev/ata/atapi-fd.c optional atapifd
dev/ata/atapi-tape.c optional atapist
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index abbd8ac..8a34476 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -30,9 +30,6 @@
#include "ata.h"
#include "apm.h"
-
-#if NATA > 0
-
#include "isa.h"
#include "pci.h"
#include "atadisk.h"
@@ -870,4 +867,3 @@ bpack(int8_t *src, int8_t *dst, int32_t len)
}
dst[j] = 0x00;
}
-#endif /* NATA > 0 */
diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c
index 082f662..4b7df5e 100644
--- a/sys/dev/ata/ata-disk.c
+++ b/sys/dev/ata/ata-disk.c
@@ -28,12 +28,7 @@
* $FreeBSD$
*/
-#include "ata.h"
-#include "atadisk.h"
#include "apm.h"
-
-#if NATA > 0 && NATADISK > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -282,6 +277,7 @@ adopen(dev_t dev, int32_t flags, int32_t fmt, struct proc *p)
printf("adopen: lun=%d adnlun=%d\n", adp->lun, adnlun);
#endif
+ dev->si_iosize_max = 256 * DEV_BSIZE;
dl = &adp->disk.d_label;
bzero(dl, sizeof *dl);
dl->d_secsize = DEV_BSIZE;
@@ -660,8 +656,6 @@ ad_version(u_int16_t version)
static void
ad_drvinit(void)
{
- if (!ad_cdevsw.d_maxio)
- ad_cdevsw.d_maxio = 256 * DEV_BSIZE;
fakewd_cdevsw = ad_cdevsw;
fakewd_cdevsw.d_maj = 3;
fakewd_cdevsw.d_bmaj = 0;
@@ -684,4 +678,3 @@ ad_drvinit(void)
}
SYSINIT(addev, SI_SUB_DRIVERS, SI_ORDER_SECOND, ad_drvinit, NULL)
-#endif /* NATA && NATADISK */
diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c
index 1069b01..0b32282 100644
--- a/sys/dev/ata/ata-dma.c
+++ b/sys/dev/ata/ata-dma.c
@@ -28,12 +28,8 @@
* $FreeBSD$
*/
-#include "ata.h"
#include "pci.h"
#include "apm.h"
-
-#if NATA > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -282,7 +278,13 @@ ata_dmainit(struct ata_softc *scp, int32_t device,
}
break;
- default: /* well, we have no support for this, but try anyways */
+ default: /* unknown controller chip */
+ /* better not try generic DMA on ATAPI devices it almost never works */
+ if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
+ (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
+ break;
+
+ /* well, we have no support for this, but try anyways */
if (((wdmamode >= 2 && apiomode >= 4) || udmamode >= 2) &&
(inb(scp->bmaddr + ATA_BMSTAT_PORT) &
((device == ATA_MASTER) ?
@@ -426,4 +428,3 @@ ata_dmastatus(struct ata_softc *scp, int32_t device)
}
#endif /* NPCI > 0 */
-#endif /* NATA > 0 */
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index f7b51dc..b2dcdab 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -28,14 +28,10 @@
* $FreeBSD$
*/
-#include "ata.h"
+#include "apm.h"
#include "atapicd.h"
#include "atapist.h"
#include "atapifd.h"
-#include "apm.h"
-
-#if NATA > 0 && (NATAPICD > 0 || NATAPIFD > 0 || NATAPIST > 0)
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -780,4 +776,3 @@ atapi_init(void)
}
SYSINIT(atconf, SI_SUB_CONFIGURE, SI_ORDER_SECOND, atapi_init, NULL)
-#endif /* NATA > 0 && (NATAPICD > 0 || NATAPIFD > 0 || NATAPIST > 0) */
diff --git a/sys/dev/ata/atapi-all.h b/sys/dev/ata/atapi-all.h
index 6843af3..e87332e 100644
--- a/sys/dev/ata/atapi-all.h
+++ b/sys/dev/ata/atapi-all.h
@@ -101,6 +101,7 @@
#define ATAPI_PLAY_BIG 0xa5 /* play by lba */
#define ATAPI_LOAD_UNLOAD 0xa6 /* changer control command */
#define ATAPI_PLAY_CD 0xb4 /* universal play command */
+#define ATAPI_SET_SPEED 0xbb /* set drive speed */
#define ATAPI_MECH_STATUS 0xbd /* get changer status */
#define ATAPI_READ_CD 0xbe /* read data */
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index 25e06b5..32349c3 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -28,12 +28,7 @@
* $FreeBSD$
*/
-#include "ata.h"
-#include "atapicd.h"
#include "apm.h"
-
-#if NATA > 0 && NATAPICD > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -87,7 +82,7 @@ static struct cdevsw acd_cdevsw = {
/* prototypes */
int32_t acdattach(struct atapi_softc *);
-static struct acd_softc *acd_init_lun(struct atapi_softc *, int, struct devstat *);
+static struct acd_softc *acd_init_lun(struct atapi_softc *, int32_t, struct devstat *);
static void acd_describe(struct acd_softc *);
static void lba2msf(int32_t, u_int8_t *, u_int8_t *, u_int8_t *);
static int32_t msf2lba(u_int8_t, u_int8_t, u_int8_t);
@@ -96,19 +91,19 @@ static void acd_done(struct atapi_request *);
static int32_t acd_read_toc(struct acd_softc *);
static int32_t acd_setchan(struct acd_softc *, u_int8_t, u_int8_t, u_int8_t, u_int8_t);
static void acd_select_slot(struct acd_softc *);
-static int32_t acd_open_disk(struct acd_softc *, int);
+static int32_t acd_open_disk(struct acd_softc *, int32_t);
static int32_t acd_open_track(struct acd_softc *, struct wormio_prepare_track *);
static int32_t acd_close_track(struct acd_softc *);
static int32_t acd_close_disk(struct acd_softc *);
-static int32_t acd_read_track_info(struct acd_softc *, int, struct acd_track_info*);
-static int32_t acd_eject(struct acd_softc *, int);
+static int32_t acd_read_track_info(struct acd_softc *, int32_t, struct acd_track_info*);
+static int32_t acd_eject(struct acd_softc *, int32_t);
static int32_t acd_blank(struct acd_softc *);
static int32_t acd_prevent_allow(struct acd_softc *, int32_t);
static int32_t acd_start_stop(struct acd_softc *, int32_t);
static int32_t acd_pause_resume(struct acd_softc *, int32_t);
static int32_t acd_mode_sense(struct acd_softc *, u_int8_t, void *, int32_t);
static int32_t acd_mode_select(struct acd_softc *, void *, int32_t);
-static void acd_drvinit(void *);
+static int32_t acd_set_speed(struct acd_softc *cdp, int32_t);
/* internal vars */
static int32_t acdnlun = 0; /* number of configured drives */
@@ -119,7 +114,12 @@ acdattach(struct atapi_softc *atp)
struct acd_softc *cdp;
struct changer *chp;
int32_t error, count;
+ static int once;
+ if (!once) {
+ cdevsw_add(&acd_cdevsw);
+ once++;
+ }
if (acdnlun >= NUNIT) {
printf("acd: too many units\n");
return -1;
@@ -439,11 +439,12 @@ acdopen(dev_t dev, int32_t flags, int32_t fmt, struct proc *p)
}
dev->si_bsize_phys = 2048; /* XXX SOS */
+ dev->si_iosize_max = 254 * DEV_BSIZE;
if (!(cdp->flags & F_BOPEN) && !cdp->refcnt) {
- acd_prevent_allow(cdp, 1); /* prevent user eject */
+ acd_prevent_allow(cdp, 1);
cdp->flags |= F_LOCKED;
- if (!(flags & O_NONBLOCK) && acd_read_toc(cdp) && !(flags & FWRITE))
- printf("acd%d: read_toc failed\n", cdp->lun);
+ if (!(flags & O_NONBLOCK) && !(flags & FWRITE))
+ acd_read_toc(cdp);
}
if (fmt == S_IFBLK)
cdp->flags |= F_BOPEN;
@@ -938,8 +939,9 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct proc *p)
if (error == 0) {
cdp->flags |= F_DISK_PREPED;
cdp->dummy = w->dummy;
- cdp->speed = w->speed;
}
+ /* set speed in KB/s (approximate) */
+ acd_set_speed(cdp, w->speed * 173);
}
break;
}
@@ -1407,9 +1409,7 @@ acd_eject(struct acd_softc *cdp, int32_t close)
int32_t error;
acd_select_slot(cdp);
- error = acd_start_stop(cdp, 0);
- if (((cdp->atp->controller->error&ATAPI_SK_MASK)==ATAPI_SK_NOT_READY) ||
- ((cdp->atp->controller->error&ATAPI_SK_MASK)==ATAPI_SK_UNIT_ATTENTION)){
+ if ((error = acd_start_stop(cdp, 0)) == EBUSY) {
if (!close)
return 0;
if ((error = acd_start_stop(cdp, 3)))
@@ -1423,9 +1423,6 @@ acd_eject(struct acd_softc *cdp, int32_t close)
return error;
if (close)
return 0;
-
- tsleep((caddr_t) &lbolt, PRIBIO, "acdej1", 0);
- tsleep((caddr_t) &lbolt, PRIBIO, "acdej2", 0);
acd_prevent_allow(cdp, 0);
cdp->flags &= ~F_LOCKED;
cdp->flags &= ~(F_WRITTEN|F_TRACK_PREP|F_TRACK_PREPED);
@@ -1502,18 +1499,12 @@ acd_mode_select(struct acd_softc *cdp, void *pagebuf, int32_t pagesize)
pagebuf, pagesize, 0, 30));
}
-static void
-acd_drvinit(void *unused)
+static int32_t
+acd_set_speed(struct acd_softc *cdp, int32_t speed)
{
- static int32_t acd_devsw_installed = 0;
+ int8_t ccb[16] = { ATAPI_SET_SPEED, 0, 0xff, 0xff, speed>>8, speed,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- if (!acd_devsw_installed) {
- if (!acd_cdevsw.d_maxio)
- acd_cdevsw.d_maxio = 254 * DEV_BSIZE;
- cdevsw_add(&acd_cdevsw);
- acd_devsw_installed = 1;
- }
+ return atapi_error(cdp->atp, atapi_immed_cmd(cdp->atp, ccb, NULL, 0, 0,30));
}
-SYSINIT(acddev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, acd_drvinit, NULL)
-#endif /* NATA && NATAPICD */
diff --git a/sys/dev/ata/atapi-cd.h b/sys/dev/ata/atapi-cd.h
index 8ec06f8..2df5767 100644
--- a/sys/dev/ata/atapi-cd.h
+++ b/sys/dev/ata/atapi-cd.h
@@ -344,7 +344,6 @@ struct acd_softc {
int32_t slot; /* this lun's slot number */
u_int32_t block_size; /* blocksize currently used */
u_int8_t dummy; /* use dummy writes */
- u_int8_t speed; /* select drive speed */
u_int32_t next_writeable_addr; /* next writable address */
struct wormio_prepare_track preptrack; /* scratch region */
struct devstat *stats; /* devstat entry */
diff --git a/sys/dev/ata/atapi-fd.c b/sys/dev/ata/atapi-fd.c
index 0220c58..2063c63 100644
--- a/sys/dev/ata/atapi-fd.c
+++ b/sys/dev/ata/atapi-fd.c
@@ -28,12 +28,7 @@
* $FreeBSD$
*/
-#include "ata.h"
-#include "atapifd.h"
#include "apm.h"
-
-#if NATA > 0 && NATAPIFD > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -103,9 +98,6 @@ afdattach(struct atapi_softc *atp)
struct afd_softc *fdp;
dev_t dev;
- if (!afd_cdevsw.d_maxio)
- afd_cdevsw.d_maxio = 254 * DEV_BSIZE;
-
fdp = malloc(sizeof(struct afd_softc), M_TEMP, M_NOWAIT);
if (!fdp) {
printf("afd: out of memory\n");
@@ -219,6 +211,8 @@ afdopen(dev_t dev, int32_t flags, int32_t fmt, struct proc *p)
struct afd_softc *fdp = dev->si_drv1;
struct disklabel *label;
+ dev->si_iosize_max = 254 * DEV_BSIZE;
+
fdp->atp->flags &= ~ATAPI_F_MEDIA_CHANGED;
afd_prevent_allow(fdp, 1);
if (afd_sense(fdp))
@@ -377,9 +371,7 @@ afd_eject(struct afd_softc *fdp, int32_t close)
{
int32_t error;
- error = afd_start_stop(fdp, 0);
- if (((fdp->atp->controller->error&ATAPI_SK_MASK)==ATAPI_SK_NOT_READY) ||
- ((fdp->atp->controller->error&ATAPI_SK_MASK)==ATAPI_SK_UNIT_ATTENTION)){
+ if ((error = afd_start_stop(fdp, 0)) == EBUSY) {
if (!close)
return 0;
if ((error = afd_start_stop(fdp, 3)))
@@ -390,8 +382,6 @@ afd_eject(struct afd_softc *fdp, int32_t close)
return error;
if (close)
return 0;
- tsleep((caddr_t) &lbolt, PRIBIO, "afdej1", 0);
- tsleep((caddr_t) &lbolt, PRIBIO, "afdej2", 0);
if ((error = afd_prevent_allow(fdp, 0)))
return error;
fdp->atp->flags |= ATAPI_F_MEDIA_CHANGED;
@@ -419,4 +409,3 @@ afd_prevent_allow(struct afd_softc *fdp, int32_t lock)
return atapi_error(fdp->atp, atapi_immed_cmd(fdp->atp, ccb, NULL, 0, 0,30));
}
-#endif /* NATA & NATAPIFD */
diff --git a/sys/dev/ata/atapi-tape.c b/sys/dev/ata/atapi-tape.c
index ad41aaf..1c74c95 100644
--- a/sys/dev/ata/atapi-tape.c
+++ b/sys/dev/ata/atapi-tape.c
@@ -28,12 +28,7 @@
* $FreeBSD$
*/
-#include "ata.h"
-#include "atapist.h"
#include "apm.h"
-
-#if NATA > 0 && NATAPIST > 0
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -98,10 +93,10 @@ static int32_t ast_prevent_allow(struct ast_softc *stp, int32_t lock);
static int32_t ast_load_unload(struct ast_softc *, u_int8_t);
static int32_t ast_rewind(struct ast_softc *);
static int32_t ast_erase(struct ast_softc *);
-static void ast_drvinit(void *);
/* internal vars */
static int32_t astnlun = 0; /* number of config'd drives */
+static int ast_cdev_done = 0;
static u_int64_t ast_total = 0;
static int32_t ast_buffermode = 0;
@@ -112,6 +107,10 @@ astattach(struct atapi_softc *atp)
struct ast_readposition position;
dev_t dev;
+ if (!ast_cdev_done) {
+ cdevsw_add(&ast_cdevsw);
+ ast_cdev_done = 1;
+ }
if (astnlun >= NUNIT) {
printf("ast: too many units\n");
return -1;
@@ -247,6 +246,7 @@ astopen(dev_t dev, int32_t flags, int32_t fmt, struct proc *p)
if (ast_sense(stp))
printf("ast%d: sense media type failed\n", stp->lun);
+ dev->si_iosize_max = 254 * DEV_BSIZE;
stp->flags &= ~(F_DATA_WRITTEN | F_FM_WRITTEN);
stp->flags |= F_OPEN;
stp->atp->flags &= ~ATAPI_F_MEDIA_CHANGED;
@@ -653,19 +653,3 @@ ast_erase(struct ast_softc *stp)
return atapi_error(stp->atp,
atapi_immed_cmd(stp->atp, ccb, NULL, 0, 0, 60*60));
}
-
-static void
-ast_drvinit(void *unused)
-{
- static int32_t ast_devsw_installed = 0;
-
- if (!ast_devsw_installed) {
- if (!ast_cdevsw.d_maxio)
- ast_cdevsw.d_maxio = 254 * DEV_BSIZE;
- cdevsw_add(&ast_cdevsw);
- ast_devsw_installed = 1;
- }
-}
-
-SYSINIT(astdev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, ast_drvinit, NULL)
-#endif /* NATA & NATAPIST */
diff --git a/sys/i386/conf/files.i386 b/sys/i386/conf/files.i386
index f89ff33..8f21bc2 100644
--- a/sys/i386/conf/files.i386
+++ b/sys/i386/conf/files.i386
@@ -48,10 +48,10 @@ trlld.o optional oltr \
contrib/dev/oltr/trlldbm.c optional oltr
contrib/dev/oltr/trlldhm.c optional oltr
contrib/dev/oltr/trlldmac.c optional oltr
-dev/ata/ata-all.c optional ata
+dev/ata/ata-all.c optional ata atadisk atapicd atapifd atapist
+dev/ata/ata-dma.c optional ata atadisk atapicd atapifd atapist
+dev/ata/atapi-all.c optional atapicd atapifd atapist
dev/ata/ata-disk.c optional atadisk
-dev/ata/ata-dma.c optional ata
-dev/ata/atapi-all.c optional ata
dev/ata/atapi-cd.c optional atapicd
dev/ata/atapi-fd.c optional atapifd
dev/ata/atapi-tape.c optional atapist
OpenPOWER on IntegriCloud