Blame view

drivers/ide/ide-proc.c 19.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
   *  Copyright (C) 1997-1998	Mark Lord
ccd32e221   Alan Cox   ide: Switch to a ...
3
   *  Copyright (C) 2003		Red Hat
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
4
5
   *
   *  Some code was moved here from ide.c, see it for original copyrights.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
13
14
   */
  
  /*
   * This is the /proc/ide/ filesystem implementation.
   *
   * Drive/Driver settings can be retrieved by reading the drive's
   * "settings" files.  e.g.    "cat /proc/ide0/hda/settings"
   * To write a new value "val" into a specific setting "name", use:
   *   echo "name:val" >/proc/ide/ide0/hda/settings
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
  #include <linux/module.h>
  
  #include <asm/uaccess.h>
  #include <linux/errno.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
22
23
24
  #include <linux/proc_fs.h>
  #include <linux/stat.h>
  #include <linux/mm.h>
  #include <linux/pci.h>
  #include <linux/ctype.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
  #include <linux/ide.h>
  #include <linux/seq_file.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
27
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
  
  #include <asm/io.h>
5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
30
  static struct proc_dir_entry *proc_ide_root;
6d703a81a   Alexey Dobriyan   ide: convert to -...
31
  static int ide_imodel_proc_show(struct seq_file *m, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
33
  	ide_hwif_t	*hwif = (ide_hwif_t *) m->private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
  	const char	*name;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  	switch (hwif->chipset) {
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
36
37
38
39
40
41
42
43
  	case ide_generic:	name = "generic";	break;
  	case ide_pci:		name = "pci";		break;
  	case ide_cmd640:	name = "cmd640";	break;
  	case ide_dtc2278:	name = "dtc2278";	break;
  	case ide_ali14xx:	name = "ali14xx";	break;
  	case ide_qd65xx:	name = "qd65xx";	break;
  	case ide_umc8672:	name = "umc8672";	break;
  	case ide_ht6560b:	name = "ht6560b";	break;
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
44
45
46
47
  	case ide_4drives:	name = "4drives";	break;
  	case ide_pmac:		name = "mac-io";	break;
  	case ide_au1xxx:	name = "au1xxx";	break;
  	case ide_palm3710:      name = "palm3710";      break;
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
48
49
  	case ide_acorn:		name = "acorn";		break;
  	default:		name = "(unknown)";	break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  	}
6d703a81a   Alexey Dobriyan   ide: convert to -...
51
52
53
  	seq_printf(m, "%s
  ", name);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
55
  static int ide_imodel_proc_open(struct inode *inode, struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  	return single_open(file, ide_imodel_proc_show, PDE(inode)->data);
  }
  
  static const struct file_operations ide_imodel_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_imodel_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
  
  static int ide_mate_proc_show(struct seq_file *m, void *v)
  {
  	ide_hwif_t	*hwif = (ide_hwif_t *) m->private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71

4283e1bab   Bartlomiej Zolnierkiewicz   ide: fix /proc/id...
72
  	if (hwif && hwif->mate)
6d703a81a   Alexey Dobriyan   ide: convert to -...
73
74
  		seq_printf(m, "%s
  ", hwif->mate->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75
  	else
6d703a81a   Alexey Dobriyan   ide: convert to -...
76
77
78
  		seq_printf(m, "(none)
  ");
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
80
  static int ide_mate_proc_open(struct inode *inode, struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
82
83
  	return single_open(file, ide_mate_proc_show, PDE(inode)->data);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84

6d703a81a   Alexey Dobriyan   ide: convert to -...
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  static const struct file_operations ide_mate_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_mate_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
  
  static int ide_channel_proc_show(struct seq_file *m, void *v)
  {
  	ide_hwif_t	*hwif = (ide_hwif_t *) m->private;
  
  	seq_printf(m, "%c
  ", hwif->channel ? '1' : '0');
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
101
  static int ide_channel_proc_open(struct inode *inode, struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
103
104
105
106
107
108
109
110
111
112
  	return single_open(file, ide_channel_proc_show, PDE(inode)->data);
  }
  
  static const struct file_operations ide_channel_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_channel_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113

6d703a81a   Alexey Dobriyan   ide: convert to -...
114
115
116
117
  static int ide_identify_proc_show(struct seq_file *m, void *v)
  {
  	ide_drive_t *drive = (ide_drive_t *)m->private;
  	u8 *buf;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118

6d703a81a   Alexey Dobriyan   ide: convert to -...
119
120
121
122
123
  	if (!drive) {
  		seq_putc(m, '
  ');
  		return 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124

6d703a81a   Alexey Dobriyan   ide: convert to -...
125
126
127
128
129
130
  	buf = kmalloc(SECTOR_SIZE, GFP_KERNEL);
  	if (!buf)
  		return -ENOMEM;
  	if (taskfile_lib_get_identify(drive, buf) == 0) {
  		__le16 *val = (__le16 *)buf;
  		int i;
151a67018   Bartlomiej Zolnierkiewicz   ide: remove SECTO...
131

6d703a81a   Alexey Dobriyan   ide: convert to -...
132
133
134
135
  		for (i = 0; i < SECTOR_SIZE / 2; i++) {
  			seq_printf(m, "%04x%c", le16_to_cpu(val[i]),
  					(i % 8) == 7 ? '
  ' : ' ');
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
  		}
6d703a81a   Alexey Dobriyan   ide: convert to -...
137
138
139
140
  	} else
  		seq_putc(m, buf[0]);
  	kfree(buf);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
142
143
144
145
146
147
148
149
150
151
152
153
  static int ide_identify_proc_open(struct inode *inode, struct file *file)
  {
  	return single_open(file, ide_identify_proc_show, PDE(inode)->data);
  }
  
  static const struct file_operations ide_identify_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_identify_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
154
  /**
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
155
156
   *	ide_find_setting	-	find a specific setting
   *	@st: setting table pointer
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
157
   *	@name: setting name
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
158
   *
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
159
   *	Scan's the setting table for a matching entry and returns
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
160
161
162
   *	this or NULL if no entry is found. The caller must hold the
   *	setting semaphore
   */
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
163
164
165
  static
  const struct ide_proc_devset *ide_find_setting(const struct ide_proc_devset *st,
  					       char *name)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
