This source file includes following definitions.
- swap_statistics
- eata_set_info
- eata_proc_info
1
2 #define MAX_SCSI_DEVICE_CODE 10
3 const char *const scsi_dev_types[MAX_SCSI_DEVICE_CODE] =
4 {
5 "Direct-Access ",
6 "Sequential-Access",
7 "Printer ",
8 "Processor ",
9 "WORM ",
10 "CD-ROM ",
11 "Scanner ",
12 "Optical Device ",
13 "Medium Changer ",
14 "Communications "
15 };
16
17
18 void swap_statistics(u8 *p)
19 {
20 u32 y;
21 u32 *lp, h_lp;
22 u16 *sp, h_sp;
23 u8 *bp;
24
25 lp = (u32 *)p;
26 sp = ((short *)lp) + 1;
27 h_sp = *sp = ntohs(*sp);
28 lp++;
29
30 do {
31 sp = (u16 *)lp;
32 *sp = ntohs(*sp);
33 bp = (u8 *) lp;
34 y = *(bp + 3);
35 lp++;
36 for (h_lp = (u32)lp; (u32)lp < h_lp + ((u32)*(bp + 3)); lp++)
37 *lp = ntohl(*lp);
38 }while ((u32)lp < ((u32)p) + 4 + h_sp);
39
40 }
41
42
43
44
45
46
47
48 int eata_set_info(char *buffer, int length, struct Scsi_Host *HBA_ptr)
49 {
50 DBG(DBG_PROC_WRITE, printk("%s\n", buffer));
51 return(-ENOSYS);
52 }
53
54
55
56
57
58
59
60
61
62
63
64
65 int eata_proc_info(char *buffer, char **start, off_t offset, int length,
66 int hostno, int inout)
67 {
68
69 Scsi_Device *scd;
70 struct Scsi_Host *HBA_ptr;
71 Scsi_Cmnd scmd;
72 static u8 buff[512];
73 static u8 buff2[512];
74 hst_cmd_stat *rhcs, *whcs;
75 coco *cc;
76 scsitrans *st;
77 scsimod *sm;
78 hobu *hb;
79 scbu *sb;
80 boty *bt;
81 memco *mc;
82 firm *fm;
83 subinf *si;
84 pcinf *pi;
85 arrlim *al;
86 int i, x;
87 int size, len = 0;
88 off_t begin = 0;
89 off_t pos = 0;
90
91 HBA_ptr = first_HBA;
92 for (i = 1; i <= registered_HBAs; i++) {
93 if (HBA_ptr->host_no == hostno)
94 break;
95 HBA_ptr = SD(HBA_ptr)->next;
96 }
97
98 if(inout == TRUE)
99 return(eata_set_info(buffer, length, HBA_ptr));
100
101 if (offset == 0)
102 memset(buff, 0, sizeof(buff));
103
104 cc = (coco *) (buff + 0x148);
105 st = (scsitrans *)(buff + 0x164);
106 sm = (scsimod *) (buff + 0x16c);
107 hb = (hobu *) (buff + 0x172);
108 sb = (scbu *) (buff + 0x178);
109 bt = (boty *) (buff + 0x17e);
110 mc = (memco *) (buff + 0x186);
111 fm = (firm *) (buff + 0x18e);
112 si = (subinf *) (buff + 0x196);
113 pi = (pcinf *) (buff + 0x19c);
114 al = (arrlim *) (buff + 0x1a2);
115
116 size = sprintf(buffer+len, "EATA (Extended Attachment) driver version: "
117 "%d.%d%s\n",VER_MAJOR, VER_MINOR, VER_SUB);
118 len += size; pos = begin + len;
119 size = sprintf(buffer + len, "queued commands: %10ld\n"
120 "processed interrupts:%10ld\n", queue_counter, int_counter);
121 len += size; pos = begin + len;
122
123 size = sprintf(buffer + len, "\nscsi%-2d: HBA %.10s\n",
124 HBA_ptr->host_no, SD(HBA_ptr)->name);
125 len += size;
126 pos = begin + len;
127 size = sprintf(buffer + len, "Firmware revision: v%s\n",
128 SD(HBA_ptr)->revision);
129 len += size;
130 pos = begin + len;
131 size = sprintf(buffer + len, "Hardware Configuration:\n");
132 len += size;
133 pos = begin + len;
134
135 if(SD(HBA_ptr)->bustype == IS_EISA) {
136 if (HBA_ptr->dma_channel == 0xff)
137 size = sprintf(buffer + len, "DMA: BUSMASTER\n");
138 else
139 size = sprintf(buffer + len, "DMA: %d\n", HBA_ptr->dma_channel);
140 len += size;
141 pos = begin + len;
142
143 size = sprintf(buffer + len, "Base IO : %#.4x\n", (u32) HBA_ptr->base);
144 len += size;
145 pos = begin + len;
146 size = sprintf(buffer + len, "Host Bus: EISA\n");
147 len += size;
148 pos = begin + len;
149 } else {
150
151 scmd.cmnd[0] = LOG_SENSE;
152 scmd.cmnd[1] = 0;
153 scmd.cmnd[2] = 0x33 + (3<<6);
154 scmd.cmnd[3] = 0;
155 scmd.cmnd[4] = 0;
156 scmd.cmnd[5] = 0;
157 scmd.cmnd[6] = 0;
158 scmd.cmnd[7] = 0x00;
159 scmd.cmnd[8] = 0x66;
160 scmd.cmnd[9] = 0;
161 scmd.cmd_len = 10;
162
163 scmd.host = HBA_ptr;
164 scmd.target = HBA_ptr->this_id;
165 scmd.lun = 0;
166 scmd.channel = 0;
167
168 scmd.use_sg = 0;
169 scmd.request_bufflen = 0x66;
170 scmd.request_buffer = buff + 0x144;
171 HBA_interpret = TRUE;
172
173 eata_queue(&scmd, (void *) eata_scsi_done);
174 while (internal_command_finished == FALSE)
175 barrier();
176
177 size = sprintf(buffer + len, "IRQ: %2d, %s triggered\n", cc->interrupt,
178 (cc->intt == TRUE)?"level":"edge");
179 len += size;
180 pos = begin + len;
181 if (HBA_ptr->dma_channel == 0xff)
182 size = sprintf(buffer + len, "DMA: BUSMASTER\n");
183 else
184 size = sprintf(buffer + len, "DMA: %d\n", HBA_ptr->dma_channel);
185 len += size;
186 pos = begin + len;
187 size = sprintf(buffer + len, "CPU: MC680%02d %dMHz\n", bt->cpu_type,
188 bt->cpu_speed);
189 len += size;
190 pos = begin + len;
191 size = sprintf(buffer + len, "Base IO : %#.4x\n", (u32) HBA_ptr->base);
192 len += size;
193 pos = begin + len;
194 size = sprintf(buffer + len, "Host Bus: %s\n",
195 (SD(HBA_ptr)->bustype == IS_PCI)?"PCI ":
196 (SD(HBA_ptr)->bustype == IS_EISA)?"EISA":"ISA ");
197
198 len += size;
199 pos = begin + len;
200 size = sprintf(buffer + len, "SCSI Bus:%s%s Speed: %sMB/sec. %s\n",
201 (sb->wide == TRUE)?" WIDE":"",
202 (sb->dif == TRUE)?" DIFFERENTIAL":"",
203 (sb->speed == 0)?"5":(sb->speed == 1)?"10":"20",
204 (sb->ext == TRUE)?"With external cable detection":"");
205 len += size;
206 pos = begin + len;
207 size = sprintf(buffer + len, "SCSI channel expansion Module: %s installed\n",
208 (bt->sx1 == TRUE)?"SX1 (one channel)":
209 ((bt->sx2 == TRUE)?"SX2 (two channels)":"not"));
210 len += size;
211 pos = begin + len;
212 size = sprintf(buffer + len, "SmartRAID hardware: %spresent.\n",
213 (cc->srs == TRUE)?"":"not ");
214 len += size;
215 pos = begin + len;
216 size = sprintf(buffer + len, " Type: %s\n",
217 ((cc->key == TRUE)?((bt->dmi == TRUE)?"integrated"
218 :((bt->dm4 == TRUE)?"DM401X"
219 :(bt->dm4k == TRUE)?"DM4000"
220 :"-"))
221 :"-"));
222 len += size;
223 pos = begin + len;
224
225 size = sprintf(buffer + len, " Max array groups: %d\n",
226 (al->code == 0x0e)?al->max_groups:7);
227 len += size;
228 pos = begin + len;
229 size = sprintf(buffer + len, " Max drives per RAID 0 array: %d\n",
230 (al->code == 0x0e)?al->raid0_drv:7);
231 len += size;
232 pos = begin + len;
233 size = sprintf(buffer + len, " Max drives per RAID 3/5 array: %d\n",
234 (al->code == 0x0e)?al->raid35_drv:7);
235 len += size;
236 pos = begin + len;
237 size = sprintf(buffer + len, "Cache Module: %sinstalled.\n",
238 (cc->csh)?"":"not ");
239 len += size;
240 pos = begin + len;
241 size = sprintf(buffer + len, " Type: %s\n",
242 ((cc->csh == TRUE)?((bt->cmi == TRUE)?"integrated"
243 :((bt->cm4 == TRUE)?"CM401X"
244 :((bt->cm4k == TRUE)?"CM4000"
245 :"-")))
246 :"-"));
247 len += size;
248 pos = begin + len;
249 for (x = 0; x <= 3; x++) {
250 size = sprintf(buffer + len, " Bank%d: %dMB with%s ECC\n",x,
251 mc->banksize[x] & 0x7f,
252 (mc->banksize[x] & 0x80)?"":"out");
253 len += size;
254 pos = begin + len;
255 }
256 size = sprintf(buffer + len, "Timer Modification: %sinstalled\n",
257 (cc->tmr == TRUE)?"":"not ");
258 len += size;
259 pos = begin + len;
260 size = sprintf(buffer + len, "NVRAM: %spresent\n",
261 (cc->nvr == TRUE)?"":"not ");
262 len += size;
263 pos = begin + len;
264 size = sprintf(buffer + len, "SmartROM: %senabled\n",
265 (bt->srom == TRUE)?"not ":"");
266 len += size;
267 pos = begin + len;
268 size = sprintf(buffer + len, "HBA indicates %salarm.\n",
269 (bt->alrm == TRUE)?"":"no ");
270 len += size;
271 pos = begin + len;
272
273 if (pos < offset) {
274 len = 0;
275 begin = pos;
276 }
277 if (pos > offset + length)
278 goto stop_output;
279
280 scmd.cmnd[0] = LOG_SENSE;
281 scmd.cmnd[1] = 0;
282 scmd.cmnd[2] = 0x32 + (3<<6);
283 scmd.cmnd[3] = 0;
284 scmd.cmnd[4] = 0;
285 scmd.cmnd[5] = 0;
286 scmd.cmnd[6] = 0;
287 scmd.cmnd[7] = 0x01;
288 scmd.cmnd[8] = 0x44;
289 scmd.cmnd[9] = 0;
290 scmd.cmd_len = 10;
291 scmd.host = HBA_ptr;
292 scmd.target = HBA_ptr->this_id;
293 scmd.lun = 0;
294 scmd.channel = 0;
295 scmd.use_sg = 0;
296 scmd.request_bufflen = 0x144;
297 scmd.request_buffer = buff2;
298 HBA_interpret = TRUE;
299
300 eata_queue(&scmd, (void *) eata_scsi_done);
301 while (internal_command_finished == FALSE)
302 barrier();
303
304 swap_statistics(buff2);
305 rhcs = (hst_cmd_stat *)(buff2 + 0x2c);
306 whcs = (hst_cmd_stat *)(buff2 + 0x8c);
307
308 for (x = 0; x <= 11; x++) {
309 SD(HBA_ptr)->reads[x] += rhcs->sizes[x];
310 SD(HBA_ptr)->writes[x] += whcs->sizes[x];
311 SD(HBA_ptr)->reads[12] += rhcs->sizes[x];
312 SD(HBA_ptr)->writes[12] += whcs->sizes[x];
313 }
314 size = sprintf(buffer + len, "Host Disk Command Statistics:\n"
315 " Reads: Writes:\n");
316 len += size;
317 pos = begin + len;
318 for (x = 0; x <= 10; x++) {
319 size = sprintf(buffer+len,"%5dk:%12u %12u\n", 1 << x,
320 SD(HBA_ptr)->reads[x],
321 SD(HBA_ptr)->writes[x]);
322 len += size;
323 pos = begin + len;
324 }
325 size = sprintf(buffer+len,">1024k:%12u %12u\n",
326 SD(HBA_ptr)->reads[11],
327 SD(HBA_ptr)->writes[11]);
328 len += size;
329 pos = begin + len;
330 size = sprintf(buffer+len,"Sum :%12u %12u\n",
331 SD(HBA_ptr)->reads[12],
332 SD(HBA_ptr)->writes[12]);
333 len += size;
334 pos = begin + len;
335 }
336
337 if (pos < offset) {
338 len = 0;
339 begin = pos;
340 }
341 if (pos > offset + length)
342 goto stop_output;
343
344 scd = scsi_devices;
345
346 size = sprintf(buffer+len,"Attached devices: %s\n", (scd)?"":"none");
347 len += size;
348 pos = begin + len;
349
350 while (scd) {
351 if (scd->host == HBA_ptr) {
352
353 size = sprintf(buffer + len, "Channel: %02d Id: %02d Lun: %02d\n Vendor: ",
354 scd->channel, scd->id, scd->lun);
355 for (x = 0; x < 8; x++) {
356 if (scd->vendor[x] >= 0x20)
357 size += sprintf(buffer + len + size, "%c", scd->vendor[x]);
358 else
359 size += sprintf(buffer + len + size," ");
360 }
361 size += sprintf(buffer + len + size, " Model: ");
362 for (x = 0; x < 16; x++) {
363 if (scd->model[x] >= 0x20)
364 size += sprintf(buffer + len + size, "%c", scd->model[x]);
365 else
366 size += sprintf(buffer + len + size, " ");
367 }
368 size += sprintf(buffer + len + size, " Rev: ");
369 for (x = 0; x < 4; x++) {
370 if (scd->rev[x] >= 0x20)
371 size += sprintf(buffer + len + size, "%c", scd->rev[x]);
372 else
373 size += sprintf(buffer + len + size, " ");
374 }
375 size += sprintf(buffer + len + size, "\n");
376
377 size += sprintf(buffer + len + size, " Type: %s ",
378 scd->type < MAX_SCSI_DEVICE_CODE ?
379 scsi_dev_types[(int)scd->type] : "Unknown " );
380 size += sprintf(buffer + len + size, " ANSI"
381 " SCSI revision: %02x", (scd->scsi_level < 3)?1:2);
382 if (scd->scsi_level == 2)
383 size += sprintf(buffer + len + size, " CCS\n");
384 else
385 size += sprintf(buffer + len + size, "\n");
386 len += size;
387 pos = begin + len;
388
389 if (pos < offset) {
390 len = 0;
391 begin = pos;
392 }
393 if (pos > offset + length)
394 goto stop_output;
395 }
396 scd = scd->next;
397 }
398
399 stop_output:
400 DBG(DBG_PROC, printk("2pos: %ld offset: %ld len: %d\n", pos, offset, len));
401 *start=buffer+(offset-begin);
402 len-=(offset-begin);
403 if(len>length)
404 len = length;
405 DBG(DBG_PROC, printk("3pos: %ld offset: %ld len: %d\n", pos, offset, len));
406
407 return (len);
408 }
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427