forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.5 KiB
106 lines
2.5 KiB
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* Initialization protocol for ISHTP driver |
|
* |
|
* Copyright (c) 2003-2016, Intel Corporation. |
|
*/ |
|
|
|
#include <linux/export.h> |
|
#include <linux/slab.h> |
|
#include <linux/sched.h> |
|
#include "ishtp-dev.h" |
|
#include "hbm.h" |
|
#include "client.h" |
|
|
|
/** |
|
* ishtp_dev_state_str() -Convert to string format |
|
* @state: state to convert |
|
* |
|
* Convert state to string for prints |
|
* |
|
* Return: character pointer to converted string |
|
*/ |
|
const char *ishtp_dev_state_str(int state) |
|
{ |
|
switch (state) { |
|
case ISHTP_DEV_INITIALIZING: |
|
return "INITIALIZING"; |
|
case ISHTP_DEV_INIT_CLIENTS: |
|
return "INIT_CLIENTS"; |
|
case ISHTP_DEV_ENABLED: |
|
return "ENABLED"; |
|
case ISHTP_DEV_RESETTING: |
|
return "RESETTING"; |
|
case ISHTP_DEV_DISABLED: |
|
return "DISABLED"; |
|
case ISHTP_DEV_POWER_DOWN: |
|
return "POWER_DOWN"; |
|
case ISHTP_DEV_POWER_UP: |
|
return "POWER_UP"; |
|
default: |
|
return "unknown"; |
|
} |
|
} |
|
|
|
/** |
|
* ishtp_device_init() - ishtp device init |
|
* @dev: ISHTP device instance |
|
* |
|
* After ISHTP device is alloacted, this function is used to initialize |
|
* each field which includes spin lock, work struct and lists |
|
*/ |
|
void ishtp_device_init(struct ishtp_device *dev) |
|
{ |
|
dev->dev_state = ISHTP_DEV_INITIALIZING; |
|
INIT_LIST_HEAD(&dev->cl_list); |
|
INIT_LIST_HEAD(&dev->device_list); |
|
dev->rd_msg_fifo_head = 0; |
|
dev->rd_msg_fifo_tail = 0; |
|
spin_lock_init(&dev->rd_msg_spinlock); |
|
|
|
init_waitqueue_head(&dev->wait_hbm_recvd_msg); |
|
spin_lock_init(&dev->read_list_spinlock); |
|
spin_lock_init(&dev->device_lock); |
|
spin_lock_init(&dev->device_list_lock); |
|
spin_lock_init(&dev->cl_list_lock); |
|
spin_lock_init(&dev->fw_clients_lock); |
|
INIT_WORK(&dev->bh_hbm_work, bh_hbm_work_fn); |
|
|
|
bitmap_zero(dev->host_clients_map, ISHTP_CLIENTS_MAX); |
|
dev->open_handle_count = 0; |
|
|
|
/* |
|
* Reserving client ID 0 for ISHTP Bus Message communications |
|
*/ |
|
bitmap_set(dev->host_clients_map, 0, 1); |
|
|
|
INIT_LIST_HEAD(&dev->read_list.list); |
|
|
|
} |
|
EXPORT_SYMBOL(ishtp_device_init); |
|
|
|
/** |
|
* ishtp_start() - Start ISH processing |
|
* @dev: ISHTP device instance |
|
* |
|
* Start ISHTP processing by sending query subscriber message |
|
* |
|
* Return: 0 on success else -ENODEV |
|
*/ |
|
int ishtp_start(struct ishtp_device *dev) |
|
{ |
|
if (ishtp_hbm_start_wait(dev)) { |
|
dev_err(dev->devc, "HBM haven't started"); |
|
goto err; |
|
} |
|
|
|
/* suspend & resume notification - send QUERY_SUBSCRIBERS msg */ |
|
ishtp_query_subscribers(dev); |
|
|
|
return 0; |
|
err: |
|
dev_err(dev->devc, "link layer initialization failed.\n"); |
|
dev->dev_state = ISHTP_DEV_DISABLED; |
|
return -ENODEV; |
|
} |
|
EXPORT_SYMBOL(ishtp_start);
|
|
|