From patchwork Fri Nov 10 15:40:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 10053387 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1DDC360631 for ; Fri, 10 Nov 2017 15:40:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0F2B62AF01 for ; Fri, 10 Nov 2017 15:40:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0380D2AF1C; Fri, 10 Nov 2017 15:40:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EBD7E2AF01 for ; Fri, 10 Nov 2017 15:40:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753181AbdKJPkp (ORCPT ); Fri, 10 Nov 2017 10:40:45 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:58423 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751142AbdKJPkn (ORCPT ); Fri, 10 Nov 2017 10:40:43 -0500 Received: from wuerfel.lan ([109.193.157.232]) by mrelayeu.kundenserver.de (mreue104 [212.227.15.145]) with ESMTPA (Nemesis) id 0Mfpbg-1eY2Bn3rAi-00NAF7; Fri, 10 Nov 2017 16:40:24 +0100 From: Arnd Bergmann To: Adaptec OEM Raid Solutions , "James E.J. Bottomley" , "Martin K. Petersen" Cc: Arnd Bergmann , linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] scsi: ips: fix firmware timestamps for 32-bit Date: Fri, 10 Nov 2017 16:40:10 +0100 Message-Id: <20171110154022.1933558-1-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 X-Provags-ID: V03:K0:GuCezZJyrl/wn5G7OQwDQ1xHV3sOe/frGraA9rjMSxiwdV78oep Ut3tSGbbPV03S0Mutfdf3vnXNowgOpF7e0cl1LrrvM81Q6eNO9sb5ITxAXzDIolxvOM4SK0 z9QubWNswHw8nML/diaajRjHOi/HyWVkebxlv/VpdQl+FgG232ThQy1Jl8ai3FYLpV2J+QE QZRfFoIFa5Vb2zFQevSbQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:nkIbauhWTuU=:dNltWwiTagQ1ZGKRGp8hbg ZXswe8QAFh3bMb02enEer0Lnj7AAcBTacfiK2U0js8FceTf+Nd/GR6pWyTn/Clv9oUiQXFyA0 opLGX1gYSpE3A1hoahW9NdG+iy7Q5NmKaKNrfaHqi1jB2DE0Zq/F4EZc6riwV2wUr1Fr8wOqe tcAbzi9lTwkKteDm7ERtn7gId02A109H07aQ2hlGc898TGpK6XGAtxLVpSSMrNjl+c5YaTlY8 lHw5z5GyyWxJrRMJ1pCk/bgPQgc/NY1uRY5bzwF+2W55OiUtvopqBnFh3OEzBHtUHhdOAOqgI kHjgR618GsJe/4cXxolwOwkfxL3CROKIJkLv9lKMjmzmMthjxWF3KDNd863h761GZjRYqp40r 76HFcGtcIwGRZ+DGZ1XuWnD1Uj6McvGIa0wf0aSH3VcjLxMWNCIm9RGhIwuvXyxqoqgamOGaR BISI3WkWMkFC9TN3Yxuac/SXtHMqhqi8GdjP4Zwi1s995a9wx6SQDEBg2qCL3sB0rU2hqu4Ea ug796BjwL+2R5fqVs2vXboHORzdmjnpeApk1sWPXBeP+LSkjM2fS0MjobhME1QIvBnebJ0cwe 6TtRJgLtP2k3AdoElTmoFOOP2Lvq/VcmI9De2wZ+iWGYuwGQybO1FLqIXpxpplEMSZmBd9GfE q/ubfBwT3nT15y/LEx8Uoz5JFi4EnRZKuFh0z/6cBuwYiyd73RRXa+mNaWs6/8rSUPNF+qKXB kx1E3LrPiJa4nET+2CCmK+1zOjJlSFF43IoctQ== Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP do_gettimeofday() is deprecated since it will stop working in 2038 on 32-bit platforms. The firmware interface here actually supports times until year 25500, so we should use longer timestamps. Using ktime_get_real_seconds() to get a 64-bit seconds value and time64_to_tm() to convert it into the right format also has the advantage of greatly simplifying the time management code. Signed-off-by: Arnd Bergmann --- drivers/scsi/ips.c | 78 +++++++++++------------------------------------------- drivers/scsi/ips.h | 2 +- 2 files changed, 17 insertions(+), 63 deletions(-) diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 67621308eb9c..887843a465e1 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c @@ -293,7 +293,7 @@ static void ips_freescb(ips_ha_t *, ips_scb_t *); static void ips_setup_funclist(ips_ha_t *); static void ips_statinit(ips_ha_t *); static void ips_statinit_memio(ips_ha_t *); -static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time_t); +static void ips_fix_ffdc_time(ips_ha_t *, ips_scb_t *, time64_t); static void ips_ffdc_reset(ips_ha_t *, int); static void ips_ffdc_time(ips_ha_t *); static uint32_t ips_statupd_copperhead(ips_ha_t *); @@ -989,10 +989,7 @@ static int __ips_eh_reset(struct scsi_cmnd *SC) /* FFDC */ if (le32_to_cpu(ha->subsys->param[3]) & 0x300000) { - struct timeval tv; - - do_gettimeofday(&tv); - ha->last_ffdc = tv.tv_sec; + ha->last_ffdc = ktime_get_real_seconds(); ha->reset_count++; ips_ffdc_reset(ha, IPS_INTR_IORL); } @@ -2396,7 +2393,6 @@ static int ips_hainit(ips_ha_t * ha) { int i; - struct timeval tv; METHOD_TRACE("ips_hainit", 1); @@ -2411,8 +2407,7 @@ ips_hainit(ips_ha_t * ha) /* Send FFDC */ ha->reset_count = 1; - do_gettimeofday(&tv); - ha->last_ffdc = tv.tv_sec; + ha->last_ffdc = ktime_get_real_seconds(); ips_ffdc_reset(ha, IPS_INTR_IORL); if (!ips_read_config(ha, IPS_INTR_IORL)) { @@ -2552,12 +2547,9 @@ ips_next(ips_ha_t * ha, int intr) if ((ha->subsys->param[3] & 0x300000) && (ha->scb_activelist.count == 0)) { - struct timeval tv; - - do_gettimeofday(&tv); - - if (tv.tv_sec - ha->last_ffdc > IPS_SECS_8HOURS) { - ha->last_ffdc = tv.tv_sec; + time64_t now = ktime_get_real_seconds(); + if (now - ha->last_ffdc > IPS_SECS_8HOURS) { + ha->last_ffdc = now; ips_ffdc_time(ha); } } @@ -5992,59 +5984,21 @@ ips_ffdc_time(ips_ha_t * ha) /* */ /****************************************************************************/ static void -ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time_t current_time) +ips_fix_ffdc_time(ips_ha_t * ha, ips_scb_t * scb, time64_t current_time) { - long days; - long rem; - int i; - int year; - int yleap; - int year_lengths[2] = { IPS_DAYS_NORMAL_YEAR, IPS_DAYS_LEAP_YEAR }; - int month_lengths[12][2] = { {31, 31}, - {28, 29}, - {31, 31}, - {30, 30}, - {31, 31}, - {30, 30}, - {31, 31}, - {31, 31}, - {30, 30}, - {31, 31}, - {30, 30}, - {31, 31} - }; + struct tm tm; METHOD_TRACE("ips_fix_ffdc_time", 1); - days = current_time / IPS_SECS_DAY; - rem = current_time % IPS_SECS_DAY; - - scb->cmd.ffdc.hour = (rem / IPS_SECS_HOUR); - rem = rem % IPS_SECS_HOUR; - scb->cmd.ffdc.minute = (rem / IPS_SECS_MIN); - scb->cmd.ffdc.second = (rem % IPS_SECS_MIN); - - year = IPS_EPOCH_YEAR; - while (days < 0 || days >= year_lengths[yleap = IPS_IS_LEAP_YEAR(year)]) { - int newy; - - newy = year + (days / IPS_DAYS_NORMAL_YEAR); - if (days < 0) - --newy; - days -= (newy - year) * IPS_DAYS_NORMAL_YEAR + - IPS_NUM_LEAP_YEARS_THROUGH(newy - 1) - - IPS_NUM_LEAP_YEARS_THROUGH(year - 1); - year = newy; - } - - scb->cmd.ffdc.yearH = year / 100; - scb->cmd.ffdc.yearL = year % 100; - - for (i = 0; days >= month_lengths[i][yleap]; ++i) - days -= month_lengths[i][yleap]; + time64_to_tm(current_time, 0, &tm); - scb->cmd.ffdc.month = i + 1; - scb->cmd.ffdc.day = days + 1; + scb->cmd.ffdc.hour = tm.tm_hour; + scb->cmd.ffdc.minute = tm.tm_min; + scb->cmd.ffdc.second = tm.tm_sec; + scb->cmd.ffdc.yearH = tm.tm_year / 100 + 1900; + scb->cmd.ffdc.yearL = tm.tm_year % 100; + scb->cmd.ffdc.month = tm.tm_mon + 1; + scb->cmd.ffdc.day = tm.tm_mday; } /**************************************************************************** diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h index 366be3b2f9b4..b43a1ae75660 100644 --- a/drivers/scsi/ips.h +++ b/drivers/scsi/ips.h @@ -1054,7 +1054,7 @@ typedef struct ips_ha { uint8_t active; int ioctl_reset; /* IOCTL Requested Reset Flag */ uint16_t reset_count; /* number of resets */ - time_t last_ffdc; /* last time we sent ffdc info*/ + time64_t last_ffdc; /* last time we sent ffdc info*/ uint8_t slot_num; /* PCI Slot Number */ int ioctl_len; /* size of ioctl buffer */ dma_addr_t ioctl_busaddr; /* dma address of ioctl buffer*/