Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v3.14 219 lines 6.0 kB view raw
1/* Copyright (C) 2004-2005 SBE, Inc. 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation; either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 */ 13 14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 15 16#include <linux/types.h> 17#include <linux/module.h> 18#include <linux/errno.h> 19#include <linux/kernel.h> 20#include <linux/init.h> 21#include <linux/proc_fs.h> 22#include <linux/seq_file.h> 23#include <linux/sched.h> 24#include <asm/uaccess.h> 25#include "pmcc4_sysdep.h" 26#include "sbecom_inline_linux.h" 27#include "pmcc4_private.h" 28#include "sbeproc.h" 29 30extern void sbecom_get_brdinfo(ci_t *, struct sbe_brd_info *, u_int8_t *); 31extern struct s_hdw_info hdw_info[MAX_BOARDS]; 32 33void sbecom_proc_brd_cleanup(ci_t *ci) 34{ 35 if (ci->dir_dev) { 36 char dir[7 + SBE_IFACETMPL_SIZE + 1]; 37 snprintf(dir, sizeof(dir), "driver/%s", ci->devname); 38 remove_proc_entry("info", ci->dir_dev); 39 remove_proc_entry(dir, NULL); 40 ci->dir_dev = NULL; 41 } 42} 43 44static void sbecom_proc_get_brdinfo(ci_t *ci, struct sbe_brd_info *bip) 45{ 46 hdw_info_t *hi = &hdw_info[ci->brdno]; 47 u_int8_t *bsn = NULL; 48 49 switch (hi->promfmt) 50 { 51 case PROM_FORMAT_TYPE1: 52 bsn = (u_int8_t *) hi->mfg_info.pft1.Serial; 53 break; 54 case PROM_FORMAT_TYPE2: 55 bsn = (u_int8_t *) hi->mfg_info.pft2.Serial; 56 break; 57 } 58 59 sbecom_get_brdinfo (ci, bip, bsn); 60 61 pr_devel(">> sbecom_get_brdinfo: returned, first_if %p <%s> last_if %p <%s>\n", 62 bip->first_iname, bip->first_iname, 63 bip->last_iname, bip->last_iname); 64} 65 66/* 67 * Describe the driver state through /proc 68 */ 69static int sbecom_proc_get_sbe_info(struct seq_file *m, void *v) 70{ 71 ci_t *ci = m->private; 72 char *spd; 73 struct sbe_brd_info *bip; 74 75 if (!(bip = OS_kmalloc(sizeof(struct sbe_brd_info)))) 76 return -ENOMEM; 77 78 pr_devel(">> sbecom_proc_get_sbe_info: entered\n"); 79 80 sbecom_proc_get_brdinfo(ci, bip); 81 82 seq_puts(m, "Board Type: "); 83 switch (bip->brd_id) { 84 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T3): 85 seq_puts(m, "wanPMC-C1T3"); 86 break; 87 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_256T3_E1): 88 seq_puts(m, "wanPTMC-256T3 <E1>"); 89 break; 90 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_256T3_T1): 91 seq_puts(m, "wanPTMC-256T3 <T1>"); 92 break; 93 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_C24TE1): 94 seq_puts(m, "wanPTMC-C24TE1"); 95 break; 96 97 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C4T1E1): 98 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C4T1E1_L): 99 seq_puts(m, "wanPMC-C4T1E1"); 100 break; 101 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C2T1E1): 102 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C2T1E1_L): 103 seq_puts(m, "wanPMC-C2T1E1"); 104 break; 105 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T1E1): 106 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T1E1_L): 107 seq_puts(m, "wanPMC-C1T1E1"); 108 break; 109 110 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C4T1E1): 111 seq_puts(m, "wanPCI-C4T1E1"); 112 break; 113 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C2T1E1): 114 seq_puts(m, "wanPCI-C2T1E1"); 115 break; 116 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C1T1E1): 117 seq_puts(m, "wanPCI-C1T1E1"); 118 break; 119 120 default: 121 seq_puts(m, "unknown"); 122 break; 123 } 124 125 seq_printf(m, " [%08X]\n", bip->brd_id); 126 127 seq_printf(m, "Board Number: %d\n", bip->brdno); 128 seq_printf(m, "Hardware ID: 0x%02X\n", ci->hdw_bid); 129 seq_printf(m, "Board SN: %06X\n", bip->brd_sn); 130 seq_printf(m, "Board MAC: %pMF\n", bip->brd_mac_addr); 131 seq_printf(m, "Ports: %d\n", ci->max_port); 132 seq_printf(m, "Channels: %d\n", bip->brd_chan_cnt); 133#if 1 134 seq_printf(m, "Interface: %s -> %s\n", 135 bip->first_iname, bip->last_iname); 136#else 137 seq_printf(m, "Interface: <not available> 1st %p lst %p\n", 138 bip->first_iname, bip->last_iname); 139#endif 140 141 switch (bip->brd_pci_speed) { 142 case BINFO_PCI_SPEED_33: 143 spd = "33Mhz"; 144 break; 145 case BINFO_PCI_SPEED_66: 146 spd = "66Mhz"; 147 break; 148 default: 149 spd = "<not available>"; 150 break; 151 } 152 seq_printf(m, "PCI Bus Speed: %s\n", spd); 153 seq_printf(m, "Release: %s\n", ci->release); 154 155#ifdef SBE_PMCC4_ENABLE 156 { 157 extern int cxt1e1_max_mru; 158#if 0 159 extern int max_chans_used; 160 extern int cxt1e1_max_mtu; 161#endif 162 extern int max_rxdesc_used, max_txdesc_used; 163 164 seq_printf(m, "\ncxt1e1_max_mru: %d\n", cxt1e1_max_mru); 165#if 0 166 seq_printf(m, "\nmax_chans_used: %d\n", max_chans_used); 167 seq_printf(m, "cxt1e1_max_mtu: %d\n", cxt1e1_max_mtu); 168#endif 169 seq_printf(m, "max_rxdesc_used: %d\n", max_rxdesc_used); 170 seq_printf(m, "max_txdesc_used: %d\n", max_txdesc_used); 171 } 172#endif 173 174 kfree(bip); 175 176 pr_devel(">> proc_fs: finished\n"); 177 return 0; 178} 179 180/* 181 * seq_file wrappers for procfile show routines. 182 */ 183static int sbecom_proc_open(struct inode *inode, struct file *file) 184{ 185 return single_open(file, sbecom_proc_get_sbe_info, PDE_DATA(inode)); 186} 187 188static const struct file_operations sbecom_proc_fops = { 189 .open = sbecom_proc_open, 190 .read = seq_read, 191 .llseek = seq_lseek, 192 .release = single_release, 193}; 194 195/* 196 * Initialize the /proc subsystem for the specific SBE driver 197 */ 198int __init sbecom_proc_brd_init(ci_t *ci) 199{ 200 char dir[7 + SBE_IFACETMPL_SIZE + 1]; 201 202 snprintf(dir, sizeof(dir), "driver/%s", ci->devname); 203 ci->dir_dev = proc_mkdir(dir, NULL); 204 if (!ci->dir_dev) { 205 pr_err("Unable to create directory /proc/driver/%s\n", ci->devname); 206 goto fail; 207 } 208 209 if (!proc_create_data("info", S_IFREG | S_IRUGO, ci->dir_dev, 210 &sbecom_proc_fops, ci)) { 211 pr_err("Unable to create entry /proc/driver/%s/info\n", ci->devname); 212 goto fail; 213 } 214 return 0; 215 216fail: 217 sbecom_proc_brd_cleanup(ci); 218 return 1; 219}