]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvar...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 Mar 2012 00:14:35 +0000 (17:14 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 Mar 2012 00:14:35 +0000 (17:14 -0700)
Pull i2c subsystem fixes from Jean Delvare.

* 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  i2c-algo-bit: Fix spurious SCL timeouts under heavy load
  i2c-core: Comment says "transmitted" but means "received"

17 files changed:
Documentation/hwmon/w83627ehf
Documentation/hwmon/zl6100
drivers/gpu/drm/exynos/exynos_drm_connector.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_sprite.c
drivers/hwmon/pmbus/zl6100.c
drivers/hwmon/w83627ehf.c
drivers/media/dvb/siano/smsdvb.c
drivers/media/video/davinci/isif.c
drivers/media/video/uvc/uvc_video.c
drivers/target/iscsi/iscsi_target.c
drivers/target/target_core_pr.c
drivers/target/target_core_transport.c

index 3f44dbdfda70fd019609b5205e02aebd1df628db..ceaf6f652b00662d19b2ece7b8792ee92799e4fa 100644 (file)
@@ -50,7 +50,7 @@ W83627DHG, W83627DHG-P, W83627UHG, W83667HG, W83667HG-B, W83667HG-I
 (NCT6775F), and NCT6776F super I/O chips. We will refer to them collectively
 as Winbond chips.
 
-The chips implement 2 to 4 temperature sensors (9 for NCT6775F and NCT6776F),
+The chips implement 3 to 4 temperature sensors (9 for NCT6775F and NCT6776F),
 2 to 5 fan rotation speed sensors, 8 to 10 analog voltage sensors, one VID
 (except for 627UHG), alarms with beep warnings (control unimplemented),
 and some automatic fan regulation strategies (plus manual fan control mode).
@@ -143,8 +143,13 @@ pwm[1-4]_min_output - minimum fan speed (range 1 - 255), when the temperature
 pwm[1-4]_stop_time  - how many milliseconds [ms] must elapse to switch
                       corresponding fan off. (when the temperature was below
                       defined range).
+pwm[1-4]_start_output-minimum fan speed (range 1 - 255) when spinning up
+pwm[1-4]_step_output- rate of fan speed change (1 - 255)
+pwm[1-4]_stop_output- minimum fan speed (range 1 - 255) when spinning down
+pwm[1-4]_max_output - maximum fan speed (range 1 - 255), when the temperature
+                      is above defined range.
 
-Note: last two functions are influenced by other control bits, not yet exported
+Note: last six functions are influenced by other control bits, not yet exported
       by the driver, so a change might not have any effect.
 
 Implementation Details
index 51f76a189feead958ae094ab9608b87c74bcdacb..a4e8d90f59f608d9d1a25341109fa8e9c3b52b5e 100644 (file)
@@ -88,14 +88,12 @@ Module parameters
 delay
 -----
 
-Some Intersil/Zilker Labs DC-DC controllers require a minimum interval between
-I2C bus accesses. According to Intersil, the minimum interval is 2 ms, though
-1 ms appears to be sufficient and has not caused any problems in testing.
-The problem is known to affect ZL6100, ZL2105, and ZL2008. It is known not to
-affect ZL2004 and ZL6105. The driver automatically sets the interval to 1 ms
-except for ZL2004 and ZL6105. To enable manual override, the driver provides a
-writeable module parameter, 'delay', which can be used to set the interval to
-a value between 0 and 65,535 microseconds.
+Intersil/Zilker Labs DC-DC controllers require a minimum interval between I2C
+bus accesses. According to Intersil, the minimum interval is 2 ms, though 1 ms
+appears to be sufficient and has not caused any problems in testing. The problem
+is known to affect all currently supported chips. For manual override, the
+driver provides a writeable module parameter, 'delay', which can be used to set
+the interval to a value between 0 and 65,535 microseconds.
 
 
 Sysfs entries
index 618bd4d87d286171a87da2fdbdfc2d251eae63f2..99d5527b2ca6a61f4e036b7d840f5a1110d63c4e 100644 (file)
@@ -54,14 +54,14 @@ convert_to_display_mode(struct drm_display_mode *mode,
        mode->vrefresh = timing->refresh;
 
        mode->hdisplay = timing->xres;
-       mode->hsync_start = mode->hdisplay + timing->left_margin;
+       mode->hsync_start = mode->hdisplay + timing->right_margin;
        mode->hsync_end = mode->hsync_start + timing->hsync_len;
-       mode->htotal = mode->hsync_end + timing->right_margin;
+       mode->htotal = mode->hsync_end + timing->left_margin;
 
        mode->vdisplay = timing->yres;
-       mode->vsync_start = mode->vdisplay + timing->upper_margin;
+       mode->vsync_start = mode->vdisplay + timing->lower_margin;
        mode->vsync_end = mode->vsync_start + timing->vsync_len;
-       mode->vtotal = mode->vsync_end + timing->lower_margin;
+       mode->vtotal = mode->vsync_end + timing->upper_margin;
        mode->width_mm = panel->width_mm;
        mode->height_mm = panel->height_mm;
 
@@ -85,14 +85,14 @@ convert_to_video_timing(struct fb_videomode *timing,
        timing->refresh = drm_mode_vrefresh(mode);
 
        timing->xres = mode->hdisplay;
-       timing->left_margin = mode->hsync_start - mode->hdisplay;
+       timing->right_margin = mode->hsync_start - mode->hdisplay;
        timing->hsync_len = mode->hsync_end - mode->hsync_start;
-       timing->right_margin = mode->htotal - mode->hsync_end;
+       timing->left_margin = mode->htotal - mode->hsync_end;
 
        timing->yres = mode->vdisplay;
-       timing->upper_margin = mode->vsync_start - mode->vdisplay;
+       timing->lower_margin = mode->vsync_start - mode->vdisplay;
        timing->vsync_len = mode->vsync_end - mode->vsync_start;
-       timing->lower_margin = mode->vtotal - mode->vsync_end;
+       timing->upper_margin = mode->vtotal - mode->vsync_end;
 
        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
                timing->vmode = FB_VMODE_INTERLACED;
index 58820ebd35588f8b1e493234022b0e2132996369..09cc13f791b3d005eca2f4c2a9189773d9bd0275 100644 (file)
@@ -246,7 +246,7 @@ static struct platform_driver exynos_drm_platform_driver = {
        .remove         = __devexit_p(exynos_drm_platform_remove),
        .driver         = {
                .owner  = THIS_MODULE,
-               .name   = DRIVER_NAME,
+               .name   = "exynos-drm",
        },
 };
 
index 3508700e529bbcd3c92c49a45be915ab885458d7..54f8f074822f6fd24bd16948fb2c3fa7210a22a4 100644 (file)
@@ -46,39 +46,13 @@ struct exynos_drm_fbdev {
        struct exynos_drm_gem_obj       *exynos_gem_obj;
 };
 
-static int exynos_drm_fbdev_set_par(struct fb_info *info)
-{
-       struct fb_var_screeninfo *var = &info->var;
-
-       switch (var->bits_per_pixel) {
-       case 32:
-       case 24:
-       case 18:
-       case 16:
-       case 12:
-               info->fix.visual = FB_VISUAL_TRUECOLOR;
-               break;
-       case 1:
-               info->fix.visual = FB_VISUAL_MONO01;
-               break;
-       default:
-               info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
-               break;
-       }
-
-       info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8;
-
-       return drm_fb_helper_set_par(info);
-}
-
-
 static struct fb_ops exynos_drm_fb_ops = {
        .owner          = THIS_MODULE,
        .fb_fillrect    = cfb_fillrect,
        .fb_copyarea    = cfb_copyarea,
        .fb_imageblit   = cfb_imageblit,
        .fb_check_var   = drm_fb_helper_check_var,
-       .fb_set_par     = exynos_drm_fbdev_set_par,
+       .fb_set_par     = drm_fb_helper_set_par,
        .fb_blank       = drm_fb_helper_blank,
        .fb_pan_display = drm_fb_helper_pan_display,
        .fb_setcmap     = drm_fb_helper_setcmap,
index 360adf2bba047bb9c60177bc1a7dff8965ba3fd1..56458eea05010932c5a96228723c3c8c40321c9b 100644 (file)
@@ -817,8 +817,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
                goto err_clk_get;
        }
 
-       clk_enable(ctx->bus_clk);
-
        ctx->lcd_clk = clk_get(dev, "sclk_fimd");
        if (IS_ERR(ctx->lcd_clk)) {
                dev_err(dev, "failed to get lcd clock\n");
@@ -826,8 +824,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
                goto err_bus_clk;
        }
 
-       clk_enable(ctx->lcd_clk);
-
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(dev, "failed to find registers\n");
@@ -864,17 +860,11 @@ static int __devinit fimd_probe(struct platform_device *pdev)
                goto err_req_irq;
        }
 
-       ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing);
        ctx->vidcon0 = pdata->vidcon0;
        ctx->vidcon1 = pdata->vidcon1;
        ctx->default_win = pdata->default_win;
        ctx->panel = panel;
 
-       panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv;
-
-       DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n",
-                       panel->timing.pixclock, ctx->clkdiv);
-
        subdrv = &ctx->subdrv;
 
        subdrv->probe = fimd_subdrv_probe;