166
  {
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
167
168
  	while (st->name) {
  		if (strcmp(st->name, name) == 0)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
169
  			break;
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
170
  		st++;
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
171
  	}
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
172
  	return st->name ? st : NULL;
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
173
174
175
176
177
178
179
180
  }
  
  /**
   *	ide_read_setting	-	read an IDE setting
   *	@drive: drive to read from
   *	@setting: drive setting
   *
   *	Read a drive setting and return the value. The caller
f9383c426   Matthias Kaehlcke   ide: use mutex in...
181
   *	must hold the ide_setting_mtx when making this call.
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
182
183
184
185
186
   *
   *	BUGS: the data return and error are the same return value
   *	so an error -EINVAL and true return of the same value cannot
   *	be told apart
   */
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
187
  static int ide_read_setting(ide_drive_t *drive,
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
188
  			    const struct ide_proc_devset *setting)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
189
  {
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
190
  	const struct ide_devset *ds = setting->setting;
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
191
  	int val = -EINVAL;
1f473e9c9   Bartlomiej Zolnierkiewicz   ide: IDE settings...
192
  	if (ds->get)
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
193
  		val = ds->get(drive);
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
194

7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
195
196
197
198
199
200
201
202
203
204
  	return val;
  }
  
  /**
   *	ide_write_setting	-	read an IDE setting
   *	@drive: drive to read from
   *	@setting: drive setting
   *	@val: value
   *
   *	Write a drive setting if it is possible. The caller
f9383c426   Matthias Kaehlcke   ide: use mutex in...
205
   *	must hold the ide_setting_mtx when making this call.
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
206
207
208
209
210
211
212
213
214
   *
   *	BUGS: the data return and error are the same return value
   *	so an error -EINVAL and true return of the same value cannot
   *	be told apart
   *
   *	FIXME:  This should be changed to enqueue a special request
   *	to the driver to change settings, and then wait on a sema for completion.
   *	The current scheme of polling is kludgy, though safe enough.
   */
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
215
  static int ide_write_setting(ide_drive_t *drive,
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
216
  			     const struct ide_proc_devset *setting, int val)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
