summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/hptmv/hptproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/hptmv/hptproc.c')
-rw-r--r--sys/contrib/dev/hptmv/hptproc.c600
1 files changed, 0 insertions, 600 deletions
diff --git a/sys/contrib/dev/hptmv/hptproc.c b/sys/contrib/dev/hptmv/hptproc.c
deleted file mode 100644
index e05798f..0000000
--- a/sys/contrib/dev/hptmv/hptproc.c
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Copyright (c) 2003-2004 HighPoint Technologies, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * hptproc.c sysctl support
- */
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/sysctl.h>
-#include <machine/stdarg.h>
-
-#include <dev/hptmv/global.h>
-#include <dev/hptmv/hptintf.h>
-#include <dev/hptmv/osbsd.h>
-#include <contrib/dev/hptmv/access601.h>
-
-int hpt_rescan_all(void);
-
-/***************************************************************************/
-
-static char hptproc_buffer[256];
-
-#define FORMAL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, int arg2, \
- struct sysctl_req *req
-#define REAL_HANDLER_ARGS oidp, arg1, arg2, req
-typedef struct sysctl_req HPT_GET_INFO;
-
-static int hpt_set_asc_info(IAL_ADAPTER_T *pAdapter, char *buffer,int length)
-{
- int orig_length = length+4;
- PVBus _vbus_p = &pAdapter->VBus;
- PVDevice pArray;
- PVDevice pSubArray, pVDev;
- UINT i, iarray, ichan;
- struct cam_periph *periph = NULL;
- intrmask_t oldspl;
-
-#ifdef SUPPORT_ARRAY
- if (length>=8 && strncmp(buffer, "rebuild ", 8)==0)
- {
- buffer+=8;
- length-=8;
- if (length>=5 && strncmp(buffer, "start", 5)==0)
- {
- oldspl = lock_driver();
- for(i = 0; i < MAX_ARRAY_PER_VBUS; i++)
- if ((pArray=ArrayTables(i))->u.array.dArStamp==0)
- continue;
- else{
- if (pArray->u.array.rf_need_rebuild && !pArray->u.array.rf_rebuilding)
- hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray,
- (UCHAR)((pArray->u.array.CriticalMembers || pArray->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY));
- }
- unlock_driver(oldspl);
- return orig_length;
- }
- else if (length>=4 && strncmp(buffer, "stop", 4)==0)
- {
- oldspl = lock_driver();
- for(i = 0; i < MAX_ARRAY_PER_VBUS; i++)
- if ((pArray=ArrayTables(i))->u.array.dArStamp==0)
- continue;
- else{
- if (pArray->u.array.rf_rebuilding)
- pArray->u.array.rf_abort_rebuild = 1;
- }
- unlock_driver(oldspl);
- return orig_length;
- }
- else if (length>=3 && buffer[1]==','&& buffer[0]>='1'&& buffer[2]>='1')
- {
- iarray = buffer[0]-'1';
- ichan = buffer[2]-'1';
-
- if(iarray >= MAX_VDEVICE_PER_VBUS || ichan >= MV_SATA_CHANNELS_NUM) return -EINVAL;
-
- pArray = _vbus_p->pVDevice[iarray];
- if (!pArray || (pArray->vf_online == 0)) return -EINVAL;
-
- for (i=0;i<MV_SATA_CHANNELS_NUM;i++)
- if(i == ichan)
- goto rebuild;
-
- return -EINVAL;
-
-rebuild:
- pVDev = &pAdapter->VDevices[ichan];
- if(!pVDev->u.disk.df_on_line || pVDev->pParent) return -EINVAL;
-
- /* Not allow to use a mounted disk ??? test*/
- for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++)
- if(pVDev == _vbus_p->pVDevice[i])
- {
- periph = hpt_get_periph(pAdapter->mvSataAdapter.adapterId,i);
- if (periph != NULL && periph->refcount == 1)
- {
- hpt_printk(("Can not use disk used by OS!\n"));
- return -EINVAL;
- }
- /* the Mounted Disk isn't delete */
- }
-
- switch(pArray->VDeviceType)
- {
- case VD_RAID_1:
- case VD_RAID_5:
- {
- pSubArray = pArray;
-loop:
- oldspl = lock_driver();
- if(hpt_add_disk_to_array(_VBUS_P VDEV_TO_ID(pSubArray), VDEV_TO_ID(pVDev)) == -1) {
- unlock_driver(oldspl);
- return -EINVAL;
- }
- pArray->u.array.rf_auto_rebuild = 0;
- pArray->u.array.rf_abort_rebuild = 0;
- hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, DUPLICATE);
- unlock_driver(oldspl);
- break;
- }
- case VD_RAID_0:
- for (i = 0; (UCHAR)i < pArray->u.array.bArnMember; i++)
- if(pArray->u.array.pMember[i] && mIsArray(pArray->u.array.pMember[i]) &&
- (pArray->u.array.pMember[i]->u.array.rf_broken == 1))
- {
- pSubArray = pArray->u.array.pMember[i];
- goto loop;
- }
- default:
- return -EINVAL;
- }
- return orig_length;
- }
- }
- else if (length>=7 && strncmp(buffer, "verify ", 7)==0)
- {
- buffer+=7;
- length-=7;
- if (length>=6 && strncmp(buffer, "start ", 6)==0)
- {
- buffer+=6;
- length-=6;
- if (length>=1 && *buffer>='1')
- {
- iarray = *buffer-'1';
- if(iarray >= MAX_VDEVICE_PER_VBUS) return -EINVAL;
-
- pArray = _vbus_p->pVDevice[iarray];
- if (!pArray || (pArray->vf_online == 0)) return -EINVAL;
-
- if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5)
- return -EINVAL;
-
- if (!(pArray->u.array.rf_need_rebuild ||
- pArray->u.array.rf_rebuilding ||
- pArray->u.array.rf_verifying ||
- pArray->u.array.rf_initializing))
- {
- oldspl = lock_driver();
- pArray->u.array.RebuildSectors = 0;
- hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, VERIFY);
- unlock_driver(oldspl);
- }
- return orig_length;
- }
- }
- else if (length>=5 && strncmp(buffer, "stop ", 5)==0)
- {
- buffer+=5;
- length-=5;
- if (length>=1 && *buffer>='1')
- {
- iarray = *buffer-'1';
- if(iarray >= MAX_VDEVICE_PER_VBUS) return -EINVAL;
-
- pArray = _vbus_p->pVDevice[iarray];
- if (!pArray || (pArray->vf_online == 0)) return -EINVAL;
- if(pArray->u.array.rf_verifying)
- {
- oldspl = lock_driver();
- pArray->u.array.rf_abort_rebuild = 1;
- unlock_driver(oldspl);
- }
- return orig_length;
- }
- }
- }
- else
-#ifdef _RAID5N_
- if (length>=10 && strncmp(buffer, "writeback ", 10)==0) {
- buffer+=10;
- length-=10;
- if (length>=1 && *buffer>='0' && *buffer<='1') {
- _vbus_(r5.enable_write_back) = *buffer-'0';
- if (_vbus_(r5.enable_write_back))
- hpt_printk(("RAID5 write back enabled"));
- return orig_length;
- }
- }
- else
-#endif
-#endif /* SUPPORT_ARRAY */
- if (0) {} /* just to compile */
-#if DBGUG
- else if (length>=9 && strncmp(buffer, "dbglevel ", 9)==0) {
- buffer+=9;
- length-=9;
- if (length>=1 && *buffer>='0' && *buffer<='3') {
- hpt_dbg_level = *buffer-'0';
- return orig_length;
- }
- }
- else if (length>=8 && strncmp(buffer, "disable ", 8)==0) {
- /* TO DO */
- }
-#endif
-
- return -EINVAL;
-}
-
-/*
- * Since we have only one sysctl node, add adapter ID in the command
- * line string: e.g. "hpt 0 rebuild start"
- */
-static int hpt_set_info(int length)
-{
- int retval;
-
-#ifdef SUPPORT_IOCTL
- PUCHAR ke_area;
- int err;
- DWORD dwRet;
- PHPT_IOCTL_PARAM32 piop;
-#endif
- char *buffer = hptproc_buffer;
- if (length >= 6) {
- if (strncmp(buffer,"hpt ",4) == 0) {
- IAL_ADAPTER_T *pAdapter;
- retval = buffer[4]-'0';
- for (pAdapter=gIal_Adapter; pAdapter; pAdapter=pAdapter->next) {
- if (pAdapter->mvSataAdapter.adapterId==retval)
- return (retval = hpt_set_asc_info(pAdapter, buffer+6, length-6)) >= 0? retval : -EINVAL;
- }
- return -EINVAL;
- }
-#ifdef SUPPORT_IOCTL
- piop = (PHPT_IOCTL_PARAM32)buffer;
- if (piop->Magic == HPT_IOCTL_MAGIC) {
- KdPrintE(("ioctl=%d in=%x len=%d out=%x len=%ld\n",
- piop->dwIoControlCode,
- piop->lpInBuffer,
- piop->nInBufferSize,
- piop->lpOutBuffer,
- (u_long)piop->nOutBufferSize));
-
- /*
- * map buffer to kernel.
- */
- if (piop->nInBufferSize+piop->nOutBufferSize > PAGE_SIZE) {
- KdPrintE(("User buffer too large\n"));
- return -EINVAL;
- }
-
- ke_area = malloc(piop->nInBufferSize+piop->nOutBufferSize, M_DEVBUF, M_NOWAIT);
- if (ke_area == NULL) {
- KdPrintE(("Couldn't allocate kernel mem.\n"));
- return -EINVAL;
- }
-
- if (piop->nInBufferSize)
- copyin((void*)(ULONG_PTR)piop->lpInBuffer, ke_area, piop->nInBufferSize);
-
- /*
- * call kernel handler.
- */
- err = Kernel_DeviceIoControl(&gIal_Adapter->VBus,
- piop->dwIoControlCode, ke_area, piop->nInBufferSize,
- ke_area + piop->nInBufferSize, piop->nOutBufferSize, &dwRet);
-
- if (err==0) {
- if (piop->nOutBufferSize)
- copyout(ke_area + piop->nInBufferSize, (void*)(ULONG_PTR)piop->lpOutBuffer, piop->nOutBufferSize);
-
- if (piop->lpBytesReturned)
- copyout(&dwRet, (void*)(ULONG_PTR)piop->lpBytesReturned, sizeof(DWORD));
-
- free(ke_area, M_DEVBUF);
- return length;
- }
- else KdPrintW(("Kernel_ioctl(): return %d\n", err));
-
- free(ke_area, M_DEVBUF);
- return -EINVAL;
- } else {
- KdPrintW(("Wrong signature: %x\n", piop->Magic));
- return -EINVAL;
- }
-#endif
- }
-
- return -EINVAL;
-}
-
-#define shortswap(w) ((WORD)((w)>>8 | ((w) & 0xFF)<<8))
-
-static void get_disk_name(char *name, PDevice pDev)
-{
- int i;
- MV_SATA_CHANNEL *pMvSataChannel = pDev->mv;
- IDENTIFY_DATA2 *pIdentifyData = (IDENTIFY_DATA2 *)pMvSataChannel->identifyDevice;
-
- for (i = 0; i < 10; i++)
- ((WORD*)name)[i] = shortswap(pIdentifyData->ModelNumber[i]);
- name[20] = '\0';
-}
-
-static int hpt_copy_info(HPT_GET_INFO *pinfo, char *fmt, ...)
-{
- int printfretval;
- va_list ap;
-
- if(fmt == NULL) {
- *hptproc_buffer = 0;
- return (SYSCTL_OUT(pinfo, hptproc_buffer, 1));
- }
- else
- {
- va_start(ap, fmt);
- printfretval = vsnprintf(hptproc_buffer, sizeof(hptproc_buffer), fmt, ap);
- va_end(ap);
- return(SYSCTL_OUT(pinfo, hptproc_buffer, strlen(hptproc_buffer)));
- }
-}
-
-static void hpt_copy_disk_info(HPT_GET_INFO *pinfo, PVDevice pVDev, UINT iChan)
-{
- char name[32], arrayname[16];
-
- get_disk_name(name, &pVDev->u.disk);
-
-#ifdef SUPPORT_ARRAY
- if(pVDev->pParent)
- memcpy(arrayname, pVDev->pParent->u.array.ArrayName, MAX_ARRAY_NAME);
- else
-#endif
- arrayname[0]=0;
-
- hpt_copy_info(pinfo, "Channel %d %s %5dMB %s %s\n",
- iChan+1,
- name, pVDev->VDeviceCapacity>>11,
- ((!pVDev->u.disk.df_on_line)? "Disabled" :
- ((pVDev->VDeviceType != VD_SPARE)?"Normal ":"Spare ")), arrayname);
-}
-
-#ifdef SUPPORT_ARRAY
-static void hpt_copy_array_info(HPT_GET_INFO *pinfo, int nld, PVDevice pArray)
-{
- int i;
- char *sType=0, *sStatus=0;
- char buf[32];
- PVDevice pTmpArray;
-
- switch (pArray->VDeviceType) {
- case VD_RAID_0:
- for (i = 0; (UCHAR)i < pArray->u.array.bArnMember; i++)
- if(pArray->u.array.pMember[i]) {
- if(mIsArray(pArray->u.array.pMember[i]))
- sType = "RAID 1/0 ";
- /* TO DO */
- else
- sType = "RAID 0 ";
- break;
- }
- break;
-
- case VD_RAID_1:
- sType = "RAID 1 ";
- break;
-
- case VD_JBOD:
- sType = "JBOD ";
- break;
-
- case VD_RAID_5:
- sType = "RAID 5 ";
- break;
-
- default:
- sType = "N/A ";
- break;
- }
-
- if (pArray->vf_online == 0)
- sStatus = "Disabled";
- else if (pArray->u.array.rf_broken)
- sStatus = "Critical";
- for (i = 0; (UCHAR)i < pArray->u.array.bArnMember; i++)
- {
- if (!sStatus)
- {
- if(mIsArray(pArray->u.array.pMember[i]))
- pTmpArray = pArray->u.array.pMember[i];
- else
- pTmpArray = pArray;
-
- if (pTmpArray->u.array.rf_rebuilding) {
-#ifdef DEBUG
- sprintf(buf, "Rebuilding %dMB", (pTmpArray->u.array.RebuildSectors>>11));
-#else
- sprintf(buf, "Rebuilding %d%%", (pTmpArray->u.array.RebuildSectors>>11)*100/((pTmpArray->VDeviceCapacity/(pTmpArray->u.array.bArnMember-1))>>11));
-#endif
- sStatus = buf;
- }
- else if (pTmpArray->u.array.rf_verifying) {
- sprintf(buf, "Verifying %d%%", (pTmpArray->u.array.RebuildSectors>>11)*100/((pTmpArray->VDeviceCapacity/(pTmpArray->u.array.bArnMember-1))>>11));
- sStatus = buf;
- }
- else if (pTmpArray->u.array.rf_need_rebuild)
- sStatus = "Critical";
- else if (pTmpArray->u.array.rf_broken)
- sStatus = "Critical";
-
- if(pTmpArray == pArray) goto out;
- }
- else
- goto out;
- }
-out:
- if (!sStatus) sStatus = "Normal";
- hpt_copy_info(pinfo, "%2d %11s %-20s %5dMB %-16s", nld, sType, pArray->u.array.ArrayName, pArray->VDeviceCapacity>>11, sStatus);
-}
-#endif
-
-static int hpt_get_info(IAL_ADAPTER_T *pAdapter, HPT_GET_INFO *pinfo)
-{
- PVBus _vbus_p = &pAdapter->VBus;
- struct cam_periph *periph = NULL;
- UINT channel,j,i;
- PVDevice pVDev;
-
-#ifndef FOR_DEMO
- if (pAdapter->beeping) {
- intrmask_t oldspl = lock_driver();
- pAdapter->beeping = 0;
- BeepOff(pAdapter->mvSataAdapter.adapterIoBaseAddress);
- unlock_driver(oldspl);
- }
-#endif
-
- hpt_copy_info(pinfo, "Controller #%d:\n\n", pAdapter->mvSataAdapter.adapterId);
-
- hpt_copy_info(pinfo, "Physical device list\n");
- hpt_copy_info(pinfo, "Channel Model Capacity Status Array\n");
- hpt_copy_info(pinfo, "-------------------------------------------------------------------\n");
-
- for (channel = 0; channel < MV_SATA_CHANNELS_NUM; channel++)
- {
- pVDev = &(pAdapter->VDevices[channel]);
- if(pVDev->u.disk.df_on_line)
- hpt_copy_disk_info(pinfo, pVDev, channel);
- }
-
- hpt_copy_info(pinfo, "\nLogical device list\n");
- hpt_copy_info(pinfo, "No. Type Name Capacity Status OsDisk\n");
- hpt_copy_info(pinfo, "--------------------------------------------------------------------------\n");
-
- j=1;
- for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++){
- pVDev = _vbus_p->pVDevice[i];
- if(pVDev){
- j=i+1;
-#ifdef SUPPORT_ARRAY
- if (mIsArray(pVDev))
- {
- is_array:
- hpt_copy_array_info(pinfo, j, pVDev);
- }
- else
-#endif
- {
- char name[32];
- /* it may be add to an array after driver loaded, check it */
-#ifdef SUPPORT_ARRAY
- if (pVDev->pParent)
- /* in this case, pVDev can only be a RAID 1 source disk. */
- if (pVDev->pParent->VDeviceType==VD_RAID_1 && pVDev==pVDev->pParent->u.array.pMember[0])
- goto is_array;
-#endif
- get_disk_name(name, &pVDev->u.disk);
-
- hpt_copy_info(pinfo, "%2d %s %s %5dMB %-16s",
- j, "Single disk", name, pVDev->VDeviceCapacity>>11,
- /* gmm 2001-6-19: Check if pDev has been added to an array. */
- ((pVDev->pParent) ? "Unavailable" : "Normal"));
- }
- periph = hpt_get_periph(pAdapter->mvSataAdapter.adapterId, i);
- if (periph == NULL)
- hpt_copy_info(pinfo," %s\n","not registered");
- else
- hpt_copy_info(pinfo," %s%d\n", periph->periph_name, periph->unit_number);
- }
- }
- return 0;
-}
-
-static inline int hpt_proc_in(FORMAL_HANDLER_ARGS, int *len)
-{
- int i, error=0;
-
- *len = 0;
- if ((req->newlen - req->newidx) >= sizeof(hptproc_buffer)) {
- error = EINVAL;
- } else {
- i = (req->newlen - req->newidx);
- error = SYSCTL_IN(req, hptproc_buffer, i);
- if (!error)
- *len = i;
- (hptproc_buffer)[i] = '\0';
- }
- return (error);
-}
-
-static int hpt_status(FORMAL_HANDLER_ARGS)
-{
- int length, error=0, retval=0;
- IAL_ADAPTER_T *pAdapter;
-
- error = hpt_proc_in(REAL_HANDLER_ARGS, &length);
-
- if (req->newptr != NULL)
- {
- if (error || length == 0)
- {
- KdPrint(("error!\n"));
- retval = EINVAL;
- goto out;
- }
-
- if (hpt_set_info(length) >= 0)
- retval = 0;
- else
- retval = EINVAL;
- goto out;
- }
-
- hpt_copy_info(req, "%s Version %s\n", DRIVER_NAME, DRIVER_VERSION);
- for (pAdapter=gIal_Adapter; pAdapter; pAdapter=pAdapter->next) {
- if (hpt_get_info(pAdapter, req) < 0) {
- retval = EINVAL;
- break;
- }
- }
-
- hpt_copy_info(req, NULL);
- goto out;
-
-out:
- return (retval);
-}
-
-
-#define xhptregister_node(name) hptregister_node(name)
-
-#if (__FreeBSD_version < 500043)
-#define hptregister_node(name) \
- SYSCTL_NODE(, OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node") \
- SYSCTL_OID(_ ## name, OID_AUTO, status, CTLTYPE_STRING|CTLFLAG_RW, \
- NULL, 0, hpt_status, "A", "Get/Set " #name " state")
-#else
-#define hptregister_node(name) \
- SYSCTL_NODE(, OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \
- SYSCTL_OID(_ ## name, OID_AUTO, status, CTLTYPE_STRING|CTLFLAG_RW, \
- NULL, 0, hpt_status, "A", "Get/Set " #name " state");
-#endif
-
-xhptregister_node(PROC_DIR_NAME);
OpenPOWER on IntegriCloud