@@ -889,10 +879,15 @@ static int __devinit fimd_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, ctx);
 
-       pm_runtime_set_active(dev);
        pm_runtime_enable(dev);
        pm_runtime_get_sync(dev);
 
+       ctx->clkdiv = fimd_calc_clkdiv(ctx, &panel->timing);
+       panel->timing.pixclock = clk_get_rate(ctx->lcd_clk) / ctx->clkdiv;
+
+       DRM_DEBUG_KMS("pixel clock = %d, clkdiv = %d\n",
+                       panel->timing.pixclock, ctx->clkdiv);
+
        for (win = 0; win < WINDOWS_NR; win++)
                fimd_clear_win(ctx, win);
 
index 03c53fcf86536ba110033931b8b979f3e4fd35f0..558ac716a3283140fe756e1990a4e275d2ee47c5 100644 (file)
 #define   DVS_FORMAT_RGBX888   (2<<25)
 #define   DVS_FORMAT_RGBX161616        (3<<25)
 #define   DVS_SOURCE_KEY       (1<<22)
-#define   DVS_RGB_ORDER_RGBX   (1<<20)
+#define   DVS_RGB_ORDER_XBGR   (1<<20)
 #define   DVS_YUV_BYTE_ORDER_MASK (3<<16)
 #define   DVS_YUV_ORDER_YUYV   (0<<16)
 #define   DVS_YUV_ORDER_UYVY   (1<<16)
