1450N/A/*
1450N/A * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
1450N/A *
1450N/A * Permission is hereby granted, free of charge, to any person obtaining a
1450N/A * copy of this software and associated documentation files (the "Software"),
1450N/A * to deal in the Software without restriction, including without limitation
1450N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1450N/A * and/or sell copies of the Software, and to permit persons to whom the
1450N/A * Software is furnished to do so, subject to the following conditions:
1450N/A *
1450N/A * The above copyright notice and this permission notice (including the next
1450N/A * paragraph) shall be included in all copies or substantial portions of the
1450N/A * Software.
1450N/A *
1450N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1450N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1450N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1450N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1450N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1450N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1450N/A * DEALINGS IN THE SOFTWARE.
1450N/A */
1450N/A
1450N/A/*
1450N/A * Copyright (c) 2012 Intel Corporation. All rights reserved.
1450N/A */
1450N/A
1450N/A#include <sys/sunddi.h>
1450N/A#include <sys/types.h>
1450N/A
1450N/A#include "drm_sun_workqueue.h"
1450N/A
1450N/Aint
1450N/A__queue_work(struct workqueue_struct *wq, struct work_struct *work)
1450N/A{
1450N/A int ret;
1450N/A
1450N/A ASSERT(wq->taskq != NULL);
1450N/A ASSERT(work->func != NULL);
1450N/A /*
1450N/A * ddi_taskq_dispatch can fail if there aren't enough memory
1450N/A * resources. In theory, since we are requesting a SLEEP
1450N/A * allocation, it would be very rare to fail
1450N/A */
1450N/A if ((ret = ddi_taskq_dispatch(wq->taskq, work->func, work, DDI_SLEEP))
1450N/A == DDI_FAILURE)
1450N/A cmn_err(CE_WARN, "queue_work: ddi_taskq_dispatch failure");
1450N/A return (ret);
1450N/A}
1450N/A
1450N/Avoid
1450N/Ainit_work(struct work_struct *work, void (*func)(void *))
1450N/A{
1450N/A work->func = func;
1450N/A}
1450N/A
1450N/Astruct workqueue_struct *
1450N/Acreate_workqueue(dev_info_t *dip, char *name)
1450N/A{
1450N/A struct workqueue_struct *wq;
1450N/A
1450N/A wq = kmem_zalloc(sizeof (struct workqueue_struct), KM_SLEEP);
1450N/A wq->taskq = ddi_taskq_create(dip, name, 1, TASKQ_DEFAULTPRI, 0);
1450N/A if (wq->taskq == NULL)
1450N/A goto fail;
1450N/A wq->name = name;
1450N/A
1450N/A return wq;
1450N/A
1450N/Afail :
1450N/A kmem_free(wq, sizeof (struct workqueue_struct));
1450N/A return (NULL);
1450N/A}
1450N/A
1450N/Avoid
1450N/Adestroy_workqueue(struct workqueue_struct *wq)
1450N/A{
1450N/A if (wq) {
1450N/A ddi_taskq_destroy(wq->taskq);
1450N/A kmem_free(wq, sizeof (struct workqueue_struct));
1450N/A }
1450N/A}
1450N/A
1450N/Avoid
1450N/Acancel_delayed_work(struct workqueue_struct *wq)
1450N/A{
1450N/A ddi_taskq_wait(wq->taskq);
1450N/A}
1450N/Avoid
1450N/Aflush_workqueue(struct workqueue_struct *wq)
1450N/A{
1450N/A ddi_taskq_wait(wq->taskq);
1450N/A}