diff options
32 files changed, 459 insertions, 278 deletions
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 2 | 1 | VERSION = 2 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 31 | 3 | SUBLEVEL = 31 |
| 4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = -rc7 |
| 5 | NAME = Man-Eating Seals of Antiquity | 5 | NAME = Man-Eating Seals of Antiquity |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c index dbf5445727a..6ef00ba4c88 100644 --- a/arch/x86/kernel/apic/ipi.c +++ b/arch/x86/kernel/apic/ipi.c | |||
| @@ -106,6 +106,9 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector) | |||
| 106 | unsigned long mask = cpumask_bits(cpumask)[0]; | 106 | unsigned long mask = cpumask_bits(cpumask)[0]; |
| 107 | unsigned long flags; | 107 | unsigned long flags; |
| 108 | 108 | ||
| 109 | if (WARN_ONCE(!mask, "empty IPI mask")) | ||
| 110 | return; | ||
| 111 | |||
| 109 | local_irq_save(flags); | 112 | local_irq_save(flags); |
| 110 | WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]); | 113 | WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]); |
| 111 | __default_send_IPI_dest_field(mask, vector, apic->dest_logical); | 114 | __default_send_IPI_dest_field(mask, vector, apic->dest_logical); |
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 821e97017e9..c814e144a3f 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c | |||
| @@ -183,18 +183,17 @@ static void flush_tlb_others_ipi(const struct cpumask *cpumask, | |||
| 183 | 183 | ||
| 184 | f->flush_mm = mm; | 184 | f->flush_mm = mm; |
| 185 | f->flush_va = va; | 185 | f->flush_va = va; |
| 186 | cpumask_andnot(to_cpumask(f->flush_cpumask), | 186 | if (cpumask_andnot(to_cpumask(f->flush_cpumask), cpumask, cpumask_of(smp_processor_id()))) { |
| 187 | cpumask, cpumask_of(smp_processor_id())); | 187 | /* |
| 188 | 188 | * We have to send the IPI only to | |
| 189 | /* | 189 | * CPUs affected. |
| 190 | * We have to send the IPI only to | 190 | */ |
| 191 | * CPUs affected. | 191 | apic->send_IPI_mask(to_cpumask(f->flush_cpumask), |
| 192 | */ | 192 | INVALIDATE_TLB_VECTOR_START + sender); |
| 193 | apic->send_IPI_mask(to_cpumask(f->flush_cpumask), | ||
| 194 | INVALIDATE_TLB_VECTOR_START + sender); | ||
| 195 | 193 | ||
| 196 | while (!cpumask_empty(to_cpumask(f->flush_cpumask))) | 194 | while (!cpumask_empty(to_cpumask(f->flush_cpumask))) |
| 197 | cpu_relax(); | 195 | cpu_relax(); |
| 196 | } | ||
| 198 | 197 | ||
| 199 | f->flush_mm = NULL; | 198 | f->flush_mm = NULL; |
| 200 | f->flush_va = 0; | 199 | f->flush_va = 0; |
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c index 85ec31b3ff0..f7a615b80c7 100644 --- a/drivers/gpu/drm/drm_sysfs.c +++ b/drivers/gpu/drm/drm_sysfs.c | |||
| @@ -22,44 +22,50 @@ | |||
| 22 | #define to_drm_minor(d) container_of(d, struct drm_minor, kdev) | 22 | #define to_drm_minor(d) container_of(d, struct drm_minor, kdev) |
| 23 | #define to_drm_connector(d) container_of(d, struct drm_connector, kdev) | 23 | #define to_drm_connector(d) container_of(d, struct drm_connector, kdev) |
| 24 | 24 | ||
| 25 | static struct device_type drm_sysfs_device_minor = { | ||
| 26 | .name = "drm_minor" | ||
| 27 | }; | ||
| 28 | |||
| 25 | /** | 29 | /** |
| 26 | * drm_sysfs_suspend - DRM class suspend hook | 30 | * drm_class_suspend - DRM class suspend hook |
| 27 | * @dev: Linux device to suspend | 31 | * @dev: Linux device to suspend |
| 28 | * @state: power state to enter | 32 | * @state: power state to enter |
| 29 | * | 33 | * |
| 30 | * Just figures out what the actual struct drm_device associated with | 34 | * Just figures out what the actual struct drm_device associated with |
| 31 | * @dev is and calls its suspend hook, if present. | 35 | * @dev is and calls its suspend hook, if present. |
| 32 | */ | 36 | */ |
| 33 | static int drm_sysfs_suspend(struct device *dev, pm_message_t state) | 37 | static int drm_class_suspend(struct device *dev, pm_message_t state) |
| 34 | { | 38 | { |
| 35 | struct drm_minor *drm_minor = to_drm_minor(dev); | 39 | if (dev->type == &drm_sysfs_device_minor) { |
| 36 | struct drm_device *drm_dev = drm_minor->dev; | 40 | struct drm_minor *drm_minor = to_drm_minor(dev); |
| 37 | 41 | struct drm_device *drm_dev = drm_minor->dev; | |
| 38 | if (drm_minor->type == DRM_MINOR_LEGACY && | 42 | |
| 39 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && | 43 | if (drm_minor->type == DRM_MINOR_LEGACY && |
| 40 | drm_dev->driver->suspend) | 44 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && |
| 41 | return drm_dev->driver->suspend(drm_dev, state); | 45 | drm_dev->driver->suspend) |
| 42 | 46 | return drm_dev->driver->suspend(drm_dev, state); | |
| 47 | } | ||
| 43 | return 0; | 48 | return 0; |
| 44 | } | 49 | } |
| 45 | 50 | ||
| 46 | /** | 51 | /** |
| 47 | * drm_sysfs_resume - DRM class resume hook | 52 | * drm_class_resume - DRM class resume hook |
| 48 | * @dev: Linux device to resume | 53 | * @dev: Linux device to resume |
| 49 | * | 54 | * |
| 50 | * Just figures out what the actual struct drm_device associated with | 55 | * Just figures out what the actual struct drm_device associated with |
| 51 | * @dev is and calls its resume hook, if present. | 56 | * @dev is and calls its resume hook, if present. |
| 52 | */ | 57 | */ |
| 53 | static int drm_sysfs_resume(struct device *dev) | 58 | static int drm_class_resume(struct device *dev) |
| 54 | { | 59 | { |
| 55 | struct drm_minor *drm_minor = to_drm_minor(dev); | 60 | if (dev->type == &drm_sysfs_device_minor) { |
| 56 | struct drm_device *drm_dev = drm_minor->dev; | 61 | struct drm_minor *drm_minor = to_drm_minor(dev); |
| 57 | 62 | struct drm_device *drm_dev = drm_minor->dev; | |
| 58 | if (drm_minor->type == DRM_MINOR_LEGACY && | 63 | |
| 59 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && | 64 | if (drm_minor->type == DRM_MINOR_LEGACY && |
| 60 | drm_dev->driver->resume) | 65 | !drm_core_check_feature(drm_dev, DRIVER_MODESET) && |
| 61 | return drm_dev->driver->resume(drm_dev); | 66 | drm_dev->driver->resume) |
| 62 | 67 | return drm_dev->driver->resume(drm_dev); | |
| 68 | } | ||
| 63 | return 0; | 69 | return 0; |
| 64 | } | 70 | } |
| 65 | 71 | ||
| @@ -99,8 +105,8 @@ struct class *drm_sysfs_create(struct module *owner, char *name) | |||
| 99 | goto err_out; | 105 | goto err_out; |
| 100 | } | 106 | } |
| 101 | 107 | ||
| 102 | class->suspend = drm_sysfs_suspend; | 108 | class->suspend = drm_class_suspend; |
| 103 | class->resume = drm_sysfs_resume; | 109 | class->resume = drm_class_resume; |
| 104 | 110 | ||
| 105 | err = class_create_file(class, &class_attr_version); | 111 | err = class_create_file(class, &class_attr_version); |
| 106 | if (err) | 112 | if (err) |
| @@ -480,6 +486,7 @@ int drm_sysfs_device_add(struct drm_minor *minor) | |||
| 480 | minor->kdev.class = drm_class; | 486 | minor->kdev.class = drm_class; |
| 481 | minor->kdev.release = drm_sysfs_device_release; | 487 | minor->kdev.release = drm_sysfs_device_release; |
| 482 | minor->kdev.devt = minor->device; | 488 | minor->kdev.devt = minor->device; |
| 489 | minor->kdev.type = &drm_sysfs_device_minor; | ||
| 483 | if (minor->type == DRM_MINOR_CONTROL) | 490 | if (minor->type == DRM_MINOR_CONTROL) |
| 484 | minor_str = "controlD%d"; | 491 | minor_str = "controlD%d"; |
| 485 | else if (minor->type == DRM_MINOR_RENDER) | 492 | else if (minor->type == DRM_MINOR_RENDER) |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 90ff8e0ac04..68e728e8be4 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -1091,6 +1091,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1091 | tmp |= tile_flags; | 1091 | tmp |= tile_flags; |
| 1092 | ib[idx] = tmp; | 1092 | ib[idx] = tmp; |
| 1093 | break; | 1093 | break; |
| 1094 | case RADEON_RB3D_ZPASS_ADDR: | ||
| 1095 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
| 1096 | if (r) { | ||
| 1097 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
| 1098 | idx, reg); | ||
| 1099 | r100_cs_dump_packet(p, pkt); | ||
| 1100 | return r; | ||
| 1101 | } | ||
| 1102 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | ||
| 1103 | break; | ||
| 1094 | default: | 1104 | default: |
| 1095 | /* FIXME: we don't want to allow anyothers packet */ | 1105 | /* FIXME: we don't want to allow anyothers packet */ |
| 1096 | break; | 1106 | break; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index c47579dcafa..053f4ec397f 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -448,6 +448,7 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
| 448 | /* rv350,rv370,rv380 */ | 448 | /* rv350,rv370,rv380 */ |
| 449 | rdev->num_gb_pipes = 1; | 449 | rdev->num_gb_pipes = 1; |
| 450 | } | 450 | } |
| 451 | rdev->num_z_pipes = 1; | ||
| 451 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); | 452 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
| 452 | switch (rdev->num_gb_pipes) { | 453 | switch (rdev->num_gb_pipes) { |
| 453 | case 2: | 454 | case 2: |
| @@ -486,7 +487,8 @@ void r300_gpu_init(struct radeon_device *rdev) | |||
| 486 | printk(KERN_WARNING "Failed to wait MC idle while " | 487 | printk(KERN_WARNING "Failed to wait MC idle while " |
| 487 | "programming pipes. Bad things might happen.\n"); | 488 | "programming pipes. Bad things might happen.\n"); |
| 488 | } | 489 | } |
| 489 | DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes); | 490 | DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", |
| 491 | rdev->num_gb_pipes, rdev->num_z_pipes); | ||
| 490 | } | 492 | } |
| 491 | 493 | ||
| 492 | int r300_ga_reset(struct radeon_device *rdev) | 494 | int r300_ga_reset(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index dea497a979f..97426a6f370 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -165,7 +165,18 @@ void r420_pipes_init(struct radeon_device *rdev) | |||
| 165 | printk(KERN_WARNING "Failed to wait GUI idle while " | 165 | printk(KERN_WARNING "Failed to wait GUI idle while " |
| 166 | "programming pipes. Bad things might happen.\n"); | 166 | "programming pipes. Bad things might happen.\n"); |
| 167 | } | 167 | } |
| 168 | DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes); | 168 | |
| 169 | if (rdev->family == CHIP_RV530) { | ||
| 170 | tmp = RREG32(RV530_GB_PIPE_SELECT2); | ||
| 171 | if ((tmp & 3) == 3) | ||
| 172 | rdev->num_z_pipes = 2; | ||
| 173 | else | ||
| 174 | rdev->num_z_pipes = 1; | ||
| 175 | } else | ||
| 176 | rdev->num_z_pipes = 1; | ||
| 177 | |||
| 178 | DRM_INFO("radeon: %d quad pipes, %d z pipes initialized.\n", | ||
| 179 | rdev->num_gb_pipes, rdev->num_z_pipes); | ||
| 169 | } | 180 | } |
| 170 | 181 | ||
| 171 | void r420_gpu_init(struct radeon_device *rdev) | 182 | void r420_gpu_init(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 09fb0b6ec7d..ebd6b0f7bdf 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -177,7 +177,6 @@ void r520_gpu_init(struct radeon_device *rdev) | |||
| 177 | */ | 177 | */ |
| 178 | /* workaround for RV530 */ | 178 | /* workaround for RV530 */ |
| 179 | if (rdev->family == CHIP_RV530) { | 179 | if (rdev->family == CHIP_RV530) { |
| 180 | WREG32(0x4124, 1); | ||
| 181 | WREG32(0x4128, 0xFF); | 180 | WREG32(0x4128, 0xFF); |
| 182 | } | 181 | } |
| 183 | r420_pipes_init(rdev); | 182 | r420_pipes_init(rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 79ad98264e3..b519fb2fecb 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -655,6 +655,7 @@ struct radeon_device { | |||
| 655 | int usec_timeout; | 655 | int usec_timeout; |
| 656 | enum radeon_pll_errata pll_errata; | 656 | enum radeon_pll_errata pll_errata; |
| 657 | int num_gb_pipes; | 657 | int num_gb_pipes; |
| 658 | int num_z_pipes; | ||
| 658 | int disp_priority; | 659 | int disp_priority; |
| 659 | /* BIOS */ | 660 | /* BIOS */ |
| 660 | uint8_t *bios; | 661 | uint8_t *bios; |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index d8356827ef1..7a52c461145 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
| @@ -406,6 +406,15 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv) | |||
| 406 | { | 406 | { |
| 407 | uint32_t gb_tile_config, gb_pipe_sel = 0; | 407 | uint32_t gb_tile_config, gb_pipe_sel = 0; |
| 408 | 408 | ||
| 409 | if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) { | ||
| 410 | uint32_t z_pipe_sel = RADEON_READ(RV530_GB_PIPE_SELECT2); | ||
| 411 | if ((z_pipe_sel & 3) == 3) | ||
| 412 | dev_priv->num_z_pipes = 2; | ||
| 413 | else | ||
| 414 | dev_priv->num_z_pipes = 1; | ||
| 415 | } else | ||
| 416 | dev_priv->num_z_pipes = 1; | ||
| 417 | |||
| 409 | /* RS4xx/RS6xx/R4xx/R5xx */ | 418 | /* RS4xx/RS6xx/R4xx/R5xx */ |
| 410 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) { | 419 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) { |
| 411 | gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT); | 420 | gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT); |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 3933f8216a3..6fa32dac4e9 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
| @@ -100,9 +100,10 @@ | |||
| 100 | * 1.28- Add support for VBL on CRTC2 | 100 | * 1.28- Add support for VBL on CRTC2 |
| 101 | * 1.29- R500 3D cmd buffer support | 101 | * 1.29- R500 3D cmd buffer support |
| 102 | * 1.30- Add support for occlusion queries | 102 | * 1.30- Add support for occlusion queries |
| 103 | * 1.31- Add support for num Z pipes from GET_PARAM | ||
| 103 | */ | 104 | */ |
| 104 | #define DRIVER_MAJOR 1 | 105 | #define DRIVER_MAJOR 1 |
| 105 | #define DRIVER_MINOR 30 | 106 | #define DRIVER_MINOR 31 |
| 106 | #define DRIVER_PATCHLEVEL 0 | 107 | #define DRIVER_PATCHLEVEL 0 |
| 107 | 108 | ||
| 108 | /* | 109 | /* |
| @@ -329,6 +330,7 @@ typedef struct drm_radeon_private { | |||
| 329 | resource_size_t fb_aper_offset; | 330 | resource_size_t fb_aper_offset; |
| 330 | 331 | ||
| 331 | int num_gb_pipes; | 332 | int num_gb_pipes; |
| 333 | int num_z_pipes; | ||
| 332 | int track_flush; | 334 | int track_flush; |
| 333 | drm_local_map_t *mmio; | 335 | drm_local_map_t *mmio; |
| 334 | 336 | ||
| @@ -689,6 +691,7 @@ extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pciga | |||
| 689 | 691 | ||
| 690 | /* pipe config regs */ | 692 | /* pipe config regs */ |
| 691 | #define R400_GB_PIPE_SELECT 0x402c | 693 | #define R400_GB_PIPE_SELECT 0x402c |
| 694 | #define RV530_GB_PIPE_SELECT2 0x4124 | ||
| 692 | #define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */ | 695 | #define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */ |
| 693 | #define R300_GB_TILE_CONFIG 0x4018 | 696 | #define R300_GB_TILE_CONFIG 0x4018 |
| 694 | # define R300_ENABLE_TILING (1 << 0) | 697 | # define R300_ENABLE_TILING (1 << 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index d4ceff13bbb..14c19980292 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
| @@ -283,7 +283,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data, | |||
| 283 | mutex_lock(&dev->struct_mutex); | 283 | mutex_lock(&dev->struct_mutex); |
| 284 | drm_gem_object_unreference(gobj); | 284 | drm_gem_object_unreference(gobj); |
| 285 | mutex_unlock(&dev->struct_mutex); | 285 | mutex_unlock(&dev->struct_mutex); |
| 286 | return 0; | 286 | return r; |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, | 289 | int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data, |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index d2764bf6b2a..dce09ada32b 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
| @@ -95,6 +95,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
| 95 | case RADEON_INFO_NUM_GB_PIPES: | 95 | case RADEON_INFO_NUM_GB_PIPES: |
| 96 | value = rdev->num_gb_pipes; | 96 | value = rdev->num_gb_pipes; |
| 97 | break; | 97 | break; |
| 98 | case RADEON_INFO_NUM_Z_PIPES: | ||
| 99 | value = rdev->num_z_pipes; | ||
| 100 | break; | ||
| 98 | default: | 101 | default: |
| 99 | DRM_DEBUG("Invalid request %d\n", info->request); | 102 | DRM_DEBUG("Invalid request %d\n", info->request); |
| 100 | return -EINVAL; | 103 | return -EINVAL; |
| @@ -318,5 +321,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = { | |||
| 318 | DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH), | 321 | DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH), |
| 319 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH), | 322 | DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH), |
| 320 | DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH), | 323 | DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH), |
| 324 | DRM_IOCTL_DEF(DRM_RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH), | ||
| 321 | }; | 325 | }; |
| 322 | int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); | 326 | int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms); |
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index 5a098f304ed..4df43f62c67 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
| @@ -2337,6 +2337,9 @@ | |||
| 2337 | # define RADEON_RE_WIDTH_SHIFT 0 | 2337 | # define RADEON_RE_WIDTH_SHIFT 0 |
| 2338 | # define RADEON_RE_HEIGHT_SHIFT 16 | 2338 | # define RADEON_RE_HEIGHT_SHIFT 16 |
| 2339 | 2339 | ||
| 2340 | #define RADEON_RB3D_ZPASS_DATA 0x3290 | ||
| 2341 | #define RADEON_RB3D_ZPASS_ADDR 0x3294 | ||
| 2342 | |||
| 2340 | #define RADEON_SE_CNTL 0x1c4c | 2343 | #define RADEON_SE_CNTL 0x1c4c |
| 2341 | # define RADEON_FFACE_CULL_CW (0 << 0) | 2344 | # define RADEON_FFACE_CULL_CW (0 << 0) |
| 2342 | # define RADEON_FFACE_CULL_CCW (1 << 0) | 2345 | # define RADEON_FFACE_CULL_CCW (1 << 0) |
| @@ -3571,4 +3574,6 @@ | |||
| 3571 | #define RADEON_SCRATCH_REG4 0x15f0 | 3574 | #define RADEON_SCRATCH_REG4 0x15f0 |
| 3572 | #define RADEON_SCRATCH_REG5 0x15f4 | 3575 | #define RADEON_SCRATCH_REG5 0x15f4 |
| 3573 | 3576 | ||
| 3577 | #define RV530_GB_PIPE_SELECT2 0x4124 | ||
| 3578 | |||
| 3574 | #endif | 3579 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_state.c b/drivers/gpu/drm/radeon/radeon_state.c index 46645f3e032..2882f40d5ec 100644 --- a/drivers/gpu/drm/radeon/radeon_state.c +++ b/drivers/gpu/drm/radeon/radeon_state.c | |||
| @@ -3081,6 +3081,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil | |||
| 3081 | case RADEON_PARAM_NUM_GB_PIPES: | 3081 | case RADEON_PARAM_NUM_GB_PIPES: |
| 3082 | value = dev_priv->num_gb_pipes; | 3082 | value = dev_priv->num_gb_pipes; |
| 3083 | break; | 3083 | break; |
| 3084 | case RADEON_PARAM_NUM_Z_PIPES: | ||
| 3085 | value = dev_priv->num_z_pipes; | ||
| 3086 | break; | ||
| 3084 | default: | 3087 | default: |
| 3085 | DRM_DEBUG("Invalid parameter %d\n", param->param); | 3088 | DRM_DEBUG("Invalid parameter %d\n", param->param); |
| 3086 | return -EINVAL; | 3089 | return -EINVAL; |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index d258b02aef4..827da085813 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id) | |||
| 674 | 674 | ||
| 675 | err = 0; | 675 | err = 0; |
| 676 | complete: | 676 | complete: |
| 677 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat); | 677 | /* |
| 678 | * Ack the stat in one go, but [R/X]DR and [R/X]RDY should be | ||
| 679 | * acked after the data operation is complete. | ||
| 680 | * Ref: TRM SWPU114Q Figure 18-31 | ||
| 681 | */ | ||
| 682 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat & | ||
| 683 | ~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR | | ||
| 684 | OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | ||
| 678 | 685 | ||
| 679 | if (stat & OMAP_I2C_STAT_NACK) { | 686 | if (stat & OMAP_I2C_STAT_NACK) { |
| 680 | err |= OMAP_I2C_STAT_NACK; | 687 | err |= OMAP_I2C_STAT_NACK; |
| @@ -687,6 +694,9 @@ complete: | |||
| 687 | } | 694 | } |
| 688 | if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK | | 695 | if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK | |
| 689 | OMAP_I2C_STAT_AL)) { | 696 | OMAP_I2C_STAT_AL)) { |
| 697 | omap_i2c_ack_stat(dev, stat & | ||
| 698 | (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR | | ||
| 699 | OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | ||
| 690 | omap_i2c_complete_cmd(dev, err); | 700 | omap_i2c_complete_cmd(dev, err); |
| 691 | return IRQ_HANDLED; | 701 | return IRQ_HANDLED; |
| 692 | } | 702 | } |
| @@ -774,7 +784,7 @@ complete: | |||
| 774 | * memory to the I2C interface. | 784 | * memory to the I2C interface. |
| 775 | */ | 785 | */ |
| 776 | 786 | ||
| 777 | if (cpu_is_omap34xx()) { | 787 | if (dev->rev <= OMAP_I2C_REV_ON_3430) { |
| 778 | while (!(stat & OMAP_I2C_STAT_XUDF)) { | 788 | while (!(stat & OMAP_I2C_STAT_XUDF)) { |
| 779 | if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | 789 | if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { |
| 780 | omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | 790 | omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); |
diff --git a/drivers/i2c/busses/i2c-stu300.c b/drivers/i2c/busses/i2c-stu300.c index 182e711318b..d2728a28a8d 100644 --- a/drivers/i2c/busses/i2c-stu300.c +++ b/drivers/i2c/busses/i2c-stu300.c | |||
| @@ -117,7 +117,8 @@ enum stu300_error { | |||
| 117 | STU300_ERROR_NONE = 0, | 117 | STU300_ERROR_NONE = 0, |
| 118 | STU300_ERROR_ACKNOWLEDGE_FAILURE, | 118 | STU300_ERROR_ACKNOWLEDGE_FAILURE, |
| 119 | STU300_ERROR_BUS_ERROR, | 119 | STU300_ERROR_BUS_ERROR, |
| 120 | STU300_ERROR_ARBITRATION_LOST | 120 | STU300_ERROR_ARBITRATION_LOST, |
| 121 | STU300_ERROR_UNKNOWN | ||
| 121 | }; | 122 | }; |
| 122 | 123 | ||
| 123 | /* timeout waiting for the controller to respond */ | 124 | /* timeout waiting for the controller to respond */ |
| @@ -127,7 +128,7 @@ enum stu300_error { | |||
| 127 | * The number of address send athemps tried before giving up. | 128 | * The number of address send athemps tried before giving up. |
| 128 | * If the first one failes it seems like 5 to 8 attempts are required. | 129 | * If the first one failes it seems like 5 to 8 attempts are required. |
| 129 | */ | 130 | */ |
| 130 | #define NUM_ADDR_RESEND_ATTEMPTS 10 | 131 | #define NUM_ADDR_RESEND_ATTEMPTS 12 |
| 131 | 132 | ||
| 132 | /* I2C clock speed, in Hz 0-400kHz*/ | 133 | /* I2C clock speed, in Hz 0-400kHz*/ |
| 133 | static unsigned int scl_frequency = 100000; | 134 | static unsigned int scl_frequency = 100000; |
| @@ -149,6 +150,7 @@ module_param(scl_frequency, uint, 0644); | |||
| 149 | * @msg_index: index of current message | 150 | * @msg_index: index of current message |
| 150 | * @msg_len: length of current message | 151 | * @msg_len: length of current message |
| 151 | */ | 152 | */ |
| 153 | |||
| 152 | struct stu300_dev { | 154 | struct stu300_dev { |
| 153 | struct platform_device *pdev; | 155 | struct platform_device *pdev; |
| 154 | struct i2c_adapter adapter; | 156 | struct i2c_adapter adapter; |
| @@ -188,6 +190,27 @@ static inline u32 stu300_r8(void __iomem *address) | |||
| 188 | return readl(address) & 0x000000FFU; | 190 | return readl(address) & 0x000000FFU; |
| 189 | } | 191 | } |
| 190 | 192 | ||
| 193 | static void stu300_irq_enable(struct stu300_dev *dev) | ||
| 194 | { | ||
| 195 | u32 val; | ||
| 196 | val = stu300_r8(dev->virtbase + I2C_CR); | ||
| 197 | val |= I2C_CR_INTERRUPT_ENABLE; | ||
| 198 | /* Twice paranoia (possible HW glitch) */ | ||
| 199 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 200 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 201 | } | ||
| 202 | |||
| 203 | static void stu300_irq_disable(struct stu300_dev *dev) | ||
| 204 | { | ||
| 205 | u32 val; | ||
| 206 | val = stu300_r8(dev->virtbase + I2C_CR); | ||
| 207 | val &= ~I2C_CR_INTERRUPT_ENABLE; | ||
| 208 | /* Twice paranoia (possible HW glitch) */ | ||
| 209 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 210 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 211 | } | ||
| 212 | |||
| 213 | |||
| 191 | /* | 214 | /* |
| 192 | * Tells whether a certain event or events occurred in | 215 | * Tells whether a certain event or events occurred in |
| 193 | * response to a command. The events represent states in | 216 | * response to a command. The events represent states in |
| @@ -196,9 +219,10 @@ static inline u32 stu300_r8(void __iomem *address) | |||
| 196 | * documentation and can only be treated as abstract state | 219 | * documentation and can only be treated as abstract state |
| 197 | * machine states. | 220 | * machine states. |
| 198 | * | 221 | * |
| 199 | * @ret 0 = event has not occurred, any other value means | 222 | * @ret 0 = event has not occurred or unknown error, any |
| 200 | * the event occurred. | 223 | * other value means the correct event occurred or an error. |
| 201 | */ | 224 | */ |
| 225 | |||
| 202 | static int stu300_event_occurred(struct stu300_dev *dev, | 226 | static int stu300_event_occurred(struct stu300_dev *dev, |
| 203 | enum stu300_event mr_event) { | 227 | enum stu300_event mr_event) { |
| 204 | u32 status1; | 228 | u32 status1; |
| @@ -206,11 +230,28 @@ static int stu300_event_occurred(struct stu300_dev *dev, | |||
| 206 | 230 | ||
| 207 | /* What event happened? */ | 231 | /* What event happened? */ |
| 208 | status1 = stu300_r8(dev->virtbase + I2C_SR1); | 232 | status1 = stu300_r8(dev->virtbase + I2C_SR1); |
| 233 | |||
| 209 | if (!(status1 & I2C_SR1_EVF_IND)) | 234 | if (!(status1 & I2C_SR1_EVF_IND)) |
| 210 | /* No event at all */ | 235 | /* No event at all */ |
| 211 | return 0; | 236 | return 0; |
| 237 | |||
| 212 | status2 = stu300_r8(dev->virtbase + I2C_SR2); | 238 | status2 = stu300_r8(dev->virtbase + I2C_SR2); |
| 213 | 239 | ||
| 240 | /* Block any multiple interrupts */ | ||
| 241 | stu300_irq_disable(dev); | ||
| 242 | |||
| 243 | /* Check for errors first */ | ||
| 244 | if (status2 & I2C_SR2_AF_IND) { | ||
| 245 | dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE; | ||
| 246 | return 1; | ||
| 247 | } else if (status2 & I2C_SR2_BERR_IND) { | ||
| 248 | dev->cmd_err = STU300_ERROR_BUS_ERROR; | ||
| 249 | return 1; | ||
| 250 | } else if (status2 & I2C_SR2_ARLO_IND) { | ||
| 251 | dev->cmd_err = STU300_ERROR_ARBITRATION_LOST; | ||
| 252 | return 1; | ||
| 253 | } | ||
| 254 | |||
| 214 | switch (mr_event) { | 255 | switch (mr_event) { |
| 215 | case STU300_EVENT_1: | 256 | case STU300_EVENT_1: |
| 216 | if (status1 & I2C_SR1_ADSL_IND) | 257 | if (status1 & I2C_SR1_ADSL_IND) |
| @@ -221,10 +262,6 @@ static int stu300_event_occurred(struct stu300_dev *dev, | |||
| 221 | case STU300_EVENT_7: | 262 | case STU300_EVENT_7: |
| 222 | case STU300_EVENT_8: | 263 | case STU300_EVENT_8: |
| 223 | if (status1 & I2C_SR1_BTF_IND) { | 264 | if (status1 & I2C_SR1_BTF_IND) { |
| 224 | if (status2 & I2C_SR2_AF_IND) | ||
| 225 | dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE; | ||
| 226 | else if (status2 & I2C_SR2_BERR_IND) | ||
| 227 | dev->cmd_err = STU300_ERROR_BUS_ERROR; | ||
| 228 | return 1; | 265 | return 1; |
| 229 | } | 266 | } |
| 230 | break; | 267 | break; |
| @@ -240,8 +277,6 @@ static int stu300_event_occurred(struct stu300_dev *dev, | |||
| 240 | case STU300_EVENT_6: | 277 | case STU300_EVENT_6: |
| 241 | if (status2 & I2C_SR2_ENDAD_IND) { | 278 | if (status2 & I2C_SR2_ENDAD_IND) { |
| 242 | /* First check for any errors */ | 279 | /* First check for any errors */ |
| 243 | if (status2 & I2C_SR2_AF_IND) | ||
| 244 | dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE; | ||
| 245 | return 1; | 280 | return 1; |
| 246 | } | 281 | } |
| 247 | break; | 282 | break; |
| @@ -252,8 +287,15 @@ static int stu300_event_occurred(struct stu300_dev *dev, | |||
| 252 | default: | 287 | default: |
| 253 | break; | 288 | break; |
| 254 | } | 289 | } |
| 255 | if (status2 & I2C_SR2_ARLO_IND) | 290 | /* If we get here, we're on thin ice. |
| 256 | dev->cmd_err = STU300_ERROR_ARBITRATION_LOST; | 291 | * Here we are in a status where we have |
| 292 | * gotten a response that does not match | ||
| 293 | * what we requested. | ||
| 294 | */ | ||
| 295 | dev->cmd_err = STU300_ERROR_UNKNOWN; | ||
| 296 | dev_err(&dev->pdev->dev, | ||
| 297 | "Unhandled interrupt! %d sr1: 0x%x sr2: 0x%x\n", | ||
| 298 | mr_event, status1, status2); | ||
| 257 | return 0; | 299 | return 0; |
| 258 | } | 300 | } |
| 259 | 301 | ||
| @@ -262,21 +304,20 @@ static irqreturn_t stu300_irh(int irq, void *data) | |||
| 262 | struct stu300_dev *dev = data; | 304 | struct stu300_dev *dev = data; |
| 263 | int res; | 305 | int res; |
| 264 | 306 | ||
| 307 | /* Just make sure that the block is clocked */ | ||
| 308 | clk_enable(dev->clk); | ||
| 309 | |||
| 265 | /* See if this was what we were waiting for */ | 310 | /* See if this was what we were waiting for */ |
| 266 | spin_lock(&dev->cmd_issue_lock); | 311 | spin_lock(&dev->cmd_issue_lock); |
| 267 | if (dev->cmd_event != STU300_EVENT_NONE) { | 312 | |
| 268 | res = stu300_event_occurred(dev, dev->cmd_event); | 313 | res = stu300_event_occurred(dev, dev->cmd_event); |
| 269 | if (res || dev->cmd_err != STU300_ERROR_NONE) { | 314 | if (res || dev->cmd_err != STU300_ERROR_NONE) |
| 270 | u32 val; | 315 | complete(&dev->cmd_complete); |
| 271 | 316 | ||
| 272 | complete(&dev->cmd_complete); | ||
| 273 | /* Block any multiple interrupts */ | ||
| 274 | val = stu300_r8(dev->virtbase + I2C_CR); | ||
| 275 | val &= ~I2C_CR_INTERRUPT_ENABLE; | ||
| 276 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 277 | } | ||
| 278 | } | ||
| 279 | spin_unlock(&dev->cmd_issue_lock); | 317 | spin_unlock(&dev->cmd_issue_lock); |
| 318 | |||
| 319 | clk_disable(dev->clk); | ||
| 320 | |||
| 280 | return IRQ_HANDLED; | 321 | return IRQ_HANDLED; |
| 281 | } | 322 | } |
| 282 | 323 | ||
| @@ -308,7 +349,6 @@ static int stu300_start_and_await_event(struct stu300_dev *dev, | |||
| 308 | stu300_wr8(cr_value, dev->virtbase + I2C_CR); | 349 | stu300_wr8(cr_value, dev->virtbase + I2C_CR); |
| 309 | ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, | 350 | ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, |
| 310 | STU300_TIMEOUT); | 351 | STU300_TIMEOUT); |
| 311 | |||
| 312 | if (ret < 0) { | 352 | if (ret < 0) { |
| 313 | dev_err(&dev->pdev->dev, | 353 | dev_err(&dev->pdev->dev, |
| 314 | "wait_for_completion_interruptible_timeout() " | 354 | "wait_for_completion_interruptible_timeout() " |
| @@ -342,7 +382,6 @@ static int stu300_await_event(struct stu300_dev *dev, | |||
| 342 | enum stu300_event mr_event) | 382 | enum stu300_event mr_event) |
| 343 | { | 383 | { |
| 344 | int ret; | 384 | int ret; |
| 345 | u32 val; | ||
| 346 | 385 | ||
| 347 | if (unlikely(irqs_disabled())) { | 386 | if (unlikely(irqs_disabled())) { |
| 348 | /* TODO: implement polling for this case if need be. */ | 387 | /* TODO: implement polling for this case if need be. */ |
| @@ -354,36 +393,18 @@ static int stu300_await_event(struct stu300_dev *dev, | |||
| 354 | /* Is it already here? */ | 393 | /* Is it already here? */ |
| 355 | spin_lock_irq(&dev->cmd_issue_lock); | 394 | spin_lock_irq(&dev->cmd_issue_lock); |
| 356 | dev->cmd_err = STU300_ERROR_NONE; | 395 | dev->cmd_err = STU300_ERROR_NONE; |
| 357 | if (stu300_event_occurred(dev, mr_event)) { | ||
| 358 | spin_unlock_irq(&dev->cmd_issue_lock); | ||
| 359 | goto exit_await_check_err; | ||
| 360 | } | ||
| 361 | init_completion(&dev->cmd_complete); | ||
| 362 | dev->cmd_err = STU300_ERROR_NONE; | ||
| 363 | dev->cmd_event = mr_event; | 396 | dev->cmd_event = mr_event; |
| 364 | 397 | ||
| 365 | /* Turn on the I2C interrupt for current operation */ | 398 | init_completion(&dev->cmd_complete); |
| 366 | val = stu300_r8(dev->virtbase + I2C_CR); | ||
| 367 | val |= I2C_CR_INTERRUPT_ENABLE; | ||
| 368 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 369 | |||
| 370 | /* Twice paranoia (possible HW glitch) */ | ||
| 371 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 372 | 399 | ||
| 373 | /* Check again: is it already here? */ | 400 | /* Turn on the I2C interrupt for current operation */ |
| 374 | if (unlikely(stu300_event_occurred(dev, mr_event))) { | 401 | stu300_irq_enable(dev); |
| 375 | /* Disable IRQ again. */ | ||
| 376 | val &= ~I2C_CR_INTERRUPT_ENABLE; | ||
| 377 | stu300_wr8(val, dev->virtbase + I2C_CR); | ||
| 378 | spin_unlock_irq(&dev->cmd_issue_lock); | ||
| 379 | goto exit_await_check_err; | ||
| 380 | } | ||
| 381 | 402 | ||
| 382 | /* Unlock the command block and wait for the event to occur */ | 403 | /* Unlock the command block and wait for the event to occur */ |
| 383 | spin_unlock_irq(&dev->cmd_issue_lock); | 404 | spin_unlock_irq(&dev->cmd_issue_lock); |
| 405 | |||
| 384 | ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, | 406 | ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, |
| 385 | STU300_TIMEOUT); | 407 | STU300_TIMEOUT); |
| 386 | |||
| 387 | if (ret < 0) { | 408 | if (ret < 0) { |
| 388 | dev_err(&dev->pdev->dev, | 409 | dev_err(&dev->pdev->dev, |
| 389 | "wait_for_completion_interruptible_timeout()" | 410 | "wait_for_completion_interruptible_timeout()" |
| @@ -401,7 +422,6 @@ static int stu300_await_event(struct stu300_dev *dev, | |||
| 401 | return -ETIMEDOUT; | 422 | return -ETIMEDOUT; |
| 402 | } | 423 | } |
| 403 | 424 | ||
| 404 | exit_await_check_err: | ||
| 405 | if (dev->cmd_err != STU300_ERROR_NONE) { | 425 | if (dev->cmd_err != STU300_ERROR_NONE) { |
| 406 | if (mr_event != STU300_EVENT_6) { | 426 | if (mr_event != STU300_EVENT_6) { |
| 407 | dev_err(&dev->pdev->dev, "controller " | 427 | dev_err(&dev->pdev->dev, "controller " |
| @@ -457,18 +477,19 @@ struct stu300_clkset { | |||
| 457 | }; | 477 | }; |
| 458 | 478 | ||
| 459 | static const struct stu300_clkset stu300_clktable[] = { | 479 | static const struct stu300_clkset stu300_clktable[] = { |
| 460 | { 0, 0xFFU }, | 480 | { 0, 0xFFU }, |
| 461 | { 2500000, I2C_OAR2_FR_25_10MHZ }, | 481 | { 2500000, I2C_OAR2_FR_25_10MHZ }, |
| 462 | { 10000000, I2C_OAR2_FR_10_1667MHZ }, | 482 | { 10000000, I2C_OAR2_FR_10_1667MHZ }, |
| 463 | { 16670000, I2C_OAR2_FR_1667_2667MHZ }, | 483 | { 16670000, I2C_OAR2_FR_1667_2667MHZ }, |
| 464 | { 26670000, I2C_OAR2_FR_2667_40MHZ }, | 484 | { 26670000, I2C_OAR2_FR_2667_40MHZ }, |
| 465 | { 40000000, I2C_OAR2_FR_40_5333MHZ }, | 485 | { 40000000, I2C_OAR2_FR_40_5333MHZ }, |
| 466 | { 53330000, I2C_OAR2_FR_5333_66MHZ }, | 486 | { 53330000, I2C_OAR2_FR_5333_66MHZ }, |
| 467 | { 66000000, I2C_OAR2_FR_66_80MHZ }, | 487 | { 66000000, I2C_OAR2_FR_66_80MHZ }, |
| 468 | { 80000000, I2C_OAR2_FR_80_100MHZ }, | 488 | { 80000000, I2C_OAR2_FR_80_100MHZ }, |
| 469 | { 100000000, 0xFFU }, | 489 | { 100000000, 0xFFU }, |
| 470 | }; | 490 | }; |
| 471 | 491 | ||
| 492 | |||
| 472 | static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate) | 493 | static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate) |
| 473 | { | 494 | { |
| 474 | 495 | ||
| @@ -494,10 +515,10 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate) | |||
| 494 | 515 | ||
| 495 | if (dev->speed > 100000) | 516 | if (dev->speed > 100000) |
| 496 | /* Fast Mode I2C */ | 517 | /* Fast Mode I2C */ |
| 497 | val = ((clkrate/dev->speed)-9)/3; | 518 | val = ((clkrate/dev->speed) - 9)/3 + 1; |
| 498 | else | 519 | else |
| 499 | /* Standard Mode I2C */ | 520 | /* Standard Mode I2C */ |
| 500 | val = ((clkrate/dev->speed)-7)/2; | 521 | val = ((clkrate/dev->speed) - 7)/2 + 1; |
| 501 | 522 | ||
| 502 | /* According to spec the divider must be > 2 */ | 523 | /* According to spec the divider must be > 2 */ |
| 503 | if (val < 0x002) { | 524 | if (val < 0x002) { |
| @@ -557,6 +578,7 @@ static int stu300_init_hw(struct stu300_dev *dev) | |||
| 557 | */ | 578 | */ |
| 558 | clkrate = clk_get_rate(dev->clk); | 579 | clkrate = clk_get_rate(dev->clk); |
| 559 | ret = stu300_set_clk(dev, clkrate); | 580 | ret = stu300_set_clk(dev, clkrate); |
| 581 | |||
| 560 | if (ret) | 582 | if (ret) |
| 561 | return ret; | 583 | return ret; |
| 562 | /* | 584 | /* |
| @@ -641,7 +663,6 @@ static int stu300_xfer_msg(struct i2c_adapter *adap, | |||
| 641 | int attempts = 0; | 663 | int attempts = 0; |
| 642 | struct stu300_dev *dev = i2c_get_adapdata(adap); | 664 | struct stu300_dev *dev = i2c_get_adapdata(adap); |
| 643 | 665 | ||
| 644 | |||
| 645 | clk_enable(dev->clk); | 666 | clk_enable(dev->clk); |
| 646 | 667 | ||
| 647 | /* Remove this if (0) to trace each and every message. */ | 668 | /* Remove this if (0) to trace each and every message. */ |
| @@ -715,14 +736,15 @@ static int stu300_xfer_msg(struct i2c_adapter *adap, | |||
| 715 | 736 | ||
| 716 | if (attempts < NUM_ADDR_RESEND_ATTEMPTS && attempts > 0) { | 737 | if (attempts < NUM_ADDR_RESEND_ATTEMPTS && attempts > 0) { |
| 717 | dev_dbg(&dev->pdev->dev, "managed to get address " | 738 | dev_dbg(&dev->pdev->dev, "managed to get address " |
| 718 | "through after %d attempts\n", attempts); | 739 | "through after %d attempts\n", attempts); |
| 719 | } else if (attempts == NUM_ADDR_RESEND_ATTEMPTS) { | 740 | } else if (attempts == NUM_ADDR_RESEND_ATTEMPTS) { |
| 720 | dev_dbg(&dev->pdev->dev, "I give up, tried %d times " | 741 | dev_dbg(&dev->pdev->dev, "I give up, tried %d times " |
| 721 | "to resend address.\n", | 742 | "to resend address.\n", |
| 722 | NUM_ADDR_RESEND_ATTEMPTS); | 743 | NUM_ADDR_RESEND_ATTEMPTS); |
| 723 | goto exit_disable; | 744 | goto exit_disable; |
| 724 | } | 745 | } |
| 725 | 746 | ||
| 747 | |||
| 726 | if (msg->flags & I2C_M_RD) { | 748 | if (msg->flags & I2C_M_RD) { |
| 727 | /* READ: we read the actual bytes one at a time */ | 749 | /* READ: we read the actual bytes one at a time */ |
| 728 | for (i = 0; i < msg->len; i++) { | 750 | for (i = 0; i < msg->len; i++) { |
| @@ -804,8 +826,10 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, | |||
| 804 | { | 826 | { |
| 805 | int ret = -1; | 827 | int ret = -1; |
| 806 | int i; | 828 | int i; |
| 829 | |||
| 807 | struct stu300_dev *dev = i2c_get_adapdata(adap); | 830 | struct stu300_dev *dev = i2c_get_adapdata(adap); |
| 808 | dev->msg_len = num; | 831 | dev->msg_len = num; |
| 832 | |||
| 809 | for (i = 0; i < num; i++) { | 833 | for (i = 0; i < num; i++) { |
| 810 | /* | 834 | /* |
| 811 | * Another driver appears to send stop for each message, | 835 | * Another driver appears to send stop for each message, |
| @@ -817,6 +841,7 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, | |||
| 817 | dev->msg_index = i; | 841 | dev->msg_index = i; |
| 818 | 842 | ||
| 819 | ret = stu300_xfer_msg(adap, &msgs[i], (i == (num - 1))); | 843 | ret = stu300_xfer_msg(adap, &msgs[i], (i == (num - 1))); |
| 844 | |||
| 820 | if (ret != 0) { | 845 | if (ret != 0) { |
| 821 | num = ret; | 846 | num = ret; |
| 822 | break; | 847 | break; |
| @@ -845,6 +870,7 @@ stu300_probe(struct platform_device *pdev) | |||
| 845 | struct resource *res; | 870 | struct resource *res; |
| 846 | int bus_nr; | 871 | int bus_nr; |
| 847 | int ret = 0; | 872 | int ret = 0; |
| 873 | char clk_name[] = "I2C0"; | ||
| 848 | 874 | ||
| 849 | dev = kzalloc(sizeof(struct stu300_dev), GFP_KERNEL); | 875 | dev = kzalloc(sizeof(struct stu300_dev), GFP_KERNEL); |
| 850 | if (!dev) { | 876 | if (!dev) { |
| @@ -854,7 +880,8 @@ stu300_probe(struct platform_device *pdev) | |||
| 854 | } | 880 | } |
| 855 | 881 | ||
| 856 | bus_nr = pdev->id; | 882 | bus_nr = pdev->id; |
| 857 | dev->clk = clk_get(&pdev->dev, NULL); | 883 | clk_name[3] += (char)bus_nr; |
| 884 | dev->clk = clk_get(&pdev->dev, clk_name); | ||
| 858 | if (IS_ERR(dev->clk)) { | 885 | if (IS_ERR(dev->clk)) { |
| 859 | ret = PTR_ERR(dev->clk); | 886 | ret = PTR_ERR(dev->clk); |
| 860 | dev_err(&pdev->dev, "could not retrieve i2c bus clock\n"); | 887 | dev_err(&pdev->dev, "could not retrieve i2c bus clock\n"); |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 0c2ea44ae5e..a7eb7277b10 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -508,7 +508,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev) | |||
| 508 | return error; | 508 | return error; |
| 509 | } | 509 | } |
| 510 | 510 | ||
| 511 | return pci_dev->state_saved ? pci_restore_state(pci_dev) : 0; | 511 | return pci_restore_state(pci_dev); |
| 512 | } | 512 | } |
| 513 | 513 | ||
| 514 | static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev) | 514 | static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev) |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index dbd0f947f49..7b70312181d 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -846,6 +846,8 @@ pci_restore_state(struct pci_dev *dev) | |||
| 846 | int i; | 846 | int i; |
| 847 | u32 val; | 847 | u32 val; |
| 848 | 848 | ||
| 849 | if (!dev->state_saved) | ||
| 850 | return 0; | ||
| 849 | /* PCI Express register must be restored first */ | 851 | /* PCI Express register must be restored first */ |
| 850 | pci_restore_pcie_state(dev); | 852 | pci_restore_pcie_state(dev); |
| 851 | 853 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index f3da592f7bc..35a13867495 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
| @@ -119,6 +119,64 @@ _base_fault_reset_work(struct work_struct *work) | |||
| 119 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | 119 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | /** | ||
| 123 | * mpt2sas_base_start_watchdog - start the fault_reset_work_q | ||
| 124 | * @ioc: pointer to scsi command object | ||
| 125 | * Context: sleep. | ||
| 126 | * | ||
| 127 | * Return nothing. | ||
| 128 | */ | ||
| 129 | void | ||
| 130 | mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc) | ||
| 131 | { | ||
| 132 | unsigned long flags; | ||
| 133 | |||
| 134 | if (ioc->fault_reset_work_q) | ||
| 135 | return; | ||
| 136 | |||
| 137 | /* initialize fault polling */ | ||
| 138 | INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); | ||
| 139 | snprintf(ioc->fault_reset_work_q_name, | ||
| 140 | sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id); | ||
| 141 | ioc->fault_reset_work_q = | ||
| 142 | create_singlethread_workqueue(ioc->fault_reset_work_q_name); | ||
| 143 | if (!ioc->fault_reset_work_q) { | ||
| 144 | printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n", | ||
| 145 | ioc->name, __func__, __LINE__); | ||
| 146 | return; | ||
| 147 | } | ||
| 148 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 149 | if (ioc->fault_reset_work_q) | ||
| 150 | queue_delayed_work(ioc->fault_reset_work_q, | ||
| 151 | &ioc->fault_reset_work, | ||
| 152 | msecs_to_jiffies(FAULT_POLLING_INTERVAL)); | ||
| 153 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 154 | } | ||
| 155 | |||
| 156 | /** | ||
| 157 | * mpt2sas_base_stop_watchdog - stop the fault_reset_work_q | ||
| 158 | * @ioc: pointer to scsi command object | ||
| 159 | * Context: sleep. | ||
| 160 | * | ||
| 161 | * Return nothing. | ||
| 162 | */ | ||
| 163 | void | ||
| 164 | mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc) | ||
| 165 | { | ||
| 166 | unsigned long flags; | ||
| 167 | struct workqueue_struct *wq; | ||
| 168 | |||
| 169 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 170 | wq = ioc->fault_reset_work_q; | ||
| 171 | ioc->fault_reset_work_q = NULL; | ||
| 172 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 173 | if (wq) { | ||
| 174 | if (!cancel_delayed_work(&ioc->fault_reset_work)) | ||
| 175 | flush_workqueue(wq); | ||
| 176 | destroy_workqueue(wq); | ||
| 177 | } | ||
| 178 | } | ||
| 179 | |||
| 122 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 180 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
| 123 | /** | 181 | /** |
| 124 | * _base_sas_ioc_info - verbose translation of the ioc status | 182 | * _base_sas_ioc_info - verbose translation of the ioc status |
| @@ -440,6 +498,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info) | |||
| 440 | if (sas_loginfo.dw.bus_type != 3 /*SAS*/) | 498 | if (sas_loginfo.dw.bus_type != 3 /*SAS*/) |
| 441 | return; | 499 | return; |
| 442 | 500 | ||
| 501 | /* each nexus loss loginfo */ | ||
| 502 | if (log_info == 0x31170000) | ||
| 503 | return; | ||
| 504 | |||
| 443 | /* eat the loginfos associated with task aborts */ | 505 | /* eat the loginfos associated with task aborts */ |
| 444 | if (ioc->ignore_loginfos && (log_info == 30050000 || log_info == | 506 | if (ioc->ignore_loginfos && (log_info == 30050000 || log_info == |
| 445 | 0x31140000 || log_info == 0x31130000)) | 507 | 0x31140000 || log_info == 0x31130000)) |
| @@ -1109,7 +1171,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
| 1109 | } | 1171 | } |
| 1110 | } | 1172 | } |
| 1111 | 1173 | ||
| 1112 | pci_set_drvdata(pdev, ioc->shost); | ||
| 1113 | _base_mask_interrupts(ioc); | 1174 | _base_mask_interrupts(ioc); |
| 1114 | r = _base_enable_msix(ioc); | 1175 | r = _base_enable_msix(ioc); |
| 1115 | if (r) | 1176 | if (r) |
| @@ -1132,7 +1193,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc) | |||
| 1132 | ioc->pci_irq = -1; | 1193 | ioc->pci_irq = -1; |
| 1133 | pci_release_selected_regions(ioc->pdev, ioc->bars); | 1194 | pci_release_selected_regions(ioc->pdev, ioc->bars); |
| 1134 | pci_disable_device(pdev); | 1195 | pci_disable_device(pdev); |
| 1135 | pci_set_drvdata(pdev, NULL); | ||
| 1136 | return r; | 1196 | return r; |
| 1137 | } | 1197 | } |
| 1138 | 1198 | ||
| @@ -3191,7 +3251,6 @@ mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc) | |||
| 3191 | ioc->chip_phys = 0; | 3251 | ioc->chip_phys = 0; |
| 3192 | pci_release_selected_regions(ioc->pdev, ioc->bars); | 3252 | pci_release_selected_regions(ioc->pdev, ioc->bars); |
| 3193 | pci_disable_device(pdev); | 3253 | pci_disable_device(pdev); |
| 3194 | pci_set_drvdata(pdev, NULL); | ||
| 3195 | return; | 3254 | return; |
| 3196 | } | 3255 | } |
| 3197 | 3256 | ||
| @@ -3205,7 +3264,6 @@ int | |||
| 3205 | mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | 3264 | mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) |
| 3206 | { | 3265 | { |
| 3207 | int r, i; | 3266 | int r, i; |
| 3208 | unsigned long flags; | ||
| 3209 | 3267 | ||
| 3210 | dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, | 3268 | dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, |
| 3211 | __func__)); | 3269 | __func__)); |
| @@ -3214,6 +3272,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3214 | if (r) | 3272 | if (r) |
| 3215 | return r; | 3273 | return r; |
| 3216 | 3274 | ||
| 3275 | pci_set_drvdata(ioc->pdev, ioc->shost); | ||
| 3217 | r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET); | 3276 | r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET); |
| 3218 | if (r) | 3277 | if (r) |
| 3219 | goto out_free_resources; | 3278 | goto out_free_resources; |
| @@ -3288,23 +3347,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3288 | if (r) | 3347 | if (r) |
| 3289 | goto out_free_resources; | 3348 | goto out_free_resources; |
| 3290 | 3349 | ||
| 3291 | /* initialize fault polling */ | 3350 | mpt2sas_base_start_watchdog(ioc); |
| 3292 | INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); | ||
| 3293 | snprintf(ioc->fault_reset_work_q_name, | ||
| 3294 | sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id); | ||
| 3295 | ioc->fault_reset_work_q = | ||
| 3296 | create_singlethread_workqueue(ioc->fault_reset_work_q_name); | ||
| 3297 | if (!ioc->fault_reset_work_q) { | ||
| 3298 | printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n", | ||
| 3299 | ioc->name, __func__, __LINE__); | ||
| 3300 | goto out_free_resources; | ||
| 3301 | } | ||
| 3302 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 3303 | if (ioc->fault_reset_work_q) | ||
| 3304 | queue_delayed_work(ioc->fault_reset_work_q, | ||
| 3305 | &ioc->fault_reset_work, | ||
| 3306 | msecs_to_jiffies(FAULT_POLLING_INTERVAL)); | ||
| 3307 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 3308 | return 0; | 3351 | return 0; |
| 3309 | 3352 | ||
| 3310 | out_free_resources: | 3353 | out_free_resources: |
| @@ -3312,6 +3355,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3312 | ioc->remove_host = 1; | 3355 | ioc->remove_host = 1; |
| 3313 | mpt2sas_base_free_resources(ioc); | 3356 | mpt2sas_base_free_resources(ioc); |
| 3314 | _base_release_memory_pools(ioc); | 3357 | _base_release_memory_pools(ioc); |
| 3358 | pci_set_drvdata(ioc->pdev, NULL); | ||
| 3315 | kfree(ioc->tm_cmds.reply); | 3359 | kfree(ioc->tm_cmds.reply); |
| 3316 | kfree(ioc->transport_cmds.reply); | 3360 | kfree(ioc->transport_cmds.reply); |
| 3317 | kfree(ioc->config_cmds.reply); | 3361 | kfree(ioc->config_cmds.reply); |
| @@ -3337,22 +3381,14 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
| 3337 | void | 3381 | void |
| 3338 | mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc) | 3382 | mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc) |
| 3339 | { | 3383 | { |
| 3340 | unsigned long flags; | ||
| 3341 | struct workqueue_struct *wq; | ||
| 3342 | 3384 | ||
| 3343 | dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, | 3385 | dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, |
| 3344 | __func__)); | 3386 | __func__)); |
| 3345 | 3387 | ||
| 3346 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | 3388 | mpt2sas_base_stop_watchdog(ioc); |
| 3347 | wq = ioc->fault_reset_work_q; | ||
| 3348 | ioc->fault_reset_work_q = NULL; | ||
| 3349 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | ||
| 3350 | if (!cancel_delayed_work(&ioc->fault_reset_work)) | ||
| 3351 | flush_workqueue(wq); | ||
| 3352 | destroy_workqueue(wq); | ||
| 3353 | |||
| 3354 | mpt2sas_base_free_resources(ioc); | 3389 | mpt2sas_base_free_resources(ioc); |
| 3355 | _base_release_memory_pools(ioc); | 3390 | _base_release_memory_pools(ioc); |
| 3391 | pci_set_drvdata(ioc->pdev, NULL); | ||
| 3356 | kfree(ioc->pfacts); | 3392 | kfree(ioc->pfacts); |
| 3357 | kfree(ioc->ctl_cmds.reply); | 3393 | kfree(ioc->ctl_cmds.reply); |
| 3358 | kfree(ioc->base_cmds.reply); | 3394 | kfree(ioc->base_cmds.reply); |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h index 286c185fa9e..acdcff150a3 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.h +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h | |||
| @@ -69,10 +69,10 @@ | |||
| 69 | #define MPT2SAS_DRIVER_NAME "mpt2sas" | 69 | #define MPT2SAS_DRIVER_NAME "mpt2sas" |
| 70 | #define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>" | 70 | #define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>" |
| 71 | #define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" | 71 | #define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver" |
| 72 | #define MPT2SAS_DRIVER_VERSION "01.100.03.00" | 72 | #define MPT2SAS_DRIVER_VERSION "01.100.04.00" |
| 73 | #define MPT2SAS_MAJOR_VERSION 01 | 73 | #define MPT2SAS_MAJOR_VERSION 01 |
| 74 | #define MPT2SAS_MINOR_VERSION 100 | 74 | #define MPT2SAS_MINOR_VERSION 100 |
| 75 | #define MPT2SAS_BUILD_VERSION 03 | 75 | #define MPT2SAS_BUILD_VERSION 04 |
| 76 | #define MPT2SAS_RELEASE_VERSION 00 | 76 | #define MPT2SAS_RELEASE_VERSION 00 |
| 77 | 77 | ||
| 78 | /* | 78 | /* |
| @@ -673,6 +673,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, | |||
| 673 | 673 | ||
| 674 | /* base shared API */ | 674 | /* base shared API */ |
| 675 | extern struct list_head mpt2sas_ioc_list; | 675 | extern struct list_head mpt2sas_ioc_list; |
| 676 | void mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc); | ||
| 677 | void mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc); | ||
| 676 | 678 | ||
| 677 | int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc); | 679 | int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc); |
| 678 | void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc); | 680 | void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc); |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index 58cfb97846f..6ddee161beb 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c | |||
| @@ -236,17 +236,25 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 236 | Mpi2ConfigRequest_t *config_request; | 236 | Mpi2ConfigRequest_t *config_request; |
| 237 | int r; | 237 | int r; |
| 238 | u8 retry_count; | 238 | u8 retry_count; |
| 239 | u8 issue_reset; | 239 | u8 issue_host_reset = 0; |
| 240 | u16 wait_state_count; | 240 | u16 wait_state_count; |
| 241 | 241 | ||
| 242 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 242 | if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) { | 243 | if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) { |
| 243 | printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n", | 244 | printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n", |
| 244 | ioc->name, __func__); | 245 | ioc->name, __func__); |
| 246 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 245 | return -EAGAIN; | 247 | return -EAGAIN; |
| 246 | } | 248 | } |
| 247 | retry_count = 0; | 249 | retry_count = 0; |
| 248 | 250 | ||
| 249 | retry_config: | 251 | retry_config: |
| 252 | if (retry_count) { | ||
| 253 | if (retry_count > 2) /* attempt only 2 retries */ | ||
| 254 | return -EFAULT; | ||
| 255 | printk(MPT2SAS_INFO_FMT "%s: attempting retry (%d)\n", | ||
| 256 | ioc->name, __func__, retry_count); | ||
| 257 | } | ||
| 250 | wait_state_count = 0; | 258 | wait_state_count = 0; |
| 251 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); | 259 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); |
| 252 | while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { | 260 | while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) { |
| @@ -254,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 254 | printk(MPT2SAS_ERR_FMT | 262 | printk(MPT2SAS_ERR_FMT |
| 255 | "%s: failed due to ioc not operational\n", | 263 | "%s: failed due to ioc not operational\n", |
| 256 | ioc->name, __func__); | 264 | ioc->name, __func__); |
| 257 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 265 | r = -EFAULT; |
| 258 | return -EFAULT; | 266 | goto out; |
| 259 | } | 267 | } |
| 260 | ssleep(1); | 268 | ssleep(1); |
| 261 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); | 269 | ioc_state = mpt2sas_base_get_iocstate(ioc, 1); |
| @@ -271,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 271 | if (!smid) { | 279 | if (!smid) { |
| 272 | printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", | 280 | printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n", |
| 273 | ioc->name, __func__); | 281 | ioc->name, __func__); |
| 274 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 282 | r = -EAGAIN; |
| 275 | return -EAGAIN; | 283 | goto out; |
| 276 | } | 284 | } |
| 277 | 285 | ||
| 278 | r = 0; | 286 | r = 0; |
| @@ -292,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 292 | ioc->name, __func__); | 300 | ioc->name, __func__); |
| 293 | _debug_dump_mf(mpi_request, | 301 | _debug_dump_mf(mpi_request, |
| 294 | sizeof(Mpi2ConfigRequest_t)/4); | 302 | sizeof(Mpi2ConfigRequest_t)/4); |
| 295 | if (!(ioc->config_cmds.status & MPT2_CMD_RESET)) | 303 | retry_count++; |
| 296 | issue_reset = 1; | 304 | if (ioc->config_cmds.smid == smid) |
| 297 | goto issue_host_reset; | 305 | mpt2sas_base_free_smid(ioc, smid); |
| 306 | if ((ioc->shost_recovery) || | ||
| 307 | (ioc->config_cmds.status & MPT2_CMD_RESET)) | ||
| 308 | goto retry_config; | ||
| 309 | issue_host_reset = 1; | ||
| 310 | r = -EFAULT; | ||
| 311 | goto out; | ||
| 298 | } | 312 | } |
| 299 | if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID) | 313 | if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID) |
| 300 | memcpy(mpi_reply, ioc->config_cmds.reply, | 314 | memcpy(mpi_reply, ioc->config_cmds.reply, |
| @@ -302,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
| 302 | if (retry_count) | 316 | if (retry_count) |
| 303 | printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n", | 317 | printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n", |
| 304 | ioc->name, __func__); | 318 | ioc->name, __func__); |
| 319 | out: | ||
| 305 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 320 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; |
| 306 | return r; | 321 | mutex_unlock(&ioc->config_cmds.mutex); |
| 307 | 322 | if (issue_host_reset) | |
| 308 | issue_host_reset: | ||
| 309 | if (issue_reset) | ||
| 310 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, | 323 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, |
| 311 | FORCE_BIG_HAMMER); | 324 | FORCE_BIG_HAMMER); |
| 312 | ioc->config_cmds.status = MPT2_CMD_NOT_USED; | 325 | return r; |
| 313 | if (!retry_count) { | ||
| 314 | printk(MPT2SAS_INFO_FMT "%s: attempting retry\n", | ||
| 315 | ioc->name, __func__); | ||
| 316 | retry_count++; | ||
| 317 | goto retry_config; | ||
| 318 | } | ||
| 319 | return -EFAULT; | ||
| 320 | } | 326 | } |
| 321 | 327 | ||
| 322 | /** | 328 | /** |
| @@ -375,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 375 | int r; | 381 | int r; |
| 376 | struct config_request mem; | 382 | struct config_request mem; |
| 377 | 383 | ||
| 378 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 379 | memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t)); | 384 | memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t)); |
| 380 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 385 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 381 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 386 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -417,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 417 | _config_free_config_dma_memory(ioc, &mem); | 422 | _config_free_config_dma_memory(ioc, &mem); |
| 418 | 423 | ||
| 419 | out: | 424 | out: |
| 420 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 421 | return r; | 425 | return r; |
| 422 | } | 426 | } |
| 423 | 427 | ||
| @@ -438,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, | |||
| 438 | int r; | 442 | int r; |
| 439 | struct config_request mem; | 443 | struct config_request mem; |
| 440 | 444 | ||
| 441 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 442 | memset(config_page, 0, sizeof(Mpi2BiosPage2_t)); | 445 | memset(config_page, 0, sizeof(Mpi2BiosPage2_t)); |
| 443 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 446 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 444 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 447 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -480,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, | |||
| 480 | _config_free_config_dma_memory(ioc, &mem); | 483 | _config_free_config_dma_memory(ioc, &mem); |
| 481 | 484 | ||
| 482 | out: | 485 | out: |
| 483 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 484 | return r; | 486 | return r; |
| 485 | } | 487 | } |
| 486 | 488 | ||
| @@ -501,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 501 | int r; | 503 | int r; |
| 502 | struct config_request mem; | 504 | struct config_request mem; |
| 503 | 505 | ||
| 504 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 505 | memset(config_page, 0, sizeof(Mpi2BiosPage3_t)); | 506 | memset(config_page, 0, sizeof(Mpi2BiosPage3_t)); |
| 506 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 507 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 507 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 508 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -543,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 543 | _config_free_config_dma_memory(ioc, &mem); | 544 | _config_free_config_dma_memory(ioc, &mem); |
| 544 | 545 | ||
| 545 | out: | 546 | out: |
| 546 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 547 | return r; | 547 | return r; |
| 548 | } | 548 | } |
| 549 | 549 | ||
| @@ -564,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 564 | int r; | 564 | int r; |
| 565 | struct config_request mem; | 565 | struct config_request mem; |
| 566 | 566 | ||
| 567 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 568 | memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t)); | 567 | memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t)); |
| 569 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 568 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 570 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 569 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -606,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 606 | _config_free_config_dma_memory(ioc, &mem); | 605 | _config_free_config_dma_memory(ioc, &mem); |
| 607 | 606 | ||
| 608 | out: | 607 | out: |
| 609 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 610 | return r; | 608 | return r; |
| 611 | } | 609 | } |
| 612 | 610 | ||
| @@ -627,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 627 | int r; | 625 | int r; |
| 628 | struct config_request mem; | 626 | struct config_request mem; |
| 629 | 627 | ||
| 630 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 631 | memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t)); | 628 | memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t)); |
| 632 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 629 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 633 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 630 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -669,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 669 | _config_free_config_dma_memory(ioc, &mem); | 666 | _config_free_config_dma_memory(ioc, &mem); |
| 670 | 667 | ||
| 671 | out: | 668 | out: |
| 672 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 673 | return r; | 669 | return r; |
| 674 | } | 670 | } |
| 675 | 671 | ||
| @@ -690,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 690 | int r; | 686 | int r; |
| 691 | struct config_request mem; | 687 | struct config_request mem; |
| 692 | 688 | ||
| 693 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 694 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 689 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 695 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 690 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| 696 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | 691 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; |
| @@ -732,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 732 | _config_free_config_dma_memory(ioc, &mem); | 727 | _config_free_config_dma_memory(ioc, &mem); |
| 733 | 728 | ||
| 734 | out: | 729 | out: |
| 735 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 736 | return r; | 730 | return r; |
| 737 | } | 731 | } |
| 738 | 732 | ||
| @@ -753,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, | |||
| 753 | int r; | 747 | int r; |
| 754 | struct config_request mem; | 748 | struct config_request mem; |
| 755 | 749 | ||
| 756 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 757 | memset(config_page, 0, sizeof(Mpi2IOCPage8_t)); | 750 | memset(config_page, 0, sizeof(Mpi2IOCPage8_t)); |
| 758 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 751 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 759 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 752 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -795,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, | |||
| 795 | _config_free_config_dma_memory(ioc, &mem); | 788 | _config_free_config_dma_memory(ioc, &mem); |
| 796 | 789 | ||
| 797 | out: | 790 | out: |
| 798 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 799 | return r; | 791 | return r; |
| 800 | } | 792 | } |
| 801 | 793 | ||
| @@ -818,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 818 | int r; | 810 | int r; |
| 819 | struct config_request mem; | 811 | struct config_request mem; |
| 820 | 812 | ||
| 821 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 822 | memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t)); | 813 | memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t)); |
| 823 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 814 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 824 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 815 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -863,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 863 | _config_free_config_dma_memory(ioc, &mem); | 854 | _config_free_config_dma_memory(ioc, &mem); |
| 864 | 855 | ||
| 865 | out: | 856 | out: |
| 866 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 867 | return r; | 857 | return r; |
| 868 | } | 858 | } |
| 869 | 859 | ||
| @@ -886,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 886 | int r; | 876 | int r; |
| 887 | struct config_request mem; | 877 | struct config_request mem; |
| 888 | 878 | ||
| 889 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 890 | memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t)); | 879 | memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t)); |
| 891 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 880 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 892 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 881 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -931,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 931 | _config_free_config_dma_memory(ioc, &mem); | 920 | _config_free_config_dma_memory(ioc, &mem); |
| 932 | 921 | ||
| 933 | out: | 922 | out: |
| 934 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 935 | return r; | 923 | return r; |
| 936 | } | 924 | } |
| 937 | 925 | ||
| @@ -953,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys) | |||
| 953 | Mpi2ConfigReply_t mpi_reply; | 941 | Mpi2ConfigReply_t mpi_reply; |
| 954 | Mpi2SasIOUnitPage0_t config_page; | 942 | Mpi2SasIOUnitPage0_t config_page; |
| 955 | 943 | ||
| 956 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 957 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 944 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 958 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 945 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| 959 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | 946 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; |
| @@ -1002,7 +989,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys) | |||
| 1002 | _config_free_config_dma_memory(ioc, &mem); | 989 | _config_free_config_dma_memory(ioc, &mem); |
| 1003 | 990 | ||
| 1004 | out: | 991 | out: |
| 1005 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1006 | return r; | 992 | return r; |
| 1007 | } | 993 | } |
| 1008 | 994 | ||
| @@ -1026,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1026 | Mpi2ConfigRequest_t mpi_request; | 1012 | Mpi2ConfigRequest_t mpi_request; |
| 1027 | int r; | 1013 | int r; |
| 1028 | struct config_request mem; | 1014 | struct config_request mem; |
| 1029 | |||
| 1030 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1031 | memset(config_page, 0, sz); | 1015 | memset(config_page, 0, sz); |
| 1032 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1016 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1033 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1017 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1070,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1070 | _config_free_config_dma_memory(ioc, &mem); | 1054 | _config_free_config_dma_memory(ioc, &mem); |
| 1071 | 1055 | ||
| 1072 | out: | 1056 | out: |
| 1073 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1074 | return r; | 1057 | return r; |
| 1075 | } | 1058 | } |
| 1076 | 1059 | ||
| @@ -1095,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1095 | int r; | 1078 | int r; |
| 1096 | struct config_request mem; | 1079 | struct config_request mem; |
| 1097 | 1080 | ||
| 1098 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1099 | memset(config_page, 0, sz); | 1081 | memset(config_page, 0, sz); |
| 1100 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1082 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1101 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1083 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1138,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1138 | _config_free_config_dma_memory(ioc, &mem); | 1120 | _config_free_config_dma_memory(ioc, &mem); |
| 1139 | 1121 | ||
| 1140 | out: | 1122 | out: |
| 1141 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1142 | return r; | 1123 | return r; |
| 1143 | } | 1124 | } |
| 1144 | 1125 | ||
| @@ -1161,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1161 | int r; | 1142 | int r; |
| 1162 | struct config_request mem; | 1143 | struct config_request mem; |
| 1163 | 1144 | ||
| 1164 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1165 | memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t)); | 1145 | memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t)); |
| 1166 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1146 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1167 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1147 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1206,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1206 | _config_free_config_dma_memory(ioc, &mem); | 1186 | _config_free_config_dma_memory(ioc, &mem); |
| 1207 | 1187 | ||
| 1208 | out: | 1188 | out: |
| 1209 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1210 | return r; | 1189 | return r; |
| 1211 | } | 1190 | } |
| 1212 | 1191 | ||
| @@ -1230,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1230 | int r; | 1209 | int r; |
| 1231 | struct config_request mem; | 1210 | struct config_request mem; |
| 1232 | 1211 | ||
| 1233 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1234 | memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t)); | 1212 | memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t)); |
| 1235 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1213 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1236 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1214 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1277,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1277 | _config_free_config_dma_memory(ioc, &mem); | 1255 | _config_free_config_dma_memory(ioc, &mem); |
| 1278 | 1256 | ||
| 1279 | out: | 1257 | out: |
| 1280 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1281 | return r; | 1258 | return r; |
| 1282 | } | 1259 | } |
| 1283 | 1260 | ||
| @@ -1300,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1300 | int r; | 1277 | int r; |
| 1301 | struct config_request mem; | 1278 | struct config_request mem; |
| 1302 | 1279 | ||
| 1303 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1304 | memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t)); | 1280 | memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t)); |
| 1305 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1281 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1306 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1282 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1345,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1345 | _config_free_config_dma_memory(ioc, &mem); | 1321 | _config_free_config_dma_memory(ioc, &mem); |
| 1346 | 1322 | ||
| 1347 | out: | 1323 | out: |
| 1348 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1349 | return r; | 1324 | return r; |
| 1350 | } | 1325 | } |
| 1351 | 1326 | ||
| @@ -1367,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1367 | int r; | 1342 | int r; |
| 1368 | struct config_request mem; | 1343 | struct config_request mem; |
| 1369 | 1344 | ||
| 1370 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1371 | memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t)); | 1345 | memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t)); |
| 1372 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1346 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1373 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1347 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1413,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1413 | _config_free_config_dma_memory(ioc, &mem); | 1387 | _config_free_config_dma_memory(ioc, &mem); |
| 1414 | 1388 | ||
| 1415 | out: | 1389 | out: |
| 1416 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1417 | return r; | 1390 | return r; |
| 1418 | } | 1391 | } |
| 1419 | 1392 | ||
| @@ -1435,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1435 | int r; | 1408 | int r; |
| 1436 | struct config_request mem; | 1409 | struct config_request mem; |
| 1437 | 1410 | ||
| 1438 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1439 | memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t)); | 1411 | memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t)); |
| 1440 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1412 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1441 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1413 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1481,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1481 | _config_free_config_dma_memory(ioc, &mem); | 1453 | _config_free_config_dma_memory(ioc, &mem); |
| 1482 | 1454 | ||
| 1483 | out: | 1455 | out: |
| 1484 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1485 | return r; | 1456 | return r; |
| 1486 | } | 1457 | } |
| 1487 | 1458 | ||
| @@ -1505,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 1505 | int r; | 1476 | int r; |
| 1506 | struct config_request mem; | 1477 | struct config_request mem; |
| 1507 | 1478 | ||
| 1508 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1509 | memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t)); | 1479 | memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t)); |
| 1510 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1480 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1511 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1481 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1548,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, | |||
| 1548 | _config_free_config_dma_memory(ioc, &mem); | 1518 | _config_free_config_dma_memory(ioc, &mem); |
| 1549 | 1519 | ||
| 1550 | out: | 1520 | out: |
| 1551 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1552 | return r; | 1521 | return r; |
| 1553 | } | 1522 | } |
| 1554 | 1523 | ||
| @@ -1572,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
| 1572 | struct config_request mem; | 1541 | struct config_request mem; |
| 1573 | u16 ioc_status; | 1542 | u16 ioc_status; |
| 1574 | 1543 | ||
| 1575 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1576 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1544 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1577 | *num_pds = 0; | 1545 | *num_pds = 0; |
| 1578 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1546 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1620,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
| 1620 | _config_free_config_dma_memory(ioc, &mem); | 1588 | _config_free_config_dma_memory(ioc, &mem); |
| 1621 | 1589 | ||
| 1622 | out: | 1590 | out: |
| 1623 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1624 | return r; | 1591 | return r; |
| 1625 | } | 1592 | } |
| 1626 | 1593 | ||
| @@ -1645,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 1645 | int r; | 1612 | int r; |
| 1646 | struct config_request mem; | 1613 | struct config_request mem; |
| 1647 | 1614 | ||
| 1648 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1649 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1615 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1650 | memset(config_page, 0, sz); | 1616 | memset(config_page, 0, sz); |
| 1651 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1617 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1687,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, | |||
| 1687 | _config_free_config_dma_memory(ioc, &mem); | 1653 | _config_free_config_dma_memory(ioc, &mem); |
| 1688 | 1654 | ||
| 1689 | out: | 1655 | out: |
| 1690 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1691 | return r; | 1656 | return r; |
| 1692 | } | 1657 | } |
| 1693 | 1658 | ||
| @@ -1711,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1711 | int r; | 1676 | int r; |
| 1712 | struct config_request mem; | 1677 | struct config_request mem; |
| 1713 | 1678 | ||
| 1714 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1715 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1679 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1716 | memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t)); | 1680 | memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t)); |
| 1717 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1681 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1754,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
| 1754 | _config_free_config_dma_memory(ioc, &mem); | 1718 | _config_free_config_dma_memory(ioc, &mem); |
| 1755 | 1719 | ||
| 1756 | out: | 1720 | out: |
| 1757 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1758 | return r; | 1721 | return r; |
| 1759 | } | 1722 | } |
| 1760 | 1723 | ||
| @@ -1778,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, | |||
| 1778 | struct config_request mem; | 1741 | struct config_request mem; |
| 1779 | u16 ioc_status; | 1742 | u16 ioc_status; |
| 1780 | 1743 | ||
| 1781 | mutex_lock(&ioc->config_cmds.mutex); | ||
| 1782 | *volume_handle = 0; | 1744 | *volume_handle = 0; |
| 1783 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | 1745 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); |
| 1784 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | 1746 | mpi_request.Function = MPI2_FUNCTION_CONFIG; |
| @@ -1842,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle, | |||
| 1842 | _config_free_config_dma_memory(ioc, &mem); | 1804 | _config_free_config_dma_memory(ioc, &mem); |
| 1843 | 1805 | ||
| 1844 | out: | 1806 | out: |
| 1845 | mutex_unlock(&ioc->config_cmds.mutex); | ||
| 1846 | return r; | 1807 | return r; |
| 1847 | } | 1808 | } |
| 1848 | 1809 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 2a01a5f2a84..2e9a4445596 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
| @@ -2767,6 +2767,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd, | |||
| 2767 | char *desc_ioc_state = NULL; | 2767 | char *desc_ioc_state = NULL; |
| 2768 | char *desc_scsi_status = NULL; | 2768 | char *desc_scsi_status = NULL; |
| 2769 | char *desc_scsi_state = ioc->tmp_string; | 2769 | char *desc_scsi_state = ioc->tmp_string; |
| 2770 | u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo); | ||
| 2771 | |||
| 2772 | if (log_info == 0x31170000) | ||
| 2773 | return; | ||
| 2770 | 2774 | ||
| 2771 | switch (ioc_status) { | 2775 | switch (ioc_status) { |
| 2772 | case MPI2_IOCSTATUS_SUCCESS: | 2776 | case MPI2_IOCSTATUS_SUCCESS: |
| @@ -3426,7 +3430,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 3426 | __le64 sas_address; | 3430 | __le64 sas_address; |
| 3427 | int i; | 3431 | int i; |
| 3428 | unsigned long flags; | 3432 | unsigned long flags; |
| 3429 | struct _sas_port *mpt2sas_port; | 3433 | struct _sas_port *mpt2sas_port = NULL; |
| 3430 | int rc = 0; | 3434 | int rc = 0; |
| 3431 | 3435 | ||
| 3432 | if (!handle) | 3436 | if (!handle) |
| @@ -3518,12 +3522,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 3518 | &expander_pg1, i, handle))) { | 3522 | &expander_pg1, i, handle))) { |
| 3519 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | 3523 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", |
| 3520 | ioc->name, __FILE__, __LINE__, __func__); | 3524 | ioc->name, __FILE__, __LINE__, __func__); |
| 3521 | continue; | 3525 | rc = -1; |
| 3526 | goto out_fail; | ||
| 3522 | } | 3527 | } |
| 3523 | sas_expander->phy[i].handle = handle; | 3528 | sas_expander->phy[i].handle = handle; |
| 3524 | sas_expander->phy[i].phy_id = i; | 3529 | sas_expander->phy[i].phy_id = i; |
| 3525 | mpt2sas_transport_add_expander_phy(ioc, &sas_expander->phy[i], | 3530 | |
| 3526 | expander_pg1, sas_expander->parent_dev); | 3531 | if ((mpt2sas_transport_add_expander_phy(ioc, |
| 3532 | &sas_expander->phy[i], expander_pg1, | ||
| 3533 | sas_expander->parent_dev))) { | ||
| 3534 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 3535 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 3536 | rc = -1; | ||
| 3537 | goto out_fail; | ||
| 3538 | } | ||
| 3527 | } | 3539 | } |
| 3528 | 3540 | ||
| 3529 | if (sas_expander->enclosure_handle) { | 3541 | if (sas_expander->enclosure_handle) { |
| @@ -3540,8 +3552,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
| 3540 | 3552 | ||
| 3541 | out_fail: | 3553 | out_fail: |
| 3542 | 3554 | ||
| 3543 | if (sas_expander) | 3555 | if (mpt2sas_port) |
| 3544 | kfree(sas_expander->phy); | 3556 | mpt2sas_transport_port_remove(ioc, sas_expander->sas_address, |
| 3557 | sas_expander->parent_handle); | ||
| 3545 | kfree(sas_expander); | 3558 | kfree(sas_expander); |
| 3546 | return rc; | 3559 | return rc; |
| 3547 | } | 3560 | } |
| @@ -3663,12 +3676,11 @@ _scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 phy_num, u8 is_pd) | |||
| 3663 | sas_device->hidden_raid_component = is_pd; | 3676 | sas_device->hidden_raid_component = is_pd; |
| 3664 | 3677 | ||
| 3665 | /* get enclosure_logical_id */ | 3678 | /* get enclosure_logical_id */ |
| 3666 | if (!(mpt2sas_config_get_enclosure_pg0(ioc, &mpi_reply, &enclosure_pg0, | 3679 | if (sas_device->enclosure_handle && !(mpt2sas_config_get_enclosure_pg0( |
| 3667 | MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, | 3680 | ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE, |
| 3668 | sas_device->enclosure_handle))) { | 3681 | sas_device->enclosure_handle))) |
| 3669 | sas_device->enclosure_logical_id = | 3682 | sas_device->enclosure_logical_id = |
| 3670 | le64_to_cpu(enclosure_pg0.EnclosureLogicalID); | 3683 | le64_to_cpu(enclosure_pg0.EnclosureLogicalID); |
| 3671 | } | ||
| 3672 | 3684 | ||
| 3673 | /* get device name */ | 3685 | /* get device name */ |
| 3674 | sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName); | 3686 | sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName); |
| @@ -4250,12 +4262,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc, | |||
| 4250 | u16 handle = le16_to_cpu(element->VolDevHandle); | 4262 | u16 handle = le16_to_cpu(element->VolDevHandle); |
| 4251 | int rc; | 4263 | int rc; |
| 4252 | 4264 | ||
| 4253 | #if 0 /* RAID_HACKS */ | ||
| 4254 | if (le32_to_cpu(event_data->Flags) & | ||
| 4255 | MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) | ||
| 4256 | return; | ||
| 4257 | #endif | ||
| 4258 | |||
| 4259 | mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); | 4265 | mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); |
| 4260 | if (!wwid) { | 4266 | if (!wwid) { |
| 4261 | printk(MPT2SAS_ERR_FMT | 4267 | printk(MPT2SAS_ERR_FMT |
| @@ -4310,12 +4316,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc, | |||
| 4310 | unsigned long flags; | 4316 | unsigned long flags; |
| 4311 | struct MPT2SAS_TARGET *sas_target_priv_data; | 4317 | struct MPT2SAS_TARGET *sas_target_priv_data; |
| 4312 | 4318 | ||
| 4313 | #if 0 /* RAID_HACKS */ | ||
| 4314 | if (le32_to_cpu(event_data->Flags) & | ||
| 4315 | MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) | ||
| 4316 | return; | ||
| 4317 | #endif | ||
| 4318 | |||
| 4319 | spin_lock_irqsave(&ioc->raid_device_lock, flags); | 4319 | spin_lock_irqsave(&ioc->raid_device_lock, flags); |
| 4320 | raid_device = _scsih_raid_device_find_by_handle(ioc, handle); | 4320 | raid_device = _scsih_raid_device_find_by_handle(ioc, handle); |
| 4321 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); | 4321 | spin_unlock_irqrestore(&ioc->raid_device_lock, flags); |
| @@ -4428,14 +4428,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc, | |||
| 4428 | struct _sas_device *sas_device; | 4428 | struct _sas_device *sas_device; |
| 4429 | unsigned long flags; | 4429 | unsigned long flags; |
| 4430 | u16 handle = le16_to_cpu(element->PhysDiskDevHandle); | 4430 | u16 handle = le16_to_cpu(element->PhysDiskDevHandle); |
| 4431 | Mpi2ConfigReply_t mpi_reply; | ||
| 4432 | Mpi2SasDevicePage0_t sas_device_pg0; | ||
| 4433 | u32 ioc_status; | ||
| 4431 | 4434 | ||
| 4432 | spin_lock_irqsave(&ioc->sas_device_lock, flags); | 4435 | spin_lock_irqsave(&ioc->sas_device_lock, flags); |
| 4433 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); | 4436 | sas_device = _scsih_sas_device_find_by_handle(ioc, handle); |
| 4434 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 4437 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
| 4435 | if (sas_device) | 4438 | if (sas_device) { |
| 4436 | sas_device->hidden_raid_component = 1; | 4439 | sas_device->hidden_raid_component = 1; |
| 4437 | else | 4440 | return; |
| 4438 | _scsih_add_device(ioc, handle, 0, 1); | 4441 | } |
| 4442 | |||
| 4443 | if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0, | ||
| 4444 | MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) { | ||
| 4445 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4446 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4447 | return; | ||
| 4448 | } | ||
| 4449 | |||
| 4450 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | ||
| 4451 | MPI2_IOCSTATUS_MASK; | ||
| 4452 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | ||
| 4453 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4454 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4455 | return; | ||
| 4456 | } | ||
| 4457 | |||
| 4458 | _scsih_link_change(ioc, | ||
| 4459 | le16_to_cpu(sas_device_pg0.ParentDevHandle), | ||
| 4460 | handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); | ||
| 4461 | |||
| 4462 | _scsih_add_device(ioc, handle, 0, 1); | ||
| 4439 | } | 4463 | } |
| 4440 | 4464 | ||
| 4441 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 4465 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
| @@ -4535,12 +4559,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4535 | { | 4559 | { |
| 4536 | Mpi2EventIrConfigElement_t *element; | 4560 | Mpi2EventIrConfigElement_t *element; |
| 4537 | int i; | 4561 | int i; |
| 4562 | u8 foreign_config; | ||
| 4538 | 4563 | ||
| 4539 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 4564 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
| 4540 | if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) | 4565 | if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) |
| 4541 | _scsih_sas_ir_config_change_event_debug(ioc, event_data); | 4566 | _scsih_sas_ir_config_change_event_debug(ioc, event_data); |
| 4542 | 4567 | ||
| 4543 | #endif | 4568 | #endif |
| 4569 | foreign_config = (le32_to_cpu(event_data->Flags) & | ||
| 4570 | MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0; | ||
| 4544 | 4571 | ||
| 4545 | element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; | 4572 | element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; |
| 4546 | for (i = 0; i < event_data->NumElements; i++, element++) { | 4573 | for (i = 0; i < event_data->NumElements; i++, element++) { |
| @@ -4548,11 +4575,13 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4548 | switch (element->ReasonCode) { | 4575 | switch (element->ReasonCode) { |
| 4549 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: | 4576 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: |
| 4550 | case MPI2_EVENT_IR_CHANGE_RC_ADDED: | 4577 | case MPI2_EVENT_IR_CHANGE_RC_ADDED: |
| 4551 | _scsih_sas_volume_add(ioc, element); | 4578 | if (!foreign_config) |
| 4579 | _scsih_sas_volume_add(ioc, element); | ||
| 4552 | break; | 4580 | break; |
| 4553 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: | 4581 | case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: |
| 4554 | case MPI2_EVENT_IR_CHANGE_RC_REMOVED: | 4582 | case MPI2_EVENT_IR_CHANGE_RC_REMOVED: |
| 4555 | _scsih_sas_volume_delete(ioc, element); | 4583 | if (!foreign_config) |
| 4584 | _scsih_sas_volume_delete(ioc, element); | ||
| 4556 | break; | 4585 | break; |
| 4557 | case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: | 4586 | case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: |
| 4558 | _scsih_sas_pd_hide(ioc, element); | 4587 | _scsih_sas_pd_hide(ioc, element); |
| @@ -4671,6 +4700,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4671 | u32 state; | 4700 | u32 state; |
| 4672 | struct _sas_device *sas_device; | 4701 | struct _sas_device *sas_device; |
| 4673 | unsigned long flags; | 4702 | unsigned long flags; |
| 4703 | Mpi2ConfigReply_t mpi_reply; | ||
| 4704 | Mpi2SasDevicePage0_t sas_device_pg0; | ||
| 4705 | u32 ioc_status; | ||
| 4674 | 4706 | ||
| 4675 | if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED) | 4707 | if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED) |
| 4676 | return; | 4708 | return; |
| @@ -4687,22 +4719,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
| 4687 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); | 4719 | spin_unlock_irqrestore(&ioc->sas_device_lock, flags); |
| 4688 | 4720 | ||
| 4689 | switch (state) { | 4721 | switch (state) { |
| 4690 | #if 0 | ||
| 4691 | case MPI2_RAID_PD_STATE_OFFLINE: | ||
| 4692 | if (sas_device) | ||
| 4693 | _scsih_remove_device(ioc, handle); | ||
| 4694 | break; | ||
| 4695 | #endif | ||
| 4696 | case MPI2_RAID_PD_STATE_ONLINE: | 4722 | case MPI2_RAID_PD_STATE_ONLINE: |
| 4697 | case MPI2_RAID_PD_STATE_DEGRADED: | 4723 | case MPI2_RAID_PD_STATE_DEGRADED: |
| 4698 | case MPI2_RAID_PD_STATE_REBUILDING: | 4724 | case MPI2_RAID_PD_STATE_REBUILDING: |
| 4699 | case MPI2_RAID_PD_STATE_OPTIMAL: | 4725 | case MPI2_RAID_PD_STATE_OPTIMAL: |
| 4700 | if (sas_device) | 4726 | if (sas_device) { |
| 4701 | sas_device->hidden_raid_component = 1; | 4727 | sas_device->hidden_raid_component = 1; |
| 4702 | else | 4728 | return; |
| 4703 | _scsih_add_device(ioc, handle, 0, 1); | 4729 | } |
| 4730 | |||
| 4731 | if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, | ||
| 4732 | &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, | ||
| 4733 | handle))) { | ||
| 4734 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4735 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4736 | return; | ||
| 4737 | } | ||
| 4738 | |||
| 4739 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | ||
| 4740 | MPI2_IOCSTATUS_MASK; | ||
| 4741 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | ||
| 4742 | printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n", | ||
| 4743 | ioc->name, __FILE__, __LINE__, __func__); | ||
| 4744 | return; | ||
| 4745 | } | ||
| 4746 | |||
| 4747 | _scsih_link_change(ioc, | ||
| 4748 | le16_to_cpu(sas_device_pg0.ParentDevHandle), | ||
| 4749 | handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5); | ||
| 4750 | |||
| 4751 | _scsih_add_device(ioc, handle, 0, 1); | ||
| 4752 | |||
| 4704 | break; | 4753 | break; |
| 4705 | 4754 | ||
| 4755 | case MPI2_RAID_PD_STATE_OFFLINE: | ||
| 4706 | case MPI2_RAID_PD_STATE_NOT_CONFIGURED: | 4756 | case MPI2_RAID_PD_STATE_NOT_CONFIGURED: |
| 4707 | case MPI2_RAID_PD_STATE_NOT_COMPATIBLE: | 4757 | case MPI2_RAID_PD_STATE_NOT_COMPATIBLE: |
| 4708 | case MPI2_RAID_PD_STATE_HOT_SPARE: | 4758 | case MPI2_RAID_PD_STATE_HOT_SPARE: |
| @@ -5774,6 +5824,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 5774 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); | 5824 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); |
| 5775 | u32 device_state; | 5825 | u32 device_state; |
| 5776 | 5826 | ||
| 5827 | mpt2sas_base_stop_watchdog(ioc); | ||
| 5777 | flush_scheduled_work(); | 5828 | flush_scheduled_work(); |
| 5778 | scsi_block_requests(shost); | 5829 | scsi_block_requests(shost); |
| 5779 | device_state = pci_choose_state(pdev, state); | 5830 | device_state = pci_choose_state(pdev, state); |
| @@ -5816,6 +5867,7 @@ _scsih_resume(struct pci_dev *pdev) | |||
| 5816 | 5867 | ||
| 5817 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET); | 5868 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET); |
| 5818 | scsi_unblock_requests(shost); | 5869 | scsi_unblock_requests(shost); |
| 5870 | mpt2sas_base_start_watchdog(ioc); | ||
| 5819 | return 0; | 5871 | return 0; |
| 5820 | } | 5872 | } |
| 5821 | #endif /* CONFIG_PM */ | 5873 | #endif /* CONFIG_PM */ |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 272b9b2bea8..59cba180fe8 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -3099,8 +3099,12 @@ static void inode_tree_add(struct inode *inode) | |||
| 3099 | { | 3099 | { |
| 3100 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3100 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 3101 | struct btrfs_inode *entry; | 3101 | struct btrfs_inode *entry; |
| 3102 | struct rb_node **p = &root->inode_tree.rb_node; | 3102 | struct rb_node **p; |
| 3103 | struct rb_node *parent = NULL; | 3103 | struct rb_node *parent; |
| 3104 | |||
| 3105 | again: | ||
| 3106 | p = &root->inode_tree.rb_node; | ||
| 3107 | parent = NULL; | ||
| 3104 | 3108 | ||
| 3105 | spin_lock(&root->inode_lock); | 3109 | spin_lock(&root->inode_lock); |
| 3106 | while (*p) { | 3110 | while (*p) { |
| @@ -3108,13 +3112,16 @@ static void inode_tree_add(struct inode *inode) | |||
| 3108 | entry = rb_entry(parent, struct btrfs_inode, rb_node); | 3112 | entry = rb_entry(parent, struct btrfs_inode, rb_node); |
| 3109 | 3113 | ||
| 3110 | if (inode->i_ino < entry->vfs_inode.i_ino) | 3114 | if (inode->i_ino < entry->vfs_inode.i_ino) |
| 3111 | p = &(*p)->rb_left; | 3115 | p = &parent->rb_left; |
| 3112 | else if (inode->i_ino > entry->vfs_inode.i_ino) | 3116 | else if (inode->i_ino > entry->vfs_inode.i_ino) |
| 3113 | p = &(*p)->rb_right; | 3117 | p = &parent->rb_right; |
| 3114 | else { | 3118 | else { |
| 3115 | WARN_ON(!(entry->vfs_inode.i_state & | 3119 | WARN_ON(!(entry->vfs_inode.i_state & |
| 3116 | (I_WILL_FREE | I_FREEING | I_CLEAR))); | 3120 | (I_WILL_FREE | I_FREEING | I_CLEAR))); |
| 3117 | break; | 3121 | rb_erase(parent, &root->inode_tree); |
| 3122 | RB_CLEAR_NODE(parent); | ||
| 3123 | spin_unlock(&root->inode_lock); | ||
| 3124 | goto again; | ||
| 3118 | } | 3125 | } |
| 3119 | } | 3126 | } |
| 3120 | rb_link_node(&BTRFS_I(inode)->rb_node, parent, p); | 3127 | rb_link_node(&BTRFS_I(inode)->rb_node, parent, p); |
| @@ -3126,12 +3133,12 @@ static void inode_tree_del(struct inode *inode) | |||
| 3126 | { | 3133 | { |
| 3127 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3134 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 3128 | 3135 | ||
| 3136 | spin_lock(&root->inode_lock); | ||
| 3129 | if (!RB_EMPTY_NODE(&BTRFS_I(inode)->rb_node)) { | 3137 | if (!RB_EMPTY_NODE(&BTRFS_I(inode)->rb_node)) { |
| 3130 | spin_lock(&root->inode_lock); | ||
| 3131 | rb_erase(&BTRFS_I(inode)->rb_node, &root->inode_tree); | 3138 | rb_erase(&BTRFS_I(inode)->rb_node, &root->inode_tree); |
| 3132 | spin_unlock(&root->inode_lock); | ||
| 3133 | RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node); | 3139 | RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node); |
| 3134 | } | 3140 | } |
| 3141 | spin_unlock(&root->inode_lock); | ||
| 3135 | } | 3142 | } |
| 3136 | 3143 | ||
| 3137 | static noinline void init_btrfs_i(struct inode *inode) | 3144 | static noinline void init_btrfs_i(struct inode *inode) |
diff --git a/fs/buffer.c b/fs/buffer.c index a3ef091a45b..28f320fac4d 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -1165,8 +1165,11 @@ void mark_buffer_dirty(struct buffer_head *bh) | |||
| 1165 | 1165 | ||
| 1166 | if (!test_set_buffer_dirty(bh)) { | 1166 | if (!test_set_buffer_dirty(bh)) { |
| 1167 | struct page *page = bh->b_page; | 1167 | struct page *page = bh->b_page; |
| 1168 | if (!TestSetPageDirty(page)) | 1168 | if (!TestSetPageDirty(page)) { |
| 1169 | __set_page_dirty(page, page_mapping(page), 0); | 1169 | struct address_space *mapping = page_mapping(page); |
| 1170 | if (mapping) | ||
| 1171 | __set_page_dirty(page, mapping, 0); | ||
| 1172 | } | ||
| 1170 | } | 1173 | } |
| 1171 | } | 1174 | } |
| 1172 | 1175 | ||
diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h index f81c3232acc..2ba61e18fc8 100644 --- a/include/drm/radeon_drm.h +++ b/include/drm/radeon_drm.h | |||
| @@ -508,6 +508,7 @@ typedef struct { | |||
| 508 | #define DRM_RADEON_INFO 0x27 | 508 | #define DRM_RADEON_INFO 0x27 |
| 509 | #define DRM_RADEON_GEM_SET_TILING 0x28 | 509 | #define DRM_RADEON_GEM_SET_TILING 0x28 |
| 510 | #define DRM_RADEON_GEM_GET_TILING 0x29 | 510 | #define DRM_RADEON_GEM_GET_TILING 0x29 |
| 511 | #define DRM_RADEON_GEM_BUSY 0x2a | ||
| 511 | 512 | ||
| 512 | #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) | 513 | #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) |
| 513 | #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) | 514 | #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) |
| @@ -548,6 +549,7 @@ typedef struct { | |||
| 548 | #define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info) | 549 | #define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info) |
| 549 | #define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling) | 550 | #define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling) |
| 550 | #define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) | 551 | #define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) |
| 552 | #define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy) | ||
| 551 | 553 | ||
| 552 | typedef struct drm_radeon_init { | 554 | typedef struct drm_radeon_init { |
| 553 | enum { | 555 | enum { |
| @@ -707,6 +709,7 @@ typedef struct drm_radeon_indirect { | |||
| 707 | #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ | 709 | #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ |
| 708 | #define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ | 710 | #define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ |
| 709 | #define RADEON_PARAM_DEVICE_ID 16 | 711 | #define RADEON_PARAM_DEVICE_ID 16 |
| 712 | #define RADEON_PARAM_NUM_Z_PIPES 17 /* num Z pipes */ | ||
| 710 | 713 | ||
| 711 | typedef struct drm_radeon_getparam { | 714 | typedef struct drm_radeon_getparam { |
| 712 | int param; | 715 | int param; |
| @@ -895,6 +898,7 @@ struct drm_radeon_cs { | |||
| 895 | 898 | ||
| 896 | #define RADEON_INFO_DEVICE_ID 0x00 | 899 | #define RADEON_INFO_DEVICE_ID 0x00 |
| 897 | #define RADEON_INFO_NUM_GB_PIPES 0x01 | 900 | #define RADEON_INFO_NUM_GB_PIPES 0x01 |
| 901 | #define RADEON_INFO_NUM_Z_PIPES 0x02 | ||
| 898 | 902 | ||
| 899 | struct drm_radeon_info { | 903 | struct drm_radeon_info { |
| 900 | uint32_t request; | 904 | uint32_t request; |
diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h index 2878811c613..756d78b8c1c 100644 --- a/include/linux/bitmap.h +++ b/include/linux/bitmap.h | |||
| @@ -94,13 +94,13 @@ extern void __bitmap_shift_right(unsigned long *dst, | |||
| 94 | const unsigned long *src, int shift, int bits); | 94 | const unsigned long *src, int shift, int bits); |
| 95 | extern void __bitmap_shift_left(unsigned long *dst, | 95 | extern void __bitmap_shift_left(unsigned long *dst, |
| 96 | const unsigned long *src, int shift, int bits); | 96 | const unsigned long *src, int shift, int bits); |
| 97 | extern void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, | 97 | extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, |
| 98 | const unsigned long *bitmap2, int bits); | 98 | const unsigned long *bitmap2, int bits); |
| 99 | extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, | 99 | extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1, |
| 100 | const unsigned long *bitmap2, int bits); | 100 | const unsigned long *bitmap2, int bits); |
| 101 | extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, | 101 | extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, |
| 102 | const unsigned long *bitmap2, int bits); | 102 | const unsigned long *bitmap2, int bits); |
| 103 | extern void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, | 103 | extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, |
| 104 | const unsigned long *bitmap2, int bits); | 104 | const unsigned long *bitmap2, int bits); |
| 105 | extern int __bitmap_intersects(const unsigned long *bitmap1, | 105 | extern int __bitmap_intersects(const unsigned long *bitmap1, |
| 106 | const unsigned long *bitmap2, int bits); | 106 | const unsigned long *bitmap2, int bits); |
| @@ -171,13 +171,12 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src, | |||
| 171 | } | 171 | } |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | static inline void bitmap_and(unsigned long *dst, const unsigned long *src1, | 174 | static inline int bitmap_and(unsigned long *dst, const unsigned long *src1, |
| 175 | const unsigned long *src2, int nbits) | 175 | const unsigned long *src2, int nbits) |
| 176 | { | 176 | { |
| 177 | if (small_const_nbits(nbits)) | 177 | if (small_const_nbits(nbits)) |
| 178 | *dst = *src1 & *src2; | 178 | return (*dst = *src1 & *src2) != 0; |
| 179 | else | 179 | return __bitmap_and(dst, src1, src2, nbits); |
| 180 | __bitmap_and(dst, src1, src2, nbits); | ||
| 181 | } | 180 | } |
| 182 | 181 | ||
| 183 | static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, | 182 | static inline void bitmap_or(unsigned long *dst, const unsigned long *src1, |
| @@ -198,13 +197,12 @@ static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1, | |||
| 198 | __bitmap_xor(dst, src1, src2, nbits); | 197 | __bitmap_xor(dst, src1, src2, nbits); |
| 199 | } | 198 | } |
| 200 | 199 | ||
| 201 | static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1, | 200 | static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1, |
| 202 | const unsigned long *src2, int nbits) | 201 | const unsigned long *src2, int nbits) |
| 203 | { | 202 | { |
| 204 | if (small_const_nbits(nbits)) | 203 | if (small_const_nbits(nbits)) |
| 205 | *dst = *src1 & ~(*src2); | 204 | return (*dst = *src1 & ~(*src2)) != 0; |
| 206 | else | 205 | return __bitmap_andnot(dst, src1, src2, nbits); |
| 207 | __bitmap_andnot(dst, src1, src2, nbits); | ||
| 208 | } | 206 | } |
| 209 | 207 | ||
| 210 | static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, | 208 | static inline void bitmap_complement(unsigned long *dst, const unsigned long *src, |
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h index c5ac87ca7bc..796df12091b 100644 --- a/include/linux/cpumask.h +++ b/include/linux/cpumask.h | |||
| @@ -43,10 +43,10 @@ | |||
| 43 | * int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask | 43 | * int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask |
| 44 | * int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask | 44 | * int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask |
| 45 | * | 45 | * |
| 46 | * void cpus_and(dst, src1, src2) dst = src1 & src2 [intersection] | 46 | * int cpus_and(dst, src1, src2) dst = src1 & src2 [intersection] |
| 47 | * void cpus_or(dst, src1, src2) dst = src1 | src2 [union] | 47 | * void cpus_or(dst, src1, src2) dst = src1 | src2 [union] |
| 48 | * void cpus_xor(dst, src1, src2) dst = src1 ^ src2 | 48 | * void cpus_xor(dst, src1, src2) dst = src1 ^ src2 |
| 49 | * void cpus_andnot(dst, src1, src2) dst = src1 & ~src2 | 49 | * int cpus_andnot(dst, src1, src2) dst = src1 & ~src2 |
| 50 | * void cpus_complement(dst, src) dst = ~src | 50 | * void cpus_complement(dst, src) dst = ~src |
| 51 | * | 51 | * |
| 52 | * int cpus_equal(mask1, mask2) Does mask1 == mask2? | 52 | * int cpus_equal(mask1, mask2) Does mask1 == mask2? |
| @@ -179,10 +179,10 @@ static inline int __cpu_test_and_set(int cpu, cpumask_t *addr) | |||
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | #define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS) | 181 | #define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS) |
| 182 | static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p, | 182 | static inline int __cpus_and(cpumask_t *dstp, const cpumask_t *src1p, |
| 183 | const cpumask_t *src2p, int nbits) | 183 | const cpumask_t *src2p, int nbits) |
| 184 | { | 184 | { |
| 185 | bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits); | 185 | return bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | #define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS) | 188 | #define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS) |
| @@ -201,10 +201,10 @@ static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p, | |||
| 201 | 201 | ||
| 202 | #define cpus_andnot(dst, src1, src2) \ | 202 | #define cpus_andnot(dst, src1, src2) \ |
| 203 | __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS) | 203 | __cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS) |
| 204 | static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p, | 204 | static inline int __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p, |
| 205 | const cpumask_t *src2p, int nbits) | 205 | const cpumask_t *src2p, int nbits) |
| 206 | { | 206 | { |
| 207 | bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits); | 207 | return bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits); |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | #define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS) | 210 | #define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS) |
| @@ -738,11 +738,11 @@ static inline void cpumask_clear(struct cpumask *dstp) | |||
| 738 | * @src1p: the first input | 738 | * @src1p: the first input |
| 739 | * @src2p: the second input | 739 | * @src2p: the second input |
| 740 | */ | 740 | */ |
| 741 | static inline void cpumask_and(struct cpumask *dstp, | 741 | static inline int cpumask_and(struct cpumask *dstp, |
| 742 | const struct cpumask *src1p, | 742 | const struct cpumask *src1p, |
| 743 | const struct cpumask *src2p) | 743 | const struct cpumask *src2p) |
| 744 | { | 744 | { |
| 745 | bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p), | 745 | return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p), |
| 746 | cpumask_bits(src2p), nr_cpumask_bits); | 746 | cpumask_bits(src2p), nr_cpumask_bits); |
| 747 | } | 747 | } |
| 748 | 748 | ||
| @@ -779,11 +779,11 @@ static inline void cpumask_xor(struct cpumask *dstp, | |||
| 779 | * @src1p: the first input | 779 | * @src1p: the first input |
| 780 | * @src2p: the second input | 780 | * @src2p: the second input |
| 781 | */ | 781 | */ |
| 782 | static inline void cpumask_andnot(struct cpumask *dstp, | 782 | static inline int cpumask_andnot(struct cpumask *dstp, |
| 783 | const struct cpumask *src1p, | 783 | const struct cpumask *src1p, |
| 784 | const struct cpumask *src2p) | 784 | const struct cpumask *src2p) |
| 785 | { | 785 | { |
| 786 | bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p), | 786 | return bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p), |
| 787 | cpumask_bits(src2p), nr_cpumask_bits); | 787 | cpumask_bits(src2p), nr_cpumask_bits); |
| 788 | } | 788 | } |
| 789 | 789 | ||
diff --git a/lib/bitmap.c b/lib/bitmap.c index 35a1f7ff414..702565821c9 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c | |||
| @@ -179,14 +179,16 @@ void __bitmap_shift_left(unsigned long *dst, | |||
| 179 | } | 179 | } |
| 180 | EXPORT_SYMBOL(__bitmap_shift_left); | 180 | EXPORT_SYMBOL(__bitmap_shift_left); |
| 181 | 181 | ||
| 182 | void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, | 182 | int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1, |
| 183 | const unsigned long *bitmap2, int bits) | 183 | const unsigned long *bitmap2, int bits) |
| 184 | { | 184 | { |
| 185 | int k; | 185 | int k; |
| 186 | int nr = BITS_TO_LONGS(bits); | 186 | int nr = BITS_TO_LONGS(bits); |
| 187 | unsigned long result = 0; | ||
| 187 | 188 | ||
| 188 | for (k = 0; k < nr; k++) | 189 | for (k = 0; k < nr; k++) |
| 189 | dst[k] = bitmap1[k] & bitmap2[k]; | 190 | result |= (dst[k] = bitmap1[k] & bitmap2[k]); |
| 191 | return result != 0; | ||
| 190 | } | 192 | } |
| 191 | EXPORT_SYMBOL(__bitmap_and); | 193 | EXPORT_SYMBOL(__bitmap_and); |
| 192 | 194 | ||
| @@ -212,14 +214,16 @@ void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1, | |||
| 212 | } | 214 | } |
| 213 | EXPORT_SYMBOL(__bitmap_xor); | 215 | EXPORT_SYMBOL(__bitmap_xor); |
| 214 | 216 | ||
| 215 | void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, | 217 | int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1, |
| 216 | const unsigned long *bitmap2, int bits) | 218 | const unsigned long *bitmap2, int bits) |
| 217 | { | 219 | { |
| 218 | int k; | 220 | int k; |
| 219 | int nr = BITS_TO_LONGS(bits); | 221 | int nr = BITS_TO_LONGS(bits); |
| 222 | unsigned long result = 0; | ||
| 220 | 223 | ||
| 221 | for (k = 0; k < nr; k++) | 224 | for (k = 0; k < nr; k++) |
| 222 | dst[k] = bitmap1[k] & ~bitmap2[k]; | 225 | result |= (dst[k] = bitmap1[k] & ~bitmap2[k]); |
| 226 | return result != 0; | ||
| 223 | } | 227 | } |
| 224 | EXPORT_SYMBOL(__bitmap_andnot); | 228 | EXPORT_SYMBOL(__bitmap_andnot); |
| 225 | 229 | ||
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 3da85caf8af..403588c6e3f 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
| @@ -3835,9 +3835,11 @@ static struct hda_verb ad1884a_laptop_verbs[] = { | |||
| 3835 | /* Port-F (int speaker) mixer - route only from analog mixer */ | 3835 | /* Port-F (int speaker) mixer - route only from analog mixer */ |
| 3836 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, | 3836 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, |
| 3837 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | 3837 | {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
| 3838 | /* Port-F pin */ | 3838 | /* Port-F (int speaker) pin */ |
| 3839 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 3839 | {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
| 3840 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, | 3840 | {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, |
| 3841 | /* required for compaq 6530s/6531s speaker output */ | ||
| 3842 | {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 3841 | /* Port-C pin - internal mic-in */ | 3843 | /* Port-C pin - internal mic-in */ |
| 3842 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, | 3844 | {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, |
| 3843 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ | 3845 | {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */ |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index fea976793ae..6f683e451f2 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -12521,8 +12521,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
| 12521 | ALC268_TOSHIBA), | 12521 | ALC268_TOSHIBA), |
| 12522 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), | 12522 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), |
| 12523 | SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), | 12523 | SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), |
| 12524 | SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", | ||
| 12525 | ALC268_TOSHIBA), | ||
| 12526 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), | 12524 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), |
| 12527 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), | 12525 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), |
| 12528 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), | 12526 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), |
| @@ -12530,6 +12528,15 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
| 12530 | {} | 12528 | {} |
| 12531 | }; | 12529 | }; |
| 12532 | 12530 | ||
| 12531 | /* Toshiba laptops have no unique PCI SSID but only codec SSID */ | ||
| 12532 | static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = { | ||
| 12533 | SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO), | ||
| 12534 | SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO), | ||
| 12535 | SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", | ||
| 12536 | ALC268_TOSHIBA), | ||
| 12537 | {} | ||
| 12538 | }; | ||
| 12539 | |||
| 12533 | static struct alc_config_preset alc268_presets[] = { | 12540 | static struct alc_config_preset alc268_presets[] = { |
| 12534 | [ALC267_QUANTA_IL1] = { | 12541 | [ALC267_QUANTA_IL1] = { |
| 12535 | .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, | 12542 | .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, |
| @@ -12696,6 +12703,10 @@ static int patch_alc268(struct hda_codec *codec) | |||
| 12696 | alc268_models, | 12703 | alc268_models, |
| 12697 | alc268_cfg_tbl); | 12704 | alc268_cfg_tbl); |
| 12698 | 12705 | ||
| 12706 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) | ||
| 12707 | board_config = snd_hda_check_board_codec_sid_config(codec, | ||
| 12708 | ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl); | ||
| 12709 | |||
| 12699 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { | 12710 | if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { |
| 12700 | printk(KERN_INFO "hda_codec: Unknown model for %s, " | 12711 | printk(KERN_INFO "hda_codec: Unknown model for %s, " |
| 12701 | "trying auto-probe from BIOS...\n", codec->chip_name); | 12712 | "trying auto-probe from BIOS...\n", codec->chip_name); |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 456ef6ac12e..6990cfcb6a3 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -76,6 +76,7 @@ enum { | |||
| 76 | STAC_92HD73XX_AUTO, | 76 | STAC_92HD73XX_AUTO, |
| 77 | STAC_92HD73XX_NO_JD, /* no jack-detection */ | 77 | STAC_92HD73XX_NO_JD, /* no jack-detection */ |
| 78 | STAC_92HD73XX_REF, | 78 | STAC_92HD73XX_REF, |
| 79 | STAC_92HD73XX_INTEL, | ||
| 79 | STAC_DELL_M6_AMIC, | 80 | STAC_DELL_M6_AMIC, |
| 80 | STAC_DELL_M6_DMIC, | 81 | STAC_DELL_M6_DMIC, |
| 81 | STAC_DELL_M6_BOTH, | 82 | STAC_DELL_M6_BOTH, |
| @@ -1777,6 +1778,7 @@ static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { | |||
| 1777 | [STAC_92HD73XX_AUTO] = "auto", | 1778 | [STAC_92HD73XX_AUTO] = "auto", |
| 1778 | [STAC_92HD73XX_NO_JD] = "no-jd", | 1779 | [STAC_92HD73XX_NO_JD] = "no-jd", |
| 1779 | [STAC_92HD73XX_REF] = "ref", | 1780 | [STAC_92HD73XX_REF] = "ref", |
| 1781 | [STAC_92HD73XX_INTEL] = "intel", | ||
| 1780 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", | 1782 | [STAC_DELL_M6_AMIC] = "dell-m6-amic", |
| 1781 | [STAC_DELL_M6_DMIC] = "dell-m6-dmic", | 1783 | [STAC_DELL_M6_DMIC] = "dell-m6-dmic", |
| 1782 | [STAC_DELL_M6_BOTH] = "dell-m6", | 1784 | [STAC_DELL_M6_BOTH] = "dell-m6", |
| @@ -1789,6 +1791,10 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { | |||
| 1789 | "DFI LanParty", STAC_92HD73XX_REF), | 1791 | "DFI LanParty", STAC_92HD73XX_REF), |
| 1790 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | 1792 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, |
| 1791 | "DFI LanParty", STAC_92HD73XX_REF), | 1793 | "DFI LanParty", STAC_92HD73XX_REF), |
| 1794 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002, | ||
| 1795 | "Intel DG45ID", STAC_92HD73XX_INTEL), | ||
| 1796 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003, | ||
| 1797 | "Intel DG45FC", STAC_92HD73XX_INTEL), | ||
| 1792 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, | 1798 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, |
| 1793 | "Dell Studio 1535", STAC_DELL_M6_DMIC), | 1799 | "Dell Studio 1535", STAC_DELL_M6_DMIC), |
| 1794 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, | 1800 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, |
