1331722Seadler/*
2250340Sdavidcs * Copyright (c) 2011-2013 Qlogic Corporation
3227064Sbz * All rights reserved.
4227064Sbz *
5227064Sbz *  Redistribution and use in source and binary forms, with or without
6227064Sbz *  modification, are permitted provided that the following conditions
7227064Sbz *  are met:
8227064Sbz *
9227064Sbz *  1. Redistributions of source code must retain the above copyright
10227064Sbz *     notice, this list of conditions and the following disclaimer.
11227064Sbz *  2. Redistributions in binary form must reproduce the above copyright
12227064Sbz *     notice, this list of conditions and the following disclaimer in the
13227064Sbz *     documentation and/or other materials provided with the distribution.
14227064Sbz *
15227064Sbz *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16227064Sbz *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17227064Sbz *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18227064Sbz *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19227064Sbz *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20227064Sbz *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21227064Sbz *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22227064Sbz *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23227064Sbz *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24227064Sbz *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25227064Sbz *  POSSIBILITY OF SUCH DAMAGE.
26227064Sbz */
27227064Sbz/*
28227064Sbz * File: qla_ioctl.c
29227064Sbz * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
30227064Sbz */
31227064Sbz
32227064Sbz#include <sys/cdefs.h>
33227064Sbz__FBSDID("$FreeBSD$");
34227064Sbz
35227064Sbz#include "qla_os.h"
36227064Sbz#include "qla_reg.h"
37227064Sbz#include "qla_hw.h"
38227064Sbz#include "qla_def.h"
39227064Sbz#include "qla_reg.h"
40227064Sbz#include "qla_inline.h"
41227064Sbz#include "qla_glbl.h"
42227064Sbz#include "qla_ioctl.h"
43227064Sbz
44227064Sbzstatic struct cdevsw qla_cdevsw = {
45227064Sbz	.d_version = D_VERSION,
46227064Sbz	.d_ioctl = qla_eioctl,
47227064Sbz	.d_name = "qlcnic",
48227064Sbz};
49227064Sbz
50227064Sbzint
51227064Sbzqla_make_cdev(qla_host_t *ha)
52227064Sbz{
53227064Sbz        ha->ioctl_dev = make_dev(&qla_cdevsw,
54227064Sbz				ha->ifp->if_dunit,
55227064Sbz                                UID_ROOT,
56227064Sbz                                GID_WHEEL,
57227064Sbz                                0600,
58227064Sbz                                "%s",
59227064Sbz                                if_name(ha->ifp));
60227064Sbz
61227064Sbz	if (ha->ioctl_dev == NULL)
62227064Sbz		return (-1);
63227064Sbz
64227064Sbz        ha->ioctl_dev->si_drv1 = ha;
65227064Sbz
66227064Sbz	return (0);
67227064Sbz}
68227064Sbz
69227064Sbzvoid
70227064Sbzqla_del_cdev(qla_host_t *ha)
71227064Sbz{
72227064Sbz	if (ha->ioctl_dev != NULL)
73227064Sbz		destroy_dev(ha->ioctl_dev);
74227064Sbz	return;
75227064Sbz}
76227064Sbz
77227064Sbzint
78227064Sbzqla_eioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
79227064Sbz        struct thread *td)
80227064Sbz{
81227064Sbz        qla_host_t *ha;
82227064Sbz        int rval = 0;
83227064Sbz        qla_reg_val_t *rv;
84227064Sbz        qla_rd_flash_t *rdf;
85250340Sdavidcs	qla_wr_flash_t *wrf;
86250340Sdavidcs	qla_rd_pci_ids_t *pci_ids;
87250340Sdavidcs	device_t pci_dev;
88227064Sbz
89227064Sbz        if ((ha = (qla_host_t *)dev->si_drv1) == NULL)
90227064Sbz                return ENXIO;
91227064Sbz
92250340Sdavidcs	pci_dev= ha->pci_dev;
93250340Sdavidcs
94227064Sbz        switch(cmd) {
95227064Sbz
96227064Sbz        case QLA_RDWR_REG:
97227064Sbz
98227064Sbz                rv = (qla_reg_val_t *)data;
99227064Sbz
100227064Sbz                if (rv->direct) {
101227064Sbz                        if (rv->rd) {
102227064Sbz                                rv->val = READ_OFFSET32(ha, rv->reg);
103227064Sbz                        } else {
104227064Sbz                                WRITE_OFFSET32(ha, rv->reg, rv->val);
105227064Sbz                        }
106227064Sbz                } else {
107227064Sbz                        if ((rval = qla_rdwr_indreg32(ha, rv->reg, &rv->val,
108227064Sbz                                rv->rd)))
109227064Sbz                                rval = ENXIO;
110227064Sbz                }
111227064Sbz                break;
112227064Sbz
113227064Sbz        case QLA_RD_FLASH:
114227064Sbz                rdf = (qla_rd_flash_t *)data;
115227064Sbz                if ((rval = qla_rd_flash32(ha, rdf->off, &rdf->data)))
116227064Sbz                        rval = ENXIO;
117227064Sbz                break;
118250340Sdavidcs
119250340Sdavidcs        case QLA_WR_FLASH:
120250340Sdavidcs                wrf = (qla_wr_flash_t *)data;
121250340Sdavidcs                if ((rval = qla_wr_flash_buffer(ha, wrf->off, wrf->size,
122250340Sdavidcs					wrf->buffer, wrf->pattern)))
123250340Sdavidcs                        rval = ENXIO;
124250340Sdavidcs                break;
125250340Sdavidcs
126250340Sdavidcs
127250340Sdavidcs	case QLA_ERASE_FLASH:
128250340Sdavidcs		if (qla_erase_flash(ha, ((qla_erase_flash_t *)data)->off,
129250340Sdavidcs			((qla_erase_flash_t *)data)->size))
130250340Sdavidcs			rval = ENXIO;
131250340Sdavidcs		break;
132250340Sdavidcs
133250340Sdavidcs	case QLA_RD_PCI_IDS:
134250340Sdavidcs		pci_ids = (qla_rd_pci_ids_t *)data;
135250340Sdavidcs		pci_ids->ven_id = pci_get_vendor(pci_dev);
136250340Sdavidcs		pci_ids->dev_id = pci_get_device(pci_dev);
137250340Sdavidcs		pci_ids->subsys_ven_id = pci_get_subvendor(pci_dev);
138250340Sdavidcs		pci_ids->subsys_dev_id = pci_get_subdevice(pci_dev);
139250340Sdavidcs		pci_ids->rev_id = pci_read_config(pci_dev, PCIR_REVID, 1);
140250340Sdavidcs		break;
141250340Sdavidcs
142227064Sbz        default:
143227064Sbz                break;
144227064Sbz        }
145227064Sbz
146227064Sbz        return rval;
147227064Sbz}
148227064Sbz
149