217
  {
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
218
  	const struct ide_devset *ds = setting->setting;
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
219
220
  	if (!capable(CAP_SYS_ADMIN))
  		return -EACCES;
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
221
  	if (!ds->set)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
222
  		return -EPERM;
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
223
224
  	if ((ds->flags & DS_SYNC)
  	    && (val < setting->min || val > setting->max))
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
225
  		return -EINVAL;
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
226
  	return ide_devset_execute(drive, ds, val);
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
227
  }
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
228
  ide_devset_get(xfer_rate, current_speed);
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
229

7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
230
231
  static int set_xfer_rate (ide_drive_t *drive, int arg)
  {
22aa4b32a   Bartlomiej Zolnierkiewicz   ide: remove ide_t...
232
  	struct ide_cmd cmd;
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
233

3b2a5c714   Bartlomiej Zolnierkiewicz   ide: filter out "...
234
  	if (arg < XFER_PIO_0 || arg > XFER_UDMA_6)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
235
  		return -EINVAL;
22aa4b32a   Bartlomiej Zolnierkiewicz   ide: remove ide_t...
236
237
238
239
  	memset(&cmd, 0, sizeof(cmd));
  	cmd.tf.command = ATA_CMD_SET_FEATURES;
  	cmd.tf.feature = SETFEATURES_XFER;
  	cmd.tf.nsect   = (u8)arg;
60f85019c   Sergei Shtylyov   ide: replace IDE_...
240
241
  	cmd.valid.out.tf = IDE_VALID_FEATURE | IDE_VALID_NSECT;
  	cmd.valid.in.tf  = IDE_VALID_NSECT;
665d66e8f   Bartlomiej Zolnierkiewicz   ide: fix races in...
242
  	cmd.tf_flags   = IDE_TFLAG_SET_XFER;
34f5d5ae3   Bartlomiej Zolnierkiewicz   ide: switch set_x...
243

665d66e8f   Bartlomiej Zolnierkiewicz   ide: fix races in...
244
  	return ide_no_data_taskfile(drive, &cmd);
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
245
  }
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
246
247
  ide_devset_rw(current_speed, xfer_rate);
  ide_devset_rw_field(init_speed, init_speed);
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
248
  ide_devset_rw_flag(nice1, IDE_DFLAG_NICE1);
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
249
250
251
252
253
254
255
256
257
258
259
260
  ide_devset_rw_field(number, dn);
  
  static const struct ide_proc_devset ide_generic_settings[] = {
  	IDE_PROC_DEVSET(current_speed, 0, 70),
  	IDE_PROC_DEVSET(init_speed, 0, 70),
  	IDE_PROC_DEVSET(io_32bit,  0, 1 + (SUPPORT_VLB_SYNC << 1)),
  	IDE_PROC_DEVSET(keepsettings, 0, 1),
  	IDE_PROC_DEVSET(nice1, 0, 1),
  	IDE_PROC_DEVSET(number, 0, 3),
  	IDE_PROC_DEVSET(pio_mode, 0, 255),
  	IDE_PROC_DEVSET(unmaskirq, 0, 1),
  	IDE_PROC_DEVSET(using_dma, 0, 1),
71bfc7a7c   Hannes Eder   ide: NULL noise: ...
261
  	{ NULL },
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
262
  };
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
263

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264
265
  static void proc_ide_settings_warn(void)
  {
01f1afaf7   Marcin Slusarz   ide: use printk_once
266
  	printk_once(KERN_WARNING "Warning: /proc/ide/hd?/settings interface is "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267
268
  			    "obsolete, and will be removed soon!
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
269
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
270
  static int ide_settings_proc_show(struct seq_file *m, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
  {
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
272
273
  	const struct ide_proc_devset *setting, *g, *d;
  	const struct ide_devset *ds;
6d703a81a   Alexey Dobriyan   ide: convert to -...
274
275
  	ide_drive_t	*drive = (ide_drive_t *) m->private;
  	int		rc, mul_factor, div_factor;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276
277
  
  	proc_ide_settings_warn();
f9383c426   Matthias Kaehlcke   ide: use mutex in...
278
  	mutex_lock(&ide_setting_mtx);
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
279
280
  	g = ide_generic_settings;
  	d = drive->settings;
6d703a81a   Alexey Dobriyan   ide: convert to -...
281
282
283
284
  	seq_printf(m, "name\t\t\tvalue\t\tmin\t\tmax\t\tmode
  ");
  	seq_printf(m, "----\t\t\t-----\t\t---\t\t---\t\t----
  ");
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
285
  	while (g->name || (d && d->name)) {
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
286
  		/* read settings in the alphabetical order */
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
287
288
289
  		if (g->name && d && d->name) {
  			if (strcmp(d->name, g->name) < 0)
  				setting = d++;
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
290
  			else
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
291
292
293
  				setting = g++;
  		} else if (d && d->name) {
  			setting = d++;
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
294
  		} else
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
295
  			setting = g++;
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
296
297
  		mul_factor = setting->mulf ? setting->mulf(drive) : 1;
  		div_factor = setting->divf ? setting->divf(drive) : 1;
6d703a81a   Alexey Dobriyan   ide: convert to -...
298
  		seq_printf(m, "%-24s", setting->name);
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
299
300
  		rc = ide_read_setting(drive, setting);
  		if (rc >= 0)
6d703a81a   Alexey Dobriyan   ide: convert to -...
301
  			seq_printf(m, "%-16d", rc * mul_factor / div_factor);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
  		else
6d703a81a   Alexey Dobriyan   ide: convert to -...
303
304
  			seq_printf(m, "%-16s", "write-only");
  		seq_printf(m, "%-16d%-16d", (setting->min * mul_factor + div_factor - 1) / div_factor, setting->max * mul_factor / div_factor);
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
305
306
  		ds = setting->setting;
  		if (ds->get)
6d703a81a   Alexey Dobriyan   ide: convert to -...
307
  			seq_printf(m, "r");
92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
308
  		if (ds->set)
6d703a81a   Alexey Dobriyan   ide: convert to -...
309
310
311
  			seq_printf(m, "w");
  		seq_printf(m, "
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
  	}
f9383c426   Matthias Kaehlcke   ide: use mutex in...
313
  	mutex_unlock(&ide_setting_mtx);
6d703a81a   Alexey Dobriyan   ide: convert to -...
314
315
316
317
318
319
  	return 0;
  }
  
  static int ide_settings_proc_open(struct inode *inode, struct file *file)
  {
  	return single_open(file, ide_settings_proc_show, PDE(inode)->data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
321
322
  }
  
  #define MAX_LEN	30
6d703a81a   Alexey Dobriyan   ide: convert to -...
323
324
  static ssize_t ide_settings_proc_write(struct file *file, const char __user *buffer,
  				       size_t count, loff_t *pos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
326
  	ide_drive_t	*drive = (ide_drive_t *) PDE(file->f_path.dentry->d_inode)->data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  	char		name[MAX_LEN + 1];
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
328
  	int		for_real = 0, mul_factor, div_factor;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
  	unsigned long	n;
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
330

92f1f8fd8   Elias Oltmanns   ide: Remove ide_s...
331
  	const struct ide_proc_devset *setting;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
  	char *buf, *s;
  
  	if (!capable(CAP_SYS_ADMIN))
  		return -EACCES;
  
  	proc_ide_settings_warn();
  
  	if (count >= PAGE_SIZE)
  		return -EINVAL;
  
  	s = buf = (char *)__get_free_page(GFP_USER);
  	if (!buf)
  		return -ENOMEM;
  
  	if (copy_from_user(buf, buffer, count)) {
  		free_page((unsigned long)buf);
  		return -EFAULT;
  	}
  
  	buf[count] = '\0';
  
  	/*
  	 * Skip over leading whitespace
  	 */
  	while (count && isspace(*s)) {
  		--count;
  		++s;
  	}
  	/*
  	 * Do one full pass to verify all parameters,
  	 * then do another to actually write the new settings.
  	 */
  	do {
  		char *p = s;
  		n = count;
  		while (n > 0) {
  			unsigned val;
  			char *q = p;
  
  			while (n > 0 && *p != ':') {
  				--n;
  				p++;
  			}
  			if (*p != ':')
  				goto parse_error;
  			if (p - q > MAX_LEN)
  				goto parse_error;
  			memcpy(name, q, p - q);
  			name[p - q] = 0;
  
  			if (n > 0) {
  				--n;
  				p++;
  			} else
  				goto parse_error;
  
  			val = simple_strtoul(p, &q, 10);
  			n -= q - p;
  			p = q;
  			if (n > 0 && !isspace(*p))
  				goto parse_error;
  			while (n > 0 && isspace(*p)) {
  				--n;
  				++p;
  			}
f9383c426   Matthias Kaehlcke   ide: use mutex in...
397
  			mutex_lock(&ide_setting_mtx);
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
398
399
  			/* generic settings first, then driver specific ones */
  			setting = ide_find_setting(ide_generic_settings, name);
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
400
  			if (!setting) {
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
401
402
403
404
405
406
407
408
409
410
411
  				if (drive->settings)
  					setting = ide_find_setting(drive->settings, name);
  				if (!setting) {
  					mutex_unlock(&ide_setting_mtx);
  					goto parse_error;
  				}
  			}
  			if (for_real) {
  				mul_factor = setting->mulf ? setting->mulf(drive) : 1;
  				div_factor = setting->divf ? setting->divf(drive) : 1;
  				ide_write_setting(drive, setting, val * div_factor / mul_factor);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
412
  			}
f9383c426   Matthias Kaehlcke   ide: use mutex in...
413
  			mutex_unlock(&ide_setting_mtx);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
415
416
417
418
419
  		}
  	} while (!for_real++);
  	free_page((unsigned long)buf);
  	return count;
  parse_error:
  	free_page((unsigned long)buf);
6d703a81a   Alexey Dobriyan   ide: convert to -...
420
421
  	printk("%s(): parse error
  ", __func__);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
423
  	return -EINVAL;
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
424
425
426
427
428
429
430
431
432
433
  static const struct file_operations ide_settings_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_settings_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  	.write		= ide_settings_proc_write,
  };
  
  static int ide_capacity_proc_show(struct seq_file *m, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
435
436
437
  	seq_printf(m, "%llu
  ", (long long)0x7fffffff);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
439
440
441
442
443
444
445
446
447
448
449
450
451
  static int ide_capacity_proc_open(struct inode *inode, struct file *file)
  {
  	return single_open(file, ide_capacity_proc_show, NULL);
  }
  
  const struct file_operations ide_capacity_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_capacity_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
  EXPORT_SYMBOL_GPL(ide_capacity_proc_fops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452

6d703a81a   Alexey Dobriyan   ide: convert to -...
453
  static int ide_geometry_proc_show(struct seq_file *m, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
455
  	ide_drive_t	*drive = (ide_drive_t *) m->private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456

6d703a81a   Alexey Dobriyan   ide: convert to -...
457
458
  	seq_printf(m, "physical     %d/%d/%d
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
459
  			drive->cyl, drive->head, drive->sect);
6d703a81a   Alexey Dobriyan   ide: convert to -...
460
461
  	seq_printf(m, "logical      %d/%d/%d
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
  			drive->bios_cyl, drive->bios_head, drive->bios_sect);
6d703a81a   Alexey Dobriyan   ide: convert to -...
463
464
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465

6d703a81a   Alexey Dobriyan   ide: convert to -...
466
467
468
  static int ide_geometry_proc_open(struct inode *inode, struct file *file)
  {
  	return single_open(file, ide_geometry_proc_show, PDE(inode)->data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
470
471
472
473
474
475
476
477
  const struct file_operations ide_geometry_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_geometry_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
  EXPORT_SYMBOL(ide_geometry_proc_fops);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478

6d703a81a   Alexey Dobriyan   ide: convert to -...
479
  static int ide_dmodel_proc_show(struct seq_file *seq, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
481
  	ide_drive_t	*drive = (ide_drive_t *) seq->private;
4dde4492d   Bartlomiej Zolnierkiewicz   ide: make drive->...
482
  	char		*m = (char *)&drive->id[ATA_ID_PROD];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
483

6d703a81a   Alexey Dobriyan   ide: convert to -...
484
485
486
  	seq_printf(seq, "%.40s
  ", m[0] ? m : "(none)");
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
487
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
488
  static int ide_dmodel_proc_open(struct inode *inode, struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
489
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
490
491
492
493
494
495
496
497
498
499
500
501
502
503
  	return single_open(file, ide_dmodel_proc_show, PDE(inode)->data);
  }
  
  static const struct file_operations ide_dmodel_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_dmodel_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
  
  static int ide_driver_proc_show(struct seq_file *m, void *v)
  {
  	ide_drive_t		*drive = (ide_drive_t *)m->private;
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
504
505
  	struct device		*dev = &drive->gendev;
  	struct ide_driver	*ide_drv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
506

8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
507
  	if (dev->driver) {
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
508
  		ide_drv = to_ide_driver(dev->driver);
6d703a81a   Alexey Dobriyan   ide: convert to -...
509
510
  		seq_printf(m, "%s version %s
  ",
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
511
  				dev->driver->name, ide_drv->version);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
512
  	} else
6d703a81a   Alexey Dobriyan   ide: convert to -...
513
514
515
516
517
518
519
520
  		seq_printf(m, "ide-default version 0.9.newide
  ");
  	return 0;
  }
  
  static int ide_driver_proc_open(struct inode *inode, struct file *file)
  {
  	return single_open(file, ide_driver_proc_show, PDE(inode)->data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
521
  }
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
522
523
524
525
  static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)
  {
  	struct device *dev = &drive->gendev;
  	int ret = 1;
349ae23fe   Randy Dunlap   [PATCH] IDE core:...
526
  	int err;
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
527

8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
528
529
530
  	device_release_driver(dev);
  	/* FIXME: device can still be in use by previous driver */
  	strlcpy(drive->driver_req, driver, sizeof(drive->driver_req));
349ae23fe   Randy Dunlap   [PATCH] IDE core:...
531
532
533
534
  	err = device_attach(dev);
  	if (err < 0)
  		printk(KERN_WARNING "IDE: %s: device_attach error: %d
  ",
eb63963a5   Harvey Harrison   ide: replace rema...
535
  			__func__, err);
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
536
  	drive->driver_req[0] = 0;
349ae23fe   Randy Dunlap   [PATCH] IDE core:...
537
538
539
540
541
542
  	if (dev->driver == NULL) {
  		err = device_attach(dev);
  		if (err < 0)
  			printk(KERN_WARNING
  				"IDE: %s: device_attach(2) error: %d
  ",
eb63963a5   Harvey Harrison   ide: replace rema...
543
  				__func__, err);
349ae23fe   Randy Dunlap   [PATCH] IDE core:...
544
  	}
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
545
546
  	if (dev->driver && !strcmp(dev->driver->name, driver))
  		ret = 0;
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
547
548
549
  
  	return ret;
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
550
551
  static ssize_t ide_driver_proc_write(struct file *file, const char __user *buffer,
  				     size_t count, loff_t *pos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
552
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
553
  	ide_drive_t	*drive = (ide_drive_t *) PDE(file->f_path.dentry->d_inode)->data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
555
556
557
558
559
560
561
562
563
564
565
566
  	char name[32];
  
  	if (!capable(CAP_SYS_ADMIN))
  		return -EACCES;
  	if (count > 31)
  		count = 31;
  	if (copy_from_user(name, buffer, count))
  		return -EFAULT;
  	name[count] = '\0';
  	if (ide_replace_subdriver(drive, name))
  		return -EINVAL;
  	return count;
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
567
568
569
570
571
572
573
574
575
576
  static const struct file_operations ide_driver_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_driver_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  	.write		= ide_driver_proc_write,
  };
  
  static int ide_media_proc_show(struct seq_file *m, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577
  {
6d703a81a   Alexey Dobriyan   ide: convert to -...
578
  	ide_drive_t	*drive = (ide_drive_t *) m->private;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
579
  	const char	*media;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
581
  
  	switch (drive->media) {
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
582
583
584
585
586
587
588
589
590
591
592
593
  	case ide_disk:		media = "disk
  ";	break;
  	case ide_cdrom:		media = "cdrom
  ";	break;
  	case ide_tape:		media = "tape
  ";	break;
  	case ide_floppy:	media = "floppy
  ";	break;
  	case ide_optical:	media = "optical
  ";	break;
  	default:		media = "UNKNOWN
  ";	break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
  	}
6d703a81a   Alexey Dobriyan   ide: convert to -...
595
596
597
598
599
600
601
  	seq_puts(m, media);
  	return 0;
  }
  
  static int ide_media_proc_open(struct inode *inode, struct file *file)
  {
  	return single_open(file, ide_media_proc_show, PDE(inode)->data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
602
  }
6d703a81a   Alexey Dobriyan   ide: convert to -...
603
604
605
606
607
608
609
  static const struct file_operations ide_media_proc_fops = {
  	.owner		= THIS_MODULE,
  	.open		= ide_media_proc_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
  	.release	= single_release,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
610
  static ide_proc_entry_t generic_drive_entries[] = {
6d703a81a   Alexey Dobriyan   ide: convert to -...
611
612
613
614
615
616
  	{ "driver",	S_IFREG|S_IRUGO,	 &ide_driver_proc_fops	},
  	{ "identify",	S_IFREG|S_IRUSR,	 &ide_identify_proc_fops},
  	{ "media",	S_IFREG|S_IRUGO,	 &ide_media_proc_fops	},
  	{ "model",	S_IFREG|S_IRUGO,	 &ide_dmodel_proc_fops	},
  	{ "settings",	S_IFREG|S_IRUSR|S_IWUSR, &ide_settings_proc_fops},
  	{}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
617
  };
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
618
  static void ide_add_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p, void *data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
619
620
621
622
623
624
  {
  	struct proc_dir_entry *ent;
  
  	if (!dir || !p)
  		return;
  	while (p->name != NULL) {
6d703a81a   Alexey Dobriyan   ide: convert to -...
625
  		ent = proc_create_data(p->name, p->mode, dir, p->proc_fops, data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
626
  		if (!ent) return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627
628
629
  		p++;
  	}
  }
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
630
  static void ide_remove_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
631
632
633
634
635
636
637
638
  {
  	if (!dir || !p)
  		return;
  	while (p->name != NULL) {
  		remove_proc_entry(p->name, dir);
  		p++;
  	}
  }
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
639
  void ide_proc_register_driver(ide_drive_t *drive, struct ide_driver *driver)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
640
  {
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
641
  	mutex_lock(&ide_setting_mtx);
79cb38039   Bartlomiej Zolnierkiewicz   ide: allow device...
642
  	drive->settings = driver->proc_devsets(drive);
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
643
  	mutex_unlock(&ide_setting_mtx);
79cb38039   Bartlomiej Zolnierkiewicz   ide: allow device...
644
  	ide_add_proc_entries(drive->proc, driver->proc_entries(drive), drive);
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
645
646
647
648
649
650
651
652
653
654
655
656
  }
  
  EXPORT_SYMBOL(ide_proc_register_driver);
  
  /**
   *	ide_proc_unregister_driver	-	remove driver specific data
   *	@drive: drive
   *	@driver: driver
   *
   *	Clean up the driver specific /proc files and IDE settings
   *	for a given drive.
   *
1f473e9c9   Bartlomiej Zolnierkiewicz   ide: IDE settings...
657
   *	Takes ide_setting_mtx.
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
658
   */
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
659
  void ide_proc_unregister_driver(ide_drive_t *drive, struct ide_driver *driver)
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
660
  {
79cb38039   Bartlomiej Zolnierkiewicz   ide: allow device...
661
  	ide_remove_proc_entries(drive->proc, driver->proc_entries(drive));
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
662

f9383c426   Matthias Kaehlcke   ide: use mutex in...
663
  	mutex_lock(&ide_setting_mtx);
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
664
  	/*
1f473e9c9   Bartlomiej Zolnierkiewicz   ide: IDE settings...
665
666
  	 * ide_setting_mtx protects both the settings list and the use
  	 * of settings (we cannot take a setting out that is being used).
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
667
  	 */
8185d5aa9   Bartlomiej Zolnierkiewicz   ide: /proc/ide/hd...
668
  	drive->settings = NULL;
f9383c426   Matthias Kaehlcke   ide: use mutex in...
669
  	mutex_unlock(&ide_setting_mtx);
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
670
  }
7662d046d   Bartlomiej Zolnierkiewicz   ide: move IDE set...
671
  EXPORT_SYMBOL(ide_proc_unregister_driver);
d9270a3f1   Bartlomiej Zolnierkiewicz   ide: move create_...
672
  void ide_proc_port_register_devices(ide_hwif_t *hwif)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674
675
  	struct proc_dir_entry *ent;
  	struct proc_dir_entry *parent = hwif->proc;
2bd24a1cf   Bartlomiej Zolnierkiewicz   ide: add port and...
676
  	ide_drive_t *drive;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
677
  	char name[64];
2bd24a1cf   Bartlomiej Zolnierkiewicz   ide: add port and...
678
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
679

2bd24a1cf   Bartlomiej Zolnierkiewicz   ide: add port and...
680
  	ide_port_for_each_dev(i, drive, hwif) {
1902a253e   Bartlomiej Zolnierkiewicz   ide: remove super...
681
  		if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
682
683
684
685
686
  			continue;
  
  		drive->proc = proc_mkdir(drive->name, parent);
  		if (drive->proc)
  			ide_add_proc_entries(drive->proc, generic_drive_entries, drive);
441e92dae   Paolo Ciarrocchi   IDE: Coding Style...
687
  		sprintf(name, "ide%d/%s", (drive->name[2]-'a')/2, drive->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688
689
690
691
  		ent = proc_symlink(drive->name, proc_ide_root, name);
  		if (!ent) return;
  	}
  }
5b0c4b30a   Bartlomiej Zolnierkiewicz   ide: remove IDE d...
692
  void ide_proc_unregister_device(ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
694
695
696
  {
  	if (drive->proc) {
  		ide_remove_proc_entries(drive->proc, generic_drive_entries);
  		remove_proc_entry(drive->name, proc_ide_root);
5b0c4b30a   Bartlomiej Zolnierkiewicz   ide: remove IDE d...
697
  		remove_proc_entry(drive->name, drive->hwif->proc);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
698
699
700
  		drive->proc = NULL;
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
  static ide_proc_entry_t hwif_entries[] = {
6d703a81a   Alexey Dobriyan   ide: convert to -...
702
703
704
705
  	{ "channel",	S_IFREG|S_IRUGO,	&ide_channel_proc_fops	},
  	{ "mate",	S_IFREG|S_IRUGO,	&ide_mate_proc_fops	},
  	{ "model",	S_IFREG|S_IRUGO,	&ide_imodel_proc_fops	},
  	{}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
  };
5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
707
  void ide_proc_register_port(ide_hwif_t *hwif)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
  {
5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
709
710
  	if (!hwif->proc) {
  		hwif->proc = proc_mkdir(hwif->name, proc_ide_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
711

5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
712
713
714
715
  		if (!hwif->proc)
  			return;
  
  		ide_add_proc_entries(hwif->proc, hwif_entries, hwif);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
716
717
  	}
  }
5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
718
  void ide_proc_unregister_port(ide_hwif_t *hwif)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
719
720
  {
  	if (hwif->proc) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
721
722
723
724
725
  		ide_remove_proc_entries(hwif->proc, hwif_entries);
  		remove_proc_entry(hwif->name, proc_ide_root);
  		hwif->proc = NULL;
  	}
  }
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
726
727
  static int proc_print_driver(struct device_driver *drv, void *data)
  {
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
728
  	struct ide_driver *ide_drv = to_ide_driver(drv);
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
729
730
731
732
733
734
735
736
737
738
  	struct seq_file *s = data;
  
  	seq_printf(s, "%s version %s
  ", drv->name, ide_drv->version);
  
  	return 0;
  }
  
  static int ide_drivers_show(struct seq_file *s, void *p)
  {
349ae23fe   Randy Dunlap   [PATCH] IDE core:...
739
740
741
742
743
744
  	int err;
  
  	err = bus_for_each_drv(&ide_bus_type, NULL, s, proc_print_driver);
  	if (err < 0)
  		printk(KERN_WARNING "IDE: %s: bus_for_each_drv error: %d
  ",
eb63963a5   Harvey Harrison   ide: replace rema...
745
  			__func__, err);
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
746
747
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
749
  static int ide_drivers_open(struct inode *inode, struct file *file)
  {
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
750
  	return single_open(file, &ide_drivers_show, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
751
  }
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
752

2b8693c06   Arjan van de Ven   [PATCH] mark stru...
753
  static const struct file_operations ide_drivers_operations = {
c7705f344   Denis V. Lunev   drivers: use non-...
754
  	.owner		= THIS_MODULE,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
755
756
757
  	.open		= ide_drivers_open,
  	.read		= seq_read,
  	.llseek		= seq_lseek,
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
758
  	.release	= single_release,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759
760
761
762
  };
  
  void proc_ide_create(void)
  {
5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
763
  	proc_ide_root = proc_mkdir("ide", NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
764
765
  	if (!proc_ide_root)
  		return;
c7705f344   Denis V. Lunev   drivers: use non-...
766
  	proc_create("drivers", 0, proc_ide_root, &ide_drivers_operations);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
767
768
769
770
  }
  
  void proc_ide_destroy(void)
  {
643bdc6fc   Zhang, Yanmin   [PATCH] ide proc ...
771
  	remove_proc_entry("drivers", proc_ide_root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
773
  	remove_proc_entry("ide", NULL);
  }