2 ** $Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_2/os/linux/gl_proc.c#1 $
6 \brief This file defines the interface which can interact with users in /proc fs.
11 /*******************************************************************************
12 * Copyright (c) 2007 MediaTek Inc.
14 * All rights reserved. Copying, compilation, modification, distribution
15 * or any other use whatsoever of this material is strictly prohibited
16 * except in accordance with a Software License Agreement with
18 ********************************************************************************
21 /*******************************************************************************
24 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
25 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
26 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
27 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
28 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
29 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
30 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
31 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
32 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
33 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
34 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
35 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
36 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
38 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
39 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
40 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
41 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
42 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
44 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
45 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
46 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
47 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
48 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
50 ********************************************************************************
57 * [WCXRP00001098] [MT6620 Wi-Fi][Driver] Replace printk by DBG LOG macros in linux porting layer
58 * 1. eliminaite direct calls to printk in porting layer.
59 * 2. replaced by DBGLOG, which would be XLOG on ALPS platforms.
62 * [WCXRP00000577] [MT6620 Wi-Fi][Driver][FW] Create V2.0 branch for firmware and driver
63 * create V2.0 driver release based on label "MT6620_WIFI_DRIVER_V2_0_110318_1600" from main trunk
65 * 12 10 2010 kevin.huang
66 * [WCXRP00000128] [MT6620 Wi-Fi][Driver] Add proc support to Android Driver for debug and driver status check
67 * Add Linux Proc Support
68 ** \main\maintrunk.MT5921\19 2008-09-02 21:08:37 GMT mtk01461
69 ** Fix the compile error of SPRINTF()
70 ** \main\maintrunk.MT5921\18 2008-08-10 18:48:28 GMT mtk01461
71 ** Update for Driver Review
72 ** \main\maintrunk.MT5921\17 2008-08-04 16:52:01 GMT mtk01461
73 ** Add proc dbg print message of DOMAIN_INDEX level
74 ** \main\maintrunk.MT5921\16 2008-07-10 00:45:16 GMT mtk01461
75 ** Remove the check of MCR offset, we may use the MCR address which is not align to DW boundary or proprietary usage.
76 ** \main\maintrunk.MT5921\15 2008-06-03 20:49:44 GMT mtk01461
77 ** \main\maintrunk.MT5921\14 2008-06-02 22:56:00 GMT mtk01461
78 ** Rename some functions for linux proc
79 ** \main\maintrunk.MT5921\13 2008-06-02 20:23:18 GMT mtk01461
80 ** Revise PROC mcr read / write for supporting TELNET
81 ** \main\maintrunk.MT5921\12 2008-03-28 10:40:25 GMT mtk01461
82 ** Remove temporary set desired rate in linux proc
83 ** \main\maintrunk.MT5921\11 2008-01-07 15:07:29 GMT mtk01461
84 ** Add User Update Desired Rate Set for QA in Linux
85 ** \main\maintrunk.MT5921\10 2007-12-11 00:11:14 GMT mtk01461
86 ** Fix SPIN_LOCK protection
87 ** \main\maintrunk.MT5921\9 2007-12-04 18:07:57 GMT mtk01461
88 ** Add additional debug category to proc
89 ** \main\maintrunk.MT5921\8 2007-11-02 01:03:23 GMT mtk01461
90 ** Unify TX Path for Normal and IBSS Power Save + IBSS neighbor learning
91 ** \main\maintrunk.MT5921\7 2007-10-25 18:08:14 GMT mtk01461
92 ** Add VOIP SCAN Support & Refine Roaming
93 ** Revision 1.3 2007/07/05 07:25:33 MTK01461
94 ** Add Linux initial code, modify doc, add 11BB, RF init code
96 ** Revision 1.2 2007/06/27 02:18:51 MTK01461
97 ** Update SCAN_FSM, Initial(Can Load Module), Proc(Can do Reg R/W), TX API
101 /*******************************************************************************
102 * C O M P I L E R F L A G S
103 ********************************************************************************
106 /*******************************************************************************
107 * E X T E R N A L R E F E R E N C E S
108 ********************************************************************************
113 #include "wlan_lib.h"
117 /*******************************************************************************
119 ********************************************************************************
121 #define PROC_MCR_ACCESS "mcr"
122 #define PROC_DRV_STATUS "status"
123 #define PROC_RX_STATISTICS "rx_statistics"
124 #define PROC_TX_STATISTICS "tx_statistics"
125 #define PROC_DBG_LEVEL "dbg_level"
127 #define PROC_MCR_ACCESS_MAX_USER_INPUT_LEN 20
128 #define PROC_RX_STATISTICS_MAX_USER_INPUT_LEN 10
129 #define PROC_TX_STATISTICS_MAX_USER_INPUT_LEN 10
130 #define PROC_DBG_LEVEL_MAX_USER_INPUT_LEN 20
131 #define PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN 30
134 /*******************************************************************************
136 ********************************************************************************
139 /*******************************************************************************
140 * P U B L I C D A T A
141 ********************************************************************************
144 /*******************************************************************************
145 * P R I V A T E D A T A
146 ********************************************************************************
148 static UINT_32 u4McrOffset = 0;
150 /*******************************************************************************
152 ********************************************************************************
155 /*******************************************************************************
156 * F U N C T I O N D E C L A R A T I O N S
157 ********************************************************************************
160 /*******************************************************************************
162 ********************************************************************************
164 /*----------------------------------------------------------------------------*/
166 * \brief The PROC function for reading MCR register to User Space, the offset of
167 * the MCR is specified in u4McrOffset.
169 * \param[in] page Buffer provided by kernel.
170 * \param[in out] start Start Address to read(3 methods).
171 * \param[in] off Offset.
172 * \param[in] count Allowable number to read.
173 * \param[out] eof End of File indication.
174 * \param[in] data Pointer to the private data structure.
176 * \return number of characters print to the buffer from User Space.
178 /*----------------------------------------------------------------------------*/
189 P_GLUE_INFO_T prGlueInfo;
190 PARAM_CUSTOM_MCR_RW_STRUC_T rMcrInfo;
194 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
199 // Kevin: Apply PROC read method 1.
201 return 0; // To indicate end of file.
204 prGlueInfo = (P_GLUE_INFO_T) netdev_priv((struct net_device *)data);
206 rMcrInfo.u4McrOffset = u4McrOffset;
208 rStatus = kalIoctl(prGlueInfo,
219 SPRINTF(p, ("MCR (0x%08lxh): 0x%08lx\n",
220 rMcrInfo.u4McrOffset, rMcrInfo.u4McrData));
222 u4Count = (UINT_32)(p - page);
228 } /* end of procMCRRead() */
231 /*----------------------------------------------------------------------------*/
233 * \brief The PROC function for writing MCR register to HW or update u4McrOffset
234 * for reading MCR later.
236 * \param[in] file pointer to file.
237 * \param[in] buffer Buffer from user space.
238 * \param[in] count Number of characters to write
239 * \param[in] data Pointer to the private data structure.
241 * \return number of characters write from User Space.
243 /*----------------------------------------------------------------------------*/
252 P_GLUE_INFO_T prGlueInfo;
253 char acBuf[PROC_MCR_ACCESS_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0"
255 PARAM_CUSTOM_MCR_RW_STRUC_T rMcrInfo;
257 WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
262 i4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1);
263 if (copy_from_user(acBuf, buffer, i4CopySize)) {
266 acBuf[i4CopySize] = '\0';
268 switch (sscanf(acBuf, "0x%lx 0x%lx",
269 &rMcrInfo.u4McrOffset, &rMcrInfo.u4McrData)) {
271 /* NOTE: Sometimes we want to test if bus will still be ok, after accessing
272 * the MCR which is not align to DW boundary.
274 //if (IS_ALIGN_4(rMcrInfo.u4McrOffset))
276 prGlueInfo = (P_GLUE_INFO_T) netdev_priv((struct net_device *)data);
278 u4McrOffset = rMcrInfo.u4McrOffset;
280 //printk("Write 0x%lx to MCR 0x%04lx\n",
281 //rMcrInfo.u4McrOffset, rMcrInfo.u4McrData);
283 rStatus = kalIoctl(prGlueInfo,
297 //if (IS_ALIGN_4(rMcrInfo.u4McrOffset))
299 u4McrOffset = rMcrInfo.u4McrOffset;
309 } /* end of procMCRWrite() */
312 /*----------------------------------------------------------------------------*/
314 * \brief The PROC function for reading Driver Status to User Space.
316 * \param[in] page Buffer provided by kernel.
317 * \param[in out] start Start Address to read(3 methods).
318 * \param[in] off Offset.
319 * \param[in] count Allowable number to read.
320 * \param[out] eof End of File indication.
321 * \param[in] data Pointer to the private data structure.
323 * \return number of characters print to the buffer from User Space.
325 /*----------------------------------------------------------------------------*/
336 P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv;
340 GLUE_SPIN_LOCK_DECLARATION();
345 // Kevin: Apply PROC read method 1.
347 return 0; // To indicate end of file.
351 SPRINTF(p, ("GLUE LAYER STATUS:"));
352 SPRINTF(p, ("\n=================="));
354 SPRINTF(p, ("\n* Number of Pending Frames: %ld\n",
355 prGlueInfo->u4TxPendingFrameNum));
357 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
359 wlanoidQueryDrvStatusForLinuxProc(prGlueInfo->prAdapter, p, &u4Count);
361 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
363 u4Count += (UINT_32)(p - page);
369 } /* end of procDrvStatusRead() */
372 /*----------------------------------------------------------------------------*/
374 * \brief The PROC function for reading Driver RX Statistic Counters to User Space.
376 * \param[in] page Buffer provided by kernel.
377 * \param[in out] start Start Address to read(3 methods).
378 * \param[in] off Offset.
379 * \param[in] count Allowable number to read.
380 * \param[out] eof End of File indication.
381 * \param[in] data Pointer to the private data structure.
383 * \return number of characters print to the buffer from User Space.
385 /*----------------------------------------------------------------------------*/
387 procRxStatisticsRead (
396 P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv;
400 GLUE_SPIN_LOCK_DECLARATION();
405 // Kevin: Apply PROC read method 1.
407 return 0; // To indicate end of file.
411 SPRINTF(p, ("RX STATISTICS (Write 1 to clear):"));
412 SPRINTF(p, ("\n=================================\n"));
414 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
416 wlanoidQueryRxStatisticsForLinuxProc(prGlueInfo->prAdapter, p, &u4Count);
418 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
420 u4Count += (UINT_32)(p - page);
426 } /* end of procRxStatisticsRead() */
429 /*----------------------------------------------------------------------------*/
431 * \brief The PROC function for reset Driver RX Statistic Counters.
433 * \param[in] file pointer to file.
434 * \param[in] buffer Buffer from user space.
435 * \param[in] count Number of characters to write
436 * \param[in] data Pointer to the private data structure.
438 * \return number of characters write from User Space.
440 /*----------------------------------------------------------------------------*/
442 procRxStatisticsWrite (
449 P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv;
450 char acBuf[PROC_RX_STATISTICS_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0"
452 UINT_32 u4ClearCounter;
454 GLUE_SPIN_LOCK_DECLARATION();
459 u4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1);
460 copy_from_user(acBuf, buffer, u4CopySize);
461 acBuf[u4CopySize] = '\0';
463 if (sscanf(acBuf, "%ld", &u4ClearCounter) == 1) {
464 if (u4ClearCounter == 1) {
465 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
467 wlanoidSetRxStatisticsForLinuxProc(prGlueInfo->prAdapter);
469 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
475 } /* end of procRxStatisticsWrite() */
478 /*----------------------------------------------------------------------------*/
480 * \brief The PROC function for reading Driver TX Statistic Counters to User Space.
482 * \param[in] page Buffer provided by kernel.
483 * \param[in out] start Start Address to read(3 methods).
484 * \param[in] off Offset.
485 * \param[in] count Allowable number to read.
486 * \param[out] eof End of File indication.
487 * \param[in] data Pointer to the private data structure.
489 * \return number of characters print to the buffer from User Space.
491 /*----------------------------------------------------------------------------*/
493 procTxStatisticsRead (
502 P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv;
506 GLUE_SPIN_LOCK_DECLARATION();
511 // Kevin: Apply PROC read method 1.
513 return 0; // To indicate end of file.
517 SPRINTF(p, ("TX STATISTICS (Write 1 to clear):"));
518 SPRINTF(p, ("\n=================================\n"));
520 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
522 wlanoidQueryTxStatisticsForLinuxProc(prGlueInfo->prAdapter, p, &u4Count);
524 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
526 u4Count += (UINT_32)(p - page);
532 } /* end of procTxStatisticsRead() */
535 /*----------------------------------------------------------------------------*/
537 * \brief The PROC function for reset Driver TX Statistic Counters.
539 * \param[in] file pointer to file.
540 * \param[in] buffer Buffer from user space.
541 * \param[in] count Number of characters to write
542 * \param[in] data Pointer to the private data structure.
544 * \return number of characters write from User Space.
546 /*----------------------------------------------------------------------------*/
548 procTxStatisticsWrite (
555 P_GLUE_INFO_T prGlueInfo = ((struct net_device *)data)->priv;
556 char acBuf[PROC_RX_STATISTICS_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0"
558 UINT_32 u4ClearCounter;
560 GLUE_SPIN_LOCK_DECLARATION();
565 u4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1);
566 copy_from_user(acBuf, buffer, u4CopySize);
567 acBuf[u4CopySize] = '\0';
569 if (sscanf(acBuf, "%ld", &u4ClearCounter) == 1) {
570 if (u4ClearCounter == 1) {
571 GLUE_ACQUIRE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
573 wlanoidSetTxStatisticsForLinuxProc(prGlueInfo->prAdapter);
575 GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_FSM);
581 } /* end of procTxStatisticsWrite() */
586 static UINT_8 aucDbModuleName[][PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN] = {
615 extern UINT_8 aucDebugModule[];
618 /*----------------------------------------------------------------------------*/
620 * \brief The PROC function for displaying current Debug Level.
622 * \param[in] page Buffer provided by kernel.
623 * \param[in out] start Start Address to read(3 methods).
624 * \param[in] off Offset.
625 * \param[in] count Allowable number to read.
626 * \param[out] eof End of File indication.
627 * \param[in] data Pointer to the private data structure.
629 * \return number of characters print to the buffer from User Space.
631 /*----------------------------------------------------------------------------*/
647 // Kevin: Apply PROC read method 1.
649 return 0; // To indicate end of file.
652 for (i = 0; i < (sizeof(aucDbModuleName)/PROC_DBG_LEVEL_MAX_DISPLAY_STR_LEN); i++) {
653 SPRINTF(p, ("%c %-15s(0x%02x): %02x\n",
654 ((i == u4DebugModule) ? '*' : ' '),
655 &aucDbModuleName[i][0],
661 return (int)(p - page);
665 /*----------------------------------------------------------------------------*/
667 * \brief The PROC function for adjusting Debug Level to turn on/off debugging message.
669 * \param[in] file pointer to file.
670 * \param[in] buffer Buffer from user space.
671 * \param[in] count Number of characters to write
672 * \param[in] data Pointer to the private data structure.
674 * \return number of characters write from User Space.
676 /*----------------------------------------------------------------------------*/
685 char acBuf[PROC_DBG_LEVEL_MAX_USER_INPUT_LEN + 1]; // + 1 for "\0"
687 UINT_32 u4NewDbgModule, u4NewDbgLevel;
690 u4CopySize = (count < (sizeof(acBuf) - 1)) ? count : (sizeof(acBuf) - 1);
691 copy_from_user(acBuf, buffer, u4CopySize);
692 acBuf[u4CopySize] = '\0';
694 if (sscanf(acBuf, "0x%lx 0x%lx", &u4NewDbgModule, &u4NewDbgLevel) == 2) {
695 if (u4NewDbgModule < DBG_MODULE_NUM) {
696 u4DebugModule = u4NewDbgModule;
697 u4NewDbgLevel &= DBG_CLASS_MASK;
698 aucDebugModule[u4DebugModule] = (UINT_8)u4NewDbgLevel;
707 /*----------------------------------------------------------------------------*/
709 * \brief This function create a PROC fs in linux /proc/net subdirectory.
711 * \param[in] prDev Pointer to the struct net_device.
712 * \param[in] pucDevName Pointer to the name of net_device.
716 /*----------------------------------------------------------------------------*/
719 struct net_device *prDev,
723 P_GLUE_INFO_T prGlueInfo;
724 struct proc_dir_entry *prEntry;
729 if (init_net.proc_net == (struct proc_dir_entry *)NULL) {
730 DBGLOG(INIT, INFO, ("init proc fs fail: proc_net == NULL\n"));
734 prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prDev);
737 DBGLOG(INIT, WARN, ("The OS context is NULL\n"));
744 |-- mcr (PROC_MCR_ACCESS)
745 |-- status (PROC_DRV_STATUS)
746 |-- rx_statistics (PROC_RX_STATISTICS)
747 |-- tx_statistics (PROC_TX_STATISTICS)
748 |-- dbg_level (PROC_DBG_LEVEL)
753 * Directory: Root (/proc/net/wlan0)
756 prGlueInfo->pProcRoot = proc_mkdir(pucDevName, init_net.proc_net);
757 if (prGlueInfo->pProcRoot == NULL) {
761 /* File Root/mcr (RW) */
762 prEntry = create_proc_entry(PROC_MCR_ACCESS, 0, prGlueInfo->pProcRoot);
764 prEntry->read_proc = procMCRRead;
765 prEntry->write_proc = procMCRWrite;
766 prEntry->data = (void *)prDev;
770 /* File Root/status (RW) */
771 prEntry = create_proc_read_entry(PROC_DRV_STATUS, 0, prGlueInfo->pProcRoot,
772 procDrvStatusRead, prDev);
774 /* File Root/rx_statistics (RW) */
775 prEntry = create_proc_entry(PROC_RX_STATISTICS, 0, prGlueInfo->pProcRoot);
777 prEntry->read_proc = procRxStatisticsRead;
778 prEntry->write_proc = procRxStatisticsWrite;
779 prEntry->data = (void *)prDev;
782 /* File Root/tx_statistics (RW) */
783 prEntry = create_proc_entry(PROC_TX_STATISTICS, 0, prGlueInfo->pProcRoot);
785 prEntry->read_proc = procTxStatisticsRead;
786 prEntry->write_proc = procTxStatisticsWrite;
787 prEntry->data = (void *)prDev;
791 /* File Root/dbg_level (RW) */
792 prEntry = create_proc_entry(PROC_DBG_LEVEL, 0644, prGlueInfo->pProcRoot);
794 prEntry->read_proc = procDbgLevelRead;
795 prEntry->write_proc = procDbgLevelWrite;
801 } /* end of procInitProcfs() */
804 /*----------------------------------------------------------------------------*/
806 * \brief This function clean up a PROC fs created by procInitProcfs().
808 * \param[in] prDev Pointer to the struct net_device.
809 * \param[in] pucDevName Pointer to the name of net_device.
813 /*----------------------------------------------------------------------------*/
816 struct net_device *prDev,
820 P_GLUE_INFO_T prGlueInfo = NULL;
829 if (init_net.proc_net == (struct proc_dir_entry *)NULL) {
830 DBGLOG(INIT, WARN, ("remove proc fs fail: proc_net == NULL\n"));
834 prGlueInfo = (P_GLUE_INFO_T) netdev_priv(prDev);
835 if (!prGlueInfo->pProcRoot) {
836 DBGLOG(INIT, WARN, ("The procfs root is NULL\n"));
841 remove_proc_entry(PROC_DBG_LEVEL, prGlueInfo->pProcRoot);
843 remove_proc_entry(PROC_TX_STATISTICS, prGlueInfo->pProcRoot);
844 remove_proc_entry(PROC_RX_STATISTICS, prGlueInfo->pProcRoot);
845 remove_proc_entry(PROC_DRV_STATUS, prGlueInfo->pProcRoot);
847 remove_proc_entry(PROC_MCR_ACCESS, prGlueInfo->pProcRoot);
849 /* remove root directory (proc/net/wlan0) */
850 remove_proc_entry(pucDevName, init_net.proc_net);
854 } /* end of procRemoveProcfs() */