1/*-
2 * Implementation of SCSI Direct Access Peripheral driver for CAM.
3 *
4 * Copyright (c) 1997 Justin T. Gibbs.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
--- 13 unchanged lines hidden (view full) ---
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/cam/scsi/scsi_da.c 237518 2012-06-24 04:29:03Z ken $");
31
32#include <sys/param.h>
33
34#ifdef _KERNEL
35#include <sys/systm.h>
36#include <sys/kernel.h>
37#include <sys/bio.h>
38#include <sys/sysctl.h>
--- 1189 unchanged lines hidden (view full) ---
1228
1229 /* Register our shutdown event handler */
1230 if ((EVENTHANDLER_REGISTER(shutdown_post_sync, dashutdown,
1231 NULL, SHUTDOWN_PRI_DEFAULT)) == NULL)
1232 printf("dainit: shutdown event registration failed!\n");
1233 }
1234}
1235
1236/*
1237 * Callback from GEOM, called when it has finished cleaning up its
1238 * resources.
1239 */
1240static void
1241dadiskgonecb(struct disk *dp)
1242{
1243 struct cam_periph *periph;
1244
1245 periph = (struct cam_periph *)dp->d_drv1;
1246
1247 cam_periph_release(periph);
1248}
1249
1250static void
1251daoninvalidate(struct cam_periph *periph)
1252{
1253 struct da_softc *softc;
1254
1255 softc = (struct da_softc *)periph->softc;
1256
1257 /*
1258 * De-register any async callbacks.
--- 5 unchanged lines hidden (view full) ---
1264 /*
1265 * Return all queued I/O with ENXIO.
1266 * XXX Handle any transactions queued to the card
1267 * with XPT_ABORT_CCB.
1268 */
1269 bioq_flush(&softc->bio_queue, NULL, ENXIO);
1270 bioq_flush(&softc->delete_queue, NULL, ENXIO);
1271
1272 /*
1273 * Tell GEOM that we've gone away, we'll get a callback when it is
1274 * done cleaning up its resources.
1275 */
1276 disk_gone(softc->disk);
1277
1278 xpt_print(periph->path, "lost device - %d outstanding, %d refs\n",
1279 softc->outstanding_cmds, periph->refcount);
1280}
1281
1282static void
1283dacleanup(struct cam_periph *periph)
1284{
1285 struct da_softc *softc;
--- 361 unchanged lines hidden (view full) ---
1647 SID_TYPE(&cgd->inq_data) |
1648 XPORT_DEVSTAT_TYPE(cpi.transport),
1649 DEVSTAT_PRIORITY_DISK);
1650 softc->disk->d_open = daopen;
1651 softc->disk->d_close = daclose;
1652 softc->disk->d_strategy = dastrategy;
1653 softc->disk->d_dump = dadump;
1654 softc->disk->d_getattr = dagetattr;
1655 softc->disk->d_gone = dadiskgonecb;
1656 softc->disk->d_name = "da";
1657 softc->disk->d_drv1 = periph;
1658 if (cpi.maxio == 0)
1659 softc->disk->d_maxsize = DFLTPHYS; /* traditional default */
1660 else if (cpi.maxio > MAXPHYS)
1661 softc->disk->d_maxsize = MAXPHYS; /* for safety */
1662 else
1663 softc->disk->d_maxsize = cpi.maxio;
--- 6 unchanged lines hidden (view full) ---
1670 strlcat(softc->disk->d_descr, " ", sizeof(softc->disk->d_descr));
1671 cam_strvis(&softc->disk->d_descr[strlen(softc->disk->d_descr)],
1672 cgd->inq_data.product, sizeof(cgd->inq_data.product),
1673 sizeof(softc->disk->d_descr) - strlen(softc->disk->d_descr));
1674 softc->disk->d_hba_vendor = cpi.hba_vendor;
1675 softc->disk->d_hba_device = cpi.hba_device;
1676 softc->disk->d_hba_subvendor = cpi.hba_subvendor;
1677 softc->disk->d_hba_subdevice = cpi.hba_subdevice;
1678
1679 /*
1680 * Acquire a reference to the periph before we register with GEOM.
1681 * We'll release this reference once GEOM calls us back (via
1682 * dadiskgonecb()) telling us that our provider has been freed.
1683 */
1684 if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
1685 xpt_print(periph->path, "%s: lost periph during "
1686 "registration!\n", __func__);
1687 mtx_lock(periph->sim->mtx);
1688 return (CAM_REQ_CMP_ERR);
1689 }
1690
1691 disk_create(softc->disk, DISK_VERSION);
1692 mtx_lock(periph->sim->mtx);
1693
1694 /*
1695 * Add async callbacks for events of interest.
1696 * I don't bother checking if this fails as,
1697 * in most cases, the system will function just
1698 * fine without them and the only alternative
--- 1057 unchanged lines hidden ---
2 * Implementation of SCSI Direct Access Peripheral driver for CAM.
3 *
4 * Copyright (c) 1997 Justin T. Gibbs.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
--- 13 unchanged lines hidden (view full) ---
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/cam/scsi/scsi_da.c 237518 2012-06-24 04:29:03Z ken $");
31
32#include <sys/param.h>
33
34#ifdef _KERNEL
35#include <sys/systm.h>
36#include <sys/kernel.h>
37#include <sys/bio.h>
38#include <sys/sysctl.h>
--- 1189 unchanged lines hidden (view full) ---
1228
1229 /* Register our shutdown event handler */
1230 if ((EVENTHANDLER_REGISTER(shutdown_post_sync, dashutdown,
1231 NULL, SHUTDOWN_PRI_DEFAULT)) == NULL)
1232 printf("dainit: shutdown event registration failed!\n");
1233 }
1234}
1235
1236/*
1237 * Callback from GEOM, called when it has finished cleaning up its
1238 * resources.
1239 */
1240static void
1241dadiskgonecb(struct disk *dp)
1242{
1243 struct cam_periph *periph;
1244
1245 periph = (struct cam_periph *)dp->d_drv1;
1246
1247 cam_periph_release(periph);
1248}
1249
1250static void
1251daoninvalidate(struct cam_periph *periph)
1252{
1253 struct da_softc *softc;
1254
1255 softc = (struct da_softc *)periph->softc;
1256
1257 /*
1258 * De-register any async callbacks.
--- 5 unchanged lines hidden (view full) ---
1264 /*
1265 * Return all queued I/O with ENXIO.
1266 * XXX Handle any transactions queued to the card
1267 * with XPT_ABORT_CCB.
1268 */
1269 bioq_flush(&softc->bio_queue, NULL, ENXIO);
1270 bioq_flush(&softc->delete_queue, NULL, ENXIO);
1271
1272 /*
1273 * Tell GEOM that we've gone away, we'll get a callback when it is
1274 * done cleaning up its resources.
1275 */
1276 disk_gone(softc->disk);
1277
1278 xpt_print(periph->path, "lost device - %d outstanding, %d refs\n",
1279 softc->outstanding_cmds, periph->refcount);
1280}
1281
1282static void
1283dacleanup(struct cam_periph *periph)
1284{
1285 struct da_softc *softc;
--- 361 unchanged lines hidden (view full) ---
1647 SID_TYPE(&cgd->inq_data) |
1648 XPORT_DEVSTAT_TYPE(cpi.transport),
1649 DEVSTAT_PRIORITY_DISK);
1650 softc->disk->d_open = daopen;
1651 softc->disk->d_close = daclose;
1652 softc->disk->d_strategy = dastrategy;
1653 softc->disk->d_dump = dadump;
1654 softc->disk->d_getattr = dagetattr;
1655 softc->disk->d_gone = dadiskgonecb;
1656 softc->disk->d_name = "da";
1657 softc->disk->d_drv1 = periph;
1658 if (cpi.maxio == 0)
1659 softc->disk->d_maxsize = DFLTPHYS; /* traditional default */
1660 else if (cpi.maxio > MAXPHYS)
1661 softc->disk->d_maxsize = MAXPHYS; /* for safety */
1662 else
1663 softc->disk->d_maxsize = cpi.maxio;
--- 6 unchanged lines hidden (view full) ---
1670 strlcat(softc->disk->d_descr, " ", sizeof(softc->disk->d_descr));
1671 cam_strvis(&softc->disk->d_descr[strlen(softc->disk->d_descr)],
1672 cgd->inq_data.product, sizeof(cgd->inq_data.product),
1673 sizeof(softc->disk->d_descr) - strlen(softc->disk->d_descr));
1674 softc->disk->d_hba_vendor = cpi.hba_vendor;
1675 softc->disk->d_hba_device = cpi.hba_device;
1676 softc->disk->d_hba_subvendor = cpi.hba_subvendor;
1677 softc->disk->d_hba_subdevice = cpi.hba_subdevice;
1678
1679 /*
1680 * Acquire a reference to the periph before we register with GEOM.
1681 * We'll release this reference once GEOM calls us back (via
1682 * dadiskgonecb()) telling us that our provider has been freed.
1683 */
1684 if (cam_periph_acquire(periph) != CAM_REQ_CMP) {
1685 xpt_print(periph->path, "%s: lost periph during "
1686 "registration!\n", __func__);
1687 mtx_lock(periph->sim->mtx);
1688 return (CAM_REQ_CMP_ERR);
1689 }
1690
1691 disk_create(softc->disk, DISK_VERSION);
1692 mtx_lock(periph->sim->mtx);
1693
1694 /*
1695 * Add async callbacks for events of interest.
1696 * I don't bother checking if this fails as,
1697 * in most cases, the system will function just
1698 * fine without them and the only alternative
--- 1057 unchanged lines hidden ---