aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>2005-04-15 10:20:52 +0000
committerSøren Schmidt <sos@FreeBSD.org>2005-04-15 10:20:52 +0000
commit9f2ea2bcd597d9c38b11ad188c015b56e3619350 (patch)
treefe9bc6dd9eb4873bf832727fe6190e6e12cfb165 /sys
parentdfc17a329ebcf15f4a8b0e120d15c90fbe2d6a5a (diff)
downloadsrc-9f2ea2bcd597d9c38b11ad188c015b56e3619350.tar.gz
src-9f2ea2bcd597d9c38b11ad188c015b56e3619350.zip
Move the creation of ata_channel child devices to the channel code.
This allows to attach to the children (ATA devices) even without a driver being attached. This allows atapi-cam to do its work both with and without the pure ATAPI driver being present. ATA patches by /me ATAPI-cam pathes by Thomas
Notes
Notes: svn path=/head/; revision=145102
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/ata-all.c77
-rw-r--r--sys/dev/ata/ata-all.h1
-rw-r--r--sys/dev/ata/ata-disk.c37
-rw-r--r--sys/dev/ata/atapi-cam.c81
-rw-r--r--sys/dev/ata/atapi-cd.c36
-rw-r--r--sys/dev/ata/atapi-fd.c40
-rw-r--r--sys/dev/ata/atapi-tape.c40
-rw-r--r--sys/sys/ata.h2
8 files changed, 135 insertions, 179 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index 5cca7e262e80..6f9dc93605bc 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -68,7 +68,8 @@ static struct cdevsw ata_cdevsw = {
/* prototypes */
static void ata_interrupt(void *);
static void ata_boot_attach(void);
-device_t ata_add_child(driver_t *driver, device_t parent, struct ata_device *atadev, const char *name, int unit);
+device_t ata_add_child(device_t parent, struct ata_device *atadev, int unit);
+static int ata_identify(device_t dev);
/* global vars */
MALLOC_DEFINE(M_ATA, "ATA generic", "ATA driver generic layer");
@@ -147,8 +148,7 @@ ata_attach(device_t dev)
return 0;
/* probe and attach devices on this channel */
- bus_generic_probe(dev);
- bus_generic_attach(dev);
+ ata_identify(dev);
return 0;
}
@@ -171,9 +171,6 @@ ata_detach(device_t dev)
free(children, M_TEMP);
}
- /* fail outstanding requests on this channel (SOS shouldn't be any XXX ) */
- ata_fail_requests(ch, NULL);
-
/* release resources */
bus_teardown_intr(dev, ch->r_irq, ch->ih);
bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq);
@@ -558,8 +555,7 @@ ata_boot_attach(void)
/* kick of probe and attach on all channels */
for (ctlr = 0; ctlr < devclass_get_maxunit(ata_devclass); ctlr++) {
if ((ch = devclass_get_softc(ata_devclass, ctlr))) {
- bus_generic_probe(ch->dev);
- bus_generic_attach(ch->dev);
+ ata_identify(ch->dev);
}
}
}
@@ -568,16 +564,14 @@ ata_boot_attach(void)
* misc support functions
*/
device_t
-ata_add_child(driver_t *driver, device_t parent, struct ata_device *atadev,
- const char *name, int unit)
+ata_add_child(device_t parent, struct ata_device *atadev, int unit)
{
struct ata_channel *ch = device_get_softc(parent);
device_t child;
- if ((child = device_add_child(parent, name, unit))) {
+ if ((child = device_add_child(parent, NULL, unit))) {
char buffer[64];
- device_set_driver(child, driver);
device_set_softc(child, atadev);
sprintf(buffer, "%.40s/%.8s",
atadev->param.model, atadev->param.revision);
@@ -586,7 +580,7 @@ ata_add_child(driver_t *driver, device_t parent, struct ata_device *atadev,
atadev->dev = child;
atadev->max_iosize = DEV_BSIZE;
atadev->mode = ATA_PIO_MAX;
- if ((atadev->param.config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) {
+ if (atadev->param.config & ATA_PROTO_ATAPI) {
if (atapi_dma && ch->dma &&
(atadev->param.config & ATA_DRQ_MASK) != ATA_DRQ_INTR &&
ata_umode(&atadev->param) >= ATA_UDMA2)
@@ -600,30 +594,30 @@ ata_add_child(driver_t *driver, device_t parent, struct ata_device *atadev,
return child;
}
-void
-ata_identify(driver_t *driver, device_t parent, int type, const char *name)
+static int
+ata_identify(device_t dev)
{
- struct ata_channel *ch = device_get_softc(parent);
+ struct ata_channel *ch = device_get_softc(dev);
struct ata_device *master, *slave;
int master_res = EIO, slave_res = EIO, master_unit = -1, slave_unit = -1;
if (!(master = malloc(sizeof(struct ata_device),
M_ATA, M_NOWAIT | M_ZERO))) {
- device_printf(parent, "out of memory\n");
- return;
+ device_printf(dev, "out of memory\n");
+ return ENOMEM;
}
master->unit = ATA_MASTER;
if (!(slave = malloc(sizeof(struct ata_device),
M_ATA, M_NOWAIT | M_ZERO))) {
free(master, M_ATA);
- device_printf(parent, "out of memory\n");
- return;
+ device_printf(dev, "out of memory\n");
+ return ENOMEM;
}
slave->unit = ATA_SLAVE;
/* wait for the channel to be IDLE then grab it before touching HW */
- while (ATA_LOCKING(parent, ATA_LF_LOCK) != ch->unit)
- tsleep(ch, PRIBIO, "ataidnt2", 1);
+ while (ATA_LOCKING(dev, ATA_LF_LOCK) != ch->unit)
+ tsleep(ch, PRIBIO, "ataidnt1", 1);
while (1) {
mtx_lock(&ch->state_mtx);
if (ch->state == ATA_IDLE) {
@@ -632,40 +626,41 @@ ata_identify(driver_t *driver, device_t parent, int type, const char *name)
break;
}
mtx_unlock(&ch->state_mtx);
- tsleep(ch, PRIBIO, "ataidnt1", 1);
+ tsleep(ch, PRIBIO, "ataidnt2", 1);
}
- if (type < 0) {
- if (ch->devices & ATA_ATA_SLAVE)
- slave_res = ata_getparam(parent, slave, ATA_ATA_IDENTIFY);
- if (ch->devices & ATA_ATA_MASTER)
- master_res = ata_getparam(parent, master, ATA_ATA_IDENTIFY);
+ if (ch->devices & ATA_ATA_SLAVE) {
+ slave_res = ata_getparam(dev, slave, ATA_ATA_IDENTIFY);
#ifdef ATA_STATIC_ID
- master_unit = (device_get_unit(parent) << 1);
slave_unit = (device_get_unit(parent) << 1) + 1;
#endif
}
- else {
- if (ch->devices & ATA_ATAPI_SLAVE)
- slave_res = ata_getparam(parent, slave, ATA_ATAPI_IDENTIFY);
- if (ch->devices & ATA_ATAPI_MASTER)
- master_res = ata_getparam(parent, master, ATA_ATAPI_IDENTIFY);
+ else if (ch->devices & ATA_ATAPI_SLAVE)
+ slave_res = ata_getparam(dev, slave, ATA_ATAPI_IDENTIFY);
+
+ if (ch->devices & ATA_ATA_MASTER) {
+ master_res = ata_getparam(dev, master, ATA_ATA_IDENTIFY);
+#ifdef ATA_STATIC_ID
+ master_unit = (device_get_unit(parent) << 1);
+#endif
}
+ else if (ch->devices & ATA_ATAPI_MASTER)
+ master_res = ata_getparam(dev, master, ATA_ATAPI_IDENTIFY);
- if (master_res ||
- !(type < 0 || (master->param.config & ATA_ATAPI_TYPE_MASK) == type) ||
- !ata_add_child(driver, parent, master, name, master_unit))
+ if (master_res || !ata_add_child(dev, master, master_unit))
free(master, M_ATA);
- if (slave_res ||
- !(type < 0 || (slave->param.config & ATA_ATAPI_TYPE_MASK) == type) ||
- !ata_add_child(driver, parent, slave, name, slave_unit))
+ if (slave_res || !ata_add_child(dev, slave, slave_unit))
free(slave, M_ATA);
mtx_lock(&ch->state_mtx);
ch->state = ATA_IDLE;
mtx_unlock(&ch->state_mtx);
- ATA_LOCKING(parent, ATA_LF_UNLOCK);
+ ATA_LOCKING(dev, ATA_LF_UNLOCK);
+
+ bus_generic_probe(dev);
+ bus_generic_attach(dev);
+ return 0;
}
void
diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h
index 381c44417f32..c080cb38125d 100644
--- a/sys/dev/ata/ata-all.h
+++ b/sys/dev/ata/ata-all.h
@@ -452,7 +452,6 @@ int ata_detach(device_t dev);
int ata_reinit(device_t dev);
int ata_suspend(device_t dev);
int ata_resume(device_t dev);
-void ata_identify(driver_t *driver, device_t parent, int type, const char *name);
void ata_default_registers(struct ata_channel *ch);
void ata_udelay(int interval);
char *ata_mode2str(int mode);
diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c
index 3d0f5edbfdc2..0679a37c3f98 100644
--- a/sys/dev/ata/ata-disk.c
+++ b/sys/dev/ata/ata-disk.c
@@ -66,16 +66,15 @@ static dumper_t ad_dump;
/* local vars */
static MALLOC_DEFINE(M_AD, "AD driver", "ATA disk driver");
-static void
-ad_identify(driver_t *driver, device_t parent)
-{
- ata_identify(driver, parent, -1, "ad");
-}
-
static int
ad_probe(device_t dev)
{
- return 0;
+ struct ata_device *atadev = device_get_softc(dev);
+
+ if (!(atadev->param.config & ATA_PROTO_ATAPI))
+ return 0;
+ else
+ return ENXIO;
}
static int
@@ -93,8 +92,6 @@ ad_attach(device_t dev)
if (!(adp = malloc(sizeof(struct ad_softc), M_AD, M_NOWAIT | M_ZERO))) {
device_printf(dev, "out of memory\n");
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return ENOMEM;
}
device_set_ivars(dev, adp);
@@ -161,7 +158,6 @@ static int
ad_detach(device_t dev)
{
struct ata_channel *ch = device_get_softc(device_get_parent(dev));
- struct ata_device *atadev = device_get_softc(dev);
struct ad_softc *adp = device_get_ivars(dev);
device_t *children;
int nchildren, i;
@@ -187,8 +183,6 @@ ad_detach(device_t dev)
/* dont leave anything behind */
device_set_ivars(dev, NULL);
free(adp, M_AD);
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return 0;
}
@@ -419,7 +413,6 @@ ad_version(u_int16_t version)
static device_method_t ad_methods[] = {
/* device interface */
- DEVMETHOD(device_identify, ad_identify),
DEVMETHOD(device_probe, ad_probe),
DEVMETHOD(device_attach, ad_attach),
DEVMETHOD(device_detach, ad_detach),
@@ -439,22 +432,6 @@ static driver_t ad_driver = {
devclass_t ad_devclass;
-static int
-ad_modevent(module_t mod, int what, void *arg)
-{
- device_t *devs;
- int ndevs, i;
-
- if (what == MOD_UNLOAD) {
- if (!devclass_get_devices(ad_devclass, &devs, &ndevs) && devs) {
- for (i = 0; i < ndevs; i++)
- device_delete_child(device_get_parent(devs[i]), devs[i]);
- free(devs, M_TEMP);
- }
- }
- return 0;
-}
-
-DRIVER_MODULE(ad, ata, ad_driver, ad_devclass, ad_modevent, NULL);
+DRIVER_MODULE(ad, ata, ad_driver, ad_devclass, NULL, NULL);
MODULE_VERSION(ad, 1);
MODULE_DEPEND(ad, ata, 1, 1, 1);
diff --git a/sys/dev/ata/atapi-cam.c b/sys/dev/ata/atapi-cam.c
index cbf6fbc896eb..0ba990062b36 100644
--- a/sys/dev/ata/atapi-cam.c
+++ b/sys/dev/ata/atapi-cam.c
@@ -90,7 +90,7 @@ struct atapi_hcb {
enum reinit_reason { BOOT_ATTACH, ATTACH, RESET };
/* Device methods */
-static int atapi_cam_identify(device_t *dev, device_t parent);
+static void atapi_cam_identify(device_t *dev, device_t parent);
static int atapi_cam_probe(device_t dev);
static int atapi_cam_attach(device_t dev);
static int atapi_cam_detach(device_t dev);
@@ -102,6 +102,9 @@ static void atapi_poll(struct cam_sim *);
static void atapi_async(void *, u_int32_t, struct cam_path *, void *);
static void atapi_cb(struct ata_request *);
+/* Module methods */
+static int atapi_cam_event_handler(module_t mod, int what, void *arg);
+
/* internal functions */
static void reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason);
static void setup_async_cb(struct atapi_xpt_softc *, uint32_t);
@@ -130,24 +133,52 @@ static driver_t atapi_cam_driver = {
};
static devclass_t atapi_cam_devclass;
-DRIVER_MODULE(atapicam, ata, atapi_cam_driver, atapi_cam_devclass, 0, 0);
+DRIVER_MODULE(atapicam, ata,
+ atapi_cam_driver,
+ atapi_cam_devclass,
+ atapi_cam_event_handler,
+ /*arg*/NULL);
MODULE_VERSION(atapicam, 1);
MODULE_DEPEND(atapicam, ata, 1, 1, 1);
MODULE_DEPEND(atapicam, cam, 1, 1, 1);
-static int
+static void
atapi_cam_identify(device_t *dev, device_t parent)
{
+ struct atapi_xpt_softc *scp =
+ malloc (sizeof (struct atapi_xpt_softc), M_ATACAM, M_NOWAIT|M_ZERO);
+ device_t child;
+
+ if (scp == NULL) {
+ printf ("atapi_cam_identify: out of memory");
+ return;
+ }
+
/* Assume one atapicam instance per parent channel instance. */
- device_add_child(parent, "atapicam", -1);
- return (0);
+ child = device_add_child(parent, "atapicam", -1);
+ if (child == NULL) {
+ printf ("atapi_cam_identify: out of memory, can't add child");
+ free (scp, M_ATACAM);
+ return;
+ }
+ scp->atapi_cam_dev.unit = -1;
+ scp->atapi_cam_dev.dev = child;
+ device_quiet(child);
+ device_set_softc(child, scp);
}
static int
atapi_cam_probe(device_t dev)
{
- device_set_desc(dev, "ATAPI CAM Attachment");
- return (0);
+ struct ata_device *atadev = device_get_softc (dev);
+
+ KASSERT(atadev != NULL, ("expect valid struct ata_device"));
+ if (atadev->unit < 0) {
+ device_set_desc(dev, "ATAPI CAM Attachment");
+ return (0);
+ } else {
+ return ENXIO;
+ }
}
static int
@@ -167,13 +198,6 @@ atapi_cam_attach(device_t dev)
mtx_init(&scp->state_lock, "ATAPICAM lock", NULL, MTX_DEF);
- /*
- * The ATA core expects all of its children to have an ata_device.
- * Assign an invalid unit number so that we can be properly ignored.
- */
- scp->atapi_cam_dev.unit = -1;
- scp->atapi_cam_dev.dev = dev;
-
scp->dev = dev;
scp->parent = device_get_parent(dev);
scp->ata_ch = device_get_softc(scp->parent);
@@ -846,3 +870,32 @@ free_softc(struct atapi_xpt_softc *scp)
mtx_destroy(&scp->state_lock);
}
}
+
+static int
+atapi_cam_event_handler(module_t mod, int what, void *arg) {
+ device_t *devlist;
+ int devcount;
+
+ switch (what) {
+ case MOD_UNLOAD:
+ if (devclass_get_devices(atapi_cam_devclass, &devlist, &devcount)
+ != 0)
+ return ENXIO;
+ if (devlist != NULL) {
+ while (devlist != NULL && devcount > 0) {
+ device_t child = devlist[--devcount];
+ struct atapi_xpt_softc *scp = device_get_softc(child);
+
+ device_delete_child(device_get_parent(child),child);
+ if (scp != NULL)
+ free(scp, M_ATACAM);
+ }
+ free(devlist, M_TEMP);
+ }
+ break;
+
+ default:
+ break;
+ }
+ return 0;
+}
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index 2875dfbc23c7..312bcd3acfa2 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -104,28 +104,25 @@ static struct g_class acd_class = {
};
//DECLARE_GEOM_CLASS(acd_class, acd);
-static void
-acd_identify(driver_t *driver, device_t parent)
-{
- ata_identify(driver, parent, ATA_ATAPI_TYPE_CDROM, "acd");
-}
-
static int
acd_probe(device_t dev)
{
- return 0;
+ struct ata_device *atadev = device_get_softc(dev);
+
+ if ((atadev->param.config & ATA_PROTO_ATAPI) &&
+ (atadev->param.config & ATA_ATAPI_TYPE_MASK) == ATA_ATAPI_TYPE_CDROM)
+ return 0;
+ else
+ return ENXIO;
}
static int
acd_attach(device_t dev)
{
- struct ata_device *atadev = device_get_softc(dev);
struct acd_softc *cdp;
if (!(cdp = malloc(sizeof(struct acd_softc), M_ACD, M_NOWAIT | M_ZERO))) {
device_printf(dev, "out of memory\n");
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return ENOMEM;
}
cdp->block_size = 2048;
@@ -196,7 +193,6 @@ static void
acd_geom_detach(void *arg, int flag)
{
struct ata_channel *ch = device_get_softc(device_get_parent(arg));
- struct ata_device *atadev = device_get_softc(arg);
struct acd_softc *cdp = device_get_ivars(arg);
/* signal geom so we dont get any further requests */
@@ -208,8 +204,6 @@ acd_geom_detach(void *arg, int flag)
/* dont leave anything behind */
device_set_ivars(arg, NULL);
free(cdp, M_ACD);
- device_set_softc(arg, NULL);
- free(atadev, M_ATA);
}
static int
@@ -1920,7 +1914,6 @@ acd_describe(device_t dev)
static device_method_t acd_methods[] = {
/* device interface */
- DEVMETHOD(device_identify, acd_identify),
DEVMETHOD(device_probe, acd_probe),
DEVMETHOD(device_attach, acd_attach),
DEVMETHOD(device_detach, acd_detach),
@@ -1943,20 +1936,7 @@ static devclass_t acd_devclass;
static int
acd_modevent(module_t mod, int what, void *arg)
{
- device_t *devs;
- int ndevs, i;
-
- if (what == MOD_LOAD) {
- g_modevent(0, what, &acd_class);
- }
- if (what == MOD_UNLOAD) {
- if (!devclass_get_devices(acd_devclass, &devs, &ndevs) && devs) {
- for (i = 0; i < ndevs; i++)
- device_delete_child(device_get_parent(devs[i]), devs[i]);
- free(devs, M_TEMP);
- }
- g_modevent(0, what, &acd_class);
- }
+ g_modevent(0, what, &acd_class);
return 0;
}
diff --git a/sys/dev/ata/atapi-fd.c b/sys/dev/ata/atapi-fd.c
index b2ffbc7b4efb..05923835070c 100644
--- a/sys/dev/ata/atapi-fd.c
+++ b/sys/dev/ata/atapi-fd.c
@@ -62,16 +62,16 @@ static int afd_test_ready(device_t);
/* internal vars */
static MALLOC_DEFINE(M_AFD, "AFD driver", "ATAPI floppy driver buffers");
-static void
-afd_identify(driver_t *driver, device_t parent)
-{
- ata_identify(driver, parent, ATA_ATAPI_TYPE_DIRECT, "afd");
-}
-
static int
afd_probe(device_t dev)
{
- return 0;
+ struct ata_device *atadev = device_get_softc(dev);
+
+ if ((atadev->param.config & ATA_PROTO_ATAPI) &&
+ (atadev->param.config & ATA_ATAPI_TYPE_MASK) == ATA_ATAPI_TYPE_DIRECT)
+ return 0;
+ else
+ return ENXIO;
}
static int
@@ -83,8 +83,6 @@ afd_attach(device_t dev)
if (!(fdp = malloc(sizeof(struct afd_softc), M_AFD, M_NOWAIT | M_ZERO))) {
device_printf(dev, "out of memory\n");
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return ENOMEM;
}
device_set_ivars(dev, fdp);
@@ -93,8 +91,6 @@ afd_attach(device_t dev)
if (afd_sense(dev)) {
device_set_ivars(dev, NULL);
free(fdp, M_AFD);
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return ENXIO;
}
atadev->flags |= ATA_D_MEDIA_CHANGED;
@@ -122,7 +118,6 @@ static int
afd_detach(device_t dev)
{
struct ata_channel *ch = device_get_softc(device_get_parent(dev));
- struct ata_device *atadev = device_get_softc(dev);
struct afd_softc *fdp = device_get_ivars(dev);
/* detroy disk from the system so we dont get any further requests */
@@ -134,8 +129,6 @@ afd_detach(device_t dev)
/* dont leave anything behind */
device_set_ivars(dev, NULL);
free(fdp, M_AFD);
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return 0;
}
@@ -400,7 +393,6 @@ afd_describe(device_t dev)
static device_method_t afd_methods[] = {
/* device interface */
- DEVMETHOD(device_identify, afd_identify),
DEVMETHOD(device_probe, afd_probe),
DEVMETHOD(device_attach, afd_attach),
DEVMETHOD(device_detach, afd_detach),
@@ -420,23 +412,7 @@ static driver_t afd_driver = {
static devclass_t afd_devclass;
-static int
-afd_modevent(module_t mod, int what, void *arg)
-{
- device_t *devs;
- int ndevs, i;
-
- if (what == MOD_UNLOAD) {
- if (!devclass_get_devices(afd_devclass, &devs, &ndevs) && devs) {
- for (i = 0; i < ndevs; i++)
- device_delete_child(device_get_parent(devs[i]), devs[i]);
- free(devs, M_TEMP);
- }
- }
- return 0;
-}
-
-DRIVER_MODULE(afd, ata, afd_driver, afd_devclass, afd_modevent, NULL);
+DRIVER_MODULE(afd, ata, afd_driver, afd_devclass, NULL, NULL);
MODULE_VERSION(afd, 1);
MODULE_DEPEND(afd, ata, 1, 1, 1);
diff --git a/sys/dev/ata/atapi-tape.c b/sys/dev/ata/atapi-tape.c
index 72761c76fa25..3297a51068d2 100644
--- a/sys/dev/ata/atapi-tape.c
+++ b/sys/dev/ata/atapi-tape.c
@@ -87,16 +87,16 @@ static int ast_wait_dsc(device_t, int);
static u_int64_t ast_total = 0;
static MALLOC_DEFINE(M_AST, "AST driver", "ATAPI tape driver buffers");
-static void
-ast_identify(driver_t *driver, device_t parent)
-{
- ata_identify(driver, parent, ATA_ATAPI_TYPE_TAPE, "ast");
-}
-
static int
ast_probe(device_t dev)
{
- return 0;
+ struct ata_device *atadev = device_get_softc(dev);
+
+ if ((atadev->param.config & ATA_PROTO_ATAPI) &&
+ (atadev->param.config & ATA_ATAPI_TYPE_MASK) == ATA_ATAPI_TYPE_TAPE)
+ return 0;
+ else
+ return ENXIO;
}
static int
@@ -110,8 +110,6 @@ ast_attach(device_t dev)
if (!(stp = malloc(sizeof(struct ast_softc), M_AST, M_NOWAIT | M_ZERO))) {
device_printf(dev, "out of memory\n");
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return ENOMEM;
}
device_set_ivars(dev, stp);
@@ -120,8 +118,6 @@ ast_attach(device_t dev)
if (ast_sense(dev)) {
device_set_ivars(dev, NULL);
free(stp, M_AST);
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return ENXIO;
}
if (!strcmp(atadev->param.model, "OnStream DI-30")) {
@@ -172,7 +168,6 @@ static int
ast_detach(device_t dev)
{
struct ata_channel *ch = device_get_softc(device_get_parent(dev));
- struct ata_device *atadev = device_get_softc(dev);
struct ast_softc *stp = device_get_ivars(dev);
/* detroy devices from the system so we dont get any further requests */
@@ -186,8 +181,6 @@ ast_detach(device_t dev)
devstat_remove_entry(stp->stats);
device_set_ivars(dev, NULL);
free(stp, M_AST);
- device_set_softc(dev, NULL);
- free(atadev, M_ATA);
return 0;
}
@@ -752,7 +745,6 @@ ast_describe(device_t dev)
static device_method_t ast_methods[] = {
/* device interface */
- DEVMETHOD(device_identify, ast_identify),
DEVMETHOD(device_probe, ast_probe),
DEVMETHOD(device_attach, ast_attach),
DEVMETHOD(device_detach, ast_detach),
@@ -772,22 +764,6 @@ static driver_t ast_driver = {
static devclass_t ast_devclass;
-static int
-ast_modevent(module_t mod, int what, void *arg)
-{
- device_t *devs;
- int ndevs, i;
-
- if (what == MOD_UNLOAD) {
- if (!devclass_get_devices(ast_devclass, &devs, &ndevs) && devs) {
- for (i = 0; i < ndevs; i++)
- device_delete_child(device_get_parent(devs[i]), devs[i]);
- free(devs, M_TEMP);
- }
- }
- return 0;
-}
-
-DRIVER_MODULE(ast, ata, ast_driver, ast_devclass, ast_modevent, NULL);
+DRIVER_MODULE(ast, ata, ast_driver, ast_devclass, NULL, NULL);
MODULE_VERSION(ast, 1);
MODULE_DEPEND(ast, ata, 1, 1, 1);
diff --git a/sys/sys/ata.h b/sys/sys/ata.h
index fa214c9be7ae..57a6f4fc2e36 100644
--- a/sys/sys/ata.h
+++ b/sys/sys/ata.h
@@ -37,7 +37,7 @@
struct ata_params {
/*000*/ u_int16_t config; /* configuration info */
#define ATA_PROTO_MASK 0x8003
-#define ATA_PROTO_ATA 0x0000
+#define ATA_PROTO_ATAPI 0x8000
#define ATA_PROTO_ATAPI_12 0x8000
#define ATA_PROTO_ATAPI_16 0x8001
#define ATA_ATAPI_TYPE_MASK 0x1f00