|
|
1.1 ! root 1: /*+M************************************************************************* ! 2: * Adaptec 274x/284x/294x device driver proc support for Linux. ! 3: * ! 4: * Copyright (c) 1995 Dean W. Gehnert ! 5: * ! 6: * This program is free software; you can redistribute it and/or modify ! 7: * it under the terms of the GNU General Public License as published by ! 8: * the Free Software Foundation; either version 2, or (at your option) ! 9: * any later version. ! 10: * ! 11: * This program is distributed in the hope that it will be useful, ! 12: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: * GNU General Public License for more details. ! 15: * ! 16: * You should have received a copy of the GNU General Public License ! 17: * along with this program; see the file COPYING. If not, write to ! 18: * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 19: * ! 20: * ---------------------------------------------------------------- ! 21: * o Modified from the EATA /proc support. ! 22: * o Additional support for device block statistics provided by ! 23: * Matthew Jacob. ! 24: * ! 25: * Dean W. Gehnert, [email protected], 08/30/95 ! 26: * ! 27: * $Id: aic7xxx_proc.src,v 1.1.1.1 1997/02/25 21:27:47 thomas Exp $ ! 28: *-M*************************************************************************/ ! 29: ! 30: #define BLS buffer + len + size ! 31: #define HDRB \ ! 32: " < 512 512-1K 1-2K 2-4K 4-8K 8-16K 16-32K 32-64K 64-128K >128K" ! 33: ! 34: #ifdef PROC_DEBUG ! 35: extern int vsprintf(char *, const char *, va_list); ! 36: ! 37: static void ! 38: proc_debug(const char *fmt, ...) ! 39: { ! 40: va_list ap; ! 41: char buf[256]; ! 42: ! 43: va_start(ap, fmt); ! 44: vsprintf(buf, fmt, ap); ! 45: printk(buf); ! 46: va_end(ap); ! 47: } ! 48: #else /* PROC_DEBUG */ ! 49: # define proc_debug(fmt, args...) ! 50: #endif /* PROC_DEBUG */ ! 51: ! 52: /*+F************************************************************************* ! 53: * Function: ! 54: * aic7xxx_set_info ! 55: * ! 56: * Description: ! 57: * Set parameters for the driver from the /proc filesystem. ! 58: *-F*************************************************************************/ ! 59: int ! 60: aic7xxx_set_info(char *buffer, int length, struct Scsi_Host *HBAptr) ! 61: { ! 62: proc_debug("aic7xxx_set_info(): %s\n", buffer); ! 63: return (-ENOSYS); /* Currently this is a no-op */ ! 64: } ! 65: ! 66: /*+F************************************************************************* ! 67: * Function: ! 68: * aic7xxx_proc_info ! 69: * ! 70: * Description: ! 71: * Return information to handle /proc support for the driver. ! 72: *-F*************************************************************************/ ! 73: int ! 74: aic7xxx_proc_info(char *buffer, char **start, off_t offset, int length, ! 75: int hostno, int inout) ! 76: { ! 77: struct Scsi_Host *HBAptr; ! 78: struct aic7xxx_host *p; ! 79: static u8 buff[512]; ! 80: int i; ! 81: int size = 0; ! 82: int len = 0; ! 83: off_t begin = 0; ! 84: off_t pos = 0; ! 85: static char *bus_name[] = {"Single", "Twin", "Wide"}; ! 86: ! 87: HBAptr = NULL; ! 88: for (i = 0; i < NUMBER(aic7xxx_boards); i++) ! 89: { ! 90: if ((HBAptr = aic7xxx_boards[i]) != NULL) ! 91: { ! 92: if (HBAptr->host_no == hostno) ! 93: { ! 94: break; ! 95: } ! 96: ! 97: while ((HBAptr->hostdata != NULL) && ! 98: ((HBAptr = ((struct aic7xxx_host *) HBAptr->hostdata)->next) != NULL)) ! 99: { ! 100: if (HBAptr->host_no == hostno) ! 101: { ! 102: break; break; ! 103: } ! 104: } ! 105: ! 106: HBAptr = NULL; ! 107: } ! 108: } ! 109: ! 110: if (HBAptr == NULL) ! 111: { ! 112: size += sprintf(BLS, "Can't find adapter for host number %d\n", hostno); ! 113: len += size; pos = begin + len; size = 0; ! 114: goto stop_output; ! 115: } ! 116: ! 117: if (inout == TRUE) /* Has data been written to the file? */ ! 118: { ! 119: return (aic7xxx_set_info(buffer, length, HBAptr)); ! 120: } ! 121: ! 122: if (offset == 0) ! 123: { ! 124: memset(buff, 0, sizeof(buff)); ! 125: } ! 126: ! 127: p = (struct aic7xxx_host *) HBAptr->hostdata; ! 128: ! 129: size += sprintf(BLS, "Adaptec AIC7xxx driver version: "); ! 130: size += sprintf(BLS, "%s/", rcs_version(AIC7XXX_C_VERSION)); ! 131: size += sprintf(BLS, "%s/", rcs_version(AIC7XXX_H_VERSION)); ! 132: size += sprintf(BLS, "%s\n", rcs_version(AIC7XXX_SEQ_VER)); ! 133: len += size; pos = begin + len; size = 0; ! 134: ! 135: size += sprintf(BLS, "\n"); ! 136: size += sprintf(BLS, "Compile Options:\n"); ! 137: #ifdef AIC7XXX_RESET_DELAY ! 138: size += sprintf(BLS, " AIC7XXX_RESET_DELAY : %d\n", AIC7XXX_RESET_DELAY); ! 139: #endif ! 140: #ifdef AIC7XXX_TWIN_SUPPORT ! 141: size += sprintf(BLS, " AIC7XXX_TWIN_SUPPORT : Enabled\n"); ! 142: #else ! 143: size += sprintf(BLS, " AIC7XXX_TWIN_SUPPORT : Disabled\n"); ! 144: #endif ! 145: #ifdef AIC7XXX_TAGGED_QUEUEING ! 146: size += sprintf(BLS, " AIC7XXX_TAGGED_QUEUEING: Enabled\n"); ! 147: #else ! 148: size += sprintf(BLS, " AIC7XXX_TAGGED_QUEUEING: Disabled\n"); ! 149: #endif ! 150: #ifdef AIC7XXX_SHARE_IRQS ! 151: size += sprintf(BLS, " AIC7XXX_SHARE_IRQS : Enabled\n"); ! 152: #else ! 153: size += sprintf(BLS, " AIC7XXX_SHARE_IRQS : Disabled\n"); ! 154: #endif ! 155: #ifdef AIC7XXX_PROC_STATS ! 156: size += sprintf(BLS, " AIC7XXX_PROC_STATS : Enabled\n"); ! 157: #else ! 158: size += sprintf(BLS, " AIC7XXX_PROC_STATS : Disabled\n"); ! 159: #endif ! 160: len += size; pos = begin + len; size = 0; ! 161: ! 162: size += sprintf(BLS, "\n"); ! 163: size += sprintf(BLS, "Adapter Configuration:\n"); ! 164: size += sprintf(BLS, " SCSI Adapter: %s\n", board_names[p->type]); ! 165: size += sprintf(BLS, " Host Bus: %s\n", bus_name[p->bus_type]); ! 166: size += sprintf(BLS, " Base IO: %#.4x\n", p->base); ! 167: size += sprintf(BLS, " IRQ: %d\n", HBAptr->irq); ! 168: size += sprintf(BLS, " SCB: %d (%d)\n", p->numscb, p->maxscb); ! 169: size += sprintf(BLS, " Interrupts: %d", p->isr_count); ! 170: if (p->chip_type == AIC_777x) ! 171: { ! 172: size += sprintf(BLS, " %s\n", ! 173: (p->pause & IRQMS) ? "(Level Sensitive)" : "(Edge Triggered)"); ! 174: } ! 175: else ! 176: { ! 177: size += sprintf(BLS, "\n"); ! 178: } ! 179: size += sprintf(BLS, " Serial EEPROM: %s\n", ! 180: p->have_seeprom ? "True" : "False"); ! 181: size += sprintf(BLS, " Pause/Unpause: %#.2x/%#.2x\n", p->pause, ! 182: p->unpause); ! 183: size += sprintf(BLS, " Extended Translation: %sabled\n", ! 184: p->extended ? "En" : "Dis"); ! 185: size += sprintf(BLS, " SCSI Bus Reset: %sabled\n", ! 186: aic7xxx_no_reset ? "Dis" : "En"); ! 187: size += sprintf(BLS, " Ultra SCSI: %sabled\n", ! 188: p->ultra_enabled ? "En" : "Dis"); ! 189: len += size; pos = begin + len; size = 0; ! 190: ! 191: #ifdef AIC7XXX_PROC_STATS ! 192: { ! 193: struct aic7xxx_xferstats *sp; ! 194: int channel, target, lun; ! 195: ! 196: /* ! 197: * XXX: Need to fix this to avoid overflow... ! 198: */ ! 199: size += sprintf(BLS, "\n"); ! 200: size += sprintf(BLS, "Statistics:\n"); ! 201: for (channel = 0; channel < 2; channel++) ! 202: { ! 203: for (target = 0; target < 16; target++) ! 204: { ! 205: for (lun = 0; lun < 8; lun++) ! 206: { ! 207: sp = &p->stats[channel][target][lun]; ! 208: if (sp->xfers == 0) ! 209: { ! 210: continue; ! 211: } ! 212: size += sprintf(BLS, "CHAN#%c (TGT %d LUN %d):\n", ! 213: 'A' + channel, target, lun); ! 214: size += sprintf(BLS, "nxfers %ld (%ld read;%ld written)\n", ! 215: sp->xfers, sp->r_total, sp->w_total); ! 216: size += sprintf(BLS, "blks(512) rd=%ld; blks(512) wr=%ld\n", ! 217: sp->r_total512, sp->w_total512); ! 218: size += sprintf(BLS, "%s\n", HDRB); ! 219: size += sprintf(BLS, " Reads:"); ! 220: size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->r_bins[0], ! 221: sp->r_bins[1], sp->r_bins[2], sp->r_bins[3]); ! 222: size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->r_bins[4], ! 223: sp->r_bins[5], sp->r_bins[6], sp->r_bins[7]); ! 224: size += sprintf(BLS, "%6ld %6ld\n", sp->r_bins[8], ! 225: sp->r_bins[9]); ! 226: size += sprintf(BLS, "Writes:"); ! 227: size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->w_bins[0], ! 228: sp->w_bins[1], sp->w_bins[2], sp->w_bins[3]); ! 229: size += sprintf(BLS, "%6ld %6ld %6ld %6ld ", sp->w_bins[4], ! 230: sp->w_bins[5], sp->w_bins[6], sp->w_bins[7]); ! 231: size += sprintf(BLS, "%6ld %6ld\n", sp->w_bins[8], ! 232: sp->w_bins[9]); ! 233: size += sprintf(BLS, "\n"); ! 234: } ! 235: } ! 236: } ! 237: len += size; pos = begin + len; size = 0; ! 238: } ! 239: #endif /* AIC7XXX_PROC_STATS */ ! 240: ! 241: stop_output: ! 242: proc_debug("2pos: %ld offset: %ld len: %d\n", pos, offset, len); ! 243: *start = buffer + (offset - begin); /* Start of wanted data */ ! 244: len -= (offset - begin); /* Start slop */ ! 245: if (len > length) ! 246: { ! 247: len = length; /* Ending slop */ ! 248: } ! 249: proc_debug("3pos: %ld offset: %ld len: %d\n", pos, offset, len); ! 250: ! 251: return (len); ! 252: } ! 253: ! 254: /* ! 255: * Overrides for Emacs so that we follow Linus's tabbing style. ! 256: * Emacs will notice this stuff at the end of the file and automatically ! 257: * adjust the settings for this buffer only. This must remain at the end ! 258: * of the file. ! 259: * --------------------------------------------------------------------------- ! 260: * Local variables: ! 261: * c-indent-level: 2 ! 262: * c-brace-imaginary-offset: 0 ! 263: * c-brace-offset: -2 ! 264: * c-argdecl-indent: 2 ! 265: * c-label-offset: -2 ! 266: * c-continued-statement-offset: 2 ! 267: * c-continued-brace-offset: 0 ! 268: * indent-tabs-mode: nil ! 269: * tab-width: 8 ! 270: * End: ! 271: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.