index f851db7be2cc20ccc279b794bf78e65d566d1573..397087cf689e8210b64fb45f0e19f54b3fd1d13c 100644 (file)
@@ -7828,6 +7828,7 @@ int intel_framebuffer_init(struct drm_device *dev,
        case DRM_FORMAT_RGB332:
        case DRM_FORMAT_RGB565:
        case DRM_FORMAT_XRGB8888:
+       case DRM_FORMAT_XBGR8888:
        case DRM_FORMAT_ARGB8888:
        case DRM_FORMAT_XRGB2101010:
        case DRM_FORMAT_ARGB2101010:
index 2288abf88cce4e3420bbedc379747480aa8843e8..a0835040c86b8a803108e078662b73b5d87093b5 100644 (file)
@@ -225,16 +225,16 @@ snb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb,
 
        /* Mask out pixel format bits in case we change it */
        dvscntr &= ~DVS_PIXFORMAT_MASK;
-       dvscntr &= ~DVS_RGB_ORDER_RGBX;
+       dvscntr &= ~DVS_RGB_ORDER_XBGR;
        dvscntr &= ~DVS_YUV_BYTE_ORDER_MASK;
 
        switch (fb->pixel_format) {
        case DRM_FORMAT_XBGR8888:
-               dvscntr |= DVS_FORMAT_RGBX888;
+               dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_XBGR;
                pixel_size = 4;
                break;
        case DRM_FORMAT_XRGB8888:
-               dvscntr |= DVS_FORMAT_RGBX888 | DVS_RGB_ORDER_RGBX;
+               dvscntr |= DVS_FORMAT_RGBX888;
                pixel_size = 4;
                break;
        case DRM_FORMAT_YUYV:
index 880b90cf4d3260ce4bb6c586fd34d0d895fea0bc..e3e8420b7b810d6658aebef846ffb47ab3c66e0c 100644 (file)
@@ -200,17 +200,11 @@ static int zl6100_probe(struct i2c_client *client,
        data->id = mid->driver_data;
 
        /*
-        * ZL2005, ZL2008, ZL2105, and ZL6100 are known to require a wait time
-        * between I2C accesses. ZL2004 and ZL6105 are known to be safe.
-        * Other chips have not yet been tested.
-        *
-        * Only clear the wait time for chips known to be safe. The wait time
-        * can be cleared later for additional chips if tests show that it
-        * is not needed (in other words, better be safe than sorry).
+        * According to information from the chip vendor, all currently
+        * supported chips are known to require a wait time between I2C
+        * accesses.
         */
        data->delay = delay;
-       if (data->id == zl2004 || data->id == zl6105)
-               data->delay = 0;
 
        /*
         * Since there was a direct I2C device access above, wait before
index 5276d1933dbcad8ee3acf29fb5d0f2f3e17b7d4d..a658d62c5e102ee2e492d4e68cb2f121fe24a0b5 100644 (file)
@@ -39,7 +39,7 @@
                                               0x8860 0xa1
     w83627dhg    9      5       4       3      0xa020 0xc1    0x5ca3
     w83627dhg-p  9      5       4       3      0xb070 0xc1    0x5ca3
-    w83627uhg    8      2       2       2      0xa230 0xc1    0x5ca3
+    w83627uhg    8      2       2       3      0xa230 0xc1    0x5ca3
     w83667hg     9      5       3       3      0xa510 0xc1    0x5ca3
     w83667hg-b   9      5       3       4      0xb350 0xc1    0x5ca3
     nct6775f     9      4       3       9      0xb470 0xc1    0x5ca3
@@ -1607,7 +1607,7 @@ store_##reg(struct device *dev, struct device_attribute *attr, \
        val = step_time_to_reg(val, data->pwm_mode[nr]); \
        mutex_lock(&data->update_lock); \
        data->reg[nr] = val; \
-       w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \
+       w83627ehf_write_value(data, data->REG_##REG[nr], val); \
        mutex_unlock(&data->update_lock); \
        return count; \
 } \
@@ -2004,7 +2004,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
                goto exit;
        }
 
-       data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL);
+       data = devm_kzalloc(&pdev->dev, sizeof(struct w83627ehf_data),
+                           GFP_KERNEL);
        if (!data) {
                err = -ENOMEM;
                goto exit_release;
@@ -2157,16 +2158,16 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
                w83627ehf_set_temp_reg_ehf(data, 3);
 
                /*
-                * Temperature sources for temp1 and temp2 are selected with
+                * Temperature sources for temp2 and temp3 are selected with
                 * bank 0, registers 0x49 and 0x4a.
                 */
                data->temp_src[0] = 0;  /* SYSTIN */
                reg = w83627ehf_read_value(data, 0x49) & 0x07;
                /* Adjust to have the same mapping as other source registers */
                if (reg == 0)
-                       data->temp_src[1]++;
+                       data->temp_src[1] = 1;
                else if (reg >= 2 && reg <= 5)
-                       data->temp_src[1] += 2;
+                       data->temp_src[1] = reg + 2;
                else    /* should never happen */
                        data->have_temp &= ~(1 << 1);
                reg = w83627ehf_read_value(data, 0x4a);
@@ -2493,9 +2494,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
 
 exit_remove:
        w83627ehf_device_remove_files(dev);
-       kfree(data);
-       platform_set_drvdata(pdev, NULL);
 exit_release:
+       platform_set_drvdata(pdev, NULL);
        release_region(res->start, IOREGION_LENGTH);
 exit:
        return err;
@@ -2509,7 +2509,6 @@ static int __devexit w83627ehf_remove(struct platform_device *pdev)
        w83627ehf_device_remove_files(&pdev->dev);
        release_region(data->addr, IOREGION_LENGTH);
        platform_set_drvdata(pdev, NULL);
-       kfree(data);
 
        return 0;
 }
index 654685c9303e58e8eff7edd15c50aae0c6daeaec..aa77e54a8faec13a8d03129a7a9695b46a96ff72 100644 (file)
@@ -49,9 +49,6 @@ struct smsdvb_client_t {
 
        struct completion       tune_done;
 
-       /* todo: save freq/band instead whole struct */
-       struct dtv_frontend_properties fe_params;
-
        struct SMSHOSTLIB_STATISTICS_DVB_S sms_stat_dvb;
        int event_fe_state;
        int event_unc_state;
@@ -744,12 +741,124 @@ static int smsdvb_get_frontend(struct dvb_frontend *fe)
        struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
        struct smsdvb_client_t *client =
                container_of(fe, struct smsdvb_client_t, frontend);
+       struct smscore_device_t *coredev = client->coredev;
+       struct TRANSMISSION_STATISTICS_S *td =
+               &client->sms_stat_dvb.TransmissionData;
 
-       sms_debug("");
+       switch (smscore_get_device_mode(coredev)) {
+       case DEVICE_MODE_DVBT:
+       case DEVICE_MODE_DVBT_BDA:
+               fep->frequency = td->Frequency;
+
+               switch (td->Bandwidth) {
+               case 6:
+                       fep->bandwidth_hz = 6000000;
+                       break;
+               case 7:
+                       fep->bandwidth_hz = 7000000;
+                       break;
+               case 8:
+                       fep->bandwidth_hz = 8000000;
+                       break;
+               }
+
+               switch (td->TransmissionMode) {
+               case 2:
+                       fep->transmission_mode = TRANSMISSION_MODE_2K;
+                       break;
+               case 8:
+                       fep->transmission_mode = TRANSMISSION_MODE_8K;
+               }
+
+               switch (td->GuardInterval) {
+               case 0:
+                       fep->guard_interval = GUARD_INTERVAL_1_32;
+                       break;
+               case 1:
+                       fep->guard_interval = GUARD_INTERVAL_1_16;
+                       break;
+               case 2:
+                       fep->guard_interval = GUARD_INTERVAL_1_8;
+                       break;
+               case 3:
+                       fep->guard_interval = GUARD_INTERVAL_1_4;
+                       break;
+               }
+
+               switch (td->CodeRate) {
+               case 0:
+                       fep->code_rate_HP = FEC_1_2;
+                       break;
+               case 1:
+                       fep->code_rate_HP = FEC_2_3;
+                       break;
+               case 2:
+                       fep->code_rate_HP = FEC_3_4;
+                       break;
+               case 3:
+                       fep->code_rate_HP = FEC_5_6;
+                       break;
+               case 4:
+                       fep->code_rate_HP = FEC_7_8;
+                       break;
+               }
+
+               switch (td->LPCodeRate) {
+               case 0:
+                       fep->code_rate_LP = FEC_1_2;
+                       break;
+               case 1:
+                       fep->code_rate_LP = FEC_2_3;
+                       break;
+               case 2:
+                       fep->code_rate_LP = FEC_3_4;
+                       break;
+               case 3:
+                       fep->code_rate_LP = FEC_5_6;
+                       break;
+               case 4:
+                       fep->code_rate_LP = FEC_7_8;
+                       break;
+               }
+
+               switch (td->Constellation) {
+               case 0:
+                       fep->modulation = QPSK;
+                       break;
+               case 1:
+                       fep->modulation = QAM_16;
+                       break;
+               case 2:
+                       fep->modulation = QAM_64;
+                       break;
+               }
+
+               switch (td->Hierarchy) {
+               case 0:
+                       fep->hierarchy = HIERARCHY_NONE;
+                       break;
+               case 1:
+                       fep->hierarchy = HIERARCHY_1;
+                       break;
+               case 2:
+                       fep->hierarchy = HIERARCHY_2;
+                       break;
+               case 3:
+                       fep->hierarchy = HIERARCHY_4;
+                       break;
+               }
 
-       /* todo: */
-       memcpy(fep, &client->fe_params,
-              sizeof(struct dtv_frontend_properties));
+               fep->inversion = INVERSION_AUTO;
+               break;
+       case DEVICE_MODE_ISDBT:
+       case DEVICE_MODE_ISDBT_BDA:
+               fep->frequency = td->Frequency;
+               fep->bandwidth_hz = 6000000;
+               /* todo: retrive the other parameters */
+               break;
+       default:
+               return -EINVAL;
+       }
 
        return 0;
 }
@@ -872,11 +981,11 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
        switch (smscore_get_device_mode(coredev)) {
        case DEVICE_MODE_DVBT:
        case DEVICE_MODE_DVBT_BDA:
-               smsdvb_fe_ops.delsys[0] = SYS_DVBT;
+               client->frontend.ops.delsys[0] = SYS_DVBT;
                break;
        case DEVICE_MODE_ISDBT:
        case DEVICE_MODE_ISDBT_BDA:
-               smsdvb_fe_ops.delsys[0] = SYS_ISDBT;
+               client->frontend.ops.delsys[0] = SYS_ISDBT;
                break;
        }
 
index 1e63852374bed0641e443c9c0237dc7868c90598..5278fe7d6d0c3638cd1eba5d6860fb0f94066361 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/videodev2.h>
 #include <linux/clk.h>
 #include <linux/err.h>
+#include <linux/module.h>
 
 #include <mach/mux.h>
 
index c7e69b8f81c9555b5a1296b96355957b8e91089b..4a44f9a1bae00e0610f8c3d382cd5110d422f851 100644 (file)
@@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
        delta_stc = buf->pts - (1UL << 31);
        x1 = first->dev_stc - delta_stc;
        x2 = last->dev_stc - delta_stc;
+       if (x1 == x2)
+               goto done;
+
        y1 = (first->dev_sof + 2048) << 16;
        y2 = (last->dev_sof + 2048) << 16;
-
        if (y2 < y1)
                y2 += 2048 << 16;
 
@@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
                  x1, x2, y1, y2, clock->sof_offset);
 
        /* Second step, SOF to host clock conversion. */
-       ts = timespec_sub(last->host_ts, first->host_ts);
        x1 = (uvc_video_clock_host_sof(first) + 2048) << 16;
        x2 = (uvc_video_clock_host_sof(last) + 2048) << 16;
-       y1 = NSEC_PER_SEC;
-       y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
-
        if (x2 < x1)
                x2 += 2048 << 16;
+       if (x1 == x2)
+               goto done;
+
+       ts = timespec_sub(last->host_ts, first->host_ts);
+       y1 = NSEC_PER_SEC;
+       y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
 
        /* Interpolated and host SOF timestamps can wrap around at slightly
         * different times. Handle this by adding or removing 2048 to or from
index 44262908def547557e5c3fe0a8a8cd34a00dfbd7..501b27c18145af979ca5fcbbc60f38ee2f064287 100644 (file)
@@ -1028,7 +1028,7 @@ done:
                return iscsit_add_reject_from_cmd(
                                ISCSI_REASON_BOOKMARK_NO_RESOURCES,
                                1, 1, buf, cmd);
-       } else if (transport_ret == -EINVAL) {
+       } else if (transport_ret < 0) {
                /*
                 * Unsupported SAM Opcode.  CHECK_CONDITION will be sent
                 * in iscsit_execute_cmd() during the CmdSN OOO Execution
index b7c779389eea6820c34c5f9d6a6dafc98638c932..63e703bb6ac92f8eb3c1a94724a762050ed60c98 100644 (file)
@@ -117,7 +117,7 @@ static struct t10_pr_registration *core_scsi3_locate_pr_reg(struct se_device *,
                                        struct se_node_acl *, struct se_session *);
 static void core_scsi3_put_pr_reg(struct t10_pr_registration *);
 
-static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
+static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd)
 {
        struct se_session *se_sess = cmd->se_sess;
        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)
        int conflict = 0;
 
        if (!crh)
-               return false;
+               return -EINVAL;
 
        pr_reg = core_scsi3_locate_pr_reg(cmd->se_dev, se_sess->se_node_acl,
                        se_sess);
@@ -155,16 +155,14 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
                 */
                if (pr_reg->pr_res_holder) {
                        core_scsi3_put_pr_reg(pr_reg);
-                       *ret = 0;
-                       return false;
+                       return 1;
                }
                if ((pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_REGONLY) ||
                    (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_REGONLY) ||
                    (pr_reg->pr_res_type == PR_TYPE_WRITE_EXCLUSIVE_ALLREG) ||
                    (pr_reg->pr_res_type == PR_TYPE_EXCLUSIVE_ACCESS_ALLREG)) {
                        core_scsi3_put_pr_reg(pr_reg);
-                       *ret = 0;
-                       return true;
+                       return 1;
                }
                core_scsi3_put_pr_reg(pr_reg);
                conflict = 1;
@@ -189,10 +187,10 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd, int *ret)
                        " while active SPC-3 registrations exist,"
                        " returning RESERVATION_CONFLICT\n");
                cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
