ALSA: asihpi: Simplify driver unload cleanup
Replacing subsys_delete_adapter with adapter_delete allows some special-case adapter lookup code to be removed. Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
b0096a6567
commit
6d0b898e9c
6 changed files with 114 additions and 127 deletions
|
@ -200,8 +200,8 @@ static void hpi_read_block(struct dsp_obj *pdo, u32 address, u32 *pdata,
|
||||||
static void subsys_create_adapter(struct hpi_message *phm,
|
static void subsys_create_adapter(struct hpi_message *phm,
|
||||||
struct hpi_response *phr);
|
struct hpi_response *phr);
|
||||||
|
|
||||||
static void subsys_delete_adapter(struct hpi_message *phm,
|
static void adapter_delete(struct hpi_adapter_obj *pao,
|
||||||
struct hpi_response *phr);
|
struct hpi_message *phm, struct hpi_response *phr);
|
||||||
|
|
||||||
static void adapter_get_asserts(struct hpi_adapter_obj *pao,
|
static void adapter_get_asserts(struct hpi_adapter_obj *pao,
|
||||||
struct hpi_message *phm, struct hpi_response *phr);
|
struct hpi_message *phm, struct hpi_response *phr);
|
||||||
|
@ -222,9 +222,6 @@ static void subsys_message(struct hpi_message *phm, struct hpi_response *phr)
|
||||||
case HPI_SUBSYS_CREATE_ADAPTER:
|
case HPI_SUBSYS_CREATE_ADAPTER:
|
||||||
subsys_create_adapter(phm, phr);
|
subsys_create_adapter(phm, phr);
|
||||||
break;
|
break;
|
||||||
case HPI_SUBSYS_DELETE_ADAPTER:
|
|
||||||
subsys_delete_adapter(phm, phr);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
phr->error = HPI_ERROR_INVALID_FUNC;
|
phr->error = HPI_ERROR_INVALID_FUNC;
|
||||||
break;
|
break;
|
||||||
|
@ -279,6 +276,10 @@ static void adapter_message(struct hpi_adapter_obj *pao,
|
||||||
adapter_get_asserts(pao, phm, phr);
|
adapter_get_asserts(pao, phm, phr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HPI_ADAPTER_DELETE:
|
||||||
|
adapter_delete(pao, phm, phr);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
hw_message(pao, phm, phr);
|
hw_message(pao, phm, phr);
|
||||||
break;
|
break;
|
||||||
|
@ -333,26 +334,22 @@ void HPI_6000(struct hpi_message *phm, struct hpi_response *phr)
|
||||||
{
|
{
|
||||||
struct hpi_adapter_obj *pao = NULL;
|
struct hpi_adapter_obj *pao = NULL;
|
||||||
|
|
||||||
/* subsytem messages get executed by every HPI. */
|
|
||||||
/* All other messages are ignored unless the adapter index matches */
|
|
||||||
/* an adapter in the HPI */
|
|
||||||
/*HPI_DEBUG_LOG(DEBUG, "O %d,F %x\n", phm->wObject, phm->wFunction); */
|
|
||||||
|
|
||||||
/* if Dsp has crashed then do not communicate with it any more */
|
|
||||||
if (phm->object != HPI_OBJ_SUBSYSTEM) {
|
if (phm->object != HPI_OBJ_SUBSYSTEM) {
|
||||||
pao = hpi_find_adapter(phm->adapter_index);
|
pao = hpi_find_adapter(phm->adapter_index);
|
||||||
if (!pao) {
|
if (!pao) {
|
||||||
HPI_DEBUG_LOG(DEBUG,
|
hpi_init_response(phr, phm->object, phm->function,
|
||||||
" %d,%d refused, for another HPI?\n",
|
HPI_ERROR_BAD_ADAPTER_NUMBER);
|
||||||
phm->object, phm->function);
|
HPI_DEBUG_LOG(DEBUG, "invalid adapter index: %d \n",
|
||||||
|
phm->adapter_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Don't even try to communicate with crashed DSP */
|
||||||
if (pao->dsp_crashed >= 10) {
|
if (pao->dsp_crashed >= 10) {
|
||||||
hpi_init_response(phr, phm->object, phm->function,
|
hpi_init_response(phr, phm->object, phm->function,
|
||||||
HPI_ERROR_DSP_HARDWARE);
|
HPI_ERROR_DSP_HARDWARE);
|
||||||
HPI_DEBUG_LOG(DEBUG, " %d,%d dsp crashed.\n",
|
HPI_DEBUG_LOG(DEBUG, "adapter %d dsp crashed\n",
|
||||||
phm->object, phm->function);
|
phm->adapter_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -463,15 +460,9 @@ static void subsys_create_adapter(struct hpi_message *phm,
|
||||||
phr->error = 0;
|
phr->error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subsys_delete_adapter(struct hpi_message *phm,
|
static void adapter_delete(struct hpi_adapter_obj *pao,
|
||||||
struct hpi_response *phr)
|
struct hpi_message *phm, struct hpi_response *phr)
|
||||||
{
|
{
|
||||||
struct hpi_adapter_obj *pao = NULL;
|
|
||||||
|
|
||||||
pao = hpi_find_adapter(phm->obj_index);
|
|
||||||
if (!pao)
|
|
||||||
return;
|
|
||||||
|
|
||||||
delete_adapter_obj(pao);
|
delete_adapter_obj(pao);
|
||||||
hpi_delete_adapter(pao);
|
hpi_delete_adapter(pao);
|
||||||
phr->error = 0;
|
phr->error = 0;
|
||||||
|
|
|
@ -152,8 +152,8 @@ static void hw_message(struct hpi_adapter_obj *pao, struct hpi_message *phm,
|
||||||
|
|
||||||
static void subsys_create_adapter(struct hpi_message *phm,
|
static void subsys_create_adapter(struct hpi_message *phm,
|
||||||
struct hpi_response *phr);
|
struct hpi_response *phr);
|
||||||
static void subsys_delete_adapter(struct hpi_message *phm,
|
static void adapter_delete(struct hpi_adapter_obj *pao,
|
||||||
struct hpi_response *phr);
|
struct hpi_message *phm, struct hpi_response *phr);
|
||||||
|
|
||||||
static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||||
u32 *pos_error_code);
|
u32 *pos_error_code);
|
||||||
|
@ -223,15 +223,13 @@ static u16 boot_loader_test_pld(struct hpi_adapter_obj *pao, int dsp_index);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void subsys_message(struct hpi_message *phm, struct hpi_response *phr)
|
static void subsys_message(struct hpi_adapter_obj *pao,
|
||||||
|
struct hpi_message *phm, struct hpi_response *phr)
|
||||||
{
|
{
|
||||||
switch (phm->function) {
|
switch (phm->function) {
|
||||||
case HPI_SUBSYS_CREATE_ADAPTER:
|
case HPI_SUBSYS_CREATE_ADAPTER:
|
||||||
subsys_create_adapter(phm, phr);
|
subsys_create_adapter(phm, phr);
|
||||||
break;
|
break;
|
||||||
case HPI_SUBSYS_DELETE_ADAPTER:
|
|
||||||
subsys_delete_adapter(phm, phr);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
phr->error = HPI_ERROR_INVALID_FUNC;
|
phr->error = HPI_ERROR_INVALID_FUNC;
|
||||||
break;
|
break;
|
||||||
|
@ -279,6 +277,10 @@ static void adapter_message(struct hpi_adapter_obj *pao,
|
||||||
struct hpi_message *phm, struct hpi_response *phr)
|
struct hpi_message *phm, struct hpi_response *phr)
|
||||||
{
|
{
|
||||||
switch (phm->function) {
|
switch (phm->function) {
|
||||||
|
case HPI_ADAPTER_DELETE:
|
||||||
|
adapter_delete(pao, phm, phr);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
hw_message(pao, phm, phr);
|
hw_message(pao, phm, phr);
|
||||||
break;
|
break;
|
||||||
|
@ -371,37 +373,18 @@ static void instream_message(struct hpi_adapter_obj *pao,
|
||||||
/** Entry point to this HPI backend
|
/** Entry point to this HPI backend
|
||||||
* All calls to the HPI start here
|
* All calls to the HPI start here
|
||||||
*/
|
*/
|
||||||
void HPI_6205(struct hpi_message *phm, struct hpi_response *phr)
|
void _HPI_6205(struct hpi_adapter_obj *pao, struct hpi_message *phm,
|
||||||
|
struct hpi_response *phr)
|
||||||
{
|
{
|
||||||
struct hpi_adapter_obj *pao = NULL;
|
if (pao && (pao->dsp_crashed >= 10)
|
||||||
|
|
||||||
/* subsytem messages are processed by every HPI.
|
|
||||||
* All other messages are ignored unless the adapter index matches
|
|
||||||
* an adapter in the HPI
|
|
||||||
*/
|
|
||||||
/* HPI_DEBUG_LOG(DEBUG, "HPI Obj=%d, Func=%d\n", phm->wObject,
|
|
||||||
phm->wFunction); */
|
|
||||||
|
|
||||||
/* if Dsp has crashed then do not communicate with it any more */
|
|
||||||
if (phm->object != HPI_OBJ_SUBSYSTEM) {
|
|
||||||
pao = hpi_find_adapter(phm->adapter_index);
|
|
||||||
if (!pao) {
|
|
||||||
HPI_DEBUG_LOG(DEBUG,
|
|
||||||
" %d,%d refused, for another HPI?\n",
|
|
||||||
phm->object, phm->function);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((pao->dsp_crashed >= 10)
|
|
||||||
&& (phm->function != HPI_ADAPTER_DEBUG_READ)) {
|
&& (phm->function != HPI_ADAPTER_DEBUG_READ)) {
|
||||||
/* allow last resort debug read even after crash */
|
/* allow last resort debug read even after crash */
|
||||||
hpi_init_response(phr, phm->object, phm->function,
|
hpi_init_response(phr, phm->object, phm->function,
|
||||||
HPI_ERROR_DSP_HARDWARE);
|
HPI_ERROR_DSP_HARDWARE);
|
||||||
HPI_DEBUG_LOG(WARNING, " %d,%d dsp crashed.\n",
|
HPI_DEBUG_LOG(WARNING, " %d,%d dsp crashed.\n", phm->object,
|
||||||
phm->object, phm->function);
|
phm->function);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Init default response */
|
/* Init default response */
|
||||||
if (phm->function != HPI_SUBSYS_CREATE_ADAPTER)
|
if (phm->function != HPI_SUBSYS_CREATE_ADAPTER)
|
||||||
|
@ -412,7 +395,7 @@ void HPI_6205(struct hpi_message *phm, struct hpi_response *phr)
|
||||||
case HPI_TYPE_MESSAGE:
|
case HPI_TYPE_MESSAGE:
|
||||||
switch (phm->object) {
|
switch (phm->object) {
|
||||||
case HPI_OBJ_SUBSYSTEM:
|
case HPI_OBJ_SUBSYSTEM:
|
||||||
subsys_message(phm, phr);
|
subsys_message(pao, phm, phr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HPI_OBJ_ADAPTER:
|
case HPI_OBJ_ADAPTER:
|
||||||
|
@ -444,6 +427,26 @@ void HPI_6205(struct hpi_message *phm, struct hpi_response *phr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HPI_6205(struct hpi_message *phm, struct hpi_response *phr)
|
||||||
|
{
|
||||||
|
struct hpi_adapter_obj *pao = NULL;
|
||||||
|
|
||||||
|
if (phm->object != HPI_OBJ_SUBSYSTEM) {
|
||||||
|
/* normal messages must have valid adapter index */
|
||||||
|
pao = hpi_find_adapter(phm->adapter_index);
|
||||||
|
} else {
|
||||||
|
/* subsys messages don't address an adapter */
|
||||||
|
_HPI_6205(NULL, phm, phr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pao)
|
||||||
|
_HPI_6205(pao, phm, phr);
|
||||||
|
else
|
||||||
|
hpi_init_response(phr, phm->object, phm->function,
|
||||||
|
HPI_ERROR_BAD_ADAPTER_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* SUBSYSTEM */
|
/* SUBSYSTEM */
|
||||||
|
|
||||||
|
@ -491,13 +494,11 @@ static void subsys_create_adapter(struct hpi_message *phm,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** delete an adapter - required by WDM driver */
|
/** delete an adapter - required by WDM driver */
|
||||||
static void subsys_delete_adapter(struct hpi_message *phm,
|
static void adapter_delete(struct hpi_adapter_obj *pao,
|
||||||
struct hpi_response *phr)
|
struct hpi_message *phm, struct hpi_response *phr)
|
||||||
{
|
{
|
||||||
struct hpi_adapter_obj *pao;
|
|
||||||
struct hpi_hw_obj *phw;
|
struct hpi_hw_obj *phw;
|
||||||
|
|
||||||
pao = hpi_find_adapter(phm->obj_index);
|
|
||||||
if (!pao) {
|
if (!pao) {
|
||||||
phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
|
phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
|
||||||
return;
|
return;
|
||||||
|
@ -563,11 +564,12 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = adapter_boot_load_dsp(pao, pos_error_code);
|
err = adapter_boot_load_dsp(pao, pos_error_code);
|
||||||
if (err)
|
if (err) {
|
||||||
|
HPI_DEBUG_LOG(ERROR, "DSP code load failed\n");
|
||||||
/* no need to clean up as SubSysCreateAdapter */
|
/* no need to clean up as SubSysCreateAdapter */
|
||||||
/* calls DeleteAdapter on error. */
|
/* calls DeleteAdapter on error. */
|
||||||
return err;
|
return err;
|
||||||
|
}
|
||||||
HPI_DEBUG_LOG(INFO, "load DSP code OK\n");
|
HPI_DEBUG_LOG(INFO, "load DSP code OK\n");
|
||||||
|
|
||||||
/* allow boot load even if mem alloc wont work */
|
/* allow boot load even if mem alloc wont work */
|
||||||
|
@ -604,6 +606,7 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||||
control_cache.number_of_controls,
|
control_cache.number_of_controls,
|
||||||
interface->control_cache.size_in_bytes,
|
interface->control_cache.size_in_bytes,
|
||||||
p_control_cache_virtual);
|
p_control_cache_virtual);
|
||||||
|
|
||||||
if (!phw->p_cache)
|
if (!phw->p_cache)
|
||||||
err = HPI_ERROR_MEMORY_ALLOC;
|
err = HPI_ERROR_MEMORY_ALLOC;
|
||||||
}
|
}
|
||||||
|
@ -675,16 +678,14 @@ static u16 create_adapter_obj(struct hpi_adapter_obj *pao,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Free memory areas allocated by adapter
|
/** Free memory areas allocated by adapter
|
||||||
* this routine is called from SubSysDeleteAdapter,
|
* this routine is called from AdapterDelete,
|
||||||
* and SubSysCreateAdapter if duplicate index
|
* and SubSysCreateAdapter if duplicate index
|
||||||
*/
|
*/
|
||||||
static void delete_adapter_obj(struct hpi_adapter_obj *pao)
|
static void delete_adapter_obj(struct hpi_adapter_obj *pao)
|
||||||
{
|
{
|
||||||
struct hpi_hw_obj *phw;
|
struct hpi_hw_obj *phw = pao->priv;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
phw = pao->priv;
|
|
||||||
|
|
||||||
if (hpios_locked_mem_valid(&phw->h_control_cache)) {
|
if (hpios_locked_mem_valid(&phw->h_control_cache)) {
|
||||||
hpios_locked_mem_free(&phw->h_control_cache);
|
hpios_locked_mem_free(&phw->h_control_cache);
|
||||||
hpi_free_control_cache(phw->p_cache);
|
hpi_free_control_cache(phw->p_cache);
|
||||||
|
@ -1275,6 +1276,7 @@ static u16 adapter_boot_load_dsp(struct hpi_adapter_obj *pao,
|
||||||
case HPI_ADAPTER_FAMILY_ASI(0x6300):
|
case HPI_ADAPTER_FAMILY_ASI(0x6300):
|
||||||
boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x6400);
|
boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x6400);
|
||||||
break;
|
break;
|
||||||
|
case HPI_ADAPTER_FAMILY_ASI(0x5500):
|
||||||
case HPI_ADAPTER_FAMILY_ASI(0x5600):
|
case HPI_ADAPTER_FAMILY_ASI(0x5600):
|
||||||
case HPI_ADAPTER_FAMILY_ASI(0x6500):
|
case HPI_ADAPTER_FAMILY_ASI(0x6500):
|
||||||
boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x6600);
|
boot_code_id[1] = HPI_ADAPTER_FAMILY_ASI(0x6600);
|
||||||
|
@ -2059,7 +2061,6 @@ static int wait_dsp_ack(struct hpi_hw_obj *phw, int state, int timeout_us)
|
||||||
static void send_dsp_command(struct hpi_hw_obj *phw, int cmd)
|
static void send_dsp_command(struct hpi_hw_obj *phw, int cmd)
|
||||||
{
|
{
|
||||||
struct bus_master_interface *interface = phw->p_interface_buffer;
|
struct bus_master_interface *interface = phw->p_interface_buffer;
|
||||||
|
|
||||||
u32 r;
|
u32 r;
|
||||||
|
|
||||||
interface->host_cmd = cmd;
|
interface->host_cmd = cmd;
|
||||||
|
@ -2088,7 +2089,7 @@ static u16 message_response_sequence(struct hpi_adapter_obj *pao,
|
||||||
phr->specific_error = sizeof(interface->u);
|
phr->specific_error = sizeof(interface->u);
|
||||||
phr->size = sizeof(struct hpi_response_header);
|
phr->size = sizeof(struct hpi_response_header);
|
||||||
HPI_DEBUG_LOG(ERROR,
|
HPI_DEBUG_LOG(ERROR,
|
||||||
"message len %d too big for buffer %zd \n", phm->size,
|
"message len %d too big for buffer %ld \n", phm->size,
|
||||||
sizeof(interface->u));
|
sizeof(interface->u));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,7 +294,7 @@ enum HPI_CONTROL_ATTRIBUTES {
|
||||||
|
|
||||||
/* These defines are used to fill in protocol information for an Ethernet packet
|
/* These defines are used to fill in protocol information for an Ethernet packet
|
||||||
sent using HMI on CS18102 */
|
sent using HMI on CS18102 */
|
||||||
/** ID supplied by Cirrius for ASI packets. */
|
/** ID supplied by Cirrus for ASI packets. */
|
||||||
#define HPI_ETHERNET_PACKET_ID 0x85
|
#define HPI_ETHERNET_PACKET_ID 0x85
|
||||||
/** Simple packet - no special routing required */
|
/** Simple packet - no special routing required */
|
||||||
#define HPI_ETHERNET_PACKET_V1 0x01
|
#define HPI_ETHERNET_PACKET_V1 0x01
|
||||||
|
@ -307,7 +307,7 @@ enum HPI_CONTROL_ATTRIBUTES {
|
||||||
/** This packet must make its way to the host across the HPI interface */
|
/** This packet must make its way to the host across the HPI interface */
|
||||||
#define HPI_ETHERNET_PACKET_HOSTED_VIA_HPI_V1 0x41
|
#define HPI_ETHERNET_PACKET_HOSTED_VIA_HPI_V1 0x41
|
||||||
|
|
||||||
#define HPI_ETHERNET_UDP_PORT (44600) /*!< UDP messaging port */
|
#define HPI_ETHERNET_UDP_PORT 44600 /**< HPI UDP service */
|
||||||
|
|
||||||
/** Default network timeout in milli-seconds. */
|
/** Default network timeout in milli-seconds. */
|
||||||
#define HPI_ETHERNET_TIMEOUT_MS 500
|
#define HPI_ETHERNET_TIMEOUT_MS 500
|
||||||
|
@ -397,14 +397,14 @@ enum HPI_FUNCTION_IDS {
|
||||||
HPI_SUBSYS_OPEN = HPI_FUNC_ID(SUBSYSTEM, 1),
|
HPI_SUBSYS_OPEN = HPI_FUNC_ID(SUBSYSTEM, 1),
|
||||||
HPI_SUBSYS_GET_VERSION = HPI_FUNC_ID(SUBSYSTEM, 2),
|
HPI_SUBSYS_GET_VERSION = HPI_FUNC_ID(SUBSYSTEM, 2),
|
||||||
HPI_SUBSYS_GET_INFO = HPI_FUNC_ID(SUBSYSTEM, 3),
|
HPI_SUBSYS_GET_INFO = HPI_FUNC_ID(SUBSYSTEM, 3),
|
||||||
HPI_SUBSYS_FIND_ADAPTERS = HPI_FUNC_ID(SUBSYSTEM, 4),
|
/* HPI_SUBSYS_FIND_ADAPTERS = HPI_FUNC_ID(SUBSYSTEM, 4), */
|
||||||
HPI_SUBSYS_CREATE_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 5),
|
HPI_SUBSYS_CREATE_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 5),
|
||||||
HPI_SUBSYS_CLOSE = HPI_FUNC_ID(SUBSYSTEM, 6),
|
HPI_SUBSYS_CLOSE = HPI_FUNC_ID(SUBSYSTEM, 6),
|
||||||
HPI_SUBSYS_DELETE_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 7),
|
/* HPI_SUBSYS_DELETE_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 7), */
|
||||||
HPI_SUBSYS_DRIVER_LOAD = HPI_FUNC_ID(SUBSYSTEM, 8),
|
HPI_SUBSYS_DRIVER_LOAD = HPI_FUNC_ID(SUBSYSTEM, 8),
|
||||||
HPI_SUBSYS_DRIVER_UNLOAD = HPI_FUNC_ID(SUBSYSTEM, 9),
|
HPI_SUBSYS_DRIVER_UNLOAD = HPI_FUNC_ID(SUBSYSTEM, 9),
|
||||||
HPI_SUBSYS_READ_PORT_8 = HPI_FUNC_ID(SUBSYSTEM, 10),
|
/* HPI_SUBSYS_READ_PORT_8 = HPI_FUNC_ID(SUBSYSTEM, 10), */
|
||||||
HPI_SUBSYS_WRITE_PORT_8 = HPI_FUNC_ID(SUBSYSTEM, 11),
|
/* HPI_SUBSYS_WRITE_PORT_8 = HPI_FUNC_ID(SUBSYSTEM, 11), */
|
||||||
HPI_SUBSYS_GET_NUM_ADAPTERS = HPI_FUNC_ID(SUBSYSTEM, 12),
|
HPI_SUBSYS_GET_NUM_ADAPTERS = HPI_FUNC_ID(SUBSYSTEM, 12),
|
||||||
HPI_SUBSYS_GET_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 13),
|
HPI_SUBSYS_GET_ADAPTER = HPI_FUNC_ID(SUBSYSTEM, 13),
|
||||||
HPI_SUBSYS_SET_NETWORK_INTERFACE = HPI_FUNC_ID(SUBSYSTEM, 14),
|
HPI_SUBSYS_SET_NETWORK_INTERFACE = HPI_FUNC_ID(SUBSYSTEM, 14),
|
||||||
|
@ -433,7 +433,8 @@ enum HPI_FUNCTION_IDS {
|
||||||
HPI_ADAPTER_DEBUG_READ = HPI_FUNC_ID(ADAPTER, 18),
|
HPI_ADAPTER_DEBUG_READ = HPI_FUNC_ID(ADAPTER, 18),
|
||||||
HPI_ADAPTER_IRQ_QUERY_AND_CLEAR = HPI_FUNC_ID(ADAPTER, 19),
|
HPI_ADAPTER_IRQ_QUERY_AND_CLEAR = HPI_FUNC_ID(ADAPTER, 19),
|
||||||
HPI_ADAPTER_IRQ_CALLBACK = HPI_FUNC_ID(ADAPTER, 20),
|
HPI_ADAPTER_IRQ_CALLBACK = HPI_FUNC_ID(ADAPTER, 20),
|
||||||
#define HPI_ADAPTER_FUNCTION_COUNT 20
|
HPI_ADAPTER_DELETE = HPI_FUNC_ID(ADAPTER, 21),
|
||||||
|
#define HPI_ADAPTER_FUNCTION_COUNT 21
|
||||||
|
|
||||||
HPI_OSTREAM_OPEN = HPI_FUNC_ID(OSTREAM, 1),
|
HPI_OSTREAM_OPEN = HPI_FUNC_ID(OSTREAM, 1),
|
||||||
HPI_OSTREAM_CLOSE = HPI_FUNC_ID(OSTREAM, 2),
|
HPI_OSTREAM_CLOSE = HPI_FUNC_ID(OSTREAM, 2),
|
||||||
|
@ -1561,8 +1562,6 @@ void hpi_send_recv(struct hpi_message *phm, struct hpi_response *phr);
|
||||||
u16 hpi_subsys_create_adapter(const struct hpi_resource *p_resource,
|
u16 hpi_subsys_create_adapter(const struct hpi_resource *p_resource,
|
||||||
u16 *pw_adapter_index);
|
u16 *pw_adapter_index);
|
||||||
|
|
||||||
u16 hpi_subsys_delete_adapter(u16 adapter_index);
|
|
||||||
|
|
||||||
u16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer,
|
u16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer,
|
||||||
struct hpi_hostbuffer_status **pp_status);
|
struct hpi_hostbuffer_status **pp_status);
|
||||||
|
|
||||||
|
|
|
@ -667,7 +667,6 @@ static void subsys_message(struct hpi_message *phm, struct hpi_response *phr)
|
||||||
phr->u.s.num_adapters = adapters.gw_num_adapters;
|
phr->u.s.num_adapters = adapters.gw_num_adapters;
|
||||||
break;
|
break;
|
||||||
case HPI_SUBSYS_CREATE_ADAPTER:
|
case HPI_SUBSYS_CREATE_ADAPTER:
|
||||||
case HPI_SUBSYS_DELETE_ADAPTER:
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
phr->error = HPI_ERROR_INVALID_FUNC;
|
phr->error = HPI_ERROR_INVALID_FUNC;
|
||||||
|
|
|
@ -211,24 +211,6 @@ static void subsys_message(struct hpi_message *phm, struct hpi_response *phr,
|
||||||
HPIMSGX__init(phm, phr);
|
HPIMSGX__init(phm, phr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HPI_SUBSYS_DELETE_ADAPTER:
|
|
||||||
HPIMSGX__cleanup(phm->obj_index, h_owner);
|
|
||||||
{
|
|
||||||
struct hpi_message hm;
|
|
||||||
struct hpi_response hr;
|
|
||||||
hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
|
|
||||||
HPI_ADAPTER_CLOSE);
|
|
||||||
hm.adapter_index = phm->obj_index;
|
|
||||||
hw_entry_point(&hm, &hr);
|
|
||||||
}
|
|
||||||
if ((phm->obj_index < HPI_MAX_ADAPTERS)
|
|
||||||
&& hpi_entry_points[phm->obj_index]) {
|
|
||||||
hpi_entry_points[phm->obj_index] (phm, phr);
|
|
||||||
hpi_entry_points[phm->obj_index] = NULL;
|
|
||||||
} else
|
|
||||||
phr->error = HPI_ERROR_INVALID_OBJ_INDEX;
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
/* Must explicitly handle every subsys message in this switch */
|
/* Must explicitly handle every subsys message in this switch */
|
||||||
hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, phm->function,
|
hpi_init_response(phr, HPI_OBJ_SUBSYSTEM, phm->function,
|
||||||
|
@ -247,6 +229,19 @@ static void adapter_message(struct hpi_message *phm, struct hpi_response *phr,
|
||||||
case HPI_ADAPTER_CLOSE:
|
case HPI_ADAPTER_CLOSE:
|
||||||
adapter_close(phm, phr);
|
adapter_close(phm, phr);
|
||||||
break;
|
break;
|
||||||
|
case HPI_ADAPTER_DELETE:
|
||||||
|
HPIMSGX__cleanup(phm->adapter_index, h_owner);
|
||||||
|
{
|
||||||
|
struct hpi_message hm;
|
||||||
|
struct hpi_response hr;
|
||||||
|
hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
|
||||||
|
HPI_ADAPTER_CLOSE);
|
||||||
|
hm.adapter_index = phm->adapter_index;
|
||||||
|
hw_entry_point(&hm, &hr);
|
||||||
|
}
|
||||||
|
hw_entry_point(phm, phr);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
hw_entry_point(phm, phr);
|
hw_entry_point(phm, phr);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -25,6 +25,7 @@ Common Linux HPI ioctl and module probe/remove functions
|
||||||
#include "hpidebug.h"
|
#include "hpidebug.h"
|
||||||
#include "hpimsgx.h"
|
#include "hpimsgx.h"
|
||||||
#include "hpioctl.h"
|
#include "hpioctl.h"
|
||||||
|
#include "hpicmn.h"
|
||||||
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
@ -161,12 +162,9 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa = &adapters[hm->h.adapter_index];
|
|
||||||
hr->h.size = res_max_size;
|
|
||||||
if (hm->h.object == HPI_OBJ_SUBSYSTEM) {
|
|
||||||
switch (hm->h.function) {
|
switch (hm->h.function) {
|
||||||
case HPI_SUBSYS_CREATE_ADAPTER:
|
case HPI_SUBSYS_CREATE_ADAPTER:
|
||||||
case HPI_SUBSYS_DELETE_ADAPTER:
|
case HPI_ADAPTER_DELETE:
|
||||||
/* Application must not use these functions! */
|
/* Application must not use these functions! */
|
||||||
hr->h.size = sizeof(hr->h);
|
hr->h.size = sizeof(hr->h);
|
||||||
hr->h.error = HPI_ERROR_INVALID_OPERATION;
|
hr->h.error = HPI_ERROR_INVALID_OPERATION;
|
||||||
|
@ -177,10 +175,11 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
else
|
else
|
||||||
err = 0;
|
err = 0;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
default:
|
|
||||||
hpi_send_recv_f(&hm->m0, &hr->r0, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr->h.size = res_max_size;
|
||||||
|
if (hm->h.object == HPI_OBJ_SUBSYSTEM) {
|
||||||
|
hpi_send_recv_f(&hm->m0, &hr->r0, file);
|
||||||
} else {
|
} else {
|
||||||
u16 __user *ptr = NULL;
|
u16 __user *ptr = NULL;
|
||||||
u32 size = 0;
|
u32 size = 0;
|
||||||
|
@ -188,8 +187,9 @@ long asihpi_hpi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
/* -1=no data 0=read from user mem, 1=write to user mem */
|
/* -1=no data 0=read from user mem, 1=write to user mem */
|
||||||
int wrflag = -1;
|
int wrflag = -1;
|
||||||
u32 adapter = hm->h.adapter_index;
|
u32 adapter = hm->h.adapter_index;
|
||||||
|
pa = &adapters[adapter];
|
||||||
|
|
||||||
if ((hm->h.adapter_index > HPI_MAX_ADAPTERS) || (!pa->type)) {
|
if ((adapter > HPI_MAX_ADAPTERS) || (!pa->type)) {
|
||||||
hpi_init_response(&hr->r0, HPI_OBJ_ADAPTER,
|
hpi_init_response(&hr->r0, HPI_OBJ_ADAPTER,
|
||||||
HPI_ADAPTER_OPEN,
|
HPI_ADAPTER_OPEN,
|
||||||
HPI_ERROR_BAD_ADAPTER_NUMBER);
|
HPI_ERROR_BAD_ADAPTER_NUMBER);
|
||||||
|
@ -395,17 +395,20 @@ int __devinit asihpi_adapter_probe(struct pci_dev *pci_dev,
|
||||||
|
|
||||||
adapter.index = hr.u.s.adapter_index;
|
adapter.index = hr.u.s.adapter_index;
|
||||||
adapter.type = hr.u.s.adapter_type;
|
adapter.type = hr.u.s.adapter_type;
|
||||||
hm.adapter_index = adapter.index;
|
|
||||||
|
|
||||||
err = hpi_adapter_open(adapter.index);
|
hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
|
||||||
if (err)
|
HPI_ADAPTER_OPEN);
|
||||||
|
hm.adapter_index = adapter.index;
|
||||||
|
hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL);
|
||||||
|
|
||||||
|
if (hr.error)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
adapter.snd_card_asihpi = NULL;
|
adapter.snd_card_asihpi = NULL;
|
||||||
/* WARNING can't init mutex in 'adapter'
|
/* WARNING can't init mutex in 'adapter'
|
||||||
* and then copy it to adapters[] ?!?!
|
* and then copy it to adapters[] ?!?!
|
||||||
*/
|
*/
|
||||||
adapters[hr.u.s.adapter_index] = adapter;
|
adapters[adapter.index] = adapter;
|
||||||
mutex_init(&adapters[adapter.index].mutex);
|
mutex_init(&adapters[adapter.index].mutex);
|
||||||
pci_set_drvdata(pci_dev, &adapters[adapter.index]);
|
pci_set_drvdata(pci_dev, &adapters[adapter.index]);
|
||||||
|
|
||||||
|
@ -440,10 +443,9 @@ void __devexit asihpi_adapter_remove(struct pci_dev *pci_dev)
|
||||||
struct hpi_adapter *pa;
|
struct hpi_adapter *pa;
|
||||||
pa = pci_get_drvdata(pci_dev);
|
pa = pci_get_drvdata(pci_dev);
|
||||||
|
|
||||||
hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
|
hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
|
||||||
HPI_SUBSYS_DELETE_ADAPTER);
|
HPI_ADAPTER_DELETE);
|
||||||
hm.obj_index = pa->index;
|
hm.adapter_index = pa->index;
|
||||||
hm.adapter_index = HPI_ADAPTER_INDEX_INVALID;
|
|
||||||
hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL);
|
hpi_send_recv_ex(&hm, &hr, HOWNER_KERNEL);
|
||||||
|
|
||||||
/* unmap PCI memory space, mapped during device init. */
|
/* unmap PCI memory space, mapped during device init. */
|
||||||
|
|
Loading…
Add table
Reference in a new issue