diff options
Diffstat (limited to 'drivers')
131 files changed, 1427 insertions, 441 deletions
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index e086fbbbe853..8db9089127c5 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c | |||
| @@ -1177,7 +1177,8 @@ static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T | |||
| 1177 | int TimeoutCounter; | 1177 | int TimeoutCounter; |
| 1178 | int i; | 1178 | int i; |
| 1179 | 1179 | ||
| 1180 | 1180 | memset(&CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T)); | |
| 1181 | |||
| 1181 | if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32))) | 1182 | if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32))) |
| 1182 | return DAC960_Failure(Controller, "DMA mask out of range"); | 1183 | return DAC960_Failure(Controller, "DMA mask out of range"); |
| 1183 | Controller->BounceBufferLimit = DMA_BIT_MASK(32); | 1184 | Controller->BounceBufferLimit = DMA_BIT_MASK(32); |
| @@ -4627,7 +4628,8 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
| 4627 | DAC960_Controller_T *Controller = Command->Controller; | 4628 | DAC960_Controller_T *Controller = Command->Controller; |
| 4628 | DAC960_CommandType_T CommandType = Command->CommandType; | 4629 | DAC960_CommandType_T CommandType = Command->CommandType; |
| 4629 | DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; | 4630 | DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox; |
| 4630 | DAC960_V2_IOCTL_Opcode_T CommandOpcode = CommandMailbox->Common.IOCTL_Opcode; | 4631 | DAC960_V2_IOCTL_Opcode_T IOCTLOpcode = CommandMailbox->Common.IOCTL_Opcode; |
| 4632 | DAC960_V2_CommandOpcode_T CommandOpcode = CommandMailbox->SCSI_10.CommandOpcode; | ||
| 4631 | DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus; | 4633 | DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus; |
| 4632 | 4634 | ||
| 4633 | if (CommandType == DAC960_ReadCommand || | 4635 | if (CommandType == DAC960_ReadCommand || |
| @@ -4699,7 +4701,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
| 4699 | { | 4701 | { |
| 4700 | if (Controller->ShutdownMonitoringTimer) | 4702 | if (Controller->ShutdownMonitoringTimer) |
| 4701 | return; | 4703 | return; |
| 4702 | if (CommandOpcode == DAC960_V2_GetControllerInfo) | 4704 | if (IOCTLOpcode == DAC960_V2_GetControllerInfo) |
| 4703 | { | 4705 | { |
| 4704 | DAC960_V2_ControllerInfo_T *NewControllerInfo = | 4706 | DAC960_V2_ControllerInfo_T *NewControllerInfo = |
| 4705 | Controller->V2.NewControllerInformation; | 4707 | Controller->V2.NewControllerInformation; |
| @@ -4719,14 +4721,14 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
| 4719 | memcpy(ControllerInfo, NewControllerInfo, | 4721 | memcpy(ControllerInfo, NewControllerInfo, |
| 4720 | sizeof(DAC960_V2_ControllerInfo_T)); | 4722 | sizeof(DAC960_V2_ControllerInfo_T)); |
| 4721 | } | 4723 | } |
| 4722 | else if (CommandOpcode == DAC960_V2_GetEvent) | 4724 | else if (IOCTLOpcode == DAC960_V2_GetEvent) |
| 4723 | { | 4725 | { |
| 4724 | if (CommandStatus == DAC960_V2_NormalCompletion) { | 4726 | if (CommandStatus == DAC960_V2_NormalCompletion) { |
| 4725 | DAC960_V2_ReportEvent(Controller, Controller->V2.Event); | 4727 | DAC960_V2_ReportEvent(Controller, Controller->V2.Event); |
| 4726 | } | 4728 | } |
| 4727 | Controller->V2.NextEventSequenceNumber++; | 4729 | Controller->V2.NextEventSequenceNumber++; |
| 4728 | } | 4730 | } |
| 4729 | else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid && | 4731 | else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid && |
| 4730 | CommandStatus == DAC960_V2_NormalCompletion) | 4732 | CommandStatus == DAC960_V2_NormalCompletion) |
| 4731 | { | 4733 | { |
| 4732 | DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = | 4734 | DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo = |
| @@ -4915,7 +4917,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
| 4915 | NewPhysicalDeviceInfo->LogicalUnit++; | 4917 | NewPhysicalDeviceInfo->LogicalUnit++; |
| 4916 | Controller->V2.PhysicalDeviceIndex++; | 4918 | Controller->V2.PhysicalDeviceIndex++; |
| 4917 | } | 4919 | } |
| 4918 | else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid) | 4920 | else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid) |
| 4919 | { | 4921 | { |
| 4920 | unsigned int DeviceIndex; | 4922 | unsigned int DeviceIndex; |
| 4921 | for (DeviceIndex = Controller->V2.PhysicalDeviceIndex; | 4923 | for (DeviceIndex = Controller->V2.PhysicalDeviceIndex; |
| @@ -4938,7 +4940,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
| 4938 | } | 4940 | } |
| 4939 | Controller->V2.NeedPhysicalDeviceInformation = false; | 4941 | Controller->V2.NeedPhysicalDeviceInformation = false; |
| 4940 | } | 4942 | } |
| 4941 | else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid && | 4943 | else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid && |
| 4942 | CommandStatus == DAC960_V2_NormalCompletion) | 4944 | CommandStatus == DAC960_V2_NormalCompletion) |
| 4943 | { | 4945 | { |
| 4944 | DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo = | 4946 | DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo = |
| @@ -5065,7 +5067,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command) | |||
| 5065 | [LogicalDeviceNumber] = true; | 5067 | [LogicalDeviceNumber] = true; |
| 5066 | NewLogicalDeviceInfo->LogicalDeviceNumber++; | 5068 | NewLogicalDeviceInfo->LogicalDeviceNumber++; |
| 5067 | } | 5069 | } |
| 5068 | else if (CommandOpcode == DAC960_V2_GetLogicalDeviceInfoValid) | 5070 | else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid) |
| 5069 | { | 5071 | { |
| 5070 | int LogicalDriveNumber; | 5072 | int LogicalDriveNumber; |
| 5071 | for (LogicalDriveNumber = 0; | 5073 | for (LogicalDriveNumber = 0; |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 9baf11e86362..744f078f4dd8 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
| @@ -3832,7 +3832,7 @@ static int __floppy_read_block_0(struct block_device *bdev) | |||
| 3832 | bio.bi_size = size; | 3832 | bio.bi_size = size; |
| 3833 | bio.bi_bdev = bdev; | 3833 | bio.bi_bdev = bdev; |
| 3834 | bio.bi_sector = 0; | 3834 | bio.bi_sector = 0; |
| 3835 | bio.bi_flags = BIO_QUIET; | 3835 | bio.bi_flags = (1 << BIO_QUIET); |
| 3836 | init_completion(&complete); | 3836 | init_completion(&complete); |
| 3837 | bio.bi_private = &complete; | 3837 | bio.bi_private = &complete; |
| 3838 | bio.bi_end_io = floppy_rb0_complete; | 3838 | bio.bi_end_io = floppy_rb0_complete; |
diff --git a/drivers/block/sx8.c b/drivers/block/sx8.c index e7472f567c9d..3fb6ab4c8b4e 100644 --- a/drivers/block/sx8.c +++ b/drivers/block/sx8.c | |||
| @@ -1120,7 +1120,7 @@ static inline void carm_handle_resp(struct carm_host *host, | |||
| 1120 | break; | 1120 | break; |
| 1121 | case MISC_GET_FW_VER: { | 1121 | case MISC_GET_FW_VER: { |
| 1122 | struct carm_fw_ver *ver = (struct carm_fw_ver *) | 1122 | struct carm_fw_ver *ver = (struct carm_fw_ver *) |
| 1123 | mem + sizeof(struct carm_msg_get_fw_ver); | 1123 | (mem + sizeof(struct carm_msg_get_fw_ver)); |
| 1124 | if (!error) { | 1124 | if (!error) { |
| 1125 | host->fw_ver = le32_to_cpu(ver->version); | 1125 | host->fw_ver = le32_to_cpu(ver->version); |
| 1126 | host->flags |= (ver->features & FL_FW_VER_MASK); | 1126 | host->flags |= (ver->features & FL_FW_VER_MASK); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 618bd4d87d28..99d5527b2ca6 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c | |||
| @@ -54,14 +54,14 @@ convert_to_display_mode(struct drm_display_mode *mode, | |||
| 54 | mode->vrefresh = timing->refresh; | 54 | mode->vrefresh = timing->refresh; |
| 55 | 55 | ||
| 56 | mode->hdisplay = timing->xres; | 56 | mode->hdisplay = timing->xres; |
| 57 | mode->hsync_start = mode->hdisplay + timing->left_margin; | 57 | mode->hsync_start = mode->hdisplay + timing->right_margin; |
| 58 | mode->hsync_end = mode->hsync_start + timing->hsync_len; | 58 | mode->hsync_end = mode->hsync_start + timing->hsync_len; |
| 59 | mode->htotal = mode->hsync_end + timing->right_margin; | 59 | mode->htotal = mode->hsync_end + timing->left_margin; |
| 60 | 60 | ||
| 61 | mode->vdisplay = timing->yres; | 61 | mode->vdisplay = timing->yres; |
| 62 | mode->vsync_start = mode->vdisplay + timing->upper_margin; | 62 | mode->vsync_start = mode->vdisplay + timing->lower_margin; |
| 63 | mode->vsync_end = mode->vsync_start + timing->vsync_len; | 63 | mode->vsync_end = mode->vsync_start + timing->vsync_len; |
| 64 | mode->vtotal = mode->vsync_end + timing->lower_margin; | 64 | mode->vtotal = mode->vsync_end + timing->upper_margin; |
| 65 | mode->width_mm = panel->width_mm; | 65 | mode->width_mm = panel->width_mm; |
| 66 | mode->height_mm = panel->height_mm; | 66 | mode->height_mm = panel->height_mm; |
| 67 | 67 | ||
| @@ -85,14 +85,14 @@ convert_to_video_timing(struct fb_videomode *timing, | |||
| 85 | timing->refresh = drm_mode_vrefresh(mode); | 85 | timing->refresh = drm_mode_vrefresh(mode); |
| 86 | 86 | ||
| 87 | timing->xres = mode->hdisplay; | 87 | timing->xres = mode->hdisplay; |
| 88 | timing->left_margin = mode->hsync_start - mode->hdisplay; | 88 | timing->right_margin = mode->hsync_start - mode->hdisplay; |
| 89 | timing->hsync_len = mode->hsync_end - mode->hsync_start; | 89 | timing->hsync_len = mode->hsync_end - mode->hsync_start; |
| 90 | timing->right_margin = mode->htotal - mode->hsync_end; | 90 | timing->left_margin = mode->htotal - mode->hsync_end; |
| 91 | 91 | ||
| 92 | timing->yres = mode->vdisplay; | 92 | timing->yres = mode->vdisplay; |
| 93 | timing->upper_margin = mode->vsync_start - mode->vdisplay; | 93 | timing->lower_margin = mode->vsync_start - mode->vdisplay; |
| 94 | timing->vsync_len = mode->vsync_end - mode->vsync_start; | 94 | timing->vsync_len = mode->vsync_end - mode->vsync_start; |
| 95 | timing->lower_margin = mode->vtotal - mode->vsync_end; | 95 | timing->upper_margin = mode->vtotal - mode->vsync_end; |
| 96 | 96 | ||
| 97 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | 97 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
| 98 | timing->vmode = FB_VMODE_INTERLACED; | 98 | timing->vmode = FB_VMODE_INTERLACED; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 58820ebd3558..09cc13f791b3 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -246,7 +246,7 @@ static struct platform_driver exynos_drm_platform_driver = { | |||
| 246 | .remove = __devexit_p(exynos_drm_platform_remove), | 246 | .remove = __devexit_p(exynos_drm_platform_remove), |
| 247 | .driver = { | 247 | .driver = { |
| 248 | .owner = THIS_MODULE, | 248 | .owner = THIS_MODULE, |
| 249 | .name = DRIVER_NAME, | 249 | .name = "exynos-drm", |
| 250 | }, | 250 | }, |
| 251 | }; | 251 | }; |
| 252 | 252 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 3508700e529b..54f8f074822f 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
| @@ -46,39 +46,13 @@ struct exynos_drm_fbdev { | |||
| 46 | struct exynos_drm_gem_obj *exynos_gem_obj; | 46 | struct exynos_drm_gem_obj *exynos_gem_obj; |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | static int exynos_drm_fbdev_set_par(struct fb_info *info) | ||
| 50 | { | ||
| 51 | struct fb_var_screeninfo *var = &info->var; | ||
| 52 | |||
| 53 | switch (var->bits_per_pixel) { | ||
| 54 | case 32: | ||
| 55 | case 24: | ||
| 56 | case 18: | ||
| 57 | case 16: | ||
| 58 | case 12: | ||
| 59 | info->fix.visual = FB_VISUAL_TRUECOLOR; | ||
| 60 | break; | ||
| 61 | case 1: | ||
| 62 | info->fix.visual = FB_VISUAL_MONO01; | ||
| 63 | break; | ||
| 64 | default: | ||
| 65 | info->fix.visual = FB_VISUAL_PSEUDOCOLOR; | ||
| 66 | break; | ||
| 67 | } | ||
| 68 | |||
| 69 | info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8; | ||
| 70 | |||
| 71 | return drm_fb_helper_set_par(info); | ||
| 72 | } | ||
| 73 | |||
| 74 | |||
| 75 | static struct fb_ops exynos_drm_fb_ops = { | 49 | static struct fb_ops exynos_drm_fb_ops = { |
| 76 | .owner = THIS_MODULE, | 50 | .owner = THIS_MODULE, |
| 77 | .fb_fillrect = cfb_fillrect, | 51 | .fb_fillrect = cfb_fillrect, |
| 78 | .fb_copyarea = cfb_copyarea, | 52 | .fb_copyarea = cfb_copyarea, |
| 79 | .fb_imageblit = cfb_imageblit, | 53 | .fb_imageblit = cfb_imageblit, |
| 80 | .fb_check_var = drm_fb_helper_check_var, | 54 | .fb_check_var = drm_fb_helper_check_var, |
| 81 | .fb_set_par = exynos_drm_fbdev_set_par, | 55 | .fb_set_par = drm_fb_helper_set_par, |
| 82 | .fb_blank = drm_fb_helper_blank, | 56 | .fb_blank = drm_fb_helper_blank, |
| 83 | .fb_pan_display = drm_fb_helper_pan_display, | 57 | .fb_pan_display = drm_fb_helper_pan_display, |
| 84 | .fb_setcmap = drm_fb_helper_setcmap, | 58 | .fb_setcmap = drm_fb_helper_setcmap, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 360adf2bba04..56458eea0501 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -817,8 +817,6 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
| 817 | goto err_clk_get; | 817 | goto err_clk_get; |
| 818 | } | 818 | } |
| 819 | 819 | ||
| 820 | clk_enable(ctx->bus_clk); | ||
| 821 | |||
| 822 | ctx->lcd_clk = clk_get(dev, "sclk_fimd"); | 820 | ctx->lcd_clk = clk_get(dev, "sclk_fimd"); |
| 823 | if (IS_ERR(ctx->lcd_clk)) { | 821 | if (IS_ERR(ctx->lcd_clk)) { |
| 824 | dev_err(dev, "failed to get lcd clock\n"); | 822 | dev_err(dev, "failed to get lcd clock\n"); |
| @@ -826,8 +824,6 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
| 826 | goto err_bus_clk; | 824 | goto err_bus_clk; |
| 827 | } | 825 | } |
| 828 | 826 | ||
| 829 | clk_enable(ctx->lcd_clk); | ||
| 830 | |||
| 831 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 827 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 832 | if (!res) { | 828 | if (!res) { |
| 833 | dev_err(dev, "failed to find registers\n"); | 829 | dev_err(dev, "failed to find registers\n"); |
| @@ -864,17 +860,11 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
| 864 | goto err_req_irq; | 860 | goto err_req_irq; |
| 865 | } | 861 | } |
| 866 | 862 | ||
| 867 | ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing); | ||
| 868 | ctx->vidcon0 = pdata->vidcon0; | 863 | ctx->vidcon0 = pdata->vidcon0; |
| 869 | ctx->vidcon1 = pdata->vidcon1; | 864 | ctx->vidcon1 = pdata->vidcon1; |
| 870 | ctx->default_win = pdata->default_win; | 865 | ctx->default_win = pdata->default_win; |
| 871 | ctx->panel = panel; | 866 | ctx->panel = panel; |
| 872 | 867 | ||
| 873 | panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv; | ||
| 874 | |||
| 875 | DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n", | ||
| 876 | panel->timing.pixclock, ctx->clkdiv); | ||
| 877 | |||
| 878 | subdrv = &ctx->subdrv; | 868 | subdrv = &ctx->subdrv; |
| 879 | 869 | ||
| 880 | subdrv->probe = fimd_subdrv_probe; | 870 | subdrv->probe = fimd_subdrv_probe; |
| @@ -889,10 +879,15 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
| 889 | 879 | ||
| 890 | platform_set_drvdata(pdev, ctx); | 880 | platform_set_drvdata(pdev, ctx); |
| 891 | 881 | ||
| 892 | pm_runtime_set_active(dev); | ||
| 893 | pm_runtime_enable(dev); | 882 | pm_runtime_enable(dev); |
| 894 | pm_runtime_get_sync(dev); | 883 | pm_runtime_get_sync(dev); |
| 895 | 884 | ||
| 885 | ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing); | ||
| 886 | panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv; | ||
| 887 | |||
| 888 | DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n", | ||
| 889 | panel->timing.pixclock, ctx->clkdiv); | ||
| 890 | |||
| 896 | for (win = 0; win < WINDOWS_NR; win++) | 891 | for (win = 0; win < WINDOWS_NR; win++) |
| 897 | fimd_clear_win(ctx, win); | 892 | fimd_clear_win(ctx, win); |
| 898 | 893 | ||
diff --git a/drivers/gpu/drm/gma500/cdv_device.c b/drivers/gpu/drm/gma500/cdv_device.c index 4a5b099c3bc5..53404af2e748 100644 --- a/drivers/gpu/drm/gma500/cdv_device.c +++ b/drivers/gpu/drm/gma500/cdv_device.c | |||
| @@ -321,6 +321,8 @@ static int cdv_chip_setup(struct drm_device *dev) | |||
| 321 | cdv_get_core_freq(dev); | 321 | cdv_get_core_freq(dev); |
| 322 | gma_intel_opregion_init(dev); | 322 | gma_intel_opregion_init(dev); |
| 323 | psb_intel_init_bios(dev); | 323 | psb_intel_init_bios(dev); |
| 324 | REG_WRITE(PORT_HOTPLUG_EN, 0); | ||
| 325 | REG_WRITE(PORT_HOTPLUG_STAT, REG_READ(PORT_HOTPLUG_STAT)); | ||
| 324 | return 0; | 326 | return 0; |
| 325 | } | 327 | } |
| 326 | 328 | ||
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 830dfdd6bf15..be616735ec91 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
| @@ -247,7 +247,6 @@ static struct fb_ops psbfb_roll_ops = { | |||
| 247 | .fb_imageblit = cfb_imageblit, | 247 | .fb_imageblit = cfb_imageblit, |
| 248 | .fb_pan_display = psbfb_pan, | 248 | .fb_pan_display = psbfb_pan, |
| 249 | .fb_mmap = psbfb_mmap, | 249 | .fb_mmap = psbfb_mmap, |
| 250 | .fb_sync = psbfb_sync, | ||
| 251 | .fb_ioctl = psbfb_ioctl, | 250 | .fb_ioctl = psbfb_ioctl, |
| 252 | }; | 251 | }; |
| 253 | 252 | ||
diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 5d5330f667f1..aff194fbe9f3 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c | |||
| @@ -446,10 +446,9 @@ int psb_gtt_init(struct drm_device *dev, int resume) | |||
| 446 | pg->gtt_start = pci_resource_start(dev->pdev, PSB_GTT_RESOURCE); | 446 | pg->gtt_start = pci_resource_start(dev->pdev, PSB_GTT_RESOURCE); |
| 447 | gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) | 447 | gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) |
| 448 | >> PAGE_SHIFT; | 448 | >> PAGE_SHIFT; |
| 449 | /* Some CDV firmware doesn't report this currently. In which case the | 449 | /* CDV doesn't report this. In which case the system has 64 gtt pages */ |
| 450 | system has 64 gtt pages */ | ||
| 451 | if (pg->gtt_start == 0 || gtt_pages == 0) { | 450 | if (pg->gtt_start == 0 || gtt_pages == 0) { |
| 452 | dev_err(dev->dev, "GTT PCI BAR not initialized.\n"); | 451 | dev_dbg(dev->dev, "GTT PCI BAR not initialized.\n"); |
| 453 | gtt_pages = 64; | 452 | gtt_pages = 64; |
| 454 | pg->gtt_start = dev_priv->pge_ctl; | 453 | pg->gtt_start = dev_priv->pge_ctl; |
| 455 | } | 454 | } |
| @@ -461,10 +460,10 @@ int psb_gtt_init(struct drm_device *dev, int resume) | |||
| 461 | 460 | ||
| 462 | if (pg->gatt_pages == 0 || pg->gatt_start == 0) { | 461 | if (pg->gatt_pages == 0 || pg->gatt_start == 0) { |
| 463 | static struct resource fudge; /* Preferably peppermint */ | 462 | static struct resource fudge; /* Preferably peppermint */ |
| 464 | /* This can occur on CDV SDV systems. Fudge it in this case. | 463 | /* This can occur on CDV systems. Fudge it in this case. |
| 465 | We really don't care what imaginary space is being allocated | 464 | We really don't care what imaginary space is being allocated |
| 466 | at this point */ | 465 | at this point */ |
| 467 | dev_err(dev->dev, "GATT PCI BAR not initialized.\n"); | 466 | dev_dbg(dev->dev, "GATT PCI BAR not initialized.\n"); |
| 468 | pg->gatt_start = 0x40000000; | 467 | pg->gatt_start = 0x40000000; |
| 469 | pg->gatt_pages = (128 * 1024 * 1024) >> PAGE_SHIFT; | 468 | pg->gatt_pages = (128 * 1024 * 1024) >> PAGE_SHIFT; |
| 470 | /* This is a little confusing but in fact the GTT is providing | 469 | /* This is a little confusing but in fact the GTT is providing |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 03c53fcf8653..558ac716a328 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -2689,7 +2689,7 @@ | |||
| 2689 | #define DVS_FORMAT_RGBX888 (2<<25) | 2689 | #define DVS_FORMAT_RGBX888 (2<<25) |
| 2690 | #define DVS_FORMAT_RGBX161616 (3<<25) | 2690 | #define DVS_FORMAT_RGBX161616 (3<<25) |
| 2691 | #define DVS_SOURCE_KEY (1<<22) | 2691 | #define DVS_SOURCE_KEY (1<<22) |
| 2692 | #define DVS_RGB_ORDER_RGBX (1<<20) | 2692 | #define DVS_RGB_ORDER_XBGR (1<<20) |
| 2693 | #define DVS_YUV_BYTE_ORDER_MASK (3<<16) | 2693 | #define DVS_YUV_BYTE_ORDER_MASK (3<<16) |
| 2694 | #define DVS_YUV_ORDER_YUYV (0<<16) | 2694 | #define DVS_YUV_ORDER_YUYV (0<<16) |
| 2695 | #define DVS_YUV_ORDER_UYVY (1<<16) | 2695 | #define DVS_YUV_ORDER_UYVY (1<<16) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index f851db7be2cc..397087cf689e 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -7828,6 +7828,7 @@ int intel_framebuffer_init(struct drm_device *dev, | |||
| 7828 | case DRM_FORMAT_RGB332: | 7828 | case DRM_FORMAT_RGB332: |
| 7829 | case DRM_FORMAT_RGB565: | 7829 | case DRM_FORMAT_RGB565: |
| 7830 | case DRM_FORMAT_XRGB8888: | 7830 | case DRM_FORMAT_XRGB8888: |
| 7831 | case DRM_FORMAT_XBGR8888: | ||
| 7831 | case DRM_FORMAT_ARGB8888: | 7832 | case DRM_FORMAT_ARGB8888: |
| 7832 | case DRM_FORMAT_XRGB2101010: | 7833 | case DRM_FORMAT_XRGB2101010: |
| 7833 | case DRM_FORMAT_ARGB2101010: | 7834 | case DRM_FORMAT_ARGB2101010: |
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 2288abf88cce..a0835040c86b 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
| @@ -225,16 +225,16 @@ snb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
| 225 | 225 | ||
| 226 | /* Mask out pixel format bits in case we change it */ | 226 | /* Mask out pixel format bits in case we change it */ |
| 227 | dvscntr &= ~DVS_PIXFORMAT_MASK; | 227 | dvscntr &= ~DVS_PIXFORMAT_MASK; |
| 228 | dvscntr &= ~DVS_RGB_ORDER_RGBX; | 228 | dvscntr &= ~DVS_RGB_ORDER_XBGR; |
| 229 | dvscntr &= ~DVS_YUV_BYTE_ORDER_MASK; | 229 | dvscntr &= ~DVS_YUV_BYTE_ORDER_MASK; |
| 230 | 230 | ||
| 231 | switch (fb->pixel_format) { | 231 | switch (fb->pixel_format) { |
| 232 | case DRM_FORMAT_XBGR8888: | 232 | case DRM_FORMAT_XBGR8888: |
| 233 | dvscntr |= DVS_FORMAT_RGBX888; | 233 | dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_XBGR; |
| 234 | pixel_size = 4; | 234 | pixel_size = 4; |
| 235 | break; | 235 | break; |
| 236 | case DRM_FORMAT_XRGB8888: | 236 | case DRM_FORMAT_XRGB8888: |
| 237 | dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_RGBX; | 237 | dvscntr |= DVS_FORMAT_RGBX888; |
| 238 | pixel_size = 4; | 238 | pixel_size = 4; |
| 239 | break; | 239 | break; |
| 240 | case DRM_FORMAT_YUYV: | 240 | case DRM_FORMAT_YUYV: |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index fbcd84803b60..17ca72ce3027 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -2362,6 +2362,9 @@ void r600_semaphore_ring_emit(struct radeon_device *rdev, | |||
| 2362 | uint64_t addr = semaphore->gpu_addr; | 2362 | uint64_t addr = semaphore->gpu_addr; |
| 2363 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; | 2363 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; |
| 2364 | 2364 | ||
| 2365 | if (rdev->family < CHIP_CAYMAN) | ||
| 2366 | sel |= PACKET3_SEM_WAIT_ON_SIGNAL; | ||
| 2367 | |||
| 2365 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); | 2368 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); |
| 2366 | radeon_ring_write(ring, addr & 0xffffffff); | 2369 | radeon_ring_write(ring, addr & 0xffffffff); |
| 2367 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); | 2370 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); |
diff --git a/drivers/gpu/drm/radeon/r600_blit_shaders.c b/drivers/gpu/drm/radeon/r600_blit_shaders.c index 2d1f6c5ee2a7..73e2c7c6edbc 100644 --- a/drivers/gpu/drm/radeon/r600_blit_shaders.c +++ b/drivers/gpu/drm/radeon/r600_blit_shaders.c | |||
| @@ -314,6 +314,10 @@ const u32 r6xx_default_state[] = | |||
| 314 | 0x00000000, /* VGT_VTX_CNT_EN */ | 314 | 0x00000000, /* VGT_VTX_CNT_EN */ |
| 315 | 315 | ||
| 316 | 0xc0016900, | 316 | 0xc0016900, |
| 317 | 0x000000d4, | ||
| 318 | 0x00000000, /* SX_MISC */ | ||
| 319 | |||
| 320 | 0xc0016900, | ||
| 317 | 0x000002c8, | 321 | 0x000002c8, |
| 318 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ | 322 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ |
| 319 | 323 | ||
| @@ -626,6 +630,10 @@ const u32 r7xx_default_state[] = | |||
| 626 | 0x00000000, /* VGT_VTX_CNT_EN */ | 630 | 0x00000000, /* VGT_VTX_CNT_EN */ |
| 627 | 631 | ||
| 628 | 0xc0016900, | 632 | 0xc0016900, |
| 633 | 0x000000d4, | ||
| 634 | 0x00000000, /* SX_MISC */ | ||
| 635 | |||
| 636 | 0xc0016900, | ||
| 629 | 0x000002c8, | 637 | 0x000002c8, |
| 630 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ | 638 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ |
| 631 | 639 | ||
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 3ee1fd7ef394..9b23670716f1 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -831,6 +831,7 @@ | |||
| 831 | #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 | 831 | #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 |
| 832 | #define PACKET3_INDIRECT_BUFFER_MP 0x38 | 832 | #define PACKET3_INDIRECT_BUFFER_MP 0x38 |
| 833 | #define PACKET3_MEM_SEMAPHORE 0x39 | 833 | #define PACKET3_MEM_SEMAPHORE 0x39 |
| 834 | # define PACKET3_SEM_WAIT_ON_SIGNAL (0x1 << 12) | ||
| 834 | # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) | 835 | # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) |
| 835 | # define PACKET3_SEM_SEL_WAIT (0x7 << 29) | 836 | # define PACKET3_SEM_SEL_WAIT (0x7 << 29) |
| 836 | #define PACKET3_MPEG_INDEX 0x3A | 837 | #define PACKET3_MPEG_INDEX 0x3A |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 8b3d8ed52ff6..8c9a8115b632 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -1057,7 +1057,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector, | |||
| 1057 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) | 1057 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
| 1058 | return MODE_OK; | 1058 | return MODE_OK; |
| 1059 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { | 1059 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { |
| 1060 | if (ASIC_IS_DCE3(rdev)) { | 1060 | if (0) { |
| 1061 | /* HDMI 1.3+ supports max clock of 340 Mhz */ | 1061 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
| 1062 | if (mode->clock > 340000) | 1062 | if (mode->clock > 340000) |
| 1063 | return MODE_CLOCK_HIGH; | 1063 | return MODE_CLOCK_HIGH; |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 8c49fef1ce78..3d314338d843 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -1078,15 +1078,21 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = { | |||
| 1078 | .create_handle = radeon_user_framebuffer_create_handle, | 1078 | .create_handle = radeon_user_framebuffer_create_handle, |
| 1079 | }; | 1079 | }; |
| 1080 | 1080 | ||
| 1081 | void | 1081 | int |
| 1082 | radeon_framebuffer_init(struct drm_device *dev, | 1082 | radeon_framebuffer_init(struct drm_device *dev, |
| 1083 | struct radeon_framebuffer *rfb, | 1083 | struct radeon_framebuffer *rfb, |
| 1084 | struct drm_mode_fb_cmd2 *mode_cmd, | 1084 | struct drm_mode_fb_cmd2 *mode_cmd, |
| 1085 | struct drm_gem_object *obj) | 1085 | struct drm_gem_object *obj) |
| 1086 | { | 1086 | { |
| 1087 | int ret; | ||
| 1087 | rfb->obj = obj; | 1088 | rfb->obj = obj; |
| 1088 | drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); | 1089 | ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); |
| 1090 | if (ret) { | ||
| 1091 | rfb->obj = NULL; | ||
| 1092 | return ret; | ||
| 1093 | } | ||
| 1089 | drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); | 1094 | drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); |
| 1095 | return 0; | ||
| 1090 | } | 1096 | } |
| 1091 | 1097 | ||
| 1092 | static struct drm_framebuffer * | 1098 | static struct drm_framebuffer * |
| @@ -1096,6 +1102,7 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
| 1096 | { | 1102 | { |
| 1097 | struct drm_gem_object *obj; | 1103 | struct drm_gem_object *obj; |
| 1098 | struct radeon_framebuffer *radeon_fb; | 1104 | struct radeon_framebuffer *radeon_fb; |
| 1105 | int ret; | ||
| 1099 | 1106 | ||
| 1100 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); | 1107 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); |
| 1101 | if (obj == NULL) { | 1108 | if (obj == NULL) { |
| @@ -1108,7 +1115,12 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
| 1108 | if (radeon_fb == NULL) | 1115 | if (radeon_fb == NULL) |
| 1109 | return ERR_PTR(-ENOMEM); | 1116 | return ERR_PTR(-ENOMEM); |
| 1110 | 1117 | ||
| 1111 | radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); | 1118 | ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); |
| 1119 | if (ret) { | ||
| 1120 | kfree(radeon_fb); | ||
| 1121 | drm_gem_object_unreference_unlocked(obj); | ||
| 1122 | return NULL; | ||
| 1123 | } | ||
| 1112 | 1124 | ||
| 1113 | return &radeon_fb->base; | 1125 | return &radeon_fb->base; |
| 1114 | } | 1126 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 9419c51bcf50..26e92708d114 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -307,8 +307,6 @@ void radeon_panel_mode_fixup(struct drm_encoder *encoder, | |||
| 307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | 307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, |
| 308 | u32 pixel_clock) | 308 | u32 pixel_clock) |
| 309 | { | 309 | { |
| 310 | struct drm_device *dev = encoder->dev; | ||
| 311 | struct radeon_device *rdev = dev->dev_private; | ||
| 312 | struct drm_connector *connector; | 310 | struct drm_connector *connector; |
| 313 | struct radeon_connector *radeon_connector; | 311 | struct radeon_connector *radeon_connector; |
| 314 | struct radeon_connector_atom_dig *dig_connector; | 312 | struct radeon_connector_atom_dig *dig_connector; |
| @@ -326,7 +324,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
| 326 | case DRM_MODE_CONNECTOR_HDMIB: | 324 | case DRM_MODE_CONNECTOR_HDMIB: |
| 327 | if (radeon_connector->use_digital) { | 325 | if (radeon_connector->use_digital) { |
| 328 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | 326 | /* HDMI 1.3 supports up to 340 Mhz over single link */ |
| 329 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | 327 | if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
| 330 | if (pixel_clock > 340000) | 328 | if (pixel_clock > 340000) |
| 331 | return true; | 329 | return true; |
| 332 | else | 330 | else |
| @@ -348,7 +346,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
| 348 | return false; | 346 | return false; |
| 349 | else { | 347 | else { |
| 350 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | 348 | /* HDMI 1.3 supports up to 340 Mhz over single link */ |
| 351 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | 349 | if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
| 352 | if (pixel_clock > 340000) | 350 | if (pixel_clock > 340000) |
| 353 | return true; | 351 | return true; |
| 354 | else | 352 | else |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index cf2bf35b56b8..195471cf65d3 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
| @@ -209,6 +209,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
| 209 | sizes->surface_depth); | 209 | sizes->surface_depth); |
| 210 | 210 | ||
| 211 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); | 211 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); |
| 212 | if (ret) { | ||
| 213 | DRM_ERROR("failed to create fbcon object %d\n", ret); | ||
| 214 | return ret; | ||
| 215 | } | ||
| 216 | |||
| 212 | rbo = gem_to_radeon_bo(gobj); | 217 | rbo = gem_to_radeon_bo(gobj); |
| 213 | 218 | ||
| 214 | /* okay we have an object now allocate the framebuffer */ | 219 | /* okay we have an object now allocate the framebuffer */ |
| @@ -220,7 +225,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
| 220 | 225 | ||
| 221 | info->par = rfbdev; | 226 | info->par = rfbdev; |
| 222 | 227 | ||
| 223 | radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); | 228 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); |
| 229 | if (ret) { | ||
| 230 | DRM_ERROR("failed to initalise framebuffer %d\n", ret); | ||
| 231 | goto out_unref; | ||
| 232 | } | ||
| 224 | 233 | ||
| 225 | fb = &rfbdev->rfb.base; | 234 | fb = &rfbdev->rfb.base; |
| 226 | 235 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 4330e3253573..8a85598fb242 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -649,7 +649,7 @@ extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | |||
| 649 | u16 blue, int regno); | 649 | u16 blue, int regno); |
| 650 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | 650 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, |
| 651 | u16 *blue, int regno); | 651 | u16 *blue, int regno); |
| 652 | void radeon_framebuffer_init(struct drm_device *dev, | 652 | int radeon_framebuffer_init(struct drm_device *dev, |
| 653 | struct radeon_framebuffer *rfb, | 653 | struct radeon_framebuffer *rfb, |
| 654 | struct drm_mode_fb_cmd2 *mode_cmd, | 654 | struct drm_mode_fb_cmd2 *mode_cmd, |
| 655 | struct drm_gem_object *obj); | 655 | struct drm_gem_object *obj); |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index b8574cddd953..63552e30d0c3 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -59,6 +59,9 @@ | |||
| 59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA | 59 | #define USB_VENDOR_ID_AIRCABLE 0x16CA |
| 60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 | 60 | #define USB_DEVICE_ID_AIRCABLE1 0x1502 |
| 61 | 61 | ||
| 62 | #define USB_VENDOR_ID_AIREN 0x1a2c | ||
| 63 | #define USB_DEVICE_ID_AIREN_SLIMPLUS 0x0002 | ||
| 64 | |||
| 62 | #define USB_VENDOR_ID_ALCOR 0x058f | 65 | #define USB_VENDOR_ID_ALCOR 0x058f |
| 63 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 | 66 | #define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 |
| 64 | 67 | ||
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 9333d692a786..627850a54d34 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
| @@ -986,8 +986,13 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct | |||
| 986 | return; | 986 | return; |
| 987 | } | 987 | } |
| 988 | 988 | ||
| 989 | /* Ignore out-of-range values as per HID specification, section 5.10 */ | 989 | /* |
| 990 | if (value < field->logical_minimum || value > field->logical_maximum) { | 990 | * Ignore out-of-range values as per HID specification, |
| 991 | * section 5.10 and 6.2.25 | ||
| 992 | */ | ||
| 993 | if ((field->flags & HID_MAIN_ITEM_VARIABLE) && | ||
| 994 | (value < field->logical_minimum || | ||
| 995 | value > field->logical_maximum)) { | ||
| 991 | dbg_hid("Ignoring out-of-range value %x\n", value); | 996 | dbg_hid("Ignoring out-of-range value %x\n", value); |
| 992 | return; | 997 | return; |
| 993 | } | 998 | } |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index c831af937481..57d4e1e1df48 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
| @@ -54,6 +54,7 @@ static const struct hid_blacklist { | |||
| 54 | { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, | 54 | { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, |
| 55 | { USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT }, | 55 | { USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT }, |
| 56 | 56 | ||
| 57 | { USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS, HID_QUIRK_NOGET }, | ||
| 57 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, | 58 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, |
| 58 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, | 59 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, |
| 59 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, | 60 | { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 02260406b9e4..dad895fec62a 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
| @@ -497,8 +497,9 @@ config SENSORS_JC42 | |||
| 497 | If you say yes here, you get support for JEDEC JC42.4 compliant | 497 | If you say yes here, you get support for JEDEC JC42.4 compliant |
| 498 | temperature sensors, which are used on many DDR3 memory modules for | 498 | temperature sensors, which are used on many DDR3 memory modules for |
| 499 | mobile devices and servers. Support will include, but not be limited | 499 | mobile devices and servers. Support will include, but not be limited |
| 500 | to, ADT7408, CAT34TS02, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243, | 500 | to, ADT7408, AT30TS00, CAT34TS02, CAT6095, MAX6604, MCP9804, MCP9805, |
| 501 | MCP9843, SE97, SE98, STTS424(E), TSE2002B3, and TS3000B3. | 501 | MCP98242, MCP98243, MCP9843, SE97, SE98, STTS424(E), STTS2002, |
| 502 | STTS3000, TSE2002B3, TSE2002GB2, TS3000B3, and TS3000GB2. | ||
| 502 | 503 | ||
| 503 | This driver can also be built as a module. If so, the module | 504 | This driver can also be built as a module. If so, the module |
| 504 | will be called jc42. | 505 | will be called jc42. |
diff --git a/drivers/hwmon/jc42.c b/drivers/hwmon/jc42.c index 28c09eead36b..b927ee5ccdd7 100644 --- a/drivers/hwmon/jc42.c +++ b/drivers/hwmon/jc42.c | |||
| @@ -64,6 +64,7 @@ static const unsigned short normal_i2c[] = { | |||
| 64 | 64 | ||
| 65 | /* Manufacturer IDs */ | 65 | /* Manufacturer IDs */ |
| 66 | #define ADT_MANID 0x11d4 /* Analog Devices */ | 66 | #define ADT_MANID 0x11d4 /* Analog Devices */ |
| 67 | #define ATMEL_MANID 0x001f /* Atmel */ | ||
| 67 | #define MAX_MANID 0x004d /* Maxim */ | 68 | #define MAX_MANID 0x004d /* Maxim */ |
| 68 | #define IDT_MANID 0x00b3 /* IDT */ | 69 | #define IDT_MANID 0x00b3 /* IDT */ |
| 69 | #define MCP_MANID 0x0054 /* Microchip */ | 70 | #define MCP_MANID 0x0054 /* Microchip */ |
| @@ -77,15 +78,25 @@ static const unsigned short normal_i2c[] = { | |||
| 77 | #define ADT7408_DEVID 0x0801 | 78 | #define ADT7408_DEVID 0x0801 |
| 78 | #define ADT7408_DEVID_MASK 0xffff | 79 | #define ADT7408_DEVID_MASK 0xffff |
| 79 | 80 | ||
| 81 | /* Atmel */ | ||
| 82 | #define AT30TS00_DEVID 0x8201 | ||
| 83 | #define AT30TS00_DEVID_MASK 0xffff | ||
| 84 | |||
| 80 | /* IDT */ | 85 | /* IDT */ |
| 81 | #define TS3000B3_DEVID 0x2903 /* Also matches TSE2002B3 */ | 86 | #define TS3000B3_DEVID 0x2903 /* Also matches TSE2002B3 */ |
| 82 | #define TS3000B3_DEVID_MASK 0xffff | 87 | #define TS3000B3_DEVID_MASK 0xffff |
| 83 | 88 | ||
| 89 | #define TS3000GB2_DEVID 0x2912 /* Also matches TSE2002GB2 */ | ||
| 90 | #define TS3000GB2_DEVID_MASK 0xffff | ||
| 91 | |||
| 84 | /* Maxim */ | 92 | /* Maxim */ |
| 85 | #define MAX6604_DEVID 0x3e00 | 93 | #define MAX6604_DEVID 0x3e00 |
| 86 | #define MAX6604_DEVID_MASK 0xffff | 94 | #define MAX6604_DEVID_MASK 0xffff |
| 87 | 95 | ||
| 88 | /* Microchip */ | 96 | /* Microchip */ |
| 97 | #define MCP9804_DEVID 0x0200 | ||
| 98 | #define MCP9804_DEVID_MASK 0xfffc | ||
| 99 | |||
| 89 | #define MCP98242_DEVID 0x2000 | 100 | #define MCP98242_DEVID 0x2000 |
| 90 | #define MCP98242_DEVID_MASK 0xfffc | 101 | #define MCP98242_DEVID_MASK 0xfffc |
| 91 | 102 | ||
| @@ -113,6 +124,12 @@ static const unsigned short normal_i2c[] = { | |||
| 113 | #define STTS424E_DEVID 0x0000 | 124 | #define STTS424E_DEVID 0x0000 |
| 114 | #define STTS424E_DEVID_MASK 0xfffe | 125 | #define STTS424E_DEVID_MASK 0xfffe |
| 115 | 126 | ||
| 127 | #define STTS2002_DEVID 0x0300 | ||
| 128 | #define STTS2002_DEVID_MASK 0xffff | ||
| 129 | |||
| 130 | #define STTS3000_DEVID 0x0200 | ||
| 131 | #define STTS3000_DEVID_MASK 0xffff | ||
| 132 | |||
| 116 | static u16 jc42_hysteresis[] = { 0, 1500, 3000, 6000 }; | 133 | static u16 jc42_hysteresis[] = { 0, 1500, 3000, 6000 }; |
| 117 | 134 | ||
| 118 | struct jc42_chips { | 135 | struct jc42_chips { |
| @@ -123,8 +140,11 @@ struct jc42_chips { | |||
| 123 | 140 | ||
| 124 | static struct jc42_chips jc42_chips[] = { | 141 | static struct jc42_chips jc42_chips[] = { |
| 125 | { ADT_MANID, ADT7408_DEVID, ADT7408_DEVID_MASK }, | 142 | { ADT_MANID, ADT7408_DEVID, ADT7408_DEVID_MASK }, |
| 143 | { ATMEL_MANID, AT30TS00_DEVID, AT30TS00_DEVID_MASK }, | ||
| 126 | { IDT_MANID, TS3000B3_DEVID, TS3000B3_DEVID_MASK }, | 144 | { IDT_MANID, TS3000B3_DEVID, TS3000B3_DEVID_MASK }, |
| 145 | { IDT_MANID, TS3000GB2_DEVID, TS3000GB2_DEVID_MASK }, | ||
| 127 | { MAX_MANID, MAX6604_DEVID, MAX6604_DEVID_MASK }, | 146 | { MAX_MANID, MAX6604_DEVID, MAX6604_DEVID_MASK }, |
| 147 | { MCP_MANID, MCP9804_DEVID, MCP9804_DEVID_MASK }, | ||
| 128 | { MCP_MANID, MCP98242_DEVID, MCP98242_DEVID_MASK }, | 148 | { MCP_MANID, MCP98242_DEVID, MCP98242_DEVID_MASK }, |
| 129 | { MCP_MANID, MCP98243_DEVID, MCP98243_DEVID_MASK }, | 149 | { MCP_MANID, MCP98243_DEVID, MCP98243_DEVID_MASK }, |
| 130 | { MCP_MANID, MCP9843_DEVID, MCP9843_DEVID_MASK }, | 150 | { MCP_MANID, MCP9843_DEVID, MCP9843_DEVID_MASK }, |
| @@ -133,6 +153,8 @@ static struct jc42_chips jc42_chips[] = { | |||
| 133 | { NXP_MANID, SE98_DEVID, SE98_DEVID_MASK }, | 153 | { NXP_MANID, SE98_DEVID, SE98_DEVID_MASK }, |
| 134 | { STM_MANID, STTS424_DEVID, STTS424_DEVID_MASK }, | 154 | { STM_MANID, STTS424_DEVID, STTS424_DEVID_MASK }, |
| 135 | { STM_MANID, STTS424E_DEVID, STTS424E_DEVID_MASK }, | 155 | { STM_MANID, STTS424E_DEVID, STTS424E_DEVID_MASK }, |
| 156 | { STM_MANID, STTS2002_DEVID, STTS2002_DEVID_MASK }, | ||
| 157 | { STM_MANID, STTS3000_DEVID, STTS3000_DEVID_MASK }, | ||
| 136 | }; | 158 | }; |
| 137 | 159 | ||
| 138 | /* Each client has this additional data */ | 160 | /* Each client has this additional data */ |
| @@ -159,10 +181,12 @@ static struct jc42_data *jc42_update_device(struct device *dev); | |||
| 159 | 181 | ||
| 160 | static const struct i2c_device_id jc42_id[] = { | 182 | static const struct i2c_device_id jc42_id[] = { |
| 161 | { "adt7408", 0 }, | 183 | { "adt7408", 0 }, |
| 184 | { "at30ts00", 0 }, | ||
| 162 | { "cat94ts02", 0 }, | 185 | { "cat94ts02", 0 }, |
| 163 | { "cat6095", 0 }, | 186 | { "cat6095", 0 }, |
| 164 | { "jc42", 0 }, | 187 | { "jc42", 0 }, |
| 165 | { "max6604", 0 }, | 188 | { "max6604", 0 }, |
| 189 | { "mcp9804", 0 }, | ||
| 166 | { "mcp9805", 0 }, | 190 | { "mcp9805", 0 }, |
| 167 | { "mcp98242", 0 }, | 191 | { "mcp98242", 0 }, |
| 168 | { "mcp98243", 0 }, | 192 | { "mcp98243", 0 }, |
| @@ -171,8 +195,10 @@ static const struct i2c_device_id jc42_id[] = { | |||
| 171 | { "se97b", 0 }, | 195 | { "se97b", 0 }, |
| 172 | { "se98", 0 }, | 196 | { "se98", 0 }, |
| 173 | { "stts424", 0 }, | 197 | { "stts424", 0 }, |
| 174 | { "tse2002b3", 0 }, | 198 | { "stts2002", 0 }, |
| 175 | { "ts3000b3", 0 }, | 199 | { "stts3000", 0 }, |
| 200 | { "tse2002", 0 }, | ||
| 201 | { "ts3000", 0 }, | ||
| 176 | { } | 202 | { } |
| 177 | }; | 203 | }; |
| 178 | MODULE_DEVICE_TABLE(i2c, jc42_id); | 204 | MODULE_DEVICE_TABLE(i2c, jc42_id); |
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index 00460d8d8423..d89b33967a85 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c | |||
| @@ -54,7 +54,8 @@ | |||
| 54 | lcrit_alarm, crit_alarm */ | 54 | lcrit_alarm, crit_alarm */ |
| 55 | #define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm, | 55 | #define PMBUS_IOUT_BOOLEANS_PER_PAGE 3 /* alarm, lcrit_alarm, |
| 56 | crit_alarm */ | 56 | crit_alarm */ |
| 57 | #define PMBUS_POUT_BOOLEANS_PER_PAGE 2 /* alarm, crit_alarm */ | 57 | #define PMBUS_POUT_BOOLEANS_PER_PAGE 3 /* cap_alarm, alarm, crit_alarm |
| 58 | */ | ||
| 58 | #define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */ | 59 | #define PMBUS_MAX_BOOLEANS_PER_FAN 2 /* alarm, fault */ |
| 59 | #define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm, | 60 | #define PMBUS_MAX_BOOLEANS_PER_TEMP 4 /* min_alarm, max_alarm, |
| 60 | lcrit_alarm, crit_alarm */ | 61 | lcrit_alarm, crit_alarm */ |
diff --git a/drivers/hwmon/pmbus/zl6100.c b/drivers/hwmon/pmbus/zl6100.c index 48c7b4a716ae..e3e8420b7b81 100644 --- a/drivers/hwmon/pmbus/zl6100.c +++ b/drivers/hwmon/pmbus/zl6100.c | |||
| @@ -33,6 +33,7 @@ enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105 }; | |||
| 33 | struct zl6100_data { | 33 | struct zl6100_data { |
| 34 | int id; | 34 | int id; |
| 35 | ktime_t access; /* chip access time */ | 35 | ktime_t access; /* chip access time */ |
| 36 | int delay; /* Delay between chip accesses in uS */ | ||
| 36 | struct pmbus_driver_info info; | 37 | struct pmbus_driver_info info; |
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| @@ -52,10 +53,10 @@ MODULE_PARM_DESC(delay, "Delay between chip accesses in uS"); | |||
| 52 | /* Some chips need a delay between accesses */ | 53 | /* Some chips need a delay between accesses */ |
| 53 | static inline void zl6100_wait(const struct zl6100_data *data) | 54 | static inline void zl6100_wait(const struct zl6100_data *data) |
| 54 | { | 55 | { |
| 55 | if (delay) { | 56 | if (data->delay) { |
| 56 | s64 delta = ktime_us_delta(ktime_get(), data->access); | 57 | s64 delta = ktime_us_delta(ktime_get(), data->access); |
| 57 | if (delta < delay) | 58 | if (delta < data->delay) |
| 58 | udelay(delay - delta); | 59 | udelay(data->delay - delta); |
| 59 | } | 60 | } |
| 60 | } | 61 | } |
| 61 | 62 | ||
| @@ -199,16 +200,11 @@ static int zl6100_probe(struct i2c_client *client, | |||
| 199 | data->id = mid->driver_data; | 200 | data->id = mid->driver_data; |
| 200 | 201 | ||
| 201 | /* | 202 | /* |
| 202 | * ZL2005, ZL2008, ZL2105, and ZL6100 are known to require a wait time | 203 | * According to information from the chip vendor, all currently |
| 203 | * between I2C accesses. ZL2004 and ZL6105 are known to be safe. | 204 | * supported chips are known to require a wait time between I2C |
| 204 | * Other chips have not yet been tested. | 205 | * accesses. |
| 205 | * | ||
| 206 | * Only clear the wait time for chips known to be safe. The wait time | ||
| 207 | * can be cleared later for additional chips if tests show that it | ||
| 208 | * is not needed (in other words, better be safe than sorry). | ||
| 209 | */ | 206 | */ |
| 210 | if (data->id == zl2004 || data->id == zl6105) | 207 | data->delay = delay; |
| 211 | delay = 0; | ||
| 212 | 208 | ||
| 213 | /* | 209 | /* |
| 214 | * Since there was a direct I2C device access above, wait before | 210 | * Since there was a direct I2C device access above, wait before |
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index 5276d1933dbc..a658d62c5e10 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | 0x8860 0xa1 | 39 | 0x8860 0xa1 |
| 40 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 | 40 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 |
| 41 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 | 41 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 |
| 42 | w83627uhg 8 2 2 2 0xa230 0xc1 0x5ca3 | 42 | w83627uhg 8 2 2 3 0xa230 0xc1 0x5ca3 |
| 43 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 | 43 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 |
| 44 | w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3 | 44 | w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3 |
| 45 | nct6775f 9 4 3 9 0xb470 0xc1 0x5ca3 | 45 | nct6775f 9 4 3 9 0xb470 0xc1 0x5ca3 |
| @@ -1607,7 +1607,7 @@ store_##reg(struct device *dev, struct device_attribute *attr, \ | |||
| 1607 | val = step_time_to_reg(val, data->pwm_mode[nr]); \ | 1607 | val = step_time_to_reg(val, data->pwm_mode[nr]); \ |
| 1608 | mutex_lock(&data->update_lock); \ | 1608 | mutex_lock(&data->update_lock); \ |
| 1609 | data->reg[nr] = val; \ | 1609 | data->reg[nr] = val; \ |
| 1610 | w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \ | 1610 | w83627ehf_write_value(data, data->REG_##REG[nr], val); \ |
| 1611 | mutex_unlock(&data->update_lock); \ | 1611 | mutex_unlock(&data->update_lock); \ |
| 1612 | return count; \ | 1612 | return count; \ |
| 1613 | } \ | 1613 | } \ |
| @@ -2004,7 +2004,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 2004 | goto exit; | 2004 | goto exit; |
| 2005 | } | 2005 | } |
| 2006 | 2006 | ||
| 2007 | data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL); | 2007 | data = devm_kzalloc(&pdev->dev, sizeof(struct w83627ehf_data), |
| 2008 | GFP_KERNEL); | ||
| 2008 | if (!data) { | 2009 | if (!data) { |
| 2009 | err = -ENOMEM; | 2010 | err = -ENOMEM; |
| 2010 | goto exit_release; | 2011 | goto exit_release; |
| @@ -2157,16 +2158,16 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 2157 | w83627ehf_set_temp_reg_ehf(data, 3); | 2158 | w83627ehf_set_temp_reg_ehf(data, 3); |
| 2158 | 2159 | ||
| 2159 | /* | 2160 | /* |
| 2160 | * Temperature sources for temp1 and temp2 are selected with | 2161 | * Temperature sources for temp2 and temp3 are selected with |
| 2161 | * bank 0, registers 0x49 and 0x4a. | 2162 | * bank 0, registers 0x49 and 0x4a. |
| 2162 | */ | 2163 | */ |
| 2163 | data->temp_src[0] = 0; /* SYSTIN */ | 2164 | data->temp_src[0] = 0; /* SYSTIN */ |
| 2164 | reg = w83627ehf_read_value(data, 0x49) & 0x07; | 2165 | reg = w83627ehf_read_value(data, 0x49) & 0x07; |
| 2165 | /* Adjust to have the same mapping as other source registers */ | 2166 | /* Adjust to have the same mapping as other source registers */ |
| 2166 | if (reg == 0) | 2167 | if (reg == 0) |
| 2167 | data->temp_src[1]++; | 2168 | data->temp_src[1] = 1; |
| 2168 | else if (reg >= 2 && reg <= 5) | 2169 | else if (reg >= 2 && reg <= 5) |
| 2169 | data->temp_src[1] += 2; | 2170 | data->temp_src[1] = reg + 2; |
| 2170 | else /* should never happen */ | 2171 | else /* should never happen */ |
| 2171 | data->have_temp &= ~(1 << 1); | 2172 | data->have_temp &= ~(1 << 1); |
| 2172 | reg = w83627ehf_read_value(data, 0x4a); | 2173 | reg = w83627ehf_read_value(data, 0x4a); |
| @@ -2493,9 +2494,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 2493 | 2494 | ||
| 2494 | exit_remove: | 2495 | exit_remove: |
| 2495 | w83627ehf_device_remove_files(dev); | 2496 | w83627ehf_device_remove_files(dev); |
| 2496 | kfree(data); | ||
| 2497 | platform_set_drvdata(pdev, NULL); | ||
| 2498 | exit_release: | 2497 | exit_release: |
| 2498 | platform_set_drvdata(pdev, NULL); | ||
| 2499 | release_region(res->start, IOREGION_LENGTH); | 2499 | release_region(res->start, IOREGION_LENGTH); |
| 2500 | exit: | 2500 | exit: |
| 2501 | return err; | 2501 | return err; |
| @@ -2509,7 +2509,6 @@ static int __devexit w83627ehf_remove(struct platform_device *pdev) | |||
| 2509 | w83627ehf_device_remove_files(&pdev->dev); | 2509 | w83627ehf_device_remove_files(&pdev->dev); |
| 2510 | release_region(data->addr, IOREGION_LENGTH); | 2510 | release_region(data->addr, IOREGION_LENGTH); |
| 2511 | platform_set_drvdata(pdev, NULL); | 2511 | platform_set_drvdata(pdev, NULL); |
| 2512 | kfree(data); | ||
| 2513 | 2512 | ||
| 2514 | return 0; | 2513 | return 0; |
| 2515 | } | 2514 | } |
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index 525c7345fa0b..24f94f4ae395 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
| @@ -103,8 +103,14 @@ static int sclhi(struct i2c_algo_bit_data *adap) | |||
| 103 | * chips may hold it low ("clock stretching") while they | 103 | * chips may hold it low ("clock stretching") while they |
| 104 | * are processing data internally. | 104 | * are processing data internally. |
| 105 | */ | 105 | */ |
| 106 | if (time_after(jiffies, start + adap->timeout)) | 106 | if (time_after(jiffies, start + adap->timeout)) { |
| 107 | /* Test one last time, as we may have been preempted | ||
| 108 | * between last check and timeout test. | ||
| 109 | */ | ||
| 110 | if (getscl(adap)) | ||
| 111 | break; | ||
| 107 | return -ETIMEDOUT; | 112 | return -ETIMEDOUT; |
| 113 | } | ||
| 108 | cond_resched(); | 114 | cond_resched(); |
| 109 | } | 115 | } |
| 110 | #ifdef DEBUG | 116 | #ifdef DEBUG |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 1e5606185b4f..e9c18939eda7 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -1386,8 +1386,10 @@ int i2c_master_send(const struct i2c_client *client, const char *buf, int count) | |||
| 1386 | 1386 | ||
| 1387 | ret = i2c_transfer(adap, &msg, 1); | 1387 | ret = i2c_transfer(adap, &msg, 1); |
| 1388 | 1388 | ||
| 1389 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes | 1389 | /* |
| 1390 | transmitted, else error code. */ | 1390 | * If everything went ok (i.e. 1 msg transmitted), return #bytes |
| 1391 | * transmitted, else error code. | ||
| 1392 | */ | ||
| 1391 | return (ret == 1) ? count : ret; | 1393 | return (ret == 1) ? count : ret; |
| 1392 | } | 1394 | } |
| 1393 | EXPORT_SYMBOL(i2c_master_send); | 1395 | EXPORT_SYMBOL(i2c_master_send); |
| @@ -1414,8 +1416,10 @@ int i2c_master_recv(const struct i2c_client *client, char *buf, int count) | |||
| 1414 | 1416 | ||
| 1415 | ret = i2c_transfer(adap, &msg, 1); | 1417 | ret = i2c_transfer(adap, &msg, 1); |
| 1416 | 1418 | ||
| 1417 | /* If everything went ok (i.e. 1 msg transmitted), return #bytes | 1419 | /* |
| 1418 | transmitted, else error code. */ | 1420 | * If everything went ok (i.e. 1 msg received), return #bytes received, |
| 1421 | * else error code. | ||
| 1422 | */ | ||
| 1419 | return (ret == 1) ? count : ret; | 1423 | return (ret == 1) ? count : ret; |
| 1420 | } | 1424 | } |
| 1421 | EXPORT_SYMBOL(i2c_master_recv); | 1425 | EXPORT_SYMBOL(i2c_master_recv); |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index afc166fcc3d9..7df5bfef2624 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
| @@ -332,7 +332,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer, | |||
| 332 | struct evdev_client *client = file->private_data; | 332 | struct evdev_client *client = file->private_data; |
| 333 | struct evdev *evdev = client->evdev; | 333 | struct evdev *evdev = client->evdev; |
| 334 | struct input_event event; | 334 | struct input_event event; |
| 335 | int retval; | 335 | int retval = 0; |
| 336 | 336 | ||
| 337 | if (count < input_event_size()) | 337 | if (count < input_event_size()) |
| 338 | return -EINVAL; | 338 | return -EINVAL; |
diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c index 37651373a95b..f3bc4189a7ba 100644 --- a/drivers/input/misc/twl4030-vibra.c +++ b/drivers/input/misc/twl4030-vibra.c | |||
| @@ -172,7 +172,7 @@ static void twl4030_vibra_close(struct input_dev *input) | |||
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | /*** Module ***/ | 174 | /*** Module ***/ |
| 175 | #if CONFIG_PM | 175 | #if CONFIG_PM_SLEEP |
| 176 | static int twl4030_vibra_suspend(struct device *dev) | 176 | static int twl4030_vibra_suspend(struct device *dev) |
| 177 | { | 177 | { |
| 178 | struct platform_device *pdev = to_platform_device(dev); | 178 | struct platform_device *pdev = to_platform_device(dev); |
| @@ -189,10 +189,10 @@ static int twl4030_vibra_resume(struct device *dev) | |||
| 189 | vibra_disable_leds(); | 189 | vibra_disable_leds(); |
| 190 | return 0; | 190 | return 0; |
| 191 | } | 191 | } |
| 192 | #endif | ||
| 192 | 193 | ||
| 193 | static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, | 194 | static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, |
| 194 | twl4030_vibra_suspend, twl4030_vibra_resume); | 195 | twl4030_vibra_suspend, twl4030_vibra_resume); |
| 195 | #endif | ||
| 196 | 196 | ||
| 197 | static int __devinit twl4030_vibra_probe(struct platform_device *pdev) | 197 | static int __devinit twl4030_vibra_probe(struct platform_device *pdev) |
| 198 | { | 198 | { |
| @@ -273,9 +273,7 @@ static struct platform_driver twl4030_vibra_driver = { | |||
| 273 | .driver = { | 273 | .driver = { |
| 274 | .name = "twl4030-vibra", | 274 | .name = "twl4030-vibra", |
| 275 | .owner = THIS_MODULE, | 275 | .owner = THIS_MODULE, |
| 276 | #ifdef CONFIG_PM | ||
| 277 | .pm = &twl4030_vibra_pm_ops, | 276 | .pm = &twl4030_vibra_pm_ops, |
| 278 | #endif | ||
| 279 | }, | 277 | }, |
| 280 | }; | 278 | }; |
| 281 | module_platform_driver(twl4030_vibra_driver); | 279 | module_platform_driver(twl4030_vibra_driver); |
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index bd87380bd879..4c6a72d3d48c 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
| @@ -952,7 +952,9 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
| 952 | 952 | ||
| 953 | /* | 953 | /* |
| 954 | * First try "E6 report". | 954 | * First try "E6 report". |
| 955 | * ALPS should return 0,0,10 or 0,0,100 | 955 | * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed. |
| 956 | * The bits 0-2 of the first byte will be 1s if some buttons are | ||
| 957 | * pressed. | ||
| 956 | */ | 958 | */ |
| 957 | param[0] = 0; | 959 | param[0] = 0; |
| 958 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) || | 960 | if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) || |
| @@ -968,7 +970,8 @@ static const struct alps_model_info *alps_get_model(struct psmouse *psmouse, int | |||
| 968 | psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x", | 970 | psmouse_dbg(psmouse, "E6 report: %2.2x %2.2x %2.2x", |
| 969 | param[0], param[1], param[2]); | 971 | param[0], param[1], param[2]); |
| 970 | 972 | ||
| 971 | if (param[0] != 0 || param[1] != 0 || (param[2] != 10 && param[2] != 100)) | 973 | if ((param[0] & 0xf8) != 0 || param[1] != 0 || |
| 974 | (param[2] != 10 && param[2] != 100)) | ||
| 972 | return NULL; | 975 | return NULL; |
| 973 | 976 | ||
| 974 | /* | 977 | /* |
diff --git a/drivers/input/tablet/Kconfig b/drivers/input/tablet/Kconfig index 58a87755b936..e53f4081a586 100644 --- a/drivers/input/tablet/Kconfig +++ b/drivers/input/tablet/Kconfig | |||
| @@ -77,6 +77,8 @@ config TABLET_USB_WACOM | |||
| 77 | tristate "Wacom Intuos/Graphire tablet support (USB)" | 77 | tristate "Wacom Intuos/Graphire tablet support (USB)" |
| 78 | depends on USB_ARCH_HAS_HCD | 78 | depends on USB_ARCH_HAS_HCD |
| 79 | select USB | 79 | select USB |
| 80 | select NEW_LEDS | ||
| 81 | select LEDS_CLASS | ||
| 80 | help | 82 | help |
| 81 | Say Y here if you want to use the USB version of the Wacom Intuos | 83 | Say Y here if you want to use the USB version of the Wacom Intuos |
| 82 | or Graphire tablet. Make sure to say Y to "Mouse support" | 84 | or Graphire tablet. Make sure to say Y to "Mouse support" |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 88672ec296c1..cd3ed29e0801 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -926,7 +926,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) | |||
| 926 | { | 926 | { |
| 927 | struct input_dev *input = wacom->input; | 927 | struct input_dev *input = wacom->input; |
| 928 | unsigned char *data = wacom->data; | 928 | unsigned char *data = wacom->data; |
| 929 | int count = data[1] & 0x03; | 929 | int count = data[1] & 0x07; |
| 930 | int i; | 930 | int i; |
| 931 | 931 | ||
| 932 | if (data[0] != 0x02) | 932 | if (data[0] != 0x02) |
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index bdea288dc185..a35e98ad9725 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c | |||
| @@ -275,7 +275,7 @@ static void iommu_set_exclusion_range(struct amd_iommu *iommu) | |||
| 275 | } | 275 | } |
| 276 | 276 | ||
| 277 | /* Programs the physical address of the device table into the IOMMU hardware */ | 277 | /* Programs the physical address of the device table into the IOMMU hardware */ |
| 278 | static void __init iommu_set_device_table(struct amd_iommu *iommu) | 278 | static void iommu_set_device_table(struct amd_iommu *iommu) |
| 279 | { | 279 | { |
| 280 | u64 entry; | 280 | u64 entry; |
| 281 | 281 | ||
diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index 9fb18c147825..b280c433e4a0 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c | |||
| @@ -323,7 +323,7 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, | |||
| 323 | * Corrupt successful READs while in down state. | 323 | * Corrupt successful READs while in down state. |
| 324 | * If flags were specified, only corrupt those that match. | 324 | * If flags were specified, only corrupt those that match. |
| 325 | */ | 325 | */ |
| 326 | if (!error && bio_submitted_while_down && | 326 | if (fc->corrupt_bio_byte && !error && bio_submitted_while_down && |
| 327 | (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && | 327 | (bio_data_dir(bio) == READ) && (fc->corrupt_bio_rw == READ) && |
| 328 | all_corrupt_bio_flags_match(bio, fc)) | 328 | all_corrupt_bio_flags_match(bio, fc)) |
| 329 | corrupt_bio_data(bio, fc); | 329 | corrupt_bio_data(bio, fc); |
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index ad2eba40e319..ea5dd289fe2a 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
| @@ -296,6 +296,8 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
| 296 | unsigned offset; | 296 | unsigned offset; |
| 297 | unsigned num_bvecs; | 297 | unsigned num_bvecs; |
| 298 | sector_t remaining = where->count; | 298 | sector_t remaining = where->count; |
| 299 | struct request_queue *q = bdev_get_queue(where->bdev); | ||
| 300 | sector_t discard_sectors; | ||
| 299 | 301 | ||
| 300 | /* | 302 | /* |
| 301 | * where->count may be zero if rw holds a flush and we need to | 303 | * where->count may be zero if rw holds a flush and we need to |
| @@ -305,9 +307,12 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
| 305 | /* | 307 | /* |
| 306 | * Allocate a suitably sized-bio. | 308 | * Allocate a suitably sized-bio. |
| 307 | */ | 309 | */ |
| 308 | num_bvecs = dm_sector_div_up(remaining, | 310 | if (rw & REQ_DISCARD) |
| 309 | (PAGE_SIZE >> SECTOR_SHIFT)); | 311 | num_bvecs = 1; |
| 310 | num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), num_bvecs); | 312 | else |
| 313 | num_bvecs = min_t(int, bio_get_nr_vecs(where->bdev), | ||
| 314 | dm_sector_div_up(remaining, (PAGE_SIZE >> SECTOR_SHIFT))); | ||
| 315 | |||
| 311 | bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); | 316 | bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios); |
| 312 | bio->bi_sector = where->sector + (where->count - remaining); | 317 | bio->bi_sector = where->sector + (where->count - remaining); |
| 313 | bio->bi_bdev = where->bdev; | 318 | bio->bi_bdev = where->bdev; |
| @@ -315,10 +320,14 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
| 315 | bio->bi_destructor = dm_bio_destructor; | 320 | bio->bi_destructor = dm_bio_destructor; |
| 316 | store_io_and_region_in_bio(bio, io, region); | 321 | store_io_and_region_in_bio(bio, io, region); |
| 317 | 322 | ||
| 318 | /* | 323 | if (rw & REQ_DISCARD) { |
| 319 | * Try and add as many pages as possible. | 324 | discard_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining); |
| 320 | */ | 325 | bio->bi_size = discard_sectors << SECTOR_SHIFT; |
| 321 | while (remaining) { | 326 | remaining -= discard_sectors; |
| 327 | } else while (remaining) { | ||
| 328 | /* | ||
| 329 | * Try and add as many pages as possible. | ||
| 330 | */ | ||
| 322 | dp->get_page(dp, &page, &len, &offset); | 331 | dp->get_page(dp, &page, &len, &offset); |
| 323 | len = min(len, to_bytes(remaining)); | 332 | len = min(len, to_bytes(remaining)); |
| 324 | if (!bio_add_page(bio, page, len, offset)) | 333 | if (!bio_add_page(bio, page, len, offset)) |
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 31c2dc25886d..1ce84ed0b765 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
| @@ -1437,7 +1437,7 @@ static int target_message(struct dm_ioctl *param, size_t param_size) | |||
| 1437 | 1437 | ||
| 1438 | if (!argc) { | 1438 | if (!argc) { |
| 1439 | DMWARN("Empty message received."); | 1439 | DMWARN("Empty message received."); |
| 1440 | goto out; | 1440 | goto out_argv; |
| 1441 | } | 1441 | } |
| 1442 | 1442 | ||
| 1443 | table = dm_get_live_table(md); | 1443 | table = dm_get_live_table(md); |
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 86cb7e5d83d5..787022c18187 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
| @@ -668,7 +668,14 @@ static int super_load(struct md_rdev *rdev, struct md_rdev *refdev) | |||
| 668 | return ret; | 668 | return ret; |
| 669 | 669 | ||
| 670 | sb = page_address(rdev->sb_page); | 670 | sb = page_address(rdev->sb_page); |
| 671 | if (sb->magic != cpu_to_le32(DM_RAID_MAGIC)) { | 671 | |
| 672 | /* | ||
| 673 | * Two cases that we want to write new superblocks and rebuild: | ||
| 674 | * 1) New device (no matching magic number) | ||
| 675 | * 2) Device specified for rebuild (!In_sync w/ offset == 0) | ||
| 676 | */ | ||
| 677 | if ((sb->magic != cpu_to_le32(DM_RAID_MAGIC)) || | ||
| 678 | (!test_bit(In_sync, &rdev->flags) && !rdev->recovery_offset)) { | ||
| 672 | super_sync(rdev->mddev, rdev); | 679 | super_sync(rdev->mddev, rdev); |
| 673 | 680 | ||
| 674 | set_bit(FirstUse, &rdev->flags); | 681 | set_bit(FirstUse, &rdev->flags); |
| @@ -745,11 +752,8 @@ static int super_init_validation(struct mddev *mddev, struct md_rdev *rdev) | |||
| 745 | */ | 752 | */ |
| 746 | rdev_for_each(r, t, mddev) { | 753 | rdev_for_each(r, t, mddev) { |
| 747 | if (!test_bit(In_sync, &r->flags)) { | 754 | if (!test_bit(In_sync, &r->flags)) { |
| 748 | if (!test_bit(FirstUse, &r->flags)) | 755 | DMINFO("Device %d specified for rebuild: " |
| 749 | DMERR("Superblock area of " | 756 | "Clearing superblock", r->raid_disk); |
| 750 | "rebuild device %d should have been " | ||
| 751 | "cleared.", r->raid_disk); | ||
| 752 | set_bit(FirstUse, &r->flags); | ||
| 753 | rebuilds++; | 757 | rebuilds++; |
| 754 | } else if (test_bit(FirstUse, &r->flags)) | 758 | } else if (test_bit(FirstUse, &r->flags)) |
| 755 | new_devs++; | 759 | new_devs++; |
| @@ -971,6 +975,7 @@ static int raid_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 971 | 975 | ||
| 972 | INIT_WORK(&rs->md.event_work, do_table_event); | 976 | INIT_WORK(&rs->md.event_work, do_table_event); |
| 973 | ti->private = rs; | 977 | ti->private = rs; |
| 978 | ti->num_flush_requests = 1; | ||
| 974 | 979 | ||
| 975 | mutex_lock(&rs->md.reconfig_mutex); | 980 | mutex_lock(&rs->md.reconfig_mutex); |
| 976 | ret = md_run(&rs->md); | 981 | ret = md_run(&rs->md); |
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 59c4f0446ffa..237571af77fd 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c | |||
| @@ -385,6 +385,7 @@ static int init_pmd(struct dm_pool_metadata *pmd, | |||
| 385 | data_sm = dm_sm_disk_create(tm, nr_blocks); | 385 | data_sm = dm_sm_disk_create(tm, nr_blocks); |
| 386 | if (IS_ERR(data_sm)) { | 386 | if (IS_ERR(data_sm)) { |
| 387 | DMERR("sm_disk_create failed"); | 387 | DMERR("sm_disk_create failed"); |
| 388 | dm_tm_unlock(tm, sblock); | ||
| 388 | r = PTR_ERR(data_sm); | 389 | r = PTR_ERR(data_sm); |
| 389 | goto bad; | 390 | goto bad; |
| 390 | } | 391 | } |
| @@ -789,6 +790,11 @@ int dm_pool_metadata_close(struct dm_pool_metadata *pmd) | |||
| 789 | return 0; | 790 | return 0; |
| 790 | } | 791 | } |
| 791 | 792 | ||
| 793 | /* | ||
| 794 | * __open_device: Returns @td corresponding to device with id @dev, | ||
| 795 | * creating it if @create is set and incrementing @td->open_count. | ||
| 796 | * On failure, @td is undefined. | ||
| 797 | */ | ||
| 792 | static int __open_device(struct dm_pool_metadata *pmd, | 798 | static int __open_device(struct dm_pool_metadata *pmd, |
| 793 | dm_thin_id dev, int create, | 799 | dm_thin_id dev, int create, |
| 794 | struct dm_thin_device **td) | 800 | struct dm_thin_device **td) |
| @@ -799,10 +805,16 @@ static int __open_device(struct dm_pool_metadata *pmd, | |||
| 799 | struct disk_device_details details_le; | 805 | struct disk_device_details details_le; |
| 800 | 806 | ||
| 801 | /* | 807 | /* |
| 802 | * Check the device isn't already open. | 808 | * If the device is already open, return it. |
| 803 | */ | 809 | */ |
| 804 | list_for_each_entry(td2, &pmd->thin_devices, list) | 810 | list_for_each_entry(td2, &pmd->thin_devices, list) |
| 805 | if (td2->id == dev) { | 811 | if (td2->id == dev) { |
| 812 | /* | ||
| 813 | * May not create an already-open device. | ||
| 814 | */ | ||
| 815 | if (create) | ||
| 816 | return -EEXIST; | ||
| 817 | |||
| 806 | td2->open_count++; | 818 | td2->open_count++; |
| 807 | *td = td2; | 819 | *td = td2; |
| 808 | return 0; | 820 | return 0; |
| @@ -817,6 +829,9 @@ static int __open_device(struct dm_pool_metadata *pmd, | |||
| 817 | if (r != -ENODATA || !create) | 829 | if (r != -ENODATA || !create) |
| 818 | return r; | 830 | return r; |
| 819 | 831 | ||
| 832 | /* | ||
| 833 | * Create new device. | ||
| 834 | */ | ||
| 820 | changed = 1; | 835 | changed = 1; |
| 821 | details_le.mapped_blocks = 0; | 836 | details_le.mapped_blocks = 0; |
| 822 | details_le.transaction_id = cpu_to_le64(pmd->trans_id); | 837 | details_le.transaction_id = cpu_to_le64(pmd->trans_id); |
| @@ -882,12 +897,10 @@ static int __create_thin(struct dm_pool_metadata *pmd, | |||
| 882 | 897 | ||
| 883 | r = __open_device(pmd, dev, 1, &td); | 898 | r = __open_device(pmd, dev, 1, &td); |
| 884 | if (r) { | 899 | if (r) { |
| 885 | __close_device(td); | ||
| 886 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); | 900 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); |
| 887 | dm_btree_del(&pmd->bl_info, dev_root); | 901 | dm_btree_del(&pmd->bl_info, dev_root); |
| 888 | return r; | 902 | return r; |
| 889 | } | 903 | } |
| 890 | td->changed = 1; | ||
| 891 | __close_device(td); | 904 | __close_device(td); |
| 892 | 905 | ||
| 893 | return r; | 906 | return r; |
| @@ -967,14 +980,14 @@ static int __create_snap(struct dm_pool_metadata *pmd, | |||
| 967 | goto bad; | 980 | goto bad; |
| 968 | 981 | ||
| 969 | r = __set_snapshot_details(pmd, td, origin, pmd->time); | 982 | r = __set_snapshot_details(pmd, td, origin, pmd->time); |
| 983 | __close_device(td); | ||
| 984 | |||
| 970 | if (r) | 985 | if (r) |
| 971 | goto bad; | 986 | goto bad; |
| 972 | 987 | ||
| 973 | __close_device(td); | ||
| 974 | return 0; | 988 | return 0; |
| 975 | 989 | ||
| 976 | bad: | 990 | bad: |
| 977 | __close_device(td); | ||
| 978 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); | 991 | dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root); |
| 979 | dm_btree_remove(&pmd->details_info, pmd->details_root, | 992 | dm_btree_remove(&pmd->details_info, pmd->details_root, |
| 980 | &key, &pmd->details_root); | 993 | &key, &pmd->details_root); |
| @@ -1211,6 +1224,8 @@ static int __remove(struct dm_thin_device *td, dm_block_t block) | |||
| 1211 | if (r) | 1224 | if (r) |
| 1212 | return r; | 1225 | return r; |
| 1213 | 1226 | ||
| 1227 | td->mapped_blocks--; | ||
| 1228 | td->changed = 1; | ||
| 1214 | pmd->need_commit = 1; | 1229 | pmd->need_commit = 1; |
| 1215 | 1230 | ||
| 1216 | return 0; | 1231 | return 0; |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a368db2431a5..a0b225eb4ac4 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -624,7 +624,7 @@ int md_raid1_congested(struct mddev *mddev, int bits) | |||
| 624 | return 1; | 624 | return 1; |
| 625 | 625 | ||
| 626 | rcu_read_lock(); | 626 | rcu_read_lock(); |
| 627 | for (i = 0; i < conf->raid_disks; i++) { | 627 | for (i = 0; i < conf->raid_disks * 2; i++) { |
| 628 | struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); | 628 | struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); |
| 629 | if (rdev && !test_bit(Faulty, &rdev->flags)) { | 629 | if (rdev && !test_bit(Faulty, &rdev->flags)) { |
| 630 | struct request_queue *q = bdev_get_queue(rdev->bdev); | 630 | struct request_queue *q = bdev_get_queue(rdev->bdev); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 6e8aa213f0d5..58c44d6453a0 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -67,6 +67,7 @@ static int max_queued_requests = 1024; | |||
| 67 | 67 | ||
| 68 | static void allow_barrier(struct r10conf *conf); | 68 | static void allow_barrier(struct r10conf *conf); |
| 69 | static void lower_barrier(struct r10conf *conf); | 69 | static void lower_barrier(struct r10conf *conf); |
| 70 | static int enough(struct r10conf *conf, int ignore); | ||
| 70 | 71 | ||
| 71 | static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) | 72 | static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) |
| 72 | { | 73 | { |
| @@ -347,6 +348,19 @@ static void raid10_end_read_request(struct bio *bio, int error) | |||
| 347 | * wait for the 'master' bio. | 348 | * wait for the 'master' bio. |
| 348 | */ | 349 | */ |
| 349 | set_bit(R10BIO_Uptodate, &r10_bio->state); | 350 | set_bit(R10BIO_Uptodate, &r10_bio->state); |
| 351 | } else { | ||
| 352 | /* If all other devices that store this block have | ||
| 353 | * failed, we want to return the error upwards rather | ||
| 354 | * than fail the last device. Here we redefine | ||
| 355 | * "uptodate" to mean "Don't want to retry" | ||
| 356 | */ | ||
| 357 | unsigned long flags; | ||
| 358 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 359 | if (!enough(conf, rdev->raid_disk)) | ||
| 360 | uptodate = 1; | ||
| 361 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 362 | } | ||
| 363 | if (uptodate) { | ||
| 350 | raid_end_bio_io(r10_bio); | 364 | raid_end_bio_io(r10_bio); |
| 351 | rdev_dec_pending(rdev, conf->mddev); | 365 | rdev_dec_pending(rdev, conf->mddev); |
| 352 | } else { | 366 | } else { |
| @@ -2052,6 +2066,7 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 | |||
| 2052 | "md/raid10:%s: %s: Failing raid device\n", | 2066 | "md/raid10:%s: %s: Failing raid device\n", |
| 2053 | mdname(mddev), b); | 2067 | mdname(mddev), b); |
| 2054 | md_error(mddev, conf->mirrors[d].rdev); | 2068 | md_error(mddev, conf->mirrors[d].rdev); |
| 2069 | r10_bio->devs[r10_bio->read_slot].bio = IO_BLOCKED; | ||
| 2055 | return; | 2070 | return; |
| 2056 | } | 2071 | } |
| 2057 | 2072 | ||
| @@ -2105,8 +2120,11 @@ static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10 | |||
| 2105 | rdev, | 2120 | rdev, |
| 2106 | r10_bio->devs[r10_bio->read_slot].addr | 2121 | r10_bio->devs[r10_bio->read_slot].addr |
| 2107 | + sect, | 2122 | + sect, |
| 2108 | s, 0)) | 2123 | s, 0)) { |
| 2109 | md_error(mddev, rdev); | 2124 | md_error(mddev, rdev); |
| 2125 | r10_bio->devs[r10_bio->read_slot].bio | ||
| 2126 | = IO_BLOCKED; | ||
| 2127 | } | ||
| 2110 | break; | 2128 | break; |
| 2111 | } | 2129 | } |
| 2112 | 2130 | ||
| @@ -2299,17 +2317,20 @@ static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) | |||
| 2299 | * This is all done synchronously while the array is | 2317 | * This is all done synchronously while the array is |
| 2300 | * frozen. | 2318 | * frozen. |
| 2301 | */ | 2319 | */ |
| 2320 | bio = r10_bio->devs[slot].bio; | ||
| 2321 | bdevname(bio->bi_bdev, b); | ||
| 2322 | bio_put(bio); | ||
| 2323 | r10_bio->devs[slot].bio = NULL; | ||
| 2324 | |||
| 2302 | if (mddev->ro == 0) { | 2325 | if (mddev->ro == 0) { |
| 2303 | freeze_array(conf); | 2326 | freeze_array(conf); |
| 2304 | fix_read_error(conf, mddev, r10_bio); | 2327 | fix_read_error(conf, mddev, r10_bio); |
| 2305 | unfreeze_array(conf); | 2328 | unfreeze_array(conf); |
| 2306 | } | 2329 | } else |
| 2330 | r10_bio->devs[slot].bio = IO_BLOCKED; | ||
| 2331 | |||
| 2307 | rdev_dec_pending(rdev, mddev); | 2332 | rdev_dec_pending(rdev, mddev); |
| 2308 | 2333 | ||
| 2309 | bio = r10_bio->devs[slot].bio; | ||
| 2310 | bdevname(bio->bi_bdev, b); | ||
| 2311 | r10_bio->devs[slot].bio = | ||
| 2312 | mddev->ro ? IO_BLOCKED : NULL; | ||
| 2313 | read_more: | 2334 | read_more: |
| 2314 | rdev = read_balance(conf, r10_bio, &max_sectors); | 2335 | rdev = read_balance(conf, r10_bio, &max_sectors); |
| 2315 | if (rdev == NULL) { | 2336 | if (rdev == NULL) { |
| @@ -2318,13 +2339,10 @@ read_more: | |||
| 2318 | mdname(mddev), b, | 2339 | mdname(mddev), b, |
| 2319 | (unsigned long long)r10_bio->sector); | 2340 | (unsigned long long)r10_bio->sector); |
| 2320 | raid_end_bio_io(r10_bio); | 2341 | raid_end_bio_io(r10_bio); |
| 2321 | bio_put(bio); | ||
| 2322 | return; | 2342 | return; |
| 2323 | } | 2343 | } |
| 2324 | 2344 | ||
| 2325 | do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); | 2345 | do_sync = (r10_bio->master_bio->bi_rw & REQ_SYNC); |
| 2326 | if (bio) | ||
| 2327 | bio_put(bio); | ||
| 2328 | slot = r10_bio->read_slot; | 2346 | slot = r10_bio->read_slot; |
| 2329 | printk_ratelimited( | 2347 | printk_ratelimited( |
| 2330 | KERN_ERR | 2348 | KERN_ERR |
| @@ -2360,7 +2378,6 @@ read_more: | |||
| 2360 | mbio->bi_phys_segments++; | 2378 | mbio->bi_phys_segments++; |
| 2361 | spin_unlock_irq(&conf->device_lock); | 2379 | spin_unlock_irq(&conf->device_lock); |
| 2362 | generic_make_request(bio); | 2380 | generic_make_request(bio); |
| 2363 | bio = NULL; | ||
| 2364 | 2381 | ||
| 2365 | r10_bio = mempool_alloc(conf->r10bio_pool, | 2382 | r10_bio = mempool_alloc(conf->r10bio_pool, |
| 2366 | GFP_NOIO); | 2383 | GFP_NOIO); |
| @@ -3243,7 +3260,6 @@ static int run(struct mddev *mddev) | |||
| 3243 | disk->rdev = rdev; | 3260 | disk->rdev = rdev; |
| 3244 | } | 3261 | } |
| 3245 | 3262 | ||
| 3246 | disk->rdev = rdev; | ||
| 3247 | disk_stack_limits(mddev->gendisk, rdev->bdev, | 3263 | disk_stack_limits(mddev->gendisk, rdev->bdev, |
| 3248 | rdev->data_offset << 9); | 3264 | rdev->data_offset << 9); |
| 3249 | /* as we don't honour merge_bvec_fn, we must never risk | 3265 | /* as we don't honour merge_bvec_fn, we must never risk |
diff --git a/drivers/media/dvb/siano/smsdvb.c b/drivers/media/dvb/siano/smsdvb.c index 654685c9303e..aa77e54a8fae 100644 --- a/drivers/media/dvb/siano/smsdvb.c +++ b/drivers/media/dvb/siano/smsdvb.c | |||
| @@ -49,9 +49,6 @@ struct smsdvb_client_t { | |||
| 49 | 49 | ||
| 50 | struct completion tune_done; | 50 | struct completion tune_done; |
| 51 | 51 | ||
| 52 | /* todo: save freq/band instead whole struct */ | ||
| 53 | struct dtv_frontend_properties fe_params; | ||
| 54 | |||
| 55 | struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb; | 52 | struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb; |
| 56 | int event_fe_state; | 53 | int event_fe_state; |
| 57 | int event_unc_state; | 54 | int event_unc_state; |
| @@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe) | |||
| 744 | struct dtv_frontend_properties *fep = &fe->dtv_property_cache; | 741 | struct dtv_frontend_properties *fep = &fe->dtv_property_cache; |
| 745 | struct smsdvb_client_t *client = | 742 | struct smsdvb_client_t *client = |
| 746 | container_of(fe, struct smsdvb_client_t, frontend); | 743 | container_of(fe, struct smsdvb_client_t, frontend); |
| 744 | struct smscore_device_t *coredev = client->coredev; | ||
| 745 | struct TRANSMISSION_STATISTICS_S *td = | ||
| 746 | &client->sms_stat_dvb.TransmissionData; | ||
| 747 | 747 | ||
| 748 | sms_debug(""); | 748 | switch (smscore_get_device_mode(coredev)) { |
| 749 | case DEVICE_MODE_DVBT: | ||
| 750 | case DEVICE_MODE_DVBT_BDA: | ||
| 751 | fep->frequency = td->Frequency; | ||
| 752 | |||
| 753 | switch (td->Bandwidth) { | ||
| 754 | case 6: | ||
| 755 | fep->bandwidth_hz = 6000000; | ||
| 756 | break; | ||
| 757 | case 7: | ||
| 758 | fep->bandwidth_hz = 7000000; | ||
| 759 | break; | ||
| 760 | case 8: | ||
| 761 | fep->bandwidth_hz = 8000000; | ||
| 762 | break; | ||
| 763 | } | ||
| 764 | |||
| 765 | switch (td->TransmissionMode) { | ||
| 766 | case 2: | ||
| 767 | fep->transmission_mode = TRANSMISSION_MODE_2K; | ||
| 768 | break; | ||
| 769 | case 8: | ||
| 770 | fep->transmission_mode = TRANSMISSION_MODE_8K; | ||
| 771 | } | ||
| 772 | |||
| 773 | switch (td->GuardInterval) { | ||
| 774 | case 0: | ||
| 775 | fep->guard_interval = GUARD_INTERVAL_1_32; | ||
| 776 | break; | ||
| 777 | case 1: | ||
| 778 | fep->guard_interval = GUARD_INTERVAL_1_16; | ||
| 779 | break; | ||
| 780 | case 2: | ||
| 781 | fep->guard_interval = GUARD_INTERVAL_1_8; | ||
| 782 | break; | ||
| 783 | case 3: | ||
| 784 | fep->guard_interval = GUARD_INTERVAL_1_4; | ||
| 785 | break; | ||
| 786 | } | ||
| 787 | |||
| 788 | switch (td->CodeRate) { | ||
| 789 | case 0: | ||
| 790 | fep->code_rate_HP = FEC_1_2; | ||
| 791 | break; | ||
| 792 | case 1: | ||
| 793 | fep->code_rate_HP = FEC_2_3; | ||
| 794 | break; | ||
| 795 | case 2: | ||
| 796 | fep->code_rate_HP = FEC_3_4; | ||
| 797 | break; | ||
| 798 | case 3: | ||
| 799 | fep->code_rate_HP = FEC_5_6; | ||
| 800 | break; | ||
| 801 | case 4: | ||
| 802 | fep->code_rate_HP = FEC_7_8; | ||
| 803 | break; | ||
| 804 | } | ||
| 805 | |||
| 806 | switch (td->LPCodeRate) { | ||
| 807 | case 0: | ||
| 808 | fep->code_rate_LP = FEC_1_2; | ||
| 809 | break; | ||
| 810 | case 1: | ||
| 811 | fep->code_rate_LP = FEC_2_3; | ||
| 812 | break; | ||
| 813 | case 2: | ||
| 814 | fep->code_rate_LP = FEC_3_4; | ||
| 815 | break; | ||
| 816 | case 3: | ||
| 817 | fep->code_rate_LP = FEC_5_6; | ||
| 818 | break; | ||
| 819 | case 4: | ||
| 820 | fep->code_rate_LP = FEC_7_8; | ||
| 821 | break; | ||
| 822 | } | ||
| 823 | |||
| 824 | switch (td->Constellation) { | ||
| 825 | case 0: | ||
| 826 | fep->modulation = QPSK; | ||
| 827 | break; | ||
| 828 | case 1: | ||
| 829 | fep->modulation = QAM_16; | ||
| 830 | break; | ||
| 831 | case 2: | ||
| 832 | fep->modulation = QAM_64; | ||
| 833 | break; | ||
| 834 | } | ||
| 835 | |||
| 836 | switch (td->Hierarchy) { | ||
| 837 | case 0: | ||
| 838 | fep->hierarchy = HIERARCHY_NONE; | ||
| 839 | break; | ||
| 840 | case 1: | ||
| 841 | fep->hierarchy = HIERARCHY_1; | ||
| 842 | break; | ||
| 843 | case 2: | ||
| 844 | fep->hierarchy = HIERARCHY_2; | ||
| 845 | break; | ||
| 846 | case 3: | ||
| 847 | fep->hierarchy = HIERARCHY_4; | ||
| 848 | break; | ||
| 849 | } | ||
| 749 | 850 | ||
| 750 | /* todo: */ | 851 | fep->inversion = INVERSION_AUTO; |
| 751 | memcpy(fep, &client->fe_params, | 852 | break; |
| 752 | sizeof(struct dtv_frontend_properties)); | 853 | case DEVICE_MODE_ISDBT: |
| 854 | case DEVICE_MODE_ISDBT_BDA: | ||
| 855 | fep->frequency = td->Frequency; | ||
| 856 | fep->bandwidth_hz = 6000000; | ||
| 857 | /* todo: retrive the other parameters */ | ||
| 858 | break; | ||
| 859 | default: | ||
| 860 | return -EINVAL; | ||
| 861 | } | ||
| 753 | 862 | ||
| 754 | return 0; | 863 | return 0; |
| 755 | } | 864 | } |
| @@ -872,11 +981,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev, | |||
| 872 | switch (smscore_get_device_mode(coredev)) { | 981 | switch (smscore_get_device_mode(coredev)) { |
| 873 | case DEVICE_MODE_DVBT: | 982 | case DEVICE_MODE_DVBT: |
| 874 | case DEVICE_MODE_DVBT_BDA: | 983 | case DEVICE_MODE_DVBT_BDA: |
| 875 | smsdvb_fe_ops.delsys[0] = SYS_DVBT; | 984 | client->frontend.ops.delsys[0] = SYS_DVBT; |
| 876 | break; | 985 | break; |
| 877 | case DEVICE_MODE_ISDBT: | 986 | case DEVICE_MODE_ISDBT: |
| 878 | case DEVICE_MODE_ISDBT_BDA: | 987 | case DEVICE_MODE_ISDBT_BDA: |
| 879 | smsdvb_fe_ops.delsys[0] = SYS_ISDBT; | 988 | client->frontend.ops.delsys[0] = SYS_ISDBT; |
| 880 | break; | 989 | break; |
| 881 | } | 990 | } |
| 882 | 991 | ||
diff --git a/drivers/media/video/davinci/isif.c b/drivers/media/video/davinci/isif.c index 1e63852374be..5278fe7d6d0c 100644 --- a/drivers/media/video/davinci/isif.c +++ b/drivers/media/video/davinci/isif.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/videodev2.h> | 34 | #include <linux/videodev2.h> |
| 35 | #include <linux/clk.h> | 35 | #include <linux/clk.h> |
| 36 | #include <linux/err.h> | 36 | #include <linux/err.h> |
| 37 | #include <linux/module.h> | ||
| 37 | 38 | ||
| 38 | #include <mach/mux.h> | 39 | #include <mach/mux.h> |
| 39 | 40 | ||
diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c index c7e69b8f81c9..4a44f9a1bae0 100644 --- a/drivers/media/video/uvc/uvc_video.c +++ b/drivers/media/video/uvc/uvc_video.c | |||
| @@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream, | |||
| 611 | delta_stc = buf->pts - (1UL << 31); | 611 | delta_stc = buf->pts - (1UL << 31); |
| 612 | x1 = first->dev_stc - delta_stc; | 612 | x1 = first->dev_stc - delta_stc; |
| 613 | x2 = last->dev_stc - delta_stc; | 613 | x2 = last->dev_stc - delta_stc; |
| 614 | if (x1 == x2) | ||
| 615 | goto done; | ||
| 616 | |||
| 614 | y1 = (first->dev_sof + 2048) << 16; | 617 | y1 = (first->dev_sof + 2048) << 16; |
| 615 | y2 = (last->dev_sof + 2048) << 16; | 618 | y2 = (last->dev_sof + 2048) << 16; |
| 616 | |||
| 617 | if (y2 < y1) | 619 | if (y2 < y1) |
| 618 | y2 += 2048 << 16; | 620 | y2 += 2048 << 16; |
| 619 | 621 | ||
| @@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream, | |||
| 631 | x1, x2, y1, y2, clock->sof_offset); | 633 | x1, x2, y1, y2, clock->sof_offset); |
| 632 | 634 | ||
| 633 | /* Second step, SOF to host clock conversion. */ | 635 | /* Second step, SOF to host clock conversion. */ |
| 634 | ts = timespec_sub(last->host_ts, first->host_ts); | ||
| 635 | x1 = (uvc_video_clock_host_sof(first) + 2048) << 16; | 636 | x1 = (uvc_video_clock_host_sof(first) + 2048) << 16; |
| 636 | x2 = (uvc_video_clock_host_sof(last) + 2048) << 16; | 637 | x2 = (uvc_video_clock_host_sof(last) + 2048) << 16; |
| 637 | y1 = NSEC_PER_SEC; | ||
| 638 | y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec; | ||
| 639 | |||
| 640 | if (x2 < x1) | 638 | if (x2 < x1) |
| 641 | x2 += 2048 << 16; | 639 | x2 += 2048 << 16; |
| 640 | if (x1 == x2) | ||
| 641 | goto done; | ||
| 642 | |||
| 643 | ts = timespec_sub(last->host_ts, first->host_ts); | ||
| 644 | y1 = NSEC_PER_SEC; | ||
| 645 | y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec; | ||
| 642 | 646 | ||
| 643 | /* Interpolated and host SOF timestamps can wrap around at slightly | 647 | /* Interpolated and host SOF timestamps can wrap around at slightly |
| 644 | * different times. Handle this by adding or removing 2048 to or from | 648 | * different times. Handle this by adding or removing 2048 to or from |
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c index 53e2a80f42fa..d295941c9a3d 100644 --- a/drivers/mfd/ab8500-core.c +++ b/drivers/mfd/ab8500-core.c | |||
| @@ -956,11 +956,12 @@ int __devinit ab8500_init(struct ab8500 *ab8500) | |||
| 956 | return ret; | 956 | return ret; |
| 957 | 957 | ||
| 958 | out_freeirq: | 958 | out_freeirq: |
| 959 | if (ab8500->irq_base) { | 959 | if (ab8500->irq_base) |
| 960 | free_irq(ab8500->irq, ab8500); | 960 | free_irq(ab8500->irq, ab8500); |
| 961 | out_removeirq: | 961 | out_removeirq: |
| 962 | if (ab8500->irq_base) | ||
| 962 | ab8500_irq_remove(ab8500); | 963 | ab8500_irq_remove(ab8500); |
| 963 | } | 964 | |
| 964 | return ret; | 965 | return ret; |
| 965 | } | 966 | } |
| 966 | 967 | ||
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c index 0f5922812bff..411f523d4878 100644 --- a/drivers/mfd/mfd-core.c +++ b/drivers/mfd/mfd-core.c | |||
| @@ -123,7 +123,7 @@ static int mfd_add_device(struct device *parent, int id, | |||
| 123 | } | 123 | } |
| 124 | 124 | ||
| 125 | if (!cell->ignore_resource_conflicts) { | 125 | if (!cell->ignore_resource_conflicts) { |
| 126 | ret = acpi_check_resource_conflict(res); | 126 | ret = acpi_check_resource_conflict(&res[r]); |
| 127 | if (ret) | 127 | if (ret) |
| 128 | goto fail_res; | 128 | goto fail_res; |
| 129 | } | 129 | } |
diff --git a/drivers/mfd/s5m-core.c b/drivers/mfd/s5m-core.c index e075c113eec6..caadabeed8e9 100644 --- a/drivers/mfd/s5m-core.c +++ b/drivers/mfd/s5m-core.c | |||
| @@ -105,7 +105,7 @@ static int s5m87xx_i2c_probe(struct i2c_client *i2c, | |||
| 105 | s5m87xx->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); | 105 | s5m87xx->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); |
| 106 | i2c_set_clientdata(s5m87xx->rtc, s5m87xx); | 106 | i2c_set_clientdata(s5m87xx->rtc, s5m87xx); |
| 107 | 107 | ||
| 108 | if (pdata->cfg_pmic_irq) | 108 | if (pdata && pdata->cfg_pmic_irq) |
| 109 | pdata->cfg_pmic_irq(); | 109 | pdata->cfg_pmic_irq(); |
| 110 | 110 | ||
| 111 | s5m_irq_init(s5m87xx); | 111 | s5m_irq_init(s5m87xx); |
diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c index 01cf5012a08f..4392f6bca156 100644 --- a/drivers/mfd/tps65910.c +++ b/drivers/mfd/tps65910.c | |||
| @@ -168,7 +168,7 @@ static int tps65910_i2c_probe(struct i2c_client *i2c, | |||
| 168 | goto err; | 168 | goto err; |
| 169 | 169 | ||
| 170 | init_data->irq = pmic_plat_data->irq; | 170 | init_data->irq = pmic_plat_data->irq; |
| 171 | init_data->irq_base = pmic_plat_data->irq; | 171 | init_data->irq_base = pmic_plat_data->irq_base; |
| 172 | 172 | ||
| 173 | tps65910_gpio_init(tps65910, pmic_plat_data->gpio_base); | 173 | tps65910_gpio_init(tps65910, pmic_plat_data->gpio_base); |
| 174 | 174 | ||
diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c index 5fec23a9ac03..74fd8cb5f372 100644 --- a/drivers/mfd/tps65912-core.c +++ b/drivers/mfd/tps65912-core.c | |||
| @@ -151,7 +151,7 @@ int tps65912_device_init(struct tps65912 *tps65912) | |||
| 151 | goto err; | 151 | goto err; |
| 152 | 152 | ||
| 153 | init_data->irq = pmic_plat_data->irq; | 153 | init_data->irq = pmic_plat_data->irq; |
| 154 | init_data->irq_base = pmic_plat_data->irq; | 154 | init_data->irq_base = pmic_plat_data->irq_base; |
| 155 | ret = tps65912_irq_init(tps65912, init_data->irq, init_data); | 155 | ret = tps65912_irq_init(tps65912, init_data->irq, init_data); |
| 156 | if (ret < 0) | 156 | if (ret < 0) |
| 157 | goto err; | 157 | goto err; |
diff --git a/drivers/mfd/wm8350-irq.c b/drivers/mfd/wm8350-irq.c index 8a1fafd0bf7d..9fd01bf63c51 100644 --- a/drivers/mfd/wm8350-irq.c +++ b/drivers/mfd/wm8350-irq.c | |||
| @@ -496,7 +496,6 @@ int wm8350_irq_init(struct wm8350 *wm8350, int irq, | |||
| 496 | 496 | ||
| 497 | mutex_init(&wm8350->irq_lock); | 497 | mutex_init(&wm8350->irq_lock); |
| 498 | wm8350->chip_irq = irq; | 498 | wm8350->chip_irq = irq; |
| 499 | wm8350->irq_base = pdata->irq_base; | ||
| 500 | 499 | ||
| 501 | if (pdata && pdata->irq_base > 0) | 500 | if (pdata && pdata->irq_base > 0) |
| 502 | irq_base = pdata->irq_base; | 501 | irq_base = pdata->irq_base; |
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index f117e7fb9321..a04b3c108c8c 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
| @@ -256,6 +256,20 @@ static int wm8994_suspend(struct device *dev) | |||
| 256 | break; | 256 | break; |
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | switch (wm8994->type) { | ||
| 260 | case WM1811: | ||
| 261 | ret = wm8994_reg_read(wm8994, WM8994_ANTIPOP_2); | ||
| 262 | if (ret < 0) { | ||
| 263 | dev_err(dev, "Failed to read jackdet: %d\n", ret); | ||
| 264 | } else if (ret & WM1811_JACKDET_MODE_MASK) { | ||
| 265 | dev_dbg(dev, "CODEC still active, ignoring suspend\n"); | ||
| 266 | return 0; | ||
| 267 | } | ||
| 268 | break; | ||
| 269 | default: | ||
| 270 | break; | ||
| 271 | } | ||
| 272 | |||
| 259 | /* Disable LDO pulldowns while the device is suspended if we | 273 | /* Disable LDO pulldowns while the device is suspended if we |
| 260 | * don't know that something will be driving them. */ | 274 | * don't know that something will be driving them. */ |
| 261 | if (!wm8994->ldo_ena_always_driven) | 275 | if (!wm8994->ldo_ena_always_driven) |
diff --git a/drivers/mfd/wm8994-regmap.c b/drivers/mfd/wm8994-regmap.c index c598ae69b8ff..bc0c5096539a 100644 --- a/drivers/mfd/wm8994-regmap.c +++ b/drivers/mfd/wm8994-regmap.c | |||
| @@ -806,6 +806,7 @@ static bool wm1811_readable_register(struct device *dev, unsigned int reg) | |||
| 806 | case WM8994_DC_SERVO_2: | 806 | case WM8994_DC_SERVO_2: |
| 807 | case WM8994_DC_SERVO_READBACK: | 807 | case WM8994_DC_SERVO_READBACK: |
| 808 | case WM8994_DC_SERVO_4: | 808 | case WM8994_DC_SERVO_4: |
| 809 | case WM8994_DC_SERVO_4E: | ||
| 809 | case WM8994_ANALOGUE_HP_1: | 810 | case WM8994_ANALOGUE_HP_1: |
| 810 | case WM8958_MIC_DETECT_1: | 811 | case WM8958_MIC_DETECT_1: |
| 811 | case WM8958_MIC_DETECT_2: | 812 | case WM8958_MIC_DETECT_2: |
diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c index 19fc7c1cb428..f428d86bfc10 100644 --- a/drivers/misc/c2port/core.c +++ b/drivers/misc/c2port/core.c | |||
| @@ -984,9 +984,9 @@ static int __init c2port_init(void) | |||
| 984 | " - (C) 2007 Rodolfo Giometti\n"); | 984 | " - (C) 2007 Rodolfo Giometti\n"); |
| 985 | 985 | ||
| 986 | c2port_class = class_create(THIS_MODULE, "c2port"); | 986 | c2port_class = class_create(THIS_MODULE, "c2port"); |
| 987 | if (!c2port_class) { | 987 | if (IS_ERR(c2port_class)) { |
| 988 | printk(KERN_ERR "c2port: failed to allocate class\n"); | 988 | printk(KERN_ERR "c2port: failed to allocate class\n"); |
| 989 | return -ENOMEM; | 989 | return PTR_ERR(c2port_class); |
| 990 | } | 990 | } |
| 991 | c2port_class->dev_attrs = c2port_attrs; | 991 | c2port_class->dev_attrs = c2port_attrs; |
| 992 | 992 | ||
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 690255c7d4dc..132378b89d76 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -2068,6 +2068,9 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq) | |||
| 2068 | */ | 2068 | */ |
| 2069 | mmc_hw_reset_for_init(host); | 2069 | mmc_hw_reset_for_init(host); |
| 2070 | 2070 | ||
| 2071 | /* Initialization should be done at 3.3 V I/O voltage. */ | ||
| 2072 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
| 2073 | |||
| 2071 | /* | 2074 | /* |
| 2072 | * sdio_reset sends CMD52 to reset card. Since we do not know | 2075 | * sdio_reset sends CMD52 to reset card. Since we do not know |
| 2073 | * if the card is being re-initialized, just send it. CMD52 | 2076 | * if the card is being re-initialized, just send it. CMD52 |
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index 30055f2b0d44..c3704e293a7b 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c | |||
| @@ -238,10 +238,10 @@ static inline void mmc_host_clk_init(struct mmc_host *host) | |||
| 238 | /* Hold MCI clock for 8 cycles by default */ | 238 | /* Hold MCI clock for 8 cycles by default */ |
| 239 | host->clk_delay = 8; | 239 | host->clk_delay = 8; |
| 240 | /* | 240 | /* |
| 241 | * Default clock gating delay is 200ms. | 241 | * Default clock gating delay is 0ms to avoid wasting power. |
| 242 | * This value can be tuned by writing into sysfs entry. | 242 | * This value can be tuned by writing into sysfs entry. |
| 243 | */ | 243 | */ |
| 244 | host->clkgate_delay = 200; | 244 | host->clkgate_delay = 0; |
| 245 | host->clk_gated = false; | 245 | host->clk_gated = false; |
| 246 | INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); | 246 | INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); |
| 247 | spin_lock_init(&host->clk_lock); | 247 | spin_lock_init(&host->clk_lock); |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index a48066344fa8..2b9ed1401dc4 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c | |||
| @@ -816,6 +816,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, | |||
| 816 | if (!mmc_host_is_spi(host)) | 816 | if (!mmc_host_is_spi(host)) |
| 817 | mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); | 817 | mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); |
| 818 | 818 | ||
| 819 | /* Initialization should be done at 3.3 V I/O voltage. */ | ||
| 820 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
| 821 | |||
| 819 | /* | 822 | /* |
| 820 | * Since we're changing the OCR value, we seem to | 823 | * Since we're changing the OCR value, we seem to |
| 821 | * need to tell some cards to go back to the idle | 824 | * need to tell some cards to go back to the idle |
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 5017f9354ce2..c272c6868ecf 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c | |||
| @@ -911,6 +911,9 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, | |||
| 911 | BUG_ON(!host); | 911 | BUG_ON(!host); |
| 912 | WARN_ON(!host->claimed); | 912 | WARN_ON(!host->claimed); |
| 913 | 913 | ||
| 914 | /* The initialization should be done at 3.3 V I/O voltage. */ | ||
| 915 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
| 916 | |||
| 914 | err = mmc_sd_get_cid(host, ocr, cid, &rocr); | 917 | err = mmc_sd_get_cid(host, ocr, cid, &rocr); |
| 915 | if (err) | 918 | if (err) |
| 916 | return err; | 919 | return err; |
| @@ -1156,11 +1159,6 @@ int mmc_attach_sd(struct mmc_host *host) | |||
| 1156 | BUG_ON(!host); | 1159 | BUG_ON(!host); |
| 1157 | WARN_ON(!host->claimed); | 1160 | WARN_ON(!host->claimed); |
| 1158 | 1161 | ||
| 1159 | /* Make sure we are at 3.3V signalling voltage */ | ||
| 1160 | err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, false); | ||
| 1161 | if (err) | ||
| 1162 | return err; | ||
| 1163 | |||
| 1164 | /* Disable preset value enable if already set since last time */ | 1162 | /* Disable preset value enable if already set since last time */ |
| 1165 | if (host->ops->enable_preset_value) { | 1163 | if (host->ops->enable_preset_value) { |
| 1166 | mmc_host_clk_hold(host); | 1164 | mmc_host_clk_hold(host); |
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 12cde6ee17f5..2c7c83f832d2 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
| @@ -585,6 +585,9 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, | |||
| 585 | * Inform the card of the voltage | 585 | * Inform the card of the voltage |
| 586 | */ | 586 | */ |
| 587 | if (!powered_resume) { | 587 | if (!powered_resume) { |
| 588 | /* The initialization should be done at 3.3 V I/O voltage. */ | ||
| 589 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
| 590 | |||
| 588 | err = mmc_send_io_op_cond(host, host->ocr, &ocr); | 591 | err = mmc_send_io_op_cond(host, host->ocr, &ocr); |
| 589 | if (err) | 592 | if (err) |
| 590 | goto err; | 593 | goto err; |
| @@ -996,6 +999,11 @@ static int mmc_sdio_power_restore(struct mmc_host *host) | |||
| 996 | * With these steps taken, mmc_select_voltage() is also required to | 999 | * With these steps taken, mmc_select_voltage() is also required to |
| 997 | * restore the correct voltage setting of the card. | 1000 | * restore the correct voltage setting of the card. |
| 998 | */ | 1001 | */ |
| 1002 | |||
| 1003 | /* The initialization should be done at 3.3 V I/O voltage. */ | ||
| 1004 | if (!mmc_card_keep_power(host)) | ||
| 1005 | mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0); | ||
| 1006 | |||
| 999 | sdio_reset(host); | 1007 | sdio_reset(host); |
| 1000 | mmc_go_idle(host); | 1008 | mmc_go_idle(host); |
| 1001 | mmc_send_if_cond(host, host->ocr_avail); | 1009 | mmc_send_if_cond(host, host->ocr_avail); |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 6985cdb0bb26..e4449a54ae8f 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -1948,12 +1948,12 @@ static bool atmci_filter(struct dma_chan *chan, void *slave) | |||
| 1948 | } | 1948 | } |
| 1949 | } | 1949 | } |
| 1950 | 1950 | ||
| 1951 | static void atmci_configure_dma(struct atmel_mci *host) | 1951 | static bool atmci_configure_dma(struct atmel_mci *host) |
| 1952 | { | 1952 | { |
| 1953 | struct mci_platform_data *pdata; | 1953 | struct mci_platform_data *pdata; |
| 1954 | 1954 | ||
| 1955 | if (host == NULL) | 1955 | if (host == NULL) |
| 1956 | return; | 1956 | return false; |
| 1957 | 1957 | ||
| 1958 | pdata = host->pdev->dev.platform_data; | 1958 | pdata = host->pdev->dev.platform_data; |
| 1959 | 1959 | ||
| @@ -1970,12 +1970,15 @@ static void atmci_configure_dma(struct atmel_mci *host) | |||
| 1970 | host->dma.chan = | 1970 | host->dma.chan = |
| 1971 | dma_request_channel(mask, atmci_filter, pdata->dma_slave); | 1971 | dma_request_channel(mask, atmci_filter, pdata->dma_slave); |
| 1972 | } | 1972 | } |
| 1973 | if (!host->dma.chan) | 1973 | if (!host->dma.chan) { |
| 1974 | dev_notice(&host->pdev->dev, "DMA not available, using PIO\n"); | 1974 | dev_warn(&host->pdev->dev, "no DMA channel available\n"); |
| 1975 | else | 1975 | return false; |
| 1976 | } else { | ||
| 1976 | dev_info(&host->pdev->dev, | 1977 | dev_info(&host->pdev->dev, |
| 1977 | "Using %s for DMA transfers\n", | 1978 | "Using %s for DMA transfers\n", |
| 1978 | dma_chan_name(host->dma.chan)); | 1979 | dma_chan_name(host->dma.chan)); |
| 1980 | return true; | ||
| 1981 | } | ||
| 1979 | } | 1982 | } |
| 1980 | 1983 | ||
| 1981 | static inline unsigned int atmci_get_version(struct atmel_mci *host) | 1984 | static inline unsigned int atmci_get_version(struct atmel_mci *host) |
| @@ -2085,8 +2088,7 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
| 2085 | 2088 | ||
| 2086 | /* Get MCI capabilities and set operations according to it */ | 2089 | /* Get MCI capabilities and set operations according to it */ |
| 2087 | atmci_get_cap(host); | 2090 | atmci_get_cap(host); |
| 2088 | if (host->caps.has_dma) { | 2091 | if (host->caps.has_dma && atmci_configure_dma(host)) { |
| 2089 | dev_info(&pdev->dev, "using DMA\n"); | ||
| 2090 | host->prepare_data = &atmci_prepare_data_dma; | 2092 | host->prepare_data = &atmci_prepare_data_dma; |
| 2091 | host->submit_data = &atmci_submit_data_dma; | 2093 | host->submit_data = &atmci_submit_data_dma; |
| 2092 | host->stop_transfer = &atmci_stop_transfer_dma; | 2094 | host->stop_transfer = &atmci_stop_transfer_dma; |
| @@ -2096,15 +2098,12 @@ static int __init atmci_probe(struct platform_device *pdev) | |||
| 2096 | host->submit_data = &atmci_submit_data_pdc; | 2098 | host->submit_data = &atmci_submit_data_pdc; |
| 2097 | host->stop_transfer = &atmci_stop_transfer_pdc; | 2099 | host->stop_transfer = &atmci_stop_transfer_pdc; |
| 2098 | } else { | 2100 | } else { |
| 2099 | dev_info(&pdev->dev, "no DMA, no PDC\n"); | 2101 | dev_info(&pdev->dev, "using PIO\n"); |
| 2100 | host->prepare_data = &atmci_prepare_data; | 2102 | host->prepare_data = &atmci_prepare_data; |
| 2101 | host->submit_data = &atmci_submit_data; | 2103 | host->submit_data = &atmci_submit_data; |
| 2102 | host->stop_transfer = &atmci_stop_transfer; | 2104 | host->stop_transfer = &atmci_stop_transfer; |
| 2103 | } | 2105 | } |
| 2104 | 2106 | ||
| 2105 | if (host->caps.has_dma) | ||
| 2106 | atmci_configure_dma(host); | ||
| 2107 | |||
| 2108 | platform_set_drvdata(pdev, host); | 2107 | platform_set_drvdata(pdev, host); |
| 2109 | 2108 | ||
| 2110 | /* We need at least one slot to succeed */ | 2109 | /* We need at least one slot to succeed */ |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 0d955ffaf44e..11e589cd8233 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
| @@ -1271,12 +1271,13 @@ static int __devinit mmci_probe(struct amba_device *dev, | |||
| 1271 | /* | 1271 | /* |
| 1272 | * Block size can be up to 2048 bytes, but must be a power of two. | 1272 | * Block size can be up to 2048 bytes, but must be a power of two. |
| 1273 | */ | 1273 | */ |
| 1274 | mmc->max_blk_size = 2048; | 1274 | mmc->max_blk_size = 1 << 11; |
| 1275 | 1275 | ||
| 1276 | /* | 1276 | /* |
| 1277 | * No limit on the number of blocks transferred. | 1277 | * Limit the number of blocks transferred so that we don't overflow |
| 1278 | * the maximum request size. | ||
| 1278 | */ | 1279 | */ |
| 1279 | mmc->max_blk_count = mmc->max_req_size; | 1280 | mmc->max_blk_count = mmc->max_req_size >> 11; |
| 1280 | 1281 | ||
| 1281 | spin_lock_init(&host->lock); | 1282 | spin_lock_init(&host->lock); |
| 1282 | 1283 | ||
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index d601e41af282..0be4e2013632 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c | |||
| @@ -269,8 +269,9 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg) | |||
| 269 | imx_data->scratchpad = val; | 269 | imx_data->scratchpad = val; |
| 270 | return; | 270 | return; |
| 271 | case SDHCI_COMMAND: | 271 | case SDHCI_COMMAND: |
| 272 | if ((host->cmd->opcode == MMC_STOP_TRANSMISSION) | 272 | if ((host->cmd->opcode == MMC_STOP_TRANSMISSION || |
| 273 | && (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) | 273 | host->cmd->opcode == MMC_SET_BLOCK_COUNT) && |
| 274 | (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) | ||
| 274 | val |= SDHCI_CMD_ABORTCMD; | 275 | val |= SDHCI_CMD_ABORTCMD; |
| 275 | 276 | ||
| 276 | if (is_imx6q_usdhc(imx_data)) { | 277 | if (is_imx6q_usdhc(imx_data)) { |
diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c index 0a4fc62a381d..c998e1afebc6 100644 --- a/drivers/net/caif/caif_hsi.c +++ b/drivers/net/caif/caif_hsi.c | |||
| @@ -978,7 +978,7 @@ static void cfhsi_setup(struct net_device *dev) | |||
| 978 | dev->netdev_ops = &cfhsi_ops; | 978 | dev->netdev_ops = &cfhsi_ops; |
| 979 | dev->type = ARPHRD_CAIF; | 979 | dev->type = ARPHRD_CAIF; |
| 980 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; | 980 | dev->flags = IFF_POINTOPOINT | IFF_NOARP; |
| 981 | dev->mtu = CFHSI_MAX_PAYLOAD_SZ; | 981 | dev->mtu = CFHSI_MAX_CAIF_FRAME_SZ; |
| 982 | dev->tx_queue_len = 0; | 982 | dev->tx_queue_len = 0; |
| 983 | dev->destructor = free_netdev; | 983 | dev->destructor = free_netdev; |
| 984 | skb_queue_head_init(&cfhsi->qhead); | 984 | skb_queue_head_init(&cfhsi->qhead); |
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c index 1ff3c6df35a2..47a9bb2c813c 100644 --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | |||
| @@ -1710,7 +1710,7 @@ static irqreturn_t atl1c_intr(int irq, void *data) | |||
| 1710 | "atl1c hardware error (status = 0x%x)\n", | 1710 | "atl1c hardware error (status = 0x%x)\n", |
| 1711 | status & ISR_ERROR); | 1711 | status & ISR_ERROR); |
| 1712 | /* reset MAC */ | 1712 | /* reset MAC */ |
| 1713 | adapter->work_event |= ATL1C_WORK_EVENT_RESET; | 1713 | set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event); |
| 1714 | schedule_work(&adapter->common_task); | 1714 | schedule_work(&adapter->common_task); |
| 1715 | return IRQ_HANDLED; | 1715 | return IRQ_HANDLED; |
| 1716 | } | 1716 | } |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 7aee46983be4..99389c8dda21 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -1934,7 +1934,7 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
| 1934 | } | 1934 | } |
| 1935 | 1935 | ||
| 1936 | if (bp->port.pmf) | 1936 | if (bp->port.pmf) |
| 1937 | bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 0); | 1937 | bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); |
| 1938 | else | 1938 | else |
| 1939 | bnx2x__link_status_update(bp); | 1939 | bnx2x__link_status_update(bp); |
| 1940 | 1940 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index bf27c54ff2e0..4f40f7d7d8c6 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | |||
| @@ -1179,10 +1179,16 @@ static inline int bnx2x_alloc_rx_bds(struct bnx2x_fastpath *fp, | |||
| 1179 | */ | 1179 | */ |
| 1180 | static inline u8 bnx2x_stats_id(struct bnx2x_fastpath *fp) | 1180 | static inline u8 bnx2x_stats_id(struct bnx2x_fastpath *fp) |
| 1181 | { | 1181 | { |
| 1182 | if (!CHIP_IS_E1x(fp->bp)) | 1182 | struct bnx2x *bp = fp->bp; |
| 1183 | if (!CHIP_IS_E1x(bp)) { | ||
| 1184 | #ifdef BCM_CNIC | ||
| 1185 | /* there are special statistics counters for FCoE 136..140 */ | ||
| 1186 | if (IS_FCOE_FP(fp)) | ||
| 1187 | return bp->cnic_base_cl_id + (bp->pf_num >> 1); | ||
| 1188 | #endif | ||
| 1183 | return fp->cl_id; | 1189 | return fp->cl_id; |
| 1184 | else | 1190 | } |
| 1185 | return fp->cl_id + BP_PORT(fp->bp) * FP_SB_MAX_E1x; | 1191 | return fp->cl_id + BP_PORT(bp) * FP_SB_MAX_E1x; |
| 1186 | } | 1192 | } |
| 1187 | 1193 | ||
| 1188 | static inline void bnx2x_init_vlan_mac_fp_objs(struct bnx2x_fastpath *fp, | 1194 | static inline void bnx2x_init_vlan_mac_fp_objs(struct bnx2x_fastpath *fp, |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c index 5051cf3deb20..6d82ade4c31c 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c | |||
| @@ -735,7 +735,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state) | |||
| 735 | bp->dcbx_error); | 735 | bp->dcbx_error); |
| 736 | 736 | ||
| 737 | /* mark DCBX result for PMF migration */ | 737 | /* mark DCBX result for PMF migration */ |
| 738 | bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 1); | 738 | bnx2x_update_drv_flags(bp, |
| 739 | 1 << DRV_FLAGS_DCB_CONFIGURED, | ||
| 740 | 1); | ||
| 739 | #ifdef BCM_DCBNL | 741 | #ifdef BCM_DCBNL |
| 740 | /* | 742 | /* |
| 741 | * Add new app tlvs to dcbnl | 743 | * Add new app tlvs to dcbnl |
| @@ -1020,7 +1022,7 @@ void bnx2x_dcbx_init(struct bnx2x *bp) | |||
| 1020 | DP(NETIF_MSG_LINK, "dcbx_lldp_params_offset 0x%x\n", | 1022 | DP(NETIF_MSG_LINK, "dcbx_lldp_params_offset 0x%x\n", |
| 1021 | dcbx_lldp_params_offset); | 1023 | dcbx_lldp_params_offset); |
| 1022 | 1024 | ||
| 1023 | bnx2x_update_drv_flags(bp, DRV_FLAGS_DCB_CONFIGURED, 0); | 1025 | bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_DCB_CONFIGURED, 0); |
| 1024 | 1026 | ||
| 1025 | if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) { | 1027 | if (SHMEM_LLDP_DCBX_PARAMS_NONE != dcbx_lldp_params_offset) { |
| 1026 | bnx2x_dcbx_admin_mib_updated_params(bp, | 1028 | bnx2x_dcbx_admin_mib_updated_params(bp, |
| @@ -1857,7 +1859,7 @@ void bnx2x_dcbx_pmf_update(struct bnx2x *bp) | |||
| 1857 | * read it from shmem and update bp and netdev accordingly | 1859 | * read it from shmem and update bp and netdev accordingly |
| 1858 | */ | 1860 | */ |
| 1859 | if (SHMEM2_HAS(bp, drv_flags) && | 1861 | if (SHMEM2_HAS(bp, drv_flags) && |
| 1860 | GET_FLAGS(SHMEM2_RD(bp, drv_flags), DRV_FLAGS_DCB_CONFIGURED)) { | 1862 | GET_FLAGS(SHMEM2_RD(bp, drv_flags), 1 << DRV_FLAGS_DCB_CONFIGURED)) { |
| 1861 | /* Read neg results if dcbx is in the FW */ | 1863 | /* Read neg results if dcbx is in the FW */ |
| 1862 | if (bnx2x_dcbx_read_shmem_neg_results(bp)) | 1864 | if (bnx2x_dcbx_read_shmem_neg_results(bp)) |
| 1863 | return; | 1865 | return; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 254521319150..b69f8762b339 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -10824,38 +10824,36 @@ do { \ | |||
| 10824 | 10824 | ||
| 10825 | int bnx2x_init_firmware(struct bnx2x *bp) | 10825 | int bnx2x_init_firmware(struct bnx2x *bp) |
| 10826 | { | 10826 | { |
| 10827 | const char *fw_file_name; | ||
| 10827 | struct bnx2x_fw_file_hdr *fw_hdr; | 10828 | struct bnx2x_fw_file_hdr *fw_hdr; |
| 10828 | int rc; | 10829 | int rc; |
| 10829 | 10830 | ||
| 10831 | if (bp->firmware) | ||
| 10832 | return 0; | ||
| 10830 | 10833 | ||
| 10831 | if (!bp->firmware) { | 10834 | if (CHIP_IS_E1(bp)) |
| 10832 | const char *fw_file_name; | 10835 | fw_file_name = FW_FILE_NAME_E1; |
| 10833 | 10836 | else if (CHIP_IS_E1H(bp)) | |
| 10834 | if (CHIP_IS_E1(bp)) | 10837 | fw_file_name = FW_FILE_NAME_E1H; |
| 10835 | fw_file_name = FW_FILE_NAME_E1; | 10838 | else if (!CHIP_IS_E1x(bp)) |
| 10836 | else if (CHIP_IS_E1H(bp)) | 10839 | fw_file_name = FW_FILE_NAME_E2; |
| 10837 | fw_file_name = FW_FILE_NAME_E1H; | 10840 | else { |
| 10838 | else if (!CHIP_IS_E1x(bp)) | 10841 | BNX2X_ERR("Unsupported chip revision\n"); |
| 10839 | fw_file_name = FW_FILE_NAME_E2; | 10842 | return -EINVAL; |
| 10840 | else { | 10843 | } |
| 10841 | BNX2X_ERR("Unsupported chip revision\n"); | 10844 | BNX2X_DEV_INFO("Loading %s\n", fw_file_name); |
| 10842 | return -EINVAL; | ||
| 10843 | } | ||
| 10844 | BNX2X_DEV_INFO("Loading %s\n", fw_file_name); | ||
| 10845 | 10845 | ||
| 10846 | rc = request_firmware(&bp->firmware, fw_file_name, | 10846 | rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev); |
| 10847 | &bp->pdev->dev); | 10847 | if (rc) { |
| 10848 | if (rc) { | 10848 | BNX2X_ERR("Can't load firmware file %s\n", |
| 10849 | BNX2X_ERR("Can't load firmware file %s\n", | 10849 | fw_file_name); |
| 10850 | fw_file_name); | 10850 | goto request_firmware_exit; |
| 10851 | goto request_firmware_exit; | 10851 | } |
| 10852 | } | ||
| 10853 | 10852 | ||
| 10854 | rc = bnx2x_check_firmware(bp); | 10853 | rc = bnx2x_check_firmware(bp); |
| 10855 | if (rc) { | 10854 | if (rc) { |
| 10856 | BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name); | 10855 | BNX2X_ERR("Corrupt firmware file %s\n", fw_file_name); |
| 10857 | goto request_firmware_exit; | 10856 | goto request_firmware_exit; |
| 10858 | } | ||
| 10859 | } | 10857 | } |
| 10860 | 10858 | ||
| 10861 | fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data; | 10859 | fw_hdr = (struct bnx2x_fw_file_hdr *)bp->firmware->data; |
| @@ -10901,6 +10899,7 @@ init_ops_alloc_err: | |||
| 10901 | kfree(bp->init_data); | 10899 | kfree(bp->init_data); |
| 10902 | request_firmware_exit: | 10900 | request_firmware_exit: |
| 10903 | release_firmware(bp->firmware); | 10901 | release_firmware(bp->firmware); |
| 10902 | bp->firmware = NULL; | ||
| 10904 | 10903 | ||
| 10905 | return rc; | 10904 | return rc; |
| 10906 | } | 10905 | } |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index cb6339c35571..94110e9ce51d 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
| @@ -5601,7 +5601,7 @@ static inline int bnx2x_func_send_start(struct bnx2x *bp, | |||
| 5601 | 5601 | ||
| 5602 | /* Fill the ramrod data with provided parameters */ | 5602 | /* Fill the ramrod data with provided parameters */ |
| 5603 | rdata->function_mode = cpu_to_le16(start_params->mf_mode); | 5603 | rdata->function_mode = cpu_to_le16(start_params->mf_mode); |
| 5604 | rdata->sd_vlan_tag = start_params->sd_vlan_tag; | 5604 | rdata->sd_vlan_tag = cpu_to_le16(start_params->sd_vlan_tag); |
| 5605 | rdata->path_id = BP_PATH(bp); | 5605 | rdata->path_id = BP_PATH(bp); |
| 5606 | rdata->network_cos_mode = start_params->network_cos_mode; | 5606 | rdata->network_cos_mode = start_params->network_cos_mode; |
| 5607 | 5607 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index 1adef266fcd5..a766b25eec5f 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c | |||
| @@ -554,23 +554,11 @@ static void bnx2x_bmac_stats_update(struct bnx2x *bp) | |||
| 554 | UPDATE_STAT64(tx_stat_gtufl, tx_stat_mac_ufl); | 554 | UPDATE_STAT64(tx_stat_gtufl, tx_stat_mac_ufl); |
| 555 | 555 | ||
| 556 | /* collect PFC stats */ | 556 | /* collect PFC stats */ |
| 557 | DIFF_64(diff.hi, new->tx_stat_gtpp_hi, | ||
| 558 | pstats->pfc_frames_tx_hi, | ||
| 559 | diff.lo, new->tx_stat_gtpp_lo, | ||
| 560 | pstats->pfc_frames_tx_lo); | ||
| 561 | pstats->pfc_frames_tx_hi = new->tx_stat_gtpp_hi; | 557 | pstats->pfc_frames_tx_hi = new->tx_stat_gtpp_hi; |
| 562 | pstats->pfc_frames_tx_lo = new->tx_stat_gtpp_lo; | 558 | pstats->pfc_frames_tx_lo = new->tx_stat_gtpp_lo; |
| 563 | ADD_64(pstats->pfc_frames_tx_hi, diff.hi, | ||
| 564 | pstats->pfc_frames_tx_lo, diff.lo); | ||
| 565 | 559 | ||
| 566 | DIFF_64(diff.hi, new->rx_stat_grpp_hi, | ||
| 567 | pstats->pfc_frames_rx_hi, | ||
| 568 | diff.lo, new->rx_stat_grpp_lo, | ||
| 569 | pstats->pfc_frames_rx_lo); | ||
| 570 | pstats->pfc_frames_rx_hi = new->rx_stat_grpp_hi; | 560 | pstats->pfc_frames_rx_hi = new->rx_stat_grpp_hi; |
| 571 | pstats->pfc_frames_rx_lo = new->rx_stat_grpp_lo; | 561 | pstats->pfc_frames_rx_lo = new->rx_stat_grpp_lo; |
| 572 | ADD_64(pstats->pfc_frames_rx_hi, diff.hi, | ||
| 573 | pstats->pfc_frames_rx_lo, diff.lo); | ||
| 574 | } | 562 | } |
| 575 | 563 | ||
| 576 | estats->pause_frames_received_hi = | 564 | estats->pause_frames_received_hi = |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index a1f2e0fed78b..35c2a202d67a 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -5352,7 +5352,7 @@ static void tg3_tx(struct tg3_napi *tnapi) | |||
| 5352 | } | 5352 | } |
| 5353 | } | 5353 | } |
| 5354 | 5354 | ||
| 5355 | netdev_completed_queue(tp->dev, pkts_compl, bytes_compl); | 5355 | netdev_tx_completed_queue(txq, pkts_compl, bytes_compl); |
| 5356 | 5356 | ||
| 5357 | tnapi->tx_cons = sw_idx; | 5357 | tnapi->tx_cons = sw_idx; |
| 5358 | 5358 | ||
| @@ -6793,7 +6793,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 6793 | } | 6793 | } |
| 6794 | 6794 | ||
| 6795 | skb_tx_timestamp(skb); | 6795 | skb_tx_timestamp(skb); |
| 6796 | netdev_sent_queue(tp->dev, skb->len); | 6796 | netdev_tx_sent_queue(txq, skb->len); |
| 6797 | 6797 | ||
| 6798 | /* Packets are ready, update Tx producer idx local and on card. */ | 6798 | /* Packets are ready, update Tx producer idx local and on card. */ |
| 6799 | tw32_tx_mbox(tnapi->prodmbox, entry); | 6799 | tw32_tx_mbox(tnapi->prodmbox, entry); |
| @@ -7275,8 +7275,8 @@ static void tg3_free_rings(struct tg3 *tp) | |||
| 7275 | 7275 | ||
| 7276 | dev_kfree_skb_any(skb); | 7276 | dev_kfree_skb_any(skb); |
| 7277 | } | 7277 | } |
| 7278 | netdev_tx_reset_queue(netdev_get_tx_queue(tp->dev, j)); | ||
| 7278 | } | 7279 | } |
| 7279 | netdev_reset_queue(tp->dev); | ||
| 7280 | } | 7280 | } |
| 7281 | 7281 | ||
| 7282 | /* Initialize tx/rx rings for packet processing. | 7282 | /* Initialize tx/rx rings for packet processing. |
| @@ -7886,10 +7886,8 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
| 7886 | return 0; | 7886 | return 0; |
| 7887 | } | 7887 | } |
| 7888 | 7888 | ||
| 7889 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *, | 7889 | static void tg3_get_nstats(struct tg3 *, struct rtnl_link_stats64 *); |
| 7890 | struct rtnl_link_stats64 *); | 7890 | static void tg3_get_estats(struct tg3 *, struct tg3_ethtool_stats *); |
| 7891 | static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *, | ||
| 7892 | struct tg3_ethtool_stats *); | ||
| 7893 | 7891 | ||
| 7894 | /* tp->lock is held. */ | 7892 | /* tp->lock is held. */ |
| 7895 | static int tg3_halt(struct tg3 *tp, int kind, int silent) | 7893 | static int tg3_halt(struct tg3 *tp, int kind, int silent) |
| @@ -7910,7 +7908,7 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent) | |||
| 7910 | 7908 | ||
| 7911 | if (tp->hw_stats) { | 7909 | if (tp->hw_stats) { |
| 7912 | /* Save the stats across chip resets... */ | 7910 | /* Save the stats across chip resets... */ |
| 7913 | tg3_get_stats64(tp->dev, &tp->net_stats_prev), | 7911 | tg3_get_nstats(tp, &tp->net_stats_prev), |
| 7914 | tg3_get_estats(tp, &tp->estats_prev); | 7912 | tg3_get_estats(tp, &tp->estats_prev); |
| 7915 | 7913 | ||
| 7916 | /* And make sure the next sample is new data */ | 7914 | /* And make sure the next sample is new data */ |
| @@ -9847,7 +9845,7 @@ static inline u64 get_stat64(tg3_stat64_t *val) | |||
| 9847 | return ((u64)val->high << 32) | ((u64)val->low); | 9845 | return ((u64)val->high << 32) | ((u64)val->low); |
| 9848 | } | 9846 | } |
| 9849 | 9847 | ||
| 9850 | static u64 calc_crc_errors(struct tg3 *tp) | 9848 | static u64 tg3_calc_crc_errors(struct tg3 *tp) |
| 9851 | { | 9849 | { |
| 9852 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 9850 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
| 9853 | 9851 | ||
| @@ -9856,14 +9854,12 @@ static u64 calc_crc_errors(struct tg3 *tp) | |||
| 9856 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) { | 9854 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) { |
| 9857 | u32 val; | 9855 | u32 val; |
| 9858 | 9856 | ||
| 9859 | spin_lock_bh(&tp->lock); | ||
| 9860 | if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) { | 9857 | if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) { |
| 9861 | tg3_writephy(tp, MII_TG3_TEST1, | 9858 | tg3_writephy(tp, MII_TG3_TEST1, |
| 9862 | val | MII_TG3_TEST1_CRC_EN); | 9859 | val | MII_TG3_TEST1_CRC_EN); |
| 9863 | tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val); | 9860 | tg3_readphy(tp, MII_TG3_RXR_COUNTERS, &val); |
| 9864 | } else | 9861 | } else |
| 9865 | val = 0; | 9862 | val = 0; |
| 9866 | spin_unlock_bh(&tp->lock); | ||
| 9867 | 9863 | ||
| 9868 | tp->phy_crc_errors += val; | 9864 | tp->phy_crc_errors += val; |
| 9869 | 9865 | ||
| @@ -9877,14 +9873,13 @@ static u64 calc_crc_errors(struct tg3 *tp) | |||
| 9877 | estats->member = old_estats->member + \ | 9873 | estats->member = old_estats->member + \ |
| 9878 | get_stat64(&hw_stats->member) | 9874 | get_stat64(&hw_stats->member) |
| 9879 | 9875 | ||
| 9880 | static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp, | 9876 | static void tg3_get_estats(struct tg3 *tp, struct tg3_ethtool_stats *estats) |
| 9881 | struct tg3_ethtool_stats *estats) | ||
| 9882 | { | 9877 | { |
| 9883 | struct tg3_ethtool_stats *old_estats = &tp->estats_prev; | 9878 | struct tg3_ethtool_stats *old_estats = &tp->estats_prev; |
| 9884 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 9879 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
| 9885 | 9880 | ||
| 9886 | if (!hw_stats) | 9881 | if (!hw_stats) |
| 9887 | return old_estats; | 9882 | return; |
| 9888 | 9883 | ||
| 9889 | ESTAT_ADD(rx_octets); | 9884 | ESTAT_ADD(rx_octets); |
| 9890 | ESTAT_ADD(rx_fragments); | 9885 | ESTAT_ADD(rx_fragments); |
| @@ -9963,20 +9958,13 @@ static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp, | |||
| 9963 | ESTAT_ADD(nic_tx_threshold_hit); | 9958 | ESTAT_ADD(nic_tx_threshold_hit); |
| 9964 | 9959 | ||
| 9965 | ESTAT_ADD(mbuf_lwm_thresh_hit); | 9960 | ESTAT_ADD(mbuf_lwm_thresh_hit); |
| 9966 | |||
| 9967 | return estats; | ||
| 9968 | } | 9961 | } |
| 9969 | 9962 | ||
| 9970 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | 9963 | static void tg3_get_nstats(struct tg3 *tp, struct rtnl_link_stats64 *stats) |
| 9971 | struct rtnl_link_stats64 *stats) | ||
| 9972 | { | 9964 | { |
| 9973 | struct tg3 *tp = netdev_priv(dev); | ||
| 9974 | struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev; | 9965 | struct rtnl_link_stats64 *old_stats = &tp->net_stats_prev; |
| 9975 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 9966 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
| 9976 | 9967 | ||
| 9977 | if (!hw_stats) | ||
| 9978 | return old_stats; | ||
| 9979 | |||
| 9980 | stats->rx_packets = old_stats->rx_packets + | 9968 | stats->rx_packets = old_stats->rx_packets + |
| 9981 | get_stat64(&hw_stats->rx_ucast_packets) + | 9969 | get_stat64(&hw_stats->rx_ucast_packets) + |
| 9982 | get_stat64(&hw_stats->rx_mcast_packets) + | 9970 | get_stat64(&hw_stats->rx_mcast_packets) + |
| @@ -10019,15 +10007,13 @@ static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | |||
| 10019 | get_stat64(&hw_stats->tx_carrier_sense_errors); | 10007 | get_stat64(&hw_stats->tx_carrier_sense_errors); |
| 10020 | 10008 | ||
| 10021 | stats->rx_crc_errors = old_stats->rx_crc_errors + | 10009 | stats->rx_crc_errors = old_stats->rx_crc_errors + |
| 10022 | calc_crc_errors(tp); | 10010 | tg3_calc_crc_errors(tp); |
| 10023 | 10011 | ||
| 10024 | stats->rx_missed_errors = old_stats->rx_missed_errors + | 10012 | stats->rx_missed_errors = old_stats->rx_missed_errors + |
| 10025 | get_stat64(&hw_stats->rx_discards); | 10013 | get_stat64(&hw_stats->rx_discards); |
| 10026 | 10014 | ||
| 10027 | stats->rx_dropped = tp->rx_dropped; | 10015 | stats->rx_dropped = tp->rx_dropped; |
| 10028 | stats->tx_dropped = tp->tx_dropped; | 10016 | stats->tx_dropped = tp->tx_dropped; |
| 10029 | |||
| 10030 | return stats; | ||
| 10031 | } | 10017 | } |
| 10032 | 10018 | ||
| 10033 | static inline u32 calc_crc(unsigned char *buf, int len) | 10019 | static inline u32 calc_crc(unsigned char *buf, int len) |
| @@ -15409,6 +15395,21 @@ static void __devinit tg3_init_coal(struct tg3 *tp) | |||
| 15409 | } | 15395 | } |
| 15410 | } | 15396 | } |
| 15411 | 15397 | ||
| 15398 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | ||
| 15399 | struct rtnl_link_stats64 *stats) | ||
| 15400 | { | ||
| 15401 | struct tg3 *tp = netdev_priv(dev); | ||
| 15402 | |||
| 15403 | if (!tp->hw_stats) | ||
| 15404 | return &tp->net_stats_prev; | ||
| 15405 | |||
| 15406 | spin_lock_bh(&tp->lock); | ||
| 15407 | tg3_get_nstats(tp, stats); | ||
| 15408 | spin_unlock_bh(&tp->lock); | ||
| 15409 | |||
| 15410 | return stats; | ||
| 15411 | } | ||
| 15412 | |||
| 15412 | static const struct net_device_ops tg3_netdev_ops = { | 15413 | static const struct net_device_ops tg3_netdev_ops = { |
| 15413 | .ndo_open = tg3_open, | 15414 | .ndo_open = tg3_open, |
| 15414 | .ndo_stop = tg3_close, | 15415 | .ndo_stop = tg3_close, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index e83d12c7bf20..9d76e59d9526 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -196,6 +196,8 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = { | |||
| 196 | CH_DEVICE(0x4408, 4), | 196 | CH_DEVICE(0x4408, 4), |
| 197 | CH_DEVICE(0x4409, 4), | 197 | CH_DEVICE(0x4409, 4), |
| 198 | CH_DEVICE(0x440a, 4), | 198 | CH_DEVICE(0x440a, 4), |
| 199 | CH_DEVICE(0x440d, 4), | ||
| 200 | CH_DEVICE(0x440e, 4), | ||
| 199 | { 0, } | 201 | { 0, } |
| 200 | }; | 202 | }; |
| 201 | 203 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c index e53365a71484..d963c1d57f71 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | |||
| @@ -2892,6 +2892,8 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = { | |||
| 2892 | CH_DEVICE(0x4808, 0), /* T420-cx */ | 2892 | CH_DEVICE(0x4808, 0), /* T420-cx */ |
| 2893 | CH_DEVICE(0x4809, 0), /* T420-bt */ | 2893 | CH_DEVICE(0x4809, 0), /* T420-bt */ |
| 2894 | CH_DEVICE(0x480a, 0), /* T404-bt */ | 2894 | CH_DEVICE(0x480a, 0), /* T404-bt */ |
| 2895 | CH_DEVICE(0x480d, 0), /* T480-cr */ | ||
| 2896 | CH_DEVICE(0x480e, 0), /* T440-lp-cr */ | ||
| 2895 | { 0, } | 2897 | { 0, } |
| 2896 | }; | 2898 | }; |
| 2897 | 2899 | ||
diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/cisco/enic/enic.h index ee93a2087fe6..c52295cd05ef 100644 --- a/drivers/net/ethernet/cisco/enic/enic.h +++ b/drivers/net/ethernet/cisco/enic/enic.h | |||
| @@ -94,7 +94,7 @@ struct enic { | |||
| 94 | u32 rx_coalesce_usecs; | 94 | u32 rx_coalesce_usecs; |
| 95 | u32 tx_coalesce_usecs; | 95 | u32 tx_coalesce_usecs; |
| 96 | #ifdef CONFIG_PCI_IOV | 96 | #ifdef CONFIG_PCI_IOV |
| 97 | u32 num_vfs; | 97 | u16 num_vfs; |
| 98 | #endif | 98 | #endif |
| 99 | struct enic_port_profile *pp; | 99 | struct enic_port_profile *pp; |
| 100 | 100 | ||
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index ab3f67f980d8..0e4edd3b6bee 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
| @@ -2370,7 +2370,7 @@ static int __devinit enic_probe(struct pci_dev *pdev, | |||
| 2370 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); | 2370 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); |
| 2371 | if (pos) { | 2371 | if (pos) { |
| 2372 | pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF, | 2372 | pci_read_config_word(pdev, pos + PCI_SRIOV_TOTAL_VF, |
| 2373 | (u16 *)&enic->num_vfs); | 2373 | &enic->num_vfs); |
| 2374 | if (enic->num_vfs) { | 2374 | if (enic->num_vfs) { |
| 2375 | err = pci_enable_sriov(pdev, enic->num_vfs); | 2375 | err = pci_enable_sriov(pdev, enic->num_vfs); |
| 2376 | if (err) { | 2376 | if (err) { |
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c index 5d5fb2627184..e6893cdfd13b 100644 --- a/drivers/net/ethernet/ibm/ehea/ehea_main.c +++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c | |||
| @@ -336,7 +336,9 @@ static struct rtnl_link_stats64 *ehea_get_stats64(struct net_device *dev, | |||
| 336 | stats->tx_bytes = tx_bytes; | 336 | stats->tx_bytes = tx_bytes; |
| 337 | stats->rx_packets = rx_packets; | 337 | stats->rx_packets = rx_packets; |
| 338 | 338 | ||
| 339 | return &port->stats; | 339 | stats->multicast = port->stats.multicast; |
| 340 | stats->rx_errors = port->stats.rx_errors; | ||
| 341 | return stats; | ||
| 340 | } | 342 | } |
| 341 | 343 | ||
| 342 | static void ehea_update_stats(struct work_struct *work) | 344 | static void ehea_update_stats(struct work_struct *work) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c index 738f950a1ce5..fb2b36759cbf 100644 --- a/drivers/net/ethernet/mellanox/mlx4/qp.c +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | |||
| @@ -151,11 +151,6 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
| 151 | context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; | 151 | context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | port = ((context->pri_path.sched_queue >> 6) & 1) + 1; | ||
| 155 | if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH) | ||
| 156 | context->pri_path.sched_queue = (context->pri_path.sched_queue & | ||
| 157 | 0xc3); | ||
| 158 | |||
| 159 | *(__be32 *) mailbox->buf = cpu_to_be32(optpar); | 154 | *(__be32 *) mailbox->buf = cpu_to_be32(optpar); |
| 160 | memcpy(mailbox->buf + 8, context, sizeof *context); | 155 | memcpy(mailbox->buf + 8, context, sizeof *context); |
| 161 | 156 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index bfdb7af19e49..8752e6e08169 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -2255,8 +2255,7 @@ int mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave, | |||
| 2255 | 2255 | ||
| 2256 | if (vhcr->op_modifier == 0) { | 2256 | if (vhcr->op_modifier == 0) { |
| 2257 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); | 2257 | err = handle_resize(dev, slave, vhcr, inbox, outbox, cmd, cq); |
| 2258 | if (err) | 2258 | goto ex_put; |
| 2259 | goto ex_put; | ||
| 2260 | } | 2259 | } |
| 2261 | 2260 | ||
| 2262 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); | 2261 | err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd); |
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c index 9cb5f912e489..29e23bec809c 100644 --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c | |||
| @@ -321,10 +321,10 @@ static void pch_gbe_check_copper_options(struct pch_gbe_adapter *adapter) | |||
| 321 | pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); | 321 | pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); |
| 322 | hw->phy.autoneg_advertised = opt.def; | 322 | hw->phy.autoneg_advertised = opt.def; |
| 323 | } else { | 323 | } else { |
| 324 | hw->phy.autoneg_advertised = AutoNeg; | 324 | int tmp = AutoNeg; |
| 325 | pch_gbe_validate_option( | 325 | |
| 326 | (int *)(&hw->phy.autoneg_advertised), | 326 | pch_gbe_validate_option(&tmp, &opt, adapter); |
| 327 | &opt, adapter); | 327 | hw->phy.autoneg_advertised = tmp; |
| 328 | } | 328 | } |
| 329 | } | 329 | } |
| 330 | 330 | ||
| @@ -495,9 +495,10 @@ void pch_gbe_check_options(struct pch_gbe_adapter *adapter) | |||
| 495 | .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list), | 495 | .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list), |
| 496 | .p = fc_list } } | 496 | .p = fc_list } } |
| 497 | }; | 497 | }; |
| 498 | hw->mac.fc = FlowControl; | 498 | int tmp = FlowControl; |
| 499 | pch_gbe_validate_option((int *)(&hw->mac.fc), | 499 | |
| 500 | &opt, adapter); | 500 | pch_gbe_validate_option(&tmp, &opt, adapter); |
| 501 | hw->mac.fc = tmp; | ||
| 501 | } | 502 | } |
| 502 | 503 | ||
| 503 | pch_gbe_check_copper_options(adapter); | 504 | pch_gbe_check_copper_options(adapter); |
diff --git a/drivers/net/ethernet/packetengines/Kconfig b/drivers/net/ethernet/packetengines/Kconfig index b97132d9dff0..8f29feb35548 100644 --- a/drivers/net/ethernet/packetengines/Kconfig +++ b/drivers/net/ethernet/packetengines/Kconfig | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | config NET_PACKET_ENGINE | 5 | config NET_PACKET_ENGINE |
| 6 | bool "Packet Engine devices" | 6 | bool "Packet Engine devices" |
| 7 | default y | ||
| 7 | depends on PCI | 8 | depends on PCI |
| 8 | ---help--- | 9 | ---help--- |
| 9 | If you have a network (Ethernet) card belonging to this class, say Y | 10 | If you have a network (Ethernet) card belonging to this class, say Y |
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c index 7931531c3a40..e61560e16385 100644 --- a/drivers/net/ethernet/qlogic/qla3xxx.c +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | |||
| @@ -3017,7 +3017,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
| 3017 | (void __iomem *)port_regs; | 3017 | (void __iomem *)port_regs; |
| 3018 | u32 delay = 10; | 3018 | u32 delay = 10; |
| 3019 | int status = 0; | 3019 | int status = 0; |
| 3020 | unsigned long hw_flags = 0; | ||
| 3021 | 3020 | ||
| 3022 | if (ql_mii_setup(qdev)) | 3021 | if (ql_mii_setup(qdev)) |
| 3023 | return -1; | 3022 | return -1; |
| @@ -3228,9 +3227,9 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
| 3228 | value = ql_read_page0_reg(qdev, &port_regs->portStatus); | 3227 | value = ql_read_page0_reg(qdev, &port_regs->portStatus); |
| 3229 | if (value & PORT_STATUS_IC) | 3228 | if (value & PORT_STATUS_IC) |
| 3230 | break; | 3229 | break; |
| 3231 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | 3230 | spin_unlock_irq(&qdev->hw_lock); |
| 3232 | msleep(500); | 3231 | msleep(500); |
| 3233 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | 3232 | spin_lock_irq(&qdev->hw_lock); |
| 3234 | } while (--delay); | 3233 | } while (--delay); |
| 3235 | 3234 | ||
| 3236 | if (delay == 0) { | 3235 | if (delay == 0) { |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 7a0c800b50ad..bbacb3741ec0 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -3781,12 +3781,20 @@ static void rtl8169_init_ring_indexes(struct rtl8169_private *tp) | |||
| 3781 | 3781 | ||
| 3782 | static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) | 3782 | static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) |
| 3783 | { | 3783 | { |
| 3784 | void __iomem *ioaddr = tp->mmio_addr; | ||
| 3785 | |||
| 3786 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
| 3784 | rtl_generic_op(tp, tp->jumbo_ops.enable); | 3787 | rtl_generic_op(tp, tp->jumbo_ops.enable); |
| 3788 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
| 3785 | } | 3789 | } |
| 3786 | 3790 | ||
| 3787 | static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) | 3791 | static void rtl_hw_jumbo_disable(struct rtl8169_private *tp) |
| 3788 | { | 3792 | { |
| 3793 | void __iomem *ioaddr = tp->mmio_addr; | ||
| 3794 | |||
| 3795 | RTL_W8(Cfg9346, Cfg9346_Unlock); | ||
| 3789 | rtl_generic_op(tp, tp->jumbo_ops.disable); | 3796 | rtl_generic_op(tp, tp->jumbo_ops.disable); |
| 3797 | RTL_W8(Cfg9346, Cfg9346_Lock); | ||
| 3790 | } | 3798 | } |
| 3791 | 3799 | ||
| 3792 | static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp) | 3800 | static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp) |
| @@ -6186,6 +6194,9 @@ static void rtl_shutdown(struct pci_dev *pdev) | |||
| 6186 | { | 6194 | { |
| 6187 | struct net_device *dev = pci_get_drvdata(pdev); | 6195 | struct net_device *dev = pci_get_drvdata(pdev); |
| 6188 | struct rtl8169_private *tp = netdev_priv(dev); | 6196 | struct rtl8169_private *tp = netdev_priv(dev); |
| 6197 | struct device *d = &pdev->dev; | ||
| 6198 | |||
| 6199 | pm_runtime_get_sync(d); | ||
| 6189 | 6200 | ||
| 6190 | rtl8169_net_suspend(dev); | 6201 | rtl8169_net_suspend(dev); |
| 6191 | 6202 | ||
| @@ -6207,6 +6218,8 @@ static void rtl_shutdown(struct pci_dev *pdev) | |||
| 6207 | pci_wake_from_d3(pdev, true); | 6218 | pci_wake_from_d3(pdev, true); |
| 6208 | pci_set_power_state(pdev, PCI_D3hot); | 6219 | pci_set_power_state(pdev, PCI_D3hot); |
| 6209 | } | 6220 | } |
| 6221 | |||
| 6222 | pm_runtime_put_noidle(d); | ||
| 6210 | } | 6223 | } |
| 6211 | 6224 | ||
| 6212 | static struct pci_driver rtl8169_pci_driver = { | 6225 | static struct pci_driver rtl8169_pci_driver = { |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 466c58a7353d..610860f28968 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -166,7 +166,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) | |||
| 166 | 166 | ||
| 167 | dev_kfree_skb(skb); | 167 | dev_kfree_skb(skb); |
| 168 | net->stats.tx_dropped++; | 168 | net->stats.tx_dropped++; |
| 169 | return NETDEV_TX_BUSY; | 169 | return NETDEV_TX_OK; |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | packet->extension = (void *)(unsigned long)packet + | 172 | packet->extension = (void *)(unsigned long)packet + |
| @@ -226,7 +226,7 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net) | |||
| 226 | dev_kfree_skb_any(skb); | 226 | dev_kfree_skb_any(skb); |
| 227 | } | 227 | } |
| 228 | 228 | ||
| 229 | return ret ? NETDEV_TX_BUSY : NETDEV_TX_OK; | 229 | return NETDEV_TX_OK; |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | /* | 232 | /* |
| @@ -313,7 +313,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, | |||
| 313 | static void netvsc_get_drvinfo(struct net_device *net, | 313 | static void netvsc_get_drvinfo(struct net_device *net, |
| 314 | struct ethtool_drvinfo *info) | 314 | struct ethtool_drvinfo *info) |
| 315 | { | 315 | { |
| 316 | strcpy(info->driver, "hv_netvsc"); | 316 | strcpy(info->driver, KBUILD_MODNAME); |
| 317 | strcpy(info->version, HV_DRV_VERSION); | 317 | strcpy(info->version, HV_DRV_VERSION); |
| 318 | strcpy(info->fw_version, "N/A"); | 318 | strcpy(info->fw_version, "N/A"); |
| 319 | } | 319 | } |
| @@ -485,7 +485,7 @@ MODULE_DEVICE_TABLE(vmbus, id_table); | |||
| 485 | 485 | ||
| 486 | /* The one and only one */ | 486 | /* The one and only one */ |
| 487 | static struct hv_driver netvsc_drv = { | 487 | static struct hv_driver netvsc_drv = { |
| 488 | .name = "netvsc", | 488 | .name = KBUILD_MODNAME, |
| 489 | .id_table = id_table, | 489 | .id_table = id_table, |
| 490 | .probe = netvsc_probe, | 490 | .probe = netvsc_probe, |
| 491 | .remove = netvsc_remove, | 491 | .remove = netvsc_remove, |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 93c5d72711b0..2d7601dd6660 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -359,7 +359,7 @@ static void tun_free_netdev(struct net_device *dev) | |||
| 359 | { | 359 | { |
| 360 | struct tun_struct *tun = netdev_priv(dev); | 360 | struct tun_struct *tun = netdev_priv(dev); |
| 361 | 361 | ||
| 362 | sock_put(tun->socket.sk); | 362 | sk_release_kernel(tun->socket.sk); |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | /* Net device open. */ | 365 | /* Net device open. */ |
| @@ -980,10 +980,18 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 980 | return ret; | 980 | return ret; |
| 981 | } | 981 | } |
| 982 | 982 | ||
| 983 | static int tun_release(struct socket *sock) | ||
| 984 | { | ||
| 985 | if (sock->sk) | ||
| 986 | sock_put(sock->sk); | ||
| 987 | return 0; | ||
| 988 | } | ||
| 989 | |||
| 983 | /* Ops structure to mimic raw sockets with tun */ | 990 | /* Ops structure to mimic raw sockets with tun */ |
| 984 | static const struct proto_ops tun_socket_ops = { | 991 | static const struct proto_ops tun_socket_ops = { |
| 985 | .sendmsg = tun_sendmsg, | 992 | .sendmsg = tun_sendmsg, |
| 986 | .recvmsg = tun_recvmsg, | 993 | .recvmsg = tun_recvmsg, |
| 994 | .release = tun_release, | ||
| 987 | }; | 995 | }; |
| 988 | 996 | ||
| 989 | static struct proto tun_proto = { | 997 | static struct proto tun_proto = { |
| @@ -1110,10 +1118,11 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
| 1110 | tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); | 1118 | tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); |
| 1111 | 1119 | ||
| 1112 | err = -ENOMEM; | 1120 | err = -ENOMEM; |
| 1113 | sk = sk_alloc(net, AF_UNSPEC, GFP_KERNEL, &tun_proto); | 1121 | sk = sk_alloc(&init_net, AF_UNSPEC, GFP_KERNEL, &tun_proto); |
| 1114 | if (!sk) | 1122 | if (!sk) |
| 1115 | goto err_free_dev; | 1123 | goto err_free_dev; |
| 1116 | 1124 | ||
| 1125 | sk_change_net(sk, net); | ||
| 1117 | tun->socket.wq = &tun->wq; | 1126 | tun->socket.wq = &tun->wq; |
| 1118 | init_waitqueue_head(&tun->wq.wait); | 1127 | init_waitqueue_head(&tun->wq.wait); |
| 1119 | tun->socket.ops = &tun_socket_ops; | 1128 | tun->socket.ops = &tun_socket_ops; |
| @@ -1174,7 +1183,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
| 1174 | return 0; | 1183 | return 0; |
| 1175 | 1184 | ||
| 1176 | err_free_sk: | 1185 | err_free_sk: |
| 1177 | sock_put(sk); | 1186 | tun_free_netdev(dev); |
| 1178 | err_free_dev: | 1187 | err_free_dev: |
| 1179 | free_netdev(dev); | 1188 | free_netdev(dev); |
| 1180 | failed: | 1189 | failed: |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 8e84f5bdd6ca..d6da5eed5453 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
| @@ -1599,6 +1599,10 @@ static const struct usb_device_id products [] = { | |||
| 1599 | USB_DEVICE (0x6189, 0x182d), | 1599 | USB_DEVICE (0x6189, 0x182d), |
| 1600 | .driver_info = (unsigned long) &ax8817x_info, | 1600 | .driver_info = (unsigned long) &ax8817x_info, |
| 1601 | }, { | 1601 | }, { |
| 1602 | // Sitecom LN-031 "USB 2.0 10/100/1000 Ethernet adapter" | ||
| 1603 | USB_DEVICE (0x0df6, 0x0056), | ||
| 1604 | .driver_info = (unsigned long) &ax88178_info, | ||
| 1605 | }, { | ||
| 1602 | // corega FEther USB2-TX | 1606 | // corega FEther USB2-TX |
| 1603 | USB_DEVICE (0x07aa, 0x0017), | 1607 | USB_DEVICE (0x07aa, 0x0017), |
| 1604 | .driver_info = (unsigned long) &ax8817x_info, | 1608 | .driver_info = (unsigned long) &ax8817x_info, |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index fae0fbd8bc88..59681f01a54e 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
| @@ -328,13 +328,13 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) | |||
| 328 | unsigned long lockflags; | 328 | unsigned long lockflags; |
| 329 | size_t size = dev->rx_urb_size; | 329 | size_t size = dev->rx_urb_size; |
| 330 | 330 | ||
| 331 | if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { | 331 | skb = __netdev_alloc_skb_ip_align(dev->net, size, flags); |
| 332 | if (!skb) { | ||
| 332 | netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); | 333 | netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); |
| 333 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); | 334 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); |
| 334 | usb_free_urb (urb); | 335 | usb_free_urb (urb); |
| 335 | return -ENOMEM; | 336 | return -ENOMEM; |
| 336 | } | 337 | } |
| 337 | skb_reserve (skb, NET_IP_ALIGN); | ||
| 338 | 338 | ||
| 339 | entry = (struct skb_data *) skb->cb; | 339 | entry = (struct skb_data *) skb->cb; |
| 340 | entry->urb = urb; | 340 | entry->urb = urb; |
| @@ -589,6 +589,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | |||
| 589 | entry = (struct skb_data *) skb->cb; | 589 | entry = (struct skb_data *) skb->cb; |
| 590 | urb = entry->urb; | 590 | urb = entry->urb; |
| 591 | 591 | ||
| 592 | spin_unlock_irqrestore(&q->lock, flags); | ||
| 592 | // during some PM-driven resume scenarios, | 593 | // during some PM-driven resume scenarios, |
| 593 | // these (async) unlinks complete immediately | 594 | // these (async) unlinks complete immediately |
| 594 | retval = usb_unlink_urb (urb); | 595 | retval = usb_unlink_urb (urb); |
| @@ -596,6 +597,7 @@ static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) | |||
| 596 | netdev_dbg(dev->net, "unlink urb err, %d\n", retval); | 597 | netdev_dbg(dev->net, "unlink urb err, %d\n", retval); |
| 597 | else | 598 | else |
| 598 | count++; | 599 | count++; |
| 600 | spin_lock_irqsave(&q->lock, flags); | ||
| 599 | } | 601 | } |
| 600 | spin_unlock_irqrestore (&q->lock, flags); | 602 | spin_unlock_irqrestore (&q->lock, flags); |
| 601 | return count; | 603 | return count; |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 3dcd3857a36c..756c0f5565a5 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
| @@ -830,13 +830,8 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
| 830 | ctx->l4_hdr_size = ((struct tcphdr *) | 830 | ctx->l4_hdr_size = ((struct tcphdr *) |
| 831 | skb_transport_header(skb))->doff * 4; | 831 | skb_transport_header(skb))->doff * 4; |
| 832 | else if (iph->protocol == IPPROTO_UDP) | 832 | else if (iph->protocol == IPPROTO_UDP) |
| 833 | /* | ||
| 834 | * Use tcp header size so that bytes to | ||
| 835 | * be copied are more than required by | ||
| 836 | * the device. | ||
| 837 | */ | ||
| 838 | ctx->l4_hdr_size = | 833 | ctx->l4_hdr_size = |
| 839 | sizeof(struct tcphdr); | 834 | sizeof(struct udphdr); |
| 840 | else | 835 | else |
| 841 | ctx->l4_hdr_size = 0; | 836 | ctx->l4_hdr_size = 0; |
| 842 | } else { | 837 | } else { |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index ed54797db191..fc46a81ad538 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
| @@ -70,10 +70,10 @@ | |||
| 70 | /* | 70 | /* |
| 71 | * Version numbers | 71 | * Version numbers |
| 72 | */ | 72 | */ |
| 73 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.18.0-k" | 73 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.29.0-k" |
| 74 | 74 | ||
| 75 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 75 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
| 76 | #define VMXNET3_DRIVER_VERSION_NUM 0x01011200 | 76 | #define VMXNET3_DRIVER_VERSION_NUM 0x01011D00 |
| 77 | 77 | ||
| 78 | #if defined(CONFIG_PCI_MSI) | 78 | #if defined(CONFIG_PCI_MSI) |
| 79 | /* RSS only makes sense if MSI-X is supported. */ | 79 | /* RSS only makes sense if MSI-X is supported. */ |
diff --git a/drivers/net/wimax/i2400m/netdev.c b/drivers/net/wimax/i2400m/netdev.c index 64a110604ad3..63e4b709efa9 100644 --- a/drivers/net/wimax/i2400m/netdev.c +++ b/drivers/net/wimax/i2400m/netdev.c | |||
| @@ -367,38 +367,28 @@ netdev_tx_t i2400m_hard_start_xmit(struct sk_buff *skb, | |||
| 367 | { | 367 | { |
| 368 | struct i2400m *i2400m = net_dev_to_i2400m(net_dev); | 368 | struct i2400m *i2400m = net_dev_to_i2400m(net_dev); |
| 369 | struct device *dev = i2400m_dev(i2400m); | 369 | struct device *dev = i2400m_dev(i2400m); |
| 370 | int result; | 370 | int result = -1; |
| 371 | 371 | ||
| 372 | d_fnstart(3, dev, "(skb %p net_dev %p)\n", skb, net_dev); | 372 | d_fnstart(3, dev, "(skb %p net_dev %p)\n", skb, net_dev); |
| 373 | if (skb_header_cloned(skb)) { | 373 | |
| 374 | /* | 374 | if (skb_header_cloned(skb) && |
| 375 | * Make tcpdump/wireshark happy -- if they are | 375 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) |
| 376 | * running, the skb is cloned and we will overwrite | 376 | goto drop; |
| 377 | * the mac fields in i2400m_tx_prep_header. Expand | ||
| 378 | * seems to fix this... | ||
| 379 | */ | ||
| 380 | result = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); | ||
| 381 | if (result) { | ||
| 382 | result = NETDEV_TX_BUSY; | ||
| 383 | goto error_expand; | ||
| 384 | } | ||
| 385 | } | ||
| 386 | 377 | ||
| 387 | if (i2400m->state == I2400M_SS_IDLE) | 378 | if (i2400m->state == I2400M_SS_IDLE) |
| 388 | result = i2400m_net_wake_tx(i2400m, net_dev, skb); | 379 | result = i2400m_net_wake_tx(i2400m, net_dev, skb); |
| 389 | else | 380 | else |
| 390 | result = i2400m_net_tx(i2400m, net_dev, skb); | 381 | result = i2400m_net_tx(i2400m, net_dev, skb); |
| 391 | if (result < 0) | 382 | if (result < 0) { |
| 383 | drop: | ||
| 392 | net_dev->stats.tx_dropped++; | 384 | net_dev->stats.tx_dropped++; |
| 393 | else { | 385 | } else { |
| 394 | net_dev->stats.tx_packets++; | 386 | net_dev->stats.tx_packets++; |
| 395 | net_dev->stats.tx_bytes += skb->len; | 387 | net_dev->stats.tx_bytes += skb->len; |
| 396 | } | 388 | } |
| 397 | result = NETDEV_TX_OK; | 389 | dev_kfree_skb(skb); |
| 398 | error_expand: | ||
| 399 | kfree_skb(skb); | ||
| 400 | d_fnend(3, dev, "(skb %p net_dev %p) = %d\n", skb, net_dev, result); | 390 | d_fnend(3, dev, "(skb %p net_dev %p) = %d\n", skb, net_dev, result); |
| 401 | return result; | 391 | return NETDEV_TX_OK; |
| 402 | } | 392 | } |
| 403 | 393 | ||
| 404 | 394 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c index f901a17f76ba..86a891f93fc9 100644 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c | |||
| @@ -489,8 +489,6 @@ static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah) | |||
| 489 | ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); | 489 | ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); |
| 490 | ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); | 490 | ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); |
| 491 | ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); | 491 | ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); |
| 492 | ATH_ALLOC_BANK(ah->addac5416_21, | ||
| 493 | ah->iniAddac.ia_rows * ah->iniAddac.ia_columns); | ||
| 494 | ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); | 492 | ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); |
| 495 | 493 | ||
| 496 | return 0; | 494 | return 0; |
| @@ -519,7 +517,6 @@ static void ar5008_hw_rf_free_ext_banks(struct ath_hw *ah) | |||
| 519 | ATH_FREE_BANK(ah->analogBank6Data); | 517 | ATH_FREE_BANK(ah->analogBank6Data); |
| 520 | ATH_FREE_BANK(ah->analogBank6TPCData); | 518 | ATH_FREE_BANK(ah->analogBank6TPCData); |
| 521 | ATH_FREE_BANK(ah->analogBank7Data); | 519 | ATH_FREE_BANK(ah->analogBank7Data); |
| 522 | ATH_FREE_BANK(ah->addac5416_21); | ||
| 523 | ATH_FREE_BANK(ah->bank6Temp); | 520 | ATH_FREE_BANK(ah->bank6Temp); |
| 524 | 521 | ||
| 525 | #undef ATH_FREE_BANK | 522 | #undef ATH_FREE_BANK |
| @@ -805,27 +802,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah, | |||
| 805 | if (ah->eep_ops->set_addac) | 802 | if (ah->eep_ops->set_addac) |
| 806 | ah->eep_ops->set_addac(ah, chan); | 803 | ah->eep_ops->set_addac(ah, chan); |
| 807 | 804 | ||
| 808 | if (AR_SREV_5416_22_OR_LATER(ah)) { | 805 | REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); |
| 809 | REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); | ||
| 810 | } else { | ||
| 811 | struct ar5416IniArray temp; | ||
| 812 | u32 addacSize = | ||
| 813 | sizeof(u32) * ah->iniAddac.ia_rows * | ||
| 814 | ah->iniAddac.ia_columns; | ||
| 815 | |||
| 816 | /* For AR5416 2.0/2.1 */ | ||
| 817 | memcpy(ah->addac5416_21, | ||
| 818 | ah->iniAddac.ia_array, addacSize); | ||
| 819 | |||
| 820 | /* override CLKDRV value at [row, column] = [31, 1] */ | ||
| 821 | (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0; | ||
| 822 | |||
| 823 | temp.ia_array = ah->addac5416_21; | ||
| 824 | temp.ia_columns = ah->iniAddac.ia_columns; | ||
| 825 | temp.ia_rows = ah->iniAddac.ia_rows; | ||
| 826 | REG_WRITE_ARRAY(&temp, 1, regWrites); | ||
| 827 | } | ||
| 828 | |||
| 829 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); | 806 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); |
| 830 | 807 | ||
| 831 | ENABLE_REGWRITE_BUFFER(ah); | 808 | ENABLE_REGWRITE_BUFFER(ah); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c index 11f192a1ceb7..d190411ac8f5 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c | |||
| @@ -180,6 +180,25 @@ static void ar9002_hw_init_mode_regs(struct ath_hw *ah) | |||
| 180 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, | 180 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, |
| 181 | ARRAY_SIZE(ar5416Addac), 2); | 181 | ARRAY_SIZE(ar5416Addac), 2); |
| 182 | } | 182 | } |
| 183 | |||
| 184 | /* iniAddac needs to be modified for these chips */ | ||
| 185 | if (AR_SREV_9160(ah) || !AR_SREV_5416_22_OR_LATER(ah)) { | ||
| 186 | struct ar5416IniArray *addac = &ah->iniAddac; | ||
| 187 | u32 size = sizeof(u32) * addac->ia_rows * addac->ia_columns; | ||
| 188 | u32 *data; | ||
| 189 | |||
| 190 | data = kmalloc(size, GFP_KERNEL); | ||
| 191 | if (!data) | ||
| 192 | return; | ||
| 193 | |||
| 194 | memcpy(data, addac->ia_array, size); | ||
| 195 | addac->ia_array = data; | ||
| 196 | |||
| 197 | if (!AR_SREV_5416_22_OR_LATER(ah)) { | ||
| 198 | /* override CLKDRV value */ | ||
| 199 | INI_RA(addac, 31,1) = 0; | ||
| 200 | } | ||
| 201 | } | ||
| 183 | } | 202 | } |
| 184 | 203 | ||
| 185 | /* Support for Japan ch.14 (2484) spread */ | 204 | /* Support for Japan ch.14 (2484) spread */ |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 6a29004a71b0..c8261d4fc780 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
| @@ -940,7 +940,6 @@ struct ath_hw { | |||
| 940 | u32 *analogBank6Data; | 940 | u32 *analogBank6Data; |
| 941 | u32 *analogBank6TPCData; | 941 | u32 *analogBank6TPCData; |
| 942 | u32 *analogBank7Data; | 942 | u32 *analogBank7Data; |
| 943 | u32 *addac5416_21; | ||
| 944 | u32 *bank6Temp; | 943 | u32 *bank6Temp; |
| 945 | 944 | ||
| 946 | u8 txpower_limit; | 945 | u8 txpower_limit; |
diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c index d19a9ee9d057..bbc813dee983 100644 --- a/drivers/net/wireless/ath/carl9170/tx.c +++ b/drivers/net/wireless/ath/carl9170/tx.c | |||
| @@ -1234,6 +1234,7 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) | |||
| 1234 | { | 1234 | { |
| 1235 | struct ieee80211_sta *sta; | 1235 | struct ieee80211_sta *sta; |
| 1236 | struct carl9170_sta_info *sta_info; | 1236 | struct carl9170_sta_info *sta_info; |
| 1237 | struct ieee80211_tx_info *tx_info; | ||
| 1237 | 1238 | ||
| 1238 | rcu_read_lock(); | 1239 | rcu_read_lock(); |
| 1239 | sta = __carl9170_get_tx_sta(ar, skb); | 1240 | sta = __carl9170_get_tx_sta(ar, skb); |
| @@ -1241,16 +1242,18 @@ static bool carl9170_tx_ps_drop(struct ar9170 *ar, struct sk_buff *skb) | |||
| 1241 | goto out_rcu; | 1242 | goto out_rcu; |
| 1242 | 1243 | ||
| 1243 | sta_info = (void *) sta->drv_priv; | 1244 | sta_info = (void *) sta->drv_priv; |
| 1244 | if (unlikely(sta_info->sleeping)) { | 1245 | tx_info = IEEE80211_SKB_CB(skb); |
| 1245 | struct ieee80211_tx_info *tx_info; | ||
| 1246 | 1246 | ||
| 1247 | if (unlikely(sta_info->sleeping) && | ||
| 1248 | !(tx_info->flags & (IEEE80211_TX_CTL_POLL_RESPONSE | | ||
| 1249 | IEEE80211_TX_CTL_CLEAR_PS_FILT))) { | ||
| 1247 | rcu_read_unlock(); | 1250 | rcu_read_unlock(); |
| 1248 | 1251 | ||
| 1249 | tx_info = IEEE80211_SKB_CB(skb); | ||
| 1250 | if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) | 1252 | if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) |
| 1251 | atomic_dec(&ar->tx_ampdu_upload); | 1253 | atomic_dec(&ar->tx_ampdu_upload); |
| 1252 | 1254 | ||
| 1253 | tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; | 1255 | tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED; |
| 1256 | carl9170_release_dev_space(ar, skb); | ||
| 1254 | carl9170_tx_status(ar, skb, false); | 1257 | carl9170_tx_status(ar, skb, false); |
| 1255 | return true; | 1258 | return true; |
| 1256 | } | 1259 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c index 90911eec0cf5..30b58870b1b6 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/ampdu.c | |||
| @@ -1051,17 +1051,13 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb, | |||
| 1051 | } | 1051 | } |
| 1052 | /* either retransmit or send bar if ack not recd */ | 1052 | /* either retransmit or send bar if ack not recd */ |
| 1053 | if (!ack_recd) { | 1053 | if (!ack_recd) { |
| 1054 | struct ieee80211_tx_rate *txrate = | 1054 | if (retry && (ini->txretry[index] < (int)retry_limit)) { |
| 1055 | tx_info->status.rates; | ||
| 1056 | if (retry && (txrate[0].count < (int)retry_limit)) { | ||
| 1057 | ini->txretry[index]++; | 1055 | ini->txretry[index]++; |
| 1058 | ini->tx_in_transit--; | 1056 | ini->tx_in_transit--; |
| 1059 | /* | 1057 | /* |
| 1060 | * Use high prededence for retransmit to | 1058 | * Use high prededence for retransmit to |
| 1061 | * give some punch | 1059 | * give some punch |
| 1062 | */ | 1060 | */ |
| 1063 | /* brcms_c_txq_enq(wlc, scb, p, | ||
| 1064 | * BRCMS_PRIO_TO_PREC(tid)); */ | ||
| 1065 | brcms_c_txq_enq(wlc, scb, p, | 1061 | brcms_c_txq_enq(wlc, scb, p, |
| 1066 | BRCMS_PRIO_TO_HI_PREC(tid)); | 1062 | BRCMS_PRIO_TO_HI_PREC(tid)); |
| 1067 | } else { | 1063 | } else { |
| @@ -1074,9 +1070,9 @@ brcms_c_ampdu_dotxstatus_complete(struct ampdu_info *ampdu, struct scb *scb, | |||
| 1074 | IEEE80211_TX_STAT_AMPDU_NO_BACK; | 1070 | IEEE80211_TX_STAT_AMPDU_NO_BACK; |
| 1075 | skb_pull(p, D11_PHY_HDR_LEN); | 1071 | skb_pull(p, D11_PHY_HDR_LEN); |
| 1076 | skb_pull(p, D11_TXH_LEN); | 1072 | skb_pull(p, D11_TXH_LEN); |
| 1077 | wiphy_err(wiphy, "%s: BA Timeout, seq %d, in_" | 1073 | BCMMSG(wiphy, |
| 1078 | "transit %d\n", "AMPDU status", seq, | 1074 | "BA Timeout, seq %d, in_transit %d\n", |
| 1079 | ini->tx_in_transit); | 1075 | seq, ini->tx_in_transit); |
| 1080 | ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, | 1076 | ieee80211_tx_status_irqsafe(wlc->pub->ieee_hw, |
| 1081 | p); | 1077 | p); |
| 1082 | } | 1078 | } |
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c index 54b2d391e91a..a7dfba8d164e 100644 --- a/drivers/net/wireless/iwlegacy/3945-mac.c +++ b/drivers/net/wireless/iwlegacy/3945-mac.c | |||
| @@ -2475,7 +2475,7 @@ il3945_bg_alive_start(struct work_struct *data) | |||
| 2475 | container_of(data, struct il_priv, alive_start.work); | 2475 | container_of(data, struct il_priv, alive_start.work); |
| 2476 | 2476 | ||
| 2477 | mutex_lock(&il->mutex); | 2477 | mutex_lock(&il->mutex); |
| 2478 | if (test_bit(S_EXIT_PENDING, &il->status)) | 2478 | if (test_bit(S_EXIT_PENDING, &il->status) || il->txq == NULL) |
| 2479 | goto out; | 2479 | goto out; |
| 2480 | 2480 | ||
| 2481 | il3945_alive_start(il); | 2481 | il3945_alive_start(il); |
diff --git a/drivers/net/wireless/iwlegacy/3945.c b/drivers/net/wireless/iwlegacy/3945.c index 1489b1573a6a..c80eb9b31551 100644 --- a/drivers/net/wireless/iwlegacy/3945.c +++ b/drivers/net/wireless/iwlegacy/3945.c | |||
| @@ -1870,11 +1870,12 @@ il3945_bg_reg_txpower_periodic(struct work_struct *work) | |||
| 1870 | struct il_priv *il = container_of(work, struct il_priv, | 1870 | struct il_priv *il = container_of(work, struct il_priv, |
| 1871 | _3945.thermal_periodic.work); | 1871 | _3945.thermal_periodic.work); |
| 1872 | 1872 | ||
| 1873 | if (test_bit(S_EXIT_PENDING, &il->status)) | ||
| 1874 | return; | ||
| 1875 | |||
| 1876 | mutex_lock(&il->mutex); | 1873 | mutex_lock(&il->mutex); |
| 1874 | if (test_bit(S_EXIT_PENDING, &il->status) || il->txq == NULL) | ||
| 1875 | goto out; | ||
| 1876 | |||
| 1877 | il3945_reg_txpower_periodic(il); | 1877 | il3945_reg_txpower_periodic(il); |
| 1878 | out: | ||
| 1878 | mutex_unlock(&il->mutex); | 1879 | mutex_unlock(&il->mutex); |
| 1879 | } | 1880 | } |
| 1880 | 1881 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index 64cf439035c3..ca78e91de86c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
| @@ -1240,7 +1240,7 @@ int iwlagn_suspend(struct iwl_priv *priv, | |||
| 1240 | .flags = CMD_SYNC, | 1240 | .flags = CMD_SYNC, |
| 1241 | .data[0] = key_data.rsc_tsc, | 1241 | .data[0] = key_data.rsc_tsc, |
| 1242 | .dataflags[0] = IWL_HCMD_DFL_NOCOPY, | 1242 | .dataflags[0] = IWL_HCMD_DFL_NOCOPY, |
| 1243 | .len[0] = sizeof(key_data.rsc_tsc), | 1243 | .len[0] = sizeof(*key_data.rsc_tsc), |
| 1244 | }; | 1244 | }; |
| 1245 | 1245 | ||
| 1246 | ret = iwl_trans_send_cmd(trans(priv), &rsc_tsc_cmd); | 1246 | ret = iwl_trans_send_cmd(trans(priv), &rsc_tsc_cmd); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c index 7353826095f1..e483cfa8d14e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c | |||
| @@ -1187,6 +1187,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
| 1187 | unsigned long flags; | 1187 | unsigned long flags; |
| 1188 | struct iwl_addsta_cmd sta_cmd; | 1188 | struct iwl_addsta_cmd sta_cmd; |
| 1189 | u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); | 1189 | u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); |
| 1190 | __le16 key_flags; | ||
| 1190 | 1191 | ||
| 1191 | /* if station isn't there, neither is the key */ | 1192 | /* if station isn't there, neither is the key */ |
| 1192 | if (sta_id == IWL_INVALID_STATION) | 1193 | if (sta_id == IWL_INVALID_STATION) |
| @@ -1212,7 +1213,14 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, | |||
| 1212 | IWL_ERR(priv, "offset %d not used in uCode key table.\n", | 1213 | IWL_ERR(priv, "offset %d not used in uCode key table.\n", |
| 1213 | keyconf->hw_key_idx); | 1214 | keyconf->hw_key_idx); |
| 1214 | 1215 | ||
| 1215 | sta_cmd.key.key_flags = STA_KEY_FLG_NO_ENC | STA_KEY_FLG_INVALID; | 1216 | key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); |
| 1217 | key_flags |= STA_KEY_FLG_MAP_KEY_MSK | STA_KEY_FLG_NO_ENC | | ||
| 1218 | STA_KEY_FLG_INVALID; | ||
| 1219 | |||
| 1220 | if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE)) | ||
| 1221 | key_flags |= STA_KEY_MULTICAST_MSK; | ||
| 1222 | |||
| 1223 | sta_cmd.key.key_flags = key_flags; | ||
| 1216 | sta_cmd.key.key_offset = WEP_INVALID_OFFSET; | 1224 | sta_cmd.key.key_offset = WEP_INVALID_OFFSET; |
| 1217 | sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; | 1225 | sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; |
| 1218 | sta_cmd.mode = STA_CONTROL_MODIFY_MSK; | 1226 | sta_cmd.mode = STA_CONTROL_MODIFY_MSK; |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 5b2972b43b0e..2210a0f9af2d 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
| @@ -846,6 +846,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | |||
| 846 | priv->sec_info.wpa_enabled = false; | 846 | priv->sec_info.wpa_enabled = false; |
| 847 | priv->sec_info.wpa2_enabled = false; | 847 | priv->sec_info.wpa2_enabled = false; |
| 848 | priv->wep_key_curr_index = 0; | 848 | priv->wep_key_curr_index = 0; |
| 849 | priv->sec_info.encryption_mode = 0; | ||
| 849 | ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); | 850 | ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); |
| 850 | 851 | ||
| 851 | if (mode == NL80211_IFTYPE_ADHOC) { | 852 | if (mode == NL80211_IFTYPE_ADHOC) { |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c3e1aa7c1a80..fd356b7c0476 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -426,10 +426,14 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
| 426 | /* | 426 | /* |
| 427 | * If the data queue was below the threshold before the txdone | 427 | * If the data queue was below the threshold before the txdone |
| 428 | * handler we must make sure the packet queue in the mac80211 stack | 428 | * handler we must make sure the packet queue in the mac80211 stack |
| 429 | * is reenabled when the txdone handler has finished. | 429 | * is reenabled when the txdone handler has finished. This has to be |
| 430 | * serialized with rt2x00mac_tx(), otherwise we can wake up queue | ||
| 431 | * before it was stopped. | ||
| 430 | */ | 432 | */ |
| 433 | spin_lock_bh(&entry->queue->tx_lock); | ||
| 431 | if (!rt2x00queue_threshold(entry->queue)) | 434 | if (!rt2x00queue_threshold(entry->queue)) |
| 432 | rt2x00queue_unpause_queue(entry->queue); | 435 | rt2x00queue_unpause_queue(entry->queue); |
| 436 | spin_unlock_bh(&entry->queue->tx_lock); | ||
| 433 | } | 437 | } |
| 434 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); | 438 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); |
| 435 | 439 | ||
| @@ -1220,7 +1224,8 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) | |||
| 1220 | cancel_work_sync(&rt2x00dev->rxdone_work); | 1224 | cancel_work_sync(&rt2x00dev->rxdone_work); |
| 1221 | cancel_work_sync(&rt2x00dev->txdone_work); | 1225 | cancel_work_sync(&rt2x00dev->txdone_work); |
| 1222 | } | 1226 | } |
| 1223 | destroy_workqueue(rt2x00dev->workqueue); | 1227 | if (rt2x00dev->workqueue) |
| 1228 | destroy_workqueue(rt2x00dev->workqueue); | ||
| 1224 | 1229 | ||
| 1225 | /* | 1230 | /* |
| 1226 | * Free the tx status fifo. | 1231 | * Free the tx status fifo. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index ede3c58e6783..2df2eb6d3e06 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -152,13 +152,22 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 152 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) | 152 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) |
| 153 | goto exit_fail; | 153 | goto exit_fail; |
| 154 | 154 | ||
| 155 | /* | ||
| 156 | * Pausing queue has to be serialized with rt2x00lib_txdone(). Note | ||
| 157 | * we should not use spin_lock_bh variant as bottom halve was already | ||
| 158 | * disabled before ieee80211_xmit() call. | ||
| 159 | */ | ||
| 160 | spin_lock(&queue->tx_lock); | ||
| 155 | if (rt2x00queue_threshold(queue)) | 161 | if (rt2x00queue_threshold(queue)) |
| 156 | rt2x00queue_pause_queue(queue); | 162 | rt2x00queue_pause_queue(queue); |
| 163 | spin_unlock(&queue->tx_lock); | ||
| 157 | 164 | ||
| 158 | return; | 165 | return; |
| 159 | 166 | ||
| 160 | exit_fail: | 167 | exit_fail: |
| 168 | spin_lock(&queue->tx_lock); | ||
| 161 | rt2x00queue_pause_queue(queue); | 169 | rt2x00queue_pause_queue(queue); |
| 170 | spin_unlock(&queue->tx_lock); | ||
| 162 | exit_free_skb: | 171 | exit_free_skb: |
| 163 | ieee80211_free_txskb(hw, skb); | 172 | ieee80211_free_txskb(hw, skb); |
| 164 | } | 173 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 5adfb3eab9cd..9b1b2b7a7807 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
| @@ -619,6 +619,9 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
| 619 | else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags)) | 619 | else if (test_bit(REQUIRE_DMA, &queue->rt2x00dev->cap_flags)) |
| 620 | rt2x00queue_align_frame(skb); | 620 | rt2x00queue_align_frame(skb); |
| 621 | 621 | ||
| 622 | /* | ||
| 623 | * That function must be called with bh disabled. | ||
| 624 | */ | ||
| 622 | spin_lock(&queue->tx_lock); | 625 | spin_lock(&queue->tx_lock); |
| 623 | 626 | ||
| 624 | if (unlikely(rt2x00queue_full(queue))) { | 627 | if (unlikely(rt2x00queue_full(queue))) { |
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index ea2bd1be2640..91a375fb6ae6 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <asm/machdep.h> | 23 | #include <asm/machdep.h> |
| 24 | #endif /* CONFIG_PPC */ | 24 | #endif /* CONFIG_PPC */ |
| 25 | 25 | ||
| 26 | #include <asm/setup.h> | ||
| 27 | #include <asm/page.h> | 26 | #include <asm/page.h> |
| 28 | 27 | ||
| 29 | char *of_fdt_get_string(struct boot_param_header *blob, u32 offset) | 28 | char *of_fdt_get_string(struct boot_param_header *blob, u32 offset) |
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index 980c079e4443..483c0adcad87 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c | |||
| @@ -182,7 +182,7 @@ struct phy_device *of_phy_connect_fixed_link(struct net_device *dev, | |||
| 182 | if (!phy_id || sz < sizeof(*phy_id)) | 182 | if (!phy_id || sz < sizeof(*phy_id)) |
| 183 | return NULL; | 183 | return NULL; |
| 184 | 184 | ||
| 185 | sprintf(bus_id, PHY_ID_FMT, "0", be32_to_cpu(phy_id[0])); | 185 | sprintf(bus_id, PHY_ID_FMT, "fixed-0", be32_to_cpu(phy_id[0])); |
| 186 | 186 | ||
| 187 | phy = phy_connect(dev, bus_id, hndlr, 0, iface); | 187 | phy = phy_connect(dev, bus_id, hndlr, 0, iface); |
| 188 | return IS_ERR(phy) ? NULL : phy; | 188 | return IS_ERR(phy) ? NULL : phy; |
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 1cfbf228fbb1..24f049e73952 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c | |||
| @@ -500,6 +500,9 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | |||
| 500 | int pos; | 500 | int pos; |
| 501 | u32 reg32; | 501 | u32 reg32; |
| 502 | 502 | ||
| 503 | if (aspm_disabled) | ||
| 504 | return 0; | ||
| 505 | |||
| 503 | /* | 506 | /* |
| 504 | * Some functions in a slot might not all be PCIe functions, | 507 | * Some functions in a slot might not all be PCIe functions, |
| 505 | * very strange. Disable ASPM for the whole slot | 508 | * very strange. Disable ASPM for the whole slot |
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index f995e6e2f78c..15dbd8cc445f 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig | |||
| @@ -143,6 +143,30 @@ config FUJITSU_LAPTOP_DEBUG | |||
| 143 | 143 | ||
| 144 | If you are not sure, say N here. | 144 | If you are not sure, say N here. |
| 145 | 145 | ||
| 146 | config FUJITSU_TABLET | ||
| 147 | tristate "Fujitsu Tablet Extras" | ||
| 148 | depends on ACPI | ||
| 149 | depends on INPUT | ||
| 150 | ---help--- | ||
| 151 | This is a driver for tablets built by Fujitsu: | ||
| 152 | |||
| 153 | * Lifebook P1510/P1610/P1620/Txxxx | ||
| 154 | * Stylistic ST5xxx | ||
| 155 | * Possibly other Fujitsu tablet models | ||
| 156 | |||
| 157 | It adds support for the panel buttons, docking station detection, | ||
| 158 | tablet/notebook mode detection for convertible and | ||
| 159 | orientation detection for docked slates. | ||
| 160 | |||
| 161 | If you have a Fujitsu convertible or slate, say Y or M here. | ||
| 162 | |||
| 163 | config AMILO_RFKILL | ||
| 164 | tristate "Fujitsu-Siemens Amilo rfkill support" | ||
| 165 | depends on RFKILL | ||
| 166 | ---help--- | ||
| 167 | This is a driver for enabling wifi on some Fujitsu-Siemens Amilo | ||
| 168 | laptops. | ||
| 169 | |||
| 146 | config TC1100_WMI | 170 | config TC1100_WMI |
| 147 | tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)" | 171 | tristate "HP Compaq TC1100 Tablet WMI Extras (EXPERIMENTAL)" |
| 148 | depends on !X86_64 | 172 | depends on !X86_64 |
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index 293a320d9faa..d328f21e9fdd 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile | |||
| @@ -17,12 +17,14 @@ obj-$(CONFIG_ACER_WMI) += acer-wmi.o | |||
| 17 | obj-$(CONFIG_ACERHDF) += acerhdf.o | 17 | obj-$(CONFIG_ACERHDF) += acerhdf.o |
| 18 | obj-$(CONFIG_HP_ACCEL) += hp_accel.o | 18 | obj-$(CONFIG_HP_ACCEL) += hp_accel.o |
| 19 | obj-$(CONFIG_HP_WMI) += hp-wmi.o | 19 | obj-$(CONFIG_HP_WMI) += hp-wmi.o |
| 20 | obj-$(CONFIG_AMILO_RFKILL) += amilo-rfkill.o | ||
| 20 | obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o | 21 | obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o |
| 21 | obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o | 22 | obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o |
| 22 | obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o | 23 | obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o |
| 23 | obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o | 24 | obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o |
| 24 | obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o | 25 | obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o |
| 25 | obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o | 26 | obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o |
| 27 | obj-$(CONFIG_FUJITSU_TABLET) += fujitsu-tablet.o | ||
| 26 | obj-$(CONFIG_PANASONIC_LAPTOP) += panasonic-laptop.o | 28 | obj-$(CONFIG_PANASONIC_LAPTOP) += panasonic-laptop.o |
| 27 | obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o | 29 | obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o |
| 28 | obj-$(CONFIG_ACPI_WMI) += wmi.o | 30 | obj-$(CONFIG_ACPI_WMI) += wmi.o |
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index b848277171a4..1e5290b5396d 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
| @@ -679,6 +679,32 @@ static acpi_status AMW0_find_mailled(void) | |||
| 679 | return AE_OK; | 679 | return AE_OK; |
| 680 | } | 680 | } |
| 681 | 681 | ||
| 682 | static int AMW0_set_cap_acpi_check_device_found; | ||
| 683 | |||
| 684 | static acpi_status AMW0_set_cap_acpi_check_device_cb(acpi_handle handle, | ||
| 685 | u32 level, void *context, void **retval) | ||
| 686 | { | ||
| 687 | AMW0_set_cap_acpi_check_device_found = 1; | ||
| 688 | return AE_OK; | ||
| 689 | } | ||
| 690 | |||
| 691 | static const struct acpi_device_id norfkill_ids[] = { | ||
| 692 | { "VPC2004", 0}, | ||
| 693 | { "IBM0068", 0}, | ||
| 694 | { "LEN0068", 0}, | ||
| 695 | { "", 0}, | ||
| 696 | }; | ||
| 697 | |||
| 698 | static int AMW0_set_cap_acpi_check_device(void) | ||
| 699 | { | ||
| 700 | const struct acpi_device_id *id; | ||
| 701 | |||
| 702 | for (id = norfkill_ids; id->id[0]; id++) | ||
| 703 | acpi_get_devices(id->id, AMW0_set_cap_acpi_check_device_cb, | ||
| 704 | NULL, NULL); | ||
| 705 | return AMW0_set_cap_acpi_check_device_found; | ||
| 706 | } | ||
| 707 | |||
| 682 | static acpi_status AMW0_set_capabilities(void) | 708 | static acpi_status AMW0_set_capabilities(void) |
| 683 | { | 709 | { |
| 684 | struct wmab_args args; | 710 | struct wmab_args args; |
| @@ -692,7 +718,9 @@ static acpi_status AMW0_set_capabilities(void) | |||
| 692 | * work. | 718 | * work. |
| 693 | */ | 719 | */ |
| 694 | if (wmi_has_guid(AMW0_GUID2)) { | 720 | if (wmi_has_guid(AMW0_GUID2)) { |
| 695 | interface->capability |= ACER_CAP_WIRELESS; | 721 | if ((quirks != &quirk_unknown) || |
| 722 | !AMW0_set_cap_acpi_check_device()) | ||
| 723 | interface->capability |= ACER_CAP_WIRELESS; | ||
| 696 | return AE_OK; | 724 | return AE_OK; |
| 697 | } | 725 | } |
| 698 | 726 | ||
diff --git a/drivers/platform/x86/amilo-rfkill.c b/drivers/platform/x86/amilo-rfkill.c new file mode 100644 index 000000000000..19170bb7700b --- /dev/null +++ b/drivers/platform/x86/amilo-rfkill.c | |||
| @@ -0,0 +1,173 @@ | |||
| 1 | /* | ||
| 2 | * Support for rfkill on some Fujitsu-Siemens Amilo laptops. | ||
| 3 | * Copyright 2011 Ben Hutchings. | ||
| 4 | * | ||
| 5 | * Based in part on the fsam7440 driver, which is: | ||
| 6 | * Copyright 2005 Alejandro Vidal Mata & Javier Vidal Mata. | ||
| 7 | * and on the fsaa1655g driver, which is: | ||
| 8 | * Copyright 2006 Martin Večeřa. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or | ||
| 13 | * (at your option) any later version. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/module.h> | ||
| 17 | #include <linux/dmi.h> | ||
| 18 | #include <linux/i8042.h> | ||
| 19 | #include <linux/io.h> | ||
| 20 | #include <linux/moduleparam.h> | ||
| 21 | #include <linux/platform_device.h> | ||
| 22 | #include <linux/rfkill.h> | ||
| 23 | |||
| 24 | /* | ||
| 25 | * These values were obtained from disassembling and debugging the | ||
| 26 | * PM.exe program installed in the Fujitsu-Siemens AMILO A1655G | ||
| 27 | */ | ||
| 28 | #define A1655_WIFI_COMMAND 0x10C5 | ||
| 29 | #define A1655_WIFI_ON 0x25 | ||
| 30 | #define A1655_WIFI_OFF 0x45 | ||
| 31 | |||
| 32 | static int amilo_a1655_rfkill_set_block(void *data, bool blocked) | ||
| 33 | { | ||
| 34 | u8 param = blocked ? A1655_WIFI_OFF : A1655_WIFI_ON; | ||
| 35 | int rc; | ||
| 36 | |||
| 37 | i8042_lock_chip(); | ||
| 38 | rc = i8042_command(¶m, A1655_WIFI_COMMAND); | ||
| 39 | i8042_unlock_chip(); | ||
| 40 | return rc; | ||
| 41 | } | ||
| 42 | |||
| 43 | static const struct rfkill_ops amilo_a1655_rfkill_ops = { | ||
| 44 | .set_block = amilo_a1655_rfkill_set_block | ||
| 45 | }; | ||
| 46 | |||
| 47 | /* | ||
| 48 | * These values were obtained from disassembling the PM.exe program | ||
| 49 | * installed in the Fujitsu-Siemens AMILO M 7440 | ||
| 50 | */ | ||
| 51 | #define M7440_PORT1 0x118f | ||
| 52 | #define M7440_PORT2 0x118e | ||
| 53 | #define M7440_RADIO_ON1 0x12 | ||
| 54 | #define M7440_RADIO_ON2 0x80 | ||
| 55 | #define M7440_RADIO_OFF1 0x10 | ||
| 56 | #define M7440_RADIO_OFF2 0x00 | ||
| 57 | |||
| 58 | static int amilo_m7440_rfkill_set_block(void *data, bool blocked) | ||
| 59 | { | ||
| 60 | u8 val1 = blocked ? M7440_RADIO_OFF1 : M7440_RADIO_ON1; | ||
| 61 | u8 val2 = blocked ? M7440_RADIO_OFF2 : M7440_RADIO_ON2; | ||
| 62 | |||
| 63 | outb(val1, M7440_PORT1); | ||
| 64 | outb(val2, M7440_PORT2); | ||
| 65 | |||
| 66 | /* Check whether the state has changed correctly */ | ||
| 67 | if (inb(M7440_PORT1) != val1 || inb(M7440_PORT2) != val2) | ||
| 68 | return -EIO; | ||
| 69 | |||
| 70 | return 0; | ||
| 71 | } | ||
| 72 | |||
| 73 | static const struct rfkill_ops amilo_m7440_rfkill_ops = { | ||
| 74 | .set_block = amilo_m7440_rfkill_set_block | ||
| 75 | }; | ||
| 76 | |||
| 77 | static const struct dmi_system_id __devinitdata amilo_rfkill_id_table[] = { | ||
| 78 | { | ||
| 79 | .matches = { | ||
| 80 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 81 | DMI_MATCH(DMI_BOARD_NAME, "AMILO A1655"), | ||
| 82 | }, | ||
| 83 | .driver_data = (void *)&amilo_a1655_rfkill_ops | ||
| 84 | }, | ||
| 85 | { | ||
| 86 | .matches = { | ||
| 87 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
| 88 | DMI_MATCH(DMI_BOARD_NAME, "AMILO M7440"), | ||
| 89 | }, | ||
| 90 | .driver_data = (void *)&amilo_m7440_rfkill_ops | ||
| 91 | }, | ||
| 92 | {} | ||
| 93 | }; | ||
| 94 | |||
| 95 | static struct platform_device *amilo_rfkill_pdev; | ||
| 96 | static struct rfkill *amilo_rfkill_dev; | ||
| 97 | |||
| 98 | static int __devinit amilo_rfkill_probe(struct platform_device *device) | ||
| 99 | { | ||
| 100 | const struct dmi_system_id *system_id = | ||
| 101 | dmi_first_match(amilo_rfkill_id_table); | ||
| 102 | int rc; | ||
| 103 | |||
| 104 | amilo_rfkill_dev = rfkill_alloc(KBUILD_MODNAME, &device->dev, | ||
| 105 | RFKILL_TYPE_WLAN, | ||
| 106 | system_id->driver_data, NULL); | ||
| 107 | if (!amilo_rfkill_dev) | ||
| 108 | return -ENOMEM; | ||
| 109 | |||
| 110 | rc = rfkill_register(amilo_rfkill_dev); | ||
| 111 | if (rc) | ||
| 112 | goto fail; | ||
| 113 | |||
| 114 | return 0; | ||
| 115 | |||
| 116 | fail: | ||
| 117 | rfkill_destroy(amilo_rfkill_dev); | ||
| 118 | return rc; | ||
| 119 | } | ||
| 120 | |||
| 121 | static int amilo_rfkill_remove(struct platform_device *device) | ||
| 122 | { | ||
| 123 | rfkill_unregister(amilo_rfkill_dev); | ||
| 124 | rfkill_destroy(amilo_rfkill_dev); | ||
| 125 | return 0; | ||
| 126 | } | ||
| 127 | |||
| 128 | static struct platform_driver amilo_rfkill_driver = { | ||
| 129 | .driver = { | ||
| 130 | .name = KBUILD_MODNAME, | ||
| 131 | .owner = THIS_MODULE, | ||
| 132 | }, | ||
| 133 | .probe = amilo_rfkill_probe, | ||
| 134 | .remove = amilo_rfkill_remove, | ||
| 135 | }; | ||
| 136 | |||
| 137 | static int __init amilo_rfkill_init(void) | ||
| 138 | { | ||
| 139 | int rc; | ||
| 140 | |||
| 141 | if (dmi_first_match(amilo_rfkill_id_table) == NULL) | ||
| 142 | return -ENODEV; | ||
| 143 | |||
| 144 | rc = platform_driver_register(&amilo_rfkill_driver); | ||
| 145 | if (rc) | ||
| 146 | return rc; | ||
| 147 | |||
| 148 | amilo_rfkill_pdev = platform_device_register_simple(KBUILD_MODNAME, -1, | ||
| 149 | NULL, 0); | ||
| 150 | if (IS_ERR(amilo_rfkill_pdev)) { | ||
| 151 | rc = PTR_ERR(amilo_rfkill_pdev); | ||
| 152 | goto fail; | ||
| 153 | } | ||
| 154 | |||
| 155 | return 0; | ||
| 156 | |||
| 157 | fail: | ||
| 158 | platform_driver_unregister(&amilo_rfkill_driver); | ||
| 159 | return rc; | ||
| 160 | } | ||
| 161 | |||
| 162 | static void __exit amilo_rfkill_exit(void) | ||
| 163 | { | ||
| 164 | platform_device_unregister(amilo_rfkill_pdev); | ||
| 165 | platform_driver_unregister(&amilo_rfkill_driver); | ||
| 166 | } | ||
| 167 | |||
| 168 | MODULE_AUTHOR("Ben Hutchings <ben@decadent.org.uk>"); | ||
| 169 | MODULE_LICENSE("GPL"); | ||
| 170 | MODULE_DEVICE_TABLE(dmi, amilo_rfkill_id_table); | ||
| 171 | |||
| 172 | module_init(amilo_rfkill_init); | ||
| 173 | module_exit(amilo_rfkill_exit); | ||
diff --git a/drivers/platform/x86/fujitsu-tablet.c b/drivers/platform/x86/fujitsu-tablet.c new file mode 100644 index 000000000000..580d80a73c3a --- /dev/null +++ b/drivers/platform/x86/fujitsu-tablet.c | |||
| @@ -0,0 +1,478 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2006-2012 Robert Gerlach <khnz@gmx.de> | ||
| 3 | * Copyright (C) 2005-2006 Jan Rychter <jan@rychter.com> | ||
| 4 | * | ||
| 5 | * You can redistribute and/or modify this program under the terms of the | ||
| 6 | * GNU General Public License version 2 as published by the Free Software | ||
| 7 | * Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, but | ||
| 10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ||
| 12 | * Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 59 Temple Place Suite 330, Boston, MA 02111-1307, USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <linux/kernel.h> | ||
| 20 | #include <linux/module.h> | ||
| 21 | #include <linux/init.h> | ||
| 22 | #include <linux/bitops.h> | ||
| 23 | #include <linux/io.h> | ||
| 24 | #include <linux/ioport.h> | ||
| 25 | #include <linux/acpi.h> | ||
| 26 | #include <linux/device.h> | ||
| 27 | #include <linux/interrupt.h> | ||
| 28 | #include <linux/input.h> | ||
| 29 | #include <linux/delay.h> | ||
| 30 | #include <linux/dmi.h> | ||
| 31 | |||
| 32 | #define MODULENAME "fujitsu-tablet" | ||
| 33 | |||
| 34 | #define ACPI_FUJITSU_CLASS "fujitsu" | ||
| 35 | |||
| 36 | #define INVERT_TABLET_MODE_BIT 0x01 | ||
| 37 | #define FORCE_TABLET_MODE_IF_UNDOCK 0x02 | ||
| 38 | |||
| 39 | #define KEYMAP_LEN 16 | ||
| 40 | |||
| 41 | static const struct acpi_device_id fujitsu_ids[] = { | ||
| 42 | { .id = "FUJ02BD" }, | ||
| 43 | { .id = "FUJ02BF" }, | ||
| 44 | { .id = "" } | ||
| 45 | }; | ||
| 46 | |||
| 47 | struct fujitsu_config { | ||
| 48 | unsigned short keymap[KEYMAP_LEN]; | ||
| 49 | unsigned int quirks; | ||
| 50 | }; | ||
| 51 | |||
| 52 | static unsigned short keymap_Lifebook_Tseries[KEYMAP_LEN] __initconst = { | ||
| 53 | KEY_RESERVED, | ||
| 54 | KEY_RESERVED, | ||
| 55 | KEY_RESERVED, | ||
| 56 | KEY_RESERVED, | ||
| 57 | KEY_SCROLLDOWN, | ||
| 58 | KEY_SCROLLUP, | ||
| 59 | KEY_DIRECTION, | ||
| 60 | KEY_LEFTCTRL, | ||
| 61 | KEY_BRIGHTNESSUP, | ||
| 62 | KEY_BRIGHTNESSDOWN, | ||
| 63 | KEY_BRIGHTNESS_ZERO, | ||
| 64 | KEY_RESERVED, | ||
| 65 | KEY_RESERVED, | ||
| 66 | KEY_RESERVED, | ||
| 67 | KEY_RESERVED, | ||
| 68 | KEY_LEFTALT | ||
| 69 | }; | ||
| 70 | |||
| 71 | static unsigned short keymap_Lifebook_U810[KEYMAP_LEN] __initconst = { | ||
| 72 | KEY_RESERVED, | ||
| 73 | KEY_RESERVED, | ||
| 74 | KEY_RESERVED, | ||
| 75 | KEY_RESERVED, | ||
| 76 | KEY_PROG1, | ||
| 77 | KEY_PROG2, | ||
| 78 | KEY_DIRECTION, | ||
| 79 | KEY_RESERVED, | ||
| 80 | KEY_RESERVED, | ||
| 81 | KEY_RESERVED, | ||
| 82 | KEY_UP, | ||
| 83 | KEY_DOWN, | ||
| 84 | KEY_RESERVED, | ||
| 85 | KEY_RESERVED, | ||
| 86 | KEY_LEFTCTRL, | ||
| 87 | KEY_LEFTALT | ||
| 88 | }; | ||
| 89 | |||
| 90 | static unsigned short keymap_Stylistic_Tseries[KEYMAP_LEN] __initconst = { | ||
| 91 | KEY_RESERVED, | ||
| 92 | KEY_RESERVED, | ||
| 93 | KEY_RESERVED, | ||
| 94 | KEY_RESERVED, | ||
| 95 | KEY_PRINT, | ||
| 96 | KEY_BACKSPACE, | ||
| 97 | KEY_SPACE, | ||
| 98 | KEY_ENTER, | ||
| 99 | KEY_BRIGHTNESSUP, | ||
| 100 | KEY_BRIGHTNESSDOWN, | ||
| 101 | KEY_DOWN, | ||
| 102 | KEY_UP, | ||
| 103 | KEY_SCROLLUP, | ||
| 104 | KEY_SCROLLDOWN, | ||
| 105 | KEY_LEFTCTRL, | ||
| 106 | KEY_LEFTALT | ||
| 107 | }; | ||
| 108 | |||
| 109 | static unsigned short keymap_Stylistic_ST5xxx[KEYMAP_LEN] __initconst = { | ||
| 110 | KEY_RESERVED, | ||
| 111 | KEY_RESERVED, | ||
| 112 | KEY_RESERVED, | ||
| 113 | KEY_RESERVED, | ||
| 114 | KEY_MAIL, | ||
| 115 | KEY_DIRECTION, | ||
| 116 | KEY_ESC, | ||
| 117 | KEY_ENTER, | ||
| 118 | KEY_BRIGHTNESSUP, | ||
| 119 | KEY_BRIGHTNESSDOWN, | ||
| 120 | KEY_DOWN, | ||
| 121 | KEY_UP, | ||
| 122 | KEY_SCROLLUP, | ||
| 123 | KEY_SCROLLDOWN, | ||
| 124 | KEY_LEFTCTRL, | ||
| 125 | KEY_LEFTALT | ||
| 126 | }; | ||
| 127 | |||
| 128 | static struct { | ||
| 129 | struct input_dev *idev; | ||
| 130 | struct fujitsu_config config; | ||
| 131 | unsigned long prev_keymask; | ||
| 132 | |||
| 133 | char phys[21]; | ||
| 134 | |||
| 135 | int irq; | ||
| 136 | int io_base; | ||
| 137 | int io_length; | ||
| 138 | } fujitsu; | ||
| 139 | |||
| 140 | static u8 fujitsu_ack(void) | ||
| 141 | { | ||
| 142 | return inb(fujitsu.io_base + 2); | ||
| 143 | } | ||
| 144 | |||
| 145 | static u8 fujitsu_status(void) | ||
| 146 | { | ||
| 147 | return inb(fujitsu.io_base + 6); | ||
| 148 | } | ||
| 149 | |||
| 150 | static u8 fujitsu_read_register(const u8 addr) | ||
| 151 | { | ||
| 152 | outb(addr, fujitsu.io_base); | ||
| 153 | return inb(fujitsu.io_base + 4); | ||
| 154 | } | ||
| 155 | |||
| 156 | static void fujitsu_send_state(void) | ||
| 157 | { | ||
| 158 | int state; | ||
| 159 | int dock, tablet_mode; | ||
| 160 | |||
| 161 | state = fujitsu_read_register(0xdd); | ||
| 162 | |||
| 163 | dock = state & 0x02; | ||
| 164 | |||
| 165 | if ((fujitsu.config.quirks & FORCE_TABLET_MODE_IF_UNDOCK) && (!dock)) { | ||
| 166 | tablet_mode = 1; | ||
| 167 | } else{ | ||
| 168 | tablet_mode = state & 0x01; | ||
| 169 | if (fujitsu.config.quirks & INVERT_TABLET_MODE_BIT) | ||
| 170 | tablet_mode = !tablet_mode; | ||
| 171 | } | ||
| 172 | |||
| 173 | input_report_switch(fujitsu.idev, SW_DOCK, dock); | ||
| 174 | input_report_switch(fujitsu.idev, SW_TABLET_MODE, tablet_mode); | ||
| 175 | input_sync(fujitsu.idev); | ||
| 176 | } | ||
| 177 | |||
| 178 | static void fujitsu_reset(void) | ||
| 179 | { | ||
| 180 | int timeout = 50; | ||
| 181 | |||
| 182 | fujitsu_ack(); | ||
| 183 | |||
| 184 | while ((fujitsu_status() & 0x02) && (--timeout)) | ||
| 185 | msleep(20); | ||
| 186 | |||
| 187 | fujitsu_send_state(); | ||
| 188 | } | ||
| 189 | |||
| 190 | static int __devinit input_fujitsu_setup(struct device *parent, | ||
| 191 | const char *name, const char *phys) | ||
| 192 | { | ||
| 193 | struct input_dev *idev; | ||
| 194 | int error; | ||
| 195 | int i; | ||
| 196 | |||
| 197 | idev = input_allocate_device(); | ||
| 198 | if (!idev) | ||
| 199 | return -ENOMEM; | ||
| 200 | |||
| 201 | idev->dev.parent = parent; | ||
| 202 | idev->phys = phys; | ||
| 203 | idev->name = name; | ||
| 204 | idev->id.bustype = BUS_HOST; | ||
| 205 | idev->id.vendor = 0x1734; /* Fujitsu Siemens Computer GmbH */ | ||
| 206 | idev->id.product = 0x0001; | ||
| 207 | idev->id.version = 0x0101; | ||
| 208 | |||
| 209 | idev->keycode = fujitsu.config.keymap; | ||
| 210 | idev->keycodesize = sizeof(fujitsu.config.keymap[0]); | ||
| 211 | idev->keycodemax = ARRAY_SIZE(fujitsu.config.keymap); | ||
| 212 | |||
| 213 | __set_bit(EV_REP, idev->evbit); | ||
| 214 | |||
| 215 | for (i = 0; i < ARRAY_SIZE(fujitsu.config.keymap); i++) | ||
| 216 | if (fujitsu.config.keymap[i]) | ||
| 217 | input_set_capability(idev, EV_KEY, fujitsu.config.keymap[i]); | ||
| 218 | |||
| 219 | input_set_capability(idev, EV_MSC, MSC_SCAN); | ||
| 220 | |||
| 221 | input_set_capability(idev, EV_SW, SW_DOCK); | ||
| 222 | input_set_capability(idev, EV_SW, SW_TABLET_MODE); | ||
| 223 | |||
| 224 | input_set_capability(idev, EV_SW, SW_DOCK); | ||
| 225 | input_set_capability(idev, EV_SW, SW_TABLET_MODE); | ||
| 226 | |||
| 227 | error = input_register_device(idev); | ||
| 228 | if (error) { | ||
| 229 | input_free_device(idev); | ||
| 230 | return error; | ||
| 231 | } | ||
| 232 | |||
| 233 | fujitsu.idev = idev; | ||
| 234 | return 0; | ||
| 235 | } | ||
| 236 | |||
| 237 | static void input_fujitsu_remove(void) | ||
| 238 | { | ||
| 239 | input_unregister_device(fujitsu.idev); | ||
| 240 | } | ||
| 241 | |||
| 242 | static irqreturn_t fujitsu_interrupt(int irq, void *dev_id) | ||
| 243 | { | ||
| 244 | unsigned long keymask, changed; | ||
| 245 | unsigned int keycode; | ||
| 246 | int pressed; | ||
| 247 | int i; | ||
| 248 | |||
| 249 | if (unlikely(!(fujitsu_status() & 0x01))) | ||
| 250 | return IRQ_NONE; | ||
| 251 | |||
| 252 | fujitsu_send_state(); | ||
| 253 | |||
| 254 | keymask = fujitsu_read_register(0xde); | ||
| 255 | keymask |= fujitsu_read_register(0xdf) << 8; | ||
| 256 | keymask ^= 0xffff; | ||
| 257 | |||
| 258 | changed = keymask ^ fujitsu.prev_keymask; | ||
| 259 | if (changed) { | ||
| 260 | fujitsu.prev_keymask = keymask; | ||
| 261 | |||
| 262 | for_each_set_bit(i, &changed, KEYMAP_LEN) { | ||
| 263 | keycode = fujitsu.config.keymap[i]; | ||
| 264 | pressed = keymask & changed & BIT(i); | ||
| 265 | |||
| 266 | if (pressed) | ||
| 267 | input_event(fujitsu.idev, EV_MSC, MSC_SCAN, i); | ||
| 268 | |||
| 269 | input_report_key(fujitsu.idev, keycode, pressed); | ||
| 270 | input_sync(fujitsu.idev); | ||
| 271 | } | ||
| 272 | } | ||
| 273 | |||
| 274 | fujitsu_ack(); | ||
| 275 | return IRQ_HANDLED; | ||
| 276 | } | ||
| 277 | |||
| 278 | static int __devinit fujitsu_dmi_default(const struct dmi_system_id *dmi) | ||
| 279 | { | ||
| 280 | printk(KERN_INFO MODULENAME ": %s\n", dmi->ident); | ||
| 281 | memcpy(fujitsu.config.keymap, dmi->driver_data, | ||
| 282 | sizeof(fujitsu.config.keymap)); | ||
| 283 | return 1; | ||
| 284 | } | ||
| 285 | |||
| 286 | static int __devinit fujitsu_dmi_stylistic(const struct dmi_system_id *dmi) | ||
| 287 | { | ||
| 288 | fujitsu_dmi_default(dmi); | ||
| 289 | fujitsu.config.quirks |= FORCE_TABLET_MODE_IF_UNDOCK; | ||
| 290 | fujitsu.config.quirks |= INVERT_TABLET_MODE_BIT; | ||
| 291 | return 1; | ||
| 292 | } | ||
| 293 | |||
| 294 | static struct dmi_system_id dmi_ids[] __initconst = { | ||
| 295 | { | ||
| 296 | .callback = fujitsu_dmi_default, | ||
| 297 | .ident = "Fujitsu Siemens P/T Series", | ||
| 298 | .matches = { | ||
| 299 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 300 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK") | ||
| 301 | }, | ||
| 302 | .driver_data = keymap_Lifebook_Tseries | ||
| 303 | }, | ||
| 304 | { | ||
| 305 | .callback = fujitsu_dmi_default, | ||
| 306 | .ident = "Fujitsu Lifebook T Series", | ||
| 307 | .matches = { | ||
| 308 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 309 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook T") | ||
| 310 | }, | ||
| 311 | .driver_data = keymap_Lifebook_Tseries | ||
| 312 | }, | ||
| 313 | { | ||
| 314 | .callback = fujitsu_dmi_stylistic, | ||
| 315 | .ident = "Fujitsu Siemens Stylistic T Series", | ||
| 316 | .matches = { | ||
| 317 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 318 | DMI_MATCH(DMI_PRODUCT_NAME, "Stylistic T") | ||
| 319 | }, | ||
| 320 | .driver_data = keymap_Stylistic_Tseries | ||
| 321 | }, | ||
| 322 | { | ||
| 323 | .callback = fujitsu_dmi_default, | ||
| 324 | .ident = "Fujitsu LifeBook U810", | ||
| 325 | .matches = { | ||
| 326 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 327 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook U810") | ||
| 328 | }, | ||
| 329 | .driver_data = keymap_Lifebook_U810 | ||
| 330 | }, | ||
| 331 | { | ||
| 332 | .callback = fujitsu_dmi_stylistic, | ||
| 333 | .ident = "Fujitsu Siemens Stylistic ST5xxx Series", | ||
| 334 | .matches = { | ||
| 335 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 336 | DMI_MATCH(DMI_PRODUCT_NAME, "STYLISTIC ST5") | ||
| 337 | }, | ||
| 338 | .driver_data = keymap_Stylistic_ST5xxx | ||
| 339 | }, | ||
| 340 | { | ||
| 341 | .callback = fujitsu_dmi_stylistic, | ||
| 342 | .ident = "Fujitsu Siemens Stylistic ST5xxx Series", | ||
| 343 | .matches = { | ||
| 344 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
| 345 | DMI_MATCH(DMI_PRODUCT_NAME, "Stylistic ST5") | ||
| 346 | }, | ||
| 347 | .driver_data = keymap_Stylistic_ST5xxx | ||
| 348 | }, | ||
| 349 | { | ||
| 350 | .callback = fujitsu_dmi_default, | ||
| 351 | .ident = "Unknown (using defaults)", | ||
| 352 | .matches = { | ||
| 353 | DMI_MATCH(DMI_SYS_VENDOR, ""), | ||
| 354 | DMI_MATCH(DMI_PRODUCT_NAME, "") | ||
| 355 | }, | ||
| 356 | .driver_data = keymap_Lifebook_Tseries | ||
| 357 | }, | ||
| 358 | { NULL } | ||
| 359 | }; | ||
| 360 | |||
| 361 | static acpi_status __devinit | ||
| 362 | fujitsu_walk_resources(struct acpi_resource *res, void *data) | ||
| 363 | { | ||
| 364 | switch (res->type) { | ||
| 365 | case ACPI_RESOURCE_TYPE_IRQ: | ||
| 366 | fujitsu.irq = res->data.irq.interrupts[0]; | ||
| 367 | return AE_OK; | ||
| 368 | |||
| 369 | case ACPI_RESOURCE_TYPE_IO: | ||
| 370 | fujitsu.io_base = res->data.io.minimum; | ||
| 371 | fujitsu.io_length = res->data.io.address_length; | ||
| 372 | return AE_OK; | ||
| 373 | |||
| 374 | case ACPI_RESOURCE_TYPE_END_TAG: | ||
| 375 | if (fujitsu.irq && fujitsu.io_base) | ||
| 376 | return AE_OK; | ||
| 377 | else | ||
| 378 | return AE_NOT_FOUND; | ||
| 379 | |||
| 380 | default: | ||
| 381 | return AE_ERROR; | ||
| 382 | } | ||
| 383 | } | ||
| 384 | |||
| 385 | static int __devinit acpi_fujitsu_add(struct acpi_device *adev) | ||
| 386 | { | ||
| 387 | acpi_status status; | ||
| 388 | int error; | ||
| 389 | |||
| 390 | if (!adev) | ||
| 391 | return -EINVAL; | ||
| 392 | |||
| 393 | status = acpi_walk_resources(adev->handle, METHOD_NAME__CRS, | ||
| 394 | fujitsu_walk_resources, NULL); | ||
| 395 | if (ACPI_FAILURE(status) || !fujitsu.irq || !fujitsu.io_base) | ||
| 396 | return -ENODEV; | ||
| 397 | |||
| 398 | sprintf(acpi_device_name(adev), "Fujitsu %s", acpi_device_hid(adev)); | ||
| 399 | sprintf(acpi_device_class(adev), "%s", ACPI_FUJITSU_CLASS); | ||
| 400 | |||
| 401 | snprintf(fujitsu.phys, sizeof(fujitsu.phys), | ||
| 402 | "%s/input0", acpi_device_hid(adev)); | ||
| 403 | |||
| 404 | error = input_fujitsu_setup(&adev->dev, | ||
| 405 | acpi_device_name(adev), fujitsu.phys); | ||
| 406 | if (error) | ||
| 407 | return error; | ||
| 408 | |||
| 409 | if (!request_region(fujitsu.io_base, fujitsu.io_length, MODULENAME)) { | ||
| 410 | input_fujitsu_remove(); | ||
| 411 | return -EBUSY; | ||
| 412 | } | ||
| 413 | |||
| 414 | fujitsu_reset(); | ||
| 415 | |||
| 416 | error = request_irq(fujitsu.irq, fujitsu_interrupt, | ||
| 417 | IRQF_SHARED, MODULENAME, fujitsu_interrupt); | ||
| 418 | if (error) { | ||
| 419 | release_region(fujitsu.io_base, fujitsu.io_length); | ||
| 420 | input_fujitsu_remove(); | ||
| 421 | return error; | ||
| 422 | } | ||
| 423 | |||
| 424 | return 0; | ||
| 425 | } | ||
| 426 | |||
| 427 | static int __devexit acpi_fujitsu_remove(struct acpi_device *adev, int type) | ||
| 428 | { | ||
| 429 | free_irq(fujitsu.irq, fujitsu_interrupt); | ||
| 430 | release_region(fujitsu.io_base, fujitsu.io_length); | ||
| 431 | input_fujitsu_remove(); | ||
| 432 | return 0; | ||
| 433 | } | ||
| 434 | |||
| 435 | static int acpi_fujitsu_resume(struct acpi_device *adev) | ||
| 436 | { | ||
| 437 | fujitsu_reset(); | ||
| 438 | return 0; | ||
| 439 | } | ||
| 440 | |||
| 441 | static struct acpi_driver acpi_fujitsu_driver = { | ||
| 442 | .name = MODULENAME, | ||
| 443 | .class = "hotkey", | ||
| 444 | .ids = fujitsu_ids, | ||
| 445 | .ops = { | ||
| 446 | .add = acpi_fujitsu_add, | ||
| 447 | .remove = acpi_fujitsu_remove, | ||
| 448 | .resume = acpi_fujitsu_resume, | ||
| 449 | } | ||
| 450 | }; | ||
| 451 | |||
| 452 | static int __init fujitsu_module_init(void) | ||
| 453 | { | ||
| 454 | int error; | ||
| 455 | |||
| 456 | dmi_check_system(dmi_ids); | ||
| 457 | |||
| 458 | error = acpi_bus_register_driver(&acpi_fujitsu_driver); | ||
| 459 | if (error) | ||
| 460 | return error; | ||
| 461 | |||
| 462 | return 0; | ||
| 463 | } | ||
| 464 | |||
| 465 | static void __exit fujitsu_module_exit(void) | ||
| 466 | { | ||
| 467 | acpi_bus_unregister_driver(&acpi_fujitsu_driver); | ||
| 468 | } | ||
| 469 | |||
| 470 | module_init(fujitsu_module_init); | ||
| 471 | module_exit(fujitsu_module_exit); | ||
| 472 | |||
| 473 | MODULE_AUTHOR("Robert Gerlach <khnz@gmx.de>"); | ||
| 474 | MODULE_DESCRIPTION("Fujitsu tablet pc extras driver"); | ||
| 475 | MODULE_LICENSE("GPL"); | ||
| 476 | MODULE_VERSION("2.4"); | ||
| 477 | |||
| 478 | MODULE_DEVICE_TABLE(acpi, fujitsu_ids); | ||
diff --git a/drivers/platform/x86/panasonic-laptop.c b/drivers/platform/x86/panasonic-laptop.c index 05be30ee158b..ffff8b4b4949 100644 --- a/drivers/platform/x86/panasonic-laptop.c +++ b/drivers/platform/x86/panasonic-laptop.c | |||
| @@ -562,8 +562,8 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) | |||
| 562 | 562 | ||
| 563 | num_sifr = acpi_pcc_get_sqty(device); | 563 | num_sifr = acpi_pcc_get_sqty(device); |
| 564 | 564 | ||
| 565 | if (num_sifr > 255) { | 565 | if (num_sifr < 0 || num_sifr > 255) { |
| 566 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "num_sifr too large")); | 566 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "num_sifr out of range")); |
| 567 | return -ENODEV; | 567 | return -ENODEV; |
| 568 | } | 568 | } |
| 569 | 569 | ||
diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index 2baadd21b7a6..98fbe62694d4 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c | |||
| @@ -369,9 +369,9 @@ static int __init pps_init(void) | |||
| 369 | int err; | 369 | int err; |
| 370 | 370 | ||
| 371 | pps_class = class_create(THIS_MODULE, "pps"); | 371 | pps_class = class_create(THIS_MODULE, "pps"); |
| 372 | if (!pps_class) { | 372 | if (IS_ERR(pps_class)) { |
| 373 | pr_err("failed to allocate class\n"); | 373 | pr_err("failed to allocate class\n"); |
| 374 | return -ENOMEM; | 374 | return PTR_ERR(pps_class); |
| 375 | } | 375 | } |
| 376 | pps_class->dev_attrs = pps_attrs; | 376 | pps_class->dev_attrs = pps_attrs; |
| 377 | 377 | ||
diff --git a/drivers/rapidio/devices/tsi721.c b/drivers/rapidio/devices/tsi721.c index 691b1ab1a3d0..30d2072f480b 100644 --- a/drivers/rapidio/devices/tsi721.c +++ b/drivers/rapidio/devices/tsi721.c | |||
| @@ -410,13 +410,14 @@ static void tsi721_db_dpc(struct work_struct *work) | |||
| 410 | */ | 410 | */ |
| 411 | mport = priv->mport; | 411 | mport = priv->mport; |
| 412 | 412 | ||
| 413 | wr_ptr = ioread32(priv->regs + TSI721_IDQ_WP(IDB_QUEUE)); | 413 | wr_ptr = ioread32(priv->regs + TSI721_IDQ_WP(IDB_QUEUE)) % IDB_QSIZE; |
| 414 | rd_ptr = ioread32(priv->regs + TSI721_IDQ_RP(IDB_QUEUE)); | 414 | rd_ptr = ioread32(priv->regs + TSI721_IDQ_RP(IDB_QUEUE)) % IDB_QSIZE; |
| 415 | 415 | ||
| 416 | while (wr_ptr != rd_ptr) { | 416 | while (wr_ptr != rd_ptr) { |
| 417 | idb_entry = (u64 *)(priv->idb_base + | 417 | idb_entry = (u64 *)(priv->idb_base + |
| 418 | (TSI721_IDB_ENTRY_SIZE * rd_ptr)); | 418 | (TSI721_IDB_ENTRY_SIZE * rd_ptr)); |
| 419 | rd_ptr++; | 419 | rd_ptr++; |
| 420 | rd_ptr %= IDB_QSIZE; | ||
| 420 | idb.msg = *idb_entry; | 421 | idb.msg = *idb_entry; |
| 421 | *idb_entry = 0; | 422 | *idb_entry = 0; |
| 422 | 423 | ||
diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h index 822e54c394d5..1c226b31af13 100644 --- a/drivers/rapidio/devices/tsi721.h +++ b/drivers/rapidio/devices/tsi721.h | |||
| @@ -118,34 +118,34 @@ | |||
| 118 | 118 | ||
| 119 | #define TSI721_IDB_ENTRY_SIZE 64 | 119 | #define TSI721_IDB_ENTRY_SIZE 64 |
| 120 | 120 | ||
| 121 | #define TSI721_IDQ_CTL(x) (0x20000 + (x) * 1000) | 121 | #define TSI721_IDQ_CTL(x) (0x20000 + (x) * 0x1000) |
| 122 | #define TSI721_IDQ_SUSPEND 0x00000002 | 122 | #define TSI721_IDQ_SUSPEND 0x00000002 |
| 123 | #define TSI721_IDQ_INIT 0x00000001 | 123 | #define TSI721_IDQ_INIT 0x00000001 |
| 124 | 124 | ||
| 125 | #define TSI721_IDQ_STS(x) (0x20004 + (x) * 1000) | 125 | #define TSI721_IDQ_STS(x) (0x20004 + (x) * 0x1000) |
| 126 | #define TSI721_IDQ_RUN 0x00200000 | 126 | #define TSI721_IDQ_RUN 0x00200000 |
| 127 | 127 | ||
| 128 | #define TSI721_IDQ_MASK(x) (0x20008 + (x) * 1000) | 128 | #define TSI721_IDQ_MASK(x) (0x20008 + (x) * 0x1000) |
| 129 | #define TSI721_IDQ_MASK_MASK 0xffff0000 | 129 | #define TSI721_IDQ_MASK_MASK 0xffff0000 |
| 130 | #define TSI721_IDQ_MASK_PATT 0x0000ffff | 130 | #define TSI721_IDQ_MASK_PATT 0x0000ffff |
| 131 | 131 | ||
| 132 | #define TSI721_IDQ_RP(x) (0x2000c + (x) * 1000) | 132 | #define TSI721_IDQ_RP(x) (0x2000c + (x) * 0x1000) |
| 133 | #define TSI721_IDQ_RP_PTR 0x0007ffff | 133 | #define TSI721_IDQ_RP_PTR 0x0007ffff |
| 134 | 134 | ||
| 135 | #define TSI721_IDQ_WP(x) (0x20010 + (x) * 1000) | 135 | #define TSI721_IDQ_WP(x) (0x20010 + (x) * 0x1000) |
| 136 | #define TSI721_IDQ_WP_PTR 0x0007ffff | 136 | #define TSI721_IDQ_WP_PTR 0x0007ffff |
| 137 | 137 | ||
| 138 | #define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 1000) | 138 | #define TSI721_IDQ_BASEL(x) (0x20014 + (x) * 0x1000) |
| 139 | #define TSI721_IDQ_BASEL_ADDR 0xffffffc0 | 139 | #define TSI721_IDQ_BASEL_ADDR 0xffffffc0 |
| 140 | #define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 1000) | 140 | #define TSI721_IDQ_BASEU(x) (0x20018 + (x) * 0x1000) |
| 141 | #define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 1000) | 141 | #define TSI721_IDQ_SIZE(x) (0x2001c + (x) * 0x1000) |
| 142 | #define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) | 142 | #define TSI721_IDQ_SIZE_VAL(size) (__fls(size) - 4) |
| 143 | #define TSI721_IDQ_SIZE_MIN 512 | 143 | #define TSI721_IDQ_SIZE_MIN 512 |
| 144 | #define TSI721_IDQ_SIZE_MAX (512 * 1024) | 144 | #define TSI721_IDQ_SIZE_MAX (512 * 1024) |
| 145 | 145 | ||
| 146 | #define TSI721_SR_CHINT(x) (0x20040 + (x) * 1000) | 146 | #define TSI721_SR_CHINT(x) (0x20040 + (x) * 0x1000) |
| 147 | #define TSI721_SR_CHINTE(x) (0x20044 + (x) * 1000) | 147 | #define TSI721_SR_CHINTE(x) (0x20044 + (x) * 0x1000) |
| 148 | #define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 1000) | 148 | #define TSI721_SR_CHINTSET(x) (0x20048 + (x) * 0x1000) |
| 149 | #define TSI721_SR_CHINT_ODBOK 0x00000020 | 149 | #define TSI721_SR_CHINT_ODBOK 0x00000020 |
| 150 | #define TSI721_SR_CHINT_IDBQRCV 0x00000010 | 150 | #define TSI721_SR_CHINT_IDBQRCV 0x00000010 |
| 151 | #define TSI721_SR_CHINT_SUSP 0x00000008 | 151 | #define TSI721_SR_CHINT_SUSP 0x00000008 |
| @@ -156,7 +156,7 @@ | |||
| 156 | 156 | ||
| 157 | #define TSI721_IBWIN_NUM 8 | 157 | #define TSI721_IBWIN_NUM 8 |
| 158 | 158 | ||
| 159 | #define TSI721_IBWINLB(x) (0x29000 + (x) * 20) | 159 | #define TSI721_IBWINLB(x) (0x29000 + (x) * 0x20) |
| 160 | #define TSI721_IBWINLB_BA 0xfffff000 | 160 | #define TSI721_IBWINLB_BA 0xfffff000 |
| 161 | #define TSI721_IBWINLB_WEN 0x00000001 | 161 | #define TSI721_IBWINLB_WEN 0x00000001 |
| 162 | 162 | ||
| @@ -187,13 +187,13 @@ | |||
| 187 | */ | 187 | */ |
| 188 | #define TSI721_OBWIN_NUM TSI721_PC2SR_WINS | 188 | #define TSI721_OBWIN_NUM TSI721_PC2SR_WINS |
| 189 | 189 | ||
| 190 | #define TSI721_OBWINLB(x) (0x40000 + (x) * 20) | 190 | #define TSI721_OBWINLB(x) (0x40000 + (x) * 0x20) |
| 191 | #define TSI721_OBWINLB_BA 0xffff8000 | 191 | #define TSI721_OBWINLB_BA 0xffff8000 |
| 192 | #define TSI721_OBWINLB_WEN 0x00000001 | 192 | #define TSI721_OBWINLB_WEN 0x00000001 |
| 193 | 193 | ||
| 194 | #define TSI721_OBWINUB(x) (0x40004 + (x) * 20) | 194 | #define TSI721_OBWINUB(x) (0x40004 + (x) * 0x20) |
| 195 | 195 | ||
| 196 | #define TSI721_OBWINSZ(x) (0x40008 + (x) * 20) | 196 | #define TSI721_OBWINSZ(x) (0x40008 + (x) * 0x20) |
| 197 | #define TSI721_OBWINSZ_SIZE 0x00001f00 | 197 | #define TSI721_OBWINSZ_SIZE 0x00001f00 |
| 198 | #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) | 198 | #define TSI721_OBWIN_SIZE(size) (__fls(size) - 15) |
| 199 | 199 | ||
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c index 3767364452fd..09915e89705d 100644 --- a/drivers/regulator/da9052-regulator.c +++ b/drivers/regulator/da9052-regulator.c | |||
| @@ -226,7 +226,7 @@ static int da9052_regulator_set_voltage_int(struct regulator_dev *rdev, | |||
| 226 | if (min_uV < info->min_uV) | 226 | if (min_uV < info->min_uV) |
| 227 | min_uV = info->min_uV; | 227 | min_uV = info->min_uV; |
| 228 | 228 | ||
| 229 | *selector = (min_uV - info->min_uV) / info->step_uV; | 229 | *selector = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV); |
| 230 | 230 | ||
| 231 | ret = da9052_list_voltage(rdev, *selector); | 231 | ret = da9052_list_voltage(rdev, *selector); |
| 232 | if (ret < 0) | 232 | if (ret < 0) |
| @@ -260,8 +260,8 @@ static int da9052_set_ldo5_6_voltage(struct regulator_dev *rdev, | |||
| 260 | * the LDO activate bit to implment the changes on the | 260 | * the LDO activate bit to implment the changes on the |
| 261 | * LDO output. | 261 | * LDO output. |
| 262 | */ | 262 | */ |
| 263 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 0, | 263 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, |
| 264 | info->activate_bit); | 264 | info->activate_bit, info->activate_bit); |
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, | 267 | static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, |
| @@ -280,8 +280,8 @@ static int da9052_set_dcdc_voltage(struct regulator_dev *rdev, | |||
| 280 | * the DCDC activate bit to implment the changes on the | 280 | * the DCDC activate bit to implment the changes on the |
| 281 | * DCDC output. | 281 | * DCDC output. |
| 282 | */ | 282 | */ |
| 283 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, 0, | 283 | return da9052_reg_update(regulator->da9052, DA9052_SUPPLY_REG, |
| 284 | info->activate_bit); | 284 | info->activate_bit, info->activate_bit); |
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev) | 287 | static int da9052_get_regulator_voltage_sel(struct regulator_dev *rdev) |
| @@ -318,10 +318,10 @@ static int da9052_set_buckperi_voltage(struct regulator_dev *rdev, int min_uV, | |||
| 318 | if ((regulator->da9052->chip_id == DA9052) && | 318 | if ((regulator->da9052->chip_id == DA9052) && |
| 319 | (min_uV >= DA9052_CONST_3uV)) | 319 | (min_uV >= DA9052_CONST_3uV)) |
| 320 | *selector = DA9052_BUCK_PERI_REG_MAP_UPTO_3uV + | 320 | *selector = DA9052_BUCK_PERI_REG_MAP_UPTO_3uV + |
| 321 | ((min_uV - DA9052_CONST_3uV) / | 321 | DIV_ROUND_UP(min_uV - DA9052_CONST_3uV, |
| 322 | (DA9052_BUCK_PERI_3uV_STEP)); | 322 | DA9052_BUCK_PERI_3uV_STEP); |
| 323 | else | 323 | else |
| 324 | *selector = (min_uV - info->min_uV) / info->step_uV; | 324 | *selector = DIV_ROUND_UP(min_uV - info->min_uV, info->step_uV); |
| 325 | 325 | ||
| 326 | ret = da9052_list_buckperi_voltage(rdev, *selector); | 326 | ret = da9052_list_buckperi_voltage(rdev, *selector); |
| 327 | if (ret < 0) | 327 | if (ret < 0) |
| @@ -400,6 +400,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 400 | .ops = &da9052_ldo5_6_ops,\ | 400 | .ops = &da9052_ldo5_6_ops,\ |
| 401 | .type = REGULATOR_VOLTAGE,\ | 401 | .type = REGULATOR_VOLTAGE,\ |
| 402 | .id = _id,\ | 402 | .id = _id,\ |
| 403 | .n_voltages = (max - min) / step + 1, \ | ||
| 403 | .owner = THIS_MODULE,\ | 404 | .owner = THIS_MODULE,\ |
| 404 | },\ | 405 | },\ |
| 405 | .min_uV = (min) * 1000,\ | 406 | .min_uV = (min) * 1000,\ |
| @@ -417,6 +418,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 417 | .ops = &da9052_ldo_ops,\ | 418 | .ops = &da9052_ldo_ops,\ |
| 418 | .type = REGULATOR_VOLTAGE,\ | 419 | .type = REGULATOR_VOLTAGE,\ |
| 419 | .id = _id,\ | 420 | .id = _id,\ |
| 421 | .n_voltages = (max - min) / step + 1, \ | ||
| 420 | .owner = THIS_MODULE,\ | 422 | .owner = THIS_MODULE,\ |
| 421 | },\ | 423 | },\ |
| 422 | .min_uV = (min) * 1000,\ | 424 | .min_uV = (min) * 1000,\ |
| @@ -434,6 +436,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 434 | .ops = &da9052_dcdc_ops,\ | 436 | .ops = &da9052_dcdc_ops,\ |
| 435 | .type = REGULATOR_VOLTAGE,\ | 437 | .type = REGULATOR_VOLTAGE,\ |
| 436 | .id = _id,\ | 438 | .id = _id,\ |
| 439 | .n_voltages = (max - min) / step + 1, \ | ||
| 437 | .owner = THIS_MODULE,\ | 440 | .owner = THIS_MODULE,\ |
| 438 | },\ | 441 | },\ |
| 439 | .min_uV = (min) * 1000,\ | 442 | .min_uV = (min) * 1000,\ |
| @@ -451,6 +454,7 @@ static struct regulator_ops da9052_ldo_ops = { | |||
| 451 | .ops = &da9052_buckperi_ops,\ | 454 | .ops = &da9052_buckperi_ops,\ |
| 452 | .type = REGULATOR_VOLTAGE,\ | 455 | .type = REGULATOR_VOLTAGE,\ |
| 453 | .id = _id,\ | 456 | .id = _id,\ |
| 457 | .n_voltages = (max - min) / step + 1, \ | ||
| 454 | .owner = THIS_MODULE,\ | 458 | .owner = THIS_MODULE,\ |
| 455 | },\ | 459 | },\ |
| 456 | .min_uV = (min) * 1000,\ | 460 | .min_uV = (min) * 1000,\ |
diff --git a/drivers/regulator/tps6524x-regulator.c b/drivers/regulator/tps6524x-regulator.c index 70b7b1f4f000..2e94686b6fe6 100644 --- a/drivers/regulator/tps6524x-regulator.c +++ b/drivers/regulator/tps6524x-regulator.c | |||
| @@ -481,7 +481,7 @@ static int set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, | |||
| 481 | if (i >= info->n_voltages) | 481 | if (i >= info->n_voltages) |
| 482 | i = info->n_voltages - 1; | 482 | i = info->n_voltages - 1; |
| 483 | 483 | ||
| 484 | *selector = info->voltages[i]; | 484 | *selector = i; |
| 485 | 485 | ||
| 486 | return write_field(hw, &info->voltage, i); | 486 | return write_field(hw, &info->voltage, i); |
| 487 | } | 487 | } |
diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c index 5c15ba01e9c7..40ecf5165899 100644 --- a/drivers/regulator/tps65910-regulator.c +++ b/drivers/regulator/tps65910-regulator.c | |||
| @@ -662,7 +662,7 @@ static int tps65910_set_voltage_dcdc(struct regulator_dev *dev, | |||
| 662 | tps65910_reg_write(pmic, TPS65910_VDD2_OP, vsel); | 662 | tps65910_reg_write(pmic, TPS65910_VDD2_OP, vsel); |
| 663 | break; | 663 | break; |
| 664 | case TPS65911_REG_VDDCTRL: | 664 | case TPS65911_REG_VDDCTRL: |
| 665 | vsel = selector; | 665 | vsel = selector + 3; |
| 666 | tps65910_reg_write(pmic, TPS65911_VDDCTRL_OP, vsel); | 666 | tps65910_reg_write(pmic, TPS65911_VDDCTRL_OP, vsel); |
| 667 | } | 667 | } |
| 668 | 668 | ||
diff --git a/drivers/rtc/rtc-r9701.c b/drivers/rtc/rtc-r9701.c index 9beba49c3c5b..2853c2a6f10f 100644 --- a/drivers/rtc/rtc-r9701.c +++ b/drivers/rtc/rtc-r9701.c | |||
| @@ -125,6 +125,13 @@ static int __devinit r9701_probe(struct spi_device *spi) | |||
| 125 | unsigned char tmp; | 125 | unsigned char tmp; |
| 126 | int res; | 126 | int res; |
| 127 | 127 | ||
| 128 | tmp = R100CNT; | ||
| 129 | res = read_regs(&spi->dev, &tmp, 1); | ||
| 130 | if (res || tmp != 0x20) { | ||
| 131 | dev_err(&spi->dev, "cannot read RTC register\n"); | ||
| 132 | return -ENODEV; | ||
| 133 | } | ||
| 134 | |||
| 128 | rtc = rtc_device_register("r9701", | 135 | rtc = rtc_device_register("r9701", |
| 129 | &spi->dev, &r9701_rtc_ops, THIS_MODULE); | 136 | &spi->dev, &r9701_rtc_ops, THIS_MODULE); |
| 130 | if (IS_ERR(rtc)) | 137 | if (IS_ERR(rtc)) |
| @@ -132,13 +139,6 @@ static int __devinit r9701_probe(struct spi_device *spi) | |||
| 132 | 139 | ||
| 133 | dev_set_drvdata(&spi->dev, rtc); | 140 | dev_set_drvdata(&spi->dev, rtc); |
| 134 | 141 | ||
| 135 | tmp = R100CNT; | ||
| 136 | res = read_regs(&spi->dev, &tmp, 1); | ||
| 137 | if (res || tmp != 0x20) { | ||
| 138 | rtc_device_unregister(rtc); | ||
| 139 | return res; | ||
| 140 | } | ||
| 141 | |||
| 142 | return 0; | 142 | return 0; |
| 143 | } | 143 | } |
| 144 | 144 | ||
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 3ef8d071c64a..770a740a393c 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
| @@ -167,7 +167,7 @@ again: | |||
| 167 | DBF_ERROR("%4x EQBS ERROR", SCH_NO(q)); | 167 | DBF_ERROR("%4x EQBS ERROR", SCH_NO(q)); |
| 168 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); | 168 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); |
| 169 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 169 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
| 170 | 0, -1, -1, q->irq_ptr->int_parm); | 170 | q->nr, q->first_to_kick, count, q->irq_ptr->int_parm); |
| 171 | return 0; | 171 | return 0; |
| 172 | } | 172 | } |
| 173 | 173 | ||
| @@ -215,7 +215,7 @@ again: | |||
| 215 | DBF_ERROR("%4x SQBS ERROR", SCH_NO(q)); | 215 | DBF_ERROR("%4x SQBS ERROR", SCH_NO(q)); |
| 216 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); | 216 | DBF_ERROR("%3d%3d%2d", count, tmp_count, nr); |
| 217 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, | 217 | q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE_CHECK_CONDITION, |
| 218 | 0, -1, -1, q->irq_ptr->int_parm); | 218 | q->nr, q->first_to_kick, count, q->irq_ptr->int_parm); |
| 219 | return 0; | 219 | return 0; |
| 220 | } | 220 | } |
| 221 | 221 | ||
diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c index 0cb39ff21171..f8fb2d691c0a 100644 --- a/drivers/scsi/sd_dif.c +++ b/drivers/scsi/sd_dif.c | |||
| @@ -408,7 +408,7 @@ int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_s | |||
| 408 | kunmap_atomic(sdt, KM_USER0); | 408 | kunmap_atomic(sdt, KM_USER0); |
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | bio->bi_flags |= BIO_MAPPED_INTEGRITY; | 411 | bio->bi_flags |= (1 << BIO_MAPPED_INTEGRITY); |
| 412 | } | 412 | } |
| 413 | 413 | ||
| 414 | return 0; | 414 | return 0; |
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 2f9cb43a2398..f37ad2271ad5 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c | |||
| @@ -1083,7 +1083,7 @@ err_alloc_rx_sg: | |||
| 1083 | return -ENOMEM; | 1083 | return -ENOMEM; |
| 1084 | } | 1084 | } |
| 1085 | 1085 | ||
| 1086 | static int __init pl022_dma_probe(struct pl022 *pl022) | 1086 | static int __devinit pl022_dma_probe(struct pl022 *pl022) |
| 1087 | { | 1087 | { |
| 1088 | dma_cap_mask_t mask; | 1088 | dma_cap_mask_t mask; |
| 1089 | 1089 | ||
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 44262908def5..501b27c18145 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -1028,7 +1028,7 @@ done: | |||
| 1028 | return iscsit_add_reject_from_cmd( | 1028 | return iscsit_add_reject_from_cmd( |
| 1029 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, | 1029 | ISCSI_REASON_BOOKMARK_NO_RESOURCES, |
| 1030 | 1, 1, buf, cmd); | 1030 | 1, 1, buf, cmd); |
| 1031 | } else if (transport_ret == -EINVAL) { | 1031 | } else if (transport_ret < 0) { |
| 1032 | /* | 1032 | /* |
| 1033 | * Unsupported SAM Opcode. CHECK_CONDITION will be sent | 1033 | * Unsupported SAM Opcode. CHECK_CONDITION will be sent |
| 1034 | * in iscsit_execute_cmd() during the CmdSN OOO Execution | 1034 | * in iscsit_execute_cmd() during the CmdSN OOO Execution |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index b7c779389eea..63e703bb6ac9 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
| @@ -117,7 +117,7 @@ static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *, | |||
| 117 | struct se_node_acl *, struct se_session *); | 117 | struct se_node_acl *, struct se_session *); |
| 118 | static void core_scsi3_put_pr_reg(struct t10_pr_registration *); | 118 | static void core_scsi3_put_pr_reg(struct t10_pr_registration *); |
| 119 | 119 | ||
| 120 | static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | 120 | static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd) |
| 121 | { | 121 | { |
| 122 | struct se_session *se_sess = cmd->se_sess; | 122 | struct se_session *se_sess = cmd->se_sess; |
| 123 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; | 123 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; |
| @@ -127,7 +127,7 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | |||
| 127 | int conflict = 0; | 127 | int conflict = 0; |
| 128 | 128 | ||
| 129 | if (!crh) | 129 | if (!crh) |
| 130 | return false; | 130 | return -EINVAL; |
| 131 | 131 | ||
| 132 | pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl, | 132 | pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl, |
| 133 | se_sess); | 133 | se_sess); |
| @@ -155,16 +155,14 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | |||
| 155 | */ | 155 | */ |
| 156 | if (pr_reg->pr_res_holder) { | 156 | if (pr_reg->pr_res_holder) { |
| 157 | core_scsi3_put_pr_reg(pr_reg); | 157 | core_scsi3_put_pr_reg(pr_reg); |
| 158 | *ret = 0; | 158 | return 1; |
| 159 | return false; | ||
| 160 | } | 159 | } |
| 161 | if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) || | 160 | if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) || |
| 162 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) || | 161 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) || |
| 163 | (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) || | 162 | (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) || |
| 164 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) { | 163 | (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) { |
| 165 | core_scsi3_put_pr_reg(pr_reg); | 164 | core_scsi3_put_pr_reg(pr_reg); |
| 166 | *ret = 0; | 165 | return 1; |
| 167 | return true; | ||
| 168 | } | 166 | } |
| 169 | core_scsi3_put_pr_reg(pr_reg); | 167 | core_scsi3_put_pr_reg(pr_reg); |
| 170 | conflict = 1; | 168 | conflict = 1; |
| @@ -189,10 +187,10 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret) | |||
| 189 | " while active SPC-3 registrations exist," | 187 | " while active SPC-3 registrations exist," |
| 190 | " returning RESERVATION_CONFLICT\n"); | 188 | " returning RESERVATION_CONFLICT\n"); |
| 191 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | 189 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; |
| 192 | return true; | 190 | return -EBUSY; |
| 193 | } | 191 | } |
| 194 | 192 | ||
| 195 | return false; | 193 | return 0; |
| 196 | } | 194 | } |
| 197 | 195 | ||
| 198 | int target_scsi2_reservation_release(struct se_task *task) | 196 | int target_scsi2_reservation_release(struct se_task *task) |
| @@ -201,12 +199,18 @@ int target_scsi2_reservation_release(struct se_task *task) | |||
| 201 | struct se_device *dev = cmd->se_dev; | 199 | struct se_device *dev = cmd->se_dev; |
| 202 | struct se_session *sess = cmd->se_sess; | 200 | struct se_session *sess = cmd->se_sess; |
| 203 | struct se_portal_group *tpg = sess->se_tpg; | 201 | struct se_portal_group *tpg = sess->se_tpg; |
| 204 | int ret = 0; | 202 | int ret = 0, rc; |
| 205 | 203 | ||
| 206 | if (!sess || !tpg) | 204 | if (!sess || !tpg) |
| 207 | goto out; | 205 | goto out; |
| 208 | if (target_check_scsi2_reservation_conflict(cmd, &ret)) | 206 | rc = target_check_scsi2_reservation_conflict(cmd); |
| 207 | if (rc == 1) | ||
| 208 | goto out; | ||
| 209 | else if (rc < 0) { | ||
| 210 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
| 211 | ret = -EINVAL; | ||
| 209 | goto out; | 212 | goto out; |
| 213 | } | ||
| 210 | 214 | ||
| 211 | ret = 0; | 215 | ret = 0; |
| 212 | spin_lock(&dev->dev_reservation_lock); | 216 | spin_lock(&dev->dev_reservation_lock); |
| @@ -243,7 +247,7 @@ int target_scsi2_reservation_reserve(struct se_task *task) | |||
| 243 | struct se_device *dev = cmd->se_dev; | 247 | struct se_device *dev = cmd->se_dev; |
| 244 | struct se_session *sess = cmd->se_sess; | 248 | struct se_session *sess = cmd->se_sess; |
| 245 | struct se_portal_group *tpg = sess->se_tpg; | 249 | struct se_portal_group *tpg = sess->se_tpg; |
| 246 | int ret = 0; | 250 | int ret = 0, rc; |
| 247 | 251 | ||
| 248 | if ((cmd->t_task_cdb[1] & 0x01) && | 252 | if ((cmd->t_task_cdb[1] & 0x01) && |
| 249 | (cmd->t_task_cdb[1] & 0x02)) { | 253 | (cmd->t_task_cdb[1] & 0x02)) { |
| @@ -259,8 +263,14 @@ int target_scsi2_reservation_reserve(struct se_task *task) | |||
| 259 | */ | 263 | */ |
| 260 | if (!sess || !tpg) | 264 | if (!sess || !tpg) |
| 261 | goto out; | 265 | goto out; |
| 262 | if (target_check_scsi2_reservation_conflict(cmd, &ret)) | 266 | rc = target_check_scsi2_reservation_conflict(cmd); |
| 267 | if (rc == 1) | ||
| 263 | goto out; | 268 | goto out; |
| 269 | else if (rc < 0) { | ||
| 270 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | ||
| 271 | ret = -EINVAL; | ||
| 272 | goto out; | ||
| 273 | } | ||
| 264 | 274 | ||
| 265 | ret = 0; | 275 | ret = 0; |
| 266 | spin_lock(&dev->dev_reservation_lock); | 276 | spin_lock(&dev->dev_reservation_lock); |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 58cea07b12fb..cd5cd95812bb 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -2539,6 +2539,7 @@ static int transport_generic_cmd_sequencer( | |||
| 2539 | cmd, cdb, pr_reg_type) != 0) { | 2539 | cmd, cdb, pr_reg_type) != 0) { |
| 2540 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; | 2540 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; |
| 2541 | cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT; | 2541 | cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT; |
| 2542 | cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; | ||
| 2542 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; | 2543 | cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT; |
| 2543 | return -EBUSY; | 2544 | return -EBUSY; |
| 2544 | } | 2545 | } |
diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig index b3d17416d86a..830cd62d8492 100644 --- a/drivers/tty/Kconfig +++ b/drivers/tty/Kconfig | |||
| @@ -365,7 +365,7 @@ config PPC_EPAPR_HV_BYTECHAN | |||
| 365 | 365 | ||
| 366 | config PPC_EARLY_DEBUG_EHV_BC | 366 | config PPC_EARLY_DEBUG_EHV_BC |
| 367 | bool "Early console (udbg) support for ePAPR hypervisors" | 367 | bool "Early console (udbg) support for ePAPR hypervisors" |
| 368 | depends on PPC_EPAPR_HV_BYTECHAN | 368 | depends on PPC_EPAPR_HV_BYTECHAN=y |
| 369 | help | 369 | help |
| 370 | Select this option to enable early console (a.k.a. "udbg") support | 370 | Select this option to enable early console (a.k.a. "udbg") support |
| 371 | via an ePAPR byte channel. You also need to choose the byte channel | 371 | via an ePAPR byte channel. You also need to choose the byte channel |
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 75085795528e..61b7fd2729cd 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c | |||
| @@ -1710,6 +1710,8 @@ static int sci_startup(struct uart_port *port) | |||
| 1710 | 1710 | ||
| 1711 | dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); | 1711 | dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); |
| 1712 | 1712 | ||
| 1713 | pm_runtime_put_noidle(port->dev); | ||
| 1714 | |||
| 1713 | sci_port_enable(s); | 1715 | sci_port_enable(s); |
| 1714 | 1716 | ||
| 1715 | ret = sci_request_irq(s); | 1717 | ret = sci_request_irq(s); |
| @@ -1737,6 +1739,8 @@ static void sci_shutdown(struct uart_port *port) | |||
| 1737 | sci_free_irq(s); | 1739 | sci_free_irq(s); |
| 1738 | 1740 | ||
| 1739 | sci_port_disable(s); | 1741 | sci_port_disable(s); |
| 1742 | |||
| 1743 | pm_runtime_get_noresume(port->dev); | ||
| 1740 | } | 1744 | } |
| 1741 | 1745 | ||
| 1742 | static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps, | 1746 | static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps, |
| @@ -2075,6 +2079,7 @@ static int __devinit sci_init_single(struct platform_device *dev, | |||
| 2075 | sci_init_gpios(sci_port); | 2079 | sci_init_gpios(sci_port); |
| 2076 | 2080 | ||
| 2077 | pm_runtime_irq_safe(&dev->dev); | 2081 | pm_runtime_irq_safe(&dev->dev); |
| 2082 | pm_runtime_get_noresume(&dev->dev); | ||
| 2078 | pm_runtime_enable(&dev->dev); | 2083 | pm_runtime_enable(&dev->dev); |
| 2079 | } | 2084 | } |
| 2080 | 2085 | ||
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index c26a82e83f6e..b556a72264d1 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c | |||
| @@ -239,7 +239,7 @@ static void ehci_fsl_setup_phy(struct ehci_hcd *ehci, | |||
| 239 | ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]); | 239 | ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]); |
| 240 | } | 240 | } |
| 241 | 241 | ||
| 242 | static int ehci_fsl_usb_setup(struct ehci_hcd *ehci) | 242 | static void ehci_fsl_usb_setup(struct ehci_hcd *ehci) |
| 243 | { | 243 | { |
| 244 | struct usb_hcd *hcd = ehci_to_hcd(ehci); | 244 | struct usb_hcd *hcd = ehci_to_hcd(ehci); |
| 245 | struct fsl_usb2_platform_data *pdata; | 245 | struct fsl_usb2_platform_data *pdata; |
| @@ -299,19 +299,12 @@ static int ehci_fsl_usb_setup(struct ehci_hcd *ehci) | |||
| 299 | #endif | 299 | #endif |
| 300 | out_be32(non_ehci + FSL_SOC_USB_SICTRL, 0x00000001); | 300 | out_be32(non_ehci + FSL_SOC_USB_SICTRL, 0x00000001); |
| 301 | } | 301 | } |
| 302 | |||
| 303 | if (!(in_be32(non_ehci + FSL_SOC_USB_CTRL) & CTRL_PHY_CLK_VALID)) { | ||
| 304 | printk(KERN_WARNING "fsl-ehci: USB PHY clock invalid\n"); | ||
| 305 | return -ENODEV; | ||
| 306 | } | ||
| 307 | return 0; | ||
| 308 | } | 302 | } |
| 309 | 303 | ||
| 310 | /* called after powerup, by probe or system-pm "wakeup" */ | 304 | /* called after powerup, by probe or system-pm "wakeup" */ |
| 311 | static int ehci_fsl_reinit(struct ehci_hcd *ehci) | 305 | static int ehci_fsl_reinit(struct ehci_hcd *ehci) |
| 312 | { | 306 | { |
| 313 | if (ehci_fsl_usb_setup(ehci)) | 307 | ehci_fsl_usb_setup(ehci); |
| 314 | return -ENODEV; | ||
| 315 | ehci_port_power(ehci, 0); | 308 | ehci_port_power(ehci, 0); |
| 316 | 309 | ||
| 317 | return 0; | 310 | return 0; |
diff --git a/drivers/usb/host/ehci-fsl.h b/drivers/usb/host/ehci-fsl.h index bdf43e2adc51..491806221165 100644 --- a/drivers/usb/host/ehci-fsl.h +++ b/drivers/usb/host/ehci-fsl.h | |||
| @@ -45,6 +45,5 @@ | |||
| 45 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ | 45 | #define FSL_SOC_USB_PRICTRL 0x40c /* NOTE: big-endian */ |
| 46 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ | 46 | #define FSL_SOC_USB_SICTRL 0x410 /* NOTE: big-endian */ |
| 47 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ | 47 | #define FSL_SOC_USB_CTRL 0x500 /* NOTE: big-endian */ |
| 48 | #define CTRL_PHY_CLK_VALID (1 << 17) | ||
| 49 | #define SNOOP_SIZE_2GB 0x1e | 48 | #define SNOOP_SIZE_2GB 0x1e |
| 50 | #endif /* _EHCI_FSL_H */ | 49 | #endif /* _EHCI_FSL_H */ |
diff --git a/drivers/video/backlight/s6e63m0.c b/drivers/video/backlight/s6e63m0.c index e132157d8545..516db703dd24 100644 --- a/drivers/video/backlight/s6e63m0.c +++ b/drivers/video/backlight/s6e63m0.c | |||
| @@ -690,7 +690,7 @@ static ssize_t s6e63m0_sysfs_store_gamma_mode(struct device *dev, | |||
| 690 | struct backlight_device *bd = NULL; | 690 | struct backlight_device *bd = NULL; |
| 691 | int brightness, rc; | 691 | int brightness, rc; |
| 692 | 692 | ||
| 693 | rc = strict_strtoul(buf, 0, (unsigned long *)&lcd->gamma_mode); | 693 | rc = kstrtouint(buf, 0, &lcd->gamma_mode); |
| 694 | if (rc < 0) | 694 | if (rc < 0) |
| 695 | return rc; | 695 | return rc; |
| 696 | 696 | ||