-               return true;
+               return -EBUSY;
        }
 
-       return false;
+       return 0;
 }
 
 int target_scsi2_reservation_release(struct se_task *task)
@@ -201,12 +199,18 @@ int target_scsi2_reservation_release(struct se_task *task)
        struct se_device *dev = cmd->se_dev;
        struct se_session *sess = cmd->se_sess;
        struct se_portal_group *tpg = sess->se_tpg;
-       int ret = 0;
+       int ret = 0, rc;
 
        if (!sess || !tpg)
                goto out;
-       if (target_check_scsi2_reservation_conflict(cmd, &ret))
+       rc = target_check_scsi2_reservation_conflict(cmd);
+       if (rc == 1)
+               goto out;
+       else if (rc < 0) {
+               cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
+               ret = -EINVAL;
                goto out;
+       }
 
        ret = 0;
        spin_lock(&dev->dev_reservation_lock);
@@ -243,7 +247,7 @@ int target_scsi2_reservation_reserve(struct se_task *task)
        struct se_device *dev = cmd->se_dev;
        struct se_session *sess = cmd->se_sess;
        struct se_portal_group *tpg = sess->se_tpg;
-       int ret = 0;
+       int ret = 0, rc;
 
        if ((cmd->t_task_cdb[1] & 0x01) &&
            (cmd->t_task_cdb[1] & 0x02)) {
@@ -259,8 +263,14 @@ int target_scsi2_reservation_reserve(struct se_task *task)
         */
        if (!sess || !tpg)
                goto out;
-       if (target_check_scsi2_reservation_conflict(cmd, &ret))
+       rc = target_check_scsi2_reservation_conflict(cmd);
+       if (rc == 1)
                goto out;
+       else if (rc < 0) {
+               cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
+               ret = -EINVAL;
+               goto out;
+       }
 
        ret = 0;
        spin_lock(&dev->dev_reservation_lock);
index 58cea07b12fbcaea6ae4f3990ed02cf2deba1995..cd5cd95812bbfdd0b5d57428224e596d3e129c86 100644 (file)
@@ -2539,6 +2539,7 @@ static int transport_generic_cmd_sequencer(
                                        cmd, cdb, pr_reg_type) != 0) {
                        cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
                        cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT;
+                       cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT;
                        cmd->scsi_sense_reason = TCM_RESERVATION_CONFLICT;
                        return -EBUSY;
                }