diff options
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-cd.c | 14 | ||||
-rw-r--r-- | drivers/ide/ide-cs.c | 156 | ||||
-rw-r--r-- | drivers/ide/ide-disk_ioctl.c | 7 | ||||
-rw-r--r-- | drivers/ide/ide-floppy_ioctl.c | 7 | ||||
-rw-r--r-- | drivers/ide/ide-gd.c | 10 | ||||
-rw-r--r-- | drivers/ide/ide-probe.c | 12 | ||||
-rw-r--r-- | drivers/ide/ide-tape.c | 19 |
7 files changed, 61 insertions, 164 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 31fc76960a8f..0c73fe39a236 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <linux/delay.h> | 31 | #include <linux/delay.h> |
32 | #include <linux/timer.h> | 32 | #include <linux/timer.h> |
33 | #include <linux/seq_file.h> | 33 | #include <linux/seq_file.h> |
34 | #include <linux/smp_lock.h> | ||
35 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
36 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
37 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
@@ -52,6 +51,7 @@ | |||
52 | 51 | ||
53 | #include "ide-cd.h" | 52 | #include "ide-cd.h" |
54 | 53 | ||
54 | static DEFINE_MUTEX(ide_cd_mutex); | ||
55 | static DEFINE_MUTEX(idecd_ref_mutex); | 55 | static DEFINE_MUTEX(idecd_ref_mutex); |
56 | 56 | ||
57 | static void ide_cd_release(struct device *); | 57 | static void ide_cd_release(struct device *); |
@@ -1602,7 +1602,7 @@ static int idecd_open(struct block_device *bdev, fmode_t mode) | |||
1602 | struct cdrom_info *info; | 1602 | struct cdrom_info *info; |
1603 | int rc = -ENXIO; | 1603 | int rc = -ENXIO; |
1604 | 1604 | ||
1605 | lock_kernel(); | 1605 | mutex_lock(&ide_cd_mutex); |
1606 | info = ide_cd_get(bdev->bd_disk); | 1606 | info = ide_cd_get(bdev->bd_disk); |
1607 | if (!info) | 1607 | if (!info) |
1608 | goto out; | 1608 | goto out; |
@@ -1611,7 +1611,7 @@ static int idecd_open(struct block_device *bdev, fmode_t mode) | |||
1611 | if (rc < 0) | 1611 | if (rc < 0) |
1612 | ide_cd_put(info); | 1612 | ide_cd_put(info); |
1613 | out: | 1613 | out: |
1614 | unlock_kernel(); | 1614 | mutex_unlock(&ide_cd_mutex); |
1615 | return rc; | 1615 | return rc; |
1616 | } | 1616 | } |
1617 | 1617 | ||
@@ -1619,11 +1619,11 @@ static int idecd_release(struct gendisk *disk, fmode_t mode) | |||
1619 | { | 1619 | { |
1620 | struct cdrom_info *info = ide_drv_g(disk, cdrom_info); | 1620 | struct cdrom_info *info = ide_drv_g(disk, cdrom_info); |
1621 | 1621 | ||
1622 | lock_kernel(); | 1622 | mutex_lock(&ide_cd_mutex); |
1623 | cdrom_release(&info->devinfo, mode); | 1623 | cdrom_release(&info->devinfo, mode); |
1624 | 1624 | ||
1625 | ide_cd_put(info); | 1625 | ide_cd_put(info); |
1626 | unlock_kernel(); | 1626 | mutex_unlock(&ide_cd_mutex); |
1627 | 1627 | ||
1628 | return 0; | 1628 | return 0; |
1629 | } | 1629 | } |
@@ -1694,9 +1694,9 @@ static int idecd_ioctl(struct block_device *bdev, fmode_t mode, | |||
1694 | { | 1694 | { |
1695 | int ret; | 1695 | int ret; |
1696 | 1696 | ||
1697 | lock_kernel(); | 1697 | mutex_lock(&ide_cd_mutex); |
1698 | ret = idecd_locked_ioctl(bdev, mode, cmd, arg); | 1698 | ret = idecd_locked_ioctl(bdev, mode, cmd, arg); |
1699 | unlock_kernel(); | 1699 | mutex_unlock(&ide_cd_mutex); |
1700 | 1700 | ||
1701 | return ret; | 1701 | return ret; |
1702 | } | 1702 | } |
diff --git a/drivers/ide/ide-cs.c b/drivers/ide/ide-cs.c index 2a4cb9c18f01..404843e8611b 100644 --- a/drivers/ide/ide-cs.c +++ b/drivers/ide/ide-cs.c | |||
@@ -43,7 +43,6 @@ | |||
43 | #include <asm/io.h> | 43 | #include <asm/io.h> |
44 | #include <asm/system.h> | 44 | #include <asm/system.h> |
45 | 45 | ||
46 | #include <pcmcia/cs.h> | ||
47 | #include <pcmcia/cistpl.h> | 46 | #include <pcmcia/cistpl.h> |
48 | #include <pcmcia/ds.h> | 47 | #include <pcmcia/ds.h> |
49 | #include <pcmcia/cisreg.h> | 48 | #include <pcmcia/cisreg.h> |
@@ -72,17 +71,6 @@ static int ide_config(struct pcmcia_device *); | |||
72 | 71 | ||
73 | static void ide_detach(struct pcmcia_device *p_dev); | 72 | static void ide_detach(struct pcmcia_device *p_dev); |
74 | 73 | ||
75 | |||
76 | |||
77 | |||
78 | /*====================================================================== | ||
79 | |||
80 | ide_attach() creates an "instance" of the driver, allocating | ||
81 | local data structures for one device. The device is registered | ||
82 | with Card Services. | ||
83 | |||
84 | ======================================================================*/ | ||
85 | |||
86 | static int ide_probe(struct pcmcia_device *link) | 74 | static int ide_probe(struct pcmcia_device *link) |
87 | { | 75 | { |
88 | ide_info_t *info; | 76 | ide_info_t *info; |
@@ -97,23 +85,12 @@ static int ide_probe(struct pcmcia_device *link) | |||
97 | info->p_dev = link; | 85 | info->p_dev = link; |
98 | link->priv = info; | 86 | link->priv = info; |
99 | 87 | ||
100 | link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | 88 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO | |
101 | link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; | 89 | CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC; |
102 | link->conf.Attributes = CONF_ENABLE_IRQ; | ||
103 | link->conf.IntType = INT_MEMORY_AND_IO; | ||
104 | 90 | ||
105 | return ide_config(link); | 91 | return ide_config(link); |
106 | } /* ide_attach */ | 92 | } /* ide_attach */ |
107 | 93 | ||
108 | /*====================================================================== | ||
109 | |||
110 | This deletes a driver "instance". The device is de-registered | ||
111 | with Card Services. If it has been released, all local data | ||
112 | structures are freed. Otherwise, the structures will be freed | ||
113 | when the device is released. | ||
114 | |||
115 | ======================================================================*/ | ||
116 | |||
117 | static void ide_detach(struct pcmcia_device *link) | 94 | static void ide_detach(struct pcmcia_device *link) |
118 | { | 95 | { |
119 | ide_info_t *info = link->priv; | 96 | ide_info_t *info = link->priv; |
@@ -187,79 +164,31 @@ out_release: | |||
187 | return NULL; | 164 | return NULL; |
188 | } | 165 | } |
189 | 166 | ||
190 | /*====================================================================== | 167 | static int pcmcia_check_one_config(struct pcmcia_device *pdev, void *priv_data) |
191 | |||
192 | ide_config() is scheduled to run after a CARD_INSERTION event | ||
193 | is received, to configure the PCMCIA socket, and to make the | ||
194 | ide device available to the system. | ||
195 | |||
196 | ======================================================================*/ | ||
197 | |||
198 | struct pcmcia_config_check { | ||
199 | unsigned long ctl_base; | ||
200 | int skip_vcc; | ||
201 | int is_kme; | ||
202 | }; | ||
203 | |||
204 | static int pcmcia_check_one_config(struct pcmcia_device *pdev, | ||
205 | cistpl_cftable_entry_t *cfg, | ||
206 | cistpl_cftable_entry_t *dflt, | ||
207 | unsigned int vcc, | ||
208 | void *priv_data) | ||
209 | { | 168 | { |
210 | struct pcmcia_config_check *stk = priv_data; | 169 | int *is_kme = priv_data; |
211 | |||
212 | /* Check for matching Vcc, unless we're desperate */ | ||
213 | if (!stk->skip_vcc) { | ||
214 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
215 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) | ||
216 | return -ENODEV; | ||
217 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
218 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) | ||
219 | return -ENODEV; | ||
220 | } | ||
221 | } | ||
222 | 170 | ||
223 | if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 171 | if (!(pdev->resource[0]->flags & IO_DATA_PATH_WIDTH_8)) { |
224 | pdev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 172 | pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; |
225 | else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 173 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
226 | pdev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 174 | } |
227 | 175 | pdev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; | |
228 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 176 | pdev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; |
229 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io; | 177 | |
230 | pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK; | 178 | if (pdev->resource[1]->end) { |
231 | 179 | pdev->resource[0]->end = 8; | |
232 | pdev->conf.ConfigIndex = cfg->index; | 180 | pdev->resource[1]->end = (*is_kme) ? 2 : 1; |
233 | pdev->resource[0]->start = io->win[0].base; | 181 | } else { |
234 | if (!(io->flags & CISTPL_IO_16BIT)) { | 182 | if (pdev->resource[0]->end < 16) |
235 | pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; | ||
236 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | ||
237 | } | ||
238 | if (io->nwin == 2) { | ||
239 | pdev->resource[0]->end = 8; | ||
240 | pdev->resource[1]->start = io->win[1].base; | ||
241 | pdev->resource[1]->end = (stk->is_kme) ? 2 : 1; | ||
242 | if (pcmcia_request_io(pdev) != 0) | ||
243 | return -ENODEV; | ||
244 | stk->ctl_base = pdev->resource[1]->start; | ||
245 | } else if ((io->nwin == 1) && (io->win[0].len >= 16)) { | ||
246 | pdev->resource[0]->end = io->win[0].len; | ||
247 | pdev->resource[1]->end = 0; | ||
248 | if (pcmcia_request_io(pdev) != 0) | ||
249 | return -ENODEV; | ||
250 | stk->ctl_base = pdev->resource[0]->start + 0x0e; | ||
251 | } else | ||
252 | return -ENODEV; | 183 | return -ENODEV; |
253 | /* If we've got this far, we're done */ | ||
254 | return 0; | ||
255 | } | 184 | } |
256 | return -ENODEV; | 185 | |
186 | return pcmcia_request_io(pdev); | ||
257 | } | 187 | } |
258 | 188 | ||
259 | static int ide_config(struct pcmcia_device *link) | 189 | static int ide_config(struct pcmcia_device *link) |
260 | { | 190 | { |
261 | ide_info_t *info = link->priv; | 191 | ide_info_t *info = link->priv; |
262 | struct pcmcia_config_check *stk = NULL; | ||
263 | int ret = 0, is_kme = 0; | 192 | int ret = 0, is_kme = 0; |
264 | unsigned long io_base, ctl_base; | 193 | unsigned long io_base, ctl_base; |
265 | struct ide_host *host; | 194 | struct ide_host *host; |
@@ -270,23 +199,21 @@ static int ide_config(struct pcmcia_device *link) | |||
270 | ((link->card_id == PRODID_KME_KXLC005_A) || | 199 | ((link->card_id == PRODID_KME_KXLC005_A) || |
271 | (link->card_id == PRODID_KME_KXLC005_B))); | 200 | (link->card_id == PRODID_KME_KXLC005_B))); |
272 | 201 | ||
273 | stk = kzalloc(sizeof(*stk), GFP_KERNEL); | 202 | if (pcmcia_loop_config(link, pcmcia_check_one_config, &is_kme)) { |
274 | if (!stk) | 203 | link->config_flags &= ~CONF_AUTO_CHECK_VCC; |
275 | goto err_mem; | 204 | if (pcmcia_loop_config(link, pcmcia_check_one_config, &is_kme)) |
276 | stk->is_kme = is_kme; | ||
277 | stk->skip_vcc = io_base = ctl_base = 0; | ||
278 | |||
279 | if (pcmcia_loop_config(link, pcmcia_check_one_config, stk)) { | ||
280 | stk->skip_vcc = 1; | ||
281 | if (pcmcia_loop_config(link, pcmcia_check_one_config, stk)) | ||
282 | goto failed; /* No suitable config found */ | 205 | goto failed; /* No suitable config found */ |
283 | } | 206 | } |
284 | io_base = link->resource[0]->start; | 207 | io_base = link->resource[0]->start; |
285 | ctl_base = stk->ctl_base; | 208 | if (link->resource[1]->end) |
209 | ctl_base = link->resource[1]->start; | ||
210 | else | ||
211 | ctl_base = link->resource[0]->start + 0x0e; | ||
286 | 212 | ||
287 | if (!link->irq) | 213 | if (!link->irq) |
288 | goto failed; | 214 | goto failed; |
289 | ret = pcmcia_request_configuration(link, &link->conf); | 215 | |
216 | ret = pcmcia_enable_device(link); | ||
290 | if (ret) | 217 | if (ret) |
291 | goto failed; | 218 | goto failed; |
292 | 219 | ||
@@ -311,29 +238,15 @@ static int ide_config(struct pcmcia_device *link) | |||
311 | info->host = host; | 238 | info->host = host; |
312 | dev_info(&link->dev, "ide-cs: hd%c: Vpp = %d.%d\n", | 239 | dev_info(&link->dev, "ide-cs: hd%c: Vpp = %d.%d\n", |
313 | 'a' + host->ports[0]->index * 2, | 240 | 'a' + host->ports[0]->index * 2, |
314 | link->conf.Vpp / 10, link->conf.Vpp % 10); | 241 | link->vpp / 10, link->vpp % 10); |
315 | 242 | ||
316 | kfree(stk); | ||
317 | return 0; | 243 | return 0; |
318 | 244 | ||
319 | err_mem: | ||
320 | printk(KERN_NOTICE "ide-cs: ide_config failed memory allocation\n"); | ||
321 | goto failed; | ||
322 | |||
323 | failed: | 245 | failed: |
324 | kfree(stk); | ||
325 | ide_release(link); | 246 | ide_release(link); |
326 | return -ENODEV; | 247 | return -ENODEV; |
327 | } /* ide_config */ | 248 | } /* ide_config */ |
328 | 249 | ||
329 | /*====================================================================== | ||
330 | |||
331 | After a card is removed, ide_release() will unregister the net | ||
332 | device, and release the PCMCIA configuration. If the device is | ||
333 | still open, this will be postponed until it is closed. | ||
334 | |||
335 | ======================================================================*/ | ||
336 | |||
337 | static void ide_release(struct pcmcia_device *link) | 250 | static void ide_release(struct pcmcia_device *link) |
338 | { | 251 | { |
339 | ide_info_t *info = link->priv; | 252 | ide_info_t *info = link->priv; |
@@ -359,15 +272,6 @@ static void ide_release(struct pcmcia_device *link) | |||
359 | } /* ide_release */ | 272 | } /* ide_release */ |
360 | 273 | ||
361 | 274 | ||
362 | /*====================================================================== | ||
363 | |||
364 | The card status event handler. Mostly, this schedules other | ||
365 | stuff to run after an event is received. A CARD_REMOVAL event | ||
366 | also sets some flags to discourage the ide drivers from | ||
367 | talking to the ports. | ||
368 | |||
369 | ======================================================================*/ | ||
370 | |||
371 | static struct pcmcia_device_id ide_ids[] = { | 275 | static struct pcmcia_device_id ide_ids[] = { |
372 | PCMCIA_DEVICE_FUNC_ID(4), | 276 | PCMCIA_DEVICE_FUNC_ID(4), |
373 | PCMCIA_DEVICE_MANF_CARD(0x0000, 0x0000), /* Corsair */ | 277 | PCMCIA_DEVICE_MANF_CARD(0x0000, 0x0000), /* Corsair */ |
@@ -440,9 +344,7 @@ MODULE_DEVICE_TABLE(pcmcia, ide_ids); | |||
440 | 344 | ||
441 | static struct pcmcia_driver ide_cs_driver = { | 345 | static struct pcmcia_driver ide_cs_driver = { |
442 | .owner = THIS_MODULE, | 346 | .owner = THIS_MODULE, |
443 | .drv = { | 347 | .name = "ide-cs", |
444 | .name = "ide-cs", | ||
445 | }, | ||
446 | .probe = ide_probe, | 348 | .probe = ide_probe, |
447 | .remove = ide_detach, | 349 | .remove = ide_detach, |
448 | .id_table = ide_ids, | 350 | .id_table = ide_ids, |
diff --git a/drivers/ide/ide-disk_ioctl.c b/drivers/ide/ide-disk_ioctl.c index ec94c66918f6..da36f729ff32 100644 --- a/drivers/ide/ide-disk_ioctl.c +++ b/drivers/ide/ide-disk_ioctl.c | |||
@@ -1,10 +1,11 @@ | |||
1 | #include <linux/kernel.h> | 1 | #include <linux/kernel.h> |
2 | #include <linux/ide.h> | 2 | #include <linux/ide.h> |
3 | #include <linux/hdreg.h> | 3 | #include <linux/hdreg.h> |
4 | #include <linux/smp_lock.h> | 4 | #include <linux/mutex.h> |
5 | 5 | ||
6 | #include "ide-disk.h" | 6 | #include "ide-disk.h" |
7 | 7 | ||
8 | static DEFINE_MUTEX(ide_disk_ioctl_mutex); | ||
8 | static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = { | 9 | static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = { |
9 | { HDIO_GET_ADDRESS, HDIO_SET_ADDRESS, &ide_devset_address }, | 10 | { HDIO_GET_ADDRESS, HDIO_SET_ADDRESS, &ide_devset_address }, |
10 | { HDIO_GET_MULTCOUNT, HDIO_SET_MULTCOUNT, &ide_devset_multcount }, | 11 | { HDIO_GET_MULTCOUNT, HDIO_SET_MULTCOUNT, &ide_devset_multcount }, |
@@ -19,13 +20,13 @@ int ide_disk_ioctl(ide_drive_t *drive, struct block_device *bdev, fmode_t mode, | |||
19 | { | 20 | { |
20 | int err; | 21 | int err; |
21 | 22 | ||
22 | lock_kernel(); | 23 | mutex_lock(&ide_disk_ioctl_mutex); |
23 | err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); | 24 | err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings); |
24 | if (err != -EOPNOTSUPP) | 25 | if (err != -EOPNOTSUPP) |
25 | goto out; | 26 | goto out; |
26 | 27 | ||
27 | err = generic_ide_ioctl(drive, bdev, cmd, arg); | 28 | err = generic_ide_ioctl(drive, bdev, cmd, arg); |
28 | out: | 29 | out: |
29 | unlock_kernel(); | 30 | mutex_unlock(&ide_disk_ioctl_mutex); |
30 | return err; | 31 | return err; |
31 | } | 32 | } |
diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c index fd3d05ab3417..d267b7affad6 100644 --- a/drivers/ide/ide-floppy_ioctl.c +++ b/drivers/ide/ide-floppy_ioctl.c | |||
@@ -5,7 +5,7 @@ | |||
5 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
6 | #include <linux/ide.h> | 6 | #include <linux/ide.h> |
7 | #include <linux/cdrom.h> | 7 | #include <linux/cdrom.h> |
8 | #include <linux/smp_lock.h> | 8 | #include <linux/mutex.h> |
9 | 9 | ||
10 | #include <asm/unaligned.h> | 10 | #include <asm/unaligned.h> |
11 | 11 | ||
@@ -32,6 +32,7 @@ | |||
32 | * On exit we set nformats to the number of records we've actually initialized. | 32 | * On exit we set nformats to the number of records we've actually initialized. |
33 | */ | 33 | */ |
34 | 34 | ||
35 | static DEFINE_MUTEX(ide_floppy_ioctl_mutex); | ||
35 | static int ide_floppy_get_format_capacities(ide_drive_t *drive, | 36 | static int ide_floppy_get_format_capacities(ide_drive_t *drive, |
36 | struct ide_atapi_pc *pc, | 37 | struct ide_atapi_pc *pc, |
37 | int __user *arg) | 38 | int __user *arg) |
@@ -276,7 +277,7 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, | |||
276 | void __user *argp = (void __user *)arg; | 277 | void __user *argp = (void __user *)arg; |
277 | int err; | 278 | int err; |
278 | 279 | ||
279 | lock_kernel(); | 280 | mutex_lock(&ide_floppy_ioctl_mutex); |
280 | if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) { | 281 | if (cmd == CDROMEJECT || cmd == CDROM_LOCKDOOR) { |
281 | err = ide_floppy_lockdoor(drive, &pc, arg, cmd); | 282 | err = ide_floppy_lockdoor(drive, &pc, arg, cmd); |
282 | goto out; | 283 | goto out; |
@@ -298,6 +299,6 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev, | |||
298 | err = generic_ide_ioctl(drive, bdev, cmd, arg); | 299 | err = generic_ide_ioctl(drive, bdev, cmd, arg); |
299 | 300 | ||
300 | out: | 301 | out: |
301 | unlock_kernel(); | 302 | mutex_unlock(&ide_floppy_ioctl_mutex); |
302 | return err; | 303 | return err; |
303 | } | 304 | } |
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index 70aeeb18833e..35c4b43585e3 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c | |||
@@ -1,4 +1,3 @@ | |||
1 | #include <linux/smp_lock.h> | ||
2 | #include <linux/module.h> | 1 | #include <linux/module.h> |
3 | #include <linux/types.h> | 2 | #include <linux/types.h> |
4 | #include <linux/string.h> | 3 | #include <linux/string.h> |
@@ -23,6 +22,7 @@ | |||
23 | #define IDE_GD_VERSION "1.18" | 22 | #define IDE_GD_VERSION "1.18" |
24 | 23 | ||
25 | /* module parameters */ | 24 | /* module parameters */ |
25 | static DEFINE_MUTEX(ide_gd_mutex); | ||
26 | static unsigned long debug_mask; | 26 | static unsigned long debug_mask; |
27 | module_param(debug_mask, ulong, 0644); | 27 | module_param(debug_mask, ulong, 0644); |
28 | 28 | ||
@@ -242,9 +242,9 @@ static int ide_gd_unlocked_open(struct block_device *bdev, fmode_t mode) | |||
242 | { | 242 | { |
243 | int ret; | 243 | int ret; |
244 | 244 | ||
245 | lock_kernel(); | 245 | mutex_lock(&ide_gd_mutex); |
246 | ret = ide_gd_open(bdev, mode); | 246 | ret = ide_gd_open(bdev, mode); |
247 | unlock_kernel(); | 247 | mutex_unlock(&ide_gd_mutex); |
248 | 248 | ||
249 | return ret; | 249 | return ret; |
250 | } | 250 | } |
@@ -257,7 +257,7 @@ static int ide_gd_release(struct gendisk *disk, fmode_t mode) | |||
257 | 257 | ||
258 | ide_debug_log(IDE_DBG_FUNC, "enter"); | 258 | ide_debug_log(IDE_DBG_FUNC, "enter"); |
259 | 259 | ||
260 | lock_kernel(); | 260 | mutex_lock(&ide_gd_mutex); |
261 | if (idkp->openers == 1) | 261 | if (idkp->openers == 1) |
262 | drive->disk_ops->flush(drive); | 262 | drive->disk_ops->flush(drive); |
263 | 263 | ||
@@ -269,7 +269,7 @@ static int ide_gd_release(struct gendisk *disk, fmode_t mode) | |||
269 | idkp->openers--; | 269 | idkp->openers--; |
270 | 270 | ||
271 | ide_disk_put(idkp); | 271 | ide_disk_put(idkp); |
272 | unlock_kernel(); | 272 | mutex_unlock(&ide_gd_mutex); |
273 | 273 | ||
274 | return 0; | 274 | return 0; |
275 | } | 275 | } |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 4c3d1bfec0c5..068cef0a987a 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -1448,19 +1448,13 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d, | |||
1448 | if (hwif == NULL) | 1448 | if (hwif == NULL) |
1449 | continue; | 1449 | continue; |
1450 | 1450 | ||
1451 | if (hwif->present) | ||
1452 | hwif_register_devices(hwif); | ||
1453 | } | ||
1454 | |||
1455 | ide_host_for_each_port(i, hwif, host) { | ||
1456 | if (hwif == NULL) | ||
1457 | continue; | ||
1458 | |||
1459 | ide_sysfs_register_port(hwif); | 1451 | ide_sysfs_register_port(hwif); |
1460 | ide_proc_register_port(hwif); | 1452 | ide_proc_register_port(hwif); |
1461 | 1453 | ||
1462 | if (hwif->present) | 1454 | if (hwif->present) { |
1463 | ide_proc_port_register_devices(hwif); | 1455 | ide_proc_port_register_devices(hwif); |
1456 | hwif_register_devices(hwif); | ||
1457 | } | ||
1464 | } | 1458 | } |
1465 | 1459 | ||
1466 | return j ? 0 : -1; | 1460 | return j ? 0 : -1; |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 23d1d1c5587c..7ecb1ade8874 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -32,11 +32,9 @@ | |||
32 | #include <linux/errno.h> | 32 | #include <linux/errno.h> |
33 | #include <linux/genhd.h> | 33 | #include <linux/genhd.h> |
34 | #include <linux/seq_file.h> | 34 | #include <linux/seq_file.h> |
35 | #include <linux/smp_lock.h> | ||
36 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
37 | #include <linux/pci.h> | 36 | #include <linux/pci.h> |
38 | #include <linux/ide.h> | 37 | #include <linux/ide.h> |
39 | #include <linux/smp_lock.h> | ||
40 | #include <linux/completion.h> | 38 | #include <linux/completion.h> |
41 | #include <linux/bitops.h> | 39 | #include <linux/bitops.h> |
42 | #include <linux/mutex.h> | 40 | #include <linux/mutex.h> |
@@ -220,6 +218,7 @@ typedef struct ide_tape_obj { | |||
220 | char write_prot; | 218 | char write_prot; |
221 | } idetape_tape_t; | 219 | } idetape_tape_t; |
222 | 220 | ||
221 | static DEFINE_MUTEX(ide_tape_mutex); | ||
223 | static DEFINE_MUTEX(idetape_ref_mutex); | 222 | static DEFINE_MUTEX(idetape_ref_mutex); |
224 | 223 | ||
225 | static DEFINE_MUTEX(idetape_chrdev_mutex); | 224 | static DEFINE_MUTEX(idetape_chrdev_mutex); |
@@ -1426,9 +1425,9 @@ static long idetape_chrdev_ioctl(struct file *file, | |||
1426 | unsigned int cmd, unsigned long arg) | 1425 | unsigned int cmd, unsigned long arg) |
1427 | { | 1426 | { |
1428 | long ret; | 1427 | long ret; |
1429 | lock_kernel(); | 1428 | mutex_lock(&ide_tape_mutex); |
1430 | ret = do_idetape_chrdev_ioctl(file, cmd, arg); | 1429 | ret = do_idetape_chrdev_ioctl(file, cmd, arg); |
1431 | unlock_kernel(); | 1430 | mutex_unlock(&ide_tape_mutex); |
1432 | return ret; | 1431 | return ret; |
1433 | } | 1432 | } |
1434 | 1433 | ||
@@ -1910,9 +1909,9 @@ static int idetape_open(struct block_device *bdev, fmode_t mode) | |||
1910 | { | 1909 | { |
1911 | struct ide_tape_obj *tape; | 1910 | struct ide_tape_obj *tape; |
1912 | 1911 | ||
1913 | lock_kernel(); | 1912 | mutex_lock(&ide_tape_mutex); |
1914 | tape = ide_tape_get(bdev->bd_disk, false, 0); | 1913 | tape = ide_tape_get(bdev->bd_disk, false, 0); |
1915 | unlock_kernel(); | 1914 | mutex_unlock(&ide_tape_mutex); |
1916 | 1915 | ||
1917 | if (!tape) | 1916 | if (!tape) |
1918 | return -ENXIO; | 1917 | return -ENXIO; |
@@ -1924,9 +1923,9 @@ static int idetape_release(struct gendisk *disk, fmode_t mode) | |||
1924 | { | 1923 | { |
1925 | struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj); | 1924 | struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj); |
1926 | 1925 | ||
1927 | lock_kernel(); | 1926 | mutex_lock(&ide_tape_mutex); |
1928 | ide_tape_put(tape); | 1927 | ide_tape_put(tape); |
1929 | unlock_kernel(); | 1928 | mutex_unlock(&ide_tape_mutex); |
1930 | 1929 | ||
1931 | return 0; | 1930 | return 0; |
1932 | } | 1931 | } |
@@ -1938,11 +1937,11 @@ static int idetape_ioctl(struct block_device *bdev, fmode_t mode, | |||
1938 | ide_drive_t *drive = tape->drive; | 1937 | ide_drive_t *drive = tape->drive; |
1939 | int err; | 1938 | int err; |
1940 | 1939 | ||
1941 | lock_kernel(); | 1940 | mutex_lock(&ide_tape_mutex); |
1942 | err = generic_ide_ioctl(drive, bdev, cmd, arg); | 1941 | err = generic_ide_ioctl(drive, bdev, cmd, arg); |
1943 | if (err == -EINVAL) | 1942 | if (err == -EINVAL) |
1944 | err = idetape_blkdev_ioctl(drive, cmd, arg); | 1943 | err = idetape_blkdev_ioctl(drive, cmd, arg); |
1945 | unlock_kernel(); | 1944 | mutex_unlock(&ide_tape_mutex); |
1946 | 1945 | ||
1947 | return err; | 1946 | return err; |
1948 | } | 1947 | } |