Merge branch 'master' into for-linus
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 31
|
SUBLEVEL = 31
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION = -rc7
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|||||||
@@ -106,6 +106,9 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)
|
|||||||
unsigned long mask = cpumask_bits(cpumask)[0];
|
unsigned long mask = cpumask_bits(cpumask)[0];
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (WARN_ONCE(!mask, "empty IPI mask"))
|
||||||
|
return;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]);
|
WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]);
|
||||||
__default_send_IPI_dest_field(mask, vector, apic->dest_logical);
|
__default_send_IPI_dest_field(mask, vector, apic->dest_logical);
|
||||||
|
|||||||
+2
-3
@@ -183,9 +183,7 @@ static void flush_tlb_others_ipi(const struct cpumask *cpumask,
|
|||||||
|
|
||||||
f->flush_mm = mm;
|
f->flush_mm = mm;
|
||||||
f->flush_va = va;
|
f->flush_va = va;
|
||||||
cpumask_andnot(to_cpumask(f->flush_cpumask),
|
if (cpumask_andnot(to_cpumask(f->flush_cpumask), cpumask, cpumask_of(smp_processor_id()))) {
|
||||||
cpumask, cpumask_of(smp_processor_id()));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have to send the IPI only to
|
* We have to send the IPI only to
|
||||||
* CPUs affected.
|
* CPUs affected.
|
||||||
@@ -195,6 +193,7 @@ static void flush_tlb_others_ipi(const struct cpumask *cpumask,
|
|||||||
|
|
||||||
while (!cpumask_empty(to_cpumask(f->flush_cpumask)))
|
while (!cpumask_empty(to_cpumask(f->flush_cpumask)))
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
f->flush_mm = NULL;
|
f->flush_mm = NULL;
|
||||||
f->flush_va = 0;
|
f->flush_va = 0;
|
||||||
|
|||||||
@@ -22,16 +22,21 @@
|
|||||||
#define to_drm_minor(d) container_of(d, struct drm_minor, kdev)
|
#define to_drm_minor(d) container_of(d, struct drm_minor, kdev)
|
||||||
#define to_drm_connector(d) container_of(d, struct drm_connector, kdev)
|
#define to_drm_connector(d) container_of(d, struct drm_connector, kdev)
|
||||||
|
|
||||||
|
static struct device_type drm_sysfs_device_minor = {
|
||||||
|
.name = "drm_minor"
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_sysfs_suspend - DRM class suspend hook
|
* drm_class_suspend - DRM class suspend hook
|
||||||
* @dev: Linux device to suspend
|
* @dev: Linux device to suspend
|
||||||
* @state: power state to enter
|
* @state: power state to enter
|
||||||
*
|
*
|
||||||
* Just figures out what the actual struct drm_device associated with
|
* Just figures out what the actual struct drm_device associated with
|
||||||
* @dev is and calls its suspend hook, if present.
|
* @dev is and calls its suspend hook, if present.
|
||||||
*/
|
*/
|
||||||
static int drm_sysfs_suspend(struct device *dev, pm_message_t state)
|
static int drm_class_suspend(struct device *dev, pm_message_t state)
|
||||||
{
|
{
|
||||||
|
if (dev->type == &drm_sysfs_device_minor) {
|
||||||
struct drm_minor *drm_minor = to_drm_minor(dev);
|
struct drm_minor *drm_minor = to_drm_minor(dev);
|
||||||
struct drm_device *drm_dev = drm_minor->dev;
|
struct drm_device *drm_dev = drm_minor->dev;
|
||||||
|
|
||||||
@@ -39,19 +44,20 @@ static int drm_sysfs_suspend(struct device *dev, pm_message_t state)
|
|||||||
!drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
|
!drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
|
||||||
drm_dev->driver->suspend)
|
drm_dev->driver->suspend)
|
||||||
return drm_dev->driver->suspend(drm_dev, state);
|
return drm_dev->driver->suspend(drm_dev, state);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_sysfs_resume - DRM class resume hook
|
* drm_class_resume - DRM class resume hook
|
||||||
* @dev: Linux device to resume
|
* @dev: Linux device to resume
|
||||||
*
|
*
|
||||||
* Just figures out what the actual struct drm_device associated with
|
* Just figures out what the actual struct drm_device associated with
|
||||||
* @dev is and calls its resume hook, if present.
|
* @dev is and calls its resume hook, if present.
|
||||||
*/
|
*/
|
||||||
static int drm_sysfs_resume(struct device *dev)
|
static int drm_class_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
|
if (dev->type == &drm_sysfs_device_minor) {
|
||||||
struct drm_minor *drm_minor = to_drm_minor(dev);
|
struct drm_minor *drm_minor = to_drm_minor(dev);
|
||||||
struct drm_device *drm_dev = drm_minor->dev;
|
struct drm_device *drm_dev = drm_minor->dev;
|
||||||
|
|
||||||
@@ -59,7 +65,7 @@ static int drm_sysfs_resume(struct device *dev)
|
|||||||
!drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
|
!drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
|
||||||
drm_dev->driver->resume)
|
drm_dev->driver->resume)
|
||||||
return drm_dev->driver->resume(drm_dev);
|
return drm_dev->driver->resume(drm_dev);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,8 +105,8 @@ struct class *drm_sysfs_create(struct module *owner, char *name)
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
class->suspend = drm_sysfs_suspend;
|
class->suspend = drm_class_suspend;
|
||||||
class->resume = drm_sysfs_resume;
|
class->resume = drm_class_resume;
|
||||||
|
|
||||||
err = class_create_file(class, &class_attr_version);
|
err = class_create_file(class, &class_attr_version);
|
||||||
if (err)
|
if (err)
|
||||||
@@ -480,6 +486,7 @@ int drm_sysfs_device_add(struct drm_minor *minor)
|
|||||||
minor->kdev.class = drm_class;
|
minor->kdev.class = drm_class;
|
||||||
minor->kdev.release = drm_sysfs_device_release;
|
minor->kdev.release = drm_sysfs_device_release;
|
||||||
minor->kdev.devt = minor->device;
|
minor->kdev.devt = minor->device;
|
||||||
|
minor->kdev.type = &drm_sysfs_device_minor;
|
||||||
if (minor->type == DRM_MINOR_CONTROL)
|
if (minor->type == DRM_MINOR_CONTROL)
|
||||||
minor_str = "controlD%d";
|
minor_str = "controlD%d";
|
||||||
else if (minor->type == DRM_MINOR_RENDER)
|
else if (minor->type == DRM_MINOR_RENDER)
|
||||||
|
|||||||
@@ -1091,6 +1091,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
|
|||||||
tmp |= tile_flags;
|
tmp |= tile_flags;
|
||||||
ib[idx] = tmp;
|
ib[idx] = tmp;
|
||||||
break;
|
break;
|
||||||
|
case RADEON_RB3D_ZPASS_ADDR:
|
||||||
|
r = r100_cs_packet_next_reloc(p, &reloc);
|
||||||
|
if (r) {
|
||||||
|
DRM_ERROR("No reloc for ib[%d]=0x%04X\n",
|
||||||
|
idx, reg);
|
||||||
|
r100_cs_dump_packet(p, pkt);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* FIXME: we don't want to allow anyothers packet */
|
/* FIXME: we don't want to allow anyothers packet */
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -448,6 +448,7 @@ void r300_gpu_init(struct radeon_device *rdev)
|
|||||||
/* rv350,rv370,rv380 */
|
/* rv350,rv370,rv380 */
|
||||||
rdev->num_gb_pipes = 1;
|
rdev->num_gb_pipes = 1;
|
||||||
}
|
}
|
||||||
|
rdev->num_z_pipes = 1;
|
||||||
gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16);
|
gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16);
|
||||||
switch (rdev->num_gb_pipes) {
|
switch (rdev->num_gb_pipes) {
|
||||||
case 2:
|
case 2:
|
||||||
@@ -486,7 +487,8 @@ void r300_gpu_init(struct radeon_device *rdev)
|
|||||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||||
"programming pipes. Bad things might happen.\n");
|
"programming pipes. Bad things might happen.\n");
|
||||||
}
|
}
|
||||||
DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes);
|
DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n",
|
||||||
|
rdev->num_gb_pipes, rdev->num_z_pipes);
|
||||||
}
|
}
|
||||||
|
|
||||||
int r300_ga_reset(struct radeon_device *rdev)
|
int r300_ga_reset(struct radeon_device *rdev)
|
||||||
|
|||||||
@@ -165,7 +165,18 @@ void r420_pipes_init(struct radeon_device *rdev)
|
|||||||
printk(KERN_WARNING "Failed to wait GUI idle while "
|
printk(KERN_WARNING "Failed to wait GUI idle while "
|
||||||
"programming pipes. Bad things might happen.\n");
|
"programming pipes. Bad things might happen.\n");
|
||||||
}
|
}
|
||||||
DRM_INFO("radeon: %d pipes initialized.\n", rdev->num_gb_pipes);
|
|
||||||
|
if (rdev->family == CHIP_RV530) {
|
||||||
|
tmp = RREG32(RV530_GB_PIPE_SELECT2);
|
||||||
|
if ((tmp & 3) == 3)
|
||||||
|
rdev->num_z_pipes = 2;
|
||||||
|
else
|
||||||
|
rdev->num_z_pipes = 1;
|
||||||
|
} else
|
||||||
|
rdev->num_z_pipes = 1;
|
||||||
|
|
||||||
|
DRM_INFO("radeon: %d quad pipes, %d z pipes initialized.\n",
|
||||||
|
rdev->num_gb_pipes, rdev->num_z_pipes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void r420_gpu_init(struct radeon_device *rdev)
|
void r420_gpu_init(struct radeon_device *rdev)
|
||||||
|
|||||||
@@ -177,7 +177,6 @@ void r520_gpu_init(struct radeon_device *rdev)
|
|||||||
*/
|
*/
|
||||||
/* workaround for RV530 */
|
/* workaround for RV530 */
|
||||||
if (rdev->family == CHIP_RV530) {
|
if (rdev->family == CHIP_RV530) {
|
||||||
WREG32(0x4124, 1);
|
|
||||||
WREG32(0x4128, 0xFF);
|
WREG32(0x4128, 0xFF);
|
||||||
}
|
}
|
||||||
r420_pipes_init(rdev);
|
r420_pipes_init(rdev);
|
||||||
|
|||||||
@@ -655,6 +655,7 @@ struct radeon_device {
|
|||||||
int usec_timeout;
|
int usec_timeout;
|
||||||
enum radeon_pll_errata pll_errata;
|
enum radeon_pll_errata pll_errata;
|
||||||
int num_gb_pipes;
|
int num_gb_pipes;
|
||||||
|
int num_z_pipes;
|
||||||
int disp_priority;
|
int disp_priority;
|
||||||
/* BIOS */
|
/* BIOS */
|
||||||
uint8_t *bios;
|
uint8_t *bios;
|
||||||
|
|||||||
@@ -406,6 +406,15 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
|
|||||||
{
|
{
|
||||||
uint32_t gb_tile_config, gb_pipe_sel = 0;
|
uint32_t gb_tile_config, gb_pipe_sel = 0;
|
||||||
|
|
||||||
|
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) {
|
||||||
|
uint32_t z_pipe_sel = RADEON_READ(RV530_GB_PIPE_SELECT2);
|
||||||
|
if ((z_pipe_sel & 3) == 3)
|
||||||
|
dev_priv->num_z_pipes = 2;
|
||||||
|
else
|
||||||
|
dev_priv->num_z_pipes = 1;
|
||||||
|
} else
|
||||||
|
dev_priv->num_z_pipes = 1;
|
||||||
|
|
||||||
/* RS4xx/RS6xx/R4xx/R5xx */
|
/* RS4xx/RS6xx/R4xx/R5xx */
|
||||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) {
|
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R420) {
|
||||||
gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT);
|
gb_pipe_sel = RADEON_READ(R400_GB_PIPE_SELECT);
|
||||||
|
|||||||
@@ -100,9 +100,10 @@
|
|||||||
* 1.28- Add support for VBL on CRTC2
|
* 1.28- Add support for VBL on CRTC2
|
||||||
* 1.29- R500 3D cmd buffer support
|
* 1.29- R500 3D cmd buffer support
|
||||||
* 1.30- Add support for occlusion queries
|
* 1.30- Add support for occlusion queries
|
||||||
|
* 1.31- Add support for num Z pipes from GET_PARAM
|
||||||
*/
|
*/
|
||||||
#define DRIVER_MAJOR 1
|
#define DRIVER_MAJOR 1
|
||||||
#define DRIVER_MINOR 30
|
#define DRIVER_MINOR 31
|
||||||
#define DRIVER_PATCHLEVEL 0
|
#define DRIVER_PATCHLEVEL 0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -329,6 +330,7 @@ typedef struct drm_radeon_private {
|
|||||||
resource_size_t fb_aper_offset;
|
resource_size_t fb_aper_offset;
|
||||||
|
|
||||||
int num_gb_pipes;
|
int num_gb_pipes;
|
||||||
|
int num_z_pipes;
|
||||||
int track_flush;
|
int track_flush;
|
||||||
drm_local_map_t *mmio;
|
drm_local_map_t *mmio;
|
||||||
|
|
||||||
@@ -689,6 +691,7 @@ extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pciga
|
|||||||
|
|
||||||
/* pipe config regs */
|
/* pipe config regs */
|
||||||
#define R400_GB_PIPE_SELECT 0x402c
|
#define R400_GB_PIPE_SELECT 0x402c
|
||||||
|
#define RV530_GB_PIPE_SELECT2 0x4124
|
||||||
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */
|
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */
|
||||||
#define R300_GB_TILE_CONFIG 0x4018
|
#define R300_GB_TILE_CONFIG 0x4018
|
||||||
# define R300_ENABLE_TILING (1 << 0)
|
# define R300_ENABLE_TILING (1 << 0)
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
|
|||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
drm_gem_object_unreference(gobj);
|
drm_gem_object_unreference(gobj);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
return 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
|
int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
|
||||||
|
|||||||
@@ -95,6 +95,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
|||||||
case RADEON_INFO_NUM_GB_PIPES:
|
case RADEON_INFO_NUM_GB_PIPES:
|
||||||
value = rdev->num_gb_pipes;
|
value = rdev->num_gb_pipes;
|
||||||
break;
|
break;
|
||||||
|
case RADEON_INFO_NUM_Z_PIPES:
|
||||||
|
value = rdev->num_z_pipes;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_DEBUG("Invalid request %d\n", info->request);
|
DRM_DEBUG("Invalid request %d\n", info->request);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -318,5 +321,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = {
|
|||||||
DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH),
|
DRM_IOCTL_DEF(DRM_RADEON_INFO, radeon_info_ioctl, DRM_AUTH),
|
||||||
DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH),
|
DRM_IOCTL_DEF(DRM_RADEON_GEM_SET_TILING, radeon_gem_set_tiling_ioctl, DRM_AUTH),
|
||||||
DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH),
|
DRM_IOCTL_DEF(DRM_RADEON_GEM_GET_TILING, radeon_gem_get_tiling_ioctl, DRM_AUTH),
|
||||||
|
DRM_IOCTL_DEF(DRM_RADEON_GEM_BUSY, radeon_gem_busy_ioctl, DRM_AUTH),
|
||||||
};
|
};
|
||||||
int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms);
|
int radeon_max_kms_ioctl = DRM_ARRAY_SIZE(radeon_ioctls_kms);
|
||||||
|
|||||||
@@ -2337,6 +2337,9 @@
|
|||||||
# define RADEON_RE_WIDTH_SHIFT 0
|
# define RADEON_RE_WIDTH_SHIFT 0
|
||||||
# define RADEON_RE_HEIGHT_SHIFT 16
|
# define RADEON_RE_HEIGHT_SHIFT 16
|
||||||
|
|
||||||
|
#define RADEON_RB3D_ZPASS_DATA 0x3290
|
||||||
|
#define RADEON_RB3D_ZPASS_ADDR 0x3294
|
||||||
|
|
||||||
#define RADEON_SE_CNTL 0x1c4c
|
#define RADEON_SE_CNTL 0x1c4c
|
||||||
# define RADEON_FFACE_CULL_CW (0 << 0)
|
# define RADEON_FFACE_CULL_CW (0 << 0)
|
||||||
# define RADEON_FFACE_CULL_CCW (1 << 0)
|
# define RADEON_FFACE_CULL_CCW (1 << 0)
|
||||||
@@ -3571,4 +3574,6 @@
|
|||||||
#define RADEON_SCRATCH_REG4 0x15f0
|
#define RADEON_SCRATCH_REG4 0x15f0
|
||||||
#define RADEON_SCRATCH_REG5 0x15f4
|
#define RADEON_SCRATCH_REG5 0x15f4
|
||||||
|
|
||||||
|
#define RV530_GB_PIPE_SELECT2 0x4124
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3081,6 +3081,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
|
|||||||
case RADEON_PARAM_NUM_GB_PIPES:
|
case RADEON_PARAM_NUM_GB_PIPES:
|
||||||
value = dev_priv->num_gb_pipes;
|
value = dev_priv->num_gb_pipes;
|
||||||
break;
|
break;
|
||||||
|
case RADEON_PARAM_NUM_Z_PIPES:
|
||||||
|
value = dev_priv->num_z_pipes;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_DEBUG("Invalid parameter %d\n", param->param);
|
DRM_DEBUG("Invalid parameter %d\n", param->param);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|||||||
@@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id)
|
|||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
complete:
|
complete:
|
||||||
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat);
|
/*
|
||||||
|
* Ack the stat in one go, but [R/X]DR and [R/X]RDY should be
|
||||||
|
* acked after the data operation is complete.
|
||||||
|
* Ref: TRM SWPU114Q Figure 18-31
|
||||||
|
*/
|
||||||
|
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat &
|
||||||
|
~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
|
||||||
|
OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
|
||||||
|
|
||||||
if (stat & OMAP_I2C_STAT_NACK) {
|
if (stat & OMAP_I2C_STAT_NACK) {
|
||||||
err |= OMAP_I2C_STAT_NACK;
|
err |= OMAP_I2C_STAT_NACK;
|
||||||
@@ -687,6 +694,9 @@ complete:
|
|||||||
}
|
}
|
||||||
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
||||||
OMAP_I2C_STAT_AL)) {
|
OMAP_I2C_STAT_AL)) {
|
||||||
|
omap_i2c_ack_stat(dev, stat &
|
||||||
|
(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
|
||||||
|
OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
|
||||||
omap_i2c_complete_cmd(dev, err);
|
omap_i2c_complete_cmd(dev, err);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
@@ -774,7 +784,7 @@ complete:
|
|||||||
* memory to the I2C interface.
|
* memory to the I2C interface.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (cpu_is_omap34xx()) {
|
if (dev->rev <= OMAP_I2C_REV_ON_3430) {
|
||||||
while (!(stat & OMAP_I2C_STAT_XUDF)) {
|
while (!(stat & OMAP_I2C_STAT_XUDF)) {
|
||||||
if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
|
if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
|
||||||
omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
|
omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
|
||||||
|
|||||||
@@ -117,7 +117,8 @@ enum stu300_error {
|
|||||||
STU300_ERROR_NONE = 0,
|
STU300_ERROR_NONE = 0,
|
||||||
STU300_ERROR_ACKNOWLEDGE_FAILURE,
|
STU300_ERROR_ACKNOWLEDGE_FAILURE,
|
||||||
STU300_ERROR_BUS_ERROR,
|
STU300_ERROR_BUS_ERROR,
|
||||||
STU300_ERROR_ARBITRATION_LOST
|
STU300_ERROR_ARBITRATION_LOST,
|
||||||
|
STU300_ERROR_UNKNOWN
|
||||||
};
|
};
|
||||||
|
|
||||||
/* timeout waiting for the controller to respond */
|
/* timeout waiting for the controller to respond */
|
||||||
@@ -127,7 +128,7 @@ enum stu300_error {
|
|||||||
* The number of address send athemps tried before giving up.
|
* The number of address send athemps tried before giving up.
|
||||||
* If the first one failes it seems like 5 to 8 attempts are required.
|
* If the first one failes it seems like 5 to 8 attempts are required.
|
||||||
*/
|
*/
|
||||||
#define NUM_ADDR_RESEND_ATTEMPTS 10
|
#define NUM_ADDR_RESEND_ATTEMPTS 12
|
||||||
|
|
||||||
/* I2C clock speed, in Hz 0-400kHz*/
|
/* I2C clock speed, in Hz 0-400kHz*/
|
||||||
static unsigned int scl_frequency = 100000;
|
static unsigned int scl_frequency = 100000;
|
||||||
@@ -149,6 +150,7 @@ module_param(scl_frequency, uint, 0644);
|
|||||||
* @msg_index: index of current message
|
* @msg_index: index of current message
|
||||||
* @msg_len: length of current message
|
* @msg_len: length of current message
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct stu300_dev {
|
struct stu300_dev {
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
struct i2c_adapter adapter;
|
struct i2c_adapter adapter;
|
||||||
@@ -188,6 +190,27 @@ static inline u32 stu300_r8(void __iomem *address)
|
|||||||
return readl(address) & 0x000000FFU;
|
return readl(address) & 0x000000FFU;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void stu300_irq_enable(struct stu300_dev *dev)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
val = stu300_r8(dev->virtbase + I2C_CR);
|
||||||
|
val |= I2C_CR_INTERRUPT_ENABLE;
|
||||||
|
/* Twice paranoia (possible HW glitch) */
|
||||||
|
stu300_wr8(val, dev->virtbase + I2C_CR);
|
||||||
|
stu300_wr8(val, dev->virtbase + I2C_CR);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void stu300_irq_disable(struct stu300_dev *dev)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
val = stu300_r8(dev->virtbase + I2C_CR);
|
||||||
|
val &= ~I2C_CR_INTERRUPT_ENABLE;
|
||||||
|
/* Twice paranoia (possible HW glitch) */
|
||||||
|
stu300_wr8(val, dev->virtbase + I2C_CR);
|
||||||
|
stu300_wr8(val, dev->virtbase + I2C_CR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tells whether a certain event or events occurred in
|
* Tells whether a certain event or events occurred in
|
||||||
* response to a command. The events represent states in
|
* response to a command. The events represent states in
|
||||||
@@ -196,9 +219,10 @@ static inline u32 stu300_r8(void __iomem *address)
|
|||||||
* documentation and can only be treated as abstract state
|
* documentation and can only be treated as abstract state
|
||||||
* machine states.
|
* machine states.
|
||||||
*
|
*
|
||||||
* @ret 0 = event has not occurred, any other value means
|
* @ret 0 = event has not occurred or unknown error, any
|
||||||
* the event occurred.
|
* other value means the correct event occurred or an error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int stu300_event_occurred(struct stu300_dev *dev,
|
static int stu300_event_occurred(struct stu300_dev *dev,
|
||||||
enum stu300_event mr_event) {
|
enum stu300_event mr_event) {
|
||||||
u32 status1;
|
u32 status1;
|
||||||
@@ -206,11 +230,28 @@ static int stu300_event_occurred(struct stu300_dev *dev,
|
|||||||
|
|
||||||
/* What event happened? */
|
/* What event happened? */
|
||||||
status1 = stu300_r8(dev->virtbase + I2C_SR1);
|
status1 = stu300_r8(dev->virtbase + I2C_SR1);
|
||||||
|
|
||||||
if (!(status1 & I2C_SR1_EVF_IND))
|
if (!(status1 & I2C_SR1_EVF_IND))
|
||||||
/* No event at all */
|
/* No event at all */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
status2 = stu300_r8(dev->virtbase + I2C_SR2);
|
status2 = stu300_r8(dev->virtbase + I2C_SR2);
|
||||||
|
|
||||||
|
/* Block any multiple interrupts */
|
||||||
|
stu300_irq_disable(dev);
|
||||||
|
|
||||||
|
/* Check for errors first */
|
||||||
|
if (status2 & I2C_SR2_AF_IND) {
|
||||||
|
dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE;
|
||||||
|
return 1;
|
||||||
|
} else if (status2 & I2C_SR2_BERR_IND) {
|
||||||
|
dev->cmd_err = STU300_ERROR_BUS_ERROR;
|
||||||
|
return 1;
|
||||||
|
} else if (status2 & I2C_SR2_ARLO_IND) {
|
||||||
|
dev->cmd_err = STU300_ERROR_ARBITRATION_LOST;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
switch (mr_event) {
|
switch (mr_event) {
|
||||||
case STU300_EVENT_1:
|
case STU300_EVENT_1:
|
||||||
if (status1 & I2C_SR1_ADSL_IND)
|
if (status1 & I2C_SR1_ADSL_IND)
|
||||||
@@ -221,10 +262,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
|
|||||||
case STU300_EVENT_7:
|
case STU300_EVENT_7:
|
||||||
case STU300_EVENT_8:
|
case STU300_EVENT_8:
|
||||||
if (status1 & I2C_SR1_BTF_IND) {
|
if (status1 & I2C_SR1_BTF_IND) {
|
||||||
if (status2 & I2C_SR2_AF_IND)
|
|
||||||
dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE;
|
|
||||||
else if (status2 & I2C_SR2_BERR_IND)
|
|
||||||
dev->cmd_err = STU300_ERROR_BUS_ERROR;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -240,8 +277,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
|
|||||||
case STU300_EVENT_6:
|
case STU300_EVENT_6:
|
||||||
if (status2 & I2C_SR2_ENDAD_IND) {
|
if (status2 & I2C_SR2_ENDAD_IND) {
|
||||||
/* First check for any errors */
|
/* First check for any errors */
|
||||||
if (status2 & I2C_SR2_AF_IND)
|
|
||||||
dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -252,8 +287,15 @@ static int stu300_event_occurred(struct stu300_dev *dev,
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (status2 & I2C_SR2_ARLO_IND)
|
/* If we get here, we're on thin ice.
|
||||||
dev->cmd_err = STU300_ERROR_ARBITRATION_LOST;
|
* Here we are in a status where we have
|
||||||
|
* gotten a response that does not match
|
||||||
|
* what we requested.
|
||||||
|
*/
|
||||||
|
dev->cmd_err = STU300_ERROR_UNKNOWN;
|
||||||
|
dev_err(&dev->pdev->dev,
|
||||||
|
"Unhandled interrupt! %d sr1: 0x%x sr2: 0x%x\n",
|
||||||
|
mr_event, status1, status2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,21 +304,20 @@ static irqreturn_t stu300_irh(int irq, void *data)
|
|||||||
struct stu300_dev *dev = data;
|
struct stu300_dev *dev = data;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
/* Just make sure that the block is clocked */
|
||||||
|
clk_enable(dev->clk);
|
||||||
|
|
||||||
/* See if this was what we were waiting for */
|
/* See if this was what we were waiting for */
|
||||||
spin_lock(&dev->cmd_issue_lock);
|
spin_lock(&dev->cmd_issue_lock);
|
||||||
if (dev->cmd_event != STU300_EVENT_NONE) {
|
|
||||||
res = stu300_event_occurred(dev, dev->cmd_event);
|
|
||||||
if (res || dev->cmd_err != STU300_ERROR_NONE) {
|
|
||||||
u32 val;
|
|
||||||
|
|
||||||
|
res = stu300_event_occurred(dev, dev->cmd_event);
|
||||||
|
if (res || dev->cmd_err != STU300_ERROR_NONE)
|
||||||
complete(&dev->cmd_complete);
|
complete(&dev->cmd_complete);
|
||||||
/* Block any multiple interrupts */
|
|
||||||
val = stu300_r8(dev->virtbase + I2C_CR);
|
|
||||||
val &= ~I2C_CR_INTERRUPT_ENABLE;
|
|
||||||
stu300_wr8(val, dev->virtbase + I2C_CR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_unlock(&dev->cmd_issue_lock);
|
spin_unlock(&dev->cmd_issue_lock);
|
||||||
|
|
||||||
|
clk_disable(dev->clk);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,7 +349,6 @@ static int stu300_start_and_await_event(struct stu300_dev *dev,
|
|||||||
stu300_wr8(cr_value, dev->virtbase + I2C_CR);
|
stu300_wr8(cr_value, dev->virtbase + I2C_CR);
|
||||||
ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
|
ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
|
||||||
STU300_TIMEOUT);
|
STU300_TIMEOUT);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&dev->pdev->dev,
|
dev_err(&dev->pdev->dev,
|
||||||
"wait_for_completion_interruptible_timeout() "
|
"wait_for_completion_interruptible_timeout() "
|
||||||
@@ -342,7 +382,6 @@ static int stu300_await_event(struct stu300_dev *dev,
|
|||||||
enum stu300_event mr_event)
|
enum stu300_event mr_event)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
u32 val;
|
|
||||||
|
|
||||||
if (unlikely(irqs_disabled())) {
|
if (unlikely(irqs_disabled())) {
|
||||||
/* TODO: implement polling for this case if need be. */
|
/* TODO: implement polling for this case if need be. */
|
||||||
@@ -354,36 +393,18 @@ static int stu300_await_event(struct stu300_dev *dev,
|
|||||||
/* Is it already here? */
|
/* Is it already here? */
|
||||||
spin_lock_irq(&dev->cmd_issue_lock);
|
spin_lock_irq(&dev->cmd_issue_lock);
|
||||||
dev->cmd_err = STU300_ERROR_NONE;
|
dev->cmd_err = STU300_ERROR_NONE;
|
||||||
if (stu300_event_occurred(dev, mr_event)) {
|
|
||||||
spin_unlock_irq(&dev->cmd_issue_lock);
|
|
||||||
goto exit_await_check_err;
|
|
||||||
}
|
|
||||||
init_completion(&dev->cmd_complete);
|
|
||||||
dev->cmd_err = STU300_ERROR_NONE;
|
|
||||||
dev->cmd_event = mr_event;
|
dev->cmd_event = mr_event;
|
||||||
|
|
||||||
|
init_completion(&dev->cmd_complete);
|
||||||
|
|
||||||
/* Turn on the I2C interrupt for current operation */
|
/* Turn on the I2C interrupt for current operation */
|
||||||
val = stu300_r8(dev->virtbase + I2C_CR);
|
stu300_irq_enable(dev);
|
||||||
val |= I2C_CR_INTERRUPT_ENABLE;
|
|
||||||
stu300_wr8(val, dev->virtbase + I2C_CR);
|
|
||||||
|
|
||||||
/* Twice paranoia (possible HW glitch) */
|
|
||||||
stu300_wr8(val, dev->virtbase + I2C_CR);
|
|
||||||
|
|
||||||
/* Check again: is it already here? */
|
|
||||||
if (unlikely(stu300_event_occurred(dev, mr_event))) {
|
|
||||||
/* Disable IRQ again. */
|
|
||||||
val &= ~I2C_CR_INTERRUPT_ENABLE;
|
|
||||||
stu300_wr8(val, dev->virtbase + I2C_CR);
|
|
||||||
spin_unlock_irq(&dev->cmd_issue_lock);
|
|
||||||
goto exit_await_check_err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unlock the command block and wait for the event to occur */
|
/* Unlock the command block and wait for the event to occur */
|
||||||
spin_unlock_irq(&dev->cmd_issue_lock);
|
spin_unlock_irq(&dev->cmd_issue_lock);
|
||||||
|
|
||||||
ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
|
ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete,
|
||||||
STU300_TIMEOUT);
|
STU300_TIMEOUT);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&dev->pdev->dev,
|
dev_err(&dev->pdev->dev,
|
||||||
"wait_for_completion_interruptible_timeout()"
|
"wait_for_completion_interruptible_timeout()"
|
||||||
@@ -401,7 +422,6 @@ static int stu300_await_event(struct stu300_dev *dev,
|
|||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
exit_await_check_err:
|
|
||||||
if (dev->cmd_err != STU300_ERROR_NONE) {
|
if (dev->cmd_err != STU300_ERROR_NONE) {
|
||||||
if (mr_event != STU300_EVENT_6) {
|
if (mr_event != STU300_EVENT_6) {
|
||||||
dev_err(&dev->pdev->dev, "controller "
|
dev_err(&dev->pdev->dev, "controller "
|
||||||
@@ -469,6 +489,7 @@ static const struct stu300_clkset stu300_clktable[] = {
|
|||||||
{ 100000000, 0xFFU },
|
{ 100000000, 0xFFU },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
|
static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -494,10 +515,10 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
|
|||||||
|
|
||||||
if (dev->speed > 100000)
|
if (dev->speed > 100000)
|
||||||
/* Fast Mode I2C */
|
/* Fast Mode I2C */
|
||||||
val = ((clkrate/dev->speed)-9)/3;
|
val = ((clkrate/dev->speed) - 9)/3 + 1;
|
||||||
else
|
else
|
||||||
/* Standard Mode I2C */
|
/* Standard Mode I2C */
|
||||||
val = ((clkrate/dev->speed)-7)/2;
|
val = ((clkrate/dev->speed) - 7)/2 + 1;
|
||||||
|
|
||||||
/* According to spec the divider must be > 2 */
|
/* According to spec the divider must be > 2 */
|
||||||
if (val < 0x002) {
|
if (val < 0x002) {
|
||||||
@@ -557,6 +578,7 @@ static int stu300_init_hw(struct stu300_dev *dev)
|
|||||||
*/
|
*/
|
||||||
clkrate = clk_get_rate(dev->clk);
|
clkrate = clk_get_rate(dev->clk);
|
||||||
ret = stu300_set_clk(dev, clkrate);
|
ret = stu300_set_clk(dev, clkrate);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
/*
|
/*
|
||||||
@@ -641,7 +663,6 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
|
|||||||
int attempts = 0;
|
int attempts = 0;
|
||||||
struct stu300_dev *dev = i2c_get_adapdata(adap);
|
struct stu300_dev *dev = i2c_get_adapdata(adap);
|
||||||
|
|
||||||
|
|
||||||
clk_enable(dev->clk);
|
clk_enable(dev->clk);
|
||||||
|
|
||||||
/* Remove this if (0) to trace each and every message. */
|
/* Remove this if (0) to trace each and every message. */
|
||||||
@@ -723,6 +744,7 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
|
|||||||
goto exit_disable;
|
goto exit_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (msg->flags & I2C_M_RD) {
|
if (msg->flags & I2C_M_RD) {
|
||||||
/* READ: we read the actual bytes one at a time */
|
/* READ: we read the actual bytes one at a time */
|
||||||
for (i = 0; i < msg->len; i++) {
|
for (i = 0; i < msg->len; i++) {
|
||||||
@@ -804,8 +826,10 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
|
|||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
struct stu300_dev *dev = i2c_get_adapdata(adap);
|
struct stu300_dev *dev = i2c_get_adapdata(adap);
|
||||||
dev->msg_len = num;
|
dev->msg_len = num;
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
/*
|
/*
|
||||||
* Another driver appears to send stop for each message,
|
* 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,
|
|||||||
dev->msg_index = i;
|
dev->msg_index = i;
|
||||||
|
|
||||||
ret = stu300_xfer_msg(adap, &msgs[i], (i == (num - 1)));
|
ret = stu300_xfer_msg(adap, &msgs[i], (i == (num - 1)));
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
num = ret;
|
num = ret;
|
||||||
break;
|
break;
|
||||||
@@ -845,6 +870,7 @@ stu300_probe(struct platform_device *pdev)
|
|||||||
struct resource *res;
|
struct resource *res;
|
||||||
int bus_nr;
|
int bus_nr;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
char clk_name[] = "I2C0";
|
||||||
|
|
||||||
dev = kzalloc(sizeof(struct stu300_dev), GFP_KERNEL);
|
dev = kzalloc(sizeof(struct stu300_dev), GFP_KERNEL);
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
@@ -854,7 +880,8 @@ stu300_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bus_nr = pdev->id;
|
bus_nr = pdev->id;
|
||||||
dev->clk = clk_get(&pdev->dev, NULL);
|
clk_name[3] += (char)bus_nr;
|
||||||
|
dev->clk = clk_get(&pdev->dev, clk_name);
|
||||||
if (IS_ERR(dev->clk)) {
|
if (IS_ERR(dev->clk)) {
|
||||||
ret = PTR_ERR(dev->clk);
|
ret = PTR_ERR(dev->clk);
|
||||||
dev_err(&pdev->dev, "could not retrieve i2c bus clock\n");
|
dev_err(&pdev->dev, "could not retrieve i2c bus clock\n");
|
||||||
|
|||||||
@@ -508,7 +508,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev)
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pci_dev->state_saved ? pci_restore_state(pci_dev) : 0;
|
return pci_restore_state(pci_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev)
|
static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev)
|
||||||
|
|||||||
@@ -846,6 +846,8 @@ pci_restore_state(struct pci_dev *dev)
|
|||||||
int i;
|
int i;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
if (!dev->state_saved)
|
||||||
|
return 0;
|
||||||
/* PCI Express register must be restored first */
|
/* PCI Express register must be restored first */
|
||||||
pci_restore_pcie_state(dev);
|
pci_restore_pcie_state(dev);
|
||||||
|
|
||||||
|
|||||||
@@ -119,6 +119,64 @@ _base_fault_reset_work(struct work_struct *work)
|
|||||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mpt2sas_base_start_watchdog - start the fault_reset_work_q
|
||||||
|
* @ioc: pointer to scsi command object
|
||||||
|
* Context: sleep.
|
||||||
|
*
|
||||||
|
* Return nothing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (ioc->fault_reset_work_q)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* initialize fault polling */
|
||||||
|
INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work);
|
||||||
|
snprintf(ioc->fault_reset_work_q_name,
|
||||||
|
sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id);
|
||||||
|
ioc->fault_reset_work_q =
|
||||||
|
create_singlethread_workqueue(ioc->fault_reset_work_q_name);
|
||||||
|
if (!ioc->fault_reset_work_q) {
|
||||||
|
printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n",
|
||||||
|
ioc->name, __func__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||||
|
if (ioc->fault_reset_work_q)
|
||||||
|
queue_delayed_work(ioc->fault_reset_work_q,
|
||||||
|
&ioc->fault_reset_work,
|
||||||
|
msecs_to_jiffies(FAULT_POLLING_INTERVAL));
|
||||||
|
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mpt2sas_base_stop_watchdog - stop the fault_reset_work_q
|
||||||
|
* @ioc: pointer to scsi command object
|
||||||
|
* Context: sleep.
|
||||||
|
*
|
||||||
|
* Return nothing.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
struct workqueue_struct *wq;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||||
|
wq = ioc->fault_reset_work_q;
|
||||||
|
ioc->fault_reset_work_q = NULL;
|
||||||
|
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||||
|
if (wq) {
|
||||||
|
if (!cancel_delayed_work(&ioc->fault_reset_work))
|
||||||
|
flush_workqueue(wq);
|
||||||
|
destroy_workqueue(wq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
||||||
/**
|
/**
|
||||||
* _base_sas_ioc_info - verbose translation of the ioc status
|
* _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)
|
|||||||
if (sas_loginfo.dw.bus_type != 3 /*SAS*/)
|
if (sas_loginfo.dw.bus_type != 3 /*SAS*/)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* each nexus loss loginfo */
|
||||||
|
if (log_info == 0x31170000)
|
||||||
|
return;
|
||||||
|
|
||||||
/* eat the loginfos associated with task aborts */
|
/* eat the loginfos associated with task aborts */
|
||||||
if (ioc->ignore_loginfos && (log_info == 30050000 || log_info ==
|
if (ioc->ignore_loginfos && (log_info == 30050000 || log_info ==
|
||||||
0x31140000 || log_info == 0x31130000))
|
0x31140000 || log_info == 0x31130000))
|
||||||
@@ -1109,7 +1171,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_set_drvdata(pdev, ioc->shost);
|
|
||||||
_base_mask_interrupts(ioc);
|
_base_mask_interrupts(ioc);
|
||||||
r = _base_enable_msix(ioc);
|
r = _base_enable_msix(ioc);
|
||||||
if (r)
|
if (r)
|
||||||
@@ -1132,7 +1193,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
ioc->pci_irq = -1;
|
ioc->pci_irq = -1;
|
||||||
pci_release_selected_regions(ioc->pdev, ioc->bars);
|
pci_release_selected_regions(ioc->pdev, ioc->bars);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
pci_set_drvdata(pdev, NULL);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3191,7 +3251,6 @@ mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
ioc->chip_phys = 0;
|
ioc->chip_phys = 0;
|
||||||
pci_release_selected_regions(ioc->pdev, ioc->bars);
|
pci_release_selected_regions(ioc->pdev, ioc->bars);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
pci_set_drvdata(pdev, NULL);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3205,7 +3264,6 @@ int
|
|||||||
mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
||||||
{
|
{
|
||||||
int r, i;
|
int r, i;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
||||||
__func__));
|
__func__));
|
||||||
@@ -3214,6 +3272,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
pci_set_drvdata(ioc->pdev, ioc->shost);
|
||||||
r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET);
|
r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET);
|
||||||
if (r)
|
if (r)
|
||||||
goto out_free_resources;
|
goto out_free_resources;
|
||||||
@@ -3288,23 +3347,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
if (r)
|
if (r)
|
||||||
goto out_free_resources;
|
goto out_free_resources;
|
||||||
|
|
||||||
/* initialize fault polling */
|
mpt2sas_base_start_watchdog(ioc);
|
||||||
INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work);
|
|
||||||
snprintf(ioc->fault_reset_work_q_name,
|
|
||||||
sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id);
|
|
||||||
ioc->fault_reset_work_q =
|
|
||||||
create_singlethread_workqueue(ioc->fault_reset_work_q_name);
|
|
||||||
if (!ioc->fault_reset_work_q) {
|
|
||||||
printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n",
|
|
||||||
ioc->name, __func__, __LINE__);
|
|
||||||
goto out_free_resources;
|
|
||||||
}
|
|
||||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
|
||||||
if (ioc->fault_reset_work_q)
|
|
||||||
queue_delayed_work(ioc->fault_reset_work_q,
|
|
||||||
&ioc->fault_reset_work,
|
|
||||||
msecs_to_jiffies(FAULT_POLLING_INTERVAL));
|
|
||||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free_resources:
|
out_free_resources:
|
||||||
@@ -3312,6 +3355,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
ioc->remove_host = 1;
|
ioc->remove_host = 1;
|
||||||
mpt2sas_base_free_resources(ioc);
|
mpt2sas_base_free_resources(ioc);
|
||||||
_base_release_memory_pools(ioc);
|
_base_release_memory_pools(ioc);
|
||||||
|
pci_set_drvdata(ioc->pdev, NULL);
|
||||||
kfree(ioc->tm_cmds.reply);
|
kfree(ioc->tm_cmds.reply);
|
||||||
kfree(ioc->transport_cmds.reply);
|
kfree(ioc->transport_cmds.reply);
|
||||||
kfree(ioc->config_cmds.reply);
|
kfree(ioc->config_cmds.reply);
|
||||||
@@ -3337,22 +3381,14 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||||||
void
|
void
|
||||||
mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc)
|
mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
struct workqueue_struct *wq;
|
|
||||||
|
|
||||||
dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
||||||
__func__));
|
__func__));
|
||||||
|
|
||||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
mpt2sas_base_stop_watchdog(ioc);
|
||||||
wq = ioc->fault_reset_work_q;
|
|
||||||
ioc->fault_reset_work_q = NULL;
|
|
||||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
|
||||||
if (!cancel_delayed_work(&ioc->fault_reset_work))
|
|
||||||
flush_workqueue(wq);
|
|
||||||
destroy_workqueue(wq);
|
|
||||||
|
|
||||||
mpt2sas_base_free_resources(ioc);
|
mpt2sas_base_free_resources(ioc);
|
||||||
_base_release_memory_pools(ioc);
|
_base_release_memory_pools(ioc);
|
||||||
|
pci_set_drvdata(ioc->pdev, NULL);
|
||||||
kfree(ioc->pfacts);
|
kfree(ioc->pfacts);
|
||||||
kfree(ioc->ctl_cmds.reply);
|
kfree(ioc->ctl_cmds.reply);
|
||||||
kfree(ioc->base_cmds.reply);
|
kfree(ioc->base_cmds.reply);
|
||||||
|
|||||||
@@ -69,10 +69,10 @@
|
|||||||
#define MPT2SAS_DRIVER_NAME "mpt2sas"
|
#define MPT2SAS_DRIVER_NAME "mpt2sas"
|
||||||
#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
|
#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
|
||||||
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
|
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
|
||||||
#define MPT2SAS_DRIVER_VERSION "01.100.03.00"
|
#define MPT2SAS_DRIVER_VERSION "01.100.04.00"
|
||||||
#define MPT2SAS_MAJOR_VERSION 01
|
#define MPT2SAS_MAJOR_VERSION 01
|
||||||
#define MPT2SAS_MINOR_VERSION 100
|
#define MPT2SAS_MINOR_VERSION 100
|
||||||
#define MPT2SAS_BUILD_VERSION 03
|
#define MPT2SAS_BUILD_VERSION 04
|
||||||
#define MPT2SAS_RELEASE_VERSION 00
|
#define MPT2SAS_RELEASE_VERSION 00
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -673,6 +673,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID,
|
|||||||
|
|
||||||
/* base shared API */
|
/* base shared API */
|
||||||
extern struct list_head mpt2sas_ioc_list;
|
extern struct list_head mpt2sas_ioc_list;
|
||||||
|
void mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc);
|
||||||
|
void mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc);
|
||||||
|
|
||||||
int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc);
|
int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc);
|
||||||
void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc);
|
void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc);
|
||||||
|
|||||||
@@ -236,17 +236,25 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||||||
Mpi2ConfigRequest_t *config_request;
|
Mpi2ConfigRequest_t *config_request;
|
||||||
int r;
|
int r;
|
||||||
u8 retry_count;
|
u8 retry_count;
|
||||||
u8 issue_reset;
|
u8 issue_host_reset = 0;
|
||||||
u16 wait_state_count;
|
u16 wait_state_count;
|
||||||
|
|
||||||
|
mutex_lock(&ioc->config_cmds.mutex);
|
||||||
if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) {
|
if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) {
|
||||||
printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n",
|
printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n",
|
||||||
ioc->name, __func__);
|
ioc->name, __func__);
|
||||||
|
mutex_unlock(&ioc->config_cmds.mutex);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
retry_count = 0;
|
retry_count = 0;
|
||||||
|
|
||||||
retry_config:
|
retry_config:
|
||||||
|
if (retry_count) {
|
||||||
|
if (retry_count > 2) /* attempt only 2 retries */
|
||||||
|
return -EFAULT;
|
||||||
|
printk(MPT2SAS_INFO_FMT "%s: attempting retry (%d)\n",
|
||||||
|
ioc->name, __func__, retry_count);
|
||||||
|
}
|
||||||
wait_state_count = 0;
|
wait_state_count = 0;
|
||||||
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
||||||
while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
|
while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
|
||||||
@@ -254,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||||||
printk(MPT2SAS_ERR_FMT
|
printk(MPT2SAS_ERR_FMT
|
||||||
"%s: failed due to ioc not operational\n",
|
"%s: failed due to ioc not operational\n",
|
||||||
ioc->name, __func__);
|
ioc->name, __func__);
|
||||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
r = -EFAULT;
|
||||||
return -EFAULT;
|
goto out;
|
||||||
}
|
}
|
||||||
ssleep(1);
|
ssleep(1);
|
||||||
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
||||||
@@ -271,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||||||
if (!smid) {
|
if (!smid) {
|
||||||
printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
|
printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
|
||||||
ioc->name, __func__);
|
ioc->name, __func__);
|
||||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
r = -EAGAIN;
|
||||||
return -EAGAIN;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = 0;
|
r = 0;
|
||||||
@@ -292,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||||||
ioc->name, __func__);
|
ioc->name, __func__);
|
||||||
_debug_dump_mf(mpi_request,
|
_debug_dump_mf(mpi_request,
|
||||||
sizeof(Mpi2ConfigRequest_t)/4);
|
sizeof(Mpi2ConfigRequest_t)/4);
|
||||||
if (!(ioc->config_cmds.status & MPT2_CMD_RESET))
|
retry_count++;
|
||||||
issue_reset = 1;
|
if (ioc->config_cmds.smid == smid)
|
||||||
goto issue_host_reset;
|
mpt2sas_base_free_smid(ioc, smid);
|
||||||
|
if ((ioc->shost_recovery) ||
|
||||||
|
(ioc->config_cmds.status & MPT2_CMD_RESET))
|
||||||
|
goto retry_config;
|
||||||
|
issue_host_reset = 1;
|
||||||
|
r = -EFAULT;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID)
|
if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID)
|
||||||
memcpy(mpi_reply, ioc->config_cmds.reply,
|
memcpy(mpi_reply, ioc->config_cmds.reply,
|
||||||
@@ -302,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||||||
if (retry_count)
|
if (retry_count)
|
||||||
printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n",
|
printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n",
|
||||||
ioc->name, __func__);
|
ioc->name, __func__);
|
||||||
|
out:
|
||||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
||||||
return r;
|
mutex_unlock(&ioc->config_cmds.mutex);
|
||||||
|
if (issue_host_reset)
|
||||||
issue_host_reset:
|
|
||||||
if (issue_reset)
|
|
||||||
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,
|
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,
|
||||||
FORCE_BIG_HAMMER);
|
FORCE_BIG_HAMMER);
|
||||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
return r;
|
||||||
if (!retry_count) {
|
|
||||||
printk(MPT2SAS_INFO_FMT "%s: attempting retry\n",
|
|
||||||
ioc->name, __func__);
|
|
||||||
retry_count++;
|
|
||||||
goto retry_config;
|
|
||||||
}
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -375,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t));
|
memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -417,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -438,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2BiosPage2_t));
|
memset(config_page, 0, sizeof(Mpi2BiosPage2_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -480,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2BiosPage3_t));
|
memset(config_page, 0, sizeof(Mpi2BiosPage3_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -543,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t));
|
memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -606,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -627,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t));
|
memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -669,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -690,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
|
mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
|
||||||
@@ -732,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -753,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2IOCPage8_t));
|
memset(config_page, 0, sizeof(Mpi2IOCPage8_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -795,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -818,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t));
|
memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -863,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -886,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t));
|
memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -931,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -953,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
|
|||||||
Mpi2ConfigReply_t mpi_reply;
|
Mpi2ConfigReply_t mpi_reply;
|
||||||
Mpi2SasIOUnitPage0_t config_page;
|
Mpi2SasIOUnitPage0_t config_page;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
|
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)
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1026,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
Mpi2ConfigRequest_t mpi_request;
|
Mpi2ConfigRequest_t mpi_request;
|
||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sz);
|
memset(config_page, 0, sz);
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1070,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1095,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sz);
|
memset(config_page, 0, sz);
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1138,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1161,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t));
|
memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1206,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1230,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t));
|
memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1277,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1300,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t));
|
memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1345,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1367,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t));
|
memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1413,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1435,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t));
|
memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1481,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1505,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t));
|
memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t));
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1548,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1572,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
|
|||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
u16 ioc_status;
|
u16 ioc_status;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
*num_pds = 0;
|
*num_pds = 0;
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1620,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1645,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
memset(config_page, 0, sz);
|
memset(config_page, 0, sz);
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1687,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1711,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
int r;
|
int r;
|
||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t));
|
memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1754,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1778,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
|
|||||||
struct config_request mem;
|
struct config_request mem;
|
||||||
u16 ioc_status;
|
u16 ioc_status;
|
||||||
|
|
||||||
mutex_lock(&ioc->config_cmds.mutex);
|
|
||||||
*volume_handle = 0;
|
*volume_handle = 0;
|
||||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||||
@@ -1842,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
|
|||||||
_config_free_config_dma_memory(ioc, &mem);
|
_config_free_config_dma_memory(ioc, &mem);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&ioc->config_cmds.mutex);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2767,6 +2767,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
|
|||||||
char *desc_ioc_state = NULL;
|
char *desc_ioc_state = NULL;
|
||||||
char *desc_scsi_status = NULL;
|
char *desc_scsi_status = NULL;
|
||||||
char *desc_scsi_state = ioc->tmp_string;
|
char *desc_scsi_state = ioc->tmp_string;
|
||||||
|
u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo);
|
||||||
|
|
||||||
|
if (log_info == 0x31170000)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (ioc_status) {
|
switch (ioc_status) {
|
||||||
case MPI2_IOCSTATUS_SUCCESS:
|
case MPI2_IOCSTATUS_SUCCESS:
|
||||||
@@ -3426,7 +3430,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
|
|||||||
__le64 sas_address;
|
__le64 sas_address;
|
||||||
int i;
|
int i;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct _sas_port *mpt2sas_port;
|
struct _sas_port *mpt2sas_port = NULL;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (!handle)
|
if (!handle)
|
||||||
@@ -3518,12 +3522,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
|
|||||||
&expander_pg1, i, handle))) {
|
&expander_pg1, i, handle))) {
|
||||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||||
ioc->name, __FILE__, __LINE__, __func__);
|
ioc->name, __FILE__, __LINE__, __func__);
|
||||||
continue;
|
rc = -1;
|
||||||
|
goto out_fail;
|
||||||
}
|
}
|
||||||
sas_expander->phy[i].handle = handle;
|
sas_expander->phy[i].handle = handle;
|
||||||
sas_expander->phy[i].phy_id = i;
|
sas_expander->phy[i].phy_id = i;
|
||||||
mpt2sas_transport_add_expander_phy(ioc, &sas_expander->phy[i],
|
|
||||||
expander_pg1, sas_expander->parent_dev);
|
if ((mpt2sas_transport_add_expander_phy(ioc,
|
||||||
|
&sas_expander->phy[i], expander_pg1,
|
||||||
|
sas_expander->parent_dev))) {
|
||||||
|
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||||
|
ioc->name, __FILE__, __LINE__, __func__);
|
||||||
|
rc = -1;
|
||||||
|
goto out_fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sas_expander->enclosure_handle) {
|
if (sas_expander->enclosure_handle) {
|
||||||
@@ -3540,8 +3552,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
|
|||||||
|
|
||||||
out_fail:
|
out_fail:
|
||||||
|
|
||||||
if (sas_expander)
|
if (mpt2sas_port)
|
||||||
kfree(sas_expander->phy);
|
mpt2sas_transport_port_remove(ioc, sas_expander->sas_address,
|
||||||
|
sas_expander->parent_handle);
|
||||||
kfree(sas_expander);
|
kfree(sas_expander);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -3663,12 +3676,11 @@ _scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 phy_num, u8 is_pd)
|
|||||||
sas_device->hidden_raid_component = is_pd;
|
sas_device->hidden_raid_component = is_pd;
|
||||||
|
|
||||||
/* get enclosure_logical_id */
|
/* get enclosure_logical_id */
|
||||||
if (!(mpt2sas_config_get_enclosure_pg0(ioc, &mpi_reply, &enclosure_pg0,
|
if (sas_device->enclosure_handle && !(mpt2sas_config_get_enclosure_pg0(
|
||||||
MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
|
ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
|
||||||
sas_device->enclosure_handle))) {
|
sas_device->enclosure_handle)))
|
||||||
sas_device->enclosure_logical_id =
|
sas_device->enclosure_logical_id =
|
||||||
le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
|
le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
|
||||||
}
|
|
||||||
|
|
||||||
/* get device name */
|
/* get device name */
|
||||||
sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName);
|
sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName);
|
||||||
@@ -4250,12 +4262,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
u16 handle = le16_to_cpu(element->VolDevHandle);
|
u16 handle = le16_to_cpu(element->VolDevHandle);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
#if 0 /* RAID_HACKS */
|
|
||||||
if (le32_to_cpu(event_data->Flags) &
|
|
||||||
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mpt2sas_config_get_volume_wwid(ioc, handle, &wwid);
|
mpt2sas_config_get_volume_wwid(ioc, handle, &wwid);
|
||||||
if (!wwid) {
|
if (!wwid) {
|
||||||
printk(MPT2SAS_ERR_FMT
|
printk(MPT2SAS_ERR_FMT
|
||||||
@@ -4310,12 +4316,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct MPT2SAS_TARGET *sas_target_priv_data;
|
struct MPT2SAS_TARGET *sas_target_priv_data;
|
||||||
|
|
||||||
#if 0 /* RAID_HACKS */
|
|
||||||
if (le32_to_cpu(event_data->Flags) &
|
|
||||||
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
spin_lock_irqsave(&ioc->raid_device_lock, flags);
|
spin_lock_irqsave(&ioc->raid_device_lock, flags);
|
||||||
raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
|
raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
|
||||||
spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
|
spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
|
||||||
@@ -4428,13 +4428,37 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc,
|
|||||||
struct _sas_device *sas_device;
|
struct _sas_device *sas_device;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
|
u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
|
||||||
|
Mpi2ConfigReply_t mpi_reply;
|
||||||
|
Mpi2SasDevicePage0_t sas_device_pg0;
|
||||||
|
u32 ioc_status;
|
||||||
|
|
||||||
spin_lock_irqsave(&ioc->sas_device_lock, flags);
|
spin_lock_irqsave(&ioc->sas_device_lock, flags);
|
||||||
sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
|
sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
|
||||||
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
||||||
if (sas_device)
|
if (sas_device) {
|
||||||
sas_device->hidden_raid_component = 1;
|
sas_device->hidden_raid_component = 1;
|
||||||
else
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
|
||||||
|
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
|
||||||
|
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||||
|
ioc->name, __FILE__, __LINE__, __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
||||||
|
MPI2_IOCSTATUS_MASK;
|
||||||
|
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
||||||
|
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||||
|
ioc->name, __FILE__, __LINE__, __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_scsih_link_change(ioc,
|
||||||
|
le16_to_cpu(sas_device_pg0.ParentDevHandle),
|
||||||
|
handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
|
||||||
|
|
||||||
_scsih_add_device(ioc, handle, 0, 1);
|
_scsih_add_device(ioc, handle, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4535,12 +4559,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||||||
{
|
{
|
||||||
Mpi2EventIrConfigElement_t *element;
|
Mpi2EventIrConfigElement_t *element;
|
||||||
int i;
|
int i;
|
||||||
|
u8 foreign_config;
|
||||||
|
|
||||||
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
||||||
if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
|
if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
|
||||||
_scsih_sas_ir_config_change_event_debug(ioc, event_data);
|
_scsih_sas_ir_config_change_event_debug(ioc, event_data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
foreign_config = (le32_to_cpu(event_data->Flags) &
|
||||||
|
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
|
||||||
|
|
||||||
element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
|
element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
|
||||||
for (i = 0; i < event_data->NumElements; i++, element++) {
|
for (i = 0; i < event_data->NumElements; i++, element++) {
|
||||||
@@ -4548,10 +4575,12 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||||||
switch (element->ReasonCode) {
|
switch (element->ReasonCode) {
|
||||||
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
|
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
|
||||||
case MPI2_EVENT_IR_CHANGE_RC_ADDED:
|
case MPI2_EVENT_IR_CHANGE_RC_ADDED:
|
||||||
|
if (!foreign_config)
|
||||||
_scsih_sas_volume_add(ioc, element);
|
_scsih_sas_volume_add(ioc, element);
|
||||||
break;
|
break;
|
||||||
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
|
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
|
||||||
case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
|
case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
|
||||||
|
if (!foreign_config)
|
||||||
_scsih_sas_volume_delete(ioc, element);
|
_scsih_sas_volume_delete(ioc, element);
|
||||||
break;
|
break;
|
||||||
case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
|
case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
|
||||||
@@ -4671,6 +4700,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||||||
u32 state;
|
u32 state;
|
||||||
struct _sas_device *sas_device;
|
struct _sas_device *sas_device;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
Mpi2ConfigReply_t mpi_reply;
|
||||||
|
Mpi2SasDevicePage0_t sas_device_pg0;
|
||||||
|
u32 ioc_status;
|
||||||
|
|
||||||
if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
|
if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
|
||||||
return;
|
return;
|
||||||
@@ -4687,22 +4719,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||||||
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
#if 0
|
|
||||||
case MPI2_RAID_PD_STATE_OFFLINE:
|
|
||||||
if (sas_device)
|
|
||||||
_scsih_remove_device(ioc, handle);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case MPI2_RAID_PD_STATE_ONLINE:
|
case MPI2_RAID_PD_STATE_ONLINE:
|
||||||
case MPI2_RAID_PD_STATE_DEGRADED:
|
case MPI2_RAID_PD_STATE_DEGRADED:
|
||||||
case MPI2_RAID_PD_STATE_REBUILDING:
|
case MPI2_RAID_PD_STATE_REBUILDING:
|
||||||
case MPI2_RAID_PD_STATE_OPTIMAL:
|
case MPI2_RAID_PD_STATE_OPTIMAL:
|
||||||
if (sas_device)
|
if (sas_device) {
|
||||||
sas_device->hidden_raid_component = 1;
|
sas_device->hidden_raid_component = 1;
|
||||||
else
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply,
|
||||||
|
&sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
|
||||||
|
handle))) {
|
||||||
|
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||||
|
ioc->name, __FILE__, __LINE__, __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
||||||
|
MPI2_IOCSTATUS_MASK;
|
||||||
|
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
||||||
|
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||||
|
ioc->name, __FILE__, __LINE__, __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_scsih_link_change(ioc,
|
||||||
|
le16_to_cpu(sas_device_pg0.ParentDevHandle),
|
||||||
|
handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
|
||||||
|
|
||||||
_scsih_add_device(ioc, handle, 0, 1);
|
_scsih_add_device(ioc, handle, 0, 1);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MPI2_RAID_PD_STATE_OFFLINE:
|
||||||
case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
|
case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
|
||||||
case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
|
case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
|
||||||
case MPI2_RAID_PD_STATE_HOT_SPARE:
|
case MPI2_RAID_PD_STATE_HOT_SPARE:
|
||||||
@@ -5774,6 +5824,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||||||
struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
|
struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
|
||||||
u32 device_state;
|
u32 device_state;
|
||||||
|
|
||||||
|
mpt2sas_base_stop_watchdog(ioc);
|
||||||
flush_scheduled_work();
|
flush_scheduled_work();
|
||||||
scsi_block_requests(shost);
|
scsi_block_requests(shost);
|
||||||
device_state = pci_choose_state(pdev, state);
|
device_state = pci_choose_state(pdev, state);
|
||||||
@@ -5816,6 +5867,7 @@ _scsih_resume(struct pci_dev *pdev)
|
|||||||
|
|
||||||
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET);
|
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET);
|
||||||
scsi_unblock_requests(shost);
|
scsi_unblock_requests(shost);
|
||||||
|
mpt2sas_base_start_watchdog(ioc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|||||||
+14
-7
@@ -3099,8 +3099,12 @@ static void inode_tree_add(struct inode *inode)
|
|||||||
{
|
{
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||||
struct btrfs_inode *entry;
|
struct btrfs_inode *entry;
|
||||||
struct rb_node **p = &root->inode_tree.rb_node;
|
struct rb_node **p;
|
||||||
struct rb_node *parent = NULL;
|
struct rb_node *parent;
|
||||||
|
|
||||||
|
again:
|
||||||
|
p = &root->inode_tree.rb_node;
|
||||||
|
parent = NULL;
|
||||||
|
|
||||||
spin_lock(&root->inode_lock);
|
spin_lock(&root->inode_lock);
|
||||||
while (*p) {
|
while (*p) {
|
||||||
@@ -3108,13 +3112,16 @@ static void inode_tree_add(struct inode *inode)
|
|||||||
entry = rb_entry(parent, struct btrfs_inode, rb_node);
|
entry = rb_entry(parent, struct btrfs_inode, rb_node);
|
||||||
|
|
||||||
if (inode->i_ino < entry->vfs_inode.i_ino)
|
if (inode->i_ino < entry->vfs_inode.i_ino)
|
||||||
p = &(*p)->rb_left;
|
p = &parent->rb_left;
|
||||||
else if (inode->i_ino > entry->vfs_inode.i_ino)
|
else if (inode->i_ino > entry->vfs_inode.i_ino)
|
||||||
p = &(*p)->rb_right;
|
p = &parent->rb_right;
|
||||||
else {
|
else {
|
||||||
WARN_ON(!(entry->vfs_inode.i_state &
|
WARN_ON(!(entry->vfs_inode.i_state &
|
||||||
(I_WILL_FREE | I_FREEING | I_CLEAR)));
|
(I_WILL_FREE | I_FREEING | I_CLEAR)));
|
||||||
break;
|
rb_erase(parent, &root->inode_tree);
|
||||||
|
RB_CLEAR_NODE(parent);
|
||||||
|
spin_unlock(&root->inode_lock);
|
||||||
|
goto again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rb_link_node(&BTRFS_I(inode)->rb_node, parent, p);
|
rb_link_node(&BTRFS_I(inode)->rb_node, parent, p);
|
||||||
@@ -3126,12 +3133,12 @@ static void inode_tree_del(struct inode *inode)
|
|||||||
{
|
{
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||||
|
|
||||||
if (!RB_EMPTY_NODE(&BTRFS_I(inode)->rb_node)) {
|
|
||||||
spin_lock(&root->inode_lock);
|
spin_lock(&root->inode_lock);
|
||||||
|
if (!RB_EMPTY_NODE(&BTRFS_I(inode)->rb_node)) {
|
||||||
rb_erase(&BTRFS_I(inode)->rb_node, &root->inode_tree);
|
rb_erase(&BTRFS_I(inode)->rb_node, &root->inode_tree);
|
||||||
spin_unlock(&root->inode_lock);
|
|
||||||
RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node);
|
RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node);
|
||||||
}
|
}
|
||||||
|
spin_unlock(&root->inode_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static noinline void init_btrfs_i(struct inode *inode)
|
static noinline void init_btrfs_i(struct inode *inode)
|
||||||
|
|||||||
+5
-2
@@ -1165,8 +1165,11 @@ void mark_buffer_dirty(struct buffer_head *bh)
|
|||||||
|
|
||||||
if (!test_set_buffer_dirty(bh)) {
|
if (!test_set_buffer_dirty(bh)) {
|
||||||
struct page *page = bh->b_page;
|
struct page *page = bh->b_page;
|
||||||
if (!TestSetPageDirty(page))
|
if (!TestSetPageDirty(page)) {
|
||||||
__set_page_dirty(page, page_mapping(page), 0);
|
struct address_space *mapping = page_mapping(page);
|
||||||
|
if (mapping)
|
||||||
|
__set_page_dirty(page, mapping, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -508,6 +508,7 @@ typedef struct {
|
|||||||
#define DRM_RADEON_INFO 0x27
|
#define DRM_RADEON_INFO 0x27
|
||||||
#define DRM_RADEON_GEM_SET_TILING 0x28
|
#define DRM_RADEON_GEM_SET_TILING 0x28
|
||||||
#define DRM_RADEON_GEM_GET_TILING 0x29
|
#define DRM_RADEON_GEM_GET_TILING 0x29
|
||||||
|
#define DRM_RADEON_GEM_BUSY 0x2a
|
||||||
|
|
||||||
#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
|
#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
|
||||||
#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
|
#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
|
||||||
@@ -548,6 +549,7 @@ typedef struct {
|
|||||||
#define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info)
|
#define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info)
|
||||||
#define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling)
|
#define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling)
|
||||||
#define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
|
#define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
|
||||||
|
#define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy)
|
||||||
|
|
||||||
typedef struct drm_radeon_init {
|
typedef struct drm_radeon_init {
|
||||||
enum {
|
enum {
|
||||||
@@ -707,6 +709,7 @@ typedef struct drm_radeon_indirect {
|
|||||||
#define RADEON_PARAM_FB_LOCATION 14 /* FB location */
|
#define RADEON_PARAM_FB_LOCATION 14 /* FB location */
|
||||||
#define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */
|
#define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */
|
||||||
#define RADEON_PARAM_DEVICE_ID 16
|
#define RADEON_PARAM_DEVICE_ID 16
|
||||||
|
#define RADEON_PARAM_NUM_Z_PIPES 17 /* num Z pipes */
|
||||||
|
|
||||||
typedef struct drm_radeon_getparam {
|
typedef struct drm_radeon_getparam {
|
||||||
int param;
|
int param;
|
||||||
@@ -895,6 +898,7 @@ struct drm_radeon_cs {
|
|||||||
|
|
||||||
#define RADEON_INFO_DEVICE_ID 0x00
|
#define RADEON_INFO_DEVICE_ID 0x00
|
||||||
#define RADEON_INFO_NUM_GB_PIPES 0x01
|
#define RADEON_INFO_NUM_GB_PIPES 0x01
|
||||||
|
#define RADEON_INFO_NUM_Z_PIPES 0x02
|
||||||
|
|
||||||
struct drm_radeon_info {
|
struct drm_radeon_info {
|
||||||
uint32_t request;
|
uint32_t request;
|
||||||
|
|||||||
+8
-10
@@ -94,13 +94,13 @@ extern void __bitmap_shift_right(unsigned long *dst,
|
|||||||
const unsigned long *src, int shift, int bits);
|
const unsigned long *src, int shift, int bits);
|
||||||
extern void __bitmap_shift_left(unsigned long *dst,
|
extern void __bitmap_shift_left(unsigned long *dst,
|
||||||
const unsigned long *src, int shift, int bits);
|
const unsigned long *src, int shift, int bits);
|
||||||
extern void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
|
extern int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits);
|
const unsigned long *bitmap2, int bits);
|
||||||
extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
|
extern void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits);
|
const unsigned long *bitmap2, int bits);
|
||||||
extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
extern void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits);
|
const unsigned long *bitmap2, int bits);
|
||||||
extern void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
extern int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits);
|
const unsigned long *bitmap2, int bits);
|
||||||
extern int __bitmap_intersects(const unsigned long *bitmap1,
|
extern int __bitmap_intersects(const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits);
|
const unsigned long *bitmap2, int bits);
|
||||||
@@ -171,13 +171,12 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void bitmap_and(unsigned long *dst, const unsigned long *src1,
|
static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
|
||||||
const unsigned long *src2, int nbits)
|
const unsigned long *src2, int nbits)
|
||||||
{
|
{
|
||||||
if (small_const_nbits(nbits))
|
if (small_const_nbits(nbits))
|
||||||
*dst = *src1 & *src2;
|
return (*dst = *src1 & *src2) != 0;
|
||||||
else
|
return __bitmap_and(dst, src1, src2, nbits);
|
||||||
__bitmap_and(dst, src1, src2, nbits);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
|
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,
|
|||||||
__bitmap_xor(dst, src1, src2, nbits);
|
__bitmap_xor(dst, src1, src2, nbits);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void bitmap_andnot(unsigned long *dst, const unsigned long *src1,
|
static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
|
||||||
const unsigned long *src2, int nbits)
|
const unsigned long *src2, int nbits)
|
||||||
{
|
{
|
||||||
if (small_const_nbits(nbits))
|
if (small_const_nbits(nbits))
|
||||||
*dst = *src1 & ~(*src2);
|
return (*dst = *src1 & ~(*src2)) != 0;
|
||||||
else
|
return __bitmap_andnot(dst, src1, src2, nbits);
|
||||||
__bitmap_andnot(dst, src1, src2, nbits);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
|
static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
|
||||||
|
|||||||
+10
-10
@@ -43,10 +43,10 @@
|
|||||||
* int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask
|
* int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask
|
||||||
* int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask
|
* int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask
|
||||||
*
|
*
|
||||||
* void cpus_and(dst, src1, src2) dst = src1 & src2 [intersection]
|
* int cpus_and(dst, src1, src2) dst = src1 & src2 [intersection]
|
||||||
* void cpus_or(dst, src1, src2) dst = src1 | src2 [union]
|
* void cpus_or(dst, src1, src2) dst = src1 | src2 [union]
|
||||||
* void cpus_xor(dst, src1, src2) dst = src1 ^ src2
|
* void cpus_xor(dst, src1, src2) dst = src1 ^ src2
|
||||||
* void cpus_andnot(dst, src1, src2) dst = src1 & ~src2
|
* int cpus_andnot(dst, src1, src2) dst = src1 & ~src2
|
||||||
* void cpus_complement(dst, src) dst = ~src
|
* void cpus_complement(dst, src) dst = ~src
|
||||||
*
|
*
|
||||||
* int cpus_equal(mask1, mask2) Does mask1 == mask2?
|
* int cpus_equal(mask1, mask2) Does mask1 == mask2?
|
||||||
@@ -179,10 +179,10 @@ static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
|
#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
|
||||||
static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
|
static inline int __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
|
||||||
const cpumask_t *src2p, int nbits)
|
const cpumask_t *src2p, int nbits)
|
||||||
{
|
{
|
||||||
bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
|
return bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
|
#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,
|
|||||||
|
|
||||||
#define cpus_andnot(dst, src1, src2) \
|
#define cpus_andnot(dst, src1, src2) \
|
||||||
__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
|
__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
|
||||||
static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
|
static inline int __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
|
||||||
const cpumask_t *src2p, int nbits)
|
const cpumask_t *src2p, int nbits)
|
||||||
{
|
{
|
||||||
bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
|
return bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
|
#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
|
||||||
@@ -738,11 +738,11 @@ static inline void cpumask_clear(struct cpumask *dstp)
|
|||||||
* @src1p: the first input
|
* @src1p: the first input
|
||||||
* @src2p: the second input
|
* @src2p: the second input
|
||||||
*/
|
*/
|
||||||
static inline void cpumask_and(struct cpumask *dstp,
|
static inline int cpumask_and(struct cpumask *dstp,
|
||||||
const struct cpumask *src1p,
|
const struct cpumask *src1p,
|
||||||
const struct cpumask *src2p)
|
const struct cpumask *src2p)
|
||||||
{
|
{
|
||||||
bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
|
return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
|
||||||
cpumask_bits(src2p), nr_cpumask_bits);
|
cpumask_bits(src2p), nr_cpumask_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -779,11 +779,11 @@ static inline void cpumask_xor(struct cpumask *dstp,
|
|||||||
* @src1p: the first input
|
* @src1p: the first input
|
||||||
* @src2p: the second input
|
* @src2p: the second input
|
||||||
*/
|
*/
|
||||||
static inline void cpumask_andnot(struct cpumask *dstp,
|
static inline int cpumask_andnot(struct cpumask *dstp,
|
||||||
const struct cpumask *src1p,
|
const struct cpumask *src1p,
|
||||||
const struct cpumask *src2p)
|
const struct cpumask *src2p)
|
||||||
{
|
{
|
||||||
bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p),
|
return bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p),
|
||||||
cpumask_bits(src2p), nr_cpumask_bits);
|
cpumask_bits(src2p), nr_cpumask_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-4
@@ -179,14 +179,16 @@ void __bitmap_shift_left(unsigned long *dst,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__bitmap_shift_left);
|
EXPORT_SYMBOL(__bitmap_shift_left);
|
||||||
|
|
||||||
void __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
|
int __bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits)
|
const unsigned long *bitmap2, int bits)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
int nr = BITS_TO_LONGS(bits);
|
int nr = BITS_TO_LONGS(bits);
|
||||||
|
unsigned long result = 0;
|
||||||
|
|
||||||
for (k = 0; k < nr; k++)
|
for (k = 0; k < nr; k++)
|
||||||
dst[k] = bitmap1[k] & bitmap2[k];
|
result |= (dst[k] = bitmap1[k] & bitmap2[k]);
|
||||||
|
return result != 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__bitmap_and);
|
EXPORT_SYMBOL(__bitmap_and);
|
||||||
|
|
||||||
@@ -212,14 +214,16 @@ void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__bitmap_xor);
|
EXPORT_SYMBOL(__bitmap_xor);
|
||||||
|
|
||||||
void __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
int __bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
|
||||||
const unsigned long *bitmap2, int bits)
|
const unsigned long *bitmap2, int bits)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
int nr = BITS_TO_LONGS(bits);
|
int nr = BITS_TO_LONGS(bits);
|
||||||
|
unsigned long result = 0;
|
||||||
|
|
||||||
for (k = 0; k < nr; k++)
|
for (k = 0; k < nr; k++)
|
||||||
dst[k] = bitmap1[k] & ~bitmap2[k];
|
result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
|
||||||
|
return result != 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__bitmap_andnot);
|
EXPORT_SYMBOL(__bitmap_andnot);
|
||||||
|
|
||||||
|
|||||||
@@ -3835,9 +3835,11 @@ static struct hda_verb ad1884a_laptop_verbs[] = {
|
|||||||
/* Port-F (int speaker) mixer - route only from analog mixer */
|
/* Port-F (int speaker) mixer - route only from analog mixer */
|
||||||
{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
|
{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
|
||||||
{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
|
{0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
|
||||||
/* Port-F pin */
|
/* Port-F (int speaker) pin */
|
||||||
{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
|
{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
||||||
{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
||||||
|
/* required for compaq 6530s/6531s speaker output */
|
||||||
|
{0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
||||||
/* Port-C pin - internal mic-in */
|
/* Port-C pin - internal mic-in */
|
||||||
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
|
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
|
||||||
{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
|
{0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
|
||||||
|
|||||||
@@ -12521,8 +12521,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
|
|||||||
ALC268_TOSHIBA),
|
ALC268_TOSHIBA),
|
||||||
SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
|
SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
|
||||||
SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
|
SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
|
||||||
SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
|
|
||||||
ALC268_TOSHIBA),
|
|
||||||
SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
|
SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
|
||||||
SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
|
SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
|
||||||
SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
|
SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
|
||||||
@@ -12530,6 +12528,15 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Toshiba laptops have no unique PCI SSID but only codec SSID */
|
||||||
|
static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
|
||||||
|
SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
|
||||||
|
SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
|
||||||
|
SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
|
||||||
|
ALC268_TOSHIBA),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
static struct alc_config_preset alc268_presets[] = {
|
static struct alc_config_preset alc268_presets[] = {
|
||||||
[ALC267_QUANTA_IL1] = {
|
[ALC267_QUANTA_IL1] = {
|
||||||
.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer },
|
.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer },
|
||||||
@@ -12696,6 +12703,10 @@ static int patch_alc268(struct hda_codec *codec)
|
|||||||
alc268_models,
|
alc268_models,
|
||||||
alc268_cfg_tbl);
|
alc268_cfg_tbl);
|
||||||
|
|
||||||
|
if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
|
||||||
|
board_config = snd_hda_check_board_codec_sid_config(codec,
|
||||||
|
ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
|
||||||
|
|
||||||
if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
|
if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
|
||||||
printk(KERN_INFO "hda_codec: Unknown model for %s, "
|
printk(KERN_INFO "hda_codec: Unknown model for %s, "
|
||||||
"trying auto-probe from BIOS...\n", codec->chip_name);
|
"trying auto-probe from BIOS...\n", codec->chip_name);
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ enum {
|
|||||||
STAC_92HD73XX_AUTO,
|
STAC_92HD73XX_AUTO,
|
||||||
STAC_92HD73XX_NO_JD, /* no jack-detection */
|
STAC_92HD73XX_NO_JD, /* no jack-detection */
|
||||||
STAC_92HD73XX_REF,
|
STAC_92HD73XX_REF,
|
||||||
|
STAC_92HD73XX_INTEL,
|
||||||
STAC_DELL_M6_AMIC,
|
STAC_DELL_M6_AMIC,
|
||||||
STAC_DELL_M6_DMIC,
|
STAC_DELL_M6_DMIC,
|
||||||
STAC_DELL_M6_BOTH,
|
STAC_DELL_M6_BOTH,
|
||||||
@@ -1777,6 +1778,7 @@ static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
|
|||||||
[STAC_92HD73XX_AUTO] = "auto",
|
[STAC_92HD73XX_AUTO] = "auto",
|
||||||
[STAC_92HD73XX_NO_JD] = "no-jd",
|
[STAC_92HD73XX_NO_JD] = "no-jd",
|
||||||
[STAC_92HD73XX_REF] = "ref",
|
[STAC_92HD73XX_REF] = "ref",
|
||||||
|
[STAC_92HD73XX_INTEL] = "intel",
|
||||||
[STAC_DELL_M6_AMIC] = "dell-m6-amic",
|
[STAC_DELL_M6_AMIC] = "dell-m6-amic",
|
||||||
[STAC_DELL_M6_DMIC] = "dell-m6-dmic",
|
[STAC_DELL_M6_DMIC] = "dell-m6-dmic",
|
||||||
[STAC_DELL_M6_BOTH] = "dell-m6",
|
[STAC_DELL_M6_BOTH] = "dell-m6",
|
||||||
@@ -1789,6 +1791,10 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
|
|||||||
"DFI LanParty", STAC_92HD73XX_REF),
|
"DFI LanParty", STAC_92HD73XX_REF),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
|
||||||
"DFI LanParty", STAC_92HD73XX_REF),
|
"DFI LanParty", STAC_92HD73XX_REF),
|
||||||
|
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002,
|
||||||
|
"Intel DG45ID", STAC_92HD73XX_INTEL),
|
||||||
|
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003,
|
||||||
|
"Intel DG45FC", STAC_92HD73XX_INTEL),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
|
||||||
"Dell Studio 1535", STAC_DELL_M6_DMIC),
|
"Dell Studio 1535", STAC_DELL_M6_DMIC),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
|
||||||
|
|||||||
Reference in New Issue
Block a user