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 --- |