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