]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/misc/mei/hbm.c
Merge tag 'char-misc-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[mirror_ubuntu-hirsute-kernel.git] / drivers / misc / mei / hbm.c
index e7b7aad0999bc665e01da3c94b75ee91caa86c31..5e305d2605f30079bcb6f7193b28c812683ee92f 100644 (file)
@@ -301,7 +301,10 @@ static int mei_hbm_enum_clients_req(struct mei_device *dev)
        enum_req = (struct hbm_host_enum_request *)dev->wr_msg.data;
        memset(enum_req, 0, len);
        enum_req->hbm_cmd = HOST_ENUM_REQ_CMD;
-       enum_req->allow_add = dev->hbm_f_dc_supported;
+       enum_req->flags |= dev->hbm_f_dc_supported ?
+                          MEI_HBM_ENUM_F_ALLOW_ADD : 0;
+       enum_req->flags |= dev->hbm_f_ie_supported ?
+                          MEI_HBM_ENUM_F_IMMEDIATE_ENUM : 0;
 
        ret = mei_write_message(dev, mei_hdr, dev->wr_msg.data);
        if (ret) {
@@ -401,6 +404,9 @@ static int mei_hbm_fw_add_cl_req(struct mei_device *dev,
        if (ret)
                status = !MEI_HBMS_SUCCESS;
 
+       if (dev->dev_state == MEI_DEV_ENABLED)
+               schedule_work(&dev->bus_rescan_work);
+
        return mei_hbm_add_cl_resp(dev, req->me_addr, status);
 }
 
@@ -543,7 +549,7 @@ static int mei_hbm_prop_req(struct mei_device *dev)
        /* We got all client properties */
        if (next_client_index == MEI_CLIENTS_MAX) {
                dev->hbm_state = MEI_HBM_STARTED;
-               schedule_work(&dev->init_work);
+               mei_host_client_init(dev);
 
                return 0;
        }
@@ -789,8 +795,11 @@ static void mei_hbm_cl_connect_res(struct mei_device *dev, struct mei_cl *cl,
                cl->state = MEI_FILE_CONNECTED;
        else {
                cl->state = MEI_FILE_DISCONNECT_REPLY;
-               if (rs->status == MEI_CL_CONN_NOT_FOUND)
+               if (rs->status == MEI_CL_CONN_NOT_FOUND) {
                        mei_me_cl_del(dev, cl->me_cl);
+                       if (dev->dev_state == MEI_DEV_ENABLED)
+                               schedule_work(&dev->bus_rescan_work);
+               }
        }
        cl->status = mei_cl_conn_status_to_errno(rs->status);
 }
@@ -866,7 +875,7 @@ static int mei_hbm_fw_disconnect_req(struct mei_device *dev,
 
        cl = mei_hbm_cl_find_by_cmd(dev, disconnect_req);
        if (cl) {
-               cl_dbg(dev, cl, "fw disconnect request received\n");
+               cl_warn(dev, cl, "fw disconnect request received\n");
                cl->state = MEI_FILE_DISCONNECTING;
                cl->timer_count = 0;
 
@@ -972,6 +981,9 @@ static void mei_hbm_config_features(struct mei_device *dev)
        if (dev->version.major_version >= HBM_MAJOR_VERSION_DC)
                dev->hbm_f_dc_supported = 1;
 
+       if (dev->version.major_version >= HBM_MAJOR_VERSION_IE)
+               dev->hbm_f_ie_supported = 1;
+
        /* disconnect on connect timeout instead of link reset */
        if (dev->version.major_version >= HBM_MAJOR_VERSION_DOT)
                dev->hbm_f_dot_supported = 1;
@@ -979,6 +991,10 @@ static void mei_hbm_config_features(struct mei_device *dev)
        /* Notification Event Support */
        if (dev->version.major_version >= HBM_MAJOR_VERSION_EV)
                dev->hbm_f_ev_supported = 1;
+
+       /* Fixed Address Client Support */
+       if (dev->version.major_version >= HBM_MAJOR_VERSION_FA)
+               dev->hbm_f_fa_supported = 1;
 }
 
 /**