|
|
1.1 root 1:
2: void swap_statistics(u8 *p)
3: {
4: u32 y;
5: u32 *lp, h_lp;
6: u16 *sp, h_sp;
7: u8 *bp;
8:
9: lp = (u32 *)p;
10: sp = ((short *)lp) + 1; /* Convert Header */
11: h_sp = *sp = ntohs(*sp);
12: lp++;
13:
14: do {
15: sp = (u16 *)lp; /* Convert SubHeader */
16: *sp = ntohs(*sp);
17: bp = (u8 *) lp;
18: y = *(bp + 3);
19: lp++;
20: for (h_lp = (u32)lp; (u32)lp < h_lp + ((u32)*(bp + 3)); lp++)
21: *lp = ntohl(*lp);
22: }while ((u32)lp < ((u32)p) + 4 + h_sp);
23:
24: }
25:
26: /*
27: * eata_set_info
28: * buffer : pointer to the data that has been written to the hostfile
29: * length : number of bytes written to the hostfile
30: * HBA_ptr: pointer to the Scsi_Host struct
31: */
32: int eata_set_info(char *buffer, int length, struct Scsi_Host *HBA_ptr)
33: {
34: int orig_length = length;
35:
36: if (length >= 8 && strncmp(buffer, "eata_dma", 8) == 0) {
37: buffer += 9;
38: length -= 9;
39: if(length >= 8 && strncmp(buffer, "latency", 7) == 0) {
40: SD(HBA_ptr)->do_latency = TRUE;
41: return(orig_length);
42: }
43:
44: if(length >=10 && strncmp(buffer, "nolatency", 9) == 0) {
45: SD(HBA_ptr)->do_latency = FALSE;
46: return(orig_length);
47: }
48:
49: printk("Unknown command:%s length: %d\n", buffer, length);
50: } else
51: printk("Wrong Signature:%10s\n", buffer);
52:
53: return(-EINVAL);
54: }
55:
56: /*
57: * eata_proc_info
58: * inout : decides on the direction of the dataflow and the meaning of the
59: * variables
60: * buffer: If inout==FALSE data is being written to it else read from it
61: * *start: If inout==FALSE start of the valid data in the buffer
62: * offset: If inout==FALSE offset from the beginning of the imaginary file
63: * from which we start writing into the buffer
64: * length: If inout==FALSE max number of bytes to be written into the buffer
65: * else number of bytes in the buffer
66: */
67: int eata_proc_info(char *buffer, char **start, off_t offset, int length,
68: int hostno, int inout)
69: {
70:
71: Scsi_Device *scd, SDev;
72: struct Scsi_Host *HBA_ptr;
73: Scsi_Cmnd scmd;
74: char cmnd[10];
75: static u8 buff[512];
76: static u8 buff2[512];
77: hst_cmd_stat *rhcs, *whcs;
78: coco *cc;
79: scsitrans *st;
80: scsimod *sm;
81: hobu *hb;
82: scbu *sb;
83: boty *bt;
84: memco *mc;
85: firm *fm;
86: subinf *si;
87: pcinf *pi;
88: arrlim *al;
89: int i, x;
90: int size, len = 0;
91: off_t begin = 0;
92: off_t pos = 0;
93: scd = NULL;
94:
95: HBA_ptr = first_HBA;
96: for (i = 1; i <= registered_HBAs; i++) {
97: if (HBA_ptr->host_no == hostno)
98: break;
99: HBA_ptr = SD(HBA_ptr)->next;
100: }
101:
102: if(inout == TRUE) /* Has data been written to the file ? */
103: return(eata_set_info(buffer, length, HBA_ptr));
104:
105: if (offset == 0)
106: memset(buff, 0, sizeof(buff));
107:
108: cc = (coco *) (buff + 0x148);
109: st = (scsitrans *)(buff + 0x164);
110: sm = (scsimod *) (buff + 0x16c);
111: hb = (hobu *) (buff + 0x172);
112: sb = (scbu *) (buff + 0x178);
113: bt = (boty *) (buff + 0x17e);
114: mc = (memco *) (buff + 0x186);
115: fm = (firm *) (buff + 0x18e);
116: si = (subinf *) (buff + 0x196);
117: pi = (pcinf *) (buff + 0x19c);
118: al = (arrlim *) (buff + 0x1a2);
119:
120: size = sprintf(buffer+len, "EATA (Extended Attachment) driver version: "
121: "%d.%d%s\n",VER_MAJOR, VER_MINOR, VER_SUB);
122: len += size; pos = begin + len;
123: size = sprintf(buffer + len, "queued commands: %10ld\n"
124: "processed interrupts:%10ld\n", queue_counter, int_counter);
125: len += size; pos = begin + len;
126:
127: size = sprintf(buffer + len, "\nscsi%-2d: HBA %.10s\n",
128: HBA_ptr->host_no, SD(HBA_ptr)->name);
129: len += size;
130: pos = begin + len;
131: size = sprintf(buffer + len, "Firmware revision: v%s\n",
132: SD(HBA_ptr)->revision);
133: len += size;
134: pos = begin + len;
135: size = sprintf(buffer + len, "Hardware Configuration:\n");
136: len += size;
137: pos = begin + len;
138:
139: if(SD(HBA_ptr)->broken_INQUIRY == TRUE) {
140: if (HBA_ptr->dma_channel == BUSMASTER)
141: size = sprintf(buffer + len, "DMA: BUSMASTER\n");
142: else
143: size = sprintf(buffer + len, "DMA: %d\n", HBA_ptr->dma_channel);
144: len += size;
145: pos = begin + len;
146:
147: size = sprintf(buffer + len, "Base IO : %#.4x\n", (u32) HBA_ptr->base);
148: len += size;
149: pos = begin + len;
150:
151: size = sprintf(buffer + len, "Host Bus: EISA\n");
152: len += size;
153: pos = begin + len;
154:
155: } else {
156: memset(&SDev, 0, sizeof(Scsi_Device));
157: memset(&scmd, 0, sizeof(Scsi_Cmnd));
158:
159: SDev.host = HBA_ptr;
160: SDev.id = HBA_ptr->this_id;
161: SDev.lun = 0;
162: SDev.channel = 0;
163:
164: cmnd[0] = LOG_SENSE;
165: cmnd[1] = 0;
166: cmnd[2] = 0x33 + (3<<6);
167: cmnd[3] = 0;
168: cmnd[4] = 0;
169: cmnd[5] = 0;
170: cmnd[6] = 0;
171: cmnd[7] = 0x00;
172: cmnd[8] = 0x66;
173: cmnd[9] = 0;
174:
175: scmd.cmd_len = 10;
176:
177: scmd.host = HBA_ptr;
178: scmd.device = &SDev;
179: scmd.target = HBA_ptr->this_id;
180: scmd.lun = 0;
181: scmd.channel = 0;
182: scmd.use_sg = 0;
183:
184: /*
185: * Do the command and wait for it to finish.
186: */
187: {
188: struct semaphore sem = MUTEX_LOCKED;
189: scmd.request.rq_status = RQ_SCSI_BUSY;
190: scmd.request.sem = &sem;
191: scsi_do_cmd (&scmd, cmnd, buff + 0x144, 0x66,
192: eata_scsi_done, 1 * HZ, 1);
193: down(&sem);
194: }
195:
196: size = sprintf(buffer + len, "IRQ: %2d, %s triggered\n", cc->interrupt,
197: (cc->intt == TRUE)?"level":"edge");
198: len += size;
199: pos = begin + len;
200: if (HBA_ptr->dma_channel == 0xff)
201: size = sprintf(buffer + len, "DMA: BUSMASTER\n");
202: else
203: size = sprintf(buffer + len, "DMA: %d\n", HBA_ptr->dma_channel);
204: len += size;
205: pos = begin + len;
206: size = sprintf(buffer + len, "CPU: MC680%02d %dMHz\n", bt->cpu_type,
207: bt->cpu_speed);
208: len += size;
209: pos = begin + len;
210: size = sprintf(buffer + len, "Base IO : %#.4x\n", (u32) HBA_ptr->base);
211: len += size;
212: pos = begin + len;
213: size = sprintf(buffer + len, "Host Bus: %s\n",
214: (SD(HBA_ptr)->bustype == IS_PCI)?"PCI ":
215: (SD(HBA_ptr)->bustype == IS_EISA)?"EISA":"ISA ");
216:
217: len += size;
218: pos = begin + len;
219: size = sprintf(buffer + len, "SCSI Bus:%s%s Speed: %sMB/sec. %s\n",
220: (sb->wide == TRUE)?" WIDE":"",
221: (sb->dif == TRUE)?" DIFFERENTIAL":"",
222: (sb->speed == 0)?"5":(sb->speed == 1)?"10":"20",
223: (sb->ext == TRUE)?"With external cable detection":"");
224: len += size;
225: pos = begin + len;
226: size = sprintf(buffer + len, "SCSI channel expansion Module: %s present\n",
227: (bt->sx1 == TRUE)?"SX1 (one channel)":
228: ((bt->sx2 == TRUE)?"SX2 (two channels)":"not"));
229: len += size;
230: pos = begin + len;
231: size = sprintf(buffer + len, "SmartRAID hardware: %spresent.\n",
232: (cc->srs == TRUE)?"":"not ");
233: len += size;
234: pos = begin + len;
235: size = sprintf(buffer + len, " Type: %s\n",
236: ((cc->key == TRUE)?((bt->dmi == TRUE)?"integrated"
237: :((bt->dm4 == TRUE)?"DM401X"
238: :(bt->dm4k == TRUE)?"DM4000"
239: :"-"))
240: :"-"));
241: len += size;
242: pos = begin + len;
243:
244: size = sprintf(buffer + len, " Max array groups: %d\n",
245: (al->code == 0x0e)?al->max_groups:7);
246: len += size;
247: pos = begin + len;
248: size = sprintf(buffer + len, " Max drives per RAID 0 array: %d\n",
249: (al->code == 0x0e)?al->raid0_drv:7);
250: len += size;
251: pos = begin + len;
252: size = sprintf(buffer + len, " Max drives per RAID 3/5 array: %d\n",
253: (al->code == 0x0e)?al->raid35_drv:7);
254: len += size;
255: pos = begin + len;
256: size = sprintf(buffer + len, "Cache Module: %spresent.\n",
257: (cc->csh)?"":"not ");
258: len += size;
259: pos = begin + len;
260: size = sprintf(buffer + len, " Type: %s\n",
261: ((cc->csh == TRUE)?((bt->cmi == TRUE)?"integrated"
262: :((bt->cm4 == TRUE)?"CM401X"
263: :((bt->cm4k == TRUE)?"CM4000"
264: :"-")))
265: :"-"));
266: len += size;
267: pos = begin + len;
268: for (x = 0; x <= 3; x++) {
269: size = sprintf(buffer + len, " Bank%d: %dMB with%s ECC\n",x,
270: mc->banksize[x] & 0x7f,
271: (mc->banksize[x] & 0x80)?"":"out");
272: len += size;
273: pos = begin + len;
274: }
275: size = sprintf(buffer + len, "Timer Mod.: %spresent\n",
276: (cc->tmr == TRUE)?"":"not ");
277: len += size;
278: pos = begin + len;
279: size = sprintf(buffer + len, "NVRAM : %spresent\n",
280: (cc->nvr == TRUE)?"":"not ");
281: len += size;
282: pos = begin + len;
283: size = sprintf(buffer + len, "SmartROM : %sabled\n",
284: (bt->srom == TRUE)?"dis":"en");
285: len += size;
286: pos = begin + len;
287: size = sprintf(buffer + len, "Alarm : %s\n",
288: (bt->alrm == TRUE)?"on":"off");
289: len += size;
290: pos = begin + len;
291:
292: if (pos < offset) {
293: len = 0;
294: begin = pos;
295: }
296: if (pos > offset + length)
297: goto stop_output;
298:
299: if(SD(HBA_ptr)->do_latency == FALSE) {
300:
301: cmnd[0] = LOG_SENSE;
302: cmnd[1] = 0;
303: cmnd[2] = 0x32 + (3<<6);
304: cmnd[3] = 0;
305: cmnd[4] = 0;
306: cmnd[5] = 0;
307: cmnd[6] = 0;
308: cmnd[7] = 0x01;
309: cmnd[8] = 0x44;
310: cmnd[9] = 0;
311:
312: scmd.cmd_len = 10;
313:
314: /*
315: * Do the command and wait for it to finish.
316: */
317: {
318: struct semaphore sem = MUTEX_LOCKED;
319: scmd.request.rq_status = RQ_SCSI_BUSY;
320: scmd.request.sem = &sem;
321: scsi_do_cmd (&scmd, cmnd, buff2, 0x144,
322: eata_scsi_done, 1 * HZ, 1);
323: down(&sem);
324: }
325:
326: swap_statistics(buff2);
327: rhcs = (hst_cmd_stat *)(buff2 + 0x2c);
328: whcs = (hst_cmd_stat *)(buff2 + 0x8c);
329:
330: for (x = 0; x <= 11; x++) {
331: SD(HBA_ptr)->reads[x] += rhcs->sizes[x];
332: SD(HBA_ptr)->writes[x] += whcs->sizes[x];
333: SD(HBA_ptr)->reads[12] += rhcs->sizes[x];
334: SD(HBA_ptr)->writes[12] += whcs->sizes[x];
335: }
336: size = sprintf(buffer + len, "Host<->Disk command statistics:\n"
337: " Reads: Writes:\n");
338: len += size;
339: pos = begin + len;
340: for (x = 0; x <= 10; x++) {
341: size = sprintf(buffer+len,"%5dk:%12u %12u\n", 1 << x,
342: SD(HBA_ptr)->reads[x],
343: SD(HBA_ptr)->writes[x]);
344: len += size;
345: pos = begin + len;
346: }
347: size = sprintf(buffer+len,">1024k:%12u %12u\n",
348: SD(HBA_ptr)->reads[11],
349: SD(HBA_ptr)->writes[11]);
350: len += size;
351: pos = begin + len;
352: size = sprintf(buffer+len,"Sum :%12u %12u\n",
353: SD(HBA_ptr)->reads[12],
354: SD(HBA_ptr)->writes[12]);
355: len += size;
356: pos = begin + len;
357: }
358: }
359:
360: if (pos < offset) {
361: len = 0;
362: begin = pos;
363: }
364: if (pos > offset + length)
365: goto stop_output;
366:
367: if(SD(HBA_ptr)->do_latency == TRUE) {
368: int factor = 1024/HZ;
369: size = sprintf(buffer + len, "Host Latency Command Statistics:\n"
370: "Current timer resolution: %2dms\n"
371: " Reads: Min:(ms) Max:(ms) Ave:(ms)\n",
372: factor);
373: len += size;
374: pos = begin + len;
375: for (x = 0; x <= 10; x++) {
376: size = sprintf(buffer+len,"%5dk:%12u %12u %12u %12u\n",
377: 1 << x,
378: SD(HBA_ptr)->reads_lat[x][0],
379: (SD(HBA_ptr)->reads_lat[x][1] == 0xffffffff)
380: ? 0:(SD(HBA_ptr)->reads_lat[x][1] * factor),
381: SD(HBA_ptr)->reads_lat[x][2] * factor,
382: SD(HBA_ptr)->reads_lat[x][3] * factor /
383: ((SD(HBA_ptr)->reads_lat[x][0])
384: ? SD(HBA_ptr)->reads_lat[x][0]:1));
385: len += size;
386: pos = begin + len;
387: }
388: size = sprintf(buffer+len,">1024k:%12u %12u %12u %12u\n",
389: SD(HBA_ptr)->reads_lat[11][0],
390: (SD(HBA_ptr)->reads_lat[11][1] == 0xffffffff)
391: ? 0:(SD(HBA_ptr)->reads_lat[11][1] * factor),
392: SD(HBA_ptr)->reads_lat[11][2] * factor,
393: SD(HBA_ptr)->reads_lat[11][3] * factor /
394: ((SD(HBA_ptr)->reads_lat[x][0])
395: ? SD(HBA_ptr)->reads_lat[x][0]:1));
396: len += size;
397: pos = begin + len;
398:
399: if (pos < offset) {
400: len = 0;
401: begin = pos;
402: }
403: if (pos > offset + length)
404: goto stop_output;
405:
406: size = sprintf(buffer + len,
407: " Writes: Min:(ms) Max:(ms) Ave:(ms)\n");
408: len += size;
409: pos = begin + len;
410: for (x = 0; x <= 10; x++) {
411: size = sprintf(buffer+len,"%5dk:%12u %12u %12u %12u\n",
412: 1 << x,
413: SD(HBA_ptr)->writes_lat[x][0],
414: (SD(HBA_ptr)->writes_lat[x][1] == 0xffffffff)
415: ? 0:(SD(HBA_ptr)->writes_lat[x][1] * factor),
416: SD(HBA_ptr)->writes_lat[x][2] * factor,
417: SD(HBA_ptr)->writes_lat[x][3] * factor /
418: ((SD(HBA_ptr)->writes_lat[x][0])
419: ? SD(HBA_ptr)->writes_lat[x][0]:1));
420: len += size;
421: pos = begin + len;
422: }
423: size = sprintf(buffer+len,">1024k:%12u %12u %12u %12u\n",
424: SD(HBA_ptr)->writes_lat[11][0],
425: (SD(HBA_ptr)->writes_lat[11][1] == 0xffffffff)
426: ? 0:(SD(HBA_ptr)->writes_lat[x][1] * factor),
427: SD(HBA_ptr)->writes_lat[11][2] * factor,
428: SD(HBA_ptr)->writes_lat[11][3] * factor /
429: ((SD(HBA_ptr)->writes_lat[x][0])
430: ? SD(HBA_ptr)->writes_lat[x][0]:1));
431: len += size;
432: pos = begin + len;
433:
434: if (pos < offset) {
435: len = 0;
436: begin = pos;
437: }
438: if (pos > offset + length)
439: goto stop_output;
440: }
441:
442: #if 0
443: scd = scsi_devices;
444:
445: size = sprintf(buffer+len,"Attached devices: %s\n", (scd)?"":"none");
446: len += size;
447: pos = begin + len;
448:
449: while (scd) {
450: if (scd->host == HBA_ptr) {
451: proc_print_scsidevice(scd, buffer, &size, len);
452: len += size;
453: pos = begin + len;
454:
455: if (pos < offset) {
456: len = 0;
457: begin = pos;
458: }
459: if (pos > offset + length)
460: goto stop_output;
461: }
462: scd = scd->next;
463: }
464: #endif
465:
466: stop_output:
467: DBG(DBG_PROC, printk("2pos: %ld offset: %ld len: %d\n", pos, offset, len));
468: *start=buffer+(offset-begin); /* Start of wanted data */
469: len-=(offset-begin); /* Start slop */
470: if(len>length)
471: len = length; /* Ending slop */
472: DBG(DBG_PROC, printk("3pos: %ld offset: %ld len: %d\n", pos, offset, len));
473:
474: return (len);
475: }
476:
477: /*
478: * Overrides for Emacs so that we follow Linus's tabbing style.
479: * Emacs will notice this stuff at the end of the file and automatically
480: * adjust the settings for this buffer only. This must remain at the end
481: * of the file.
482: * ---------------------------------------------------------------------------
483: * Local variables:
484: * c-indent-level: 4
485: * c-brace-imaginary-offset: 0
486: * c-brace-offset: -4
487: * c-argdecl-indent: 4
488: * c-label-offset: -4
489: * c-continued-statement-offset: 4
490: * c-continued-brace-offset: 0
491: * tab-width: 8
492: * End:
493: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.