diff options
Diffstat (limited to 'drivers')
131 files changed, 1144 insertions, 665 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 3548ee7014ca..81b7ae376951 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -574,6 +574,8 @@ static const struct ich_laptop ich_laptop[] = { | |||
| 574 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ | 574 | { 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */ |
| 575 | { 0x27DF, 0x103C, 0x30A1 }, /* ICH7 on HP Compaq nc2400 */ | 575 | { 0x27DF, 0x103C, 0x30A1 }, /* ICH7 on HP Compaq nc2400 */ |
| 576 | { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */ | 576 | { 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */ |
| 577 | { 0x24CA, 0x1025, 0x003d }, /* ICH4 on ACER TM290 */ | ||
| 578 | { 0x266F, 0x1025, 0x0066 }, /* ICH6 on ACER Aspire 1694WLMi */ | ||
| 577 | { 0x2653, 0x1043, 0x82D8 }, /* ICH6M on Asus Eee 701 */ | 579 | { 0x2653, 0x1043, 0x82D8 }, /* ICH6M on Asus Eee 701 */ |
| 578 | /* end marker */ | 580 | /* end marker */ |
| 579 | { 0, } | 581 | { 0, } |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index dbf6ca781f66..3ff8b14420d9 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -118,12 +118,62 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap) | |||
| 118 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; | 118 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device | 121 | static void ata_acpi_eject_device(acpi_handle handle) |
| 122 | *dev, u32 event) | 122 | { |
| 123 | struct acpi_object_list arg_list; | ||
| 124 | union acpi_object arg; | ||
| 125 | |||
| 126 | arg_list.count = 1; | ||
| 127 | arg_list.pointer = &arg; | ||
| 128 | arg.type = ACPI_TYPE_INTEGER; | ||
| 129 | arg.integer.value = 1; | ||
| 130 | |||
| 131 | if (ACPI_FAILURE(acpi_evaluate_object(handle, "_EJ0", | ||
| 132 | &arg_list, NULL))) | ||
| 133 | printk(KERN_ERR "Failed to evaluate _EJ0!\n"); | ||
| 134 | } | ||
| 135 | |||
| 136 | /* @ap and @dev are the same as ata_acpi_handle_hotplug() */ | ||
| 137 | static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev) | ||
| 138 | { | ||
| 139 | if (dev) | ||
| 140 | dev->flags |= ATA_DFLAG_DETACH; | ||
| 141 | else { | ||
| 142 | struct ata_link *tlink; | ||
| 143 | struct ata_device *tdev; | ||
| 144 | |||
| 145 | ata_port_for_each_link(tlink, ap) | ||
| 146 | ata_link_for_each_dev(tdev, tlink) | ||
| 147 | tdev->flags |= ATA_DFLAG_DETACH; | ||
| 148 | } | ||
| 149 | |||
| 150 | ata_port_schedule_eh(ap); | ||
| 151 | } | ||
| 152 | |||
| 153 | /** | ||
| 154 | * ata_acpi_handle_hotplug - ACPI event handler backend | ||
| 155 | * @ap: ATA port ACPI event occurred | ||
| 156 | * @dev: ATA device ACPI event occurred (can be NULL) | ||
| 157 | * @event: ACPI event which occurred | ||
| 158 | * @is_dock_event: boolean indicating whether the event was a dock one | ||
| 159 | * | ||
| 160 | * All ACPI bay / device realted events end up in this function. If | ||
| 161 | * the event is port-wide @dev is NULL. If the event is specific to a | ||
| 162 | * device, @dev points to it. | ||
| 163 | * | ||
| 164 | * Hotplug (as opposed to unplug) notification is always handled as | ||
| 165 | * port-wide while unplug only kills the target device on device-wide | ||
| 166 | * event. | ||
| 167 | * | ||
| 168 | * LOCKING: | ||
| 169 | * ACPI notify handler context. May sleep. | ||
| 170 | */ | ||
| 171 | static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, | ||
| 172 | u32 event, int is_dock_event) | ||
| 123 | { | 173 | { |
| 124 | char event_string[12]; | 174 | char event_string[12]; |
| 125 | char *envp[] = { event_string, NULL }; | 175 | char *envp[] = { event_string, NULL }; |
| 126 | struct ata_eh_info *ehi; | 176 | struct ata_eh_info *ehi = &ap->link.eh_info; |
| 127 | struct kobject *kobj = NULL; | 177 | struct kobject *kobj = NULL; |
| 128 | int wait = 0; | 178 | int wait = 0; |
| 129 | unsigned long flags; | 179 | unsigned long flags; |
| @@ -131,87 +181,100 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device | |||
| 131 | unsigned long sta; | 181 | unsigned long sta; |
| 132 | acpi_status status; | 182 | acpi_status status; |
| 133 | 183 | ||
| 134 | if (!ap) | 184 | if (dev) { |
| 135 | ap = dev->link->ap; | 185 | if (dev->sdev) |
| 136 | ehi = &ap->link.eh_info; | 186 | kobj = &dev->sdev->sdev_gendev.kobj; |
| 137 | |||
| 138 | spin_lock_irqsave(ap->lock, flags); | ||
| 139 | |||
| 140 | if (dev) | ||
| 141 | handle = dev->acpi_handle; | 187 | handle = dev->acpi_handle; |
| 142 | else | 188 | } else { |
| 189 | kobj = &ap->dev->kobj; | ||
| 143 | handle = ap->acpi_handle; | 190 | handle = ap->acpi_handle; |
| 191 | } | ||
| 144 | 192 | ||
| 145 | status = acpi_get_handle(handle, "_EJ0", &tmphandle); | 193 | status = acpi_get_handle(handle, "_EJ0", &tmphandle); |
| 146 | if (ACPI_FAILURE(status)) { | 194 | if (ACPI_FAILURE(status)) |
| 147 | /* This device is not ejectable */ | 195 | /* This device does not support hotplug */ |
| 148 | spin_unlock_irqrestore(ap->lock, flags); | ||
| 149 | return; | 196 | return; |
| 150 | } | ||
| 151 | 197 | ||
| 152 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | 198 | spin_lock_irqsave(ap->lock, flags); |
| 153 | if (ACPI_FAILURE(status)) { | ||
| 154 | printk ("Unable to determine bay status\n"); | ||
| 155 | spin_unlock_irqrestore(ap->lock, flags); | ||
| 156 | return; | ||
| 157 | } | ||
| 158 | 199 | ||
| 159 | switch (event) { | 200 | switch (event) { |
| 160 | case ACPI_NOTIFY_BUS_CHECK: | 201 | case ACPI_NOTIFY_BUS_CHECK: |
| 161 | case ACPI_NOTIFY_DEVICE_CHECK: | 202 | case ACPI_NOTIFY_DEVICE_CHECK: |
| 162 | ata_ehi_push_desc(ehi, "ACPI event"); | 203 | ata_ehi_push_desc(ehi, "ACPI event"); |
| 163 | if (!sta) { | 204 | |
| 164 | /* Device has been unplugged */ | 205 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); |
| 165 | if (dev) | 206 | if (ACPI_FAILURE(status)) { |
| 166 | dev->flags |= ATA_DFLAG_DETACH; | 207 | ata_port_printk(ap, KERN_ERR, |
| 167 | else { | 208 | "acpi: failed to determine bay status (0x%x)\n", |
| 168 | struct ata_link *tlink; | 209 | status); |
| 169 | struct ata_device *tdev; | 210 | break; |
| 170 | 211 | } | |
| 171 | ata_port_for_each_link(tlink, ap) { | 212 | |
| 172 | ata_link_for_each_dev(tdev, tlink) { | 213 | if (sta) { |
| 173 | tdev->flags |= | ||
| 174 | ATA_DFLAG_DETACH; | ||
| 175 | } | ||
| 176 | } | ||
| 177 | } | ||
| 178 | ata_port_schedule_eh(ap); | ||
| 179 | wait = 1; | ||
| 180 | } else { | ||
| 181 | ata_ehi_hotplugged(ehi); | 214 | ata_ehi_hotplugged(ehi); |
| 182 | ata_port_freeze(ap); | 215 | ata_port_freeze(ap); |
| 216 | } else { | ||
| 217 | /* The device has gone - unplug it */ | ||
| 218 | ata_acpi_detach_device(ap, dev); | ||
| 219 | wait = 1; | ||
| 183 | } | 220 | } |
| 221 | break; | ||
| 222 | case ACPI_NOTIFY_EJECT_REQUEST: | ||
| 223 | ata_ehi_push_desc(ehi, "ACPI event"); | ||
| 224 | |||
| 225 | if (!is_dock_event) | ||
| 226 | break; | ||
| 227 | |||
| 228 | /* undock event - immediate unplug */ | ||
| 229 | ata_acpi_detach_device(ap, dev); | ||
| 230 | wait = 1; | ||
| 231 | break; | ||
| 184 | } | 232 | } |
| 185 | 233 | ||
| 234 | /* make sure kobj doesn't go away while ap->lock is released */ | ||
| 235 | kobject_get(kobj); | ||
| 236 | |||
| 186 | spin_unlock_irqrestore(ap->lock, flags); | 237 | spin_unlock_irqrestore(ap->lock, flags); |
| 187 | 238 | ||
| 188 | if (wait) | 239 | if (wait) { |
| 189 | ata_port_wait_eh(ap); | 240 | ata_port_wait_eh(ap); |
| 241 | ata_acpi_eject_device(handle); | ||
| 242 | } | ||
| 190 | 243 | ||
| 191 | if (dev) { | 244 | if (kobj && !is_dock_event) { |
| 192 | if (dev->sdev) | ||
| 193 | kobj = &dev->sdev->sdev_gendev.kobj; | ||
| 194 | } else | ||
| 195 | kobj = &ap->dev->kobj; | ||
| 196 | |||
| 197 | if (kobj) { | ||
| 198 | sprintf(event_string, "BAY_EVENT=%d", event); | 245 | sprintf(event_string, "BAY_EVENT=%d", event); |
| 199 | kobject_uevent_env(kobj, KOBJ_CHANGE, envp); | 246 | kobject_uevent_env(kobj, KOBJ_CHANGE, envp); |
| 200 | } | 247 | } |
| 248 | |||
| 249 | kobject_put(kobj); | ||
| 250 | } | ||
| 251 | |||
| 252 | static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data) | ||
| 253 | { | ||
| 254 | struct ata_device *dev = data; | ||
| 255 | |||
| 256 | ata_acpi_handle_hotplug(dev->link->ap, dev, event, 1); | ||
| 257 | } | ||
| 258 | |||
| 259 | static void ata_acpi_ap_notify_dock(acpi_handle handle, u32 event, void *data) | ||
| 260 | { | ||
| 261 | struct ata_port *ap = data; | ||
| 262 | |||
| 263 | ata_acpi_handle_hotplug(ap, NULL, event, 1); | ||
| 201 | } | 264 | } |
| 202 | 265 | ||
| 203 | static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data) | 266 | static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data) |
| 204 | { | 267 | { |
| 205 | struct ata_device *dev = data; | 268 | struct ata_device *dev = data; |
| 206 | 269 | ||
| 207 | ata_acpi_handle_hotplug(NULL, dev, event); | 270 | ata_acpi_handle_hotplug(dev->link->ap, dev, event, 0); |
| 208 | } | 271 | } |
| 209 | 272 | ||
| 210 | static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data) | 273 | static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data) |
| 211 | { | 274 | { |
| 212 | struct ata_port *ap = data; | 275 | struct ata_port *ap = data; |
| 213 | 276 | ||
| 214 | ata_acpi_handle_hotplug(ap, NULL, event); | 277 | ata_acpi_handle_hotplug(ap, NULL, event, 0); |
| 215 | } | 278 | } |
| 216 | 279 | ||
| 217 | /** | 280 | /** |
| @@ -252,7 +315,7 @@ void ata_acpi_associate(struct ata_host *host) | |||
| 252 | ata_acpi_ap_notify, ap); | 315 | ata_acpi_ap_notify, ap); |
| 253 | /* we might be on a docking station */ | 316 | /* we might be on a docking station */ |
| 254 | register_hotplug_dock_device(ap->acpi_handle, | 317 | register_hotplug_dock_device(ap->acpi_handle, |
| 255 | ata_acpi_ap_notify, ap); | 318 | ata_acpi_ap_notify_dock, ap); |
| 256 | } | 319 | } |
| 257 | 320 | ||
| 258 | for (j = 0; j < ata_link_max_devices(&ap->link); j++) { | 321 | for (j = 0; j < ata_link_max_devices(&ap->link); j++) { |
| @@ -264,7 +327,7 @@ void ata_acpi_associate(struct ata_host *host) | |||
| 264 | ata_acpi_dev_notify, dev); | 327 | ata_acpi_dev_notify, dev); |
| 265 | /* we might be on a docking station */ | 328 | /* we might be on a docking station */ |
| 266 | register_hotplug_dock_device(dev->acpi_handle, | 329 | register_hotplug_dock_device(dev->acpi_handle, |
| 267 | ata_acpi_dev_notify, dev); | 330 | ata_acpi_dev_notify_dock, dev); |
| 268 | } | 331 | } |
| 269 | } | 332 | } |
| 270 | } | 333 | } |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 3c2d2289f85e..215d18672a5a 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
| @@ -247,7 +247,7 @@ u8 ata_sff_check_status(struct ata_port *ap) | |||
| 247 | * LOCKING: | 247 | * LOCKING: |
| 248 | * Inherited from caller. | 248 | * Inherited from caller. |
| 249 | */ | 249 | */ |
| 250 | u8 ata_sff_altstatus(struct ata_port *ap) | 250 | static u8 ata_sff_altstatus(struct ata_port *ap) |
| 251 | { | 251 | { |
| 252 | if (ap->ops->sff_check_altstatus) | 252 | if (ap->ops->sff_check_altstatus) |
| 253 | return ap->ops->sff_check_altstatus(ap); | 253 | return ap->ops->sff_check_altstatus(ap); |
| @@ -256,6 +256,93 @@ u8 ata_sff_altstatus(struct ata_port *ap) | |||
| 256 | } | 256 | } |
| 257 | 257 | ||
| 258 | /** | 258 | /** |
| 259 | * ata_sff_irq_status - Check if the device is busy | ||
| 260 | * @ap: port where the device is | ||
| 261 | * | ||
| 262 | * Determine if the port is currently busy. Uses altstatus | ||
| 263 | * if available in order to avoid clearing shared IRQ status | ||
| 264 | * when finding an IRQ source. Non ctl capable devices don't | ||
| 265 | * share interrupt lines fortunately for us. | ||
| 266 | * | ||
| 267 | * LOCKING: | ||
| 268 | * Inherited from caller. | ||
| 269 | */ | ||
| 270 | static u8 ata_sff_irq_status(struct ata_port *ap) | ||
| 271 | { | ||
| 272 | u8 status; | ||
| 273 | |||
| 274 | if (ap->ops->sff_check_altstatus || ap->ioaddr.altstatus_addr) { | ||
| 275 | status = ata_sff_altstatus(ap); | ||
| 276 | /* Not us: We are busy */ | ||
| 277 | if (status & ATA_BUSY) | ||
| 278 | return status; | ||
| 279 | } | ||
| 280 | /* Clear INTRQ latch */ | ||
| 281 | status = ap->ops->sff_check_status(ap); | ||
| 282 | return status; | ||
| 283 | } | ||
| 284 | |||
| 285 | /** | ||
| 286 | * ata_sff_sync - Flush writes | ||
| 287 | * @ap: Port to wait for. | ||
| 288 | * | ||
| 289 | * CAUTION: | ||
| 290 | * If we have an mmio device with no ctl and no altstatus | ||
| 291 | * method this will fail. No such devices are known to exist. | ||
| 292 | * | ||
| 293 | * LOCKING: | ||
| 294 | * Inherited from caller. | ||
| 295 | */ | ||
| 296 | |||
| 297 | static void ata_sff_sync(struct ata_port *ap) | ||
| 298 | { | ||
| 299 | if (ap->ops->sff_check_altstatus) | ||
| 300 | ap->ops->sff_check_altstatus(ap); | ||
| 301 | else if (ap->ioaddr.altstatus_addr) | ||
| 302 | ioread8(ap->ioaddr.altstatus_addr); | ||
| 303 | } | ||
| 304 | |||
| 305 | /** | ||
| 306 | * ata_sff_pause - Flush writes and wait 400nS | ||
| 307 | * @ap: Port to pause for. | ||
| 308 | * | ||
| 309 | * CAUTION: | ||
| 310 | * If we have an mmio device with no ctl and no altstatus | ||
| 311 | * method this will fail. No such devices are known to exist. | ||
| 312 | * | ||
| 313 | * LOCKING: | ||
| 314 | * Inherited from caller. | ||
| 315 | */ | ||
| 316 | |||
| 317 | void ata_sff_pause(struct ata_port *ap) | ||
| 318 | { | ||
| 319 | ata_sff_sync(ap); | ||
| 320 | ndelay(400); | ||
| 321 | } | ||
| 322 | |||
| 323 | /** | ||
| 324 | * ata_sff_dma_pause - Pause before commencing DMA | ||
| 325 | * @ap: Port to pause for. | ||
| 326 | * | ||
| 327 | * Perform I/O fencing and ensure sufficient cycle delays occur | ||
| 328 | * for the HDMA1:0 transition | ||
| 329 | */ | ||
| 330 | |||
| 331 | void ata_sff_dma_pause(struct ata_port *ap) | ||
| 332 | { | ||
| 333 | if (ap->ops->sff_check_altstatus || ap->ioaddr.altstatus_addr) { | ||
| 334 | /* An altstatus read will cause the needed delay without | ||
| 335 | messing up the IRQ status */ | ||
| 336 | ata_sff_altstatus(ap); | ||
| 337 | return; | ||
| 338 | } | ||
| 339 | /* There are no DMA controllers without ctl. BUG here to ensure | ||
| 340 | we never violate the HDMA1:0 transition timing and risk | ||
| 341 | corruption. */ | ||
| 342 | BUG(); | ||
| 343 | } | ||
| 344 | |||
| 345 | /** | ||
| 259 | * ata_sff_busy_sleep - sleep until BSY clears, or timeout | 346 | * ata_sff_busy_sleep - sleep until BSY clears, or timeout |
| 260 | * @ap: port containing status register to be polled | 347 | * @ap: port containing status register to be polled |
| 261 | * @tmout_pat: impatience timeout | 348 | * @tmout_pat: impatience timeout |
| @@ -742,7 +829,7 @@ static void ata_pio_sectors(struct ata_queued_cmd *qc) | |||
| 742 | } else | 829 | } else |
| 743 | ata_pio_sector(qc); | 830 | ata_pio_sector(qc); |
| 744 | 831 | ||
| 745 | ata_sff_altstatus(qc->ap); /* flush */ | 832 | ata_sff_sync(qc->ap); /* flush */ |
| 746 | } | 833 | } |
| 747 | 834 | ||
| 748 | /** | 835 | /** |
| @@ -763,8 +850,9 @@ static void atapi_send_cdb(struct ata_port *ap, struct ata_queued_cmd *qc) | |||
| 763 | WARN_ON(qc->dev->cdb_len < 12); | 850 | WARN_ON(qc->dev->cdb_len < 12); |
| 764 | 851 | ||
| 765 | ap->ops->sff_data_xfer(qc->dev, qc->cdb, qc->dev->cdb_len, 1); | 852 | ap->ops->sff_data_xfer(qc->dev, qc->cdb, qc->dev->cdb_len, 1); |
| 766 | ata_sff_altstatus(ap); /* flush */ | 853 | ata_sff_sync(ap); |
| 767 | 854 | /* FIXME: If the CDB is for DMA do we need to do the transition delay | |
| 855 | or is bmdma_start guaranteed to do it ? */ | ||
| 768 | switch (qc->tf.protocol) { | 856 | switch (qc->tf.protocol) { |
| 769 | case ATAPI_PROT_PIO: | 857 | case ATAPI_PROT_PIO: |
| 770 | ap->hsm_task_state = HSM_ST; | 858 | ap->hsm_task_state = HSM_ST; |
| @@ -905,7 +993,7 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc) | |||
| 905 | 993 | ||
| 906 | if (unlikely(__atapi_pio_bytes(qc, bytes))) | 994 | if (unlikely(__atapi_pio_bytes(qc, bytes))) |
| 907 | goto err_out; | 995 | goto err_out; |
| 908 | ata_sff_altstatus(ap); /* flush */ | 996 | ata_sff_sync(ap); /* flush */ |
| 909 | 997 | ||
| 910 | return; | 998 | return; |
| 911 | 999 | ||
| @@ -1489,14 +1577,10 @@ inline unsigned int ata_sff_host_intr(struct ata_port *ap, | |||
| 1489 | goto idle_irq; | 1577 | goto idle_irq; |
| 1490 | } | 1578 | } |
| 1491 | 1579 | ||
| 1492 | /* check altstatus */ | ||
| 1493 | status = ata_sff_altstatus(ap); | ||
| 1494 | if (status & ATA_BUSY) | ||
| 1495 | goto idle_irq; | ||
| 1496 | 1580 | ||
| 1497 | /* check main status, clearing INTRQ */ | 1581 | /* check main status, clearing INTRQ if needed */ |
| 1498 | status = ap->ops->sff_check_status(ap); | 1582 | status = ata_sff_irq_status(ap); |
| 1499 | if (unlikely(status & ATA_BUSY)) | 1583 | if (status & ATA_BUSY) |
| 1500 | goto idle_irq; | 1584 | goto idle_irq; |
| 1501 | 1585 | ||
| 1502 | /* ack bmdma irq events */ | 1586 | /* ack bmdma irq events */ |
| @@ -2030,7 +2114,7 @@ void ata_sff_error_handler(struct ata_port *ap) | |||
| 2030 | ap->ops->bmdma_stop(qc); | 2114 | ap->ops->bmdma_stop(qc); |
| 2031 | } | 2115 | } |
| 2032 | 2116 | ||
| 2033 | ata_sff_altstatus(ap); | 2117 | ata_sff_sync(ap); /* FIXME: We don't need this */ |
| 2034 | ap->ops->sff_check_status(ap); | 2118 | ap->ops->sff_check_status(ap); |
| 2035 | ap->ops->sff_irq_clear(ap); | 2119 | ap->ops->sff_irq_clear(ap); |
| 2036 | 2120 | ||
| @@ -2203,7 +2287,7 @@ void ata_bmdma_stop(struct ata_queued_cmd *qc) | |||
| 2203 | mmio + ATA_DMA_CMD); | 2287 | mmio + ATA_DMA_CMD); |
| 2204 | 2288 | ||
| 2205 | /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ | 2289 | /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ |
| 2206 | ata_sff_altstatus(ap); /* dummy read */ | 2290 | ata_sff_dma_pause(ap); |
| 2207 | } | 2291 | } |
| 2208 | 2292 | ||
| 2209 | /** | 2293 | /** |
| @@ -2722,7 +2806,8 @@ EXPORT_SYMBOL_GPL(ata_sff_qc_prep); | |||
| 2722 | EXPORT_SYMBOL_GPL(ata_sff_dumb_qc_prep); | 2806 | EXPORT_SYMBOL_GPL(ata_sff_dumb_qc_prep); |
| 2723 | EXPORT_SYMBOL_GPL(ata_sff_dev_select); | 2807 | EXPORT_SYMBOL_GPL(ata_sff_dev_select); |
| 2724 | EXPORT_SYMBOL_GPL(ata_sff_check_status); | 2808 | EXPORT_SYMBOL_GPL(ata_sff_check_status); |
| 2725 | EXPORT_SYMBOL_GPL(ata_sff_altstatus); | 2809 | EXPORT_SYMBOL_GPL(ata_sff_dma_pause); |
| 2810 | EXPORT_SYMBOL_GPL(ata_sff_pause); | ||
| 2726 | EXPORT_SYMBOL_GPL(ata_sff_busy_sleep); | 2811 | EXPORT_SYMBOL_GPL(ata_sff_busy_sleep); |
| 2727 | EXPORT_SYMBOL_GPL(ata_sff_wait_ready); | 2812 | EXPORT_SYMBOL_GPL(ata_sff_wait_ready); |
| 2728 | EXPORT_SYMBOL_GPL(ata_sff_tf_load); | 2813 | EXPORT_SYMBOL_GPL(ata_sff_tf_load); |
diff --git a/drivers/ata/pata_icside.c b/drivers/ata/pata_icside.c index 17138436423d..cf9e9848f8b5 100644 --- a/drivers/ata/pata_icside.c +++ b/drivers/ata/pata_icside.c | |||
| @@ -270,7 +270,7 @@ static void pata_icside_bmdma_stop(struct ata_queued_cmd *qc) | |||
| 270 | disable_dma(state->dma); | 270 | disable_dma(state->dma); |
| 271 | 271 | ||
| 272 | /* see ata_bmdma_stop */ | 272 | /* see ata_bmdma_stop */ |
| 273 | ata_sff_altstatus(ap); | 273 | ata_sff_dma_pause(ap); |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | static u8 pata_icside_bmdma_status(struct ata_port *ap) | 276 | static u8 pata_icside_bmdma_status(struct ata_port *ap) |
diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c index a108d259f19d..f8b3ffc8ae9e 100644 --- a/drivers/ata/pata_rb532_cf.c +++ b/drivers/ata/pata_rb532_cf.c | |||
| @@ -57,7 +57,9 @@ static inline void rb532_pata_finish_io(struct ata_port *ap) | |||
| 57 | struct ata_host *ah = ap->host; | 57 | struct ata_host *ah = ap->host; |
| 58 | struct rb532_cf_info *info = ah->private_data; | 58 | struct rb532_cf_info *info = ah->private_data; |
| 59 | 59 | ||
| 60 | ata_sff_altstatus(ap); | 60 | /* FIXME: Keep previous delay. If this is merely a fence then |
| 61 | ata_sff_sync might be sufficient. */ | ||
| 62 | ata_sff_dma_pause(ap); | ||
| 61 | ndelay(RB500_CF_IO_DELAY); | 63 | ndelay(RB500_CF_IO_DELAY); |
| 62 | 64 | ||
| 63 | set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); | 65 | set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); |
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index e965b251ca24..bbf5aa345e68 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
| @@ -726,7 +726,7 @@ static void scc_bmdma_stop (struct ata_queued_cmd *qc) | |||
| 726 | in_be32(bmid_base + SCC_DMA_CMD) & ~ATA_DMA_START); | 726 | in_be32(bmid_base + SCC_DMA_CMD) & ~ATA_DMA_START); |
| 727 | 727 | ||
| 728 | /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ | 728 | /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ |
| 729 | ata_sff_altstatus(ap); /* dummy read */ | 729 | ata_sff_dma_pause(ap); /* dummy read */ |
| 730 | } | 730 | } |
| 731 | 731 | ||
| 732 | /** | 732 | /** |
| @@ -747,7 +747,8 @@ static u8 scc_bmdma_status (struct ata_port *ap) | |||
| 747 | return host_stat; | 747 | return host_stat; |
| 748 | 748 | ||
| 749 | /* errata A252,A308 workaround: Step4 */ | 749 | /* errata A252,A308 workaround: Step4 */ |
| 750 | if ((ata_sff_altstatus(ap) & ATA_ERR) && (int_status & INTSTS_INTRQ)) | 750 | if ((scc_check_altstatus(ap) & ATA_ERR) |
| 751 | && (int_status & INTSTS_INTRQ)) | ||
| 751 | return (host_stat | ATA_DMA_INTR); | 752 | return (host_stat | ATA_DMA_INTR); |
| 752 | 753 | ||
| 753 | /* errata A308 workaround Step5 */ | 754 | /* errata A308 workaround Step5 */ |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index acf347f71a2f..60391e9a84db 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -224,6 +224,11 @@ enum { | |||
| 224 | 224 | ||
| 225 | PHY_MODE3 = 0x310, | 225 | PHY_MODE3 = 0x310, |
| 226 | PHY_MODE4 = 0x314, | 226 | PHY_MODE4 = 0x314, |
| 227 | PHY_MODE4_CFG_MASK = 0x00000003, /* phy internal config field */ | ||
| 228 | PHY_MODE4_CFG_VALUE = 0x00000001, /* phy internal config field */ | ||
| 229 | PHY_MODE4_RSVD_ZEROS = 0x5de3fffa, /* Gen2e always write zeros */ | ||
| 230 | PHY_MODE4_RSVD_ONES = 0x00000005, /* Gen2e always write ones */ | ||
| 231 | |||
| 227 | PHY_MODE2 = 0x330, | 232 | PHY_MODE2 = 0x330, |
| 228 | SATA_IFCTL_OFS = 0x344, | 233 | SATA_IFCTL_OFS = 0x344, |
| 229 | SATA_TESTCTL_OFS = 0x348, | 234 | SATA_TESTCTL_OFS = 0x348, |
| @@ -2563,17 +2568,16 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | |||
| 2563 | m3 &= ~0x1c; | 2568 | m3 &= ~0x1c; |
| 2564 | 2569 | ||
| 2565 | if (fix_phy_mode4) { | 2570 | if (fix_phy_mode4) { |
| 2566 | u32 m4; | 2571 | u32 m4 = readl(port_mmio + PHY_MODE4); |
| 2567 | 2572 | /* | |
| 2568 | m4 = readl(port_mmio + PHY_MODE4); | 2573 | * Enforce reserved-bit restrictions on GenIIe devices only. |
| 2569 | 2574 | * For earlier chipsets, force only the internal config field | |
| 2570 | /* workaround for errata FEr SATA#10 (part 1) */ | 2575 | * (workaround for errata FEr SATA#10 part 1). |
| 2571 | m4 = (m4 & ~(1 << 1)) | (1 << 0); | 2576 | */ |
| 2572 | |||
| 2573 | /* enforce bit restrictions on GenIIe devices */ | ||
| 2574 | if (IS_GEN_IIE(hpriv)) | 2577 | if (IS_GEN_IIE(hpriv)) |
| 2575 | m4 = (m4 & ~0x5DE3FFFC) | (1 << 2); | 2578 | m4 = (m4 & ~PHY_MODE4_RSVD_ZEROS) | PHY_MODE4_RSVD_ONES; |
| 2576 | 2579 | else | |
| 2580 | m4 = (m4 & ~PHY_MODE4_CFG_MASK) | PHY_MODE4_CFG_VALUE; | ||
| 2577 | writel(m4, port_mmio + PHY_MODE4); | 2581 | writel(m4, port_mmio + PHY_MODE4); |
| 2578 | } | 2582 | } |
| 2579 | /* | 2583 | /* |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 680cdfc00b90..24b97b0bef99 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
| @@ -397,6 +397,7 @@ module_param(max_part, int, 0); | |||
| 397 | MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk"); | 397 | MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk"); |
| 398 | MODULE_LICENSE("GPL"); | 398 | MODULE_LICENSE("GPL"); |
| 399 | MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR); | 399 | MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR); |
| 400 | MODULE_ALIAS("rd"); | ||
| 400 | 401 | ||
| 401 | #ifndef MODULE | 402 | #ifndef MODULE |
| 402 | /* Legacy boot options - nonmodular */ | 403 | /* Legacy boot options - nonmodular */ |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 595a925c62a9..d307bf26af58 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
| @@ -118,8 +118,8 @@ config COMPUTONE | |||
| 118 | order to become a dial-in server. If you have a card like that, say | 118 | order to become a dial-in server. If you have a card like that, say |
| 119 | Y here and read <file:Documentation/computone.txt>. | 119 | Y here and read <file:Documentation/computone.txt>. |
| 120 | 120 | ||
| 121 | To compile this driver as modules, choose M here: the | 121 | To compile this driver as module, choose M here: the |
| 122 | modules will be called ip2 and ip2main. | 122 | module will be called ip2. |
| 123 | 123 | ||
| 124 | config ROCKETPORT | 124 | config ROCKETPORT |
| 125 | tristate "Comtrol RocketPort support" | 125 | tristate "Comtrol RocketPort support" |
diff --git a/drivers/char/pcmcia/ipwireless/hardware.c b/drivers/char/pcmcia/ipwireless/hardware.c index fa9d3c945f31..ba6340ae98af 100644 --- a/drivers/char/pcmcia/ipwireless/hardware.c +++ b/drivers/char/pcmcia/ipwireless/hardware.c | |||
| @@ -251,10 +251,11 @@ struct ipw_hardware { | |||
| 251 | int init_loops; | 251 | int init_loops; |
| 252 | struct timer_list setup_timer; | 252 | struct timer_list setup_timer; |
| 253 | 253 | ||
| 254 | /* Flag if hw is ready to send next packet */ | ||
| 254 | int tx_ready; | 255 | int tx_ready; |
| 255 | struct list_head tx_queue[NL_NUM_OF_PRIORITIES]; | 256 | /* Count of pending packets to be sent */ |
| 256 | /* True if any packets are queued for transmission */ | ||
| 257 | int tx_queued; | 257 | int tx_queued; |
| 258 | struct list_head tx_queue[NL_NUM_OF_PRIORITIES]; | ||
| 258 | 259 | ||
| 259 | int rx_bytes_queued; | 260 | int rx_bytes_queued; |
| 260 | struct list_head rx_queue; | 261 | struct list_head rx_queue; |
| @@ -404,6 +405,8 @@ static int do_send_fragment(struct ipw_hardware *hw, const unsigned char *data, | |||
| 404 | 405 | ||
| 405 | spin_lock_irqsave(&hw->spinlock, flags); | 406 | spin_lock_irqsave(&hw->spinlock, flags); |
| 406 | 407 | ||
| 408 | hw->tx_ready = 0; | ||
| 409 | |||
| 407 | if (hw->hw_version == HW_VERSION_1) { | 410 | if (hw->hw_version == HW_VERSION_1) { |
| 408 | outw((unsigned short) length, hw->base_port + IODWR); | 411 | outw((unsigned short) length, hw->base_port + IODWR); |
| 409 | 412 | ||
| @@ -492,6 +495,7 @@ static int do_send_packet(struct ipw_hardware *hw, struct ipw_tx_packet *packet) | |||
| 492 | 495 | ||
| 493 | spin_lock_irqsave(&hw->spinlock, flags); | 496 | spin_lock_irqsave(&hw->spinlock, flags); |
| 494 | list_add(&packet->queue, &hw->tx_queue[0]); | 497 | list_add(&packet->queue, &hw->tx_queue[0]); |
| 498 | hw->tx_queued++; | ||
| 495 | spin_unlock_irqrestore(&hw->spinlock, flags); | 499 | spin_unlock_irqrestore(&hw->spinlock, flags); |
| 496 | } else { | 500 | } else { |
| 497 | if (packet->packet_callback) | 501 | if (packet->packet_callback) |
| @@ -949,12 +953,10 @@ static int send_pending_packet(struct ipw_hardware *hw, int priority_limit) | |||
| 949 | unsigned long flags; | 953 | unsigned long flags; |
| 950 | 954 | ||
| 951 | spin_lock_irqsave(&hw->spinlock, flags); | 955 | spin_lock_irqsave(&hw->spinlock, flags); |
| 952 | if (hw->tx_queued && hw->tx_ready != 0) { | 956 | if (hw->tx_queued && hw->tx_ready) { |
| 953 | int priority; | 957 | int priority; |
| 954 | struct ipw_tx_packet *packet = NULL; | 958 | struct ipw_tx_packet *packet = NULL; |
| 955 | 959 | ||
| 956 | hw->tx_ready--; | ||
| 957 | |||
| 958 | /* Pick a packet */ | 960 | /* Pick a packet */ |
| 959 | for (priority = 0; priority < priority_limit; priority++) { | 961 | for (priority = 0; priority < priority_limit; priority++) { |
| 960 | if (!list_empty(&hw->tx_queue[priority])) { | 962 | if (!list_empty(&hw->tx_queue[priority])) { |
| @@ -963,6 +965,7 @@ static int send_pending_packet(struct ipw_hardware *hw, int priority_limit) | |||
| 963 | struct ipw_tx_packet, | 965 | struct ipw_tx_packet, |
| 964 | queue); | 966 | queue); |
| 965 | 967 | ||
| 968 | hw->tx_queued--; | ||
| 966 | list_del(&packet->queue); | 969 | list_del(&packet->queue); |
| 967 | 970 | ||
| 968 | break; | 971 | break; |
| @@ -973,6 +976,7 @@ static int send_pending_packet(struct ipw_hardware *hw, int priority_limit) | |||
| 973 | spin_unlock_irqrestore(&hw->spinlock, flags); | 976 | spin_unlock_irqrestore(&hw->spinlock, flags); |
| 974 | return 0; | 977 | return 0; |
| 975 | } | 978 | } |
| 979 | |||
| 976 | spin_unlock_irqrestore(&hw->spinlock, flags); | 980 | spin_unlock_irqrestore(&hw->spinlock, flags); |
| 977 | 981 | ||
| 978 | /* Send */ | 982 | /* Send */ |
| @@ -1063,7 +1067,7 @@ static irqreturn_t ipwireless_handle_v1_interrupt(int irq, | |||
| 1063 | if (irqn & IR_TXINTR) { | 1067 | if (irqn & IR_TXINTR) { |
| 1064 | ack |= IR_TXINTR; | 1068 | ack |= IR_TXINTR; |
| 1065 | spin_lock_irqsave(&hw->spinlock, flags); | 1069 | spin_lock_irqsave(&hw->spinlock, flags); |
| 1066 | hw->tx_ready++; | 1070 | hw->tx_ready = 1; |
| 1067 | spin_unlock_irqrestore(&hw->spinlock, flags); | 1071 | spin_unlock_irqrestore(&hw->spinlock, flags); |
| 1068 | } | 1072 | } |
| 1069 | /* Received data */ | 1073 | /* Received data */ |
| @@ -1170,7 +1174,7 @@ static irqreturn_t ipwireless_handle_v2_v3_interrupt(int irq, | |||
| 1170 | if (memrxdone & MEMRX_RX_DONE) { | 1174 | if (memrxdone & MEMRX_RX_DONE) { |
| 1171 | writew(0, &hw->memory_info_regs->memreg_rx_done); | 1175 | writew(0, &hw->memory_info_regs->memreg_rx_done); |
| 1172 | spin_lock_irqsave(&hw->spinlock, flags); | 1176 | spin_lock_irqsave(&hw->spinlock, flags); |
| 1173 | hw->tx_ready++; | 1177 | hw->tx_ready = 1; |
| 1174 | spin_unlock_irqrestore(&hw->spinlock, flags); | 1178 | spin_unlock_irqrestore(&hw->spinlock, flags); |
| 1175 | tx = 1; | 1179 | tx = 1; |
| 1176 | } | 1180 | } |
| @@ -1234,7 +1238,7 @@ static void send_packet(struct ipw_hardware *hw, int priority, | |||
| 1234 | 1238 | ||
| 1235 | spin_lock_irqsave(&hw->spinlock, flags); | 1239 | spin_lock_irqsave(&hw->spinlock, flags); |
| 1236 | list_add_tail(&packet->queue, &hw->tx_queue[priority]); | 1240 | list_add_tail(&packet->queue, &hw->tx_queue[priority]); |
| 1237 | hw->tx_queued = 1; | 1241 | hw->tx_queued++; |
| 1238 | spin_unlock_irqrestore(&hw->spinlock, flags); | 1242 | spin_unlock_irqrestore(&hw->spinlock, flags); |
| 1239 | 1243 | ||
| 1240 | flush_packets_to_hw(hw); | 1244 | flush_packets_to_hw(hw); |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index fa1ffbf2c621..935f1c207a1f 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
| @@ -434,7 +434,7 @@ static void update_attr(struct vc_data *vc) | |||
| 434 | vc->vc_blink, vc->vc_underline, | 434 | vc->vc_blink, vc->vc_underline, |
| 435 | vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic); | 435 | vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic); |
| 436 | vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' '; | 436 | vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' '; |
| 437 | vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, false, false) << 8) | ' '; | 437 | vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' '; |
| 438 | } | 438 | } |
| 439 | 439 | ||
| 440 | /* Note: inverting the screen twice should revert to the original state */ | 440 | /* Note: inverting the screen twice should revert to the original state */ |
| @@ -909,7 +909,7 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
| 909 | 909 | ||
| 910 | if (vc->vc_tty) { | 910 | if (vc->vc_tty) { |
| 911 | struct winsize ws, *cws = &vc->vc_tty->winsize; | 911 | struct winsize ws, *cws = &vc->vc_tty->winsize; |
| 912 | unsigned long flags; | 912 | struct pid *pgrp = NULL; |
| 913 | 913 | ||
| 914 | memset(&ws, 0, sizeof(ws)); | 914 | memset(&ws, 0, sizeof(ws)); |
| 915 | ws.ws_row = vc->vc_rows; | 915 | ws.ws_row = vc->vc_rows; |
| @@ -917,11 +917,14 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
| 917 | ws.ws_ypixel = vc->vc_scan_lines; | 917 | ws.ws_ypixel = vc->vc_scan_lines; |
| 918 | 918 | ||
| 919 | mutex_lock(&vc->vc_tty->termios_mutex); | 919 | mutex_lock(&vc->vc_tty->termios_mutex); |
| 920 | spin_lock_irqsave(&vc->vc_tty->ctrl_lock, flags); | 920 | spin_lock_irq(&vc->vc_tty->ctrl_lock); |
| 921 | if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) && | 921 | if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col)) |
| 922 | vc->vc_tty->pgrp) | 922 | pgrp = get_pid(vc->vc_tty->pgrp); |
| 923 | spin_unlock_irq(&vc->vc_tty->ctrl_lock); | ||
| 924 | if (pgrp) { | ||
| 923 | kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1); | 925 | kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1); |
| 924 | spin_unlock_irqrestore(&vc->vc_tty->ctrl_lock, flags); | 926 | put_pid(pgrp); |
| 927 | } | ||
| 925 | *cws = ws; | 928 | *cws = ws; |
| 926 | mutex_unlock(&vc->vc_tty->termios_mutex); | 929 | mutex_unlock(&vc->vc_tty->termios_mutex); |
| 927 | } | 930 | } |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 86f0a2430624..4e07d1f43a43 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -625,7 +625,7 @@ static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, | |||
| 625 | unsigned int freq = 0; | 625 | unsigned int freq = 0; |
| 626 | unsigned int ret; | 626 | unsigned int ret; |
| 627 | 627 | ||
| 628 | if (!policy->governor->store_setspeed) | 628 | if (!policy->governor || !policy->governor->store_setspeed) |
| 629 | return -EINVAL; | 629 | return -EINVAL; |
| 630 | 630 | ||
| 631 | ret = sscanf(buf, "%u", &freq); | 631 | ret = sscanf(buf, "%u", &freq); |
| @@ -639,7 +639,7 @@ static ssize_t store_scaling_setspeed(struct cpufreq_policy *policy, | |||
| 639 | 639 | ||
| 640 | static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf) | 640 | static ssize_t show_scaling_setspeed(struct cpufreq_policy *policy, char *buf) |
| 641 | { | 641 | { |
| 642 | if (!policy->governor->show_setspeed) | 642 | if (!policy->governor || !policy->governor->show_setspeed) |
| 643 | return sprintf(buf, "<unsupported>\n"); | 643 | return sprintf(buf, "<unsupported>\n"); |
| 644 | 644 | ||
| 645 | return policy->governor->show_setspeed(policy, buf); | 645 | return policy->governor->show_setspeed(policy, buf); |
diff --git a/drivers/firmware/edd.c b/drivers/firmware/edd.c index 744011989044..9e4f59dc7f1e 100644 --- a/drivers/firmware/edd.c +++ b/drivers/firmware/edd.c | |||
| @@ -753,7 +753,7 @@ edd_init(void) | |||
| 753 | 753 | ||
| 754 | if (!edd_num_devices()) { | 754 | if (!edd_num_devices()) { |
| 755 | printk(KERN_INFO "EDD information not available.\n"); | 755 | printk(KERN_INFO "EDD information not available.\n"); |
| 756 | return 1; | 756 | return -ENODEV; |
| 757 | } | 757 | } |
| 758 | 758 | ||
| 759 | edd_kset = kset_create_and_add("edd", NULL, firmware_kobj); | 759 | edd_kset = kset_create_and_add("edd", NULL, firmware_kobj); |
diff --git a/drivers/hwmon/hdaps.c b/drivers/hwmon/hdaps.c index 88e89653daaf..26df06f840eb 100644 --- a/drivers/hwmon/hdaps.c +++ b/drivers/hwmon/hdaps.c | |||
| @@ -522,6 +522,7 @@ static struct dmi_system_id __initdata hdaps_whitelist[] = { | |||
| 522 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"), | 522 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"), |
| 523 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"), | 523 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"), |
| 524 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"), | 524 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60"), |
| 525 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61"), | ||
| 525 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"), | 526 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"), |
| 526 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"), | 527 | HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X41"), |
| 527 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"), | 528 | HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60"), |
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c index 5c006c9a4311..c9416e657487 100644 --- a/drivers/hwmon/ibmaem.c +++ b/drivers/hwmon/ibmaem.c | |||
| @@ -189,8 +189,8 @@ static struct aem_iana_id system_x_id = { | |||
| 189 | struct aem_find_firmware_req { | 189 | struct aem_find_firmware_req { |
| 190 | struct aem_iana_id id; | 190 | struct aem_iana_id id; |
| 191 | u8 rsvd; | 191 | u8 rsvd; |
| 192 | u16 index; | 192 | __be16 index; |
| 193 | u16 module_type_id; | 193 | __be16 module_type_id; |
| 194 | } __packed; | 194 | } __packed; |
| 195 | 195 | ||
| 196 | struct aem_find_firmware_resp { | 196 | struct aem_find_firmware_resp { |
| @@ -202,7 +202,7 @@ struct aem_find_firmware_resp { | |||
| 202 | struct aem_find_instance_req { | 202 | struct aem_find_instance_req { |
| 203 | struct aem_iana_id id; | 203 | struct aem_iana_id id; |
| 204 | u8 instance_number; | 204 | u8 instance_number; |
| 205 | u16 module_type_id; | 205 | __be16 module_type_id; |
| 206 | } __packed; | 206 | } __packed; |
| 207 | 207 | ||
| 208 | struct aem_find_instance_resp { | 208 | struct aem_find_instance_resp { |
| @@ -444,17 +444,17 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, | |||
| 444 | } | 444 | } |
| 445 | case 2: { | 445 | case 2: { |
| 446 | u16 *x = buf; | 446 | u16 *x = buf; |
| 447 | *x = be16_to_cpup((u16 *)rs_resp->bytes); | 447 | *x = be16_to_cpup((__be16 *)rs_resp->bytes); |
| 448 | break; | 448 | break; |
| 449 | } | 449 | } |
| 450 | case 4: { | 450 | case 4: { |
| 451 | u32 *x = buf; | 451 | u32 *x = buf; |
| 452 | *x = be32_to_cpup((u32 *)rs_resp->bytes); | 452 | *x = be32_to_cpup((__be32 *)rs_resp->bytes); |
| 453 | break; | 453 | break; |
| 454 | } | 454 | } |
| 455 | case 8: { | 455 | case 8: { |
| 456 | u64 *x = buf; | 456 | u64 *x = buf; |
| 457 | *x = be64_to_cpup((u64 *)rs_resp->bytes); | 457 | *x = be64_to_cpup((__be64 *)rs_resp->bytes); |
| 458 | break; | 458 | break; |
| 459 | } | 459 | } |
| 460 | } | 460 | } |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 51c19f86ff99..7cf512a34ccf 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -276,6 +276,7 @@ static mddev_t * mddev_find(dev_t unit) | |||
| 276 | atomic_set(&new->active, 1); | 276 | atomic_set(&new->active, 1); |
| 277 | spin_lock_init(&new->write_lock); | 277 | spin_lock_init(&new->write_lock); |
| 278 | init_waitqueue_head(&new->sb_wait); | 278 | init_waitqueue_head(&new->sb_wait); |
| 279 | init_waitqueue_head(&new->recovery_wait); | ||
| 279 | new->reshape_position = MaxSector; | 280 | new->reshape_position = MaxSector; |
| 280 | new->resync_max = MaxSector; | 281 | new->resync_max = MaxSector; |
| 281 | new->level = LEVEL_NONE; | 282 | new->level = LEVEL_NONE; |
| @@ -5665,7 +5666,6 @@ void md_do_sync(mddev_t *mddev) | |||
| 5665 | window/2,(unsigned long long) max_sectors/2); | 5666 | window/2,(unsigned long long) max_sectors/2); |
| 5666 | 5667 | ||
| 5667 | atomic_set(&mddev->recovery_active, 0); | 5668 | atomic_set(&mddev->recovery_active, 0); |
| 5668 | init_waitqueue_head(&mddev->recovery_wait); | ||
| 5669 | last_check = 0; | 5669 | last_check = 0; |
| 5670 | 5670 | ||
| 5671 | if (j>2) { | 5671 | if (j>2) { |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 425958a76b84..c37e256b1176 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2002,6 +2002,7 @@ static int __handle_issuing_new_read_requests5(struct stripe_head *sh, | |||
| 2002 | * have quiesced. | 2002 | * have quiesced. |
| 2003 | */ | 2003 | */ |
| 2004 | if ((s->uptodate == disks - 1) && | 2004 | if ((s->uptodate == disks - 1) && |
| 2005 | (s->failed && disk_idx == s->failed_num) && | ||
| 2005 | !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) { | 2006 | !test_bit(STRIPE_OP_CHECK, &sh->ops.pending)) { |
| 2006 | set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); | 2007 | set_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); |
| 2007 | set_bit(R5_Wantcompute, &dev->flags); | 2008 | set_bit(R5_Wantcompute, &dev->flags); |
| @@ -2087,7 +2088,9 @@ static void handle_issuing_new_read_requests6(struct stripe_head *sh, | |||
| 2087 | /* we would like to get this block, possibly | 2088 | /* we would like to get this block, possibly |
| 2088 | * by computing it, but we might not be able to | 2089 | * by computing it, but we might not be able to |
| 2089 | */ | 2090 | */ |
| 2090 | if (s->uptodate == disks-1) { | 2091 | if ((s->uptodate == disks - 1) && |
| 2092 | (s->failed && (i == r6s->failed_num[0] || | ||
| 2093 | i == r6s->failed_num[1]))) { | ||
| 2091 | pr_debug("Computing stripe %llu block %d\n", | 2094 | pr_debug("Computing stripe %llu block %d\n", |
| 2092 | (unsigned long long)sh->sector, i); | 2095 | (unsigned long long)sh->sector, i); |
| 2093 | compute_block_1(sh, i, 0); | 2096 | compute_block_1(sh, i, 0); |
| @@ -2645,6 +2648,7 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2645 | struct r5dev *dev; | 2648 | struct r5dev *dev; |
| 2646 | unsigned long pending = 0; | 2649 | unsigned long pending = 0; |
| 2647 | mdk_rdev_t *blocked_rdev = NULL; | 2650 | mdk_rdev_t *blocked_rdev = NULL; |
| 2651 | int prexor; | ||
| 2648 | 2652 | ||
| 2649 | memset(&s, 0, sizeof(s)); | 2653 | memset(&s, 0, sizeof(s)); |
| 2650 | pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d " | 2654 | pr_debug("handling stripe %llu, state=%#lx cnt=%d, pd_idx=%d " |
| @@ -2774,9 +2778,11 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2774 | /* leave prexor set until postxor is done, allows us to distinguish | 2778 | /* leave prexor set until postxor is done, allows us to distinguish |
| 2775 | * a rmw from a rcw during biodrain | 2779 | * a rmw from a rcw during biodrain |
| 2776 | */ | 2780 | */ |
| 2781 | prexor = 0; | ||
| 2777 | if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) && | 2782 | if (test_bit(STRIPE_OP_PREXOR, &sh->ops.complete) && |
| 2778 | test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) { | 2783 | test_bit(STRIPE_OP_POSTXOR, &sh->ops.complete)) { |
| 2779 | 2784 | ||
| 2785 | prexor = 1; | ||
| 2780 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete); | 2786 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.complete); |
| 2781 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack); | 2787 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.ack); |
| 2782 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending); | 2788 | clear_bit(STRIPE_OP_PREXOR, &sh->ops.pending); |
| @@ -2810,6 +2816,8 @@ static void handle_stripe5(struct stripe_head *sh) | |||
| 2810 | if (!test_and_set_bit( | 2816 | if (!test_and_set_bit( |
| 2811 | STRIPE_OP_IO, &sh->ops.pending)) | 2817 | STRIPE_OP_IO, &sh->ops.pending)) |
| 2812 | sh->ops.count++; | 2818 | sh->ops.count++; |
| 2819 | if (prexor) | ||
| 2820 | continue; | ||
| 2813 | if (!test_bit(R5_Insync, &dev->flags) || | 2821 | if (!test_bit(R5_Insync, &dev->flags) || |
| 2814 | (i == sh->pd_idx && s.failed == 0)) | 2822 | (i == sh->pd_idx && s.failed == 0)) |
| 2815 | set_bit(STRIPE_INSYNC, &sh->state); | 2823 | set_bit(STRIPE_INSYNC, &sh->state); |
diff --git a/drivers/media/Makefile b/drivers/media/Makefile index cc11c4c0e7e7..09a829d8a7e7 100644 --- a/drivers/media/Makefile +++ b/drivers/media/Makefile | |||
| @@ -2,12 +2,7 @@ | |||
| 2 | # Makefile for the kernel multimedia device drivers. | 2 | # Makefile for the kernel multimedia device drivers. |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y := common/ | 5 | obj-y += common/ video/ |
| 6 | |||
| 7 | obj-$(CONFIG_VIDEO_MEDIA) += common/ | ||
| 8 | |||
| 9 | # Since hybrid devices are here, should be compiled if DVB and/or V4L | ||
| 10 | obj-$(CONFIG_VIDEO_MEDIA) += video/ | ||
| 11 | 6 | ||
| 12 | obj-$(CONFIG_VIDEO_DEV) += radio/ | 7 | obj-$(CONFIG_VIDEO_DEV) += radio/ |
| 13 | obj-$(CONFIG_DVB_CORE) += dvb/ | 8 | obj-$(CONFIG_DVB_CORE) += dvb/ |
diff --git a/drivers/media/common/tuners/Kconfig b/drivers/media/common/tuners/Kconfig index d6206540476b..85482960d012 100644 --- a/drivers/media/common/tuners/Kconfig +++ b/drivers/media/common/tuners/Kconfig | |||
| @@ -21,6 +21,7 @@ config MEDIA_TUNER | |||
| 21 | tristate | 21 | tristate |
| 22 | default VIDEO_MEDIA && I2C | 22 | default VIDEO_MEDIA && I2C |
| 23 | depends on VIDEO_MEDIA && I2C | 23 | depends on VIDEO_MEDIA && I2C |
| 24 | select FW_LOADER if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG | ||
| 24 | select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG | 25 | select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG |
| 25 | select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG | 26 | select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG |
| 26 | select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMIZE | 27 | select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMIZE |
diff --git a/drivers/media/common/tuners/mxl5005s.c b/drivers/media/common/tuners/mxl5005s.c index 5d05b5390f66..0dc2bef9f6a3 100644 --- a/drivers/media/common/tuners/mxl5005s.c +++ b/drivers/media/common/tuners/mxl5005s.c | |||
| @@ -101,7 +101,7 @@ enum { | |||
| 101 | MXL_QAM, | 101 | MXL_QAM, |
| 102 | MXL_ANALOG_CABLE, | 102 | MXL_ANALOG_CABLE, |
| 103 | MXL_ANALOG_OTA | 103 | MXL_ANALOG_OTA |
| 104 | } tuner_modu_type; | 104 | }; |
| 105 | 105 | ||
| 106 | /* MXL5005 Tuner Register Struct */ | 106 | /* MXL5005 Tuner Register Struct */ |
| 107 | struct TunerReg { | 107 | struct TunerReg { |
| @@ -194,7 +194,7 @@ enum { | |||
| 194 | RFSYN_DIVM, /* 88 */ | 194 | RFSYN_DIVM, /* 88 */ |
| 195 | DN_BYPASS_AGC_I2C /* 89 */ | 195 | DN_BYPASS_AGC_I2C /* 89 */ |
| 196 | #endif | 196 | #endif |
| 197 | } MXL5005_ControlName; | 197 | }; |
| 198 | 198 | ||
| 199 | /* | 199 | /* |
| 200 | * The following context is source code provided by MaxLinear. | 200 | * The following context is source code provided by MaxLinear. |
diff --git a/drivers/media/common/tuners/tda18271-common.c b/drivers/media/common/tuners/tda18271-common.c index 42b5f5d4bfe6..f1894fec32b9 100644 --- a/drivers/media/common/tuners/tda18271-common.c +++ b/drivers/media/common/tuners/tda18271-common.c | |||
| @@ -648,11 +648,11 @@ int tda18271_calc_rf_cal(struct dvb_frontend *fe, u32 *freq) | |||
| 648 | unsigned char *regs = priv->tda18271_regs; | 648 | unsigned char *regs = priv->tda18271_regs; |
| 649 | u8 val; | 649 | u8 val; |
| 650 | 650 | ||
| 651 | tda18271_lookup_map(fe, RF_CAL, freq, &val); | 651 | int ret = tda18271_lookup_map(fe, RF_CAL, freq, &val); |
| 652 | 652 | ||
| 653 | regs[R_EB14] = val; | 653 | regs[R_EB14] = val; |
| 654 | 654 | ||
| 655 | return 0; | 655 | return ret; |
| 656 | } | 656 | } |
| 657 | 657 | ||
| 658 | /* | 658 | /* |
diff --git a/drivers/media/common/tuners/tda827x.c b/drivers/media/common/tuners/tda827x.c index d30d2c9094d9..8555d9cf9051 100644 --- a/drivers/media/common/tuners/tda827x.c +++ b/drivers/media/common/tuners/tda827x.c | |||
| @@ -418,13 +418,13 @@ static void tda827xa_lna_gain(struct dvb_frontend *fe, int high, | |||
| 418 | unsigned char buf[] = {0x22, 0x01}; | 418 | unsigned char buf[] = {0x22, 0x01}; |
| 419 | int arg; | 419 | int arg; |
| 420 | int gp_func; | 420 | int gp_func; |
| 421 | struct i2c_msg msg = { .addr = priv->cfg->switch_addr, .flags = 0, | 421 | struct i2c_msg msg = { .flags = 0, .buf = buf, .len = sizeof(buf) }; |
| 422 | .buf = buf, .len = sizeof(buf) }; | ||
| 423 | 422 | ||
| 424 | if (NULL == priv->cfg) { | 423 | if (NULL == priv->cfg) { |
| 425 | dprintk("tda827x_config not defined, cannot set LNA gain!\n"); | 424 | dprintk("tda827x_config not defined, cannot set LNA gain!\n"); |
| 426 | return; | 425 | return; |
| 427 | } | 426 | } |
| 427 | msg.addr = priv->cfg->switch_addr; | ||
| 428 | if (priv->cfg->config) { | 428 | if (priv->cfg->config) { |
| 429 | if (high) | 429 | if (high) |
| 430 | dprintk("setting LNA to high gain\n"); | 430 | dprintk("setting LNA to high gain\n"); |
diff --git a/drivers/media/common/tuners/tea5761.c b/drivers/media/common/tuners/tea5761.c index b93cdef9ac73..b23dadeecd05 100644 --- a/drivers/media/common/tuners/tea5761.c +++ b/drivers/media/common/tuners/tea5761.c | |||
| @@ -295,7 +295,7 @@ struct dvb_frontend *tea5761_attach(struct dvb_frontend *fe, | |||
| 295 | { | 295 | { |
| 296 | struct tea5761_priv *priv = NULL; | 296 | struct tea5761_priv *priv = NULL; |
| 297 | 297 | ||
| 298 | if (tea5761_autodetection(i2c_adap, i2c_addr) == EINVAL) | 298 | if (tea5761_autodetection(i2c_adap, i2c_addr) != 0) |
| 299 | return NULL; | 299 | return NULL; |
| 300 | 300 | ||
| 301 | priv = kzalloc(sizeof(struct tea5761_priv), GFP_KERNEL); | 301 | priv = kzalloc(sizeof(struct tea5761_priv), GFP_KERNEL); |
diff --git a/drivers/media/common/tuners/tuner-i2c.h b/drivers/media/common/tuners/tuner-i2c.h index 3ad6c8e0b04c..cb1c7141f0c6 100644 --- a/drivers/media/common/tuners/tuner-i2c.h +++ b/drivers/media/common/tuners/tuner-i2c.h | |||
| @@ -170,4 +170,12 @@ __fail: \ | |||
| 170 | __ret; \ | 170 | __ret; \ |
| 171 | }) | 171 | }) |
| 172 | 172 | ||
| 173 | #define hybrid_tuner_report_instance_count(state) \ | ||
| 174 | ({ \ | ||
| 175 | int __ret = 0; \ | ||
| 176 | if (state) \ | ||
| 177 | __ret = state->i2c_props.count; \ | ||
| 178 | __ret; \ | ||
| 179 | }) | ||
| 180 | |||
| 173 | #endif /* __TUNER_I2C_H__ */ | 181 | #endif /* __TUNER_I2C_H__ */ |
diff --git a/drivers/media/common/tuners/tuner-simple.c b/drivers/media/common/tuners/tuner-simple.c index be8d903171b7..266c255cf0d8 100644 --- a/drivers/media/common/tuners/tuner-simple.c +++ b/drivers/media/common/tuners/tuner-simple.c | |||
| @@ -1018,8 +1018,10 @@ struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe, | |||
| 1018 | fe->ops.i2c_gate_ctrl(fe, 1); | 1018 | fe->ops.i2c_gate_ctrl(fe, 1); |
| 1019 | 1019 | ||
| 1020 | if (1 != i2c_transfer(i2c_adap, &msg, 1)) | 1020 | if (1 != i2c_transfer(i2c_adap, &msg, 1)) |
| 1021 | tuner_warn("unable to probe %s, proceeding anyway.", | 1021 | printk(KERN_WARNING "tuner-simple %d-%04x: " |
| 1022 | tuners[type].name); | 1022 | "unable to probe %s, proceeding anyway.", |
| 1023 | i2c_adapter_id(i2c_adap), i2c_addr, | ||
| 1024 | tuners[type].name); | ||
| 1023 | 1025 | ||
| 1024 | if (fe->ops.i2c_gate_ctrl) | 1026 | if (fe->ops.i2c_gate_ctrl) |
| 1025 | fe->ops.i2c_gate_ctrl(fe, 0); | 1027 | fe->ops.i2c_gate_ctrl(fe, 0); |
diff --git a/drivers/media/common/tuners/tuner-xc2028.c b/drivers/media/common/tuners/tuner-xc2028.c index 9e9003cffc7f..0cbde17bfbb7 100644 --- a/drivers/media/common/tuners/tuner-xc2028.c +++ b/drivers/media/common/tuners/tuner-xc2028.c | |||
| @@ -46,7 +46,7 @@ module_param_string(firmware_name, firmware_name, sizeof(firmware_name), 0); | |||
| 46 | MODULE_PARM_DESC(firmware_name, "Firmware file name. Allows overriding the " | 46 | MODULE_PARM_DESC(firmware_name, "Firmware file name. Allows overriding the " |
| 47 | "default firmware name\n"); | 47 | "default firmware name\n"); |
| 48 | 48 | ||
| 49 | static LIST_HEAD(xc2028_list); | 49 | static LIST_HEAD(hybrid_tuner_instance_list); |
| 50 | static DEFINE_MUTEX(xc2028_list_mutex); | 50 | static DEFINE_MUTEX(xc2028_list_mutex); |
| 51 | 51 | ||
| 52 | /* struct for storing firmware table */ | 52 | /* struct for storing firmware table */ |
| @@ -68,12 +68,11 @@ struct firmware_properties { | |||
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | struct xc2028_data { | 70 | struct xc2028_data { |
| 71 | struct list_head xc2028_list; | 71 | struct list_head hybrid_tuner_instance_list; |
| 72 | struct tuner_i2c_props i2c_props; | 72 | struct tuner_i2c_props i2c_props; |
| 73 | int (*tuner_callback) (void *dev, | 73 | int (*tuner_callback) (void *dev, |
| 74 | int command, int arg); | 74 | int command, int arg); |
| 75 | void *video_dev; | 75 | void *video_dev; |
| 76 | int count; | ||
| 77 | __u32 frequency; | 76 | __u32 frequency; |
| 78 | 77 | ||
| 79 | struct firmware_description *firm; | 78 | struct firmware_description *firm; |
| @@ -1072,20 +1071,19 @@ static int xc2028_dvb_release(struct dvb_frontend *fe) | |||
| 1072 | 1071 | ||
| 1073 | mutex_lock(&xc2028_list_mutex); | 1072 | mutex_lock(&xc2028_list_mutex); |
| 1074 | 1073 | ||
| 1075 | priv->count--; | 1074 | /* only perform final cleanup if this is the last instance */ |
| 1076 | 1075 | if (hybrid_tuner_report_instance_count(priv) == 1) { | |
| 1077 | if (!priv->count) { | ||
| 1078 | list_del(&priv->xc2028_list); | ||
| 1079 | |||
| 1080 | kfree(priv->ctrl.fname); | 1076 | kfree(priv->ctrl.fname); |
| 1081 | |||
| 1082 | free_firmware(priv); | 1077 | free_firmware(priv); |
| 1083 | kfree(priv); | ||
| 1084 | fe->tuner_priv = NULL; | ||
| 1085 | } | 1078 | } |
| 1086 | 1079 | ||
| 1080 | if (priv) | ||
| 1081 | hybrid_tuner_release_state(priv); | ||
| 1082 | |||
| 1087 | mutex_unlock(&xc2028_list_mutex); | 1083 | mutex_unlock(&xc2028_list_mutex); |
| 1088 | 1084 | ||
| 1085 | fe->tuner_priv = NULL; | ||
| 1086 | |||
| 1089 | return 0; | 1087 | return 0; |
| 1090 | } | 1088 | } |
| 1091 | 1089 | ||
| @@ -1150,7 +1148,7 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, | |||
| 1150 | struct xc2028_config *cfg) | 1148 | struct xc2028_config *cfg) |
| 1151 | { | 1149 | { |
| 1152 | struct xc2028_data *priv; | 1150 | struct xc2028_data *priv; |
| 1153 | void *video_dev; | 1151 | int instance; |
| 1154 | 1152 | ||
| 1155 | if (debug) | 1153 | if (debug) |
| 1156 | printk(KERN_DEBUG "xc2028: Xcv2028/3028 init called!\n"); | 1154 | printk(KERN_DEBUG "xc2028: Xcv2028/3028 init called!\n"); |
| @@ -1163,48 +1161,40 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, | |||
| 1163 | return NULL; | 1161 | return NULL; |
| 1164 | } | 1162 | } |
| 1165 | 1163 | ||
| 1166 | video_dev = cfg->i2c_adap->algo_data; | ||
| 1167 | |||
| 1168 | if (debug) | ||
| 1169 | printk(KERN_DEBUG "xc2028: video_dev =%p\n", video_dev); | ||
| 1170 | |||
| 1171 | mutex_lock(&xc2028_list_mutex); | 1164 | mutex_lock(&xc2028_list_mutex); |
| 1172 | 1165 | ||
| 1173 | list_for_each_entry(priv, &xc2028_list, xc2028_list) { | 1166 | instance = hybrid_tuner_request_state(struct xc2028_data, priv, |
| 1174 | if (&priv->i2c_props.adap->dev == &cfg->i2c_adap->dev) { | 1167 | hybrid_tuner_instance_list, |
| 1175 | video_dev = NULL; | 1168 | cfg->i2c_adap, cfg->i2c_addr, |
| 1176 | if (debug) | 1169 | "xc2028"); |
| 1177 | printk(KERN_DEBUG "xc2028: reusing device\n"); | 1170 | switch (instance) { |
| 1178 | 1171 | case 0: | |
| 1179 | break; | 1172 | /* memory allocation failure */ |
| 1180 | } | 1173 | goto fail; |
| 1181 | } | 1174 | break; |
| 1182 | 1175 | case 1: | |
| 1183 | if (video_dev) { | 1176 | /* new tuner instance */ |
| 1184 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
| 1185 | if (priv == NULL) { | ||
| 1186 | mutex_unlock(&xc2028_list_mutex); | ||
| 1187 | return NULL; | ||
| 1188 | } | ||
| 1189 | |||
| 1190 | priv->i2c_props.addr = cfg->i2c_addr; | ||
| 1191 | priv->i2c_props.adap = cfg->i2c_adap; | ||
| 1192 | priv->i2c_props.name = "xc2028"; | ||
| 1193 | |||
| 1194 | priv->video_dev = video_dev; | ||
| 1195 | priv->tuner_callback = cfg->callback; | 1177 | priv->tuner_callback = cfg->callback; |
| 1196 | priv->ctrl.max_len = 13; | 1178 | priv->ctrl.max_len = 13; |
| 1197 | 1179 | ||
| 1198 | mutex_init(&priv->lock); | 1180 | mutex_init(&priv->lock); |
| 1199 | 1181 | ||
| 1200 | list_add_tail(&priv->xc2028_list, &xc2028_list); | 1182 | /* analog side (tuner-core) uses i2c_adap->algo_data. |
| 1201 | } | 1183 | * digital side is not guaranteed to have algo_data defined. |
| 1202 | 1184 | * | |
| 1203 | fe->tuner_priv = priv; | 1185 | * digital side will always have fe->dvb defined. |
| 1204 | priv->count++; | 1186 | * analog side (tuner-core) doesn't (yet) define fe->dvb. |
| 1187 | */ | ||
| 1188 | priv->video_dev = ((fe->dvb) && (fe->dvb->priv)) ? | ||
| 1189 | fe->dvb->priv : cfg->i2c_adap->algo_data; | ||
| 1205 | 1190 | ||
| 1206 | if (debug) | 1191 | fe->tuner_priv = priv; |
| 1207 | printk(KERN_DEBUG "xc2028: usage count is %i\n", priv->count); | 1192 | break; |
| 1193 | case 2: | ||
| 1194 | /* existing tuner instance */ | ||
| 1195 | fe->tuner_priv = priv; | ||
| 1196 | break; | ||
| 1197 | } | ||
| 1208 | 1198 | ||
| 1209 | memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops, | 1199 | memcpy(&fe->ops.tuner_ops, &xc2028_dvb_tuner_ops, |
| 1210 | sizeof(xc2028_dvb_tuner_ops)); | 1200 | sizeof(xc2028_dvb_tuner_ops)); |
| @@ -1217,6 +1207,11 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, | |||
| 1217 | mutex_unlock(&xc2028_list_mutex); | 1207 | mutex_unlock(&xc2028_list_mutex); |
| 1218 | 1208 | ||
| 1219 | return fe; | 1209 | return fe; |
| 1210 | fail: | ||
| 1211 | mutex_unlock(&xc2028_list_mutex); | ||
| 1212 | |||
| 1213 | xc2028_dvb_release(fe); | ||
| 1214 | return NULL; | ||
| 1220 | } | 1215 | } |
| 1221 | 1216 | ||
| 1222 | EXPORT_SYMBOL(xc2028_attach); | 1217 | EXPORT_SYMBOL(xc2028_attach); |
diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c index 449fb5c3d0b1..ae0d76a5d51d 100644 --- a/drivers/media/dvb/b2c2/flexcop-usb.c +++ b/drivers/media/dvb/b2c2/flexcop-usb.c | |||
| @@ -379,7 +379,7 @@ static void flexcop_usb_transfer_exit(struct flexcop_usb *fc_usb) | |||
| 379 | 379 | ||
| 380 | static int flexcop_usb_transfer_init(struct flexcop_usb *fc_usb) | 380 | static int flexcop_usb_transfer_init(struct flexcop_usb *fc_usb) |
| 381 | { | 381 | { |
| 382 | u16 frame_size = fc_usb->uintf->cur_altsetting->endpoint[0].desc.wMaxPacketSize; | 382 | u16 frame_size = le16_to_cpu(fc_usb->uintf->cur_altsetting->endpoint[0].desc.wMaxPacketSize); |
| 383 | int bufsize = B2C2_USB_NUM_ISO_URB * B2C2_USB_FRAMES_PER_ISO * frame_size,i,j,ret; | 383 | int bufsize = B2C2_USB_NUM_ISO_URB * B2C2_USB_FRAMES_PER_ISO * frame_size,i,j,ret; |
| 384 | int buffer_offset = 0; | 384 | int buffer_offset = 0; |
| 385 | 385 | ||
diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c index f5010e8671b8..a824f3719f81 100644 --- a/drivers/media/dvb/cinergyT2/cinergyT2.c +++ b/drivers/media/dvb/cinergyT2/cinergyT2.c | |||
| @@ -82,22 +82,22 @@ enum cinergyt2_ep1_cmd { | |||
| 82 | 82 | ||
| 83 | struct dvbt_set_parameters_msg { | 83 | struct dvbt_set_parameters_msg { |
| 84 | uint8_t cmd; | 84 | uint8_t cmd; |
| 85 | uint32_t freq; | 85 | __le32 freq; |
| 86 | uint8_t bandwidth; | 86 | uint8_t bandwidth; |
| 87 | uint16_t tps; | 87 | __le16 tps; |
| 88 | uint8_t flags; | 88 | uint8_t flags; |
| 89 | } __attribute__((packed)); | 89 | } __attribute__((packed)); |
| 90 | 90 | ||
| 91 | struct dvbt_get_status_msg { | 91 | struct dvbt_get_status_msg { |
| 92 | uint32_t freq; | 92 | __le32 freq; |
| 93 | uint8_t bandwidth; | 93 | uint8_t bandwidth; |
| 94 | uint16_t tps; | 94 | __le16 tps; |
| 95 | uint8_t flags; | 95 | uint8_t flags; |
| 96 | uint16_t gain; | 96 | __le16 gain; |
| 97 | uint8_t snr; | 97 | uint8_t snr; |
| 98 | uint32_t viterbi_error_rate; | 98 | __le32 viterbi_error_rate; |
| 99 | uint32_t rs_error_rate; | 99 | __le32 rs_error_rate; |
| 100 | uint32_t uncorrected_block_count; | 100 | __le32 uncorrected_block_count; |
| 101 | uint8_t lock_bits; | 101 | uint8_t lock_bits; |
| 102 | uint8_t prev_lock_bits; | 102 | uint8_t prev_lock_bits; |
| 103 | } __attribute__((packed)); | 103 | } __attribute__((packed)); |
| @@ -136,6 +136,7 @@ struct cinergyt2 { | |||
| 136 | wait_queue_head_t poll_wq; | 136 | wait_queue_head_t poll_wq; |
| 137 | int pending_fe_events; | 137 | int pending_fe_events; |
| 138 | int disconnect_pending; | 138 | int disconnect_pending; |
| 139 | unsigned int uncorrected_block_count; | ||
| 139 | atomic_t inuse; | 140 | atomic_t inuse; |
| 140 | 141 | ||
| 141 | void *streambuf; | 142 | void *streambuf; |
| @@ -147,7 +148,7 @@ struct cinergyt2 { | |||
| 147 | char phys[64]; | 148 | char phys[64]; |
| 148 | struct delayed_work rc_query_work; | 149 | struct delayed_work rc_query_work; |
| 149 | int rc_input_event; | 150 | int rc_input_event; |
| 150 | u32 rc_last_code; | 151 | __le32 rc_last_code; |
| 151 | unsigned long last_event_jiffies; | 152 | unsigned long last_event_jiffies; |
| 152 | #endif | 153 | #endif |
| 153 | }; | 154 | }; |
| @@ -160,7 +161,7 @@ enum { | |||
| 160 | 161 | ||
| 161 | struct cinergyt2_rc_event { | 162 | struct cinergyt2_rc_event { |
| 162 | char type; | 163 | char type; |
| 163 | uint32_t value; | 164 | __le32 value; |
| 164 | } __attribute__((packed)); | 165 | } __attribute__((packed)); |
| 165 | 166 | ||
| 166 | static const uint32_t rc_keys[] = { | 167 | static const uint32_t rc_keys[] = { |
| @@ -619,8 +620,11 @@ static int cinergyt2_ioctl (struct inode *inode, struct file *file, | |||
| 619 | { | 620 | { |
| 620 | uint32_t unc_count; | 621 | uint32_t unc_count; |
| 621 | 622 | ||
| 622 | unc_count = stat->uncorrected_block_count; | 623 | if (mutex_lock_interruptible(&cinergyt2->sem)) |
| 623 | stat->uncorrected_block_count = 0; | 624 | return -ERESTARTSYS; |
| 625 | unc_count = cinergyt2->uncorrected_block_count; | ||
| 626 | cinergyt2->uncorrected_block_count = 0; | ||
| 627 | mutex_unlock(&cinergyt2->sem); | ||
| 624 | 628 | ||
| 625 | /* UNC are already converted to host byte order... */ | 629 | /* UNC are already converted to host byte order... */ |
| 626 | return put_user(unc_count,(__u32 __user *) arg); | 630 | return put_user(unc_count,(__u32 __user *) arg); |
| @@ -769,7 +773,7 @@ static void cinergyt2_query_rc (struct work_struct *work) | |||
| 769 | input_sync(cinergyt2->rc_input_dev); | 773 | input_sync(cinergyt2->rc_input_dev); |
| 770 | cinergyt2->rc_input_event = KEY_MAX; | 774 | cinergyt2->rc_input_event = KEY_MAX; |
| 771 | } | 775 | } |
| 772 | cinergyt2->rc_last_code = ~0; | 776 | cinergyt2->rc_last_code = cpu_to_le32(~0); |
| 773 | } | 777 | } |
| 774 | goto out; | 778 | goto out; |
| 775 | } | 779 | } |
| @@ -780,7 +784,7 @@ static void cinergyt2_query_rc (struct work_struct *work) | |||
| 780 | n, le32_to_cpu(rc_events[n].value), rc_events[n].type); | 784 | n, le32_to_cpu(rc_events[n].value), rc_events[n].type); |
| 781 | 785 | ||
| 782 | if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC && | 786 | if (rc_events[n].type == CINERGYT2_RC_EVENT_TYPE_NEC && |
| 783 | rc_events[n].value == ~0) { | 787 | rc_events[n].value == cpu_to_le32(~0)) { |
| 784 | /* keyrepeat bit -> just repeat last rc_input_event */ | 788 | /* keyrepeat bit -> just repeat last rc_input_event */ |
| 785 | } else { | 789 | } else { |
| 786 | cinergyt2->rc_input_event = KEY_MAX; | 790 | cinergyt2->rc_input_event = KEY_MAX; |
| @@ -795,7 +799,7 @@ static void cinergyt2_query_rc (struct work_struct *work) | |||
| 795 | 799 | ||
| 796 | if (cinergyt2->rc_input_event != KEY_MAX) { | 800 | if (cinergyt2->rc_input_event != KEY_MAX) { |
| 797 | if (rc_events[n].value == cinergyt2->rc_last_code && | 801 | if (rc_events[n].value == cinergyt2->rc_last_code && |
| 798 | cinergyt2->rc_last_code != ~0) { | 802 | cinergyt2->rc_last_code != cpu_to_le32(~0)) { |
| 799 | /* emit a key-up so the double event is recognized */ | 803 | /* emit a key-up so the double event is recognized */ |
| 800 | dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event); | 804 | dprintk(1, "rc_input_event=%d UP\n", cinergyt2->rc_input_event); |
| 801 | input_report_key(cinergyt2->rc_input_dev, | 805 | input_report_key(cinergyt2->rc_input_dev, |
| @@ -829,7 +833,7 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) | |||
| 829 | usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys)); | 833 | usb_make_path(cinergyt2->udev, cinergyt2->phys, sizeof(cinergyt2->phys)); |
| 830 | strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys)); | 834 | strlcat(cinergyt2->phys, "/input0", sizeof(cinergyt2->phys)); |
| 831 | cinergyt2->rc_input_event = KEY_MAX; | 835 | cinergyt2->rc_input_event = KEY_MAX; |
| 832 | cinergyt2->rc_last_code = ~0; | 836 | cinergyt2->rc_last_code = cpu_to_le32(~0); |
| 833 | INIT_DELAYED_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc); | 837 | INIT_DELAYED_WORK(&cinergyt2->rc_query_work, cinergyt2_query_rc); |
| 834 | 838 | ||
| 835 | input_dev->name = DRIVER_NAME " remote control"; | 839 | input_dev->name = DRIVER_NAME " remote control"; |
| @@ -840,8 +844,8 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) | |||
| 840 | input_dev->keycodesize = 0; | 844 | input_dev->keycodesize = 0; |
| 841 | input_dev->keycodemax = 0; | 845 | input_dev->keycodemax = 0; |
| 842 | input_dev->id.bustype = BUS_USB; | 846 | input_dev->id.bustype = BUS_USB; |
| 843 | input_dev->id.vendor = cinergyt2->udev->descriptor.idVendor; | 847 | input_dev->id.vendor = le16_to_cpu(cinergyt2->udev->descriptor.idVendor); |
| 844 | input_dev->id.product = cinergyt2->udev->descriptor.idProduct; | 848 | input_dev->id.product = le16_to_cpu(cinergyt2->udev->descriptor.idProduct); |
| 845 | input_dev->id.version = 1; | 849 | input_dev->id.version = 1; |
| 846 | input_dev->dev.parent = &cinergyt2->udev->dev; | 850 | input_dev->dev.parent = &cinergyt2->udev->dev; |
| 847 | 851 | ||
| @@ -889,18 +893,16 @@ static void cinergyt2_query (struct work_struct *work) | |||
| 889 | char cmd [] = { CINERGYT2_EP1_GET_TUNER_STATUS }; | 893 | char cmd [] = { CINERGYT2_EP1_GET_TUNER_STATUS }; |
| 890 | struct dvbt_get_status_msg *s = &cinergyt2->status; | 894 | struct dvbt_get_status_msg *s = &cinergyt2->status; |
| 891 | uint8_t lock_bits; | 895 | uint8_t lock_bits; |
| 892 | uint32_t unc; | ||
| 893 | 896 | ||
| 894 | if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) | 897 | if (cinergyt2->disconnect_pending || mutex_lock_interruptible(&cinergyt2->sem)) |
| 895 | return; | 898 | return; |
| 896 | 899 | ||
| 897 | unc = s->uncorrected_block_count; | ||
| 898 | lock_bits = s->lock_bits; | 900 | lock_bits = s->lock_bits; |
| 899 | 901 | ||
| 900 | cinergyt2_command(cinergyt2, cmd, sizeof(cmd), (char *) s, sizeof(*s)); | 902 | cinergyt2_command(cinergyt2, cmd, sizeof(cmd), (char *) s, sizeof(*s)); |
| 901 | 903 | ||
| 902 | unc += le32_to_cpu(s->uncorrected_block_count); | 904 | cinergyt2->uncorrected_block_count += |
| 903 | s->uncorrected_block_count = unc; | 905 | le32_to_cpu(s->uncorrected_block_count); |
| 904 | 906 | ||
| 905 | if (lock_bits != s->lock_bits) { | 907 | if (lock_bits != s->lock_bits) { |
| 906 | wake_up_interruptible(&cinergyt2->poll_wq); | 908 | wake_up_interruptible(&cinergyt2->poll_wq); |
diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c index 56d871cfd7fc..c2334aef4143 100644 --- a/drivers/media/dvb/dvb-core/dvb_net.c +++ b/drivers/media/dvb/dvb-core/dvb_net.c | |||
| @@ -168,7 +168,7 @@ struct dvb_net_priv { | |||
| 168 | * stolen from eth.c out of the linux kernel, hacked for dvb-device | 168 | * stolen from eth.c out of the linux kernel, hacked for dvb-device |
| 169 | * by Michael Holzt <kju@debian.org> | 169 | * by Michael Holzt <kju@debian.org> |
| 170 | */ | 170 | */ |
| 171 | static unsigned short dvb_net_eth_type_trans(struct sk_buff *skb, | 171 | static __be16 dvb_net_eth_type_trans(struct sk_buff *skb, |
| 172 | struct net_device *dev) | 172 | struct net_device *dev) |
| 173 | { | 173 | { |
| 174 | struct ethhdr *eth; | 174 | struct ethhdr *eth; |
| @@ -277,10 +277,10 @@ static int handle_one_ule_extension( struct dvb_net_priv *p ) | |||
| 277 | if(ext_len >= 0) { | 277 | if(ext_len >= 0) { |
| 278 | p->ule_next_hdr += ext_len; | 278 | p->ule_next_hdr += ext_len; |
| 279 | if (!p->ule_bridged) { | 279 | if (!p->ule_bridged) { |
| 280 | p->ule_sndu_type = ntohs(*(unsigned short *)p->ule_next_hdr); | 280 | p->ule_sndu_type = ntohs(*(__be16 *)p->ule_next_hdr); |
| 281 | p->ule_next_hdr += 2; | 281 | p->ule_next_hdr += 2; |
| 282 | } else { | 282 | } else { |
| 283 | p->ule_sndu_type = ntohs(*(unsigned short *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN))); | 283 | p->ule_sndu_type = ntohs(*(__be16 *)(p->ule_next_hdr + ((p->ule_dbit ? 2 : 3) * ETH_ALEN))); |
| 284 | /* This assures the extension handling loop will terminate. */ | 284 | /* This assures the extension handling loop will terminate. */ |
| 285 | } | 285 | } |
| 286 | } | 286 | } |
| @@ -294,7 +294,7 @@ static int handle_one_ule_extension( struct dvb_net_priv *p ) | |||
| 294 | if (ule_optional_ext_handlers[htype]) | 294 | if (ule_optional_ext_handlers[htype]) |
| 295 | (void)ule_optional_ext_handlers[htype]( p ); | 295 | (void)ule_optional_ext_handlers[htype]( p ); |
| 296 | p->ule_next_hdr += ext_len; | 296 | p->ule_next_hdr += ext_len; |
| 297 | p->ule_sndu_type = ntohs( *(unsigned short *)(p->ule_next_hdr-2) ); | 297 | p->ule_sndu_type = ntohs( *(__be16 *)(p->ule_next_hdr-2) ); |
| 298 | /* | 298 | /* |
| 299 | * note: the length of the next header type is included in the | 299 | * note: the length of the next header type is included in the |
| 300 | * length of THIS optional extension header | 300 | * length of THIS optional extension header |
| @@ -594,8 +594,8 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) | |||
| 594 | /* Check for complete payload. */ | 594 | /* Check for complete payload. */ |
| 595 | if (priv->ule_sndu_remain <= 0) { | 595 | if (priv->ule_sndu_remain <= 0) { |
| 596 | /* Check CRC32, we've got it in our skb already. */ | 596 | /* Check CRC32, we've got it in our skb already. */ |
| 597 | unsigned short ulen = htons(priv->ule_sndu_len); | 597 | __be16 ulen = htons(priv->ule_sndu_len); |
| 598 | unsigned short utype = htons(priv->ule_sndu_type); | 598 | __be16 utype = htons(priv->ule_sndu_type); |
| 599 | const u8 *tail; | 599 | const u8 *tail; |
| 600 | struct kvec iov[3] = { | 600 | struct kvec iov[3] = { |
| 601 | { &ulen, sizeof ulen }, | 601 | { &ulen, sizeof ulen }, |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index cf4584e48b6d..f00a0eb40420 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config DVB_USB | 1 | config DVB_USB |
| 2 | tristate "Support for various USB DVB devices" | 2 | tristate "Support for various USB DVB devices" |
| 3 | depends on DVB_CORE && USB && I2C | 3 | depends on DVB_CORE && USB && I2C && INPUT |
| 4 | depends on HOTPLUG # due to FW_LOADER | 4 | depends on HOTPLUG # due to FW_LOADER |
| 5 | select FW_LOADER | 5 | select FW_LOADER |
| 6 | help | 6 | help |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index 346223856f59..c4d40fe01d57 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
| @@ -111,8 +111,8 @@ static int bristol_tuner_attach(struct dvb_usb_adapter *adap) | |||
| 111 | struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1); | 111 | struct i2c_adapter *tun_i2c = dib3000mc_get_tuner_i2c_master(adap->fe, 1); |
| 112 | s8 a; | 112 | s8 a; |
| 113 | int if1=1220; | 113 | int if1=1220; |
| 114 | if (adap->dev->udev->descriptor.idVendor == USB_VID_HAUPPAUGE && | 114 | if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) && |
| 115 | adap->dev->udev->descriptor.idProduct == USB_PID_HAUPPAUGE_NOVA_T_500_2) { | 115 | adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_500_2)) { |
| 116 | if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a; | 116 | if (!eeprom_read(prim_i2c,0x59 + adap->id,&a)) if1=1220+a; |
| 117 | } | 117 | } |
| 118 | return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id], | 118 | return dvb_attach(mt2060_attach,adap->fe, tun_i2c,&bristol_mt2060_config[adap->id], |
| @@ -402,8 +402,8 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap) | |||
| 402 | { | 402 | { |
| 403 | struct usb_device_descriptor *desc = &adap->dev->udev->descriptor; | 403 | struct usb_device_descriptor *desc = &adap->dev->udev->descriptor; |
| 404 | 404 | ||
| 405 | if (desc->idVendor == USB_VID_PINNACLE && | 405 | if (desc->idVendor == cpu_to_le16(USB_VID_PINNACLE) && |
| 406 | desc->idProduct == USB_PID_PINNACLE_EXPRESSCARD_320CX) | 406 | desc->idProduct == cpu_to_le16(USB_PID_PINNACLE_EXPRESSCARD_320CX)) |
| 407 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); | 407 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); |
| 408 | else | 408 | else |
| 409 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); | 409 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
| @@ -845,8 +845,8 @@ static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap) | |||
| 845 | struct i2c_adapter *tun_i2c; | 845 | struct i2c_adapter *tun_i2c; |
| 846 | s8 a; | 846 | s8 a; |
| 847 | int if1=1220; | 847 | int if1=1220; |
| 848 | if (adap->dev->udev->descriptor.idVendor == USB_VID_HAUPPAUGE && | 848 | if (adap->dev->udev->descriptor.idVendor == cpu_to_le16(USB_VID_HAUPPAUGE) && |
| 849 | adap->dev->udev->descriptor.idProduct == USB_PID_HAUPPAUGE_NOVA_T_STICK) { | 849 | adap->dev->udev->descriptor.idProduct == cpu_to_le16(USB_PID_HAUPPAUGE_NOVA_T_STICK)) { |
| 850 | if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a; | 850 | if (!eeprom_read(prim_i2c,0x58,&a)) if1=1220+a; |
| 851 | } | 851 | } |
| 852 | if (st->is_dib7000pc) | 852 | if (st->is_dib7000pc) |
| @@ -990,11 +990,12 @@ static struct dib7000p_config dib7070p_dib7000p_config = { | |||
| 990 | /* STK7070P */ | 990 | /* STK7070P */ |
| 991 | static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) | 991 | static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) |
| 992 | { | 992 | { |
| 993 | if (adap->dev->udev->descriptor.idVendor == USB_VID_PINNACLE && | 993 | struct usb_device_descriptor *p = &adap->dev->udev->descriptor; |
| 994 | adap->dev->udev->descriptor.idProduct == USB_PID_PINNACLE_PCTV72E) | 994 | if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) && |
| 995 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); | 995 | p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E)) |
| 996 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); | ||
| 996 | else | 997 | else |
| 997 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); | 998 | dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
| 998 | msleep(10); | 999 | msleep(10); |
| 999 | dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); | 1000 | dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); |
| 1000 | dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); | 1001 | dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c b/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c index e1112e39fb63..733a7ff7b207 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c | |||
| @@ -127,7 +127,7 @@ int dvb_usb_get_hexline(const struct firmware *fw, struct hexline *hx, | |||
| 127 | if ((*pos + hx->len + 4) >= fw->size) | 127 | if ((*pos + hx->len + 4) >= fw->size) |
| 128 | return -EINVAL; | 128 | return -EINVAL; |
| 129 | 129 | ||
| 130 | hx->addr = le16_to_cpu( *((u16 *) &b[1]) ); | 130 | hx->addr = b[1] | (b[2] << 8); |
| 131 | hx->type = b[3]; | 131 | hx->type = b[3]; |
| 132 | 132 | ||
| 133 | if (hx->type == 0x04) { | 133 | if (hx->type == 0x04) { |
diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c index 9a942afaf0af..2653120673b7 100644 --- a/drivers/media/dvb/dvb-usb/gp8psk.c +++ b/drivers/media/dvb/dvb-usb/gp8psk.c | |||
| @@ -146,24 +146,24 @@ static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff) | |||
| 146 | if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) | 146 | if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) |
| 147 | if (! (status & bm8pskFW_Loaded)) /* BCM4500 firmware loaded */ | 147 | if (! (status & bm8pskFW_Loaded)) /* BCM4500 firmware loaded */ |
| 148 | if(gp8psk_load_bcm4500fw(d)) | 148 | if(gp8psk_load_bcm4500fw(d)) |
| 149 | return EINVAL; | 149 | return -EINVAL; |
| 150 | 150 | ||
| 151 | if (! (status & bmIntersilOn)) /* LNB Power */ | 151 | if (! (status & bmIntersilOn)) /* LNB Power */ |
| 152 | if (gp8psk_usb_in_op(d, START_INTERSIL, 1, 0, | 152 | if (gp8psk_usb_in_op(d, START_INTERSIL, 1, 0, |
| 153 | &buf, 1)) | 153 | &buf, 1)) |
| 154 | return EINVAL; | 154 | return -EINVAL; |
| 155 | 155 | ||
| 156 | /* Set DVB mode to 1 */ | 156 | /* Set DVB mode to 1 */ |
| 157 | if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) | 157 | if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) |
| 158 | if (gp8psk_usb_out_op(d, SET_DVB_MODE, 1, 0, NULL, 0)) | 158 | if (gp8psk_usb_out_op(d, SET_DVB_MODE, 1, 0, NULL, 0)) |
| 159 | return EINVAL; | 159 | return -EINVAL; |
| 160 | /* Abort possible TS (if previous tune crashed) */ | 160 | /* Abort possible TS (if previous tune crashed) */ |
| 161 | if (gp8psk_usb_out_op(d, ARM_TRANSFER, 0, 0, NULL, 0)) | 161 | if (gp8psk_usb_out_op(d, ARM_TRANSFER, 0, 0, NULL, 0)) |
| 162 | return EINVAL; | 162 | return -EINVAL; |
| 163 | } else { | 163 | } else { |
| 164 | /* Turn off LNB power */ | 164 | /* Turn off LNB power */ |
| 165 | if (gp8psk_usb_in_op(d, START_INTERSIL, 0, 0, &buf, 1)) | 165 | if (gp8psk_usb_in_op(d, START_INTERSIL, 0, 0, &buf, 1)) |
| 166 | return EINVAL; | 166 | return -EINVAL; |
| 167 | /* Turn off 8psk power */ | 167 | /* Turn off 8psk power */ |
| 168 | if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1)) | 168 | if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1)) |
| 169 | return -EINVAL; | 169 | return -EINVAL; |
diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c index a12e6f784fda..54626a0dbf68 100644 --- a/drivers/media/dvb/dvb-usb/m920x.c +++ b/drivers/media/dvb/dvb-usb/m920x.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include "qt1010.h" | 16 | #include "qt1010.h" |
| 17 | #include "tda1004x.h" | 17 | #include "tda1004x.h" |
| 18 | #include "tda827x.h" | 18 | #include "tda827x.h" |
| 19 | #include <asm/unaligned.h> | ||
| 19 | 20 | ||
| 20 | /* debug */ | 21 | /* debug */ |
| 21 | static int dvb_usb_m920x_debug; | 22 | static int dvb_usb_m920x_debug; |
| @@ -347,13 +348,13 @@ static int m920x_firmware_download(struct usb_device *udev, const struct firmwar | |||
| 347 | 348 | ||
| 348 | for (pass = 0; pass < 2; pass++) { | 349 | for (pass = 0; pass < 2; pass++) { |
| 349 | for (i = 0; i + (sizeof(u16) * 3) < fw->size;) { | 350 | for (i = 0; i + (sizeof(u16) * 3) < fw->size;) { |
| 350 | value = le16_to_cpu(*(u16 *)(fw->data + i)); | 351 | value = get_unaligned_le16(fw->data + i); |
| 351 | i += sizeof(u16); | 352 | i += sizeof(u16); |
| 352 | 353 | ||
| 353 | index = le16_to_cpu(*(u16 *)(fw->data + i)); | 354 | index = get_unaligned_le16(fw->data + i); |
| 354 | i += sizeof(u16); | 355 | i += sizeof(u16); |
| 355 | 356 | ||
| 356 | size = le16_to_cpu(*(u16 *)(fw->data + i)); | 357 | size = get_unaligned_le16(fw->data + i); |
| 357 | i += sizeof(u16); | 358 | i += sizeof(u16); |
| 358 | 359 | ||
| 359 | if (pass == 1) { | 360 | if (pass == 1) { |
diff --git a/drivers/media/dvb/frontends/dib0070.h b/drivers/media/dvb/frontends/dib0070.h index 786e37d33889..3eedfdf505bc 100644 --- a/drivers/media/dvb/frontends/dib0070.h +++ b/drivers/media/dvb/frontends/dib0070.h | |||
| @@ -37,7 +37,20 @@ struct dib0070_config { | |||
| 37 | u8 flip_chip; | 37 | u8 flip_chip; |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | extern struct dvb_frontend * dib0070_attach(struct dvb_frontend *fe, struct i2c_adapter *i2c, struct dib0070_config *cfg); | 40 | #if defined(CONFIG_DVB_TUNER_DIB0070) || (defined(CONFIG_DVB_TUNER_DIB0070_MODULE) && defined(MODULE)) |
| 41 | extern struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, | ||
| 42 | struct i2c_adapter *i2c, | ||
| 43 | struct dib0070_config *cfg); | ||
| 44 | #else | ||
| 45 | static inline struct dvb_frontend *dib0070_attach(struct dvb_frontend *fe, | ||
| 46 | struct i2c_adapter *i2c, | ||
| 47 | struct dib0070_config *cfg) | ||
| 48 | { | ||
| 49 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
| 50 | return NULL; | ||
| 51 | } | ||
| 52 | #endif | ||
| 53 | |||
| 41 | extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, uint8_t open); | 54 | extern void dib0070_ctrl_agc_filter(struct dvb_frontend *, uint8_t open); |
| 42 | extern u16 dib0070_wbd_offset(struct dvb_frontend *); | 55 | extern u16 dib0070_wbd_offset(struct dvb_frontend *); |
| 43 | 56 | ||
diff --git a/drivers/media/dvb/frontends/dib7000p.h b/drivers/media/dvb/frontends/dib7000p.h index 081bd81f3da2..07c4d12ed5b7 100644 --- a/drivers/media/dvb/frontends/dib7000p.h +++ b/drivers/media/dvb/frontends/dib7000p.h | |||
| @@ -37,7 +37,20 @@ struct dib7000p_config { | |||
| 37 | 37 | ||
| 38 | #define DEFAULT_DIB7000P_I2C_ADDRESS 18 | 38 | #define DEFAULT_DIB7000P_I2C_ADDRESS 18 |
| 39 | 39 | ||
| 40 | extern struct dvb_frontend * dib7000p_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg); | 40 | #if defined(CONFIG_DVB_DIB7000P) || (defined(CONFIG_DVB_DIB7000P_MODULE) && defined(MODULE)) |
| 41 | extern struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, | ||
| 42 | u8 i2c_addr, | ||
| 43 | struct dib7000p_config *cfg); | ||
| 44 | #else | ||
| 45 | static inline struct dvb_frontend *dib7000p_attach(struct i2c_adapter *i2c_adap, | ||
| 46 | u8 i2c_addr, | ||
| 47 | struct dib7000p_config *cfg) | ||
| 48 | { | ||
| 49 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
| 50 | return NULL; | ||
| 51 | } | ||
| 52 | #endif | ||
| 53 | |||
| 41 | extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]); | 54 | extern int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[]); |
| 42 | 55 | ||
| 43 | extern struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *, enum dibx000_i2c_interface, int); | 56 | extern struct i2c_adapter * dib7000p_get_i2c_master(struct dvb_frontend *, enum dibx000_i2c_interface, int); |
diff --git a/drivers/media/dvb/frontends/or51132.c b/drivers/media/dvb/frontends/or51132.c index c7b5785f81f2..5ed32544de39 100644 --- a/drivers/media/dvb/frontends/or51132.c +++ b/drivers/media/dvb/frontends/or51132.c | |||
| @@ -126,7 +126,7 @@ static int or51132_readreg(struct or51132_state *state, u8 reg) | |||
| 126 | reg, err); | 126 | reg, err); |
| 127 | return -EREMOTEIO; | 127 | return -EREMOTEIO; |
| 128 | } | 128 | } |
| 129 | return le16_to_cpup((u16*)buf); | 129 | return buf[0] | (buf[1] << 8); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware *fw) | 132 | static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware *fw) |
| @@ -140,9 +140,9 @@ static int or51132_load_firmware (struct dvb_frontend* fe, const struct firmware | |||
| 140 | dprintk("Firmware is %Zd bytes\n",fw->size); | 140 | dprintk("Firmware is %Zd bytes\n",fw->size); |
| 141 | 141 | ||
| 142 | /* Get size of firmware A and B */ | 142 | /* Get size of firmware A and B */ |
| 143 | firmwareAsize = le32_to_cpu(*((u32*)fw->data)); | 143 | firmwareAsize = le32_to_cpu(*((__le32*)fw->data)); |
| 144 | dprintk("FirmwareA is %i bytes\n",firmwareAsize); | 144 | dprintk("FirmwareA is %i bytes\n",firmwareAsize); |
| 145 | firmwareBsize = le32_to_cpu(*((u32*)(fw->data+4))); | 145 | firmwareBsize = le32_to_cpu(*((__le32*)(fw->data+4))); |
| 146 | dprintk("FirmwareB is %i bytes\n",firmwareBsize); | 146 | dprintk("FirmwareB is %i bytes\n",firmwareBsize); |
| 147 | 147 | ||
| 148 | /* Upload firmware */ | 148 | /* Upload firmware */ |
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 747e7f1a6267..f05d43d8b5cf 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c | |||
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <linux/crc32.h> | 51 | #include <linux/crc32.h> |
| 52 | #include <linux/i2c.h> | 52 | #include <linux/i2c.h> |
| 53 | #include <linux/kthread.h> | 53 | #include <linux/kthread.h> |
| 54 | #include <asm/unaligned.h> | ||
| 54 | 55 | ||
| 55 | #include <asm/system.h> | 56 | #include <asm/system.h> |
| 56 | 57 | ||
| @@ -1461,9 +1462,9 @@ static int check_firmware(struct av7110* av7110) | |||
| 1461 | ptr += 4; | 1462 | ptr += 4; |
| 1462 | 1463 | ||
| 1463 | /* check dpram file */ | 1464 | /* check dpram file */ |
| 1464 | crc = ntohl(*(u32*) ptr); | 1465 | crc = get_unaligned_be32(ptr); |
| 1465 | ptr += 4; | 1466 | ptr += 4; |
| 1466 | len = ntohl(*(u32*) ptr); | 1467 | len = get_unaligned_be32(ptr); |
| 1467 | ptr += 4; | 1468 | ptr += 4; |
| 1468 | if (len >= 512) { | 1469 | if (len >= 512) { |
| 1469 | printk("dvb-ttpci: dpram file is way too big.\n"); | 1470 | printk("dvb-ttpci: dpram file is way too big.\n"); |
| @@ -1478,9 +1479,9 @@ static int check_firmware(struct av7110* av7110) | |||
| 1478 | ptr += len; | 1479 | ptr += len; |
| 1479 | 1480 | ||
| 1480 | /* check root file */ | 1481 | /* check root file */ |
| 1481 | crc = ntohl(*(u32*) ptr); | 1482 | crc = get_unaligned_be32(ptr); |
| 1482 | ptr += 4; | 1483 | ptr += 4; |
| 1483 | len = ntohl(*(u32*) ptr); | 1484 | len = get_unaligned_be32(ptr); |
| 1484 | ptr += 4; | 1485 | ptr += 4; |
| 1485 | 1486 | ||
| 1486 | if (len <= 200000 || len >= 300000 || | 1487 | if (len <= 200000 || len >= 300000 || |
diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c index 3e6b650fbb81..ec55a968f204 100644 --- a/drivers/media/dvb/ttpci/av7110_av.c +++ b/drivers/media/dvb/ttpci/av7110_av.c | |||
| @@ -965,8 +965,9 @@ static u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x | |||
| 965 | 965 | ||
| 966 | static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len, int nonblock) | 966 | static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len, int nonblock) |
| 967 | { | 967 | { |
| 968 | int i, n; | 968 | unsigned i, n; |
| 969 | int progressive = 0; | 969 | int progressive = 0; |
| 970 | int match = 0; | ||
| 970 | 971 | ||
| 971 | dprintk(2, "av7110:%p, \n", av7110); | 972 | dprintk(2, "av7110:%p, \n", av7110); |
| 972 | 973 | ||
| @@ -975,12 +976,31 @@ static int play_iframe(struct av7110 *av7110, char __user *buf, unsigned int len | |||
| 975 | return -EBUSY; | 976 | return -EBUSY; |
| 976 | } | 977 | } |
| 977 | 978 | ||
| 978 | for (i = 0; i < len - 5; i++) { | 979 | /* search in buf for instances of 00 00 01 b5 1? */ |
| 979 | /* get progressive flag from picture extension */ | 980 | for (i = 0; i < len; i++) { |
| 980 | if (buf[i] == 0x00 && buf[i+1] == 0x00 && | 981 | unsigned char c; |
| 981 | buf[i+2] == 0x01 && (unsigned char)buf[i+3] == 0xb5 && | 982 | if (get_user(c, buf + i)) |
| 982 | (buf[i+4] & 0xf0) == 0x10) | 983 | return -EFAULT; |
| 983 | progressive = buf[i+5] & 0x08; | 984 | if (match == 5) { |
| 985 | progressive = c & 0x08; | ||
| 986 | match = 0; | ||
| 987 | } | ||
| 988 | if (c == 0x00) { | ||
| 989 | match = (match == 1 || match == 2) ? 2 : 1; | ||
| 990 | continue; | ||
| 991 | } | ||
| 992 | switch (match++) { | ||
| 993 | case 2: if (c == 0x01) | ||
| 994 | continue; | ||
| 995 | break; | ||
| 996 | case 3: if (c == 0xb5) | ||
| 997 | continue; | ||
| 998 | break; | ||
| 999 | case 4: if ((c & 0xf0) == 0x10) | ||
| 1000 | continue; | ||
| 1001 | break; | ||
| 1002 | } | ||
| 1003 | match = 0; | ||
| 984 | } | 1004 | } |
| 985 | 1005 | ||
| 986 | /* setting n always > 1, fixes problems when playing stillframes | 1006 | /* setting n always > 1, fixes problems when playing stillframes |
diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index 732ce4de512e..5d2d81ab2371 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | |||
| @@ -552,7 +552,7 @@ static void ttusb_process_muxpack(struct ttusb *ttusb, const u8 * muxpack, | |||
| 552 | u16 csum = 0, cc; | 552 | u16 csum = 0, cc; |
| 553 | int i; | 553 | int i; |
| 554 | for (i = 0; i < len; i += 2) | 554 | for (i = 0; i < len; i += 2) |
| 555 | csum ^= le16_to_cpup((u16 *) (muxpack + i)); | 555 | csum ^= le16_to_cpup((__le16 *) (muxpack + i)); |
| 556 | if (csum) { | 556 | if (csum) { |
| 557 | printk("%s: muxpack with incorrect checksum, ignoring\n", | 557 | printk("%s: muxpack with incorrect checksum, ignoring\n", |
| 558 | __func__); | 558 | __func__); |
diff --git a/drivers/media/dvb/ttusb-dec/Kconfig b/drivers/media/dvb/ttusb-dec/Kconfig index 0712899e39a4..a23cc0aa17d3 100644 --- a/drivers/media/dvb/ttusb-dec/Kconfig +++ b/drivers/media/dvb/ttusb-dec/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config DVB_TTUSB_DEC | 1 | config DVB_TTUSB_DEC |
| 2 | tristate "Technotrend/Hauppauge USB DEC devices" | 2 | tristate "Technotrend/Hauppauge USB DEC devices" |
| 3 | depends on DVB_CORE && USB | 3 | depends on DVB_CORE && USB && INPUT |
| 4 | depends on HOTPLUG # due to FW_LOADER | 4 | depends on HOTPLUG # due to FW_LOADER |
| 5 | select FW_LOADER | 5 | select FW_LOADER |
| 6 | select CRC32 | 6 | select CRC32 |
diff --git a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c index 42eee04daa5d..fefdc05e84ac 100644 --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c | |||
| @@ -343,7 +343,7 @@ static int ttusb_dec_get_stb_state (struct ttusb_dec *dec, unsigned int *mode, | |||
| 343 | u8 c[COMMAND_PACKET_SIZE]; | 343 | u8 c[COMMAND_PACKET_SIZE]; |
| 344 | int c_length; | 344 | int c_length; |
| 345 | int result; | 345 | int result; |
| 346 | unsigned int tmp; | 346 | __be32 tmp; |
| 347 | 347 | ||
| 348 | dprintk("%s\n", __func__); | 348 | dprintk("%s\n", __func__); |
| 349 | 349 | ||
| @@ -398,9 +398,9 @@ static void ttusb_dec_set_pids(struct ttusb_dec *dec) | |||
| 398 | 0x00, 0x00, 0xff, 0xff, | 398 | 0x00, 0x00, 0xff, 0xff, |
| 399 | 0xff, 0xff, 0xff, 0xff }; | 399 | 0xff, 0xff, 0xff, 0xff }; |
| 400 | 400 | ||
| 401 | u16 pcr = htons(dec->pid[DMX_PES_PCR]); | 401 | __be16 pcr = htons(dec->pid[DMX_PES_PCR]); |
| 402 | u16 audio = htons(dec->pid[DMX_PES_AUDIO]); | 402 | __be16 audio = htons(dec->pid[DMX_PES_AUDIO]); |
| 403 | u16 video = htons(dec->pid[DMX_PES_VIDEO]); | 403 | __be16 video = htons(dec->pid[DMX_PES_VIDEO]); |
| 404 | 404 | ||
| 405 | dprintk("%s\n", __func__); | 405 | dprintk("%s\n", __func__); |
| 406 | 406 | ||
| @@ -435,7 +435,7 @@ static void ttusb_dec_process_pva(struct ttusb_dec *dec, u8 *pva, int length) | |||
| 435 | case 0x01: { /* VideoStream */ | 435 | case 0x01: { /* VideoStream */ |
| 436 | int prebytes = pva[5] & 0x03; | 436 | int prebytes = pva[5] & 0x03; |
| 437 | int postbytes = (pva[5] & 0x0c) >> 2; | 437 | int postbytes = (pva[5] & 0x0c) >> 2; |
| 438 | u16 v_pes_payload_length; | 438 | __be16 v_pes_payload_length; |
| 439 | 439 | ||
| 440 | if (output_pva) { | 440 | if (output_pva) { |
| 441 | dec->video_filter->feed->cb.ts(pva, length, NULL, 0, | 441 | dec->video_filter->feed->cb.ts(pva, length, NULL, 0, |
| @@ -1006,7 +1006,7 @@ static int ttusb_dec_start_sec_feed(struct dvb_demux_feed *dvbdmxfeed) | |||
| 1006 | 0x00, 0x00, 0x00, 0x00, | 1006 | 0x00, 0x00, 0x00, 0x00, |
| 1007 | 0x00, 0x00, 0x00, 0x00, | 1007 | 0x00, 0x00, 0x00, 0x00, |
| 1008 | 0x00 }; | 1008 | 0x00 }; |
| 1009 | u16 pid; | 1009 | __be16 pid; |
| 1010 | u8 c[COMMAND_PACKET_SIZE]; | 1010 | u8 c[COMMAND_PACKET_SIZE]; |
| 1011 | int c_length; | 1011 | int c_length; |
| 1012 | int result; | 1012 | int result; |
| @@ -1278,9 +1278,10 @@ static int ttusb_dec_boot_dsp(struct ttusb_dec *dec) | |||
| 1278 | u8 *firmware = NULL; | 1278 | u8 *firmware = NULL; |
| 1279 | size_t firmware_size = 0; | 1279 | size_t firmware_size = 0; |
| 1280 | u16 firmware_csum = 0; | 1280 | u16 firmware_csum = 0; |
| 1281 | u16 firmware_csum_ns; | 1281 | __be16 firmware_csum_ns; |
| 1282 | u32 firmware_size_nl; | 1282 | __be32 firmware_size_nl; |
| 1283 | u32 crc32_csum, crc32_check, tmp; | 1283 | u32 crc32_csum, crc32_check; |
| 1284 | __be32 tmp; | ||
| 1284 | const struct firmware *fw_entry = NULL; | 1285 | const struct firmware *fw_entry = NULL; |
| 1285 | 1286 | ||
| 1286 | dprintk("%s\n", __func__); | 1287 | dprintk("%s\n", __func__); |
| @@ -1306,7 +1307,7 @@ static int ttusb_dec_boot_dsp(struct ttusb_dec *dec) | |||
| 1306 | valid. */ | 1307 | valid. */ |
| 1307 | crc32_csum = crc32(~0L, firmware, 56) ^ ~0L; | 1308 | crc32_csum = crc32(~0L, firmware, 56) ^ ~0L; |
| 1308 | memcpy(&tmp, &firmware[56], 4); | 1309 | memcpy(&tmp, &firmware[56], 4); |
| 1309 | crc32_check = htonl(tmp); | 1310 | crc32_check = ntohl(tmp); |
| 1310 | if (crc32_csum != crc32_check) { | 1311 | if (crc32_csum != crc32_check) { |
| 1311 | printk("%s: crc32 check of DSP code failed (calculated " | 1312 | printk("%s: crc32 check of DSP code failed (calculated " |
| 1312 | "0x%08x != 0x%08x in file), file invalid.\n", | 1313 | "0x%08x != 0x%08x in file), file invalid.\n", |
| @@ -1627,7 +1628,7 @@ static int ttusb_dec_probe(struct usb_interface *intf, | |||
| 1627 | 1628 | ||
| 1628 | usb_set_intfdata(intf, (void *)dec); | 1629 | usb_set_intfdata(intf, (void *)dec); |
| 1629 | 1630 | ||
| 1630 | switch (le16_to_cpu(id->idProduct)) { | 1631 | switch (id->idProduct) { |
| 1631 | case 0x1006: | 1632 | case 0x1006: |
| 1632 | ttusb_dec_set_model(dec, TTUSB_DEC3000S); | 1633 | ttusb_dec_set_model(dec, TTUSB_DEC3000S); |
| 1633 | break; | 1634 | break; |
| @@ -1652,7 +1653,7 @@ static int ttusb_dec_probe(struct usb_interface *intf, | |||
| 1652 | ttusb_dec_init_dvb(dec); | 1653 | ttusb_dec_init_dvb(dec); |
| 1653 | 1654 | ||
| 1654 | dec->adapter.priv = dec; | 1655 | dec->adapter.priv = dec; |
| 1655 | switch (le16_to_cpu(id->idProduct)) { | 1656 | switch (id->idProduct) { |
| 1656 | case 0x1006: | 1657 | case 0x1006: |
| 1657 | dec->fe = ttusbdecfe_dvbs_attach(&fe_config); | 1658 | dec->fe = ttusbdecfe_dvbs_attach(&fe_config); |
| 1658 | break; | 1659 | break; |
diff --git a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c index eb5eaeccd7c4..443af24097f3 100644 --- a/drivers/media/dvb/ttusb-dec/ttusbdecfe.c +++ b/drivers/media/dvb/ttusb-dec/ttusbdecfe.c | |||
| @@ -86,7 +86,7 @@ static int ttusbdecfe_dvbt_set_frontend(struct dvb_frontend* fe, struct dvb_fron | |||
| 86 | 0x00, 0x00, 0x00, 0xff, | 86 | 0x00, 0x00, 0x00, 0xff, |
| 87 | 0x00, 0x00, 0x00, 0xff }; | 87 | 0x00, 0x00, 0x00, 0xff }; |
| 88 | 88 | ||
| 89 | u32 freq = htonl(p->frequency / 1000); | 89 | __be32 freq = htonl(p->frequency / 1000); |
| 90 | memcpy(&b[4], &freq, sizeof (u32)); | 90 | memcpy(&b[4], &freq, sizeof (u32)); |
| 91 | state->config->send_command(fe, 0x71, sizeof(b), b, NULL, NULL); | 91 | state->config->send_command(fe, 0x71, sizeof(b), b, NULL, NULL); |
| 92 | 92 | ||
| @@ -117,10 +117,10 @@ static int ttusbdecfe_dvbs_set_frontend(struct dvb_frontend* fe, struct dvb_fron | |||
| 117 | 0x00, 0x00, 0x00, 0x00, | 117 | 0x00, 0x00, 0x00, 0x00, |
| 118 | 0x00, 0x00, 0x00, 0x00, | 118 | 0x00, 0x00, 0x00, 0x00, |
| 119 | 0x00, 0x00, 0x00, 0x00 }; | 119 | 0x00, 0x00, 0x00, 0x00 }; |
| 120 | u32 freq; | 120 | __be32 freq; |
| 121 | u32 sym_rate; | 121 | __be32 sym_rate; |
| 122 | u32 band; | 122 | __be32 band; |
| 123 | u32 lnb_voltage; | 123 | __be32 lnb_voltage; |
| 124 | 124 | ||
| 125 | freq = htonl(p->frequency + | 125 | freq = htonl(p->frequency + |
| 126 | (state->hi_band ? LOF_HI : LOF_LO)); | 126 | (state->hi_band ? LOF_HI : LOF_LO)); |
diff --git a/drivers/media/video/au0828/Kconfig b/drivers/media/video/au0828/Kconfig index def10d086373..52b2491581a8 100644 --- a/drivers/media/video/au0828/Kconfig +++ b/drivers/media/video/au0828/Kconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | config VIDEO_AU0828 | 2 | config VIDEO_AU0828 |
| 3 | tristate "Auvitek AU0828 support" | 3 | tristate "Auvitek AU0828 support" |
| 4 | depends on VIDEO_DEV && I2C && INPUT && DVB_CORE && USB | 4 | depends on I2C && INPUT && DVB_CORE && USB |
| 5 | select I2C_ALGOBIT | 5 | select I2C_ALGOBIT |
| 6 | select VIDEO_TVEEPROM | 6 | select VIDEO_TVEEPROM |
| 7 | select DVB_AU8522 if !DVB_FE_CUSTOMIZE | 7 | select DVB_AU8522 if !DVB_FE_CUSTOMIZE |
diff --git a/drivers/media/video/au0828/au0828-dvb.c b/drivers/media/video/au0828/au0828-dvb.c index c86a5f17eca8..c6d470590380 100644 --- a/drivers/media/video/au0828/au0828-dvb.c +++ b/drivers/media/video/au0828/au0828-dvb.c | |||
| @@ -353,12 +353,6 @@ int au0828_dvb_register(struct au0828_dev *dev) | |||
| 353 | return -1; | 353 | return -1; |
| 354 | } | 354 | } |
| 355 | 355 | ||
| 356 | /* Put the analog decoder in standby to keep it quiet */ | ||
| 357 | au0828_call_i2c_clients(dev, TUNER_SET_STANDBY, NULL); | ||
| 358 | |||
| 359 | if (dvb->frontend->ops.analog_ops.standby) | ||
| 360 | dvb->frontend->ops.analog_ops.standby(dvb->frontend); | ||
| 361 | |||
| 362 | /* register everything */ | 356 | /* register everything */ |
| 363 | ret = dvb_register(dev); | 357 | ret = dvb_register(dev); |
| 364 | if (ret < 0) { | 358 | if (ret < 0) { |
diff --git a/drivers/media/video/bt8xx/bttv-cards.c b/drivers/media/video/bt8xx/bttv-cards.c index f20a01cfc73e..8ef0424c26c4 100644 --- a/drivers/media/video/bt8xx/bttv-cards.c +++ b/drivers/media/video/bt8xx/bttv-cards.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/firmware.h> | 34 | #include <linux/firmware.h> |
| 35 | #include <net/checksum.h> | 35 | #include <net/checksum.h> |
| 36 | 36 | ||
| 37 | #include <asm/unaligned.h> | ||
| 37 | #include <asm/io.h> | 38 | #include <asm/io.h> |
| 38 | 39 | ||
| 39 | #include "bttvp.h" | 40 | #include "bttvp.h" |
| @@ -3858,7 +3859,7 @@ static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256]) | |||
| 3858 | ee += i; | 3859 | ee += i; |
| 3859 | 3860 | ||
| 3860 | /* found a valid descriptor */ | 3861 | /* found a valid descriptor */ |
| 3861 | type = be16_to_cpup((u16*)(ee+4)); | 3862 | type = get_unaligned_be16((__be16 *)(ee+4)); |
| 3862 | 3863 | ||
| 3863 | switch(type) { | 3864 | switch(type) { |
| 3864 | /* 848 based */ | 3865 | /* 848 based */ |
| @@ -3918,7 +3919,7 @@ static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256]) | |||
| 3918 | btv->c.nr, type); | 3919 | btv->c.nr, type); |
| 3919 | break; | 3920 | break; |
| 3920 | } | 3921 | } |
| 3921 | serial = be32_to_cpup((u32*)(ee+6)); | 3922 | serial = get_unaligned_be32((__be32 *)(ee+6)); |
| 3922 | } | 3923 | } |
| 3923 | 3924 | ||
| 3924 | printk(KERN_INFO "bttv%d: osprey eeprom: card=%d '%s' serial=%u\n", | 3925 | printk(KERN_INFO "bttv%d: osprey eeprom: card=%d '%s' serial=%u\n", |
diff --git a/drivers/media/video/bt8xx/bttv-risc.c b/drivers/media/video/bt8xx/bttv-risc.c index e5979f77504c..0af586876e72 100644 --- a/drivers/media/video/bt8xx/bttv-risc.c +++ b/drivers/media/video/bt8xx/bttv-risc.c | |||
| @@ -48,7 +48,7 @@ bttv_risc_packed(struct bttv *btv, struct btcx_riscmem *risc, | |||
| 48 | { | 48 | { |
| 49 | u32 instructions,line,todo; | 49 | u32 instructions,line,todo; |
| 50 | struct scatterlist *sg; | 50 | struct scatterlist *sg; |
| 51 | u32 *rp; | 51 | __le32 *rp; |
| 52 | int rc; | 52 | int rc; |
| 53 | 53 | ||
| 54 | /* estimate risc mem: worst case is one write per page border + | 54 | /* estimate risc mem: worst case is one write per page border + |
| @@ -128,7 +128,8 @@ bttv_risc_planar(struct bttv *btv, struct btcx_riscmem *risc, | |||
| 128 | unsigned int cpadding) | 128 | unsigned int cpadding) |
| 129 | { | 129 | { |
| 130 | unsigned int instructions,line,todo,ylen,chroma; | 130 | unsigned int instructions,line,todo,ylen,chroma; |
| 131 | u32 *rp,ri; | 131 | __le32 *rp; |
| 132 | u32 ri; | ||
| 132 | struct scatterlist *ysg; | 133 | struct scatterlist *ysg; |
| 133 | struct scatterlist *usg; | 134 | struct scatterlist *usg; |
| 134 | struct scatterlist *vsg; | 135 | struct scatterlist *vsg; |
| @@ -244,7 +245,8 @@ bttv_risc_overlay(struct bttv *btv, struct btcx_riscmem *risc, | |||
| 244 | { | 245 | { |
| 245 | int dwords,rc,line,maxy,start,end,skip,nskips; | 246 | int dwords,rc,line,maxy,start,end,skip,nskips; |
| 246 | struct btcx_skiplist *skips; | 247 | struct btcx_skiplist *skips; |
| 247 | u32 *rp,ri,ra; | 248 | __le32 *rp; |
| 249 | u32 ri,ra; | ||
| 248 | u32 addr; | 250 | u32 addr; |
| 249 | 251 | ||
| 250 | /* skip list for window clipping */ | 252 | /* skip list for window clipping */ |
diff --git a/drivers/media/video/btcx-risc.c b/drivers/media/video/btcx-risc.c index ce0840ccd594..f42701f82e7f 100644 --- a/drivers/media/video/btcx-risc.c +++ b/drivers/media/video/btcx-risc.c | |||
| @@ -63,7 +63,7 @@ int btcx_riscmem_alloc(struct pci_dev *pci, | |||
| 63 | struct btcx_riscmem *risc, | 63 | struct btcx_riscmem *risc, |
| 64 | unsigned int size) | 64 | unsigned int size) |
| 65 | { | 65 | { |
| 66 | u32 *cpu; | 66 | __le32 *cpu; |
| 67 | dma_addr_t dma; | 67 | dma_addr_t dma; |
| 68 | 68 | ||
| 69 | if (NULL != risc->cpu && risc->size < size) | 69 | if (NULL != risc->cpu && risc->size < size) |
diff --git a/drivers/media/video/btcx-risc.h b/drivers/media/video/btcx-risc.h index 503e6c6d7b69..861bc8112824 100644 --- a/drivers/media/video/btcx-risc.h +++ b/drivers/media/video/btcx-risc.h | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | */ | 2 | */ |
| 3 | struct btcx_riscmem { | 3 | struct btcx_riscmem { |
| 4 | unsigned int size; | 4 | unsigned int size; |
| 5 | u32 *cpu; | 5 | __le32 *cpu; |
| 6 | u32 *jmp; | 6 | __le32 *jmp; |
| 7 | dma_addr_t dma; | 7 | dma_addr_t dma; |
| 8 | }; | 8 | }; |
| 9 | 9 | ||
diff --git a/drivers/media/video/cx18/cx18-av-core.c b/drivers/media/video/cx18/cx18-av-core.c index 66864904c99b..9a26751615c6 100644 --- a/drivers/media/video/cx18/cx18-av-core.c +++ b/drivers/media/video/cx18/cx18-av-core.c | |||
| @@ -182,14 +182,16 @@ static void input_change(struct cx18 *cx) | |||
| 182 | if (std == V4L2_STD_NTSC_M_JP) { | 182 | if (std == V4L2_STD_NTSC_M_JP) { |
| 183 | /* Japan uses EIAJ audio standard */ | 183 | /* Japan uses EIAJ audio standard */ |
| 184 | cx18_av_write(cx, 0x808, 0xf7); | 184 | cx18_av_write(cx, 0x808, 0xf7); |
| 185 | cx18_av_write(cx, 0x80b, 0x02); | ||
| 185 | } else if (std == V4L2_STD_NTSC_M_KR) { | 186 | } else if (std == V4L2_STD_NTSC_M_KR) { |
| 186 | /* South Korea uses A2 audio standard */ | 187 | /* South Korea uses A2 audio standard */ |
| 187 | cx18_av_write(cx, 0x808, 0xf8); | 188 | cx18_av_write(cx, 0x808, 0xf8); |
| 189 | cx18_av_write(cx, 0x80b, 0x03); | ||
| 188 | } else { | 190 | } else { |
| 189 | /* Others use the BTSC audio standard */ | 191 | /* Others use the BTSC audio standard */ |
| 190 | cx18_av_write(cx, 0x808, 0xf6); | 192 | cx18_av_write(cx, 0x808, 0xf6); |
| 193 | cx18_av_write(cx, 0x80b, 0x01); | ||
| 191 | } | 194 | } |
| 192 | cx18_av_write(cx, 0x80b, 0x00); | ||
| 193 | } else if (std & V4L2_STD_PAL) { | 195 | } else if (std & V4L2_STD_PAL) { |
| 194 | /* Follow tuner change procedure for PAL */ | 196 | /* Follow tuner change procedure for PAL */ |
| 195 | cx18_av_write(cx, 0x808, 0xff); | 197 | cx18_av_write(cx, 0x808, 0xff); |
| @@ -741,8 +743,8 @@ static void log_audio_status(struct cx18 *cx) | |||
| 741 | { | 743 | { |
| 742 | struct cx18_av_state *state = &cx->av_state; | 744 | struct cx18_av_state *state = &cx->av_state; |
| 743 | u8 download_ctl = cx18_av_read(cx, 0x803); | 745 | u8 download_ctl = cx18_av_read(cx, 0x803); |
| 744 | u8 mod_det_stat0 = cx18_av_read(cx, 0x805); | 746 | u8 mod_det_stat0 = cx18_av_read(cx, 0x804); |
| 745 | u8 mod_det_stat1 = cx18_av_read(cx, 0x804); | 747 | u8 mod_det_stat1 = cx18_av_read(cx, 0x805); |
| 746 | u8 audio_config = cx18_av_read(cx, 0x808); | 748 | u8 audio_config = cx18_av_read(cx, 0x808); |
| 747 | u8 pref_mode = cx18_av_read(cx, 0x809); | 749 | u8 pref_mode = cx18_av_read(cx, 0x809); |
| 748 | u8 afc0 = cx18_av_read(cx, 0x80b); | 750 | u8 afc0 = cx18_av_read(cx, 0x80b); |
| @@ -760,12 +762,12 @@ static void log_audio_status(struct cx18 *cx) | |||
| 760 | case 0x12: p = "dual with SAP"; break; | 762 | case 0x12: p = "dual with SAP"; break; |
| 761 | case 0x14: p = "tri with SAP"; break; | 763 | case 0x14: p = "tri with SAP"; break; |
| 762 | case 0xfe: p = "forced mode"; break; | 764 | case 0xfe: p = "forced mode"; break; |
| 763 | default: p = "not defined"; | 765 | default: p = "not defined"; break; |
| 764 | } | 766 | } |
| 765 | CX18_INFO("Detected audio mode: %s\n", p); | 767 | CX18_INFO("Detected audio mode: %s\n", p); |
| 766 | 768 | ||
| 767 | switch (mod_det_stat1) { | 769 | switch (mod_det_stat1) { |
| 768 | case 0x00: p = "BTSC"; break; | 770 | case 0x00: p = "not defined"; break; |
| 769 | case 0x01: p = "EIAJ"; break; | 771 | case 0x01: p = "EIAJ"; break; |
| 770 | case 0x02: p = "A2-M"; break; | 772 | case 0x02: p = "A2-M"; break; |
| 771 | case 0x03: p = "A2-BG"; break; | 773 | case 0x03: p = "A2-BG"; break; |
| @@ -779,8 +781,13 @@ static void log_audio_status(struct cx18 *cx) | |||
| 779 | case 0x0b: p = "NICAM-I"; break; | 781 | case 0x0b: p = "NICAM-I"; break; |
| 780 | case 0x0c: p = "NICAM-L"; break; | 782 | case 0x0c: p = "NICAM-L"; break; |
| 781 | case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break; | 783 | case 0x0d: p = "BTSC/EIAJ/A2-M Mono (4.5 MHz FMMono)"; break; |
| 784 | case 0x0e: p = "IF FM Radio"; break; | ||
| 785 | case 0x0f: p = "BTSC"; break; | ||
| 786 | case 0x10: p = "detected chrominance"; break; | ||
| 787 | case 0xfd: p = "unknown audio standard"; break; | ||
| 788 | case 0xfe: p = "forced audio standard"; break; | ||
| 782 | case 0xff: p = "no detected audio standard"; break; | 789 | case 0xff: p = "no detected audio standard"; break; |
| 783 | default: p = "not defined"; | 790 | default: p = "not defined"; break; |
| 784 | } | 791 | } |
| 785 | CX18_INFO("Detected audio standard: %s\n", p); | 792 | CX18_INFO("Detected audio standard: %s\n", p); |
| 786 | CX18_INFO("Audio muted: %s\n", | 793 | CX18_INFO("Audio muted: %s\n", |
| @@ -789,22 +796,23 @@ static void log_audio_status(struct cx18 *cx) | |||
| 789 | (download_ctl & 0x10) ? "running" : "stopped"); | 796 | (download_ctl & 0x10) ? "running" : "stopped"); |
| 790 | 797 | ||
| 791 | switch (audio_config >> 4) { | 798 | switch (audio_config >> 4) { |
| 792 | case 0x00: p = "BTSC"; break; | 799 | case 0x00: p = "undefined"; break; |
| 793 | case 0x01: p = "EIAJ"; break; | 800 | case 0x01: p = "BTSC"; break; |
| 794 | case 0x02: p = "A2-M"; break; | 801 | case 0x02: p = "EIAJ"; break; |
| 795 | case 0x03: p = "A2-BG"; break; | 802 | case 0x03: p = "A2-M"; break; |
| 796 | case 0x04: p = "A2-DK1"; break; | 803 | case 0x04: p = "A2-BG"; break; |
| 797 | case 0x05: p = "A2-DK2"; break; | 804 | case 0x05: p = "A2-DK1"; break; |
| 798 | case 0x06: p = "A2-DK3"; break; | 805 | case 0x06: p = "A2-DK2"; break; |
| 799 | case 0x07: p = "A1 (6.0 MHz FM Mono)"; break; | 806 | case 0x07: p = "A2-DK3"; break; |
| 800 | case 0x08: p = "AM-L"; break; | 807 | case 0x08: p = "A1 (6.0 MHz FM Mono)"; break; |
| 801 | case 0x09: p = "NICAM-BG"; break; | 808 | case 0x09: p = "AM-L"; break; |
| 802 | case 0x0a: p = "NICAM-DK"; break; | 809 | case 0x0a: p = "NICAM-BG"; break; |
| 803 | case 0x0b: p = "NICAM-I"; break; | 810 | case 0x0b: p = "NICAM-DK"; break; |
| 804 | case 0x0c: p = "NICAM-L"; break; | 811 | case 0x0c: p = "NICAM-I"; break; |
| 805 | case 0x0d: p = "FM radio"; break; | 812 | case 0x0d: p = "NICAM-L"; break; |
| 813 | case 0x0e: p = "FM radio"; break; | ||
| 806 | case 0x0f: p = "automatic detection"; break; | 814 | case 0x0f: p = "automatic detection"; break; |
| 807 | default: p = "undefined"; | 815 | default: p = "undefined"; break; |
| 808 | } | 816 | } |
| 809 | CX18_INFO("Configured audio standard: %s\n", p); | 817 | CX18_INFO("Configured audio standard: %s\n", p); |
| 810 | 818 | ||
| @@ -815,12 +823,9 @@ static void log_audio_status(struct cx18 *cx) | |||
| 815 | case 0x02: p = "MONO3 (STEREO forced MONO)"; break; | 823 | case 0x02: p = "MONO3 (STEREO forced MONO)"; break; |
| 816 | case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break; | 824 | case 0x03: p = "MONO4 (NICAM ANALOG-Language C/Analog Fallback)"; break; |
| 817 | case 0x04: p = "STEREO"; break; | 825 | case 0x04: p = "STEREO"; break; |
| 818 | case 0x05: p = "DUAL1 (AB)"; break; | 826 | case 0x05: p = "DUAL1 (AC)"; break; |
| 819 | case 0x06: p = "DUAL2 (AC) (FM)"; break; | 827 | case 0x06: p = "DUAL2 (BC)"; break; |
| 820 | case 0x07: p = "DUAL3 (BC) (FM)"; break; | 828 | case 0x07: p = "DUAL3 (AB)"; break; |
| 821 | case 0x08: p = "DUAL4 (AC) (AM)"; break; | ||
| 822 | case 0x09: p = "DUAL5 (BC) (AM)"; break; | ||
| 823 | case 0x0a: p = "SAP"; break; | ||
| 824 | default: p = "undefined"; | 829 | default: p = "undefined"; |
| 825 | } | 830 | } |
| 826 | CX18_INFO("Configured audio mode: %s\n", p); | 831 | CX18_INFO("Configured audio mode: %s\n", p); |
| @@ -835,9 +840,11 @@ static void log_audio_status(struct cx18 *cx) | |||
| 835 | case 0x06: p = "BTSC"; break; | 840 | case 0x06: p = "BTSC"; break; |
| 836 | case 0x07: p = "EIAJ"; break; | 841 | case 0x07: p = "EIAJ"; break; |
| 837 | case 0x08: p = "A2-M"; break; | 842 | case 0x08: p = "A2-M"; break; |
| 838 | case 0x09: p = "FM Radio"; break; | 843 | case 0x09: p = "FM Radio (4.5 MHz)"; break; |
| 844 | case 0x0a: p = "FM Radio (5.5 MHz)"; break; | ||
| 845 | case 0x0b: p = "S-Video"; break; | ||
| 839 | case 0x0f: p = "automatic standard and mode detection"; break; | 846 | case 0x0f: p = "automatic standard and mode detection"; break; |
| 840 | default: p = "undefined"; | 847 | default: p = "undefined"; break; |
| 841 | } | 848 | } |
| 842 | CX18_INFO("Configured audio system: %s\n", p); | 849 | CX18_INFO("Configured audio system: %s\n", p); |
| 843 | } | 850 | } |
| @@ -857,22 +864,24 @@ static void log_audio_status(struct cx18 *cx) | |||
| 857 | case 5: p = "language AC"; break; | 864 | case 5: p = "language AC"; break; |
| 858 | case 6: p = "language BC"; break; | 865 | case 6: p = "language BC"; break; |
| 859 | case 7: p = "language AB"; break; | 866 | case 7: p = "language AB"; break; |
| 860 | default: p = "undefined"; | 867 | default: p = "undefined"; break; |
| 861 | } | 868 | } |
| 862 | CX18_INFO("Preferred audio mode: %s\n", p); | 869 | CX18_INFO("Preferred audio mode: %s\n", p); |
| 863 | 870 | ||
| 864 | if ((audio_config & 0xf) == 0xf) { | 871 | if ((audio_config & 0xf) == 0xf) { |
| 865 | switch ((afc0 >> 2) & 0x1) { | 872 | switch ((afc0 >> 3) & 0x1) { |
| 866 | case 0: p = "system DK"; break; | 873 | case 0: p = "system DK"; break; |
| 867 | case 1: p = "system L"; break; | 874 | case 1: p = "system L"; break; |
| 868 | } | 875 | } |
| 869 | CX18_INFO("Selected 65 MHz format: %s\n", p); | 876 | CX18_INFO("Selected 65 MHz format: %s\n", p); |
| 870 | 877 | ||
| 871 | switch (afc0 & 0x3) { | 878 | switch (afc0 & 0x7) { |
| 872 | case 0: p = "BTSC"; break; | 879 | case 0: p = "Chroma"; break; |
| 873 | case 1: p = "EIAJ"; break; | 880 | case 1: p = "BTSC"; break; |
| 874 | case 2: p = "A2-M"; break; | 881 | case 2: p = "EIAJ"; break; |
| 875 | default: p = "undefined"; | 882 | case 3: p = "A2-M"; break; |
| 883 | case 4: p = "autodetect"; break; | ||
| 884 | default: p = "undefined"; break; | ||
| 876 | } | 885 | } |
| 877 | CX18_INFO("Selected 45 MHz format: %s\n", p); | 886 | CX18_INFO("Selected 45 MHz format: %s\n", p); |
| 878 | } | 887 | } |
diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c index 553adbf2cd44..baccd079243d 100644 --- a/drivers/media/video/cx18/cx18-cards.c +++ b/drivers/media/video/cx18/cx18-cards.c | |||
| @@ -126,7 +126,7 @@ static const struct cx18_card cx18_card_hvr1600_samsung = { | |||
| 126 | 126 | ||
| 127 | /* ------------------------------------------------------------------------- */ | 127 | /* ------------------------------------------------------------------------- */ |
| 128 | 128 | ||
| 129 | /* Compro VideoMate H900: not working at the moment! */ | 129 | /* Compro VideoMate H900: note that this card is analog only! */ |
| 130 | 130 | ||
| 131 | static const struct cx18_card_pci_info cx18_pci_h900[] = { | 131 | static const struct cx18_card_pci_info cx18_pci_h900[] = { |
| 132 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_COMPRO, 0xe100 }, | 132 | { PCI_DEVICE_ID_CX23418, CX18_PCI_ID_COMPRO, 0xe100 }, |
| @@ -136,7 +136,7 @@ static const struct cx18_card_pci_info cx18_pci_h900[] = { | |||
| 136 | static const struct cx18_card cx18_card_h900 = { | 136 | static const struct cx18_card cx18_card_h900 = { |
| 137 | .type = CX18_CARD_COMPRO_H900, | 137 | .type = CX18_CARD_COMPRO_H900, |
| 138 | .name = "Compro VideoMate H900", | 138 | .name = "Compro VideoMate H900", |
| 139 | .comment = "DVB & VBI are not yet supported\n", | 139 | .comment = "VBI is not yet supported\n", |
| 140 | .v4l2_capabilities = CX18_CAP_ENCODER, | 140 | .v4l2_capabilities = CX18_CAP_ENCODER, |
| 141 | .hw_audio_ctrl = CX18_HW_CX23418, | 141 | .hw_audio_ctrl = CX18_HW_CX23418, |
| 142 | .hw_all = CX18_HW_TUNER, | 142 | .hw_all = CX18_HW_TUNER, |
diff --git a/drivers/media/video/cx18/cx18-controls.c b/drivers/media/video/cx18/cx18-controls.c index 2bdac5ebbb0d..87cf41021665 100644 --- a/drivers/media/video/cx18/cx18-controls.c +++ b/drivers/media/video/cx18/cx18-controls.c | |||
| @@ -159,7 +159,7 @@ static int cx18_setup_vbi_fmt(struct cx18 *cx, enum v4l2_mpeg_stream_vbi_fmt fmt | |||
| 159 | { | 159 | { |
| 160 | if (!(cx->v4l2_cap & V4L2_CAP_SLICED_VBI_CAPTURE)) | 160 | if (!(cx->v4l2_cap & V4L2_CAP_SLICED_VBI_CAPTURE)) |
| 161 | return -EINVAL; | 161 | return -EINVAL; |
| 162 | if (atomic_read(&cx->capturing) > 0) | 162 | if (atomic_read(&cx->ana_capturing) > 0) |
| 163 | return -EBUSY; | 163 | return -EBUSY; |
| 164 | 164 | ||
| 165 | /* First try to allocate sliced VBI buffers if needed. */ | 165 | /* First try to allocate sliced VBI buffers if needed. */ |
| @@ -235,7 +235,7 @@ int cx18_control_ioctls(struct cx18 *cx, unsigned int cmd, void *arg) | |||
| 235 | CX18_DEBUG_IOCTL("VIDIOC_S_EXT_CTRLS\n"); | 235 | CX18_DEBUG_IOCTL("VIDIOC_S_EXT_CTRLS\n"); |
| 236 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) { | 236 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) { |
| 237 | struct cx2341x_mpeg_params p = cx->params; | 237 | struct cx2341x_mpeg_params p = cx->params; |
| 238 | int err = cx2341x_ext_ctrls(&p, atomic_read(&cx->capturing), arg, cmd); | 238 | int err = cx2341x_ext_ctrls(&p, atomic_read(&cx->ana_capturing), arg, cmd); |
| 239 | 239 | ||
| 240 | if (err) | 240 | if (err) |
| 241 | return err; | 241 | return err; |
| @@ -295,7 +295,7 @@ int cx18_control_ioctls(struct cx18 *cx, unsigned int cmd, void *arg) | |||
| 295 | CX18_DEBUG_IOCTL("VIDIOC_TRY_EXT_CTRLS\n"); | 295 | CX18_DEBUG_IOCTL("VIDIOC_TRY_EXT_CTRLS\n"); |
| 296 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) | 296 | if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG) |
| 297 | return cx2341x_ext_ctrls(&cx->params, | 297 | return cx2341x_ext_ctrls(&cx->params, |
| 298 | atomic_read(&cx->capturing), arg, cmd); | 298 | atomic_read(&cx->ana_capturing), arg, cmd); |
| 299 | return -EINVAL; | 299 | return -EINVAL; |
| 300 | } | 300 | } |
| 301 | 301 | ||
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index 0dd4e0529970..2b810bb2a4c7 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
| @@ -670,7 +670,7 @@ static int __devinit cx18_probe(struct pci_dev *dev, | |||
| 670 | cx18_init_power(cx, 1); | 670 | cx18_init_power(cx, 1); |
| 671 | cx18_init_memory(cx); | 671 | cx18_init_memory(cx); |
| 672 | 672 | ||
| 673 | cx->scb = (struct cx18_scb *)(cx->enc_mem + SCB_OFFSET); | 673 | cx->scb = (struct cx18_scb __iomem *)(cx->enc_mem + SCB_OFFSET); |
| 674 | cx18_init_scb(cx); | 674 | cx18_init_scb(cx); |
| 675 | 675 | ||
| 676 | cx18_gpio_init(cx); | 676 | cx18_gpio_init(cx); |
| @@ -751,17 +751,6 @@ static int __devinit cx18_probe(struct pci_dev *dev, | |||
| 751 | if (cx->options.radio > 0) | 751 | if (cx->options.radio > 0) |
| 752 | cx->v4l2_cap |= V4L2_CAP_RADIO; | 752 | cx->v4l2_cap |= V4L2_CAP_RADIO; |
| 753 | 753 | ||
| 754 | retval = cx18_streams_setup(cx); | ||
| 755 | if (retval) { | ||
| 756 | CX18_ERR("Error %d setting up streams\n", retval); | ||
| 757 | goto free_irq; | ||
| 758 | } | ||
| 759 | retval = cx18_streams_register(cx); | ||
| 760 | if (retval) { | ||
| 761 | CX18_ERR("Error %d registering devices\n", retval); | ||
| 762 | goto free_streams; | ||
| 763 | } | ||
| 764 | |||
| 765 | if (cx->options.tuner > -1) { | 754 | if (cx->options.tuner > -1) { |
| 766 | struct tuner_setup setup; | 755 | struct tuner_setup setup; |
| 767 | 756 | ||
| @@ -788,7 +777,16 @@ static int __devinit cx18_probe(struct pci_dev *dev, | |||
| 788 | are not. */ | 777 | are not. */ |
| 789 | cx->tuner_std = cx->std; | 778 | cx->tuner_std = cx->std; |
| 790 | 779 | ||
| 791 | cx18_init_on_first_open(cx); | 780 | retval = cx18_streams_setup(cx); |
| 781 | if (retval) { | ||
| 782 | CX18_ERR("Error %d setting up streams\n", retval); | ||
| 783 | goto free_irq; | ||
| 784 | } | ||
| 785 | retval = cx18_streams_register(cx); | ||
| 786 | if (retval) { | ||
| 787 | CX18_ERR("Error %d registering devices\n", retval); | ||
| 788 | goto free_streams; | ||
| 789 | } | ||
| 792 | 790 | ||
| 793 | CX18_INFO("Initialized card #%d: %s\n", cx->num, cx->card_name); | 791 | CX18_INFO("Initialized card #%d: %s\n", cx->num, cx->card_name); |
| 794 | 792 | ||
| @@ -889,7 +887,7 @@ static void cx18_remove(struct pci_dev *pci_dev) | |||
| 889 | 887 | ||
| 890 | /* Stop all captures */ | 888 | /* Stop all captures */ |
| 891 | CX18_DEBUG_INFO("Stopping all streams\n"); | 889 | CX18_DEBUG_INFO("Stopping all streams\n"); |
| 892 | if (atomic_read(&cx->capturing) > 0) | 890 | if (atomic_read(&cx->tot_capturing) > 0) |
| 893 | cx18_stop_all_captures(cx); | 891 | cx18_stop_all_captures(cx); |
| 894 | 892 | ||
| 895 | /* Interrupts */ | 893 | /* Interrupts */ |
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index a2a6c58d12fe..de14ab59a206 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
| @@ -358,7 +358,7 @@ struct cx18 { | |||
| 358 | u32 v4l2_cap; /* V4L2 capabilities of card */ | 358 | u32 v4l2_cap; /* V4L2 capabilities of card */ |
| 359 | u32 hw_flags; /* Hardware description of the board */ | 359 | u32 hw_flags; /* Hardware description of the board */ |
| 360 | unsigned mdl_offset; | 360 | unsigned mdl_offset; |
| 361 | struct cx18_scb *scb; /* pointer to SCB */ | 361 | struct cx18_scb __iomem *scb; /* pointer to SCB */ |
| 362 | 362 | ||
| 363 | struct cx18_av_state av_state; | 363 | struct cx18_av_state av_state; |
| 364 | 364 | ||
| @@ -380,7 +380,8 @@ struct cx18 { | |||
| 380 | int stream_buf_size[CX18_MAX_STREAMS]; /* Stream buffer size */ | 380 | int stream_buf_size[CX18_MAX_STREAMS]; /* Stream buffer size */ |
| 381 | struct cx18_stream streams[CX18_MAX_STREAMS]; /* Stream data */ | 381 | struct cx18_stream streams[CX18_MAX_STREAMS]; /* Stream data */ |
| 382 | unsigned long i_flags; /* global cx18 flags */ | 382 | unsigned long i_flags; /* global cx18 flags */ |
| 383 | atomic_t capturing; /* count number of active capture streams */ | 383 | atomic_t ana_capturing; /* count number of active analog capture streams */ |
| 384 | atomic_t tot_capturing; /* total count number of active capture streams */ | ||
| 384 | spinlock_t lock; /* lock access to this struct */ | 385 | spinlock_t lock; /* lock access to this struct */ |
| 385 | int search_pack_header; | 386 | int search_pack_header; |
| 386 | 387 | ||
| @@ -423,6 +424,10 @@ struct cx18 { | |||
| 423 | struct mutex i2c_bus_lock[2]; | 424 | struct mutex i2c_bus_lock[2]; |
| 424 | struct i2c_client *i2c_clients[I2C_CLIENTS_MAX]; | 425 | struct i2c_client *i2c_clients[I2C_CLIENTS_MAX]; |
| 425 | 426 | ||
| 427 | /* gpio */ | ||
| 428 | u32 gpio_dir; | ||
| 429 | u32 gpio_val; | ||
| 430 | |||
| 426 | /* v4l2 and User settings */ | 431 | /* v4l2 and User settings */ |
| 427 | 432 | ||
| 428 | /* codec settings */ | 433 | /* codec settings */ |
diff --git a/drivers/media/video/cx18/cx18-fileops.c b/drivers/media/video/cx18/cx18-fileops.c index 0b3141db174b..1e537fe04a23 100644 --- a/drivers/media/video/cx18/cx18-fileops.c +++ b/drivers/media/video/cx18/cx18-fileops.c | |||
| @@ -318,7 +318,7 @@ static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf, | |||
| 318 | size_t tot_written = 0; | 318 | size_t tot_written = 0; |
| 319 | int single_frame = 0; | 319 | int single_frame = 0; |
| 320 | 320 | ||
| 321 | if (atomic_read(&cx->capturing) == 0 && s->id == -1) { | 321 | if (atomic_read(&cx->ana_capturing) == 0 && s->id == -1) { |
| 322 | /* shouldn't happen */ | 322 | /* shouldn't happen */ |
| 323 | CX18_DEBUG_WARN("Stream %s not initialized before read\n", | 323 | CX18_DEBUG_WARN("Stream %s not initialized before read\n", |
| 324 | s->name); | 324 | s->name); |
| @@ -361,7 +361,8 @@ static ssize_t cx18_read(struct cx18_stream *s, char __user *ubuf, | |||
| 361 | cx18_enqueue(s, buf, &s->q_free); | 361 | cx18_enqueue(s, buf, &s->q_free); |
| 362 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, | 362 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, |
| 363 | s->handle, | 363 | s->handle, |
| 364 | (void *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, | 364 | (void __iomem *)&cx->scb->cpu_mdl[buf->id] - |
| 365 | cx->enc_mem, | ||
| 365 | 1, buf->id, s->buf_size); | 366 | 1, buf->id, s->buf_size); |
| 366 | } else | 367 | } else |
| 367 | cx18_enqueue(s, buf, &s->q_io); | 368 | cx18_enqueue(s, buf, &s->q_io); |
| @@ -581,7 +582,7 @@ int cx18_v4l2_close(struct inode *inode, struct file *filp) | |||
| 581 | cx18_call_i2c_clients(cx, VIDIOC_S_STD, &cx->std); | 582 | cx18_call_i2c_clients(cx, VIDIOC_S_STD, &cx->std); |
| 582 | /* Select correct audio input (i.e. TV tuner or Line in) */ | 583 | /* Select correct audio input (i.e. TV tuner or Line in) */ |
| 583 | cx18_audio_set_io(cx); | 584 | cx18_audio_set_io(cx); |
| 584 | if (atomic_read(&cx->capturing) > 0) { | 585 | if (atomic_read(&cx->ana_capturing) > 0) { |
| 585 | /* Undo video mute */ | 586 | /* Undo video mute */ |
| 586 | cx18_vapi(cx, CX18_CPU_SET_VIDEO_MUTE, 2, s->handle, | 587 | cx18_vapi(cx, CX18_CPU_SET_VIDEO_MUTE, 2, s->handle, |
| 587 | cx->params.video_mute | | 588 | cx->params.video_mute | |
| @@ -627,7 +628,7 @@ static int cx18_serialized_open(struct cx18_stream *s, struct file *filp) | |||
| 627 | } | 628 | } |
| 628 | 629 | ||
| 629 | if (!test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) { | 630 | if (!test_bit(CX18_F_I_RADIO_USER, &cx->i_flags)) { |
| 630 | if (atomic_read(&cx->capturing) > 0) { | 631 | if (atomic_read(&cx->ana_capturing) > 0) { |
| 631 | /* switching to radio while capture is | 632 | /* switching to radio while capture is |
| 632 | in progress is not polite */ | 633 | in progress is not polite */ |
| 633 | cx18_release_stream(s); | 634 | cx18_release_stream(s); |
| @@ -694,7 +695,7 @@ int cx18_v4l2_open(struct inode *inode, struct file *filp) | |||
| 694 | 695 | ||
| 695 | void cx18_mute(struct cx18 *cx) | 696 | void cx18_mute(struct cx18 *cx) |
| 696 | { | 697 | { |
| 697 | if (atomic_read(&cx->capturing)) | 698 | if (atomic_read(&cx->ana_capturing)) |
| 698 | cx18_vapi(cx, CX18_CPU_SET_AUDIO_MUTE, 2, | 699 | cx18_vapi(cx, CX18_CPU_SET_AUDIO_MUTE, 2, |
| 699 | cx18_find_handle(cx), 1); | 700 | cx18_find_handle(cx), 1); |
| 700 | CX18_DEBUG_INFO("Mute\n"); | 701 | CX18_DEBUG_INFO("Mute\n"); |
| @@ -702,7 +703,7 @@ void cx18_mute(struct cx18 *cx) | |||
| 702 | 703 | ||
| 703 | void cx18_unmute(struct cx18 *cx) | 704 | void cx18_unmute(struct cx18 *cx) |
| 704 | { | 705 | { |
| 705 | if (atomic_read(&cx->capturing)) { | 706 | if (atomic_read(&cx->ana_capturing)) { |
| 706 | cx18_msleep_timeout(100, 0); | 707 | cx18_msleep_timeout(100, 0); |
| 707 | cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 2, | 708 | cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 2, |
| 708 | cx18_find_handle(cx), 12); | 709 | cx18_find_handle(cx), 12); |
diff --git a/drivers/media/video/cx18/cx18-gpio.c b/drivers/media/video/cx18/cx18-gpio.c index bb8bc86086d0..ceb63653c926 100644 --- a/drivers/media/video/cx18/cx18-gpio.c +++ b/drivers/media/video/cx18/cx18-gpio.c | |||
| @@ -35,9 +35,6 @@ | |||
| 35 | #define CX18_REG_GPIO_OUT2 0xc78104 | 35 | #define CX18_REG_GPIO_OUT2 0xc78104 |
| 36 | #define CX18_REG_GPIO_DIR2 0xc7810c | 36 | #define CX18_REG_GPIO_DIR2 0xc7810c |
| 37 | 37 | ||
| 38 | static u32 gpio_dir; | ||
| 39 | static u32 gpio_val; | ||
| 40 | |||
| 41 | /* | 38 | /* |
| 42 | * HVR-1600 GPIO pins, courtesy of Hauppauge: | 39 | * HVR-1600 GPIO pins, courtesy of Hauppauge: |
| 43 | * | 40 | * |
| @@ -49,24 +46,29 @@ static u32 gpio_val; | |||
| 49 | 46 | ||
| 50 | static void gpio_write(struct cx18 *cx) | 47 | static void gpio_write(struct cx18 *cx) |
| 51 | { | 48 | { |
| 52 | write_reg((gpio_dir & 0xffff) << 16, CX18_REG_GPIO_DIR1); | 49 | u32 dir = cx->gpio_dir; |
| 53 | write_reg(((gpio_dir & 0xffff) << 16) | (gpio_val & 0xffff), | 50 | u32 val = cx->gpio_val; |
| 51 | |||
| 52 | write_reg((dir & 0xffff) << 16, CX18_REG_GPIO_DIR1); | ||
| 53 | write_reg(((dir & 0xffff) << 16) | (val & 0xffff), | ||
| 54 | CX18_REG_GPIO_OUT1); | 54 | CX18_REG_GPIO_OUT1); |
| 55 | write_reg(gpio_dir & 0xffff0000, CX18_REG_GPIO_DIR2); | 55 | write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2); |
| 56 | write_reg((gpio_dir & 0xffff0000) | ((gpio_val & 0xffff0000) >> 16), | 56 | write_reg((dir & 0xffff0000) | ((val & 0xffff0000) >> 16), |
| 57 | CX18_REG_GPIO_OUT2); | 57 | CX18_REG_GPIO_OUT2); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | void cx18_gpio_init(struct cx18 *cx) | 60 | void cx18_gpio_init(struct cx18 *cx) |
| 61 | { | 61 | { |
| 62 | gpio_dir = cx->card->gpio_init.direction; | 62 | cx->gpio_dir = cx->card->gpio_init.direction; |
| 63 | gpio_val = cx->card->gpio_init.initial_value; | 63 | cx->gpio_val = cx->card->gpio_init.initial_value; |
| 64 | 64 | ||
| 65 | if (gpio_dir == 0) | 65 | if (cx->card->tuners[0].tuner == TUNER_XC2028) { |
| 66 | return; | 66 | cx->gpio_dir |= 1 << cx->card->xceive_pin; |
| 67 | cx->gpio_val |= 1 << cx->card->xceive_pin; | ||
| 68 | } | ||
| 67 | 69 | ||
| 68 | gpio_dir |= 1 << cx->card->xceive_pin; | 70 | if (cx->gpio_dir == 0) |
| 69 | gpio_val |= 1 << cx->card->xceive_pin; | 71 | return; |
| 70 | 72 | ||
| 71 | CX18_DEBUG_INFO("GPIO initial dir: %08x/%08x out: %08x/%08x\n", | 73 | CX18_DEBUG_INFO("GPIO initial dir: %08x/%08x out: %08x/%08x\n", |
| 72 | read_reg(CX18_REG_GPIO_DIR1), read_reg(CX18_REG_GPIO_DIR2), | 74 | read_reg(CX18_REG_GPIO_DIR1), read_reg(CX18_REG_GPIO_DIR2), |
| @@ -86,13 +88,12 @@ int cx18_reset_tuner_gpio(void *dev, int cmd, int value) | |||
| 86 | return 0; | 88 | return 0; |
| 87 | CX18_DEBUG_INFO("Resetting tuner\n"); | 89 | CX18_DEBUG_INFO("Resetting tuner\n"); |
| 88 | 90 | ||
| 89 | gpio_dir |= 1 << cx->card->xceive_pin; | 91 | cx->gpio_val &= ~(1 << cx->card->xceive_pin); |
| 90 | gpio_val &= ~(1 << cx->card->xceive_pin); | ||
| 91 | 92 | ||
| 92 | gpio_write(cx); | 93 | gpio_write(cx); |
| 93 | schedule_timeout_interruptible(msecs_to_jiffies(1)); | 94 | schedule_timeout_interruptible(msecs_to_jiffies(1)); |
| 94 | 95 | ||
| 95 | gpio_val |= 1 << cx->card->xceive_pin; | 96 | cx->gpio_val |= 1 << cx->card->xceive_pin; |
| 96 | gpio_write(cx); | 97 | gpio_write(cx); |
| 97 | schedule_timeout_interruptible(msecs_to_jiffies(1)); | 98 | schedule_timeout_interruptible(msecs_to_jiffies(1)); |
| 98 | return 0; | 99 | return 0; |
diff --git a/drivers/media/video/cx18/cx18-ioctl.c b/drivers/media/video/cx18/cx18-ioctl.c index dbdcb86ec5aa..4151f1e5493f 100644 --- a/drivers/media/video/cx18/cx18-ioctl.c +++ b/drivers/media/video/cx18/cx18-ioctl.c | |||
| @@ -247,7 +247,7 @@ static int cx18_try_or_set_fmt(struct cx18 *cx, int streamtype, | |||
| 247 | 247 | ||
| 248 | if (!set_fmt || (cx->params.width == w && cx->params.height == h)) | 248 | if (!set_fmt || (cx->params.width == w && cx->params.height == h)) |
| 249 | return 0; | 249 | return 0; |
| 250 | if (atomic_read(&cx->capturing) > 0) | 250 | if (atomic_read(&cx->ana_capturing) > 0) |
| 251 | return -EBUSY; | 251 | return -EBUSY; |
| 252 | 252 | ||
| 253 | cx->params.width = w; | 253 | cx->params.width = w; |
| @@ -264,7 +264,7 @@ static int cx18_try_or_set_fmt(struct cx18 *cx, int streamtype, | |||
| 264 | if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) { | 264 | if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) { |
| 265 | if (set_fmt && streamtype == CX18_ENC_STREAM_TYPE_VBI && | 265 | if (set_fmt && streamtype == CX18_ENC_STREAM_TYPE_VBI && |
| 266 | cx->vbi.sliced_in->service_set && | 266 | cx->vbi.sliced_in->service_set && |
| 267 | atomic_read(&cx->capturing) > 0) | 267 | atomic_read(&cx->ana_capturing) > 0) |
| 268 | return -EBUSY; | 268 | return -EBUSY; |
| 269 | if (set_fmt) { | 269 | if (set_fmt) { |
| 270 | cx->vbi.sliced_in->service_set = 0; | 270 | cx->vbi.sliced_in->service_set = 0; |
| @@ -293,7 +293,7 @@ static int cx18_try_or_set_fmt(struct cx18 *cx, int streamtype, | |||
| 293 | return 0; | 293 | return 0; |
| 294 | if (set == 0) | 294 | if (set == 0) |
| 295 | return -EINVAL; | 295 | return -EINVAL; |
| 296 | if (atomic_read(&cx->capturing) > 0 && cx->vbi.sliced_in->service_set == 0) | 296 | if (atomic_read(&cx->ana_capturing) > 0 && cx->vbi.sliced_in->service_set == 0) |
| 297 | return -EBUSY; | 297 | return -EBUSY; |
| 298 | cx18_av_cmd(cx, VIDIOC_S_FMT, fmt); | 298 | cx18_av_cmd(cx, VIDIOC_S_FMT, fmt); |
| 299 | memcpy(cx->vbi.sliced_in, vbifmt, sizeof(*cx->vbi.sliced_in)); | 299 | memcpy(cx->vbi.sliced_in, vbifmt, sizeof(*cx->vbi.sliced_in)); |
| @@ -581,7 +581,7 @@ int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd, void *arg | |||
| 581 | break; | 581 | break; |
| 582 | 582 | ||
| 583 | if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags) || | 583 | if (test_bit(CX18_F_I_RADIO_USER, &cx->i_flags) || |
| 584 | atomic_read(&cx->capturing) > 0) { | 584 | atomic_read(&cx->ana_capturing) > 0) { |
| 585 | /* Switching standard would turn off the radio or mess | 585 | /* Switching standard would turn off the radio or mess |
| 586 | with already running streams, prevent that by | 586 | with already running streams, prevent that by |
| 587 | returning EBUSY. */ | 587 | returning EBUSY. */ |
| @@ -677,7 +677,7 @@ int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd, void *arg | |||
| 677 | enc->flags = 0; | 677 | enc->flags = 0; |
| 678 | if (try) | 678 | if (try) |
| 679 | return 0; | 679 | return 0; |
| 680 | if (!atomic_read(&cx->capturing)) | 680 | if (!atomic_read(&cx->ana_capturing)) |
| 681 | return -EPERM; | 681 | return -EPERM; |
| 682 | if (test_and_set_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags)) | 682 | if (test_and_set_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags)) |
| 683 | return 0; | 683 | return 0; |
| @@ -689,7 +689,7 @@ int cx18_v4l2_ioctls(struct cx18 *cx, struct file *filp, unsigned cmd, void *arg | |||
| 689 | enc->flags = 0; | 689 | enc->flags = 0; |
| 690 | if (try) | 690 | if (try) |
| 691 | return 0; | 691 | return 0; |
| 692 | if (!atomic_read(&cx->capturing)) | 692 | if (!atomic_read(&cx->ana_capturing)) |
| 693 | return -EPERM; | 693 | return -EPERM; |
| 694 | if (!test_and_clear_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags)) | 694 | if (!test_and_clear_bit(CX18_F_I_ENC_PAUSED, &cx->i_flags)) |
| 695 | return 0; | 695 | return 0; |
diff --git a/drivers/media/video/cx18/cx18-irq.c b/drivers/media/video/cx18/cx18-irq.c index 6e14f8bda559..25114a5cbd57 100644 --- a/drivers/media/video/cx18/cx18-irq.c +++ b/drivers/media/video/cx18/cx18-irq.c | |||
| @@ -75,7 +75,7 @@ static void epu_dma_done(struct cx18 *cx, struct cx18_mailbox *mb) | |||
| 75 | 75 | ||
| 76 | cx18_buf_sync_for_device(s, buf); | 76 | cx18_buf_sync_for_device(s, buf); |
| 77 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle, | 77 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle, |
| 78 | (void *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, | 78 | (void __iomem *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, |
| 79 | 1, buf->id, s->buf_size); | 79 | 1, buf->id, s->buf_size); |
| 80 | } else | 80 | } else |
| 81 | set_bit(CX18_F_B_NEED_BUF_SWAP, &buf->b_flags); | 81 | set_bit(CX18_F_B_NEED_BUF_SWAP, &buf->b_flags); |
| @@ -161,13 +161,15 @@ irqreturn_t cx18_irq_handler(int irq, void *dev_id) | |||
| 161 | */ | 161 | */ |
| 162 | 162 | ||
| 163 | if (sw2) { | 163 | if (sw2) { |
| 164 | if (sw2 & (cx->scb->cpu2hpu_irq_ack | cx->scb->cpu2epu_irq_ack)) | 164 | if (sw2 & (readl(&cx->scb->cpu2hpu_irq_ack) | |
| 165 | readl(&cx->scb->cpu2epu_irq_ack))) | ||
| 165 | wake_up(&cx->mb_cpu_waitq); | 166 | wake_up(&cx->mb_cpu_waitq); |
| 166 | if (sw2 & (cx->scb->apu2hpu_irq_ack | cx->scb->apu2epu_irq_ack)) | 167 | if (sw2 & (readl(&cx->scb->apu2hpu_irq_ack) | |
| 168 | readl(&cx->scb->apu2epu_irq_ack))) | ||
| 167 | wake_up(&cx->mb_apu_waitq); | 169 | wake_up(&cx->mb_apu_waitq); |
| 168 | if (sw2 & cx->scb->epu2hpu_irq_ack) | 170 | if (sw2 & readl(&cx->scb->epu2hpu_irq_ack)) |
| 169 | wake_up(&cx->mb_epu_waitq); | 171 | wake_up(&cx->mb_epu_waitq); |
| 170 | if (sw2 & cx->scb->hpu2epu_irq_ack) | 172 | if (sw2 & readl(&cx->scb->hpu2epu_irq_ack)) |
| 171 | wake_up(&cx->mb_hpu_waitq); | 173 | wake_up(&cx->mb_hpu_waitq); |
| 172 | } | 174 | } |
| 173 | 175 | ||
diff --git a/drivers/media/video/cx18/cx18-mailbox.c b/drivers/media/video/cx18/cx18-mailbox.c index 0c5f328bca54..2a5ccef9185b 100644 --- a/drivers/media/video/cx18/cx18-mailbox.c +++ b/drivers/media/video/cx18/cx18-mailbox.c | |||
| @@ -94,10 +94,10 @@ static const struct cx18_api_info *find_api_info(u32 cmd) | |||
| 94 | return NULL; | 94 | return NULL; |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | static struct cx18_mailbox *cx18_mb_is_complete(struct cx18 *cx, int rpu, | 97 | static struct cx18_mailbox __iomem *cx18_mb_is_complete(struct cx18 *cx, int rpu, |
| 98 | u32 *state, u32 *irq, u32 *req) | 98 | u32 *state, u32 *irq, u32 *req) |
| 99 | { | 99 | { |
| 100 | struct cx18_mailbox *mb = NULL; | 100 | struct cx18_mailbox __iomem *mb = NULL; |
| 101 | int wait_count = 0; | 101 | int wait_count = 0; |
| 102 | u32 ack; | 102 | u32 ack; |
| 103 | 103 | ||
| @@ -142,7 +142,7 @@ static struct cx18_mailbox *cx18_mb_is_complete(struct cx18 *cx, int rpu, | |||
| 142 | long cx18_mb_ack(struct cx18 *cx, const struct cx18_mailbox *mb) | 142 | long cx18_mb_ack(struct cx18 *cx, const struct cx18_mailbox *mb) |
| 143 | { | 143 | { |
| 144 | const struct cx18_api_info *info = find_api_info(mb->cmd); | 144 | const struct cx18_api_info *info = find_api_info(mb->cmd); |
| 145 | struct cx18_mailbox *ack_mb; | 145 | struct cx18_mailbox __iomem *ack_mb; |
| 146 | u32 ack_irq; | 146 | u32 ack_irq; |
| 147 | u8 rpu = CPU; | 147 | u8 rpu = CPU; |
| 148 | 148 | ||
| @@ -182,7 +182,7 @@ static int cx18_api_call(struct cx18 *cx, u32 cmd, int args, u32 data[]) | |||
| 182 | { | 182 | { |
| 183 | const struct cx18_api_info *info = find_api_info(cmd); | 183 | const struct cx18_api_info *info = find_api_info(cmd); |
| 184 | u32 state = 0, irq = 0, req, oldreq, err; | 184 | u32 state = 0, irq = 0, req, oldreq, err; |
| 185 | struct cx18_mailbox *mb; | 185 | struct cx18_mailbox __iomem *mb; |
| 186 | wait_queue_head_t *waitq; | 186 | wait_queue_head_t *waitq; |
| 187 | int timeout = 100; | 187 | int timeout = 100; |
| 188 | int cnt = 0; | 188 | int cnt = 0; |
diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c index 4ca9d847f1b1..1b921a336092 100644 --- a/drivers/media/video/cx18/cx18-streams.c +++ b/drivers/media/video/cx18/cx18-streams.c | |||
| @@ -36,12 +36,13 @@ | |||
| 36 | #define CX18_DSP0_INTERRUPT_MASK 0xd0004C | 36 | #define CX18_DSP0_INTERRUPT_MASK 0xd0004C |
| 37 | 37 | ||
| 38 | static struct file_operations cx18_v4l2_enc_fops = { | 38 | static struct file_operations cx18_v4l2_enc_fops = { |
| 39 | .owner = THIS_MODULE, | 39 | .owner = THIS_MODULE, |
| 40 | .read = cx18_v4l2_read, | 40 | .read = cx18_v4l2_read, |
| 41 | .open = cx18_v4l2_open, | 41 | .open = cx18_v4l2_open, |
| 42 | .ioctl = cx18_v4l2_ioctl, | 42 | .ioctl = cx18_v4l2_ioctl, |
| 43 | .release = cx18_v4l2_close, | 43 | .compat_ioctl = v4l_compat_ioctl32, |
| 44 | .poll = cx18_v4l2_enc_poll, | 44 | .release = cx18_v4l2_close, |
| 45 | .poll = cx18_v4l2_enc_poll, | ||
| 45 | }; | 46 | }; |
| 46 | 47 | ||
| 47 | /* offset from 0 to register ts v4l2 minors on */ | 48 | /* offset from 0 to register ts v4l2 minors on */ |
| @@ -443,7 +444,7 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s) | |||
| 443 | s->handle = data[0]; | 444 | s->handle = data[0]; |
| 444 | cx18_vapi(cx, CX18_CPU_SET_CHANNEL_TYPE, 2, s->handle, captype); | 445 | cx18_vapi(cx, CX18_CPU_SET_CHANNEL_TYPE, 2, s->handle, captype); |
| 445 | 446 | ||
| 446 | if (atomic_read(&cx->capturing) == 0 && !ts) { | 447 | if (atomic_read(&cx->ana_capturing) == 0 && !ts) { |
| 447 | /* Stuff from Windows, we don't know what it is */ | 448 | /* Stuff from Windows, we don't know what it is */ |
| 448 | cx18_vapi(cx, CX18_CPU_SET_VER_CROP_LINE, 2, s->handle, 0); | 449 | cx18_vapi(cx, CX18_CPU_SET_VER_CROP_LINE, 2, s->handle, 0); |
| 449 | cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 3, s->handle, 3, 1); | 450 | cx18_vapi(cx, CX18_CPU_SET_MISC_PARAMETERS, 3, s->handle, 3, 1); |
| @@ -466,14 +467,14 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s) | |||
| 466 | cx2341x_update(cx, cx18_api_func, NULL, &cx->params); | 467 | cx2341x_update(cx, cx18_api_func, NULL, &cx->params); |
| 467 | } | 468 | } |
| 468 | 469 | ||
| 469 | if (atomic_read(&cx->capturing) == 0) { | 470 | if (atomic_read(&cx->tot_capturing) == 0) { |
| 470 | clear_bit(CX18_F_I_EOS, &cx->i_flags); | 471 | clear_bit(CX18_F_I_EOS, &cx->i_flags); |
| 471 | write_reg(7, CX18_DSP0_INTERRUPT_MASK); | 472 | write_reg(7, CX18_DSP0_INTERRUPT_MASK); |
| 472 | } | 473 | } |
| 473 | 474 | ||
| 474 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL_ACK, 3, s->handle, | 475 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL_ACK, 3, s->handle, |
| 475 | (void *)&cx->scb->cpu_mdl_ack[s->type][0] - cx->enc_mem, | 476 | (void __iomem *)&cx->scb->cpu_mdl_ack[s->type][0] - cx->enc_mem, |
| 476 | (void *)&cx->scb->cpu_mdl_ack[s->type][1] - cx->enc_mem); | 477 | (void __iomem *)&cx->scb->cpu_mdl_ack[s->type][1] - cx->enc_mem); |
| 477 | 478 | ||
| 478 | list_for_each(p, &s->q_free.list) { | 479 | list_for_each(p, &s->q_free.list) { |
| 479 | struct cx18_buffer *buf = list_entry(p, struct cx18_buffer, list); | 480 | struct cx18_buffer *buf = list_entry(p, struct cx18_buffer, list); |
| @@ -481,8 +482,8 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s) | |||
| 481 | writel(buf->dma_handle, &cx->scb->cpu_mdl[buf->id].paddr); | 482 | writel(buf->dma_handle, &cx->scb->cpu_mdl[buf->id].paddr); |
| 482 | writel(s->buf_size, &cx->scb->cpu_mdl[buf->id].length); | 483 | writel(s->buf_size, &cx->scb->cpu_mdl[buf->id].length); |
| 483 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle, | 484 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle, |
| 484 | (void *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, 1, | 485 | (void __iomem *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, |
| 485 | buf->id, s->buf_size); | 486 | 1, buf->id, s->buf_size); |
| 486 | } | 487 | } |
| 487 | /* begin_capture */ | 488 | /* begin_capture */ |
| 488 | if (cx18_vapi(cx, CX18_CPU_CAPTURE_START, 1, s->handle)) { | 489 | if (cx18_vapi(cx, CX18_CPU_CAPTURE_START, 1, s->handle)) { |
| @@ -492,7 +493,9 @@ int cx18_start_v4l2_encode_stream(struct cx18_stream *s) | |||
| 492 | } | 493 | } |
| 493 | 494 | ||
| 494 | /* you're live! sit back and await interrupts :) */ | 495 | /* you're live! sit back and await interrupts :) */ |
| 495 | atomic_inc(&cx->capturing); | 496 | if (!ts) |
| 497 | atomic_inc(&cx->ana_capturing); | ||
| 498 | atomic_inc(&cx->tot_capturing); | ||
| 496 | return 0; | 499 | return 0; |
| 497 | } | 500 | } |
| 498 | 501 | ||
| @@ -523,7 +526,7 @@ int cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end) | |||
| 523 | 526 | ||
| 524 | CX18_DEBUG_INFO("Stop Capture\n"); | 527 | CX18_DEBUG_INFO("Stop Capture\n"); |
| 525 | 528 | ||
| 526 | if (atomic_read(&cx->capturing) == 0) | 529 | if (atomic_read(&cx->tot_capturing) == 0) |
| 527 | return 0; | 530 | return 0; |
| 528 | 531 | ||
| 529 | if (s->type == CX18_ENC_STREAM_TYPE_MPG) | 532 | if (s->type == CX18_ENC_STREAM_TYPE_MPG) |
| @@ -537,7 +540,9 @@ int cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end) | |||
| 537 | CX18_INFO("ignoring gop_end: not (yet?) supported by the firmware\n"); | 540 | CX18_INFO("ignoring gop_end: not (yet?) supported by the firmware\n"); |
| 538 | } | 541 | } |
| 539 | 542 | ||
| 540 | atomic_dec(&cx->capturing); | 543 | if (s->type != CX18_ENC_STREAM_TYPE_TS) |
| 544 | atomic_dec(&cx->ana_capturing); | ||
| 545 | atomic_dec(&cx->tot_capturing); | ||
| 541 | 546 | ||
| 542 | /* Clear capture and no-read bits */ | 547 | /* Clear capture and no-read bits */ |
| 543 | clear_bit(CX18_F_S_STREAMING, &s->s_flags); | 548 | clear_bit(CX18_F_S_STREAMING, &s->s_flags); |
| @@ -545,7 +550,7 @@ int cx18_stop_v4l2_encode_stream(struct cx18_stream *s, int gop_end) | |||
| 545 | cx18_vapi(cx, CX18_DESTROY_TASK, 1, s->handle); | 550 | cx18_vapi(cx, CX18_DESTROY_TASK, 1, s->handle); |
| 546 | s->handle = 0xffffffff; | 551 | s->handle = 0xffffffff; |
| 547 | 552 | ||
| 548 | if (atomic_read(&cx->capturing) > 0) | 553 | if (atomic_read(&cx->tot_capturing) > 0) |
| 549 | return 0; | 554 | return 0; |
| 550 | 555 | ||
| 551 | write_reg(5, CX18_DSP0_INTERRUPT_MASK); | 556 | write_reg(5, CX18_DSP0_INTERRUPT_MASK); |
diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c index f24abcd06dea..c4cc2f3b8876 100644 --- a/drivers/media/video/cx23885/cx23885-core.c +++ b/drivers/media/video/cx23885/cx23885-core.c | |||
| @@ -823,7 +823,7 @@ static void cx23885_dev_unregister(struct cx23885_dev *dev) | |||
| 823 | iounmap(dev->lmmio); | 823 | iounmap(dev->lmmio); |
| 824 | } | 824 | } |
| 825 | 825 | ||
| 826 | static u32* cx23885_risc_field(u32 *rp, struct scatterlist *sglist, | 826 | static __le32* cx23885_risc_field(__le32 *rp, struct scatterlist *sglist, |
| 827 | unsigned int offset, u32 sync_line, | 827 | unsigned int offset, u32 sync_line, |
| 828 | unsigned int bpl, unsigned int padding, | 828 | unsigned int bpl, unsigned int padding, |
| 829 | unsigned int lines) | 829 | unsigned int lines) |
| @@ -883,7 +883,7 @@ int cx23885_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc, | |||
| 883 | unsigned int padding, unsigned int lines) | 883 | unsigned int padding, unsigned int lines) |
| 884 | { | 884 | { |
| 885 | u32 instructions, fields; | 885 | u32 instructions, fields; |
| 886 | u32 *rp; | 886 | __le32 *rp; |
| 887 | int rc; | 887 | int rc; |
| 888 | 888 | ||
| 889 | fields = 0; | 889 | fields = 0; |
| @@ -924,7 +924,7 @@ static int cx23885_risc_databuffer(struct pci_dev *pci, | |||
| 924 | unsigned int lines) | 924 | unsigned int lines) |
| 925 | { | 925 | { |
| 926 | u32 instructions; | 926 | u32 instructions; |
| 927 | u32 *rp; | 927 | __le32 *rp; |
| 928 | int rc; | 928 | int rc; |
| 929 | 929 | ||
| 930 | /* estimate risc mem: worst case is one write per page border + | 930 | /* estimate risc mem: worst case is one write per page border + |
| @@ -951,7 +951,7 @@ static int cx23885_risc_databuffer(struct pci_dev *pci, | |||
| 951 | int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, | 951 | int cx23885_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, |
| 952 | u32 reg, u32 mask, u32 value) | 952 | u32 reg, u32 mask, u32 value) |
| 953 | { | 953 | { |
| 954 | u32 *rp; | 954 | __le32 *rp; |
| 955 | int rc; | 955 | int rc; |
| 956 | 956 | ||
| 957 | if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0) | 957 | if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0) |
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c index aeba26dc0a37..fa6d398e97b9 100644 --- a/drivers/media/video/cx88/cx88-cards.c +++ b/drivers/media/video/cx88/cx88-cards.c | |||
| @@ -1493,10 +1493,16 @@ static const struct cx88_board cx88_boards[] = { | |||
| 1493 | }, | 1493 | }, |
| 1494 | }, | 1494 | }, |
| 1495 | [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { | 1495 | [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { |
| 1496 | .name = "PowerColor Real Angel 330", | 1496 | .name = "PowerColor RA330", /* Long names may confuse LIRC. */ |
| 1497 | .tuner_type = TUNER_XC2028, | 1497 | .tuner_type = TUNER_XC2028, |
| 1498 | .tuner_addr = 0x61, | 1498 | .tuner_addr = 0x61, |
| 1499 | .input = { { | 1499 | .input = { { |
| 1500 | .type = CX88_VMUX_DEBUG, | ||
| 1501 | .vmux = 3, /* Due to the way the cx88 driver is written, */ | ||
| 1502 | .gpio0 = 0x00ff, /* there is no way to deactivate audio pass- */ | ||
| 1503 | .gpio1 = 0xf39d, /* through without this entry. Furthermore, if */ | ||
| 1504 | .gpio3 = 0x0000, /* the TV mux entry is first, you get audio */ | ||
| 1505 | }, { /* from the tuner on boot for a little while. */ | ||
| 1500 | .type = CX88_VMUX_TELEVISION, | 1506 | .type = CX88_VMUX_TELEVISION, |
| 1501 | .vmux = 0, | 1507 | .vmux = 0, |
| 1502 | .gpio0 = 0x00ff, | 1508 | .gpio0 = 0x00ff, |
| @@ -2424,8 +2430,9 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) | |||
| 2424 | 2430 | ||
| 2425 | switch (core->boardnr) { | 2431 | switch (core->boardnr) { |
| 2426 | case CX88_BOARD_POWERCOLOR_REAL_ANGEL: | 2432 | case CX88_BOARD_POWERCOLOR_REAL_ANGEL: |
| 2427 | /* Doesn't work with firmware version 2.7 */ | 2433 | /* Now works with firmware version 2.7 */ |
| 2428 | ctl->fname = "xc3028-v25.fw"; | 2434 | if (core->i2c_algo.udelay < 16) |
| 2435 | core->i2c_algo.udelay = 16; | ||
| 2429 | break; | 2436 | break; |
| 2430 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: | 2437 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: |
| 2431 | ctl->scode_table = XC3028_FE_ZARLINK456; | 2438 | ctl->scode_table = XC3028_FE_ZARLINK456; |
diff --git a/drivers/media/video/cx88/cx88-core.c b/drivers/media/video/cx88/cx88-core.c index c4d1aff1fdb4..60eeda3057e9 100644 --- a/drivers/media/video/cx88/cx88-core.c +++ b/drivers/media/video/cx88/cx88-core.c | |||
| @@ -70,7 +70,7 @@ static DEFINE_MUTEX(devlist); | |||
| 70 | 70 | ||
| 71 | /* @lpi: lines per IRQ, or 0 to not generate irqs. Note: IRQ to be | 71 | /* @lpi: lines per IRQ, or 0 to not generate irqs. Note: IRQ to be |
| 72 | generated _after_ lpi lines are transferred. */ | 72 | generated _after_ lpi lines are transferred. */ |
| 73 | static u32* cx88_risc_field(u32 *rp, struct scatterlist *sglist, | 73 | static __le32* cx88_risc_field(__le32 *rp, struct scatterlist *sglist, |
| 74 | unsigned int offset, u32 sync_line, | 74 | unsigned int offset, u32 sync_line, |
| 75 | unsigned int bpl, unsigned int padding, | 75 | unsigned int bpl, unsigned int padding, |
| 76 | unsigned int lines, unsigned int lpi) | 76 | unsigned int lines, unsigned int lpi) |
| @@ -130,7 +130,7 @@ int cx88_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc, | |||
| 130 | unsigned int bpl, unsigned int padding, unsigned int lines) | 130 | unsigned int bpl, unsigned int padding, unsigned int lines) |
| 131 | { | 131 | { |
| 132 | u32 instructions,fields; | 132 | u32 instructions,fields; |
| 133 | u32 *rp; | 133 | __le32 *rp; |
| 134 | int rc; | 134 | int rc; |
| 135 | 135 | ||
| 136 | fields = 0; | 136 | fields = 0; |
| @@ -168,7 +168,7 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc, | |||
| 168 | unsigned int lines, unsigned int lpi) | 168 | unsigned int lines, unsigned int lpi) |
| 169 | { | 169 | { |
| 170 | u32 instructions; | 170 | u32 instructions; |
| 171 | u32 *rp; | 171 | __le32 *rp; |
| 172 | int rc; | 172 | int rc; |
| 173 | 173 | ||
| 174 | /* estimate risc mem: worst case is one write per page border + | 174 | /* estimate risc mem: worst case is one write per page border + |
| @@ -193,7 +193,7 @@ int cx88_risc_databuffer(struct pci_dev *pci, struct btcx_riscmem *risc, | |||
| 193 | int cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, | 193 | int cx88_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc, |
| 194 | u32 reg, u32 mask, u32 value) | 194 | u32 reg, u32 mask, u32 value) |
| 195 | { | 195 | { |
| 196 | u32 *rp; | 196 | __le32 *rp; |
| 197 | int rc; | 197 | int rc; |
| 198 | 198 | ||
| 199 | if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0) | 199 | if ((rc = btcx_riscmem_alloc(pci, risc, 4*16)) < 0) |
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index 8996175cc950..fb163ecd9216 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
| @@ -1166,13 +1166,13 @@ static int vidioc_g_register(struct file *file, void *priv, | |||
| 1166 | 1166 | ||
| 1167 | reg->val = ret; | 1167 | reg->val = ret; |
| 1168 | } else { | 1168 | } else { |
| 1169 | u64 val = 0; | 1169 | __le64 val = 0; |
| 1170 | ret = em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS, | 1170 | ret = em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS, |
| 1171 | reg->reg, (char *)&val, 2); | 1171 | reg->reg, (char *)&val, 2); |
| 1172 | if (ret < 0) | 1172 | if (ret < 0) |
| 1173 | return ret; | 1173 | return ret; |
| 1174 | 1174 | ||
| 1175 | reg->val = cpu_to_le64((__u64)val); | 1175 | reg->val = le64_to_cpu(val); |
| 1176 | } | 1176 | } |
| 1177 | 1177 | ||
| 1178 | return 0; | 1178 | return 0; |
| @@ -1183,9 +1183,9 @@ static int vidioc_s_register(struct file *file, void *priv, | |||
| 1183 | { | 1183 | { |
| 1184 | struct em28xx_fh *fh = priv; | 1184 | struct em28xx_fh *fh = priv; |
| 1185 | struct em28xx *dev = fh->dev; | 1185 | struct em28xx *dev = fh->dev; |
| 1186 | u64 buf; | 1186 | __le64 buf; |
| 1187 | 1187 | ||
| 1188 | buf = le64_to_cpu((__u64)reg->val); | 1188 | buf = cpu_to_le64(reg->val); |
| 1189 | 1189 | ||
| 1190 | return em28xx_write_regs(dev, reg->reg, (char *)&buf, | 1190 | return em28xx_write_regs(dev, reg->reg, (char *)&buf, |
| 1191 | em28xx_reg_len(reg->reg)); | 1191 | em28xx_reg_len(reg->reg)); |
diff --git a/drivers/media/video/ivtv/ivtv-driver.h b/drivers/media/video/ivtv/ivtv-driver.h index ba06e813c58c..9d23b1efd36d 100644 --- a/drivers/media/video/ivtv/ivtv-driver.h +++ b/drivers/media/video/ivtv/ivtv-driver.h | |||
| @@ -259,6 +259,12 @@ struct ivtv_mailbox_data { | |||
| 259 | 259 | ||
| 260 | /* Scatter-Gather array element, used in DMA transfers */ | 260 | /* Scatter-Gather array element, used in DMA transfers */ |
| 261 | struct ivtv_sg_element { | 261 | struct ivtv_sg_element { |
| 262 | __le32 src; | ||
| 263 | __le32 dst; | ||
| 264 | __le32 size; | ||
| 265 | }; | ||
| 266 | |||
| 267 | struct ivtv_sg_host_element { | ||
| 262 | u32 src; | 268 | u32 src; |
| 263 | u32 dst; | 269 | u32 dst; |
| 264 | u32 size; | 270 | u32 size; |
| @@ -349,8 +355,8 @@ struct ivtv_stream { | |||
| 349 | u16 dma_xfer_cnt; | 355 | u16 dma_xfer_cnt; |
| 350 | 356 | ||
| 351 | /* Base Dev SG Array for cx23415/6 */ | 357 | /* Base Dev SG Array for cx23415/6 */ |
| 352 | struct ivtv_sg_element *sg_pending; | 358 | struct ivtv_sg_host_element *sg_pending; |
| 353 | struct ivtv_sg_element *sg_processing; | 359 | struct ivtv_sg_host_element *sg_processing; |
| 354 | struct ivtv_sg_element *sg_dma; | 360 | struct ivtv_sg_element *sg_dma; |
| 355 | dma_addr_t sg_handle; | 361 | dma_addr_t sg_handle; |
| 356 | int sg_pending_size; | 362 | int sg_pending_size; |
diff --git a/drivers/media/video/ivtv/ivtv-fileops.c b/drivers/media/video/ivtv/ivtv-fileops.c index f2fa434b677b..db813e071ce6 100644 --- a/drivers/media/video/ivtv/ivtv-fileops.c +++ b/drivers/media/video/ivtv/ivtv-fileops.c | |||
| @@ -587,7 +587,7 @@ retry: | |||
| 587 | since we may get here before the stream has been fully set-up */ | 587 | since we may get here before the stream has been fully set-up */ |
| 588 | if (mode == OUT_YUV && s->q_full.length == 0 && itv->dma_data_req_size) { | 588 | if (mode == OUT_YUV && s->q_full.length == 0 && itv->dma_data_req_size) { |
| 589 | while (count >= itv->dma_data_req_size) { | 589 | while (count >= itv->dma_data_req_size) { |
| 590 | if (!ivtv_yuv_udma_stream_frame (itv, (void *)user_buf)) { | 590 | if (!ivtv_yuv_udma_stream_frame (itv, (void __user *)user_buf)) { |
| 591 | bytes_written += itv->dma_data_req_size; | 591 | bytes_written += itv->dma_data_req_size; |
| 592 | user_buf += itv->dma_data_req_size; | 592 | user_buf += itv->dma_data_req_size; |
| 593 | count -= itv->dma_data_req_size; | 593 | count -= itv->dma_data_req_size; |
diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c index d8ba3a4a8761..fba150a6cd23 100644 --- a/drivers/media/video/ivtv/ivtv-irq.c +++ b/drivers/media/video/ivtv/ivtv-irq.c | |||
| @@ -231,14 +231,14 @@ static void dma_post(struct ivtv_stream *s) | |||
| 231 | struct ivtv_buffer *buf = NULL; | 231 | struct ivtv_buffer *buf = NULL; |
| 232 | struct list_head *p; | 232 | struct list_head *p; |
| 233 | u32 offset; | 233 | u32 offset; |
| 234 | u32 *u32buf; | 234 | __le32 *u32buf; |
| 235 | int x = 0; | 235 | int x = 0; |
| 236 | 236 | ||
| 237 | IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA", | 237 | IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA", |
| 238 | s->name, s->dma_offset); | 238 | s->name, s->dma_offset); |
| 239 | list_for_each(p, &s->q_dma.list) { | 239 | list_for_each(p, &s->q_dma.list) { |
| 240 | buf = list_entry(p, struct ivtv_buffer, list); | 240 | buf = list_entry(p, struct ivtv_buffer, list); |
| 241 | u32buf = (u32 *)buf->buf; | 241 | u32buf = (__le32 *)buf->buf; |
| 242 | 242 | ||
| 243 | /* Sync Buffer */ | 243 | /* Sync Buffer */ |
| 244 | ivtv_buf_sync_for_cpu(s, buf); | 244 | ivtv_buf_sync_for_cpu(s, buf); |
| @@ -444,7 +444,7 @@ static void ivtv_dma_enc_start(struct ivtv_stream *s) | |||
| 444 | } | 444 | } |
| 445 | 445 | ||
| 446 | s->dma_xfer_cnt++; | 446 | s->dma_xfer_cnt++; |
| 447 | memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_element) * s->sg_pending_size); | 447 | memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size); |
| 448 | s->sg_processing_size = s->sg_pending_size; | 448 | s->sg_processing_size = s->sg_pending_size; |
| 449 | s->sg_pending_size = 0; | 449 | s->sg_pending_size = 0; |
| 450 | s->sg_processed = 0; | 450 | s->sg_processed = 0; |
| @@ -473,7 +473,7 @@ static void ivtv_dma_dec_start(struct ivtv_stream *s) | |||
| 473 | if (s->q_predma.bytesused) | 473 | if (s->q_predma.bytesused) |
| 474 | ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused); | 474 | ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused); |
| 475 | s->dma_xfer_cnt++; | 475 | s->dma_xfer_cnt++; |
| 476 | memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_element) * s->sg_pending_size); | 476 | memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size); |
| 477 | s->sg_processing_size = s->sg_pending_size; | 477 | s->sg_processing_size = s->sg_pending_size; |
| 478 | s->sg_pending_size = 0; | 478 | s->sg_pending_size = 0; |
| 479 | s->sg_processed = 0; | 479 | s->sg_processed = 0; |
diff --git a/drivers/media/video/ivtv/ivtv-queue.c b/drivers/media/video/ivtv/ivtv-queue.c index fc8b1eaa333b..71bd13e22e2e 100644 --- a/drivers/media/video/ivtv/ivtv-queue.c +++ b/drivers/media/video/ivtv/ivtv-queue.c | |||
| @@ -193,7 +193,7 @@ void ivtv_flush_queues(struct ivtv_stream *s) | |||
| 193 | int ivtv_stream_alloc(struct ivtv_stream *s) | 193 | int ivtv_stream_alloc(struct ivtv_stream *s) |
| 194 | { | 194 | { |
| 195 | struct ivtv *itv = s->itv; | 195 | struct ivtv *itv = s->itv; |
| 196 | int SGsize = sizeof(struct ivtv_sg_element) * s->buffers; | 196 | int SGsize = sizeof(struct ivtv_sg_host_element) * s->buffers; |
| 197 | int i; | 197 | int i; |
| 198 | 198 | ||
| 199 | if (s->buffers == 0) | 199 | if (s->buffers == 0) |
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c index c47c2b945147..c854285a4371 100644 --- a/drivers/media/video/ivtv/ivtv-streams.c +++ b/drivers/media/video/ivtv/ivtv-streams.c | |||
| @@ -44,23 +44,25 @@ | |||
| 44 | #include "ivtv-streams.h" | 44 | #include "ivtv-streams.h" |
| 45 | 45 | ||
| 46 | static const struct file_operations ivtv_v4l2_enc_fops = { | 46 | static const struct file_operations ivtv_v4l2_enc_fops = { |
| 47 | .owner = THIS_MODULE, | 47 | .owner = THIS_MODULE, |
| 48 | .read = ivtv_v4l2_read, | 48 | .read = ivtv_v4l2_read, |
| 49 | .write = ivtv_v4l2_write, | 49 | .write = ivtv_v4l2_write, |
| 50 | .open = ivtv_v4l2_open, | 50 | .open = ivtv_v4l2_open, |
| 51 | .ioctl = ivtv_v4l2_ioctl, | 51 | .ioctl = ivtv_v4l2_ioctl, |
| 52 | .release = ivtv_v4l2_close, | 52 | .compat_ioctl = v4l_compat_ioctl32, |
| 53 | .poll = ivtv_v4l2_enc_poll, | 53 | .release = ivtv_v4l2_close, |
| 54 | .poll = ivtv_v4l2_enc_poll, | ||
| 54 | }; | 55 | }; |
| 55 | 56 | ||
| 56 | static const struct file_operations ivtv_v4l2_dec_fops = { | 57 | static const struct file_operations ivtv_v4l2_dec_fops = { |
| 57 | .owner = THIS_MODULE, | 58 | .owner = THIS_MODULE, |
| 58 | .read = ivtv_v4l2_read, | 59 | .read = ivtv_v4l2_read, |
| 59 | .write = ivtv_v4l2_write, | 60 | .write = ivtv_v4l2_write, |
| 60 | .open = ivtv_v4l2_open, | 61 | .open = ivtv_v4l2_open, |
| 61 | .ioctl = ivtv_v4l2_ioctl, | 62 | .ioctl = ivtv_v4l2_ioctl, |
| 62 | .release = ivtv_v4l2_close, | 63 | .compat_ioctl = v4l_compat_ioctl32, |
| 63 | .poll = ivtv_v4l2_dec_poll, | 64 | .release = ivtv_v4l2_close, |
| 65 | .poll = ivtv_v4l2_dec_poll, | ||
| 64 | }; | 66 | }; |
| 65 | 67 | ||
| 66 | #define IVTV_V4L2_DEC_MPG_OFFSET 16 /* offset from 0 to register decoder mpg v4l2 minors on */ | 68 | #define IVTV_V4L2_DEC_MPG_OFFSET 16 /* offset from 0 to register decoder mpg v4l2 minors on */ |
diff --git a/drivers/media/video/ivtv/ivtv-version.h b/drivers/media/video/ivtv/ivtv-version.h index 02c5ab071d1b..442f43f11b73 100644 --- a/drivers/media/video/ivtv/ivtv-version.h +++ b/drivers/media/video/ivtv/ivtv-version.h | |||
| @@ -22,8 +22,8 @@ | |||
| 22 | 22 | ||
| 23 | #define IVTV_DRIVER_NAME "ivtv" | 23 | #define IVTV_DRIVER_NAME "ivtv" |
| 24 | #define IVTV_DRIVER_VERSION_MAJOR 1 | 24 | #define IVTV_DRIVER_VERSION_MAJOR 1 |
| 25 | #define IVTV_DRIVER_VERSION_MINOR 2 | 25 | #define IVTV_DRIVER_VERSION_MINOR 3 |
| 26 | #define IVTV_DRIVER_VERSION_PATCHLEVEL 1 | 26 | #define IVTV_DRIVER_VERSION_PATCHLEVEL 0 |
| 27 | 27 | ||
| 28 | #define IVTV_VERSION __stringify(IVTV_DRIVER_VERSION_MAJOR) "." __stringify(IVTV_DRIVER_VERSION_MINOR) "." __stringify(IVTV_DRIVER_VERSION_PATCHLEVEL) | 28 | #define IVTV_VERSION __stringify(IVTV_DRIVER_VERSION_MAJOR) "." __stringify(IVTV_DRIVER_VERSION_MINOR) "." __stringify(IVTV_DRIVER_VERSION_PATCHLEVEL) |
| 29 | #define IVTV_DRIVER_VERSION KERNEL_VERSION(IVTV_DRIVER_VERSION_MAJOR,IVTV_DRIVER_VERSION_MINOR,IVTV_DRIVER_VERSION_PATCHLEVEL) | 29 | #define IVTV_DRIVER_VERSION KERNEL_VERSION(IVTV_DRIVER_VERSION_MAJOR,IVTV_DRIVER_VERSION_MINOR,IVTV_DRIVER_VERSION_PATCHLEVEL) |
diff --git a/drivers/media/video/ivtv/ivtv-yuv.c b/drivers/media/video/ivtv/ivtv-yuv.c index a9417f6e4087..3092ff1d00a0 100644 --- a/drivers/media/video/ivtv/ivtv-yuv.c +++ b/drivers/media/video/ivtv/ivtv-yuv.c | |||
| @@ -1116,7 +1116,7 @@ void ivtv_yuv_setup_stream_frame(struct ivtv *itv) | |||
| 1116 | } | 1116 | } |
| 1117 | 1117 | ||
| 1118 | /* Attempt to dma a frame from a user buffer */ | 1118 | /* Attempt to dma a frame from a user buffer */ |
| 1119 | int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void *src) | 1119 | int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void __user *src) |
| 1120 | { | 1120 | { |
| 1121 | struct yuv_playback_info *yi = &itv->yuv_info; | 1121 | struct yuv_playback_info *yi = &itv->yuv_info; |
| 1122 | struct ivtv_dma_frame dma_args; | 1122 | struct ivtv_dma_frame dma_args; |
diff --git a/drivers/media/video/ivtv/ivtv-yuv.h b/drivers/media/video/ivtv/ivtv-yuv.h index 2fe5f1250762..ca5173fbf006 100644 --- a/drivers/media/video/ivtv/ivtv-yuv.h +++ b/drivers/media/video/ivtv/ivtv-yuv.h | |||
| @@ -35,7 +35,7 @@ extern const u32 yuv_offset[IVTV_YUV_BUFFERS]; | |||
| 35 | 35 | ||
| 36 | int ivtv_yuv_filter_check(struct ivtv *itv); | 36 | int ivtv_yuv_filter_check(struct ivtv *itv); |
| 37 | void ivtv_yuv_setup_stream_frame(struct ivtv *itv); | 37 | void ivtv_yuv_setup_stream_frame(struct ivtv *itv); |
| 38 | int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void *src); | 38 | int ivtv_yuv_udma_stream_frame(struct ivtv *itv, void __user *src); |
| 39 | void ivtv_yuv_frame_complete(struct ivtv *itv); | 39 | void ivtv_yuv_frame_complete(struct ivtv *itv); |
| 40 | int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args); | 40 | int ivtv_yuv_prep_frame(struct ivtv *itv, struct ivtv_dma_frame *args); |
| 41 | void ivtv_yuv_close(struct ivtv *itv); | 41 | void ivtv_yuv_close(struct ivtv *itv); |
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 1314522a8130..81431ee41842 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
| @@ -163,8 +163,7 @@ ts_mmap(struct file *file, struct vm_area_struct * vma) | |||
| 163 | static int empress_querycap(struct file *file, void *priv, | 163 | static int empress_querycap(struct file *file, void *priv, |
| 164 | struct v4l2_capability *cap) | 164 | struct v4l2_capability *cap) |
| 165 | { | 165 | { |
| 166 | struct saa7134_fh *fh = priv; | 166 | struct saa7134_dev *dev = file->private_data; |
| 167 | struct saa7134_dev *dev = fh->dev; | ||
| 168 | 167 | ||
| 169 | strcpy(cap->driver, "saa7134"); | 168 | strcpy(cap->driver, "saa7134"); |
| 170 | strlcpy(cap->card, saa7134_boards[dev->board].name, | 169 | strlcpy(cap->card, saa7134_boards[dev->board].name, |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index a0f7bc1edaa2..0d12ace61665 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
| @@ -536,7 +536,7 @@ static void set_addr(struct i2c_client *c, struct tuner_setup *tun_setup) | |||
| 536 | static inline int check_mode(struct tuner *t, char *cmd) | 536 | static inline int check_mode(struct tuner *t, char *cmd) |
| 537 | { | 537 | { |
| 538 | if ((1 << t->mode & t->mode_mask) == 0) { | 538 | if ((1 << t->mode & t->mode_mask) == 0) { |
| 539 | return EINVAL; | 539 | return -EINVAL; |
| 540 | } | 540 | } |
| 541 | 541 | ||
| 542 | switch (t->mode) { | 542 | switch (t->mode) { |
| @@ -730,11 +730,11 @@ static inline int set_mode(struct i2c_client *client, struct tuner *t, int mode, | |||
| 730 | 730 | ||
| 731 | t->mode = mode; | 731 | t->mode = mode; |
| 732 | 732 | ||
| 733 | if (check_mode(t, cmd) == EINVAL) { | 733 | if (check_mode(t, cmd) == -EINVAL) { |
| 734 | t->mode = T_STANDBY; | 734 | t->mode = T_STANDBY; |
| 735 | if (analog_ops->standby) | 735 | if (analog_ops->standby) |
| 736 | analog_ops->standby(&t->fe); | 736 | analog_ops->standby(&t->fe); |
| 737 | return EINVAL; | 737 | return -EINVAL; |
| 738 | } | 738 | } |
| 739 | return 0; | 739 | return 0; |
| 740 | } | 740 | } |
| @@ -776,13 +776,13 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 776 | break; | 776 | break; |
| 777 | case AUDC_SET_RADIO: | 777 | case AUDC_SET_RADIO: |
| 778 | if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO") | 778 | if (set_mode(client, t, V4L2_TUNER_RADIO, "AUDC_SET_RADIO") |
| 779 | == EINVAL) | 779 | == -EINVAL) |
| 780 | return 0; | 780 | return 0; |
| 781 | if (t->radio_freq) | 781 | if (t->radio_freq) |
| 782 | set_freq(client, t->radio_freq); | 782 | set_freq(client, t->radio_freq); |
| 783 | break; | 783 | break; |
| 784 | case TUNER_SET_STANDBY: | 784 | case TUNER_SET_STANDBY: |
| 785 | if (check_mode(t, "TUNER_SET_STANDBY") == EINVAL) | 785 | if (check_mode(t, "TUNER_SET_STANDBY") == -EINVAL) |
| 786 | return 0; | 786 | return 0; |
| 787 | t->mode = T_STANDBY; | 787 | t->mode = T_STANDBY; |
| 788 | if (analog_ops->standby) | 788 | if (analog_ops->standby) |
| @@ -790,9 +790,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 790 | break; | 790 | break; |
| 791 | #ifdef CONFIG_VIDEO_ALLOW_V4L1 | 791 | #ifdef CONFIG_VIDEO_ALLOW_V4L1 |
| 792 | case VIDIOCSAUDIO: | 792 | case VIDIOCSAUDIO: |
| 793 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) | 793 | if (check_mode(t, "VIDIOCSAUDIO") == -EINVAL) |
| 794 | return 0; | 794 | return 0; |
| 795 | if (check_v4l2(t) == EINVAL) | 795 | if (check_v4l2(t) == -EINVAL) |
| 796 | return 0; | 796 | return 0; |
| 797 | 797 | ||
| 798 | /* Should be implemented, since bttv calls it */ | 798 | /* Should be implemented, since bttv calls it */ |
| @@ -810,10 +810,10 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 810 | }; | 810 | }; |
| 811 | struct video_channel *vc = arg; | 811 | struct video_channel *vc = arg; |
| 812 | 812 | ||
| 813 | if (check_v4l2(t) == EINVAL) | 813 | if (check_v4l2(t) == -EINVAL) |
| 814 | return 0; | 814 | return 0; |
| 815 | 815 | ||
| 816 | if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==EINVAL) | 816 | if (set_mode(client,t,V4L2_TUNER_ANALOG_TV, "VIDIOCSCHAN")==-EINVAL) |
| 817 | return 0; | 817 | return 0; |
| 818 | 818 | ||
| 819 | if (vc->norm < ARRAY_SIZE(map)) | 819 | if (vc->norm < ARRAY_SIZE(map)) |
| @@ -827,9 +827,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 827 | { | 827 | { |
| 828 | unsigned long *v = arg; | 828 | unsigned long *v = arg; |
| 829 | 829 | ||
| 830 | if (check_mode(t, "VIDIOCSFREQ") == EINVAL) | 830 | if (check_mode(t, "VIDIOCSFREQ") == -EINVAL) |
| 831 | return 0; | 831 | return 0; |
| 832 | if (check_v4l2(t) == EINVAL) | 832 | if (check_v4l2(t) == -EINVAL) |
| 833 | return 0; | 833 | return 0; |
| 834 | 834 | ||
| 835 | set_freq(client, *v); | 835 | set_freq(client, *v); |
| @@ -839,9 +839,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 839 | { | 839 | { |
| 840 | struct video_tuner *vt = arg; | 840 | struct video_tuner *vt = arg; |
| 841 | 841 | ||
| 842 | if (check_mode(t, "VIDIOCGTUNER") == EINVAL) | 842 | if (check_mode(t, "VIDIOCGTUNER") == -EINVAL) |
| 843 | return 0; | 843 | return 0; |
| 844 | if (check_v4l2(t) == EINVAL) | 844 | if (check_v4l2(t) == -EINVAL) |
| 845 | return 0; | 845 | return 0; |
| 846 | 846 | ||
| 847 | if (V4L2_TUNER_RADIO == t->mode) { | 847 | if (V4L2_TUNER_RADIO == t->mode) { |
| @@ -883,9 +883,9 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 883 | { | 883 | { |
| 884 | struct video_audio *va = arg; | 884 | struct video_audio *va = arg; |
| 885 | 885 | ||
| 886 | if (check_mode(t, "VIDIOCGAUDIO") == EINVAL) | 886 | if (check_mode(t, "VIDIOCGAUDIO") == -EINVAL) |
| 887 | return 0; | 887 | return 0; |
| 888 | if (check_v4l2(t) == EINVAL) | 888 | if (check_v4l2(t) == -EINVAL) |
| 889 | return 0; | 889 | return 0; |
| 890 | 890 | ||
| 891 | if (V4L2_TUNER_RADIO == t->mode) { | 891 | if (V4L2_TUNER_RADIO == t->mode) { |
| @@ -925,7 +925,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 925 | v4l2_std_id *id = arg; | 925 | v4l2_std_id *id = arg; |
| 926 | 926 | ||
| 927 | if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD") | 927 | if (set_mode (client, t, V4L2_TUNER_ANALOG_TV, "VIDIOC_S_STD") |
| 928 | == EINVAL) | 928 | == -EINVAL) |
| 929 | return 0; | 929 | return 0; |
| 930 | 930 | ||
| 931 | switch_v4l2(); | 931 | switch_v4l2(); |
| @@ -941,7 +941,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 941 | struct v4l2_frequency *f = arg; | 941 | struct v4l2_frequency *f = arg; |
| 942 | 942 | ||
| 943 | if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY") | 943 | if (set_mode (client, t, f->type, "VIDIOC_S_FREQUENCY") |
| 944 | == EINVAL) | 944 | == -EINVAL) |
| 945 | return 0; | 945 | return 0; |
| 946 | switch_v4l2(); | 946 | switch_v4l2(); |
| 947 | set_freq(client,f->frequency); | 947 | set_freq(client,f->frequency); |
| @@ -952,7 +952,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 952 | { | 952 | { |
| 953 | struct v4l2_frequency *f = arg; | 953 | struct v4l2_frequency *f = arg; |
| 954 | 954 | ||
| 955 | if (check_mode(t, "VIDIOC_G_FREQUENCY") == EINVAL) | 955 | if (check_mode(t, "VIDIOC_G_FREQUENCY") == -EINVAL) |
| 956 | return 0; | 956 | return 0; |
| 957 | switch_v4l2(); | 957 | switch_v4l2(); |
| 958 | f->type = t->mode; | 958 | f->type = t->mode; |
| @@ -973,7 +973,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 973 | { | 973 | { |
| 974 | struct v4l2_tuner *tuner = arg; | 974 | struct v4l2_tuner *tuner = arg; |
| 975 | 975 | ||
| 976 | if (check_mode(t, "VIDIOC_G_TUNER") == EINVAL) | 976 | if (check_mode(t, "VIDIOC_G_TUNER") == -EINVAL) |
| 977 | return 0; | 977 | return 0; |
| 978 | switch_v4l2(); | 978 | switch_v4l2(); |
| 979 | 979 | ||
| @@ -1020,7 +1020,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
| 1020 | { | 1020 | { |
| 1021 | struct v4l2_tuner *tuner = arg; | 1021 | struct v4l2_tuner *tuner = arg; |
| 1022 | 1022 | ||
| 1023 | if (check_mode(t, "VIDIOC_S_TUNER") == EINVAL) | 1023 | if (check_mode(t, "VIDIOC_S_TUNER") == -EINVAL) |
| 1024 | return 0; | 1024 | return 0; |
| 1025 | 1025 | ||
| 1026 | switch_v4l2(); | 1026 | switch_v4l2(); |
diff --git a/drivers/media/video/usbvideo/quickcam_messenger.c b/drivers/media/video/usbvideo/quickcam_messenger.c index 32e536edf09d..3d26a30abe1e 100644 --- a/drivers/media/video/usbvideo/quickcam_messenger.c +++ b/drivers/media/video/usbvideo/quickcam_messenger.c | |||
| @@ -210,7 +210,7 @@ static int qcm_stv_setb(struct usb_device *dev, u16 reg, u8 val) | |||
| 210 | return ret; | 210 | return ret; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | static int qcm_stv_setw(struct usb_device *dev, u16 reg, u16 val) | 213 | static int qcm_stv_setw(struct usb_device *dev, u16 reg, __le16 val) |
| 214 | { | 214 | { |
| 215 | int ret; | 215 | int ret; |
| 216 | 216 | ||
diff --git a/drivers/media/video/zoran.h b/drivers/media/video/zoran.h index 81cc3b00a079..46b7ad477ceb 100644 --- a/drivers/media/video/zoran.h +++ b/drivers/media/video/zoran.h | |||
| @@ -285,7 +285,7 @@ struct zoran_mapping { | |||
| 285 | 285 | ||
| 286 | struct zoran_jpg_buffer { | 286 | struct zoran_jpg_buffer { |
| 287 | struct zoran_mapping *map; | 287 | struct zoran_mapping *map; |
| 288 | u32 *frag_tab; /* addresses of frag table */ | 288 | __le32 *frag_tab; /* addresses of frag table */ |
| 289 | u32 frag_tab_bus; /* same value cached to save time in ISR */ | 289 | u32 frag_tab_bus; /* same value cached to save time in ISR */ |
| 290 | enum zoran_buffer_state state; /* non-zero if corresponding buffer is in use in grab queue */ | 290 | enum zoran_buffer_state state; /* non-zero if corresponding buffer is in use in grab queue */ |
| 291 | struct zoran_sync bs; /* DONE: info to return to application */ | 291 | struct zoran_sync bs; /* DONE: info to return to application */ |
| @@ -450,7 +450,7 @@ struct zoran { | |||
| 450 | unsigned long jpg_queued_num; /* count of frames queued since grab/play started */ | 450 | unsigned long jpg_queued_num; /* count of frames queued since grab/play started */ |
| 451 | 451 | ||
| 452 | /* zr36057's code buffer table */ | 452 | /* zr36057's code buffer table */ |
| 453 | u32 *stat_com; /* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */ | 453 | __le32 *stat_com; /* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */ |
| 454 | 454 | ||
| 455 | /* (value & BUZ_MASK_FRAME) corresponds to index in pend[] queue */ | 455 | /* (value & BUZ_MASK_FRAME) corresponds to index in pend[] queue */ |
| 456 | int jpg_pend[BUZ_MAX_FRAME]; | 456 | int jpg_pend[BUZ_MAX_FRAME]; |
diff --git a/drivers/media/video/zoran_device.c b/drivers/media/video/zoran_device.c index 37629ffd34c3..88d369708e4c 100644 --- a/drivers/media/video/zoran_device.c +++ b/drivers/media/video/zoran_device.c | |||
| @@ -1320,7 +1320,7 @@ error_handler (struct zoran *zr, | |||
| 1320 | if (i) { | 1320 | if (i) { |
| 1321 | /* Rotate stat_comm entries to make current entry first */ | 1321 | /* Rotate stat_comm entries to make current entry first */ |
| 1322 | int j; | 1322 | int j; |
| 1323 | u32 bus_addr[BUZ_NUM_STAT_COM]; | 1323 | __le32 bus_addr[BUZ_NUM_STAT_COM]; |
| 1324 | 1324 | ||
| 1325 | /* Here we are copying the stat_com array, which | 1325 | /* Here we are copying the stat_com array, which |
| 1326 | * is already in little endian format, so | 1326 | * is already in little endian format, so |
diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c index 345c77e46837..5394d7a5cfee 100644 --- a/drivers/media/video/zoran_driver.c +++ b/drivers/media/video/zoran_driver.c | |||
| @@ -495,7 +495,7 @@ jpg_fbuffer_alloc (struct file *file) | |||
| 495 | jpg_fbuffer_free(file); | 495 | jpg_fbuffer_free(file); |
| 496 | return -ENOBUFS; | 496 | return -ENOBUFS; |
| 497 | } | 497 | } |
| 498 | fh->jpg_buffers.buffer[i].frag_tab = (u32 *) mem; | 498 | fh->jpg_buffers.buffer[i].frag_tab = (__le32 *) mem; |
| 499 | fh->jpg_buffers.buffer[i].frag_tab_bus = | 499 | fh->jpg_buffers.buffer[i].frag_tab_bus = |
| 500 | virt_to_bus((void *) mem); | 500 | virt_to_bus((void *) mem); |
| 501 | 501 | ||
| @@ -1167,7 +1167,7 @@ zoran_close_end_session (struct file *file) | |||
| 1167 | 1167 | ||
| 1168 | /* v4l capture */ | 1168 | /* v4l capture */ |
| 1169 | if (fh->v4l_buffers.active != ZORAN_FREE) { | 1169 | if (fh->v4l_buffers.active != ZORAN_FREE) { |
| 1170 | long flags; | 1170 | unsigned long flags; |
| 1171 | 1171 | ||
| 1172 | spin_lock_irqsave(&zr->spinlock, flags); | 1172 | spin_lock_irqsave(&zr->spinlock, flags); |
| 1173 | zr36057_set_memgrab(zr, 0); | 1173 | zr36057_set_memgrab(zr, 0); |
| @@ -3436,7 +3436,7 @@ zoran_do_ioctl (struct inode *inode, | |||
| 3436 | 3436 | ||
| 3437 | /* unload capture */ | 3437 | /* unload capture */ |
| 3438 | if (zr->v4l_memgrab_active) { | 3438 | if (zr->v4l_memgrab_active) { |
| 3439 | long flags; | 3439 | unsigned long flags; |
| 3440 | 3440 | ||
| 3441 | spin_lock_irqsave(&zr->spinlock, flags); | 3441 | spin_lock_irqsave(&zr->spinlock, flags); |
| 3442 | zr36057_set_memgrab(zr, 0); | 3442 | zr36057_set_memgrab(zr, 0); |
| @@ -4375,7 +4375,7 @@ zoran_vm_close (struct vm_area_struct *vma) | |||
| 4375 | mutex_lock(&zr->resource_lock); | 4375 | mutex_lock(&zr->resource_lock); |
| 4376 | 4376 | ||
| 4377 | if (fh->v4l_buffers.active != ZORAN_FREE) { | 4377 | if (fh->v4l_buffers.active != ZORAN_FREE) { |
| 4378 | long flags; | 4378 | unsigned long flags; |
| 4379 | 4379 | ||
| 4380 | spin_lock_irqsave(&zr->spinlock, flags); | 4380 | spin_lock_irqsave(&zr->spinlock, flags); |
| 4381 | zr36057_set_memgrab(zr, 0); | 4381 | zr36057_set_memgrab(zr, 0); |
| @@ -4506,7 +4506,7 @@ zoran_mmap (struct file *file, | |||
| 4506 | if (todo > fraglen) | 4506 | if (todo > fraglen) |
| 4507 | todo = fraglen; | 4507 | todo = fraglen; |
| 4508 | pos = | 4508 | pos = |
| 4509 | le32_to_cpu((unsigned long) fh->jpg_buffers. | 4509 | le32_to_cpu(fh->jpg_buffers. |
| 4510 | buffer[i].frag_tab[2 * j]); | 4510 | buffer[i].frag_tab[2 * j]); |
| 4511 | /* should just be pos on i386 */ | 4511 | /* should just be pos on i386 */ |
| 4512 | page = virt_to_phys(bus_to_virt(pos)) | 4512 | page = virt_to_phys(bus_to_virt(pos)) |
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index 3cdd4e962115..1e24ab4ac38c 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c | |||
| @@ -1238,8 +1238,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1238 | sh->max_id = ioc->pfacts->MaxDevices; | 1238 | sh->max_id = ioc->pfacts->MaxDevices; |
| 1239 | sh->max_lun = max_lun; | 1239 | sh->max_lun = max_lun; |
| 1240 | 1240 | ||
| 1241 | sh->this_id = ioc->pfacts[0].PortSCSIID; | ||
| 1242 | |||
| 1243 | /* Required entry. | 1241 | /* Required entry. |
| 1244 | */ | 1242 | */ |
| 1245 | sh->unique_id = ioc->id; | 1243 | sh->unique_id = ioc->id; |
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 468480771f13..4d492ba232b0 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
| @@ -3193,8 +3193,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 3193 | 3193 | ||
| 3194 | sh->transportt = mptsas_transport_template; | 3194 | sh->transportt = mptsas_transport_template; |
| 3195 | 3195 | ||
| 3196 | sh->this_id = ioc->pfacts[0].PortSCSIID; | ||
| 3197 | |||
| 3198 | /* Required entry. | 3196 | /* Required entry. |
| 3199 | */ | 3197 | */ |
| 3200 | sh->unique_id = ioc->id; | 3198 | sh->unique_id = ioc->id; |
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index b109bd8a4d19..c68ef00c2f92 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
| @@ -2451,12 +2451,6 @@ mptscsih_slave_configure(struct scsi_device *sdev) | |||
| 2451 | ioc->name, sdev->sdtr, sdev->wdtr, | 2451 | ioc->name, sdev->sdtr, sdev->wdtr, |
| 2452 | sdev->ppr, sdev->inquiry_len)); | 2452 | sdev->ppr, sdev->inquiry_len)); |
| 2453 | 2453 | ||
| 2454 | if (sdev->id > sh->max_id) { | ||
| 2455 | /* error case, should never happen */ | ||
| 2456 | scsi_adjust_queue_depth(sdev, 0, 1); | ||
| 2457 | goto slave_configure_exit; | ||
| 2458 | } | ||
| 2459 | |||
| 2460 | vdevice->configured_lun = 1; | 2454 | vdevice->configured_lun = 1; |
| 2461 | mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH); | 2455 | mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH); |
| 2462 | 2456 | ||
| @@ -2470,8 +2464,6 @@ mptscsih_slave_configure(struct scsi_device *sdev) | |||
| 2470 | ioc->name, vtarget->negoFlags, vtarget->maxOffset, | 2464 | ioc->name, vtarget->negoFlags, vtarget->maxOffset, |
| 2471 | vtarget->minSyncFactor)); | 2465 | vtarget->minSyncFactor)); |
| 2472 | 2466 | ||
| 2473 | slave_configure_exit: | ||
| 2474 | |||
| 2475 | dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT | 2467 | dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT |
| 2476 | "tagged %d, simple %d, ordered %d\n", | 2468 | "tagged %d, simple %d, ordered %d\n", |
| 2477 | ioc->name,sdev->tagged_supported, sdev->simple_tags, | 2469 | ioc->name,sdev->tagged_supported, sdev->simple_tags, |
diff --git a/drivers/misc/fujitsu-laptop.c b/drivers/misc/fujitsu-laptop.c index e2e7c05a147b..6d14e8fe1537 100644 --- a/drivers/misc/fujitsu-laptop.c +++ b/drivers/misc/fujitsu-laptop.c | |||
| @@ -352,3 +352,9 @@ MODULE_AUTHOR("Jonathan Woithe"); | |||
| 352 | MODULE_DESCRIPTION("Fujitsu laptop extras support"); | 352 | MODULE_DESCRIPTION("Fujitsu laptop extras support"); |
| 353 | MODULE_VERSION(FUJITSU_DRIVER_VERSION); | 353 | MODULE_VERSION(FUJITSU_DRIVER_VERSION); |
| 354 | MODULE_LICENSE("GPL"); | 354 | MODULE_LICENSE("GPL"); |
| 355 | |||
| 356 | static struct pnp_device_id pnp_ids[] = { | ||
| 357 | { .id = "FUJ02bf" }, | ||
| 358 | { .id = "" } | ||
| 359 | }; | ||
| 360 | MODULE_DEVICE_TABLE(pnp, pnp_ids); | ||
diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c index fa394104339c..e4ff50b95a5e 100644 --- a/drivers/misc/kgdbts.c +++ b/drivers/misc/kgdbts.c | |||
| @@ -102,7 +102,6 @@ | |||
| 102 | #include <linux/nmi.h> | 102 | #include <linux/nmi.h> |
| 103 | #include <linux/delay.h> | 103 | #include <linux/delay.h> |
| 104 | #include <linux/kthread.h> | 104 | #include <linux/kthread.h> |
| 105 | #include <linux/delay.h> | ||
| 106 | 105 | ||
| 107 | #define v1printk(a...) do { \ | 106 | #define v1printk(a...) do { \ |
| 108 | if (verbose) \ | 107 | if (verbose) \ |
| @@ -119,7 +118,6 @@ | |||
| 119 | } while (0) | 118 | } while (0) |
| 120 | #define MAX_CONFIG_LEN 40 | 119 | #define MAX_CONFIG_LEN 40 |
| 121 | 120 | ||
| 122 | static const char hexchars[] = "0123456789abcdef"; | ||
| 123 | static struct kgdb_io kgdbts_io_ops; | 121 | static struct kgdb_io kgdbts_io_ops; |
| 124 | static char get_buf[BUFMAX]; | 122 | static char get_buf[BUFMAX]; |
| 125 | static int get_buf_cnt; | 123 | static int get_buf_cnt; |
| @@ -131,6 +129,8 @@ static int repeat_test; | |||
| 131 | static int test_complete; | 129 | static int test_complete; |
| 132 | static int send_ack; | 130 | static int send_ack; |
| 133 | static int final_ack; | 131 | static int final_ack; |
| 132 | static int force_hwbrks; | ||
| 133 | static int hwbreaks_ok; | ||
| 134 | static int hw_break_val; | 134 | static int hw_break_val; |
| 135 | static int hw_break_val2; | 135 | static int hw_break_val2; |
| 136 | #if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_SPARC) | 136 | #if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_SPARC) |
| @@ -234,12 +234,12 @@ static void break_helper(char *bp_type, char *arg, unsigned long vaddr) | |||
| 234 | 234 | ||
| 235 | static void sw_break(char *arg) | 235 | static void sw_break(char *arg) |
| 236 | { | 236 | { |
| 237 | break_helper("Z0", arg, 0); | 237 | break_helper(force_hwbrks ? "Z1" : "Z0", arg, 0); |
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | static void sw_rem_break(char *arg) | 240 | static void sw_rem_break(char *arg) |
| 241 | { | 241 | { |
| 242 | break_helper("z0", arg, 0); | 242 | break_helper(force_hwbrks ? "z1" : "z0", arg, 0); |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | static void hw_break(char *arg) | 245 | static void hw_break(char *arg) |
| @@ -619,8 +619,8 @@ static void fill_get_buf(char *buf) | |||
| 619 | count++; | 619 | count++; |
| 620 | } | 620 | } |
| 621 | strcat(get_buf, "#"); | 621 | strcat(get_buf, "#"); |
| 622 | get_buf[count + 2] = hexchars[checksum >> 4]; | 622 | get_buf[count + 2] = hex_asc_hi(checksum); |
| 623 | get_buf[count + 3] = hexchars[checksum & 0xf]; | 623 | get_buf[count + 3] = hex_asc_lo(checksum); |
| 624 | get_buf[count + 4] = '\0'; | 624 | get_buf[count + 4] = '\0'; |
| 625 | v2printk("get%i: %s\n", ts.idx, get_buf); | 625 | v2printk("get%i: %s\n", ts.idx, get_buf); |
| 626 | } | 626 | } |
| @@ -781,6 +781,8 @@ static void run_breakpoint_test(int is_hw_breakpoint) | |||
| 781 | return; | 781 | return; |
| 782 | 782 | ||
| 783 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); | 783 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); |
| 784 | if (is_hw_breakpoint) | ||
| 785 | hwbreaks_ok = 0; | ||
| 784 | } | 786 | } |
| 785 | 787 | ||
| 786 | static void run_hw_break_test(int is_write_test) | 788 | static void run_hw_break_test(int is_write_test) |
| @@ -798,9 +800,11 @@ static void run_hw_break_test(int is_write_test) | |||
| 798 | kgdb_breakpoint(); | 800 | kgdb_breakpoint(); |
| 799 | hw_break_val_access(); | 801 | hw_break_val_access(); |
| 800 | if (is_write_test) { | 802 | if (is_write_test) { |
| 801 | if (test_complete == 2) | 803 | if (test_complete == 2) { |
| 802 | eprintk("kgdbts: ERROR %s broke on access\n", | 804 | eprintk("kgdbts: ERROR %s broke on access\n", |
| 803 | ts.name); | 805 | ts.name); |
| 806 | hwbreaks_ok = 0; | ||
| 807 | } | ||
| 804 | hw_break_val_write(); | 808 | hw_break_val_write(); |
| 805 | } | 809 | } |
| 806 | kgdb_breakpoint(); | 810 | kgdb_breakpoint(); |
| @@ -809,6 +813,7 @@ static void run_hw_break_test(int is_write_test) | |||
| 809 | return; | 813 | return; |
| 810 | 814 | ||
| 811 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); | 815 | eprintk("kgdbts: ERROR %s test failed\n", ts.name); |
| 816 | hwbreaks_ok = 0; | ||
| 812 | } | 817 | } |
| 813 | 818 | ||
| 814 | static void run_nmi_sleep_test(int nmi_sleep) | 819 | static void run_nmi_sleep_test(int nmi_sleep) |
| @@ -912,6 +917,7 @@ static void kgdbts_run_tests(void) | |||
| 912 | 917 | ||
| 913 | /* All HW break point tests */ | 918 | /* All HW break point tests */ |
| 914 | if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { | 919 | if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { |
| 920 | hwbreaks_ok = 1; | ||
| 915 | v1printk("kgdbts:RUN hw breakpoint test\n"); | 921 | v1printk("kgdbts:RUN hw breakpoint test\n"); |
| 916 | run_breakpoint_test(1); | 922 | run_breakpoint_test(1); |
| 917 | v1printk("kgdbts:RUN hw write breakpoint test\n"); | 923 | v1printk("kgdbts:RUN hw write breakpoint test\n"); |
| @@ -925,6 +931,19 @@ static void kgdbts_run_tests(void) | |||
| 925 | run_nmi_sleep_test(nmi_sleep); | 931 | run_nmi_sleep_test(nmi_sleep); |
| 926 | } | 932 | } |
| 927 | 933 | ||
| 934 | #ifdef CONFIG_DEBUG_RODATA | ||
| 935 | /* Until there is an api to write to read-only text segments, use | ||
| 936 | * HW breakpoints for the remainder of any tests, else print a | ||
| 937 | * failure message if hw breakpoints do not work. | ||
| 938 | */ | ||
| 939 | if (!(arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT && hwbreaks_ok)) { | ||
| 940 | eprintk("kgdbts: HW breakpoints do not work," | ||
| 941 | "skipping remaining tests\n"); | ||
| 942 | return; | ||
| 943 | } | ||
| 944 | force_hwbrks = 1; | ||
| 945 | #endif /* CONFIG_DEBUG_RODATA */ | ||
| 946 | |||
| 928 | /* If the do_fork test is run it will be the last test that is | 947 | /* If the do_fork test is run it will be the last test that is |
| 929 | * executed because a kernel thread will be spawned at the very | 948 | * executed because a kernel thread will be spawned at the very |
| 930 | * end to unregister the debug hooks. | 949 | * end to unregister the debug hooks. |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 91ded3e82401..f9ad960d7c1a 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #define MMC_SHIFT 3 | 46 | #define MMC_SHIFT 3 |
| 47 | #define MMC_NUM_MINORS (256 >> MMC_SHIFT) | 47 | #define MMC_NUM_MINORS (256 >> MMC_SHIFT) |
| 48 | 48 | ||
| 49 | static unsigned long dev_use[MMC_NUM_MINORS/(8*sizeof(unsigned long))]; | 49 | static DECLARE_BITMAP(dev_use, MMC_NUM_MINORS); |
| 50 | 50 | ||
| 51 | /* | 51 | /* |
| 52 | * There is one mmc_blk_data per slot. | 52 | * There is one mmc_blk_data per slot. |
diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c index 47474903263c..c5030f94f04e 100644 --- a/drivers/mtd/redboot.c +++ b/drivers/mtd/redboot.c | |||
| @@ -295,5 +295,5 @@ module_init(redboot_parser_init); | |||
| 295 | module_exit(redboot_parser_exit); | 295 | module_exit(redboot_parser_exit); |
| 296 | 296 | ||
| 297 | MODULE_LICENSE("GPL"); | 297 | MODULE_LICENSE("GPL"); |
| 298 | MODULE_AUTHOR("Red Hat, Inc. - David Woodhouse <dwmw2@cambridge.redhat.com>"); | 298 | MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>"); |
| 299 | MODULE_DESCRIPTION("Parsing code for RedBoot Flash Image System (FIS) tables"); | 299 | MODULE_DESCRIPTION("Parsing code for RedBoot Flash Image System (FIS) tables"); |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 6e4c80d41b08..6ddc911e7d15 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
| @@ -2023,6 +2023,7 @@ rrd_ok: | |||
| 2023 | /* Good Receive */ | 2023 | /* Good Receive */ |
| 2024 | pci_unmap_page(adapter->pdev, buffer_info->dma, | 2024 | pci_unmap_page(adapter->pdev, buffer_info->dma, |
| 2025 | buffer_info->length, PCI_DMA_FROMDEVICE); | 2025 | buffer_info->length, PCI_DMA_FROMDEVICE); |
| 2026 | buffer_info->dma = 0; | ||
| 2026 | skb = buffer_info->skb; | 2027 | skb = buffer_info->skb; |
| 2027 | length = le16_to_cpu(rrd->xsz.xsum_sz.pkt_size); | 2028 | length = le16_to_cpu(rrd->xsz.xsum_sz.pkt_size); |
| 2028 | 2029 | ||
diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index 348371fda597..fba87abe78ee 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c | |||
| @@ -1394,7 +1394,11 @@ net_open(struct net_device *dev) | |||
| 1394 | #endif | 1394 | #endif |
| 1395 | if (!result) { | 1395 | if (!result) { |
| 1396 | printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name); | 1396 | printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name); |
| 1397 | release_irq: | 1397 | release_dma: |
| 1398 | #if ALLOW_DMA | ||
| 1399 | free_dma(dev->dma); | ||
| 1400 | #endif | ||
| 1401 | release_irq: | ||
| 1398 | #if ALLOW_DMA | 1402 | #if ALLOW_DMA |
| 1399 | release_dma_buff(lp); | 1403 | release_dma_buff(lp); |
| 1400 | #endif | 1404 | #endif |
| @@ -1442,12 +1446,12 @@ net_open(struct net_device *dev) | |||
| 1442 | if ((result = detect_bnc(dev)) != DETECTED_NONE) | 1446 | if ((result = detect_bnc(dev)) != DETECTED_NONE) |
| 1443 | break; | 1447 | break; |
| 1444 | printk(KERN_ERR "%s: no media detected\n", dev->name); | 1448 | printk(KERN_ERR "%s: no media detected\n", dev->name); |
| 1445 | goto release_irq; | 1449 | goto release_dma; |
| 1446 | } | 1450 | } |
| 1447 | switch(result) { | 1451 | switch(result) { |
| 1448 | case DETECTED_NONE: | 1452 | case DETECTED_NONE: |
| 1449 | printk(KERN_ERR "%s: no network cable attached to configured media\n", dev->name); | 1453 | printk(KERN_ERR "%s: no network cable attached to configured media\n", dev->name); |
| 1450 | goto release_irq; | 1454 | goto release_dma; |
| 1451 | case DETECTED_RJ45H: | 1455 | case DETECTED_RJ45H: |
| 1452 | printk(KERN_INFO "%s: using half-duplex 10Base-T (RJ-45)\n", dev->name); | 1456 | printk(KERN_INFO "%s: using half-duplex 10Base-T (RJ-45)\n", dev->name); |
| 1453 | break; | 1457 | break; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 36be6efc6398..e0d76c75aea0 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
| @@ -75,7 +75,7 @@ | |||
| 75 | #include "myri10ge_mcp.h" | 75 | #include "myri10ge_mcp.h" |
| 76 | #include "myri10ge_mcp_gen_header.h" | 76 | #include "myri10ge_mcp_gen_header.h" |
| 77 | 77 | ||
| 78 | #define MYRI10GE_VERSION_STR "1.3.2-1.287" | 78 | #define MYRI10GE_VERSION_STR "1.3.99-1.347" |
| 79 | 79 | ||
| 80 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); | 80 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); |
| 81 | MODULE_AUTHOR("Maintainer: help@myri.com"); | 81 | MODULE_AUTHOR("Maintainer: help@myri.com"); |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 8db342f2fdc9..70cfdb46aa27 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
| @@ -240,12 +240,15 @@ static inline struct pppol2tp_session *pppol2tp_sock_to_session(struct sock *sk) | |||
| 240 | if (sk == NULL) | 240 | if (sk == NULL) |
| 241 | return NULL; | 241 | return NULL; |
| 242 | 242 | ||
| 243 | sock_hold(sk); | ||
| 243 | session = (struct pppol2tp_session *)(sk->sk_user_data); | 244 | session = (struct pppol2tp_session *)(sk->sk_user_data); |
| 244 | if (session == NULL) | 245 | if (session == NULL) { |
| 245 | return NULL; | 246 | sock_put(sk); |
| 247 | goto out; | ||
| 248 | } | ||
| 246 | 249 | ||
| 247 | BUG_ON(session->magic != L2TP_SESSION_MAGIC); | 250 | BUG_ON(session->magic != L2TP_SESSION_MAGIC); |
| 248 | 251 | out: | |
| 249 | return session; | 252 | return session; |
| 250 | } | 253 | } |
| 251 | 254 | ||
| @@ -256,12 +259,15 @@ static inline struct pppol2tp_tunnel *pppol2tp_sock_to_tunnel(struct sock *sk) | |||
| 256 | if (sk == NULL) | 259 | if (sk == NULL) |
| 257 | return NULL; | 260 | return NULL; |
| 258 | 261 | ||
| 262 | sock_hold(sk); | ||
| 259 | tunnel = (struct pppol2tp_tunnel *)(sk->sk_user_data); | 263 | tunnel = (struct pppol2tp_tunnel *)(sk->sk_user_data); |
| 260 | if (tunnel == NULL) | 264 | if (tunnel == NULL) { |
| 261 | return NULL; | 265 | sock_put(sk); |
| 266 | goto out; | ||
| 267 | } | ||
| 262 | 268 | ||
| 263 | BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC); | 269 | BUG_ON(tunnel->magic != L2TP_TUNNEL_MAGIC); |
| 264 | 270 | out: | |
| 265 | return tunnel; | 271 | return tunnel; |
| 266 | } | 272 | } |
| 267 | 273 | ||
| @@ -716,12 +722,14 @@ discard: | |||
| 716 | session->stats.rx_errors++; | 722 | session->stats.rx_errors++; |
| 717 | kfree_skb(skb); | 723 | kfree_skb(skb); |
| 718 | sock_put(session->sock); | 724 | sock_put(session->sock); |
| 725 | sock_put(sock); | ||
| 719 | 726 | ||
| 720 | return 0; | 727 | return 0; |
| 721 | 728 | ||
| 722 | error: | 729 | error: |
| 723 | /* Put UDP header back */ | 730 | /* Put UDP header back */ |
| 724 | __skb_push(skb, sizeof(struct udphdr)); | 731 | __skb_push(skb, sizeof(struct udphdr)); |
| 732 | sock_put(sock); | ||
| 725 | 733 | ||
| 726 | no_tunnel: | 734 | no_tunnel: |
| 727 | return 1; | 735 | return 1; |
| @@ -745,10 +753,13 @@ static int pppol2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
| 745 | "%s: received %d bytes\n", tunnel->name, skb->len); | 753 | "%s: received %d bytes\n", tunnel->name, skb->len); |
| 746 | 754 | ||
| 747 | if (pppol2tp_recv_core(sk, skb)) | 755 | if (pppol2tp_recv_core(sk, skb)) |
| 748 | goto pass_up; | 756 | goto pass_up_put; |
| 749 | 757 | ||
| 758 | sock_put(sk); | ||
| 750 | return 0; | 759 | return 0; |
| 751 | 760 | ||
| 761 | pass_up_put: | ||
| 762 | sock_put(sk); | ||
| 752 | pass_up: | 763 | pass_up: |
| 753 | return 1; | 764 | return 1; |
| 754 | } | 765 | } |
| @@ -858,7 +869,7 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
| 858 | 869 | ||
| 859 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); | 870 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); |
| 860 | if (tunnel == NULL) | 871 | if (tunnel == NULL) |
| 861 | goto error; | 872 | goto error_put_sess; |
| 862 | 873 | ||
| 863 | /* What header length is configured for this session? */ | 874 | /* What header length is configured for this session? */ |
| 864 | hdr_len = pppol2tp_l2tp_header_len(session); | 875 | hdr_len = pppol2tp_l2tp_header_len(session); |
| @@ -870,7 +881,7 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
| 870 | sizeof(ppph) + total_len, | 881 | sizeof(ppph) + total_len, |
| 871 | 0, GFP_KERNEL); | 882 | 0, GFP_KERNEL); |
| 872 | if (!skb) | 883 | if (!skb) |
| 873 | goto error; | 884 | goto error_put_sess_tun; |
| 874 | 885 | ||
| 875 | /* Reserve space for headers. */ | 886 | /* Reserve space for headers. */ |
| 876 | skb_reserve(skb, NET_SKB_PAD); | 887 | skb_reserve(skb, NET_SKB_PAD); |
| @@ -900,7 +911,7 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
| 900 | error = memcpy_fromiovec(skb->data, m->msg_iov, total_len); | 911 | error = memcpy_fromiovec(skb->data, m->msg_iov, total_len); |
| 901 | if (error < 0) { | 912 | if (error < 0) { |
| 902 | kfree_skb(skb); | 913 | kfree_skb(skb); |
| 903 | goto error; | 914 | goto error_put_sess_tun; |
| 904 | } | 915 | } |
| 905 | skb_put(skb, total_len); | 916 | skb_put(skb, total_len); |
| 906 | 917 | ||
| @@ -947,10 +958,33 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
| 947 | session->stats.tx_errors++; | 958 | session->stats.tx_errors++; |
| 948 | } | 959 | } |
| 949 | 960 | ||
| 961 | return error; | ||
| 962 | |||
| 963 | error_put_sess_tun: | ||
| 964 | sock_put(session->tunnel_sock); | ||
| 965 | error_put_sess: | ||
| 966 | sock_put(sk); | ||
| 950 | error: | 967 | error: |
| 951 | return error; | 968 | return error; |
| 952 | } | 969 | } |
| 953 | 970 | ||
| 971 | /* Automatically called when the skb is freed. | ||
| 972 | */ | ||
| 973 | static void pppol2tp_sock_wfree(struct sk_buff *skb) | ||
| 974 | { | ||
| 975 | sock_put(skb->sk); | ||
| 976 | } | ||
| 977 | |||
| 978 | /* For data skbs that we transmit, we associate with the tunnel socket | ||
| 979 | * but don't do accounting. | ||
| 980 | */ | ||
| 981 | static inline void pppol2tp_skb_set_owner_w(struct sk_buff *skb, struct sock *sk) | ||
| 982 | { | ||
| 983 | sock_hold(sk); | ||
| 984 | skb->sk = sk; | ||
| 985 | skb->destructor = pppol2tp_sock_wfree; | ||
| 986 | } | ||
| 987 | |||
| 954 | /* Transmit function called by generic PPP driver. Sends PPP frame | 988 | /* Transmit function called by generic PPP driver. Sends PPP frame |
| 955 | * over PPPoL2TP socket. | 989 | * over PPPoL2TP socket. |
| 956 | * | 990 | * |
| @@ -993,10 +1027,10 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
| 993 | 1027 | ||
| 994 | sk_tun = session->tunnel_sock; | 1028 | sk_tun = session->tunnel_sock; |
| 995 | if (sk_tun == NULL) | 1029 | if (sk_tun == NULL) |
| 996 | goto abort; | 1030 | goto abort_put_sess; |
| 997 | tunnel = pppol2tp_sock_to_tunnel(sk_tun); | 1031 | tunnel = pppol2tp_sock_to_tunnel(sk_tun); |
| 998 | if (tunnel == NULL) | 1032 | if (tunnel == NULL) |
| 999 | goto abort; | 1033 | goto abort_put_sess; |
| 1000 | 1034 | ||
| 1001 | /* What header length is configured for this session? */ | 1035 | /* What header length is configured for this session? */ |
| 1002 | hdr_len = pppol2tp_l2tp_header_len(session); | 1036 | hdr_len = pppol2tp_l2tp_header_len(session); |
| @@ -1009,7 +1043,7 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
| 1009 | sizeof(struct udphdr) + hdr_len + sizeof(ppph); | 1043 | sizeof(struct udphdr) + hdr_len + sizeof(ppph); |
| 1010 | old_headroom = skb_headroom(skb); | 1044 | old_headroom = skb_headroom(skb); |
| 1011 | if (skb_cow_head(skb, headroom)) | 1045 | if (skb_cow_head(skb, headroom)) |
| 1012 | goto abort; | 1046 | goto abort_put_sess_tun; |
| 1013 | 1047 | ||
| 1014 | new_headroom = skb_headroom(skb); | 1048 | new_headroom = skb_headroom(skb); |
| 1015 | skb_orphan(skb); | 1049 | skb_orphan(skb); |
| @@ -1069,7 +1103,7 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
| 1069 | /* Get routing info from the tunnel socket */ | 1103 | /* Get routing info from the tunnel socket */ |
| 1070 | dst_release(skb->dst); | 1104 | dst_release(skb->dst); |
| 1071 | skb->dst = dst_clone(__sk_dst_get(sk_tun)); | 1105 | skb->dst = dst_clone(__sk_dst_get(sk_tun)); |
| 1072 | skb->sk = sk_tun; | 1106 | pppol2tp_skb_set_owner_w(skb, sk_tun); |
| 1073 | 1107 | ||
| 1074 | /* Queue the packet to IP for output */ | 1108 | /* Queue the packet to IP for output */ |
| 1075 | len = skb->len; | 1109 | len = skb->len; |
| @@ -1086,8 +1120,14 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
| 1086 | session->stats.tx_errors++; | 1120 | session->stats.tx_errors++; |
| 1087 | } | 1121 | } |
| 1088 | 1122 | ||
| 1123 | sock_put(sk_tun); | ||
| 1124 | sock_put(sk); | ||
| 1089 | return 1; | 1125 | return 1; |
| 1090 | 1126 | ||
| 1127 | abort_put_sess_tun: | ||
| 1128 | sock_put(sk_tun); | ||
| 1129 | abort_put_sess: | ||
| 1130 | sock_put(sk); | ||
| 1091 | abort: | 1131 | abort: |
| 1092 | /* Free the original skb */ | 1132 | /* Free the original skb */ |
| 1093 | kfree_skb(skb); | 1133 | kfree_skb(skb); |
| @@ -1191,7 +1231,7 @@ static void pppol2tp_tunnel_destruct(struct sock *sk) | |||
| 1191 | { | 1231 | { |
| 1192 | struct pppol2tp_tunnel *tunnel; | 1232 | struct pppol2tp_tunnel *tunnel; |
| 1193 | 1233 | ||
| 1194 | tunnel = pppol2tp_sock_to_tunnel(sk); | 1234 | tunnel = sk->sk_user_data; |
| 1195 | if (tunnel == NULL) | 1235 | if (tunnel == NULL) |
| 1196 | goto end; | 1236 | goto end; |
| 1197 | 1237 | ||
| @@ -1230,10 +1270,12 @@ static void pppol2tp_session_destruct(struct sock *sk) | |||
| 1230 | if (sk->sk_user_data != NULL) { | 1270 | if (sk->sk_user_data != NULL) { |
| 1231 | struct pppol2tp_tunnel *tunnel; | 1271 | struct pppol2tp_tunnel *tunnel; |
| 1232 | 1272 | ||
| 1233 | session = pppol2tp_sock_to_session(sk); | 1273 | session = sk->sk_user_data; |
| 1234 | if (session == NULL) | 1274 | if (session == NULL) |
| 1235 | goto out; | 1275 | goto out; |
| 1236 | 1276 | ||
| 1277 | BUG_ON(session->magic != L2TP_SESSION_MAGIC); | ||
| 1278 | |||
| 1237 | /* Don't use pppol2tp_sock_to_tunnel() here to | 1279 | /* Don't use pppol2tp_sock_to_tunnel() here to |
| 1238 | * get the tunnel context because the tunnel | 1280 | * get the tunnel context because the tunnel |
| 1239 | * socket might have already been closed (its | 1281 | * socket might have already been closed (its |
| @@ -1279,6 +1321,7 @@ out: | |||
| 1279 | static int pppol2tp_release(struct socket *sock) | 1321 | static int pppol2tp_release(struct socket *sock) |
| 1280 | { | 1322 | { |
| 1281 | struct sock *sk = sock->sk; | 1323 | struct sock *sk = sock->sk; |
| 1324 | struct pppol2tp_session *session; | ||
| 1282 | int error; | 1325 | int error; |
| 1283 | 1326 | ||
| 1284 | if (!sk) | 1327 | if (!sk) |
| @@ -1296,9 +1339,18 @@ static int pppol2tp_release(struct socket *sock) | |||
| 1296 | sock_orphan(sk); | 1339 | sock_orphan(sk); |
| 1297 | sock->sk = NULL; | 1340 | sock->sk = NULL; |
| 1298 | 1341 | ||
| 1342 | session = pppol2tp_sock_to_session(sk); | ||
| 1343 | |||
| 1299 | /* Purge any queued data */ | 1344 | /* Purge any queued data */ |
| 1300 | skb_queue_purge(&sk->sk_receive_queue); | 1345 | skb_queue_purge(&sk->sk_receive_queue); |
| 1301 | skb_queue_purge(&sk->sk_write_queue); | 1346 | skb_queue_purge(&sk->sk_write_queue); |
| 1347 | if (session != NULL) { | ||
| 1348 | struct sk_buff *skb; | ||
| 1349 | while ((skb = skb_dequeue(&session->reorder_q))) { | ||
| 1350 | kfree_skb(skb); | ||
| 1351 | sock_put(sk); | ||
| 1352 | } | ||
| 1353 | } | ||
| 1302 | 1354 | ||
| 1303 | release_sock(sk); | 1355 | release_sock(sk); |
| 1304 | 1356 | ||
| @@ -1601,7 +1653,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
| 1601 | 1653 | ||
| 1602 | error = ppp_register_channel(&po->chan); | 1654 | error = ppp_register_channel(&po->chan); |
| 1603 | if (error) | 1655 | if (error) |
| 1604 | goto end; | 1656 | goto end_put_tun; |
| 1605 | 1657 | ||
| 1606 | /* This is how we get the session context from the socket. */ | 1658 | /* This is how we get the session context from the socket. */ |
| 1607 | sk->sk_user_data = session; | 1659 | sk->sk_user_data = session; |
| @@ -1621,6 +1673,8 @@ out_no_ppp: | |||
| 1621 | PRINTK(session->debug, PPPOL2TP_MSG_CONTROL, KERN_INFO, | 1673 | PRINTK(session->debug, PPPOL2TP_MSG_CONTROL, KERN_INFO, |
| 1622 | "%s: created\n", session->name); | 1674 | "%s: created\n", session->name); |
| 1623 | 1675 | ||
| 1676 | end_put_tun: | ||
| 1677 | sock_put(tunnel_sock); | ||
| 1624 | end: | 1678 | end: |
| 1625 | release_sock(sk); | 1679 | release_sock(sk); |
| 1626 | 1680 | ||
| @@ -1668,6 +1722,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 1668 | *usockaddr_len = len; | 1722 | *usockaddr_len = len; |
| 1669 | 1723 | ||
| 1670 | error = 0; | 1724 | error = 0; |
| 1725 | sock_put(sock->sk); | ||
| 1671 | 1726 | ||
| 1672 | end: | 1727 | end: |
| 1673 | return error; | 1728 | return error; |
| @@ -1906,14 +1961,17 @@ static int pppol2tp_ioctl(struct socket *sock, unsigned int cmd, | |||
| 1906 | err = -EBADF; | 1961 | err = -EBADF; |
| 1907 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); | 1962 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); |
| 1908 | if (tunnel == NULL) | 1963 | if (tunnel == NULL) |
| 1909 | goto end; | 1964 | goto end_put_sess; |
| 1910 | 1965 | ||
| 1911 | err = pppol2tp_tunnel_ioctl(tunnel, cmd, arg); | 1966 | err = pppol2tp_tunnel_ioctl(tunnel, cmd, arg); |
| 1912 | goto end; | 1967 | sock_put(session->tunnel_sock); |
| 1968 | goto end_put_sess; | ||
| 1913 | } | 1969 | } |
| 1914 | 1970 | ||
| 1915 | err = pppol2tp_session_ioctl(session, cmd, arg); | 1971 | err = pppol2tp_session_ioctl(session, cmd, arg); |
| 1916 | 1972 | ||
| 1973 | end_put_sess: | ||
| 1974 | sock_put(sk); | ||
| 1917 | end: | 1975 | end: |
| 1918 | return err; | 1976 | return err; |
| 1919 | } | 1977 | } |
| @@ -2059,14 +2117,17 @@ static int pppol2tp_setsockopt(struct socket *sock, int level, int optname, | |||
| 2059 | err = -EBADF; | 2117 | err = -EBADF; |
| 2060 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); | 2118 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); |
| 2061 | if (tunnel == NULL) | 2119 | if (tunnel == NULL) |
| 2062 | goto end; | 2120 | goto end_put_sess; |
| 2063 | 2121 | ||
| 2064 | err = pppol2tp_tunnel_setsockopt(sk, tunnel, optname, val); | 2122 | err = pppol2tp_tunnel_setsockopt(sk, tunnel, optname, val); |
| 2123 | sock_put(session->tunnel_sock); | ||
| 2065 | } else | 2124 | } else |
| 2066 | err = pppol2tp_session_setsockopt(sk, session, optname, val); | 2125 | err = pppol2tp_session_setsockopt(sk, session, optname, val); |
| 2067 | 2126 | ||
| 2068 | err = 0; | 2127 | err = 0; |
| 2069 | 2128 | ||
| 2129 | end_put_sess: | ||
| 2130 | sock_put(sk); | ||
| 2070 | end: | 2131 | end: |
| 2071 | return err; | 2132 | return err; |
| 2072 | } | 2133 | } |
| @@ -2181,20 +2242,24 @@ static int pppol2tp_getsockopt(struct socket *sock, int level, | |||
| 2181 | err = -EBADF; | 2242 | err = -EBADF; |
| 2182 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); | 2243 | tunnel = pppol2tp_sock_to_tunnel(session->tunnel_sock); |
| 2183 | if (tunnel == NULL) | 2244 | if (tunnel == NULL) |
| 2184 | goto end; | 2245 | goto end_put_sess; |
| 2185 | 2246 | ||
| 2186 | err = pppol2tp_tunnel_getsockopt(sk, tunnel, optname, &val); | 2247 | err = pppol2tp_tunnel_getsockopt(sk, tunnel, optname, &val); |
| 2248 | sock_put(session->tunnel_sock); | ||
| 2187 | } else | 2249 | } else |
| 2188 | err = pppol2tp_session_getsockopt(sk, session, optname, &val); | 2250 | err = pppol2tp_session_getsockopt(sk, session, optname, &val); |
| 2189 | 2251 | ||
| 2190 | err = -EFAULT; | 2252 | err = -EFAULT; |
| 2191 | if (put_user(len, (int __user *) optlen)) | 2253 | if (put_user(len, (int __user *) optlen)) |
| 2192 | goto end; | 2254 | goto end_put_sess; |
| 2193 | 2255 | ||
| 2194 | if (copy_to_user((void __user *) optval, &val, len)) | 2256 | if (copy_to_user((void __user *) optval, &val, len)) |
| 2195 | goto end; | 2257 | goto end_put_sess; |
| 2196 | 2258 | ||
| 2197 | err = 0; | 2259 | err = 0; |
| 2260 | |||
| 2261 | end_put_sess: | ||
| 2262 | sock_put(sk); | ||
| 2198 | end: | 2263 | end: |
| 2199 | return err; | 2264 | return err; |
| 2200 | } | 2265 | } |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index a20693e09ae8..b5c1e663417d 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -2861,7 +2861,8 @@ static int s2io_poll_msix(struct napi_struct *napi, int budget) | |||
| 2861 | struct config_param *config; | 2861 | struct config_param *config; |
| 2862 | struct mac_info *mac_control; | 2862 | struct mac_info *mac_control; |
| 2863 | int pkts_processed = 0; | 2863 | int pkts_processed = 0; |
| 2864 | u8 *addr = NULL, val8 = 0; | 2864 | u8 __iomem *addr = NULL; |
| 2865 | u8 val8 = 0; | ||
| 2865 | struct s2io_nic *nic = dev->priv; | 2866 | struct s2io_nic *nic = dev->priv; |
| 2866 | struct XENA_dev_config __iomem *bar0 = nic->bar0; | 2867 | struct XENA_dev_config __iomem *bar0 = nic->bar0; |
| 2867 | int budget_org = budget; | 2868 | int budget_org = budget; |
| @@ -2878,7 +2879,7 @@ static int s2io_poll_msix(struct napi_struct *napi, int budget) | |||
| 2878 | if (pkts_processed < budget_org) { | 2879 | if (pkts_processed < budget_org) { |
| 2879 | netif_rx_complete(dev, napi); | 2880 | netif_rx_complete(dev, napi); |
| 2880 | /*Re Enable MSI-Rx Vector*/ | 2881 | /*Re Enable MSI-Rx Vector*/ |
| 2881 | addr = (u8 *)&bar0->xmsi_mask_reg; | 2882 | addr = (u8 __iomem *)&bar0->xmsi_mask_reg; |
| 2882 | addr += 7 - ring->ring_no; | 2883 | addr += 7 - ring->ring_no; |
| 2883 | val8 = (ring->ring_no == 0) ? 0x3f : 0xbf; | 2884 | val8 = (ring->ring_no == 0) ? 0x3f : 0xbf; |
| 2884 | writeb(val8, addr); | 2885 | writeb(val8, addr); |
| @@ -4364,9 +4365,10 @@ static irqreturn_t s2io_msix_ring_handle(int irq, void *dev_id) | |||
| 4364 | return IRQ_HANDLED; | 4365 | return IRQ_HANDLED; |
| 4365 | 4366 | ||
| 4366 | if (sp->config.napi) { | 4367 | if (sp->config.napi) { |
| 4367 | u8 *addr = NULL, val8 = 0; | 4368 | u8 __iomem *addr = NULL; |
| 4369 | u8 val8 = 0; | ||
| 4368 | 4370 | ||
| 4369 | addr = (u8 *)&bar0->xmsi_mask_reg; | 4371 | addr = (u8 __iomem *)&bar0->xmsi_mask_reg; |
| 4370 | addr += (7 - ring->ring_no); | 4372 | addr += (7 - ring->ring_no); |
| 4371 | val8 = (ring->ring_no == 0) ? 0x7f : 0xff; | 4373 | val8 = (ring->ring_no == 0) ? 0x7f : 0xff; |
| 4372 | writeb(val8, addr); | 4374 | writeb(val8, addr); |
diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c index b4b63805ee8f..61955f8d8011 100644 --- a/drivers/net/sc92031.c +++ b/drivers/net/sc92031.c | |||
| @@ -972,7 +972,7 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 972 | skb_copy_and_csum_dev(skb, priv->tx_bufs + entry * TX_BUF_SIZE); | 972 | skb_copy_and_csum_dev(skb, priv->tx_bufs + entry * TX_BUF_SIZE); |
| 973 | 973 | ||
| 974 | len = skb->len; | 974 | len = skb->len; |
| 975 | if (unlikely(len < ETH_ZLEN)) { | 975 | if (len < ETH_ZLEN) { |
| 976 | memset(priv->tx_bufs + entry * TX_BUF_SIZE + len, | 976 | memset(priv->tx_bufs + entry * TX_BUF_SIZE + len, |
| 977 | 0, ETH_ZLEN - len); | 977 | 0, ETH_ZLEN - len); |
| 978 | len = ETH_ZLEN; | 978 | len = ETH_ZLEN; |
diff --git a/drivers/net/sfc/falcon_xmac.c b/drivers/net/sfc/falcon_xmac.c index dbdcee4b0f8d..55c0d9760be8 100644 --- a/drivers/net/sfc/falcon_xmac.c +++ b/drivers/net/sfc/falcon_xmac.c | |||
| @@ -459,7 +459,7 @@ static int falcon_check_xaui_link_up(struct efx_nic *efx) | |||
| 459 | tries--; | 459 | tries--; |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | EFX_ERR(efx, "Failed to bring XAUI link back up in %d tries!\n", | 462 | EFX_LOG(efx, "Failed to bring XAUI link back up in %d tries!\n", |
| 463 | max_tries); | 463 | max_tries); |
| 464 | return 0; | 464 | return 0; |
| 465 | } | 465 | } |
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index b4e7f30ea4e8..1aa425be3067 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c | |||
| @@ -111,7 +111,7 @@ static __inline__ void tx_add_log(struct happy_meal *hp, unsigned int a, unsigne | |||
| 111 | struct hme_tx_logent *tlp; | 111 | struct hme_tx_logent *tlp; |
| 112 | unsigned long flags; | 112 | unsigned long flags; |
| 113 | 113 | ||
| 114 | save_and_cli(flags); | 114 | local_irq_save(flags); |
| 115 | tlp = &tx_log[txlog_cur_entry]; | 115 | tlp = &tx_log[txlog_cur_entry]; |
| 116 | tlp->tstamp = (unsigned int)jiffies; | 116 | tlp->tstamp = (unsigned int)jiffies; |
| 117 | tlp->tx_new = hp->tx_new; | 117 | tlp->tx_new = hp->tx_new; |
| @@ -119,7 +119,7 @@ static __inline__ void tx_add_log(struct happy_meal *hp, unsigned int a, unsigne | |||
| 119 | tlp->action = a; | 119 | tlp->action = a; |
| 120 | tlp->status = s; | 120 | tlp->status = s; |
| 121 | txlog_cur_entry = (txlog_cur_entry + 1) & (TX_LOG_LEN - 1); | 121 | txlog_cur_entry = (txlog_cur_entry + 1) & (TX_LOG_LEN - 1); |
| 122 | restore_flags(flags); | 122 | local_irq_restore(flags); |
| 123 | } | 123 | } |
| 124 | static __inline__ void tx_dump_log(void) | 124 | static __inline__ void tx_dump_log(void) |
| 125 | { | 125 | { |
diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index f9d13fa05d64..55670b5eb611 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c | |||
| @@ -1729,12 +1729,15 @@ static int tulip_suspend (struct pci_dev *pdev, pm_message_t state) | |||
| 1729 | if (!dev) | 1729 | if (!dev) |
| 1730 | return -EINVAL; | 1730 | return -EINVAL; |
| 1731 | 1731 | ||
| 1732 | if (netif_running(dev)) | 1732 | if (!netif_running(dev)) |
| 1733 | tulip_down(dev); | 1733 | goto save_state; |
| 1734 | |||
| 1735 | tulip_down(dev); | ||
| 1734 | 1736 | ||
| 1735 | netif_device_detach(dev); | 1737 | netif_device_detach(dev); |
| 1736 | free_irq(dev->irq, dev); | 1738 | free_irq(dev->irq, dev); |
| 1737 | 1739 | ||
| 1740 | save_state: | ||
| 1738 | pci_save_state(pdev); | 1741 | pci_save_state(pdev); |
| 1739 | pci_disable_device(pdev); | 1742 | pci_disable_device(pdev); |
| 1740 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 1743 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
| @@ -1754,6 +1757,9 @@ static int tulip_resume(struct pci_dev *pdev) | |||
| 1754 | pci_set_power_state(pdev, PCI_D0); | 1757 | pci_set_power_state(pdev, PCI_D0); |
| 1755 | pci_restore_state(pdev); | 1758 | pci_restore_state(pdev); |
| 1756 | 1759 | ||
| 1760 | if (!netif_running(dev)) | ||
| 1761 | return 0; | ||
| 1762 | |||
| 1757 | if ((retval = pci_enable_device(pdev))) { | 1763 | if ((retval = pci_enable_device(pdev))) { |
| 1758 | printk (KERN_ERR "tulip: pci_enable_device failed in resume\n"); | 1764 | printk (KERN_ERR "tulip: pci_enable_device failed in resume\n"); |
| 1759 | return retval; | 1765 | return retval; |
diff --git a/drivers/net/ucc_geth_ethtool.c b/drivers/net/ucc_geth_ethtool.c index 299b7f176950..f5839c4a5cbd 100644 --- a/drivers/net/ucc_geth_ethtool.c +++ b/drivers/net/ucc_geth_ethtool.c | |||
| @@ -73,6 +73,7 @@ static char tx_fw_stat_gstrings[][ETH_GSTRING_LEN] = { | |||
| 73 | "tx-frames-ok", | 73 | "tx-frames-ok", |
| 74 | "tx-excessive-differ-frames", | 74 | "tx-excessive-differ-frames", |
| 75 | "tx-256-511-frames", | 75 | "tx-256-511-frames", |
| 76 | "tx-512-1023-frames", | ||
| 76 | "tx-1024-1518-frames", | 77 | "tx-1024-1518-frames", |
| 77 | "tx-jumbo-frames", | 78 | "tx-jumbo-frames", |
| 78 | }; | 79 | }; |
| @@ -308,7 +309,7 @@ static void uec_get_strings(struct net_device *netdev, u32 stringset, u8 *buf) | |||
| 308 | buf += UEC_TX_FW_STATS_LEN * ETH_GSTRING_LEN; | 309 | buf += UEC_TX_FW_STATS_LEN * ETH_GSTRING_LEN; |
| 309 | } | 310 | } |
| 310 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) | 311 | if (stats_mode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) |
| 311 | memcpy(buf, tx_fw_stat_gstrings, UEC_RX_FW_STATS_LEN * | 312 | memcpy(buf, rx_fw_stat_gstrings, UEC_RX_FW_STATS_LEN * |
| 312 | ETH_GSTRING_LEN); | 313 | ETH_GSTRING_LEN); |
| 313 | } | 314 | } |
| 314 | 315 | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index fe7cdf2a2a23..5450eac9e263 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -47,6 +47,9 @@ struct virtnet_info | |||
| 47 | /* Number of input buffers, and max we've ever had. */ | 47 | /* Number of input buffers, and max we've ever had. */ |
| 48 | unsigned int num, max; | 48 | unsigned int num, max; |
| 49 | 49 | ||
| 50 | /* For cleaning up after transmission. */ | ||
| 51 | struct tasklet_struct tasklet; | ||
| 52 | |||
| 50 | /* Receive & send queues. */ | 53 | /* Receive & send queues. */ |
| 51 | struct sk_buff_head recv; | 54 | struct sk_buff_head recv; |
| 52 | struct sk_buff_head send; | 55 | struct sk_buff_head send; |
| @@ -68,8 +71,13 @@ static void skb_xmit_done(struct virtqueue *svq) | |||
| 68 | 71 | ||
| 69 | /* Suppress further interrupts. */ | 72 | /* Suppress further interrupts. */ |
| 70 | svq->vq_ops->disable_cb(svq); | 73 | svq->vq_ops->disable_cb(svq); |
| 74 | |||
| 71 | /* We were waiting for more output buffers. */ | 75 | /* We were waiting for more output buffers. */ |
| 72 | netif_wake_queue(vi->dev); | 76 | netif_wake_queue(vi->dev); |
| 77 | |||
| 78 | /* Make sure we re-xmit last_xmit_skb: if there are no more packets | ||
| 79 | * queued, start_xmit won't be called. */ | ||
| 80 | tasklet_schedule(&vi->tasklet); | ||
| 73 | } | 81 | } |
| 74 | 82 | ||
| 75 | static void receive_skb(struct net_device *dev, struct sk_buff *skb, | 83 | static void receive_skb(struct net_device *dev, struct sk_buff *skb, |
| @@ -278,6 +286,18 @@ static int xmit_skb(struct virtnet_info *vi, struct sk_buff *skb) | |||
| 278 | return vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); | 286 | return vi->svq->vq_ops->add_buf(vi->svq, sg, num, 0, skb); |
| 279 | } | 287 | } |
| 280 | 288 | ||
| 289 | static void xmit_tasklet(unsigned long data) | ||
| 290 | { | ||
| 291 | struct virtnet_info *vi = (void *)data; | ||
| 292 | |||
| 293 | netif_tx_lock_bh(vi->dev); | ||
| 294 | if (vi->last_xmit_skb && xmit_skb(vi, vi->last_xmit_skb) == 0) { | ||
| 295 | vi->svq->vq_ops->kick(vi->svq); | ||
| 296 | vi->last_xmit_skb = NULL; | ||
| 297 | } | ||
| 298 | netif_tx_unlock_bh(vi->dev); | ||
| 299 | } | ||
| 300 | |||
| 281 | static int start_xmit(struct sk_buff *skb, struct net_device *dev) | 301 | static int start_xmit(struct sk_buff *skb, struct net_device *dev) |
| 282 | { | 302 | { |
| 283 | struct virtnet_info *vi = netdev_priv(dev); | 303 | struct virtnet_info *vi = netdev_priv(dev); |
| @@ -287,21 +307,25 @@ again: | |||
| 287 | free_old_xmit_skbs(vi); | 307 | free_old_xmit_skbs(vi); |
| 288 | 308 | ||
| 289 | /* If we has a buffer left over from last time, send it now. */ | 309 | /* If we has a buffer left over from last time, send it now. */ |
| 290 | if (vi->last_xmit_skb) { | 310 | if (unlikely(vi->last_xmit_skb)) { |
| 291 | if (xmit_skb(vi, vi->last_xmit_skb) != 0) { | 311 | if (xmit_skb(vi, vi->last_xmit_skb) != 0) { |
| 292 | /* Drop this skb: we only queue one. */ | 312 | /* Drop this skb: we only queue one. */ |
| 293 | vi->dev->stats.tx_dropped++; | 313 | vi->dev->stats.tx_dropped++; |
| 294 | kfree_skb(skb); | 314 | kfree_skb(skb); |
| 315 | skb = NULL; | ||
| 295 | goto stop_queue; | 316 | goto stop_queue; |
| 296 | } | 317 | } |
| 297 | vi->last_xmit_skb = NULL; | 318 | vi->last_xmit_skb = NULL; |
| 298 | } | 319 | } |
| 299 | 320 | ||
| 300 | /* Put new one in send queue and do transmit */ | 321 | /* Put new one in send queue and do transmit */ |
| 301 | __skb_queue_head(&vi->send, skb); | 322 | if (likely(skb)) { |
| 302 | if (xmit_skb(vi, skb) != 0) { | 323 | __skb_queue_head(&vi->send, skb); |
| 303 | vi->last_xmit_skb = skb; | 324 | if (xmit_skb(vi, skb) != 0) { |
| 304 | goto stop_queue; | 325 | vi->last_xmit_skb = skb; |
| 326 | skb = NULL; | ||
| 327 | goto stop_queue; | ||
| 328 | } | ||
| 305 | } | 329 | } |
| 306 | done: | 330 | done: |
| 307 | vi->svq->vq_ops->kick(vi->svq); | 331 | vi->svq->vq_ops->kick(vi->svq); |
| @@ -428,6 +452,8 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 428 | skb_queue_head_init(&vi->recv); | 452 | skb_queue_head_init(&vi->recv); |
| 429 | skb_queue_head_init(&vi->send); | 453 | skb_queue_head_init(&vi->send); |
| 430 | 454 | ||
| 455 | tasklet_init(&vi->tasklet, xmit_tasklet, (unsigned long)vi); | ||
| 456 | |||
| 431 | err = register_netdev(dev); | 457 | err = register_netdev(dev); |
| 432 | if (err) { | 458 | if (err) { |
| 433 | pr_debug("virtio_net: registering device failed\n"); | 459 | pr_debug("virtio_net: registering device failed\n"); |
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 4e1c690ff45f..32019fb878d8 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
| @@ -2905,7 +2905,7 @@ EXPORT_SYMBOL(init_airo_card); | |||
| 2905 | 2905 | ||
| 2906 | static int waitbusy (struct airo_info *ai) { | 2906 | static int waitbusy (struct airo_info *ai) { |
| 2907 | int delay = 0; | 2907 | int delay = 0; |
| 2908 | while ((IN4500 (ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) { | 2908 | while ((IN4500(ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) { |
| 2909 | udelay (10); | 2909 | udelay (10); |
| 2910 | if ((++delay % 20) == 0) | 2910 | if ((++delay % 20) == 0) |
| 2911 | OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); | 2911 | OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY); |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 14a5eea2573e..204077c13870 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
| @@ -3039,7 +3039,6 @@ static void b43legacy_set_pretbtt(struct b43legacy_wldev *dev) | |||
| 3039 | /* Locking: wl->mutex */ | 3039 | /* Locking: wl->mutex */ |
| 3040 | static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) | 3040 | static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) |
| 3041 | { | 3041 | { |
| 3042 | struct b43legacy_wl *wl = dev->wl; | ||
| 3043 | struct b43legacy_phy *phy = &dev->phy; | 3042 | struct b43legacy_phy *phy = &dev->phy; |
| 3044 | u32 macctl; | 3043 | u32 macctl; |
| 3045 | 3044 | ||
| @@ -3054,12 +3053,6 @@ static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) | |||
| 3054 | macctl |= B43legacy_MACCTL_PSM_JMP0; | 3053 | macctl |= B43legacy_MACCTL_PSM_JMP0; |
| 3055 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); | 3054 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); |
| 3056 | 3055 | ||
| 3057 | mutex_unlock(&wl->mutex); | ||
| 3058 | /* Must unlock as it would otherwise deadlock. No races here. | ||
| 3059 | * Cancel possibly pending workqueues. */ | ||
| 3060 | cancel_work_sync(&dev->restart_work); | ||
| 3061 | mutex_lock(&wl->mutex); | ||
| 3062 | |||
| 3063 | b43legacy_leds_exit(dev); | 3056 | b43legacy_leds_exit(dev); |
| 3064 | b43legacy_rng_exit(dev->wl); | 3057 | b43legacy_rng_exit(dev->wl); |
| 3065 | b43legacy_pio_free(dev); | 3058 | b43legacy_pio_free(dev); |
| @@ -3486,6 +3479,8 @@ static void b43legacy_chip_reset(struct work_struct *work) | |||
| 3486 | } | 3479 | } |
| 3487 | } | 3480 | } |
| 3488 | out: | 3481 | out: |
| 3482 | if (err) | ||
| 3483 | wl->current_dev = NULL; /* Failed to init the dev. */ | ||
| 3489 | mutex_unlock(&wl->mutex); | 3484 | mutex_unlock(&wl->mutex); |
| 3490 | if (err) | 3485 | if (err) |
| 3491 | b43legacyerr(wl, "Controller restart FAILED\n"); | 3486 | b43legacyerr(wl, "Controller restart FAILED\n"); |
| @@ -3618,9 +3613,11 @@ static void b43legacy_one_core_detach(struct ssb_device *dev) | |||
| 3618 | struct b43legacy_wldev *wldev; | 3613 | struct b43legacy_wldev *wldev; |
| 3619 | struct b43legacy_wl *wl; | 3614 | struct b43legacy_wl *wl; |
| 3620 | 3615 | ||
| 3616 | /* Do not cancel ieee80211-workqueue based work here. | ||
| 3617 | * See comment in b43legacy_remove(). */ | ||
| 3618 | |||
| 3621 | wldev = ssb_get_drvdata(dev); | 3619 | wldev = ssb_get_drvdata(dev); |
| 3622 | wl = wldev->wl; | 3620 | wl = wldev->wl; |
| 3623 | cancel_work_sync(&wldev->restart_work); | ||
| 3624 | b43legacy_debugfs_remove_device(wldev); | 3621 | b43legacy_debugfs_remove_device(wldev); |
| 3625 | b43legacy_wireless_core_detach(wldev); | 3622 | b43legacy_wireless_core_detach(wldev); |
| 3626 | list_del(&wldev->list); | 3623 | list_del(&wldev->list); |
| @@ -3789,6 +3786,10 @@ static void b43legacy_remove(struct ssb_device *dev) | |||
| 3789 | struct b43legacy_wl *wl = ssb_get_devtypedata(dev); | 3786 | struct b43legacy_wl *wl = ssb_get_devtypedata(dev); |
| 3790 | struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); | 3787 | struct b43legacy_wldev *wldev = ssb_get_drvdata(dev); |
| 3791 | 3788 | ||
| 3789 | /* We must cancel any work here before unregistering from ieee80211, | ||
| 3790 | * as the ieee80211 unreg will destroy the workqueue. */ | ||
| 3791 | cancel_work_sync(&wldev->restart_work); | ||
| 3792 | |||
| 3792 | B43legacy_WARN_ON(!wl); | 3793 | B43legacy_WARN_ON(!wl); |
| 3793 | if (wl->current_dev == wldev) | 3794 | if (wl->current_dev == wldev) |
| 3794 | ieee80211_unregister_hw(wl->hw); | 3795 | ieee80211_unregister_hw(wl->hw); |
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index d74c061994ae..729336774828 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
| @@ -7558,8 +7558,31 @@ static int ipw_associate(void *data) | |||
| 7558 | priv->ieee->iw_mode == IW_MODE_ADHOC && | 7558 | priv->ieee->iw_mode == IW_MODE_ADHOC && |
| 7559 | priv->config & CFG_ADHOC_CREATE && | 7559 | priv->config & CFG_ADHOC_CREATE && |
| 7560 | priv->config & CFG_STATIC_ESSID && | 7560 | priv->config & CFG_STATIC_ESSID && |
| 7561 | priv->config & CFG_STATIC_CHANNEL && | 7561 | priv->config & CFG_STATIC_CHANNEL) { |
| 7562 | !list_empty(&priv->ieee->network_free_list)) { | 7562 | /* Use oldest network if the free list is empty */ |
| 7563 | if (list_empty(&priv->ieee->network_free_list)) { | ||
| 7564 | struct ieee80211_network *oldest = NULL; | ||
| 7565 | struct ieee80211_network *target; | ||
| 7566 | DECLARE_MAC_BUF(mac); | ||
| 7567 | |||
| 7568 | list_for_each_entry(target, &priv->ieee->network_list, list) { | ||
| 7569 | if ((oldest == NULL) || | ||
| 7570 | (target->last_scanned < oldest->last_scanned)) | ||
| 7571 | oldest = target; | ||
| 7572 | } | ||
| 7573 | |||
| 7574 | /* If there are no more slots, expire the oldest */ | ||
| 7575 | list_del(&oldest->list); | ||
| 7576 | target = oldest; | ||
| 7577 | IPW_DEBUG_ASSOC("Expired '%s' (%s) from " | ||
| 7578 | "network list.\n", | ||
| 7579 | escape_essid(target->ssid, | ||
| 7580 | target->ssid_len), | ||
| 7581 | print_mac(mac, target->bssid)); | ||
| 7582 | list_add_tail(&target->list, | ||
| 7583 | &priv->ieee->network_free_list); | ||
| 7584 | } | ||
| 7585 | |||
| 7563 | element = priv->ieee->network_free_list.next; | 7586 | element = priv->ieee->network_free_list.next; |
| 7564 | network = list_entry(element, struct ieee80211_network, list); | 7587 | network = list_entry(element, struct ieee80211_network, list); |
| 7565 | ipw_adhoc_create(priv, network); | 7588 | ipw_adhoc_create(priv, network); |
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c index ad2fabca9116..0aa0ce3b2c42 100644 --- a/drivers/net/wireless/libertas/debugfs.c +++ b/drivers/net/wireless/libertas/debugfs.c | |||
| @@ -312,8 +312,8 @@ static ssize_t lbs_threshold_write(uint16_t tlv_type, uint16_t event_mask, | |||
| 312 | if (tlv_type != TLV_TYPE_BCNMISS) | 312 | if (tlv_type != TLV_TYPE_BCNMISS) |
| 313 | tlv->freq = freq; | 313 | tlv->freq = freq; |
| 314 | 314 | ||
| 315 | /* The command header, the event mask, and the one TLV */ | 315 | /* The command header, the action, the event mask, and one TLV */ |
| 316 | events->hdr.size = cpu_to_le16(sizeof(events->hdr) + 2 + sizeof(*tlv)); | 316 | events->hdr.size = cpu_to_le16(sizeof(events->hdr) + 4 + sizeof(*tlv)); |
| 317 | 317 | ||
| 318 | ret = lbs_cmd_with_response(priv, CMD_802_11_SUBSCRIBE_EVENT, events); | 318 | ret = lbs_cmd_with_response(priv, CMD_802_11_SUBSCRIBE_EVENT, events); |
| 319 | 319 | ||
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 98ddbb3b3273..1610a7308c1d 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
| @@ -49,6 +49,7 @@ static struct usb_device_id p54u_table[] __devinitdata = { | |||
| 49 | {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */ | 49 | {USB_DEVICE(0x5041, 0x2235)}, /* Linksys WUSB54G Portable */ |
| 50 | 50 | ||
| 51 | /* Version 2 devices (3887) */ | 51 | /* Version 2 devices (3887) */ |
| 52 | {USB_DEVICE(0x0471, 0x1230)}, /* Philips CPWUA054/00 */ | ||
| 52 | {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */ | 53 | {USB_DEVICE(0x050d, 0x7050)}, /* Belkin F5D7050 ver 1000 */ |
| 53 | {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */ | 54 | {USB_DEVICE(0x0572, 0x2000)}, /* Cohiba Proto board */ |
| 54 | {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */ | 55 | {USB_DEVICE(0x0572, 0x2002)}, /* Cohiba Proto board */ |
diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c index 715a44471617..b2ccdcbeb896 100644 --- a/drivers/of/of_i2c.c +++ b/drivers/of/of_i2c.c | |||
| @@ -21,7 +21,6 @@ struct i2c_driver_device { | |||
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | static struct i2c_driver_device i2c_devices[] = { | 23 | static struct i2c_driver_device i2c_devices[] = { |
| 24 | { "dallas,ds1374", "rtc-ds1374" }, | ||
| 25 | }; | 24 | }; |
| 26 | 25 | ||
| 27 | static int of_find_i2c_driver(struct device_node *node, | 26 | static int of_find_i2c_driver(struct device_node *node, |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index e2b7de4cb05e..1ff3bb585ab2 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
| @@ -286,7 +286,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) | |||
| 286 | pci_name(pdev), i, | 286 | pci_name(pdev), i, |
| 287 | (unsigned long long) pci_start, | 287 | (unsigned long long) pci_start, |
| 288 | (unsigned long long) pci_end); | 288 | (unsigned long long) pci_end); |
| 289 | res->flags = 0; | 289 | res->flags |= IORESOURCE_DISABLED; |
| 290 | } | 290 | } |
| 291 | } | 291 | } |
| 292 | } | 292 | } |
diff --git a/drivers/pnp/system.c b/drivers/pnp/system.c index 9c2496dbeee4..cf4e07b01d48 100644 --- a/drivers/pnp/system.c +++ b/drivers/pnp/system.c | |||
| @@ -81,7 +81,7 @@ static void reserve_resources_of_dev(struct pnp_dev *dev) | |||
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { | 83 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { |
| 84 | if (res->flags & IORESOURCE_UNSET) | 84 | if (res->flags & (IORESOURCE_UNSET | IORESOURCE_DISABLED)) |
| 85 | continue; | 85 | continue; |
| 86 | 86 | ||
| 87 | reserve_range(dev, res->start, res->end, 0); | 87 | reserve_range(dev, res->start, res->end, 0); |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 6cc2c0330230..60f8afc7a56e 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
| @@ -534,4 +534,12 @@ config RTC_DRV_RS5C313 | |||
| 534 | help | 534 | help |
| 535 | If you say yes here you get support for the Ricoh RS5C313 RTC chips. | 535 | If you say yes here you get support for the Ricoh RS5C313 RTC chips. |
| 536 | 536 | ||
| 537 | config RTC_DRV_PPC | ||
| 538 | tristate "PowerPC machine dependent RTC support" | ||
| 539 | depends on PPC_MERGE | ||
| 540 | help | ||
| 541 | The PowerPC kernel has machine-specific functions for accessing | ||
| 542 | the RTC. This exposes that functionality through the generic RTC | ||
| 543 | class. | ||
| 544 | |||
| 537 | endif # RTC_CLASS | 545 | endif # RTC_CLASS |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 872f1218ff9f..ebe871cf16c1 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
| @@ -54,3 +54,4 @@ obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o | |||
| 54 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o | 54 | obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o |
| 55 | obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o | 55 | obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o |
| 56 | obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o | 56 | obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o |
| 57 | obj-$(CONFIG_RTC_DRV_PPC) += rtc-ppc.o | ||
diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c index fa2d2f8b3f4d..640acd20fdde 100644 --- a/drivers/rtc/rtc-ds1374.c +++ b/drivers/rtc/rtc-ds1374.c | |||
| @@ -42,7 +42,7 @@ | |||
| 42 | #define DS1374_REG_TCR 0x09 /* Trickle Charge */ | 42 | #define DS1374_REG_TCR 0x09 /* Trickle Charge */ |
| 43 | 43 | ||
| 44 | static const struct i2c_device_id ds1374_id[] = { | 44 | static const struct i2c_device_id ds1374_id[] = { |
| 45 | { "rtc-ds1374", 0 }, | 45 | { "ds1374", 0 }, |
| 46 | { } | 46 | { } |
| 47 | }; | 47 | }; |
| 48 | MODULE_DEVICE_TABLE(i2c, ds1374_id); | 48 | MODULE_DEVICE_TABLE(i2c, ds1374_id); |
diff --git a/drivers/rtc/rtc-ppc.c b/drivers/rtc/rtc-ppc.c new file mode 100644 index 000000000000..c8e97e25ef7e --- /dev/null +++ b/drivers/rtc/rtc-ppc.c | |||
| @@ -0,0 +1,69 @@ | |||
| 1 | /* | ||
| 2 | * RTC driver for ppc_md RTC functions | ||
| 3 | * | ||
| 4 | * © 2007 Red Hat, Inc. | ||
| 5 | * | ||
| 6 | * Author: David Woodhouse <dwmw2@infradead.org> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | |||
| 14 | #include <linux/module.h> | ||
| 15 | #include <linux/err.h> | ||
| 16 | #include <linux/rtc.h> | ||
| 17 | #include <linux/platform_device.h> | ||
| 18 | #include <asm/machdep.h> | ||
| 19 | |||
| 20 | static int ppc_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
| 21 | { | ||
| 22 | ppc_md.get_rtc_time(tm); | ||
| 23 | return 0; | ||
| 24 | } | ||
| 25 | |||
| 26 | static int ppc_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
| 27 | { | ||
| 28 | return ppc_md.set_rtc_time(tm); | ||
| 29 | } | ||
| 30 | |||
| 31 | static const struct rtc_class_ops ppc_rtc_ops = { | ||
| 32 | .set_time = ppc_rtc_set_time, | ||
| 33 | .read_time = ppc_rtc_read_time, | ||
| 34 | }; | ||
| 35 | |||
| 36 | static struct rtc_device *rtc; | ||
| 37 | static struct platform_device *ppc_rtc_pdev; | ||
| 38 | |||
| 39 | static int __init ppc_rtc_init(void) | ||
| 40 | { | ||
| 41 | if (!ppc_md.get_rtc_time || !ppc_md.set_rtc_time) | ||
| 42 | return -ENODEV; | ||
| 43 | |||
| 44 | ppc_rtc_pdev = platform_device_register_simple("ppc-rtc", 0, NULL, 0); | ||
| 45 | if (IS_ERR(ppc_rtc_pdev)) | ||
| 46 | return PTR_ERR(ppc_rtc_pdev); | ||
| 47 | |||
| 48 | rtc = rtc_device_register("ppc_md", &ppc_rtc_pdev->dev, | ||
| 49 | &ppc_rtc_ops, THIS_MODULE); | ||
| 50 | if (IS_ERR(rtc)) { | ||
| 51 | platform_device_unregister(ppc_rtc_pdev); | ||
| 52 | return PTR_ERR(rtc); | ||
| 53 | } | ||
| 54 | |||
| 55 | return 0; | ||
| 56 | } | ||
| 57 | |||
| 58 | static void __exit ppc_rtc_exit(void) | ||
| 59 | { | ||
| 60 | rtc_device_unregister(rtc); | ||
| 61 | platform_device_unregister(ppc_rtc_pdev); | ||
| 62 | } | ||
| 63 | |||
| 64 | module_init(ppc_rtc_init); | ||
| 65 | module_exit(ppc_rtc_exit); | ||
| 66 | |||
| 67 | MODULE_LICENSE("GPL"); | ||
| 68 | MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>"); | ||
| 69 | MODULE_DESCRIPTION("Generic RTC class driver for PowerPC"); | ||
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index ccfd8aca3765..5d23368a1bce 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
| @@ -1348,7 +1348,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, | |||
| 1348 | 1348 | ||
| 1349 | del_timer(&evt_struct->timer); | 1349 | del_timer(&evt_struct->timer); |
| 1350 | 1350 | ||
| 1351 | if (crq->status != VIOSRP_OK && evt_struct->cmnd) | 1351 | if ((crq->status != VIOSRP_OK && crq->status != VIOSRP_OK2) && evt_struct->cmnd) |
| 1352 | evt_struct->cmnd->result = DID_ERROR << 16; | 1352 | evt_struct->cmnd->result = DID_ERROR << 16; |
| 1353 | if (evt_struct->done) | 1353 | if (evt_struct->done) |
| 1354 | evt_struct->done(evt_struct); | 1354 | evt_struct->done(evt_struct); |
diff --git a/drivers/scsi/ibmvscsi/viosrp.h b/drivers/scsi/ibmvscsi/viosrp.h index 4c4aadb3e405..204604501ad8 100644 --- a/drivers/scsi/ibmvscsi/viosrp.h +++ b/drivers/scsi/ibmvscsi/viosrp.h | |||
| @@ -65,7 +65,8 @@ enum viosrp_crq_status { | |||
| 65 | VIOSRP_VIOLATES_MAX_XFER = 0x2, | 65 | VIOSRP_VIOLATES_MAX_XFER = 0x2, |
| 66 | VIOSRP_PARTNER_PANIC = 0x3, | 66 | VIOSRP_PARTNER_PANIC = 0x3, |
| 67 | VIOSRP_DEVICE_BUSY = 0x8, | 67 | VIOSRP_DEVICE_BUSY = 0x8, |
| 68 | VIOSRP_ADAPTER_FAIL = 0x10 | 68 | VIOSRP_ADAPTER_FAIL = 0x10, |
| 69 | VIOSRP_OK2 = 0x99, | ||
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 71 | struct viosrp_crq { | 72 | struct viosrp_crq { |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 287690853caf..8dd88fc1244a 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
| @@ -70,6 +70,9 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj, | |||
| 70 | case 2: | 70 | case 2: |
| 71 | qla2x00_alloc_fw_dump(ha); | 71 | qla2x00_alloc_fw_dump(ha); |
| 72 | break; | 72 | break; |
| 73 | case 3: | ||
| 74 | qla2x00_system_error(ha); | ||
| 75 | break; | ||
| 73 | } | 76 | } |
| 74 | return (count); | 77 | return (count); |
| 75 | } | 78 | } |
| @@ -886,9 +889,13 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) | |||
| 886 | static void | 889 | static void |
| 887 | qla2x00_get_host_port_type(struct Scsi_Host *shost) | 890 | qla2x00_get_host_port_type(struct Scsi_Host *shost) |
| 888 | { | 891 | { |
| 889 | scsi_qla_host_t *ha = to_qla_parent(shost_priv(shost)); | 892 | scsi_qla_host_t *ha = shost_priv(shost); |
| 890 | uint32_t port_type = FC_PORTTYPE_UNKNOWN; | 893 | uint32_t port_type = FC_PORTTYPE_UNKNOWN; |
| 891 | 894 | ||
| 895 | if (ha->parent) { | ||
| 896 | fc_host_port_type(shost) = FC_PORTTYPE_NPIV; | ||
| 897 | return; | ||
| 898 | } | ||
| 892 | switch (ha->current_topology) { | 899 | switch (ha->current_topology) { |
| 893 | case ISP_CFG_NL: | 900 | case ISP_CFG_NL: |
| 894 | port_type = FC_PORTTYPE_LPORT; | 901 | port_type = FC_PORTTYPE_LPORT; |
| @@ -1172,10 +1179,10 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) | |||
| 1172 | qla24xx_disable_vp(vha); | 1179 | qla24xx_disable_vp(vha); |
| 1173 | qla24xx_deallocate_vp_id(vha); | 1180 | qla24xx_deallocate_vp_id(vha); |
| 1174 | 1181 | ||
| 1175 | down(&ha->vport_sem); | 1182 | mutex_lock(&ha->vport_lock); |
| 1176 | ha->cur_vport_count--; | 1183 | ha->cur_vport_count--; |
| 1177 | clear_bit(vha->vp_idx, ha->vp_idx_map); | 1184 | clear_bit(vha->vp_idx, ha->vp_idx_map); |
| 1178 | up(&ha->vport_sem); | 1185 | mutex_unlock(&ha->vport_lock); |
| 1179 | 1186 | ||
| 1180 | kfree(vha->node_name); | 1187 | kfree(vha->node_name); |
| 1181 | kfree(vha->port_name); | 1188 | kfree(vha->port_name); |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 299eccf6cabd..8dd600013bd1 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
| @@ -2457,7 +2457,7 @@ typedef struct scsi_qla_host { | |||
| 2457 | #define MBX_INTR_WAIT 2 | 2457 | #define MBX_INTR_WAIT 2 |
| 2458 | #define MBX_UPDATE_FLASH_ACTIVE 3 | 2458 | #define MBX_UPDATE_FLASH_ACTIVE 3 |
| 2459 | 2459 | ||
| 2460 | struct semaphore vport_sem; /* Virtual port synchronization */ | 2460 | struct mutex vport_lock; /* Virtual port synchronization */ |
| 2461 | struct completion mbx_cmd_comp; /* Serialize mbx access */ | 2461 | struct completion mbx_cmd_comp; /* Serialize mbx access */ |
| 2462 | struct completion mbx_intr_comp; /* Used for completion notification */ | 2462 | struct completion mbx_intr_comp; /* Used for completion notification */ |
| 2463 | 2463 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index f8827068d30f..9b4bebee6879 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
| @@ -228,6 +228,9 @@ extern int qla24xx_abort_target(struct fc_port *, unsigned int); | |||
| 228 | extern int qla24xx_lun_reset(struct fc_port *, unsigned int); | 228 | extern int qla24xx_lun_reset(struct fc_port *, unsigned int); |
| 229 | 229 | ||
| 230 | extern int | 230 | extern int |
| 231 | qla2x00_system_error(scsi_qla_host_t *); | ||
| 232 | |||
| 233 | extern int | ||
| 231 | qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); | 234 | qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); |
| 232 | 235 | ||
| 233 | extern int | 236 | extern int |
diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h index e9bae27737d1..92fafbdbbaab 100644 --- a/drivers/scsi/qla2xxx/qla_inline.h +++ b/drivers/scsi/qla2xxx/qla_inline.h | |||
| @@ -34,7 +34,11 @@ qla2x00_debounce_register(volatile uint16_t __iomem *addr) | |||
| 34 | static inline void | 34 | static inline void |
| 35 | qla2x00_poll(scsi_qla_host_t *ha) | 35 | qla2x00_poll(scsi_qla_host_t *ha) |
| 36 | { | 36 | { |
| 37 | unsigned long flags; | ||
| 38 | |||
| 39 | local_irq_save(flags); | ||
| 37 | ha->isp_ops->intr_handler(0, ha); | 40 | ha->isp_ops->intr_handler(0, ha); |
| 41 | local_irq_restore(flags); | ||
| 38 | } | 42 | } |
| 39 | 43 | ||
| 40 | static __inline__ scsi_qla_host_t * | 44 | static __inline__ scsi_qla_host_t * |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 5d9a64a7879b..ec63b79f900a 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
| @@ -272,8 +272,6 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | |||
| 272 | uint32_t rscn_entry, host_pid; | 272 | uint32_t rscn_entry, host_pid; |
| 273 | uint8_t rscn_queue_index; | 273 | uint8_t rscn_queue_index; |
| 274 | unsigned long flags; | 274 | unsigned long flags; |
| 275 | scsi_qla_host_t *vha; | ||
| 276 | int i; | ||
| 277 | 275 | ||
| 278 | /* Setup to process RIO completion. */ | 276 | /* Setup to process RIO completion. */ |
| 279 | handle_cnt = 0; | 277 | handle_cnt = 0; |
| @@ -544,18 +542,10 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | |||
| 544 | break; | 542 | break; |
| 545 | 543 | ||
| 546 | case MBA_PORT_UPDATE: /* Port database update */ | 544 | case MBA_PORT_UPDATE: /* Port database update */ |
| 547 | if ((ha->flags.npiv_supported) && (ha->num_vhosts)) { | 545 | /* Only handle SCNs for our Vport index. */ |
| 548 | for_each_mapped_vp_idx(ha, i) { | 546 | if (ha->parent && ha->vp_idx != (mb[3] & 0xff)) |
| 549 | list_for_each_entry(vha, &ha->vp_list, | 547 | break; |
| 550 | vp_list) { | 548 | |
| 551 | if ((mb[3] & 0xff) | ||
| 552 | == vha->vp_idx) { | ||
| 553 | ha = vha; | ||
| 554 | break; | ||
| 555 | } | ||
| 556 | } | ||
| 557 | } | ||
| 558 | } | ||
| 559 | /* | 549 | /* |
| 560 | * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET | 550 | * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET |
| 561 | * event etc. earlier indicating loop is down) then process | 551 | * event etc. earlier indicating loop is down) then process |
| @@ -590,18 +580,12 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | |||
| 590 | break; | 580 | break; |
| 591 | 581 | ||
| 592 | case MBA_RSCN_UPDATE: /* State Change Registration */ | 582 | case MBA_RSCN_UPDATE: /* State Change Registration */ |
| 593 | if ((ha->flags.npiv_supported) && (ha->num_vhosts)) { | 583 | /* Check if the Vport has issued a SCR */ |
| 594 | for_each_mapped_vp_idx(ha, i) { | 584 | if (ha->parent && test_bit(VP_SCR_NEEDED, &ha->vp_flags)) |
| 595 | list_for_each_entry(vha, &ha->vp_list, | 585 | break; |
| 596 | vp_list) { | 586 | /* Only handle SCNs for our Vport index. */ |
| 597 | if ((mb[3] & 0xff) | 587 | if (ha->parent && ha->vp_idx != (mb[3] & 0xff)) |
| 598 | == vha->vp_idx) { | 588 | break; |
| 599 | ha = vha; | ||
| 600 | break; | ||
| 601 | } | ||
| 602 | } | ||
| 603 | } | ||
| 604 | } | ||
| 605 | 589 | ||
| 606 | DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n", | 590 | DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n", |
| 607 | ha->host_no)); | 591 | ha->host_no)); |
| @@ -1132,25 +1116,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
| 1132 | break; | 1116 | break; |
| 1133 | 1117 | ||
| 1134 | qla2x00_handle_sense(sp, sense_data, sense_len); | 1118 | qla2x00_handle_sense(sp, sense_data, sense_len); |
| 1135 | |||
| 1136 | /* | ||
| 1137 | * In case of a Underrun condition, set both the lscsi | ||
| 1138 | * status and the completion status to appropriate | ||
| 1139 | * values. | ||
| 1140 | */ | ||
| 1141 | if (resid && | ||
| 1142 | ((unsigned)(scsi_bufflen(cp) - resid) < | ||
| 1143 | cp->underflow)) { | ||
| 1144 | DEBUG2(qla_printk(KERN_INFO, ha, | ||
| 1145 | "scsi(%ld:%d:%d:%d): Mid-layer underflow " | ||
| 1146 | "detected (%x of %x bytes)...returning " | ||
| 1147 | "error status.\n", ha->host_no, | ||
| 1148 | cp->device->channel, cp->device->id, | ||
| 1149 | cp->device->lun, resid, | ||
| 1150 | scsi_bufflen(cp))); | ||
| 1151 | |||
| 1152 | cp->result = DID_ERROR << 16 | lscsi_status; | ||
| 1153 | } | ||
| 1154 | } else { | 1119 | } else { |
| 1155 | /* | 1120 | /* |
| 1156 | * If RISC reports underrun and target does not report | 1121 | * If RISC reports underrun and target does not report |
| @@ -1639,12 +1604,12 @@ qla24xx_msix_rsp_q(int irq, void *dev_id) | |||
| 1639 | ha = dev_id; | 1604 | ha = dev_id; |
| 1640 | reg = &ha->iobase->isp24; | 1605 | reg = &ha->iobase->isp24; |
| 1641 | 1606 | ||
| 1642 | spin_lock(&ha->hardware_lock); | 1607 | spin_lock_irq(&ha->hardware_lock); |
| 1643 | 1608 | ||
| 1644 | qla24xx_process_response_queue(ha); | 1609 | qla24xx_process_response_queue(ha); |
| 1645 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 1610 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
| 1646 | 1611 | ||
| 1647 | spin_unlock(&ha->hardware_lock); | 1612 | spin_unlock_irq(&ha->hardware_lock); |
| 1648 | 1613 | ||
| 1649 | return IRQ_HANDLED; | 1614 | return IRQ_HANDLED; |
| 1650 | } | 1615 | } |
| @@ -1663,7 +1628,7 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
| 1663 | reg = &ha->iobase->isp24; | 1628 | reg = &ha->iobase->isp24; |
| 1664 | status = 0; | 1629 | status = 0; |
| 1665 | 1630 | ||
| 1666 | spin_lock(&ha->hardware_lock); | 1631 | spin_lock_irq(&ha->hardware_lock); |
| 1667 | do { | 1632 | do { |
| 1668 | stat = RD_REG_DWORD(®->host_status); | 1633 | stat = RD_REG_DWORD(®->host_status); |
| 1669 | if (stat & HSRX_RISC_PAUSED) { | 1634 | if (stat & HSRX_RISC_PAUSED) { |
| @@ -1716,7 +1681,7 @@ qla24xx_msix_default(int irq, void *dev_id) | |||
| 1716 | } | 1681 | } |
| 1717 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 1682 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); |
| 1718 | } while (0); | 1683 | } while (0); |
| 1719 | spin_unlock(&ha->hardware_lock); | 1684 | spin_unlock_irq(&ha->hardware_lock); |
| 1720 | 1685 | ||
| 1721 | if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && | 1686 | if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && |
| 1722 | (status & MBX_INTERRUPT) && ha->flags.mbox_int) { | 1687 | (status & MBX_INTERRUPT) && ha->flags.mbox_int) { |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 210060420809..250d2f604397 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
| @@ -2303,8 +2303,6 @@ qla24xx_lun_reset(struct fc_port *fcport, unsigned int l) | |||
| 2303 | return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l); | 2303 | return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l); |
| 2304 | } | 2304 | } |
| 2305 | 2305 | ||
| 2306 | #if 0 | ||
| 2307 | |||
| 2308 | int | 2306 | int |
| 2309 | qla2x00_system_error(scsi_qla_host_t *ha) | 2307 | qla2x00_system_error(scsi_qla_host_t *ha) |
| 2310 | { | 2308 | { |
| @@ -2312,7 +2310,7 @@ qla2x00_system_error(scsi_qla_host_t *ha) | |||
| 2312 | mbx_cmd_t mc; | 2310 | mbx_cmd_t mc; |
| 2313 | mbx_cmd_t *mcp = &mc; | 2311 | mbx_cmd_t *mcp = &mc; |
| 2314 | 2312 | ||
| 2315 | if (!IS_FWI2_CAPABLE(ha)) | 2313 | if (!IS_QLA23XX(ha) && !IS_FWI2_CAPABLE(ha)) |
| 2316 | return QLA_FUNCTION_FAILED; | 2314 | return QLA_FUNCTION_FAILED; |
| 2317 | 2315 | ||
| 2318 | DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); | 2316 | DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); |
| @@ -2334,8 +2332,6 @@ qla2x00_system_error(scsi_qla_host_t *ha) | |||
| 2334 | return rval; | 2332 | return rval; |
| 2335 | } | 2333 | } |
| 2336 | 2334 | ||
| 2337 | #endif /* 0 */ | ||
| 2338 | |||
| 2339 | /** | 2335 | /** |
| 2340 | * qla2x00_set_serdes_params() - | 2336 | * qla2x00_set_serdes_params() - |
| 2341 | * @ha: HA context | 2337 | * @ha: HA context |
| @@ -2508,7 +2504,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *ha, dma_addr_t fce_dma, | |||
| 2508 | if (mb) | 2504 | if (mb) |
| 2509 | memcpy(mb, mcp->mb, 8 * sizeof(*mb)); | 2505 | memcpy(mb, mcp->mb, 8 * sizeof(*mb)); |
| 2510 | if (dwords) | 2506 | if (dwords) |
| 2511 | *dwords = mcp->mb[6]; | 2507 | *dwords = buffers; |
| 2512 | } | 2508 | } |
| 2513 | 2509 | ||
| 2514 | return rval; | 2510 | return rval; |
| @@ -2807,9 +2803,9 @@ qla24xx_control_vp(scsi_qla_host_t *vha, int cmd) | |||
| 2807 | */ | 2803 | */ |
| 2808 | map = (vp_index - 1) / 8; | 2804 | map = (vp_index - 1) / 8; |
| 2809 | pos = (vp_index - 1) & 7; | 2805 | pos = (vp_index - 1) & 7; |
| 2810 | down(&ha->vport_sem); | 2806 | mutex_lock(&ha->vport_lock); |
| 2811 | vce->vp_idx_map[map] |= 1 << pos; | 2807 | vce->vp_idx_map[map] |= 1 << pos; |
| 2812 | up(&ha->vport_sem); | 2808 | mutex_unlock(&ha->vport_lock); |
| 2813 | 2809 | ||
| 2814 | rval = qla2x00_issue_iocb(ha, vce, vce_dma, 0); | 2810 | rval = qla2x00_issue_iocb(ha, vce, vce_dma, 0); |
| 2815 | if (rval != QLA_SUCCESS) { | 2811 | if (rval != QLA_SUCCESS) { |
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index f2b04979e5f0..62a3ad6e8ecb 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
| @@ -32,12 +32,12 @@ qla24xx_allocate_vp_id(scsi_qla_host_t *vha) | |||
| 32 | scsi_qla_host_t *ha = vha->parent; | 32 | scsi_qla_host_t *ha = vha->parent; |
| 33 | 33 | ||
| 34 | /* Find an empty slot and assign an vp_id */ | 34 | /* Find an empty slot and assign an vp_id */ |
| 35 | down(&ha->vport_sem); | 35 | mutex_lock(&ha->vport_lock); |
| 36 | vp_id = find_first_zero_bit(ha->vp_idx_map, ha->max_npiv_vports + 1); | 36 | vp_id = find_first_zero_bit(ha->vp_idx_map, ha->max_npiv_vports + 1); |
| 37 | if (vp_id > ha->max_npiv_vports) { | 37 | if (vp_id > ha->max_npiv_vports) { |
| 38 | DEBUG15(printk ("vp_id %d is bigger than max-supported %d.\n", | 38 | DEBUG15(printk ("vp_id %d is bigger than max-supported %d.\n", |
| 39 | vp_id, ha->max_npiv_vports)); | 39 | vp_id, ha->max_npiv_vports)); |
| 40 | up(&ha->vport_sem); | 40 | mutex_unlock(&ha->vport_lock); |
| 41 | return vp_id; | 41 | return vp_id; |
| 42 | } | 42 | } |
| 43 | 43 | ||
| @@ -45,7 +45,7 @@ qla24xx_allocate_vp_id(scsi_qla_host_t *vha) | |||
| 45 | ha->num_vhosts++; | 45 | ha->num_vhosts++; |
| 46 | vha->vp_idx = vp_id; | 46 | vha->vp_idx = vp_id; |
| 47 | list_add_tail(&vha->vp_list, &ha->vp_list); | 47 | list_add_tail(&vha->vp_list, &ha->vp_list); |
| 48 | up(&ha->vport_sem); | 48 | mutex_unlock(&ha->vport_lock); |
| 49 | return vp_id; | 49 | return vp_id; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| @@ -55,12 +55,12 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha) | |||
| 55 | uint16_t vp_id; | 55 | uint16_t vp_id; |
| 56 | scsi_qla_host_t *ha = vha->parent; | 56 | scsi_qla_host_t *ha = vha->parent; |
| 57 | 57 | ||
| 58 | down(&ha->vport_sem); | 58 | mutex_lock(&ha->vport_lock); |
| 59 | vp_id = vha->vp_idx; | 59 | vp_id = vha->vp_idx; |
| 60 | ha->num_vhosts--; | 60 | ha->num_vhosts--; |
| 61 | clear_bit(vp_id, ha->vp_idx_map); | 61 | clear_bit(vp_id, ha->vp_idx_map); |
| 62 | list_del(&vha->vp_list); | 62 | list_del(&vha->vp_list); |
| 63 | up(&ha->vport_sem); | 63 | mutex_unlock(&ha->vport_lock); |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | static scsi_qla_host_t * | 66 | static scsi_qla_host_t * |
| @@ -145,9 +145,9 @@ qla24xx_enable_vp(scsi_qla_host_t *vha) | |||
| 145 | } | 145 | } |
| 146 | 146 | ||
| 147 | /* Initialize the new vport unless it is a persistent port */ | 147 | /* Initialize the new vport unless it is a persistent port */ |
| 148 | down(&ha->vport_sem); | 148 | mutex_lock(&ha->vport_lock); |
| 149 | ret = qla24xx_modify_vp_config(vha); | 149 | ret = qla24xx_modify_vp_config(vha); |
| 150 | up(&ha->vport_sem); | 150 | mutex_unlock(&ha->vport_lock); |
| 151 | 151 | ||
| 152 | if (ret != QLA_SUCCESS) { | 152 | if (ret != QLA_SUCCESS) { |
| 153 | fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); | 153 | fc_vport_set_state(vha->fc_vport, FC_VPORT_FAILED); |
| @@ -406,6 +406,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport) | |||
| 406 | INIT_LIST_HEAD(&vha->list); | 406 | INIT_LIST_HEAD(&vha->list); |
| 407 | INIT_LIST_HEAD(&vha->fcports); | 407 | INIT_LIST_HEAD(&vha->fcports); |
| 408 | INIT_LIST_HEAD(&vha->vp_fcports); | 408 | INIT_LIST_HEAD(&vha->vp_fcports); |
| 409 | INIT_LIST_HEAD(&vha->work_list); | ||
| 409 | 410 | ||
| 410 | vha->dpc_flags = 0L; | 411 | vha->dpc_flags = 0L; |
| 411 | set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); | 412 | set_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags); |
| @@ -437,10 +438,10 @@ qla24xx_create_vhost(struct fc_vport *fc_vport) | |||
| 437 | vha->flags.init_done = 1; | 438 | vha->flags.init_done = 1; |
| 438 | num_hosts++; | 439 | num_hosts++; |
| 439 | 440 | ||
| 440 | down(&ha->vport_sem); | 441 | mutex_lock(&ha->vport_lock); |
| 441 | set_bit(vha->vp_idx, ha->vp_idx_map); | 442 | set_bit(vha->vp_idx, ha->vp_idx_map); |
| 442 | ha->cur_vport_count++; | 443 | ha->cur_vport_count++; |
| 443 | up(&ha->vport_sem); | 444 | mutex_unlock(&ha->vport_lock); |
| 444 | 445 | ||
| 445 | return vha; | 446 | return vha; |
| 446 | 447 | ||
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 3223fd16bcfe..48eaa3bb5433 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/vmalloc.h> | 10 | #include <linux/vmalloc.h> |
| 11 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
| 12 | #include <linux/kthread.h> | 12 | #include <linux/kthread.h> |
| 13 | #include <linux/mutex.h> | ||
| 13 | 14 | ||
| 14 | #include <scsi/scsi_tcq.h> | 15 | #include <scsi/scsi_tcq.h> |
| 15 | #include <scsi/scsicam.h> | 16 | #include <scsi/scsicam.h> |
| @@ -1631,7 +1632,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1631 | /* load the F/W, read paramaters, and init the H/W */ | 1632 | /* load the F/W, read paramaters, and init the H/W */ |
| 1632 | ha->instance = num_hosts; | 1633 | ha->instance = num_hosts; |
| 1633 | 1634 | ||
| 1634 | init_MUTEX(&ha->vport_sem); | 1635 | mutex_init(&ha->vport_lock); |
| 1635 | init_completion(&ha->mbx_cmd_comp); | 1636 | init_completion(&ha->mbx_cmd_comp); |
| 1636 | complete(&ha->mbx_cmd_comp); | 1637 | complete(&ha->mbx_cmd_comp); |
| 1637 | init_completion(&ha->mbx_intr_comp); | 1638 | init_completion(&ha->mbx_intr_comp); |
| @@ -2156,13 +2157,14 @@ static int | |||
| 2156 | qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked) | 2157 | qla2x00_post_work(struct scsi_qla_host *ha, struct qla_work_evt *e, int locked) |
| 2157 | { | 2158 | { |
| 2158 | unsigned long flags; | 2159 | unsigned long flags; |
| 2160 | scsi_qla_host_t *pha = to_qla_parent(ha); | ||
| 2159 | 2161 | ||
| 2160 | if (!locked) | 2162 | if (!locked) |
| 2161 | spin_lock_irqsave(&ha->hardware_lock, flags); | 2163 | spin_lock_irqsave(&pha->hardware_lock, flags); |
| 2162 | list_add_tail(&e->list, &ha->work_list); | 2164 | list_add_tail(&e->list, &ha->work_list); |
| 2163 | qla2xxx_wake_dpc(ha); | 2165 | qla2xxx_wake_dpc(ha); |
| 2164 | if (!locked) | 2166 | if (!locked) |
| 2165 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 2167 | spin_unlock_irqrestore(&pha->hardware_lock, flags); |
| 2166 | return QLA_SUCCESS; | 2168 | return QLA_SUCCESS; |
| 2167 | } | 2169 | } |
| 2168 | 2170 | ||
| @@ -2202,12 +2204,13 @@ static void | |||
| 2202 | qla2x00_do_work(struct scsi_qla_host *ha) | 2204 | qla2x00_do_work(struct scsi_qla_host *ha) |
| 2203 | { | 2205 | { |
| 2204 | struct qla_work_evt *e; | 2206 | struct qla_work_evt *e; |
| 2207 | scsi_qla_host_t *pha = to_qla_parent(ha); | ||
| 2205 | 2208 | ||
| 2206 | spin_lock_irq(&ha->hardware_lock); | 2209 | spin_lock_irq(&pha->hardware_lock); |
| 2207 | while (!list_empty(&ha->work_list)) { | 2210 | while (!list_empty(&ha->work_list)) { |
| 2208 | e = list_entry(ha->work_list.next, struct qla_work_evt, list); | 2211 | e = list_entry(ha->work_list.next, struct qla_work_evt, list); |
| 2209 | list_del_init(&e->list); | 2212 | list_del_init(&e->list); |
| 2210 | spin_unlock_irq(&ha->hardware_lock); | 2213 | spin_unlock_irq(&pha->hardware_lock); |
| 2211 | 2214 | ||
| 2212 | switch (e->type) { | 2215 | switch (e->type) { |
| 2213 | case QLA_EVT_AEN: | 2216 | case QLA_EVT_AEN: |
| @@ -2221,9 +2224,9 @@ qla2x00_do_work(struct scsi_qla_host *ha) | |||
| 2221 | } | 2224 | } |
| 2222 | if (e->flags & QLA_EVT_FLAG_FREE) | 2225 | if (e->flags & QLA_EVT_FLAG_FREE) |
| 2223 | kfree(e); | 2226 | kfree(e); |
| 2224 | spin_lock_irq(&ha->hardware_lock); | 2227 | spin_lock_irq(&pha->hardware_lock); |
| 2225 | } | 2228 | } |
| 2226 | spin_unlock_irq(&ha->hardware_lock); | 2229 | spin_unlock_irq(&pha->hardware_lock); |
| 2227 | } | 2230 | } |
| 2228 | 2231 | ||
| 2229 | /************************************************************************** | 2232 | /************************************************************************** |
| @@ -2634,7 +2637,7 @@ qla2x00_timer(scsi_qla_host_t *ha) | |||
| 2634 | #define FW_FILE_ISP24XX "ql2400_fw.bin" | 2637 | #define FW_FILE_ISP24XX "ql2400_fw.bin" |
| 2635 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | 2638 | #define FW_FILE_ISP25XX "ql2500_fw.bin" |
| 2636 | 2639 | ||
| 2637 | static DECLARE_MUTEX(qla_fw_lock); | 2640 | static DEFINE_MUTEX(qla_fw_lock); |
| 2638 | 2641 | ||
| 2639 | static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | 2642 | static struct fw_blob qla_fw_blobs[FW_BLOBS] = { |
| 2640 | { .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, }, | 2643 | { .name = FW_FILE_ISP21XX, .segs = { 0x1000, 0 }, }, |
| @@ -2665,7 +2668,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) | |||
| 2665 | blob = &qla_fw_blobs[FW_ISP25XX]; | 2668 | blob = &qla_fw_blobs[FW_ISP25XX]; |
| 2666 | } | 2669 | } |
| 2667 | 2670 | ||
| 2668 | down(&qla_fw_lock); | 2671 | mutex_lock(&qla_fw_lock); |
| 2669 | if (blob->fw) | 2672 | if (blob->fw) |
| 2670 | goto out; | 2673 | goto out; |
| 2671 | 2674 | ||
| @@ -2678,7 +2681,7 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) | |||
| 2678 | } | 2681 | } |
| 2679 | 2682 | ||
| 2680 | out: | 2683 | out: |
| 2681 | up(&qla_fw_lock); | 2684 | mutex_unlock(&qla_fw_lock); |
| 2682 | return blob; | 2685 | return blob; |
| 2683 | } | 2686 | } |
| 2684 | 2687 | ||
| @@ -2687,11 +2690,11 @@ qla2x00_release_firmware(void) | |||
| 2687 | { | 2690 | { |
| 2688 | int idx; | 2691 | int idx; |
| 2689 | 2692 | ||
| 2690 | down(&qla_fw_lock); | 2693 | mutex_lock(&qla_fw_lock); |
| 2691 | for (idx = 0; idx < FW_BLOBS; idx++) | 2694 | for (idx = 0; idx < FW_BLOBS; idx++) |
| 2692 | if (qla_fw_blobs[idx].fw) | 2695 | if (qla_fw_blobs[idx].fw) |
| 2693 | release_firmware(qla_fw_blobs[idx].fw); | 2696 | release_firmware(qla_fw_blobs[idx].fw); |
| 2694 | up(&qla_fw_lock); | 2697 | mutex_unlock(&qla_fw_lock); |
| 2695 | } | 2698 | } |
| 2696 | 2699 | ||
| 2697 | static pci_ers_result_t | 2700 | static pci_ers_result_t |
| @@ -2864,7 +2867,8 @@ qla2x00_module_init(void) | |||
| 2864 | return -ENODEV; | 2867 | return -ENODEV; |
| 2865 | } | 2868 | } |
| 2866 | 2869 | ||
| 2867 | printk(KERN_INFO "QLogic Fibre Channel HBA Driver\n"); | 2870 | printk(KERN_INFO "QLogic Fibre Channel HBA Driver: %s\n", |
| 2871 | qla2x00_version_str); | ||
| 2868 | ret = pci_register_driver(&qla2xxx_pci_driver); | 2872 | ret = pci_register_driver(&qla2xxx_pci_driver); |
| 2869 | if (ret) { | 2873 | if (ret) { |
| 2870 | kmem_cache_destroy(srb_cachep); | 2874 | kmem_cache_destroy(srb_cachep); |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index afeae2bfe7eb..d058c8862b35 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | /* | 7 | /* |
| 8 | * Driver version | 8 | * Driver version |
| 9 | */ | 9 | */ |
| 10 | #define QLA2XXX_VERSION "8.02.01-k2" | 10 | #define QLA2XXX_VERSION "8.02.01-k4" |
| 11 | 11 | ||
| 12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
| 13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 2 |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 049103f1d16f..93d2b6714453 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -359,7 +359,12 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv) | |||
| 359 | 359 | ||
| 360 | static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env) | 360 | static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env) |
| 361 | { | 361 | { |
| 362 | struct scsi_device *sdev = to_scsi_device(dev); | 362 | struct scsi_device *sdev; |
| 363 | |||
| 364 | if (dev->type != &scsi_dev_type) | ||
| 365 | return 0; | ||
| 366 | |||
| 367 | sdev = to_scsi_device(dev); | ||
| 363 | 368 | ||
| 364 | add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type); | 369 | add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type); |
| 365 | return 0; | 370 | return 0; |
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index c065a704a93a..42be8b01a40f 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c | |||
| @@ -1318,7 +1318,7 @@ static void __init atmel_console_get_options(struct uart_port *port, int *baud, | |||
| 1318 | * If the baud rate generator isn't running, the port wasn't | 1318 | * If the baud rate generator isn't running, the port wasn't |
| 1319 | * initialized by the boot loader. | 1319 | * initialized by the boot loader. |
| 1320 | */ | 1320 | */ |
| 1321 | quot = UART_GET_BRGR(port); | 1321 | quot = UART_GET_BRGR(port) & ATMEL_US_CD; |
| 1322 | if (!quot) | 1322 | if (!quot) |
| 1323 | return; | 1323 | return; |
| 1324 | 1324 | ||
diff --git a/drivers/serial/sb1250-duart.c b/drivers/serial/sb1250-duart.c index 2d6c08b3dbcf..f8e1447a022a 100644 --- a/drivers/serial/sb1250-duart.c +++ b/drivers/serial/sb1250-duart.c | |||
| @@ -924,7 +924,7 @@ console_initcall(sbd_serial_console_init); | |||
| 924 | 924 | ||
| 925 | static struct uart_driver sbd_reg = { | 925 | static struct uart_driver sbd_reg = { |
| 926 | .owner = THIS_MODULE, | 926 | .owner = THIS_MODULE, |
| 927 | .driver_name = "serial", | 927 | .driver_name = "sb1250_duart", |
| 928 | .dev_name = "duart", | 928 | .dev_name = "duart", |
| 929 | .major = TTY_MAJOR, | 929 | .major = TTY_MAJOR, |
| 930 | .minor = SB1250_DUART_MINOR_BASE, | 930 | .minor = SB1250_DUART_MINOR_BASE, |
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 53b03c629aff..c9b64e73c987 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c | |||
| @@ -1165,6 +1165,15 @@ out: | |||
| 1165 | return ret; | 1165 | return ret; |
| 1166 | } | 1166 | } |
| 1167 | 1167 | ||
| 1168 | static void uart_set_ldisc(struct tty_struct *tty) | ||
| 1169 | { | ||
| 1170 | struct uart_state *state = tty->driver_data; | ||
| 1171 | struct uart_port *port = state->port; | ||
| 1172 | |||
| 1173 | if (port->ops->set_ldisc) | ||
| 1174 | port->ops->set_ldisc(port); | ||
| 1175 | } | ||
| 1176 | |||
| 1168 | static void uart_set_termios(struct tty_struct *tty, | 1177 | static void uart_set_termios(struct tty_struct *tty, |
| 1169 | struct ktermios *old_termios) | 1178 | struct ktermios *old_termios) |
| 1170 | { | 1179 | { |
| @@ -2288,6 +2297,7 @@ static const struct tty_operations uart_ops = { | |||
| 2288 | .unthrottle = uart_unthrottle, | 2297 | .unthrottle = uart_unthrottle, |
| 2289 | .send_xchar = uart_send_xchar, | 2298 | .send_xchar = uart_send_xchar, |
| 2290 | .set_termios = uart_set_termios, | 2299 | .set_termios = uart_set_termios, |
| 2300 | .set_ldisc = uart_set_ldisc, | ||
| 2291 | .stop = uart_stop, | 2301 | .stop = uart_stop, |
| 2292 | .start = uart_start, | 2302 | .start = uart_start, |
| 2293 | .hangup = uart_hangup, | 2303 | .hangup = uart_hangup, |
diff --git a/drivers/serial/ucc_uart.c b/drivers/serial/ucc_uart.c index 01917c433f17..566a8b42e05a 100644 --- a/drivers/serial/ucc_uart.c +++ b/drivers/serial/ucc_uart.c | |||
| @@ -195,7 +195,7 @@ struct uart_qe_port { | |||
| 195 | 195 | ||
| 196 | static struct uart_driver ucc_uart_driver = { | 196 | static struct uart_driver ucc_uart_driver = { |
| 197 | .owner = THIS_MODULE, | 197 | .owner = THIS_MODULE, |
| 198 | .driver_name = "serial", | 198 | .driver_name = "ucc_uart", |
| 199 | .dev_name = "ttyQE", | 199 | .dev_name = "ttyQE", |
| 200 | .major = SERIAL_QE_MAJOR, | 200 | .major = SERIAL_QE_MAJOR, |
| 201 | .minor = SERIAL_QE_MINOR, | 201 | .minor = SERIAL_QE_MINOR, |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 41620c0fb046..799337f7fde1 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/ioctl.h> | 25 | #include <linux/ioctl.h> |
| 26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
| 27 | #include <linux/device.h> | 27 | #include <linux/device.h> |
| 28 | #include <linux/err.h> | ||
| 28 | #include <linux/list.h> | 29 | #include <linux/list.h> |
| 29 | #include <linux/errno.h> | 30 | #include <linux/errno.h> |
| 30 | #include <linux/mutex.h> | 31 | #include <linux/mutex.h> |
| @@ -67,11 +68,12 @@ static unsigned long minors[N_SPI_MINORS / BITS_PER_LONG]; | |||
| 67 | | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP) | 68 | | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP) |
| 68 | 69 | ||
| 69 | struct spidev_data { | 70 | struct spidev_data { |
| 70 | struct device dev; | 71 | dev_t devt; |
| 71 | spinlock_t spi_lock; | 72 | spinlock_t spi_lock; |
| 72 | struct spi_device *spi; | 73 | struct spi_device *spi; |
| 73 | struct list_head device_entry; | 74 | struct list_head device_entry; |
| 74 | 75 | ||
| 76 | /* buffer is NULL unless this device is open (users > 0) */ | ||
| 75 | struct mutex buf_lock; | 77 | struct mutex buf_lock; |
| 76 | unsigned users; | 78 | unsigned users; |
| 77 | u8 *buffer; | 79 | u8 *buffer; |
| @@ -467,7 +469,7 @@ static int spidev_open(struct inode *inode, struct file *filp) | |||
| 467 | mutex_lock(&device_list_lock); | 469 | mutex_lock(&device_list_lock); |
| 468 | 470 | ||
| 469 | list_for_each_entry(spidev, &device_list, device_entry) { | 471 | list_for_each_entry(spidev, &device_list, device_entry) { |
| 470 | if (spidev->dev.devt == inode->i_rdev) { | 472 | if (spidev->devt == inode->i_rdev) { |
| 471 | status = 0; | 473 | status = 0; |
| 472 | break; | 474 | break; |
| 473 | } | 475 | } |
| @@ -500,10 +502,22 @@ static int spidev_release(struct inode *inode, struct file *filp) | |||
| 500 | mutex_lock(&device_list_lock); | 502 | mutex_lock(&device_list_lock); |
| 501 | spidev = filp->private_data; | 503 | spidev = filp->private_data; |
| 502 | filp->private_data = NULL; | 504 | filp->private_data = NULL; |
| 505 | |||
| 506 | /* last close? */ | ||
| 503 | spidev->users--; | 507 | spidev->users--; |
| 504 | if (!spidev->users) { | 508 | if (!spidev->users) { |
| 509 | int dofree; | ||
| 510 | |||
| 505 | kfree(spidev->buffer); | 511 | kfree(spidev->buffer); |
| 506 | spidev->buffer = NULL; | 512 | spidev->buffer = NULL; |
| 513 | |||
| 514 | /* ... after we unbound from the underlying device? */ | ||
| 515 | spin_lock_irq(&spidev->spi_lock); | ||
| 516 | dofree = (spidev->spi == NULL); | ||
| 517 | spin_unlock_irq(&spidev->spi_lock); | ||
| 518 | |||
| 519 | if (dofree) | ||
| 520 | kfree(spidev); | ||
| 507 | } | 521 | } |
| 508 | mutex_unlock(&device_list_lock); | 522 | mutex_unlock(&device_list_lock); |
| 509 | 523 | ||
| @@ -530,19 +544,7 @@ static struct file_operations spidev_fops = { | |||
| 530 | * It also simplifies memory management. | 544 | * It also simplifies memory management. |
| 531 | */ | 545 | */ |
| 532 | 546 | ||
| 533 | static void spidev_classdev_release(struct device *dev) | 547 | static struct class *spidev_class; |
| 534 | { | ||
| 535 | struct spidev_data *spidev; | ||
| 536 | |||
| 537 | spidev = container_of(dev, struct spidev_data, dev); | ||
| 538 | kfree(spidev); | ||
| 539 | } | ||
| 540 | |||
| 541 | static struct class spidev_class = { | ||
| 542 | .name = "spidev", | ||
| 543 | .owner = THIS_MODULE, | ||
| 544 | .dev_release = spidev_classdev_release, | ||
| 545 | }; | ||
| 546 | 548 | ||
| 547 | /*-------------------------------------------------------------------------*/ | 549 | /*-------------------------------------------------------------------------*/ |
| 548 | 550 | ||
| @@ -570,20 +572,20 @@ static int spidev_probe(struct spi_device *spi) | |||
| 570 | mutex_lock(&device_list_lock); | 572 | mutex_lock(&device_list_lock); |
| 571 | minor = find_first_zero_bit(minors, N_SPI_MINORS); | 573 | minor = find_first_zero_bit(minors, N_SPI_MINORS); |
| 572 | if (minor < N_SPI_MINORS) { | 574 | if (minor < N_SPI_MINORS) { |
| 573 | spidev->dev.parent = &spi->dev; | 575 | struct device *dev; |
| 574 | spidev->dev.class = &spidev_class; | 576 | |
| 575 | spidev->dev.devt = MKDEV(SPIDEV_MAJOR, minor); | 577 | spidev->devt = MKDEV(SPIDEV_MAJOR, minor); |
| 576 | snprintf(spidev->dev.bus_id, sizeof spidev->dev.bus_id, | 578 | dev = device_create(spidev_class, &spi->dev, spidev->devt, |
| 577 | "spidev%d.%d", | 579 | "spidev%d.%d", |
| 578 | spi->master->bus_num, spi->chip_select); | 580 | spi->master->bus_num, spi->chip_select); |
| 579 | status = device_register(&spidev->dev); | 581 | status = IS_ERR(dev) ? PTR_ERR(dev) : 0; |
| 580 | } else { | 582 | } else { |
| 581 | dev_dbg(&spi->dev, "no minor number available!\n"); | 583 | dev_dbg(&spi->dev, "no minor number available!\n"); |
| 582 | status = -ENODEV; | 584 | status = -ENODEV; |
| 583 | } | 585 | } |
| 584 | if (status == 0) { | 586 | if (status == 0) { |
| 585 | set_bit(minor, minors); | 587 | set_bit(minor, minors); |
| 586 | dev_set_drvdata(&spi->dev, spidev); | 588 | spi_set_drvdata(spi, spidev); |
| 587 | list_add(&spidev->device_entry, &device_list); | 589 | list_add(&spidev->device_entry, &device_list); |
| 588 | } | 590 | } |
| 589 | mutex_unlock(&device_list_lock); | 591 | mutex_unlock(&device_list_lock); |
| @@ -596,19 +598,21 @@ static int spidev_probe(struct spi_device *spi) | |||
| 596 | 598 | ||
| 597 | static int spidev_remove(struct spi_device *spi) | 599 | static int spidev_remove(struct spi_device *spi) |
| 598 | { | 600 | { |
| 599 | struct spidev_data *spidev = dev_get_drvdata(&spi->dev); | 601 | struct spidev_data *spidev = spi_get_drvdata(spi); |
| 600 | 602 | ||
| 601 | /* make sure ops on existing fds can abort cleanly */ | 603 | /* make sure ops on existing fds can abort cleanly */ |
| 602 | spin_lock_irq(&spidev->spi_lock); | 604 | spin_lock_irq(&spidev->spi_lock); |
| 603 | spidev->spi = NULL; | 605 | spidev->spi = NULL; |
| 606 | spi_set_drvdata(spi, NULL); | ||
| 604 | spin_unlock_irq(&spidev->spi_lock); | 607 | spin_unlock_irq(&spidev->spi_lock); |
| 605 | 608 | ||
| 606 | /* prevent new opens */ | 609 | /* prevent new opens */ |
| 607 | mutex_lock(&device_list_lock); | 610 | mutex_lock(&device_list_lock); |
| 608 | list_del(&spidev->device_entry); | 611 | list_del(&spidev->device_entry); |
| 609 | dev_set_drvdata(&spi->dev, NULL); | 612 | device_destroy(spidev_class, spidev->devt); |
| 610 | clear_bit(MINOR(spidev->dev.devt), minors); | 613 | clear_bit(MINOR(spidev->devt), minors); |
| 611 | device_unregister(&spidev->dev); | 614 | if (spidev->users == 0) |
| 615 | kfree(spidev); | ||
| 612 | mutex_unlock(&device_list_lock); | 616 | mutex_unlock(&device_list_lock); |
| 613 | 617 | ||
| 614 | return 0; | 618 | return 0; |
| @@ -644,15 +648,15 @@ static int __init spidev_init(void) | |||
| 644 | if (status < 0) | 648 | if (status < 0) |
| 645 | return status; | 649 | return status; |
| 646 | 650 | ||
| 647 | status = class_register(&spidev_class); | 651 | spidev_class = class_create(THIS_MODULE, "spidev"); |
| 648 | if (status < 0) { | 652 | if (IS_ERR(spidev_class)) { |
| 649 | unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); | 653 | unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); |
| 650 | return status; | 654 | return PTR_ERR(spidev_class); |
| 651 | } | 655 | } |
| 652 | 656 | ||
| 653 | status = spi_register_driver(&spidev_spi); | 657 | status = spi_register_driver(&spidev_spi); |
| 654 | if (status < 0) { | 658 | if (status < 0) { |
| 655 | class_unregister(&spidev_class); | 659 | class_destroy(spidev_class); |
| 656 | unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); | 660 | unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); |
| 657 | } | 661 | } |
| 658 | return status; | 662 | return status; |
| @@ -662,7 +666,7 @@ module_init(spidev_init); | |||
| 662 | static void __exit spidev_exit(void) | 666 | static void __exit spidev_exit(void) |
| 663 | { | 667 | { |
| 664 | spi_unregister_driver(&spidev_spi); | 668 | spi_unregister_driver(&spidev_spi); |
| 665 | class_unregister(&spidev_class); | 669 | class_destroy(spidev_class); |
| 666 | unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); | 670 | unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name); |
| 667 | } | 671 | } |
| 668 | module_exit(spidev_exit); | 672 | module_exit(spidev_exit); |
diff --git a/drivers/ssb/driver_pcicore.c b/drivers/ssb/driver_pcicore.c index 75def13e797d..d28c53868093 100644 --- a/drivers/ssb/driver_pcicore.c +++ b/drivers/ssb/driver_pcicore.c | |||
| @@ -537,12 +537,12 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc, | |||
| 537 | int err = 0; | 537 | int err = 0; |
| 538 | u32 tmp; | 538 | u32 tmp; |
| 539 | 539 | ||
| 540 | might_sleep(); | ||
| 541 | |||
| 542 | if (!pdev) | 540 | if (!pdev) |
| 543 | goto out; | 541 | goto out; |
| 544 | bus = pdev->bus; | 542 | bus = pdev->bus; |
| 545 | 543 | ||
| 544 | might_sleep_if(pdev->id.coreid != SSB_DEV_PCI); | ||
| 545 | |||
| 546 | /* Enable interrupts for this device. */ | 546 | /* Enable interrupts for this device. */ |
| 547 | if (bus->host_pci && | 547 | if (bus->host_pci && |
| 548 | ((pdev->id.revision >= 6) || (pdev->id.coreid == SSB_DEV_PCIE))) { | 548 | ((pdev->id.revision >= 6) || (pdev->id.coreid == SSB_DEV_PCIE))) { |
diff --git a/drivers/usb/c67x00/c67x00-ll-hpi.c b/drivers/usb/c67x00/c67x00-ll-hpi.c index 5100fbbf6cb0..a9636f43bca2 100644 --- a/drivers/usb/c67x00/c67x00-ll-hpi.c +++ b/drivers/usb/c67x00/c67x00-ll-hpi.c | |||
| @@ -120,7 +120,7 @@ static void hpi_write_word(struct c67x00_device *dev, u16 reg, u16 value) | |||
| 120 | * Only data is little endian, addr has cpu endianess | 120 | * Only data is little endian, addr has cpu endianess |
| 121 | */ | 121 | */ |
| 122 | static void hpi_write_words_le16(struct c67x00_device *dev, u16 addr, | 122 | static void hpi_write_words_le16(struct c67x00_device *dev, u16 addr, |
| 123 | u16 *data, u16 count) | 123 | __le16 *data, u16 count) |
| 124 | { | 124 | { |
| 125 | unsigned long flags; | 125 | unsigned long flags; |
| 126 | int i; | 126 | int i; |
| @@ -129,7 +129,7 @@ static void hpi_write_words_le16(struct c67x00_device *dev, u16 addr, | |||
| 129 | 129 | ||
| 130 | hpi_write_reg(dev, HPI_ADDR, addr); | 130 | hpi_write_reg(dev, HPI_ADDR, addr); |
| 131 | for (i = 0; i < count; i++) | 131 | for (i = 0; i < count; i++) |
| 132 | hpi_write_reg(dev, HPI_DATA, cpu_to_le16(*data++)); | 132 | hpi_write_reg(dev, HPI_DATA, le16_to_cpu(*data++)); |
| 133 | 133 | ||
| 134 | spin_unlock_irqrestore(&dev->hpi.lock, flags); | 134 | spin_unlock_irqrestore(&dev->hpi.lock, flags); |
| 135 | } | 135 | } |
| @@ -138,7 +138,7 @@ static void hpi_write_words_le16(struct c67x00_device *dev, u16 addr, | |||
| 138 | * Only data is little endian, addr has cpu endianess | 138 | * Only data is little endian, addr has cpu endianess |
| 139 | */ | 139 | */ |
| 140 | static void hpi_read_words_le16(struct c67x00_device *dev, u16 addr, | 140 | static void hpi_read_words_le16(struct c67x00_device *dev, u16 addr, |
| 141 | u16 *data, u16 count) | 141 | __le16 *data, u16 count) |
| 142 | { | 142 | { |
| 143 | unsigned long flags; | 143 | unsigned long flags; |
| 144 | int i; | 144 | int i; |
| @@ -146,7 +146,7 @@ static void hpi_read_words_le16(struct c67x00_device *dev, u16 addr, | |||
| 146 | spin_lock_irqsave(&dev->hpi.lock, flags); | 146 | spin_lock_irqsave(&dev->hpi.lock, flags); |
| 147 | hpi_write_reg(dev, HPI_ADDR, addr); | 147 | hpi_write_reg(dev, HPI_ADDR, addr); |
| 148 | for (i = 0; i < count; i++) | 148 | for (i = 0; i < count; i++) |
| 149 | *data++ = le16_to_cpu(hpi_read_reg(dev, HPI_DATA)); | 149 | *data++ = cpu_to_le16(hpi_read_reg(dev, HPI_DATA)); |
| 150 | 150 | ||
| 151 | spin_unlock_irqrestore(&dev->hpi.lock, flags); | 151 | spin_unlock_irqrestore(&dev->hpi.lock, flags); |
| 152 | } | 152 | } |
| @@ -425,7 +425,7 @@ void c67x00_ll_write_mem_le16(struct c67x00_device *dev, u16 addr, | |||
| 425 | len--; | 425 | len--; |
| 426 | } | 426 | } |
| 427 | 427 | ||
| 428 | hpi_write_words_le16(dev, addr, (u16 *)buf, len / 2); | 428 | hpi_write_words_le16(dev, addr, (__le16 *)buf, len / 2); |
| 429 | buf += len & ~0x01; | 429 | buf += len & ~0x01; |
| 430 | addr += len & ~0x01; | 430 | addr += len & ~0x01; |
| 431 | len &= 0x01; | 431 | len &= 0x01; |
| @@ -456,7 +456,7 @@ void c67x00_ll_read_mem_le16(struct c67x00_device *dev, u16 addr, | |||
| 456 | len--; | 456 | len--; |
| 457 | } | 457 | } |
| 458 | 458 | ||
| 459 | hpi_read_words_le16(dev, addr, (u16 *)buf, len / 2); | 459 | hpi_read_words_le16(dev, addr, (__le16 *)buf, len / 2); |
| 460 | buf += len & ~0x01; | 460 | buf += len & ~0x01; |
| 461 | addr += len & ~0x01; | 461 | addr += len & ~0x01; |
| 462 | len &= 0x01; | 462 | len &= 0x01; |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 107666d4e2ec..731db051070a 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
| @@ -611,8 +611,8 @@ next_desc: | |||
| 611 | goto err; | 611 | goto err; |
| 612 | } | 612 | } |
| 613 | 613 | ||
| 614 | desc->wMaxPacketSize = ep->wMaxPacketSize; | 614 | desc->wMaxPacketSize = le16_to_cpu(ep->wMaxPacketSize); |
| 615 | desc->bMaxPacketSize0 = cpu_to_le16(udev->descriptor.bMaxPacketSize0); | 615 | desc->bMaxPacketSize0 = udev->descriptor.bMaxPacketSize0; |
| 616 | 616 | ||
| 617 | desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); | 617 | desc->orq = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); |
| 618 | if (!desc->orq) | 618 | if (!desc->orq) |
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index 440bf94f0d4c..c9db3fe98726 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
| @@ -104,8 +104,8 @@ static u32 nxp_pci_io_base; | |||
| 104 | static u32 iolength; | 104 | static u32 iolength; |
| 105 | static u32 pci_mem_phy0; | 105 | static u32 pci_mem_phy0; |
| 106 | static u32 length; | 106 | static u32 length; |
| 107 | static u8 *chip_addr; | 107 | static u8 __iomem *chip_addr; |
| 108 | static u8 *iobase; | 108 | static u8 __iomem *iobase; |
| 109 | 109 | ||
| 110 | static int __devinit isp1761_pci_probe(struct pci_dev *dev, | 110 | static int __devinit isp1761_pci_probe(struct pci_dev *dev, |
| 111 | const struct pci_device_id *id) | 111 | const struct pci_device_id *id) |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 5fa8b76673cb..97aff8db10bf 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
| @@ -2275,9 +2275,7 @@ static int fbcon_switch(struct vc_data *vc) | |||
| 2275 | * in fb_set_var() | 2275 | * in fb_set_var() |
| 2276 | */ | 2276 | */ |
| 2277 | info->var.activate = var.activate; | 2277 | info->var.activate = var.activate; |
| 2278 | var.yoffset = info->var.yoffset; | 2278 | var.vmode |= info->var.vmode & ~FB_VMODE_MASK; |
| 2279 | var.xoffset = info->var.xoffset; | ||
| 2280 | var.vmode = info->var.vmode; | ||
| 2281 | fb_set_var(info, &var); | 2279 | fb_set_var(info, &var); |
| 2282 | ops->var = info->var; | 2280 | ops->var = info->var; |
| 2283 | 2281 | ||
diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c index 473562191586..d3c3af53a290 100644 --- a/drivers/video/modedb.c +++ b/drivers/video/modedb.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #endif | 28 | #endif |
| 29 | 29 | ||
| 30 | const char *fb_mode_option; | 30 | const char *fb_mode_option; |
| 31 | EXPORT_SYMBOL_GPL(fb_mode_option); | ||
| 31 | 32 | ||
| 32 | /* | 33 | /* |
| 33 | * Standard video mode definitions (taken from XFree86) | 34 | * Standard video mode definitions (taken from XFree86) |
| @@ -590,6 +591,7 @@ done: | |||
| 590 | "", (margins) ? " with margins" : "", (interlace) ? | 591 | "", (margins) ? " with margins" : "", (interlace) ? |
| 591 | " interlaced" : ""); | 592 | " interlaced" : ""); |
| 592 | 593 | ||
| 594 | memset(&cvt_mode, 0, sizeof(cvt_mode)); | ||
| 593 | cvt_mode.xres = xres; | 595 | cvt_mode.xres = xres; |
| 594 | cvt_mode.yres = yres; | 596 | cvt_mode.yres = yres; |
| 595 | cvt_mode.refresh = (refresh) ? refresh : 60; | 597 | cvt_mode.refresh = (refresh) ? refresh : 60; |
