8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * CDDL HEADER START
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * The contents of this file are subject to the terms of the
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Common Development and Distribution License (the "License").
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * You may not use this file except in compliance with the License.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * or http://www.opensolaris.org/os/licensing.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * See the License for the specific language governing permissions
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * and limitations under the License.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * When distributing Covered Code, include this CDDL HEADER in each
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * If applicable, add the following below this CDDL HEADER, with the
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * fields enclosed by brackets "[]" replaced with your own identifying
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * information: Portions Copyright [yyyy] [name of copyright owner]
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * CDDL HEADER END
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * Use is subject to license terms.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/errno.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/types.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/conf.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/kmem.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/ddi.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/stat.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/sunddi.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/file.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/open.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/modctl.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/ddi_impldefs.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/sysmacros.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus#include <sys/ioat.h>
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_open(dev_t *devp, int flag, int otyp, cred_t *cred);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_close(dev_t devp, int flag, int otyp, cred_t *cred);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_attach(dev_info_t *devi, ddi_attach_cmd_t cmd);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_detach(dev_info_t *devi, ddi_detach_cmd_t cmd);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus void **result);
193974072f41a843678abf5f61979c748687e66bSherry Moorestatic int ioat_quiesce(dev_info_t *dip);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic struct cb_ops ioat_cb_ops = {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_open, /* cb_open */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_close, /* cb_close */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_strategy */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_print */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_dump */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_read */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_write */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_ioctl, /* cb_ioctl */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_devmap */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_mmap */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* cb_segmap */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nochpoll, /* cb_chpoll */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_prop_op, /* cb_prop_op */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus NULL, /* cb_stream */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus D_NEW | D_MP | D_64BIT | D_DEVMAP, /* cb_flag */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus CB_REV
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic struct dev_ops ioat_dev_ops = {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus DEVO_REV, /* devo_rev */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus 0, /* devo_refcnt */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_getinfo, /* devo_getinfo */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nulldev, /* devo_identify */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nulldev, /* devo_probe */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_attach, /* devo_attach */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_detach, /* devo_detach */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus nodev, /* devo_reset */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &ioat_cb_ops, /* devo_cb_ops */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus NULL, /* devo_bus_ops */
193974072f41a843678abf5f61979c748687e66bSherry Moore NULL, /* devo_power */
193974072f41a843678abf5f61979c748687e66bSherry Moore ioat_quiesce, /* devo_quiesce */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic struct modldrv ioat_modldrv = {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &mod_driverops, /* Type of module. This one is a driver */
613b28719c10e84c1202c1045df44d77767de21dRichard Bean "ioat driver", /* Name of the module. */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &ioat_dev_ops, /* driver ops */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic struct modlinkage ioat_modlinkage = {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus MODREV_1,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (void *) &ioat_modldrv,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus NULL
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid *ioat_statep;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_chip_init(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void ioat_chip_fini(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int ioat_drv_init(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void ioat_drv_fini(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic uint_t ioat_isr(caddr_t parm);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void ioat_intr_enable(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void ioat_intr_disable(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid ioat_detach_finish(ioat_state_t *state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusddi_device_acc_attr_t ioat_acc_attr = {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus DDI_DEVICE_ATTR_V0, /* devacc_attr_version */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus DDI_NEVERSWAP_ACC, /* devacc_attr_endian_flags */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus DDI_STORECACHING_OK_ACC, /* devacc_attr_dataorder */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus DDI_DEFAULT_ACC /* devacc_attr_access */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/* dcopy callback interface */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusdcopy_device_cb_t ioat_cb = {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus DCOPY_DEVICECB_V0,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus 0, /* reserved */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_channel_alloc,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_channel_free,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_cmd_alloc,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_cmd_free,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_cmd_post,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_cmd_poll,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_unregister_complete
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus};
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * _init()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus_init(void)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_soft_state_init(&ioat_statep, sizeof (ioat_state_t), 1);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != 0) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (e);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = mod_install(&ioat_modlinkage);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != 0) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_soft_state_fini(&ioat_statep);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (e);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * _info()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus_info(struct modinfo *modinfop)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (mod_info(&ioat_modlinkage, modinfop));
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * _fini()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusint
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus_fini(void)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = mod_remove(&ioat_modlinkage);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != 0) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (e);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_soft_state_fini(&ioat_statep);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_attach()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_state_t *state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int instance;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus switch (cmd) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus case DDI_ATTACH:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus break;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus case DDI_RESUME:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus instance = ddi_get_instance(dip);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = ddi_get_soft_state(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (state == NULL) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ioat_channel_resume(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_intr_enable(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_SUCCESS);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus default:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus instance = ddi_get_instance(dip);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_soft_state_zalloc(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = ddi_get_soft_state(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (state == NULL) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto attachfail_get_soft_state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_dip = dip;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_instance = instance;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* setup the registers, save away some device info */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ioat_chip_init(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto attachfail_chip_init;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* initialize driver state, must be after chip init */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ioat_drv_init(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto attachfail_drv_init;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* create the minor node (for the ioctl) */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_create_minor_node(dip, "ioat", S_IFCHR, instance, DDI_PSEUDO,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus 0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto attachfail_minor_node;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* Enable device interrupts */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_intr_enable(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* Report that driver was loaded */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_report_dev(dip);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* register with dcopy */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = dcopy_device_register(state, &state->is_deviceinfo,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_device_handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DCOPY_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto attachfail_register;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_SUCCESS);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusattachfail_register:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_intr_disable(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_remove_minor_node(dip, NULL);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusattachfail_minor_node:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_drv_fini(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusattachfail_drv_init:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_chip_fini(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusattachfail_chip_init:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusattachfail_get_soft_state:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (void) ddi_soft_state_free(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_detach()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_state_t *state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int instance;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus instance = ddi_get_instance(dip);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = ddi_get_soft_state(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (state == NULL) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus switch (cmd) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus case DDI_DETACH:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus break;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus case DDI_SUSPEND:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_channel_suspend(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_SUCCESS);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus default:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * try to unregister from dcopy. Since this driver doesn't follow the
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * traditional parent/child model, we may still be in use so we can't
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * detach yet.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = dcopy_device_unregister(&state->is_device_handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DCOPY_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e == DCOPY_PENDING) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus cmn_err(CE_NOTE, "device busy, performing asynchronous"
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus " detach\n");
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_detach_finish(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_SUCCESS);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_getinfo()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*ARGSUSED*/
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_state_t *state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int instance;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus dev_t dev;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus dev = (dev_t)arg;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus instance = getminor(dev);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus switch (cmd) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus case DDI_INFO_DEVT2DEVINFO:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = ddi_get_soft_state(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (state == NULL) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *result = (void *)state->is_dip;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = DDI_SUCCESS;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus break;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus case DDI_INFO_DEVT2INSTANCE:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus *result = (void *)(uintptr_t)instance;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = DDI_SUCCESS;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus break;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus default:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = DDI_FAILURE;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus break;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (e);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_open()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*ARGSUSED*/
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_open(dev_t *devp, int flag, int otyp, cred_t *cred)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_state_t *state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int instance;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus instance = getminor(*devp);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = ddi_get_soft_state(ioat_statep, instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (state == NULL) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (ENXIO);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_close()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*ARGSUSED*/
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_close(dev_t devp, int flag, int otyp, cred_t *cred)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_chip_init()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_chip_init(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_device_acc_attr_t attr;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_regs_map_setup(state->is_dip, 1, (caddr_t *)&state->is_genregs,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus 0, 0, &attr, &state->is_reg_handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto chipinitfail_regsmap;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* save away ioat chip info */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_num_channels = (uint_t)ddi_get8(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_genregs[IOAT_CHANCNT]);
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj /*
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj * If we get a bogus value, something is wrong with the H/W, fail to
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj * attach.
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj */
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj if (state->is_num_channels == 0) {
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj goto chipinitfail_numchan;
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj }
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrj
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_maxxfer = (uint_t)ddi_get8(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_genregs[IOAT_XFERCAP]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_chanoff = (uintptr_t)ddi_get16(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint16_t *)&state->is_genregs[IOAT_PERPORT_OFF]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_cbver = (uint_t)ddi_get8(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_genregs[IOAT_CBVER]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_intrdelay = (uint_t)ddi_get16(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint16_t *)&state->is_genregs[IOAT_INTRDELAY]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_status = (uint_t)ddi_get16(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint16_t *)&state->is_genregs[IOAT_CSSTATUS]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_capabilities = (uint_t)ddi_get32(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint32_t *)&state->is_genregs[IOAT_DMACAPABILITY]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (state->is_cbver & 0x10) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_ver = IOAT_CBv1;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus } else if (state->is_cbver & 0x20) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_ver = IOAT_CBv2;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus } else {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto chipinitfail_version;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_SUCCESS);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutuschipinitfail_version:
e6beb20cc8b2b323c3efa99bffc570d547089a7cmrjchipinitfail_numchan:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_regs_map_free(&state->is_reg_handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutuschipinitfail_regsmap:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_chip_fini()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_chip_fini(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_regs_map_free(&state->is_reg_handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_drv_init()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic int
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_drv_init(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_acc_handle_t handle;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int e;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus mutex_init(&state->is_mutex, NULL, MUTEX_DRIVER, NULL);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_dip = state->is_dip;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_num_dma = state->is_num_channels;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_maxxfer = state->is_maxxfer;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_capabilities = state->is_capabilities;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_cb = &ioat_cb;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = pci_config_setup(state->is_dip, &handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto drvinitfail_config_setup;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* read in Vendor ID */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_id = (uint64_t)pci_config_get16(handle, 0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_id = state->is_deviceinfo.di_id << 16;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* read in Device ID */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_id |= (uint64_t)pci_config_get16(handle, 2);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_id = state->is_deviceinfo.di_id << 32;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* Add in chipset version */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state->is_deviceinfo.di_id |= (uint64_t)state->is_cbver;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus pci_config_teardown(&handle);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_intr_hilevel(state->is_dip, 0);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != 0) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus cmn_err(CE_WARN, "hilevel interrupt not supported\n");
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto drvinitfail_hilevel;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* we don't support MSIs for v2 yet */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_add_intr(state->is_dip, 0, NULL, NULL, ioat_isr,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (caddr_t)state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto drvinitfail_add_intr;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ddi_get_iblock_cookie(state->is_dip, 0, &state->is_iblock_cookie);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto drvinitfail_iblock_cookie;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus e = ioat_channel_init(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (e != DDI_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus goto drvinitfail_channel_init;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_SUCCESS);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusdrvinitfail_channel_init:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusdrvinitfail_iblock_cookie:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_remove_intr(state->is_dip, 0, state->is_iblock_cookie);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusdrvinitfail_add_intr:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusdrvinitfail_hilevel:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusdrvinitfail_config_setup:
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus mutex_destroy(&state->is_mutex);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_FAILURE);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_drv_fini()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_drv_fini(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_channel_fini(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_remove_intr(state->is_dip, 0, state->is_iblock_cookie);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus mutex_destroy(&state->is_mutex);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_unregister_complete()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_unregister_complete(void *device_private, int status)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_state_t *state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = device_private;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (status != DCOPY_SUCCESS) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus cmn_err(CE_WARN, "asynchronous detach aborted\n");
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus cmn_err(CE_CONT, "detach completing\n");
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_detach_finish(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_detach_finish()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusvoid
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_detach_finish(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_intr_disable(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_remove_minor_node(state->is_dip, NULL);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_drv_fini(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_chip_fini(state);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (void) ddi_soft_state_free(ioat_statep, state->is_instance);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_intr_enable()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_intr_enable(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint32_t intr_status;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* Clear any pending interrupts */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus intr_status = ddi_get32(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint32_t *)&state->is_genregs[IOAT_ATTNSTATUS]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (intr_status != 0) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_put32(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint32_t *)&state->is_genregs[IOAT_ATTNSTATUS],
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus intr_status);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* Enable interrupts on the device */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_put8(state->is_reg_handle, &state->is_genregs[IOAT_INTRCTL],
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus IOAT_INTRCTL_MASTER_EN);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_intr_disable()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic void
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_intr_disable(ioat_state_t *state)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * disable interrupts on the device. A read of the interrupt control
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * register clears the enable bit.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (void) ddi_get8(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_genregs[IOAT_INTRCTL]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus/*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * ioat_isr()
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusstatic uint_t
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutusioat_isr(caddr_t parm)
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus{
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint32_t intr_status;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_state_t *state;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint8_t intrctrl;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint32_t chan;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus uint_t r;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus int i;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus state = (ioat_state_t *)parm;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus intrctrl = ddi_get8(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_genregs[IOAT_INTRCTL]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* master interrupt enable should always be set */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ASSERT(intrctrl & IOAT_INTRCTL_MASTER_EN);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* If the interrupt status bit isn't set, it's not ours */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (!(intrctrl & IOAT_INTRCTL_INTR_STAT)) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* re-set master interrupt enable (since it clears on read) */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_put8(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus &state->is_genregs[IOAT_INTRCTL], intrctrl);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (DDI_INTR_UNCLAIMED);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* see which channels generated the interrupt */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus intr_status = ddi_get32(state->is_reg_handle,
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus (uint32_t *)&state->is_genregs[IOAT_ATTNSTATUS]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* call the intr handler for the channels */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus r = DDI_INTR_UNCLAIMED;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus chan = 1;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus for (i = 0; i < state->is_num_channels; i++) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus if (intr_status & chan) {
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ioat_channel_intr(&state->is_channel[i]);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus r = DDI_INTR_CLAIMED;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus chan = chan << 1;
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus }
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /*
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * if interrupt status bit was set, there should have been an
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus * attention status bit set too.
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ASSERT(r == DDI_INTR_CLAIMED);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus /* re-set master interrupt enable (since it clears on read) */
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus ddi_put8(state->is_reg_handle, &state->is_genregs[IOAT_INTRCTL],
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus intrctrl);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus return (r);
8e50dcc9f00b393d43e6aa42b820bcbf1d3e1ce4brutus}
193974072f41a843678abf5f61979c748687e66bSherry Moore
193974072f41a843678abf5f61979c748687e66bSherry Moorestatic int
193974072f41a843678abf5f61979c748687e66bSherry Mooreioat_quiesce(dev_info_t *dip)
193974072f41a843678abf5f61979c748687e66bSherry Moore{
193974072f41a843678abf5f61979c748687e66bSherry Moore ioat_state_t *state;
193974072f41a843678abf5f61979c748687e66bSherry Moore int instance;
193974072f41a843678abf5f61979c748687e66bSherry Moore
193974072f41a843678abf5f61979c748687e66bSherry Moore instance = ddi_get_instance(dip);
193974072f41a843678abf5f61979c748687e66bSherry Moore state = ddi_get_soft_state(ioat_statep, instance);
193974072f41a843678abf5f61979c748687e66bSherry Moore if (state == NULL) {
193974072f41a843678abf5f61979c748687e66bSherry Moore return (DDI_FAILURE);
193974072f41a843678abf5f61979c748687e66bSherry Moore }
193974072f41a843678abf5f61979c748687e66bSherry Moore
193974072f41a843678abf5f61979c748687e66bSherry Moore ioat_intr_disable(state);
193974072f41a843678abf5f61979c748687e66bSherry Moore ioat_channel_quiesce(state);
193974072f41a843678abf5f61979c748687e66bSherry Moore
193974072f41a843678abf5f61979c748687e66bSherry Moore return (DDI_SUCCESS);
193974072f41a843678abf5f61979c748687e66bSherry Moore}