• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *	procfs handler for Linux I2O subsystem
3  *
4  *	(c) Copyright 1999	Deepak Saxena
5  *
6  *	Originally written by Deepak Saxena(deepak@plexity.net)
7  *
8  *	This program is free software; you can redistribute it and/or modify it
9  *	under the terms of the GNU General Public License as published by the
10  *	Free Software Foundation; either version 2 of the License, or (at your
11  *	option) any later version.
12  *
13  *	This is an initial test release. The code is based on the design of the
14  *	ide procfs system (drivers/block/ide-proc.c). Some code taken from
15  *	i2o-core module by Alan Cox.
16  *
17  *	DISCLAIMER: This code is still under development/test and may cause
18  *	your system to behave unpredictably.  Use at your own discretion.
19  *
20  *
21  *	Fixes/additions:
22  *		Juha Sievänen (Juha.Sievanen@cs.Helsinki.FI),
23  *		Auvo Häkkinen (Auvo.Hakkinen@cs.Helsinki.FI)
24  *		University of Helsinki, Department of Computer Science
25  *			LAN entries
26  *		Markus Lidel <Markus.Lidel@shadowconnect.com>
27  *			Changes for new I2O API
28  */
29 
30 #define OSM_NAME	"proc-osm"
31 #define OSM_VERSION	"1.316"
32 #define OSM_DESCRIPTION	"I2O ProcFS OSM"
33 
34 #define I2O_MAX_MODULES 4
35 // FIXME!
36 #define FMT_U64_HEX "0x%08x%08x"
37 #define U64_VAL(pu64) *((u32*)(pu64)+1), *((u32*)(pu64))
38 
39 #include <linux/types.h>
40 #include <linux/kernel.h>
41 #include <linux/pci.h>
42 #include <linux/i2o.h>
43 #include <linux/proc_fs.h>
44 #include <linux/seq_file.h>
45 #include <linux/init.h>
46 #include <linux/module.h>
47 #include <linux/errno.h>
48 #include <linux/spinlock.h>
49 #include <linux/workqueue.h>
50 
51 #include <asm/io.h>
52 #include <asm/uaccess.h>
53 #include <asm/byteorder.h>
54 
55 /* Structure used to define /proc entries */
56 typedef struct _i2o_proc_entry_t {
57 	char *name;		/* entry name */
58 	mode_t mode;		/* mode */
59 	const struct file_operations *fops;	/* open function */
60 } i2o_proc_entry;
61 
62 /* global I2O /proc/i2o entry */
63 static struct proc_dir_entry *i2o_proc_dir_root;
64 
65 /* proc OSM driver struct */
66 static struct i2o_driver i2o_proc_driver = {
67 	.name = OSM_NAME,
68 };
69 
print_serial_number(struct seq_file * seq,u8 * serialno,int max_len)70 static int print_serial_number(struct seq_file *seq, u8 * serialno, int max_len)
71 {
72 	int i;
73 
74 	/* 19990419 -sralston
75 	 *      The I2O v1.5 (and v2.0 so far) "official specification"
76 	 *      got serial numbers WRONG!
77 	 *      Apparently, and despite what Section 3.4.4 says and
78 	 *      Figure 3-35 shows (pg 3-39 in the pdf doc),
79 	 *      the convention / consensus seems to be:
80 	 *        + First byte is SNFormat
81 	 *        + Second byte is SNLen (but only if SNFormat==7 (?))
82 	 *        + (v2.0) SCSI+BS may use IEEE Registered (64 or 128 bit) format
83 	 */
84 	switch (serialno[0]) {
85 	case I2O_SNFORMAT_BINARY:	/* Binary */
86 		seq_printf(seq, "0x");
87 		for (i = 0; i < serialno[1]; i++) {
88 			seq_printf(seq, "%02X", serialno[2 + i]);
89 		}
90 		break;
91 
92 	case I2O_SNFORMAT_ASCII:	/* ASCII */
93 		if (serialno[1] < ' ') {	/* printable or SNLen? */
94 			/* sanity */
95 			max_len =
96 			    (max_len < serialno[1]) ? max_len : serialno[1];
97 			serialno[1 + max_len] = '\0';
98 
99 			/* just print it */
100 			seq_printf(seq, "%s", &serialno[2]);
101 		} else {
102 			/* print chars for specified length */
103 			for (i = 0; i < serialno[1]; i++) {
104 				seq_printf(seq, "%c", serialno[2 + i]);
105 			}
106 		}
107 		break;
108 
109 	case I2O_SNFORMAT_UNICODE:	/* UNICODE */
110 		seq_printf(seq, "UNICODE Format.  Can't Display\n");
111 		break;
112 
113 	case I2O_SNFORMAT_LAN48_MAC:	/* LAN-48 MAC Address */
114 		seq_printf(seq,
115 			   "LAN-48 MAC address @ %02X:%02X:%02X:%02X:%02X:%02X",
116 			   serialno[2], serialno[3],
117 			   serialno[4], serialno[5], serialno[6], serialno[7]);
118 		break;
119 
120 	case I2O_SNFORMAT_WAN:	/* WAN MAC Address */
121 		/* FIXME: Figure out what a WAN access address looks like?? */
122 		seq_printf(seq, "WAN Access Address");
123 		break;
124 
125 /* plus new in v2.0 */
126 	case I2O_SNFORMAT_LAN64_MAC:	/* LAN-64 MAC Address */
127 		/* FIXME: Figure out what a LAN-64 address really looks like?? */
128 		seq_printf(seq,
129 			   "LAN-64 MAC address @ [?:%02X:%02X:?] %02X:%02X:%02X:%02X:%02X:%02X",
130 			   serialno[8], serialno[9],
131 			   serialno[2], serialno[3],
132 			   serialno[4], serialno[5], serialno[6], serialno[7]);
133 		break;
134 
135 	case I2O_SNFORMAT_DDM:	/* I2O DDM */
136 		seq_printf(seq,
137 			   "DDM: Tid=%03Xh, Rsvd=%04Xh, OrgId=%04Xh",
138 			   *(u16 *) & serialno[2],
139 			   *(u16 *) & serialno[4], *(u16 *) & serialno[6]);
140 		break;
141 
142 	case I2O_SNFORMAT_IEEE_REG64:	/* IEEE Registered (64-bit) */
143 	case I2O_SNFORMAT_IEEE_REG128:	/* IEEE Registered (128-bit) */
144 		/* FIXME: Figure if this is even close?? */
145 		seq_printf(seq,
146 			   "IEEE NodeName(hi,lo)=(%08Xh:%08Xh), PortName(hi,lo)=(%08Xh:%08Xh)\n",
147 			   *(u32 *) & serialno[2],
148 			   *(u32 *) & serialno[6],
149 			   *(u32 *) & serialno[10], *(u32 *) & serialno[14]);
150 		break;
151 
152 	case I2O_SNFORMAT_UNKNOWN:	/* Unknown 0    */
153 	case I2O_SNFORMAT_UNKNOWN2:	/* Unknown 0xff */
154 	default:
155 		seq_printf(seq, "Unknown data format (0x%02x)", serialno[0]);
156 		break;
157 	}
158 
159 	return 0;
160 }
161 
162 /**
163  *	i2o_get_class_name - 	do i2o class name lookup
164  *	@class: class number
165  *
166  *	Return a descriptive string for an i2o class.
167  */
i2o_get_class_name(int class)168 static const char *i2o_get_class_name(int class)
169 {
170 	int idx = 16;
171 	static char *i2o_class_name[] = {
172 		"Executive",
173 		"Device Driver Module",
174 		"Block Device",
175 		"Tape Device",
176 		"LAN Interface",
177 		"WAN Interface",
178 		"Fibre Channel Port",
179 		"Fibre Channel Device",
180 		"SCSI Device",
181 		"ATE Port",
182 		"ATE Device",
183 		"Floppy Controller",
184 		"Floppy Device",
185 		"Secondary Bus Port",
186 		"Peer Transport Agent",
187 		"Peer Transport",
188 		"Unknown"
189 	};
190 
191 	switch (class & 0xfff) {
192 	case I2O_CLASS_EXECUTIVE:
193 		idx = 0;
194 		break;
195 	case I2O_CLASS_DDM:
196 		idx = 1;
197 		break;
198 	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
199 		idx = 2;
200 		break;
201 	case I2O_CLASS_SEQUENTIAL_STORAGE:
202 		idx = 3;
203 		break;
204 	case I2O_CLASS_LAN:
205 		idx = 4;
206 		break;
207 	case I2O_CLASS_WAN:
208 		idx = 5;
209 		break;
210 	case I2O_CLASS_FIBRE_CHANNEL_PORT:
211 		idx = 6;
212 		break;
213 	case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
214 		idx = 7;
215 		break;
216 	case I2O_CLASS_SCSI_PERIPHERAL:
217 		idx = 8;
218 		break;
219 	case I2O_CLASS_ATE_PORT:
220 		idx = 9;
221 		break;
222 	case I2O_CLASS_ATE_PERIPHERAL:
223 		idx = 10;
224 		break;
225 	case I2O_CLASS_FLOPPY_CONTROLLER:
226 		idx = 11;
227 		break;
228 	case I2O_CLASS_FLOPPY_DEVICE:
229 		idx = 12;
230 		break;
231 	case I2O_CLASS_BUS_ADAPTER:
232 		idx = 13;
233 		break;
234 	case I2O_CLASS_PEER_TRANSPORT_AGENT:
235 		idx = 14;
236 		break;
237 	case I2O_CLASS_PEER_TRANSPORT:
238 		idx = 15;
239 		break;
240 	}
241 
242 	return i2o_class_name[idx];
243 }
244 
245 #define SCSI_TABLE_SIZE	13
246 static char *scsi_devices[] = {
247 	"Direct-Access Read/Write",
248 	"Sequential-Access Storage",
249 	"Printer",
250 	"Processor",
251 	"WORM Device",
252 	"CD-ROM Device",
253 	"Scanner Device",
254 	"Optical Memory Device",
255 	"Medium Changer Device",
256 	"Communications Device",
257 	"Graphics Art Pre-Press Device",
258 	"Graphics Art Pre-Press Device",
259 	"Array Controller Device"
260 };
261 
chtostr(u8 * chars,int n)262 static char *chtostr(u8 * chars, int n)
263 {
264 	char tmp[256];
265 	tmp[0] = 0;
266 	return strncat(tmp, (char *)chars, n);
267 }
268 
i2o_report_query_status(struct seq_file * seq,int block_status,char * group)269 static int i2o_report_query_status(struct seq_file *seq, int block_status,
270 				   char *group)
271 {
272 	switch (block_status) {
273 	case -ETIMEDOUT:
274 		return seq_printf(seq, "Timeout reading group %s.\n", group);
275 	case -ENOMEM:
276 		return seq_printf(seq, "No free memory to read the table.\n");
277 	case -I2O_PARAMS_STATUS_INVALID_GROUP_ID:
278 		return seq_printf(seq, "Group %s not supported.\n", group);
279 	default:
280 		return seq_printf(seq,
281 				  "Error reading group %s. BlockStatus 0x%02X\n",
282 				  group, -block_status);
283 	}
284 }
285 
286 static char *bus_strings[] = {
287 	"Local Bus",
288 	"ISA",
289 	"EISA",
290 	"MCA",
291 	"PCI",
292 	"PCMCIA",
293 	"NUBUS",
294 	"CARDBUS"
295 };
296 
i2o_seq_show_hrt(struct seq_file * seq,void * v)297 static int i2o_seq_show_hrt(struct seq_file *seq, void *v)
298 {
299 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
300 	i2o_hrt *hrt = (i2o_hrt *) c->hrt.virt;
301 	u32 bus;
302 	int i;
303 
304 	if (hrt->hrt_version) {
305 		seq_printf(seq,
306 			   "HRT table for controller is too new a version.\n");
307 		return 0;
308 	}
309 
310 	seq_printf(seq, "HRT has %d entries of %d bytes each.\n",
311 		   hrt->num_entries, hrt->entry_len << 2);
312 
313 	for (i = 0; i < hrt->num_entries; i++) {
314 		seq_printf(seq, "Entry %d:\n", i);
315 		seq_printf(seq, "   Adapter ID: %0#10x\n",
316 			   hrt->hrt_entry[i].adapter_id);
317 		seq_printf(seq, "   Controlling tid: %0#6x\n",
318 			   hrt->hrt_entry[i].parent_tid);
319 
320 		if (hrt->hrt_entry[i].bus_type != 0x80) {
321 			bus = hrt->hrt_entry[i].bus_type;
322 			seq_printf(seq, "   %s Information\n",
323 				   bus_strings[bus]);
324 
325 			switch (bus) {
326 			case I2O_BUS_LOCAL:
327 				seq_printf(seq, "     IOBase: %0#6x,",
328 					   hrt->hrt_entry[i].bus.local_bus.
329 					   LbBaseIOPort);
330 				seq_printf(seq, " MemoryBase: %0#10x\n",
331 					   hrt->hrt_entry[i].bus.local_bus.
332 					   LbBaseMemoryAddress);
333 				break;
334 
335 			case I2O_BUS_ISA:
336 				seq_printf(seq, "     IOBase: %0#6x,",
337 					   hrt->hrt_entry[i].bus.isa_bus.
338 					   IsaBaseIOPort);
339 				seq_printf(seq, " MemoryBase: %0#10x,",
340 					   hrt->hrt_entry[i].bus.isa_bus.
341 					   IsaBaseMemoryAddress);
342 				seq_printf(seq, " CSN: %0#4x,",
343 					   hrt->hrt_entry[i].bus.isa_bus.CSN);
344 				break;
345 
346 			case I2O_BUS_EISA:
347 				seq_printf(seq, "     IOBase: %0#6x,",
348 					   hrt->hrt_entry[i].bus.eisa_bus.
349 					   EisaBaseIOPort);
350 				seq_printf(seq, " MemoryBase: %0#10x,",
351 					   hrt->hrt_entry[i].bus.eisa_bus.
352 					   EisaBaseMemoryAddress);
353 				seq_printf(seq, " Slot: %0#4x,",
354 					   hrt->hrt_entry[i].bus.eisa_bus.
355 					   EisaSlotNumber);
356 				break;
357 
358 			case I2O_BUS_MCA:
359 				seq_printf(seq, "     IOBase: %0#6x,",
360 					   hrt->hrt_entry[i].bus.mca_bus.
361 					   McaBaseIOPort);
362 				seq_printf(seq, " MemoryBase: %0#10x,",
363 					   hrt->hrt_entry[i].bus.mca_bus.
364 					   McaBaseMemoryAddress);
365 				seq_printf(seq, " Slot: %0#4x,",
366 					   hrt->hrt_entry[i].bus.mca_bus.
367 					   McaSlotNumber);
368 				break;
369 
370 			case I2O_BUS_PCI:
371 				seq_printf(seq, "     Bus: %0#4x",
372 					   hrt->hrt_entry[i].bus.pci_bus.
373 					   PciBusNumber);
374 				seq_printf(seq, " Dev: %0#4x",
375 					   hrt->hrt_entry[i].bus.pci_bus.
376 					   PciDeviceNumber);
377 				seq_printf(seq, " Func: %0#4x",
378 					   hrt->hrt_entry[i].bus.pci_bus.
379 					   PciFunctionNumber);
380 				seq_printf(seq, " Vendor: %0#6x",
381 					   hrt->hrt_entry[i].bus.pci_bus.
382 					   PciVendorID);
383 				seq_printf(seq, " Device: %0#6x\n",
384 					   hrt->hrt_entry[i].bus.pci_bus.
385 					   PciDeviceID);
386 				break;
387 
388 			default:
389 				seq_printf(seq, "      Unsupported Bus Type\n");
390 			}
391 		} else
392 			seq_printf(seq, "   Unknown Bus Type\n");
393 	}
394 
395 	return 0;
396 }
397 
i2o_seq_show_lct(struct seq_file * seq,void * v)398 static int i2o_seq_show_lct(struct seq_file *seq, void *v)
399 {
400 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
401 	i2o_lct *lct = (i2o_lct *) c->lct;
402 	int entries;
403 	int i;
404 
405 #define BUS_TABLE_SIZE 3
406 	static char *bus_ports[] = {
407 		"Generic Bus",
408 		"SCSI Bus",
409 		"Fibre Channel Bus"
410 	};
411 
412 	entries = (lct->table_size - 3) / 9;
413 
414 	seq_printf(seq, "LCT contains %d %s\n", entries,
415 		   entries == 1 ? "entry" : "entries");
416 	if (lct->boot_tid)
417 		seq_printf(seq, "Boot Device @ ID %d\n", lct->boot_tid);
418 
419 	seq_printf(seq, "Current Change Indicator: %#10x\n", lct->change_ind);
420 
421 	for (i = 0; i < entries; i++) {
422 		seq_printf(seq, "Entry %d\n", i);
423 		seq_printf(seq, "  Class, SubClass  : %s",
424 			   i2o_get_class_name(lct->lct_entry[i].class_id));
425 
426 		/*
427 		 *      Classes which we'll print subclass info for
428 		 */
429 		switch (lct->lct_entry[i].class_id & 0xFFF) {
430 		case I2O_CLASS_RANDOM_BLOCK_STORAGE:
431 			switch (lct->lct_entry[i].sub_class) {
432 			case 0x00:
433 				seq_printf(seq, ", Direct-Access Read/Write");
434 				break;
435 
436 			case 0x04:
437 				seq_printf(seq, ", WORM Drive");
438 				break;
439 
440 			case 0x05:
441 				seq_printf(seq, ", CD-ROM Drive");
442 				break;
443 
444 			case 0x07:
445 				seq_printf(seq, ", Optical Memory Device");
446 				break;
447 
448 			default:
449 				seq_printf(seq, ", Unknown (0x%02x)",
450 					   lct->lct_entry[i].sub_class);
451 				break;
452 			}
453 			break;
454 
455 		case I2O_CLASS_LAN:
456 			switch (lct->lct_entry[i].sub_class & 0xFF) {
457 			case 0x30:
458 				seq_printf(seq, ", Ethernet");
459 				break;
460 
461 			case 0x40:
462 				seq_printf(seq, ", 100base VG");
463 				break;
464 
465 			case 0x50:
466 				seq_printf(seq, ", IEEE 802.5/Token-Ring");
467 				break;
468 
469 			case 0x60:
470 				seq_printf(seq, ", ANSI X3T9.5 FDDI");
471 				break;
472 
473 			case 0x70:
474 				seq_printf(seq, ", Fibre Channel");
475 				break;
476 
477 			default:
478 				seq_printf(seq, ", Unknown Sub-Class (0x%02x)",
479 					   lct->lct_entry[i].sub_class & 0xFF);
480 				break;
481 			}
482 			break;
483 
484 		case I2O_CLASS_SCSI_PERIPHERAL:
485 			if (lct->lct_entry[i].sub_class < SCSI_TABLE_SIZE)
486 				seq_printf(seq, ", %s",
487 					   scsi_devices[lct->lct_entry[i].
488 							sub_class]);
489 			else
490 				seq_printf(seq, ", Unknown Device Type");
491 			break;
492 
493 		case I2O_CLASS_BUS_ADAPTER:
494 			if (lct->lct_entry[i].sub_class < BUS_TABLE_SIZE)
495 				seq_printf(seq, ", %s",
496 					   bus_ports[lct->lct_entry[i].
497 						     sub_class]);
498 			else
499 				seq_printf(seq, ", Unknown Bus Type");
500 			break;
501 		}
502 		seq_printf(seq, "\n");
503 
504 		seq_printf(seq, "  Local TID        : 0x%03x\n",
505 			   lct->lct_entry[i].tid);
506 		seq_printf(seq, "  User TID         : 0x%03x\n",
507 			   lct->lct_entry[i].user_tid);
508 		seq_printf(seq, "  Parent TID       : 0x%03x\n",
509 			   lct->lct_entry[i].parent_tid);
510 		seq_printf(seq, "  Identity Tag     : 0x%x%x%x%x%x%x%x%x\n",
511 			   lct->lct_entry[i].identity_tag[0],
512 			   lct->lct_entry[i].identity_tag[1],
513 			   lct->lct_entry[i].identity_tag[2],
514 			   lct->lct_entry[i].identity_tag[3],
515 			   lct->lct_entry[i].identity_tag[4],
516 			   lct->lct_entry[i].identity_tag[5],
517 			   lct->lct_entry[i].identity_tag[6],
518 			   lct->lct_entry[i].identity_tag[7]);
519 		seq_printf(seq, "  Change Indicator : %0#10x\n",
520 			   lct->lct_entry[i].change_ind);
521 		seq_printf(seq, "  Event Capab Mask : %0#10x\n",
522 			   lct->lct_entry[i].device_flags);
523 	}
524 
525 	return 0;
526 }
527 
i2o_seq_show_status(struct seq_file * seq,void * v)528 static int i2o_seq_show_status(struct seq_file *seq, void *v)
529 {
530 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
531 	char prodstr[25];
532 	int version;
533 	i2o_status_block *sb = c->status_block.virt;
534 
535 	i2o_status_get(c);	// reread the status block
536 
537 	seq_printf(seq, "Organization ID        : %0#6x\n", sb->org_id);
538 
539 	version = sb->i2o_version;
540 
541 /* FIXME for Spec 2.0
542 	if (version == 0x02) {
543 		seq_printf(seq, "Lowest I2O version supported: ");
544 		switch(workspace[2]) {
545 			case 0x00:
546 				seq_printf(seq, "1.0\n");
547 				break;
548 			case 0x01:
549 				seq_printf(seq, "1.5\n");
550 				break;
551 			case 0x02:
552 				seq_printf(seq, "2.0\n");
553 				break;
554 		}
555 
556 		seq_printf(seq, "Highest I2O version supported: ");
557 		switch(workspace[3]) {
558 			case 0x00:
559 				seq_printf(seq, "1.0\n");
560 				break;
561 			case 0x01:
562 				seq_printf(seq, "1.5\n");
563 				break;
564 			case 0x02:
565 				seq_printf(seq, "2.0\n");
566 				break;
567 		}
568 	}
569 */
570 	seq_printf(seq, "IOP ID                 : %0#5x\n", sb->iop_id);
571 	seq_printf(seq, "Host Unit ID           : %0#6x\n", sb->host_unit_id);
572 	seq_printf(seq, "Segment Number         : %0#5x\n", sb->segment_number);
573 
574 	seq_printf(seq, "I2O version            : ");
575 	switch (version) {
576 	case 0x00:
577 		seq_printf(seq, "1.0\n");
578 		break;
579 	case 0x01:
580 		seq_printf(seq, "1.5\n");
581 		break;
582 	case 0x02:
583 		seq_printf(seq, "2.0\n");
584 		break;
585 	default:
586 		seq_printf(seq, "Unknown version\n");
587 	}
588 
589 	seq_printf(seq, "IOP State              : ");
590 	switch (sb->iop_state) {
591 	case 0x01:
592 		seq_printf(seq, "INIT\n");
593 		break;
594 
595 	case 0x02:
596 		seq_printf(seq, "RESET\n");
597 		break;
598 
599 	case 0x04:
600 		seq_printf(seq, "HOLD\n");
601 		break;
602 
603 	case 0x05:
604 		seq_printf(seq, "READY\n");
605 		break;
606 
607 	case 0x08:
608 		seq_printf(seq, "OPERATIONAL\n");
609 		break;
610 
611 	case 0x10:
612 		seq_printf(seq, "FAILED\n");
613 		break;
614 
615 	case 0x11:
616 		seq_printf(seq, "FAULTED\n");
617 		break;
618 
619 	default:
620 		seq_printf(seq, "Unknown\n");
621 		break;
622 	}
623 
624 	seq_printf(seq, "Messenger Type         : ");
625 	switch (sb->msg_type) {
626 	case 0x00:
627 		seq_printf(seq, "Memory mapped\n");
628 		break;
629 	case 0x01:
630 		seq_printf(seq, "Memory mapped only\n");
631 		break;
632 	case 0x02:
633 		seq_printf(seq, "Remote only\n");
634 		break;
635 	case 0x03:
636 		seq_printf(seq, "Memory mapped and remote\n");
637 		break;
638 	default:
639 		seq_printf(seq, "Unknown\n");
640 	}
641 
642 	seq_printf(seq, "Inbound Frame Size     : %d bytes\n",
643 		   sb->inbound_frame_size << 2);
644 	seq_printf(seq, "Max Inbound Frames     : %d\n",
645 		   sb->max_inbound_frames);
646 	seq_printf(seq, "Current Inbound Frames : %d\n",
647 		   sb->cur_inbound_frames);
648 	seq_printf(seq, "Max Outbound Frames    : %d\n",
649 		   sb->max_outbound_frames);
650 
651 	/* Spec doesn't say if NULL terminated or not... */
652 	memcpy(prodstr, sb->product_id, 24);
653 	prodstr[24] = '\0';
654 	seq_printf(seq, "Product ID             : %s\n", prodstr);
655 	seq_printf(seq, "Expected LCT Size      : %d bytes\n",
656 		   sb->expected_lct_size);
657 
658 	seq_printf(seq, "IOP Capabilities\n");
659 	seq_printf(seq, "    Context Field Size Support : ");
660 	switch (sb->iop_capabilities & 0x0000003) {
661 	case 0:
662 		seq_printf(seq, "Supports only 32-bit context fields\n");
663 		break;
664 	case 1:
665 		seq_printf(seq, "Supports only 64-bit context fields\n");
666 		break;
667 	case 2:
668 		seq_printf(seq, "Supports 32-bit and 64-bit context fields, "
669 			   "but not concurrently\n");
670 		break;
671 	case 3:
672 		seq_printf(seq, "Supports 32-bit and 64-bit context fields "
673 			   "concurrently\n");
674 		break;
675 	default:
676 		seq_printf(seq, "0x%08x\n", sb->iop_capabilities);
677 	}
678 	seq_printf(seq, "    Current Context Field Size : ");
679 	switch (sb->iop_capabilities & 0x0000000C) {
680 	case 0:
681 		seq_printf(seq, "not configured\n");
682 		break;
683 	case 4:
684 		seq_printf(seq, "Supports only 32-bit context fields\n");
685 		break;
686 	case 8:
687 		seq_printf(seq, "Supports only 64-bit context fields\n");
688 		break;
689 	case 12:
690 		seq_printf(seq, "Supports both 32-bit or 64-bit context fields "
691 			   "concurrently\n");
692 		break;
693 	default:
694 		seq_printf(seq, "\n");
695 	}
696 	seq_printf(seq, "    Inbound Peer Support       : %s\n",
697 		   (sb->
698 		    iop_capabilities & 0x00000010) ? "Supported" :
699 		   "Not supported");
700 	seq_printf(seq, "    Outbound Peer Support      : %s\n",
701 		   (sb->
702 		    iop_capabilities & 0x00000020) ? "Supported" :
703 		   "Not supported");
704 	seq_printf(seq, "    Peer to Peer Support       : %s\n",
705 		   (sb->
706 		    iop_capabilities & 0x00000040) ? "Supported" :
707 		   "Not supported");
708 
709 	seq_printf(seq, "Desired private memory size   : %d kB\n",
710 		   sb->desired_mem_size >> 10);
711 	seq_printf(seq, "Allocated private memory size : %d kB\n",
712 		   sb->current_mem_size >> 10);
713 	seq_printf(seq, "Private memory base address   : %0#10x\n",
714 		   sb->current_mem_base);
715 	seq_printf(seq, "Desired private I/O size      : %d kB\n",
716 		   sb->desired_io_size >> 10);
717 	seq_printf(seq, "Allocated private I/O size    : %d kB\n",
718 		   sb->current_io_size >> 10);
719 	seq_printf(seq, "Private I/O base address      : %0#10x\n",
720 		   sb->current_io_base);
721 
722 	return 0;
723 }
724 
i2o_seq_show_hw(struct seq_file * seq,void * v)725 static int i2o_seq_show_hw(struct seq_file *seq, void *v)
726 {
727 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
728 	static u32 work32[5];
729 	static u8 *work8 = (u8 *) work32;
730 	static u16 *work16 = (u16 *) work32;
731 	int token;
732 	u32 hwcap;
733 
734 	static char *cpu_table[] = {
735 		"Intel 80960 series",
736 		"AMD2900 series",
737 		"Motorola 68000 series",
738 		"ARM series",
739 		"MIPS series",
740 		"Sparc series",
741 		"PowerPC series",
742 		"Intel x86 series"
743 	};
744 
745 	token =
746 	    i2o_parm_field_get(c->exec, 0x0000, -1, &work32, sizeof(work32));
747 
748 	if (token < 0) {
749 		i2o_report_query_status(seq, token, "0x0000 IOP Hardware");
750 		return 0;
751 	}
752 
753 	seq_printf(seq, "I2O Vendor ID    : %0#6x\n", work16[0]);
754 	seq_printf(seq, "Product ID       : %0#6x\n", work16[1]);
755 	seq_printf(seq, "CPU              : ");
756 	if (work8[16] > 8)
757 		seq_printf(seq, "Unknown\n");
758 	else
759 		seq_printf(seq, "%s\n", cpu_table[work8[16]]);
760 	/* Anyone using ProcessorVersion? */
761 
762 	seq_printf(seq, "RAM              : %dkB\n", work32[1] >> 10);
763 	seq_printf(seq, "Non-Volatile Mem : %dkB\n", work32[2] >> 10);
764 
765 	hwcap = work32[3];
766 	seq_printf(seq, "Capabilities : 0x%08x\n", hwcap);
767 	seq_printf(seq, "   [%s] Self booting\n",
768 		   (hwcap & 0x00000001) ? "+" : "-");
769 	seq_printf(seq, "   [%s] Upgradable IRTOS\n",
770 		   (hwcap & 0x00000002) ? "+" : "-");
771 	seq_printf(seq, "   [%s] Supports downloading DDMs\n",
772 		   (hwcap & 0x00000004) ? "+" : "-");
773 	seq_printf(seq, "   [%s] Supports installing DDMs\n",
774 		   (hwcap & 0x00000008) ? "+" : "-");
775 	seq_printf(seq, "   [%s] Battery-backed RAM\n",
776 		   (hwcap & 0x00000010) ? "+" : "-");
777 
778 	return 0;
779 }
780 
781 /* Executive group 0003h - Executing DDM List (table) */
i2o_seq_show_ddm_table(struct seq_file * seq,void * v)782 static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)
783 {
784 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
785 	int token;
786 	int i;
787 
788 	typedef struct _i2o_exec_execute_ddm_table {
789 		u16 ddm_tid;
790 		u8 module_type;
791 		u8 reserved;
792 		u16 i2o_vendor_id;
793 		u16 module_id;
794 		u8 module_name_version[28];
795 		u32 data_size;
796 		u32 code_size;
797 	} i2o_exec_execute_ddm_table;
798 
799 	struct {
800 		u16 result_count;
801 		u16 pad;
802 		u16 block_size;
803 		u8 block_status;
804 		u8 error_info_size;
805 		u16 row_count;
806 		u16 more_flag;
807 		i2o_exec_execute_ddm_table ddm_table[I2O_MAX_MODULES];
808 	} *result;
809 
810 	i2o_exec_execute_ddm_table ddm_table;
811 
812 	result = kmalloc(sizeof(*result), GFP_KERNEL);
813 	if (!result)
814 		return -ENOMEM;
815 
816 	token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0003, -1,
817 				   NULL, 0, result, sizeof(*result));
818 
819 	if (token < 0) {
820 		i2o_report_query_status(seq, token,
821 					"0x0003 Executing DDM List");
822 		goto out;
823 	}
824 
825 	seq_printf(seq,
826 		   "Tid   Module_type     Vendor Mod_id  Module_name             Vrs  Data_size Code_size\n");
827 	ddm_table = result->ddm_table[0];
828 
829 	for (i = 0; i < result->row_count; ddm_table = result->ddm_table[++i]) {
830 		seq_printf(seq, "0x%03x ", ddm_table.ddm_tid & 0xFFF);
831 
832 		switch (ddm_table.module_type) {
833 		case 0x01:
834 			seq_printf(seq, "Downloaded DDM  ");
835 			break;
836 		case 0x22:
837 			seq_printf(seq, "Embedded DDM    ");
838 			break;
839 		default:
840 			seq_printf(seq, "                ");
841 		}
842 
843 		seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id);
844 		seq_printf(seq, "%-#8x", ddm_table.module_id);
845 		seq_printf(seq, "%-29s",
846 			   chtostr(ddm_table.module_name_version, 28));
847 		seq_printf(seq, "%9d  ", ddm_table.data_size);
848 		seq_printf(seq, "%8d", ddm_table.code_size);
849 
850 		seq_printf(seq, "\n");
851 	}
852       out:
853 	kfree(result);
854 	return 0;
855 }
856 
857 /* Executive group 0004h - Driver Store (scalar) */
i2o_seq_show_driver_store(struct seq_file * seq,void * v)858 static int i2o_seq_show_driver_store(struct seq_file *seq, void *v)
859 {
860 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
861 	u32 work32[8];
862 	int token;
863 
864 	token =
865 	    i2o_parm_field_get(c->exec, 0x0004, -1, &work32, sizeof(work32));
866 	if (token < 0) {
867 		i2o_report_query_status(seq, token, "0x0004 Driver Store");
868 		return 0;
869 	}
870 
871 	seq_printf(seq, "Module limit  : %d\n"
872 		   "Module count  : %d\n"
873 		   "Current space : %d kB\n"
874 		   "Free space    : %d kB\n",
875 		   work32[0], work32[1], work32[2] >> 10, work32[3] >> 10);
876 
877 	return 0;
878 }
879 
880 /* Executive group 0005h - Driver Store Table (table) */
i2o_seq_show_drivers_stored(struct seq_file * seq,void * v)881 static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)
882 {
883 	typedef struct _i2o_driver_store {
884 		u16 stored_ddm_index;
885 		u8 module_type;
886 		u8 reserved;
887 		u16 i2o_vendor_id;
888 		u16 module_id;
889 		u8 module_name_version[28];
890 		u8 date[8];
891 		u32 module_size;
892 		u32 mpb_size;
893 		u32 module_flags;
894 	} i2o_driver_store_table;
895 
896 	struct i2o_controller *c = (struct i2o_controller *)seq->private;
897 	int token;
898 	int i;
899 
900 	typedef struct {
901 		u16 result_count;
902 		u16 pad;
903 		u16 block_size;
904 		u8 block_status;
905 		u8 error_info_size;
906 		u16 row_count;
907 		u16 more_flag;
908 		i2o_driver_store_table dst[I2O_MAX_MODULES];
909 	} i2o_driver_result_table;
910 
911 	i2o_driver_result_table *result;
912 	i2o_driver_store_table *dst;
913 
914 	result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL);
915 	if (result == NULL)
916 		return -ENOMEM;
917 
918 	token = i2o_parm_table_get(c->exec, I2O_PARAMS_TABLE_GET, 0x0005, -1,
919 				   NULL, 0, result, sizeof(*result));
920 
921 	if (token < 0) {
922 		i2o_report_query_status(seq, token,
923 					"0x0005 DRIVER STORE TABLE");
924 		kfree(result);
925 		return 0;
926 	}
927 
928 	seq_printf(seq,
929 		   "#  Module_type     Vendor Mod_id  Module_name             Vrs"
930 		   "Date     Mod_size Par_size Flags\n");
931 	for (i = 0, dst = &result->dst[0]; i < result->row_count;
932 	     dst = &result->dst[++i]) {
933 		seq_printf(seq, "%-3d", dst->stored_ddm_index);
934 		switch (dst->module_type) {
935 		case 0x01:
936 			seq_printf(seq, "Downloaded DDM  ");
937 			break;
938 		case 0x22:
939 			seq_printf(seq, "Embedded DDM    ");
940 			break;
941 		default:
942 			seq_printf(seq, "                ");
943 		}
944 
945 		seq_printf(seq, "%-#7x", dst->i2o_vendor_id);
946 		seq_printf(seq, "%-#8x", dst->module_id);
947 		seq_printf(seq, "%-29s", chtostr(dst->module_name_version, 28));
948 		seq_printf(seq, "%-9s", chtostr(dst->date, 8));
949 		seq_printf(seq, "%8d ", dst->module_size);
950 		seq_printf(seq, "%8d ", dst->mpb_size);
951 		seq_printf(seq, "0x%04x", dst->module_flags);
952 		seq_printf(seq, "\n");
953 	}
954 
955 	kfree(result);
956 	return 0;
957 }
958 
959 /* Generic group F000h - Params Descriptor (table) */
i2o_seq_show_groups(struct seq_file * seq,void * v)960 static int i2o_seq_show_groups(struct seq_file *seq, void *v)
961 {
962 	struct i2o_device *d = (struct i2o_device *)seq->private;
963 	int token;
964 	int i;
965 	u8 properties;
966 
967 	typedef struct _i2o_group_info {
968 		u16 group_number;
969 		u16 field_count;
970 		u16 row_count;
971 		u8 properties;
972 		u8 reserved;
973 	} i2o_group_info;
974 
975 	struct {
976 		u16 result_count;
977 		u16 pad;
978 		u16 block_size;
979 		u8 block_status;
980 		u8 error_info_size;
981 		u16 row_count;
982 		u16 more_flag;
983 		i2o_group_info group[256];
984 	} *result;
985 
986 	result = kmalloc(sizeof(*result), GFP_KERNEL);
987 	if (!result)
988 		return -ENOMEM;
989 
990 	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0,
991 				   result, sizeof(*result));
992 
993 	if (token < 0) {
994 		i2o_report_query_status(seq, token, "0xF000 Params Descriptor");
995 		goto out;
996 	}
997 
998 	seq_printf(seq,
999 		   "#  Group   FieldCount RowCount Type   Add Del Clear\n");
1000 
1001 	for (i = 0; i < result->row_count; i++) {
1002 		seq_printf(seq, "%-3d", i);
1003 		seq_printf(seq, "0x%04X ", result->group[i].group_number);
1004 		seq_printf(seq, "%10d ", result->group[i].field_count);
1005 		seq_printf(seq, "%8d ", result->group[i].row_count);
1006 
1007 		properties = result->group[i].properties;
1008 		if (properties & 0x1)
1009 			seq_printf(seq, "Table  ");
1010 		else
1011 			seq_printf(seq, "Scalar ");
1012 		if (properties & 0x2)
1013 			seq_printf(seq, " + ");
1014 		else
1015 			seq_printf(seq, " - ");
1016 		if (properties & 0x4)
1017 			seq_printf(seq, "  + ");
1018 		else
1019 			seq_printf(seq, "  - ");
1020 		if (properties & 0x8)
1021 			seq_printf(seq, "  + ");
1022 		else
1023 			seq_printf(seq, "  - ");
1024 
1025 		seq_printf(seq, "\n");
1026 	}
1027 
1028 	if (result->more_flag)
1029 		seq_printf(seq, "There is more...\n");
1030       out:
1031 	kfree(result);
1032 	return 0;
1033 }
1034 
1035 /* Generic group F001h - Physical Device Table (table) */
i2o_seq_show_phys_device(struct seq_file * seq,void * v)1036 static int i2o_seq_show_phys_device(struct seq_file *seq, void *v)
1037 {
1038 	struct i2o_device *d = (struct i2o_device *)seq->private;
1039 	int token;
1040 	int i;
1041 
1042 	struct {
1043 		u16 result_count;
1044 		u16 pad;
1045 		u16 block_size;
1046 		u8 block_status;
1047 		u8 error_info_size;
1048 		u16 row_count;
1049 		u16 more_flag;
1050 		u32 adapter_id[64];
1051 	} result;
1052 
1053 	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF001, -1, NULL, 0,
1054 				   &result, sizeof(result));
1055 
1056 	if (token < 0) {
1057 		i2o_report_query_status(seq, token,
1058 					"0xF001 Physical Device Table");
1059 		return 0;
1060 	}
1061 
1062 	if (result.row_count)
1063 		seq_printf(seq, "#  AdapterId\n");
1064 
1065 	for (i = 0; i < result.row_count; i++) {
1066 		seq_printf(seq, "%-2d", i);
1067 		seq_printf(seq, "%#7x\n", result.adapter_id[i]);
1068 	}
1069 
1070 	if (result.more_flag)
1071 		seq_printf(seq, "There is more...\n");
1072 
1073 	return 0;
1074 }
1075 
1076 /* Generic group F002h - Claimed Table (table) */
i2o_seq_show_claimed(struct seq_file * seq,void * v)1077 static int i2o_seq_show_claimed(struct seq_file *seq, void *v)
1078 {
1079 	struct i2o_device *d = (struct i2o_device *)seq->private;
1080 	int token;
1081 	int i;
1082 
1083 	struct {
1084 		u16 result_count;
1085 		u16 pad;
1086 		u16 block_size;
1087 		u8 block_status;
1088 		u8 error_info_size;
1089 		u16 row_count;
1090 		u16 more_flag;
1091 		u16 claimed_tid[64];
1092 	} result;
1093 
1094 	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF002, -1, NULL, 0,
1095 				   &result, sizeof(result));
1096 
1097 	if (token < 0) {
1098 		i2o_report_query_status(seq, token, "0xF002 Claimed Table");
1099 		return 0;
1100 	}
1101 
1102 	if (result.row_count)
1103 		seq_printf(seq, "#  ClaimedTid\n");
1104 
1105 	for (i = 0; i < result.row_count; i++) {
1106 		seq_printf(seq, "%-2d", i);
1107 		seq_printf(seq, "%#7x\n", result.claimed_tid[i]);
1108 	}
1109 
1110 	if (result.more_flag)
1111 		seq_printf(seq, "There is more...\n");
1112 
1113 	return 0;
1114 }
1115 
1116 /* Generic group F003h - User Table (table) */
i2o_seq_show_users(struct seq_file * seq,void * v)1117 static int i2o_seq_show_users(struct seq_file *seq, void *v)
1118 {
1119 	struct i2o_device *d = (struct i2o_device *)seq->private;
1120 	int token;
1121 	int i;
1122 
1123 	typedef struct _i2o_user_table {
1124 		u16 instance;
1125 		u16 user_tid;
1126 		u8 claim_type;
1127 		u8 reserved1;
1128 		u16 reserved2;
1129 	} i2o_user_table;
1130 
1131 	struct {
1132 		u16 result_count;
1133 		u16 pad;
1134 		u16 block_size;
1135 		u8 block_status;
1136 		u8 error_info_size;
1137 		u16 row_count;
1138 		u16 more_flag;
1139 		i2o_user_table user[64];
1140 	} *result;
1141 
1142 	result = kmalloc(sizeof(*result), GFP_KERNEL);
1143 	if (!result)
1144 		return -ENOMEM;
1145 
1146 	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF003, -1, NULL, 0,
1147 				   result, sizeof(*result));
1148 
1149 	if (token < 0) {
1150 		i2o_report_query_status(seq, token, "0xF003 User Table");
1151 		goto out;
1152 	}
1153 
1154 	seq_printf(seq, "#  Instance UserTid ClaimType\n");
1155 
1156 	for (i = 0; i < result->row_count; i++) {
1157 		seq_printf(seq, "%-3d", i);
1158 		seq_printf(seq, "%#8x ", result->user[i].instance);
1159 		seq_printf(seq, "%#7x ", result->user[i].user_tid);
1160 		seq_printf(seq, "%#9x\n", result->user[i].claim_type);
1161 	}
1162 
1163 	if (result->more_flag)
1164 		seq_printf(seq, "There is more...\n");
1165       out:
1166 	kfree(result);
1167 	return 0;
1168 }
1169 
1170 /* Generic group F005h - Private message extensions (table) (optional) */
i2o_seq_show_priv_msgs(struct seq_file * seq,void * v)1171 static int i2o_seq_show_priv_msgs(struct seq_file *seq, void *v)
1172 {
1173 	struct i2o_device *d = (struct i2o_device *)seq->private;
1174 	int token;
1175 	int i;
1176 
1177 	typedef struct _i2o_private {
1178 		u16 ext_instance;
1179 		u16 organization_id;
1180 		u16 x_function_code;
1181 	} i2o_private;
1182 
1183 	struct {
1184 		u16 result_count;
1185 		u16 pad;
1186 		u16 block_size;
1187 		u8 block_status;
1188 		u8 error_info_size;
1189 		u16 row_count;
1190 		u16 more_flag;
1191 		i2o_private extension[64];
1192 	} result;
1193 
1194 	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF000, -1, NULL, 0,
1195 				   &result, sizeof(result));
1196 
1197 	if (token < 0) {
1198 		i2o_report_query_status(seq, token,
1199 					"0xF005 Private Message Extensions (optional)");
1200 		return 0;
1201 	}
1202 
1203 	seq_printf(seq, "Instance#  OrgId  FunctionCode\n");
1204 
1205 	for (i = 0; i < result.row_count; i++) {
1206 		seq_printf(seq, "%0#9x ", result.extension[i].ext_instance);
1207 		seq_printf(seq, "%0#6x ", result.extension[i].organization_id);
1208 		seq_printf(seq, "%0#6x", result.extension[i].x_function_code);
1209 
1210 		seq_printf(seq, "\n");
1211 	}
1212 
1213 	if (result.more_flag)
1214 		seq_printf(seq, "There is more...\n");
1215 
1216 	return 0;
1217 }
1218 
1219 /* Generic group F006h - Authorized User Table (table) */
i2o_seq_show_authorized_users(struct seq_file * seq,void * v)1220 static int i2o_seq_show_authorized_users(struct seq_file *seq, void *v)
1221 {
1222 	struct i2o_device *d = (struct i2o_device *)seq->private;
1223 	int token;
1224 	int i;
1225 
1226 	struct {
1227 		u16 result_count;
1228 		u16 pad;
1229 		u16 block_size;
1230 		u8 block_status;
1231 		u8 error_info_size;
1232 		u16 row_count;
1233 		u16 more_flag;
1234 		u32 alternate_tid[64];
1235 	} result;
1236 
1237 	token = i2o_parm_table_get(d, I2O_PARAMS_TABLE_GET, 0xF006, -1, NULL, 0,
1238 				   &result, sizeof(result));
1239 
1240 	if (token < 0) {
1241 		i2o_report_query_status(seq, token,
1242 					"0xF006 Autohorized User Table");
1243 		return 0;
1244 	}
1245 
1246 	if (result.row_count)
1247 		seq_printf(seq, "#  AlternateTid\n");
1248 
1249 	for (i = 0; i < result.row_count; i++) {
1250 		seq_printf(seq, "%-2d", i);
1251 		seq_printf(seq, "%#7x ", result.alternate_tid[i]);
1252 	}
1253 
1254 	if (result.more_flag)
1255 		seq_printf(seq, "There is more...\n");
1256 
1257 	return 0;
1258 }
1259 
1260 /* Generic group F100h - Device Identity (scalar) */
i2o_seq_show_dev_identity(struct seq_file * seq,void * v)1261 static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)
1262 {
1263 	struct i2o_device *d = (struct i2o_device *)seq->private;
1264 	static u32 work32[128];	// allow for "stuff" + up to 256 byte (max) serial number
1265 	// == (allow) 512d bytes (max)
1266 	static u16 *work16 = (u16 *) work32;
1267 	int token;
1268 
1269 	token = i2o_parm_field_get(d, 0xF100, -1, &work32, sizeof(work32));
1270 
1271 	if (token < 0) {
1272 		i2o_report_query_status(seq, token, "0xF100 Device Identity");
1273 		return 0;
1274 	}
1275 
1276 	seq_printf(seq, "Device Class  : %s\n", i2o_get_class_name(work16[0]));
1277 	seq_printf(seq, "Owner TID     : %0#5x\n", work16[2]);
1278 	seq_printf(seq, "Parent TID    : %0#5x\n", work16[3]);
1279 	seq_printf(seq, "Vendor info   : %s\n",
1280 		   chtostr((u8 *) (work32 + 2), 16));
1281 	seq_printf(seq, "Product info  : %s\n",
1282 		   chtostr((u8 *) (work32 + 6), 16));
1283 	seq_printf(seq, "Description   : %s\n",
1284 		   chtostr((u8 *) (work32 + 10), 16));
1285 	seq_printf(seq, "Product rev.  : %s\n",
1286 		   chtostr((u8 *) (work32 + 14), 8));
1287 
1288 	seq_printf(seq, "Serial number : ");
1289 	print_serial_number(seq, (u8 *) (work32 + 16),
1290 			    /* allow for SNLen plus
1291 			     * possible trailing '\0'
1292 			     */
1293 			    sizeof(work32) - (16 * sizeof(u32)) - 2);
1294 	seq_printf(seq, "\n");
1295 
1296 	return 0;
1297 }
1298 
i2o_seq_show_dev_name(struct seq_file * seq,void * v)1299 static int i2o_seq_show_dev_name(struct seq_file *seq, void *v)
1300 {
1301 	struct i2o_device *d = (struct i2o_device *)seq->private;
1302 
1303 	seq_printf(seq, "%s\n", dev_name(&d->device));
1304 
1305 	return 0;
1306 }
1307 
1308 /* Generic group F101h - DDM Identity (scalar) */
i2o_seq_show_ddm_identity(struct seq_file * seq,void * v)1309 static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)
1310 {
1311 	struct i2o_device *d = (struct i2o_device *)seq->private;
1312 	int token;
1313 
1314 	struct {
1315 		u16 ddm_tid;
1316 		u8 module_name[24];
1317 		u8 module_rev[8];
1318 		u8 sn_format;
1319 		u8 serial_number[12];
1320 		u8 pad[256];	// allow up to 256 byte (max) serial number
1321 	} result;
1322 
1323 	token = i2o_parm_field_get(d, 0xF101, -1, &result, sizeof(result));
1324 
1325 	if (token < 0) {
1326 		i2o_report_query_status(seq, token, "0xF101 DDM Identity");
1327 		return 0;
1328 	}
1329 
1330 	seq_printf(seq, "Registering DDM TID : 0x%03x\n", result.ddm_tid);
1331 	seq_printf(seq, "Module name         : %s\n",
1332 		   chtostr(result.module_name, 24));
1333 	seq_printf(seq, "Module revision     : %s\n",
1334 		   chtostr(result.module_rev, 8));
1335 
1336 	seq_printf(seq, "Serial number       : ");
1337 	print_serial_number(seq, result.serial_number, sizeof(result) - 36);
1338 	/* allow for SNLen plus possible trailing '\0' */
1339 
1340 	seq_printf(seq, "\n");
1341 
1342 	return 0;
1343 }
1344 
1345 /* Generic group F102h - User Information (scalar) */
i2o_seq_show_uinfo(struct seq_file * seq,void * v)1346 static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)
1347 {
1348 	struct i2o_device *d = (struct i2o_device *)seq->private;
1349 	int token;
1350 
1351 	struct {
1352 		u8 device_name[64];
1353 		u8 service_name[64];
1354 		u8 physical_location[64];
1355 		u8 instance_number[4];
1356 	} result;
1357 
1358 	token = i2o_parm_field_get(d, 0xF102, -1, &result, sizeof(result));
1359 
1360 	if (token < 0) {
1361 		i2o_report_query_status(seq, token, "0xF102 User Information");
1362 		return 0;
1363 	}
1364 
1365 	seq_printf(seq, "Device name     : %s\n",
1366 		   chtostr(result.device_name, 64));
1367 	seq_printf(seq, "Service name    : %s\n",
1368 		   chtostr(result.service_name, 64));
1369 	seq_printf(seq, "Physical name   : %s\n",
1370 		   chtostr(result.physical_location, 64));
1371 	seq_printf(seq, "Instance number : %s\n",
1372 		   chtostr(result.instance_number, 4));
1373 
1374 	return 0;
1375 }
1376 
1377 /* Generic group F103h - SGL Operating Limits (scalar) */
i2o_seq_show_sgl_limits(struct seq_file * seq,void * v)1378 static int i2o_seq_show_sgl_limits(struct seq_file *seq, void *v)
1379 {
1380 	struct i2o_device *d = (struct i2o_device *)seq->private;
1381 	static u32 work32[12];
1382 	static u16 *work16 = (u16 *) work32;
1383 	static u8 *work8 = (u8 *) work32;
1384 	int token;
1385 
1386 	token = i2o_parm_field_get(d, 0xF103, -1, &work32, sizeof(work32));
1387 
1388 	if (token < 0) {
1389 		i2o_report_query_status(seq, token,
1390 					"0xF103 SGL Operating Limits");
1391 		return 0;
1392 	}
1393 
1394 	seq_printf(seq, "SGL chain size        : %d\n", work32[0]);
1395 	seq_printf(seq, "Max SGL chain size    : %d\n", work32[1]);
1396 	seq_printf(seq, "SGL chain size target : %d\n", work32[2]);
1397 	seq_printf(seq, "SGL frag count        : %d\n", work16[6]);
1398 	seq_printf(seq, "Max SGL frag count    : %d\n", work16[7]);
1399 	seq_printf(seq, "SGL frag count target : %d\n", work16[8]);
1400 
1401 /* FIXME
1402 	if (d->i2oversion == 0x02)
1403 	{
1404 */
1405 	seq_printf(seq, "SGL data alignment    : %d\n", work16[8]);
1406 	seq_printf(seq, "SGL addr limit        : %d\n", work8[20]);
1407 	seq_printf(seq, "SGL addr sizes supported : ");
1408 	if (work8[21] & 0x01)
1409 		seq_printf(seq, "32 bit ");
1410 	if (work8[21] & 0x02)
1411 		seq_printf(seq, "64 bit ");
1412 	if (work8[21] & 0x04)
1413 		seq_printf(seq, "96 bit ");
1414 	if (work8[21] & 0x08)
1415 		seq_printf(seq, "128 bit ");
1416 	seq_printf(seq, "\n");
1417 /*
1418 	}
1419 */
1420 
1421 	return 0;
1422 }
1423 
1424 /* Generic group F200h - Sensors (scalar) */
i2o_seq_show_sensors(struct seq_file * seq,void * v)1425 static int i2o_seq_show_sensors(struct seq_file *seq, void *v)
1426 {
1427 	struct i2o_device *d = (struct i2o_device *)seq->private;
1428 	int token;
1429 
1430 	struct {
1431 		u16 sensor_instance;
1432 		u8 component;
1433 		u16 component_instance;
1434 		u8 sensor_class;
1435 		u8 sensor_type;
1436 		u8 scaling_exponent;
1437 		u32 actual_reading;
1438 		u32 minimum_reading;
1439 		u32 low2lowcat_treshold;
1440 		u32 lowcat2low_treshold;
1441 		u32 lowwarn2low_treshold;
1442 		u32 low2lowwarn_treshold;
1443 		u32 norm2lowwarn_treshold;
1444 		u32 lowwarn2norm_treshold;
1445 		u32 nominal_reading;
1446 		u32 hiwarn2norm_treshold;
1447 		u32 norm2hiwarn_treshold;
1448 		u32 high2hiwarn_treshold;
1449 		u32 hiwarn2high_treshold;
1450 		u32 hicat2high_treshold;
1451 		u32 hi2hicat_treshold;
1452 		u32 maximum_reading;
1453 		u8 sensor_state;
1454 		u16 event_enable;
1455 	} result;
1456 
1457 	token = i2o_parm_field_get(d, 0xF200, -1, &result, sizeof(result));
1458 
1459 	if (token < 0) {
1460 		i2o_report_query_status(seq, token,
1461 					"0xF200 Sensors (optional)");
1462 		return 0;
1463 	}
1464 
1465 	seq_printf(seq, "Sensor instance       : %d\n", result.sensor_instance);
1466 
1467 	seq_printf(seq, "Component             : %d = ", result.component);
1468 	switch (result.component) {
1469 	case 0:
1470 		seq_printf(seq, "Other");
1471 		break;
1472 	case 1:
1473 		seq_printf(seq, "Planar logic Board");
1474 		break;
1475 	case 2:
1476 		seq_printf(seq, "CPU");
1477 		break;
1478 	case 3:
1479 		seq_printf(seq, "Chassis");
1480 		break;
1481 	case 4:
1482 		seq_printf(seq, "Power Supply");
1483 		break;
1484 	case 5:
1485 		seq_printf(seq, "Storage");
1486 		break;
1487 	case 6:
1488 		seq_printf(seq, "External");
1489 		break;
1490 	}
1491 	seq_printf(seq, "\n");
1492 
1493 	seq_printf(seq, "Component instance    : %d\n",
1494 		   result.component_instance);
1495 	seq_printf(seq, "Sensor class          : %s\n",
1496 		   result.sensor_class ? "Analog" : "Digital");
1497 
1498 	seq_printf(seq, "Sensor type           : %d = ", result.sensor_type);
1499 	switch (result.sensor_type) {
1500 	case 0:
1501 		seq_printf(seq, "Other\n");
1502 		break;
1503 	case 1:
1504 		seq_printf(seq, "Thermal\n");
1505 		break;
1506 	case 2:
1507 		seq_printf(seq, "DC voltage (DC volts)\n");
1508 		break;
1509 	case 3:
1510 		seq_printf(seq, "AC voltage (AC volts)\n");
1511 		break;
1512 	case 4:
1513 		seq_printf(seq, "DC current (DC amps)\n");
1514 		break;
1515 	case 5:
1516 		seq_printf(seq, "AC current (AC volts)\n");
1517 		break;
1518 	case 6:
1519 		seq_printf(seq, "Door open\n");
1520 		break;
1521 	case 7:
1522 		seq_printf(seq, "Fan operational\n");
1523 		break;
1524 	}
1525 
1526 	seq_printf(seq, "Scaling exponent      : %d\n",
1527 		   result.scaling_exponent);
1528 	seq_printf(seq, "Actual reading        : %d\n", result.actual_reading);
1529 	seq_printf(seq, "Minimum reading       : %d\n", result.minimum_reading);
1530 	seq_printf(seq, "Low2LowCat treshold   : %d\n",
1531 		   result.low2lowcat_treshold);
1532 	seq_printf(seq, "LowCat2Low treshold   : %d\n",
1533 		   result.lowcat2low_treshold);
1534 	seq_printf(seq, "LowWarn2Low treshold  : %d\n",
1535 		   result.lowwarn2low_treshold);
1536 	seq_printf(seq, "Low2LowWarn treshold  : %d\n",
1537 		   result.low2lowwarn_treshold);
1538 	seq_printf(seq, "Norm2LowWarn treshold : %d\n",
1539 		   result.norm2lowwarn_treshold);
1540 	seq_printf(seq, "LowWarn2Norm treshold : %d\n",
1541 		   result.lowwarn2norm_treshold);
1542 	seq_printf(seq, "Nominal reading       : %d\n", result.nominal_reading);
1543 	seq_printf(seq, "HiWarn2Norm treshold  : %d\n",
1544 		   result.hiwarn2norm_treshold);
1545 	seq_printf(seq, "Norm2HiWarn treshold  : %d\n",
1546 		   result.norm2hiwarn_treshold);
1547 	seq_printf(seq, "High2HiWarn treshold  : %d\n",
1548 		   result.high2hiwarn_treshold);
1549 	seq_printf(seq, "HiWarn2High treshold  : %d\n",
1550 		   result.hiwarn2high_treshold);
1551 	seq_printf(seq, "HiCat2High treshold   : %d\n",
1552 		   result.hicat2high_treshold);
1553 	seq_printf(seq, "High2HiCat treshold   : %d\n",
1554 		   result.hi2hicat_treshold);
1555 	seq_printf(seq, "Maximum reading       : %d\n", result.maximum_reading);
1556 
1557 	seq_printf(seq, "Sensor state          : %d = ", result.sensor_state);
1558 	switch (result.sensor_state) {
1559 	case 0:
1560 		seq_printf(seq, "Normal\n");
1561 		break;
1562 	case 1:
1563 		seq_printf(seq, "Abnormal\n");
1564 		break;
1565 	case 2:
1566 		seq_printf(seq, "Unknown\n");
1567 		break;
1568 	case 3:
1569 		seq_printf(seq, "Low Catastrophic (LoCat)\n");
1570 		break;
1571 	case 4:
1572 		seq_printf(seq, "Low (Low)\n");
1573 		break;
1574 	case 5:
1575 		seq_printf(seq, "Low Warning (LoWarn)\n");
1576 		break;
1577 	case 6:
1578 		seq_printf(seq, "High Warning (HiWarn)\n");
1579 		break;
1580 	case 7:
1581 		seq_printf(seq, "High (High)\n");
1582 		break;
1583 	case 8:
1584 		seq_printf(seq, "High Catastrophic (HiCat)\n");
1585 		break;
1586 	}
1587 
1588 	seq_printf(seq, "Event_enable : 0x%02X\n", result.event_enable);
1589 	seq_printf(seq, "    [%s] Operational state change. \n",
1590 		   (result.event_enable & 0x01) ? "+" : "-");
1591 	seq_printf(seq, "    [%s] Low catastrophic. \n",
1592 		   (result.event_enable & 0x02) ? "+" : "-");
1593 	seq_printf(seq, "    [%s] Low reading. \n",
1594 		   (result.event_enable & 0x04) ? "+" : "-");
1595 	seq_printf(seq, "    [%s] Low warning. \n",
1596 		   (result.event_enable & 0x08) ? "+" : "-");
1597 	seq_printf(seq,
1598 		   "    [%s] Change back to normal from out of range state. \n",
1599 		   (result.event_enable & 0x10) ? "+" : "-");
1600 	seq_printf(seq, "    [%s] High warning. \n",
1601 		   (result.event_enable & 0x20) ? "+" : "-");
1602 	seq_printf(seq, "    [%s] High reading. \n",
1603 		   (result.event_enable & 0x40) ? "+" : "-");
1604 	seq_printf(seq, "    [%s] High catastrophic. \n",
1605 		   (result.event_enable & 0x80) ? "+" : "-");
1606 
1607 	return 0;
1608 }
1609 
i2o_seq_open_hrt(struct inode * inode,struct file * file)1610 static int i2o_seq_open_hrt(struct inode *inode, struct file *file)
1611 {
1612 	return single_open(file, i2o_seq_show_hrt, PDE(inode)->data);
1613 };
1614 
i2o_seq_open_lct(struct inode * inode,struct file * file)1615 static int i2o_seq_open_lct(struct inode *inode, struct file *file)
1616 {
1617 	return single_open(file, i2o_seq_show_lct, PDE(inode)->data);
1618 };
1619 
i2o_seq_open_status(struct inode * inode,struct file * file)1620 static int i2o_seq_open_status(struct inode *inode, struct file *file)
1621 {
1622 	return single_open(file, i2o_seq_show_status, PDE(inode)->data);
1623 };
1624 
i2o_seq_open_hw(struct inode * inode,struct file * file)1625 static int i2o_seq_open_hw(struct inode *inode, struct file *file)
1626 {
1627 	return single_open(file, i2o_seq_show_hw, PDE(inode)->data);
1628 };
1629 
i2o_seq_open_ddm_table(struct inode * inode,struct file * file)1630 static int i2o_seq_open_ddm_table(struct inode *inode, struct file *file)
1631 {
1632 	return single_open(file, i2o_seq_show_ddm_table, PDE(inode)->data);
1633 };
1634 
i2o_seq_open_driver_store(struct inode * inode,struct file * file)1635 static int i2o_seq_open_driver_store(struct inode *inode, struct file *file)
1636 {
1637 	return single_open(file, i2o_seq_show_driver_store, PDE(inode)->data);
1638 };
1639 
i2o_seq_open_drivers_stored(struct inode * inode,struct file * file)1640 static int i2o_seq_open_drivers_stored(struct inode *inode, struct file *file)
1641 {
1642 	return single_open(file, i2o_seq_show_drivers_stored, PDE(inode)->data);
1643 };
1644 
i2o_seq_open_groups(struct inode * inode,struct file * file)1645 static int i2o_seq_open_groups(struct inode *inode, struct file *file)
1646 {
1647 	return single_open(file, i2o_seq_show_groups, PDE(inode)->data);
1648 };
1649 
i2o_seq_open_phys_device(struct inode * inode,struct file * file)1650 static int i2o_seq_open_phys_device(struct inode *inode, struct file *file)
1651 {
1652 	return single_open(file, i2o_seq_show_phys_device, PDE(inode)->data);
1653 };
1654 
i2o_seq_open_claimed(struct inode * inode,struct file * file)1655 static int i2o_seq_open_claimed(struct inode *inode, struct file *file)
1656 {
1657 	return single_open(file, i2o_seq_show_claimed, PDE(inode)->data);
1658 };
1659 
i2o_seq_open_users(struct inode * inode,struct file * file)1660 static int i2o_seq_open_users(struct inode *inode, struct file *file)
1661 {
1662 	return single_open(file, i2o_seq_show_users, PDE(inode)->data);
1663 };
1664 
i2o_seq_open_priv_msgs(struct inode * inode,struct file * file)1665 static int i2o_seq_open_priv_msgs(struct inode *inode, struct file *file)
1666 {
1667 	return single_open(file, i2o_seq_show_priv_msgs, PDE(inode)->data);
1668 };
1669 
i2o_seq_open_authorized_users(struct inode * inode,struct file * file)1670 static int i2o_seq_open_authorized_users(struct inode *inode, struct file *file)
1671 {
1672 	return single_open(file, i2o_seq_show_authorized_users,
1673 			   PDE(inode)->data);
1674 };
1675 
i2o_seq_open_dev_identity(struct inode * inode,struct file * file)1676 static int i2o_seq_open_dev_identity(struct inode *inode, struct file *file)
1677 {
1678 	return single_open(file, i2o_seq_show_dev_identity, PDE(inode)->data);
1679 };
1680 
i2o_seq_open_ddm_identity(struct inode * inode,struct file * file)1681 static int i2o_seq_open_ddm_identity(struct inode *inode, struct file *file)
1682 {
1683 	return single_open(file, i2o_seq_show_ddm_identity, PDE(inode)->data);
1684 };
1685 
i2o_seq_open_uinfo(struct inode * inode,struct file * file)1686 static int i2o_seq_open_uinfo(struct inode *inode, struct file *file)
1687 {
1688 	return single_open(file, i2o_seq_show_uinfo, PDE(inode)->data);
1689 };
1690 
i2o_seq_open_sgl_limits(struct inode * inode,struct file * file)1691 static int i2o_seq_open_sgl_limits(struct inode *inode, struct file *file)
1692 {
1693 	return single_open(file, i2o_seq_show_sgl_limits, PDE(inode)->data);
1694 };
1695 
i2o_seq_open_sensors(struct inode * inode,struct file * file)1696 static int i2o_seq_open_sensors(struct inode *inode, struct file *file)
1697 {
1698 	return single_open(file, i2o_seq_show_sensors, PDE(inode)->data);
1699 };
1700 
i2o_seq_open_dev_name(struct inode * inode,struct file * file)1701 static int i2o_seq_open_dev_name(struct inode *inode, struct file *file)
1702 {
1703 	return single_open(file, i2o_seq_show_dev_name, PDE(inode)->data);
1704 };
1705 
1706 static const struct file_operations i2o_seq_fops_lct = {
1707 	.open = i2o_seq_open_lct,
1708 	.read = seq_read,
1709 	.llseek = seq_lseek,
1710 	.release = single_release,
1711 };
1712 
1713 static const struct file_operations i2o_seq_fops_hrt = {
1714 	.open = i2o_seq_open_hrt,
1715 	.read = seq_read,
1716 	.llseek = seq_lseek,
1717 	.release = single_release,
1718 };
1719 
1720 static const struct file_operations i2o_seq_fops_status = {
1721 	.open = i2o_seq_open_status,
1722 	.read = seq_read,
1723 	.llseek = seq_lseek,
1724 	.release = single_release,
1725 };
1726 
1727 static const struct file_operations i2o_seq_fops_hw = {
1728 	.open = i2o_seq_open_hw,
1729 	.read = seq_read,
1730 	.llseek = seq_lseek,
1731 	.release = single_release,
1732 };
1733 
1734 static const struct file_operations i2o_seq_fops_ddm_table = {
1735 	.open = i2o_seq_open_ddm_table,
1736 	.read = seq_read,
1737 	.llseek = seq_lseek,
1738 	.release = single_release,
1739 };
1740 
1741 static const struct file_operations i2o_seq_fops_driver_store = {
1742 	.open = i2o_seq_open_driver_store,
1743 	.read = seq_read,
1744 	.llseek = seq_lseek,
1745 	.release = single_release,
1746 };
1747 
1748 static const struct file_operations i2o_seq_fops_drivers_stored = {
1749 	.open = i2o_seq_open_drivers_stored,
1750 	.read = seq_read,
1751 	.llseek = seq_lseek,
1752 	.release = single_release,
1753 };
1754 
1755 static const struct file_operations i2o_seq_fops_groups = {
1756 	.open = i2o_seq_open_groups,
1757 	.read = seq_read,
1758 	.llseek = seq_lseek,
1759 	.release = single_release,
1760 };
1761 
1762 static const struct file_operations i2o_seq_fops_phys_device = {
1763 	.open = i2o_seq_open_phys_device,
1764 	.read = seq_read,
1765 	.llseek = seq_lseek,
1766 	.release = single_release,
1767 };
1768 
1769 static const struct file_operations i2o_seq_fops_claimed = {
1770 	.open = i2o_seq_open_claimed,
1771 	.read = seq_read,
1772 	.llseek = seq_lseek,
1773 	.release = single_release,
1774 };
1775 
1776 static const struct file_operations i2o_seq_fops_users = {
1777 	.open = i2o_seq_open_users,
1778 	.read = seq_read,
1779 	.llseek = seq_lseek,
1780 	.release = single_release,
1781 };
1782 
1783 static const struct file_operations i2o_seq_fops_priv_msgs = {
1784 	.open = i2o_seq_open_priv_msgs,
1785 	.read = seq_read,
1786 	.llseek = seq_lseek,
1787 	.release = single_release,
1788 };
1789 
1790 static const struct file_operations i2o_seq_fops_authorized_users = {
1791 	.open = i2o_seq_open_authorized_users,
1792 	.read = seq_read,
1793 	.llseek = seq_lseek,
1794 	.release = single_release,
1795 };
1796 
1797 static const struct file_operations i2o_seq_fops_dev_name = {
1798 	.open = i2o_seq_open_dev_name,
1799 	.read = seq_read,
1800 	.llseek = seq_lseek,
1801 	.release = single_release,
1802 };
1803 
1804 static const struct file_operations i2o_seq_fops_dev_identity = {
1805 	.open = i2o_seq_open_dev_identity,
1806 	.read = seq_read,
1807 	.llseek = seq_lseek,
1808 	.release = single_release,
1809 };
1810 
1811 static const struct file_operations i2o_seq_fops_ddm_identity = {
1812 	.open = i2o_seq_open_ddm_identity,
1813 	.read = seq_read,
1814 	.llseek = seq_lseek,
1815 	.release = single_release,
1816 };
1817 
1818 static const struct file_operations i2o_seq_fops_uinfo = {
1819 	.open = i2o_seq_open_uinfo,
1820 	.read = seq_read,
1821 	.llseek = seq_lseek,
1822 	.release = single_release,
1823 };
1824 
1825 static const struct file_operations i2o_seq_fops_sgl_limits = {
1826 	.open = i2o_seq_open_sgl_limits,
1827 	.read = seq_read,
1828 	.llseek = seq_lseek,
1829 	.release = single_release,
1830 };
1831 
1832 static const struct file_operations i2o_seq_fops_sensors = {
1833 	.open = i2o_seq_open_sensors,
1834 	.read = seq_read,
1835 	.llseek = seq_lseek,
1836 	.release = single_release,
1837 };
1838 
1839 /*
1840  * IOP specific entries...write field just in case someone
1841  * ever wants one.
1842  */
1843 static i2o_proc_entry i2o_proc_generic_iop_entries[] = {
1844 	{"hrt", S_IFREG | S_IRUGO, &i2o_seq_fops_hrt},
1845 	{"lct", S_IFREG | S_IRUGO, &i2o_seq_fops_lct},
1846 	{"status", S_IFREG | S_IRUGO, &i2o_seq_fops_status},
1847 	{"hw", S_IFREG | S_IRUGO, &i2o_seq_fops_hw},
1848 	{"ddm_table", S_IFREG | S_IRUGO, &i2o_seq_fops_ddm_table},
1849 	{"driver_store", S_IFREG | S_IRUGO, &i2o_seq_fops_driver_store},
1850 	{"drivers_stored", S_IFREG | S_IRUGO, &i2o_seq_fops_drivers_stored},
1851 	{NULL, 0, NULL}
1852 };
1853 
1854 /*
1855  * Device specific entries
1856  */
1857 static i2o_proc_entry generic_dev_entries[] = {
1858 	{"groups", S_IFREG | S_IRUGO, &i2o_seq_fops_groups},
1859 	{"phys_dev", S_IFREG | S_IRUGO, &i2o_seq_fops_phys_device},
1860 	{"claimed", S_IFREG | S_IRUGO, &i2o_seq_fops_claimed},
1861 	{"users", S_IFREG | S_IRUGO, &i2o_seq_fops_users},
1862 	{"priv_msgs", S_IFREG | S_IRUGO, &i2o_seq_fops_priv_msgs},
1863 	{"authorized_users", S_IFREG | S_IRUGO, &i2o_seq_fops_authorized_users},
1864 	{"dev_identity", S_IFREG | S_IRUGO, &i2o_seq_fops_dev_identity},
1865 	{"ddm_identity", S_IFREG | S_IRUGO, &i2o_seq_fops_ddm_identity},
1866 	{"user_info", S_IFREG | S_IRUGO, &i2o_seq_fops_uinfo},
1867 	{"sgl_limits", S_IFREG | S_IRUGO, &i2o_seq_fops_sgl_limits},
1868 	{"sensors", S_IFREG | S_IRUGO, &i2o_seq_fops_sensors},
1869 	{NULL, 0, NULL}
1870 };
1871 
1872 /*
1873  *  Storage unit specific entries (SCSI Periph, BS) with device names
1874  */
1875 static i2o_proc_entry rbs_dev_entries[] = {
1876 	{"dev_name", S_IFREG | S_IRUGO, &i2o_seq_fops_dev_name},
1877 	{NULL, 0, NULL}
1878 };
1879 
1880 /**
1881  *	i2o_proc_create_entries - Creates proc dir entries
1882  *	@dir: proc dir entry under which the entries should be placed
1883  *	@i2o_pe: pointer to the entries which should be added
1884  *	@data: pointer to I2O controller or device
1885  *
1886  *	Create proc dir entries for a I2O controller or I2O device.
1887  *
1888  *	Returns 0 on success or negative error code on failure.
1889  */
i2o_proc_create_entries(struct proc_dir_entry * dir,i2o_proc_entry * i2o_pe,void * data)1890 static int i2o_proc_create_entries(struct proc_dir_entry *dir,
1891 				   i2o_proc_entry * i2o_pe, void *data)
1892 {
1893 	struct proc_dir_entry *tmp;
1894 
1895 	while (i2o_pe->name) {
1896 		tmp = proc_create_data(i2o_pe->name, i2o_pe->mode, dir,
1897 				       i2o_pe->fops, data);
1898 		if (!tmp)
1899 			return -1;
1900 
1901 		i2o_pe++;
1902 	}
1903 
1904 	return 0;
1905 }
1906 
1907 /**
1908  *	i2o_proc_subdir_remove - Remove child entries from a proc entry
1909  *	@dir: proc dir entry from which the childs should be removed
1910  *
1911  *	Iterate over each i2o proc entry under dir and remove it. If the child
1912  *	also has entries, remove them too.
1913  */
i2o_proc_subdir_remove(struct proc_dir_entry * dir)1914 static void i2o_proc_subdir_remove(struct proc_dir_entry *dir)
1915 {
1916 	struct proc_dir_entry *pe, *tmp;
1917 	pe = dir->subdir;
1918 	while (pe) {
1919 		tmp = pe->next;
1920 		i2o_proc_subdir_remove(pe);
1921 		remove_proc_entry(pe->name, dir);
1922 		pe = tmp;
1923 	}
1924 };
1925 
1926 /**
1927  *	i2o_proc_device_add - Add an I2O device to the proc dir
1928  *	@dir: proc dir entry to which the device should be added
1929  *	@dev: I2O device which should be added
1930  *
1931  *	Add an I2O device to the proc dir entry dir and create the entries for
1932  *	the device depending on the class of the I2O device.
1933  */
i2o_proc_device_add(struct proc_dir_entry * dir,struct i2o_device * dev)1934 static void i2o_proc_device_add(struct proc_dir_entry *dir,
1935 				struct i2o_device *dev)
1936 {
1937 	char buff[10];
1938 	struct proc_dir_entry *devdir;
1939 	i2o_proc_entry *i2o_pe = NULL;
1940 
1941 	sprintf(buff, "%03x", dev->lct_data.tid);
1942 
1943 	osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff);
1944 
1945 	devdir = proc_mkdir(buff, dir);
1946 	if (!devdir) {
1947 		osm_warn("Could not allocate procdir!\n");
1948 		return;
1949 	}
1950 
1951 	devdir->data = dev;
1952 
1953 	i2o_proc_create_entries(devdir, generic_dev_entries, dev);
1954 
1955 	/* Inform core that we want updates about this device's status */
1956 	switch (dev->lct_data.class_id) {
1957 	case I2O_CLASS_SCSI_PERIPHERAL:
1958 	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
1959 		i2o_pe = rbs_dev_entries;
1960 		break;
1961 	default:
1962 		break;
1963 	}
1964 	if (i2o_pe)
1965 		i2o_proc_create_entries(devdir, i2o_pe, dev);
1966 }
1967 
1968 /**
1969  *	i2o_proc_iop_add - Add an I2O controller to the i2o proc tree
1970  *	@dir: parent proc dir entry
1971  *	@c: I2O controller which should be added
1972  *
1973  *	Add the entries to the parent proc dir entry. Also each device is added
1974  *	to the controllers proc dir entry.
1975  *
1976  *	Returns 0 on success or negative error code on failure.
1977  */
i2o_proc_iop_add(struct proc_dir_entry * dir,struct i2o_controller * c)1978 static int i2o_proc_iop_add(struct proc_dir_entry *dir,
1979 			    struct i2o_controller *c)
1980 {
1981 	struct proc_dir_entry *iopdir;
1982 	struct i2o_device *dev;
1983 
1984 	osm_debug("adding IOP /proc/i2o/%s\n", c->name);
1985 
1986 	iopdir = proc_mkdir(c->name, dir);
1987 	if (!iopdir)
1988 		return -1;
1989 
1990 	iopdir->data = c;
1991 
1992 	i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c);
1993 
1994 	list_for_each_entry(dev, &c->devices, list)
1995 	    i2o_proc_device_add(iopdir, dev);
1996 
1997 	return 0;
1998 }
1999 
2000 /**
2001  *	i2o_proc_iop_remove - Removes an I2O controller from the i2o proc tree
2002  *	@dir: parent proc dir entry
2003  *	@c: I2O controller which should be removed
2004  *
2005  *	Iterate over each i2o proc entry and search controller c. If it is found
2006  *	remove it from the tree.
2007  */
i2o_proc_iop_remove(struct proc_dir_entry * dir,struct i2o_controller * c)2008 static void i2o_proc_iop_remove(struct proc_dir_entry *dir,
2009 				struct i2o_controller *c)
2010 {
2011 	struct proc_dir_entry *pe, *tmp;
2012 
2013 	pe = dir->subdir;
2014 	while (pe) {
2015 		tmp = pe->next;
2016 		if (pe->data == c) {
2017 			i2o_proc_subdir_remove(pe);
2018 			remove_proc_entry(pe->name, dir);
2019 		}
2020 		osm_debug("removing IOP /proc/i2o/%s\n", c->name);
2021 		pe = tmp;
2022 	}
2023 }
2024 
2025 /**
2026  *	i2o_proc_fs_create - Create the i2o proc fs.
2027  *
2028  *	Iterate over each I2O controller and create the entries for it.
2029  *
2030  *	Returns 0 on success or negative error code on failure.
2031  */
i2o_proc_fs_create(void)2032 static int __init i2o_proc_fs_create(void)
2033 {
2034 	struct i2o_controller *c;
2035 
2036 	i2o_proc_dir_root = proc_mkdir("i2o", NULL);
2037 	if (!i2o_proc_dir_root)
2038 		return -1;
2039 
2040 	i2o_proc_dir_root->owner = THIS_MODULE;
2041 
2042 	list_for_each_entry(c, &i2o_controllers, list)
2043 	    i2o_proc_iop_add(i2o_proc_dir_root, c);
2044 
2045 	return 0;
2046 };
2047 
2048 /**
2049  *	i2o_proc_fs_destroy - Cleanup the all i2o proc entries
2050  *
2051  *	Iterate over each I2O controller and remove the entries for it.
2052  *
2053  *	Returns 0 on success or negative error code on failure.
2054  */
i2o_proc_fs_destroy(void)2055 static int __exit i2o_proc_fs_destroy(void)
2056 {
2057 	struct i2o_controller *c;
2058 
2059 	list_for_each_entry(c, &i2o_controllers, list)
2060 	    i2o_proc_iop_remove(i2o_proc_dir_root, c);
2061 
2062 	remove_proc_entry("i2o", NULL);
2063 
2064 	return 0;
2065 };
2066 
2067 /**
2068  *	i2o_proc_init - Init function for procfs
2069  *
2070  *	Registers Proc OSM and creates procfs entries.
2071  *
2072  *	Returns 0 on success or negative error code on failure.
2073  */
i2o_proc_init(void)2074 static int __init i2o_proc_init(void)
2075 {
2076 	int rc;
2077 
2078 	printk(KERN_INFO OSM_DESCRIPTION " v" OSM_VERSION "\n");
2079 
2080 	rc = i2o_driver_register(&i2o_proc_driver);
2081 	if (rc)
2082 		return rc;
2083 
2084 	rc = i2o_proc_fs_create();
2085 	if (rc) {
2086 		i2o_driver_unregister(&i2o_proc_driver);
2087 		return rc;
2088 	}
2089 
2090 	return 0;
2091 };
2092 
2093 /**
2094  *	i2o_proc_exit - Exit function for procfs
2095  *
2096  *	Unregisters Proc OSM and removes procfs entries.
2097  */
i2o_proc_exit(void)2098 static void __exit i2o_proc_exit(void)
2099 {
2100 	i2o_driver_unregister(&i2o_proc_driver);
2101 	i2o_proc_fs_destroy();
2102 };
2103 
2104 MODULE_AUTHOR("Deepak Saxena");
2105 MODULE_LICENSE("GPL");
2106 MODULE_DESCRIPTION(OSM_DESCRIPTION);
2107 MODULE_VERSION(OSM_VERSION);
2108 
2109 module_init(i2o_proc_init);
2110 module_exit(i2o_proc_exit);
2111