qla_ioctl.c revision 331722
1/*
2 * Copyright (c) 2011-2013 Qlogic Corporation
3 * All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions
7 *  are met:
8 *
9 *  1. Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 *  2. Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 *  POSSIBILITY OF SUCH DAMAGE.
26 */
27/*
28 * File: qla_ioctl.c
29 * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: stable/11/sys/dev/qlxgb/qla_ioctl.c 331722 2018-03-29 02:50:57Z eadler $");
34
35#include "qla_os.h"
36#include "qla_reg.h"
37#include "qla_hw.h"
38#include "qla_def.h"
39#include "qla_reg.h"
40#include "qla_inline.h"
41#include "qla_glbl.h"
42#include "qla_ioctl.h"
43
44static struct cdevsw qla_cdevsw = {
45	.d_version = D_VERSION,
46	.d_ioctl = qla_eioctl,
47	.d_name = "qlcnic",
48};
49
50int
51qla_make_cdev(qla_host_t *ha)
52{
53        ha->ioctl_dev = make_dev(&qla_cdevsw,
54				ha->ifp->if_dunit,
55                                UID_ROOT,
56                                GID_WHEEL,
57                                0600,
58                                "%s",
59                                if_name(ha->ifp));
60
61	if (ha->ioctl_dev == NULL)
62		return (-1);
63
64        ha->ioctl_dev->si_drv1 = ha;
65
66	return (0);
67}
68
69void
70qla_del_cdev(qla_host_t *ha)
71{
72	if (ha->ioctl_dev != NULL)
73		destroy_dev(ha->ioctl_dev);
74	return;
75}
76
77int
78qla_eioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
79        struct thread *td)
80{
81        qla_host_t *ha;
82        int rval = 0;
83        qla_reg_val_t *rv;
84        qla_rd_flash_t *rdf;
85	qla_wr_flash_t *wrf;
86	qla_rd_pci_ids_t *pci_ids;
87	device_t pci_dev;
88
89        if ((ha = (qla_host_t *)dev->si_drv1) == NULL)
90                return ENXIO;
91
92	pci_dev= ha->pci_dev;
93
94        switch(cmd) {
95
96        case QLA_RDWR_REG:
97
98                rv = (qla_reg_val_t *)data;
99
100                if (rv->direct) {
101                        if (rv->rd) {
102                                rv->val = READ_OFFSET32(ha, rv->reg);
103                        } else {
104                                WRITE_OFFSET32(ha, rv->reg, rv->val);
105                        }
106                } else {
107                        if ((rval = qla_rdwr_indreg32(ha, rv->reg, &rv->val,
108                                rv->rd)))
109                                rval = ENXIO;
110                }
111                break;
112
113        case QLA_RD_FLASH:
114                rdf = (qla_rd_flash_t *)data;
115                if ((rval = qla_rd_flash32(ha, rdf->off, &rdf->data)))
116                        rval = ENXIO;
117                break;
118
119        case QLA_WR_FLASH:
120                wrf = (qla_wr_flash_t *)data;
121                if ((rval = qla_wr_flash_buffer(ha, wrf->off, wrf->size,
122					wrf->buffer, wrf->pattern)))
123                        rval = ENXIO;
124                break;
125
126
127	case QLA_ERASE_FLASH:
128		if (qla_erase_flash(ha, ((qla_erase_flash_t *)data)->off,
129			((qla_erase_flash_t *)data)->size))
130			rval = ENXIO;
131		break;
132
133	case QLA_RD_PCI_IDS:
134		pci_ids = (qla_rd_pci_ids_t *)data;
135		pci_ids->ven_id = pci_get_vendor(pci_dev);
136		pci_ids->dev_id = pci_get_device(pci_dev);
137		pci_ids->subsys_ven_id = pci_get_subvendor(pci_dev);
138		pci_ids->subsys_dev_id = pci_get_subdevice(pci_dev);
139		pci_ids->rev_id = pci_read_config(pci_dev, PCIR_REVID, 1);
140		break;
141
142        default:
143                break;
144        }
145
146        return rval;
147}
148
149