]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
Merge tag 'fsi-for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Jul 2019 07:21:25 +0000 (09:21 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Jul 2019 07:21:25 +0000 (09:21 +0200)
Joel writes:

FSI changes for 5.3

 - Add MAINTAINERS entry. There is now a git tree and a mailing
 list/patchwork for collecting FSI patches

 - Bug fix for error driver registration error paths

 - Correction for the OCC hwmon driver to meet the spec

* tag 'fsi-for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi:
  fsi/core: Fix error paths on CFAM init
  OCC: FSI and hwmon: Add sequence numbering
  MAINTAINERS: Add FSI subsystem

MAINTAINERS
drivers/fsi/fsi-core.c
drivers/fsi/fsi-occ.c
drivers/hwmon/occ/common.c
drivers/hwmon/occ/common.h

index 2527739a76844591fcf8d129276199ca954b2d67..59e6670c95766ab934e69645d95186745976dce9 100644 (file)
@@ -6488,6 +6488,19 @@ F:       fs/crypto/
 F:     include/linux/fscrypt*.h
 F:     Documentation/filesystems/fscrypt.rst
 
+FSI SUBSYSTEM
+M:     Jeremy Kerr <jk@ozlabs.org>
+M:     Joel Stanley <joel@jms.id.au>
+R:     Alistar Popple <alistair@popple.id.au>
+R:     Eddie James <eajames@linux.ibm.com>
+L:     linux-fsi@lists.ozlabs.org
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi.git
+Q:     http://patchwork.ozlabs.org/project/linux-fsi/list/
+S:     Supported
+F:     drivers/fsi/
+F:     include/linux/fsi*.h
+F:     include/trace/events/fsi*.h
+
 FSI-ATTACHED I2C DRIVER
 M:     Eddie James <eajames@linux.ibm.com>
 L:     linux-i2c@vger.kernel.org
index 1d83f3ba478b961426415acb10b99487a165ca83..1f76740f33b6fc21b11534cb79216ce8cffbe9a4 100644 (file)
@@ -1029,6 +1029,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
 
        }
 
+       rc = fsi_slave_set_smode(slave);
+       if (rc) {
+               dev_warn(&master->dev,
+                               "can't set smode on slave:%02x:%02x %d\n",
+                               link, id, rc);
+               goto err_free;
+       }
+
        /* Allocate a minor in the FSI space */
        rc = __fsi_get_new_minor(slave, fsi_dev_cfam, &slave->dev.devt,
                                 &slave->cdev_idx);
@@ -1040,17 +1048,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
        rc = cdev_device_add(&slave->cdev, &slave->dev);
        if (rc) {
                dev_err(&slave->dev, "Error %d creating slave device\n", rc);
-               goto err_free;
+               goto err_free_ida;
        }
 
-       rc = fsi_slave_set_smode(slave);
-       if (rc) {
-               dev_warn(&master->dev,
-                               "can't set smode on slave:%02x:%02x %d\n",
-                               link, id, rc);
-               kfree(slave);
-               return -ENODEV;
-       }
+       /* Now that we have the cdev registered with the core, any fatal
+        * failures beyond this point will need to clean up through
+        * cdev_device_del(). Fortunately though, nothing past here is fatal.
+        */
+
        if (master->link_config)
                master->link_config(master, link,
                                    slave->t_send_delay,
@@ -1067,10 +1072,13 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
                dev_dbg(&master->dev, "failed during slave scan with: %d\n",
                                rc);
 
-       return rc;
+       return 0;
 
- err_free:
-       put_device(&slave->dev);
+err_free_ida:
+       fsi_free_minor(slave->dev.devt);
+err_free:
+       of_node_put(slave->dev.of_node);
+       kfree(slave);
        return rc;
 }
 
index a2301cea1cbb4fb4aefcb15275d1a6e332c4148e..7da9c81759ac044340084ddda74626468c24dd5a 100644 (file)
@@ -412,6 +412,7 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
                msecs_to_jiffies(OCC_CMD_IN_PRG_WAIT_MS);
        struct occ *occ = dev_get_drvdata(dev);
        struct occ_response *resp = response;
+       u8 seq_no;
        u16 resp_data_length;
        unsigned long start;
        int rc;
@@ -426,6 +427,8 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
 
        mutex_lock(&occ->occ_lock);
 
+       /* Extract the seq_no from the command (first byte) */
+       seq_no = *(const u8 *)request;
        rc = occ_putsram(occ, OCC_SRAM_CMD_ADDR, request, req_len);
        if (rc)
                goto done;
@@ -441,11 +444,17 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
                if (rc)
                        goto done;
 
-               if (resp->return_status == OCC_RESP_CMD_IN_PRG) {
+               if (resp->return_status == OCC_RESP_CMD_IN_PRG ||
+                   resp->seq_no != seq_no) {
                        rc = -ETIMEDOUT;
 
-                       if (time_after(jiffies, start + timeout))
-                               break;
+                       if (time_after(jiffies, start + timeout)) {
+                               dev_err(occ->dev, "resp timeout status=%02x "
+                                       "resp seq_no=%d our seq_no=%d\n",
+                                       resp->return_status, resp->seq_no,
+                                       seq_no);
+                               goto done;
+                       }
 
                        set_current_state(TASK_UNINTERRUPTIBLE);
                        schedule_timeout(wait_time);
index 13a6290c8d2548a7db45e19be1e6fb1f771ec5b2..cccf91742c1af2923daffbdb4bd298dcbe3d6c94 100644 (file)
@@ -124,12 +124,12 @@ struct extended_sensor {
 static int occ_poll(struct occ *occ)
 {
        int rc;
-       u16 checksum = occ->poll_cmd_data + 1;
+       u16 checksum = occ->poll_cmd_data + occ->seq_no + 1;
        u8 cmd[8];
        struct occ_poll_response_header *header;
 
        /* big endian */
-       cmd[0] = 0;                     /* sequence number */
+       cmd[0] = occ->seq_no++;         /* sequence number */
        cmd[1] = 0;                     /* cmd type */
        cmd[2] = 0;                     /* data length msb */
        cmd[3] = 1;                     /* data length lsb */
index fc13f3c73c47fb5da042460e23793cbaad925613..67e6968b8978ee720fd0356203746754977dc728 100644 (file)
@@ -95,6 +95,7 @@ struct occ {
        struct occ_sensors sensors;
 
        int powr_sample_time_us;        /* average power sample time */
+       u8 seq_no;
        u8 poll_cmd_data;               /* to perform OCC poll command */
        int (*send_cmd)(struct occ *occ, u8 *cmd);