1227064Sbz/* 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: releng/11.0/sys/dev/qlxgb/qla_ioctl.c 250340 2013-05-07 22:58:42Z davidcs $"); 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