diff options
Diffstat (limited to 'drivers')
249 files changed, 2567 insertions, 1750 deletions
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 10f160dc75b1..a2f46d587d55 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
@@ -267,9 +267,9 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
267 | { | 267 | { |
268 | acpi_status status; | 268 | acpi_status status; |
269 | 269 | ||
270 | if (dev->firmware_data) { | 270 | if (dev->archdata.acpi_handle) { |
271 | printk(KERN_WARNING PREFIX | 271 | printk(KERN_WARNING PREFIX |
272 | "Drivers changed 'firmware_data' for %s\n", dev->bus_id); | 272 | "Drivers changed 'acpi_handle' for %s\n", dev->bus_id); |
273 | return -EINVAL; | 273 | return -EINVAL; |
274 | } | 274 | } |
275 | get_device(dev); | 275 | get_device(dev); |
@@ -278,25 +278,26 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
278 | put_device(dev); | 278 | put_device(dev); |
279 | return -EINVAL; | 279 | return -EINVAL; |
280 | } | 280 | } |
281 | dev->firmware_data = handle; | 281 | dev->archdata.acpi_handle = handle; |
282 | 282 | ||
283 | return 0; | 283 | return 0; |
284 | } | 284 | } |
285 | 285 | ||
286 | static int acpi_unbind_one(struct device *dev) | 286 | static int acpi_unbind_one(struct device *dev) |
287 | { | 287 | { |
288 | if (!dev->firmware_data) | 288 | if (!dev->archdata.acpi_handle) |
289 | return 0; | 289 | return 0; |
290 | if (dev == acpi_get_physical_device(dev->firmware_data)) { | 290 | if (dev == acpi_get_physical_device(dev->archdata.acpi_handle)) { |
291 | /* acpi_get_physical_device increase refcnt by one */ | 291 | /* acpi_get_physical_device increase refcnt by one */ |
292 | put_device(dev); | 292 | put_device(dev); |
293 | acpi_detach_data(dev->firmware_data, acpi_glue_data_handler); | 293 | acpi_detach_data(dev->archdata.acpi_handle, |
294 | dev->firmware_data = NULL; | 294 | acpi_glue_data_handler); |
295 | dev->archdata.acpi_handle = NULL; | ||
295 | /* acpi_bind_one increase refcnt by one */ | 296 | /* acpi_bind_one increase refcnt by one */ |
296 | put_device(dev); | 297 | put_device(dev); |
297 | } else { | 298 | } else { |
298 | printk(KERN_ERR PREFIX | 299 | printk(KERN_ERR PREFIX |
299 | "Oops, 'firmware_data' corrupt for %s\n", dev->bus_id); | 300 | "Oops, 'acpi_handle' corrupt for %s\n", dev->bus_id); |
300 | } | 301 | } |
301 | return 0; | 302 | return 0; |
302 | } | 303 | } |
@@ -328,7 +329,8 @@ static int acpi_platform_notify(struct device *dev) | |||
328 | if (!ret) { | 329 | if (!ret) { |
329 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 330 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
330 | 331 | ||
331 | acpi_get_name(dev->firmware_data, ACPI_FULL_PATHNAME, &buffer); | 332 | acpi_get_name(dev->archdata.acpi_handle, |
333 | ACPI_FULL_PATHNAME, &buffer); | ||
332 | DBG("Device %s -> %s\n", dev->bus_id, (char *)buffer.pointer); | 334 | DBG("Device %s -> %s\n", dev->bus_id, (char *)buffer.pointer); |
333 | kfree(buffer.pointer); | 335 | kfree(buffer.pointer); |
334 | } else | 336 | } else |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index f510e1196dc6..bddb14e91d3c 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -78,6 +78,7 @@ enum { | |||
78 | 78 | ||
79 | board_ahci = 0, | 79 | board_ahci = 0, |
80 | board_ahci_vt8251 = 1, | 80 | board_ahci_vt8251 = 1, |
81 | board_ahci_ign_iferr = 2, | ||
81 | 82 | ||
82 | /* global controller registers */ | 83 | /* global controller registers */ |
83 | HOST_CAP = 0x00, /* host capabilities */ | 84 | HOST_CAP = 0x00, /* host capabilities */ |
@@ -168,6 +169,7 @@ enum { | |||
168 | /* ap->flags bits */ | 169 | /* ap->flags bits */ |
169 | AHCI_FLAG_RESET_NEEDS_CLO = (1 << 24), | 170 | AHCI_FLAG_RESET_NEEDS_CLO = (1 << 24), |
170 | AHCI_FLAG_NO_NCQ = (1 << 25), | 171 | AHCI_FLAG_NO_NCQ = (1 << 25), |
172 | AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 26), /* ignore IRQ_IF_ERR */ | ||
171 | }; | 173 | }; |
172 | 174 | ||
173 | struct ahci_cmd_hdr { | 175 | struct ahci_cmd_hdr { |
@@ -295,6 +297,17 @@ static const struct ata_port_info ahci_port_info[] = { | |||
295 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ | 297 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ |
296 | .port_ops = &ahci_ops, | 298 | .port_ops = &ahci_ops, |
297 | }, | 299 | }, |
300 | /* board_ahci_ign_iferr */ | ||
301 | { | ||
302 | .sht = &ahci_sht, | ||
303 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
304 | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | | ||
305 | ATA_FLAG_SKIP_D2H_BSY | | ||
306 | AHCI_FLAG_IGN_IRQ_IF_ERR, | ||
307 | .pio_mask = 0x1f, /* pio0-4 */ | ||
308 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ | ||
309 | .port_ops = &ahci_ops, | ||
310 | }, | ||
298 | }; | 311 | }; |
299 | 312 | ||
300 | static const struct pci_device_id ahci_pci_tbl[] = { | 313 | static const struct pci_device_id ahci_pci_tbl[] = { |
@@ -327,11 +340,11 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
327 | { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */ | 340 | { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */ |
328 | 341 | ||
329 | /* JMicron */ | 342 | /* JMicron */ |
330 | { PCI_VDEVICE(JMICRON, 0x2360), board_ahci }, /* JMicron JMB360 */ | 343 | { PCI_VDEVICE(JMICRON, 0x2360), board_ahci_ign_iferr }, /* JMB360 */ |
331 | { PCI_VDEVICE(JMICRON, 0x2361), board_ahci }, /* JMicron JMB361 */ | 344 | { PCI_VDEVICE(JMICRON, 0x2361), board_ahci_ign_iferr }, /* JMB361 */ |
332 | { PCI_VDEVICE(JMICRON, 0x2363), board_ahci }, /* JMicron JMB363 */ | 345 | { PCI_VDEVICE(JMICRON, 0x2363), board_ahci_ign_iferr }, /* JMB363 */ |
333 | { PCI_VDEVICE(JMICRON, 0x2365), board_ahci }, /* JMicron JMB365 */ | 346 | { PCI_VDEVICE(JMICRON, 0x2365), board_ahci_ign_iferr }, /* JMB365 */ |
334 | { PCI_VDEVICE(JMICRON, 0x2366), board_ahci }, /* JMicron JMB366 */ | 347 | { PCI_VDEVICE(JMICRON, 0x2366), board_ahci_ign_iferr }, /* JMB366 */ |
335 | 348 | ||
336 | /* ATI */ | 349 | /* ATI */ |
337 | { PCI_VDEVICE(ATI, 0x4380), board_ahci }, /* ATI SB600 non-raid */ | 350 | { PCI_VDEVICE(ATI, 0x4380), board_ahci }, /* ATI SB600 non-raid */ |
@@ -980,6 +993,10 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) | |||
980 | /* analyze @irq_stat */ | 993 | /* analyze @irq_stat */ |
981 | ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); | 994 | ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat); |
982 | 995 | ||
996 | /* some controllers set IRQ_IF_ERR on device errors, ignore it */ | ||
997 | if (ap->flags & AHCI_FLAG_IGN_IRQ_IF_ERR) | ||
998 | irq_stat &= ~PORT_IRQ_IF_ERR; | ||
999 | |||
983 | if (irq_stat & PORT_IRQ_TF_ERR) | 1000 | if (irq_stat & PORT_IRQ_TF_ERR) |
984 | err_mask |= AC_ERR_DEV; | 1001 | err_mask |= AC_ERR_DEV; |
985 | 1002 | ||
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 377425e71391..4a80ff9312b8 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
@@ -116,6 +116,7 @@ static struct scsi_host_template generic_sht = { | |||
116 | .proc_name = DRV_NAME, | 116 | .proc_name = DRV_NAME, |
117 | .dma_boundary = ATA_DMA_BOUNDARY, | 117 | .dma_boundary = ATA_DMA_BOUNDARY, |
118 | .slave_configure = ata_scsi_slave_config, | 118 | .slave_configure = ata_scsi_slave_config, |
119 | .slave_destroy = ata_scsi_slave_destroy, | ||
119 | .bios_param = ata_std_bios_param, | 120 | .bios_param = ata_std_bios_param, |
120 | }; | 121 | }; |
121 | 122 | ||
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c index 1d695df5860a..64eed99f6814 100644 --- a/drivers/ata/pata_ali.c +++ b/drivers/ata/pata_ali.c | |||
@@ -346,6 +346,7 @@ static struct scsi_host_template ali_sht = { | |||
346 | .proc_name = DRV_NAME, | 346 | .proc_name = DRV_NAME, |
347 | .dma_boundary = ATA_DMA_BOUNDARY, | 347 | .dma_boundary = ATA_DMA_BOUNDARY, |
348 | .slave_configure = ata_scsi_slave_config, | 348 | .slave_configure = ata_scsi_slave_config, |
349 | .slave_destroy = ata_scsi_slave_destroy, | ||
349 | .bios_param = ata_std_bios_param, | 350 | .bios_param = ata_std_bios_param, |
350 | }; | 351 | }; |
351 | 352 | ||
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c index 5c47a9e0e0ca..8be46a63af74 100644 --- a/drivers/ata/pata_amd.c +++ b/drivers/ata/pata_amd.c | |||
@@ -333,6 +333,7 @@ static struct scsi_host_template amd_sht = { | |||
333 | .proc_name = DRV_NAME, | 333 | .proc_name = DRV_NAME, |
334 | .dma_boundary = ATA_DMA_BOUNDARY, | 334 | .dma_boundary = ATA_DMA_BOUNDARY, |
335 | .slave_configure = ata_scsi_slave_config, | 335 | .slave_configure = ata_scsi_slave_config, |
336 | .slave_destroy = ata_scsi_slave_destroy, | ||
336 | .bios_param = ata_std_bios_param, | 337 | .bios_param = ata_std_bios_param, |
337 | }; | 338 | }; |
338 | 339 | ||
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c index 96a098020a8f..2cd30761ca1f 100644 --- a/drivers/ata/pata_artop.c +++ b/drivers/ata/pata_artop.c | |||
@@ -314,6 +314,7 @@ static struct scsi_host_template artop_sht = { | |||
314 | .proc_name = DRV_NAME, | 314 | .proc_name = DRV_NAME, |
315 | .dma_boundary = ATA_DMA_BOUNDARY, | 315 | .dma_boundary = ATA_DMA_BOUNDARY, |
316 | .slave_configure = ata_scsi_slave_config, | 316 | .slave_configure = ata_scsi_slave_config, |
317 | .slave_destroy = ata_scsi_slave_destroy, | ||
317 | .bios_param = ata_std_bios_param, | 318 | .bios_param = ata_std_bios_param, |
318 | }; | 319 | }; |
319 | 320 | ||
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index 1ce28d2125f4..4e1d3b59adbb 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
@@ -216,6 +216,7 @@ static struct scsi_host_template atiixp_sht = { | |||
216 | .proc_name = DRV_NAME, | 216 | .proc_name = DRV_NAME, |
217 | .dma_boundary = ATA_DMA_BOUNDARY, | 217 | .dma_boundary = ATA_DMA_BOUNDARY, |
218 | .slave_configure = ata_scsi_slave_config, | 218 | .slave_configure = ata_scsi_slave_config, |
219 | .slave_destroy = ata_scsi_slave_destroy, | ||
219 | .bios_param = ata_std_bios_param, | 220 | .bios_param = ata_std_bios_param, |
220 | }; | 221 | }; |
221 | 222 | ||
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c index b9bbd1d454bf..29a60df465da 100644 --- a/drivers/ata/pata_cmd64x.c +++ b/drivers/ata/pata_cmd64x.c | |||
@@ -275,6 +275,7 @@ static struct scsi_host_template cmd64x_sht = { | |||
275 | .proc_name = DRV_NAME, | 275 | .proc_name = DRV_NAME, |
276 | .dma_boundary = ATA_DMA_BOUNDARY, | 276 | .dma_boundary = ATA_DMA_BOUNDARY, |
277 | .slave_configure = ata_scsi_slave_config, | 277 | .slave_configure = ata_scsi_slave_config, |
278 | .slave_destroy = ata_scsi_slave_destroy, | ||
278 | .bios_param = ata_std_bios_param, | 279 | .bios_param = ata_std_bios_param, |
279 | }; | 280 | }; |
280 | 281 | ||
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c index 2cd3c0ff76df..33d2b88f9c79 100644 --- a/drivers/ata/pata_cs5520.c +++ b/drivers/ata/pata_cs5520.c | |||
@@ -166,6 +166,7 @@ static struct scsi_host_template cs5520_sht = { | |||
166 | .proc_name = DRV_NAME, | 166 | .proc_name = DRV_NAME, |
167 | .dma_boundary = ATA_DMA_BOUNDARY, | 167 | .dma_boundary = ATA_DMA_BOUNDARY, |
168 | .slave_configure = ata_scsi_slave_config, | 168 | .slave_configure = ata_scsi_slave_config, |
169 | .slave_destroy = ata_scsi_slave_destroy, | ||
169 | .bios_param = ata_std_bios_param, | 170 | .bios_param = ata_std_bios_param, |
170 | }; | 171 | }; |
171 | 172 | ||
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c index a07cc81ef791..981f49223469 100644 --- a/drivers/ata/pata_cs5530.c +++ b/drivers/ata/pata_cs5530.c | |||
@@ -180,6 +180,7 @@ static struct scsi_host_template cs5530_sht = { | |||
180 | .proc_name = DRV_NAME, | 180 | .proc_name = DRV_NAME, |
181 | .dma_boundary = ATA_DMA_BOUNDARY, | 181 | .dma_boundary = ATA_DMA_BOUNDARY, |
182 | .slave_configure = ata_scsi_slave_config, | 182 | .slave_configure = ata_scsi_slave_config, |
183 | .slave_destroy = ata_scsi_slave_destroy, | ||
183 | .bios_param = ata_std_bios_param, | 184 | .bios_param = ata_std_bios_param, |
184 | }; | 185 | }; |
185 | 186 | ||
diff --git a/drivers/ata/pata_cs5535.c b/drivers/ata/pata_cs5535.c index f8def3f9c618..8dafa4a49fdc 100644 --- a/drivers/ata/pata_cs5535.c +++ b/drivers/ata/pata_cs5535.c | |||
@@ -184,6 +184,7 @@ static struct scsi_host_template cs5535_sht = { | |||
184 | .proc_name = DRV_NAME, | 184 | .proc_name = DRV_NAME, |
185 | .dma_boundary = ATA_DMA_BOUNDARY, | 185 | .dma_boundary = ATA_DMA_BOUNDARY, |
186 | .slave_configure = ata_scsi_slave_config, | 186 | .slave_configure = ata_scsi_slave_config, |
187 | .slave_destroy = ata_scsi_slave_destroy, | ||
187 | .bios_param = ata_std_bios_param, | 188 | .bios_param = ata_std_bios_param, |
188 | }; | 189 | }; |
189 | 190 | ||
diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c index 247b43608b14..5a0b811907ee 100644 --- a/drivers/ata/pata_cypress.c +++ b/drivers/ata/pata_cypress.c | |||
@@ -135,6 +135,7 @@ static struct scsi_host_template cy82c693_sht = { | |||
135 | .proc_name = DRV_NAME, | 135 | .proc_name = DRV_NAME, |
136 | .dma_boundary = ATA_DMA_BOUNDARY, | 136 | .dma_boundary = ATA_DMA_BOUNDARY, |
137 | .slave_configure = ata_scsi_slave_config, | 137 | .slave_configure = ata_scsi_slave_config, |
138 | .slave_destroy = ata_scsi_slave_destroy, | ||
138 | .bios_param = ata_std_bios_param, | 139 | .bios_param = ata_std_bios_param, |
139 | }; | 140 | }; |
140 | 141 | ||
diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c index ef18c60fe140..755f79279de3 100644 --- a/drivers/ata/pata_efar.c +++ b/drivers/ata/pata_efar.c | |||
@@ -233,6 +233,7 @@ static struct scsi_host_template efar_sht = { | |||
233 | .proc_name = DRV_NAME, | 233 | .proc_name = DRV_NAME, |
234 | .dma_boundary = ATA_DMA_BOUNDARY, | 234 | .dma_boundary = ATA_DMA_BOUNDARY, |
235 | .slave_configure = ata_scsi_slave_config, | 235 | .slave_configure = ata_scsi_slave_config, |
236 | .slave_destroy = ata_scsi_slave_destroy, | ||
236 | .bios_param = ata_std_bios_param, | 237 | .bios_param = ata_std_bios_param, |
237 | }; | 238 | }; |
238 | 239 | ||
diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c index 6d3e4c0f15fe..c0e150a9586b 100644 --- a/drivers/ata/pata_hpt366.c +++ b/drivers/ata/pata_hpt366.c | |||
@@ -329,6 +329,7 @@ static struct scsi_host_template hpt36x_sht = { | |||
329 | .proc_name = DRV_NAME, | 329 | .proc_name = DRV_NAME, |
330 | .dma_boundary = ATA_DMA_BOUNDARY, | 330 | .dma_boundary = ATA_DMA_BOUNDARY, |
331 | .slave_configure = ata_scsi_slave_config, | 331 | .slave_configure = ata_scsi_slave_config, |
332 | .slave_destroy = ata_scsi_slave_destroy, | ||
332 | .bios_param = ata_std_bios_param, | 333 | .bios_param = ata_std_bios_param, |
333 | }; | 334 | }; |
334 | 335 | ||
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index fce3fcdc7e79..1eeb16f0fb02 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
@@ -775,6 +775,7 @@ static struct scsi_host_template hpt37x_sht = { | |||
775 | .proc_name = DRV_NAME, | 775 | .proc_name = DRV_NAME, |
776 | .dma_boundary = ATA_DMA_BOUNDARY, | 776 | .dma_boundary = ATA_DMA_BOUNDARY, |
777 | .slave_configure = ata_scsi_slave_config, | 777 | .slave_configure = ata_scsi_slave_config, |
778 | .slave_destroy = ata_scsi_slave_destroy, | ||
778 | .bios_param = ata_std_bios_param, | 779 | .bios_param = ata_std_bios_param, |
779 | }; | 780 | }; |
780 | 781 | ||
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c index 58cfb2bc8098..47d7664e9eee 100644 --- a/drivers/ata/pata_hpt3x2n.c +++ b/drivers/ata/pata_hpt3x2n.c | |||
@@ -341,6 +341,7 @@ static struct scsi_host_template hpt3x2n_sht = { | |||
341 | .proc_name = DRV_NAME, | 341 | .proc_name = DRV_NAME, |
342 | .dma_boundary = ATA_DMA_BOUNDARY, | 342 | .dma_boundary = ATA_DMA_BOUNDARY, |
343 | .slave_configure = ata_scsi_slave_config, | 343 | .slave_configure = ata_scsi_slave_config, |
344 | .slave_destroy = ata_scsi_slave_destroy, | ||
344 | .bios_param = ata_std_bios_param, | 345 | .bios_param = ata_std_bios_param, |
345 | }; | 346 | }; |
346 | 347 | ||
diff --git a/drivers/ata/pata_hpt3x3.c b/drivers/ata/pata_hpt3x3.c index 3334d72e251b..d216cc564b56 100644 --- a/drivers/ata/pata_hpt3x3.c +++ b/drivers/ata/pata_hpt3x3.c | |||
@@ -118,6 +118,7 @@ static struct scsi_host_template hpt3x3_sht = { | |||
118 | .proc_name = DRV_NAME, | 118 | .proc_name = DRV_NAME, |
119 | .dma_boundary = ATA_DMA_BOUNDARY, | 119 | .dma_boundary = ATA_DMA_BOUNDARY, |
120 | .slave_configure = ata_scsi_slave_config, | 120 | .slave_configure = ata_scsi_slave_config, |
121 | .slave_destroy = ata_scsi_slave_destroy, | ||
121 | .bios_param = ata_std_bios_param, | 122 | .bios_param = ata_std_bios_param, |
122 | }; | 123 | }; |
123 | 124 | ||
diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c index 640b8b0954f5..40ca2b82b7fc 100644 --- a/drivers/ata/pata_isapnp.c +++ b/drivers/ata/pata_isapnp.c | |||
@@ -34,6 +34,7 @@ static struct scsi_host_template isapnp_sht = { | |||
34 | .proc_name = DRV_NAME, | 34 | .proc_name = DRV_NAME, |
35 | .dma_boundary = ATA_DMA_BOUNDARY, | 35 | .dma_boundary = ATA_DMA_BOUNDARY, |
36 | .slave_configure = ata_scsi_slave_config, | 36 | .slave_configure = ata_scsi_slave_config, |
37 | .slave_destroy = ata_scsi_slave_destroy, | ||
37 | .bios_param = ata_std_bios_param, | 38 | .bios_param = ata_std_bios_param, |
38 | }; | 39 | }; |
39 | 40 | ||
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index 18ff3e59a89b..7f68f14be6fd 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
@@ -675,6 +675,7 @@ static struct scsi_host_template it821x_sht = { | |||
675 | .proc_name = DRV_NAME, | 675 | .proc_name = DRV_NAME, |
676 | .dma_boundary = ATA_DMA_BOUNDARY, | 676 | .dma_boundary = ATA_DMA_BOUNDARY, |
677 | .slave_configure = ata_scsi_slave_config, | 677 | .slave_configure = ata_scsi_slave_config, |
678 | .slave_destroy = ata_scsi_slave_destroy, | ||
678 | .bios_param = ata_std_bios_param, | 679 | .bios_param = ata_std_bios_param, |
679 | }; | 680 | }; |
680 | 681 | ||
diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c index 52a2bdf3c38d..0210b10d49cd 100644 --- a/drivers/ata/pata_jmicron.c +++ b/drivers/ata/pata_jmicron.c | |||
@@ -136,6 +136,7 @@ static struct scsi_host_template jmicron_sht = { | |||
136 | .proc_name = DRV_NAME, | 136 | .proc_name = DRV_NAME, |
137 | .dma_boundary = ATA_DMA_BOUNDARY, | 137 | .dma_boundary = ATA_DMA_BOUNDARY, |
138 | .slave_configure = ata_scsi_slave_config, | 138 | .slave_configure = ata_scsi_slave_config, |
139 | .slave_destroy = ata_scsi_slave_destroy, | ||
139 | /* Use standard CHS mapping rules */ | 140 | /* Use standard CHS mapping rules */ |
140 | .bios_param = ata_std_bios_param, | 141 | .bios_param = ata_std_bios_param, |
141 | }; | 142 | }; |
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c index 10231ef731d1..b39078b2a47b 100644 --- a/drivers/ata/pata_legacy.c +++ b/drivers/ata/pata_legacy.c | |||
@@ -135,6 +135,7 @@ static struct scsi_host_template legacy_sht = { | |||
135 | .proc_name = DRV_NAME, | 135 | .proc_name = DRV_NAME, |
136 | .dma_boundary = ATA_DMA_BOUNDARY, | 136 | .dma_boundary = ATA_DMA_BOUNDARY, |
137 | .slave_configure = ata_scsi_slave_config, | 137 | .slave_configure = ata_scsi_slave_config, |
138 | .slave_destroy = ata_scsi_slave_destroy, | ||
138 | .bios_param = ata_std_bios_param, | 139 | .bios_param = ata_std_bios_param, |
139 | }; | 140 | }; |
140 | 141 | ||
diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c index 9dfe3e9abea3..e00d406bfdf5 100644 --- a/drivers/ata/pata_mpiix.c +++ b/drivers/ata/pata_mpiix.c | |||
@@ -166,6 +166,7 @@ static struct scsi_host_template mpiix_sht = { | |||
166 | .proc_name = DRV_NAME, | 166 | .proc_name = DRV_NAME, |
167 | .dma_boundary = ATA_DMA_BOUNDARY, | 167 | .dma_boundary = ATA_DMA_BOUNDARY, |
168 | .slave_configure = ata_scsi_slave_config, | 168 | .slave_configure = ata_scsi_slave_config, |
169 | .slave_destroy = ata_scsi_slave_destroy, | ||
169 | .bios_param = ata_std_bios_param, | 170 | .bios_param = ata_std_bios_param, |
170 | }; | 171 | }; |
171 | 172 | ||
diff --git a/drivers/ata/pata_netcell.c b/drivers/ata/pata_netcell.c index f5672de99c22..1963a4d35873 100644 --- a/drivers/ata/pata_netcell.c +++ b/drivers/ata/pata_netcell.c | |||
@@ -62,6 +62,7 @@ static struct scsi_host_template netcell_sht = { | |||
62 | .proc_name = DRV_NAME, | 62 | .proc_name = DRV_NAME, |
63 | .dma_boundary = ATA_DMA_BOUNDARY, | 63 | .dma_boundary = ATA_DMA_BOUNDARY, |
64 | .slave_configure = ata_scsi_slave_config, | 64 | .slave_configure = ata_scsi_slave_config, |
65 | .slave_destroy = ata_scsi_slave_destroy, | ||
65 | /* Use standard CHS mapping rules */ | 66 | /* Use standard CHS mapping rules */ |
66 | .bios_param = ata_std_bios_param, | 67 | .bios_param = ata_std_bios_param, |
67 | }; | 68 | }; |
diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c index 2a3dbeed89b4..7ec800f00ec8 100644 --- a/drivers/ata/pata_ns87410.c +++ b/drivers/ata/pata_ns87410.c | |||
@@ -156,6 +156,7 @@ static struct scsi_host_template ns87410_sht = { | |||
156 | .proc_name = DRV_NAME, | 156 | .proc_name = DRV_NAME, |
157 | .dma_boundary = ATA_DMA_BOUNDARY, | 157 | .dma_boundary = ATA_DMA_BOUNDARY, |
158 | .slave_configure = ata_scsi_slave_config, | 158 | .slave_configure = ata_scsi_slave_config, |
159 | .slave_destroy = ata_scsi_slave_destroy, | ||
159 | .bios_param = ata_std_bios_param, | 160 | .bios_param = ata_std_bios_param, |
160 | }; | 161 | }; |
161 | 162 | ||
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c index fc947dfecd73..8837256632e9 100644 --- a/drivers/ata/pata_oldpiix.c +++ b/drivers/ata/pata_oldpiix.c | |||
@@ -231,6 +231,7 @@ static struct scsi_host_template oldpiix_sht = { | |||
231 | .proc_name = DRV_NAME, | 231 | .proc_name = DRV_NAME, |
232 | .dma_boundary = ATA_DMA_BOUNDARY, | 232 | .dma_boundary = ATA_DMA_BOUNDARY, |
233 | .slave_configure = ata_scsi_slave_config, | 233 | .slave_configure = ata_scsi_slave_config, |
234 | .slave_destroy = ata_scsi_slave_destroy, | ||
234 | .bios_param = ata_std_bios_param, | 235 | .bios_param = ata_std_bios_param, |
235 | }; | 236 | }; |
236 | 237 | ||
diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c index a7320ba15575..c6319cf50de4 100644 --- a/drivers/ata/pata_opti.c +++ b/drivers/ata/pata_opti.c | |||
@@ -202,6 +202,7 @@ static struct scsi_host_template opti_sht = { | |||
202 | .proc_name = DRV_NAME, | 202 | .proc_name = DRV_NAME, |
203 | .dma_boundary = ATA_DMA_BOUNDARY, | 203 | .dma_boundary = ATA_DMA_BOUNDARY, |
204 | .slave_configure = ata_scsi_slave_config, | 204 | .slave_configure = ata_scsi_slave_config, |
205 | .slave_destroy = ata_scsi_slave_destroy, | ||
205 | .bios_param = ata_std_bios_param, | 206 | .bios_param = ata_std_bios_param, |
206 | }; | 207 | }; |
207 | 208 | ||
diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c index c6906b4215de..2f4770cce04e 100644 --- a/drivers/ata/pata_optidma.c +++ b/drivers/ata/pata_optidma.c | |||
@@ -359,6 +359,7 @@ static struct scsi_host_template optidma_sht = { | |||
359 | .proc_name = DRV_NAME, | 359 | .proc_name = DRV_NAME, |
360 | .dma_boundary = ATA_DMA_BOUNDARY, | 360 | .dma_boundary = ATA_DMA_BOUNDARY, |
361 | .slave_configure = ata_scsi_slave_config, | 361 | .slave_configure = ata_scsi_slave_config, |
362 | .slave_destroy = ata_scsi_slave_destroy, | ||
362 | .bios_param = ata_std_bios_param, | 363 | .bios_param = ata_std_bios_param, |
363 | }; | 364 | }; |
364 | 365 | ||
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c index e93ea2702c73..999922de476e 100644 --- a/drivers/ata/pata_pcmcia.c +++ b/drivers/ata/pata_pcmcia.c | |||
@@ -69,6 +69,7 @@ static struct scsi_host_template pcmcia_sht = { | |||
69 | .proc_name = DRV_NAME, | 69 | .proc_name = DRV_NAME, |
70 | .dma_boundary = ATA_DMA_BOUNDARY, | 70 | .dma_boundary = ATA_DMA_BOUNDARY, |
71 | .slave_configure = ata_scsi_slave_config, | 71 | .slave_configure = ata_scsi_slave_config, |
72 | .slave_destroy = ata_scsi_slave_destroy, | ||
72 | .bios_param = ata_std_bios_param, | 73 | .bios_param = ata_std_bios_param, |
73 | }; | 74 | }; |
74 | 75 | ||
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c index d894d9918b1d..beb6d10a234b 100644 --- a/drivers/ata/pata_pdc2027x.c +++ b/drivers/ata/pata_pdc2027x.c | |||
@@ -141,6 +141,7 @@ static struct scsi_host_template pdc2027x_sht = { | |||
141 | .proc_name = DRV_NAME, | 141 | .proc_name = DRV_NAME, |
142 | .dma_boundary = ATA_DMA_BOUNDARY, | 142 | .dma_boundary = ATA_DMA_BOUNDARY, |
143 | .slave_configure = ata_scsi_slave_config, | 143 | .slave_configure = ata_scsi_slave_config, |
144 | .slave_destroy = ata_scsi_slave_destroy, | ||
144 | .bios_param = ata_std_bios_param, | 145 | .bios_param = ata_std_bios_param, |
145 | }; | 146 | }; |
146 | 147 | ||
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c index 5ba9eb20a6c2..6baf51b2fda1 100644 --- a/drivers/ata/pata_pdc202xx_old.c +++ b/drivers/ata/pata_pdc202xx_old.c | |||
@@ -269,6 +269,7 @@ static struct scsi_host_template pdc_sht = { | |||
269 | .proc_name = DRV_NAME, | 269 | .proc_name = DRV_NAME, |
270 | .dma_boundary = ATA_DMA_BOUNDARY, | 270 | .dma_boundary = ATA_DMA_BOUNDARY, |
271 | .slave_configure = ata_scsi_slave_config, | 271 | .slave_configure = ata_scsi_slave_config, |
272 | .slave_destroy = ata_scsi_slave_destroy, | ||
272 | .bios_param = ata_std_bios_param, | 273 | .bios_param = ata_std_bios_param, |
273 | }; | 274 | }; |
274 | 275 | ||
diff --git a/drivers/ata/pata_qdi.c b/drivers/ata/pata_qdi.c index 2c3cc0ccc606..314938dea1fc 100644 --- a/drivers/ata/pata_qdi.c +++ b/drivers/ata/pata_qdi.c | |||
@@ -164,6 +164,7 @@ static struct scsi_host_template qdi_sht = { | |||
164 | .proc_name = DRV_NAME, | 164 | .proc_name = DRV_NAME, |
165 | .dma_boundary = ATA_DMA_BOUNDARY, | 165 | .dma_boundary = ATA_DMA_BOUNDARY, |
166 | .slave_configure = ata_scsi_slave_config, | 166 | .slave_configure = ata_scsi_slave_config, |
167 | .slave_destroy = ata_scsi_slave_destroy, | ||
167 | .bios_param = ata_std_bios_param, | 168 | .bios_param = ata_std_bios_param, |
168 | }; | 169 | }; |
169 | 170 | ||
diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c index 1af83d7694d5..048c2bb21ef1 100644 --- a/drivers/ata/pata_radisys.c +++ b/drivers/ata/pata_radisys.c | |||
@@ -227,6 +227,7 @@ static struct scsi_host_template radisys_sht = { | |||
227 | .proc_name = DRV_NAME, | 227 | .proc_name = DRV_NAME, |
228 | .dma_boundary = ATA_DMA_BOUNDARY, | 228 | .dma_boundary = ATA_DMA_BOUNDARY, |
229 | .slave_configure = ata_scsi_slave_config, | 229 | .slave_configure = ata_scsi_slave_config, |
230 | .slave_destroy = ata_scsi_slave_destroy, | ||
230 | .bios_param = ata_std_bios_param, | 231 | .bios_param = ata_std_bios_param, |
231 | }; | 232 | }; |
232 | 233 | ||
diff --git a/drivers/ata/pata_rz1000.c b/drivers/ata/pata_rz1000.c index 4533b6357d99..e4e5ea423fef 100644 --- a/drivers/ata/pata_rz1000.c +++ b/drivers/ata/pata_rz1000.c | |||
@@ -90,6 +90,7 @@ static struct scsi_host_template rz1000_sht = { | |||
90 | .proc_name = DRV_NAME, | 90 | .proc_name = DRV_NAME, |
91 | .dma_boundary = ATA_DMA_BOUNDARY, | 91 | .dma_boundary = ATA_DMA_BOUNDARY, |
92 | .slave_configure = ata_scsi_slave_config, | 92 | .slave_configure = ata_scsi_slave_config, |
93 | .slave_destroy = ata_scsi_slave_destroy, | ||
93 | .bios_param = ata_std_bios_param, | 94 | .bios_param = ata_std_bios_param, |
94 | }; | 95 | }; |
95 | 96 | ||
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c index 067d9d223e35..0c75dae74764 100644 --- a/drivers/ata/pata_sc1200.c +++ b/drivers/ata/pata_sc1200.c | |||
@@ -193,6 +193,7 @@ static struct scsi_host_template sc1200_sht = { | |||
193 | .proc_name = DRV_NAME, | 193 | .proc_name = DRV_NAME, |
194 | .dma_boundary = ATA_DMA_BOUNDARY, | 194 | .dma_boundary = ATA_DMA_BOUNDARY, |
195 | .slave_configure = ata_scsi_slave_config, | 195 | .slave_configure = ata_scsi_slave_config, |
196 | .slave_destroy = ata_scsi_slave_destroy, | ||
196 | .bios_param = ata_std_bios_param, | 197 | .bios_param = ata_std_bios_param, |
197 | }; | 198 | }; |
198 | 199 | ||
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c index 5bbf76ec14a4..be7f60efcb61 100644 --- a/drivers/ata/pata_serverworks.c +++ b/drivers/ata/pata_serverworks.c | |||
@@ -325,6 +325,7 @@ static struct scsi_host_template serverworks_sht = { | |||
325 | .proc_name = DRV_NAME, | 325 | .proc_name = DRV_NAME, |
326 | .dma_boundary = ATA_DMA_BOUNDARY, | 326 | .dma_boundary = ATA_DMA_BOUNDARY, |
327 | .slave_configure = ata_scsi_slave_config, | 327 | .slave_configure = ata_scsi_slave_config, |
328 | .slave_destroy = ata_scsi_slave_destroy, | ||
328 | .bios_param = ata_std_bios_param, | 329 | .bios_param = ata_std_bios_param, |
329 | }; | 330 | }; |
330 | 331 | ||
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c index 4a2b72b4be8a..11942fd03b55 100644 --- a/drivers/ata/pata_sil680.c +++ b/drivers/ata/pata_sil680.c | |||
@@ -225,6 +225,7 @@ static struct scsi_host_template sil680_sht = { | |||
225 | .proc_name = DRV_NAME, | 225 | .proc_name = DRV_NAME, |
226 | .dma_boundary = ATA_DMA_BOUNDARY, | 226 | .dma_boundary = ATA_DMA_BOUNDARY, |
227 | .slave_configure = ata_scsi_slave_config, | 227 | .slave_configure = ata_scsi_slave_config, |
228 | .slave_destroy = ata_scsi_slave_destroy, | ||
228 | .bios_param = ata_std_bios_param, | 229 | .bios_param = ata_std_bios_param, |
229 | }; | 230 | }; |
230 | 231 | ||
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c index b9ffafb4198c..91e85f90941d 100644 --- a/drivers/ata/pata_sis.c +++ b/drivers/ata/pata_sis.c | |||
@@ -545,6 +545,7 @@ static struct scsi_host_template sis_sht = { | |||
545 | .proc_name = DRV_NAME, | 545 | .proc_name = DRV_NAME, |
546 | .dma_boundary = ATA_DMA_BOUNDARY, | 546 | .dma_boundary = ATA_DMA_BOUNDARY, |
547 | .slave_configure = ata_scsi_slave_config, | 547 | .slave_configure = ata_scsi_slave_config, |
548 | .slave_destroy = ata_scsi_slave_destroy, | ||
548 | .bios_param = ata_std_bios_param, | 549 | .bios_param = ata_std_bios_param, |
549 | }; | 550 | }; |
550 | 551 | ||
diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c index 08a6dc88676f..dc1cfc6d805b 100644 --- a/drivers/ata/pata_sl82c105.c +++ b/drivers/ata/pata_sl82c105.c | |||
@@ -237,6 +237,7 @@ static struct scsi_host_template sl82c105_sht = { | |||
237 | .proc_name = DRV_NAME, | 237 | .proc_name = DRV_NAME, |
238 | .dma_boundary = ATA_DMA_BOUNDARY, | 238 | .dma_boundary = ATA_DMA_BOUNDARY, |
239 | .slave_configure = ata_scsi_slave_config, | 239 | .slave_configure = ata_scsi_slave_config, |
240 | .slave_destroy = ata_scsi_slave_destroy, | ||
240 | .bios_param = ata_std_bios_param, | 241 | .bios_param = ata_std_bios_param, |
241 | }; | 242 | }; |
242 | 243 | ||
diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c index 9640f80e8b0d..bfda1f7e760a 100644 --- a/drivers/ata/pata_triflex.c +++ b/drivers/ata/pata_triflex.c | |||
@@ -192,6 +192,7 @@ static struct scsi_host_template triflex_sht = { | |||
192 | .proc_name = DRV_NAME, | 192 | .proc_name = DRV_NAME, |
193 | .dma_boundary = ATA_DMA_BOUNDARY, | 193 | .dma_boundary = ATA_DMA_BOUNDARY, |
194 | .slave_configure = ata_scsi_slave_config, | 194 | .slave_configure = ata_scsi_slave_config, |
195 | .slave_destroy = ata_scsi_slave_destroy, | ||
195 | .bios_param = ata_std_bios_param, | 196 | .bios_param = ata_std_bios_param, |
196 | }; | 197 | }; |
197 | 198 | ||
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index 1e7be9eee9c3..c5f1616d224d 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
@@ -295,6 +295,7 @@ static struct scsi_host_template via_sht = { | |||
295 | .proc_name = DRV_NAME, | 295 | .proc_name = DRV_NAME, |
296 | .dma_boundary = ATA_DMA_BOUNDARY, | 296 | .dma_boundary = ATA_DMA_BOUNDARY, |
297 | .slave_configure = ata_scsi_slave_config, | 297 | .slave_configure = ata_scsi_slave_config, |
298 | .slave_destroy = ata_scsi_slave_destroy, | ||
298 | .bios_param = ata_std_bios_param, | 299 | .bios_param = ata_std_bios_param, |
299 | }; | 300 | }; |
300 | 301 | ||
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 9ed1c60048f0..bb7ef570514c 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
@@ -305,7 +305,7 @@ static void clear_lockup (struct atm_vcc *vcc, IADEV *dev) { | |||
305 | ** | R | NZ | 5-bit exponent | 9-bit mantissa | | 305 | ** | R | NZ | 5-bit exponent | 9-bit mantissa | |
306 | ** +----+----+------------------+-------------------------------+ | 306 | ** +----+----+------------------+-------------------------------+ |
307 | ** | 307 | ** |
308 | ** R = reserverd (written as 0) | 308 | ** R = reserved (written as 0) |
309 | ** NZ = 0 if 0 cells/sec; 1 otherwise | 309 | ** NZ = 0 if 0 cells/sec; 1 otherwise |
310 | ** | 310 | ** |
311 | ** if NZ = 1, rate = 1.mmmmmmmmm x 2^(eeeee) cells/sec | 311 | ** if NZ = 1, rate = 1.mmmmmmmmm x 2^(eeeee) cells/sec |
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 7d8a7ce73fb3..472810f8e6e7 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -355,6 +355,21 @@ static void device_remove_attrs(struct bus_type * bus, struct device * dev) | |||
355 | } | 355 | } |
356 | } | 356 | } |
357 | 357 | ||
358 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
359 | static int make_deprecated_bus_links(struct device *dev) | ||
360 | { | ||
361 | return sysfs_create_link(&dev->kobj, | ||
362 | &dev->bus->subsys.kset.kobj, "bus"); | ||
363 | } | ||
364 | |||
365 | static void remove_deprecated_bus_links(struct device *dev) | ||
366 | { | ||
367 | sysfs_remove_link(&dev->kobj, "bus"); | ||
368 | } | ||
369 | #else | ||
370 | static inline int make_deprecated_bus_links(struct device *dev) { return 0; } | ||
371 | static inline void remove_deprecated_bus_links(struct device *dev) { } | ||
372 | #endif | ||
358 | 373 | ||
359 | /** | 374 | /** |
360 | * bus_add_device - add device to bus | 375 | * bus_add_device - add device to bus |
@@ -381,8 +396,7 @@ int bus_add_device(struct device * dev) | |||
381 | &dev->bus->subsys.kset.kobj, "subsystem"); | 396 | &dev->bus->subsys.kset.kobj, "subsystem"); |
382 | if (error) | 397 | if (error) |
383 | goto out_subsys; | 398 | goto out_subsys; |
384 | error = sysfs_create_link(&dev->kobj, | 399 | error = make_deprecated_bus_links(dev); |
385 | &dev->bus->subsys.kset.kobj, "bus"); | ||
386 | if (error) | 400 | if (error) |
387 | goto out_deprecated; | 401 | goto out_deprecated; |
388 | } | 402 | } |
@@ -436,7 +450,7 @@ void bus_remove_device(struct device * dev) | |||
436 | { | 450 | { |
437 | if (dev->bus) { | 451 | if (dev->bus) { |
438 | sysfs_remove_link(&dev->kobj, "subsystem"); | 452 | sysfs_remove_link(&dev->kobj, "subsystem"); |
439 | sysfs_remove_link(&dev->kobj, "bus"); | 453 | remove_deprecated_bus_links(dev); |
440 | sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id); | 454 | sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id); |
441 | device_remove_attrs(dev->bus, dev); | 455 | device_remove_attrs(dev->bus, dev); |
442 | if (dev->is_registered) { | 456 | if (dev->is_registered) { |
@@ -724,6 +738,8 @@ int bus_register(struct bus_type * bus) | |||
724 | { | 738 | { |
725 | int retval; | 739 | int retval; |
726 | 740 | ||
741 | BLOCKING_INIT_NOTIFIER_HEAD(&bus->bus_notifier); | ||
742 | |||
727 | retval = kobject_set_name(&bus->subsys.kset.kobj, "%s", bus->name); | 743 | retval = kobject_set_name(&bus->subsys.kset.kobj, "%s", bus->name); |
728 | if (retval) | 744 | if (retval) |
729 | goto out; | 745 | goto out; |
@@ -782,6 +798,18 @@ void bus_unregister(struct bus_type * bus) | |||
782 | subsystem_unregister(&bus->subsys); | 798 | subsystem_unregister(&bus->subsys); |
783 | } | 799 | } |
784 | 800 | ||
801 | int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb) | ||
802 | { | ||
803 | return blocking_notifier_chain_register(&bus->bus_notifier, nb); | ||
804 | } | ||
805 | EXPORT_SYMBOL_GPL(bus_register_notifier); | ||
806 | |||
807 | int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb) | ||
808 | { | ||
809 | return blocking_notifier_chain_unregister(&bus->bus_notifier, nb); | ||
810 | } | ||
811 | EXPORT_SYMBOL_GPL(bus_unregister_notifier); | ||
812 | |||
785 | int __init buses_init(void) | 813 | int __init buses_init(void) |
786 | { | 814 | { |
787 | return subsystem_register(&bus_subsys); | 815 | return subsystem_register(&bus_subsys); |
diff --git a/drivers/base/class.c b/drivers/base/class.c index 0ff267a248db..f098881f45b2 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
@@ -352,6 +352,92 @@ static const char *class_uevent_name(struct kset *kset, struct kobject *kobj) | |||
352 | return class_dev->class->name; | 352 | return class_dev->class->name; |
353 | } | 353 | } |
354 | 354 | ||
355 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
356 | char *make_class_name(const char *name, struct kobject *kobj) | ||
357 | { | ||
358 | char *class_name; | ||
359 | int size; | ||
360 | |||
361 | size = strlen(name) + strlen(kobject_name(kobj)) + 2; | ||
362 | |||
363 | class_name = kmalloc(size, GFP_KERNEL); | ||
364 | if (!class_name) | ||
365 | return ERR_PTR(-ENOMEM); | ||
366 | |||
367 | strcpy(class_name, name); | ||
368 | strcat(class_name, ":"); | ||
369 | strcat(class_name, kobject_name(kobj)); | ||
370 | return class_name; | ||
371 | } | ||
372 | |||
373 | static int deprecated_class_uevent(char **envp, int num_envp, int *cur_index, | ||
374 | char *buffer, int buffer_size, | ||
375 | int *cur_len, | ||
376 | struct class_device *class_dev) | ||
377 | { | ||
378 | struct device *dev = class_dev->dev; | ||
379 | char *path; | ||
380 | |||
381 | if (!dev) | ||
382 | return 0; | ||
383 | |||
384 | /* add device, backing this class device (deprecated) */ | ||
385 | path = kobject_get_path(&dev->kobj, GFP_KERNEL); | ||
386 | |||
387 | add_uevent_var(envp, num_envp, cur_index, buffer, buffer_size, | ||
388 | cur_len, "PHYSDEVPATH=%s", path); | ||
389 | kfree(path); | ||
390 | |||
391 | if (dev->bus) | ||
392 | add_uevent_var(envp, num_envp, cur_index, | ||
393 | buffer, buffer_size, cur_len, | ||
394 | "PHYSDEVBUS=%s", dev->bus->name); | ||
395 | |||
396 | if (dev->driver) | ||
397 | add_uevent_var(envp, num_envp, cur_index, | ||
398 | buffer, buffer_size, cur_len, | ||
399 | "PHYSDEVDRIVER=%s", dev->driver->name); | ||
400 | return 0; | ||
401 | } | ||
402 | |||
403 | static int make_deprecated_class_device_links(struct class_device *class_dev) | ||
404 | { | ||
405 | char *class_name; | ||
406 | int error; | ||
407 | |||
408 | if (!class_dev->dev) | ||
409 | return 0; | ||
410 | |||
411 | class_name = make_class_name(class_dev->class->name, &class_dev->kobj); | ||
412 | error = sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, | ||
413 | class_name); | ||
414 | kfree(class_name); | ||
415 | return error; | ||
416 | } | ||
417 | |||
418 | static void remove_deprecated_class_device_links(struct class_device *class_dev) | ||
419 | { | ||
420 | char *class_name; | ||
421 | |||
422 | if (!class_dev->dev) | ||
423 | return; | ||
424 | |||
425 | class_name = make_class_name(class_dev->class->name, &class_dev->kobj); | ||
426 | sysfs_remove_link(&class_dev->dev->kobj, class_name); | ||
427 | kfree(class_name); | ||
428 | } | ||
429 | #else | ||
430 | static inline int deprecated_class_uevent(char **envp, int num_envp, | ||
431 | int *cur_index, char *buffer, | ||
432 | int buffer_size, int *cur_len, | ||
433 | struct class_device *class_dev) | ||
434 | { return 0; } | ||
435 | static inline int make_deprecated_class_device_links(struct class_device *cd) | ||
436 | { return 0; } | ||
437 | static void remove_deprecated_class_device_links(struct class_device *cd) | ||
438 | { } | ||
439 | #endif | ||
440 | |||
355 | static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, | 441 | static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, |
356 | int num_envp, char *buffer, int buffer_size) | 442 | int num_envp, char *buffer, int buffer_size) |
357 | { | 443 | { |
@@ -362,25 +448,8 @@ static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, | |||
362 | 448 | ||
363 | pr_debug("%s - name = %s\n", __FUNCTION__, class_dev->class_id); | 449 | pr_debug("%s - name = %s\n", __FUNCTION__, class_dev->class_id); |
364 | 450 | ||
365 | if (class_dev->dev) { | 451 | deprecated_class_uevent(envp, num_envp, &i, buffer, buffer_size, |
366 | /* add device, backing this class device (deprecated) */ | 452 | &length, class_dev); |
367 | struct device *dev = class_dev->dev; | ||
368 | char *path = kobject_get_path(&dev->kobj, GFP_KERNEL); | ||
369 | |||
370 | add_uevent_var(envp, num_envp, &i, buffer, buffer_size, | ||
371 | &length, "PHYSDEVPATH=%s", path); | ||
372 | kfree(path); | ||
373 | |||
374 | if (dev->bus) | ||
375 | add_uevent_var(envp, num_envp, &i, | ||
376 | buffer, buffer_size, &length, | ||
377 | "PHYSDEVBUS=%s", dev->bus->name); | ||
378 | |||
379 | if (dev->driver) | ||
380 | add_uevent_var(envp, num_envp, &i, | ||
381 | buffer, buffer_size, &length, | ||
382 | "PHYSDEVDRIVER=%s", dev->driver->name); | ||
383 | } | ||
384 | 453 | ||
385 | if (MAJOR(class_dev->devt)) { | 454 | if (MAJOR(class_dev->devt)) { |
386 | add_uevent_var(envp, num_envp, &i, | 455 | add_uevent_var(envp, num_envp, &i, |
@@ -506,29 +575,11 @@ void class_device_initialize(struct class_device *class_dev) | |||
506 | INIT_LIST_HEAD(&class_dev->node); | 575 | INIT_LIST_HEAD(&class_dev->node); |
507 | } | 576 | } |
508 | 577 | ||
509 | char *make_class_name(const char *name, struct kobject *kobj) | ||
510 | { | ||
511 | char *class_name; | ||
512 | int size; | ||
513 | |||
514 | size = strlen(name) + strlen(kobject_name(kobj)) + 2; | ||
515 | |||
516 | class_name = kmalloc(size, GFP_KERNEL); | ||
517 | if (!class_name) | ||
518 | return ERR_PTR(-ENOMEM); | ||
519 | |||
520 | strcpy(class_name, name); | ||
521 | strcat(class_name, ":"); | ||
522 | strcat(class_name, kobject_name(kobj)); | ||
523 | return class_name; | ||
524 | } | ||
525 | |||
526 | int class_device_add(struct class_device *class_dev) | 578 | int class_device_add(struct class_device *class_dev) |
527 | { | 579 | { |
528 | struct class *parent_class = NULL; | 580 | struct class *parent_class = NULL; |
529 | struct class_device *parent_class_dev = NULL; | 581 | struct class_device *parent_class_dev = NULL; |
530 | struct class_interface *class_intf; | 582 | struct class_interface *class_intf; |
531 | char *class_name = NULL; | ||
532 | int error = -EINVAL; | 583 | int error = -EINVAL; |
533 | 584 | ||
534 | class_dev = class_device_get(class_dev); | 585 | class_dev = class_device_get(class_dev); |
@@ -599,20 +650,18 @@ int class_device_add(struct class_device *class_dev) | |||
599 | goto out5; | 650 | goto out5; |
600 | 651 | ||
601 | if (class_dev->dev) { | 652 | if (class_dev->dev) { |
602 | class_name = make_class_name(class_dev->class->name, | ||
603 | &class_dev->kobj); | ||
604 | error = sysfs_create_link(&class_dev->kobj, | 653 | error = sysfs_create_link(&class_dev->kobj, |
605 | &class_dev->dev->kobj, "device"); | 654 | &class_dev->dev->kobj, "device"); |
606 | if (error) | 655 | if (error) |
607 | goto out6; | 656 | goto out6; |
608 | error = sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, | ||
609 | class_name); | ||
610 | if (error) | ||
611 | goto out7; | ||
612 | } | 657 | } |
613 | 658 | ||
614 | error = class_device_add_groups(class_dev); | 659 | error = class_device_add_groups(class_dev); |
615 | if (error) | 660 | if (error) |
661 | goto out7; | ||
662 | |||
663 | error = make_deprecated_class_device_links(class_dev); | ||
664 | if (error) | ||
616 | goto out8; | 665 | goto out8; |
617 | 666 | ||
618 | kobject_uevent(&class_dev->kobj, KOBJ_ADD); | 667 | kobject_uevent(&class_dev->kobj, KOBJ_ADD); |
@@ -629,8 +678,7 @@ int class_device_add(struct class_device *class_dev) | |||
629 | goto out1; | 678 | goto out1; |
630 | 679 | ||
631 | out8: | 680 | out8: |
632 | if (class_dev->dev) | 681 | class_device_remove_groups(class_dev); |
633 | sysfs_remove_link(&class_dev->kobj, class_name); | ||
634 | out7: | 682 | out7: |
635 | if (class_dev->dev) | 683 | if (class_dev->dev) |
636 | sysfs_remove_link(&class_dev->kobj, "device"); | 684 | sysfs_remove_link(&class_dev->kobj, "device"); |
@@ -649,7 +697,6 @@ int class_device_add(struct class_device *class_dev) | |||
649 | class_put(parent_class); | 697 | class_put(parent_class); |
650 | out1: | 698 | out1: |
651 | class_device_put(class_dev); | 699 | class_device_put(class_dev); |
652 | kfree(class_name); | ||
653 | return error; | 700 | return error; |
654 | } | 701 | } |
655 | 702 | ||
@@ -726,7 +773,6 @@ void class_device_del(struct class_device *class_dev) | |||
726 | struct class *parent_class = class_dev->class; | 773 | struct class *parent_class = class_dev->class; |
727 | struct class_device *parent_device = class_dev->parent; | 774 | struct class_device *parent_device = class_dev->parent; |
728 | struct class_interface *class_intf; | 775 | struct class_interface *class_intf; |
729 | char *class_name = NULL; | ||
730 | 776 | ||
731 | if (parent_class) { | 777 | if (parent_class) { |
732 | down(&parent_class->sem); | 778 | down(&parent_class->sem); |
@@ -738,10 +784,8 @@ void class_device_del(struct class_device *class_dev) | |||
738 | } | 784 | } |
739 | 785 | ||
740 | if (class_dev->dev) { | 786 | if (class_dev->dev) { |
741 | class_name = make_class_name(class_dev->class->name, | 787 | remove_deprecated_class_device_links(class_dev); |
742 | &class_dev->kobj); | ||
743 | sysfs_remove_link(&class_dev->kobj, "device"); | 788 | sysfs_remove_link(&class_dev->kobj, "device"); |
744 | sysfs_remove_link(&class_dev->dev->kobj, class_name); | ||
745 | } | 789 | } |
746 | sysfs_remove_link(&class_dev->kobj, "subsystem"); | 790 | sysfs_remove_link(&class_dev->kobj, "subsystem"); |
747 | class_device_remove_file(class_dev, &class_dev->uevent_attr); | 791 | class_device_remove_file(class_dev, &class_dev->uevent_attr); |
@@ -755,7 +799,6 @@ void class_device_del(struct class_device *class_dev) | |||
755 | 799 | ||
756 | class_device_put(parent_device); | 800 | class_device_put(parent_device); |
757 | class_put(parent_class); | 801 | class_put(parent_class); |
758 | kfree(class_name); | ||
759 | } | 802 | } |
760 | 803 | ||
761 | void class_device_unregister(struct class_device *class_dev) | 804 | void class_device_unregister(struct class_device *class_dev) |
@@ -804,14 +847,17 @@ int class_device_rename(struct class_device *class_dev, char *new_name) | |||
804 | pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id, | 847 | pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id, |
805 | new_name); | 848 | new_name); |
806 | 849 | ||
850 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
807 | if (class_dev->dev) | 851 | if (class_dev->dev) |
808 | old_class_name = make_class_name(class_dev->class->name, | 852 | old_class_name = make_class_name(class_dev->class->name, |
809 | &class_dev->kobj); | 853 | &class_dev->kobj); |
854 | #endif | ||
810 | 855 | ||
811 | strlcpy(class_dev->class_id, new_name, KOBJ_NAME_LEN); | 856 | strlcpy(class_dev->class_id, new_name, KOBJ_NAME_LEN); |
812 | 857 | ||
813 | error = kobject_rename(&class_dev->kobj, new_name); | 858 | error = kobject_rename(&class_dev->kobj, new_name); |
814 | 859 | ||
860 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
815 | if (class_dev->dev) { | 861 | if (class_dev->dev) { |
816 | new_class_name = make_class_name(class_dev->class->name, | 862 | new_class_name = make_class_name(class_dev->class->name, |
817 | &class_dev->kobj); | 863 | &class_dev->kobj); |
@@ -819,6 +865,7 @@ int class_device_rename(struct class_device *class_dev, char *new_name) | |||
819 | new_class_name); | 865 | new_class_name); |
820 | sysfs_remove_link(&class_dev->dev->kobj, old_class_name); | 866 | sysfs_remove_link(&class_dev->dev->kobj, old_class_name); |
821 | } | 867 | } |
868 | #endif | ||
822 | class_device_put(class_dev); | 869 | class_device_put(class_dev); |
823 | 870 | ||
824 | kfree(old_class_name); | 871 | kfree(old_class_name); |
@@ -893,23 +940,6 @@ void class_interface_unregister(struct class_interface *class_intf) | |||
893 | class_put(parent); | 940 | class_put(parent); |
894 | } | 941 | } |
895 | 942 | ||
896 | int virtual_device_parent(struct device *dev) | ||
897 | { | ||
898 | if (!dev->class) | ||
899 | return -ENODEV; | ||
900 | |||
901 | if (!dev->class->virtual_dir) { | ||
902 | static struct kobject *virtual_dir = NULL; | ||
903 | |||
904 | if (!virtual_dir) | ||
905 | virtual_dir = kobject_add_dir(&devices_subsys.kset.kobj, "virtual"); | ||
906 | dev->class->virtual_dir = kobject_add_dir(virtual_dir, dev->class->name); | ||
907 | } | ||
908 | |||
909 | dev->kobj.parent = dev->class->virtual_dir; | ||
910 | return 0; | ||
911 | } | ||
912 | |||
913 | int __init classes_init(void) | 943 | int __init classes_init(void) |
914 | { | 944 | { |
915 | int retval; | 945 | int retval; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 002fde46d38d..e4b530ef757d 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/string.h> | 18 | #include <linux/string.h> |
19 | #include <linux/kdev_t.h> | 19 | #include <linux/kdev_t.h> |
20 | #include <linux/notifier.h> | ||
20 | 21 | ||
21 | #include <asm/semaphore.h> | 22 | #include <asm/semaphore.h> |
22 | 23 | ||
@@ -153,20 +154,24 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp, | |||
153 | "MINOR=%u", MINOR(dev->devt)); | 154 | "MINOR=%u", MINOR(dev->devt)); |
154 | } | 155 | } |
155 | 156 | ||
157 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
156 | /* add bus name (same as SUBSYSTEM, deprecated) */ | 158 | /* add bus name (same as SUBSYSTEM, deprecated) */ |
157 | if (dev->bus) | 159 | if (dev->bus) |
158 | add_uevent_var(envp, num_envp, &i, | 160 | add_uevent_var(envp, num_envp, &i, |
159 | buffer, buffer_size, &length, | 161 | buffer, buffer_size, &length, |
160 | "PHYSDEVBUS=%s", dev->bus->name); | 162 | "PHYSDEVBUS=%s", dev->bus->name); |
163 | #endif | ||
161 | 164 | ||
162 | /* add driver name (PHYSDEV* values are deprecated)*/ | 165 | /* add driver name (PHYSDEV* values are deprecated)*/ |
163 | if (dev->driver) { | 166 | if (dev->driver) { |
164 | add_uevent_var(envp, num_envp, &i, | 167 | add_uevent_var(envp, num_envp, &i, |
165 | buffer, buffer_size, &length, | 168 | buffer, buffer_size, &length, |
166 | "DRIVER=%s", dev->driver->name); | 169 | "DRIVER=%s", dev->driver->name); |
170 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
167 | add_uevent_var(envp, num_envp, &i, | 171 | add_uevent_var(envp, num_envp, &i, |
168 | buffer, buffer_size, &length, | 172 | buffer, buffer_size, &length, |
169 | "PHYSDEVDRIVER=%s", dev->driver->name); | 173 | "PHYSDEVDRIVER=%s", dev->driver->name); |
174 | #endif | ||
170 | } | 175 | } |
171 | 176 | ||
172 | /* terminate, set to next free slot, shrink available space */ | 177 | /* terminate, set to next free slot, shrink available space */ |
@@ -383,6 +388,52 @@ void device_initialize(struct device *dev) | |||
383 | device_init_wakeup(dev, 0); | 388 | device_init_wakeup(dev, 0); |
384 | } | 389 | } |
385 | 390 | ||
391 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
392 | static int setup_parent(struct device *dev, struct device *parent) | ||
393 | { | ||
394 | /* Set the parent to the class, not the parent device */ | ||
395 | /* this keeps sysfs from having a symlink to make old udevs happy */ | ||
396 | if (dev->class) | ||
397 | dev->kobj.parent = &dev->class->subsys.kset.kobj; | ||
398 | else if (parent) | ||
399 | dev->kobj.parent = &parent->kobj; | ||
400 | |||
401 | return 0; | ||
402 | } | ||
403 | #else | ||
404 | static int virtual_device_parent(struct device *dev) | ||
405 | { | ||
406 | if (!dev->class) | ||
407 | return -ENODEV; | ||
408 | |||
409 | if (!dev->class->virtual_dir) { | ||
410 | static struct kobject *virtual_dir = NULL; | ||
411 | |||
412 | if (!virtual_dir) | ||
413 | virtual_dir = kobject_add_dir(&devices_subsys.kset.kobj, "virtual"); | ||
414 | dev->class->virtual_dir = kobject_add_dir(virtual_dir, dev->class->name); | ||
415 | } | ||
416 | |||
417 | dev->kobj.parent = dev->class->virtual_dir; | ||
418 | return 0; | ||
419 | } | ||
420 | |||
421 | static int setup_parent(struct device *dev, struct device *parent) | ||
422 | { | ||
423 | int error; | ||
424 | |||
425 | /* if this is a class device, and has no parent, create one */ | ||
426 | if ((dev->class) && (parent == NULL)) { | ||
427 | error = virtual_device_parent(dev); | ||
428 | if (error) | ||
429 | return error; | ||
430 | } else if (parent) | ||
431 | dev->kobj.parent = &parent->kobj; | ||
432 | |||
433 | return 0; | ||
434 | } | ||
435 | #endif | ||
436 | |||
386 | /** | 437 | /** |
387 | * device_add - add device to device hierarchy. | 438 | * device_add - add device to device hierarchy. |
388 | * @dev: device. | 439 | * @dev: device. |
@@ -405,29 +456,29 @@ int device_add(struct device *dev) | |||
405 | if (!dev || !strlen(dev->bus_id)) | 456 | if (!dev || !strlen(dev->bus_id)) |
406 | goto Error; | 457 | goto Error; |
407 | 458 | ||
408 | /* if this is a class device, and has no parent, create one */ | 459 | pr_debug("DEV: registering device: ID = '%s'\n", dev->bus_id); |
409 | if ((dev->class) && (dev->parent == NULL)) { | ||
410 | error = virtual_device_parent(dev); | ||
411 | if (error) | ||
412 | goto Error; | ||
413 | } | ||
414 | 460 | ||
415 | parent = get_device(dev->parent); | 461 | parent = get_device(dev->parent); |
416 | 462 | ||
417 | pr_debug("DEV: registering device: ID = '%s'\n", dev->bus_id); | 463 | error = setup_parent(dev, parent); |
464 | if (error) | ||
465 | goto Error; | ||
418 | 466 | ||
419 | /* first, register with generic layer. */ | 467 | /* first, register with generic layer. */ |
420 | kobject_set_name(&dev->kobj, "%s", dev->bus_id); | 468 | kobject_set_name(&dev->kobj, "%s", dev->bus_id); |
421 | if (parent) | 469 | error = kobject_add(&dev->kobj); |
422 | dev->kobj.parent = &parent->kobj; | 470 | if (error) |
423 | |||
424 | if ((error = kobject_add(&dev->kobj))) | ||
425 | goto Error; | 471 | goto Error; |
426 | 472 | ||
427 | /* notify platform of device entry */ | 473 | /* notify platform of device entry */ |
428 | if (platform_notify) | 474 | if (platform_notify) |
429 | platform_notify(dev); | 475 | platform_notify(dev); |
430 | 476 | ||
477 | /* notify clients of device entry (new way) */ | ||
478 | if (dev->bus) | ||
479 | blocking_notifier_call_chain(&dev->bus->bus_notifier, | ||
480 | BUS_NOTIFY_ADD_DEVICE, dev); | ||
481 | |||
431 | dev->uevent_attr.attr.name = "uevent"; | 482 | dev->uevent_attr.attr.name = "uevent"; |
432 | dev->uevent_attr.attr.mode = S_IWUSR; | 483 | dev->uevent_attr.attr.mode = S_IWUSR; |
433 | if (dev->driver) | 484 | if (dev->driver) |
@@ -461,13 +512,18 @@ int device_add(struct device *dev) | |||
461 | if (dev->class) { | 512 | if (dev->class) { |
462 | sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj, | 513 | sysfs_create_link(&dev->kobj, &dev->class->subsys.kset.kobj, |
463 | "subsystem"); | 514 | "subsystem"); |
464 | sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj, | 515 | /* If this is not a "fake" compatible device, then create the |
465 | dev->bus_id); | 516 | * symlink from the class to the device. */ |
517 | if (dev->kobj.parent != &dev->class->subsys.kset.kobj) | ||
518 | sysfs_create_link(&dev->class->subsys.kset.kobj, | ||
519 | &dev->kobj, dev->bus_id); | ||
520 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
466 | if (parent) { | 521 | if (parent) { |
467 | sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device"); | 522 | sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device"); |
468 | class_name = make_class_name(dev->class->name, &dev->kobj); | 523 | class_name = make_class_name(dev->class->name, &dev->kobj); |
469 | sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name); | 524 | sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name); |
470 | } | 525 | } |
526 | #endif | ||
471 | } | 527 | } |
472 | 528 | ||
473 | if ((error = device_add_attrs(dev))) | 529 | if ((error = device_add_attrs(dev))) |
@@ -504,6 +560,9 @@ int device_add(struct device *dev) | |||
504 | BusError: | 560 | BusError: |
505 | device_pm_remove(dev); | 561 | device_pm_remove(dev); |
506 | PMError: | 562 | PMError: |
563 | if (dev->bus) | ||
564 | blocking_notifier_call_chain(&dev->bus->bus_notifier, | ||
565 | BUS_NOTIFY_DEL_DEVICE, dev); | ||
507 | device_remove_groups(dev); | 566 | device_remove_groups(dev); |
508 | GroupError: | 567 | GroupError: |
509 | device_remove_attrs(dev); | 568 | device_remove_attrs(dev); |
@@ -586,7 +645,6 @@ void put_device(struct device * dev) | |||
586 | void device_del(struct device * dev) | 645 | void device_del(struct device * dev) |
587 | { | 646 | { |
588 | struct device * parent = dev->parent; | 647 | struct device * parent = dev->parent; |
589 | char *class_name = NULL; | ||
590 | struct class_interface *class_intf; | 648 | struct class_interface *class_intf; |
591 | 649 | ||
592 | if (parent) | 650 | if (parent) |
@@ -597,13 +655,21 @@ void device_del(struct device * dev) | |||
597 | } | 655 | } |
598 | if (dev->class) { | 656 | if (dev->class) { |
599 | sysfs_remove_link(&dev->kobj, "subsystem"); | 657 | sysfs_remove_link(&dev->kobj, "subsystem"); |
600 | sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); | 658 | /* If this is not a "fake" compatible device, remove the |
601 | class_name = make_class_name(dev->class->name, &dev->kobj); | 659 | * symlink from the class to the device. */ |
660 | if (dev->kobj.parent != &dev->class->subsys.kset.kobj) | ||
661 | sysfs_remove_link(&dev->class->subsys.kset.kobj, | ||
662 | dev->bus_id); | ||
663 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
602 | if (parent) { | 664 | if (parent) { |
603 | sysfs_remove_link(&dev->kobj, "device"); | 665 | char *class_name = make_class_name(dev->class->name, |
666 | &dev->kobj); | ||
604 | sysfs_remove_link(&dev->parent->kobj, class_name); | 667 | sysfs_remove_link(&dev->parent->kobj, class_name); |
668 | kfree(class_name); | ||
669 | sysfs_remove_link(&dev->kobj, "device"); | ||
605 | } | 670 | } |
606 | kfree(class_name); | 671 | #endif |
672 | |||
607 | down(&dev->class->sem); | 673 | down(&dev->class->sem); |
608 | /* notify any interfaces that the device is now gone */ | 674 | /* notify any interfaces that the device is now gone */ |
609 | list_for_each_entry(class_intf, &dev->class->interfaces, node) | 675 | list_for_each_entry(class_intf, &dev->class->interfaces, node) |
@@ -616,13 +682,16 @@ void device_del(struct device * dev) | |||
616 | device_remove_file(dev, &dev->uevent_attr); | 682 | device_remove_file(dev, &dev->uevent_attr); |
617 | device_remove_groups(dev); | 683 | device_remove_groups(dev); |
618 | device_remove_attrs(dev); | 684 | device_remove_attrs(dev); |
685 | bus_remove_device(dev); | ||
619 | 686 | ||
620 | /* Notify the platform of the removal, in case they | 687 | /* Notify the platform of the removal, in case they |
621 | * need to do anything... | 688 | * need to do anything... |
622 | */ | 689 | */ |
623 | if (platform_notify_remove) | 690 | if (platform_notify_remove) |
624 | platform_notify_remove(dev); | 691 | platform_notify_remove(dev); |
625 | bus_remove_device(dev); | 692 | if (dev->bus) |
693 | blocking_notifier_call_chain(&dev->bus->bus_notifier, | ||
694 | BUS_NOTIFY_DEL_DEVICE, dev); | ||
626 | device_pm_remove(dev); | 695 | device_pm_remove(dev); |
627 | kobject_uevent(&dev->kobj, KOBJ_REMOVE); | 696 | kobject_uevent(&dev->kobj, KOBJ_REMOVE); |
628 | kobject_del(&dev->kobj); | 697 | kobject_del(&dev->kobj); |
@@ -681,12 +750,45 @@ int device_for_each_child(struct device * parent, void * data, | |||
681 | return error; | 750 | return error; |
682 | } | 751 | } |
683 | 752 | ||
753 | /** | ||
754 | * device_find_child - device iterator for locating a particular device. | ||
755 | * @parent: parent struct device | ||
756 | * @data: Data to pass to match function | ||
757 | * @match: Callback function to check device | ||
758 | * | ||
759 | * This is similar to the device_for_each_child() function above, but it | ||
760 | * returns a reference to a device that is 'found' for later use, as | ||
761 | * determined by the @match callback. | ||
762 | * | ||
763 | * The callback should return 0 if the device doesn't match and non-zero | ||
764 | * if it does. If the callback returns non-zero and a reference to the | ||
765 | * current device can be obtained, this function will return to the caller | ||
766 | * and not iterate over any more devices. | ||
767 | */ | ||
768 | struct device * device_find_child(struct device *parent, void *data, | ||
769 | int (*match)(struct device *, void *)) | ||
770 | { | ||
771 | struct klist_iter i; | ||
772 | struct device *child; | ||
773 | |||
774 | if (!parent) | ||
775 | return NULL; | ||
776 | |||
777 | klist_iter_init(&parent->klist_children, &i); | ||
778 | while ((child = next_device(&i))) | ||
779 | if (match(child, data) && get_device(child)) | ||
780 | break; | ||
781 | klist_iter_exit(&i); | ||
782 | return child; | ||
783 | } | ||
784 | |||
684 | int __init devices_init(void) | 785 | int __init devices_init(void) |
685 | { | 786 | { |
686 | return subsystem_register(&devices_subsys); | 787 | return subsystem_register(&devices_subsys); |
687 | } | 788 | } |
688 | 789 | ||
689 | EXPORT_SYMBOL_GPL(device_for_each_child); | 790 | EXPORT_SYMBOL_GPL(device_for_each_child); |
791 | EXPORT_SYMBOL_GPL(device_find_child); | ||
690 | 792 | ||
691 | EXPORT_SYMBOL_GPL(device_initialize); | 793 | EXPORT_SYMBOL_GPL(device_initialize); |
692 | EXPORT_SYMBOL_GPL(device_add); | 794 | EXPORT_SYMBOL_GPL(device_add); |
@@ -809,8 +911,10 @@ int device_rename(struct device *dev, char *new_name) | |||
809 | 911 | ||
810 | pr_debug("DEVICE: renaming '%s' to '%s'\n", dev->bus_id, new_name); | 912 | pr_debug("DEVICE: renaming '%s' to '%s'\n", dev->bus_id, new_name); |
811 | 913 | ||
914 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
812 | if ((dev->class) && (dev->parent)) | 915 | if ((dev->class) && (dev->parent)) |
813 | old_class_name = make_class_name(dev->class->name, &dev->kobj); | 916 | old_class_name = make_class_name(dev->class->name, &dev->kobj); |
917 | #endif | ||
814 | 918 | ||
815 | if (dev->class) { | 919 | if (dev->class) { |
816 | old_symlink_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL); | 920 | old_symlink_name = kmalloc(BUS_ID_SIZE, GFP_KERNEL); |
@@ -825,6 +929,7 @@ int device_rename(struct device *dev, char *new_name) | |||
825 | 929 | ||
826 | error = kobject_rename(&dev->kobj, new_name); | 930 | error = kobject_rename(&dev->kobj, new_name); |
827 | 931 | ||
932 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
828 | if (old_class_name) { | 933 | if (old_class_name) { |
829 | new_class_name = make_class_name(dev->class->name, &dev->kobj); | 934 | new_class_name = make_class_name(dev->class->name, &dev->kobj); |
830 | if (new_class_name) { | 935 | if (new_class_name) { |
@@ -833,6 +938,8 @@ int device_rename(struct device *dev, char *new_name) | |||
833 | sysfs_remove_link(&dev->parent->kobj, old_class_name); | 938 | sysfs_remove_link(&dev->parent->kobj, old_class_name); |
834 | } | 939 | } |
835 | } | 940 | } |
941 | #endif | ||
942 | |||
836 | if (dev->class) { | 943 | if (dev->class) { |
837 | sysfs_remove_link(&dev->class->subsys.kset.kobj, | 944 | sysfs_remove_link(&dev->class->subsys.kset.kobj, |
838 | old_symlink_name); | 945 | old_symlink_name); |
@@ -848,3 +955,95 @@ int device_rename(struct device *dev, char *new_name) | |||
848 | 955 | ||
849 | return error; | 956 | return error; |
850 | } | 957 | } |
958 | |||
959 | |||
960 | static int device_move_class_links(struct device *dev, | ||
961 | struct device *old_parent, | ||
962 | struct device *new_parent) | ||
963 | { | ||
964 | #ifdef CONFIG_SYSFS_DEPRECATED | ||
965 | int error; | ||
966 | char *class_name; | ||
967 | |||
968 | class_name = make_class_name(dev->class->name, &dev->kobj); | ||
969 | if (!class_name) { | ||
970 | error = PTR_ERR(class_name); | ||
971 | class_name = NULL; | ||
972 | goto out; | ||
973 | } | ||
974 | if (old_parent) { | ||
975 | sysfs_remove_link(&dev->kobj, "device"); | ||
976 | sysfs_remove_link(&old_parent->kobj, class_name); | ||
977 | } | ||
978 | error = sysfs_create_link(&dev->kobj, &new_parent->kobj, "device"); | ||
979 | if (error) | ||
980 | goto out; | ||
981 | error = sysfs_create_link(&new_parent->kobj, &dev->kobj, class_name); | ||
982 | if (error) | ||
983 | sysfs_remove_link(&dev->kobj, "device"); | ||
984 | out: | ||
985 | kfree(class_name); | ||
986 | return error; | ||
987 | #else | ||
988 | return 0; | ||
989 | #endif | ||
990 | } | ||
991 | |||
992 | /** | ||
993 | * device_move - moves a device to a new parent | ||
994 | * @dev: the pointer to the struct device to be moved | ||
995 | * @new_parent: the new parent of the device | ||
996 | */ | ||
997 | int device_move(struct device *dev, struct device *new_parent) | ||
998 | { | ||
999 | int error; | ||
1000 | struct device *old_parent; | ||
1001 | |||
1002 | dev = get_device(dev); | ||
1003 | if (!dev) | ||
1004 | return -EINVAL; | ||
1005 | |||
1006 | if (!device_is_registered(dev)) { | ||
1007 | error = -EINVAL; | ||
1008 | goto out; | ||
1009 | } | ||
1010 | new_parent = get_device(new_parent); | ||
1011 | if (!new_parent) { | ||
1012 | error = -EINVAL; | ||
1013 | goto out; | ||
1014 | } | ||
1015 | pr_debug("DEVICE: moving '%s' to '%s'\n", dev->bus_id, | ||
1016 | new_parent->bus_id); | ||
1017 | error = kobject_move(&dev->kobj, &new_parent->kobj); | ||
1018 | if (error) { | ||
1019 | put_device(new_parent); | ||
1020 | goto out; | ||
1021 | } | ||
1022 | old_parent = dev->parent; | ||
1023 | dev->parent = new_parent; | ||
1024 | if (old_parent) | ||
1025 | klist_remove(&dev->knode_parent); | ||
1026 | klist_add_tail(&dev->knode_parent, &new_parent->klist_children); | ||
1027 | if (!dev->class) | ||
1028 | goto out_put; | ||
1029 | error = device_move_class_links(dev, old_parent, new_parent); | ||
1030 | if (error) { | ||
1031 | /* We ignore errors on cleanup since we're hosed anyway... */ | ||
1032 | device_move_class_links(dev, new_parent, old_parent); | ||
1033 | if (!kobject_move(&dev->kobj, &old_parent->kobj)) { | ||
1034 | klist_remove(&dev->knode_parent); | ||
1035 | if (old_parent) | ||
1036 | klist_add_tail(&dev->knode_parent, | ||
1037 | &old_parent->klist_children); | ||
1038 | } | ||
1039 | put_device(new_parent); | ||
1040 | goto out; | ||
1041 | } | ||
1042 | out_put: | ||
1043 | put_device(old_parent); | ||
1044 | out: | ||
1045 | put_device(dev); | ||
1046 | return error; | ||
1047 | } | ||
1048 | |||
1049 | EXPORT_SYMBOL_GPL(device_move); | ||
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index c5d6bb4290ad..510e7884975f 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -26,33 +26,28 @@ | |||
26 | #define to_drv(node) container_of(node, struct device_driver, kobj.entry) | 26 | #define to_drv(node) container_of(node, struct device_driver, kobj.entry) |
27 | 27 | ||
28 | 28 | ||
29 | /** | 29 | static void driver_bound(struct device *dev) |
30 | * device_bind_driver - bind a driver to one device. | ||
31 | * @dev: device. | ||
32 | * | ||
33 | * Allow manual attachment of a driver to a device. | ||
34 | * Caller must have already set @dev->driver. | ||
35 | * | ||
36 | * Note that this does not modify the bus reference count | ||
37 | * nor take the bus's rwsem. Please verify those are accounted | ||
38 | * for before calling this. (It is ok to call with no other effort | ||
39 | * from a driver's probe() method.) | ||
40 | * | ||
41 | * This function must be called with @dev->sem held. | ||
42 | */ | ||
43 | int device_bind_driver(struct device *dev) | ||
44 | { | 30 | { |
45 | int ret; | ||
46 | |||
47 | if (klist_node_attached(&dev->knode_driver)) { | 31 | if (klist_node_attached(&dev->knode_driver)) { |
48 | printk(KERN_WARNING "%s: device %s already bound\n", | 32 | printk(KERN_WARNING "%s: device %s already bound\n", |
49 | __FUNCTION__, kobject_name(&dev->kobj)); | 33 | __FUNCTION__, kobject_name(&dev->kobj)); |
50 | return 0; | 34 | return; |
51 | } | 35 | } |
52 | 36 | ||
53 | pr_debug("bound device '%s' to driver '%s'\n", | 37 | pr_debug("bound device '%s' to driver '%s'\n", |
54 | dev->bus_id, dev->driver->name); | 38 | dev->bus_id, dev->driver->name); |
39 | |||
40 | if (dev->bus) | ||
41 | blocking_notifier_call_chain(&dev->bus->bus_notifier, | ||
42 | BUS_NOTIFY_BOUND_DRIVER, dev); | ||
43 | |||
55 | klist_add_tail(&dev->knode_driver, &dev->driver->klist_devices); | 44 | klist_add_tail(&dev->knode_driver, &dev->driver->klist_devices); |
45 | } | ||
46 | |||
47 | static int driver_sysfs_add(struct device *dev) | ||
48 | { | ||
49 | int ret; | ||
50 | |||
56 | ret = sysfs_create_link(&dev->driver->kobj, &dev->kobj, | 51 | ret = sysfs_create_link(&dev->driver->kobj, &dev->kobj, |
57 | kobject_name(&dev->kobj)); | 52 | kobject_name(&dev->kobj)); |
58 | if (ret == 0) { | 53 | if (ret == 0) { |
@@ -65,6 +60,36 @@ int device_bind_driver(struct device *dev) | |||
65 | return ret; | 60 | return ret; |
66 | } | 61 | } |
67 | 62 | ||
63 | static void driver_sysfs_remove(struct device *dev) | ||
64 | { | ||
65 | struct device_driver *drv = dev->driver; | ||
66 | |||
67 | if (drv) { | ||
68 | sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj)); | ||
69 | sysfs_remove_link(&dev->kobj, "driver"); | ||
70 | } | ||
71 | } | ||
72 | |||
73 | /** | ||
74 | * device_bind_driver - bind a driver to one device. | ||
75 | * @dev: device. | ||
76 | * | ||
77 | * Allow manual attachment of a driver to a device. | ||
78 | * Caller must have already set @dev->driver. | ||
79 | * | ||
80 | * Note that this does not modify the bus reference count | ||
81 | * nor take the bus's rwsem. Please verify those are accounted | ||
82 | * for before calling this. (It is ok to call with no other effort | ||
83 | * from a driver's probe() method.) | ||
84 | * | ||
85 | * This function must be called with @dev->sem held. | ||
86 | */ | ||
87 | int device_bind_driver(struct device *dev) | ||
88 | { | ||
89 | driver_bound(dev); | ||
90 | return driver_sysfs_add(dev); | ||
91 | } | ||
92 | |||
68 | struct stupid_thread_structure { | 93 | struct stupid_thread_structure { |
69 | struct device_driver *drv; | 94 | struct device_driver *drv; |
70 | struct device *dev; | 95 | struct device *dev; |
@@ -85,30 +110,32 @@ static int really_probe(void *void_data) | |||
85 | drv->bus->name, drv->name, dev->bus_id); | 110 | drv->bus->name, drv->name, dev->bus_id); |
86 | 111 | ||
87 | dev->driver = drv; | 112 | dev->driver = drv; |
113 | if (driver_sysfs_add(dev)) { | ||
114 | printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n", | ||
115 | __FUNCTION__, dev->bus_id); | ||
116 | goto probe_failed; | ||
117 | } | ||
118 | |||
88 | if (dev->bus->probe) { | 119 | if (dev->bus->probe) { |
89 | ret = dev->bus->probe(dev); | 120 | ret = dev->bus->probe(dev); |
90 | if (ret) { | 121 | if (ret) |
91 | dev->driver = NULL; | ||
92 | goto probe_failed; | 122 | goto probe_failed; |
93 | } | ||
94 | } else if (drv->probe) { | 123 | } else if (drv->probe) { |
95 | ret = drv->probe(dev); | 124 | ret = drv->probe(dev); |
96 | if (ret) { | 125 | if (ret) |
97 | dev->driver = NULL; | ||
98 | goto probe_failed; | 126 | goto probe_failed; |
99 | } | ||
100 | } | ||
101 | if (device_bind_driver(dev)) { | ||
102 | printk(KERN_ERR "%s: device_bind_driver(%s) failed\n", | ||
103 | __FUNCTION__, dev->bus_id); | ||
104 | /* How does undo a ->probe? We're screwed. */ | ||
105 | } | 127 | } |
128 | |||
129 | driver_bound(dev); | ||
106 | ret = 1; | 130 | ret = 1; |
107 | pr_debug("%s: Bound Device %s to Driver %s\n", | 131 | pr_debug("%s: Bound Device %s to Driver %s\n", |
108 | drv->bus->name, dev->bus_id, drv->name); | 132 | drv->bus->name, dev->bus_id, drv->name); |
109 | goto done; | 133 | goto done; |
110 | 134 | ||
111 | probe_failed: | 135 | probe_failed: |
136 | driver_sysfs_remove(dev); | ||
137 | dev->driver = NULL; | ||
138 | |||
112 | if (ret == -ENODEV || ret == -ENXIO) { | 139 | if (ret == -ENODEV || ret == -ENXIO) { |
113 | /* Driver matched, but didn't support device | 140 | /* Driver matched, but didn't support device |
114 | * or device not found. | 141 | * or device not found. |
@@ -284,10 +311,15 @@ static void __device_release_driver(struct device * dev) | |||
284 | drv = dev->driver; | 311 | drv = dev->driver; |
285 | if (drv) { | 312 | if (drv) { |
286 | get_driver(drv); | 313 | get_driver(drv); |
287 | sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj)); | 314 | driver_sysfs_remove(dev); |
288 | sysfs_remove_link(&dev->kobj, "driver"); | 315 | sysfs_remove_link(&dev->kobj, "driver"); |
289 | klist_remove(&dev->knode_driver); | 316 | klist_remove(&dev->knode_driver); |
290 | 317 | ||
318 | if (dev->bus) | ||
319 | blocking_notifier_call_chain(&dev->bus->bus_notifier, | ||
320 | BUS_NOTIFY_UNBIND_DRIVER, | ||
321 | dev); | ||
322 | |||
291 | if (dev->bus && dev->bus->remove) | 323 | if (dev->bus && dev->bus->remove) |
292 | dev->bus->remove(dev); | 324 | dev->bus->remove(dev); |
293 | else if (drv->remove) | 325 | else if (drv->remove) |
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 14615694ae9a..4bad2870c485 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <linux/firmware.h> | 21 | #include <linux/firmware.h> |
22 | #include "base.h" | 22 | #include "base.h" |
23 | 23 | ||
24 | #define to_dev(obj) container_of(obj, struct device, kobj) | ||
25 | |||
24 | MODULE_AUTHOR("Manuel Estrada Sainz <ranty@debian.org>"); | 26 | MODULE_AUTHOR("Manuel Estrada Sainz <ranty@debian.org>"); |
25 | MODULE_DESCRIPTION("Multi purpose firmware loading support"); | 27 | MODULE_DESCRIPTION("Multi purpose firmware loading support"); |
26 | MODULE_LICENSE("GPL"); | 28 | MODULE_LICENSE("GPL"); |
@@ -86,12 +88,12 @@ firmware_timeout_store(struct class *class, const char *buf, size_t count) | |||
86 | 88 | ||
87 | static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store); | 89 | static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store); |
88 | 90 | ||
89 | static void fw_class_dev_release(struct class_device *class_dev); | 91 | static void fw_dev_release(struct device *dev); |
90 | 92 | ||
91 | static int firmware_class_uevent(struct class_device *class_dev, char **envp, | 93 | static int firmware_uevent(struct device *dev, char **envp, int num_envp, |
92 | int num_envp, char *buffer, int buffer_size) | 94 | char *buffer, int buffer_size) |
93 | { | 95 | { |
94 | struct firmware_priv *fw_priv = class_get_devdata(class_dev); | 96 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
95 | int i = 0, len = 0; | 97 | int i = 0, len = 0; |
96 | 98 | ||
97 | if (!test_bit(FW_STATUS_READY, &fw_priv->status)) | 99 | if (!test_bit(FW_STATUS_READY, &fw_priv->status)) |
@@ -110,21 +112,21 @@ static int firmware_class_uevent(struct class_device *class_dev, char **envp, | |||
110 | 112 | ||
111 | static struct class firmware_class = { | 113 | static struct class firmware_class = { |
112 | .name = "firmware", | 114 | .name = "firmware", |
113 | .uevent = firmware_class_uevent, | 115 | .dev_uevent = firmware_uevent, |
114 | .release = fw_class_dev_release, | 116 | .dev_release = fw_dev_release, |
115 | }; | 117 | }; |
116 | 118 | ||
117 | static ssize_t | 119 | static ssize_t firmware_loading_show(struct device *dev, |
118 | firmware_loading_show(struct class_device *class_dev, char *buf) | 120 | struct device_attribute *attr, char *buf) |
119 | { | 121 | { |
120 | struct firmware_priv *fw_priv = class_get_devdata(class_dev); | 122 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
121 | int loading = test_bit(FW_STATUS_LOADING, &fw_priv->status); | 123 | int loading = test_bit(FW_STATUS_LOADING, &fw_priv->status); |
122 | return sprintf(buf, "%d\n", loading); | 124 | return sprintf(buf, "%d\n", loading); |
123 | } | 125 | } |
124 | 126 | ||
125 | /** | 127 | /** |
126 | * firmware_loading_store - set value in the 'loading' control file | 128 | * firmware_loading_store - set value in the 'loading' control file |
127 | * @class_dev: class_device pointer | 129 | * @dev: device pointer |
128 | * @buf: buffer to scan for loading control value | 130 | * @buf: buffer to scan for loading control value |
129 | * @count: number of bytes in @buf | 131 | * @count: number of bytes in @buf |
130 | * | 132 | * |
@@ -134,11 +136,11 @@ firmware_loading_show(struct class_device *class_dev, char *buf) | |||
134 | * 0: Conclude the load and hand the data to the driver code. | 136 | * 0: Conclude the load and hand the data to the driver code. |
135 | * -1: Conclude the load with an error and discard any written data. | 137 | * -1: Conclude the load with an error and discard any written data. |
136 | **/ | 138 | **/ |
137 | static ssize_t | 139 | static ssize_t firmware_loading_store(struct device *dev, |
138 | firmware_loading_store(struct class_device *class_dev, | 140 | struct device_attribute *attr, |
139 | const char *buf, size_t count) | 141 | const char *buf, size_t count) |
140 | { | 142 | { |
141 | struct firmware_priv *fw_priv = class_get_devdata(class_dev); | 143 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
142 | int loading = simple_strtol(buf, NULL, 10); | 144 | int loading = simple_strtol(buf, NULL, 10); |
143 | 145 | ||
144 | switch (loading) { | 146 | switch (loading) { |
@@ -174,15 +176,14 @@ firmware_loading_store(struct class_device *class_dev, | |||
174 | return count; | 176 | return count; |
175 | } | 177 | } |
176 | 178 | ||
177 | static CLASS_DEVICE_ATTR(loading, 0644, | 179 | static DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store); |
178 | firmware_loading_show, firmware_loading_store); | ||
179 | 180 | ||
180 | static ssize_t | 181 | static ssize_t |
181 | firmware_data_read(struct kobject *kobj, | 182 | firmware_data_read(struct kobject *kobj, |
182 | char *buffer, loff_t offset, size_t count) | 183 | char *buffer, loff_t offset, size_t count) |
183 | { | 184 | { |
184 | struct class_device *class_dev = to_class_dev(kobj); | 185 | struct device *dev = to_dev(kobj); |
185 | struct firmware_priv *fw_priv = class_get_devdata(class_dev); | 186 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
186 | struct firmware *fw; | 187 | struct firmware *fw; |
187 | ssize_t ret_count = count; | 188 | ssize_t ret_count = count; |
188 | 189 | ||
@@ -234,7 +235,7 @@ fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) | |||
234 | 235 | ||
235 | /** | 236 | /** |
236 | * firmware_data_write - write method for firmware | 237 | * firmware_data_write - write method for firmware |
237 | * @kobj: kobject for the class_device | 238 | * @kobj: kobject for the device |
238 | * @buffer: buffer being written | 239 | * @buffer: buffer being written |
239 | * @offset: buffer offset for write in total data store area | 240 | * @offset: buffer offset for write in total data store area |
240 | * @count: buffer size | 241 | * @count: buffer size |
@@ -246,8 +247,8 @@ static ssize_t | |||
246 | firmware_data_write(struct kobject *kobj, | 247 | firmware_data_write(struct kobject *kobj, |
247 | char *buffer, loff_t offset, size_t count) | 248 | char *buffer, loff_t offset, size_t count) |
248 | { | 249 | { |
249 | struct class_device *class_dev = to_class_dev(kobj); | 250 | struct device *dev = to_dev(kobj); |
250 | struct firmware_priv *fw_priv = class_get_devdata(class_dev); | 251 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
251 | struct firmware *fw; | 252 | struct firmware *fw; |
252 | ssize_t retval; | 253 | ssize_t retval; |
253 | 254 | ||
@@ -280,13 +281,12 @@ static struct bin_attribute firmware_attr_data_tmpl = { | |||
280 | .write = firmware_data_write, | 281 | .write = firmware_data_write, |
281 | }; | 282 | }; |
282 | 283 | ||
283 | static void | 284 | static void fw_dev_release(struct device *dev) |
284 | fw_class_dev_release(struct class_device *class_dev) | ||
285 | { | 285 | { |
286 | struct firmware_priv *fw_priv = class_get_devdata(class_dev); | 286 | struct firmware_priv *fw_priv = dev_get_drvdata(dev); |
287 | 287 | ||
288 | kfree(fw_priv); | 288 | kfree(fw_priv); |
289 | kfree(class_dev); | 289 | kfree(dev); |
290 | 290 | ||
291 | module_put(THIS_MODULE); | 291 | module_put(THIS_MODULE); |
292 | } | 292 | } |
@@ -298,26 +298,23 @@ firmware_class_timeout(u_long data) | |||
298 | fw_load_abort(fw_priv); | 298 | fw_load_abort(fw_priv); |
299 | } | 299 | } |
300 | 300 | ||
301 | static inline void | 301 | static inline void fw_setup_device_id(struct device *f_dev, struct device *dev) |
302 | fw_setup_class_device_id(struct class_device *class_dev, struct device *dev) | ||
303 | { | 302 | { |
304 | /* XXX warning we should watch out for name collisions */ | 303 | /* XXX warning we should watch out for name collisions */ |
305 | strlcpy(class_dev->class_id, dev->bus_id, BUS_ID_SIZE); | 304 | strlcpy(f_dev->bus_id, dev->bus_id, BUS_ID_SIZE); |
306 | } | 305 | } |
307 | 306 | ||
308 | static int | 307 | static int fw_register_device(struct device **dev_p, const char *fw_name, |
309 | fw_register_class_device(struct class_device **class_dev_p, | 308 | struct device *device) |
310 | const char *fw_name, struct device *device) | ||
311 | { | 309 | { |
312 | int retval; | 310 | int retval; |
313 | struct firmware_priv *fw_priv = kzalloc(sizeof(*fw_priv), | 311 | struct firmware_priv *fw_priv = kzalloc(sizeof(*fw_priv), |
314 | GFP_KERNEL); | 312 | GFP_KERNEL); |
315 | struct class_device *class_dev = kzalloc(sizeof(*class_dev), | 313 | struct device *f_dev = kzalloc(sizeof(*f_dev), GFP_KERNEL); |
316 | GFP_KERNEL); | ||
317 | 314 | ||
318 | *class_dev_p = NULL; | 315 | *dev_p = NULL; |
319 | 316 | ||
320 | if (!fw_priv || !class_dev) { | 317 | if (!fw_priv || !f_dev) { |
321 | printk(KERN_ERR "%s: kmalloc failed\n", __FUNCTION__); | 318 | printk(KERN_ERR "%s: kmalloc failed\n", __FUNCTION__); |
322 | retval = -ENOMEM; | 319 | retval = -ENOMEM; |
323 | goto error_kfree; | 320 | goto error_kfree; |
@@ -331,55 +328,54 @@ fw_register_class_device(struct class_device **class_dev_p, | |||
331 | fw_priv->timeout.data = (u_long) fw_priv; | 328 | fw_priv->timeout.data = (u_long) fw_priv; |
332 | init_timer(&fw_priv->timeout); | 329 | init_timer(&fw_priv->timeout); |
333 | 330 | ||
334 | fw_setup_class_device_id(class_dev, device); | 331 | fw_setup_device_id(f_dev, device); |
335 | class_dev->dev = device; | 332 | f_dev->parent = device; |
336 | class_dev->class = &firmware_class; | 333 | f_dev->class = &firmware_class; |
337 | class_set_devdata(class_dev, fw_priv); | 334 | dev_set_drvdata(f_dev, fw_priv); |
338 | retval = class_device_register(class_dev); | 335 | retval = device_register(f_dev); |
339 | if (retval) { | 336 | if (retval) { |
340 | printk(KERN_ERR "%s: class_device_register failed\n", | 337 | printk(KERN_ERR "%s: device_register failed\n", |
341 | __FUNCTION__); | 338 | __FUNCTION__); |
342 | goto error_kfree; | 339 | goto error_kfree; |
343 | } | 340 | } |
344 | *class_dev_p = class_dev; | 341 | *dev_p = f_dev; |
345 | return 0; | 342 | return 0; |
346 | 343 | ||
347 | error_kfree: | 344 | error_kfree: |
348 | kfree(fw_priv); | 345 | kfree(fw_priv); |
349 | kfree(class_dev); | 346 | kfree(f_dev); |
350 | return retval; | 347 | return retval; |
351 | } | 348 | } |
352 | 349 | ||
353 | static int | 350 | static int fw_setup_device(struct firmware *fw, struct device **dev_p, |
354 | fw_setup_class_device(struct firmware *fw, struct class_device **class_dev_p, | 351 | const char *fw_name, struct device *device, |
355 | const char *fw_name, struct device *device, int uevent) | 352 | int uevent) |
356 | { | 353 | { |
357 | struct class_device *class_dev; | 354 | struct device *f_dev; |
358 | struct firmware_priv *fw_priv; | 355 | struct firmware_priv *fw_priv; |
359 | int retval; | 356 | int retval; |
360 | 357 | ||
361 | *class_dev_p = NULL; | 358 | *dev_p = NULL; |
362 | retval = fw_register_class_device(&class_dev, fw_name, device); | 359 | retval = fw_register_device(&f_dev, fw_name, device); |
363 | if (retval) | 360 | if (retval) |
364 | goto out; | 361 | goto out; |
365 | 362 | ||
366 | /* Need to pin this module until class device is destroyed */ | 363 | /* Need to pin this module until class device is destroyed */ |
367 | __module_get(THIS_MODULE); | 364 | __module_get(THIS_MODULE); |
368 | 365 | ||
369 | fw_priv = class_get_devdata(class_dev); | 366 | fw_priv = dev_get_drvdata(f_dev); |
370 | 367 | ||
371 | fw_priv->fw = fw; | 368 | fw_priv->fw = fw; |
372 | retval = sysfs_create_bin_file(&class_dev->kobj, &fw_priv->attr_data); | 369 | retval = sysfs_create_bin_file(&f_dev->kobj, &fw_priv->attr_data); |
373 | if (retval) { | 370 | if (retval) { |
374 | printk(KERN_ERR "%s: sysfs_create_bin_file failed\n", | 371 | printk(KERN_ERR "%s: sysfs_create_bin_file failed\n", |
375 | __FUNCTION__); | 372 | __FUNCTION__); |
376 | goto error_unreg; | 373 | goto error_unreg; |
377 | } | 374 | } |
378 | 375 | ||
379 | retval = class_device_create_file(class_dev, | 376 | retval = device_create_file(f_dev, &dev_attr_loading); |
380 | &class_device_attr_loading); | ||
381 | if (retval) { | 377 | if (retval) { |
382 | printk(KERN_ERR "%s: class_device_create_file failed\n", | 378 | printk(KERN_ERR "%s: device_create_file failed\n", |
383 | __FUNCTION__); | 379 | __FUNCTION__); |
384 | goto error_unreg; | 380 | goto error_unreg; |
385 | } | 381 | } |
@@ -388,11 +384,11 @@ fw_setup_class_device(struct firmware *fw, struct class_device **class_dev_p, | |||
388 | set_bit(FW_STATUS_READY, &fw_priv->status); | 384 | set_bit(FW_STATUS_READY, &fw_priv->status); |
389 | else | 385 | else |
390 | set_bit(FW_STATUS_READY_NOHOTPLUG, &fw_priv->status); | 386 | set_bit(FW_STATUS_READY_NOHOTPLUG, &fw_priv->status); |
391 | *class_dev_p = class_dev; | 387 | *dev_p = f_dev; |
392 | goto out; | 388 | goto out; |
393 | 389 | ||
394 | error_unreg: | 390 | error_unreg: |
395 | class_device_unregister(class_dev); | 391 | device_unregister(f_dev); |
396 | out: | 392 | out: |
397 | return retval; | 393 | return retval; |
398 | } | 394 | } |
@@ -401,7 +397,7 @@ static int | |||
401 | _request_firmware(const struct firmware **firmware_p, const char *name, | 397 | _request_firmware(const struct firmware **firmware_p, const char *name, |
402 | struct device *device, int uevent) | 398 | struct device *device, int uevent) |
403 | { | 399 | { |
404 | struct class_device *class_dev; | 400 | struct device *f_dev; |
405 | struct firmware_priv *fw_priv; | 401 | struct firmware_priv *fw_priv; |
406 | struct firmware *firmware; | 402 | struct firmware *firmware; |
407 | int retval; | 403 | int retval; |
@@ -417,12 +413,11 @@ _request_firmware(const struct firmware **firmware_p, const char *name, | |||
417 | goto out; | 413 | goto out; |
418 | } | 414 | } |
419 | 415 | ||
420 | retval = fw_setup_class_device(firmware, &class_dev, name, device, | 416 | retval = fw_setup_device(firmware, &f_dev, name, device, uevent); |
421 | uevent); | ||
422 | if (retval) | 417 | if (retval) |
423 | goto error_kfree_fw; | 418 | goto error_kfree_fw; |
424 | 419 | ||
425 | fw_priv = class_get_devdata(class_dev); | 420 | fw_priv = dev_get_drvdata(f_dev); |
426 | 421 | ||
427 | if (uevent) { | 422 | if (uevent) { |
428 | if (loading_timeout > 0) { | 423 | if (loading_timeout > 0) { |
@@ -430,7 +425,7 @@ _request_firmware(const struct firmware **firmware_p, const char *name, | |||
430 | add_timer(&fw_priv->timeout); | 425 | add_timer(&fw_priv->timeout); |
431 | } | 426 | } |
432 | 427 | ||
433 | kobject_uevent(&class_dev->kobj, KOBJ_ADD); | 428 | kobject_uevent(&f_dev->kobj, KOBJ_ADD); |
434 | wait_for_completion(&fw_priv->completion); | 429 | wait_for_completion(&fw_priv->completion); |
435 | set_bit(FW_STATUS_DONE, &fw_priv->status); | 430 | set_bit(FW_STATUS_DONE, &fw_priv->status); |
436 | del_timer_sync(&fw_priv->timeout); | 431 | del_timer_sync(&fw_priv->timeout); |
@@ -445,7 +440,7 @@ _request_firmware(const struct firmware **firmware_p, const char *name, | |||
445 | } | 440 | } |
446 | fw_priv->fw = NULL; | 441 | fw_priv->fw = NULL; |
447 | mutex_unlock(&fw_lock); | 442 | mutex_unlock(&fw_lock); |
448 | class_device_unregister(class_dev); | 443 | device_unregister(f_dev); |
449 | goto out; | 444 | goto out; |
450 | 445 | ||
451 | error_kfree_fw: | 446 | error_kfree_fw: |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 940ce41f1887..d1df4a087924 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -388,6 +388,11 @@ static int platform_drv_probe(struct device *_dev) | |||
388 | return drv->probe(dev); | 388 | return drv->probe(dev); |
389 | } | 389 | } |
390 | 390 | ||
391 | static int platform_drv_probe_fail(struct device *_dev) | ||
392 | { | ||
393 | return -ENXIO; | ||
394 | } | ||
395 | |||
391 | static int platform_drv_remove(struct device *_dev) | 396 | static int platform_drv_remove(struct device *_dev) |
392 | { | 397 | { |
393 | struct platform_driver *drv = to_platform_driver(_dev->driver); | 398 | struct platform_driver *drv = to_platform_driver(_dev->driver); |
@@ -451,6 +456,49 @@ void platform_driver_unregister(struct platform_driver *drv) | |||
451 | } | 456 | } |
452 | EXPORT_SYMBOL_GPL(platform_driver_unregister); | 457 | EXPORT_SYMBOL_GPL(platform_driver_unregister); |
453 | 458 | ||
459 | /** | ||
460 | * platform_driver_probe - register driver for non-hotpluggable device | ||
461 | * @drv: platform driver structure | ||
462 | * @probe: the driver probe routine, probably from an __init section | ||
463 | * | ||
464 | * Use this instead of platform_driver_register() when you know the device | ||
465 | * is not hotpluggable and has already been registered, and you want to | ||
466 | * remove its run-once probe() infrastructure from memory after the driver | ||
467 | * has bound to the device. | ||
468 | * | ||
469 | * One typical use for this would be with drivers for controllers integrated | ||
470 | * into system-on-chip processors, where the controller devices have been | ||
471 | * configured as part of board setup. | ||
472 | * | ||
473 | * Returns zero if the driver registered and bound to a device, else returns | ||
474 | * a negative error code and with the driver not registered. | ||
475 | */ | ||
476 | int platform_driver_probe(struct platform_driver *drv, | ||
477 | int (*probe)(struct platform_device *)) | ||
478 | { | ||
479 | int retval, code; | ||
480 | |||
481 | /* temporary section violation during probe() */ | ||
482 | drv->probe = probe; | ||
483 | retval = code = platform_driver_register(drv); | ||
484 | |||
485 | /* Fixup that section violation, being paranoid about code scanning | ||
486 | * the list of drivers in order to probe new devices. Check to see | ||
487 | * if the probe was successful, and make sure any forced probes of | ||
488 | * new devices fail. | ||
489 | */ | ||
490 | spin_lock(&platform_bus_type.klist_drivers.k_lock); | ||
491 | drv->probe = NULL; | ||
492 | if (code == 0 && list_empty(&drv->driver.klist_devices.k_list)) | ||
493 | retval = -ENODEV; | ||
494 | drv->driver.probe = platform_drv_probe_fail; | ||
495 | spin_unlock(&platform_bus_type.klist_drivers.k_lock); | ||
496 | |||
497 | if (code != retval) | ||
498 | platform_driver_unregister(drv); | ||
499 | return retval; | ||
500 | } | ||
501 | EXPORT_SYMBOL_GPL(platform_driver_probe); | ||
454 | 502 | ||
455 | /* modalias support enables more hands-off userspace setup: | 503 | /* modalias support enables more hands-off userspace setup: |
456 | * (a) environment variable lets new-style hotplug events work once system is | 504 | * (a) environment variable lets new-style hotplug events work once system is |
diff --git a/drivers/base/topology.c b/drivers/base/topology.c index 28dccb730af9..3d12b85b0962 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c | |||
@@ -94,54 +94,63 @@ static struct attribute_group topology_attr_group = { | |||
94 | .name = "topology" | 94 | .name = "topology" |
95 | }; | 95 | }; |
96 | 96 | ||
97 | static cpumask_t topology_dev_map = CPU_MASK_NONE; | ||
98 | |||
97 | /* Add/Remove cpu_topology interface for CPU device */ | 99 | /* Add/Remove cpu_topology interface for CPU device */ |
98 | static int __cpuinit topology_add_dev(struct sys_device * sys_dev) | 100 | static int __cpuinit topology_add_dev(unsigned int cpu) |
99 | { | 101 | { |
100 | return sysfs_create_group(&sys_dev->kobj, &topology_attr_group); | 102 | int rc; |
103 | struct sys_device *sys_dev = get_cpu_sysdev(cpu); | ||
104 | |||
105 | rc = sysfs_create_group(&sys_dev->kobj, &topology_attr_group); | ||
106 | if (!rc) | ||
107 | cpu_set(cpu, topology_dev_map); | ||
108 | return rc; | ||
101 | } | 109 | } |
102 | 110 | ||
103 | static int __cpuinit topology_remove_dev(struct sys_device * sys_dev) | 111 | #ifdef CONFIG_HOTPLUG_CPU |
112 | static void __cpuinit topology_remove_dev(unsigned int cpu) | ||
104 | { | 113 | { |
114 | struct sys_device *sys_dev = get_cpu_sysdev(cpu); | ||
115 | |||
116 | if (!cpu_isset(cpu, topology_dev_map)) | ||
117 | return; | ||
118 | cpu_clear(cpu, topology_dev_map); | ||
105 | sysfs_remove_group(&sys_dev->kobj, &topology_attr_group); | 119 | sysfs_remove_group(&sys_dev->kobj, &topology_attr_group); |
106 | return 0; | ||
107 | } | 120 | } |
108 | 121 | ||
109 | static int __cpuinit topology_cpu_callback(struct notifier_block *nfb, | 122 | static int __cpuinit topology_cpu_callback(struct notifier_block *nfb, |
110 | unsigned long action, void *hcpu) | 123 | unsigned long action, void *hcpu) |
111 | { | 124 | { |
112 | unsigned int cpu = (unsigned long)hcpu; | 125 | unsigned int cpu = (unsigned long)hcpu; |
113 | struct sys_device *sys_dev; | 126 | int rc = 0; |
114 | 127 | ||
115 | sys_dev = get_cpu_sysdev(cpu); | ||
116 | switch (action) { | 128 | switch (action) { |
117 | case CPU_ONLINE: | 129 | case CPU_UP_PREPARE: |
118 | topology_add_dev(sys_dev); | 130 | rc = topology_add_dev(cpu); |
119 | break; | 131 | break; |
132 | case CPU_UP_CANCELED: | ||
120 | case CPU_DEAD: | 133 | case CPU_DEAD: |
121 | topology_remove_dev(sys_dev); | 134 | topology_remove_dev(cpu); |
122 | break; | 135 | break; |
123 | } | 136 | } |
124 | return NOTIFY_OK; | 137 | return rc ? NOTIFY_BAD : NOTIFY_OK; |
125 | } | 138 | } |
126 | 139 | #endif | |
127 | static struct notifier_block __cpuinitdata topology_cpu_notifier = | ||
128 | { | ||
129 | .notifier_call = topology_cpu_callback, | ||
130 | }; | ||
131 | 140 | ||
132 | static int __cpuinit topology_sysfs_init(void) | 141 | static int __cpuinit topology_sysfs_init(void) |
133 | { | 142 | { |
134 | int i; | 143 | int cpu; |
144 | int rc; | ||
135 | 145 | ||
136 | for_each_online_cpu(i) { | 146 | for_each_online_cpu(cpu) { |
137 | topology_cpu_callback(&topology_cpu_notifier, CPU_ONLINE, | 147 | rc = topology_add_dev(cpu); |
138 | (void *)(long)i); | 148 | if (rc) |
149 | return rc; | ||
139 | } | 150 | } |
140 | 151 | hotcpu_notifier(topology_cpu_callback, 0); | |
141 | register_hotcpu_notifier(&topology_cpu_notifier); | ||
142 | 152 | ||
143 | return 0; | 153 | return 0; |
144 | } | 154 | } |
145 | 155 | ||
146 | device_initcall(topology_sysfs_init); | 156 | device_initcall(topology_sysfs_init); |
147 | |||
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 7ea0f48f8fa6..2df5cf4ec743 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -2133,16 +2133,14 @@ static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf, | |||
2133 | rq->timeout = 60 * HZ; | 2133 | rq->timeout = 60 * HZ; |
2134 | bio = rq->bio; | 2134 | bio = rq->bio; |
2135 | 2135 | ||
2136 | if (rq->bio) | ||
2137 | blk_queue_bounce(q, &rq->bio); | ||
2138 | |||
2139 | if (blk_execute_rq(q, cdi->disk, rq, 0)) { | 2136 | if (blk_execute_rq(q, cdi->disk, rq, 0)) { |
2140 | struct request_sense *s = rq->sense; | 2137 | struct request_sense *s = rq->sense; |
2141 | ret = -EIO; | 2138 | ret = -EIO; |
2142 | cdi->last_sense = s->sense_key; | 2139 | cdi->last_sense = s->sense_key; |
2143 | } | 2140 | } |
2144 | 2141 | ||
2145 | if (blk_rq_unmap_user(bio, len)) | 2142 | rq->bio = bio; |
2143 | if (blk_rq_unmap_user(rq)) | ||
2146 | ret = -EFAULT; | 2144 | ret = -EFAULT; |
2147 | 2145 | ||
2148 | if (ret) | 2146 | if (ret) |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 2af12fc45115..ad8b537ad47b 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -994,7 +994,7 @@ config HPET | |||
994 | help | 994 | help |
995 | If you say Y here, you will have a miscdevice named "/dev/hpet/". Each | 995 | If you say Y here, you will have a miscdevice named "/dev/hpet/". Each |
996 | open selects one of the timers supported by the HPET. The timers are | 996 | open selects one of the timers supported by the HPET. The timers are |
997 | non-periodioc and/or periodic. | 997 | non-periodic and/or periodic. |
998 | 998 | ||
999 | config HPET_RTC_IRQ | 999 | config HPET_RTC_IRQ |
1000 | bool "HPET Control RTC IRQ" if !HPET_EMULATE_RTC | 1000 | bool "HPET Control RTC IRQ" if !HPET_EMULATE_RTC |
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 154a81d328c1..ebace201bec6 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c | |||
@@ -162,7 +162,8 @@ static struct miscdevice rng_miscdev = { | |||
162 | }; | 162 | }; |
163 | 163 | ||
164 | 164 | ||
165 | static ssize_t hwrng_attr_current_store(struct class_device *class, | 165 | static ssize_t hwrng_attr_current_store(struct device *dev, |
166 | struct device_attribute *attr, | ||
166 | const char *buf, size_t len) | 167 | const char *buf, size_t len) |
167 | { | 168 | { |
168 | int err; | 169 | int err; |
@@ -192,7 +193,8 @@ static ssize_t hwrng_attr_current_store(struct class_device *class, | |||
192 | return err ? : len; | 193 | return err ? : len; |
193 | } | 194 | } |
194 | 195 | ||
195 | static ssize_t hwrng_attr_current_show(struct class_device *class, | 196 | static ssize_t hwrng_attr_current_show(struct device *dev, |
197 | struct device_attribute *attr, | ||
196 | char *buf) | 198 | char *buf) |
197 | { | 199 | { |
198 | int err; | 200 | int err; |
@@ -210,7 +212,8 @@ static ssize_t hwrng_attr_current_show(struct class_device *class, | |||
210 | return ret; | 212 | return ret; |
211 | } | 213 | } |
212 | 214 | ||
213 | static ssize_t hwrng_attr_available_show(struct class_device *class, | 215 | static ssize_t hwrng_attr_available_show(struct device *dev, |
216 | struct device_attribute *attr, | ||
214 | char *buf) | 217 | char *buf) |
215 | { | 218 | { |
216 | int err; | 219 | int err; |
@@ -234,20 +237,18 @@ static ssize_t hwrng_attr_available_show(struct class_device *class, | |||
234 | return ret; | 237 | return ret; |
235 | } | 238 | } |
236 | 239 | ||
237 | static CLASS_DEVICE_ATTR(rng_current, S_IRUGO | S_IWUSR, | 240 | static DEVICE_ATTR(rng_current, S_IRUGO | S_IWUSR, |
238 | hwrng_attr_current_show, | 241 | hwrng_attr_current_show, |
239 | hwrng_attr_current_store); | 242 | hwrng_attr_current_store); |
240 | static CLASS_DEVICE_ATTR(rng_available, S_IRUGO, | 243 | static DEVICE_ATTR(rng_available, S_IRUGO, |
241 | hwrng_attr_available_show, | 244 | hwrng_attr_available_show, |
242 | NULL); | 245 | NULL); |
243 | 246 | ||
244 | 247 | ||
245 | static void unregister_miscdev(void) | 248 | static void unregister_miscdev(void) |
246 | { | 249 | { |
247 | class_device_remove_file(rng_miscdev.class, | 250 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_available); |
248 | &class_device_attr_rng_available); | 251 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current); |
249 | class_device_remove_file(rng_miscdev.class, | ||
250 | &class_device_attr_rng_current); | ||
251 | misc_deregister(&rng_miscdev); | 252 | misc_deregister(&rng_miscdev); |
252 | } | 253 | } |
253 | 254 | ||
@@ -258,20 +259,19 @@ static int register_miscdev(void) | |||
258 | err = misc_register(&rng_miscdev); | 259 | err = misc_register(&rng_miscdev); |
259 | if (err) | 260 | if (err) |
260 | goto out; | 261 | goto out; |
261 | err = class_device_create_file(rng_miscdev.class, | 262 | err = device_create_file(rng_miscdev.this_device, |
262 | &class_device_attr_rng_current); | 263 | &dev_attr_rng_current); |
263 | if (err) | 264 | if (err) |
264 | goto err_misc_dereg; | 265 | goto err_misc_dereg; |
265 | err = class_device_create_file(rng_miscdev.class, | 266 | err = device_create_file(rng_miscdev.this_device, |
266 | &class_device_attr_rng_available); | 267 | &dev_attr_rng_available); |
267 | if (err) | 268 | if (err) |
268 | goto err_remove_current; | 269 | goto err_remove_current; |
269 | out: | 270 | out: |
270 | return err; | 271 | return err; |
271 | 272 | ||
272 | err_remove_current: | 273 | err_remove_current: |
273 | class_device_remove_file(rng_miscdev.class, | 274 | device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current); |
274 | &class_device_attr_rng_current); | ||
275 | err_misc_dereg: | 275 | err_misc_dereg: |
276 | misc_deregister(&rng_miscdev); | 276 | misc_deregister(&rng_miscdev); |
277 | goto out; | 277 | goto out; |
diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 55473371b7c6..e67eef4867ba 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c | |||
@@ -980,10 +980,10 @@ static int __init chr_dev_init(void) | |||
980 | 980 | ||
981 | mem_class = class_create(THIS_MODULE, "mem"); | 981 | mem_class = class_create(THIS_MODULE, "mem"); |
982 | for (i = 0; i < ARRAY_SIZE(devlist); i++) | 982 | for (i = 0; i < ARRAY_SIZE(devlist); i++) |
983 | class_device_create(mem_class, NULL, | 983 | device_create(mem_class, NULL, |
984 | MKDEV(MEM_MAJOR, devlist[i].minor), | 984 | MKDEV(MEM_MAJOR, devlist[i].minor), |
985 | NULL, devlist[i].name); | 985 | devlist[i].name); |
986 | 986 | ||
987 | return 0; | 987 | return 0; |
988 | } | 988 | } |
989 | 989 | ||
diff --git a/drivers/char/misc.c b/drivers/char/misc.c index 62ebe09656e3..7a484fc7cb9e 100644 --- a/drivers/char/misc.c +++ b/drivers/char/misc.c | |||
@@ -169,11 +169,6 @@ fail: | |||
169 | return err; | 169 | return err; |
170 | } | 170 | } |
171 | 171 | ||
172 | /* | ||
173 | * TODO for 2.7: | ||
174 | * - add a struct kref to struct miscdevice and make all usages of | ||
175 | * them dynamic. | ||
176 | */ | ||
177 | static struct class *misc_class; | 172 | static struct class *misc_class; |
178 | 173 | ||
179 | static const struct file_operations misc_fops = { | 174 | static const struct file_operations misc_fops = { |
@@ -228,10 +223,10 @@ int misc_register(struct miscdevice * misc) | |||
228 | misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7); | 223 | misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7); |
229 | dev = MKDEV(MISC_MAJOR, misc->minor); | 224 | dev = MKDEV(MISC_MAJOR, misc->minor); |
230 | 225 | ||
231 | misc->class = class_device_create(misc_class, NULL, dev, misc->dev, | 226 | misc->this_device = device_create(misc_class, misc->parent, dev, |
232 | "%s", misc->name); | 227 | "%s", misc->name); |
233 | if (IS_ERR(misc->class)) { | 228 | if (IS_ERR(misc->this_device)) { |
234 | err = PTR_ERR(misc->class); | 229 | err = PTR_ERR(misc->this_device); |
235 | goto out; | 230 | goto out; |
236 | } | 231 | } |
237 | 232 | ||
@@ -264,7 +259,7 @@ int misc_deregister(struct miscdevice * misc) | |||
264 | 259 | ||
265 | down(&misc_sem); | 260 | down(&misc_sem); |
266 | list_del(&misc->list); | 261 | list_del(&misc->list); |
267 | class_device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor)); | 262 | device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor)); |
268 | if (i < DYNAMIC_MINORS && i>0) { | 263 | if (i < DYNAMIC_MINORS && i>0) { |
269 | misc_minors[i>>3] &= ~(1 << (misc->minor & 7)); | 264 | misc_minors[i>>3] &= ~(1 << (misc->minor & 7)); |
270 | } | 265 | } |
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c index efc485edad1c..c1e3dd837fc8 100644 --- a/drivers/char/ppdev.c +++ b/drivers/char/ppdev.c | |||
@@ -752,13 +752,13 @@ static const struct file_operations pp_fops = { | |||
752 | 752 | ||
753 | static void pp_attach(struct parport *port) | 753 | static void pp_attach(struct parport *port) |
754 | { | 754 | { |
755 | class_device_create(ppdev_class, NULL, MKDEV(PP_MAJOR, port->number), | 755 | device_create(ppdev_class, NULL, MKDEV(PP_MAJOR, port->number), |
756 | NULL, "parport%d", port->number); | 756 | "parport%d", port->number); |
757 | } | 757 | } |
758 | 758 | ||
759 | static void pp_detach(struct parport *port) | 759 | static void pp_detach(struct parport *port) |
760 | { | 760 | { |
761 | class_device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number)); | 761 | device_destroy(ppdev_class, MKDEV(PP_MAJOR, port->number)); |
762 | } | 762 | } |
763 | 763 | ||
764 | static struct parport_driver pp_driver = { | 764 | static struct parport_driver pp_driver = { |
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 89b718e326e5..3b32313f6eb4 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
@@ -127,9 +127,9 @@ raw_ioctl(struct inode *inode, struct file *filp, | |||
127 | 127 | ||
128 | static void bind_device(struct raw_config_request *rq) | 128 | static void bind_device(struct raw_config_request *rq) |
129 | { | 129 | { |
130 | class_device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor)); | 130 | device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor)); |
131 | class_device_create(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor), | 131 | device_create(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor), |
132 | NULL, "raw%d", rq->raw_minor); | 132 | "raw%d", rq->raw_minor); |
133 | } | 133 | } |
134 | 134 | ||
135 | /* | 135 | /* |
@@ -200,7 +200,7 @@ static int raw_ctl_ioctl(struct inode *inode, struct file *filp, | |||
200 | if (rq.block_major == 0 && rq.block_minor == 0) { | 200 | if (rq.block_major == 0 && rq.block_minor == 0) { |
201 | /* unbind */ | 201 | /* unbind */ |
202 | rawdev->binding = NULL; | 202 | rawdev->binding = NULL; |
203 | class_device_destroy(raw_class, | 203 | device_destroy(raw_class, |
204 | MKDEV(RAW_MAJOR, rq.raw_minor)); | 204 | MKDEV(RAW_MAJOR, rq.raw_minor)); |
205 | } else { | 205 | } else { |
206 | rawdev->binding = bdget(dev); | 206 | rawdev->binding = bdget(dev); |
@@ -283,7 +283,7 @@ static int __init raw_init(void) | |||
283 | ret = PTR_ERR(raw_class); | 283 | ret = PTR_ERR(raw_class); |
284 | goto error_region; | 284 | goto error_region; |
285 | } | 285 | } |
286 | class_device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl"); | 286 | device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), "rawctl"); |
287 | 287 | ||
288 | return 0; | 288 | return 0; |
289 | 289 | ||
@@ -295,7 +295,7 @@ error: | |||
295 | 295 | ||
296 | static void __exit raw_exit(void) | 296 | static void __exit raw_exit(void) |
297 | { | 297 | { |
298 | class_device_destroy(raw_class, MKDEV(RAW_MAJOR, 0)); | 298 | device_destroy(raw_class, MKDEV(RAW_MAJOR, 0)); |
299 | class_destroy(raw_class); | 299 | class_destroy(raw_class); |
300 | cdev_del(&raw_cdev); | 300 | cdev_del(&raw_cdev); |
301 | unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS); | 301 | unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS); |
diff --git a/drivers/char/rio/riocmd.c b/drivers/char/rio/riocmd.c index 4df6ab2206a1..167ebc84e8d7 100644 --- a/drivers/char/rio/riocmd.c +++ b/drivers/char/rio/riocmd.c | |||
@@ -922,7 +922,7 @@ int RIOUnUse(unsigned long iPortP, struct CmdBlk *CmdBlkP) | |||
922 | ** | 922 | ** |
923 | ** Packet is an actual packet structure to be filled in with the packet | 923 | ** Packet is an actual packet structure to be filled in with the packet |
924 | ** information associated with the command. You need to fill in everything, | 924 | ** information associated with the command. You need to fill in everything, |
925 | ** as the command processore doesn't process the command packet in any way. | 925 | ** as the command processor doesn't process the command packet in any way. |
926 | ** | 926 | ** |
927 | ** The PreFuncP is called before the packet is enqueued on the host rup. | 927 | ** The PreFuncP is called before the packet is enqueued on the host rup. |
928 | ** PreFuncP is called as (*PreFuncP)(PreArg, CmdBlkP);. PreFuncP must | 928 | ** PreFuncP is called as (*PreFuncP)(PreArg, CmdBlkP);. PreFuncP must |
diff --git a/drivers/char/rio/rioinit.c b/drivers/char/rio/rioinit.c index 99f3df02b61c..0794844369d6 100644 --- a/drivers/char/rio/rioinit.c +++ b/drivers/char/rio/rioinit.c | |||
@@ -222,7 +222,7 @@ int RIOBoardTest(unsigned long paddr, void __iomem *caddr, unsigned char type, i | |||
222 | ** which value will be written into memory. | 222 | ** which value will be written into memory. |
223 | ** Call with op set to zero means that the RAM will not be read and checked | 223 | ** Call with op set to zero means that the RAM will not be read and checked |
224 | ** before it is written. | 224 | ** before it is written. |
225 | ** Call with op not zero, and the RAM will be read and compated with val[op-1] | 225 | ** Call with op not zero and the RAM will be read and compared with val[op-1] |
226 | ** to check that the data from the previous phase was retained. | 226 | ** to check that the data from the previous phase was retained. |
227 | */ | 227 | */ |
228 | 228 | ||
diff --git a/drivers/char/rio/rioparam.c b/drivers/char/rio/rioparam.c index 1066d9760704..bb498d24adcc 100644 --- a/drivers/char/rio/rioparam.c +++ b/drivers/char/rio/rioparam.c | |||
@@ -87,8 +87,8 @@ static char *_rioparam_c_sccs_ = "@(#)rioparam.c 1.3"; | |||
87 | ** command bit set onto the port. The command bit is in the len field, | 87 | ** command bit set onto the port. The command bit is in the len field, |
88 | ** and gets ORed in with the actual byte count. | 88 | ** and gets ORed in with the actual byte count. |
89 | ** | 89 | ** |
90 | ** When you send a packet with the command bit set, then the first | 90 | ** When you send a packet with the command bit set the first |
91 | ** data byte ( data[0] ) is interpretted as the command to execute. | 91 | ** data byte (data[0]) is interpreted as the command to execute. |
92 | ** It also governs what data structure overlay should accompany the packet. | 92 | ** It also governs what data structure overlay should accompany the packet. |
93 | ** Commands are defined in cirrus/cirrus.h | 93 | ** Commands are defined in cirrus/cirrus.h |
94 | ** | 94 | ** |
@@ -103,7 +103,7 @@ static char *_rioparam_c_sccs_ = "@(#)rioparam.c 1.3"; | |||
103 | ** | 103 | ** |
104 | ** Most commands do not use the remaining bytes in the data array. The | 104 | ** Most commands do not use the remaining bytes in the data array. The |
105 | ** exceptions are OPEN MOPEN and CONFIG. (NB. As with the SI CONFIG and | 105 | ** exceptions are OPEN MOPEN and CONFIG. (NB. As with the SI CONFIG and |
106 | ** OPEN are currently analagous). With these three commands the following | 106 | ** OPEN are currently analogous). With these three commands the following |
107 | ** 11 data bytes are all used to pass config information such as baud rate etc. | 107 | ** 11 data bytes are all used to pass config information such as baud rate etc. |
108 | ** The fields are also defined in cirrus.h. Some contain straightforward | 108 | ** The fields are also defined in cirrus.h. Some contain straightforward |
109 | ** information such as the transmit XON character. Two contain the transmit and | 109 | ** information such as the transmit XON character. Two contain the transmit and |
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index 6ad2d3bb945c..6e1329d404d2 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c | |||
@@ -1130,7 +1130,7 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend | |||
1130 | scnprintf(devname, DEVNAME_SIZE, "%s%d", "tpm", chip->dev_num); | 1130 | scnprintf(devname, DEVNAME_SIZE, "%s%d", "tpm", chip->dev_num); |
1131 | chip->vendor.miscdev.name = devname; | 1131 | chip->vendor.miscdev.name = devname; |
1132 | 1132 | ||
1133 | chip->vendor.miscdev.dev = dev; | 1133 | chip->vendor.miscdev.parent = dev; |
1134 | chip->dev = get_device(dev); | 1134 | chip->dev = get_device(dev); |
1135 | 1135 | ||
1136 | if (misc_register(&chip->vendor.miscdev)) { | 1136 | if (misc_register(&chip->vendor.miscdev)) { |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index e90ea39c7c4b..50dc49205a23 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -3612,7 +3612,8 @@ static struct class *tty_class; | |||
3612 | * This field is optional, if there is no known struct device | 3612 | * This field is optional, if there is no known struct device |
3613 | * for this tty device it can be set to NULL safely. | 3613 | * for this tty device it can be set to NULL safely. |
3614 | * | 3614 | * |
3615 | * Returns a pointer to the class device (or ERR_PTR(-EFOO) on error). | 3615 | * Returns a pointer to the struct device for this tty device |
3616 | * (or ERR_PTR(-EFOO) on error). | ||
3616 | * | 3617 | * |
3617 | * This call is required to be made to register an individual tty device | 3618 | * This call is required to be made to register an individual tty device |
3618 | * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If | 3619 | * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If |
@@ -3622,8 +3623,8 @@ static struct class *tty_class; | |||
3622 | * Locking: ?? | 3623 | * Locking: ?? |
3623 | */ | 3624 | */ |
3624 | 3625 | ||
3625 | struct class_device *tty_register_device(struct tty_driver *driver, | 3626 | struct device *tty_register_device(struct tty_driver *driver, unsigned index, |
3626 | unsigned index, struct device *device) | 3627 | struct device *device) |
3627 | { | 3628 | { |
3628 | char name[64]; | 3629 | char name[64]; |
3629 | dev_t dev = MKDEV(driver->major, driver->minor_start) + index; | 3630 | dev_t dev = MKDEV(driver->major, driver->minor_start) + index; |
@@ -3639,7 +3640,7 @@ struct class_device *tty_register_device(struct tty_driver *driver, | |||
3639 | else | 3640 | else |
3640 | tty_line_name(driver, index, name); | 3641 | tty_line_name(driver, index, name); |
3641 | 3642 | ||
3642 | return class_device_create(tty_class, NULL, dev, device, "%s", name); | 3643 | return device_create(tty_class, device, dev, name); |
3643 | } | 3644 | } |
3644 | 3645 | ||
3645 | /** | 3646 | /** |
@@ -3655,7 +3656,7 @@ struct class_device *tty_register_device(struct tty_driver *driver, | |||
3655 | 3656 | ||
3656 | void tty_unregister_device(struct tty_driver *driver, unsigned index) | 3657 | void tty_unregister_device(struct tty_driver *driver, unsigned index) |
3657 | { | 3658 | { |
3658 | class_device_destroy(tty_class, MKDEV(driver->major, driver->minor_start) + index); | 3659 | device_destroy(tty_class, MKDEV(driver->major, driver->minor_start) + index); |
3659 | } | 3660 | } |
3660 | 3661 | ||
3661 | EXPORT_SYMBOL(tty_register_device); | 3662 | EXPORT_SYMBOL(tty_register_device); |
@@ -3895,20 +3896,20 @@ static int __init tty_init(void) | |||
3895 | if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) || | 3896 | if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) || |
3896 | register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0) | 3897 | register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0) |
3897 | panic("Couldn't register /dev/tty driver\n"); | 3898 | panic("Couldn't register /dev/tty driver\n"); |
3898 | class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty"); | 3899 | device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), "tty"); |
3899 | 3900 | ||
3900 | cdev_init(&console_cdev, &console_fops); | 3901 | cdev_init(&console_cdev, &console_fops); |
3901 | if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) || | 3902 | if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) || |
3902 | register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0) | 3903 | register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0) |
3903 | panic("Couldn't register /dev/console driver\n"); | 3904 | panic("Couldn't register /dev/console driver\n"); |
3904 | class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL, "console"); | 3905 | device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), "console"); |
3905 | 3906 | ||
3906 | #ifdef CONFIG_UNIX98_PTYS | 3907 | #ifdef CONFIG_UNIX98_PTYS |
3907 | cdev_init(&ptmx_cdev, &ptmx_fops); | 3908 | cdev_init(&ptmx_cdev, &ptmx_fops); |
3908 | if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || | 3909 | if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) || |
3909 | register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) | 3910 | register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0) |
3910 | panic("Couldn't register /dev/ptmx driver\n"); | 3911 | panic("Couldn't register /dev/ptmx driver\n"); |
3911 | class_device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), NULL, "ptmx"); | 3912 | device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 2), "ptmx"); |
3912 | #endif | 3913 | #endif |
3913 | 3914 | ||
3914 | #ifdef CONFIG_VT | 3915 | #ifdef CONFIG_VT |
@@ -3916,7 +3917,7 @@ static int __init tty_init(void) | |||
3916 | if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) || | 3917 | if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) || |
3917 | register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0) | 3918 | register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0) |
3918 | panic("Couldn't register /dev/tty0 driver\n"); | 3919 | panic("Couldn't register /dev/tty0 driver\n"); |
3919 | class_device_create(tty_class, NULL, MKDEV(TTY_MAJOR, 0), NULL, "tty0"); | 3920 | device_create(tty_class, NULL, MKDEV(TTY_MAJOR, 0), "tty0"); |
3920 | 3921 | ||
3921 | vty_init(); | 3922 | vty_init(); |
3922 | #endif | 3923 | #endif |
diff --git a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c index bd7a98c6ea7a..f442b574b44a 100644 --- a/drivers/char/vc_screen.c +++ b/drivers/char/vc_screen.c | |||
@@ -476,16 +476,16 @@ static struct class *vc_class; | |||
476 | 476 | ||
477 | void vcs_make_sysfs(struct tty_struct *tty) | 477 | void vcs_make_sysfs(struct tty_struct *tty) |
478 | { | 478 | { |
479 | class_device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1), | 479 | device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1), |
480 | NULL, "vcs%u", tty->index + 1); | 480 | "vcs%u", tty->index + 1); |
481 | class_device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129), | 481 | device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129), |
482 | NULL, "vcsa%u", tty->index + 1); | 482 | "vcsa%u", tty->index + 1); |
483 | } | 483 | } |
484 | 484 | ||
485 | void vcs_remove_sysfs(struct tty_struct *tty) | 485 | void vcs_remove_sysfs(struct tty_struct *tty) |
486 | { | 486 | { |
487 | class_device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 1)); | 487 | device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 1)); |
488 | class_device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 129)); | 488 | device_destroy(vc_class, MKDEV(VCS_MAJOR, tty->index + 129)); |
489 | } | 489 | } |
490 | 490 | ||
491 | int __init vcs_init(void) | 491 | int __init vcs_init(void) |
@@ -494,7 +494,7 @@ int __init vcs_init(void) | |||
494 | panic("unable to get major %d for vcs device", VCS_MAJOR); | 494 | panic("unable to get major %d for vcs device", VCS_MAJOR); |
495 | vc_class = class_create(THIS_MODULE, "vc"); | 495 | vc_class = class_create(THIS_MODULE, "vc"); |
496 | 496 | ||
497 | class_device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 0), NULL, "vcs"); | 497 | device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 0), "vcs"); |
498 | class_device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 128), NULL, "vcsa"); | 498 | device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 128), "vcsa"); |
499 | return 0; | 499 | return 0; |
500 | } | 500 | } |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index 8e4413f6fbaf..87587b4385ab 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -112,7 +112,7 @@ | |||
112 | struct con_driver { | 112 | struct con_driver { |
113 | const struct consw *con; | 113 | const struct consw *con; |
114 | const char *desc; | 114 | const char *desc; |
115 | struct class_device *class_dev; | 115 | struct device *dev; |
116 | int node; | 116 | int node; |
117 | int first; | 117 | int first; |
118 | int last; | 118 | int last; |
@@ -3023,10 +3023,10 @@ static inline int vt_unbind(struct con_driver *con) | |||
3023 | } | 3023 | } |
3024 | #endif /* CONFIG_VT_HW_CONSOLE_BINDING */ | 3024 | #endif /* CONFIG_VT_HW_CONSOLE_BINDING */ |
3025 | 3025 | ||
3026 | static ssize_t store_bind(struct class_device *class_device, | 3026 | static ssize_t store_bind(struct device *dev, struct device_attribute *attr, |
3027 | const char *buf, size_t count) | 3027 | const char *buf, size_t count) |
3028 | { | 3028 | { |
3029 | struct con_driver *con = class_get_devdata(class_device); | 3029 | struct con_driver *con = dev_get_drvdata(dev); |
3030 | int bind = simple_strtoul(buf, NULL, 0); | 3030 | int bind = simple_strtoul(buf, NULL, 0); |
3031 | 3031 | ||
3032 | if (bind) | 3032 | if (bind) |
@@ -3037,17 +3037,19 @@ static ssize_t store_bind(struct class_device *class_device, | |||
3037 | return count; | 3037 | return count; |
3038 | } | 3038 | } |
3039 | 3039 | ||
3040 | static ssize_t show_bind(struct class_device *class_device, char *buf) | 3040 | static ssize_t show_bind(struct device *dev, struct device_attribute *attr, |
3041 | char *buf) | ||
3041 | { | 3042 | { |
3042 | struct con_driver *con = class_get_devdata(class_device); | 3043 | struct con_driver *con = dev_get_drvdata(dev); |
3043 | int bind = con_is_bound(con->con); | 3044 | int bind = con_is_bound(con->con); |
3044 | 3045 | ||
3045 | return snprintf(buf, PAGE_SIZE, "%i\n", bind); | 3046 | return snprintf(buf, PAGE_SIZE, "%i\n", bind); |
3046 | } | 3047 | } |
3047 | 3048 | ||
3048 | static ssize_t show_name(struct class_device *class_device, char *buf) | 3049 | static ssize_t show_name(struct device *dev, struct device_attribute *attr, |
3050 | char *buf) | ||
3049 | { | 3051 | { |
3050 | struct con_driver *con = class_get_devdata(class_device); | 3052 | struct con_driver *con = dev_get_drvdata(dev); |
3051 | 3053 | ||
3052 | return snprintf(buf, PAGE_SIZE, "%s %s\n", | 3054 | return snprintf(buf, PAGE_SIZE, "%s %s\n", |
3053 | (con->flag & CON_DRIVER_FLAG_MODULE) ? "(M)" : "(S)", | 3055 | (con->flag & CON_DRIVER_FLAG_MODULE) ? "(M)" : "(S)", |
@@ -3055,43 +3057,40 @@ static ssize_t show_name(struct class_device *class_device, char *buf) | |||
3055 | 3057 | ||
3056 | } | 3058 | } |
3057 | 3059 | ||
3058 | static struct class_device_attribute class_device_attrs[] = { | 3060 | static struct device_attribute device_attrs[] = { |
3059 | __ATTR(bind, S_IRUGO|S_IWUSR, show_bind, store_bind), | 3061 | __ATTR(bind, S_IRUGO|S_IWUSR, show_bind, store_bind), |
3060 | __ATTR(name, S_IRUGO, show_name, NULL), | 3062 | __ATTR(name, S_IRUGO, show_name, NULL), |
3061 | }; | 3063 | }; |
3062 | 3064 | ||
3063 | static int vtconsole_init_class_device(struct con_driver *con) | 3065 | static int vtconsole_init_device(struct con_driver *con) |
3064 | { | 3066 | { |
3065 | int i; | 3067 | int i; |
3066 | int error = 0; | 3068 | int error = 0; |
3067 | 3069 | ||
3068 | con->flag |= CON_DRIVER_FLAG_ATTR; | 3070 | con->flag |= CON_DRIVER_FLAG_ATTR; |
3069 | class_set_devdata(con->class_dev, con); | 3071 | dev_set_drvdata(con->dev, con); |
3070 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) { | 3072 | for (i = 0; i < ARRAY_SIZE(device_attrs); i++) { |
3071 | error = class_device_create_file(con->class_dev, | 3073 | error = device_create_file(con->dev, &device_attrs[i]); |
3072 | &class_device_attrs[i]); | ||
3073 | if (error) | 3074 | if (error) |
3074 | break; | 3075 | break; |
3075 | } | 3076 | } |
3076 | 3077 | ||
3077 | if (error) { | 3078 | if (error) { |
3078 | while (--i >= 0) | 3079 | while (--i >= 0) |
3079 | class_device_remove_file(con->class_dev, | 3080 | device_remove_file(con->dev, &device_attrs[i]); |
3080 | &class_device_attrs[i]); | ||
3081 | con->flag &= ~CON_DRIVER_FLAG_ATTR; | 3081 | con->flag &= ~CON_DRIVER_FLAG_ATTR; |
3082 | } | 3082 | } |
3083 | 3083 | ||
3084 | return error; | 3084 | return error; |
3085 | } | 3085 | } |
3086 | 3086 | ||
3087 | static void vtconsole_deinit_class_device(struct con_driver *con) | 3087 | static void vtconsole_deinit_device(struct con_driver *con) |
3088 | { | 3088 | { |
3089 | int i; | 3089 | int i; |
3090 | 3090 | ||
3091 | if (con->flag & CON_DRIVER_FLAG_ATTR) { | 3091 | if (con->flag & CON_DRIVER_FLAG_ATTR) { |
3092 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) | 3092 | for (i = 0; i < ARRAY_SIZE(device_attrs); i++) |
3093 | class_device_remove_file(con->class_dev, | 3093 | device_remove_file(con->dev, &device_attrs[i]); |
3094 | &class_device_attrs[i]); | ||
3095 | con->flag &= ~CON_DRIVER_FLAG_ATTR; | 3094 | con->flag &= ~CON_DRIVER_FLAG_ATTR; |
3096 | } | 3095 | } |
3097 | } | 3096 | } |
@@ -3179,18 +3178,17 @@ int register_con_driver(const struct consw *csw, int first, int last) | |||
3179 | if (retval) | 3178 | if (retval) |
3180 | goto err; | 3179 | goto err; |
3181 | 3180 | ||
3182 | con_driver->class_dev = class_device_create(vtconsole_class, NULL, | 3181 | con_driver->dev = device_create(vtconsole_class, NULL, |
3183 | MKDEV(0, con_driver->node), | 3182 | MKDEV(0, con_driver->node), |
3184 | NULL, "vtcon%i", | 3183 | "vtcon%i", con_driver->node); |
3185 | con_driver->node); | ||
3186 | 3184 | ||
3187 | if (IS_ERR(con_driver->class_dev)) { | 3185 | if (IS_ERR(con_driver->dev)) { |
3188 | printk(KERN_WARNING "Unable to create class_device for %s; " | 3186 | printk(KERN_WARNING "Unable to create device for %s; " |
3189 | "errno = %ld\n", con_driver->desc, | 3187 | "errno = %ld\n", con_driver->desc, |
3190 | PTR_ERR(con_driver->class_dev)); | 3188 | PTR_ERR(con_driver->dev)); |
3191 | con_driver->class_dev = NULL; | 3189 | con_driver->dev = NULL; |
3192 | } else { | 3190 | } else { |
3193 | vtconsole_init_class_device(con_driver); | 3191 | vtconsole_init_device(con_driver); |
3194 | } | 3192 | } |
3195 | 3193 | ||
3196 | err: | 3194 | err: |
@@ -3226,12 +3224,12 @@ int unregister_con_driver(const struct consw *csw) | |||
3226 | 3224 | ||
3227 | if (con_driver->con == csw && | 3225 | if (con_driver->con == csw && |
3228 | con_driver->flag & CON_DRIVER_FLAG_MODULE) { | 3226 | con_driver->flag & CON_DRIVER_FLAG_MODULE) { |
3229 | vtconsole_deinit_class_device(con_driver); | 3227 | vtconsole_deinit_device(con_driver); |
3230 | class_device_destroy(vtconsole_class, | 3228 | device_destroy(vtconsole_class, |
3231 | MKDEV(0, con_driver->node)); | 3229 | MKDEV(0, con_driver->node)); |
3232 | con_driver->con = NULL; | 3230 | con_driver->con = NULL; |
3233 | con_driver->desc = NULL; | 3231 | con_driver->desc = NULL; |
3234 | con_driver->class_dev = NULL; | 3232 | con_driver->dev = NULL; |
3235 | con_driver->node = 0; | 3233 | con_driver->node = 0; |
3236 | con_driver->flag = 0; | 3234 | con_driver->flag = 0; |
3237 | con_driver->first = 0; | 3235 | con_driver->first = 0; |
@@ -3289,19 +3287,18 @@ static int __init vtconsole_class_init(void) | |||
3289 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { | 3287 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { |
3290 | struct con_driver *con = ®istered_con_driver[i]; | 3288 | struct con_driver *con = ®istered_con_driver[i]; |
3291 | 3289 | ||
3292 | if (con->con && !con->class_dev) { | 3290 | if (con->con && !con->dev) { |
3293 | con->class_dev = | 3291 | con->dev = device_create(vtconsole_class, NULL, |
3294 | class_device_create(vtconsole_class, NULL, | 3292 | MKDEV(0, con->node), |
3295 | MKDEV(0, con->node), NULL, | 3293 | "vtcon%i", con->node); |
3296 | "vtcon%i", con->node); | ||
3297 | 3294 | ||
3298 | if (IS_ERR(con->class_dev)) { | 3295 | if (IS_ERR(con->dev)) { |
3299 | printk(KERN_WARNING "Unable to create " | 3296 | printk(KERN_WARNING "Unable to create " |
3300 | "class_device for %s; errno = %ld\n", | 3297 | "device for %s; errno = %ld\n", |
3301 | con->desc, PTR_ERR(con->class_dev)); | 3298 | con->desc, PTR_ERR(con->dev)); |
3302 | con->class_dev = NULL; | 3299 | con->dev = NULL; |
3303 | } else { | 3300 | } else { |
3304 | vtconsole_init_class_device(con); | 3301 | vtconsole_init_device(con); |
3305 | } | 3302 | } |
3306 | } | 3303 | } |
3307 | } | 3304 | } |
diff --git a/drivers/char/watchdog/pcwd_usb.c b/drivers/char/watchdog/pcwd_usb.c index bda45334d802..e275dd4a705d 100644 --- a/drivers/char/watchdog/pcwd_usb.c +++ b/drivers/char/watchdog/pcwd_usb.c | |||
@@ -561,8 +561,7 @@ static struct notifier_block usb_pcwd_notifier = { | |||
561 | */ | 561 | */ |
562 | static inline void usb_pcwd_delete (struct usb_pcwd_private *usb_pcwd) | 562 | static inline void usb_pcwd_delete (struct usb_pcwd_private *usb_pcwd) |
563 | { | 563 | { |
564 | if (usb_pcwd->intr_urb != NULL) | 564 | usb_free_urb(usb_pcwd->intr_urb); |
565 | usb_free_urb (usb_pcwd->intr_urb); | ||
566 | if (usb_pcwd->intr_buffer != NULL) | 565 | if (usb_pcwd->intr_buffer != NULL) |
567 | usb_buffer_free(usb_pcwd->udev, usb_pcwd->intr_size, | 566 | usb_buffer_free(usb_pcwd->udev, usb_pcwd->intr_size, |
568 | usb_pcwd->intr_buffer, usb_pcwd->intr_dma); | 567 | usb_pcwd->intr_buffer, usb_pcwd->intr_dma); |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 510816c16da3..04bee524e31a 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -125,6 +125,7 @@ config I2C_I801 | |||
125 | ICH7 | 125 | ICH7 |
126 | ESB2 | 126 | ESB2 |
127 | ICH8 | 127 | ICH8 |
128 | ICH9 | ||
128 | 129 | ||
129 | This driver can also be built as a module. If so, the module | 130 | This driver can also be built as a module. If so, the module |
130 | will be called i2c-i801. | 131 | will be called i2c-i801. |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index bbb2fbee836f..c7be2fdbd86b 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -33,6 +33,7 @@ | |||
33 | ICH7 27DA | 33 | ICH7 27DA |
34 | ESB2 269B | 34 | ESB2 269B |
35 | ICH8 283E | 35 | ICH8 283E |
36 | ICH9 2930 | ||
36 | This driver supports several versions of Intel's I/O Controller Hubs (ICH). | 37 | This driver supports several versions of Intel's I/O Controller Hubs (ICH). |
37 | For SMBus support, they are similar to the PIIX4 and are part | 38 | For SMBus support, they are similar to the PIIX4 and are part |
38 | of Intel's '810' and other chipsets. | 39 | of Intel's '810' and other chipsets. |
@@ -457,6 +458,7 @@ static struct pci_device_id i801_ids[] = { | |||
457 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) }, | 458 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) }, |
458 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) }, | 459 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) }, |
459 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) }, | 460 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) }, |
461 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) }, | ||
460 | { 0, } | 462 | { 0, } |
461 | }; | 463 | }; |
462 | 464 | ||
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 3f869033ed70..94a4e9a3013c 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
@@ -42,7 +42,7 @@ static struct i2c_driver i2cdev_driver; | |||
42 | struct i2c_dev { | 42 | struct i2c_dev { |
43 | struct list_head list; | 43 | struct list_head list; |
44 | struct i2c_adapter *adap; | 44 | struct i2c_adapter *adap; |
45 | struct class_device *class_dev; | 45 | struct device *dev; |
46 | }; | 46 | }; |
47 | 47 | ||
48 | #define I2C_MINORS 256 | 48 | #define I2C_MINORS 256 |
@@ -92,15 +92,16 @@ static void return_i2c_dev(struct i2c_dev *i2c_dev) | |||
92 | spin_unlock(&i2c_dev_list_lock); | 92 | spin_unlock(&i2c_dev_list_lock); |
93 | } | 93 | } |
94 | 94 | ||
95 | static ssize_t show_adapter_name(struct class_device *class_dev, char *buf) | 95 | static ssize_t show_adapter_name(struct device *dev, |
96 | struct device_attribute *attr, char *buf) | ||
96 | { | 97 | { |
97 | struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(class_dev->devt)); | 98 | struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(dev->devt)); |
98 | 99 | ||
99 | if (!i2c_dev) | 100 | if (!i2c_dev) |
100 | return -ENODEV; | 101 | return -ENODEV; |
101 | return sprintf(buf, "%s\n", i2c_dev->adap->name); | 102 | return sprintf(buf, "%s\n", i2c_dev->adap->name); |
102 | } | 103 | } |
103 | static CLASS_DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); | 104 | static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); |
104 | 105 | ||
105 | static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count, | 106 | static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count, |
106 | loff_t *offset) | 107 | loff_t *offset) |
@@ -413,15 +414,14 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap) | |||
413 | return PTR_ERR(i2c_dev); | 414 | return PTR_ERR(i2c_dev); |
414 | 415 | ||
415 | /* register this i2c device with the driver core */ | 416 | /* register this i2c device with the driver core */ |
416 | i2c_dev->class_dev = class_device_create(i2c_dev_class, NULL, | 417 | i2c_dev->dev = device_create(i2c_dev_class, &adap->dev, |
417 | MKDEV(I2C_MAJOR, adap->nr), | 418 | MKDEV(I2C_MAJOR, adap->nr), |
418 | &adap->dev, "i2c-%d", | 419 | "i2c-%d", adap->nr); |
419 | adap->nr); | 420 | if (!i2c_dev->dev) { |
420 | if (!i2c_dev->class_dev) { | ||
421 | res = -ENODEV; | 421 | res = -ENODEV; |
422 | goto error; | 422 | goto error; |
423 | } | 423 | } |
424 | res = class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); | 424 | res = device_create_file(i2c_dev->dev, &dev_attr_name); |
425 | if (res) | 425 | if (res) |
426 | goto error_destroy; | 426 | goto error_destroy; |
427 | 427 | ||
@@ -429,7 +429,7 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap) | |||
429 | adap->name, adap->nr); | 429 | adap->name, adap->nr); |
430 | return 0; | 430 | return 0; |
431 | error_destroy: | 431 | error_destroy: |
432 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | 432 | device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); |
433 | error: | 433 | error: |
434 | return_i2c_dev(i2c_dev); | 434 | return_i2c_dev(i2c_dev); |
435 | kfree(i2c_dev); | 435 | kfree(i2c_dev); |
@@ -444,9 +444,9 @@ static int i2cdev_detach_adapter(struct i2c_adapter *adap) | |||
444 | if (!i2c_dev) /* attach_adapter must have failed */ | 444 | if (!i2c_dev) /* attach_adapter must have failed */ |
445 | return 0; | 445 | return 0; |
446 | 446 | ||
447 | class_device_remove_file(i2c_dev->class_dev, &class_device_attr_name); | 447 | device_remove_file(i2c_dev->dev, &dev_attr_name); |
448 | return_i2c_dev(i2c_dev); | 448 | return_i2c_dev(i2c_dev); |
449 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | 449 | device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); |
450 | kfree(i2c_dev); | 450 | kfree(i2c_dev); |
451 | 451 | ||
452 | pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); | 452 | pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 8ccee9c769f8..e3a267622bb6 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -1635,7 +1635,7 @@ static int idefloppy_begin_format(ide_drive_t *drive, int __user *arg) | |||
1635 | /* | 1635 | /* |
1636 | ** Get ATAPI_FORMAT_UNIT progress indication. | 1636 | ** Get ATAPI_FORMAT_UNIT progress indication. |
1637 | ** | 1637 | ** |
1638 | ** Userland gives a pointer to an int. The int is set to a progresss | 1638 | ** Userland gives a pointer to an int. The int is set to a progress |
1639 | ** indicator 0-65536, with 65536=100%. | 1639 | ** indicator 0-65536, with 65536=100%. |
1640 | ** | 1640 | ** |
1641 | ** If the drive does not support format progress indication, we just check | 1641 | ** If the drive does not support format progress indication, we just check |
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index e11187ecc931..7767a11b6890 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c | |||
@@ -139,7 +139,7 @@ static void queue_req(struct addr_req *req) | |||
139 | 139 | ||
140 | mutex_lock(&lock); | 140 | mutex_lock(&lock); |
141 | list_for_each_entry_reverse(temp_req, &req_list, list) { | 141 | list_for_each_entry_reverse(temp_req, &req_list, list) { |
142 | if (time_after(req->timeout, temp_req->timeout)) | 142 | if (time_after_eq(req->timeout, temp_req->timeout)) |
143 | break; | 143 | break; |
144 | } | 144 | } |
145 | 145 | ||
@@ -225,19 +225,17 @@ static void process_req(void *data) | |||
225 | 225 | ||
226 | mutex_lock(&lock); | 226 | mutex_lock(&lock); |
227 | list_for_each_entry_safe(req, temp_req, &req_list, list) { | 227 | list_for_each_entry_safe(req, temp_req, &req_list, list) { |
228 | if (req->status) { | 228 | if (req->status == -ENODATA) { |
229 | src_in = (struct sockaddr_in *) &req->src_addr; | 229 | src_in = (struct sockaddr_in *) &req->src_addr; |
230 | dst_in = (struct sockaddr_in *) &req->dst_addr; | 230 | dst_in = (struct sockaddr_in *) &req->dst_addr; |
231 | req->status = addr_resolve_remote(src_in, dst_in, | 231 | req->status = addr_resolve_remote(src_in, dst_in, |
232 | req->addr); | 232 | req->addr); |
233 | if (req->status && time_after_eq(jiffies, req->timeout)) | ||
234 | req->status = -ETIMEDOUT; | ||
235 | else if (req->status == -ENODATA) | ||
236 | continue; | ||
233 | } | 237 | } |
234 | if (req->status && time_after(jiffies, req->timeout)) | 238 | list_move_tail(&req->list, &done_list); |
235 | req->status = -ETIMEDOUT; | ||
236 | else if (req->status == -ENODATA) | ||
237 | continue; | ||
238 | |||
239 | list_del(&req->list); | ||
240 | list_add_tail(&req->list, &done_list); | ||
241 | } | 239 | } |
242 | 240 | ||
243 | if (!list_empty(&req_list)) { | 241 | if (!list_empty(&req_list)) { |
@@ -347,8 +345,7 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr) | |||
347 | if (req->addr == addr) { | 345 | if (req->addr == addr) { |
348 | req->status = -ECANCELED; | 346 | req->status = -ECANCELED; |
349 | req->timeout = jiffies; | 347 | req->timeout = jiffies; |
350 | list_del(&req->list); | 348 | list_move(&req->list, &req_list); |
351 | list_add(&req->list, &req_list); | ||
352 | set_timeout(req->timeout); | 349 | set_timeout(req->timeout); |
353 | break; | 350 | break; |
354 | } | 351 | } |
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index 25b1018a476c..e5dc4530808a 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -147,12 +147,12 @@ struct cm_id_private { | |||
147 | __be32 rq_psn; | 147 | __be32 rq_psn; |
148 | int timeout_ms; | 148 | int timeout_ms; |
149 | enum ib_mtu path_mtu; | 149 | enum ib_mtu path_mtu; |
150 | __be16 pkey; | ||
150 | u8 private_data_len; | 151 | u8 private_data_len; |
151 | u8 max_cm_retries; | 152 | u8 max_cm_retries; |
152 | u8 peer_to_peer; | 153 | u8 peer_to_peer; |
153 | u8 responder_resources; | 154 | u8 responder_resources; |
154 | u8 initiator_depth; | 155 | u8 initiator_depth; |
155 | u8 local_ack_timeout; | ||
156 | u8 retry_count; | 156 | u8 retry_count; |
157 | u8 rnr_retry_count; | 157 | u8 rnr_retry_count; |
158 | u8 service_timeout; | 158 | u8 service_timeout; |
@@ -240,11 +240,10 @@ static void * cm_copy_private_data(const void *private_data, | |||
240 | if (!private_data || !private_data_len) | 240 | if (!private_data || !private_data_len) |
241 | return NULL; | 241 | return NULL; |
242 | 242 | ||
243 | data = kmalloc(private_data_len, GFP_KERNEL); | 243 | data = kmemdup(private_data, private_data_len, GFP_KERNEL); |
244 | if (!data) | 244 | if (!data) |
245 | return ERR_PTR(-ENOMEM); | 245 | return ERR_PTR(-ENOMEM); |
246 | 246 | ||
247 | memcpy(data, private_data, private_data_len); | ||
248 | return data; | 247 | return data; |
249 | } | 248 | } |
250 | 249 | ||
@@ -691,7 +690,7 @@ static void cm_enter_timewait(struct cm_id_private *cm_id_priv) | |||
691 | * timewait before notifying the user that we've exited timewait. | 690 | * timewait before notifying the user that we've exited timewait. |
692 | */ | 691 | */ |
693 | cm_id_priv->id.state = IB_CM_TIMEWAIT; | 692 | cm_id_priv->id.state = IB_CM_TIMEWAIT; |
694 | wait_time = cm_convert_to_ms(cm_id_priv->local_ack_timeout); | 693 | wait_time = cm_convert_to_ms(cm_id_priv->av.packet_life_time + 1); |
695 | queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, | 694 | queue_delayed_work(cm.wq, &cm_id_priv->timewait_info->work.work, |
696 | msecs_to_jiffies(wait_time)); | 695 | msecs_to_jiffies(wait_time)); |
697 | cm_id_priv->timewait_info = NULL; | 696 | cm_id_priv->timewait_info = NULL; |
@@ -1010,6 +1009,7 @@ int ib_send_cm_req(struct ib_cm_id *cm_id, | |||
1010 | cm_id_priv->responder_resources = param->responder_resources; | 1009 | cm_id_priv->responder_resources = param->responder_resources; |
1011 | cm_id_priv->retry_count = param->retry_count; | 1010 | cm_id_priv->retry_count = param->retry_count; |
1012 | cm_id_priv->path_mtu = param->primary_path->mtu; | 1011 | cm_id_priv->path_mtu = param->primary_path->mtu; |
1012 | cm_id_priv->pkey = param->primary_path->pkey; | ||
1013 | cm_id_priv->qp_type = param->qp_type; | 1013 | cm_id_priv->qp_type = param->qp_type; |
1014 | 1014 | ||
1015 | ret = cm_alloc_msg(cm_id_priv, &cm_id_priv->msg); | 1015 | ret = cm_alloc_msg(cm_id_priv, &cm_id_priv->msg); |
@@ -1024,8 +1024,6 @@ int ib_send_cm_req(struct ib_cm_id *cm_id, | |||
1024 | 1024 | ||
1025 | cm_id_priv->local_qpn = cm_req_get_local_qpn(req_msg); | 1025 | cm_id_priv->local_qpn = cm_req_get_local_qpn(req_msg); |
1026 | cm_id_priv->rq_psn = cm_req_get_starting_psn(req_msg); | 1026 | cm_id_priv->rq_psn = cm_req_get_starting_psn(req_msg); |
1027 | cm_id_priv->local_ack_timeout = | ||
1028 | cm_req_get_primary_local_ack_timeout(req_msg); | ||
1029 | 1027 | ||
1030 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 1028 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
1031 | ret = ib_post_send_mad(cm_id_priv->msg, NULL); | 1029 | ret = ib_post_send_mad(cm_id_priv->msg, NULL); |
@@ -1410,9 +1408,8 @@ static int cm_req_handler(struct cm_work *work) | |||
1410 | cm_id_priv->initiator_depth = cm_req_get_resp_res(req_msg); | 1408 | cm_id_priv->initiator_depth = cm_req_get_resp_res(req_msg); |
1411 | cm_id_priv->responder_resources = cm_req_get_init_depth(req_msg); | 1409 | cm_id_priv->responder_resources = cm_req_get_init_depth(req_msg); |
1412 | cm_id_priv->path_mtu = cm_req_get_path_mtu(req_msg); | 1410 | cm_id_priv->path_mtu = cm_req_get_path_mtu(req_msg); |
1411 | cm_id_priv->pkey = req_msg->pkey; | ||
1413 | cm_id_priv->sq_psn = cm_req_get_starting_psn(req_msg); | 1412 | cm_id_priv->sq_psn = cm_req_get_starting_psn(req_msg); |
1414 | cm_id_priv->local_ack_timeout = | ||
1415 | cm_req_get_primary_local_ack_timeout(req_msg); | ||
1416 | cm_id_priv->retry_count = cm_req_get_retry_count(req_msg); | 1413 | cm_id_priv->retry_count = cm_req_get_retry_count(req_msg); |
1417 | cm_id_priv->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg); | 1414 | cm_id_priv->rnr_retry_count = cm_req_get_rnr_retry_count(req_msg); |
1418 | cm_id_priv->qp_type = cm_req_get_qp_type(req_msg); | 1415 | cm_id_priv->qp_type = cm_req_get_qp_type(req_msg); |
@@ -1716,7 +1713,7 @@ static int cm_establish_handler(struct cm_work *work) | |||
1716 | unsigned long flags; | 1713 | unsigned long flags; |
1717 | int ret; | 1714 | int ret; |
1718 | 1715 | ||
1719 | /* See comment in ib_cm_establish about lookup. */ | 1716 | /* See comment in cm_establish about lookup. */ |
1720 | cm_id_priv = cm_acquire_id(work->local_id, work->remote_id); | 1717 | cm_id_priv = cm_acquire_id(work->local_id, work->remote_id); |
1721 | if (!cm_id_priv) | 1718 | if (!cm_id_priv) |
1722 | return -EINVAL; | 1719 | return -EINVAL; |
@@ -2402,11 +2399,16 @@ int ib_send_cm_lap(struct ib_cm_id *cm_id, | |||
2402 | cm_id_priv = container_of(cm_id, struct cm_id_private, id); | 2399 | cm_id_priv = container_of(cm_id, struct cm_id_private, id); |
2403 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 2400 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
2404 | if (cm_id->state != IB_CM_ESTABLISHED || | 2401 | if (cm_id->state != IB_CM_ESTABLISHED || |
2405 | cm_id->lap_state != IB_CM_LAP_IDLE) { | 2402 | (cm_id->lap_state != IB_CM_LAP_UNINIT && |
2403 | cm_id->lap_state != IB_CM_LAP_IDLE)) { | ||
2406 | ret = -EINVAL; | 2404 | ret = -EINVAL; |
2407 | goto out; | 2405 | goto out; |
2408 | } | 2406 | } |
2409 | 2407 | ||
2408 | ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av); | ||
2409 | if (ret) | ||
2410 | goto out; | ||
2411 | |||
2410 | ret = cm_alloc_msg(cm_id_priv, &msg); | 2412 | ret = cm_alloc_msg(cm_id_priv, &msg); |
2411 | if (ret) | 2413 | if (ret) |
2412 | goto out; | 2414 | goto out; |
@@ -2431,7 +2433,8 @@ out: spin_unlock_irqrestore(&cm_id_priv->lock, flags); | |||
2431 | } | 2433 | } |
2432 | EXPORT_SYMBOL(ib_send_cm_lap); | 2434 | EXPORT_SYMBOL(ib_send_cm_lap); |
2433 | 2435 | ||
2434 | static void cm_format_path_from_lap(struct ib_sa_path_rec *path, | 2436 | static void cm_format_path_from_lap(struct cm_id_private *cm_id_priv, |
2437 | struct ib_sa_path_rec *path, | ||
2435 | struct cm_lap_msg *lap_msg) | 2438 | struct cm_lap_msg *lap_msg) |
2436 | { | 2439 | { |
2437 | memset(path, 0, sizeof *path); | 2440 | memset(path, 0, sizeof *path); |
@@ -2443,10 +2446,10 @@ static void cm_format_path_from_lap(struct ib_sa_path_rec *path, | |||
2443 | path->hop_limit = lap_msg->alt_hop_limit; | 2446 | path->hop_limit = lap_msg->alt_hop_limit; |
2444 | path->traffic_class = cm_lap_get_traffic_class(lap_msg); | 2447 | path->traffic_class = cm_lap_get_traffic_class(lap_msg); |
2445 | path->reversible = 1; | 2448 | path->reversible = 1; |
2446 | /* pkey is same as in REQ */ | 2449 | path->pkey = cm_id_priv->pkey; |
2447 | path->sl = cm_lap_get_sl(lap_msg); | 2450 | path->sl = cm_lap_get_sl(lap_msg); |
2448 | path->mtu_selector = IB_SA_EQ; | 2451 | path->mtu_selector = IB_SA_EQ; |
2449 | /* mtu is same as in REQ */ | 2452 | path->mtu = cm_id_priv->path_mtu; |
2450 | path->rate_selector = IB_SA_EQ; | 2453 | path->rate_selector = IB_SA_EQ; |
2451 | path->rate = cm_lap_get_packet_rate(lap_msg); | 2454 | path->rate = cm_lap_get_packet_rate(lap_msg); |
2452 | path->packet_life_time_selector = IB_SA_EQ; | 2455 | path->packet_life_time_selector = IB_SA_EQ; |
@@ -2472,7 +2475,7 @@ static int cm_lap_handler(struct cm_work *work) | |||
2472 | 2475 | ||
2473 | param = &work->cm_event.param.lap_rcvd; | 2476 | param = &work->cm_event.param.lap_rcvd; |
2474 | param->alternate_path = &work->path[0]; | 2477 | param->alternate_path = &work->path[0]; |
2475 | cm_format_path_from_lap(param->alternate_path, lap_msg); | 2478 | cm_format_path_from_lap(cm_id_priv, param->alternate_path, lap_msg); |
2476 | work->cm_event.private_data = &lap_msg->private_data; | 2479 | work->cm_event.private_data = &lap_msg->private_data; |
2477 | 2480 | ||
2478 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 2481 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
@@ -2480,6 +2483,7 @@ static int cm_lap_handler(struct cm_work *work) | |||
2480 | goto unlock; | 2483 | goto unlock; |
2481 | 2484 | ||
2482 | switch (cm_id_priv->id.lap_state) { | 2485 | switch (cm_id_priv->id.lap_state) { |
2486 | case IB_CM_LAP_UNINIT: | ||
2483 | case IB_CM_LAP_IDLE: | 2487 | case IB_CM_LAP_IDLE: |
2484 | break; | 2488 | break; |
2485 | case IB_CM_MRA_LAP_SENT: | 2489 | case IB_CM_MRA_LAP_SENT: |
@@ -2502,6 +2506,10 @@ static int cm_lap_handler(struct cm_work *work) | |||
2502 | 2506 | ||
2503 | cm_id_priv->id.lap_state = IB_CM_LAP_RCVD; | 2507 | cm_id_priv->id.lap_state = IB_CM_LAP_RCVD; |
2504 | cm_id_priv->tid = lap_msg->hdr.tid; | 2508 | cm_id_priv->tid = lap_msg->hdr.tid; |
2509 | cm_init_av_for_response(work->port, work->mad_recv_wc->wc, | ||
2510 | work->mad_recv_wc->recv_buf.grh, | ||
2511 | &cm_id_priv->av); | ||
2512 | cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av); | ||
2505 | ret = atomic_inc_and_test(&cm_id_priv->work_count); | 2513 | ret = atomic_inc_and_test(&cm_id_priv->work_count); |
2506 | if (!ret) | 2514 | if (!ret) |
2507 | list_add_tail(&work->list, &cm_id_priv->work_list); | 2515 | list_add_tail(&work->list, &cm_id_priv->work_list); |
@@ -3040,7 +3048,7 @@ static void cm_work_handler(void *data) | |||
3040 | cm_free_work(work); | 3048 | cm_free_work(work); |
3041 | } | 3049 | } |
3042 | 3050 | ||
3043 | int ib_cm_establish(struct ib_cm_id *cm_id) | 3051 | static int cm_establish(struct ib_cm_id *cm_id) |
3044 | { | 3052 | { |
3045 | struct cm_id_private *cm_id_priv; | 3053 | struct cm_id_private *cm_id_priv; |
3046 | struct cm_work *work; | 3054 | struct cm_work *work; |
@@ -3088,7 +3096,44 @@ int ib_cm_establish(struct ib_cm_id *cm_id) | |||
3088 | out: | 3096 | out: |
3089 | return ret; | 3097 | return ret; |
3090 | } | 3098 | } |
3091 | EXPORT_SYMBOL(ib_cm_establish); | 3099 | |
3100 | static int cm_migrate(struct ib_cm_id *cm_id) | ||
3101 | { | ||
3102 | struct cm_id_private *cm_id_priv; | ||
3103 | unsigned long flags; | ||
3104 | int ret = 0; | ||
3105 | |||
3106 | cm_id_priv = container_of(cm_id, struct cm_id_private, id); | ||
3107 | spin_lock_irqsave(&cm_id_priv->lock, flags); | ||
3108 | if (cm_id->state == IB_CM_ESTABLISHED && | ||
3109 | (cm_id->lap_state == IB_CM_LAP_UNINIT || | ||
3110 | cm_id->lap_state == IB_CM_LAP_IDLE)) { | ||
3111 | cm_id->lap_state = IB_CM_LAP_IDLE; | ||
3112 | cm_id_priv->av = cm_id_priv->alt_av; | ||
3113 | } else | ||
3114 | ret = -EINVAL; | ||
3115 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | ||
3116 | |||
3117 | return ret; | ||
3118 | } | ||
3119 | |||
3120 | int ib_cm_notify(struct ib_cm_id *cm_id, enum ib_event_type event) | ||
3121 | { | ||
3122 | int ret; | ||
3123 | |||
3124 | switch (event) { | ||
3125 | case IB_EVENT_COMM_EST: | ||
3126 | ret = cm_establish(cm_id); | ||
3127 | break; | ||
3128 | case IB_EVENT_PATH_MIG: | ||
3129 | ret = cm_migrate(cm_id); | ||
3130 | break; | ||
3131 | default: | ||
3132 | ret = -EINVAL; | ||
3133 | } | ||
3134 | return ret; | ||
3135 | } | ||
3136 | EXPORT_SYMBOL(ib_cm_notify); | ||
3092 | 3137 | ||
3093 | static void cm_recv_handler(struct ib_mad_agent *mad_agent, | 3138 | static void cm_recv_handler(struct ib_mad_agent *mad_agent, |
3094 | struct ib_mad_recv_wc *mad_recv_wc) | 3139 | struct ib_mad_recv_wc *mad_recv_wc) |
@@ -3173,8 +3218,7 @@ static int cm_init_qp_init_attr(struct cm_id_private *cm_id_priv, | |||
3173 | case IB_CM_ESTABLISHED: | 3218 | case IB_CM_ESTABLISHED: |
3174 | *qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS | | 3219 | *qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS | |
3175 | IB_QP_PKEY_INDEX | IB_QP_PORT; | 3220 | IB_QP_PKEY_INDEX | IB_QP_PORT; |
3176 | qp_attr->qp_access_flags = IB_ACCESS_LOCAL_WRITE | | 3221 | qp_attr->qp_access_flags = IB_ACCESS_REMOTE_WRITE; |
3177 | IB_ACCESS_REMOTE_WRITE; | ||
3178 | if (cm_id_priv->responder_resources) | 3222 | if (cm_id_priv->responder_resources) |
3179 | qp_attr->qp_access_flags |= IB_ACCESS_REMOTE_READ | | 3223 | qp_attr->qp_access_flags |= IB_ACCESS_REMOTE_READ | |
3180 | IB_ACCESS_REMOTE_ATOMIC; | 3224 | IB_ACCESS_REMOTE_ATOMIC; |
@@ -3222,6 +3266,9 @@ static int cm_init_qp_rtr_attr(struct cm_id_private *cm_id_priv, | |||
3222 | if (cm_id_priv->alt_av.ah_attr.dlid) { | 3266 | if (cm_id_priv->alt_av.ah_attr.dlid) { |
3223 | *qp_attr_mask |= IB_QP_ALT_PATH; | 3267 | *qp_attr_mask |= IB_QP_ALT_PATH; |
3224 | qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num; | 3268 | qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num; |
3269 | qp_attr->alt_pkey_index = cm_id_priv->alt_av.pkey_index; | ||
3270 | qp_attr->alt_timeout = | ||
3271 | cm_id_priv->alt_av.packet_life_time + 1; | ||
3225 | qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr; | 3272 | qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr; |
3226 | } | 3273 | } |
3227 | ret = 0; | 3274 | ret = 0; |
@@ -3248,19 +3295,31 @@ static int cm_init_qp_rts_attr(struct cm_id_private *cm_id_priv, | |||
3248 | case IB_CM_REP_SENT: | 3295 | case IB_CM_REP_SENT: |
3249 | case IB_CM_MRA_REP_RCVD: | 3296 | case IB_CM_MRA_REP_RCVD: |
3250 | case IB_CM_ESTABLISHED: | 3297 | case IB_CM_ESTABLISHED: |
3251 | *qp_attr_mask = IB_QP_STATE | IB_QP_SQ_PSN; | 3298 | if (cm_id_priv->id.lap_state == IB_CM_LAP_UNINIT) { |
3252 | qp_attr->sq_psn = be32_to_cpu(cm_id_priv->sq_psn); | 3299 | *qp_attr_mask = IB_QP_STATE | IB_QP_SQ_PSN; |
3253 | if (cm_id_priv->qp_type == IB_QPT_RC) { | 3300 | qp_attr->sq_psn = be32_to_cpu(cm_id_priv->sq_psn); |
3254 | *qp_attr_mask |= IB_QP_TIMEOUT | IB_QP_RETRY_CNT | | 3301 | if (cm_id_priv->qp_type == IB_QPT_RC) { |
3255 | IB_QP_RNR_RETRY | | 3302 | *qp_attr_mask |= IB_QP_TIMEOUT | IB_QP_RETRY_CNT | |
3256 | IB_QP_MAX_QP_RD_ATOMIC; | 3303 | IB_QP_RNR_RETRY | |
3257 | qp_attr->timeout = cm_id_priv->local_ack_timeout; | 3304 | IB_QP_MAX_QP_RD_ATOMIC; |
3258 | qp_attr->retry_cnt = cm_id_priv->retry_count; | 3305 | qp_attr->timeout = |
3259 | qp_attr->rnr_retry = cm_id_priv->rnr_retry_count; | 3306 | cm_id_priv->av.packet_life_time + 1; |
3260 | qp_attr->max_rd_atomic = cm_id_priv->initiator_depth; | 3307 | qp_attr->retry_cnt = cm_id_priv->retry_count; |
3261 | } | 3308 | qp_attr->rnr_retry = cm_id_priv->rnr_retry_count; |
3262 | if (cm_id_priv->alt_av.ah_attr.dlid) { | 3309 | qp_attr->max_rd_atomic = |
3263 | *qp_attr_mask |= IB_QP_PATH_MIG_STATE; | 3310 | cm_id_priv->initiator_depth; |
3311 | } | ||
3312 | if (cm_id_priv->alt_av.ah_attr.dlid) { | ||
3313 | *qp_attr_mask |= IB_QP_PATH_MIG_STATE; | ||
3314 | qp_attr->path_mig_state = IB_MIG_REARM; | ||
3315 | } | ||
3316 | } else { | ||
3317 | *qp_attr_mask = IB_QP_ALT_PATH | IB_QP_PATH_MIG_STATE; | ||
3318 | qp_attr->alt_port_num = cm_id_priv->alt_av.port->port_num; | ||
3319 | qp_attr->alt_pkey_index = cm_id_priv->alt_av.pkey_index; | ||
3320 | qp_attr->alt_timeout = | ||
3321 | cm_id_priv->alt_av.packet_life_time + 1; | ||
3322 | qp_attr->alt_ah_attr = cm_id_priv->alt_av.ah_attr; | ||
3264 | qp_attr->path_mig_state = IB_MIG_REARM; | 3323 | qp_attr->path_mig_state = IB_MIG_REARM; |
3265 | } | 3324 | } |
3266 | ret = 0; | 3325 | ret = 0; |
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index 845090b0859c..cf48f2697434 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
@@ -344,7 +344,7 @@ static int cma_init_ib_qp(struct rdma_id_private *id_priv, struct ib_qp *qp) | |||
344 | return ret; | 344 | return ret; |
345 | 345 | ||
346 | qp_attr.qp_state = IB_QPS_INIT; | 346 | qp_attr.qp_state = IB_QPS_INIT; |
347 | qp_attr.qp_access_flags = IB_ACCESS_LOCAL_WRITE; | 347 | qp_attr.qp_access_flags = 0; |
348 | qp_attr.port_num = id_priv->id.port_num; | 348 | qp_attr.port_num = id_priv->id.port_num; |
349 | return ib_modify_qp(qp, &qp_attr, IB_QP_STATE | IB_QP_ACCESS_FLAGS | | 349 | return ib_modify_qp(qp, &qp_attr, IB_QP_STATE | IB_QP_ACCESS_FLAGS | |
350 | IB_QP_PKEY_INDEX | IB_QP_PORT); | 350 | IB_QP_PKEY_INDEX | IB_QP_PORT); |
@@ -935,13 +935,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
935 | mutex_lock(&lock); | 935 | mutex_lock(&lock); |
936 | ret = cma_acquire_dev(conn_id); | 936 | ret = cma_acquire_dev(conn_id); |
937 | mutex_unlock(&lock); | 937 | mutex_unlock(&lock); |
938 | if (ret) { | 938 | if (ret) |
939 | ret = -ENODEV; | 939 | goto release_conn_id; |
940 | cma_exch(conn_id, CMA_DESTROYING); | ||
941 | cma_release_remove(conn_id); | ||
942 | rdma_destroy_id(&conn_id->id); | ||
943 | goto out; | ||
944 | } | ||
945 | 940 | ||
946 | conn_id->cm_id.ib = cm_id; | 941 | conn_id->cm_id.ib = cm_id; |
947 | cm_id->context = conn_id; | 942 | cm_id->context = conn_id; |
@@ -951,13 +946,17 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
951 | ret = cma_notify_user(conn_id, RDMA_CM_EVENT_CONNECT_REQUEST, 0, | 946 | ret = cma_notify_user(conn_id, RDMA_CM_EVENT_CONNECT_REQUEST, 0, |
952 | ib_event->private_data + offset, | 947 | ib_event->private_data + offset, |
953 | IB_CM_REQ_PRIVATE_DATA_SIZE - offset); | 948 | IB_CM_REQ_PRIVATE_DATA_SIZE - offset); |
954 | if (ret) { | 949 | if (!ret) |
955 | /* Destroy the CM ID by returning a non-zero value. */ | 950 | goto out; |
956 | conn_id->cm_id.ib = NULL; | 951 | |
957 | cma_exch(conn_id, CMA_DESTROYING); | 952 | /* Destroy the CM ID by returning a non-zero value. */ |
958 | cma_release_remove(conn_id); | 953 | conn_id->cm_id.ib = NULL; |
959 | rdma_destroy_id(&conn_id->id); | 954 | |
960 | } | 955 | release_conn_id: |
956 | cma_exch(conn_id, CMA_DESTROYING); | ||
957 | cma_release_remove(conn_id); | ||
958 | rdma_destroy_id(&conn_id->id); | ||
959 | |||
961 | out: | 960 | out: |
962 | cma_release_remove(listen_id); | 961 | cma_release_remove(listen_id); |
963 | return ret; | 962 | return ret; |
@@ -1481,19 +1480,18 @@ static int cma_bind_loopback(struct rdma_id_private *id_priv) | |||
1481 | u8 p; | 1480 | u8 p; |
1482 | 1481 | ||
1483 | mutex_lock(&lock); | 1482 | mutex_lock(&lock); |
1483 | if (list_empty(&dev_list)) { | ||
1484 | ret = -ENODEV; | ||
1485 | goto out; | ||
1486 | } | ||
1484 | list_for_each_entry(cma_dev, &dev_list, list) | 1487 | list_for_each_entry(cma_dev, &dev_list, list) |
1485 | for (p = 1; p <= cma_dev->device->phys_port_cnt; ++p) | 1488 | for (p = 1; p <= cma_dev->device->phys_port_cnt; ++p) |
1486 | if (!ib_query_port (cma_dev->device, p, &port_attr) && | 1489 | if (!ib_query_port(cma_dev->device, p, &port_attr) && |
1487 | port_attr.state == IB_PORT_ACTIVE) | 1490 | port_attr.state == IB_PORT_ACTIVE) |
1488 | goto port_found; | 1491 | goto port_found; |
1489 | 1492 | ||
1490 | if (!list_empty(&dev_list)) { | 1493 | p = 1; |
1491 | p = 1; | 1494 | cma_dev = list_entry(dev_list.next, struct cma_device, list); |
1492 | cma_dev = list_entry(dev_list.next, struct cma_device, list); | ||
1493 | } else { | ||
1494 | ret = -ENODEV; | ||
1495 | goto out; | ||
1496 | } | ||
1497 | 1495 | ||
1498 | port_found: | 1496 | port_found: |
1499 | ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid); | 1497 | ret = ib_get_cached_gid(cma_dev->device, p, 0, &gid); |
@@ -2123,8 +2121,6 @@ static void cma_add_one(struct ib_device *device) | |||
2123 | 2121 | ||
2124 | cma_dev->device = device; | 2122 | cma_dev->device = device; |
2125 | cma_dev->node_guid = device->node_guid; | 2123 | cma_dev->node_guid = device->node_guid; |
2126 | if (!cma_dev->node_guid) | ||
2127 | goto err; | ||
2128 | 2124 | ||
2129 | init_completion(&cma_dev->comp); | 2125 | init_completion(&cma_dev->comp); |
2130 | atomic_set(&cma_dev->refcount, 1); | 2126 | atomic_set(&cma_dev->refcount, 1); |
@@ -2136,9 +2132,6 @@ static void cma_add_one(struct ib_device *device) | |||
2136 | list_for_each_entry(id_priv, &listen_any_list, list) | 2132 | list_for_each_entry(id_priv, &listen_any_list, list) |
2137 | cma_listen_on_dev(id_priv, cma_dev); | 2133 | cma_listen_on_dev(id_priv, cma_dev); |
2138 | mutex_unlock(&lock); | 2134 | mutex_unlock(&lock); |
2139 | return; | ||
2140 | err: | ||
2141 | kfree(cma_dev); | ||
2142 | } | 2135 | } |
2143 | 2136 | ||
2144 | static int cma_remove_id_dev(struct rdma_id_private *id_priv) | 2137 | static int cma_remove_id_dev(struct rdma_id_private *id_priv) |
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c index c3fb304a4e86..cf797d7aea09 100644 --- a/drivers/infiniband/core/iwcm.c +++ b/drivers/infiniband/core/iwcm.c | |||
@@ -80,7 +80,7 @@ struct iwcm_work { | |||
80 | * 1) in the event upcall, cm_event_handler(), for a listening cm_id. If | 80 | * 1) in the event upcall, cm_event_handler(), for a listening cm_id. If |
81 | * the backlog is exceeded, then no more connection request events will | 81 | * the backlog is exceeded, then no more connection request events will |
82 | * be processed. cm_event_handler() returns -ENOMEM in this case. Its up | 82 | * be processed. cm_event_handler() returns -ENOMEM in this case. Its up |
83 | * to the provider to reject the connectino request. | 83 | * to the provider to reject the connection request. |
84 | * 2) in the connection request workqueue handler, cm_conn_req_handler(). | 84 | * 2) in the connection request workqueue handler, cm_conn_req_handler(). |
85 | * If work elements cannot be allocated for the new connect request cm_id, | 85 | * If work elements cannot be allocated for the new connect request cm_id, |
86 | * then IWCM will call the provider reject method. This is ok since | 86 | * then IWCM will call the provider reject method. This is ok since |
@@ -131,26 +131,25 @@ static int alloc_work_entries(struct iwcm_id_private *cm_id_priv, int count) | |||
131 | } | 131 | } |
132 | 132 | ||
133 | /* | 133 | /* |
134 | * Save private data from incoming connection requests in the | 134 | * Save private data from incoming connection requests to |
135 | * cm_id_priv so the low level driver doesn't have to. Adjust | 135 | * iw_cm_event, so the low level driver doesn't have to. Adjust |
136 | * the event ptr to point to the local copy. | 136 | * the event ptr to point to the local copy. |
137 | */ | 137 | */ |
138 | static int copy_private_data(struct iwcm_id_private *cm_id_priv, | 138 | static int copy_private_data(struct iw_cm_event *event) |
139 | struct iw_cm_event *event) | ||
140 | { | 139 | { |
141 | void *p; | 140 | void *p; |
142 | 141 | ||
143 | p = kmalloc(event->private_data_len, GFP_ATOMIC); | 142 | p = kmemdup(event->private_data, event->private_data_len, GFP_ATOMIC); |
144 | if (!p) | 143 | if (!p) |
145 | return -ENOMEM; | 144 | return -ENOMEM; |
146 | memcpy(p, event->private_data, event->private_data_len); | ||
147 | event->private_data = p; | 145 | event->private_data = p; |
148 | return 0; | 146 | return 0; |
149 | } | 147 | } |
150 | 148 | ||
151 | /* | 149 | /* |
152 | * Release a reference on cm_id. If the last reference is being removed | 150 | * Release a reference on cm_id. If the last reference is being |
153 | * and iw_destroy_cm_id is waiting, wake up the waiting thread. | 151 | * released, enable the waiting thread (in iw_destroy_cm_id) to |
152 | * get woken up, and return 1 if a thread is already waiting. | ||
154 | */ | 153 | */ |
155 | static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv) | 154 | static int iwcm_deref_id(struct iwcm_id_private *cm_id_priv) |
156 | { | 155 | { |
@@ -243,7 +242,7 @@ static int iwcm_modify_qp_sqd(struct ib_qp *qp) | |||
243 | /* | 242 | /* |
244 | * CM_ID <-- CLOSING | 243 | * CM_ID <-- CLOSING |
245 | * | 244 | * |
246 | * Block if a passive or active connection is currenlty being processed. Then | 245 | * Block if a passive or active connection is currently being processed. Then |
247 | * process the event as follows: | 246 | * process the event as follows: |
248 | * - If we are ESTABLISHED, move to CLOSING and modify the QP state | 247 | * - If we are ESTABLISHED, move to CLOSING and modify the QP state |
249 | * based on the abrupt flag | 248 | * based on the abrupt flag |
@@ -408,7 +407,7 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog) | |||
408 | { | 407 | { |
409 | struct iwcm_id_private *cm_id_priv; | 408 | struct iwcm_id_private *cm_id_priv; |
410 | unsigned long flags; | 409 | unsigned long flags; |
411 | int ret = 0; | 410 | int ret; |
412 | 411 | ||
413 | cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); | 412 | cm_id_priv = container_of(cm_id, struct iwcm_id_private, id); |
414 | 413 | ||
@@ -535,7 +534,7 @@ EXPORT_SYMBOL(iw_cm_accept); | |||
535 | int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param) | 534 | int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param) |
536 | { | 535 | { |
537 | struct iwcm_id_private *cm_id_priv; | 536 | struct iwcm_id_private *cm_id_priv; |
538 | int ret = 0; | 537 | int ret; |
539 | unsigned long flags; | 538 | unsigned long flags; |
540 | struct ib_qp *qp; | 539 | struct ib_qp *qp; |
541 | 540 | ||
@@ -620,7 +619,7 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv, | |||
620 | spin_lock_irqsave(&listen_id_priv->lock, flags); | 619 | spin_lock_irqsave(&listen_id_priv->lock, flags); |
621 | if (listen_id_priv->state != IW_CM_STATE_LISTEN) { | 620 | if (listen_id_priv->state != IW_CM_STATE_LISTEN) { |
622 | spin_unlock_irqrestore(&listen_id_priv->lock, flags); | 621 | spin_unlock_irqrestore(&listen_id_priv->lock, flags); |
623 | return; | 622 | goto out; |
624 | } | 623 | } |
625 | spin_unlock_irqrestore(&listen_id_priv->lock, flags); | 624 | spin_unlock_irqrestore(&listen_id_priv->lock, flags); |
626 | 625 | ||
@@ -629,7 +628,7 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv, | |||
629 | listen_id_priv->id.context); | 628 | listen_id_priv->id.context); |
630 | /* If the cm_id could not be created, ignore the request */ | 629 | /* If the cm_id could not be created, ignore the request */ |
631 | if (IS_ERR(cm_id)) | 630 | if (IS_ERR(cm_id)) |
632 | return; | 631 | goto out; |
633 | 632 | ||
634 | cm_id->provider_data = iw_event->provider_data; | 633 | cm_id->provider_data = iw_event->provider_data; |
635 | cm_id->local_addr = iw_event->local_addr; | 634 | cm_id->local_addr = iw_event->local_addr; |
@@ -642,7 +641,7 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv, | |||
642 | if (ret) { | 641 | if (ret) { |
643 | iw_cm_reject(cm_id, NULL, 0); | 642 | iw_cm_reject(cm_id, NULL, 0); |
644 | iw_destroy_cm_id(cm_id); | 643 | iw_destroy_cm_id(cm_id); |
645 | return; | 644 | goto out; |
646 | } | 645 | } |
647 | 646 | ||
648 | /* Call the client CM handler */ | 647 | /* Call the client CM handler */ |
@@ -654,6 +653,7 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv, | |||
654 | kfree(cm_id); | 653 | kfree(cm_id); |
655 | } | 654 | } |
656 | 655 | ||
656 | out: | ||
657 | if (iw_event->private_data_len) | 657 | if (iw_event->private_data_len) |
658 | kfree(iw_event->private_data); | 658 | kfree(iw_event->private_data); |
659 | } | 659 | } |
@@ -674,7 +674,7 @@ static int cm_conn_est_handler(struct iwcm_id_private *cm_id_priv, | |||
674 | struct iw_cm_event *iw_event) | 674 | struct iw_cm_event *iw_event) |
675 | { | 675 | { |
676 | unsigned long flags; | 676 | unsigned long flags; |
677 | int ret = 0; | 677 | int ret; |
678 | 678 | ||
679 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 679 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
680 | 680 | ||
@@ -704,7 +704,7 @@ static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv, | |||
704 | struct iw_cm_event *iw_event) | 704 | struct iw_cm_event *iw_event) |
705 | { | 705 | { |
706 | unsigned long flags; | 706 | unsigned long flags; |
707 | int ret = 0; | 707 | int ret; |
708 | 708 | ||
709 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 709 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
710 | /* | 710 | /* |
@@ -830,7 +830,8 @@ static int process_event(struct iwcm_id_private *cm_id_priv, | |||
830 | */ | 830 | */ |
831 | static void cm_work_handler(void *arg) | 831 | static void cm_work_handler(void *arg) |
832 | { | 832 | { |
833 | struct iwcm_work *work = arg, lwork; | 833 | struct iwcm_work *work = arg; |
834 | struct iw_cm_event levent; | ||
834 | struct iwcm_id_private *cm_id_priv = work->cm_id; | 835 | struct iwcm_id_private *cm_id_priv = work->cm_id; |
835 | unsigned long flags; | 836 | unsigned long flags; |
836 | int empty; | 837 | int empty; |
@@ -843,11 +844,11 @@ static void cm_work_handler(void *arg) | |||
843 | struct iwcm_work, list); | 844 | struct iwcm_work, list); |
844 | list_del_init(&work->list); | 845 | list_del_init(&work->list); |
845 | empty = list_empty(&cm_id_priv->work_list); | 846 | empty = list_empty(&cm_id_priv->work_list); |
846 | lwork = *work; | 847 | levent = work->event; |
847 | put_work(work); | 848 | put_work(work); |
848 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); | 849 | spin_unlock_irqrestore(&cm_id_priv->lock, flags); |
849 | 850 | ||
850 | ret = process_event(cm_id_priv, &work->event); | 851 | ret = process_event(cm_id_priv, &levent); |
851 | if (ret) { | 852 | if (ret) { |
852 | set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags); | 853 | set_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags); |
853 | destroy_cm_id(&cm_id_priv->id); | 854 | destroy_cm_id(&cm_id_priv->id); |
@@ -906,7 +907,7 @@ static int cm_event_handler(struct iw_cm_id *cm_id, | |||
906 | if ((work->event.event == IW_CM_EVENT_CONNECT_REQUEST || | 907 | if ((work->event.event == IW_CM_EVENT_CONNECT_REQUEST || |
907 | work->event.event == IW_CM_EVENT_CONNECT_REPLY) && | 908 | work->event.event == IW_CM_EVENT_CONNECT_REPLY) && |
908 | work->event.private_data_len) { | 909 | work->event.private_data_len) { |
909 | ret = copy_private_data(cm_id_priv, &work->event); | 910 | ret = copy_private_data(&work->event); |
910 | if (ret) { | 911 | if (ret) { |
911 | put_work(work); | 912 | put_work(work); |
912 | goto out; | 913 | goto out; |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index a72bcea46ff6..3f9c16232c4d 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
@@ -46,7 +46,7 @@ MODULE_DESCRIPTION("kernel IB MAD API"); | |||
46 | MODULE_AUTHOR("Hal Rosenstock"); | 46 | MODULE_AUTHOR("Hal Rosenstock"); |
47 | MODULE_AUTHOR("Sean Hefty"); | 47 | MODULE_AUTHOR("Sean Hefty"); |
48 | 48 | ||
49 | static kmem_cache_t *ib_mad_cache; | 49 | static struct kmem_cache *ib_mad_cache; |
50 | 50 | ||
51 | static struct list_head ib_mad_port_list; | 51 | static struct list_head ib_mad_port_list; |
52 | static u32 ib_mad_client_id = 0; | 52 | static u32 ib_mad_client_id = 0; |
diff --git a/drivers/infiniband/core/ucm.c b/drivers/infiniband/core/ucm.c index ad4f4d5c2924..f15220a0ee75 100644 --- a/drivers/infiniband/core/ucm.c +++ b/drivers/infiniband/core/ucm.c | |||
@@ -161,12 +161,14 @@ static void ib_ucm_cleanup_events(struct ib_ucm_context *ctx) | |||
161 | struct ib_ucm_event, ctx_list); | 161 | struct ib_ucm_event, ctx_list); |
162 | list_del(&uevent->file_list); | 162 | list_del(&uevent->file_list); |
163 | list_del(&uevent->ctx_list); | 163 | list_del(&uevent->ctx_list); |
164 | mutex_unlock(&ctx->file->file_mutex); | ||
164 | 165 | ||
165 | /* clear incoming connections. */ | 166 | /* clear incoming connections. */ |
166 | if (ib_ucm_new_cm_id(uevent->resp.event)) | 167 | if (ib_ucm_new_cm_id(uevent->resp.event)) |
167 | ib_destroy_cm_id(uevent->cm_id); | 168 | ib_destroy_cm_id(uevent->cm_id); |
168 | 169 | ||
169 | kfree(uevent); | 170 | kfree(uevent); |
171 | mutex_lock(&ctx->file->file_mutex); | ||
170 | } | 172 | } |
171 | mutex_unlock(&ctx->file->file_mutex); | 173 | mutex_unlock(&ctx->file->file_mutex); |
172 | } | 174 | } |
@@ -328,20 +330,18 @@ static int ib_ucm_event_process(struct ib_cm_event *evt, | |||
328 | } | 330 | } |
329 | 331 | ||
330 | if (uvt->data_len) { | 332 | if (uvt->data_len) { |
331 | uvt->data = kmalloc(uvt->data_len, GFP_KERNEL); | 333 | uvt->data = kmemdup(evt->private_data, uvt->data_len, GFP_KERNEL); |
332 | if (!uvt->data) | 334 | if (!uvt->data) |
333 | goto err1; | 335 | goto err1; |
334 | 336 | ||
335 | memcpy(uvt->data, evt->private_data, uvt->data_len); | ||
336 | uvt->resp.present |= IB_UCM_PRES_DATA; | 337 | uvt->resp.present |= IB_UCM_PRES_DATA; |
337 | } | 338 | } |
338 | 339 | ||
339 | if (uvt->info_len) { | 340 | if (uvt->info_len) { |
340 | uvt->info = kmalloc(uvt->info_len, GFP_KERNEL); | 341 | uvt->info = kmemdup(info, uvt->info_len, GFP_KERNEL); |
341 | if (!uvt->info) | 342 | if (!uvt->info) |
342 | goto err2; | 343 | goto err2; |
343 | 344 | ||
344 | memcpy(uvt->info, info, uvt->info_len); | ||
345 | uvt->resp.present |= IB_UCM_PRES_INFO; | 345 | uvt->resp.present |= IB_UCM_PRES_INFO; |
346 | } | 346 | } |
347 | return 0; | 347 | return 0; |
@@ -685,11 +685,11 @@ out: | |||
685 | return result; | 685 | return result; |
686 | } | 686 | } |
687 | 687 | ||
688 | static ssize_t ib_ucm_establish(struct ib_ucm_file *file, | 688 | static ssize_t ib_ucm_notify(struct ib_ucm_file *file, |
689 | const char __user *inbuf, | 689 | const char __user *inbuf, |
690 | int in_len, int out_len) | 690 | int in_len, int out_len) |
691 | { | 691 | { |
692 | struct ib_ucm_establish cmd; | 692 | struct ib_ucm_notify cmd; |
693 | struct ib_ucm_context *ctx; | 693 | struct ib_ucm_context *ctx; |
694 | int result; | 694 | int result; |
695 | 695 | ||
@@ -700,7 +700,7 @@ static ssize_t ib_ucm_establish(struct ib_ucm_file *file, | |||
700 | if (IS_ERR(ctx)) | 700 | if (IS_ERR(ctx)) |
701 | return PTR_ERR(ctx); | 701 | return PTR_ERR(ctx); |
702 | 702 | ||
703 | result = ib_cm_establish(ctx->cm_id); | 703 | result = ib_cm_notify(ctx->cm_id, (enum ib_event_type) cmd.event); |
704 | ib_ucm_ctx_put(ctx); | 704 | ib_ucm_ctx_put(ctx); |
705 | return result; | 705 | return result; |
706 | } | 706 | } |
@@ -1107,7 +1107,7 @@ static ssize_t (*ucm_cmd_table[])(struct ib_ucm_file *file, | |||
1107 | [IB_USER_CM_CMD_DESTROY_ID] = ib_ucm_destroy_id, | 1107 | [IB_USER_CM_CMD_DESTROY_ID] = ib_ucm_destroy_id, |
1108 | [IB_USER_CM_CMD_ATTR_ID] = ib_ucm_attr_id, | 1108 | [IB_USER_CM_CMD_ATTR_ID] = ib_ucm_attr_id, |
1109 | [IB_USER_CM_CMD_LISTEN] = ib_ucm_listen, | 1109 | [IB_USER_CM_CMD_LISTEN] = ib_ucm_listen, |
1110 | [IB_USER_CM_CMD_ESTABLISH] = ib_ucm_establish, | 1110 | [IB_USER_CM_CMD_NOTIFY] = ib_ucm_notify, |
1111 | [IB_USER_CM_CMD_SEND_REQ] = ib_ucm_send_req, | 1111 | [IB_USER_CM_CMD_SEND_REQ] = ib_ucm_send_req, |
1112 | [IB_USER_CM_CMD_SEND_REP] = ib_ucm_send_rep, | 1112 | [IB_USER_CM_CMD_SEND_REP] = ib_ucm_send_rep, |
1113 | [IB_USER_CM_CMD_SEND_RTU] = ib_ucm_send_rtu, | 1113 | [IB_USER_CM_CMD_SEND_RTU] = ib_ucm_send_rtu, |
diff --git a/drivers/infiniband/hw/amso1100/c2.h b/drivers/infiniband/hw/amso1100/c2.h index 1b17dcdd0505..04a9db5de881 100644 --- a/drivers/infiniband/hw/amso1100/c2.h +++ b/drivers/infiniband/hw/amso1100/c2.h | |||
@@ -302,7 +302,7 @@ struct c2_dev { | |||
302 | unsigned long pa; /* PA device memory */ | 302 | unsigned long pa; /* PA device memory */ |
303 | void **qptr_array; | 303 | void **qptr_array; |
304 | 304 | ||
305 | kmem_cache_t *host_msg_cache; | 305 | struct kmem_cache *host_msg_cache; |
306 | 306 | ||
307 | struct list_head cca_link; /* adapter list */ | 307 | struct list_head cca_link; /* adapter list */ |
308 | struct list_head eh_wakeup_list; /* event wakeup list */ | 308 | struct list_head eh_wakeup_list; /* event wakeup list */ |
diff --git a/drivers/infiniband/hw/amso1100/c2_qp.c b/drivers/infiniband/hw/amso1100/c2_qp.c index 5bcf697aa335..179d005ed4a5 100644 --- a/drivers/infiniband/hw/amso1100/c2_qp.c +++ b/drivers/infiniband/hw/amso1100/c2_qp.c | |||
@@ -564,6 +564,32 @@ int c2_alloc_qp(struct c2_dev *c2dev, | |||
564 | return err; | 564 | return err; |
565 | } | 565 | } |
566 | 566 | ||
567 | static inline void c2_lock_cqs(struct c2_cq *send_cq, struct c2_cq *recv_cq) | ||
568 | { | ||
569 | if (send_cq == recv_cq) | ||
570 | spin_lock_irq(&send_cq->lock); | ||
571 | else if (send_cq > recv_cq) { | ||
572 | spin_lock_irq(&send_cq->lock); | ||
573 | spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING); | ||
574 | } else { | ||
575 | spin_lock_irq(&recv_cq->lock); | ||
576 | spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING); | ||
577 | } | ||
578 | } | ||
579 | |||
580 | static inline void c2_unlock_cqs(struct c2_cq *send_cq, struct c2_cq *recv_cq) | ||
581 | { | ||
582 | if (send_cq == recv_cq) | ||
583 | spin_unlock_irq(&send_cq->lock); | ||
584 | else if (send_cq > recv_cq) { | ||
585 | spin_unlock(&recv_cq->lock); | ||
586 | spin_unlock_irq(&send_cq->lock); | ||
587 | } else { | ||
588 | spin_unlock(&send_cq->lock); | ||
589 | spin_unlock_irq(&recv_cq->lock); | ||
590 | } | ||
591 | } | ||
592 | |||
567 | void c2_free_qp(struct c2_dev *c2dev, struct c2_qp *qp) | 593 | void c2_free_qp(struct c2_dev *c2dev, struct c2_qp *qp) |
568 | { | 594 | { |
569 | struct c2_cq *send_cq; | 595 | struct c2_cq *send_cq; |
@@ -576,15 +602,9 @@ void c2_free_qp(struct c2_dev *c2dev, struct c2_qp *qp) | |||
576 | * Lock CQs here, so that CQ polling code can do QP lookup | 602 | * Lock CQs here, so that CQ polling code can do QP lookup |
577 | * without taking a lock. | 603 | * without taking a lock. |
578 | */ | 604 | */ |
579 | spin_lock_irq(&send_cq->lock); | 605 | c2_lock_cqs(send_cq, recv_cq); |
580 | if (send_cq != recv_cq) | ||
581 | spin_lock(&recv_cq->lock); | ||
582 | |||
583 | c2_free_qpn(c2dev, qp->qpn); | 606 | c2_free_qpn(c2dev, qp->qpn); |
584 | 607 | c2_unlock_cqs(send_cq, recv_cq); | |
585 | if (send_cq != recv_cq) | ||
586 | spin_unlock(&recv_cq->lock); | ||
587 | spin_unlock_irq(&send_cq->lock); | ||
588 | 608 | ||
589 | /* | 609 | /* |
590 | * Destory qp in the rnic... | 610 | * Destory qp in the rnic... |
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c index 623dc95f91df..1687c511cb2f 100644 --- a/drivers/infiniband/hw/amso1100/c2_rnic.c +++ b/drivers/infiniband/hw/amso1100/c2_rnic.c | |||
@@ -441,7 +441,7 @@ static int c2_rnic_close(struct c2_dev *c2dev) | |||
441 | * involves initalizing the various limits and resouce pools that | 441 | * involves initalizing the various limits and resouce pools that |
442 | * comprise the RNIC instance. | 442 | * comprise the RNIC instance. |
443 | */ | 443 | */ |
444 | int c2_rnic_init(struct c2_dev *c2dev) | 444 | int __devinit c2_rnic_init(struct c2_dev *c2dev) |
445 | { | 445 | { |
446 | int err; | 446 | int err; |
447 | u32 qsize, msgsize; | 447 | u32 qsize, msgsize; |
@@ -611,7 +611,7 @@ int c2_rnic_init(struct c2_dev *c2dev) | |||
611 | /* | 611 | /* |
612 | * Called by c2_remove to cleanup the RNIC resources. | 612 | * Called by c2_remove to cleanup the RNIC resources. |
613 | */ | 613 | */ |
614 | void c2_rnic_term(struct c2_dev *c2dev) | 614 | void __devexit c2_rnic_term(struct c2_dev *c2dev) |
615 | { | 615 | { |
616 | 616 | ||
617 | /* Close the open adapter instance */ | 617 | /* Close the open adapter instance */ |
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index 01f5aa9cb56d..3d1c1c535038 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
@@ -52,7 +52,7 @@ | |||
52 | MODULE_LICENSE("Dual BSD/GPL"); | 52 | MODULE_LICENSE("Dual BSD/GPL"); |
53 | MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>"); | 53 | MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>"); |
54 | MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); | 54 | MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); |
55 | MODULE_VERSION("SVNEHCA_0018"); | 55 | MODULE_VERSION("SVNEHCA_0019"); |
56 | 56 | ||
57 | int ehca_open_aqp1 = 0; | 57 | int ehca_open_aqp1 = 0; |
58 | int ehca_debug_level = 0; | 58 | int ehca_debug_level = 0; |
@@ -790,7 +790,7 @@ int __init ehca_module_init(void) | |||
790 | int ret; | 790 | int ret; |
791 | 791 | ||
792 | printk(KERN_INFO "eHCA Infiniband Device Driver " | 792 | printk(KERN_INFO "eHCA Infiniband Device Driver " |
793 | "(Rel.: SVNEHCA_0018)\n"); | 793 | "(Rel.: SVNEHCA_0019)\n"); |
794 | idr_init(&ehca_qp_idr); | 794 | idr_init(&ehca_qp_idr); |
795 | idr_init(&ehca_cq_idr); | 795 | idr_init(&ehca_cq_idr); |
796 | spin_lock_init(&ehca_qp_idr_lock); | 796 | spin_lock_init(&ehca_qp_idr_lock); |
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index cf3e50ee2d06..8682aa50c707 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
@@ -732,8 +732,7 @@ static int prepare_sqe_rts(struct ehca_qp *my_qp, struct ehca_shca *shca, | |||
732 | u64 h_ret; | 732 | u64 h_ret; |
733 | struct ipz_queue *squeue; | 733 | struct ipz_queue *squeue; |
734 | void *bad_send_wqe_p, *bad_send_wqe_v; | 734 | void *bad_send_wqe_p, *bad_send_wqe_v; |
735 | void *squeue_start_p, *squeue_end_p; | 735 | u64 q_ofs; |
736 | void *squeue_start_v, *squeue_end_v; | ||
737 | struct ehca_wqe *wqe; | 736 | struct ehca_wqe *wqe; |
738 | int qp_num = my_qp->ib_qp.qp_num; | 737 | int qp_num = my_qp->ib_qp.qp_num; |
739 | 738 | ||
@@ -755,26 +754,23 @@ static int prepare_sqe_rts(struct ehca_qp *my_qp, struct ehca_shca *shca, | |||
755 | if (ehca_debug_level) | 754 | if (ehca_debug_level) |
756 | ehca_dmp(bad_send_wqe_v, 32, "qp_num=%x bad_wqe", qp_num); | 755 | ehca_dmp(bad_send_wqe_v, 32, "qp_num=%x bad_wqe", qp_num); |
757 | squeue = &my_qp->ipz_squeue; | 756 | squeue = &my_qp->ipz_squeue; |
758 | squeue_start_p = (void*)virt_to_abs(ipz_qeit_calc(squeue, 0L)); | 757 | if (ipz_queue_abs_to_offset(squeue, (u64)bad_send_wqe_p, &q_ofs)) { |
759 | squeue_end_p = squeue_start_p+squeue->queue_length; | 758 | ehca_err(&shca->ib_device, "failed to get wqe offset qp_num=%x" |
760 | squeue_start_v = abs_to_virt((u64)squeue_start_p); | 759 | " bad_send_wqe_p=%p", qp_num, bad_send_wqe_p); |
761 | squeue_end_v = abs_to_virt((u64)squeue_end_p); | 760 | return -EFAULT; |
762 | ehca_dbg(&shca->ib_device, "qp_num=%x squeue_start_v=%p squeue_end_v=%p", | 761 | } |
763 | qp_num, squeue_start_v, squeue_end_v); | ||
764 | 762 | ||
765 | /* loop sets wqe's purge bit */ | 763 | /* loop sets wqe's purge bit */ |
766 | wqe = (struct ehca_wqe*)bad_send_wqe_v; | 764 | wqe = (struct ehca_wqe*)ipz_qeit_calc(squeue, q_ofs); |
767 | *bad_wqe_cnt = 0; | 765 | *bad_wqe_cnt = 0; |
768 | while (wqe->optype != 0xff && wqe->wqef != 0xff) { | 766 | while (wqe->optype != 0xff && wqe->wqef != 0xff) { |
769 | if (ehca_debug_level) | 767 | if (ehca_debug_level) |
770 | ehca_dmp(wqe, 32, "qp_num=%x wqe", qp_num); | 768 | ehca_dmp(wqe, 32, "qp_num=%x wqe", qp_num); |
771 | wqe->nr_of_data_seg = 0; /* suppress data access */ | 769 | wqe->nr_of_data_seg = 0; /* suppress data access */ |
772 | wqe->wqef = WQEF_PURGE; /* WQE to be purged */ | 770 | wqe->wqef = WQEF_PURGE; /* WQE to be purged */ |
773 | wqe = (struct ehca_wqe*)((u8*)wqe+squeue->qe_size); | 771 | q_ofs = ipz_queue_advance_offset(squeue, q_ofs); |
772 | wqe = (struct ehca_wqe*)ipz_qeit_calc(squeue, q_ofs); | ||
774 | *bad_wqe_cnt = (*bad_wqe_cnt)+1; | 773 | *bad_wqe_cnt = (*bad_wqe_cnt)+1; |
775 | if ((void*)wqe >= squeue_end_v) { | ||
776 | wqe = squeue_start_v; | ||
777 | } | ||
778 | } | 774 | } |
779 | /* | 775 | /* |
780 | * bad wqe will be reprocessed and ignored when pol_cq() is called, | 776 | * bad wqe will be reprocessed and ignored when pol_cq() is called, |
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.c b/drivers/infiniband/hw/ehca/ipz_pt_fn.c index e028ff1588cc..bf7a40088f61 100644 --- a/drivers/infiniband/hw/ehca/ipz_pt_fn.c +++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.c | |||
@@ -70,6 +70,19 @@ void *ipz_qeit_eq_get_inc(struct ipz_queue *queue) | |||
70 | return ret; | 70 | return ret; |
71 | } | 71 | } |
72 | 72 | ||
73 | int ipz_queue_abs_to_offset(struct ipz_queue *queue, u64 addr, u64 *q_offset) | ||
74 | { | ||
75 | int i; | ||
76 | for (i = 0; i < queue->queue_length / queue->pagesize; i++) { | ||
77 | u64 page = (u64)virt_to_abs(queue->queue_pages[i]); | ||
78 | if (addr >= page && addr < page + queue->pagesize) { | ||
79 | *q_offset = addr - page + i * queue->pagesize; | ||
80 | return 0; | ||
81 | } | ||
82 | } | ||
83 | return -EINVAL; | ||
84 | } | ||
85 | |||
73 | int ipz_queue_ctor(struct ipz_queue *queue, | 86 | int ipz_queue_ctor(struct ipz_queue *queue, |
74 | const u32 nr_of_pages, | 87 | const u32 nr_of_pages, |
75 | const u32 pagesize, const u32 qe_size, const u32 nr_of_sg) | 88 | const u32 pagesize, const u32 qe_size, const u32 nr_of_sg) |
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.h b/drivers/infiniband/hw/ehca/ipz_pt_fn.h index 2f13509d5257..dc3bda2634b7 100644 --- a/drivers/infiniband/hw/ehca/ipz_pt_fn.h +++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.h | |||
@@ -150,6 +150,21 @@ static inline void *ipz_qeit_reset(struct ipz_queue *queue) | |||
150 | return ipz_qeit_get(queue); | 150 | return ipz_qeit_get(queue); |
151 | } | 151 | } |
152 | 152 | ||
153 | /* | ||
154 | * return the q_offset corresponding to an absolute address | ||
155 | */ | ||
156 | int ipz_queue_abs_to_offset(struct ipz_queue *queue, u64 addr, u64 *q_offset); | ||
157 | |||
158 | /* | ||
159 | * return the next queue offset. don't modify the queue. | ||
160 | */ | ||
161 | static inline u64 ipz_queue_advance_offset(struct ipz_queue *queue, u64 offset) | ||
162 | { | ||
163 | offset += queue->qe_size; | ||
164 | if (offset >= queue->queue_length) offset = 0; | ||
165 | return offset; | ||
166 | } | ||
167 | |||
153 | /* struct generic page table */ | 168 | /* struct generic page table */ |
154 | struct ipz_pt { | 169 | struct ipz_pt { |
155 | u64 entries[EHCA_PT_ENTRIES]; | 170 | u64 entries[EHCA_PT_ENTRIES]; |
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c index a5456108dbad..acdee33ee1f8 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.c +++ b/drivers/infiniband/hw/ipath/ipath_verbs.c | |||
@@ -1487,7 +1487,7 @@ int ipath_register_ib_device(struct ipath_devdata *dd) | |||
1487 | idev->pma_counter_select[1] = IB_PMA_PORT_RCV_DATA; | 1487 | idev->pma_counter_select[1] = IB_PMA_PORT_RCV_DATA; |
1488 | idev->pma_counter_select[2] = IB_PMA_PORT_XMIT_PKTS; | 1488 | idev->pma_counter_select[2] = IB_PMA_PORT_XMIT_PKTS; |
1489 | idev->pma_counter_select[3] = IB_PMA_PORT_RCV_PKTS; | 1489 | idev->pma_counter_select[3] = IB_PMA_PORT_RCV_PKTS; |
1490 | idev->pma_counter_select[5] = IB_PMA_PORT_XMIT_WAIT; | 1490 | idev->pma_counter_select[4] = IB_PMA_PORT_XMIT_WAIT; |
1491 | idev->link_width_enabled = 3; /* 1x or 4x */ | 1491 | idev->link_width_enabled = 3; /* 1x or 4x */ |
1492 | 1492 | ||
1493 | /* Snapshot current HW counters to "clear" them. */ | 1493 | /* Snapshot current HW counters to "clear" them. */ |
diff --git a/drivers/infiniband/hw/mthca/mthca_av.c b/drivers/infiniband/hw/mthca/mthca_av.c index 69599455aca2..57cdc1bc5f50 100644 --- a/drivers/infiniband/hw/mthca/mthca_av.c +++ b/drivers/infiniband/hw/mthca/mthca_av.c | |||
@@ -33,7 +33,6 @@ | |||
33 | * $Id: mthca_av.c 1349 2004-12-16 21:09:43Z roland $ | 33 | * $Id: mthca_av.c 1349 2004-12-16 21:09:43Z roland $ |
34 | */ | 34 | */ |
35 | 35 | ||
36 | #include <linux/init.h> | ||
37 | #include <linux/string.h> | 36 | #include <linux/string.h> |
38 | #include <linux/slab.h> | 37 | #include <linux/slab.h> |
39 | 38 | ||
@@ -323,7 +322,7 @@ int mthca_ah_query(struct ib_ah *ibah, struct ib_ah_attr *attr) | |||
323 | return 0; | 322 | return 0; |
324 | } | 323 | } |
325 | 324 | ||
326 | int __devinit mthca_init_av_table(struct mthca_dev *dev) | 325 | int mthca_init_av_table(struct mthca_dev *dev) |
327 | { | 326 | { |
328 | int err; | 327 | int err; |
329 | 328 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c index 149b36901239..283d50b76c3d 100644 --- a/drivers/infiniband/hw/mthca/mthca_cq.c +++ b/drivers/infiniband/hw/mthca/mthca_cq.c | |||
@@ -36,7 +36,6 @@ | |||
36 | * $Id: mthca_cq.c 1369 2004-12-20 16:17:07Z roland $ | 36 | * $Id: mthca_cq.c 1369 2004-12-20 16:17:07Z roland $ |
37 | */ | 37 | */ |
38 | 38 | ||
39 | #include <linux/init.h> | ||
40 | #include <linux/hardirq.h> | 39 | #include <linux/hardirq.h> |
41 | 40 | ||
42 | #include <asm/io.h> | 41 | #include <asm/io.h> |
@@ -970,7 +969,7 @@ void mthca_free_cq(struct mthca_dev *dev, | |||
970 | mthca_free_mailbox(dev, mailbox); | 969 | mthca_free_mailbox(dev, mailbox); |
971 | } | 970 | } |
972 | 971 | ||
973 | int __devinit mthca_init_cq_table(struct mthca_dev *dev) | 972 | int mthca_init_cq_table(struct mthca_dev *dev) |
974 | { | 973 | { |
975 | int err; | 974 | int err; |
976 | 975 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_eq.c b/drivers/infiniband/hw/mthca/mthca_eq.c index e284e0613a94..8ec9fa1ff9ea 100644 --- a/drivers/infiniband/hw/mthca/mthca_eq.c +++ b/drivers/infiniband/hw/mthca/mthca_eq.c | |||
@@ -33,7 +33,6 @@ | |||
33 | * $Id: mthca_eq.c 1382 2004-12-24 02:21:02Z roland $ | 33 | * $Id: mthca_eq.c 1382 2004-12-24 02:21:02Z roland $ |
34 | */ | 34 | */ |
35 | 35 | ||
36 | #include <linux/init.h> | ||
37 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
38 | #include <linux/interrupt.h> | 37 | #include <linux/interrupt.h> |
39 | #include <linux/pci.h> | 38 | #include <linux/pci.h> |
@@ -479,10 +478,10 @@ static irqreturn_t mthca_arbel_msi_x_interrupt(int irq, void *eq_ptr) | |||
479 | return IRQ_HANDLED; | 478 | return IRQ_HANDLED; |
480 | } | 479 | } |
481 | 480 | ||
482 | static int __devinit mthca_create_eq(struct mthca_dev *dev, | 481 | static int mthca_create_eq(struct mthca_dev *dev, |
483 | int nent, | 482 | int nent, |
484 | u8 intr, | 483 | u8 intr, |
485 | struct mthca_eq *eq) | 484 | struct mthca_eq *eq) |
486 | { | 485 | { |
487 | int npages; | 486 | int npages; |
488 | u64 *dma_list = NULL; | 487 | u64 *dma_list = NULL; |
@@ -664,9 +663,9 @@ static void mthca_free_irqs(struct mthca_dev *dev) | |||
664 | dev->eq_table.eq + i); | 663 | dev->eq_table.eq + i); |
665 | } | 664 | } |
666 | 665 | ||
667 | static int __devinit mthca_map_reg(struct mthca_dev *dev, | 666 | static int mthca_map_reg(struct mthca_dev *dev, |
668 | unsigned long offset, unsigned long size, | 667 | unsigned long offset, unsigned long size, |
669 | void __iomem **map) | 668 | void __iomem **map) |
670 | { | 669 | { |
671 | unsigned long base = pci_resource_start(dev->pdev, 0); | 670 | unsigned long base = pci_resource_start(dev->pdev, 0); |
672 | 671 | ||
@@ -691,7 +690,7 @@ static void mthca_unmap_reg(struct mthca_dev *dev, unsigned long offset, | |||
691 | iounmap(map); | 690 | iounmap(map); |
692 | } | 691 | } |
693 | 692 | ||
694 | static int __devinit mthca_map_eq_regs(struct mthca_dev *dev) | 693 | static int mthca_map_eq_regs(struct mthca_dev *dev) |
695 | { | 694 | { |
696 | if (mthca_is_memfree(dev)) { | 695 | if (mthca_is_memfree(dev)) { |
697 | /* | 696 | /* |
@@ -781,7 +780,7 @@ static void mthca_unmap_eq_regs(struct mthca_dev *dev) | |||
781 | } | 780 | } |
782 | } | 781 | } |
783 | 782 | ||
784 | int __devinit mthca_map_eq_icm(struct mthca_dev *dev, u64 icm_virt) | 783 | int mthca_map_eq_icm(struct mthca_dev *dev, u64 icm_virt) |
785 | { | 784 | { |
786 | int ret; | 785 | int ret; |
787 | u8 status; | 786 | u8 status; |
@@ -825,7 +824,7 @@ void mthca_unmap_eq_icm(struct mthca_dev *dev) | |||
825 | __free_page(dev->eq_table.icm_page); | 824 | __free_page(dev->eq_table.icm_page); |
826 | } | 825 | } |
827 | 826 | ||
828 | int __devinit mthca_init_eq_table(struct mthca_dev *dev) | 827 | int mthca_init_eq_table(struct mthca_dev *dev) |
829 | { | 828 | { |
830 | int err; | 829 | int err; |
831 | u8 status; | 830 | u8 status; |
diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c index 45e106f14807..acfa41d968ee 100644 --- a/drivers/infiniband/hw/mthca/mthca_mad.c +++ b/drivers/infiniband/hw/mthca/mthca_mad.c | |||
@@ -317,7 +317,7 @@ err: | |||
317 | return ret; | 317 | return ret; |
318 | } | 318 | } |
319 | 319 | ||
320 | void __devexit mthca_free_agents(struct mthca_dev *dev) | 320 | void mthca_free_agents(struct mthca_dev *dev) |
321 | { | 321 | { |
322 | struct ib_mad_agent *agent; | 322 | struct ib_mad_agent *agent; |
323 | int p, q; | 323 | int p, q; |
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 47ea02148368..0491ec7a7c0a 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c | |||
@@ -98,7 +98,7 @@ static struct mthca_profile default_profile = { | |||
98 | .uarc_size = 1 << 18, /* Arbel only */ | 98 | .uarc_size = 1 << 18, /* Arbel only */ |
99 | }; | 99 | }; |
100 | 100 | ||
101 | static int __devinit mthca_tune_pci(struct mthca_dev *mdev) | 101 | static int mthca_tune_pci(struct mthca_dev *mdev) |
102 | { | 102 | { |
103 | int cap; | 103 | int cap; |
104 | u16 val; | 104 | u16 val; |
@@ -143,7 +143,7 @@ static int __devinit mthca_tune_pci(struct mthca_dev *mdev) | |||
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | 145 | ||
146 | static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim) | 146 | static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim) |
147 | { | 147 | { |
148 | int err; | 148 | int err; |
149 | u8 status; | 149 | u8 status; |
@@ -255,7 +255,7 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim | |||
255 | return 0; | 255 | return 0; |
256 | } | 256 | } |
257 | 257 | ||
258 | static int __devinit mthca_init_tavor(struct mthca_dev *mdev) | 258 | static int mthca_init_tavor(struct mthca_dev *mdev) |
259 | { | 259 | { |
260 | u8 status; | 260 | u8 status; |
261 | int err; | 261 | int err; |
@@ -333,7 +333,7 @@ err_disable: | |||
333 | return err; | 333 | return err; |
334 | } | 334 | } |
335 | 335 | ||
336 | static int __devinit mthca_load_fw(struct mthca_dev *mdev) | 336 | static int mthca_load_fw(struct mthca_dev *mdev) |
337 | { | 337 | { |
338 | u8 status; | 338 | u8 status; |
339 | int err; | 339 | int err; |
@@ -379,10 +379,10 @@ err_free: | |||
379 | return err; | 379 | return err; |
380 | } | 380 | } |
381 | 381 | ||
382 | static int __devinit mthca_init_icm(struct mthca_dev *mdev, | 382 | static int mthca_init_icm(struct mthca_dev *mdev, |
383 | struct mthca_dev_lim *dev_lim, | 383 | struct mthca_dev_lim *dev_lim, |
384 | struct mthca_init_hca_param *init_hca, | 384 | struct mthca_init_hca_param *init_hca, |
385 | u64 icm_size) | 385 | u64 icm_size) |
386 | { | 386 | { |
387 | u64 aux_pages; | 387 | u64 aux_pages; |
388 | u8 status; | 388 | u8 status; |
@@ -575,7 +575,7 @@ static void mthca_free_icms(struct mthca_dev *mdev) | |||
575 | mthca_free_icm(mdev, mdev->fw.arbel.aux_icm); | 575 | mthca_free_icm(mdev, mdev->fw.arbel.aux_icm); |
576 | } | 576 | } |
577 | 577 | ||
578 | static int __devinit mthca_init_arbel(struct mthca_dev *mdev) | 578 | static int mthca_init_arbel(struct mthca_dev *mdev) |
579 | { | 579 | { |
580 | struct mthca_dev_lim dev_lim; | 580 | struct mthca_dev_lim dev_lim; |
581 | struct mthca_profile profile; | 581 | struct mthca_profile profile; |
@@ -683,7 +683,7 @@ static void mthca_close_hca(struct mthca_dev *mdev) | |||
683 | mthca_SYS_DIS(mdev, &status); | 683 | mthca_SYS_DIS(mdev, &status); |
684 | } | 684 | } |
685 | 685 | ||
686 | static int __devinit mthca_init_hca(struct mthca_dev *mdev) | 686 | static int mthca_init_hca(struct mthca_dev *mdev) |
687 | { | 687 | { |
688 | u8 status; | 688 | u8 status; |
689 | int err; | 689 | int err; |
@@ -720,7 +720,7 @@ err_close: | |||
720 | return err; | 720 | return err; |
721 | } | 721 | } |
722 | 722 | ||
723 | static int __devinit mthca_setup_hca(struct mthca_dev *dev) | 723 | static int mthca_setup_hca(struct mthca_dev *dev) |
724 | { | 724 | { |
725 | int err; | 725 | int err; |
726 | u8 status; | 726 | u8 status; |
@@ -875,8 +875,7 @@ err_uar_table_free: | |||
875 | return err; | 875 | return err; |
876 | } | 876 | } |
877 | 877 | ||
878 | static int __devinit mthca_request_regions(struct pci_dev *pdev, | 878 | static int mthca_request_regions(struct pci_dev *pdev, int ddr_hidden) |
879 | int ddr_hidden) | ||
880 | { | 879 | { |
881 | int err; | 880 | int err; |
882 | 881 | ||
@@ -928,7 +927,7 @@ static void mthca_release_regions(struct pci_dev *pdev, | |||
928 | MTHCA_HCR_SIZE); | 927 | MTHCA_HCR_SIZE); |
929 | } | 928 | } |
930 | 929 | ||
931 | static int __devinit mthca_enable_msi_x(struct mthca_dev *mdev) | 930 | static int mthca_enable_msi_x(struct mthca_dev *mdev) |
932 | { | 931 | { |
933 | struct msix_entry entries[3]; | 932 | struct msix_entry entries[3]; |
934 | int err; | 933 | int err; |
@@ -1213,7 +1212,7 @@ int __mthca_restart_one(struct pci_dev *pdev) | |||
1213 | } | 1212 | } |
1214 | 1213 | ||
1215 | static int __devinit mthca_init_one(struct pci_dev *pdev, | 1214 | static int __devinit mthca_init_one(struct pci_dev *pdev, |
1216 | const struct pci_device_id *id) | 1215 | const struct pci_device_id *id) |
1217 | { | 1216 | { |
1218 | static int mthca_version_printed = 0; | 1217 | static int mthca_version_printed = 0; |
1219 | int ret; | 1218 | int ret; |
diff --git a/drivers/infiniband/hw/mthca/mthca_mcg.c b/drivers/infiniband/hw/mthca/mthca_mcg.c index 47ca8a9b7247..a8ad072be074 100644 --- a/drivers/infiniband/hw/mthca/mthca_mcg.c +++ b/drivers/infiniband/hw/mthca/mthca_mcg.c | |||
@@ -32,7 +32,6 @@ | |||
32 | * $Id: mthca_mcg.c 1349 2004-12-16 21:09:43Z roland $ | 32 | * $Id: mthca_mcg.c 1349 2004-12-16 21:09:43Z roland $ |
33 | */ | 33 | */ |
34 | 34 | ||
35 | #include <linux/init.h> | ||
36 | #include <linux/string.h> | 35 | #include <linux/string.h> |
37 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
38 | 37 | ||
@@ -371,7 +370,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
371 | return err; | 370 | return err; |
372 | } | 371 | } |
373 | 372 | ||
374 | int __devinit mthca_init_mcg_table(struct mthca_dev *dev) | 373 | int mthca_init_mcg_table(struct mthca_dev *dev) |
375 | { | 374 | { |
376 | int err; | 375 | int err; |
377 | int table_size = dev->limits.num_mgms + dev->limits.num_amgms; | 376 | int table_size = dev->limits.num_mgms + dev->limits.num_amgms; |
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c index a486dec1707e..f71ffa88db3a 100644 --- a/drivers/infiniband/hw/mthca/mthca_mr.c +++ b/drivers/infiniband/hw/mthca/mthca_mr.c | |||
@@ -34,7 +34,6 @@ | |||
34 | */ | 34 | */ |
35 | 35 | ||
36 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
37 | #include <linux/init.h> | ||
38 | #include <linux/errno.h> | 37 | #include <linux/errno.h> |
39 | 38 | ||
40 | #include "mthca_dev.h" | 39 | #include "mthca_dev.h" |
@@ -135,7 +134,7 @@ static void mthca_buddy_free(struct mthca_buddy *buddy, u32 seg, int order) | |||
135 | spin_unlock(&buddy->lock); | 134 | spin_unlock(&buddy->lock); |
136 | } | 135 | } |
137 | 136 | ||
138 | static int __devinit mthca_buddy_init(struct mthca_buddy *buddy, int max_order) | 137 | static int mthca_buddy_init(struct mthca_buddy *buddy, int max_order) |
139 | { | 138 | { |
140 | int i, s; | 139 | int i, s; |
141 | 140 | ||
@@ -759,7 +758,7 @@ void mthca_arbel_fmr_unmap(struct mthca_dev *dev, struct mthca_fmr *fmr) | |||
759 | *(u8 *) fmr->mem.arbel.mpt = MTHCA_MPT_STATUS_SW; | 758 | *(u8 *) fmr->mem.arbel.mpt = MTHCA_MPT_STATUS_SW; |
760 | } | 759 | } |
761 | 760 | ||
762 | int __devinit mthca_init_mr_table(struct mthca_dev *dev) | 761 | int mthca_init_mr_table(struct mthca_dev *dev) |
763 | { | 762 | { |
764 | unsigned long addr; | 763 | unsigned long addr; |
765 | int err, i; | 764 | int err, i; |
diff --git a/drivers/infiniband/hw/mthca/mthca_pd.c b/drivers/infiniband/hw/mthca/mthca_pd.c index 59df51614c85..c1e950764bd8 100644 --- a/drivers/infiniband/hw/mthca/mthca_pd.c +++ b/drivers/infiniband/hw/mthca/mthca_pd.c | |||
@@ -34,7 +34,6 @@ | |||
34 | * $Id: mthca_pd.c 1349 2004-12-16 21:09:43Z roland $ | 34 | * $Id: mthca_pd.c 1349 2004-12-16 21:09:43Z roland $ |
35 | */ | 35 | */ |
36 | 36 | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/errno.h> | 37 | #include <linux/errno.h> |
39 | 38 | ||
40 | #include "mthca_dev.h" | 39 | #include "mthca_dev.h" |
@@ -69,7 +68,7 @@ void mthca_pd_free(struct mthca_dev *dev, struct mthca_pd *pd) | |||
69 | mthca_free(&dev->pd_table.alloc, pd->pd_num); | 68 | mthca_free(&dev->pd_table.alloc, pd->pd_num); |
70 | } | 69 | } |
71 | 70 | ||
72 | int __devinit mthca_init_pd_table(struct mthca_dev *dev) | 71 | int mthca_init_pd_table(struct mthca_dev *dev) |
73 | { | 72 | { |
74 | return mthca_alloc_init(&dev->pd_table.alloc, | 73 | return mthca_alloc_init(&dev->pd_table.alloc, |
75 | dev->limits.num_pds, | 74 | dev->limits.num_pds, |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index fc67f780581b..21422a3336ad 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c | |||
@@ -1100,11 +1100,10 @@ static struct ib_fmr *mthca_alloc_fmr(struct ib_pd *pd, int mr_access_flags, | |||
1100 | struct mthca_fmr *fmr; | 1100 | struct mthca_fmr *fmr; |
1101 | int err; | 1101 | int err; |
1102 | 1102 | ||
1103 | fmr = kmalloc(sizeof *fmr, GFP_KERNEL); | 1103 | fmr = kmemdup(fmr_attr, sizeof *fmr, GFP_KERNEL); |
1104 | if (!fmr) | 1104 | if (!fmr) |
1105 | return ERR_PTR(-ENOMEM); | 1105 | return ERR_PTR(-ENOMEM); |
1106 | 1106 | ||
1107 | memcpy(&fmr->attr, fmr_attr, sizeof *fmr_attr); | ||
1108 | err = mthca_fmr_alloc(to_mdev(pd->device), to_mpd(pd)->pd_num, | 1107 | err = mthca_fmr_alloc(to_mdev(pd->device), to_mpd(pd)->pd_num, |
1109 | convert_access(mr_access_flags), fmr); | 1108 | convert_access(mr_access_flags), fmr); |
1110 | 1109 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 6a7822e0fc19..33e3ba7937f1 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -35,7 +35,6 @@ | |||
35 | * $Id: mthca_qp.c 1355 2004-12-17 15:23:43Z roland $ | 35 | * $Id: mthca_qp.c 1355 2004-12-17 15:23:43Z roland $ |
36 | */ | 36 | */ |
37 | 37 | ||
38 | #include <linux/init.h> | ||
39 | #include <linux/string.h> | 38 | #include <linux/string.h> |
40 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
41 | 40 | ||
@@ -2241,7 +2240,7 @@ void mthca_free_err_wqe(struct mthca_dev *dev, struct mthca_qp *qp, int is_send, | |||
2241 | *new_wqe = 0; | 2240 | *new_wqe = 0; |
2242 | } | 2241 | } |
2243 | 2242 | ||
2244 | int __devinit mthca_init_qp_table(struct mthca_dev *dev) | 2243 | int mthca_init_qp_table(struct mthca_dev *dev) |
2245 | { | 2244 | { |
2246 | int err; | 2245 | int err; |
2247 | u8 status; | 2246 | u8 status; |
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c index f5d7677d1079..34d2c4768962 100644 --- a/drivers/infiniband/hw/mthca/mthca_srq.c +++ b/drivers/infiniband/hw/mthca/mthca_srq.c | |||
@@ -120,7 +120,7 @@ static void mthca_arbel_init_srq_context(struct mthca_dev *dev, | |||
120 | 120 | ||
121 | memset(context, 0, sizeof *context); | 121 | memset(context, 0, sizeof *context); |
122 | 122 | ||
123 | logsize = long_log2(srq->max) + srq->wqe_shift; | 123 | logsize = long_log2(srq->max); |
124 | context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn); | 124 | context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn); |
125 | context->lkey = cpu_to_be32(srq->mr.ibmr.lkey); | 125 | context->lkey = cpu_to_be32(srq->mr.ibmr.lkey); |
126 | context->db_index = cpu_to_be32(srq->db_index); | 126 | context->db_index = cpu_to_be32(srq->db_index); |
@@ -715,7 +715,7 @@ int mthca_max_srq_sge(struct mthca_dev *dev) | |||
715 | sizeof (struct mthca_data_seg)); | 715 | sizeof (struct mthca_data_seg)); |
716 | } | 716 | } |
717 | 717 | ||
718 | int __devinit mthca_init_srq_table(struct mthca_dev *dev) | 718 | int mthca_init_srq_table(struct mthca_dev *dev) |
719 | { | 719 | { |
720 | int err; | 720 | int err; |
721 | 721 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 0b8a79d53a00..f2b61851a49c 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -233,7 +233,7 @@ static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh) | |||
233 | } | 233 | } |
234 | 234 | ||
235 | struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh); | 235 | struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh); |
236 | void ipoib_neigh_free(struct ipoib_neigh *neigh); | 236 | void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh); |
237 | 237 | ||
238 | extern struct workqueue_struct *ipoib_workqueue; | 238 | extern struct workqueue_struct *ipoib_workqueue; |
239 | 239 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 85522daeb946..5ba3154320b4 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -264,7 +264,7 @@ static void path_free(struct net_device *dev, struct ipoib_path *path) | |||
264 | if (neigh->ah) | 264 | if (neigh->ah) |
265 | ipoib_put_ah(neigh->ah); | 265 | ipoib_put_ah(neigh->ah); |
266 | 266 | ||
267 | ipoib_neigh_free(neigh); | 267 | ipoib_neigh_free(dev, neigh); |
268 | } | 268 | } |
269 | 269 | ||
270 | spin_unlock_irqrestore(&priv->lock, flags); | 270 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -525,10 +525,11 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
525 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); | 525 | ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha)); |
526 | } else { | 526 | } else { |
527 | neigh->ah = NULL; | 527 | neigh->ah = NULL; |
528 | __skb_queue_tail(&neigh->queue, skb); | ||
529 | 528 | ||
530 | if (!path->query && path_rec_start(dev, path)) | 529 | if (!path->query && path_rec_start(dev, path)) |
531 | goto err_list; | 530 | goto err_list; |
531 | |||
532 | __skb_queue_tail(&neigh->queue, skb); | ||
532 | } | 533 | } |
533 | 534 | ||
534 | spin_unlock(&priv->lock); | 535 | spin_unlock(&priv->lock); |
@@ -538,7 +539,7 @@ err_list: | |||
538 | list_del(&neigh->list); | 539 | list_del(&neigh->list); |
539 | 540 | ||
540 | err_path: | 541 | err_path: |
541 | ipoib_neigh_free(neigh); | 542 | ipoib_neigh_free(dev, neigh); |
542 | ++priv->stats.tx_dropped; | 543 | ++priv->stats.tx_dropped; |
543 | dev_kfree_skb_any(skb); | 544 | dev_kfree_skb_any(skb); |
544 | 545 | ||
@@ -655,7 +656,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
655 | */ | 656 | */ |
656 | ipoib_put_ah(neigh->ah); | 657 | ipoib_put_ah(neigh->ah); |
657 | list_del(&neigh->list); | 658 | list_del(&neigh->list); |
658 | ipoib_neigh_free(neigh); | 659 | ipoib_neigh_free(dev, neigh); |
659 | spin_unlock(&priv->lock); | 660 | spin_unlock(&priv->lock); |
660 | ipoib_path_lookup(skb, dev); | 661 | ipoib_path_lookup(skb, dev); |
661 | goto out; | 662 | goto out; |
@@ -786,7 +787,7 @@ static void ipoib_neigh_destructor(struct neighbour *n) | |||
786 | if (neigh->ah) | 787 | if (neigh->ah) |
787 | ah = neigh->ah; | 788 | ah = neigh->ah; |
788 | list_del(&neigh->list); | 789 | list_del(&neigh->list); |
789 | ipoib_neigh_free(neigh); | 790 | ipoib_neigh_free(n->dev, neigh); |
790 | } | 791 | } |
791 | 792 | ||
792 | spin_unlock_irqrestore(&priv->lock, flags); | 793 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -809,9 +810,15 @@ struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour) | |||
809 | return neigh; | 810 | return neigh; |
810 | } | 811 | } |
811 | 812 | ||
812 | void ipoib_neigh_free(struct ipoib_neigh *neigh) | 813 | void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh) |
813 | { | 814 | { |
815 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
816 | struct sk_buff *skb; | ||
814 | *to_ipoib_neigh(neigh->neighbour) = NULL; | 817 | *to_ipoib_neigh(neigh->neighbour) = NULL; |
818 | while ((skb = __skb_dequeue(&neigh->queue))) { | ||
819 | ++priv->stats.tx_dropped; | ||
820 | dev_kfree_skb_any(skb); | ||
821 | } | ||
815 | kfree(neigh); | 822 | kfree(neigh); |
816 | } | 823 | } |
817 | 824 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 3faa1820f0e9..d282d65e3ee0 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -114,7 +114,7 @@ static void ipoib_mcast_free(struct ipoib_mcast *mcast) | |||
114 | */ | 114 | */ |
115 | if (neigh->ah) | 115 | if (neigh->ah) |
116 | ipoib_put_ah(neigh->ah); | 116 | ipoib_put_ah(neigh->ah); |
117 | ipoib_neigh_free(neigh); | 117 | ipoib_neigh_free(dev, neigh); |
118 | } | 118 | } |
119 | 119 | ||
120 | spin_unlock_irqrestore(&priv->lock, flags); | 120 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 9c53916f28c2..234e5b061a75 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
@@ -283,7 +283,7 @@ struct iser_global { | |||
283 | struct mutex connlist_mutex; | 283 | struct mutex connlist_mutex; |
284 | struct list_head connlist; /* all iSER IB connections */ | 284 | struct list_head connlist; /* all iSER IB connections */ |
285 | 285 | ||
286 | kmem_cache_t *desc_cache; | 286 | struct kmem_cache *desc_cache; |
287 | }; | 287 | }; |
288 | 288 | ||
289 | extern struct iser_global ig; | 289 | extern struct iser_global ig; |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 4b09147f438f..64ab5fc7cca3 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -1176,9 +1176,11 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) | |||
1176 | break; | 1176 | break; |
1177 | } | 1177 | } |
1178 | 1178 | ||
1179 | target->status = srp_alloc_iu_bufs(target); | 1179 | if (!target->rx_ring[0]) { |
1180 | if (target->status) | 1180 | target->status = srp_alloc_iu_bufs(target); |
1181 | break; | 1181 | if (target->status) |
1182 | break; | ||
1183 | } | ||
1182 | 1184 | ||
1183 | qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL); | 1185 | qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL); |
1184 | if (!qp_attr) { | 1186 | if (!qp_attr) { |
@@ -1716,7 +1718,8 @@ static ssize_t srp_create_target(struct class_device *class_dev, | |||
1716 | if (!target_host) | 1718 | if (!target_host) |
1717 | return -ENOMEM; | 1719 | return -ENOMEM; |
1718 | 1720 | ||
1719 | target_host->max_lun = SRP_MAX_LUN; | 1721 | target_host->max_lun = SRP_MAX_LUN; |
1722 | target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb; | ||
1720 | 1723 | ||
1721 | target = host_to_target(target_host); | 1724 | target = host_to_target(target_host); |
1722 | 1725 | ||
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c index 105112fb7b57..80cdebcbcb99 100644 --- a/drivers/input/joystick/iforce/iforce-usb.c +++ b/drivers/input/joystick/iforce/iforce-usb.c | |||
@@ -178,9 +178,9 @@ static int iforce_usb_probe(struct usb_interface *intf, | |||
178 | 178 | ||
179 | fail: | 179 | fail: |
180 | if (iforce) { | 180 | if (iforce) { |
181 | if (iforce->irq) usb_free_urb(iforce->irq); | 181 | usb_free_urb(iforce->irq); |
182 | if (iforce->out) usb_free_urb(iforce->out); | 182 | usb_free_urb(iforce->out); |
183 | if (iforce->ctrl) usb_free_urb(iforce->ctrl); | 183 | usb_free_urb(iforce->ctrl); |
184 | kfree(iforce); | 184 | kfree(iforce); |
185 | } | 185 | } |
186 | 186 | ||
diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c index ba2a2035d648..7c8d0399ae82 100644 --- a/drivers/input/serio/serio_raw.c +++ b/drivers/input/serio/serio_raw.c | |||
@@ -297,7 +297,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) | |||
297 | 297 | ||
298 | serio_raw->dev.minor = PSMOUSE_MINOR; | 298 | serio_raw->dev.minor = PSMOUSE_MINOR; |
299 | serio_raw->dev.name = serio_raw->name; | 299 | serio_raw->dev.name = serio_raw->name; |
300 | serio_raw->dev.dev = &serio->dev; | 300 | serio_raw->dev.parent = &serio->dev; |
301 | serio_raw->dev.fops = &serio_raw_fops; | 301 | serio_raw->dev.fops = &serio_raw_fops; |
302 | 302 | ||
303 | err = misc_register(&serio_raw->dev); | 303 | err = misc_register(&serio_raw->dev); |
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index 5800beeebb85..defd5743dba6 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
@@ -702,7 +702,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, | |||
702 | cs->open_count = 0; | 702 | cs->open_count = 0; |
703 | cs->dev = NULL; | 703 | cs->dev = NULL; |
704 | cs->tty = NULL; | 704 | cs->tty = NULL; |
705 | cs->class = NULL; | 705 | cs->tty_dev = NULL; |
706 | cs->cidmode = cidmode != 0; | 706 | cs->cidmode = cidmode != 0; |
707 | 707 | ||
708 | //if(onechannel) { //FIXME | 708 | //if(onechannel) { //FIXME |
diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h index 884bd72c1bf4..06298cc52bf5 100644 --- a/drivers/isdn/gigaset/gigaset.h +++ b/drivers/isdn/gigaset/gigaset.h | |||
@@ -444,7 +444,7 @@ struct cardstate { | |||
444 | struct gigaset_driver *driver; | 444 | struct gigaset_driver *driver; |
445 | unsigned minor_index; | 445 | unsigned minor_index; |
446 | struct device *dev; | 446 | struct device *dev; |
447 | struct class_device *class; | 447 | struct device *tty_dev; |
448 | 448 | ||
449 | const struct gigaset_ops *ops; | 449 | const struct gigaset_ops *ops; |
450 | 450 | ||
diff --git a/drivers/isdn/gigaset/interface.c b/drivers/isdn/gigaset/interface.c index 596f3aebe2f7..7edea015867e 100644 --- a/drivers/isdn/gigaset/interface.c +++ b/drivers/isdn/gigaset/interface.c | |||
@@ -625,13 +625,13 @@ void gigaset_if_init(struct cardstate *cs) | |||
625 | return; | 625 | return; |
626 | 626 | ||
627 | tasklet_init(&cs->if_wake_tasklet, &if_wake, (unsigned long) cs); | 627 | tasklet_init(&cs->if_wake_tasklet, &if_wake, (unsigned long) cs); |
628 | cs->class = tty_register_device(drv->tty, cs->minor_index, NULL); | 628 | cs->tty_dev = tty_register_device(drv->tty, cs->minor_index, NULL); |
629 | 629 | ||
630 | if (!IS_ERR(cs->class)) | 630 | if (!IS_ERR(cs->tty_dev)) |
631 | class_set_devdata(cs->class, cs); | 631 | dev_set_drvdata(cs->tty_dev, cs); |
632 | else { | 632 | else { |
633 | warn("could not register device to the tty subsystem"); | 633 | warn("could not register device to the tty subsystem"); |
634 | cs->class = NULL; | 634 | cs->tty_dev = NULL; |
635 | } | 635 | } |
636 | } | 636 | } |
637 | 637 | ||
@@ -645,7 +645,7 @@ void gigaset_if_free(struct cardstate *cs) | |||
645 | 645 | ||
646 | tasklet_disable(&cs->if_wake_tasklet); | 646 | tasklet_disable(&cs->if_wake_tasklet); |
647 | tasklet_kill(&cs->if_wake_tasklet); | 647 | tasklet_kill(&cs->if_wake_tasklet); |
648 | cs->class = NULL; | 648 | cs->tty_dev = NULL; |
649 | tty_unregister_device(drv->tty, cs->minor_index); | 649 | tty_unregister_device(drv->tty, cs->minor_index); |
650 | } | 650 | } |
651 | 651 | ||
diff --git a/drivers/isdn/gigaset/proc.c b/drivers/isdn/gigaset/proc.c index 9ad840e95dbe..e767afa55abf 100644 --- a/drivers/isdn/gigaset/proc.c +++ b/drivers/isdn/gigaset/proc.c | |||
@@ -16,11 +16,12 @@ | |||
16 | #include "gigaset.h" | 16 | #include "gigaset.h" |
17 | #include <linux/ctype.h> | 17 | #include <linux/ctype.h> |
18 | 18 | ||
19 | static ssize_t show_cidmode(struct class_device *class, char *buf) | 19 | static ssize_t show_cidmode(struct device *dev, |
20 | struct device_attribute *attr, char *buf) | ||
20 | { | 21 | { |
21 | int ret; | 22 | int ret; |
22 | unsigned long flags; | 23 | unsigned long flags; |
23 | struct cardstate *cs = class_get_devdata(class); | 24 | struct cardstate *cs = dev_get_drvdata(dev); |
24 | 25 | ||
25 | spin_lock_irqsave(&cs->lock, flags); | 26 | spin_lock_irqsave(&cs->lock, flags); |
26 | ret = sprintf(buf, "%u\n", cs->cidmode); | 27 | ret = sprintf(buf, "%u\n", cs->cidmode); |
@@ -29,10 +30,10 @@ static ssize_t show_cidmode(struct class_device *class, char *buf) | |||
29 | return ret; | 30 | return ret; |
30 | } | 31 | } |
31 | 32 | ||
32 | static ssize_t set_cidmode(struct class_device *class, | 33 | static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, |
33 | const char *buf, size_t count) | 34 | const char *buf, size_t count) |
34 | { | 35 | { |
35 | struct cardstate *cs = class_get_devdata(class); | 36 | struct cardstate *cs = dev_get_drvdata(dev); |
36 | long int value; | 37 | long int value; |
37 | char *end; | 38 | char *end; |
38 | 39 | ||
@@ -64,25 +65,25 @@ static ssize_t set_cidmode(struct class_device *class, | |||
64 | return count; | 65 | return count; |
65 | } | 66 | } |
66 | 67 | ||
67 | static CLASS_DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode); | 68 | static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode); |
68 | 69 | ||
69 | /* free sysfs for device */ | 70 | /* free sysfs for device */ |
70 | void gigaset_free_dev_sysfs(struct cardstate *cs) | 71 | void gigaset_free_dev_sysfs(struct cardstate *cs) |
71 | { | 72 | { |
72 | if (!cs->class) | 73 | if (!cs->tty_dev) |
73 | return; | 74 | return; |
74 | 75 | ||
75 | gig_dbg(DEBUG_INIT, "removing sysfs entries"); | 76 | gig_dbg(DEBUG_INIT, "removing sysfs entries"); |
76 | class_device_remove_file(cs->class, &class_device_attr_cidmode); | 77 | device_remove_file(cs->tty_dev, &dev_attr_cidmode); |
77 | } | 78 | } |
78 | 79 | ||
79 | /* initialize sysfs for device */ | 80 | /* initialize sysfs for device */ |
80 | void gigaset_init_dev_sysfs(struct cardstate *cs) | 81 | void gigaset_init_dev_sysfs(struct cardstate *cs) |
81 | { | 82 | { |
82 | if (!cs->class) | 83 | if (!cs->tty_dev) |
83 | return; | 84 | return; |
84 | 85 | ||
85 | gig_dbg(DEBUG_INIT, "setting up sysfs"); | 86 | gig_dbg(DEBUG_INIT, "setting up sysfs"); |
86 | if (class_device_create_file(cs->class, &class_device_attr_cidmode)) | 87 | if (device_create_file(cs->tty_dev, &dev_attr_cidmode)) |
87 | dev_err(cs->dev, "could not create sysfs attribute\n"); | 88 | dev_err(cs->dev, "could not create sysfs attribute\n"); |
88 | } | 89 | } |
diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c index 4ffa9eb1c28e..5ebf49ac9b23 100644 --- a/drivers/isdn/gigaset/usb-gigaset.c +++ b/drivers/isdn/gigaset/usb-gigaset.c | |||
@@ -815,14 +815,11 @@ static int gigaset_probe(struct usb_interface *interface, | |||
815 | return 0; | 815 | return 0; |
816 | 816 | ||
817 | error: | 817 | error: |
818 | if (ucs->read_urb) | 818 | usb_kill_urb(ucs->read_urb); |
819 | usb_kill_urb(ucs->read_urb); | ||
820 | kfree(ucs->bulk_out_buffer); | 819 | kfree(ucs->bulk_out_buffer); |
821 | if (ucs->bulk_out_urb != NULL) | 820 | usb_free_urb(ucs->bulk_out_urb); |
822 | usb_free_urb(ucs->bulk_out_urb); | ||
823 | kfree(cs->inbuf[0].rcvbuf); | 821 | kfree(cs->inbuf[0].rcvbuf); |
824 | if (ucs->read_urb != NULL) | 822 | usb_free_urb(ucs->read_urb); |
825 | usb_free_urb(ucs->read_urb); | ||
826 | usb_set_intfdata(interface, NULL); | 823 | usb_set_intfdata(interface, NULL); |
827 | ucs->read_urb = ucs->bulk_out_urb = NULL; | 824 | ucs->read_urb = ucs->bulk_out_urb = NULL; |
828 | cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; | 825 | cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; |
@@ -850,11 +847,9 @@ static void gigaset_disconnect(struct usb_interface *interface) | |||
850 | usb_kill_urb(ucs->bulk_out_urb); /* FIXME: only if active? */ | 847 | usb_kill_urb(ucs->bulk_out_urb); /* FIXME: only if active? */ |
851 | 848 | ||
852 | kfree(ucs->bulk_out_buffer); | 849 | kfree(ucs->bulk_out_buffer); |
853 | if (ucs->bulk_out_urb != NULL) | 850 | usb_free_urb(ucs->bulk_out_urb); |
854 | usb_free_urb(ucs->bulk_out_urb); | ||
855 | kfree(cs->inbuf[0].rcvbuf); | 851 | kfree(cs->inbuf[0].rcvbuf); |
856 | if (ucs->read_urb != NULL) | 852 | usb_free_urb(ucs->read_urb); |
857 | usb_free_urb(ucs->read_urb); | ||
858 | ucs->read_urb = ucs->bulk_out_urb = NULL; | 853 | ucs->read_urb = ucs->bulk_out_urb = NULL; |
859 | cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; | 854 | cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; |
860 | 855 | ||
diff --git a/drivers/isdn/hardware/eicon/os_4bri.c b/drivers/isdn/hardware/eicon/os_4bri.c index 11e6f937c1e4..7b4ec3f60dbf 100644 --- a/drivers/isdn/hardware/eicon/os_4bri.c +++ b/drivers/isdn/hardware/eicon/os_4bri.c | |||
@@ -464,7 +464,7 @@ int diva_4bri_init_card(diva_os_xdi_adapter_t * a) | |||
464 | 464 | ||
465 | /* | 465 | /* |
466 | ** Cleanup function will be called for master adapter only | 466 | ** Cleanup function will be called for master adapter only |
467 | ** this is garanteed by design: cleanup callback is set | 467 | ** this is guaranteed by design: cleanup callback is set |
468 | ** by master adapter only | 468 | ** by master adapter only |
469 | */ | 469 | */ |
470 | static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t * a) | 470 | static int diva_4bri_cleanup_adapter(diva_os_xdi_adapter_t * a) |
diff --git a/drivers/isdn/hisax/hfc4s8s_l1.h b/drivers/isdn/hisax/hfc4s8s_l1.h index e8f9c077fa85..9d5d2a56b4e9 100644 --- a/drivers/isdn/hisax/hfc4s8s_l1.h +++ b/drivers/isdn/hisax/hfc4s8s_l1.h | |||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | /* | 17 | /* |
18 | * include Genero generated HFC-4S/8S header file hfc48scu.h | 18 | * include Genero generated HFC-4S/8S header file hfc48scu.h |
19 | * for comlete register description. This will define _HFC48SCU_H_ | 19 | * for complete register description. This will define _HFC48SCU_H_ |
20 | * to prevent redefinitions | 20 | * to prevent redefinitions |
21 | */ | 21 | */ |
22 | 22 | ||
diff --git a/drivers/isdn/hisax/isdnl2.c b/drivers/isdn/hisax/isdnl2.c index 6d0431725555..cd3b5ad53491 100644 --- a/drivers/isdn/hisax/isdnl2.c +++ b/drivers/isdn/hisax/isdnl2.c | |||
@@ -1442,7 +1442,7 @@ l2_tei_remove(struct FsmInst *fi, int event, void *arg) | |||
1442 | } | 1442 | } |
1443 | 1443 | ||
1444 | static void | 1444 | static void |
1445 | l2_st14_persistant_da(struct FsmInst *fi, int event, void *arg) | 1445 | l2_st14_persistent_da(struct FsmInst *fi, int event, void *arg) |
1446 | { | 1446 | { |
1447 | struct PStack *st = fi->userdata; | 1447 | struct PStack *st = fi->userdata; |
1448 | 1448 | ||
@@ -1453,7 +1453,7 @@ l2_st14_persistant_da(struct FsmInst *fi, int event, void *arg) | |||
1453 | } | 1453 | } |
1454 | 1454 | ||
1455 | static void | 1455 | static void |
1456 | l2_st5_persistant_da(struct FsmInst *fi, int event, void *arg) | 1456 | l2_st5_persistent_da(struct FsmInst *fi, int event, void *arg) |
1457 | { | 1457 | { |
1458 | struct PStack *st = fi->userdata; | 1458 | struct PStack *st = fi->userdata; |
1459 | 1459 | ||
@@ -1466,7 +1466,7 @@ l2_st5_persistant_da(struct FsmInst *fi, int event, void *arg) | |||
1466 | } | 1466 | } |
1467 | 1467 | ||
1468 | static void | 1468 | static void |
1469 | l2_st6_persistant_da(struct FsmInst *fi, int event, void *arg) | 1469 | l2_st6_persistent_da(struct FsmInst *fi, int event, void *arg) |
1470 | { | 1470 | { |
1471 | struct PStack *st = fi->userdata; | 1471 | struct PStack *st = fi->userdata; |
1472 | 1472 | ||
@@ -1477,7 +1477,7 @@ l2_st6_persistant_da(struct FsmInst *fi, int event, void *arg) | |||
1477 | } | 1477 | } |
1478 | 1478 | ||
1479 | static void | 1479 | static void |
1480 | l2_persistant_da(struct FsmInst *fi, int event, void *arg) | 1480 | l2_persistent_da(struct FsmInst *fi, int event, void *arg) |
1481 | { | 1481 | { |
1482 | struct PStack *st = fi->userdata; | 1482 | struct PStack *st = fi->userdata; |
1483 | 1483 | ||
@@ -1612,14 +1612,14 @@ static struct FsmNode L2FnList[] __initdata = | |||
1612 | {ST_L2_6, EV_L2_FRAME_ERROR, l2_frame_error}, | 1612 | {ST_L2_6, EV_L2_FRAME_ERROR, l2_frame_error}, |
1613 | {ST_L2_7, EV_L2_FRAME_ERROR, l2_frame_error_reest}, | 1613 | {ST_L2_7, EV_L2_FRAME_ERROR, l2_frame_error_reest}, |
1614 | {ST_L2_8, EV_L2_FRAME_ERROR, l2_frame_error_reest}, | 1614 | {ST_L2_8, EV_L2_FRAME_ERROR, l2_frame_error_reest}, |
1615 | {ST_L2_1, EV_L1_DEACTIVATE, l2_st14_persistant_da}, | 1615 | {ST_L2_1, EV_L1_DEACTIVATE, l2_st14_persistent_da}, |
1616 | {ST_L2_2, EV_L1_DEACTIVATE, l2_st24_tei_remove}, | 1616 | {ST_L2_2, EV_L1_DEACTIVATE, l2_st24_tei_remove}, |
1617 | {ST_L2_3, EV_L1_DEACTIVATE, l2_st3_tei_remove}, | 1617 | {ST_L2_3, EV_L1_DEACTIVATE, l2_st3_tei_remove}, |
1618 | {ST_L2_4, EV_L1_DEACTIVATE, l2_st14_persistant_da}, | 1618 | {ST_L2_4, EV_L1_DEACTIVATE, l2_st14_persistent_da}, |
1619 | {ST_L2_5, EV_L1_DEACTIVATE, l2_st5_persistant_da}, | 1619 | {ST_L2_5, EV_L1_DEACTIVATE, l2_st5_persistent_da}, |
1620 | {ST_L2_6, EV_L1_DEACTIVATE, l2_st6_persistant_da}, | 1620 | {ST_L2_6, EV_L1_DEACTIVATE, l2_st6_persistent_da}, |
1621 | {ST_L2_7, EV_L1_DEACTIVATE, l2_persistant_da}, | 1621 | {ST_L2_7, EV_L1_DEACTIVATE, l2_persistent_da}, |
1622 | {ST_L2_8, EV_L1_DEACTIVATE, l2_persistant_da}, | 1622 | {ST_L2_8, EV_L1_DEACTIVATE, l2_persistent_da}, |
1623 | }; | 1623 | }; |
1624 | 1624 | ||
1625 | #define L2_FN_COUNT (sizeof(L2FnList)/sizeof(struct FsmNode)) | 1625 | #define L2_FN_COUNT (sizeof(L2FnList)/sizeof(struct FsmNode)) |
diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c index ff7d4f56ced3..55bc891768c2 100644 --- a/drivers/media/dvb/cinergyT2/cinergyT2.c +++ b/drivers/media/dvb/cinergyT2/cinergyT2.c | |||
@@ -275,8 +275,7 @@ static void cinergyt2_free_stream_urbs (struct cinergyt2 *cinergyt2) | |||
275 | int i; | 275 | int i; |
276 | 276 | ||
277 | for (i=0; i<STREAM_URB_COUNT; i++) | 277 | for (i=0; i<STREAM_URB_COUNT; i++) |
278 | if (cinergyt2->stream_urb[i]) | 278 | usb_free_urb(cinergyt2->stream_urb[i]); |
279 | usb_free_urb(cinergyt2->stream_urb[i]); | ||
280 | 279 | ||
281 | usb_buffer_free(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE, | 280 | usb_buffer_free(cinergyt2->udev, STREAM_URB_COUNT*STREAM_BUF_SIZE, |
282 | cinergyt2->streambuf, cinergyt2->streambuf_dmahandle); | 281 | cinergyt2->streambuf, cinergyt2->streambuf_dmahandle); |
@@ -320,8 +319,7 @@ static void cinergyt2_stop_stream_xfer (struct cinergyt2 *cinergyt2) | |||
320 | cinergyt2_control_stream_transfer(cinergyt2, 0); | 319 | cinergyt2_control_stream_transfer(cinergyt2, 0); |
321 | 320 | ||
322 | for (i=0; i<STREAM_URB_COUNT; i++) | 321 | for (i=0; i<STREAM_URB_COUNT; i++) |
323 | if (cinergyt2->stream_urb[i]) | 322 | usb_kill_urb(cinergyt2->stream_urb[i]); |
324 | usb_kill_urb(cinergyt2->stream_urb[i]); | ||
325 | } | 323 | } |
326 | 324 | ||
327 | static int cinergyt2_start_stream_xfer (struct cinergyt2 *cinergyt2) | 325 | static int cinergyt2_start_stream_xfer (struct cinergyt2 *cinergyt2) |
diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c index fc1267b8c892..9a155396d6ac 100644 --- a/drivers/media/dvb/ttpci/budget-patch.c +++ b/drivers/media/dvb/ttpci/budget-patch.c | |||
@@ -500,14 +500,14 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte | |||
500 | 500 | ||
501 | /* New design (By Emard) | 501 | /* New design (By Emard) |
502 | ** this rps1 code will copy internal HS event to GPIO3 pin. | 502 | ** this rps1 code will copy internal HS event to GPIO3 pin. |
503 | ** GPIO3 is in budget-patch hardware connectd to port B VSYNC | 503 | ** GPIO3 is in budget-patch hardware connected to port B VSYNC |
504 | 504 | ||
505 | ** HS is an internal event of 7146, accessible with RPS | 505 | ** HS is an internal event of 7146, accessible with RPS |
506 | ** and temporarily raised high every n lines | 506 | ** and temporarily raised high every n lines |
507 | ** (n in defined in the RPS_THRESH1 counter threshold) | 507 | ** (n in defined in the RPS_THRESH1 counter threshold) |
508 | ** I think HS is raised high on the beginning of the n-th line | 508 | ** I think HS is raised high on the beginning of the n-th line |
509 | ** and remains high until this n-th line that triggered | 509 | ** and remains high until this n-th line that triggered |
510 | ** it is completely received. When the receiption of n-th line | 510 | ** it is completely received. When the reception of n-th line |
511 | ** ends, HS is lowered. | 511 | ** ends, HS is lowered. |
512 | 512 | ||
513 | ** To transmit data over DMA, 7146 needs changing state at | 513 | ** To transmit data over DMA, 7146 needs changing state at |
@@ -541,7 +541,7 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte | |||
541 | ** hardware debug note: a working budget card (including budget patch) | 541 | ** hardware debug note: a working budget card (including budget patch) |
542 | ** with vpeirq() interrupt setup in mode "0x90" (every 64K) will | 542 | ** with vpeirq() interrupt setup in mode "0x90" (every 64K) will |
543 | ** generate 3 interrupts per 25-Hz DMA frame of 2*188*512 bytes | 543 | ** generate 3 interrupts per 25-Hz DMA frame of 2*188*512 bytes |
544 | ** and that means 3*25=75 Hz of interrupt freqency, as seen by | 544 | ** and that means 3*25=75 Hz of interrupt frequency, as seen by |
545 | ** watch cat /proc/interrupts | 545 | ** watch cat /proc/interrupts |
546 | ** | 546 | ** |
547 | ** If this frequency is 3x lower (and data received in the DMA | 547 | ** If this frequency is 3x lower (and data received in the DMA |
@@ -550,7 +550,7 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte | |||
550 | ** this means VSYNC line is not connected in the hardware. | 550 | ** this means VSYNC line is not connected in the hardware. |
551 | ** (check soldering pcb and pins) | 551 | ** (check soldering pcb and pins) |
552 | ** The same behaviour of missing VSYNC can be duplicated on budget | 552 | ** The same behaviour of missing VSYNC can be duplicated on budget |
553 | ** cards, by seting DD1_INIT trigger mode 7 in 3rd nibble. | 553 | ** cards, by setting DD1_INIT trigger mode 7 in 3rd nibble. |
554 | */ | 554 | */ |
555 | 555 | ||
556 | // Setup RPS1 "program" (p35) | 556 | // Setup RPS1 "program" (p35) |
diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c index a1c9fa9919ea..8135f3e76aeb 100644 --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c | |||
@@ -1135,8 +1135,7 @@ static void ttusb_dec_free_iso_urbs(struct ttusb_dec *dec) | |||
1135 | dprintk("%s\n", __FUNCTION__); | 1135 | dprintk("%s\n", __FUNCTION__); |
1136 | 1136 | ||
1137 | for (i = 0; i < ISO_BUF_COUNT; i++) | 1137 | for (i = 0; i < ISO_BUF_COUNT; i++) |
1138 | if (dec->iso_urb[i]) | 1138 | usb_free_urb(dec->iso_urb[i]); |
1139 | usb_free_urb(dec->iso_urb[i]); | ||
1140 | 1139 | ||
1141 | pci_free_consistent(NULL, | 1140 | pci_free_consistent(NULL, |
1142 | ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * | 1141 | ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index bf267552941f..b8fde5cf4735 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
@@ -24,7 +24,7 @@ config VIDEO_HELPER_CHIPS_AUTO | |||
24 | decode audio/video standards. This option will autoselect | 24 | decode audio/video standards. This option will autoselect |
25 | all pertinent modules to each selected video module. | 25 | all pertinent modules to each selected video module. |
26 | 26 | ||
27 | Unselect this only if you know exaclty what you are doing, since | 27 | Unselect this only if you know exactly what you are doing, since |
28 | it may break support on some boards. | 28 | it may break support on some boards. |
29 | 29 | ||
30 | In doubt, say Y. | 30 | In doubt, say Y. |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index f920e0ccacd3..1f787333d18c 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -1953,8 +1953,8 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, | |||
1953 | return hdw; | 1953 | return hdw; |
1954 | fail: | 1954 | fail: |
1955 | if (hdw) { | 1955 | if (hdw) { |
1956 | if (hdw->ctl_read_urb) usb_free_urb(hdw->ctl_read_urb); | 1956 | usb_free_urb(hdw->ctl_read_urb); |
1957 | if (hdw->ctl_write_urb) usb_free_urb(hdw->ctl_write_urb); | 1957 | usb_free_urb(hdw->ctl_write_urb); |
1958 | if (hdw->ctl_read_buffer) kfree(hdw->ctl_read_buffer); | 1958 | if (hdw->ctl_read_buffer) kfree(hdw->ctl_read_buffer); |
1959 | if (hdw->ctl_write_buffer) kfree(hdw->ctl_write_buffer); | 1959 | if (hdw->ctl_write_buffer) kfree(hdw->ctl_write_buffer); |
1960 | if (hdw->controls) kfree(hdw->controls); | 1960 | if (hdw->controls) kfree(hdw->controls); |
@@ -2575,12 +2575,10 @@ static void pvr2_ctl_timeout(unsigned long data) | |||
2575 | struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; | 2575 | struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; |
2576 | if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) { | 2576 | if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) { |
2577 | hdw->ctl_timeout_flag = !0; | 2577 | hdw->ctl_timeout_flag = !0; |
2578 | if (hdw->ctl_write_pend_flag && hdw->ctl_write_urb) { | 2578 | if (hdw->ctl_write_pend_flag) |
2579 | usb_unlink_urb(hdw->ctl_write_urb); | 2579 | usb_unlink_urb(hdw->ctl_write_urb); |
2580 | } | 2580 | if (hdw->ctl_read_pend_flag) |
2581 | if (hdw->ctl_read_pend_flag && hdw->ctl_read_urb) { | ||
2582 | usb_unlink_urb(hdw->ctl_read_urb); | 2581 | usb_unlink_urb(hdw->ctl_read_urb); |
2583 | } | ||
2584 | } | 2582 | } |
2585 | } | 2583 | } |
2586 | 2584 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.c b/drivers/media/video/pvrusb2/pvrusb2-io.c index 70aa63eba0cb..57fb32033543 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.c +++ b/drivers/media/video/pvrusb2/pvrusb2-io.c | |||
@@ -289,7 +289,7 @@ static void pvr2_buffer_done(struct pvr2_buffer *bp) | |||
289 | pvr2_buffer_set_none(bp); | 289 | pvr2_buffer_set_none(bp); |
290 | bp->signature = 0; | 290 | bp->signature = 0; |
291 | bp->stream = NULL; | 291 | bp->stream = NULL; |
292 | if (bp->purb) usb_free_urb(bp->purb); | 292 | usb_free_urb(bp->purb); |
293 | pvr2_trace(PVR2_TRACE_BUF_POOL,"/*---TRACE_FLOW---*/" | 293 | pvr2_trace(PVR2_TRACE_BUF_POOL,"/*---TRACE_FLOW---*/" |
294 | " bufferDone %p",bp); | 294 | " bufferDone %p",bp); |
295 | } | 295 | } |
diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c index 46c114830884..a996aad79276 100644 --- a/drivers/media/video/pwc/pwc-if.c +++ b/drivers/media/video/pwc/pwc-if.c | |||
@@ -866,11 +866,9 @@ int pwc_isoc_init(struct pwc_device *pdev) | |||
866 | } | 866 | } |
867 | if (ret) { | 867 | if (ret) { |
868 | /* De-allocate in reverse order */ | 868 | /* De-allocate in reverse order */ |
869 | while (i >= 0) { | 869 | while (i--) { |
870 | if (pdev->sbuf[i].urb != NULL) | 870 | usb_free_urb(pdev->sbuf[i].urb); |
871 | usb_free_urb(pdev->sbuf[i].urb); | ||
872 | pdev->sbuf[i].urb = NULL; | 871 | pdev->sbuf[i].urb = NULL; |
873 | i--; | ||
874 | } | 872 | } |
875 | return ret; | 873 | return ret; |
876 | } | 874 | } |
@@ -1095,8 +1093,7 @@ static int pwc_video_open(struct inode *inode, struct file *file) | |||
1095 | PWC_DEBUG_OPEN(">> video_open called(vdev = 0x%p).\n", vdev); | 1093 | PWC_DEBUG_OPEN(">> video_open called(vdev = 0x%p).\n", vdev); |
1096 | 1094 | ||
1097 | pdev = (struct pwc_device *)vdev->priv; | 1095 | pdev = (struct pwc_device *)vdev->priv; |
1098 | if (pdev == NULL) | 1096 | BUG_ON(!pdev); |
1099 | BUG(); | ||
1100 | if (pdev->vopen) { | 1097 | if (pdev->vopen) { |
1101 | PWC_DEBUG_OPEN("I'm busy, someone is using the device.\n"); | 1098 | PWC_DEBUG_OPEN("I'm busy, someone is using the device.\n"); |
1102 | return -EBUSY; | 1099 | return -EBUSY; |
diff --git a/drivers/media/video/sn9c102/sn9c102_core.c b/drivers/media/video/sn9c102/sn9c102_core.c index 42fb60d985b9..18458d46c0ff 100644 --- a/drivers/media/video/sn9c102/sn9c102_core.c +++ b/drivers/media/video/sn9c102/sn9c102_core.c | |||
@@ -775,7 +775,7 @@ static int sn9c102_start_transfer(struct sn9c102_device* cam) | |||
775 | return 0; | 775 | return 0; |
776 | 776 | ||
777 | free_urbs: | 777 | free_urbs: |
778 | for (i = 0; (i < SN9C102_URBS) && cam->urb[i]; i++) | 778 | for (i = 0; i < SN9C102_URBS; i++) |
779 | usb_free_urb(cam->urb[i]); | 779 | usb_free_urb(cam->urb[i]); |
780 | 780 | ||
781 | free_buffers: | 781 | free_buffers: |
diff --git a/drivers/media/video/usbvideo/quickcam_messenger.c b/drivers/media/video/usbvideo/quickcam_messenger.c index 9a26b9484aae..bbf2beeeb449 100644 --- a/drivers/media/video/usbvideo/quickcam_messenger.c +++ b/drivers/media/video/usbvideo/quickcam_messenger.c | |||
@@ -190,8 +190,7 @@ static int qcm_alloc_int_urb(struct qcm *cam) | |||
190 | 190 | ||
191 | static void qcm_free_int(struct qcm *cam) | 191 | static void qcm_free_int(struct qcm *cam) |
192 | { | 192 | { |
193 | if (cam->button_urb) | 193 | usb_free_urb(cam->button_urb); |
194 | usb_free_urb(cam->button_urb); | ||
195 | } | 194 | } |
196 | #endif /* CONFIG_INPUT */ | 195 | #endif /* CONFIG_INPUT */ |
197 | 196 | ||
diff --git a/drivers/media/video/zc0301/zc0301_core.c b/drivers/media/video/zc0301/zc0301_core.c index 5b5563424422..52d0f759ee00 100644 --- a/drivers/media/video/zc0301/zc0301_core.c +++ b/drivers/media/video/zc0301/zc0301_core.c | |||
@@ -489,7 +489,7 @@ static int zc0301_start_transfer(struct zc0301_device* cam) | |||
489 | return 0; | 489 | return 0; |
490 | 490 | ||
491 | free_urbs: | 491 | free_urbs: |
492 | for (i = 0; (i < ZC0301_URBS) && cam->urb[i]; i++) | 492 | for (i = 0; i < ZC0301_URBS; i++) |
493 | usb_free_urb(cam->urb[i]); | 493 | usb_free_urb(cam->urb[i]); |
494 | 494 | ||
495 | free_buffers: | 495 | free_buffers: |
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index e5c72719debc..051b7c5b8f03 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -6185,7 +6185,7 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info) | |||
6185 | "Abort", /* 12h */ | 6185 | "Abort", /* 12h */ |
6186 | "IO Not Yet Executed", /* 13h */ | 6186 | "IO Not Yet Executed", /* 13h */ |
6187 | "IO Executed", /* 14h */ | 6187 | "IO Executed", /* 14h */ |
6188 | "Persistant Reservation Out Not Affiliation Owner", /* 15h */ | 6188 | "Persistent Reservation Out Not Affiliation Owner", /* 15h */ |
6189 | "Open Transmit DMA Abort", /* 16h */ | 6189 | "Open Transmit DMA Abort", /* 16h */ |
6190 | "IO Device Missing Delay Retry", /* 17h */ | 6190 | "IO Device Missing Delay Retry", /* 17h */ |
6191 | NULL, /* 18h */ | 6191 | NULL, /* 18h */ |
diff --git a/drivers/message/i2o/pci.c b/drivers/message/i2o/pci.c index 62f1ac08332c..8287f95c8c42 100644 --- a/drivers/message/i2o/pci.c +++ b/drivers/message/i2o/pci.c | |||
@@ -320,7 +320,6 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
320 | struct i2o_controller *c; | 320 | struct i2o_controller *c; |
321 | int rc; | 321 | int rc; |
322 | struct pci_dev *i960 = NULL; | 322 | struct pci_dev *i960 = NULL; |
323 | int enabled = pdev->is_enabled; | ||
324 | 323 | ||
325 | printk(KERN_INFO "i2o: Checking for PCI I2O controllers...\n"); | 324 | printk(KERN_INFO "i2o: Checking for PCI I2O controllers...\n"); |
326 | 325 | ||
@@ -330,12 +329,11 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
330 | return -ENODEV; | 329 | return -ENODEV; |
331 | } | 330 | } |
332 | 331 | ||
333 | if (!enabled) | 332 | if ((rc = pci_enable_device(pdev))) { |
334 | if ((rc = pci_enable_device(pdev))) { | 333 | printk(KERN_WARNING "i2o: couldn't enable device %s\n", |
335 | printk(KERN_WARNING "i2o: couldn't enable device %s\n", | 334 | pci_name(pdev)); |
336 | pci_name(pdev)); | 335 | return rc; |
337 | return rc; | 336 | } |
338 | } | ||
339 | 337 | ||
340 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { | 338 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { |
341 | printk(KERN_WARNING "i2o: no suitable DMA found for %s\n", | 339 | printk(KERN_WARNING "i2o: no suitable DMA found for %s\n", |
@@ -442,8 +440,7 @@ static int __devinit i2o_pci_probe(struct pci_dev *pdev, | |||
442 | i2o_iop_free(c); | 440 | i2o_iop_free(c); |
443 | 441 | ||
444 | disable: | 442 | disable: |
445 | if (!enabled) | 443 | pci_disable_device(pdev); |
446 | pci_disable_device(pdev); | ||
447 | 444 | ||
448 | return rc; | 445 | return rc; |
449 | } | 446 | } |
diff --git a/drivers/mmc/mmc_queue.c b/drivers/mmc/mmc_queue.c index 4ccdd82b680f..61a1de85cb23 100644 --- a/drivers/mmc/mmc_queue.c +++ b/drivers/mmc/mmc_queue.c | |||
@@ -130,8 +130,8 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock | |||
130 | u64 limit = BLK_BOUNCE_HIGH; | 130 | u64 limit = BLK_BOUNCE_HIGH; |
131 | int ret; | 131 | int ret; |
132 | 132 | ||
133 | if (host->dev->dma_mask && *host->dev->dma_mask) | 133 | if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask) |
134 | limit = *host->dev->dma_mask; | 134 | limit = *mmc_dev(host)->dma_mask; |
135 | 135 | ||
136 | mq->card = card; | 136 | mq->card = card; |
137 | mq->queue = blk_init_queue(mmc_request, lock); | 137 | mq->queue = blk_init_queue(mmc_request, lock); |
diff --git a/drivers/mmc/mmc_sysfs.c b/drivers/mmc/mmc_sysfs.c index 10cc9734eaa0..ac5329636045 100644 --- a/drivers/mmc/mmc_sysfs.c +++ b/drivers/mmc/mmc_sysfs.c | |||
@@ -199,7 +199,7 @@ void mmc_init_card(struct mmc_card *card, struct mmc_host *host) | |||
199 | memset(card, 0, sizeof(struct mmc_card)); | 199 | memset(card, 0, sizeof(struct mmc_card)); |
200 | card->host = host; | 200 | card->host = host; |
201 | device_initialize(&card->dev); | 201 | device_initialize(&card->dev); |
202 | card->dev.parent = card->host->dev; | 202 | card->dev.parent = mmc_dev(host); |
203 | card->dev.bus = &mmc_bus_type; | 203 | card->dev.bus = &mmc_bus_type; |
204 | card->dev.release = mmc_release_card; | 204 | card->dev.release = mmc_release_card; |
205 | } | 205 | } |
@@ -242,7 +242,7 @@ void mmc_remove_card(struct mmc_card *card) | |||
242 | } | 242 | } |
243 | 243 | ||
244 | 244 | ||
245 | static void mmc_host_classdev_release(struct class_device *dev) | 245 | static void mmc_host_classdev_release(struct device *dev) |
246 | { | 246 | { |
247 | struct mmc_host *host = cls_dev_to_mmc_host(dev); | 247 | struct mmc_host *host = cls_dev_to_mmc_host(dev); |
248 | kfree(host); | 248 | kfree(host); |
@@ -250,7 +250,7 @@ static void mmc_host_classdev_release(struct class_device *dev) | |||
250 | 250 | ||
251 | static struct class mmc_host_class = { | 251 | static struct class mmc_host_class = { |
252 | .name = "mmc_host", | 252 | .name = "mmc_host", |
253 | .release = mmc_host_classdev_release, | 253 | .dev_release = mmc_host_classdev_release, |
254 | }; | 254 | }; |
255 | 255 | ||
256 | static DEFINE_IDR(mmc_host_idr); | 256 | static DEFINE_IDR(mmc_host_idr); |
@@ -267,10 +267,10 @@ struct mmc_host *mmc_alloc_host_sysfs(int extra, struct device *dev) | |||
267 | if (host) { | 267 | if (host) { |
268 | memset(host, 0, sizeof(struct mmc_host) + extra); | 268 | memset(host, 0, sizeof(struct mmc_host) + extra); |
269 | 269 | ||
270 | host->dev = dev; | 270 | host->parent = dev; |
271 | host->class_dev.dev = host->dev; | 271 | host->class_dev.parent = dev; |
272 | host->class_dev.class = &mmc_host_class; | 272 | host->class_dev.class = &mmc_host_class; |
273 | class_device_initialize(&host->class_dev); | 273 | device_initialize(&host->class_dev); |
274 | } | 274 | } |
275 | 275 | ||
276 | return host; | 276 | return host; |
@@ -292,10 +292,10 @@ int mmc_add_host_sysfs(struct mmc_host *host) | |||
292 | if (err) | 292 | if (err) |
293 | return err; | 293 | return err; |
294 | 294 | ||
295 | snprintf(host->class_dev.class_id, BUS_ID_SIZE, | 295 | snprintf(host->class_dev.bus_id, BUS_ID_SIZE, |
296 | "mmc%d", host->index); | 296 | "mmc%d", host->index); |
297 | 297 | ||
298 | return class_device_add(&host->class_dev); | 298 | return device_add(&host->class_dev); |
299 | } | 299 | } |
300 | 300 | ||
301 | /* | 301 | /* |
@@ -303,7 +303,7 @@ int mmc_add_host_sysfs(struct mmc_host *host) | |||
303 | */ | 303 | */ |
304 | void mmc_remove_host_sysfs(struct mmc_host *host) | 304 | void mmc_remove_host_sysfs(struct mmc_host *host) |
305 | { | 305 | { |
306 | class_device_del(&host->class_dev); | 306 | device_del(&host->class_dev); |
307 | 307 | ||
308 | spin_lock(&mmc_host_lock); | 308 | spin_lock(&mmc_host_lock); |
309 | idr_remove(&mmc_host_idr, host->index); | 309 | idr_remove(&mmc_host_idr, host->index); |
@@ -315,7 +315,7 @@ void mmc_remove_host_sysfs(struct mmc_host *host) | |||
315 | */ | 315 | */ |
316 | void mmc_free_host_sysfs(struct mmc_host *host) | 316 | void mmc_free_host_sysfs(struct mmc_host *host) |
317 | { | 317 | { |
318 | class_device_put(&host->class_dev); | 318 | put_device(&host->class_dev); |
319 | } | 319 | } |
320 | 320 | ||
321 | static struct workqueue_struct *workqueue; | 321 | static struct workqueue_struct *workqueue; |
diff --git a/drivers/mmc/omap.c b/drivers/mmc/omap.c index 762fa2895891..d593ef342e75 100644 --- a/drivers/mmc/omap.c +++ b/drivers/mmc/omap.c | |||
@@ -640,8 +640,7 @@ mmc_omap_prepare_dma(struct mmc_omap_host *host, struct mmc_data *data) | |||
640 | } | 640 | } |
641 | 641 | ||
642 | /* Max limit for DMA frame count is 0xffff */ | 642 | /* Max limit for DMA frame count is 0xffff */ |
643 | if (unlikely(count > 0xffff)) | 643 | BUG_ON(count > 0xffff); |
644 | BUG(); | ||
645 | 644 | ||
646 | OMAP_MMC_WRITE(host->base, BUF, buf); | 645 | OMAP_MMC_WRITE(host->base, BUF, buf); |
647 | omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S16, | 646 | omap_set_dma_transfer_params(dma_ch, OMAP_DMA_DATA_TYPE_S16, |
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c index ced309b37a8f..682e62b0b09d 100644 --- a/drivers/mmc/wbsd.c +++ b/drivers/mmc/wbsd.c | |||
@@ -1488,7 +1488,7 @@ static void __devinit wbsd_request_dma(struct wbsd_host *host, int dma) | |||
1488 | /* | 1488 | /* |
1489 | * Translate the address to a physical address. | 1489 | * Translate the address to a physical address. |
1490 | */ | 1490 | */ |
1491 | host->dma_addr = dma_map_single(host->mmc->dev, host->dma_buffer, | 1491 | host->dma_addr = dma_map_single(mmc_dev(host->mmc), host->dma_buffer, |
1492 | WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); | 1492 | WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); |
1493 | 1493 | ||
1494 | /* | 1494 | /* |
@@ -1512,7 +1512,7 @@ kfree: | |||
1512 | */ | 1512 | */ |
1513 | BUG_ON(1); | 1513 | BUG_ON(1); |
1514 | 1514 | ||
1515 | dma_unmap_single(host->mmc->dev, host->dma_addr, | 1515 | dma_unmap_single(mmc_dev(host->mmc), host->dma_addr, |
1516 | WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); | 1516 | WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); |
1517 | host->dma_addr = (dma_addr_t)NULL; | 1517 | host->dma_addr = (dma_addr_t)NULL; |
1518 | 1518 | ||
@@ -1530,7 +1530,7 @@ err: | |||
1530 | static void __devexit wbsd_release_dma(struct wbsd_host *host) | 1530 | static void __devexit wbsd_release_dma(struct wbsd_host *host) |
1531 | { | 1531 | { |
1532 | if (host->dma_addr) { | 1532 | if (host->dma_addr) { |
1533 | dma_unmap_single(host->mmc->dev, host->dma_addr, | 1533 | dma_unmap_single(mmc_dev(host->mmc), host->dma_addr, |
1534 | WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); | 1534 | WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); |
1535 | } | 1535 | } |
1536 | kfree(host->dma_buffer); | 1536 | kfree(host->dma_buffer); |
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index 24747bdc3e19..d132ed571f13 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig | |||
@@ -607,7 +607,7 @@ config MTD_BAST_MAXSIZE | |||
607 | default "4" | 607 | default "4" |
608 | 608 | ||
609 | config MTD_SHARP_SL | 609 | config MTD_SHARP_SL |
610 | bool "ROM maped on Sharp SL Series" | 610 | bool "ROM mapped on Sharp SL Series" |
611 | depends on MTD && ARCH_PXA | 611 | depends on MTD && ARCH_PXA |
612 | help | 612 | help |
613 | This enables access to the flash chip on the Sharp SL Series of PDAs. | 613 | This enables access to the flash chip on the Sharp SL Series of PDAs. |
diff --git a/drivers/mtd/maps/cfi_flagadm.c b/drivers/mtd/maps/cfi_flagadm.c index 92b5d883d7b0..65e5ee552010 100644 --- a/drivers/mtd/maps/cfi_flagadm.c +++ b/drivers/mtd/maps/cfi_flagadm.c | |||
@@ -80,7 +80,7 @@ struct mtd_partition flagadm_parts[] = { | |||
80 | .size = FLASH_PARTITION2_SIZE | 80 | .size = FLASH_PARTITION2_SIZE |
81 | }, | 81 | }, |
82 | { | 82 | { |
83 | .name = "Persistant storage", | 83 | .name = "Persistent storage", |
84 | .offset = FLASH_PARTITION3_ADDR, | 84 | .offset = FLASH_PARTITION3_ADDR, |
85 | .size = FLASH_PARTITION3_SIZE | 85 | .size = FLASH_PARTITION3_SIZE |
86 | } | 86 | } |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 6e863aa9894c..b6c70c58ae99 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -32,7 +32,7 @@ config IFB | |||
32 | tristate "Intermediate Functional Block support" | 32 | tristate "Intermediate Functional Block support" |
33 | depends on NET_CLS_ACT | 33 | depends on NET_CLS_ACT |
34 | ---help--- | 34 | ---help--- |
35 | This is an intermidiate driver that allows sharing of | 35 | This is an intermediate driver that allows sharing of |
36 | resources. | 36 | resources. |
37 | To compile this driver as a module, choose M here: the module | 37 | To compile this driver as a module, choose M here: the module |
38 | will be called ifb. If you want to use more than one ifb | 38 | will be called ifb. If you want to use more than one ifb |
@@ -2136,7 +2136,7 @@ config SK98LIN | |||
2136 | This driver supports the original Yukon chipset. A cleaner driver is | 2136 | This driver supports the original Yukon chipset. A cleaner driver is |
2137 | also available (skge) which seems to work better than this one. | 2137 | also available (skge) which seems to work better than this one. |
2138 | 2138 | ||
2139 | This driver does not support the newer Yukon2 chipset. A seperate | 2139 | This driver does not support the newer Yukon2 chipset. A separate |
2140 | driver, sky2, is provided to support Yukon2-based adapters. | 2140 | driver, sky2, is provided to support Yukon2-based adapters. |
2141 | 2141 | ||
2142 | The following adapters are supported by this driver: | 2142 | The following adapters are supported by this driver: |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 19ab3441269c..3a8df479cbda 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -1215,7 +1215,7 @@ static void e100_setup_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb | |||
1215 | * the literal in the instruction before the code is loaded, the | 1215 | * the literal in the instruction before the code is loaded, the |
1216 | * driver can change the algorithm. | 1216 | * driver can change the algorithm. |
1217 | * | 1217 | * |
1218 | * INTDELAY - This loads the dead-man timer with its inital value. | 1218 | * INTDELAY - This loads the dead-man timer with its initial value. |
1219 | * When this timer expires the interrupt is asserted, and the | 1219 | * When this timer expires the interrupt is asserted, and the |
1220 | * timer is reset each time a new packet is received. (see | 1220 | * timer is reset each time a new packet is received. (see |
1221 | * BUNDLEMAX below to set the limit on number of chained packets) | 1221 | * BUNDLEMAX below to set the limit on number of chained packets) |
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 65077f39da69..796c4f7d4260 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
@@ -3868,7 +3868,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw) | |||
3868 | * | 3868 | * |
3869 | * hw - Struct containing variables accessed by shared code | 3869 | * hw - Struct containing variables accessed by shared code |
3870 | * | 3870 | * |
3871 | * Sets bit 15 of the MII Control regiser | 3871 | * Sets bit 15 of the MII Control register |
3872 | ******************************************************************************/ | 3872 | ******************************************************************************/ |
3873 | int32_t | 3873 | int32_t |
3874 | e1000_phy_reset(struct e1000_hw *hw) | 3874 | e1000_phy_reset(struct e1000_hw *hw) |
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index 14bda765c2fa..6e95645e7245 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c | |||
@@ -1793,10 +1793,8 @@ err_out_3: | |||
1793 | err_out_2: | 1793 | err_out_2: |
1794 | usb_free_urb(self->tx_urb); | 1794 | usb_free_urb(self->tx_urb); |
1795 | err_out_1: | 1795 | err_out_1: |
1796 | for (i = 0; i < self->max_rx_urb; i++) { | 1796 | for (i = 0; i < self->max_rx_urb; i++) |
1797 | if (self->rx_urb[i]) | 1797 | usb_free_urb(self->rx_urb[i]); |
1798 | usb_free_urb(self->rx_urb[i]); | ||
1799 | } | ||
1800 | free_netdev(net); | 1798 | free_netdev(net); |
1801 | err_out: | 1799 | err_out: |
1802 | return ret; | 1800 | return ret; |
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index b79ec0d7480f..ecb61f876f27 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig | |||
@@ -61,8 +61,8 @@ config FIXED_PHY | |||
61 | depends on PHYLIB | 61 | depends on PHYLIB |
62 | ---help--- | 62 | ---help--- |
63 | Adds the driver to PHY layer to cover the boards that do not have any PHY bound, | 63 | Adds the driver to PHY layer to cover the boards that do not have any PHY bound, |
64 | but with the ability to manipulate with speed/link in software. The relavant MII | 64 | but with the ability to manipulate the speed/link in software. The relevant MII |
65 | speed/duplex parameters could be effectively handled in user-specified fuction. | 65 | speed/duplex parameters could be effectively handled in a user-specified function. |
66 | Currently tested with mpc866ads. | 66 | Currently tested with mpc866ads. |
67 | 67 | ||
68 | config FIXED_MII_10_FDX | 68 | config FIXED_MII_10_FDX |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index f5802e7b08e9..c6de566188e4 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
@@ -860,7 +860,7 @@ static int __init ppp_init(void) | |||
860 | err = PTR_ERR(ppp_class); | 860 | err = PTR_ERR(ppp_class); |
861 | goto out_chrdev; | 861 | goto out_chrdev; |
862 | } | 862 | } |
863 | class_device_create(ppp_class, NULL, MKDEV(PPP_MAJOR, 0), NULL, "ppp"); | 863 | device_create(ppp_class, NULL, MKDEV(PPP_MAJOR, 0), "ppp"); |
864 | } | 864 | } |
865 | 865 | ||
866 | out: | 866 | out: |
@@ -2675,7 +2675,7 @@ static void __exit ppp_cleanup(void) | |||
2675 | cardmap_destroy(&all_ppp_units); | 2675 | cardmap_destroy(&all_ppp_units); |
2676 | if (unregister_chrdev(PPP_MAJOR, "ppp") != 0) | 2676 | if (unregister_chrdev(PPP_MAJOR, "ppp") != 0) |
2677 | printk(KERN_ERR "PPP: failed to unregister PPP device\n"); | 2677 | printk(KERN_ERR "PPP: failed to unregister PPP device\n"); |
2678 | class_device_destroy(ppp_class, MKDEV(PPP_MAJOR, 0)); | 2678 | device_destroy(ppp_class, MKDEV(PPP_MAJOR, 0)); |
2679 | class_destroy(ppp_class); | 2679 | class_destroy(ppp_class); |
2680 | } | 2680 | } |
2681 | 2681 | ||
diff --git a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h index 778d9e618ebd..3fa67171e832 100644 --- a/drivers/net/sk98lin/h/skdrv2nd.h +++ b/drivers/net/sk98lin/h/skdrv2nd.h | |||
@@ -160,7 +160,7 @@ struct s_IOCTL { | |||
160 | 160 | ||
161 | /* | 161 | /* |
162 | ** Interim definition of SK_DRV_TIMER placed in this file until | 162 | ** Interim definition of SK_DRV_TIMER placed in this file until |
163 | ** common modules have boon finallized | 163 | ** common modules have been finalized |
164 | */ | 164 | */ |
165 | #define SK_DRV_TIMER 11 | 165 | #define SK_DRV_TIMER 11 |
166 | #define SK_DRV_MODERATION_TIMER 1 | 166 | #define SK_DRV_MODERATION_TIMER 1 |
diff --git a/drivers/net/sk98lin/skdim.c b/drivers/net/sk98lin/skdim.c index 07c1b4c8699d..37ce03fb8de3 100644 --- a/drivers/net/sk98lin/skdim.c +++ b/drivers/net/sk98lin/skdim.c | |||
@@ -252,7 +252,7 @@ SkDimEnableModerationIfNeeded(SK_AC *pAC) { | |||
252 | 252 | ||
253 | /******************************************************************************* | 253 | /******************************************************************************* |
254 | ** Function : SkDimDisplayModerationSettings | 254 | ** Function : SkDimDisplayModerationSettings |
255 | ** Description : Displays the current settings regaring interrupt moderation | 255 | ** Description : Displays the current settings regarding interrupt moderation |
256 | ** Programmer : Ralph Roesler | 256 | ** Programmer : Ralph Roesler |
257 | ** Last Modified: 22-mar-03 | 257 | ** Last Modified: 22-mar-03 |
258 | ** Returns : void (!) | 258 | ** Returns : void (!) |
@@ -510,7 +510,7 @@ EnableIntMod(SK_AC *pAC) { | |||
510 | 510 | ||
511 | /******************************************************************************* | 511 | /******************************************************************************* |
512 | ** Function : DisableIntMod() | 512 | ** Function : DisableIntMod() |
513 | ** Description : Disbles the interrupt moderation independent of what inter- | 513 | ** Description : Disables the interrupt moderation independent of what inter- |
514 | ** rupts are running or not | 514 | ** rupts are running or not |
515 | ** Programmer : Ralph Roesler | 515 | ** Programmer : Ralph Roesler |
516 | ** Last Modified: 23-mar-03 | 516 | ** Last Modified: 23-mar-03 |
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 1f742814a01c..72120d5c2f7b 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -6920,8 +6920,8 @@ static int ipw_qos_association(struct ipw_priv *priv, | |||
6920 | } | 6920 | } |
6921 | 6921 | ||
6922 | /* | 6922 | /* |
6923 | * handling the beaconing responces. if we get different QoS setting | 6923 | * handling the beaconing responses. if we get different QoS setting |
6924 | * of the network from the the associated setting adjust the QoS | 6924 | * off the network from the associated setting, adjust the QoS |
6925 | * setting | 6925 | * setting |
6926 | */ | 6926 | */ |
6927 | static int ipw_qos_association_resp(struct ipw_priv *priv, | 6927 | static int ipw_qos_association_resp(struct ipw_priv *priv, |
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 36b29ff05814..6cb66a356c96 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c | |||
@@ -1828,10 +1828,8 @@ err_start: | |||
1828 | /* Leave the device in reset state */ | 1828 | /* Leave the device in reset state */ |
1829 | zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0); | 1829 | zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0); |
1830 | err_zd: | 1830 | err_zd: |
1831 | if (zd->tx_urb) | 1831 | usb_free_urb(zd->tx_urb); |
1832 | usb_free_urb(zd->tx_urb); | 1832 | usb_free_urb(zd->rx_urb); |
1833 | if (zd->rx_urb) | ||
1834 | usb_free_urb(zd->rx_urb); | ||
1835 | kfree(zd); | 1833 | kfree(zd); |
1836 | return err; | 1834 | return err; |
1837 | } | 1835 | } |
diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c index 68cb3a080050..fe3f5f5365c5 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c | |||
@@ -486,7 +486,7 @@ typedef unsigned long space_t; | |||
486 | ** This bit tells U2 to do R/M/W for partial cachelines. "Streaming" | 486 | ** This bit tells U2 to do R/M/W for partial cachelines. "Streaming" |
487 | ** data can avoid this if the mapping covers full cache lines. | 487 | ** data can avoid this if the mapping covers full cache lines. |
488 | ** o STOP_MOST is needed for atomicity across cachelines. | 488 | ** o STOP_MOST is needed for atomicity across cachelines. |
489 | ** Apperently only "some EISA devices" need this. | 489 | ** Apparently only "some EISA devices" need this. |
490 | ** Using CONFIG_ISA is hack. Only the IOA with EISA under it needs | 490 | ** Using CONFIG_ISA is hack. Only the IOA with EISA under it needs |
491 | ** to use this hint iff the EISA devices needs this feature. | 491 | ** to use this hint iff the EISA devices needs this feature. |
492 | ** According to the U2 ERS, STOP_MOST enabled pages hurt performance. | 492 | ** According to the U2 ERS, STOP_MOST enabled pages hurt performance. |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index c2949b4367e5..12bab64a62a1 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -50,12 +50,12 @@ | |||
50 | ** | 50 | ** |
51 | ** PA Firmware | 51 | ** PA Firmware |
52 | ** ----------- | 52 | ** ----------- |
53 | ** PA-RISC platforms have two fundementally different types of firmware. | 53 | ** PA-RISC platforms have two fundamentally different types of firmware. |
54 | ** For PCI devices, "Legacy" PDC initializes the "INTERRUPT_LINE" register | 54 | ** For PCI devices, "Legacy" PDC initializes the "INTERRUPT_LINE" register |
55 | ** and BARs similar to a traditional PC BIOS. | 55 | ** and BARs similar to a traditional PC BIOS. |
56 | ** The newer "PAT" firmware supports PDC calls which return tables. | 56 | ** The newer "PAT" firmware supports PDC calls which return tables. |
57 | ** PAT firmware only initializes PCI Console and Boot interface. | 57 | ** PAT firmware only initializes the PCI Console and Boot interface. |
58 | ** With these tables, the OS can progam all other PCI devices. | 58 | ** With these tables, the OS can program all other PCI devices. |
59 | ** | 59 | ** |
60 | ** One such PAT PDC call returns the "Interrupt Routing Table" (IRT). | 60 | ** One such PAT PDC call returns the "Interrupt Routing Table" (IRT). |
61 | ** The IRT maps each PCI slot's INTA-D "output" line to an I/O SAPIC | 61 | ** The IRT maps each PCI slot's INTA-D "output" line to an I/O SAPIC |
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig index 5f1b9f58070e..f1dd81a1d592 100644 --- a/drivers/pci/Kconfig +++ b/drivers/pci/Kconfig | |||
@@ -19,7 +19,7 @@ config PCI_MSI | |||
19 | 19 | ||
20 | config PCI_MULTITHREAD_PROBE | 20 | config PCI_MULTITHREAD_PROBE |
21 | bool "PCI Multi-threaded probe (EXPERIMENTAL)" | 21 | bool "PCI Multi-threaded probe (EXPERIMENTAL)" |
22 | depends on PCI && EXPERIMENTAL && BROKEN | 22 | depends on PCI && EXPERIMENTAL |
23 | help | 23 | help |
24 | Say Y here if you want the PCI core to spawn a new thread for | 24 | Say Y here if you want the PCI core to spawn a new thread for |
25 | every PCI device that is probed. This can cause a huge | 25 | every PCI device that is probed. This can cause a huge |
@@ -27,14 +27,14 @@ config PCI_MULTITHREAD_PROBE | |||
27 | smaller speedup on single processor machines. | 27 | smaller speedup on single processor machines. |
28 | 28 | ||
29 | But it can also cause lots of bad things to happen. A number | 29 | But it can also cause lots of bad things to happen. A number |
30 | of PCI drivers can not properly handle running in this way, | 30 | of PCI drivers cannot properly handle running in this way, |
31 | some will just not work properly at all, while others might | 31 | some will just not work properly at all, while others might |
32 | decide to blow up power supplies with a huge load all at once, | 32 | decide to blow up power supplies with a huge load all at once, |
33 | so use this option at your own risk. | 33 | so use this option at your own risk. |
34 | 34 | ||
35 | It is very unwise to use this option if you are not using a | 35 | It is very unwise to use this option if you are not using a |
36 | boot process that can handle devices being created in any | 36 | boot process that can handle devices being created in any |
37 | order. A program that can create persistant block and network | 37 | order. A program that can create persistent block and network |
38 | device names (like udev) is a good idea if you wish to use | 38 | device names (like udev) is a good idea if you wish to use |
39 | this option. | 39 | this option. |
40 | 40 | ||
diff --git a/drivers/pci/access.c b/drivers/pci/access.c index ea16805a153c..73a58c73d526 100644 --- a/drivers/pci/access.c +++ b/drivers/pci/access.c | |||
@@ -1,6 +1,7 @@ | |||
1 | #include <linux/pci.h> | 1 | #include <linux/pci.h> |
2 | #include <linux/module.h> | 2 | #include <linux/module.h> |
3 | #include <linux/ioport.h> | 3 | #include <linux/ioport.h> |
4 | #include <linux/wait.h> | ||
4 | 5 | ||
5 | #include "pci.h" | 6 | #include "pci.h" |
6 | 7 | ||
@@ -63,30 +64,42 @@ EXPORT_SYMBOL(pci_bus_write_config_byte); | |||
63 | EXPORT_SYMBOL(pci_bus_write_config_word); | 64 | EXPORT_SYMBOL(pci_bus_write_config_word); |
64 | EXPORT_SYMBOL(pci_bus_write_config_dword); | 65 | EXPORT_SYMBOL(pci_bus_write_config_dword); |
65 | 66 | ||
66 | static u32 pci_user_cached_config(struct pci_dev *dev, int pos) | 67 | /* |
67 | { | 68 | * The following routines are to prevent the user from accessing PCI config |
68 | u32 data; | 69 | * space when it's unsafe to do so. Some devices require this during BIST and |
70 | * we're required to prevent it during D-state transitions. | ||
71 | * | ||
72 | * We have a bit per device to indicate it's blocked and a global wait queue | ||
73 | * for callers to sleep on until devices are unblocked. | ||
74 | */ | ||
75 | static DECLARE_WAIT_QUEUE_HEAD(pci_ucfg_wait); | ||
69 | 76 | ||
70 | data = dev->saved_config_space[pos/sizeof(dev->saved_config_space[0])]; | 77 | static noinline void pci_wait_ucfg(struct pci_dev *dev) |
71 | data >>= (pos % sizeof(dev->saved_config_space[0])) * 8; | 78 | { |
72 | return data; | 79 | DECLARE_WAITQUEUE(wait, current); |
80 | |||
81 | __add_wait_queue(&pci_ucfg_wait, &wait); | ||
82 | do { | ||
83 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
84 | spin_unlock_irq(&pci_lock); | ||
85 | schedule(); | ||
86 | spin_lock_irq(&pci_lock); | ||
87 | } while (dev->block_ucfg_access); | ||
88 | __remove_wait_queue(&pci_ucfg_wait, &wait); | ||
73 | } | 89 | } |
74 | 90 | ||
75 | #define PCI_USER_READ_CONFIG(size,type) \ | 91 | #define PCI_USER_READ_CONFIG(size,type) \ |
76 | int pci_user_read_config_##size \ | 92 | int pci_user_read_config_##size \ |
77 | (struct pci_dev *dev, int pos, type *val) \ | 93 | (struct pci_dev *dev, int pos, type *val) \ |
78 | { \ | 94 | { \ |
79 | unsigned long flags; \ | ||
80 | int ret = 0; \ | 95 | int ret = 0; \ |
81 | u32 data = -1; \ | 96 | u32 data = -1; \ |
82 | if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ | 97 | if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ |
83 | spin_lock_irqsave(&pci_lock, flags); \ | 98 | spin_lock_irq(&pci_lock); \ |
84 | if (likely(!dev->block_ucfg_access)) \ | 99 | if (unlikely(dev->block_ucfg_access)) pci_wait_ucfg(dev); \ |
85 | ret = dev->bus->ops->read(dev->bus, dev->devfn, \ | 100 | ret = dev->bus->ops->read(dev->bus, dev->devfn, \ |
86 | pos, sizeof(type), &data); \ | 101 | pos, sizeof(type), &data); \ |
87 | else if (pos < sizeof(dev->saved_config_space)) \ | 102 | spin_unlock_irq(&pci_lock); \ |
88 | data = pci_user_cached_config(dev, pos); \ | ||
89 | spin_unlock_irqrestore(&pci_lock, flags); \ | ||
90 | *val = (type)data; \ | 103 | *val = (type)data; \ |
91 | return ret; \ | 104 | return ret; \ |
92 | } | 105 | } |
@@ -95,14 +108,13 @@ int pci_user_read_config_##size \ | |||
95 | int pci_user_write_config_##size \ | 108 | int pci_user_write_config_##size \ |
96 | (struct pci_dev *dev, int pos, type val) \ | 109 | (struct pci_dev *dev, int pos, type val) \ |
97 | { \ | 110 | { \ |
98 | unsigned long flags; \ | ||
99 | int ret = -EIO; \ | 111 | int ret = -EIO; \ |
100 | if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ | 112 | if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \ |
101 | spin_lock_irqsave(&pci_lock, flags); \ | 113 | spin_lock_irq(&pci_lock); \ |
102 | if (likely(!dev->block_ucfg_access)) \ | 114 | if (unlikely(dev->block_ucfg_access)) pci_wait_ucfg(dev); \ |
103 | ret = dev->bus->ops->write(dev->bus, dev->devfn, \ | 115 | ret = dev->bus->ops->write(dev->bus, dev->devfn, \ |
104 | pos, sizeof(type), val); \ | 116 | pos, sizeof(type), val); \ |
105 | spin_unlock_irqrestore(&pci_lock, flags); \ | 117 | spin_unlock_irq(&pci_lock); \ |
106 | return ret; \ | 118 | return ret; \ |
107 | } | 119 | } |
108 | 120 | ||
@@ -117,21 +129,23 @@ PCI_USER_WRITE_CONFIG(dword, u32) | |||
117 | * pci_block_user_cfg_access - Block userspace PCI config reads/writes | 129 | * pci_block_user_cfg_access - Block userspace PCI config reads/writes |
118 | * @dev: pci device struct | 130 | * @dev: pci device struct |
119 | * | 131 | * |
120 | * This function blocks any userspace PCI config accesses from occurring. | 132 | * When user access is blocked, any reads or writes to config space will |
121 | * When blocked, any writes will be bit bucketed and reads will return the | 133 | * sleep until access is unblocked again. We don't allow nesting of |
122 | * data saved using pci_save_state for the first 64 bytes of config | 134 | * block/unblock calls. |
123 | * space and return 0xff for all other config reads. | 135 | */ |
124 | **/ | ||
125 | void pci_block_user_cfg_access(struct pci_dev *dev) | 136 | void pci_block_user_cfg_access(struct pci_dev *dev) |
126 | { | 137 | { |
127 | unsigned long flags; | 138 | unsigned long flags; |
139 | int was_blocked; | ||
128 | 140 | ||
129 | pci_save_state(dev); | ||
130 | |||
131 | /* spinlock to synchronize with anyone reading config space now */ | ||
132 | spin_lock_irqsave(&pci_lock, flags); | 141 | spin_lock_irqsave(&pci_lock, flags); |
142 | was_blocked = dev->block_ucfg_access; | ||
133 | dev->block_ucfg_access = 1; | 143 | dev->block_ucfg_access = 1; |
134 | spin_unlock_irqrestore(&pci_lock, flags); | 144 | spin_unlock_irqrestore(&pci_lock, flags); |
145 | |||
146 | /* If we BUG() inside the pci_lock, we're guaranteed to hose | ||
147 | * the machine */ | ||
148 | BUG_ON(was_blocked); | ||
135 | } | 149 | } |
136 | EXPORT_SYMBOL_GPL(pci_block_user_cfg_access); | 150 | EXPORT_SYMBOL_GPL(pci_block_user_cfg_access); |
137 | 151 | ||
@@ -140,14 +154,19 @@ EXPORT_SYMBOL_GPL(pci_block_user_cfg_access); | |||
140 | * @dev: pci device struct | 154 | * @dev: pci device struct |
141 | * | 155 | * |
142 | * This function allows userspace PCI config accesses to resume. | 156 | * This function allows userspace PCI config accesses to resume. |
143 | **/ | 157 | */ |
144 | void pci_unblock_user_cfg_access(struct pci_dev *dev) | 158 | void pci_unblock_user_cfg_access(struct pci_dev *dev) |
145 | { | 159 | { |
146 | unsigned long flags; | 160 | unsigned long flags; |
147 | 161 | ||
148 | /* spinlock to synchronize with anyone reading saved config space */ | ||
149 | spin_lock_irqsave(&pci_lock, flags); | 162 | spin_lock_irqsave(&pci_lock, flags); |
163 | |||
164 | /* This indicates a problem in the caller, but we don't need | ||
165 | * to kill them, unlike a double-block above. */ | ||
166 | WARN_ON(!dev->block_ucfg_access); | ||
167 | |||
150 | dev->block_ucfg_access = 0; | 168 | dev->block_ucfg_access = 0; |
169 | wake_up_all(&pci_ucfg_wait); | ||
151 | spin_unlock_irqrestore(&pci_lock, flags); | 170 | spin_unlock_irqrestore(&pci_lock, flags); |
152 | } | 171 | } |
153 | EXPORT_SYMBOL_GPL(pci_unblock_user_cfg_access); | 172 | EXPORT_SYMBOL_GPL(pci_unblock_user_cfg_access); |
diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h index 59c5b242d86d..ddbadd95387e 100644 --- a/drivers/pci/hotplug/acpiphp.h +++ b/drivers/pci/hotplug/acpiphp.h | |||
@@ -62,10 +62,10 @@ struct acpiphp_slot; | |||
62 | struct slot { | 62 | struct slot { |
63 | struct hotplug_slot *hotplug_slot; | 63 | struct hotplug_slot *hotplug_slot; |
64 | struct acpiphp_slot *acpi_slot; | 64 | struct acpiphp_slot *acpi_slot; |
65 | struct hotplug_slot_info info; | ||
66 | char name[SLOT_NAME_SIZE]; | ||
65 | }; | 67 | }; |
66 | 68 | ||
67 | |||
68 | |||
69 | /** | 69 | /** |
70 | * struct acpiphp_bridge - PCI bridge information | 70 | * struct acpiphp_bridge - PCI bridge information |
71 | * | 71 | * |
diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index c57d9d5ce84e..40c79b03c7ef 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c | |||
@@ -303,25 +303,15 @@ static int __init init_acpi(void) | |||
303 | /* read initial number of slots */ | 303 | /* read initial number of slots */ |
304 | if (!retval) { | 304 | if (!retval) { |
305 | num_slots = acpiphp_get_num_slots(); | 305 | num_slots = acpiphp_get_num_slots(); |
306 | if (num_slots == 0) | 306 | if (num_slots == 0) { |
307 | acpiphp_glue_exit(); | ||
307 | retval = -ENODEV; | 308 | retval = -ENODEV; |
309 | } | ||
308 | } | 310 | } |
309 | 311 | ||
310 | return retval; | 312 | return retval; |
311 | } | 313 | } |
312 | 314 | ||
313 | |||
314 | /** | ||
315 | * make_slot_name - make a slot name that appears in pcihpfs | ||
316 | * @slot: slot to name | ||
317 | * | ||
318 | */ | ||
319 | static void make_slot_name(struct slot *slot) | ||
320 | { | ||
321 | snprintf(slot->hotplug_slot->name, SLOT_NAME_SIZE, "%u", | ||
322 | slot->acpi_slot->sun); | ||
323 | } | ||
324 | |||
325 | /** | 315 | /** |
326 | * release_slot - free up the memory used by a slot | 316 | * release_slot - free up the memory used by a slot |
327 | * @hotplug_slot: slot to free | 317 | * @hotplug_slot: slot to free |
@@ -332,8 +322,6 @@ static void release_slot(struct hotplug_slot *hotplug_slot) | |||
332 | 322 | ||
333 | dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); | 323 | dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); |
334 | 324 | ||
335 | kfree(slot->hotplug_slot->info); | ||
336 | kfree(slot->hotplug_slot->name); | ||
337 | kfree(slot->hotplug_slot); | 325 | kfree(slot->hotplug_slot); |
338 | kfree(slot); | 326 | kfree(slot); |
339 | } | 327 | } |
@@ -342,26 +330,19 @@ static void release_slot(struct hotplug_slot *hotplug_slot) | |||
342 | int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot) | 330 | int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot) |
343 | { | 331 | { |
344 | struct slot *slot; | 332 | struct slot *slot; |
345 | struct hotplug_slot *hotplug_slot; | ||
346 | struct hotplug_slot_info *hotplug_slot_info; | ||
347 | int retval = -ENOMEM; | 333 | int retval = -ENOMEM; |
348 | 334 | ||
349 | slot = kzalloc(sizeof(*slot), GFP_KERNEL); | 335 | slot = kzalloc(sizeof(*slot), GFP_KERNEL); |
350 | if (!slot) | 336 | if (!slot) |
351 | goto error; | 337 | goto error; |
352 | 338 | ||
353 | slot->hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL); | 339 | slot->hotplug_slot = kzalloc(sizeof(*slot->hotplug_slot), GFP_KERNEL); |
354 | if (!slot->hotplug_slot) | 340 | if (!slot->hotplug_slot) |
355 | goto error_slot; | 341 | goto error_slot; |
356 | 342 | ||
357 | slot->hotplug_slot->info = kzalloc(sizeof(*hotplug_slot_info), | 343 | slot->hotplug_slot->info = &slot->info; |
358 | GFP_KERNEL); | ||
359 | if (!slot->hotplug_slot->info) | ||
360 | goto error_hpslot; | ||
361 | 344 | ||
362 | slot->hotplug_slot->name = kzalloc(SLOT_NAME_SIZE, GFP_KERNEL); | 345 | slot->hotplug_slot->name = slot->name; |
363 | if (!slot->hotplug_slot->name) | ||
364 | goto error_info; | ||
365 | 346 | ||
366 | slot->hotplug_slot->private = slot; | 347 | slot->hotplug_slot->private = slot; |
367 | slot->hotplug_slot->release = &release_slot; | 348 | slot->hotplug_slot->release = &release_slot; |
@@ -376,21 +357,17 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot) | |||
376 | slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; | 357 | slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN; |
377 | 358 | ||
378 | acpiphp_slot->slot = slot; | 359 | acpiphp_slot->slot = slot; |
379 | make_slot_name(slot); | 360 | snprintf(slot->name, sizeof(slot->name), "%u", slot->acpi_slot->sun); |
380 | 361 | ||
381 | retval = pci_hp_register(slot->hotplug_slot); | 362 | retval = pci_hp_register(slot->hotplug_slot); |
382 | if (retval) { | 363 | if (retval) { |
383 | err("pci_hp_register failed with error %d\n", retval); | 364 | err("pci_hp_register failed with error %d\n", retval); |
384 | goto error_name; | 365 | goto error_hpslot; |
385 | } | 366 | } |
386 | 367 | ||
387 | info("Slot [%s] registered\n", slot->hotplug_slot->name); | 368 | info("Slot [%s] registered\n", slot->hotplug_slot->name); |
388 | 369 | ||
389 | return 0; | 370 | return 0; |
390 | error_name: | ||
391 | kfree(slot->hotplug_slot->name); | ||
392 | error_info: | ||
393 | kfree(slot->hotplug_slot->info); | ||
394 | error_hpslot: | 371 | error_hpslot: |
395 | kfree(slot->hotplug_slot); | 372 | kfree(slot->hotplug_slot); |
396 | error_slot: | 373 | error_slot: |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 16167b016266..0b9d0db1590a 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -1693,14 +1693,10 @@ void __exit acpiphp_glue_exit(void) | |||
1693 | */ | 1693 | */ |
1694 | int __init acpiphp_get_num_slots(void) | 1694 | int __init acpiphp_get_num_slots(void) |
1695 | { | 1695 | { |
1696 | struct list_head *node; | ||
1697 | struct acpiphp_bridge *bridge; | 1696 | struct acpiphp_bridge *bridge; |
1698 | int num_slots; | 1697 | int num_slots = 0; |
1699 | |||
1700 | num_slots = 0; | ||
1701 | 1698 | ||
1702 | list_for_each (node, &bridge_list) { | 1699 | list_for_each_entry (bridge, &bridge_list, list) { |
1703 | bridge = (struct acpiphp_bridge *)node; | ||
1704 | dbg("Bus %04x:%02x has %d slot%s\n", | 1700 | dbg("Bus %04x:%02x has %d slot%s\n", |
1705 | pci_domain_nr(bridge->pci_bus), | 1701 | pci_domain_nr(bridge->pci_bus), |
1706 | bridge->pci_bus->number, bridge->nr_slots, | 1702 | bridge->pci_bus->number, bridge->nr_slots, |
diff --git a/drivers/pci/hotplug/ibmphp_hpc.c b/drivers/pci/hotplug/ibmphp_hpc.c index c3ac98a0a6a6..f55ac3885cb3 100644 --- a/drivers/pci/hotplug/ibmphp_hpc.c +++ b/drivers/pci/hotplug/ibmphp_hpc.c | |||
@@ -531,7 +531,7 @@ static u8 hpc_readcmdtoindex (u8 cmd, u8 index) | |||
531 | * | 531 | * |
532 | * Action: issue a READ command to HPC | 532 | * Action: issue a READ command to HPC |
533 | * | 533 | * |
534 | * Input: pslot - can not be NULL for READ_ALLSTAT | 534 | * Input: pslot - cannot be NULL for READ_ALLSTAT |
535 | * pstatus - can be NULL for READ_ALLSTAT | 535 | * pstatus - can be NULL for READ_ALLSTAT |
536 | * | 536 | * |
537 | * Return 0 or error codes | 537 | * Return 0 or error codes |
diff --git a/drivers/pci/hotplug/ibmphp_pci.c b/drivers/pci/hotplug/ibmphp_pci.c index d87a9e3eaeeb..d8f05d7a3c72 100644 --- a/drivers/pci/hotplug/ibmphp_pci.c +++ b/drivers/pci/hotplug/ibmphp_pci.c | |||
@@ -1371,12 +1371,12 @@ static int unconfigure_boot_bridge (u8 busno, u8 device, u8 function) | |||
1371 | } | 1371 | } |
1372 | 1372 | ||
1373 | bus = ibmphp_find_res_bus (sec_number); | 1373 | bus = ibmphp_find_res_bus (sec_number); |
1374 | debug ("bus->busno is %x\n", bus->busno); | ||
1375 | debug ("sec_number is %x\n", sec_number); | ||
1376 | if (!bus) { | 1374 | if (!bus) { |
1377 | err ("cannot find Bus structure for the bridged device\n"); | 1375 | err ("cannot find Bus structure for the bridged device\n"); |
1378 | return -EINVAL; | 1376 | return -EINVAL; |
1379 | } | 1377 | } |
1378 | debug("bus->busno is %x\n", bus->busno); | ||
1379 | debug("sec_number is %x\n", sec_number); | ||
1380 | 1380 | ||
1381 | ibmphp_remove_bus (bus, busno); | 1381 | ibmphp_remove_bus (bus, busno); |
1382 | 1382 | ||
diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c index f93e81e2d2c7..f13f31323e85 100644 --- a/drivers/pci/hotplug/pciehp_core.c +++ b/drivers/pci/hotplug/pciehp_core.c | |||
@@ -521,14 +521,9 @@ static void __exit unload_pciehpd(void) | |||
521 | 521 | ||
522 | } | 522 | } |
523 | 523 | ||
524 | static int hpdriver_context = 0; | ||
525 | |||
526 | static void pciehp_remove (struct pcie_device *device) | 524 | static void pciehp_remove (struct pcie_device *device) |
527 | { | 525 | { |
528 | printk("%s ENTRY\n", __FUNCTION__); | 526 | /* XXX - Needs to be adapted to device driver model */ |
529 | printk("%s -> Call free_irq for irq = %d\n", | ||
530 | __FUNCTION__, device->irq); | ||
531 | free_irq(device->irq, &hpdriver_context); | ||
532 | } | 527 | } |
533 | 528 | ||
534 | #ifdef CONFIG_PM | 529 | #ifdef CONFIG_PM |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 1c551c697c35..6d3f580f2666 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
@@ -718,8 +718,6 @@ static void hpc_release_ctlr(struct controller *ctrl) | |||
718 | if (php_ctlr->irq) { | 718 | if (php_ctlr->irq) { |
719 | free_irq(php_ctlr->irq, ctrl); | 719 | free_irq(php_ctlr->irq, ctrl); |
720 | php_ctlr->irq = 0; | 720 | php_ctlr->irq = 0; |
721 | if (!pcie_mch_quirk) | ||
722 | pci_disable_msi(php_ctlr->pci_dev); | ||
723 | } | 721 | } |
724 | } | 722 | } |
725 | if (php_ctlr->pci_dev) | 723 | if (php_ctlr->pci_dev) |
diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c index 46825fee3ae4..72383467a0d5 100644 --- a/drivers/pci/hotplug/rpadlpar_core.c +++ b/drivers/pci/hotplug/rpadlpar_core.c | |||
@@ -63,7 +63,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name, | |||
63 | char *type; | 63 | char *type; |
64 | int rc; | 64 | int rc; |
65 | 65 | ||
66 | while ((np = of_find_node_by_type(np, "pci"))) { | 66 | while ((np = of_find_node_by_name(np, "pci"))) { |
67 | rc = rpaphp_get_drc_props(np, NULL, &name, &type, NULL); | 67 | rc = rpaphp_get_drc_props(np, NULL, &name, &type, NULL); |
68 | if (rc == 0) | 68 | if (rc == 0) |
69 | if (!strcmp(drc_name, name) && !strcmp(drc_type, type)) | 69 | if (!strcmp(drc_name, name) && !strcmp(drc_type, type)) |
diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c index 141486df235b..71a2cb8baa4a 100644 --- a/drivers/pci/hotplug/rpaphp_core.c +++ b/drivers/pci/hotplug/rpaphp_core.c | |||
@@ -356,7 +356,7 @@ static int __init rpaphp_init(void) | |||
356 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); | 356 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); |
357 | init_MUTEX(&rpaphp_sem); | 357 | init_MUTEX(&rpaphp_sem); |
358 | 358 | ||
359 | while ((dn = of_find_node_by_type(dn, "pci"))) | 359 | while ((dn = of_find_node_by_name(dn, "pci"))) |
360 | rpaphp_add_slot(dn); | 360 | rpaphp_add_slot(dn); |
361 | 361 | ||
362 | return 0; | 362 | return 0; |
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index b62ad31a9739..5d188c558386 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c | |||
@@ -205,21 +205,6 @@ static struct hotplug_slot * sn_hp_destroy(void) | |||
205 | return bss_hotplug_slot; | 205 | return bss_hotplug_slot; |
206 | } | 206 | } |
207 | 207 | ||
208 | static void sn_bus_alloc_data(struct pci_dev *dev) | ||
209 | { | ||
210 | struct pci_bus *subordinate_bus; | ||
211 | struct pci_dev *child; | ||
212 | |||
213 | sn_pci_fixup_slot(dev); | ||
214 | |||
215 | /* Recursively sets up the sn_irq_info structs */ | ||
216 | if (dev->subordinate) { | ||
217 | subordinate_bus = dev->subordinate; | ||
218 | list_for_each_entry(child, &subordinate_bus->devices, bus_list) | ||
219 | sn_bus_alloc_data(child); | ||
220 | } | ||
221 | } | ||
222 | |||
223 | static void sn_bus_free_data(struct pci_dev *dev) | 208 | static void sn_bus_free_data(struct pci_dev *dev) |
224 | { | 209 | { |
225 | struct pci_bus *subordinate_bus; | 210 | struct pci_bus *subordinate_bus; |
@@ -337,6 +322,11 @@ static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, | |||
337 | return rc; | 322 | return rc; |
338 | } | 323 | } |
339 | 324 | ||
325 | /* | ||
326 | * Power up and configure the slot via a SAL call to PROM. | ||
327 | * Scan slot (and any children), do any platform specific fixup, | ||
328 | * and find device driver. | ||
329 | */ | ||
340 | static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | 330 | static int enable_slot(struct hotplug_slot *bss_hotplug_slot) |
341 | { | 331 | { |
342 | struct slot *slot = bss_hotplug_slot->private; | 332 | struct slot *slot = bss_hotplug_slot->private; |
@@ -345,6 +335,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
345 | int func, num_funcs; | 335 | int func, num_funcs; |
346 | int new_ppb = 0; | 336 | int new_ppb = 0; |
347 | int rc; | 337 | int rc; |
338 | void pcibios_fixup_device_resources(struct pci_dev *); | ||
348 | 339 | ||
349 | /* Serialize the Linux PCI infrastructure */ | 340 | /* Serialize the Linux PCI infrastructure */ |
350 | mutex_lock(&sn_hotplug_mutex); | 341 | mutex_lock(&sn_hotplug_mutex); |
@@ -367,9 +358,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
367 | return -ENODEV; | 358 | return -ENODEV; |
368 | } | 359 | } |
369 | 360 | ||
370 | sn_pci_controller_fixup(pci_domain_nr(slot->pci_bus), | ||
371 | slot->pci_bus->number, | ||
372 | slot->pci_bus); | ||
373 | /* | 361 | /* |
374 | * Map SN resources for all functions on the card | 362 | * Map SN resources for all functions on the card |
375 | * to the Linux PCI interface and tell the drivers | 363 | * to the Linux PCI interface and tell the drivers |
@@ -380,6 +368,13 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
380 | PCI_DEVFN(slot->device_num + 1, | 368 | PCI_DEVFN(slot->device_num + 1, |
381 | PCI_FUNC(func))); | 369 | PCI_FUNC(func))); |
382 | if (dev) { | 370 | if (dev) { |
371 | /* Need to do slot fixup on PPB before fixup of children | ||
372 | * (PPB's pcidev_info needs to be in pcidev_info list | ||
373 | * before child's SN_PCIDEV_INFO() call to setup | ||
374 | * pdi_host_pcidev_info). | ||
375 | */ | ||
376 | pcibios_fixup_device_resources(dev); | ||
377 | sn_pci_fixup_slot(dev); | ||
383 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | 378 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { |
384 | unsigned char sec_bus; | 379 | unsigned char sec_bus; |
385 | pci_read_config_byte(dev, PCI_SECONDARY_BUS, | 380 | pci_read_config_byte(dev, PCI_SECONDARY_BUS, |
@@ -387,12 +382,8 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
387 | new_bus = pci_add_new_bus(dev->bus, dev, | 382 | new_bus = pci_add_new_bus(dev->bus, dev, |
388 | sec_bus); | 383 | sec_bus); |
389 | pci_scan_child_bus(new_bus); | 384 | pci_scan_child_bus(new_bus); |
390 | sn_pci_controller_fixup(pci_domain_nr(new_bus), | ||
391 | new_bus->number, | ||
392 | new_bus); | ||
393 | new_ppb = 1; | 385 | new_ppb = 1; |
394 | } | 386 | } |
395 | sn_bus_alloc_data(dev); | ||
396 | pci_dev_put(dev); | 387 | pci_dev_put(dev); |
397 | } | 388 | } |
398 | } | 389 | } |
diff --git a/drivers/pci/msi.h b/drivers/pci/msi.h index f0cca1772f9c..3898f5237144 100644 --- a/drivers/pci/msi.h +++ b/drivers/pci/msi.h | |||
@@ -6,14 +6,6 @@ | |||
6 | #ifndef MSI_H | 6 | #ifndef MSI_H |
7 | #define MSI_H | 7 | #define MSI_H |
8 | 8 | ||
9 | /* | ||
10 | * MSI-X Address Register | ||
11 | */ | ||
12 | #define PCI_MSIX_FLAGS_QSIZE 0x7FF | ||
13 | #define PCI_MSIX_FLAGS_ENABLE (1 << 15) | ||
14 | #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) | ||
15 | #define PCI_MSIX_FLAGS_BITMASK (1 << 0) | ||
16 | |||
17 | #define PCI_MSIX_ENTRY_SIZE 16 | 9 | #define PCI_MSIX_ENTRY_SIZE 16 |
18 | #define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET 0 | 10 | #define PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET 0 |
19 | #define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET 4 | 11 | #define PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET 4 |
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index bb7456c1dbac..a064f36a0805 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -36,6 +36,7 @@ acpi_query_osc ( | |||
36 | struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL}; | 36 | struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL}; |
37 | union acpi_object *out_obj; | 37 | union acpi_object *out_obj; |
38 | u32 osc_dw0; | 38 | u32 osc_dw0; |
39 | acpi_status *ret_status = (acpi_status *)retval; | ||
39 | 40 | ||
40 | 41 | ||
41 | /* Setting up input parameters */ | 42 | /* Setting up input parameters */ |
@@ -56,6 +57,7 @@ acpi_query_osc ( | |||
56 | if (ACPI_FAILURE (status)) { | 57 | if (ACPI_FAILURE (status)) { |
57 | printk(KERN_DEBUG | 58 | printk(KERN_DEBUG |
58 | "Evaluate _OSC Set fails. Status = 0x%04x\n", status); | 59 | "Evaluate _OSC Set fails. Status = 0x%04x\n", status); |
60 | *ret_status = status; | ||
59 | return status; | 61 | return status; |
60 | } | 62 | } |
61 | out_obj = output.pointer; | 63 | out_obj = output.pointer; |
@@ -90,6 +92,7 @@ acpi_query_osc ( | |||
90 | 92 | ||
91 | query_osc_out: | 93 | query_osc_out: |
92 | kfree(output.pointer); | 94 | kfree(output.pointer); |
95 | *ret_status = status; | ||
93 | return status; | 96 | return status; |
94 | } | 97 | } |
95 | 98 | ||
@@ -166,6 +169,7 @@ run_osc_out: | |||
166 | acpi_status pci_osc_support_set(u32 flags) | 169 | acpi_status pci_osc_support_set(u32 flags) |
167 | { | 170 | { |
168 | u32 temp; | 171 | u32 temp; |
172 | acpi_status retval; | ||
169 | 173 | ||
170 | if (!(flags & OSC_SUPPORT_MASKS)) { | 174 | if (!(flags & OSC_SUPPORT_MASKS)) { |
171 | return AE_TYPE; | 175 | return AE_TYPE; |
@@ -179,9 +183,13 @@ acpi_status pci_osc_support_set(u32 flags) | |||
179 | acpi_get_devices ( PCI_ROOT_HID_STRING, | 183 | acpi_get_devices ( PCI_ROOT_HID_STRING, |
180 | acpi_query_osc, | 184 | acpi_query_osc, |
181 | ctrlset_buf, | 185 | ctrlset_buf, |
182 | NULL ); | 186 | (void **) &retval ); |
183 | ctrlset_buf[OSC_QUERY_TYPE] = !OSC_QUERY_ENABLE; | 187 | ctrlset_buf[OSC_QUERY_TYPE] = !OSC_QUERY_ENABLE; |
184 | ctrlset_buf[OSC_CONTROL_TYPE] = temp; | 188 | ctrlset_buf[OSC_CONTROL_TYPE] = temp; |
189 | if (ACPI_FAILURE(retval)) { | ||
190 | /* no osc support at all */ | ||
191 | ctrlset_buf[OSC_SUPPORT_TYPE] = 0; | ||
192 | } | ||
185 | return AE_OK; | 193 | return AE_OK; |
186 | } | 194 | } |
187 | EXPORT_SYMBOL(pci_osc_support_set); | 195 | EXPORT_SYMBOL(pci_osc_support_set); |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 194f1d21d3d7..e5ae3a0c13bb 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -329,8 +329,8 @@ static int pci_default_resume(struct pci_dev *pci_dev) | |||
329 | /* restore the PCI config space */ | 329 | /* restore the PCI config space */ |
330 | pci_restore_state(pci_dev); | 330 | pci_restore_state(pci_dev); |
331 | /* if the device was enabled before suspend, reenable */ | 331 | /* if the device was enabled before suspend, reenable */ |
332 | if (pci_dev->is_enabled) | 332 | if (atomic_read(&pci_dev->enable_cnt)) |
333 | retval = pci_enable_device(pci_dev); | 333 | retval = __pci_enable_device(pci_dev); |
334 | /* if the device was busmaster before the suspend, make it busmaster again */ | 334 | /* if the device was busmaster before the suspend, make it busmaster again */ |
335 | if (pci_dev->is_busmaster) | 335 | if (pci_dev->is_busmaster) |
336 | pci_set_master(pci_dev); | 336 | pci_set_master(pci_dev); |
@@ -445,9 +445,12 @@ int __pci_register_driver(struct pci_driver *drv, struct module *owner) | |||
445 | 445 | ||
446 | /* register with core */ | 446 | /* register with core */ |
447 | error = driver_register(&drv->driver); | 447 | error = driver_register(&drv->driver); |
448 | if (error) | ||
449 | return error; | ||
448 | 450 | ||
449 | if (!error) | 451 | error = pci_create_newid_file(drv); |
450 | error = pci_create_newid_file(drv); | 452 | if (error) |
453 | driver_unregister(&drv->driver); | ||
451 | 454 | ||
452 | return error; | 455 | return error; |
453 | } | 456 | } |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index f952bfea48a6..7a94076752d0 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -42,7 +42,6 @@ pci_config_attr(subsystem_vendor, "0x%04x\n"); | |||
42 | pci_config_attr(subsystem_device, "0x%04x\n"); | 42 | pci_config_attr(subsystem_device, "0x%04x\n"); |
43 | pci_config_attr(class, "0x%06x\n"); | 43 | pci_config_attr(class, "0x%06x\n"); |
44 | pci_config_attr(irq, "%u\n"); | 44 | pci_config_attr(irq, "%u\n"); |
45 | pci_config_attr(is_enabled, "%u\n"); | ||
46 | 45 | ||
47 | static ssize_t broken_parity_status_show(struct device *dev, | 46 | static ssize_t broken_parity_status_show(struct device *dev, |
48 | struct device_attribute *attr, | 47 | struct device_attribute *attr, |
@@ -112,26 +111,36 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, | |||
112 | (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8), | 111 | (u8)(pci_dev->class >> 16), (u8)(pci_dev->class >> 8), |
113 | (u8)(pci_dev->class)); | 112 | (u8)(pci_dev->class)); |
114 | } | 113 | } |
115 | static ssize_t | 114 | |
116 | is_enabled_store(struct device *dev, struct device_attribute *attr, | 115 | static ssize_t is_enabled_store(struct device *dev, |
117 | const char *buf, size_t count) | 116 | struct device_attribute *attr, const char *buf, |
117 | size_t count) | ||
118 | { | 118 | { |
119 | ssize_t result = -EINVAL; | ||
119 | struct pci_dev *pdev = to_pci_dev(dev); | 120 | struct pci_dev *pdev = to_pci_dev(dev); |
120 | int retval = 0; | ||
121 | 121 | ||
122 | /* this can crash the machine when done on the "wrong" device */ | 122 | /* this can crash the machine when done on the "wrong" device */ |
123 | if (!capable(CAP_SYS_ADMIN)) | 123 | if (!capable(CAP_SYS_ADMIN)) |
124 | return count; | 124 | return count; |
125 | 125 | ||
126 | if (*buf == '0') | 126 | if (*buf == '0') { |
127 | pci_disable_device(pdev); | 127 | if (atomic_read(&pdev->enable_cnt) != 0) |
128 | pci_disable_device(pdev); | ||
129 | else | ||
130 | result = -EIO; | ||
131 | } else if (*buf == '1') | ||
132 | result = pci_enable_device(pdev); | ||
133 | |||
134 | return result < 0 ? result : count; | ||
135 | } | ||
128 | 136 | ||
129 | if (*buf == '1') | 137 | static ssize_t is_enabled_show(struct device *dev, |
130 | retval = pci_enable_device(pdev); | 138 | struct device_attribute *attr, char *buf) |
139 | { | ||
140 | struct pci_dev *pdev; | ||
131 | 141 | ||
132 | if (retval) | 142 | pdev = to_pci_dev (dev); |
133 | return retval; | 143 | return sprintf (buf, "%u\n", atomic_read(&pdev->enable_cnt)); |
134 | return count; | ||
135 | } | 144 | } |
136 | 145 | ||
137 | static ssize_t | 146 | static ssize_t |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index a544997399b3..5a14b73cf3a1 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -490,6 +490,47 @@ static void pci_restore_pcie_state(struct pci_dev *dev) | |||
490 | kfree(save_state); | 490 | kfree(save_state); |
491 | } | 491 | } |
492 | 492 | ||
493 | |||
494 | static int pci_save_pcix_state(struct pci_dev *dev) | ||
495 | { | ||
496 | int pos, i = 0; | ||
497 | struct pci_cap_saved_state *save_state; | ||
498 | u16 *cap; | ||
499 | |||
500 | pos = pci_find_capability(dev, PCI_CAP_ID_PCIX); | ||
501 | if (pos <= 0) | ||
502 | return 0; | ||
503 | |||
504 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL); | ||
505 | if (!save_state) { | ||
506 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | ||
507 | return -ENOMEM; | ||
508 | } | ||
509 | cap = (u16 *)&save_state->data[0]; | ||
510 | |||
511 | pci_read_config_word(dev, pos + PCI_X_CMD, &cap[i++]); | ||
512 | pci_add_saved_cap(dev, save_state); | ||
513 | return 0; | ||
514 | } | ||
515 | |||
516 | static void pci_restore_pcix_state(struct pci_dev *dev) | ||
517 | { | ||
518 | int i = 0, pos; | ||
519 | struct pci_cap_saved_state *save_state; | ||
520 | u16 *cap; | ||
521 | |||
522 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_PCIX); | ||
523 | pos = pci_find_capability(dev, PCI_CAP_ID_PCIX); | ||
524 | if (!save_state || pos <= 0) | ||
525 | return; | ||
526 | cap = (u16 *)&save_state->data[0]; | ||
527 | |||
528 | pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]); | ||
529 | pci_remove_saved_cap(save_state); | ||
530 | kfree(save_state); | ||
531 | } | ||
532 | |||
533 | |||
493 | /** | 534 | /** |
494 | * pci_save_state - save the PCI configuration space of a device before suspending | 535 | * pci_save_state - save the PCI configuration space of a device before suspending |
495 | * @dev: - PCI device that we're dealing with | 536 | * @dev: - PCI device that we're dealing with |
@@ -507,6 +548,8 @@ pci_save_state(struct pci_dev *dev) | |||
507 | return i; | 548 | return i; |
508 | if ((i = pci_save_pcie_state(dev)) != 0) | 549 | if ((i = pci_save_pcie_state(dev)) != 0) |
509 | return i; | 550 | return i; |
551 | if ((i = pci_save_pcix_state(dev)) != 0) | ||
552 | return i; | ||
510 | return 0; | 553 | return 0; |
511 | } | 554 | } |
512 | 555 | ||
@@ -538,6 +581,7 @@ pci_restore_state(struct pci_dev *dev) | |||
538 | dev->saved_config_space[i]); | 581 | dev->saved_config_space[i]); |
539 | } | 582 | } |
540 | } | 583 | } |
584 | pci_restore_pcix_state(dev); | ||
541 | pci_restore_msi_state(dev); | 585 | pci_restore_msi_state(dev); |
542 | pci_restore_msix_state(dev); | 586 | pci_restore_msix_state(dev); |
543 | return 0; | 587 | return 0; |
@@ -568,30 +612,51 @@ pci_enable_device_bars(struct pci_dev *dev, int bars) | |||
568 | } | 612 | } |
569 | 613 | ||
570 | /** | 614 | /** |
571 | * pci_enable_device - Initialize device before it's used by a driver. | 615 | * __pci_enable_device - Initialize device before it's used by a driver. |
572 | * @dev: PCI device to be initialized | 616 | * @dev: PCI device to be initialized |
573 | * | 617 | * |
574 | * Initialize device before it's used by a driver. Ask low-level code | 618 | * Initialize device before it's used by a driver. Ask low-level code |
575 | * to enable I/O and memory. Wake up the device if it was suspended. | 619 | * to enable I/O and memory. Wake up the device if it was suspended. |
576 | * Beware, this function can fail. | 620 | * Beware, this function can fail. |
621 | * | ||
622 | * Note this function is a backend and is not supposed to be called by | ||
623 | * normal code, use pci_enable_device() instead. | ||
577 | */ | 624 | */ |
578 | int | 625 | int |
579 | pci_enable_device(struct pci_dev *dev) | 626 | __pci_enable_device(struct pci_dev *dev) |
580 | { | 627 | { |
581 | int err; | 628 | int err; |
582 | 629 | ||
583 | if (dev->is_enabled) | ||
584 | return 0; | ||
585 | |||
586 | err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); | 630 | err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); |
587 | if (err) | 631 | if (err) |
588 | return err; | 632 | return err; |
589 | pci_fixup_device(pci_fixup_enable, dev); | 633 | pci_fixup_device(pci_fixup_enable, dev); |
590 | dev->is_enabled = 1; | ||
591 | return 0; | 634 | return 0; |
592 | } | 635 | } |
593 | 636 | ||
594 | /** | 637 | /** |
638 | * pci_enable_device - Initialize device before it's used by a driver. | ||
639 | * @dev: PCI device to be initialized | ||
640 | * | ||
641 | * Initialize device before it's used by a driver. Ask low-level code | ||
642 | * to enable I/O and memory. Wake up the device if it was suspended. | ||
643 | * Beware, this function can fail. | ||
644 | * | ||
645 | * Note we don't actually enable the device many times if we call | ||
646 | * this function repeatedly (we just increment the count). | ||
647 | */ | ||
648 | int pci_enable_device(struct pci_dev *dev) | ||
649 | { | ||
650 | int result; | ||
651 | if (atomic_add_return(1, &dev->enable_cnt) > 1) | ||
652 | return 0; /* already enabled */ | ||
653 | result = __pci_enable_device(dev); | ||
654 | if (result < 0) | ||
655 | atomic_dec(&dev->enable_cnt); | ||
656 | return result; | ||
657 | } | ||
658 | |||
659 | /** | ||
595 | * pcibios_disable_device - disable arch specific PCI resources for device dev | 660 | * pcibios_disable_device - disable arch specific PCI resources for device dev |
596 | * @dev: the PCI device to disable | 661 | * @dev: the PCI device to disable |
597 | * | 662 | * |
@@ -607,12 +672,18 @@ void __attribute__ ((weak)) pcibios_disable_device (struct pci_dev *dev) {} | |||
607 | * | 672 | * |
608 | * Signal to the system that the PCI device is not in use by the system | 673 | * Signal to the system that the PCI device is not in use by the system |
609 | * anymore. This only involves disabling PCI bus-mastering, if active. | 674 | * anymore. This only involves disabling PCI bus-mastering, if active. |
675 | * | ||
676 | * Note we don't actually disable the device until all callers of | ||
677 | * pci_device_enable() have called pci_device_disable(). | ||
610 | */ | 678 | */ |
611 | void | 679 | void |
612 | pci_disable_device(struct pci_dev *dev) | 680 | pci_disable_device(struct pci_dev *dev) |
613 | { | 681 | { |
614 | u16 pci_command; | 682 | u16 pci_command; |
615 | 683 | ||
684 | if (atomic_sub_return(1, &dev->enable_cnt) != 0) | ||
685 | return; | ||
686 | |||
616 | if (dev->msi_enabled) | 687 | if (dev->msi_enabled) |
617 | disable_msi_mode(dev, pci_find_capability(dev, PCI_CAP_ID_MSI), | 688 | disable_msi_mode(dev, pci_find_capability(dev, PCI_CAP_ID_MSI), |
618 | PCI_CAP_ID_MSI); | 689 | PCI_CAP_ID_MSI); |
@@ -628,7 +699,6 @@ pci_disable_device(struct pci_dev *dev) | |||
628 | dev->is_busmaster = 0; | 699 | dev->is_busmaster = 0; |
629 | 700 | ||
630 | pcibios_disable_device(dev); | 701 | pcibios_disable_device(dev); |
631 | dev->is_enabled = 0; | ||
632 | } | 702 | } |
633 | 703 | ||
634 | /** | 704 | /** |
@@ -831,22 +901,38 @@ pci_set_master(struct pci_dev *dev) | |||
831 | pcibios_set_master(dev); | 901 | pcibios_set_master(dev); |
832 | } | 902 | } |
833 | 903 | ||
834 | #ifndef HAVE_ARCH_PCI_MWI | 904 | #ifdef PCI_DISABLE_MWI |
905 | int pci_set_mwi(struct pci_dev *dev) | ||
906 | { | ||
907 | return 0; | ||
908 | } | ||
909 | |||
910 | void pci_clear_mwi(struct pci_dev *dev) | ||
911 | { | ||
912 | } | ||
913 | |||
914 | #else | ||
915 | |||
916 | #ifndef PCI_CACHE_LINE_BYTES | ||
917 | #define PCI_CACHE_LINE_BYTES L1_CACHE_BYTES | ||
918 | #endif | ||
919 | |||
835 | /* This can be overridden by arch code. */ | 920 | /* This can be overridden by arch code. */ |
836 | u8 pci_cache_line_size = L1_CACHE_BYTES >> 2; | 921 | /* Don't forget this is measured in 32-bit words, not bytes */ |
922 | u8 pci_cache_line_size = PCI_CACHE_LINE_BYTES / 4; | ||
837 | 923 | ||
838 | /** | 924 | /** |
839 | * pci_generic_prep_mwi - helper function for pci_set_mwi | 925 | * pci_set_cacheline_size - ensure the CACHE_LINE_SIZE register is programmed |
840 | * @dev: the PCI device for which MWI is enabled | 926 | * @dev: the PCI device for which MWI is to be enabled |
841 | * | 927 | * |
842 | * Helper function for generic implementation of pcibios_prep_mwi | 928 | * Helper function for pci_set_mwi. |
843 | * function. Originally copied from drivers/net/acenic.c. | 929 | * Originally copied from drivers/net/acenic.c. |
844 | * Copyright 1998-2001 by Jes Sorensen, <jes@trained-monkey.org>. | 930 | * Copyright 1998-2001 by Jes Sorensen, <jes@trained-monkey.org>. |
845 | * | 931 | * |
846 | * RETURNS: An appropriate -ERRNO error value on error, or zero for success. | 932 | * RETURNS: An appropriate -ERRNO error value on error, or zero for success. |
847 | */ | 933 | */ |
848 | static int | 934 | static int |
849 | pci_generic_prep_mwi(struct pci_dev *dev) | 935 | pci_set_cacheline_size(struct pci_dev *dev) |
850 | { | 936 | { |
851 | u8 cacheline_size; | 937 | u8 cacheline_size; |
852 | 938 | ||
@@ -872,7 +958,6 @@ pci_generic_prep_mwi(struct pci_dev *dev) | |||
872 | 958 | ||
873 | return -EINVAL; | 959 | return -EINVAL; |
874 | } | 960 | } |
875 | #endif /* !HAVE_ARCH_PCI_MWI */ | ||
876 | 961 | ||
877 | /** | 962 | /** |
878 | * pci_set_mwi - enables memory-write-invalidate PCI transaction | 963 | * pci_set_mwi - enables memory-write-invalidate PCI transaction |
@@ -890,12 +975,7 @@ pci_set_mwi(struct pci_dev *dev) | |||
890 | int rc; | 975 | int rc; |
891 | u16 cmd; | 976 | u16 cmd; |
892 | 977 | ||
893 | #ifdef HAVE_ARCH_PCI_MWI | 978 | rc = pci_set_cacheline_size(dev); |
894 | rc = pcibios_prep_mwi(dev); | ||
895 | #else | ||
896 | rc = pci_generic_prep_mwi(dev); | ||
897 | #endif | ||
898 | |||
899 | if (rc) | 979 | if (rc) |
900 | return rc; | 980 | return rc; |
901 | 981 | ||
@@ -926,6 +1006,7 @@ pci_clear_mwi(struct pci_dev *dev) | |||
926 | pci_write_config_word(dev, PCI_COMMAND, cmd); | 1006 | pci_write_config_word(dev, PCI_COMMAND, cmd); |
927 | } | 1007 | } |
928 | } | 1008 | } |
1009 | #endif /* ! PCI_DISABLE_MWI */ | ||
929 | 1010 | ||
930 | /** | 1011 | /** |
931 | * pci_intx - enables/disables PCI INTx for device dev | 1012 | * pci_intx - enables/disables PCI INTx for device dev |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 6bf327db5c5e..398852f526a6 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -1,5 +1,6 @@ | |||
1 | /* Functions internal to the PCI core code */ | 1 | /* Functions internal to the PCI core code */ |
2 | 2 | ||
3 | extern int __must_check __pci_enable_device(struct pci_dev *); | ||
3 | extern int pci_uevent(struct device *dev, char **envp, int num_envp, | 4 | extern int pci_uevent(struct device *dev, char **envp, int num_envp, |
4 | char *buffer, int buffer_size); | 5 | char *buffer, int buffer_size); |
5 | extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); | 6 | extern int pci_create_sysfs_dev_files(struct pci_dev *pdev); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index e159d6604494..0eeac60042b3 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -679,6 +679,33 @@ static int pci_setup_device(struct pci_dev * dev) | |||
679 | pci_read_bases(dev, 6, PCI_ROM_ADDRESS); | 679 | pci_read_bases(dev, 6, PCI_ROM_ADDRESS); |
680 | pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor); | 680 | pci_read_config_word(dev, PCI_SUBSYSTEM_VENDOR_ID, &dev->subsystem_vendor); |
681 | pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device); | 681 | pci_read_config_word(dev, PCI_SUBSYSTEM_ID, &dev->subsystem_device); |
682 | |||
683 | /* | ||
684 | * Do the ugly legacy mode stuff here rather than broken chip | ||
685 | * quirk code. Legacy mode ATA controllers have fixed | ||
686 | * addresses. These are not always echoed in BAR0-3, and | ||
687 | * BAR0-3 in a few cases contain junk! | ||
688 | */ | ||
689 | if (class == PCI_CLASS_STORAGE_IDE) { | ||
690 | u8 progif; | ||
691 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); | ||
692 | if ((progif & 1) == 0) { | ||
693 | dev->resource[0].start = 0x1F0; | ||
694 | dev->resource[0].end = 0x1F7; | ||
695 | dev->resource[0].flags = IORESOURCE_IO; | ||
696 | dev->resource[1].start = 0x3F6; | ||
697 | dev->resource[1].end = 0x3F6; | ||
698 | dev->resource[1].flags = IORESOURCE_IO; | ||
699 | } | ||
700 | if ((progif & 4) == 0) { | ||
701 | dev->resource[2].start = 0x170; | ||
702 | dev->resource[2].end = 0x177; | ||
703 | dev->resource[2].flags = IORESOURCE_IO; | ||
704 | dev->resource[3].start = 0x376; | ||
705 | dev->resource[3].end = 0x376; | ||
706 | dev->resource[3].flags = IORESOURCE_IO; | ||
707 | } | ||
708 | } | ||
682 | break; | 709 | break; |
683 | 710 | ||
684 | case PCI_HEADER_TYPE_BRIDGE: /* bridge header */ | 711 | case PCI_HEADER_TYPE_BRIDGE: /* bridge header */ |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 5b4483811691..9ca9b9bf6160 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -797,56 +797,6 @@ static void __init quirk_mediagx_master(struct pci_dev *dev) | |||
797 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master ); | 797 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master ); |
798 | 798 | ||
799 | /* | 799 | /* |
800 | * As per PCI spec, ignore base address registers 0-3 of the IDE controllers | ||
801 | * running in Compatible mode (bits 0 and 2 in the ProgIf for primary and | ||
802 | * secondary channels respectively). If the device reports Compatible mode | ||
803 | * but does use BAR0-3 for address decoding, we assume that firmware has | ||
804 | * programmed these BARs with standard values (0x1f0,0x3f4 and 0x170,0x374). | ||
805 | * Exceptions (if they exist) must be handled in chip/architecture specific | ||
806 | * fixups. | ||
807 | * | ||
808 | * Note: for non x86 people. You may need an arch specific quirk to handle | ||
809 | * moving IDE devices to native mode as well. Some plug in card devices power | ||
810 | * up in compatible mode and assume the BIOS will adjust them. | ||
811 | * | ||
812 | * Q: should we load the 0x1f0,0x3f4 into the registers or zap them as | ||
813 | * we do now ? We don't want is pci_enable_device to come along | ||
814 | * and assign new resources. Both approaches work for that. | ||
815 | */ | ||
816 | static void __devinit quirk_ide_bases(struct pci_dev *dev) | ||
817 | { | ||
818 | struct resource *res; | ||
819 | int first_bar = 2, last_bar = 0; | ||
820 | |||
821 | if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) | ||
822 | return; | ||
823 | |||
824 | res = &dev->resource[0]; | ||
825 | |||
826 | /* primary channel: ProgIf bit 0, BAR0, BAR1 */ | ||
827 | if (!(dev->class & 1) && (res[0].flags || res[1].flags)) { | ||
828 | res[0].start = res[0].end = res[0].flags = 0; | ||
829 | res[1].start = res[1].end = res[1].flags = 0; | ||
830 | first_bar = 0; | ||
831 | last_bar = 1; | ||
832 | } | ||
833 | |||
834 | /* secondary channel: ProgIf bit 2, BAR2, BAR3 */ | ||
835 | if (!(dev->class & 4) && (res[2].flags || res[3].flags)) { | ||
836 | res[2].start = res[2].end = res[2].flags = 0; | ||
837 | res[3].start = res[3].end = res[3].flags = 0; | ||
838 | last_bar = 3; | ||
839 | } | ||
840 | |||
841 | if (!last_bar) | ||
842 | return; | ||
843 | |||
844 | printk(KERN_INFO "PCI: Ignoring BAR%d-%d of IDE controller %s\n", | ||
845 | first_bar, last_bar, pci_name(dev)); | ||
846 | } | ||
847 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_ide_bases); | ||
848 | |||
849 | /* | ||
850 | * Ensure C0 rev restreaming is off. This is normally done by | 800 | * Ensure C0 rev restreaming is off. This is normally done by |
851 | * the BIOS but in the odd case it is not the results are corruption | 801 | * the BIOS but in the odd case it is not the results are corruption |
852 | * hence the presence of a Linux check | 802 | * hence the presence of a Linux check |
@@ -880,11 +830,10 @@ static void __devinit quirk_svwks_csb5ide(struct pci_dev *pdev) | |||
880 | prog &= ~5; | 830 | prog &= ~5; |
881 | pdev->class &= ~5; | 831 | pdev->class &= ~5; |
882 | pci_write_config_byte(pdev, PCI_CLASS_PROG, prog); | 832 | pci_write_config_byte(pdev, PCI_CLASS_PROG, prog); |
883 | /* need to re-assign BARs for compat mode */ | 833 | /* PCI layer will sort out resources */ |
884 | quirk_ide_bases(pdev); | ||
885 | } | 834 | } |
886 | } | 835 | } |
887 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, quirk_svwks_csb5ide ); | 836 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, quirk_svwks_csb5ide ); |
888 | 837 | ||
889 | /* | 838 | /* |
890 | * Intel 82801CAM ICH3-M datasheet says IDE modes must be the same | 839 | * Intel 82801CAM ICH3-M datasheet says IDE modes must be the same |
@@ -900,11 +849,9 @@ static void __init quirk_ide_samemode(struct pci_dev *pdev) | |||
900 | prog &= ~5; | 849 | prog &= ~5; |
901 | pdev->class &= ~5; | 850 | pdev->class &= ~5; |
902 | pci_write_config_byte(pdev, PCI_CLASS_PROG, prog); | 851 | pci_write_config_byte(pdev, PCI_CLASS_PROG, prog); |
903 | /* need to re-assign BARs for compat mode */ | ||
904 | quirk_ide_bases(pdev); | ||
905 | } | 852 | } |
906 | } | 853 | } |
907 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10, quirk_ide_samemode); | 854 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10, quirk_ide_samemode); |
908 | 855 | ||
909 | /* This was originally an Alpha specific thing, but it really fits here. | 856 | /* This was originally an Alpha specific thing, but it really fits here. |
910 | * The i82375 PCI/EISA bridge appears as non-classified. Fix that. | 857 | * The i82375 PCI/EISA bridge appears as non-classified. Fix that. |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index e1dcefc69bb4..d087e0817715 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -81,7 +81,8 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
81 | start = (loff_t)0xC0000; | 81 | start = (loff_t)0xC0000; |
82 | *size = 0x20000; /* cover C000:0 through E000:0 */ | 82 | *size = 0x20000; /* cover C000:0 through E000:0 */ |
83 | } else { | 83 | } else { |
84 | if (res->flags & IORESOURCE_ROM_COPY) { | 84 | if (res->flags & |
85 | (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) { | ||
85 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); | 86 | *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); |
86 | return (void __iomem *)(unsigned long) | 87 | return (void __iomem *)(unsigned long) |
87 | pci_resource_start(pdev, PCI_ROM_RESOURCE); | 88 | pci_resource_start(pdev, PCI_ROM_RESOURCE); |
@@ -165,7 +166,8 @@ void __iomem *pci_map_rom_copy(struct pci_dev *pdev, size_t *size) | |||
165 | if (!rom) | 166 | if (!rom) |
166 | return NULL; | 167 | return NULL; |
167 | 168 | ||
168 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_SHADOW)) | 169 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_SHADOW | |
170 | IORESOURCE_ROM_BIOS_COPY)) | ||
169 | return rom; | 171 | return rom; |
170 | 172 | ||
171 | res->start = (unsigned long)kmalloc(*size, GFP_KERNEL); | 173 | res->start = (unsigned long)kmalloc(*size, GFP_KERNEL); |
@@ -191,7 +193,7 @@ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom) | |||
191 | { | 193 | { |
192 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; | 194 | struct resource *res = &pdev->resource[PCI_ROM_RESOURCE]; |
193 | 195 | ||
194 | if (res->flags & IORESOURCE_ROM_COPY) | 196 | if (res->flags & (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) |
195 | return; | 197 | return; |
196 | 198 | ||
197 | iounmap(rom); | 199 | iounmap(rom); |
@@ -215,6 +217,7 @@ void pci_remove_rom(struct pci_dev *pdev) | |||
215 | sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); | 217 | sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); |
216 | if (!(res->flags & (IORESOURCE_ROM_ENABLE | | 218 | if (!(res->flags & (IORESOURCE_ROM_ENABLE | |
217 | IORESOURCE_ROM_SHADOW | | 219 | IORESOURCE_ROM_SHADOW | |
220 | IORESOURCE_ROM_BIOS_COPY | | ||
218 | IORESOURCE_ROM_COPY))) | 221 | IORESOURCE_ROM_COPY))) |
219 | pci_disable_rom(pdev); | 222 | pci_disable_rom(pdev); |
220 | } | 223 | } |
diff --git a/drivers/s390/net/claw.h b/drivers/s390/net/claw.h index 969be465309c..1ee9a6f06541 100644 --- a/drivers/s390/net/claw.h +++ b/drivers/s390/net/claw.h | |||
@@ -29,7 +29,7 @@ | |||
29 | #define CLAW_COMPLETE 0xff /* flag to indicate i/o completed */ | 29 | #define CLAW_COMPLETE 0xff /* flag to indicate i/o completed */ |
30 | 30 | ||
31 | /*-----------------------------------------------------* | 31 | /*-----------------------------------------------------* |
32 | * CLAW control comand code * | 32 | * CLAW control command code * |
33 | *------------------------------------------------------*/ | 33 | *------------------------------------------------------*/ |
34 | 34 | ||
35 | #define SYSTEM_VALIDATE_REQUEST 0x01 /* System Validate request */ | 35 | #define SYSTEM_VALIDATE_REQUEST 0x01 /* System Validate request */ |
diff --git a/drivers/scsi/aic94xx/aic94xx_reg_def.h b/drivers/scsi/aic94xx/aic94xx_reg_def.h index b79f45f3ad47..a11f4e6d8bd9 100644 --- a/drivers/scsi/aic94xx/aic94xx_reg_def.h +++ b/drivers/scsi/aic94xx/aic94xx_reg_def.h | |||
@@ -2000,7 +2000,7 @@ | |||
2000 | * The host accesses this scratch in a different manner from the | 2000 | * The host accesses this scratch in a different manner from the |
2001 | * central sequencer. The sequencer has to use CSEQ registers CSCRPAGE | 2001 | * central sequencer. The sequencer has to use CSEQ registers CSCRPAGE |
2002 | * and CMnSCRPAGE to access the scratch memory. A flat mapping of the | 2002 | * and CMnSCRPAGE to access the scratch memory. A flat mapping of the |
2003 | * scratch memory is avaliable for software convenience and to prevent | 2003 | * scratch memory is available for software convenience and to prevent |
2004 | * corruption while the sequencer is running. This memory is mapped | 2004 | * corruption while the sequencer is running. This memory is mapped |
2005 | * onto addresses 800h - BFFh, total of 400h bytes. | 2005 | * onto addresses 800h - BFFh, total of 400h bytes. |
2006 | * | 2006 | * |
diff --git a/drivers/scsi/aic94xx/aic94xx_sds.c b/drivers/scsi/aic94xx/aic94xx_sds.c index de7c04d4254d..e5a0ec37e954 100644 --- a/drivers/scsi/aic94xx/aic94xx_sds.c +++ b/drivers/scsi/aic94xx/aic94xx_sds.c | |||
@@ -64,7 +64,7 @@ struct asd_ocm_dir { | |||
64 | 64 | ||
65 | #define OCM_INIT_DIR_ENTRIES 5 | 65 | #define OCM_INIT_DIR_ENTRIES 5 |
66 | /*************************************************************************** | 66 | /*************************************************************************** |
67 | * OCM dircetory default | 67 | * OCM directory default |
68 | ***************************************************************************/ | 68 | ***************************************************************************/ |
69 | static struct asd_ocm_dir OCMDirInit = | 69 | static struct asd_ocm_dir OCMDirInit = |
70 | { | 70 | { |
@@ -73,7 +73,7 @@ static struct asd_ocm_dir OCMDirInit = | |||
73 | }; | 73 | }; |
74 | 74 | ||
75 | /*************************************************************************** | 75 | /*************************************************************************** |
76 | * OCM dircetory Entries default | 76 | * OCM directory Entries default |
77 | ***************************************************************************/ | 77 | ***************************************************************************/ |
78 | static struct asd_ocm_dir_ent OCMDirEntriesInit[OCM_INIT_DIR_ENTRIES] = | 78 | static struct asd_ocm_dir_ent OCMDirEntriesInit[OCM_INIT_DIR_ENTRIES] = |
79 | { | 79 | { |
diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 6cc2bc2f62be..adb8eb4f5fd1 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c | |||
@@ -185,7 +185,7 @@ static inline struct list_head *ncr_list_pop(struct list_head *head) | |||
185 | ** power of 2 cache line size. | 185 | ** power of 2 cache line size. |
186 | ** Enhanced in linux-2.3.44 to provide a memory pool | 186 | ** Enhanced in linux-2.3.44 to provide a memory pool |
187 | ** per pcidev to support dynamic dma mapping. (I would | 187 | ** per pcidev to support dynamic dma mapping. (I would |
188 | ** have preferred a real bus astraction, btw). | 188 | ** have preferred a real bus abstraction, btw). |
189 | ** | 189 | ** |
190 | **========================================================== | 190 | **========================================================== |
191 | */ | 191 | */ |
@@ -1438,7 +1438,7 @@ struct head { | |||
1438 | ** The first four bytes (scr_st[4]) are used inside the script by | 1438 | ** The first four bytes (scr_st[4]) are used inside the script by |
1439 | ** "COPY" commands. | 1439 | ** "COPY" commands. |
1440 | ** Because source and destination must have the same alignment | 1440 | ** Because source and destination must have the same alignment |
1441 | ** in a DWORD, the fields HAVE to be at the choosen offsets. | 1441 | ** in a DWORD, the fields HAVE to be at the chosen offsets. |
1442 | ** xerr_st 0 (0x34) scratcha | 1442 | ** xerr_st 0 (0x34) scratcha |
1443 | ** sync_st 1 (0x05) sxfer | 1443 | ** sync_st 1 (0x05) sxfer |
1444 | ** wide_st 3 (0x03) scntl3 | 1444 | ** wide_st 3 (0x03) scntl3 |
@@ -1498,7 +1498,7 @@ struct head { | |||
1498 | ** the DSA (data structure address) register points | 1498 | ** the DSA (data structure address) register points |
1499 | ** to this substructure of the ccb. | 1499 | ** to this substructure of the ccb. |
1500 | ** This substructure contains the header with | 1500 | ** This substructure contains the header with |
1501 | ** the script-processor-changable data and | 1501 | ** the script-processor-changeable data and |
1502 | ** data blocks for the indirect move commands. | 1502 | ** data blocks for the indirect move commands. |
1503 | ** | 1503 | ** |
1504 | **---------------------------------------------------------- | 1504 | **---------------------------------------------------------- |
@@ -5107,7 +5107,7 @@ void ncr_complete (struct ncb *np, struct ccb *cp) | |||
5107 | 5107 | ||
5108 | /* | 5108 | /* |
5109 | ** This CCB has been skipped by the NCR. | 5109 | ** This CCB has been skipped by the NCR. |
5110 | ** Queue it in the correponding unit queue. | 5110 | ** Queue it in the corresponding unit queue. |
5111 | */ | 5111 | */ |
5112 | static void ncr_ccb_skipped(struct ncb *np, struct ccb *cp) | 5112 | static void ncr_ccb_skipped(struct ncb *np, struct ccb *cp) |
5113 | { | 5113 | { |
@@ -5896,8 +5896,8 @@ static void ncr_log_hard_error(struct ncb *np, u16 sist, u_char dstat) | |||
5896 | ** | 5896 | ** |
5897 | ** In normal cases, interrupt conditions occur one at a | 5897 | ** In normal cases, interrupt conditions occur one at a |
5898 | ** time. The ncr is able to stack in some extra registers | 5898 | ** time. The ncr is able to stack in some extra registers |
5899 | ** other interrupts that will occurs after the first one. | 5899 | ** other interrupts that will occur after the first one. |
5900 | ** But severall interrupts may occur at the same time. | 5900 | ** But, several interrupts may occur at the same time. |
5901 | ** | 5901 | ** |
5902 | ** We probably should only try to deal with the normal | 5902 | ** We probably should only try to deal with the normal |
5903 | ** case, but it seems that multiple interrupts occur in | 5903 | ** case, but it seems that multiple interrupts occur in |
@@ -6796,7 +6796,7 @@ void ncr_int_sir (struct ncb *np) | |||
6796 | ** The host status field is set to HS_NEGOTIATE to mark this | 6796 | ** The host status field is set to HS_NEGOTIATE to mark this |
6797 | ** situation. | 6797 | ** situation. |
6798 | ** | 6798 | ** |
6799 | ** If the target doesn't answer this message immidiately | 6799 | ** If the target doesn't answer this message immediately |
6800 | ** (as required by the standard), the SIR_NEGO_FAIL interrupt | 6800 | ** (as required by the standard), the SIR_NEGO_FAIL interrupt |
6801 | ** will be raised eventually. | 6801 | ** will be raised eventually. |
6802 | ** The handler removes the HS_NEGOTIATE status, and sets the | 6802 | ** The handler removes the HS_NEGOTIATE status, and sets the |
diff --git a/drivers/scsi/ncr53c8xx.h b/drivers/scsi/ncr53c8xx.h index cb8b7701431e..b39357d9af8d 100644 --- a/drivers/scsi/ncr53c8xx.h +++ b/drivers/scsi/ncr53c8xx.h | |||
@@ -218,7 +218,7 @@ | |||
218 | ** Same as option 1, but also deal with | 218 | ** Same as option 1, but also deal with |
219 | ** misconfigured interrupts. | 219 | ** misconfigured interrupts. |
220 | ** | 220 | ** |
221 | ** - Edge triggerred instead of level sensitive. | 221 | ** - Edge triggered instead of level sensitive. |
222 | ** - No interrupt line connected. | 222 | ** - No interrupt line connected. |
223 | ** - IRQ number misconfigured. | 223 | ** - IRQ number misconfigured. |
224 | ** | 224 | ** |
@@ -549,7 +549,7 @@ struct ncr_driver_setup { | |||
549 | 549 | ||
550 | /* | 550 | /* |
551 | ** Initial setup. | 551 | ** Initial setup. |
552 | ** Can be overriden at startup by a command line. | 552 | ** Can be overridden at startup by a command line. |
553 | */ | 553 | */ |
554 | #define SCSI_NCR_DRIVER_SETUP \ | 554 | #define SCSI_NCR_DRIVER_SETUP \ |
555 | { \ | 555 | { \ |
@@ -1093,7 +1093,7 @@ struct scr_tblsel { | |||
1093 | **----------------------------------------------------------- | 1093 | **----------------------------------------------------------- |
1094 | ** On 810A, 860, 825A, 875, 895 and 896 chips the content | 1094 | ** On 810A, 860, 825A, 875, 895 and 896 chips the content |
1095 | ** of SFBR register can be used as data (SCR_SFBR_DATA). | 1095 | ** of SFBR register can be used as data (SCR_SFBR_DATA). |
1096 | ** The 896 has additionnal IO registers starting at | 1096 | ** The 896 has additional IO registers starting at |
1097 | ** offset 0x80. Bit 7 of register offset is stored in | 1097 | ** offset 0x80. Bit 7 of register offset is stored in |
1098 | ** bit 7 of the SCRIPTS instruction first DWORD. | 1098 | ** bit 7 of the SCRIPTS instruction first DWORD. |
1099 | **----------------------------------------------------------- | 1099 | **----------------------------------------------------------- |
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 23334c8bc4c7..d895a1adb428 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
@@ -16,7 +16,7 @@ config SPI | |||
16 | controller and a chipselect. Most SPI slaves don't support | 16 | controller and a chipselect. Most SPI slaves don't support |
17 | dynamic device discovery; some are even write-only or read-only. | 17 | dynamic device discovery; some are even write-only or read-only. |
18 | 18 | ||
19 | SPI is widely used by microcontollers to talk with sensors, | 19 | SPI is widely used by microcontrollers to talk with sensors, |
20 | eeprom and flash memory, codecs and various other controller | 20 | eeprom and flash memory, codecs and various other controller |
21 | chips, analog to digital (and d-to-a) converters, and more. | 21 | chips, analog to digital (and d-to-a) converters, and more. |
22 | MMC and SD cards can be accessed using SPI protocol; and for | 22 | MMC and SD cards can be accessed using SPI protocol; and for |
diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c index c870c804470f..a823486495c3 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c | |||
@@ -834,8 +834,8 @@ static int speedtch_bind(struct usbatm_data *usbatm, | |||
834 | const struct usb_endpoint_descriptor *endpoint_desc = &desc->endpoint[i].desc; | 834 | const struct usb_endpoint_descriptor *endpoint_desc = &desc->endpoint[i].desc; |
835 | 835 | ||
836 | if ((endpoint_desc->bEndpointAddress == target_address)) { | 836 | if ((endpoint_desc->bEndpointAddress == target_address)) { |
837 | use_isoc = (endpoint_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | 837 | use_isoc = |
838 | USB_ENDPOINT_XFER_ISOC; | 838 | usb_endpoint_xfer_isoc(endpoint_desc); |
839 | break; | 839 | break; |
840 | } | 840 | } |
841 | } | 841 | } |
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index f6b9f7e1f716..c137c041f7a4 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c | |||
@@ -401,9 +401,8 @@ static int uea_send_modem_cmd(struct usb_device *usb, | |||
401 | int ret = -ENOMEM; | 401 | int ret = -ENOMEM; |
402 | u8 *xfer_buff; | 402 | u8 *xfer_buff; |
403 | 403 | ||
404 | xfer_buff = kmalloc(size, GFP_KERNEL); | 404 | xfer_buff = kmemdup(buff, size, GFP_KERNEL); |
405 | if (xfer_buff) { | 405 | if (xfer_buff) { |
406 | memcpy(xfer_buff, buff, size); | ||
407 | ret = usb_control_msg(usb, | 406 | ret = usb_control_msg(usb, |
408 | usb_sndctrlpipe(usb, 0), | 407 | usb_sndctrlpipe(usb, 0), |
409 | LOAD_INTERNAL, | 408 | LOAD_INTERNAL, |
@@ -595,14 +594,12 @@ static int uea_idma_write(struct uea_softc *sc, void *data, u32 size) | |||
595 | u8 *xfer_buff; | 594 | u8 *xfer_buff; |
596 | int bytes_read; | 595 | int bytes_read; |
597 | 596 | ||
598 | xfer_buff = kmalloc(size, GFP_KERNEL); | 597 | xfer_buff = kmemdup(data, size, GFP_KERNEL); |
599 | if (!xfer_buff) { | 598 | if (!xfer_buff) { |
600 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); | 599 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); |
601 | return ret; | 600 | return ret; |
602 | } | 601 | } |
603 | 602 | ||
604 | memcpy(xfer_buff, data, size); | ||
605 | |||
606 | ret = usb_bulk_msg(sc->usb_dev, | 603 | ret = usb_bulk_msg(sc->usb_dev, |
607 | usb_sndbulkpipe(sc->usb_dev, UEA_IDMA_PIPE), | 604 | usb_sndbulkpipe(sc->usb_dev, UEA_IDMA_PIPE), |
608 | xfer_buff, size, &bytes_read, BULK_TIMEOUT); | 605 | xfer_buff, size, &bytes_read, BULK_TIMEOUT); |
@@ -765,12 +762,11 @@ static int uea_request(struct uea_softc *sc, | |||
765 | u8 *xfer_buff; | 762 | u8 *xfer_buff; |
766 | int ret = -ENOMEM; | 763 | int ret = -ENOMEM; |
767 | 764 | ||
768 | xfer_buff = kmalloc(size, GFP_KERNEL); | 765 | xfer_buff = kmemdup(data, size, GFP_KERNEL); |
769 | if (!xfer_buff) { | 766 | if (!xfer_buff) { |
770 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); | 767 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); |
771 | return ret; | 768 | return ret; |
772 | } | 769 | } |
773 | memcpy(xfer_buff, data, size); | ||
774 | 770 | ||
775 | ret = usb_control_msg(sc->usb_dev, usb_sndctrlpipe(sc->usb_dev, 0), | 771 | ret = usb_control_msg(sc->usb_dev, usb_sndctrlpipe(sc->usb_dev, 0), |
776 | UCDC_SEND_ENCAPSULATED_COMMAND, | 772 | UCDC_SEND_ENCAPSULATED_COMMAND, |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 9a9012fd284b..ec3438dc8ee5 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -892,7 +892,7 @@ skip_normal_probe: | |||
892 | 892 | ||
893 | 893 | ||
894 | /* workaround for switched endpoints */ | 894 | /* workaround for switched endpoints */ |
895 | if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { | 895 | if (!usb_endpoint_dir_in(epread)) { |
896 | /* descriptors are swapped */ | 896 | /* descriptors are swapped */ |
897 | struct usb_endpoint_descriptor *t; | 897 | struct usb_endpoint_descriptor *t; |
898 | dev_dbg(&intf->dev,"The data interface has switched endpoints"); | 898 | dev_dbg(&intf->dev,"The data interface has switched endpoints"); |
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index 6e3b5358a760..f8324d8d06ac 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
@@ -72,6 +72,21 @@ config USB_SUSPEND | |||
72 | 72 | ||
73 | If you are unsure about this, say N here. | 73 | If you are unsure about this, say N here. |
74 | 74 | ||
75 | config USB_MULTITHREAD_PROBE | ||
76 | bool "USB Multi-threaded probe (EXPERIMENTAL)" | ||
77 | depends on USB && EXPERIMENTAL | ||
78 | default n | ||
79 | help | ||
80 | Say Y here if you want the USB core to spawn a new thread for | ||
81 | every USB device that is probed. This can cause a small speedup | ||
82 | in boot times on systems with a lot of different USB devices. | ||
83 | |||
84 | This option should be safe to enable, but if any odd probing | ||
85 | problems are found, please disable it, or dynamically turn it | ||
86 | off in the /sys/module/usbcore/parameters/multithread_probe | ||
87 | file | ||
88 | |||
89 | When in doubt, say N. | ||
75 | 90 | ||
76 | config USB_OTG | 91 | config USB_OTG |
77 | bool | 92 | bool |
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 3538c2fdadfe..ea398e5d50af 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c | |||
@@ -175,12 +175,13 @@ static char *usb_dump_endpoint_descriptor ( | |||
175 | ) | 175 | ) |
176 | { | 176 | { |
177 | char dir, unit, *type; | 177 | char dir, unit, *type; |
178 | unsigned interval, in, bandwidth = 1; | 178 | unsigned interval, bandwidth = 1; |
179 | 179 | ||
180 | if (start > end) | 180 | if (start > end) |
181 | return start; | 181 | return start; |
182 | in = (desc->bEndpointAddress & USB_DIR_IN); | 182 | |
183 | dir = in ? 'I' : 'O'; | 183 | dir = usb_endpoint_dir_in(desc) ? 'I' : 'O'; |
184 | |||
184 | if (speed == USB_SPEED_HIGH) { | 185 | if (speed == USB_SPEED_HIGH) { |
185 | switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) { | 186 | switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) { |
186 | case 1 << 11: bandwidth = 2; break; | 187 | case 1 << 11: bandwidth = 2; break; |
@@ -204,7 +205,7 @@ static char *usb_dump_endpoint_descriptor ( | |||
204 | break; | 205 | break; |
205 | case USB_ENDPOINT_XFER_BULK: | 206 | case USB_ENDPOINT_XFER_BULK: |
206 | type = "Bulk"; | 207 | type = "Bulk"; |
207 | if (speed == USB_SPEED_HIGH && !in) /* uframes per NAK */ | 208 | if (speed == USB_SPEED_HIGH && dir == 'O') /* uframes per NAK */ |
208 | interval = desc->bInterval; | 209 | interval = desc->bInterval; |
209 | else | 210 | else |
210 | interval = 0; | 211 | interval = 0; |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index fed92be63b5e..3ed4cb2d56d9 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -561,7 +561,7 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
561 | dev = inode->i_private; | 561 | dev = inode->i_private; |
562 | if (!dev) | 562 | if (!dev) |
563 | goto out; | 563 | goto out; |
564 | ret = usb_autoresume_device(dev, 1); | 564 | ret = usb_autoresume_device(dev); |
565 | if (ret) | 565 | if (ret) |
566 | goto out; | 566 | goto out; |
567 | 567 | ||
@@ -609,7 +609,7 @@ static int usbdev_release(struct inode *inode, struct file *file) | |||
609 | releaseintf(ps, ifnum); | 609 | releaseintf(ps, ifnum); |
610 | } | 610 | } |
611 | destroy_all_async(ps); | 611 | destroy_all_async(ps); |
612 | usb_autosuspend_device(dev, 1); | 612 | usb_autosuspend_device(dev); |
613 | usb_unlock_device(dev); | 613 | usb_unlock_device(dev); |
614 | usb_put_dev(dev); | 614 | usb_put_dev(dev); |
615 | put_pid(ps->disc_pid); | 615 | put_pid(ps->disc_pid); |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 113e484c763e..d6eb5ce1dd1d 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -205,7 +205,7 @@ static int usb_probe_interface(struct device *dev) | |||
205 | if (id) { | 205 | if (id) { |
206 | dev_dbg(dev, "%s - got id\n", __FUNCTION__); | 206 | dev_dbg(dev, "%s - got id\n", __FUNCTION__); |
207 | 207 | ||
208 | error = usb_autoresume_device(udev, 1); | 208 | error = usb_autoresume_device(udev); |
209 | if (error) | 209 | if (error) |
210 | return error; | 210 | return error; |
211 | 211 | ||
@@ -229,7 +229,7 @@ static int usb_probe_interface(struct device *dev) | |||
229 | } else | 229 | } else |
230 | intf->condition = USB_INTERFACE_BOUND; | 230 | intf->condition = USB_INTERFACE_BOUND; |
231 | 231 | ||
232 | usb_autosuspend_device(udev, 1); | 232 | usb_autosuspend_device(udev); |
233 | } | 233 | } |
234 | 234 | ||
235 | return error; | 235 | return error; |
@@ -247,7 +247,7 @@ static int usb_unbind_interface(struct device *dev) | |||
247 | 247 | ||
248 | /* Autoresume for set_interface call below */ | 248 | /* Autoresume for set_interface call below */ |
249 | udev = interface_to_usbdev(intf); | 249 | udev = interface_to_usbdev(intf); |
250 | error = usb_autoresume_device(udev, 1); | 250 | error = usb_autoresume_device(udev); |
251 | 251 | ||
252 | /* release all urbs for this interface */ | 252 | /* release all urbs for this interface */ |
253 | usb_disable_interface(interface_to_usbdev(intf), intf); | 253 | usb_disable_interface(interface_to_usbdev(intf), intf); |
@@ -265,7 +265,7 @@ static int usb_unbind_interface(struct device *dev) | |||
265 | intf->needs_remote_wakeup = 0; | 265 | intf->needs_remote_wakeup = 0; |
266 | 266 | ||
267 | if (!error) | 267 | if (!error) |
268 | usb_autosuspend_device(udev, 1); | 268 | usb_autosuspend_device(udev); |
269 | 269 | ||
270 | return 0; | 270 | return 0; |
271 | } | 271 | } |
@@ -408,6 +408,16 @@ static int usb_match_one_id(struct usb_interface *interface, | |||
408 | (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) | 408 | (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) |
409 | return 0; | 409 | return 0; |
410 | 410 | ||
411 | /* The interface class, subclass, and protocol should never be | ||
412 | * checked for a match if the device class is Vendor Specific, | ||
413 | * unless the match record specifies the Vendor ID. */ | ||
414 | if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC && | ||
415 | !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && | ||
416 | (id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS | | ||
417 | USB_DEVICE_ID_MATCH_INT_SUBCLASS | | ||
418 | USB_DEVICE_ID_MATCH_INT_PROTOCOL))) | ||
419 | return 0; | ||
420 | |||
411 | if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && | 421 | if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && |
412 | (id->bInterfaceClass != intf->desc.bInterfaceClass)) | 422 | (id->bInterfaceClass != intf->desc.bInterfaceClass)) |
413 | return 0; | 423 | return 0; |
@@ -476,7 +486,17 @@ static int usb_match_one_id(struct usb_interface *interface, | |||
476 | * most general; they let drivers bind to any interface on a | 486 | * most general; they let drivers bind to any interface on a |
477 | * multiple-function device. Use the USB_INTERFACE_INFO | 487 | * multiple-function device. Use the USB_INTERFACE_INFO |
478 | * macro, or its siblings, to match class-per-interface style | 488 | * macro, or its siblings, to match class-per-interface style |
479 | * devices (as recorded in bDeviceClass). | 489 | * devices (as recorded in bInterfaceClass). |
490 | * | ||
491 | * Note that an entry created by USB_INTERFACE_INFO won't match | ||
492 | * any interface if the device class is set to Vendor-Specific. | ||
493 | * This is deliberate; according to the USB spec the meanings of | ||
494 | * the interface class/subclass/protocol for these devices are also | ||
495 | * vendor-specific, and hence matching against a standard product | ||
496 | * class wouldn't work anyway. If you really want to use an | ||
497 | * interface-based match for such a device, create a match record | ||
498 | * that also specifies the vendor ID. (Unforunately there isn't a | ||
499 | * standard macro for creating records like this.) | ||
480 | * | 500 | * |
481 | * Within those groups, remember that not all combinations are | 501 | * Within those groups, remember that not all combinations are |
482 | * meaningful. For example, don't give a product version range | 502 | * meaningful. For example, don't give a product version range |
@@ -505,7 +525,7 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface, | |||
505 | } | 525 | } |
506 | EXPORT_SYMBOL_GPL_FUTURE(usb_match_id); | 526 | EXPORT_SYMBOL_GPL_FUTURE(usb_match_id); |
507 | 527 | ||
508 | int usb_device_match(struct device *dev, struct device_driver *drv) | 528 | static int usb_device_match(struct device *dev, struct device_driver *drv) |
509 | { | 529 | { |
510 | /* devices and interfaces are handled separately */ | 530 | /* devices and interfaces are handled separately */ |
511 | if (is_usb_device(dev)) { | 531 | if (is_usb_device(dev)) { |
@@ -790,7 +810,7 @@ EXPORT_SYMBOL_GPL_FUTURE(usb_deregister); | |||
790 | #ifdef CONFIG_PM | 810 | #ifdef CONFIG_PM |
791 | 811 | ||
792 | /* Caller has locked udev's pm_mutex */ | 812 | /* Caller has locked udev's pm_mutex */ |
793 | static int suspend_device(struct usb_device *udev, pm_message_t msg) | 813 | static int usb_suspend_device(struct usb_device *udev, pm_message_t msg) |
794 | { | 814 | { |
795 | struct usb_device_driver *udriver; | 815 | struct usb_device_driver *udriver; |
796 | int status = 0; | 816 | int status = 0; |
@@ -817,7 +837,7 @@ done: | |||
817 | } | 837 | } |
818 | 838 | ||
819 | /* Caller has locked udev's pm_mutex */ | 839 | /* Caller has locked udev's pm_mutex */ |
820 | static int resume_device(struct usb_device *udev) | 840 | static int usb_resume_device(struct usb_device *udev) |
821 | { | 841 | { |
822 | struct usb_device_driver *udriver; | 842 | struct usb_device_driver *udriver; |
823 | int status = 0; | 843 | int status = 0; |
@@ -843,7 +863,7 @@ done: | |||
843 | } | 863 | } |
844 | 864 | ||
845 | /* Caller has locked intf's usb_device's pm mutex */ | 865 | /* Caller has locked intf's usb_device's pm mutex */ |
846 | static int suspend_interface(struct usb_interface *intf, pm_message_t msg) | 866 | static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg) |
847 | { | 867 | { |
848 | struct usb_driver *driver; | 868 | struct usb_driver *driver; |
849 | int status = 0; | 869 | int status = 0; |
@@ -880,7 +900,7 @@ done: | |||
880 | } | 900 | } |
881 | 901 | ||
882 | /* Caller has locked intf's usb_device's pm_mutex */ | 902 | /* Caller has locked intf's usb_device's pm_mutex */ |
883 | static int resume_interface(struct usb_interface *intf) | 903 | static int usb_resume_interface(struct usb_interface *intf) |
884 | { | 904 | { |
885 | struct usb_driver *driver; | 905 | struct usb_driver *driver; |
886 | int status = 0; | 906 | int status = 0; |
@@ -920,6 +940,44 @@ done: | |||
920 | return status; | 940 | return status; |
921 | } | 941 | } |
922 | 942 | ||
943 | #ifdef CONFIG_USB_SUSPEND | ||
944 | |||
945 | /* Internal routine to check whether we may autosuspend a device. */ | ||
946 | static int autosuspend_check(struct usb_device *udev) | ||
947 | { | ||
948 | int i; | ||
949 | struct usb_interface *intf; | ||
950 | |||
951 | /* For autosuspend, fail fast if anything is in use. | ||
952 | * Also fail if any interfaces require remote wakeup but it | ||
953 | * isn't available. */ | ||
954 | udev->do_remote_wakeup = device_may_wakeup(&udev->dev); | ||
955 | if (udev->pm_usage_cnt > 0) | ||
956 | return -EBUSY; | ||
957 | if (udev->actconfig) { | ||
958 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
959 | intf = udev->actconfig->interface[i]; | ||
960 | if (!is_active(intf)) | ||
961 | continue; | ||
962 | if (intf->pm_usage_cnt > 0) | ||
963 | return -EBUSY; | ||
964 | if (intf->needs_remote_wakeup && | ||
965 | !udev->do_remote_wakeup) { | ||
966 | dev_dbg(&udev->dev, "remote wakeup needed " | ||
967 | "for autosuspend\n"); | ||
968 | return -EOPNOTSUPP; | ||
969 | } | ||
970 | } | ||
971 | } | ||
972 | return 0; | ||
973 | } | ||
974 | |||
975 | #else | ||
976 | |||
977 | #define autosuspend_check(udev) 0 | ||
978 | |||
979 | #endif | ||
980 | |||
923 | /** | 981 | /** |
924 | * usb_suspend_both - suspend a USB device and its interfaces | 982 | * usb_suspend_both - suspend a USB device and its interfaces |
925 | * @udev: the usb_device to suspend | 983 | * @udev: the usb_device to suspend |
@@ -971,52 +1029,34 @@ int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
971 | 1029 | ||
972 | udev->do_remote_wakeup = device_may_wakeup(&udev->dev); | 1030 | udev->do_remote_wakeup = device_may_wakeup(&udev->dev); |
973 | 1031 | ||
974 | /* For autosuspend, fail fast if anything is in use. | ||
975 | * Also fail if any interfaces require remote wakeup but it | ||
976 | * isn't available. */ | ||
977 | if (udev->auto_pm) { | 1032 | if (udev->auto_pm) { |
978 | if (udev->pm_usage_cnt > 0) | 1033 | status = autosuspend_check(udev); |
979 | return -EBUSY; | 1034 | if (status < 0) |
980 | if (udev->actconfig) { | 1035 | return status; |
981 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
982 | intf = udev->actconfig->interface[i]; | ||
983 | if (!is_active(intf)) | ||
984 | continue; | ||
985 | if (intf->pm_usage_cnt > 0) | ||
986 | return -EBUSY; | ||
987 | if (intf->needs_remote_wakeup && | ||
988 | !udev->do_remote_wakeup) { | ||
989 | dev_dbg(&udev->dev, | ||
990 | "remote wakeup needed for autosuspend\n"); | ||
991 | return -EOPNOTSUPP; | ||
992 | } | ||
993 | } | ||
994 | i = 0; | ||
995 | } | ||
996 | } | 1036 | } |
997 | 1037 | ||
998 | /* Suspend all the interfaces and then udev itself */ | 1038 | /* Suspend all the interfaces and then udev itself */ |
999 | if (udev->actconfig) { | 1039 | if (udev->actconfig) { |
1000 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { | 1040 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { |
1001 | intf = udev->actconfig->interface[i]; | 1041 | intf = udev->actconfig->interface[i]; |
1002 | status = suspend_interface(intf, msg); | 1042 | status = usb_suspend_interface(intf, msg); |
1003 | if (status != 0) | 1043 | if (status != 0) |
1004 | break; | 1044 | break; |
1005 | } | 1045 | } |
1006 | } | 1046 | } |
1007 | if (status == 0) | 1047 | if (status == 0) |
1008 | status = suspend_device(udev, msg); | 1048 | status = usb_suspend_device(udev, msg); |
1009 | 1049 | ||
1010 | /* If the suspend failed, resume interfaces that did get suspended */ | 1050 | /* If the suspend failed, resume interfaces that did get suspended */ |
1011 | if (status != 0) { | 1051 | if (status != 0) { |
1012 | while (--i >= 0) { | 1052 | while (--i >= 0) { |
1013 | intf = udev->actconfig->interface[i]; | 1053 | intf = udev->actconfig->interface[i]; |
1014 | resume_interface(intf); | 1054 | usb_resume_interface(intf); |
1015 | } | 1055 | } |
1016 | 1056 | ||
1017 | /* If the suspend succeeded, propagate it up the tree */ | 1057 | /* If the suspend succeeded, propagate it up the tree */ |
1018 | } else if (parent) | 1058 | } else if (parent) |
1019 | usb_autosuspend_device(parent, 0); | 1059 | usb_autosuspend_device(parent); |
1020 | 1060 | ||
1021 | // dev_dbg(&udev->dev, "%s: status %d\n", __FUNCTION__, status); | 1061 | // dev_dbg(&udev->dev, "%s: status %d\n", __FUNCTION__, status); |
1022 | return status; | 1062 | return status; |
@@ -1064,9 +1104,25 @@ int usb_resume_both(struct usb_device *udev) | |||
1064 | /* Propagate the resume up the tree, if necessary */ | 1104 | /* Propagate the resume up the tree, if necessary */ |
1065 | if (udev->state == USB_STATE_SUSPENDED) { | 1105 | if (udev->state == USB_STATE_SUSPENDED) { |
1066 | if (parent) { | 1106 | if (parent) { |
1067 | usb_pm_lock(parent); | 1107 | status = usb_autoresume_device(parent); |
1068 | parent->auto_pm = 1; | 1108 | if (status == 0) { |
1069 | status = usb_resume_both(parent); | 1109 | status = usb_resume_device(udev); |
1110 | if (status) { | ||
1111 | usb_autosuspend_device(parent); | ||
1112 | |||
1113 | /* It's possible usb_resume_device() | ||
1114 | * failed after the port was | ||
1115 | * unsuspended, causing udev to be | ||
1116 | * logically disconnected. We don't | ||
1117 | * want usb_disconnect() to autosuspend | ||
1118 | * the parent again, so tell it that | ||
1119 | * udev disconnected while still | ||
1120 | * suspended. */ | ||
1121 | if (udev->state == | ||
1122 | USB_STATE_NOTATTACHED) | ||
1123 | udev->discon_suspended = 1; | ||
1124 | } | ||
1125 | } | ||
1070 | } else { | 1126 | } else { |
1071 | 1127 | ||
1072 | /* We can't progagate beyond the USB subsystem, | 1128 | /* We can't progagate beyond the USB subsystem, |
@@ -1075,24 +1131,20 @@ int usb_resume_both(struct usb_device *udev) | |||
1075 | if (udev->dev.parent->power.power_state.event != | 1131 | if (udev->dev.parent->power.power_state.event != |
1076 | PM_EVENT_ON) | 1132 | PM_EVENT_ON) |
1077 | status = -EHOSTUNREACH; | 1133 | status = -EHOSTUNREACH; |
1078 | } | 1134 | else |
1079 | if (status == 0) | 1135 | status = usb_resume_device(udev); |
1080 | status = resume_device(udev); | 1136 | } |
1081 | if (parent) | ||
1082 | usb_pm_unlock(parent); | ||
1083 | } else { | 1137 | } else { |
1084 | 1138 | ||
1085 | /* Needed only for setting udev->dev.power.power_state.event | 1139 | /* Needed only for setting udev->dev.power.power_state.event |
1086 | * and for possible debugging message. */ | 1140 | * and for possible debugging message. */ |
1087 | status = resume_device(udev); | 1141 | status = usb_resume_device(udev); |
1088 | } | 1142 | } |
1089 | 1143 | ||
1090 | /* Now the parent won't suspend until we are finished */ | ||
1091 | |||
1092 | if (status == 0 && udev->actconfig) { | 1144 | if (status == 0 && udev->actconfig) { |
1093 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | 1145 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { |
1094 | intf = udev->actconfig->interface[i]; | 1146 | intf = udev->actconfig->interface[i]; |
1095 | resume_interface(intf); | 1147 | usb_resume_interface(intf); |
1096 | } | 1148 | } |
1097 | } | 1149 | } |
1098 | 1150 | ||
@@ -1102,39 +1154,53 @@ int usb_resume_both(struct usb_device *udev) | |||
1102 | 1154 | ||
1103 | #ifdef CONFIG_USB_SUSPEND | 1155 | #ifdef CONFIG_USB_SUSPEND |
1104 | 1156 | ||
1157 | /* Internal routine to adjust a device's usage counter and change | ||
1158 | * its autosuspend state. | ||
1159 | */ | ||
1160 | static int usb_autopm_do_device(struct usb_device *udev, int inc_usage_cnt) | ||
1161 | { | ||
1162 | int status = 0; | ||
1163 | |||
1164 | usb_pm_lock(udev); | ||
1165 | udev->pm_usage_cnt += inc_usage_cnt; | ||
1166 | WARN_ON(udev->pm_usage_cnt < 0); | ||
1167 | if (inc_usage_cnt >= 0 && udev->pm_usage_cnt > 0) { | ||
1168 | udev->auto_pm = 1; | ||
1169 | status = usb_resume_both(udev); | ||
1170 | if (status != 0) | ||
1171 | udev->pm_usage_cnt -= inc_usage_cnt; | ||
1172 | } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0) | ||
1173 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1174 | USB_AUTOSUSPEND_DELAY); | ||
1175 | usb_pm_unlock(udev); | ||
1176 | return status; | ||
1177 | } | ||
1178 | |||
1105 | /** | 1179 | /** |
1106 | * usb_autosuspend_device - delayed autosuspend of a USB device and its interfaces | 1180 | * usb_autosuspend_device - delayed autosuspend of a USB device and its interfaces |
1107 | * @udev: the usb_device to autosuspend | 1181 | * @udev: the usb_device to autosuspend |
1108 | * @dec_usage_cnt: flag to decrement @udev's PM-usage counter | ||
1109 | * | 1182 | * |
1110 | * This routine should be called when a core subsystem is finished using | 1183 | * This routine should be called when a core subsystem is finished using |
1111 | * @udev and wants to allow it to autosuspend. Examples would be when | 1184 | * @udev and wants to allow it to autosuspend. Examples would be when |
1112 | * @udev's device file in usbfs is closed or after a configuration change. | 1185 | * @udev's device file in usbfs is closed or after a configuration change. |
1113 | * | 1186 | * |
1114 | * @dec_usage_cnt should be 1 if the subsystem previously incremented | 1187 | * @udev's usage counter is decremented. If it or any of the usage counters |
1115 | * @udev's usage counter (such as by passing 1 to usb_autoresume_device); | 1188 | * for an active interface is greater than 0, no autosuspend request will be |
1116 | * otherwise it should be 0. | 1189 | * queued. (If an interface driver does not support autosuspend then its |
1117 | * | 1190 | * usage counter is permanently positive.) Furthermore, if an interface |
1118 | * If the usage counter for @udev or any of its active interfaces is greater | 1191 | * driver requires remote-wakeup capability during autosuspend but remote |
1119 | * than 0, the autosuspend request will not be queued. (If an interface | 1192 | * wakeup is disabled, the autosuspend will fail. |
1120 | * driver does not support autosuspend then its usage counter is permanently | ||
1121 | * positive.) Likewise, if an interface driver requires remote-wakeup | ||
1122 | * capability during autosuspend but remote wakeup is disabled, the | ||
1123 | * autosuspend will fail. | ||
1124 | * | 1193 | * |
1125 | * Often the caller will hold @udev's device lock, but this is not | 1194 | * Often the caller will hold @udev's device lock, but this is not |
1126 | * necessary. | 1195 | * necessary. |
1127 | * | 1196 | * |
1128 | * This routine can run only in process context. | 1197 | * This routine can run only in process context. |
1129 | */ | 1198 | */ |
1130 | void usb_autosuspend_device(struct usb_device *udev, int dec_usage_cnt) | 1199 | void usb_autosuspend_device(struct usb_device *udev) |
1131 | { | 1200 | { |
1132 | usb_pm_lock(udev); | 1201 | int status; |
1133 | udev->pm_usage_cnt -= dec_usage_cnt; | 1202 | |
1134 | if (udev->pm_usage_cnt <= 0) | 1203 | status = usb_autopm_do_device(udev, -1); |
1135 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1136 | USB_AUTOSUSPEND_DELAY); | ||
1137 | usb_pm_unlock(udev); | ||
1138 | // dev_dbg(&udev->dev, "%s: cnt %d\n", | 1204 | // dev_dbg(&udev->dev, "%s: cnt %d\n", |
1139 | // __FUNCTION__, udev->pm_usage_cnt); | 1205 | // __FUNCTION__, udev->pm_usage_cnt); |
1140 | } | 1206 | } |
@@ -1142,44 +1208,59 @@ void usb_autosuspend_device(struct usb_device *udev, int dec_usage_cnt) | |||
1142 | /** | 1208 | /** |
1143 | * usb_autoresume_device - immediately autoresume a USB device and its interfaces | 1209 | * usb_autoresume_device - immediately autoresume a USB device and its interfaces |
1144 | * @udev: the usb_device to autoresume | 1210 | * @udev: the usb_device to autoresume |
1145 | * @inc_usage_cnt: flag to increment @udev's PM-usage counter | ||
1146 | * | 1211 | * |
1147 | * This routine should be called when a core subsystem wants to use @udev | 1212 | * This routine should be called when a core subsystem wants to use @udev |
1148 | * and needs to guarantee that it is not suspended. In addition, the | 1213 | * and needs to guarantee that it is not suspended. No autosuspend will |
1149 | * caller can prevent @udev from being autosuspended subsequently. (Note | 1214 | * occur until usb_autosuspend_device is called. (Note that this will not |
1150 | * that this will not prevent suspend events originating in the PM core.) | 1215 | * prevent suspend events originating in the PM core.) Examples would be |
1151 | * Examples would be when @udev's device file in usbfs is opened (autosuspend | 1216 | * when @udev's device file in usbfs is opened or when a remote-wakeup |
1152 | * should be prevented until the file is closed) or when a remote-wakeup | 1217 | * request is received. |
1153 | * request is received (later autosuspends should not be prevented). | ||
1154 | * | 1218 | * |
1155 | * @inc_usage_cnt should be 1 to increment @udev's usage counter and prevent | 1219 | * @udev's usage counter is incremented to prevent subsequent autosuspends. |
1156 | * autosuspends. This prevention will persist until the usage counter is | 1220 | * However if the autoresume fails then the usage counter is re-decremented. |
1157 | * decremented again (such as by passing 1 to usb_autosuspend_device). | ||
1158 | * Otherwise @inc_usage_cnt should be 0 to leave the usage counter unchanged. | ||
1159 | * Regardless, if the autoresume fails then the usage counter is not | ||
1160 | * incremented. | ||
1161 | * | 1221 | * |
1162 | * Often the caller will hold @udev's device lock, but this is not | 1222 | * Often the caller will hold @udev's device lock, but this is not |
1163 | * necessary (and attempting it might cause deadlock). | 1223 | * necessary (and attempting it might cause deadlock). |
1164 | * | 1224 | * |
1165 | * This routine can run only in process context. | 1225 | * This routine can run only in process context. |
1166 | */ | 1226 | */ |
1167 | int usb_autoresume_device(struct usb_device *udev, int inc_usage_cnt) | 1227 | int usb_autoresume_device(struct usb_device *udev) |
1168 | { | 1228 | { |
1169 | int status; | 1229 | int status; |
1170 | 1230 | ||
1171 | usb_pm_lock(udev); | 1231 | status = usb_autopm_do_device(udev, 1); |
1172 | udev->pm_usage_cnt += inc_usage_cnt; | ||
1173 | udev->auto_pm = 1; | ||
1174 | status = usb_resume_both(udev); | ||
1175 | if (status != 0) | ||
1176 | udev->pm_usage_cnt -= inc_usage_cnt; | ||
1177 | usb_pm_unlock(udev); | ||
1178 | // dev_dbg(&udev->dev, "%s: status %d cnt %d\n", | 1232 | // dev_dbg(&udev->dev, "%s: status %d cnt %d\n", |
1179 | // __FUNCTION__, status, udev->pm_usage_cnt); | 1233 | // __FUNCTION__, status, udev->pm_usage_cnt); |
1180 | return status; | 1234 | return status; |
1181 | } | 1235 | } |
1182 | 1236 | ||
1237 | /* Internal routine to adjust an interface's usage counter and change | ||
1238 | * its device's autosuspend state. | ||
1239 | */ | ||
1240 | static int usb_autopm_do_interface(struct usb_interface *intf, | ||
1241 | int inc_usage_cnt) | ||
1242 | { | ||
1243 | struct usb_device *udev = interface_to_usbdev(intf); | ||
1244 | int status = 0; | ||
1245 | |||
1246 | usb_pm_lock(udev); | ||
1247 | if (intf->condition == USB_INTERFACE_UNBOUND) | ||
1248 | status = -ENODEV; | ||
1249 | else { | ||
1250 | intf->pm_usage_cnt += inc_usage_cnt; | ||
1251 | if (inc_usage_cnt >= 0 && intf->pm_usage_cnt > 0) { | ||
1252 | udev->auto_pm = 1; | ||
1253 | status = usb_resume_both(udev); | ||
1254 | if (status != 0) | ||
1255 | intf->pm_usage_cnt -= inc_usage_cnt; | ||
1256 | } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0) | ||
1257 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1258 | USB_AUTOSUSPEND_DELAY); | ||
1259 | } | ||
1260 | usb_pm_unlock(udev); | ||
1261 | return status; | ||
1262 | } | ||
1263 | |||
1183 | /** | 1264 | /** |
1184 | * usb_autopm_put_interface - decrement a USB interface's PM-usage counter | 1265 | * usb_autopm_put_interface - decrement a USB interface's PM-usage counter |
1185 | * @intf: the usb_interface whose counter should be decremented | 1266 | * @intf: the usb_interface whose counter should be decremented |
@@ -1213,17 +1294,11 @@ int usb_autoresume_device(struct usb_device *udev, int inc_usage_cnt) | |||
1213 | */ | 1294 | */ |
1214 | void usb_autopm_put_interface(struct usb_interface *intf) | 1295 | void usb_autopm_put_interface(struct usb_interface *intf) |
1215 | { | 1296 | { |
1216 | struct usb_device *udev = interface_to_usbdev(intf); | 1297 | int status; |
1217 | 1298 | ||
1218 | usb_pm_lock(udev); | 1299 | status = usb_autopm_do_interface(intf, -1); |
1219 | if (intf->condition != USB_INTERFACE_UNBOUND && | 1300 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", |
1220 | --intf->pm_usage_cnt <= 0) { | 1301 | // __FUNCTION__, status, intf->pm_usage_cnt); |
1221 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1222 | USB_AUTOSUSPEND_DELAY); | ||
1223 | } | ||
1224 | usb_pm_unlock(udev); | ||
1225 | // dev_dbg(&intf->dev, "%s: cnt %d\n", | ||
1226 | // __FUNCTION__, intf->pm_usage_cnt); | ||
1227 | } | 1302 | } |
1228 | EXPORT_SYMBOL_GPL(usb_autopm_put_interface); | 1303 | EXPORT_SYMBOL_GPL(usb_autopm_put_interface); |
1229 | 1304 | ||
@@ -1260,26 +1335,37 @@ EXPORT_SYMBOL_GPL(usb_autopm_put_interface); | |||
1260 | */ | 1335 | */ |
1261 | int usb_autopm_get_interface(struct usb_interface *intf) | 1336 | int usb_autopm_get_interface(struct usb_interface *intf) |
1262 | { | 1337 | { |
1263 | struct usb_device *udev = interface_to_usbdev(intf); | 1338 | int status; |
1264 | int status; | ||
1265 | 1339 | ||
1266 | usb_pm_lock(udev); | 1340 | status = usb_autopm_do_interface(intf, 1); |
1267 | if (intf->condition == USB_INTERFACE_UNBOUND) | ||
1268 | status = -ENODEV; | ||
1269 | else { | ||
1270 | ++intf->pm_usage_cnt; | ||
1271 | udev->auto_pm = 1; | ||
1272 | status = usb_resume_both(udev); | ||
1273 | if (status != 0) | ||
1274 | --intf->pm_usage_cnt; | ||
1275 | } | ||
1276 | usb_pm_unlock(udev); | ||
1277 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", | 1341 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", |
1278 | // __FUNCTION__, status, intf->pm_usage_cnt); | 1342 | // __FUNCTION__, status, intf->pm_usage_cnt); |
1279 | return status; | 1343 | return status; |
1280 | } | 1344 | } |
1281 | EXPORT_SYMBOL_GPL(usb_autopm_get_interface); | 1345 | EXPORT_SYMBOL_GPL(usb_autopm_get_interface); |
1282 | 1346 | ||
1347 | /** | ||
1348 | * usb_autopm_set_interface - set a USB interface's autosuspend state | ||
1349 | * @intf: the usb_interface whose state should be set | ||
1350 | * | ||
1351 | * This routine sets the autosuspend state of @intf's device according | ||
1352 | * to @intf's usage counter, which the caller must have set previously. | ||
1353 | * If the counter is <= 0, the device is autosuspended (if it isn't | ||
1354 | * already suspended and if nothing else prevents the autosuspend). If | ||
1355 | * the counter is > 0, the device is autoresumed (if it isn't already | ||
1356 | * awake). | ||
1357 | */ | ||
1358 | int usb_autopm_set_interface(struct usb_interface *intf) | ||
1359 | { | ||
1360 | int status; | ||
1361 | |||
1362 | status = usb_autopm_do_interface(intf, 0); | ||
1363 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", | ||
1364 | // __FUNCTION__, status, intf->pm_usage_cnt); | ||
1365 | return status; | ||
1366 | } | ||
1367 | EXPORT_SYMBOL_GPL(usb_autopm_set_interface); | ||
1368 | |||
1283 | #endif /* CONFIG_USB_SUSPEND */ | 1369 | #endif /* CONFIG_USB_SUSPEND */ |
1284 | 1370 | ||
1285 | static int usb_suspend(struct device *dev, pm_message_t message) | 1371 | static int usb_suspend(struct device *dev, pm_message_t message) |
diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c index 3b2d137912be..c505b767cee1 100644 --- a/drivers/usb/core/endpoint.c +++ b/drivers/usb/core/endpoint.c | |||
@@ -10,15 +10,20 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/spinlock.h> | ||
14 | #include <linux/idr.h> | ||
13 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
14 | #include "usb.h" | 16 | #include "usb.h" |
15 | 17 | ||
16 | /* endpoint stuff */ | 18 | #define MAX_ENDPOINT_MINORS (64*128*32) |
19 | static int usb_endpoint_major; | ||
20 | static DEFINE_IDR(endpoint_idr); | ||
17 | 21 | ||
18 | struct ep_device { | 22 | struct ep_device { |
19 | struct usb_endpoint_descriptor *desc; | 23 | struct usb_endpoint_descriptor *desc; |
20 | struct usb_device *udev; | 24 | struct usb_device *udev; |
21 | struct device dev; | 25 | struct device dev; |
26 | int minor; | ||
22 | }; | 27 | }; |
23 | #define to_ep_device(_dev) \ | 28 | #define to_ep_device(_dev) \ |
24 | container_of(_dev, struct ep_device, dev) | 29 | container_of(_dev, struct ep_device, dev) |
@@ -152,6 +157,55 @@ static struct attribute_group ep_dev_attr_grp = { | |||
152 | .attrs = ep_dev_attrs, | 157 | .attrs = ep_dev_attrs, |
153 | }; | 158 | }; |
154 | 159 | ||
160 | static int usb_endpoint_major_init(void) | ||
161 | { | ||
162 | dev_t dev; | ||
163 | int error; | ||
164 | |||
165 | error = alloc_chrdev_region(&dev, 0, MAX_ENDPOINT_MINORS, | ||
166 | "usb_endpoint"); | ||
167 | if (error) { | ||
168 | err("unable to get a dynamic major for usb endpoints"); | ||
169 | return error; | ||
170 | } | ||
171 | usb_endpoint_major = MAJOR(dev); | ||
172 | |||
173 | return error; | ||
174 | } | ||
175 | |||
176 | static void usb_endpoint_major_cleanup(void) | ||
177 | { | ||
178 | unregister_chrdev_region(MKDEV(usb_endpoint_major, 0), | ||
179 | MAX_ENDPOINT_MINORS); | ||
180 | } | ||
181 | |||
182 | static int endpoint_get_minor(struct ep_device *ep_dev) | ||
183 | { | ||
184 | static DEFINE_MUTEX(minor_lock); | ||
185 | int retval = -ENOMEM; | ||
186 | int id; | ||
187 | |||
188 | mutex_lock(&minor_lock); | ||
189 | if (idr_pre_get(&endpoint_idr, GFP_KERNEL) == 0) | ||
190 | goto exit; | ||
191 | |||
192 | retval = idr_get_new(&endpoint_idr, ep_dev, &id); | ||
193 | if (retval < 0) { | ||
194 | if (retval == -EAGAIN) | ||
195 | retval = -ENOMEM; | ||
196 | goto exit; | ||
197 | } | ||
198 | ep_dev->minor = id & MAX_ID_MASK; | ||
199 | exit: | ||
200 | mutex_unlock(&minor_lock); | ||
201 | return retval; | ||
202 | } | ||
203 | |||
204 | static void endpoint_free_minor(struct ep_device *ep_dev) | ||
205 | { | ||
206 | idr_remove(&endpoint_idr, ep_dev->minor); | ||
207 | } | ||
208 | |||
155 | static struct endpoint_class { | 209 | static struct endpoint_class { |
156 | struct kref kref; | 210 | struct kref kref; |
157 | struct class *class; | 211 | struct class *class; |
@@ -176,11 +230,20 @@ static int init_endpoint_class(void) | |||
176 | ep_class->class = class_create(THIS_MODULE, "usb_endpoint"); | 230 | ep_class->class = class_create(THIS_MODULE, "usb_endpoint"); |
177 | if (IS_ERR(ep_class->class)) { | 231 | if (IS_ERR(ep_class->class)) { |
178 | result = IS_ERR(ep_class->class); | 232 | result = IS_ERR(ep_class->class); |
179 | kfree(ep_class); | 233 | goto class_create_error; |
180 | ep_class = NULL; | ||
181 | goto exit; | ||
182 | } | 234 | } |
183 | 235 | ||
236 | result = usb_endpoint_major_init(); | ||
237 | if (result) | ||
238 | goto endpoint_major_error; | ||
239 | |||
240 | goto exit; | ||
241 | |||
242 | endpoint_major_error: | ||
243 | class_destroy(ep_class->class); | ||
244 | class_create_error: | ||
245 | kfree(ep_class); | ||
246 | ep_class = NULL; | ||
184 | exit: | 247 | exit: |
185 | return result; | 248 | return result; |
186 | } | 249 | } |
@@ -191,6 +254,7 @@ static void release_endpoint_class(struct kref *kref) | |||
191 | class_destroy(ep_class->class); | 254 | class_destroy(ep_class->class); |
192 | kfree(ep_class); | 255 | kfree(ep_class); |
193 | ep_class = NULL; | 256 | ep_class = NULL; |
257 | usb_endpoint_major_cleanup(); | ||
194 | } | 258 | } |
195 | 259 | ||
196 | static void destroy_endpoint_class(void) | 260 | static void destroy_endpoint_class(void) |
@@ -213,7 +277,6 @@ int usb_create_ep_files(struct device *parent, | |||
213 | { | 277 | { |
214 | char name[8]; | 278 | char name[8]; |
215 | struct ep_device *ep_dev; | 279 | struct ep_device *ep_dev; |
216 | int minor; | ||
217 | int retval; | 280 | int retval; |
218 | 281 | ||
219 | retval = init_endpoint_class(); | 282 | retval = init_endpoint_class(); |
@@ -226,12 +289,16 @@ int usb_create_ep_files(struct device *parent, | |||
226 | goto error_alloc; | 289 | goto error_alloc; |
227 | } | 290 | } |
228 | 291 | ||
229 | /* fun calculation to determine the minor of this endpoint */ | 292 | retval = endpoint_get_minor(ep_dev); |
230 | minor = (((udev->bus->busnum - 1) * 128) * 16) + (udev->devnum - 1); | 293 | if (retval) { |
294 | dev_err(parent, "can not allocate minor number for %s", | ||
295 | ep_dev->dev.bus_id); | ||
296 | goto error_register; | ||
297 | } | ||
231 | 298 | ||
232 | ep_dev->desc = &endpoint->desc; | 299 | ep_dev->desc = &endpoint->desc; |
233 | ep_dev->udev = udev; | 300 | ep_dev->udev = udev; |
234 | ep_dev->dev.devt = MKDEV(442, minor); // FIXME fake number... | 301 | ep_dev->dev.devt = MKDEV(usb_endpoint_major, ep_dev->minor); |
235 | ep_dev->dev.class = ep_class->class; | 302 | ep_dev->dev.class = ep_class->class; |
236 | ep_dev->dev.parent = parent; | 303 | ep_dev->dev.parent = parent; |
237 | ep_dev->dev.release = ep_device_release; | 304 | ep_dev->dev.release = ep_device_release; |
@@ -241,7 +308,7 @@ int usb_create_ep_files(struct device *parent, | |||
241 | 308 | ||
242 | retval = device_register(&ep_dev->dev); | 309 | retval = device_register(&ep_dev->dev); |
243 | if (retval) | 310 | if (retval) |
244 | goto error_register; | 311 | goto error_chrdev; |
245 | retval = sysfs_create_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); | 312 | retval = sysfs_create_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); |
246 | if (retval) | 313 | if (retval) |
247 | goto error_group; | 314 | goto error_group; |
@@ -261,6 +328,9 @@ error_group: | |||
261 | destroy_endpoint_class(); | 328 | destroy_endpoint_class(); |
262 | return retval; | 329 | return retval; |
263 | 330 | ||
331 | error_chrdev: | ||
332 | endpoint_free_minor(ep_dev); | ||
333 | |||
264 | error_register: | 334 | error_register: |
265 | kfree(ep_dev); | 335 | kfree(ep_dev); |
266 | error_alloc: | 336 | error_alloc: |
@@ -271,14 +341,16 @@ exit: | |||
271 | 341 | ||
272 | void usb_remove_ep_files(struct usb_host_endpoint *endpoint) | 342 | void usb_remove_ep_files(struct usb_host_endpoint *endpoint) |
273 | { | 343 | { |
344 | struct ep_device *ep_dev = endpoint->ep_dev; | ||
274 | 345 | ||
275 | if (endpoint->ep_dev) { | 346 | if (ep_dev) { |
276 | char name[8]; | 347 | char name[8]; |
277 | 348 | ||
278 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); | 349 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); |
279 | sysfs_remove_link(&endpoint->ep_dev->dev.parent->kobj, name); | 350 | sysfs_remove_link(&ep_dev->dev.parent->kobj, name); |
280 | sysfs_remove_group(&endpoint->ep_dev->dev.kobj, &ep_dev_attr_grp); | 351 | sysfs_remove_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); |
281 | device_unregister(&endpoint->ep_dev->dev); | 352 | endpoint_free_minor(ep_dev); |
353 | device_unregister(&ep_dev->dev); | ||
282 | endpoint->ep_dev = NULL; | 354 | endpoint->ep_dev = NULL; |
283 | destroy_endpoint_class(); | 355 | destroy_endpoint_class(); |
284 | } | 356 | } |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index afa2dd203329..10064af65d17 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -256,7 +256,9 @@ static const u8 hs_rh_config_descriptor [] = { | |||
256 | 0x05, /* __u8 ep_bDescriptorType; Endpoint */ | 256 | 0x05, /* __u8 ep_bDescriptorType; Endpoint */ |
257 | 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ | 257 | 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ |
258 | 0x03, /* __u8 ep_bmAttributes; Interrupt */ | 258 | 0x03, /* __u8 ep_bmAttributes; Interrupt */ |
259 | 0x02, 0x00, /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ | 259 | /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) |
260 | * see hub.c:hub_configure() for details. */ | ||
261 | (USB_MAXCHILDREN + 1 + 7) / 8, 0x00, | ||
260 | 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */ | 262 | 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */ |
261 | }; | 263 | }; |
262 | 264 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index ba165aff9ea4..0ce393eb3c4b 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -31,6 +31,47 @@ | |||
31 | #include "hcd.h" | 31 | #include "hcd.h" |
32 | #include "hub.h" | 32 | #include "hub.h" |
33 | 33 | ||
34 | struct usb_hub { | ||
35 | struct device *intfdev; /* the "interface" device */ | ||
36 | struct usb_device *hdev; | ||
37 | struct urb *urb; /* for interrupt polling pipe */ | ||
38 | |||
39 | /* buffer for urb ... with extra space in case of babble */ | ||
40 | char (*buffer)[8]; | ||
41 | dma_addr_t buffer_dma; /* DMA address for buffer */ | ||
42 | union { | ||
43 | struct usb_hub_status hub; | ||
44 | struct usb_port_status port; | ||
45 | } *status; /* buffer for status reports */ | ||
46 | |||
47 | int error; /* last reported error */ | ||
48 | int nerrors; /* track consecutive errors */ | ||
49 | |||
50 | struct list_head event_list; /* hubs w/data or errs ready */ | ||
51 | unsigned long event_bits[1]; /* status change bitmask */ | ||
52 | unsigned long change_bits[1]; /* ports with logical connect | ||
53 | status change */ | ||
54 | unsigned long busy_bits[1]; /* ports being reset or | ||
55 | resumed */ | ||
56 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ | ||
57 | #error event_bits[] is too short! | ||
58 | #endif | ||
59 | |||
60 | struct usb_hub_descriptor *descriptor; /* class descriptor */ | ||
61 | struct usb_tt tt; /* Transaction Translator */ | ||
62 | |||
63 | unsigned mA_per_port; /* current for each child */ | ||
64 | |||
65 | unsigned limited_power:1; | ||
66 | unsigned quiescing:1; | ||
67 | unsigned activating:1; | ||
68 | |||
69 | unsigned has_indicators:1; | ||
70 | u8 indicator[USB_MAXCHILDREN]; | ||
71 | struct work_struct leds; | ||
72 | }; | ||
73 | |||
74 | |||
34 | /* Protect struct usb_device->state and ->children members | 75 | /* Protect struct usb_device->state and ->children members |
35 | * Note: Both are also protected by ->dev.sem, except that ->state can | 76 | * Note: Both are also protected by ->dev.sem, except that ->state can |
36 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ | 77 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ |
@@ -45,6 +86,16 @@ static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); | |||
45 | 86 | ||
46 | static struct task_struct *khubd_task; | 87 | static struct task_struct *khubd_task; |
47 | 88 | ||
89 | /* multithreaded probe logic */ | ||
90 | static int multithread_probe = | ||
91 | #ifdef CONFIG_USB_MULTITHREAD_PROBE | ||
92 | 1; | ||
93 | #else | ||
94 | 0; | ||
95 | #endif | ||
96 | module_param(multithread_probe, bool, S_IRUGO); | ||
97 | MODULE_PARM_DESC(multithread_probe, "Run each USB device probe in a new thread"); | ||
98 | |||
48 | /* cycle leds on hubs that aren't blinking for attention */ | 99 | /* cycle leds on hubs that aren't blinking for attention */ |
49 | static int blinkenlights = 0; | 100 | static int blinkenlights = 0; |
50 | module_param (blinkenlights, bool, S_IRUGO); | 101 | module_param (blinkenlights, bool, S_IRUGO); |
@@ -276,6 +327,9 @@ static void kick_khubd(struct usb_hub *hub) | |||
276 | { | 327 | { |
277 | unsigned long flags; | 328 | unsigned long flags; |
278 | 329 | ||
330 | /* Suppress autosuspend until khubd runs */ | ||
331 | to_usb_interface(hub->intfdev)->pm_usage_cnt = 1; | ||
332 | |||
279 | spin_lock_irqsave(&hub_event_lock, flags); | 333 | spin_lock_irqsave(&hub_event_lock, flags); |
280 | if (list_empty(&hub->event_list)) { | 334 | if (list_empty(&hub->event_list)) { |
281 | list_add_tail(&hub->event_list, &hub_event_list); | 335 | list_add_tail(&hub->event_list, &hub_event_list); |
@@ -457,7 +511,6 @@ static void hub_quiesce(struct usb_hub *hub) | |||
457 | /* (nonblocking) khubd and related activity won't re-trigger */ | 511 | /* (nonblocking) khubd and related activity won't re-trigger */ |
458 | hub->quiescing = 1; | 512 | hub->quiescing = 1; |
459 | hub->activating = 0; | 513 | hub->activating = 0; |
460 | hub->resume_root_hub = 0; | ||
461 | 514 | ||
462 | /* (blocking) stop khubd and related activity */ | 515 | /* (blocking) stop khubd and related activity */ |
463 | usb_kill_urb(hub->urb); | 516 | usb_kill_urb(hub->urb); |
@@ -473,7 +526,7 @@ static void hub_activate(struct usb_hub *hub) | |||
473 | 526 | ||
474 | hub->quiescing = 0; | 527 | hub->quiescing = 0; |
475 | hub->activating = 1; | 528 | hub->activating = 1; |
476 | hub->resume_root_hub = 0; | 529 | |
477 | status = usb_submit_urb(hub->urb, GFP_NOIO); | 530 | status = usb_submit_urb(hub->urb, GFP_NOIO); |
478 | if (status < 0) | 531 | if (status < 0) |
479 | dev_err(hub->intfdev, "activate --> %d\n", status); | 532 | dev_err(hub->intfdev, "activate --> %d\n", status); |
@@ -759,7 +812,12 @@ static int hub_configure(struct usb_hub *hub, | |||
759 | dev_dbg(hub_dev, "%sover-current condition exists\n", | 812 | dev_dbg(hub_dev, "%sover-current condition exists\n", |
760 | (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); | 813 | (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); |
761 | 814 | ||
762 | /* set up the interrupt endpoint */ | 815 | /* set up the interrupt endpoint |
816 | * We use the EP's maxpacket size instead of (PORTS+1+7)/8 | ||
817 | * bytes as USB2.0[11.12.3] says because some hubs are known | ||
818 | * to send more data (and thus cause overflow). For root hubs, | ||
819 | * maxpktsize is defined in hcd.c's fake endpoint descriptors | ||
820 | * to be big enough for at least USB_MAXCHILDREN ports. */ | ||
763 | pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); | 821 | pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); |
764 | maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); | 822 | maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); |
765 | 823 | ||
@@ -883,6 +941,7 @@ descriptor_error: | |||
883 | INIT_WORK(&hub->leds, led_work, hub); | 941 | INIT_WORK(&hub->leds, led_work, hub); |
884 | 942 | ||
885 | usb_set_intfdata (intf, hub); | 943 | usb_set_intfdata (intf, hub); |
944 | intf->needs_remote_wakeup = 1; | ||
886 | 945 | ||
887 | if (hdev->speed == USB_SPEED_HIGH) | 946 | if (hdev->speed == USB_SPEED_HIGH) |
888 | highspeed_hubs++; | 947 | highspeed_hubs++; |
@@ -980,6 +1039,8 @@ static void recursively_mark_NOTATTACHED(struct usb_device *udev) | |||
980 | if (udev->children[i]) | 1039 | if (udev->children[i]) |
981 | recursively_mark_NOTATTACHED(udev->children[i]); | 1040 | recursively_mark_NOTATTACHED(udev->children[i]); |
982 | } | 1041 | } |
1042 | if (udev->state == USB_STATE_SUSPENDED) | ||
1043 | udev->discon_suspended = 1; | ||
983 | udev->state = USB_STATE_NOTATTACHED; | 1044 | udev->state = USB_STATE_NOTATTACHED; |
984 | } | 1045 | } |
985 | 1046 | ||
@@ -1169,6 +1230,14 @@ void usb_disconnect(struct usb_device **pdev) | |||
1169 | *pdev = NULL; | 1230 | *pdev = NULL; |
1170 | spin_unlock_irq(&device_state_lock); | 1231 | spin_unlock_irq(&device_state_lock); |
1171 | 1232 | ||
1233 | /* Decrement the parent's count of unsuspended children */ | ||
1234 | if (udev->parent) { | ||
1235 | usb_pm_lock(udev); | ||
1236 | if (!udev->discon_suspended) | ||
1237 | usb_autosuspend_device(udev->parent); | ||
1238 | usb_pm_unlock(udev); | ||
1239 | } | ||
1240 | |||
1172 | put_device(&udev->dev); | 1241 | put_device(&udev->dev); |
1173 | } | 1242 | } |
1174 | 1243 | ||
@@ -1191,29 +1260,17 @@ static inline void show_string(struct usb_device *udev, char *id, char *string) | |||
1191 | static int __usb_port_suspend(struct usb_device *, int port1); | 1260 | static int __usb_port_suspend(struct usb_device *, int port1); |
1192 | #endif | 1261 | #endif |
1193 | 1262 | ||
1194 | /** | 1263 | static int __usb_new_device(void *void_data) |
1195 | * usb_new_device - perform initial device setup (usbcore-internal) | ||
1196 | * @udev: newly addressed device (in ADDRESS state) | ||
1197 | * | ||
1198 | * This is called with devices which have been enumerated, but not yet | ||
1199 | * configured. The device descriptor is available, but not descriptors | ||
1200 | * for any device configuration. The caller must have locked either | ||
1201 | * the parent hub (if udev is a normal device) or else the | ||
1202 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to | ||
1203 | * udev has already been installed, but udev is not yet visible through | ||
1204 | * sysfs or other filesystem code. | ||
1205 | * | ||
1206 | * Returns 0 for success (device is configured and listed, with its | ||
1207 | * interfaces, in sysfs); else a negative errno value. | ||
1208 | * | ||
1209 | * This call is synchronous, and may not be used in an interrupt context. | ||
1210 | * | ||
1211 | * Only the hub driver or root-hub registrar should ever call this. | ||
1212 | */ | ||
1213 | int usb_new_device(struct usb_device *udev) | ||
1214 | { | 1264 | { |
1265 | struct usb_device *udev = void_data; | ||
1215 | int err; | 1266 | int err; |
1216 | 1267 | ||
1268 | /* Lock ourself into memory in order to keep a probe sequence | ||
1269 | * sleeping in a new thread from allowing us to be unloaded. | ||
1270 | */ | ||
1271 | if (!try_module_get(THIS_MODULE)) | ||
1272 | return -EINVAL; | ||
1273 | |||
1217 | err = usb_get_configuration(udev); | 1274 | err = usb_get_configuration(udev); |
1218 | if (err < 0) { | 1275 | if (err < 0) { |
1219 | dev_err(&udev->dev, "can't read configurations, error %d\n", | 1276 | dev_err(&udev->dev, "can't read configurations, error %d\n", |
@@ -1309,13 +1366,56 @@ int usb_new_device(struct usb_device *udev) | |||
1309 | goto fail; | 1366 | goto fail; |
1310 | } | 1367 | } |
1311 | 1368 | ||
1312 | return 0; | 1369 | /* Increment the parent's count of unsuspended children */ |
1370 | if (udev->parent) | ||
1371 | usb_autoresume_device(udev->parent); | ||
1372 | |||
1373 | exit: | ||
1374 | module_put(THIS_MODULE); | ||
1375 | return err; | ||
1313 | 1376 | ||
1314 | fail: | 1377 | fail: |
1315 | usb_set_device_state(udev, USB_STATE_NOTATTACHED); | 1378 | usb_set_device_state(udev, USB_STATE_NOTATTACHED); |
1316 | return err; | 1379 | goto exit; |
1317 | } | 1380 | } |
1318 | 1381 | ||
1382 | /** | ||
1383 | * usb_new_device - perform initial device setup (usbcore-internal) | ||
1384 | * @udev: newly addressed device (in ADDRESS state) | ||
1385 | * | ||
1386 | * This is called with devices which have been enumerated, but not yet | ||
1387 | * configured. The device descriptor is available, but not descriptors | ||
1388 | * for any device configuration. The caller must have locked either | ||
1389 | * the parent hub (if udev is a normal device) or else the | ||
1390 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to | ||
1391 | * udev has already been installed, but udev is not yet visible through | ||
1392 | * sysfs or other filesystem code. | ||
1393 | * | ||
1394 | * The return value for this function depends on if the | ||
1395 | * multithread_probe variable is set or not. If it's set, it will | ||
1396 | * return a if the probe thread was successfully created or not. If the | ||
1397 | * variable is not set, it will return if the device is configured | ||
1398 | * properly or not. interfaces, in sysfs); else a negative errno value. | ||
1399 | * | ||
1400 | * This call is synchronous, and may not be used in an interrupt context. | ||
1401 | * | ||
1402 | * Only the hub driver or root-hub registrar should ever call this. | ||
1403 | */ | ||
1404 | int usb_new_device(struct usb_device *udev) | ||
1405 | { | ||
1406 | struct task_struct *probe_task; | ||
1407 | int ret = 0; | ||
1408 | |||
1409 | if (multithread_probe) { | ||
1410 | probe_task = kthread_run(__usb_new_device, udev, | ||
1411 | "usb-probe-%s", udev->devnum); | ||
1412 | if (IS_ERR(probe_task)) | ||
1413 | ret = PTR_ERR(probe_task); | ||
1414 | } else | ||
1415 | ret = __usb_new_device(udev); | ||
1416 | |||
1417 | return ret; | ||
1418 | } | ||
1319 | 1419 | ||
1320 | static int hub_port_status(struct usb_hub *hub, int port1, | 1420 | static int hub_port_status(struct usb_hub *hub, int port1, |
1321 | u16 *status, u16 *change) | 1421 | u16 *status, u16 *change) |
@@ -1323,10 +1423,12 @@ static int hub_port_status(struct usb_hub *hub, int port1, | |||
1323 | int ret; | 1423 | int ret; |
1324 | 1424 | ||
1325 | ret = get_port_status(hub->hdev, port1, &hub->status->port); | 1425 | ret = get_port_status(hub->hdev, port1, &hub->status->port); |
1326 | if (ret < 0) | 1426 | if (ret < 4) { |
1327 | dev_err (hub->intfdev, | 1427 | dev_err (hub->intfdev, |
1328 | "%s failed (err = %d)\n", __FUNCTION__, ret); | 1428 | "%s failed (err = %d)\n", __FUNCTION__, ret); |
1329 | else { | 1429 | if (ret >= 0) |
1430 | ret = -EIO; | ||
1431 | } else { | ||
1330 | *status = le16_to_cpu(hub->status->port.wPortStatus); | 1432 | *status = le16_to_cpu(hub->status->port.wPortStatus); |
1331 | *change = le16_to_cpu(hub->status->port.wPortChange); | 1433 | *change = le16_to_cpu(hub->status->port.wPortChange); |
1332 | ret = 0; | 1434 | ret = 0; |
@@ -1674,6 +1776,12 @@ static int | |||
1674 | hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | 1776 | hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) |
1675 | { | 1777 | { |
1676 | int status; | 1778 | int status; |
1779 | u16 portchange, portstatus; | ||
1780 | |||
1781 | /* Skip the initial Clear-Suspend step for a remote wakeup */ | ||
1782 | status = hub_port_status(hub, port1, &portstatus, &portchange); | ||
1783 | if (status == 0 && !(portstatus & USB_PORT_STAT_SUSPEND)) | ||
1784 | goto SuspendCleared; | ||
1677 | 1785 | ||
1678 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); | 1786 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); |
1679 | 1787 | ||
@@ -1687,9 +1795,6 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | |||
1687 | "can't resume port %d, status %d\n", | 1795 | "can't resume port %d, status %d\n", |
1688 | port1, status); | 1796 | port1, status); |
1689 | } else { | 1797 | } else { |
1690 | u16 devstatus; | ||
1691 | u16 portchange; | ||
1692 | |||
1693 | /* drive resume for at least 20 msec */ | 1798 | /* drive resume for at least 20 msec */ |
1694 | if (udev) | 1799 | if (udev) |
1695 | dev_dbg(&udev->dev, "usb %sresume\n", | 1800 | dev_dbg(&udev->dev, "usb %sresume\n", |
@@ -1704,16 +1809,15 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | |||
1704 | * stop resume signaling. Then finish the resume | 1809 | * stop resume signaling. Then finish the resume |
1705 | * sequence. | 1810 | * sequence. |
1706 | */ | 1811 | */ |
1707 | devstatus = portchange = 0; | 1812 | status = hub_port_status(hub, port1, &portstatus, &portchange); |
1708 | status = hub_port_status(hub, port1, | 1813 | SuspendCleared: |
1709 | &devstatus, &portchange); | ||
1710 | if (status < 0 | 1814 | if (status < 0 |
1711 | || (devstatus & LIVE_FLAGS) != LIVE_FLAGS | 1815 | || (portstatus & LIVE_FLAGS) != LIVE_FLAGS |
1712 | || (devstatus & USB_PORT_STAT_SUSPEND) != 0 | 1816 | || (portstatus & USB_PORT_STAT_SUSPEND) != 0 |
1713 | ) { | 1817 | ) { |
1714 | dev_dbg(hub->intfdev, | 1818 | dev_dbg(hub->intfdev, |
1715 | "port %d status %04x.%04x after resume, %d\n", | 1819 | "port %d status %04x.%04x after resume, %d\n", |
1716 | port1, portchange, devstatus, status); | 1820 | port1, portchange, portstatus, status); |
1717 | if (status >= 0) | 1821 | if (status >= 0) |
1718 | status = -ENODEV; | 1822 | status = -ENODEV; |
1719 | } else { | 1823 | } else { |
@@ -1774,23 +1878,16 @@ static int remote_wakeup(struct usb_device *udev) | |||
1774 | { | 1878 | { |
1775 | int status = 0; | 1879 | int status = 0; |
1776 | 1880 | ||
1777 | /* All this just to avoid sending a port-resume message | ||
1778 | * to the parent hub! */ | ||
1779 | |||
1780 | usb_lock_device(udev); | 1881 | usb_lock_device(udev); |
1781 | usb_pm_lock(udev); | ||
1782 | if (udev->state == USB_STATE_SUSPENDED) { | 1882 | if (udev->state == USB_STATE_SUSPENDED) { |
1783 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); | 1883 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); |
1784 | /* TRSMRCY = 10 msec */ | 1884 | status = usb_autoresume_device(udev); |
1785 | msleep(10); | 1885 | |
1786 | status = finish_port_resume(udev); | 1886 | /* Give the interface drivers a chance to do something, |
1887 | * then autosuspend the device again. */ | ||
1787 | if (status == 0) | 1888 | if (status == 0) |
1788 | udev->dev.power.power_state.event = PM_EVENT_ON; | 1889 | usb_autosuspend_device(udev); |
1789 | } | 1890 | } |
1790 | usb_pm_unlock(udev); | ||
1791 | |||
1792 | if (status == 0) | ||
1793 | usb_autoresume_device(udev, 0); | ||
1794 | usb_unlock_device(udev); | 1891 | usb_unlock_device(udev); |
1795 | return status; | 1892 | return status; |
1796 | } | 1893 | } |
@@ -1854,6 +1951,8 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
1854 | } | 1951 | } |
1855 | } | 1952 | } |
1856 | 1953 | ||
1954 | dev_dbg(&intf->dev, "%s\n", __FUNCTION__); | ||
1955 | |||
1857 | /* "global suspend" of the downstream HC-to-USB interface */ | 1956 | /* "global suspend" of the downstream HC-to-USB interface */ |
1858 | if (!hdev->parent) { | 1957 | if (!hdev->parent) { |
1859 | struct usb_bus *bus = hdev->bus; | 1958 | struct usb_bus *bus = hdev->bus; |
@@ -1876,10 +1975,12 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
1876 | 1975 | ||
1877 | static int hub_resume(struct usb_interface *intf) | 1976 | static int hub_resume(struct usb_interface *intf) |
1878 | { | 1977 | { |
1879 | struct usb_device *hdev = interface_to_usbdev(intf); | ||
1880 | struct usb_hub *hub = usb_get_intfdata (intf); | 1978 | struct usb_hub *hub = usb_get_intfdata (intf); |
1979 | struct usb_device *hdev = hub->hdev; | ||
1881 | int status; | 1980 | int status; |
1882 | 1981 | ||
1982 | dev_dbg(&intf->dev, "%s\n", __FUNCTION__); | ||
1983 | |||
1883 | /* "global resume" of the downstream HC-to-USB interface */ | 1984 | /* "global resume" of the downstream HC-to-USB interface */ |
1884 | if (!hdev->parent) { | 1985 | if (!hdev->parent) { |
1885 | struct usb_bus *bus = hdev->bus; | 1986 | struct usb_bus *bus = hdev->bus; |
@@ -1918,7 +2019,6 @@ void usb_resume_root_hub(struct usb_device *hdev) | |||
1918 | { | 2019 | { |
1919 | struct usb_hub *hub = hdev_to_hub(hdev); | 2020 | struct usb_hub *hub = hdev_to_hub(hdev); |
1920 | 2021 | ||
1921 | hub->resume_root_hub = 1; | ||
1922 | kick_khubd(hub); | 2022 | kick_khubd(hub); |
1923 | } | 2023 | } |
1924 | 2024 | ||
@@ -2555,16 +2655,13 @@ static void hub_events(void) | |||
2555 | intf = to_usb_interface(hub->intfdev); | 2655 | intf = to_usb_interface(hub->intfdev); |
2556 | hub_dev = &intf->dev; | 2656 | hub_dev = &intf->dev; |
2557 | 2657 | ||
2558 | i = hub->resume_root_hub; | 2658 | dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n", |
2559 | |||
2560 | dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x%s\n", | ||
2561 | hdev->state, hub->descriptor | 2659 | hdev->state, hub->descriptor |
2562 | ? hub->descriptor->bNbrPorts | 2660 | ? hub->descriptor->bNbrPorts |
2563 | : 0, | 2661 | : 0, |
2564 | /* NOTE: expects max 15 ports... */ | 2662 | /* NOTE: expects max 15 ports... */ |
2565 | (u16) hub->change_bits[0], | 2663 | (u16) hub->change_bits[0], |
2566 | (u16) hub->event_bits[0], | 2664 | (u16) hub->event_bits[0]); |
2567 | i ? ", resume root" : ""); | ||
2568 | 2665 | ||
2569 | usb_get_intf(intf); | 2666 | usb_get_intf(intf); |
2570 | spin_unlock_irq(&hub_event_lock); | 2667 | spin_unlock_irq(&hub_event_lock); |
@@ -2585,16 +2682,16 @@ static void hub_events(void) | |||
2585 | goto loop; | 2682 | goto loop; |
2586 | } | 2683 | } |
2587 | 2684 | ||
2588 | /* Is this is a root hub wanting to reactivate the downstream | 2685 | /* Autoresume */ |
2589 | * ports? If so, be sure the interface resumes even if its | 2686 | ret = usb_autopm_get_interface(intf); |
2590 | * stub "device" node was never suspended. | 2687 | if (ret) { |
2591 | */ | 2688 | dev_dbg(hub_dev, "Can't autoresume: %d\n", ret); |
2592 | if (i) | 2689 | goto loop; |
2593 | usb_autoresume_device(hdev, 0); | 2690 | } |
2594 | 2691 | ||
2595 | /* If this is an inactive or suspended hub, do nothing */ | 2692 | /* If this is an inactive hub, do nothing */ |
2596 | if (hub->quiescing) | 2693 | if (hub->quiescing) |
2597 | goto loop; | 2694 | goto loop_autopm; |
2598 | 2695 | ||
2599 | if (hub->error) { | 2696 | if (hub->error) { |
2600 | dev_dbg (hub_dev, "resetting for error %d\n", | 2697 | dev_dbg (hub_dev, "resetting for error %d\n", |
@@ -2604,7 +2701,7 @@ static void hub_events(void) | |||
2604 | if (ret) { | 2701 | if (ret) { |
2605 | dev_dbg (hub_dev, | 2702 | dev_dbg (hub_dev, |
2606 | "error resetting hub: %d\n", ret); | 2703 | "error resetting hub: %d\n", ret); |
2607 | goto loop; | 2704 | goto loop_autopm; |
2608 | } | 2705 | } |
2609 | 2706 | ||
2610 | hub->nerrors = 0; | 2707 | hub->nerrors = 0; |
@@ -2732,6 +2829,10 @@ static void hub_events(void) | |||
2732 | if (!hdev->parent && !hub->busy_bits[0]) | 2829 | if (!hdev->parent && !hub->busy_bits[0]) |
2733 | usb_enable_root_hub_irq(hdev->bus); | 2830 | usb_enable_root_hub_irq(hdev->bus); |
2734 | 2831 | ||
2832 | loop_autopm: | ||
2833 | /* Allow autosuspend if we're not going to run again */ | ||
2834 | if (list_empty(&hub->event_list)) | ||
2835 | usb_autopm_enable(intf); | ||
2735 | loop: | 2836 | loop: |
2736 | usb_unlock_device(hdev); | 2837 | usb_unlock_device(hdev); |
2737 | usb_put_intf(intf); | 2838 | usb_put_intf(intf); |
@@ -2773,6 +2874,7 @@ static struct usb_driver hub_driver = { | |||
2773 | .post_reset = hub_post_reset, | 2874 | .post_reset = hub_post_reset, |
2774 | .ioctl = hub_ioctl, | 2875 | .ioctl = hub_ioctl, |
2775 | .id_table = hub_id_table, | 2876 | .id_table = hub_id_table, |
2877 | .supports_autosuspend = 1, | ||
2776 | }; | 2878 | }; |
2777 | 2879 | ||
2778 | int usb_hub_init(void) | 2880 | int usb_hub_init(void) |
@@ -2997,7 +3099,7 @@ int usb_reset_composite_device(struct usb_device *udev, | |||
2997 | } | 3099 | } |
2998 | 3100 | ||
2999 | /* Prevent autosuspend during the reset */ | 3101 | /* Prevent autosuspend during the reset */ |
3000 | usb_autoresume_device(udev, 1); | 3102 | usb_autoresume_device(udev); |
3001 | 3103 | ||
3002 | if (iface && iface->condition != USB_INTERFACE_BINDING) | 3104 | if (iface && iface->condition != USB_INTERFACE_BINDING) |
3003 | iface = NULL; | 3105 | iface = NULL; |
@@ -3040,7 +3142,7 @@ int usb_reset_composite_device(struct usb_device *udev, | |||
3040 | } | 3142 | } |
3041 | } | 3143 | } |
3042 | 3144 | ||
3043 | usb_autosuspend_device(udev, 1); | 3145 | usb_autosuspend_device(udev); |
3044 | return ret; | 3146 | return ret; |
3045 | } | 3147 | } |
3046 | EXPORT_SYMBOL(usb_reset_composite_device); | 3148 | EXPORT_SYMBOL(usb_reset_composite_device); |
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 0f8e82a4d480..cf9559c6c9b6 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h | |||
@@ -192,45 +192,4 @@ struct usb_tt_clear { | |||
192 | 192 | ||
193 | extern void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe); | 193 | extern void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe); |
194 | 194 | ||
195 | struct usb_hub { | ||
196 | struct device *intfdev; /* the "interface" device */ | ||
197 | struct usb_device *hdev; | ||
198 | struct urb *urb; /* for interrupt polling pipe */ | ||
199 | |||
200 | /* buffer for urb ... with extra space in case of babble */ | ||
201 | char (*buffer)[8]; | ||
202 | dma_addr_t buffer_dma; /* DMA address for buffer */ | ||
203 | union { | ||
204 | struct usb_hub_status hub; | ||
205 | struct usb_port_status port; | ||
206 | } *status; /* buffer for status reports */ | ||
207 | |||
208 | int error; /* last reported error */ | ||
209 | int nerrors; /* track consecutive errors */ | ||
210 | |||
211 | struct list_head event_list; /* hubs w/data or errs ready */ | ||
212 | unsigned long event_bits[1]; /* status change bitmask */ | ||
213 | unsigned long change_bits[1]; /* ports with logical connect | ||
214 | status change */ | ||
215 | unsigned long busy_bits[1]; /* ports being reset or | ||
216 | resumed */ | ||
217 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ | ||
218 | #error event_bits[] is too short! | ||
219 | #endif | ||
220 | |||
221 | struct usb_hub_descriptor *descriptor; /* class descriptor */ | ||
222 | struct usb_tt tt; /* Transaction Translator */ | ||
223 | |||
224 | unsigned mA_per_port; /* current for each child */ | ||
225 | |||
226 | unsigned limited_power:1; | ||
227 | unsigned quiescing:1; | ||
228 | unsigned activating:1; | ||
229 | unsigned resume_root_hub:1; | ||
230 | |||
231 | unsigned has_indicators:1; | ||
232 | enum hub_led_mode indicator[USB_MAXCHILDREN]; | ||
233 | struct work_struct leds; | ||
234 | }; | ||
235 | |||
236 | #endif /* __LINUX_HUB_H */ | 195 | #endif /* __LINUX_HUB_H */ |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 7729c0744886..29b0fa9ff9d0 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -764,7 +764,7 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) | |||
764 | err = -EINVAL; | 764 | err = -EINVAL; |
765 | goto errout; | 765 | goto errout; |
766 | } else { | 766 | } else { |
767 | dev->have_langid = -1; | 767 | dev->have_langid = 1; |
768 | dev->string_langid = tbuf[2] | (tbuf[3]<< 8); | 768 | dev->string_langid = tbuf[2] | (tbuf[3]<< 8); |
769 | /* always use the first langid listed */ | 769 | /* always use the first langid listed */ |
770 | dev_dbg (&dev->dev, "default language 0x%04x\n", | 770 | dev_dbg (&dev->dev, "default language 0x%04x\n", |
@@ -1398,7 +1398,7 @@ free_interfaces: | |||
1398 | } | 1398 | } |
1399 | 1399 | ||
1400 | /* Wake up the device so we can send it the Set-Config request */ | 1400 | /* Wake up the device so we can send it the Set-Config request */ |
1401 | ret = usb_autoresume_device(dev, 1); | 1401 | ret = usb_autoresume_device(dev); |
1402 | if (ret) | 1402 | if (ret) |
1403 | goto free_interfaces; | 1403 | goto free_interfaces; |
1404 | 1404 | ||
@@ -1421,7 +1421,7 @@ free_interfaces: | |||
1421 | dev->actconfig = cp; | 1421 | dev->actconfig = cp; |
1422 | if (!cp) { | 1422 | if (!cp) { |
1423 | usb_set_device_state(dev, USB_STATE_ADDRESS); | 1423 | usb_set_device_state(dev, USB_STATE_ADDRESS); |
1424 | usb_autosuspend_device(dev, 1); | 1424 | usb_autosuspend_device(dev); |
1425 | goto free_interfaces; | 1425 | goto free_interfaces; |
1426 | } | 1426 | } |
1427 | usb_set_device_state(dev, USB_STATE_CONFIGURED); | 1427 | usb_set_device_state(dev, USB_STATE_CONFIGURED); |
@@ -1490,7 +1490,7 @@ free_interfaces: | |||
1490 | usb_create_sysfs_intf_files (intf); | 1490 | usb_create_sysfs_intf_files (intf); |
1491 | } | 1491 | } |
1492 | 1492 | ||
1493 | usb_autosuspend_device(dev, 1); | 1493 | usb_autosuspend_device(dev); |
1494 | return 0; | 1494 | return 0; |
1495 | } | 1495 | } |
1496 | 1496 | ||
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 467cb02832f3..81cb52564e68 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -200,13 +200,6 @@ static void ksuspend_usb_cleanup(void) | |||
200 | destroy_workqueue(ksuspend_usb_wq); | 200 | destroy_workqueue(ksuspend_usb_wq); |
201 | } | 201 | } |
202 | 202 | ||
203 | #else | ||
204 | |||
205 | #define ksuspend_usb_init() 0 | ||
206 | #define ksuspend_usb_cleanup() do {} while (0) | ||
207 | |||
208 | #endif | ||
209 | |||
210 | #ifdef CONFIG_USB_SUSPEND | 203 | #ifdef CONFIG_USB_SUSPEND |
211 | 204 | ||
212 | /* usb_autosuspend_work - callback routine to autosuspend a USB device */ | 205 | /* usb_autosuspend_work - callback routine to autosuspend a USB device */ |
@@ -225,7 +218,14 @@ static void usb_autosuspend_work(void *_udev) | |||
225 | static void usb_autosuspend_work(void *_udev) | 218 | static void usb_autosuspend_work(void *_udev) |
226 | {} | 219 | {} |
227 | 220 | ||
228 | #endif | 221 | #endif /* CONFIG_USB_SUSPEND */ |
222 | |||
223 | #else | ||
224 | |||
225 | #define ksuspend_usb_init() 0 | ||
226 | #define ksuspend_usb_cleanup() do {} while (0) | ||
227 | |||
228 | #endif /* CONFIG_PM */ | ||
229 | 229 | ||
230 | /** | 230 | /** |
231 | * usb_alloc_dev - usb device constructor (usbcore-internal) | 231 | * usb_alloc_dev - usb device constructor (usbcore-internal) |
@@ -537,138 +537,6 @@ int usb_get_current_frame_number(struct usb_device *dev) | |||
537 | return usb_hcd_get_frame_number (dev); | 537 | return usb_hcd_get_frame_number (dev); |
538 | } | 538 | } |
539 | 539 | ||
540 | /** | ||
541 | * usb_endpoint_dir_in - check if the endpoint has IN direction | ||
542 | * @epd: endpoint to be checked | ||
543 | * | ||
544 | * Returns true if the endpoint is of type IN, otherwise it returns false. | ||
545 | */ | ||
546 | int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) | ||
547 | { | ||
548 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); | ||
549 | } | ||
550 | |||
551 | /** | ||
552 | * usb_endpoint_dir_out - check if the endpoint has OUT direction | ||
553 | * @epd: endpoint to be checked | ||
554 | * | ||
555 | * Returns true if the endpoint is of type OUT, otherwise it returns false. | ||
556 | */ | ||
557 | int usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) | ||
558 | { | ||
559 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); | ||
560 | } | ||
561 | |||
562 | /** | ||
563 | * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type | ||
564 | * @epd: endpoint to be checked | ||
565 | * | ||
566 | * Returns true if the endpoint is of type bulk, otherwise it returns false. | ||
567 | */ | ||
568 | int usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) | ||
569 | { | ||
570 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
571 | USB_ENDPOINT_XFER_BULK); | ||
572 | } | ||
573 | |||
574 | /** | ||
575 | * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type | ||
576 | * @epd: endpoint to be checked | ||
577 | * | ||
578 | * Returns true if the endpoint is of type interrupt, otherwise it returns | ||
579 | * false. | ||
580 | */ | ||
581 | int usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) | ||
582 | { | ||
583 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
584 | USB_ENDPOINT_XFER_INT); | ||
585 | } | ||
586 | |||
587 | /** | ||
588 | * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type | ||
589 | * @epd: endpoint to be checked | ||
590 | * | ||
591 | * Returns true if the endpoint is of type isochronous, otherwise it returns | ||
592 | * false. | ||
593 | */ | ||
594 | int usb_endpoint_xfer_isoc(const struct usb_endpoint_descriptor *epd) | ||
595 | { | ||
596 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
597 | USB_ENDPOINT_XFER_ISOC); | ||
598 | } | ||
599 | |||
600 | /** | ||
601 | * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN | ||
602 | * @epd: endpoint to be checked | ||
603 | * | ||
604 | * Returns true if the endpoint has bulk transfer type and IN direction, | ||
605 | * otherwise it returns false. | ||
606 | */ | ||
607 | int usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) | ||
608 | { | ||
609 | return (usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd)); | ||
610 | } | ||
611 | |||
612 | /** | ||
613 | * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT | ||
614 | * @epd: endpoint to be checked | ||
615 | * | ||
616 | * Returns true if the endpoint has bulk transfer type and OUT direction, | ||
617 | * otherwise it returns false. | ||
618 | */ | ||
619 | int usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) | ||
620 | { | ||
621 | return (usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd)); | ||
622 | } | ||
623 | |||
624 | /** | ||
625 | * usb_endpoint_is_int_in - check if the endpoint is interrupt IN | ||
626 | * @epd: endpoint to be checked | ||
627 | * | ||
628 | * Returns true if the endpoint has interrupt transfer type and IN direction, | ||
629 | * otherwise it returns false. | ||
630 | */ | ||
631 | int usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) | ||
632 | { | ||
633 | return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd)); | ||
634 | } | ||
635 | |||
636 | /** | ||
637 | * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT | ||
638 | * @epd: endpoint to be checked | ||
639 | * | ||
640 | * Returns true if the endpoint has interrupt transfer type and OUT direction, | ||
641 | * otherwise it returns false. | ||
642 | */ | ||
643 | int usb_endpoint_is_int_out(const struct usb_endpoint_descriptor *epd) | ||
644 | { | ||
645 | return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd)); | ||
646 | } | ||
647 | |||
648 | /** | ||
649 | * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN | ||
650 | * @epd: endpoint to be checked | ||
651 | * | ||
652 | * Returns true if the endpoint has isochronous transfer type and IN direction, | ||
653 | * otherwise it returns false. | ||
654 | */ | ||
655 | int usb_endpoint_is_isoc_in(const struct usb_endpoint_descriptor *epd) | ||
656 | { | ||
657 | return (usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd)); | ||
658 | } | ||
659 | |||
660 | /** | ||
661 | * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT | ||
662 | * @epd: endpoint to be checked | ||
663 | * | ||
664 | * Returns true if the endpoint has isochronous transfer type and OUT direction, | ||
665 | * otherwise it returns false. | ||
666 | */ | ||
667 | int usb_endpoint_is_isoc_out(const struct usb_endpoint_descriptor *epd) | ||
668 | { | ||
669 | return (usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd)); | ||
670 | } | ||
671 | |||
672 | /*-------------------------------------------------------------------*/ | 540 | /*-------------------------------------------------------------------*/ |
673 | /* | 541 | /* |
674 | * __usb_get_extra_descriptor() finds a descriptor of specific type in the | 542 | * __usb_get_extra_descriptor() finds a descriptor of specific type in the |
@@ -1102,18 +970,6 @@ EXPORT_SYMBOL(__usb_get_extra_descriptor); | |||
1102 | EXPORT_SYMBOL(usb_find_device); | 970 | EXPORT_SYMBOL(usb_find_device); |
1103 | EXPORT_SYMBOL(usb_get_current_frame_number); | 971 | EXPORT_SYMBOL(usb_get_current_frame_number); |
1104 | 972 | ||
1105 | EXPORT_SYMBOL_GPL(usb_endpoint_dir_in); | ||
1106 | EXPORT_SYMBOL_GPL(usb_endpoint_dir_out); | ||
1107 | EXPORT_SYMBOL_GPL(usb_endpoint_xfer_bulk); | ||
1108 | EXPORT_SYMBOL_GPL(usb_endpoint_xfer_int); | ||
1109 | EXPORT_SYMBOL_GPL(usb_endpoint_xfer_isoc); | ||
1110 | EXPORT_SYMBOL_GPL(usb_endpoint_is_bulk_in); | ||
1111 | EXPORT_SYMBOL_GPL(usb_endpoint_is_bulk_out); | ||
1112 | EXPORT_SYMBOL_GPL(usb_endpoint_is_int_in); | ||
1113 | EXPORT_SYMBOL_GPL(usb_endpoint_is_int_out); | ||
1114 | EXPORT_SYMBOL_GPL(usb_endpoint_is_isoc_in); | ||
1115 | EXPORT_SYMBOL_GPL(usb_endpoint_is_isoc_out); | ||
1116 | |||
1117 | EXPORT_SYMBOL (usb_buffer_alloc); | 973 | EXPORT_SYMBOL (usb_buffer_alloc); |
1118 | EXPORT_SYMBOL (usb_buffer_free); | 974 | EXPORT_SYMBOL (usb_buffer_free); |
1119 | 975 | ||
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 13322e33f912..17830a81be14 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
@@ -64,14 +64,13 @@ static inline void usb_pm_unlock(struct usb_device *udev) {} | |||
64 | 64 | ||
65 | #define USB_AUTOSUSPEND_DELAY (HZ*2) | 65 | #define USB_AUTOSUSPEND_DELAY (HZ*2) |
66 | 66 | ||
67 | extern void usb_autosuspend_device(struct usb_device *udev, int dec_busy_cnt); | 67 | extern void usb_autosuspend_device(struct usb_device *udev); |
68 | extern int usb_autoresume_device(struct usb_device *udev, int inc_busy_cnt); | 68 | extern int usb_autoresume_device(struct usb_device *udev); |
69 | 69 | ||
70 | #else | 70 | #else |
71 | 71 | ||
72 | #define usb_autosuspend_device(udev, dec_busy_cnt) do {} while (0) | 72 | #define usb_autosuspend_device(udev) do {} while (0) |
73 | static inline int usb_autoresume_device(struct usb_device *udev, | 73 | static inline int usb_autoresume_device(struct usb_device *udev) |
74 | int inc_busy_cnt) | ||
75 | { | 74 | { |
76 | return 0; | 75 | return 0; |
77 | } | 76 | } |
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 1c17d26d03b8..3bd1dfe565c1 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
@@ -1894,13 +1894,13 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) | |||
1894 | if (!eth_is_promisc (dev)) { | 1894 | if (!eth_is_promisc (dev)) { |
1895 | u8 *dest = skb->data; | 1895 | u8 *dest = skb->data; |
1896 | 1896 | ||
1897 | if (dest [0] & 0x01) { | 1897 | if (is_multicast_ether_addr(dest)) { |
1898 | u16 type; | 1898 | u16 type; |
1899 | 1899 | ||
1900 | /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host | 1900 | /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host |
1901 | * SET_ETHERNET_MULTICAST_FILTERS requests | 1901 | * SET_ETHERNET_MULTICAST_FILTERS requests |
1902 | */ | 1902 | */ |
1903 | if (memcmp (dest, net->broadcast, ETH_ALEN) == 0) | 1903 | if (is_broadcast_ether_addr(dest)) |
1904 | type = USB_CDC_PACKET_TYPE_BROADCAST; | 1904 | type = USB_CDC_PACKET_TYPE_BROADCAST; |
1905 | else | 1905 | else |
1906 | type = USB_CDC_PACKET_TYPE_ALL_MULTICAST; | 1906 | type = USB_CDC_PACKET_TYPE_ALL_MULTICAST; |
diff --git a/drivers/usb/gadget/lh7a40x_udc.c b/drivers/usb/gadget/lh7a40x_udc.c index 179259664c18..4a991564a03e 100644 --- a/drivers/usb/gadget/lh7a40x_udc.c +++ b/drivers/usb/gadget/lh7a40x_udc.c | |||
@@ -83,7 +83,6 @@ static int lh7a40x_queue(struct usb_ep *ep, struct usb_request *, gfp_t); | |||
83 | static int lh7a40x_dequeue(struct usb_ep *ep, struct usb_request *); | 83 | static int lh7a40x_dequeue(struct usb_ep *ep, struct usb_request *); |
84 | static int lh7a40x_set_halt(struct usb_ep *ep, int); | 84 | static int lh7a40x_set_halt(struct usb_ep *ep, int); |
85 | static int lh7a40x_fifo_status(struct usb_ep *ep); | 85 | static int lh7a40x_fifo_status(struct usb_ep *ep); |
86 | static int lh7a40x_fifo_status(struct usb_ep *ep); | ||
87 | static void lh7a40x_fifo_flush(struct usb_ep *ep); | 86 | static void lh7a40x_fifo_flush(struct usb_ep *ep); |
88 | static void lh7a40x_ep0_kick(struct lh7a40x_udc *dev, struct lh7a40x_ep *ep); | 87 | static void lh7a40x_ep0_kick(struct lh7a40x_udc *dev, struct lh7a40x_ep *ep); |
89 | static void lh7a40x_handle_ep0(struct lh7a40x_udc *dev, u32 intr); | 88 | static void lh7a40x_handle_ep0(struct lh7a40x_udc *dev, u32 intr); |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 3acc896a5d4c..0b590831582c 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
@@ -1040,6 +1040,7 @@ net2280_queue (struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
1040 | 1040 | ||
1041 | } /* else the irq handler advances the queue. */ | 1041 | } /* else the irq handler advances the queue. */ |
1042 | 1042 | ||
1043 | ep->responded = 1; | ||
1043 | if (req) | 1044 | if (req) |
1044 | list_add_tail (&req->queue, &ep->queue); | 1045 | list_add_tail (&req->queue, &ep->queue); |
1045 | done: | 1046 | done: |
@@ -2188,7 +2189,8 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
2188 | ep->stopped = 1; | 2189 | ep->stopped = 1; |
2189 | set_halt (ep); | 2190 | set_halt (ep); |
2190 | mode = 2; | 2191 | mode = 2; |
2191 | } else if (!req && !ep->stopped) | 2192 | } else if (ep->responded && |
2193 | !req && !ep->stopped) | ||
2192 | write_fifo (ep, NULL); | 2194 | write_fifo (ep, NULL); |
2193 | } | 2195 | } |
2194 | } else { | 2196 | } else { |
@@ -2203,7 +2205,7 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
2203 | } else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT)) | 2205 | } else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT)) |
2204 | && req | 2206 | && req |
2205 | && req->req.actual == req->req.length) | 2207 | && req->req.actual == req->req.length) |
2206 | || !req) { | 2208 | || (ep->responded && !req)) { |
2207 | ep->dev->protocol_stall = 1; | 2209 | ep->dev->protocol_stall = 1; |
2208 | set_halt (ep); | 2210 | set_halt (ep); |
2209 | ep->stopped = 1; | 2211 | ep->stopped = 1; |
@@ -2469,6 +2471,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) | |||
2469 | /* we made the hardware handle most lowlevel requests; | 2471 | /* we made the hardware handle most lowlevel requests; |
2470 | * everything else goes uplevel to the gadget code. | 2472 | * everything else goes uplevel to the gadget code. |
2471 | */ | 2473 | */ |
2474 | ep->responded = 1; | ||
2472 | switch (u.r.bRequest) { | 2475 | switch (u.r.bRequest) { |
2473 | case USB_REQ_GET_STATUS: { | 2476 | case USB_REQ_GET_STATUS: { |
2474 | struct net2280_ep *e; | 2477 | struct net2280_ep *e; |
@@ -2537,6 +2540,7 @@ delegate: | |||
2537 | u.r.bRequestType, u.r.bRequest, | 2540 | u.r.bRequestType, u.r.bRequest, |
2538 | w_value, w_index, w_length, | 2541 | w_value, w_index, w_length, |
2539 | readl (&ep->regs->ep_cfg)); | 2542 | readl (&ep->regs->ep_cfg)); |
2543 | ep->responded = 0; | ||
2540 | spin_unlock (&dev->lock); | 2544 | spin_unlock (&dev->lock); |
2541 | tmp = dev->driver->setup (&dev->gadget, &u.r); | 2545 | tmp = dev->driver->setup (&dev->gadget, &u.r); |
2542 | spin_lock (&dev->lock); | 2546 | spin_lock (&dev->lock); |
diff --git a/drivers/usb/gadget/net2280.h b/drivers/usb/gadget/net2280.h index 957d6df34015..44ca139983d8 100644 --- a/drivers/usb/gadget/net2280.h +++ b/drivers/usb/gadget/net2280.h | |||
@@ -110,7 +110,8 @@ struct net2280_ep { | |||
110 | out_overflow : 1, | 110 | out_overflow : 1, |
111 | stopped : 1, | 111 | stopped : 1, |
112 | is_in : 1, | 112 | is_in : 1, |
113 | is_iso : 1; | 113 | is_iso : 1, |
114 | responded : 1; | ||
114 | }; | 115 | }; |
115 | 116 | ||
116 | static inline void allow_status (struct net2280_ep *ep) | 117 | static inline void allow_status (struct net2280_ep *ep) |
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 671c24bc6d75..1ed506e95985 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -2472,6 +2472,7 @@ static struct pxa2xx_udc memory = { | |||
2472 | #define PXA210_B1 0x00000123 | 2472 | #define PXA210_B1 0x00000123 |
2473 | #define PXA210_B0 0x00000122 | 2473 | #define PXA210_B0 0x00000122 |
2474 | #define IXP425_A0 0x000001c1 | 2474 | #define IXP425_A0 0x000001c1 |
2475 | #define IXP425_B0 0x000001f1 | ||
2475 | #define IXP465_AD 0x00000200 | 2476 | #define IXP465_AD 0x00000200 |
2476 | 2477 | ||
2477 | /* | 2478 | /* |
@@ -2509,6 +2510,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2509 | break; | 2510 | break; |
2510 | #elif defined(CONFIG_ARCH_IXP4XX) | 2511 | #elif defined(CONFIG_ARCH_IXP4XX) |
2511 | case IXP425_A0: | 2512 | case IXP425_A0: |
2513 | case IXP425_B0: | ||
2512 | case IXP465_AD: | 2514 | case IXP465_AD: |
2513 | dev->has_cfr = 1; | 2515 | dev->has_cfr = 1; |
2514 | out_dma = 0; | 2516 | out_dma = 0; |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index cf10cbc98f80..cc60759083bf 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -153,7 +153,7 @@ config USB_U132_HCD | |||
153 | adapter will *NOT* work with PC cards that do not contain an OHCI | 153 | adapter will *NOT* work with PC cards that do not contain an OHCI |
154 | controller. | 154 | controller. |
155 | 155 | ||
156 | For those PC cards that contain multiple OHCI controllers only ther | 156 | For those PC cards that contain multiple OHCI controllers only the |
157 | first one is used. | 157 | first one is used. |
158 | 158 | ||
159 | The driver consists of two modules, the "ftdi-elan" module is a | 159 | The driver consists of two modules, the "ftdi-elan" module is a |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9030994aba98..025d33313681 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -126,6 +126,11 @@ static unsigned park = 0; | |||
126 | module_param (park, uint, S_IRUGO); | 126 | module_param (park, uint, S_IRUGO); |
127 | MODULE_PARM_DESC (park, "park setting; 1-3 back-to-back async packets"); | 127 | MODULE_PARM_DESC (park, "park setting; 1-3 back-to-back async packets"); |
128 | 128 | ||
129 | /* for flakey hardware, ignore overcurrent indicators */ | ||
130 | static int ignore_oc = 0; | ||
131 | module_param (ignore_oc, bool, S_IRUGO); | ||
132 | MODULE_PARM_DESC (ignore_oc, "ignore bogus hardware overcurrent indications"); | ||
133 | |||
129 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) | 134 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) |
130 | 135 | ||
131 | /*-------------------------------------------------------------------------*/ | 136 | /*-------------------------------------------------------------------------*/ |
@@ -541,9 +546,10 @@ static int ehci_run (struct usb_hcd *hcd) | |||
541 | 546 | ||
542 | temp = HC_VERSION(readl (&ehci->caps->hc_capbase)); | 547 | temp = HC_VERSION(readl (&ehci->caps->hc_capbase)); |
543 | ehci_info (ehci, | 548 | ehci_info (ehci, |
544 | "USB %x.%x started, EHCI %x.%02x, driver %s\n", | 549 | "USB %x.%x started, EHCI %x.%02x, driver %s%s\n", |
545 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), | 550 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), |
546 | temp >> 8, temp & 0xff, DRIVER_VERSION); | 551 | temp >> 8, temp & 0xff, DRIVER_VERSION, |
552 | ignore_oc ? ", overcurrent ignored" : ""); | ||
547 | 553 | ||
548 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ | 554 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ |
549 | 555 | ||
@@ -613,9 +619,8 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
613 | unsigned i = HCS_N_PORTS (ehci->hcs_params); | 619 | unsigned i = HCS_N_PORTS (ehci->hcs_params); |
614 | 620 | ||
615 | /* resume root hub? */ | 621 | /* resume root hub? */ |
616 | status = readl (&ehci->regs->command); | 622 | if (!(readl(&ehci->regs->command) & CMD_RUN)) |
617 | if (!(status & CMD_RUN)) | 623 | usb_hcd_resume_root_hub(hcd); |
618 | writel (status | CMD_RUN, &ehci->regs->command); | ||
619 | 624 | ||
620 | while (i--) { | 625 | while (i--) { |
621 | int pstatus = readl (&ehci->regs->port_status [i]); | 626 | int pstatus = readl (&ehci->regs->port_status [i]); |
@@ -632,7 +637,6 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
632 | */ | 637 | */ |
633 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); | 638 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); |
634 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); | 639 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); |
635 | usb_hcd_resume_root_hub(hcd); | ||
636 | } | 640 | } |
637 | } | 641 | } |
638 | 642 | ||
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 1b20722c102b..bfe5f307cba6 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -34,6 +34,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
34 | { | 34 | { |
35 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 35 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
36 | int port; | 36 | int port; |
37 | int mask; | ||
37 | 38 | ||
38 | if (time_before (jiffies, ehci->next_statechange)) | 39 | if (time_before (jiffies, ehci->next_statechange)) |
39 | msleep(5); | 40 | msleep(5); |
@@ -51,14 +52,25 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
51 | ehci->reclaim_ready = 1; | 52 | ehci->reclaim_ready = 1; |
52 | ehci_work(ehci); | 53 | ehci_work(ehci); |
53 | 54 | ||
54 | /* suspend any active/unsuspended ports, maybe allow wakeup */ | 55 | /* Unlike other USB host controller types, EHCI doesn't have |
56 | * any notion of "global" or bus-wide suspend. The driver has | ||
57 | * to manually suspend all the active unsuspended ports, and | ||
58 | * then manually resume them in the bus_resume() routine. | ||
59 | */ | ||
60 | ehci->bus_suspended = 0; | ||
55 | while (port--) { | 61 | while (port--) { |
56 | u32 __iomem *reg = &ehci->regs->port_status [port]; | 62 | u32 __iomem *reg = &ehci->regs->port_status [port]; |
57 | u32 t1 = readl (reg) & ~PORT_RWC_BITS; | 63 | u32 t1 = readl (reg) & ~PORT_RWC_BITS; |
58 | u32 t2 = t1; | 64 | u32 t2 = t1; |
59 | 65 | ||
60 | if ((t1 & PORT_PE) && !(t1 & PORT_OWNER)) | 66 | /* keep track of which ports we suspend */ |
67 | if ((t1 & PORT_PE) && !(t1 & PORT_OWNER) && | ||
68 | !(t1 & PORT_SUSPEND)) { | ||
61 | t2 |= PORT_SUSPEND; | 69 | t2 |= PORT_SUSPEND; |
70 | set_bit(port, &ehci->bus_suspended); | ||
71 | } | ||
72 | |||
73 | /* enable remote wakeup on all ports */ | ||
62 | if (device_may_wakeup(&hcd->self.root_hub->dev)) | 74 | if (device_may_wakeup(&hcd->self.root_hub->dev)) |
63 | t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; | 75 | t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; |
64 | else | 76 | else |
@@ -76,6 +88,13 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
76 | ehci_halt (ehci); | 88 | ehci_halt (ehci); |
77 | hcd->state = HC_STATE_SUSPENDED; | 89 | hcd->state = HC_STATE_SUSPENDED; |
78 | 90 | ||
91 | /* allow remote wakeup */ | ||
92 | mask = INTR_MASK; | ||
93 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) | ||
94 | mask &= ~STS_PCD; | ||
95 | writel(mask, &ehci->regs->intr_enable); | ||
96 | readl(&ehci->regs->intr_enable); | ||
97 | |||
79 | ehci->next_statechange = jiffies + msecs_to_jiffies(10); | 98 | ehci->next_statechange = jiffies + msecs_to_jiffies(10); |
80 | spin_unlock_irq (&ehci->lock); | 99 | spin_unlock_irq (&ehci->lock); |
81 | return 0; | 100 | return 0; |
@@ -88,7 +107,6 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
88 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 107 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
89 | u32 temp; | 108 | u32 temp; |
90 | int i; | 109 | int i; |
91 | int intr_enable; | ||
92 | 110 | ||
93 | if (time_before (jiffies, ehci->next_statechange)) | 111 | if (time_before (jiffies, ehci->next_statechange)) |
94 | msleep(5); | 112 | msleep(5); |
@@ -100,31 +118,30 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
100 | * the last user of the controller, not reset/pm hardware keeping | 118 | * the last user of the controller, not reset/pm hardware keeping |
101 | * state we gave to it. | 119 | * state we gave to it. |
102 | */ | 120 | */ |
121 | temp = readl(&ehci->regs->intr_enable); | ||
122 | ehci_dbg(ehci, "resume root hub%s\n", temp ? "" : " after power loss"); | ||
103 | 123 | ||
104 | /* re-init operational registers in case we lost power */ | 124 | /* at least some APM implementations will try to deliver |
105 | if (readl (&ehci->regs->intr_enable) == 0) { | 125 | * IRQs right away, so delay them until we're ready. |
106 | /* at least some APM implementations will try to deliver | 126 | */ |
107 | * IRQs right away, so delay them until we're ready. | 127 | writel(0, &ehci->regs->intr_enable); |
108 | */ | 128 | |
109 | intr_enable = 1; | 129 | /* re-init operational registers */ |
110 | writel (0, &ehci->regs->segment); | 130 | writel(0, &ehci->regs->segment); |
111 | writel (ehci->periodic_dma, &ehci->regs->frame_list); | 131 | writel(ehci->periodic_dma, &ehci->regs->frame_list); |
112 | writel ((u32)ehci->async->qh_dma, &ehci->regs->async_next); | 132 | writel((u32) ehci->async->qh_dma, &ehci->regs->async_next); |
113 | } else | ||
114 | intr_enable = 0; | ||
115 | ehci_dbg(ehci, "resume root hub%s\n", | ||
116 | intr_enable ? " after power loss" : ""); | ||
117 | 133 | ||
118 | /* restore CMD_RUN, framelist size, and irq threshold */ | 134 | /* restore CMD_RUN, framelist size, and irq threshold */ |
119 | writel (ehci->command, &ehci->regs->command); | 135 | writel (ehci->command, &ehci->regs->command); |
120 | 136 | ||
121 | /* take ports out of suspend */ | 137 | /* manually resume the ports we suspended during bus_suspend() */ |
122 | i = HCS_N_PORTS (ehci->hcs_params); | 138 | i = HCS_N_PORTS (ehci->hcs_params); |
123 | while (i--) { | 139 | while (i--) { |
124 | temp = readl (&ehci->regs->port_status [i]); | 140 | temp = readl (&ehci->regs->port_status [i]); |
125 | temp &= ~(PORT_RWC_BITS | 141 | temp &= ~(PORT_RWC_BITS |
126 | | PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E); | 142 | | PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E); |
127 | if (temp & PORT_SUSPEND) { | 143 | if (test_bit(i, &ehci->bus_suspended) && |
144 | (temp & PORT_SUSPEND)) { | ||
128 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); | 145 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); |
129 | temp |= PORT_RESUME; | 146 | temp |= PORT_RESUME; |
130 | } | 147 | } |
@@ -134,11 +151,12 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
134 | mdelay (20); | 151 | mdelay (20); |
135 | while (i--) { | 152 | while (i--) { |
136 | temp = readl (&ehci->regs->port_status [i]); | 153 | temp = readl (&ehci->regs->port_status [i]); |
137 | if ((temp & PORT_SUSPEND) == 0) | 154 | if (test_bit(i, &ehci->bus_suspended) && |
138 | continue; | 155 | (temp & PORT_SUSPEND)) { |
139 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); | 156 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); |
140 | writel (temp, &ehci->regs->port_status [i]); | 157 | writel (temp, &ehci->regs->port_status [i]); |
141 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); | 158 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); |
159 | } | ||
142 | } | 160 | } |
143 | (void) readl (&ehci->regs->command); | 161 | (void) readl (&ehci->regs->command); |
144 | 162 | ||
@@ -157,8 +175,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
157 | hcd->state = HC_STATE_RUNNING; | 175 | hcd->state = HC_STATE_RUNNING; |
158 | 176 | ||
159 | /* Now we can safely re-enable irqs */ | 177 | /* Now we can safely re-enable irqs */ |
160 | if (intr_enable) | 178 | writel(INTR_MASK, &ehci->regs->intr_enable); |
161 | writel (INTR_MASK, &ehci->regs->intr_enable); | ||
162 | 179 | ||
163 | spin_unlock_irq (&ehci->lock); | 180 | spin_unlock_irq (&ehci->lock); |
164 | return 0; | 181 | return 0; |
@@ -218,6 +235,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
218 | { | 235 | { |
219 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 236 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
220 | u32 temp, status = 0; | 237 | u32 temp, status = 0; |
238 | u32 mask; | ||
221 | int ports, i, retval = 1; | 239 | int ports, i, retval = 1; |
222 | unsigned long flags; | 240 | unsigned long flags; |
223 | 241 | ||
@@ -233,6 +251,18 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
233 | retval++; | 251 | retval++; |
234 | } | 252 | } |
235 | 253 | ||
254 | /* Some boards (mostly VIA?) report bogus overcurrent indications, | ||
255 | * causing massive log spam unless we completely ignore them. It | ||
256 | * may be relevant that VIA VT8235 controlers, where PORT_POWER is | ||
257 | * always set, seem to clear PORT_OCC and PORT_CSC when writing to | ||
258 | * PORT_POWER; that's surprising, but maybe within-spec. | ||
259 | */ | ||
260 | if (!ignore_oc) | ||
261 | mask = PORT_CSC | PORT_PEC | PORT_OCC; | ||
262 | else | ||
263 | mask = PORT_CSC | PORT_PEC; | ||
264 | // PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND | ||
265 | |||
236 | /* no hub change reports (bit 0) for now (power, ...) */ | 266 | /* no hub change reports (bit 0) for now (power, ...) */ |
237 | 267 | ||
238 | /* port N changes (bit N)? */ | 268 | /* port N changes (bit N)? */ |
@@ -250,8 +280,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
250 | } | 280 | } |
251 | if (!(temp & PORT_CONNECT)) | 281 | if (!(temp & PORT_CONNECT)) |
252 | ehci->reset_done [i] = 0; | 282 | ehci->reset_done [i] = 0; |
253 | if ((temp & (PORT_CSC | PORT_PEC | PORT_OCC)) != 0 | 283 | if ((temp & mask) != 0 |
254 | // PORT_STAT_C_SUSPEND? | ||
255 | || ((temp & PORT_RESUME) != 0 | 284 | || ((temp & PORT_RESUME) != 0 |
256 | && time_after (jiffies, | 285 | && time_after (jiffies, |
257 | ehci->reset_done [i]))) { | 286 | ehci->reset_done [i]))) { |
@@ -319,6 +348,7 @@ static int ehci_hub_control ( | |||
319 | u32 temp, status; | 348 | u32 temp, status; |
320 | unsigned long flags; | 349 | unsigned long flags; |
321 | int retval = 0; | 350 | int retval = 0; |
351 | unsigned selector; | ||
322 | 352 | ||
323 | /* | 353 | /* |
324 | * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. | 354 | * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. |
@@ -417,7 +447,7 @@ static int ehci_hub_control ( | |||
417 | status |= 1 << USB_PORT_FEAT_C_CONNECTION; | 447 | status |= 1 << USB_PORT_FEAT_C_CONNECTION; |
418 | if (temp & PORT_PEC) | 448 | if (temp & PORT_PEC) |
419 | status |= 1 << USB_PORT_FEAT_C_ENABLE; | 449 | status |= 1 << USB_PORT_FEAT_C_ENABLE; |
420 | if (temp & PORT_OCC) | 450 | if ((temp & PORT_OCC) && !ignore_oc) |
421 | status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT; | 451 | status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT; |
422 | 452 | ||
423 | /* whoever resumes must GetPortStatus to complete it!! */ | 453 | /* whoever resumes must GetPortStatus to complete it!! */ |
@@ -506,6 +536,8 @@ static int ehci_hub_control ( | |||
506 | } | 536 | } |
507 | break; | 537 | break; |
508 | case SetPortFeature: | 538 | case SetPortFeature: |
539 | selector = wIndex >> 8; | ||
540 | wIndex &= 0xff; | ||
509 | if (!wIndex || wIndex > ports) | 541 | if (!wIndex || wIndex > ports) |
510 | goto error; | 542 | goto error; |
511 | wIndex--; | 543 | wIndex--; |
@@ -559,6 +591,22 @@ static int ehci_hub_control ( | |||
559 | } | 591 | } |
560 | writel (temp, &ehci->regs->port_status [wIndex]); | 592 | writel (temp, &ehci->regs->port_status [wIndex]); |
561 | break; | 593 | break; |
594 | |||
595 | /* For downstream facing ports (these): one hub port is put | ||
596 | * into test mode according to USB2 11.24.2.13, then the hub | ||
597 | * must be reset (which for root hub now means rmmod+modprobe, | ||
598 | * or else system reboot). See EHCI 2.3.9 and 4.14 for info | ||
599 | * about the EHCI-specific stuff. | ||
600 | */ | ||
601 | case USB_PORT_FEAT_TEST: | ||
602 | if (!selector || selector > 5) | ||
603 | goto error; | ||
604 | ehci_quiesce(ehci); | ||
605 | ehci_halt(ehci); | ||
606 | temp |= selector << 16; | ||
607 | writel (temp, &ehci->regs->port_status [wIndex]); | ||
608 | break; | ||
609 | |||
562 | default: | 610 | default: |
563 | goto error; | 611 | goto error; |
564 | } | 612 | } |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index e51c1ed81ac4..4bc7970ba3ef 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -257,9 +257,7 @@ static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) | |||
257 | static int ehci_pci_resume(struct usb_hcd *hcd) | 257 | static int ehci_pci_resume(struct usb_hcd *hcd) |
258 | { | 258 | { |
259 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 259 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
260 | unsigned port; | ||
261 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 260 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
262 | int retval = -EINVAL; | ||
263 | 261 | ||
264 | // maybe restore FLADJ | 262 | // maybe restore FLADJ |
265 | 263 | ||
@@ -269,27 +267,19 @@ static int ehci_pci_resume(struct usb_hcd *hcd) | |||
269 | /* Mark hardware accessible again as we are out of D3 state by now */ | 267 | /* Mark hardware accessible again as we are out of D3 state by now */ |
270 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 268 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
271 | 269 | ||
272 | /* If CF is clear, we lost PCI Vaux power and need to restart. */ | 270 | /* If CF is still set, we maintained PCI Vaux power. |
273 | if (readl(&ehci->regs->configured_flag) != FLAG_CF) | 271 | * Just undo the effect of ehci_pci_suspend(). |
274 | goto restart; | ||
275 | |||
276 | /* If any port is suspended (or owned by the companion), | ||
277 | * we know we can/must resume the HC (and mustn't reset it). | ||
278 | * We just defer that to the root hub code. | ||
279 | */ | 272 | */ |
280 | for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) { | 273 | if (readl(&ehci->regs->configured_flag) == FLAG_CF) { |
281 | u32 status; | 274 | int mask = INTR_MASK; |
282 | port--; | 275 | |
283 | status = readl(&ehci->regs->port_status [port]); | 276 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) |
284 | if (!(status & PORT_POWER)) | 277 | mask &= ~STS_PCD; |
285 | continue; | 278 | writel(mask, &ehci->regs->intr_enable); |
286 | if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) { | 279 | readl(&ehci->regs->intr_enable); |
287 | usb_hcd_resume_root_hub(hcd); | 280 | return 0; |
288 | return 0; | ||
289 | } | ||
290 | } | 281 | } |
291 | 282 | ||
292 | restart: | ||
293 | ehci_dbg(ehci, "lost power, restarting\n"); | 283 | ehci_dbg(ehci, "lost power, restarting\n"); |
294 | usb_root_hub_lost_power(hcd->self.root_hub); | 284 | usb_root_hub_lost_power(hcd->self.root_hub); |
295 | 285 | ||
@@ -307,13 +297,15 @@ restart: | |||
307 | ehci_work(ehci); | 297 | ehci_work(ehci); |
308 | spin_unlock_irq(&ehci->lock); | 298 | spin_unlock_irq(&ehci->lock); |
309 | 299 | ||
310 | /* restart; khubd will disconnect devices */ | ||
311 | retval = ehci_run(hcd); | ||
312 | |||
313 | /* here we "know" root ports should always stay powered */ | 300 | /* here we "know" root ports should always stay powered */ |
314 | ehci_port_power(ehci, 1); | 301 | ehci_port_power(ehci, 1); |
315 | 302 | ||
316 | return retval; | 303 | writel(ehci->command, &ehci->regs->command); |
304 | writel(FLAG_CF, &ehci->regs->configured_flag); | ||
305 | readl(&ehci->regs->command); /* unblock posted writes */ | ||
306 | |||
307 | hcd->state = HC_STATE_SUSPENDED; | ||
308 | return 0; | ||
317 | } | 309 | } |
318 | #endif | 310 | #endif |
319 | 311 | ||
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index bbc3082a73d7..74dbc6c8228f 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -74,6 +74,7 @@ struct ehci_hcd { /* one per controller */ | |||
74 | 74 | ||
75 | /* per root hub port */ | 75 | /* per root hub port */ |
76 | unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; | 76 | unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; |
77 | unsigned long bus_suspended; | ||
77 | 78 | ||
78 | /* per-HC memory pools (could be per-bus, but ...) */ | 79 | /* per-HC memory pools (could be per-bus, but ...) */ |
79 | struct dma_pool *qh_pool; /* qh per active urb */ | 80 | struct dma_pool *qh_pool; /* qh per active urb */ |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index ea4714e557e4..a95275a401b1 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -729,6 +729,16 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | 729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, | 730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, |
731 | ®s->intrstatus); | 731 | ®s->intrstatus); |
732 | |||
733 | /* NOTE: Vendors didn't always make the same implementation | ||
734 | * choices for RHSC. Many followed the spec; RHSC triggers | ||
735 | * on an edge, like setting and maybe clearing a port status | ||
736 | * change bit. With others it's level-triggered, active | ||
737 | * until khubd clears all the port status change bits. We'll | ||
738 | * always disable it here and rely on polling until khubd | ||
739 | * re-enables it. | ||
740 | */ | ||
741 | ohci_writel(ohci, OHCI_INTR_RHSC, ®s->intrdisable); | ||
732 | usb_hcd_poll_rh_status(hcd); | 742 | usb_hcd_poll_rh_status(hcd); |
733 | } | 743 | } |
734 | 744 | ||
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 6995ea36f2e8..2441642cb7b4 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -41,7 +41,11 @@ static void ohci_rhsc_enable (struct usb_hcd *hcd) | |||
41 | { | 41 | { |
42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
43 | 43 | ||
44 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | 44 | spin_lock_irq(&ohci->lock); |
45 | if (!ohci->autostop) | ||
46 | del_timer(&hcd->rh_timer); /* Prevent next poll */ | ||
47 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
48 | spin_unlock_irq(&ohci->lock); | ||
45 | } | 49 | } |
46 | 50 | ||
47 | #define OHCI_SCHED_ENABLES \ | 51 | #define OHCI_SCHED_ENABLES \ |
@@ -50,6 +54,9 @@ static void ohci_rhsc_enable (struct usb_hcd *hcd) | |||
50 | static void dl_done_list (struct ohci_hcd *); | 54 | static void dl_done_list (struct ohci_hcd *); |
51 | static void finish_unlinks (struct ohci_hcd *, u16); | 55 | static void finish_unlinks (struct ohci_hcd *, u16); |
52 | 56 | ||
57 | #ifdef CONFIG_PM | ||
58 | static int ohci_restart(struct ohci_hcd *ohci); | ||
59 | |||
53 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) | 60 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) |
54 | __releases(ohci->lock) | 61 | __releases(ohci->lock) |
55 | __acquires(ohci->lock) | 62 | __acquires(ohci->lock) |
@@ -132,8 +139,6 @@ static inline struct ed *find_head (struct ed *ed) | |||
132 | return ed; | 139 | return ed; |
133 | } | 140 | } |
134 | 141 | ||
135 | static int ohci_restart (struct ohci_hcd *ohci); | ||
136 | |||
137 | /* caller has locked the root hub */ | 142 | /* caller has locked the root hub */ |
138 | static int ohci_rh_resume (struct ohci_hcd *ohci) | 143 | static int ohci_rh_resume (struct ohci_hcd *ohci) |
139 | __releases(ohci->lock) | 144 | __releases(ohci->lock) |
@@ -169,7 +174,7 @@ __acquires(ohci->lock) | |||
169 | break; | 174 | break; |
170 | case OHCI_USB_RESUME: | 175 | case OHCI_USB_RESUME: |
171 | /* HCFS changes sometime after INTR_RD */ | 176 | /* HCFS changes sometime after INTR_RD */ |
172 | ohci_info(ohci, "%swakeup\n", | 177 | ohci_dbg(ohci, "%swakeup root hub\n", |
173 | autostopped ? "auto-" : ""); | 178 | autostopped ? "auto-" : ""); |
174 | break; | 179 | break; |
175 | case OHCI_USB_OPER: | 180 | case OHCI_USB_OPER: |
@@ -181,7 +186,6 @@ __acquires(ohci->lock) | |||
181 | ohci_dbg (ohci, "lost power\n"); | 186 | ohci_dbg (ohci, "lost power\n"); |
182 | status = -EBUSY; | 187 | status = -EBUSY; |
183 | } | 188 | } |
184 | #ifdef CONFIG_PM | ||
185 | if (status == -EBUSY) { | 189 | if (status == -EBUSY) { |
186 | if (!autostopped) { | 190 | if (!autostopped) { |
187 | spin_unlock_irq (&ohci->lock); | 191 | spin_unlock_irq (&ohci->lock); |
@@ -191,25 +195,12 @@ __acquires(ohci->lock) | |||
191 | } | 195 | } |
192 | return status; | 196 | return status; |
193 | } | 197 | } |
194 | #endif | ||
195 | if (status != -EINPROGRESS) | 198 | if (status != -EINPROGRESS) |
196 | return status; | 199 | return status; |
197 | if (autostopped) | 200 | if (autostopped) |
198 | goto skip_resume; | 201 | goto skip_resume; |
199 | spin_unlock_irq (&ohci->lock); | 202 | spin_unlock_irq (&ohci->lock); |
200 | 203 | ||
201 | temp = ohci->num_ports; | ||
202 | while (temp--) { | ||
203 | u32 stat = ohci_readl (ohci, | ||
204 | &ohci->regs->roothub.portstatus [temp]); | ||
205 | |||
206 | /* force global, not selective, resume */ | ||
207 | if (!(stat & RH_PS_PSS)) | ||
208 | continue; | ||
209 | ohci_writel (ohci, RH_PS_POCI, | ||
210 | &ohci->regs->roothub.portstatus [temp]); | ||
211 | } | ||
212 | |||
213 | /* Some controllers (lucent erratum) need extra-long delays */ | 204 | /* Some controllers (lucent erratum) need extra-long delays */ |
214 | msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1); | 205 | msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1); |
215 | 206 | ||
@@ -217,6 +208,7 @@ __acquires(ohci->lock) | |||
217 | temp &= OHCI_CTRL_HCFS; | 208 | temp &= OHCI_CTRL_HCFS; |
218 | if (temp != OHCI_USB_RESUME) { | 209 | if (temp != OHCI_USB_RESUME) { |
219 | ohci_err (ohci, "controller won't resume\n"); | 210 | ohci_err (ohci, "controller won't resume\n"); |
211 | spin_lock_irq(&ohci->lock); | ||
220 | return -EBUSY; | 212 | return -EBUSY; |
221 | } | 213 | } |
222 | 214 | ||
@@ -296,8 +288,6 @@ skip_resume: | |||
296 | return 0; | 288 | return 0; |
297 | } | 289 | } |
298 | 290 | ||
299 | #ifdef CONFIG_PM | ||
300 | |||
301 | static int ohci_bus_suspend (struct usb_hcd *hcd) | 291 | static int ohci_bus_suspend (struct usb_hcd *hcd) |
302 | { | 292 | { |
303 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 293 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
@@ -335,6 +325,83 @@ static int ohci_bus_resume (struct usb_hcd *hcd) | |||
335 | return rc; | 325 | return rc; |
336 | } | 326 | } |
337 | 327 | ||
328 | /* Carry out polling-, autostop-, and autoresume-related state changes */ | ||
329 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | ||
330 | int any_connected) | ||
331 | { | ||
332 | int poll_rh = 1; | ||
333 | |||
334 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
335 | |||
336 | case OHCI_USB_OPER: | ||
337 | /* keep on polling until we know a device is connected | ||
338 | * and RHSC is enabled */ | ||
339 | if (!ohci->autostop) { | ||
340 | if (any_connected || | ||
341 | !device_may_wakeup(&ohci_to_hcd(ohci) | ||
342 | ->self.root_hub->dev)) { | ||
343 | if (ohci_readl(ohci, &ohci->regs->intrenable) & | ||
344 | OHCI_INTR_RHSC) | ||
345 | poll_rh = 0; | ||
346 | } else { | ||
347 | ohci->autostop = 1; | ||
348 | ohci->next_statechange = jiffies + HZ; | ||
349 | } | ||
350 | |||
351 | /* if no devices have been attached for one second, autostop */ | ||
352 | } else { | ||
353 | if (changed || any_connected) { | ||
354 | ohci->autostop = 0; | ||
355 | ohci->next_statechange = jiffies + | ||
356 | STATECHANGE_DELAY; | ||
357 | } else if (time_after_eq(jiffies, | ||
358 | ohci->next_statechange) | ||
359 | && !ohci->ed_rm_list | ||
360 | && !(ohci->hc_control & | ||
361 | OHCI_SCHED_ENABLES)) { | ||
362 | ohci_rh_suspend(ohci, 1); | ||
363 | } | ||
364 | } | ||
365 | break; | ||
366 | |||
367 | /* if there is a port change, autostart or ask to be resumed */ | ||
368 | case OHCI_USB_SUSPEND: | ||
369 | case OHCI_USB_RESUME: | ||
370 | if (changed) { | ||
371 | if (ohci->autostop) | ||
372 | ohci_rh_resume(ohci); | ||
373 | else | ||
374 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); | ||
375 | } else { | ||
376 | /* everything is idle, no need for polling */ | ||
377 | poll_rh = 0; | ||
378 | } | ||
379 | break; | ||
380 | } | ||
381 | return poll_rh; | ||
382 | } | ||
383 | |||
384 | #else /* CONFIG_PM */ | ||
385 | |||
386 | static inline int ohci_rh_resume(struct ohci_hcd *ohci) | ||
387 | { | ||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | /* Carry out polling-related state changes. | ||
392 | * autostop isn't used when CONFIG_PM is turned off. | ||
393 | */ | ||
394 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | ||
395 | int any_connected) | ||
396 | { | ||
397 | int poll_rh = 1; | ||
398 | |||
399 | /* keep on polling until RHSC is enabled */ | ||
400 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) | ||
401 | poll_rh = 0; | ||
402 | return poll_rh; | ||
403 | } | ||
404 | |||
338 | #endif /* CONFIG_PM */ | 405 | #endif /* CONFIG_PM */ |
339 | 406 | ||
340 | /*-------------------------------------------------------------------------*/ | 407 | /*-------------------------------------------------------------------------*/ |
@@ -346,7 +413,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
346 | { | 413 | { |
347 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 414 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
348 | int i, changed = 0, length = 1; | 415 | int i, changed = 0, length = 1; |
349 | int any_connected = 0, rhsc_enabled = 1; | 416 | int any_connected = 0; |
350 | unsigned long flags; | 417 | unsigned long flags; |
351 | 418 | ||
352 | spin_lock_irqsave (&ohci->lock, flags); | 419 | spin_lock_irqsave (&ohci->lock, flags); |
@@ -387,67 +454,8 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
387 | } | 454 | } |
388 | } | 455 | } |
389 | 456 | ||
390 | /* NOTE: vendors didn't always make the same implementation | 457 | hcd->poll_rh = ohci_root_hub_state_changes(ohci, changed, |
391 | * choices for RHSC. Sometimes it triggers on an edge (like | 458 | any_connected); |
392 | * setting and maybe clearing a port status change bit); and | ||
393 | * it's level-triggered on other silicon, active until khubd | ||
394 | * clears all active port status change bits. If it's still | ||
395 | * set (level-triggered) we must disable it and rely on | ||
396 | * polling until khubd re-enables it. | ||
397 | */ | ||
398 | if (ohci_readl (ohci, &ohci->regs->intrstatus) & OHCI_INTR_RHSC) { | ||
399 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrdisable); | ||
400 | (void) ohci_readl (ohci, &ohci->regs->intrdisable); | ||
401 | rhsc_enabled = 0; | ||
402 | } | ||
403 | hcd->poll_rh = 1; | ||
404 | |||
405 | /* carry out appropriate state changes */ | ||
406 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
407 | |||
408 | case OHCI_USB_OPER: | ||
409 | /* keep on polling until we know a device is connected | ||
410 | * and RHSC is enabled */ | ||
411 | if (!ohci->autostop) { | ||
412 | if (any_connected) { | ||
413 | if (rhsc_enabled) | ||
414 | hcd->poll_rh = 0; | ||
415 | } else { | ||
416 | ohci->autostop = 1; | ||
417 | ohci->next_statechange = jiffies + HZ; | ||
418 | } | ||
419 | |||
420 | /* if no devices have been attached for one second, autostop */ | ||
421 | } else { | ||
422 | if (changed || any_connected) { | ||
423 | ohci->autostop = 0; | ||
424 | ohci->next_statechange = jiffies + | ||
425 | STATECHANGE_DELAY; | ||
426 | } else if (device_may_wakeup(&hcd->self.root_hub->dev) | ||
427 | && time_after_eq(jiffies, | ||
428 | ohci->next_statechange) | ||
429 | && !ohci->ed_rm_list | ||
430 | && !(ohci->hc_control & | ||
431 | OHCI_SCHED_ENABLES)) { | ||
432 | ohci_rh_suspend (ohci, 1); | ||
433 | } | ||
434 | } | ||
435 | break; | ||
436 | |||
437 | /* if there is a port change, autostart or ask to be resumed */ | ||
438 | case OHCI_USB_SUSPEND: | ||
439 | case OHCI_USB_RESUME: | ||
440 | if (changed) { | ||
441 | if (ohci->autostop) | ||
442 | ohci_rh_resume (ohci); | ||
443 | else | ||
444 | usb_hcd_resume_root_hub (hcd); | ||
445 | } else { | ||
446 | /* everything is idle, no need for polling */ | ||
447 | hcd->poll_rh = 0; | ||
448 | } | ||
449 | break; | ||
450 | } | ||
451 | 459 | ||
452 | done: | 460 | done: |
453 | spin_unlock_irqrestore (&ohci->lock, flags); | 461 | spin_unlock_irqrestore (&ohci->lock, flags); |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index 32c635ecbf31..ef54e310bfc4 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -71,7 +71,7 @@ static int distrust_firmware = 1; | |||
71 | module_param(distrust_firmware, bool, 0); | 71 | module_param(distrust_firmware, bool, 0); |
72 | MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren" | 72 | MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren" |
73 | "t setup"); | 73 | "t setup"); |
74 | DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait); | 74 | static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait); |
75 | /* | 75 | /* |
76 | * u132_module_lock exists to protect access to global variables | 76 | * u132_module_lock exists to protect access to global variables |
77 | * | 77 | * |
@@ -205,13 +205,9 @@ struct u132 { | |||
205 | struct u132_port port[MAX_U132_PORTS]; | 205 | struct u132_port port[MAX_U132_PORTS]; |
206 | struct u132_endp *endp[MAX_U132_ENDPS]; | 206 | struct u132_endp *endp[MAX_U132_ENDPS]; |
207 | }; | 207 | }; |
208 | int usb_ftdi_elan_read_reg(struct platform_device *pdev, u32 *data); | 208 | |
209 | int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, u8 addressofs, | ||
210 | u8 width, u32 *data); | ||
211 | int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, u8 addressofs, | ||
212 | u8 width, u32 data); | ||
213 | /* | 209 | /* |
214 | * these can not be inlines because we need the structure offset!! | 210 | * these cannot be inlines because we need the structure offset!! |
215 | * Does anyone have a better way????? | 211 | * Does anyone have a better way????? |
216 | */ | 212 | */ |
217 | #define u132_read_pcimem(u132, member, data) \ | 213 | #define u132_read_pcimem(u132, member, data) \ |
@@ -3045,7 +3041,7 @@ static struct hc_driver u132_hc_driver = { | |||
3045 | * This function may be called by the USB core whilst the "usb_all_devices_rwsem" | 3041 | * This function may be called by the USB core whilst the "usb_all_devices_rwsem" |
3046 | * is held for writing, thus this module must not call usb_remove_hcd() | 3042 | * is held for writing, thus this module must not call usb_remove_hcd() |
3047 | * synchronously - but instead should immediately stop activity to the | 3043 | * synchronously - but instead should immediately stop activity to the |
3048 | * device and ansynchronously call usb_remove_hcd() | 3044 | * device and asynchronously call usb_remove_hcd() |
3049 | */ | 3045 | */ |
3050 | static int __devexit u132_remove(struct platform_device *pdev) | 3046 | static int __devexit u132_remove(struct platform_device *pdev) |
3051 | { | 3047 | { |
@@ -3241,7 +3237,7 @@ static int u132_resume(struct platform_device *pdev) | |||
3241 | #define u132_resume NULL | 3237 | #define u132_resume NULL |
3242 | #endif | 3238 | #endif |
3243 | /* | 3239 | /* |
3244 | * this driver is loaded explicitely by ftdi_u132 | 3240 | * this driver is loaded explicitly by ftdi_u132 |
3245 | * | 3241 | * |
3246 | * the platform_driver struct is static because it is per type of module | 3242 | * the platform_driver struct is static because it is per type of module |
3247 | */ | 3243 | */ |
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index 3038ed0700d3..8ccddf74534a 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c | |||
@@ -796,7 +796,7 @@ static int mts_usb_probe(struct usb_interface *intf, | |||
796 | 796 | ||
797 | new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL); | 797 | new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL); |
798 | if (!new_desc->context.scsi_status) | 798 | if (!new_desc->context.scsi_status) |
799 | goto out_kfree2; | 799 | goto out_free_urb; |
800 | 800 | ||
801 | new_desc->usb_dev = dev; | 801 | new_desc->usb_dev = dev; |
802 | new_desc->usb_intf = intf; | 802 | new_desc->usb_intf = intf; |
@@ -822,18 +822,20 @@ static int mts_usb_probe(struct usb_interface *intf, | |||
822 | new_desc->host = scsi_host_alloc(&mts_scsi_host_template, | 822 | new_desc->host = scsi_host_alloc(&mts_scsi_host_template, |
823 | sizeof(new_desc)); | 823 | sizeof(new_desc)); |
824 | if (!new_desc->host) | 824 | if (!new_desc->host) |
825 | goto out_free_urb; | 825 | goto out_kfree2; |
826 | 826 | ||
827 | new_desc->host->hostdata[0] = (unsigned long)new_desc; | 827 | new_desc->host->hostdata[0] = (unsigned long)new_desc; |
828 | if (scsi_add_host(new_desc->host, NULL)) { | 828 | if (scsi_add_host(new_desc->host, NULL)) { |
829 | err_retval = -EIO; | 829 | err_retval = -EIO; |
830 | goto out_free_urb; | 830 | goto out_host_put; |
831 | } | 831 | } |
832 | scsi_scan_host(new_desc->host); | 832 | scsi_scan_host(new_desc->host); |
833 | 833 | ||
834 | usb_set_intfdata(intf, new_desc); | 834 | usb_set_intfdata(intf, new_desc); |
835 | return 0; | 835 | return 0; |
836 | 836 | ||
837 | out_host_put: | ||
838 | scsi_host_put(new_desc->host); | ||
837 | out_kfree2: | 839 | out_kfree2: |
838 | kfree(new_desc->context.scsi_status); | 840 | kfree(new_desc->context.scsi_status); |
839 | out_free_urb: | 841 | out_free_urb: |
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig index 20db36448ab3..661af7aa6236 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig | |||
@@ -221,6 +221,7 @@ config USB_TOUCHSCREEN | |||
221 | - ITM | 221 | - ITM |
222 | - some other eTurboTouch | 222 | - some other eTurboTouch |
223 | - Gunze AHL61 | 223 | - Gunze AHL61 |
224 | - DMC TSC-10/25 | ||
224 | 225 | ||
225 | Have a look at <http://linux.chapter7.ch/touchkit/> for | 226 | Have a look at <http://linux.chapter7.ch/touchkit/> for |
226 | a usage description and the required user-space stuff. | 227 | a usage description and the required user-space stuff. |
@@ -258,6 +259,11 @@ config USB_TOUCHSCREEN_GUNZE | |||
258 | bool "Gunze AHL61 device support" if EMBEDDED | 259 | bool "Gunze AHL61 device support" if EMBEDDED |
259 | depends on USB_TOUCHSCREEN | 260 | depends on USB_TOUCHSCREEN |
260 | 261 | ||
262 | config USB_TOUCHSCREEN_DMC_TSC10 | ||
263 | default y | ||
264 | bool "DMC TSC-10/25 device support" if EMBEDDED | ||
265 | depends on USB_TOUCHSCREEN | ||
266 | |||
261 | config USB_YEALINK | 267 | config USB_YEALINK |
262 | tristate "Yealink usb-p1k voip phone" | 268 | tristate "Yealink usb-p1k voip phone" |
263 | depends on USB && INPUT && EXPERIMENTAL | 269 | depends on USB && INPUT && EXPERIMENTAL |
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index 787b847d38cc..ff23318dc301 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -630,11 +630,8 @@ static int ati_remote_alloc_buffers(struct usb_device *udev, | |||
630 | */ | 630 | */ |
631 | static void ati_remote_free_buffers(struct ati_remote *ati_remote) | 631 | static void ati_remote_free_buffers(struct ati_remote *ati_remote) |
632 | { | 632 | { |
633 | if (ati_remote->irq_urb) | 633 | usb_free_urb(ati_remote->irq_urb); |
634 | usb_free_urb(ati_remote->irq_urb); | 634 | usb_free_urb(ati_remote->out_urb); |
635 | |||
636 | if (ati_remote->out_urb) | ||
637 | usb_free_urb(ati_remote->out_urb); | ||
638 | 635 | ||
639 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 636 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
640 | ati_remote->inbuf, ati_remote->inbuf_dma); | 637 | ati_remote->inbuf, ati_remote->inbuf_dma); |
diff --git a/drivers/usb/input/ati_remote2.c b/drivers/usb/input/ati_remote2.c index f982a2b4a7f9..83f1f79db7c7 100644 --- a/drivers/usb/input/ati_remote2.c +++ b/drivers/usb/input/ati_remote2.c | |||
@@ -372,8 +372,7 @@ static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2) | |||
372 | int i; | 372 | int i; |
373 | 373 | ||
374 | for (i = 0; i < 2; i++) { | 374 | for (i = 0; i < 2; i++) { |
375 | if (ar2->urb[i]) | 375 | usb_free_urb(ar2->urb[i]); |
376 | usb_free_urb(ar2->urb[i]); | ||
377 | 376 | ||
378 | if (ar2->buf[i]) | 377 | if (ar2->buf[i]) |
379 | usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]); | 378 | usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]); |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 6d08a3bcc952..a49644b7c58e 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -968,20 +968,29 @@ static void hid_retry_timeout(unsigned long _hid) | |||
968 | hid_io_error(hid); | 968 | hid_io_error(hid); |
969 | } | 969 | } |
970 | 970 | ||
971 | /* Workqueue routine to reset the device */ | 971 | /* Workqueue routine to reset the device or clear a halt */ |
972 | static void hid_reset(void *_hid) | 972 | static void hid_reset(void *_hid) |
973 | { | 973 | { |
974 | struct hid_device *hid = (struct hid_device *) _hid; | 974 | struct hid_device *hid = (struct hid_device *) _hid; |
975 | int rc_lock, rc; | 975 | int rc_lock, rc = 0; |
976 | 976 | ||
977 | dev_dbg(&hid->intf->dev, "resetting device\n"); | 977 | if (test_bit(HID_CLEAR_HALT, &hid->iofl)) { |
978 | rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); | 978 | dev_dbg(&hid->intf->dev, "clear halt\n"); |
979 | if (rc_lock >= 0) { | 979 | rc = usb_clear_halt(hid->dev, hid->urbin->pipe); |
980 | rc = usb_reset_composite_device(hid->dev, hid->intf); | 980 | clear_bit(HID_CLEAR_HALT, &hid->iofl); |
981 | if (rc_lock) | 981 | hid_start_in(hid); |
982 | usb_unlock_device(hid->dev); | 982 | } |
983 | |||
984 | else if (test_bit(HID_RESET_PENDING, &hid->iofl)) { | ||
985 | dev_dbg(&hid->intf->dev, "resetting device\n"); | ||
986 | rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); | ||
987 | if (rc_lock >= 0) { | ||
988 | rc = usb_reset_composite_device(hid->dev, hid->intf); | ||
989 | if (rc_lock) | ||
990 | usb_unlock_device(hid->dev); | ||
991 | } | ||
992 | clear_bit(HID_RESET_PENDING, &hid->iofl); | ||
983 | } | 993 | } |
984 | clear_bit(HID_RESET_PENDING, &hid->iofl); | ||
985 | 994 | ||
986 | switch (rc) { | 995 | switch (rc) { |
987 | case 0: | 996 | case 0: |
@@ -1023,9 +1032,8 @@ static void hid_io_error(struct hid_device *hid) | |||
1023 | 1032 | ||
1024 | /* Retries failed, so do a port reset */ | 1033 | /* Retries failed, so do a port reset */ |
1025 | if (!test_and_set_bit(HID_RESET_PENDING, &hid->iofl)) { | 1034 | if (!test_and_set_bit(HID_RESET_PENDING, &hid->iofl)) { |
1026 | if (schedule_work(&hid->reset_work)) | 1035 | schedule_work(&hid->reset_work); |
1027 | goto done; | 1036 | goto done; |
1028 | clear_bit(HID_RESET_PENDING, &hid->iofl); | ||
1029 | } | 1037 | } |
1030 | } | 1038 | } |
1031 | 1039 | ||
@@ -1049,6 +1057,11 @@ static void hid_irq_in(struct urb *urb) | |||
1049 | hid->retry_delay = 0; | 1057 | hid->retry_delay = 0; |
1050 | hid_input_report(HID_INPUT_REPORT, urb, 1); | 1058 | hid_input_report(HID_INPUT_REPORT, urb, 1); |
1051 | break; | 1059 | break; |
1060 | case -EPIPE: /* stall */ | ||
1061 | clear_bit(HID_IN_RUNNING, &hid->iofl); | ||
1062 | set_bit(HID_CLEAR_HALT, &hid->iofl); | ||
1063 | schedule_work(&hid->reset_work); | ||
1064 | return; | ||
1052 | case -ECONNRESET: /* unlink */ | 1065 | case -ECONNRESET: /* unlink */ |
1053 | case -ENOENT: | 1066 | case -ENOENT: |
1054 | case -ESHUTDOWN: /* unplug */ | 1067 | case -ESHUTDOWN: /* unplug */ |
@@ -1627,6 +1640,19 @@ void hid_init_reports(struct hid_device *hid) | |||
1627 | 1640 | ||
1628 | #define USB_VENDOR_ID_APPLE 0x05ac | 1641 | #define USB_VENDOR_ID_APPLE 0x05ac |
1629 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 | 1642 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 |
1643 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e | ||
1644 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f | ||
1645 | #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 | ||
1646 | #define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215 | ||
1647 | #define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216 | ||
1648 | #define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217 | ||
1649 | #define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218 | ||
1650 | #define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219 | ||
1651 | #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a | ||
1652 | #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b | ||
1653 | #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c | ||
1654 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | ||
1655 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | ||
1630 | 1656 | ||
1631 | #define USB_VENDOR_ID_CHERRY 0x046a | 1657 | #define USB_VENDOR_ID_CHERRY 0x046a |
1632 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 1658 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
@@ -1794,17 +1820,19 @@ static const struct hid_blacklist { | |||
1794 | 1820 | ||
1795 | { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION }, | 1821 | { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION }, |
1796 | 1822 | ||
1797 | { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, | 1823 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1798 | { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, | 1824 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN }, |
1799 | { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, | 1825 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1800 | { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, | 1826 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
1801 | { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, | 1827 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
1802 | { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, | 1828 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1803 | { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, | 1829 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
1804 | { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, | 1830 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
1805 | { USB_VENDOR_ID_APPLE, 0x021B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1831 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1806 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, | 1832 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN }, |
1807 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1833 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
1834 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, | ||
1835 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, | ||
1808 | 1836 | ||
1809 | { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, | 1837 | { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, |
1810 | { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, | 1838 | { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, |
@@ -1985,7 +2013,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
1985 | if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0) | 2013 | if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0) |
1986 | interval = hid_mousepoll_interval; | 2014 | interval = hid_mousepoll_interval; |
1987 | 2015 | ||
1988 | if (endpoint->bEndpointAddress & USB_DIR_IN) { | 2016 | if (usb_endpoint_dir_in(endpoint)) { |
1989 | if (hid->urbin) | 2017 | if (hid->urbin) |
1990 | continue; | 2018 | continue; |
1991 | if (!(hid->urbin = usb_alloc_urb(0, GFP_KERNEL))) | 2019 | if (!(hid->urbin = usb_alloc_urb(0, GFP_KERNEL))) |
@@ -2067,13 +2095,9 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
2067 | return hid; | 2095 | return hid; |
2068 | 2096 | ||
2069 | fail: | 2097 | fail: |
2070 | 2098 | usb_free_urb(hid->urbin); | |
2071 | if (hid->urbin) | 2099 | usb_free_urb(hid->urbout); |
2072 | usb_free_urb(hid->urbin); | 2100 | usb_free_urb(hid->urbctrl); |
2073 | if (hid->urbout) | ||
2074 | usb_free_urb(hid->urbout); | ||
2075 | if (hid->urbctrl) | ||
2076 | usb_free_urb(hid->urbctrl); | ||
2077 | hid_free_buffers(dev, hid); | 2101 | hid_free_buffers(dev, hid); |
2078 | hid_free_device(hid); | 2102 | hid_free_device(hid); |
2079 | 2103 | ||
@@ -2104,8 +2128,7 @@ static void hid_disconnect(struct usb_interface *intf) | |||
2104 | 2128 | ||
2105 | usb_free_urb(hid->urbin); | 2129 | usb_free_urb(hid->urbin); |
2106 | usb_free_urb(hid->urbctrl); | 2130 | usb_free_urb(hid->urbctrl); |
2107 | if (hid->urbout) | 2131 | usb_free_urb(hid->urbout); |
2108 | usb_free_urb(hid->urbout); | ||
2109 | 2132 | ||
2110 | hid_free_buffers(hid->dev, hid); | 2133 | hid_free_buffers(hid->dev, hid); |
2111 | hid_free_device(hid); | 2134 | hid_free_device(hid); |
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index 0e76e6dcac37..2a9bf07944c0 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h | |||
@@ -385,6 +385,7 @@ struct hid_control_fifo { | |||
385 | #define HID_IN_RUNNING 3 | 385 | #define HID_IN_RUNNING 3 |
386 | #define HID_RESET_PENDING 4 | 386 | #define HID_RESET_PENDING 4 |
387 | #define HID_SUSPENDED 5 | 387 | #define HID_SUSPENDED 5 |
388 | #define HID_CLEAR_HALT 6 | ||
388 | 389 | ||
389 | struct hid_input { | 390 | struct hid_input { |
390 | struct list_head list; | 391 | struct list_head list; |
diff --git a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c index c73285cf8558..dac88640eab6 100644 --- a/drivers/usb/input/usbkbd.c +++ b/drivers/usb/input/usbkbd.c | |||
@@ -208,10 +208,8 @@ static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd) | |||
208 | 208 | ||
209 | static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) | 209 | static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) |
210 | { | 210 | { |
211 | if (kbd->irq) | 211 | usb_free_urb(kbd->irq); |
212 | usb_free_urb(kbd->irq); | 212 | usb_free_urb(kbd->led); |
213 | if (kbd->led) | ||
214 | usb_free_urb(kbd->led); | ||
215 | if (kbd->new) | 213 | if (kbd->new) |
216 | usb_buffer_free(dev, 8, kbd->new, kbd->new_dma); | 214 | usb_buffer_free(dev, 8, kbd->new, kbd->new_dma); |
217 | if (kbd->cr) | 215 | if (kbd->cr) |
@@ -236,9 +234,7 @@ static int usb_kbd_probe(struct usb_interface *iface, | |||
236 | return -ENODEV; | 234 | return -ENODEV; |
237 | 235 | ||
238 | endpoint = &interface->endpoint[0].desc; | 236 | endpoint = &interface->endpoint[0].desc; |
239 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 237 | if (!usb_endpoint_is_int_in(endpoint)) |
240 | return -ENODEV; | ||
241 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) | ||
242 | return -ENODEV; | 238 | return -ENODEV; |
243 | 239 | ||
244 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); | 240 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); |
diff --git a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c index cbbbea332ed7..68a55642c082 100644 --- a/drivers/usb/input/usbmouse.c +++ b/drivers/usb/input/usbmouse.c | |||
@@ -126,9 +126,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i | |||
126 | return -ENODEV; | 126 | return -ENODEV; |
127 | 127 | ||
128 | endpoint = &interface->endpoint[0].desc; | 128 | endpoint = &interface->endpoint[0].desc; |
129 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 129 | if (!usb_endpoint_is_int_in(endpoint)) |
130 | return -ENODEV; | ||
131 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) | ||
132 | return -ENODEV; | 130 | return -ENODEV; |
133 | 131 | ||
134 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); | 132 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); |
diff --git a/drivers/usb/input/usbtouchscreen.c b/drivers/usb/input/usbtouchscreen.c index 933ceddf3dee..49704d4ed0e2 100644 --- a/drivers/usb/input/usbtouchscreen.c +++ b/drivers/usb/input/usbtouchscreen.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * - PanJit TouchSet | 8 | * - PanJit TouchSet |
9 | * - eTurboTouch | 9 | * - eTurboTouch |
10 | * - Gunze AHL61 | 10 | * - Gunze AHL61 |
11 | * - DMC TSC-10/25 | ||
11 | * | 12 | * |
12 | * Copyright (C) 2004-2006 by Daniel Ritz <daniel.ritz@gmx.ch> | 13 | * Copyright (C) 2004-2006 by Daniel Ritz <daniel.ritz@gmx.ch> |
13 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) | 14 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) |
@@ -30,6 +31,8 @@ | |||
30 | * - ITM parts are from itmtouch.c | 31 | * - ITM parts are from itmtouch.c |
31 | * - 3M parts are from mtouchusb.c | 32 | * - 3M parts are from mtouchusb.c |
32 | * - PanJit parts are from an unmerged driver by Lanslott Gish | 33 | * - PanJit parts are from an unmerged driver by Lanslott Gish |
34 | * - DMC TSC 10/25 are from Holger Schurig, with ideas from an unmerged | ||
35 | * driver from Marius Vollmer | ||
33 | * | 36 | * |
34 | *****************************************************************************/ | 37 | *****************************************************************************/ |
35 | 38 | ||
@@ -44,7 +47,7 @@ | |||
44 | #include <linux/usb/input.h> | 47 | #include <linux/usb/input.h> |
45 | 48 | ||
46 | 49 | ||
47 | #define DRIVER_VERSION "v0.4" | 50 | #define DRIVER_VERSION "v0.5" |
48 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" | 51 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" |
49 | #define DRIVER_DESC "USB Touchscreen Driver" | 52 | #define DRIVER_DESC "USB Touchscreen Driver" |
50 | 53 | ||
@@ -103,6 +106,7 @@ enum { | |||
103 | DEVTYPE_ITM, | 106 | DEVTYPE_ITM, |
104 | DEVTYPE_ETURBO, | 107 | DEVTYPE_ETURBO, |
105 | DEVTYPE_GUNZE, | 108 | DEVTYPE_GUNZE, |
109 | DEVTYPE_DMC_TSC10, | ||
106 | }; | 110 | }; |
107 | 111 | ||
108 | static struct usb_device_id usbtouch_devices[] = { | 112 | static struct usb_device_id usbtouch_devices[] = { |
@@ -139,6 +143,10 @@ static struct usb_device_id usbtouch_devices[] = { | |||
139 | {USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE}, | 143 | {USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE}, |
140 | #endif | 144 | #endif |
141 | 145 | ||
146 | #ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10 | ||
147 | {USB_DEVICE(0x0afa, 0x03e8), .driver_info = DEVTYPE_DMC_TSC10}, | ||
148 | #endif | ||
149 | |||
142 | {} | 150 | {} |
143 | }; | 151 | }; |
144 | 152 | ||
@@ -313,6 +321,80 @@ static int gunze_read_data(unsigned char *pkt, int *x, int *y, int *touch, int * | |||
313 | #endif | 321 | #endif |
314 | 322 | ||
315 | /***************************************************************************** | 323 | /***************************************************************************** |
324 | * DMC TSC-10/25 Part | ||
325 | * | ||
326 | * Documentation about the controller and it's protocol can be found at | ||
327 | * http://www.dmccoltd.com/files/controler/tsc10usb_pi_e.pdf | ||
328 | * http://www.dmccoltd.com/files/controler/tsc25_usb_e.pdf | ||
329 | */ | ||
330 | #ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10 | ||
331 | |||
332 | /* supported data rates. currently using 130 */ | ||
333 | #define TSC10_RATE_POINT 0x50 | ||
334 | #define TSC10_RATE_30 0x40 | ||
335 | #define TSC10_RATE_50 0x41 | ||
336 | #define TSC10_RATE_80 0x42 | ||
337 | #define TSC10_RATE_100 0x43 | ||
338 | #define TSC10_RATE_130 0x44 | ||
339 | #define TSC10_RATE_150 0x45 | ||
340 | |||
341 | /* commands */ | ||
342 | #define TSC10_CMD_RESET 0x55 | ||
343 | #define TSC10_CMD_RATE 0x05 | ||
344 | #define TSC10_CMD_DATA1 0x01 | ||
345 | |||
346 | static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) | ||
347 | { | ||
348 | struct usb_device *dev = usbtouch->udev; | ||
349 | int ret; | ||
350 | unsigned char buf[2]; | ||
351 | |||
352 | /* reset */ | ||
353 | buf[0] = buf[1] = 0xFF; | ||
354 | ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), | ||
355 | TSC10_CMD_RESET, | ||
356 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
357 | 0, 0, buf, 2, USB_CTRL_SET_TIMEOUT); | ||
358 | if (ret < 0) | ||
359 | return ret; | ||
360 | if (buf[0] != 0x06 || buf[1] != 0x00) | ||
361 | return -ENODEV; | ||
362 | |||
363 | /* set coordinate output rate */ | ||
364 | buf[0] = buf[1] = 0xFF; | ||
365 | ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), | ||
366 | TSC10_CMD_RATE, | ||
367 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
368 | TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT); | ||
369 | if (ret < 0) | ||
370 | return ret; | ||
371 | if (buf[0] != 0x06 || buf[1] != 0x00) | ||
372 | return -ENODEV; | ||
373 | |||
374 | /* start sending data */ | ||
375 | ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), | ||
376 | TSC10_CMD_DATA1, | ||
377 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
378 | 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
379 | if (ret < 0) | ||
380 | return ret; | ||
381 | |||
382 | return 0; | ||
383 | } | ||
384 | |||
385 | |||
386 | static int dmc_tsc10_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | ||
387 | { | ||
388 | *x = ((pkt[2] & 0x03) << 8) | pkt[1]; | ||
389 | *y = ((pkt[4] & 0x03) << 8) | pkt[3]; | ||
390 | *touch = pkt[0] & 0x01; | ||
391 | |||
392 | return 1; | ||
393 | } | ||
394 | #endif | ||
395 | |||
396 | |||
397 | /***************************************************************************** | ||
316 | * the different device descriptors | 398 | * the different device descriptors |
317 | */ | 399 | */ |
318 | static struct usbtouch_device_info usbtouch_dev_info[] = { | 400 | static struct usbtouch_device_info usbtouch_dev_info[] = { |
@@ -389,6 +471,18 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
389 | .read_data = gunze_read_data, | 471 | .read_data = gunze_read_data, |
390 | }, | 472 | }, |
391 | #endif | 473 | #endif |
474 | |||
475 | #ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10 | ||
476 | [DEVTYPE_DMC_TSC10] = { | ||
477 | .min_xc = 0x0, | ||
478 | .max_xc = 0x03ff, | ||
479 | .min_yc = 0x0, | ||
480 | .max_yc = 0x03ff, | ||
481 | .rept_size = 5, | ||
482 | .init = dmc_tsc10_init, | ||
483 | .read_data = dmc_tsc10_read_data, | ||
484 | }, | ||
485 | #endif | ||
392 | }; | 486 | }; |
393 | 487 | ||
394 | 488 | ||
diff --git a/drivers/usb/input/wacom.h b/drivers/usb/input/wacom.h index 1cf08f02c50e..d85abfc5ab58 100644 --- a/drivers/usb/input/wacom.h +++ b/drivers/usb/input/wacom.h | |||
@@ -110,7 +110,6 @@ struct wacom_combo { | |||
110 | }; | 110 | }; |
111 | 111 | ||
112 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); | 112 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); |
113 | extern void wacom_sys_irq(struct urb *urb); | ||
114 | extern void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data); | 113 | extern void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data); |
115 | extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data); | 114 | extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data); |
116 | extern void wacom_report_key(void *wcombo, unsigned int key_type, int key_data); | 115 | extern void wacom_report_key(void *wcombo, unsigned int key_type, int key_data); |
diff --git a/drivers/usb/input/wacom_sys.c b/drivers/usb/input/wacom_sys.c index 3498b893b53b..e7cc20ab8155 100644 --- a/drivers/usb/input/wacom_sys.c +++ b/drivers/usb/input/wacom_sys.c | |||
@@ -42,7 +42,7 @@ static struct input_dev * get_input_dev(struct wacom_combo *wcombo) | |||
42 | return wcombo->wacom->dev; | 42 | return wcombo->wacom->dev; |
43 | } | 43 | } |
44 | 44 | ||
45 | void wacom_sys_irq(struct urb *urb) | 45 | static void wacom_sys_irq(struct urb *urb) |
46 | { | 46 | { |
47 | struct wacom *wacom = urb->context; | 47 | struct wacom *wacom = urb->context; |
48 | struct wacom_combo wcombo; | 48 | struct wacom_combo wcombo; |
diff --git a/drivers/usb/input/yealink.c b/drivers/usb/input/yealink.c index 905bf6398257..2268ca311ade 100644 --- a/drivers/usb/input/yealink.c +++ b/drivers/usb/input/yealink.c | |||
@@ -859,10 +859,8 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
859 | 859 | ||
860 | interface = intf->cur_altsetting; | 860 | interface = intf->cur_altsetting; |
861 | endpoint = &interface->endpoint[0].desc; | 861 | endpoint = &interface->endpoint[0].desc; |
862 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 862 | if (!usb_endpoint_is_int_in(endpoint)) |
863 | return -EIO; | 863 | return -ENODEV; |
864 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) | ||
865 | return -EIO; | ||
866 | 864 | ||
867 | yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL); | 865 | yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL); |
868 | if (!yld) | 866 | if (!yld) |
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index 11dc59540cda..2cba07d31971 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile | |||
@@ -4,6 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | obj-$(CONFIG_USB_ADUTUX) += adutux.o | 6 | obj-$(CONFIG_USB_ADUTUX) += adutux.o |
7 | obj-$(CONFIG_USB_APPLEDISPLAY) += appledisplay.o | ||
7 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o | 8 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o |
8 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o | 9 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o |
9 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o | 10 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o |
diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c index 6b23a1def9fe..ba30ca6a14aa 100644 --- a/drivers/usb/misc/appledisplay.c +++ b/drivers/usb/misc/appledisplay.c | |||
@@ -216,10 +216,7 @@ static int appledisplay_probe(struct usb_interface *iface, | |||
216 | iface_desc = iface->cur_altsetting; | 216 | iface_desc = iface->cur_altsetting; |
217 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { | 217 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { |
218 | endpoint = &iface_desc->endpoint[i].desc; | 218 | endpoint = &iface_desc->endpoint[i].desc; |
219 | if (!int_in_endpointAddr && | 219 | if (!int_in_endpointAddr && usb_endpoint_is_int_in(endpoint)) { |
220 | (endpoint->bEndpointAddress & USB_DIR_IN) && | ||
221 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
222 | USB_ENDPOINT_XFER_INT)) { | ||
223 | /* we found an interrupt in endpoint */ | 220 | /* we found an interrupt in endpoint */ |
224 | int_in_endpointAddr = endpoint->bEndpointAddress; | 221 | int_in_endpointAddr = endpoint->bEndpointAddress; |
225 | break; | 222 | break; |
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index e4971d6aaafb..c703f73e1655 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
@@ -704,9 +704,7 @@ static void auerbuf_free (pauerbuf_t bp) | |||
704 | { | 704 | { |
705 | kfree(bp->bufp); | 705 | kfree(bp->bufp); |
706 | kfree(bp->dr); | 706 | kfree(bp->dr); |
707 | if (bp->urbp) { | 707 | usb_free_urb(bp->urbp); |
708 | usb_free_urb(bp->urbp); | ||
709 | } | ||
710 | kfree(bp); | 708 | kfree(bp); |
711 | } | 709 | } |
712 | 710 | ||
@@ -1155,8 +1153,7 @@ static void auerswald_int_release (pauerswald_t cp) | |||
1155 | dbg ("auerswald_int_release"); | 1153 | dbg ("auerswald_int_release"); |
1156 | 1154 | ||
1157 | /* stop the int endpoint */ | 1155 | /* stop the int endpoint */ |
1158 | if (cp->inturbp) | 1156 | usb_kill_urb (cp->inturbp); |
1159 | usb_kill_urb (cp->inturbp); | ||
1160 | 1157 | ||
1161 | /* deallocate memory */ | 1158 | /* deallocate memory */ |
1162 | auerswald_int_free (cp); | 1159 | auerswald_int_free (cp); |
diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index 1fd9cb85f4ca..5c0a26cbd128 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c | |||
@@ -53,13 +53,12 @@ static void __exit emi26_exit (void); | |||
53 | static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) | 53 | static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) |
54 | { | 54 | { |
55 | int result; | 55 | int result; |
56 | unsigned char *buffer = kmalloc (length, GFP_KERNEL); | 56 | unsigned char *buffer = kmemdup(data, length, GFP_KERNEL); |
57 | 57 | ||
58 | if (!buffer) { | 58 | if (!buffer) { |
59 | err("emi26: kmalloc(%d) failed.", length); | 59 | err("emi26: kmalloc(%d) failed.", length); |
60 | return -ENOMEM; | 60 | return -ENOMEM; |
61 | } | 61 | } |
62 | memcpy (buffer, data, length); | ||
63 | /* Note: usb_control_msg returns negative value on error or length of the | 62 | /* Note: usb_control_msg returns negative value on error or length of the |
64 | * data that was written! */ | 63 | * data that was written! */ |
65 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); | 64 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); |
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index fe351371f274..23153eac0dfa 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c | |||
@@ -61,13 +61,12 @@ static void __exit emi62_exit (void); | |||
61 | static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) | 61 | static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) |
62 | { | 62 | { |
63 | int result; | 63 | int result; |
64 | unsigned char *buffer = kmalloc (length, GFP_KERNEL); | 64 | unsigned char *buffer = kmemdup(data, length, GFP_KERNEL); |
65 | 65 | ||
66 | if (!buffer) { | 66 | if (!buffer) { |
67 | err("emi62: kmalloc(%d) failed.", length); | 67 | err("emi62: kmalloc(%d) failed.", length); |
68 | return -ENOMEM; | 68 | return -ENOMEM; |
69 | } | 69 | } |
70 | memcpy (buffer, data, length); | ||
71 | /* Note: usb_control_msg returns negative value on error or length of the | 70 | /* Note: usb_control_msg returns negative value on error or length of the |
72 | * data that was written! */ | 71 | * data that was written! */ |
73 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); | 72 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); |
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c index 9b591b8b9369..cb0ba3107d7f 100644 --- a/drivers/usb/misc/ftdi-elan.c +++ b/drivers/usb/misc/ftdi-elan.c | |||
@@ -303,7 +303,7 @@ void ftdi_elan_gone_away(struct platform_device *pdev) | |||
303 | 303 | ||
304 | 304 | ||
305 | EXPORT_SYMBOL_GPL(ftdi_elan_gone_away); | 305 | EXPORT_SYMBOL_GPL(ftdi_elan_gone_away); |
306 | void ftdi_release_platform_dev(struct device *dev) | 306 | static void ftdi_release_platform_dev(struct device *dev) |
307 | { | 307 | { |
308 | dev->parent = NULL; | 308 | dev->parent = NULL; |
309 | } | 309 | } |
@@ -1426,14 +1426,6 @@ static int ftdi_elan_read_reg(struct usb_ftdi *ftdi, u32 *data) | |||
1426 | } | 1426 | } |
1427 | } | 1427 | } |
1428 | 1428 | ||
1429 | int usb_ftdi_elan_read_reg(struct platform_device *pdev, u32 *data) | ||
1430 | { | ||
1431 | struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev); | ||
1432 | return ftdi_elan_read_reg(ftdi, data); | ||
1433 | } | ||
1434 | |||
1435 | |||
1436 | EXPORT_SYMBOL_GPL(usb_ftdi_elan_read_reg); | ||
1437 | static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset, | 1429 | static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset, |
1438 | u8 width, u32 *data) | 1430 | u8 width, u32 *data) |
1439 | { | 1431 | { |
@@ -2633,10 +2625,7 @@ static int ftdi_elan_probe(struct usb_interface *interface, | |||
2633 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 2625 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
2634 | endpoint = &iface_desc->endpoint[i].desc; | 2626 | endpoint = &iface_desc->endpoint[i].desc; |
2635 | if (!ftdi->bulk_in_endpointAddr && | 2627 | if (!ftdi->bulk_in_endpointAddr && |
2636 | ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) | 2628 | usb_endpoint_is_bulk_in(endpoint)) { |
2637 | == USB_DIR_IN) && ((endpoint->bmAttributes & | ||
2638 | USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) | ||
2639 | { | ||
2640 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); | 2629 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); |
2641 | ftdi->bulk_in_size = buffer_size; | 2630 | ftdi->bulk_in_size = buffer_size; |
2642 | ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress; | 2631 | ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress; |
@@ -2649,10 +2638,7 @@ static int ftdi_elan_probe(struct usb_interface *interface, | |||
2649 | } | 2638 | } |
2650 | } | 2639 | } |
2651 | if (!ftdi->bulk_out_endpointAddr && | 2640 | if (!ftdi->bulk_out_endpointAddr && |
2652 | ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) | 2641 | usb_endpoint_is_bulk_out(endpoint)) { |
2653 | == USB_DIR_OUT) && ((endpoint->bmAttributes & | ||
2654 | USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) | ||
2655 | { | ||
2656 | ftdi->bulk_out_endpointAddr = | 2642 | ftdi->bulk_out_endpointAddr = |
2657 | endpoint->bEndpointAddress; | 2643 | endpoint->bEndpointAddress; |
2658 | } | 2644 | } |
diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index 8e6e195a22ba..c9418535bef8 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c | |||
@@ -125,12 +125,12 @@ static DEFINE_MUTEX(disconnect_mutex); | |||
125 | 125 | ||
126 | static int idmouse_create_image(struct usb_idmouse *dev) | 126 | static int idmouse_create_image(struct usb_idmouse *dev) |
127 | { | 127 | { |
128 | int bytes_read = 0; | 128 | int bytes_read; |
129 | int bulk_read = 0; | 129 | int bulk_read; |
130 | int result = 0; | 130 | int result; |
131 | 131 | ||
132 | memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); | 132 | memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); |
133 | bytes_read += sizeof(HEADER)-1; | 133 | bytes_read = sizeof(HEADER)-1; |
134 | 134 | ||
135 | /* reset the device and set a fast blink rate */ | 135 | /* reset the device and set a fast blink rate */ |
136 | result = ftip_command(dev, FTIP_RELEASE, 0, 0); | 136 | result = ftip_command(dev, FTIP_RELEASE, 0, 0); |
@@ -208,9 +208,9 @@ static inline void idmouse_delete(struct usb_idmouse *dev) | |||
208 | 208 | ||
209 | static int idmouse_open(struct inode *inode, struct file *file) | 209 | static int idmouse_open(struct inode *inode, struct file *file) |
210 | { | 210 | { |
211 | struct usb_idmouse *dev = NULL; | 211 | struct usb_idmouse *dev; |
212 | struct usb_interface *interface; | 212 | struct usb_interface *interface; |
213 | int result = 0; | 213 | int result; |
214 | 214 | ||
215 | /* prevent disconnects */ | 215 | /* prevent disconnects */ |
216 | mutex_lock(&disconnect_mutex); | 216 | mutex_lock(&disconnect_mutex); |
@@ -305,7 +305,7 @@ static ssize_t idmouse_read(struct file *file, char __user *buffer, size_t count | |||
305 | loff_t * ppos) | 305 | loff_t * ppos) |
306 | { | 306 | { |
307 | struct usb_idmouse *dev; | 307 | struct usb_idmouse *dev; |
308 | int result = 0; | 308 | int result; |
309 | 309 | ||
310 | dev = (struct usb_idmouse *) file->private_data; | 310 | dev = (struct usb_idmouse *) file->private_data; |
311 | 311 | ||
@@ -329,7 +329,7 @@ static int idmouse_probe(struct usb_interface *interface, | |||
329 | const struct usb_device_id *id) | 329 | const struct usb_device_id *id) |
330 | { | 330 | { |
331 | struct usb_device *udev = interface_to_usbdev(interface); | 331 | struct usb_device *udev = interface_to_usbdev(interface); |
332 | struct usb_idmouse *dev = NULL; | 332 | struct usb_idmouse *dev; |
333 | struct usb_host_interface *iface_desc; | 333 | struct usb_host_interface *iface_desc; |
334 | struct usb_endpoint_descriptor *endpoint; | 334 | struct usb_endpoint_descriptor *endpoint; |
335 | int result; | 335 | int result; |
@@ -350,11 +350,7 @@ static int idmouse_probe(struct usb_interface *interface, | |||
350 | 350 | ||
351 | /* set up the endpoint information - use only the first bulk-in endpoint */ | 351 | /* set up the endpoint information - use only the first bulk-in endpoint */ |
352 | endpoint = &iface_desc->endpoint[0].desc; | 352 | endpoint = &iface_desc->endpoint[0].desc; |
353 | if (!dev->bulk_in_endpointAddr | 353 | if (!dev->bulk_in_endpointAddr && usb_endpoint_is_bulk_in(endpoint)) { |
354 | && (endpoint->bEndpointAddress & USB_DIR_IN) | ||
355 | && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
356 | USB_ENDPOINT_XFER_BULK)) { | ||
357 | |||
358 | /* we found a bulk in endpoint */ | 354 | /* we found a bulk in endpoint */ |
359 | dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); | 355 | dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); |
360 | dev->bulk_in_size = 0x200; /* works _much_ faster */ | 356 | dev->bulk_in_size = 0x200; /* works _much_ faster */ |
diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index 27089497e717..5dce797bddb7 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c | |||
@@ -317,12 +317,8 @@ static inline void tower_delete (struct lego_usb_tower *dev) | |||
317 | tower_abort_transfers (dev); | 317 | tower_abort_transfers (dev); |
318 | 318 | ||
319 | /* free data structures */ | 319 | /* free data structures */ |
320 | if (dev->interrupt_in_urb != NULL) { | 320 | usb_free_urb(dev->interrupt_in_urb); |
321 | usb_free_urb (dev->interrupt_in_urb); | 321 | usb_free_urb(dev->interrupt_out_urb); |
322 | } | ||
323 | if (dev->interrupt_out_urb != NULL) { | ||
324 | usb_free_urb (dev->interrupt_out_urb); | ||
325 | } | ||
326 | kfree (dev->read_buffer); | 322 | kfree (dev->read_buffer); |
327 | kfree (dev->interrupt_in_buffer); | 323 | kfree (dev->interrupt_in_buffer); |
328 | kfree (dev->interrupt_out_buffer); | 324 | kfree (dev->interrupt_out_buffer); |
@@ -502,15 +498,11 @@ static void tower_abort_transfers (struct lego_usb_tower *dev) | |||
502 | if (dev->interrupt_in_running) { | 498 | if (dev->interrupt_in_running) { |
503 | dev->interrupt_in_running = 0; | 499 | dev->interrupt_in_running = 0; |
504 | mb(); | 500 | mb(); |
505 | if (dev->interrupt_in_urb != NULL && dev->udev) { | 501 | if (dev->udev) |
506 | usb_kill_urb (dev->interrupt_in_urb); | 502 | usb_kill_urb (dev->interrupt_in_urb); |
507 | } | ||
508 | } | ||
509 | if (dev->interrupt_out_busy) { | ||
510 | if (dev->interrupt_out_urb != NULL && dev->udev) { | ||
511 | usb_kill_urb (dev->interrupt_out_urb); | ||
512 | } | ||
513 | } | 503 | } |
504 | if (dev->interrupt_out_busy && dev->udev) | ||
505 | usb_kill_urb(dev->interrupt_out_urb); | ||
514 | 506 | ||
515 | exit: | 507 | exit: |
516 | dbg(2, "%s: leave", __FUNCTION__); | 508 | dbg(2, "%s: leave", __FUNCTION__); |
@@ -898,14 +890,11 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device | |||
898 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 890 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
899 | endpoint = &iface_desc->endpoint[i].desc; | 891 | endpoint = &iface_desc->endpoint[i].desc; |
900 | 892 | ||
901 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) && | 893 | if (usb_endpoint_xfer_int(endpoint)) { |
902 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | 894 | if (usb_endpoint_dir_in(endpoint)) |
903 | dev->interrupt_in_endpoint = endpoint; | 895 | dev->interrupt_in_endpoint = endpoint; |
904 | } | 896 | else |
905 | 897 | dev->interrupt_out_endpoint = endpoint; | |
906 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && | ||
907 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
908 | dev->interrupt_out_endpoint = endpoint; | ||
909 | } | 898 | } |
910 | } | 899 | } |
911 | if(dev->interrupt_in_endpoint == NULL) { | 900 | if(dev->interrupt_in_endpoint == NULL) { |
diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c index abb4dcd811ac..9110793f81d3 100644 --- a/drivers/usb/misc/phidgetkit.c +++ b/drivers/usb/misc/phidgetkit.c | |||
@@ -551,7 +551,7 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic | |||
551 | return -ENODEV; | 551 | return -ENODEV; |
552 | 552 | ||
553 | endpoint = &interface->endpoint[0].desc; | 553 | endpoint = &interface->endpoint[0].desc; |
554 | if (!(endpoint->bEndpointAddress & 0x80)) | 554 | if (!usb_endpoint_dir_in(endpoint)) |
555 | return -ENODEV; | 555 | return -ENODEV; |
556 | /* | 556 | /* |
557 | * bmAttributes | 557 | * bmAttributes |
@@ -650,8 +650,7 @@ out2: | |||
650 | device_remove_file(kit->dev, &dev_output_attrs[i]); | 650 | device_remove_file(kit->dev, &dev_output_attrs[i]); |
651 | out: | 651 | out: |
652 | if (kit) { | 652 | if (kit) { |
653 | if (kit->irq) | 653 | usb_free_urb(kit->irq); |
654 | usb_free_urb(kit->irq); | ||
655 | if (kit->data) | 654 | if (kit->data) |
656 | usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); | 655 | usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); |
657 | if (kit->dev) | 656 | if (kit->dev) |
diff --git a/drivers/usb/misc/phidgetmotorcontrol.c b/drivers/usb/misc/phidgetmotorcontrol.c index 5c780cab92e0..c3469b0a67c2 100644 --- a/drivers/usb/misc/phidgetmotorcontrol.c +++ b/drivers/usb/misc/phidgetmotorcontrol.c | |||
@@ -323,7 +323,7 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic | |||
323 | return -ENODEV; | 323 | return -ENODEV; |
324 | 324 | ||
325 | endpoint = &interface->endpoint[0].desc; | 325 | endpoint = &interface->endpoint[0].desc; |
326 | if (!(endpoint->bEndpointAddress & 0x80)) | 326 | if (!usb_endpoint_dir_in(endpoint)) |
327 | return -ENODEV; | 327 | return -ENODEV; |
328 | 328 | ||
329 | /* | 329 | /* |
@@ -392,8 +392,7 @@ out2: | |||
392 | device_remove_file(mc->dev, &dev_attrs[i]); | 392 | device_remove_file(mc->dev, &dev_attrs[i]); |
393 | out: | 393 | out: |
394 | if (mc) { | 394 | if (mc) { |
395 | if (mc->irq) | 395 | usb_free_urb(mc->irq); |
396 | usb_free_urb(mc->irq); | ||
397 | if (mc->data) | 396 | if (mc->data) |
398 | usb_buffer_free(dev, URB_INT_SIZE, mc->data, mc->data_dma); | 397 | usb_buffer_free(dev, URB_INT_SIZE, mc->data, mc->data_dma); |
399 | if (mc->dev) | 398 | if (mc->dev) |
diff --git a/drivers/usb/misc/usb_u132.h b/drivers/usb/misc/usb_u132.h index 551ba8906d62..dc2e5a31caec 100644 --- a/drivers/usb/misc/usb_u132.h +++ b/drivers/usb/misc/usb_u132.h | |||
@@ -52,7 +52,7 @@ | |||
52 | * the kernel to load the "u132-hcd" module. | 52 | * the kernel to load the "u132-hcd" module. |
53 | * | 53 | * |
54 | * The "ftdi-u132" module provides the interface to the inserted | 54 | * The "ftdi-u132" module provides the interface to the inserted |
55 | * PC card and the "u132-hcd" module uses the API to send and recieve | 55 | * PC card and the "u132-hcd" module uses the API to send and receive |
56 | * data. The API features call-backs, so that part of the "u132-hcd" | 56 | * data. The API features call-backs, so that part of the "u132-hcd" |
57 | * module code will run in the context of one of the kernel threads | 57 | * module code will run in the context of one of the kernel threads |
58 | * of the "ftdi-u132" module. | 58 | * of the "ftdi-u132" module. |
@@ -95,3 +95,7 @@ int usb_ftdi_elan_edset_setup(struct platform_device *pdev, u8 ed_number, | |||
95 | int halted, int skipped, int actual, int non_null)); | 95 | int halted, int skipped, int actual, int non_null)); |
96 | int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number, | 96 | int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number, |
97 | void *endp); | 97 | void *endp); |
98 | int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, int mem_offset, | ||
99 | u8 width, u32 *data); | ||
100 | int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, int mem_offset, | ||
101 | u8 width, u32 data); | ||
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 7c2cbdf81d20..194065dbb51f 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -138,7 +138,7 @@ get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf) | |||
138 | default: | 138 | default: |
139 | continue; | 139 | continue; |
140 | } | 140 | } |
141 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 141 | if (usb_endpoint_dir_in(&e->desc)) { |
142 | if (!in) | 142 | if (!in) |
143 | in = e; | 143 | in = e; |
144 | } else { | 144 | } else { |
@@ -147,7 +147,7 @@ get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf) | |||
147 | } | 147 | } |
148 | continue; | 148 | continue; |
149 | try_iso: | 149 | try_iso: |
150 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 150 | if (usb_endpoint_dir_in(&e->desc)) { |
151 | if (!iso_in) | 151 | if (!iso_in) |
152 | iso_in = e; | 152 | iso_in = e; |
153 | } else { | 153 | } else { |
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c index 881841e600de..95e682e2c9d6 100644 --- a/drivers/usb/net/asix.c +++ b/drivers/usb/net/asix.c | |||
@@ -249,9 +249,9 @@ asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
249 | 249 | ||
250 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; | 250 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; |
251 | req->bRequest = cmd; | 251 | req->bRequest = cmd; |
252 | req->wValue = value; | 252 | req->wValue = cpu_to_le16(value); |
253 | req->wIndex = index; | 253 | req->wIndex = cpu_to_le16(index); |
254 | req->wLength = size; | 254 | req->wLength = cpu_to_le16(size); |
255 | 255 | ||
256 | usb_fill_control_urb(urb, dev->udev, | 256 | usb_fill_control_urb(urb, dev->udev, |
257 | usb_sndctrlpipe(dev->udev, 0), | 257 | usb_sndctrlpipe(dev->udev, 0), |
diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c index f740325abac4..907b820a5faf 100644 --- a/drivers/usb/net/catc.c +++ b/drivers/usb/net/catc.c | |||
@@ -786,14 +786,10 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
786 | if ((!catc->ctrl_urb) || (!catc->tx_urb) || | 786 | if ((!catc->ctrl_urb) || (!catc->tx_urb) || |
787 | (!catc->rx_urb) || (!catc->irq_urb)) { | 787 | (!catc->rx_urb) || (!catc->irq_urb)) { |
788 | err("No free urbs available."); | 788 | err("No free urbs available."); |
789 | if (catc->ctrl_urb) | 789 | usb_free_urb(catc->ctrl_urb); |
790 | usb_free_urb(catc->ctrl_urb); | 790 | usb_free_urb(catc->tx_urb); |
791 | if (catc->tx_urb) | 791 | usb_free_urb(catc->rx_urb); |
792 | usb_free_urb(catc->tx_urb); | 792 | usb_free_urb(catc->irq_urb); |
793 | if (catc->rx_urb) | ||
794 | usb_free_urb(catc->rx_urb); | ||
795 | if (catc->irq_urb) | ||
796 | usb_free_urb(catc->irq_urb); | ||
797 | free_netdev(netdev); | 793 | free_netdev(netdev); |
798 | return -ENOMEM; | 794 | return -ENOMEM; |
799 | } | 795 | } |
diff --git a/drivers/usb/net/cdc_ether.c b/drivers/usb/net/cdc_ether.c index f6971b88349d..44a91547146e 100644 --- a/drivers/usb/net/cdc_ether.c +++ b/drivers/usb/net/cdc_ether.c | |||
@@ -200,8 +200,7 @@ next_desc: | |||
200 | 200 | ||
201 | dev->status = &info->control->cur_altsetting->endpoint [0]; | 201 | dev->status = &info->control->cur_altsetting->endpoint [0]; |
202 | desc = &dev->status->desc; | 202 | desc = &dev->status->desc; |
203 | if (desc->bmAttributes != USB_ENDPOINT_XFER_INT | 203 | if (!usb_endpoint_is_int_in(desc) |
204 | || !(desc->bEndpointAddress & USB_DIR_IN) | ||
205 | || (le16_to_cpu(desc->wMaxPacketSize) | 204 | || (le16_to_cpu(desc->wMaxPacketSize) |
206 | < sizeof(struct usb_cdc_notification)) | 205 | < sizeof(struct usb_cdc_notification)) |
207 | || !desc->bInterval) { | 206 | || !desc->bInterval) { |
diff --git a/drivers/usb/net/net1080.c b/drivers/usb/net/net1080.c index ce00de8f13a1..a77410562e12 100644 --- a/drivers/usb/net/net1080.c +++ b/drivers/usb/net/net1080.c | |||
@@ -237,12 +237,12 @@ static inline void nc_dump_usbctl(struct usbnet *dev, u16 usbctl) | |||
237 | #define STATUS_CONN_OTHER (1 << 14) | 237 | #define STATUS_CONN_OTHER (1 << 14) |
238 | #define STATUS_SUSPEND_OTHER (1 << 13) | 238 | #define STATUS_SUSPEND_OTHER (1 << 13) |
239 | #define STATUS_MAILBOX_OTHER (1 << 12) | 239 | #define STATUS_MAILBOX_OTHER (1 << 12) |
240 | #define STATUS_PACKETS_OTHER(n) (((n) >> 8) && 0x03) | 240 | #define STATUS_PACKETS_OTHER(n) (((n) >> 8) & 0x03) |
241 | 241 | ||
242 | #define STATUS_CONN_THIS (1 << 6) | 242 | #define STATUS_CONN_THIS (1 << 6) |
243 | #define STATUS_SUSPEND_THIS (1 << 5) | 243 | #define STATUS_SUSPEND_THIS (1 << 5) |
244 | #define STATUS_MAILBOX_THIS (1 << 4) | 244 | #define STATUS_MAILBOX_THIS (1 << 4) |
245 | #define STATUS_PACKETS_THIS(n) (((n) >> 0) && 0x03) | 245 | #define STATUS_PACKETS_THIS(n) (((n) >> 0) & 0x03) |
246 | 246 | ||
247 | #define STATUS_UNSPEC_MASK 0x0c8c | 247 | #define STATUS_UNSPEC_MASK 0x0c8c |
248 | #define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK)) | 248 | #define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK)) |
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 33abbd2176b6..69eb0db399df 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c | |||
@@ -163,6 +163,7 @@ static int get_registers(pegasus_t * pegasus, __u16 indx, __u16 size, | |||
163 | 163 | ||
164 | /* using ATOMIC, we'd never wake up if we slept */ | 164 | /* using ATOMIC, we'd never wake up if we slept */ |
165 | if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { | 165 | if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { |
166 | set_current_state(TASK_RUNNING); | ||
166 | if (ret == -ENODEV) | 167 | if (ret == -ENODEV) |
167 | netif_device_detach(pegasus->net); | 168 | netif_device_detach(pegasus->net); |
168 | if (netif_msg_drv(pegasus)) | 169 | if (netif_msg_drv(pegasus)) |
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index 760b5327b81b..7672e11c94c4 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c | |||
@@ -116,7 +116,7 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) | |||
116 | e = alt->endpoint + ep; | 116 | e = alt->endpoint + ep; |
117 | switch (e->desc.bmAttributes) { | 117 | switch (e->desc.bmAttributes) { |
118 | case USB_ENDPOINT_XFER_INT: | 118 | case USB_ENDPOINT_XFER_INT: |
119 | if (!(e->desc.bEndpointAddress & USB_DIR_IN)) | 119 | if (!usb_endpoint_dir_in(&e->desc)) |
120 | continue; | 120 | continue; |
121 | intr = 1; | 121 | intr = 1; |
122 | /* FALLTHROUGH */ | 122 | /* FALLTHROUGH */ |
@@ -125,7 +125,7 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) | |||
125 | default: | 125 | default: |
126 | continue; | 126 | continue; |
127 | } | 127 | } |
128 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 128 | if (usb_endpoint_dir_in(&e->desc)) { |
129 | if (!intr && !in) | 129 | if (!intr && !in) |
130 | in = e; | 130 | in = e; |
131 | else if (intr && !status) | 131 | else if (intr && !status) |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 2a8dd4cc943d..2f4d303ee36f 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -554,6 +554,17 @@ config USB_SERIAL_OMNINET | |||
554 | To compile this driver as a module, choose M here: the | 554 | To compile this driver as a module, choose M here: the |
555 | module will be called omninet. | 555 | module will be called omninet. |
556 | 556 | ||
557 | config USB_SERIAL_DEBUG | ||
558 | tristate "USB Debugging Device" | ||
559 | depends on USB_SERIAL | ||
560 | help | ||
561 | Say Y here if you have a USB debugging device used to recieve | ||
562 | debugging data from another machine. The most common of these | ||
563 | devices is the NetChip TurboCONNECT device. | ||
564 | |||
565 | To compile this driver as a module, choose M here: the | ||
566 | module will be called usb-debug. | ||
567 | |||
557 | config USB_EZUSB | 568 | config USB_EZUSB |
558 | bool | 569 | bool |
559 | depends on USB_SERIAL_KEYSPAN_PDA || USB_SERIAL_XIRCOM || USB_SERIAL_KEYSPAN || USB_SERIAL_WHITEHEAT | 570 | depends on USB_SERIAL_KEYSPAN_PDA || USB_SERIAL_XIRCOM || USB_SERIAL_KEYSPAN || USB_SERIAL_WHITEHEAT |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index a5047dc599bb..61166ad450e6 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -18,6 +18,7 @@ obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o | |||
18 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o | 18 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o |
19 | obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o | 19 | obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o |
20 | obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o | 20 | obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o |
21 | obj-$(CONFIG_USB_SERIAL_DEBUG) += usb_debug.o | ||
21 | obj-$(CONFIG_USB_SERIAL_DIGI_ACCELEPORT) += digi_acceleport.o | 22 | obj-$(CONFIG_USB_SERIAL_DIGI_ACCELEPORT) += digi_acceleport.o |
22 | obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o | 23 | obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o |
23 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o | 24 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o |
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 812275509137..b1b5707bc99a 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c | |||
@@ -270,8 +270,11 @@ static void aircable_read(void *params) | |||
270 | */ | 270 | */ |
271 | tty = port->tty; | 271 | tty = port->tty; |
272 | 272 | ||
273 | if (!tty) | 273 | if (!tty) { |
274 | schedule_work(&priv->rx_work); | 274 | schedule_work(&priv->rx_work); |
275 | err("%s - No tty available", __FUNCTION__); | ||
276 | return ; | ||
277 | } | ||
275 | 278 | ||
276 | count = min(64, serial_buf_data_avail(priv->rx_buf)); | 279 | count = min(64, serial_buf_data_avail(priv->rx_buf)); |
277 | 280 | ||
@@ -305,9 +308,7 @@ static int aircable_probe(struct usb_serial *serial, | |||
305 | 308 | ||
306 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { | 309 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { |
307 | endpoint = &iface_desc->endpoint[i].desc; | 310 | endpoint = &iface_desc->endpoint[i].desc; |
308 | if (((endpoint->bEndpointAddress & 0x80) == 0x00) && | 311 | if (usb_endpoint_is_bulk_out(endpoint)) { |
309 | ((endpoint->bmAttributes & 3) == 0x02)) { | ||
310 | /* we found our bulk out endpoint */ | ||
311 | dbg("found bulk out on endpoint %d", i); | 312 | dbg("found bulk out on endpoint %d", i); |
312 | ++num_bulk_out; | 313 | ++num_bulk_out; |
313 | } | 314 | } |
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index 7f5d546da39a..96c73726d74a 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -19,6 +19,7 @@ | |||
19 | static struct usb_device_id id_table [] = { | 19 | static struct usb_device_id id_table [] = { |
20 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ | 20 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ |
21 | { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ | 21 | { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ |
22 | { USB_DEVICE(0x1410, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ | ||
22 | { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ | 23 | { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ |
23 | { }, | 24 | { }, |
24 | }; | 25 | }; |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index ca52f12f0e24..863966c1c5ac 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -85,10 +85,9 @@ static int ark3116_attach(struct usb_serial *serial) | |||
85 | int i; | 85 | int i; |
86 | 86 | ||
87 | for (i = 0; i < serial->num_ports; ++i) { | 87 | for (i = 0; i < serial->num_ports; ++i) { |
88 | priv = kmalloc(sizeof (struct ark3116_private), GFP_KERNEL); | 88 | priv = kzalloc(sizeof(struct ark3116_private), GFP_KERNEL); |
89 | if (!priv) | 89 | if (!priv) |
90 | goto cleanup; | 90 | goto cleanup; |
91 | memset(priv, 0x00, sizeof (struct ark3116_private)); | ||
92 | spin_lock_init(&priv->lock); | 91 | spin_lock_init(&priv->lock); |
93 | 92 | ||
94 | usb_set_serial_port_data(serial->port[i], priv); | 93 | usb_set_serial_port_data(serial->port[i], priv); |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 3a9073dbfe6a..7167728d764c 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -166,19 +166,17 @@ static int usb_console_setup(struct console *co, char *options) | |||
166 | if (serial->type->set_termios) { | 166 | if (serial->type->set_termios) { |
167 | /* build up a fake tty structure so that the open call has something | 167 | /* build up a fake tty structure so that the open call has something |
168 | * to look at to get the cflag value */ | 168 | * to look at to get the cflag value */ |
169 | tty = kmalloc (sizeof (*tty), GFP_KERNEL); | 169 | tty = kzalloc(sizeof(*tty), GFP_KERNEL); |
170 | if (!tty) { | 170 | if (!tty) { |
171 | err ("no more memory"); | 171 | err ("no more memory"); |
172 | return -ENOMEM; | 172 | return -ENOMEM; |
173 | } | 173 | } |
174 | termios = kmalloc (sizeof (*termios), GFP_KERNEL); | 174 | termios = kzalloc(sizeof(*termios), GFP_KERNEL); |
175 | if (!termios) { | 175 | if (!termios) { |
176 | err ("no more memory"); | 176 | err ("no more memory"); |
177 | kfree (tty); | 177 | kfree (tty); |
178 | return -ENOMEM; | 178 | return -ENOMEM; |
179 | } | 179 | } |
180 | memset (tty, 0x00, sizeof(*tty)); | ||
181 | memset (termios, 0x00, sizeof(*termios)); | ||
182 | termios->c_cflag = cflag; | 180 | termios->c_cflag = cflag; |
183 | tty->termios = termios; | 181 | tty->termios = termios; |
184 | port->tty = tty; | 182 | port->tty = tty; |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index f2e89a083659..093f303b3189 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -1684,15 +1684,14 @@ static int __init cypress_init(void) | |||
1684 | 1684 | ||
1685 | info(DRIVER_DESC " " DRIVER_VERSION); | 1685 | info(DRIVER_DESC " " DRIVER_VERSION); |
1686 | return 0; | 1686 | return 0; |
1687 | |||
1687 | failed_usb_register: | 1688 | failed_usb_register: |
1688 | usb_deregister(&cypress_driver); | ||
1689 | failed_ca42v2_register: | ||
1690 | usb_serial_deregister(&cypress_ca42v2_device); | 1689 | usb_serial_deregister(&cypress_ca42v2_device); |
1691 | failed_hidcom_register: | 1690 | failed_ca42v2_register: |
1692 | usb_serial_deregister(&cypress_hidcom_device); | 1691 | usb_serial_deregister(&cypress_hidcom_device); |
1693 | failed_em_register: | 1692 | failed_hidcom_register: |
1694 | usb_serial_deregister(&cypress_earthmate_device); | 1693 | usb_serial_deregister(&cypress_earthmate_device); |
1695 | 1694 | failed_em_register: | |
1696 | return retval; | 1695 | return retval; |
1697 | } | 1696 | } |
1698 | 1697 | ||
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index bdb58100fc1d..5e3ac281a2f8 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -157,7 +157,7 @@ | |||
157 | * to TASK_RUNNING will be lost and write_chan's subsequent call to | 157 | * to TASK_RUNNING will be lost and write_chan's subsequent call to |
158 | * schedule() will never return (unless it catches a signal). | 158 | * schedule() will never return (unless it catches a signal). |
159 | * This race condition occurs because write_bulk_callback() (and thus | 159 | * This race condition occurs because write_bulk_callback() (and thus |
160 | * the wakeup) are called asynchonously from an interrupt, rather than | 160 | * the wakeup) are called asynchronously from an interrupt, rather than |
161 | * from the scheduler. We can avoid the race by calling the wakeup | 161 | * from the scheduler. We can avoid the race by calling the wakeup |
162 | * from the scheduler queue and that's our fix: Now, at the end of | 162 | * from the scheduler queue and that's our fix: Now, at the end of |
163 | * write_bulk_callback() we queue up a wakeup call on the scheduler | 163 | * write_bulk_callback() we queue up a wakeup call on the scheduler |
diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c index 5169c2d154ab..97ee718b1da2 100644 --- a/drivers/usb/serial/ezusb.c +++ b/drivers/usb/serial/ezusb.c | |||
@@ -31,12 +31,11 @@ int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *da | |||
31 | return -ENODEV; | 31 | return -ENODEV; |
32 | } | 32 | } |
33 | 33 | ||
34 | transfer_buffer = kmalloc (length, GFP_KERNEL); | 34 | transfer_buffer = kmemdup(data, length, GFP_KERNEL); |
35 | if (!transfer_buffer) { | 35 | if (!transfer_buffer) { |
36 | dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, length); | 36 | dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, length); |
37 | return -ENOMEM; | 37 | return -ENOMEM; |
38 | } | 38 | } |
39 | memcpy (transfer_buffer, data, length); | ||
40 | result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer, length, 3000); | 39 | result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer, length, 3000); |
41 | kfree (transfer_buffer); | 40 | kfree (transfer_buffer); |
42 | return result; | 41 | return result; |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index c186b4e73c72..89ce2775be15 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -1388,8 +1388,7 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp) | |||
1388 | flush_scheduled_work(); | 1388 | flush_scheduled_work(); |
1389 | 1389 | ||
1390 | /* shutdown our bulk read */ | 1390 | /* shutdown our bulk read */ |
1391 | if (port->read_urb) | 1391 | usb_kill_urb(port->read_urb); |
1392 | usb_kill_urb(port->read_urb); | ||
1393 | } /* ftdi_close */ | 1392 | } /* ftdi_close */ |
1394 | 1393 | ||
1395 | 1394 | ||
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 4543152a9966..6530d391ebed 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -1523,12 +1523,11 @@ static int garmin_attach (struct usb_serial *serial) | |||
1523 | 1523 | ||
1524 | dbg("%s", __FUNCTION__); | 1524 | dbg("%s", __FUNCTION__); |
1525 | 1525 | ||
1526 | garmin_data_p = kmalloc (sizeof(struct garmin_data), GFP_KERNEL); | 1526 | garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); |
1527 | if (garmin_data_p == NULL) { | 1527 | if (garmin_data_p == NULL) { |
1528 | dev_err(&port->dev, "%s - Out of memory\n", __FUNCTION__); | 1528 | dev_err(&port->dev, "%s - Out of memory\n", __FUNCTION__); |
1529 | return -ENOMEM; | 1529 | return -ENOMEM; |
1530 | } | 1530 | } |
1531 | memset (garmin_data_p, 0, sizeof(struct garmin_data)); | ||
1532 | init_timer(&garmin_data_p->timer); | 1531 | init_timer(&garmin_data_p->timer); |
1533 | spin_lock_init(&garmin_data_p->lock); | 1532 | spin_lock_init(&garmin_data_p->lock); |
1534 | INIT_LIST_HEAD(&garmin_data_p->pktlist); | 1533 | INIT_LIST_HEAD(&garmin_data_p->pktlist); |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index 91bd3014ef1e..d06547a13f28 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -1038,9 +1038,7 @@ static void edge_close (struct usb_serial_port *port, struct file * filp) | |||
1038 | edge_port->open = FALSE; | 1038 | edge_port->open = FALSE; |
1039 | edge_port->openPending = FALSE; | 1039 | edge_port->openPending = FALSE; |
1040 | 1040 | ||
1041 | if (edge_port->write_urb) { | 1041 | usb_kill_urb(edge_port->write_urb); |
1042 | usb_kill_urb(edge_port->write_urb); | ||
1043 | } | ||
1044 | 1042 | ||
1045 | if (edge_port->write_urb) { | 1043 | if (edge_port->write_urb) { |
1046 | /* if this urb had a transfer buffer already (old transfer) free it */ | 1044 | /* if this urb had a transfer buffer already (old transfer) free it */ |
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index 2a4bb66691ad..d3b9a351cef8 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -206,10 +206,9 @@ static int ipw_open(struct usb_serial_port *port, struct file *filp) | |||
206 | 206 | ||
207 | dbg("%s", __FUNCTION__); | 207 | dbg("%s", __FUNCTION__); |
208 | 208 | ||
209 | buf_flow_init = kmalloc(16, GFP_KERNEL); | 209 | buf_flow_init = kmemdup(buf_flow_static, 16, GFP_KERNEL); |
210 | if (!buf_flow_init) | 210 | if (!buf_flow_init) |
211 | return -ENOMEM; | 211 | return -ENOMEM; |
212 | memcpy(buf_flow_init, buf_flow_static, 16); | ||
213 | 212 | ||
214 | if (port->tty) | 213 | if (port->tty) |
215 | port->tty->low_latency = 1; | 214 | port->tty->low_latency = 1; |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 53be824eb1bf..7639652cec42 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -2306,22 +2306,16 @@ static void keyspan_shutdown (struct usb_serial *serial) | |||
2306 | } | 2306 | } |
2307 | 2307 | ||
2308 | /* Now free them */ | 2308 | /* Now free them */ |
2309 | if (s_priv->instat_urb) | 2309 | usb_free_urb(s_priv->instat_urb); |
2310 | usb_free_urb(s_priv->instat_urb); | 2310 | usb_free_urb(s_priv->glocont_urb); |
2311 | if (s_priv->glocont_urb) | ||
2312 | usb_free_urb(s_priv->glocont_urb); | ||
2313 | for (i = 0; i < serial->num_ports; ++i) { | 2311 | for (i = 0; i < serial->num_ports; ++i) { |
2314 | port = serial->port[i]; | 2312 | port = serial->port[i]; |
2315 | p_priv = usb_get_serial_port_data(port); | 2313 | p_priv = usb_get_serial_port_data(port); |
2316 | if (p_priv->inack_urb) | 2314 | usb_free_urb(p_priv->inack_urb); |
2317 | usb_free_urb(p_priv->inack_urb); | 2315 | usb_free_urb(p_priv->outcont_urb); |
2318 | if (p_priv->outcont_urb) | ||
2319 | usb_free_urb(p_priv->outcont_urb); | ||
2320 | for (j = 0; j < 2; j++) { | 2316 | for (j = 0; j < 2; j++) { |
2321 | if (p_priv->in_urbs[j]) | 2317 | usb_free_urb(p_priv->in_urbs[j]); |
2322 | usb_free_urb(p_priv->in_urbs[j]); | 2318 | usb_free_urb(p_priv->out_urbs[j]); |
2323 | if (p_priv->out_urbs[j]) | ||
2324 | usb_free_urb(p_priv->out_urbs[j]); | ||
2325 | } | 2319 | } |
2326 | } | 2320 | } |
2327 | 2321 | ||
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index ff03331e0bcf..237289920f03 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -185,13 +185,11 @@ static int kobil_startup (struct usb_serial *serial) | |||
185 | 185 | ||
186 | for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { | 186 | for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { |
187 | endpoint = &altsetting->endpoint[i]; | 187 | endpoint = &altsetting->endpoint[i]; |
188 | if (((endpoint->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && | 188 | if (usb_endpoint_is_int_out(&endpoint->desc)) { |
189 | ((endpoint->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
190 | dbg("%s Found interrupt out endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); | 189 | dbg("%s Found interrupt out endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); |
191 | priv->write_int_endpoint_address = endpoint->desc.bEndpointAddress; | 190 | priv->write_int_endpoint_address = endpoint->desc.bEndpointAddress; |
192 | } | 191 | } |
193 | if (((endpoint->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) && | 192 | if (usb_endpoint_is_int_in(&endpoint->desc)) { |
194 | ((endpoint->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
195 | dbg("%s Found interrupt in endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); | 193 | dbg("%s Found interrupt in endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); |
196 | priv->read_int_endpoint_address = endpoint->desc.bEndpointAddress; | 194 | priv->read_int_endpoint_address = endpoint->desc.bEndpointAddress; |
197 | } | 195 | } |
@@ -355,8 +353,7 @@ static void kobil_close (struct usb_serial_port *port, struct file *filp) | |||
355 | usb_free_urb( port->write_urb ); | 353 | usb_free_urb( port->write_urb ); |
356 | port->write_urb = NULL; | 354 | port->write_urb = NULL; |
357 | } | 355 | } |
358 | if (port->interrupt_in_urb) | 356 | usb_kill_urb(port->interrupt_in_urb); |
359 | usb_kill_urb(port->interrupt_in_urb); | ||
360 | } | 357 | } |
361 | 358 | ||
362 | 359 | ||
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index b7582cc496dc..a906e500a02b 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -358,10 +358,8 @@ static int mct_u232_startup (struct usb_serial *serial) | |||
358 | /* Puh, that's dirty */ | 358 | /* Puh, that's dirty */ |
359 | port = serial->port[0]; | 359 | port = serial->port[0]; |
360 | rport = serial->port[1]; | 360 | rport = serial->port[1]; |
361 | if (port->read_urb) { | 361 | /* No unlinking, it wasn't submitted yet. */ |
362 | /* No unlinking, it wasn't submitted yet. */ | 362 | usb_free_urb(port->read_urb); |
363 | usb_free_urb(port->read_urb); | ||
364 | } | ||
365 | port->read_urb = rport->interrupt_in_urb; | 363 | port->read_urb = rport->interrupt_in_urb; |
366 | rport->interrupt_in_urb = NULL; | 364 | rport->interrupt_in_urb = NULL; |
367 | port->read_urb->context = port; | 365 | port->read_urb->context = port; |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 5b71962d0351..02c89e10b2cf 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -2596,12 +2596,11 @@ static int mos7840_startup(struct usb_serial *serial) | |||
2596 | 2596 | ||
2597 | /* set up port private structures */ | 2597 | /* set up port private structures */ |
2598 | for (i = 0; i < serial->num_ports; ++i) { | 2598 | for (i = 0; i < serial->num_ports; ++i) { |
2599 | mos7840_port = kmalloc(sizeof(struct moschip_port), GFP_KERNEL); | 2599 | mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL); |
2600 | if (mos7840_port == NULL) { | 2600 | if (mos7840_port == NULL) { |
2601 | err("%s - Out of memory", __FUNCTION__); | 2601 | err("%s - Out of memory", __FUNCTION__); |
2602 | return -ENOMEM; | 2602 | return -ENOMEM; |
2603 | } | 2603 | } |
2604 | memset(mos7840_port, 0, sizeof(struct moschip_port)); | ||
2605 | 2604 | ||
2606 | /* Initialize all port interrupt end point to port 0 int endpoint * | 2605 | /* Initialize all port interrupt end point to port 0 int endpoint * |
2607 | * Our device has only one interrupt end point comman to all port */ | 2606 | * Our device has only one interrupt end point comman to all port */ |
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 0610409a6568..054abee81652 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c | |||
@@ -95,8 +95,7 @@ static void navman_close(struct usb_serial_port *port, struct file *filp) | |||
95 | { | 95 | { |
96 | dbg("%s - port %d", __FUNCTION__, port->number); | 96 | dbg("%s - port %d", __FUNCTION__, port->number); |
97 | 97 | ||
98 | if (port->interrupt_in_urb) | 98 | usb_kill_urb(port->interrupt_in_urb); |
99 | usb_kill_urb(port->interrupt_in_urb); | ||
100 | } | 99 | } |
101 | 100 | ||
102 | static int navman_write(struct usb_serial_port *port, | 101 | static int navman_write(struct usb_serial_port *port, |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 07400c0c8a8c..ae98d8cbdbb8 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -228,6 +228,7 @@ static int product_5052_count; | |||
228 | /* null entry */ | 228 | /* null entry */ |
229 | static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = { | 229 | static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = { |
230 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | 230 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
231 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | ||
231 | }; | 232 | }; |
232 | 233 | ||
233 | static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { | 234 | static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { |
@@ -239,6 +240,7 @@ static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { | |||
239 | 240 | ||
240 | static struct usb_device_id ti_id_table_combined[] = { | 241 | static struct usb_device_id ti_id_table_combined[] = { |
241 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | 242 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
243 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | ||
242 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, | 244 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, |
243 | { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, | 245 | { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, |
244 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, | 246 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, |
@@ -459,13 +461,12 @@ static int ti_startup(struct usb_serial *serial) | |||
459 | 461 | ||
460 | /* set up port structures */ | 462 | /* set up port structures */ |
461 | for (i = 0; i < serial->num_ports; ++i) { | 463 | for (i = 0; i < serial->num_ports; ++i) { |
462 | tport = kmalloc(sizeof(struct ti_port), GFP_KERNEL); | 464 | tport = kzalloc(sizeof(struct ti_port), GFP_KERNEL); |
463 | if (tport == NULL) { | 465 | if (tport == NULL) { |
464 | dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); | 466 | dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); |
465 | status = -ENOMEM; | 467 | status = -ENOMEM; |
466 | goto free_tports; | 468 | goto free_tports; |
467 | } | 469 | } |
468 | memset(tport, 0, sizeof(struct ti_port)); | ||
469 | spin_lock_init(&tport->tp_lock); | 470 | spin_lock_init(&tport->tp_lock); |
470 | tport->tp_uart_base_addr = (i == 0 ? TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); | 471 | tport->tp_uart_base_addr = (i == 0 ? TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); |
471 | tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0; | 472 | tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0; |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h index 02c1aeb9e1b8..b5541bf991ba 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.h +++ b/drivers/usb/serial/ti_usb_3410_5052.h | |||
@@ -28,6 +28,7 @@ | |||
28 | /* Vendor and product ids */ | 28 | /* Vendor and product ids */ |
29 | #define TI_VENDOR_ID 0x0451 | 29 | #define TI_VENDOR_ID 0x0451 |
30 | #define TI_3410_PRODUCT_ID 0x3410 | 30 | #define TI_3410_PRODUCT_ID 0x3410 |
31 | #define TI_3410_EZ430_ID 0xF430 /* TI ez430 development tool */ | ||
31 | #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */ | 32 | #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */ |
32 | #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */ | 33 | #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */ |
33 | #define TI_5052_EEPROM_PRODUCT_ID 0x505A /* EEPROM, no firmware */ | 34 | #define TI_5052_EEPROM_PRODUCT_ID 0x505A /* EEPROM, no firmware */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 8006e51c34bb..c1257d5292f5 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -952,32 +952,28 @@ probe_error: | |||
952 | port = serial->port[i]; | 952 | port = serial->port[i]; |
953 | if (!port) | 953 | if (!port) |
954 | continue; | 954 | continue; |
955 | if (port->read_urb) | 955 | usb_free_urb(port->read_urb); |
956 | usb_free_urb (port->read_urb); | ||
957 | kfree(port->bulk_in_buffer); | 956 | kfree(port->bulk_in_buffer); |
958 | } | 957 | } |
959 | for (i = 0; i < num_bulk_out; ++i) { | 958 | for (i = 0; i < num_bulk_out; ++i) { |
960 | port = serial->port[i]; | 959 | port = serial->port[i]; |
961 | if (!port) | 960 | if (!port) |
962 | continue; | 961 | continue; |
963 | if (port->write_urb) | 962 | usb_free_urb(port->write_urb); |
964 | usb_free_urb (port->write_urb); | ||
965 | kfree(port->bulk_out_buffer); | 963 | kfree(port->bulk_out_buffer); |
966 | } | 964 | } |
967 | for (i = 0; i < num_interrupt_in; ++i) { | 965 | for (i = 0; i < num_interrupt_in; ++i) { |
968 | port = serial->port[i]; | 966 | port = serial->port[i]; |
969 | if (!port) | 967 | if (!port) |
970 | continue; | 968 | continue; |
971 | if (port->interrupt_in_urb) | 969 | usb_free_urb(port->interrupt_in_urb); |
972 | usb_free_urb (port->interrupt_in_urb); | ||
973 | kfree(port->interrupt_in_buffer); | 970 | kfree(port->interrupt_in_buffer); |
974 | } | 971 | } |
975 | for (i = 0; i < num_interrupt_out; ++i) { | 972 | for (i = 0; i < num_interrupt_out; ++i) { |
976 | port = serial->port[i]; | 973 | port = serial->port[i]; |
977 | if (!port) | 974 | if (!port) |
978 | continue; | 975 | continue; |
979 | if (port->interrupt_out_urb) | 976 | usb_free_urb(port->interrupt_out_urb); |
980 | usb_free_urb (port->interrupt_out_urb); | ||
981 | kfree(port->interrupt_out_buffer); | 977 | kfree(port->interrupt_out_buffer); |
982 | } | 978 | } |
983 | 979 | ||
diff --git a/drivers/usb/serial/usb_debug.c b/drivers/usb/serial/usb_debug.c new file mode 100644 index 000000000000..257a5e436873 --- /dev/null +++ b/drivers/usb/serial/usb_debug.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * USB Debug cable driver | ||
3 | * | ||
4 | * Copyright (C) 2006 Greg Kroah-Hartman <greg@kroah.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version | ||
8 | * 2 as published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/tty.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/usb.h> | ||
16 | #include <linux/usb/serial.h> | ||
17 | |||
18 | static struct usb_device_id id_table [] = { | ||
19 | { USB_DEVICE(0x0525, 0x127a) }, | ||
20 | { }, | ||
21 | }; | ||
22 | MODULE_DEVICE_TABLE(usb, id_table); | ||
23 | |||
24 | static struct usb_driver debug_driver = { | ||
25 | .name = "debug", | ||
26 | .probe = usb_serial_probe, | ||
27 | .disconnect = usb_serial_disconnect, | ||
28 | .id_table = id_table, | ||
29 | .no_dynamic_id = 1, | ||
30 | }; | ||
31 | |||
32 | static struct usb_serial_driver debug_device = { | ||
33 | .driver = { | ||
34 | .owner = THIS_MODULE, | ||
35 | .name = "debug", | ||
36 | }, | ||
37 | .id_table = id_table, | ||
38 | .num_interrupt_in = NUM_DONT_CARE, | ||
39 | .num_bulk_in = NUM_DONT_CARE, | ||
40 | .num_bulk_out = NUM_DONT_CARE, | ||
41 | .num_ports = 1, | ||
42 | }; | ||
43 | |||
44 | static int __init debug_init(void) | ||
45 | { | ||
46 | int retval; | ||
47 | |||
48 | retval = usb_serial_register(&debug_device); | ||
49 | if (retval) | ||
50 | return retval; | ||
51 | retval = usb_register(&debug_driver); | ||
52 | if (retval) | ||
53 | usb_serial_deregister(&debug_device); | ||
54 | return retval; | ||
55 | } | ||
56 | |||
57 | static void __exit debug_exit(void) | ||
58 | { | ||
59 | usb_deregister(&debug_driver); | ||
60 | usb_serial_deregister(&debug_device); | ||
61 | } | ||
62 | |||
63 | module_init(debug_init); | ||
64 | module_exit(debug_exit); | ||
65 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index befe2e11a041..eef5eaa5fa0b 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
@@ -348,8 +348,7 @@ static void visor_close (struct usb_serial_port *port, struct file * filp) | |||
348 | 348 | ||
349 | /* shutdown our urbs */ | 349 | /* shutdown our urbs */ |
350 | usb_kill_urb(port->read_urb); | 350 | usb_kill_urb(port->read_urb); |
351 | if (port->interrupt_in_urb) | 351 | usb_kill_urb(port->interrupt_in_urb); |
352 | usb_kill_urb(port->interrupt_in_urb); | ||
353 | 352 | ||
354 | /* Try to send shutdown message, if the device is gone, this will just fail. */ | 353 | /* Try to send shutdown message, if the device is gone, this will just fail. */ |
355 | transfer_buffer = kmalloc (0x12, GFP_KERNEL); | 354 | transfer_buffer = kmalloc (0x12, GFP_KERNEL); |
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 3baf448e300d..3a158d58441f 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c | |||
@@ -142,10 +142,7 @@ int onetouch_connect_input(struct us_data *ss) | |||
142 | return -ENODEV; | 142 | return -ENODEV; |
143 | 143 | ||
144 | endpoint = &interface->endpoint[2].desc; | 144 | endpoint = &interface->endpoint[2].desc; |
145 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 145 | if (!usb_endpoint_is_int_in(endpoint)) |
146 | return -ENODEV; | ||
147 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | ||
148 | != USB_ENDPOINT_XFER_INT) | ||
149 | return -ENODEV; | 146 | return -ENODEV; |
150 | 147 | ||
151 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); | 148 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index efb047f431e8..db8b26012c75 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1318,6 +1318,16 @@ UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x0110, | |||
1318 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, | 1318 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, |
1319 | 0 ), | 1319 | 0 ), |
1320 | 1320 | ||
1321 | /* Reported by Jaco Kroon <jaco@kroon.co.za> | ||
1322 | * The usb-storage module found on the Digitech GNX4 (and supposedly other | ||
1323 | * devices) misbehaves and causes a bunch of invalid I/O errors. | ||
1324 | */ | ||
1325 | UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, | ||
1326 | "Digitech HMG", | ||
1327 | "DigiTech Mass Storage", | ||
1328 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1329 | US_FL_IGNORE_RESIDUE ), | ||
1330 | |||
1321 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ | 1331 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ |
1322 | UNUSUAL_DEV( 0x132b, 0x000b, 0x0001, 0x0001, | 1332 | UNUSUAL_DEV( 0x132b, 0x000b, 0x0001, 0x0001, |
1323 | "Minolta", | 1333 | "Minolta", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index b8d6031b0975..b401084b3d22 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -740,18 +740,16 @@ static int get_pipes(struct us_data *us) | |||
740 | ep = &altsetting->endpoint[i].desc; | 740 | ep = &altsetting->endpoint[i].desc; |
741 | 741 | ||
742 | /* Is it a BULK endpoint? */ | 742 | /* Is it a BULK endpoint? */ |
743 | if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | 743 | if (usb_endpoint_xfer_bulk(ep)) { |
744 | == USB_ENDPOINT_XFER_BULK) { | ||
745 | /* BULK in or out? */ | 744 | /* BULK in or out? */ |
746 | if (ep->bEndpointAddress & USB_DIR_IN) | 745 | if (usb_endpoint_dir_in(ep)) |
747 | ep_in = ep; | 746 | ep_in = ep; |
748 | else | 747 | else |
749 | ep_out = ep; | 748 | ep_out = ep; |
750 | } | 749 | } |
751 | 750 | ||
752 | /* Is it an interrupt endpoint? */ | 751 | /* Is it an interrupt endpoint? */ |
753 | else if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | 752 | else if (usb_endpoint_xfer_int(ep)) { |
754 | == USB_ENDPOINT_XFER_INT) { | ||
755 | ep_int = ep; | 753 | ep_int = ep; |
756 | } | 754 | } |
757 | } | 755 | } |
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 93ffcdd95f50..e973a87fbb01 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -1296,14 +1296,14 @@ register_framebuffer(struct fb_info *fb_info) | |||
1296 | break; | 1296 | break; |
1297 | fb_info->node = i; | 1297 | fb_info->node = i; |
1298 | 1298 | ||
1299 | fb_info->class_device = class_device_create(fb_class, NULL, MKDEV(FB_MAJOR, i), | 1299 | fb_info->dev = device_create(fb_class, fb_info->device, |
1300 | fb_info->device, "fb%d", i); | 1300 | MKDEV(FB_MAJOR, i), "fb%d", i); |
1301 | if (IS_ERR(fb_info->class_device)) { | 1301 | if (IS_ERR(fb_info->dev)) { |
1302 | /* Not fatal */ | 1302 | /* Not fatal */ |
1303 | printk(KERN_WARNING "Unable to create class_device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->class_device)); | 1303 | printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev)); |
1304 | fb_info->class_device = NULL; | 1304 | fb_info->dev = NULL; |
1305 | } else | 1305 | } else |
1306 | fb_init_class_device(fb_info); | 1306 | fb_init_device(fb_info); |
1307 | 1307 | ||
1308 | if (fb_info->pixmap.addr == NULL) { | 1308 | if (fb_info->pixmap.addr == NULL) { |
1309 | fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL); | 1309 | fb_info->pixmap.addr = kmalloc(FBPIXMAPSIZE, GFP_KERNEL); |
@@ -1356,8 +1356,8 @@ unregister_framebuffer(struct fb_info *fb_info) | |||
1356 | fb_destroy_modelist(&fb_info->modelist); | 1356 | fb_destroy_modelist(&fb_info->modelist); |
1357 | registered_fb[i]=NULL; | 1357 | registered_fb[i]=NULL; |
1358 | num_registered_fb--; | 1358 | num_registered_fb--; |
1359 | fb_cleanup_class_device(fb_info); | 1359 | fb_cleanup_device(fb_info); |
1360 | class_device_destroy(fb_class, MKDEV(FB_MAJOR, i)); | 1360 | device_destroy(fb_class, MKDEV(FB_MAJOR, i)); |
1361 | event.info = fb_info; | 1361 | event.info = fb_info; |
1362 | fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event); | 1362 | fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event); |
1363 | return 0; | 1363 | return 0; |
diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c index d3a50417ed9a..323bdf6fc7d5 100644 --- a/drivers/video/fbsysfs.c +++ b/drivers/video/fbsysfs.c | |||
@@ -73,7 +73,7 @@ EXPORT_SYMBOL(framebuffer_alloc); | |||
73 | * | 73 | * |
74 | * @info: frame buffer info structure | 74 | * @info: frame buffer info structure |
75 | * | 75 | * |
76 | * Drop the reference count of the class_device embedded in the | 76 | * Drop the reference count of the device embedded in the |
77 | * framebuffer info structure. | 77 | * framebuffer info structure. |
78 | * | 78 | * |
79 | */ | 79 | */ |
@@ -120,10 +120,10 @@ static int mode_string(char *buf, unsigned int offset, | |||
120 | m, mode->xres, mode->yres, v, mode->refresh); | 120 | m, mode->xres, mode->yres, v, mode->refresh); |
121 | } | 121 | } |
122 | 122 | ||
123 | static ssize_t store_mode(struct class_device *class_device, const char * buf, | 123 | static ssize_t store_mode(struct device *device, struct device_attribute *attr, |
124 | size_t count) | 124 | const char *buf, size_t count) |
125 | { | 125 | { |
126 | struct fb_info *fb_info = class_get_devdata(class_device); | 126 | struct fb_info *fb_info = dev_get_drvdata(device); |
127 | char mstr[100]; | 127 | char mstr[100]; |
128 | struct fb_var_screeninfo var; | 128 | struct fb_var_screeninfo var; |
129 | struct fb_modelist *modelist; | 129 | struct fb_modelist *modelist; |
@@ -151,9 +151,10 @@ static ssize_t store_mode(struct class_device *class_device, const char * buf, | |||
151 | return -EINVAL; | 151 | return -EINVAL; |
152 | } | 152 | } |
153 | 153 | ||
154 | static ssize_t show_mode(struct class_device *class_device, char *buf) | 154 | static ssize_t show_mode(struct device *device, struct device_attribute *attr, |
155 | char *buf) | ||
155 | { | 156 | { |
156 | struct fb_info *fb_info = class_get_devdata(class_device); | 157 | struct fb_info *fb_info = dev_get_drvdata(device); |
157 | 158 | ||
158 | if (!fb_info->mode) | 159 | if (!fb_info->mode) |
159 | return 0; | 160 | return 0; |
@@ -161,10 +162,11 @@ static ssize_t show_mode(struct class_device *class_device, char *buf) | |||
161 | return mode_string(buf, 0, fb_info->mode); | 162 | return mode_string(buf, 0, fb_info->mode); |
162 | } | 163 | } |
163 | 164 | ||
164 | static ssize_t store_modes(struct class_device *class_device, const char * buf, | 165 | static ssize_t store_modes(struct device *device, |
165 | size_t count) | 166 | struct device_attribute *attr, |
167 | const char *buf, size_t count) | ||
166 | { | 168 | { |
167 | struct fb_info *fb_info = class_get_devdata(class_device); | 169 | struct fb_info *fb_info = dev_get_drvdata(device); |
168 | LIST_HEAD(old_list); | 170 | LIST_HEAD(old_list); |
169 | int i = count / sizeof(struct fb_videomode); | 171 | int i = count / sizeof(struct fb_videomode); |
170 | 172 | ||
@@ -186,9 +188,10 @@ static ssize_t store_modes(struct class_device *class_device, const char * buf, | |||
186 | return 0; | 188 | return 0; |
187 | } | 189 | } |
188 | 190 | ||
189 | static ssize_t show_modes(struct class_device *class_device, char *buf) | 191 | static ssize_t show_modes(struct device *device, struct device_attribute *attr, |
192 | char *buf) | ||
190 | { | 193 | { |
191 | struct fb_info *fb_info = class_get_devdata(class_device); | 194 | struct fb_info *fb_info = dev_get_drvdata(device); |
192 | unsigned int i; | 195 | unsigned int i; |
193 | struct list_head *pos; | 196 | struct list_head *pos; |
194 | struct fb_modelist *modelist; | 197 | struct fb_modelist *modelist; |
@@ -203,10 +206,10 @@ static ssize_t show_modes(struct class_device *class_device, char *buf) | |||
203 | return i; | 206 | return i; |
204 | } | 207 | } |
205 | 208 | ||
206 | static ssize_t store_bpp(struct class_device *class_device, const char * buf, | 209 | static ssize_t store_bpp(struct device *device, struct device_attribute *attr, |
207 | size_t count) | 210 | const char *buf, size_t count) |
208 | { | 211 | { |
209 | struct fb_info *fb_info = class_get_devdata(class_device); | 212 | struct fb_info *fb_info = dev_get_drvdata(device); |
210 | struct fb_var_screeninfo var; | 213 | struct fb_var_screeninfo var; |
211 | char ** last = NULL; | 214 | char ** last = NULL; |
212 | int err; | 215 | int err; |
@@ -218,16 +221,18 @@ static ssize_t store_bpp(struct class_device *class_device, const char * buf, | |||
218 | return count; | 221 | return count; |
219 | } | 222 | } |
220 | 223 | ||
221 | static ssize_t show_bpp(struct class_device *class_device, char *buf) | 224 | static ssize_t show_bpp(struct device *device, struct device_attribute *attr, |
225 | char *buf) | ||
222 | { | 226 | { |
223 | struct fb_info *fb_info = class_get_devdata(class_device); | 227 | struct fb_info *fb_info = dev_get_drvdata(device); |
224 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.bits_per_pixel); | 228 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.bits_per_pixel); |
225 | } | 229 | } |
226 | 230 | ||
227 | static ssize_t store_rotate(struct class_device *class_device, const char *buf, | 231 | static ssize_t store_rotate(struct device *device, |
228 | size_t count) | 232 | struct device_attribute *attr, |
233 | const char *buf, size_t count) | ||
229 | { | 234 | { |
230 | struct fb_info *fb_info = class_get_devdata(class_device); | 235 | struct fb_info *fb_info = dev_get_drvdata(device); |
231 | struct fb_var_screeninfo var; | 236 | struct fb_var_screeninfo var; |
232 | char **last = NULL; | 237 | char **last = NULL; |
233 | int err; | 238 | int err; |
@@ -242,17 +247,19 @@ static ssize_t store_rotate(struct class_device *class_device, const char *buf, | |||
242 | } | 247 | } |
243 | 248 | ||
244 | 249 | ||
245 | static ssize_t show_rotate(struct class_device *class_device, char *buf) | 250 | static ssize_t show_rotate(struct device *device, |
251 | struct device_attribute *attr, char *buf) | ||
246 | { | 252 | { |
247 | struct fb_info *fb_info = class_get_devdata(class_device); | 253 | struct fb_info *fb_info = dev_get_drvdata(device); |
248 | 254 | ||
249 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.rotate); | 255 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->var.rotate); |
250 | } | 256 | } |
251 | 257 | ||
252 | static ssize_t store_virtual(struct class_device *class_device, | 258 | static ssize_t store_virtual(struct device *device, |
253 | const char * buf, size_t count) | 259 | struct device_attribute *attr, |
260 | const char *buf, size_t count) | ||
254 | { | 261 | { |
255 | struct fb_info *fb_info = class_get_devdata(class_device); | 262 | struct fb_info *fb_info = dev_get_drvdata(device); |
256 | struct fb_var_screeninfo var; | 263 | struct fb_var_screeninfo var; |
257 | char *last = NULL; | 264 | char *last = NULL; |
258 | int err; | 265 | int err; |
@@ -269,23 +276,26 @@ static ssize_t store_virtual(struct class_device *class_device, | |||
269 | return count; | 276 | return count; |
270 | } | 277 | } |
271 | 278 | ||
272 | static ssize_t show_virtual(struct class_device *class_device, char *buf) | 279 | static ssize_t show_virtual(struct device *device, |
280 | struct device_attribute *attr, char *buf) | ||
273 | { | 281 | { |
274 | struct fb_info *fb_info = class_get_devdata(class_device); | 282 | struct fb_info *fb_info = dev_get_drvdata(device); |
275 | return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xres_virtual, | 283 | return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xres_virtual, |
276 | fb_info->var.yres_virtual); | 284 | fb_info->var.yres_virtual); |
277 | } | 285 | } |
278 | 286 | ||
279 | static ssize_t show_stride(struct class_device *class_device, char *buf) | 287 | static ssize_t show_stride(struct device *device, |
288 | struct device_attribute *attr, char *buf) | ||
280 | { | 289 | { |
281 | struct fb_info *fb_info = class_get_devdata(class_device); | 290 | struct fb_info *fb_info = dev_get_drvdata(device); |
282 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->fix.line_length); | 291 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->fix.line_length); |
283 | } | 292 | } |
284 | 293 | ||
285 | static ssize_t store_blank(struct class_device *class_device, const char * buf, | 294 | static ssize_t store_blank(struct device *device, |
286 | size_t count) | 295 | struct device_attribute *attr, |
296 | const char *buf, size_t count) | ||
287 | { | 297 | { |
288 | struct fb_info *fb_info = class_get_devdata(class_device); | 298 | struct fb_info *fb_info = dev_get_drvdata(device); |
289 | char *last = NULL; | 299 | char *last = NULL; |
290 | int err; | 300 | int err; |
291 | 301 | ||
@@ -299,42 +309,48 @@ static ssize_t store_blank(struct class_device *class_device, const char * buf, | |||
299 | return count; | 309 | return count; |
300 | } | 310 | } |
301 | 311 | ||
302 | static ssize_t show_blank(struct class_device *class_device, char *buf) | 312 | static ssize_t show_blank(struct device *device, |
313 | struct device_attribute *attr, char *buf) | ||
303 | { | 314 | { |
304 | // struct fb_info *fb_info = class_get_devdata(class_device); | 315 | // struct fb_info *fb_info = dev_get_drvdata(device); |
305 | return 0; | 316 | return 0; |
306 | } | 317 | } |
307 | 318 | ||
308 | static ssize_t store_console(struct class_device *class_device, | 319 | static ssize_t store_console(struct device *device, |
309 | const char * buf, size_t count) | 320 | struct device_attribute *attr, |
321 | const char *buf, size_t count) | ||
310 | { | 322 | { |
311 | // struct fb_info *fb_info = class_get_devdata(class_device); | 323 | // struct fb_info *fb_info = dev_get_drvdata(device); |
312 | return 0; | 324 | return 0; |
313 | } | 325 | } |
314 | 326 | ||
315 | static ssize_t show_console(struct class_device *class_device, char *buf) | 327 | static ssize_t show_console(struct device *device, |
328 | struct device_attribute *attr, char *buf) | ||
316 | { | 329 | { |
317 | // struct fb_info *fb_info = class_get_devdata(class_device); | 330 | // struct fb_info *fb_info = dev_get_drvdata(device); |
318 | return 0; | 331 | return 0; |
319 | } | 332 | } |
320 | 333 | ||
321 | static ssize_t store_cursor(struct class_device *class_device, | 334 | static ssize_t store_cursor(struct device *device, |
322 | const char * buf, size_t count) | 335 | struct device_attribute *attr, |
336 | const char *buf, size_t count) | ||
323 | { | 337 | { |
324 | // struct fb_info *fb_info = class_get_devdata(class_device); | 338 | // struct fb_info *fb_info = dev_get_drvdata(device); |
325 | return 0; | 339 | return 0; |
326 | } | 340 | } |
327 | 341 | ||
328 | static ssize_t show_cursor(struct class_device *class_device, char *buf) | 342 | static ssize_t show_cursor(struct device *device, |
343 | struct device_attribute *attr, char *buf) | ||
329 | { | 344 | { |
330 | // struct fb_info *fb_info = class_get_devdata(class_device); | 345 | // struct fb_info *fb_info = dev_get_drvdata(device); |
331 | return 0; | 346 | return 0; |
332 | } | 347 | } |
333 | 348 | ||
334 | static ssize_t store_pan(struct class_device *class_device, const char * buf, | 349 | static ssize_t store_pan(struct device *device, |
335 | size_t count) | 350 | struct device_attribute *attr, |
351 | const char *buf, size_t count) | ||
336 | { | 352 | { |
337 | struct fb_info *fb_info = class_get_devdata(class_device); | 353 | struct fb_info *fb_info = dev_get_drvdata(device); |
338 | struct fb_var_screeninfo var; | 354 | struct fb_var_screeninfo var; |
339 | char *last = NULL; | 355 | char *last = NULL; |
340 | int err; | 356 | int err; |
@@ -355,24 +371,27 @@ static ssize_t store_pan(struct class_device *class_device, const char * buf, | |||
355 | return count; | 371 | return count; |
356 | } | 372 | } |
357 | 373 | ||
358 | static ssize_t show_pan(struct class_device *class_device, char *buf) | 374 | static ssize_t show_pan(struct device *device, |
375 | struct device_attribute *attr, char *buf) | ||
359 | { | 376 | { |
360 | struct fb_info *fb_info = class_get_devdata(class_device); | 377 | struct fb_info *fb_info = dev_get_drvdata(device); |
361 | return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xoffset, | 378 | return snprintf(buf, PAGE_SIZE, "%d,%d\n", fb_info->var.xoffset, |
362 | fb_info->var.xoffset); | 379 | fb_info->var.xoffset); |
363 | } | 380 | } |
364 | 381 | ||
365 | static ssize_t show_name(struct class_device *class_device, char *buf) | 382 | static ssize_t show_name(struct device *device, |
383 | struct device_attribute *attr, char *buf) | ||
366 | { | 384 | { |
367 | struct fb_info *fb_info = class_get_devdata(class_device); | 385 | struct fb_info *fb_info = dev_get_drvdata(device); |
368 | 386 | ||
369 | return snprintf(buf, PAGE_SIZE, "%s\n", fb_info->fix.id); | 387 | return snprintf(buf, PAGE_SIZE, "%s\n", fb_info->fix.id); |
370 | } | 388 | } |
371 | 389 | ||
372 | static ssize_t store_fbstate(struct class_device *class_device, | 390 | static ssize_t store_fbstate(struct device *device, |
373 | const char *buf, size_t count) | 391 | struct device_attribute *attr, |
392 | const char *buf, size_t count) | ||
374 | { | 393 | { |
375 | struct fb_info *fb_info = class_get_devdata(class_device); | 394 | struct fb_info *fb_info = dev_get_drvdata(device); |
376 | u32 state; | 395 | u32 state; |
377 | char *last = NULL; | 396 | char *last = NULL; |
378 | 397 | ||
@@ -385,17 +404,19 @@ static ssize_t store_fbstate(struct class_device *class_device, | |||
385 | return count; | 404 | return count; |
386 | } | 405 | } |
387 | 406 | ||
388 | static ssize_t show_fbstate(struct class_device *class_device, char *buf) | 407 | static ssize_t show_fbstate(struct device *device, |
408 | struct device_attribute *attr, char *buf) | ||
389 | { | 409 | { |
390 | struct fb_info *fb_info = class_get_devdata(class_device); | 410 | struct fb_info *fb_info = dev_get_drvdata(device); |
391 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->state); | 411 | return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->state); |
392 | } | 412 | } |
393 | 413 | ||
394 | #ifdef CONFIG_FB_BACKLIGHT | 414 | #ifdef CONFIG_FB_BACKLIGHT |
395 | static ssize_t store_bl_curve(struct class_device *class_device, | 415 | static ssize_t store_bl_curve(struct device *device, |
396 | const char *buf, size_t count) | 416 | struct device_attribute *attr, |
417 | const char *buf, size_t count) | ||
397 | { | 418 | { |
398 | struct fb_info *fb_info = class_get_devdata(class_device); | 419 | struct fb_info *fb_info = dev_get_drvdata(device); |
399 | u8 tmp_curve[FB_BACKLIGHT_LEVELS]; | 420 | u8 tmp_curve[FB_BACKLIGHT_LEVELS]; |
400 | unsigned int i; | 421 | unsigned int i; |
401 | 422 | ||
@@ -432,9 +453,10 @@ static ssize_t store_bl_curve(struct class_device *class_device, | |||
432 | return count; | 453 | return count; |
433 | } | 454 | } |
434 | 455 | ||
435 | static ssize_t show_bl_curve(struct class_device *class_device, char *buf) | 456 | static ssize_t show_bl_curve(struct device *device, |
457 | struct device_attribute *attr, char *buf) | ||
436 | { | 458 | { |
437 | struct fb_info *fb_info = class_get_devdata(class_device); | 459 | struct fb_info *fb_info = dev_get_drvdata(device); |
438 | ssize_t len = 0; | 460 | ssize_t len = 0; |
439 | unsigned int i; | 461 | unsigned int i; |
440 | 462 | ||
@@ -465,7 +487,7 @@ static ssize_t show_bl_curve(struct class_device *class_device, char *buf) | |||
465 | /* When cmap is added back in it should be a binary attribute | 487 | /* When cmap is added back in it should be a binary attribute |
466 | * not a text one. Consideration should also be given to converting | 488 | * not a text one. Consideration should also be given to converting |
467 | * fbdev to use configfs instead of sysfs */ | 489 | * fbdev to use configfs instead of sysfs */ |
468 | static struct class_device_attribute class_device_attrs[] = { | 490 | static struct device_attribute device_attrs[] = { |
469 | __ATTR(bits_per_pixel, S_IRUGO|S_IWUSR, show_bpp, store_bpp), | 491 | __ATTR(bits_per_pixel, S_IRUGO|S_IWUSR, show_bpp, store_bpp), |
470 | __ATTR(blank, S_IRUGO|S_IWUSR, show_blank, store_blank), | 492 | __ATTR(blank, S_IRUGO|S_IWUSR, show_blank, store_blank), |
471 | __ATTR(console, S_IRUGO|S_IWUSR, show_console, store_console), | 493 | __ATTR(console, S_IRUGO|S_IWUSR, show_console, store_console), |
@@ -483,17 +505,16 @@ static struct class_device_attribute class_device_attrs[] = { | |||
483 | #endif | 505 | #endif |
484 | }; | 506 | }; |
485 | 507 | ||
486 | int fb_init_class_device(struct fb_info *fb_info) | 508 | int fb_init_device(struct fb_info *fb_info) |
487 | { | 509 | { |
488 | int i, error = 0; | 510 | int i, error = 0; |
489 | 511 | ||
490 | class_set_devdata(fb_info->class_device, fb_info); | 512 | dev_set_drvdata(fb_info->dev, fb_info); |
491 | 513 | ||
492 | fb_info->class_flag |= FB_SYSFS_FLAG_ATTR; | 514 | fb_info->class_flag |= FB_SYSFS_FLAG_ATTR; |
493 | 515 | ||
494 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) { | 516 | for (i = 0; i < ARRAY_SIZE(device_attrs); i++) { |
495 | error = class_device_create_file(fb_info->class_device, | 517 | error = device_create_file(fb_info->dev, &device_attrs[i]); |
496 | &class_device_attrs[i]); | ||
497 | 518 | ||
498 | if (error) | 519 | if (error) |
499 | break; | 520 | break; |
@@ -501,22 +522,20 @@ int fb_init_class_device(struct fb_info *fb_info) | |||
501 | 522 | ||
502 | if (error) { | 523 | if (error) { |
503 | while (--i >= 0) | 524 | while (--i >= 0) |
504 | class_device_remove_file(fb_info->class_device, | 525 | device_remove_file(fb_info->dev, &device_attrs[i]); |
505 | &class_device_attrs[i]); | ||
506 | fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR; | 526 | fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR; |
507 | } | 527 | } |
508 | 528 | ||
509 | return 0; | 529 | return 0; |
510 | } | 530 | } |
511 | 531 | ||
512 | void fb_cleanup_class_device(struct fb_info *fb_info) | 532 | void fb_cleanup_device(struct fb_info *fb_info) |
513 | { | 533 | { |
514 | unsigned int i; | 534 | unsigned int i; |
515 | 535 | ||
516 | if (fb_info->class_flag & FB_SYSFS_FLAG_ATTR) { | 536 | if (fb_info->class_flag & FB_SYSFS_FLAG_ATTR) { |
517 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) | 537 | for (i = 0; i < ARRAY_SIZE(device_attrs); i++) |
518 | class_device_remove_file(fb_info->class_device, | 538 | device_remove_file(fb_info->dev, &device_attrs[i]); |
519 | &class_device_attrs[i]); | ||
520 | 539 | ||
521 | fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR; | 540 | fb_info->class_flag &= ~FB_SYSFS_FLAG_ATTR; |
522 | } | 541 | } |