V4L/DVB (8286): sms1xxx: remove typedefs
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
ca78373687
commit
18245e18ee
@@ -50,33 +50,27 @@
|
|||||||
#define PWARNING(fmt, args...)
|
#define PWARNING(fmt, args...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct _smscore_device_notifyee
|
struct smscore_device_notifyee_t {
|
||||||
{
|
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
hotplug_t hotplug;
|
hotplug_t hotplug;
|
||||||
} smscore_device_notifyee_t;
|
};
|
||||||
|
|
||||||
typedef struct _smscore_subclient
|
struct smscore_idlist_t {
|
||||||
{
|
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
int id;
|
int id;
|
||||||
int data_type;
|
int data_type;
|
||||||
} smscore_idlist_t;
|
};
|
||||||
|
|
||||||
typedef struct _smscore_client
|
struct smscore_client_t {
|
||||||
{
|
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
smscore_device_t *coredev;
|
struct smscore_device_t *coredev;
|
||||||
void *context;
|
void *context;
|
||||||
struct list_head idlist;
|
struct list_head idlist;
|
||||||
onresponse_t onresponse_handler;
|
onresponse_t onresponse_handler;
|
||||||
onremove_t onremove_handler;
|
onremove_t onremove_handler;
|
||||||
} *psmscore_client_t;
|
};
|
||||||
|
|
||||||
|
struct smscore_device_t {
|
||||||
|
|
||||||
typedef struct _smscore_device
|
|
||||||
{
|
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
|
|
||||||
struct list_head clients;
|
struct list_head clients;
|
||||||
@@ -107,15 +101,14 @@ typedef struct _smscore_device
|
|||||||
|
|
||||||
struct completion version_ex_done, data_download_done, trigger_done;
|
struct completion version_ex_done, data_download_done, trigger_done;
|
||||||
struct completion init_device_done, reload_start_done, resume_done;
|
struct completion init_device_done, reload_start_done, resume_done;
|
||||||
} *psmscore_device_t;
|
};
|
||||||
|
|
||||||
typedef struct _smscore_registry_entry
|
struct smscore_registry_entry_t {
|
||||||
{
|
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
char devpath[32];
|
char devpath[32];
|
||||||
int mode;
|
int mode;
|
||||||
sms_device_type_st type;
|
enum sms_device_type_st type;
|
||||||
} smscore_registry_entry_t;
|
};
|
||||||
|
|
||||||
struct list_head g_smscore_notifyees;
|
struct list_head g_smscore_notifyees;
|
||||||
struct list_head g_smscore_devices;
|
struct list_head g_smscore_devices;
|
||||||
@@ -129,23 +122,24 @@ static int default_mode = 1;
|
|||||||
module_param(default_mode, int, 0644);
|
module_param(default_mode, int, 0644);
|
||||||
MODULE_PARM_DESC(default_mode, "default firmware id (device mode)");
|
MODULE_PARM_DESC(default_mode, "default firmware id (device mode)");
|
||||||
|
|
||||||
static smscore_registry_entry_t *smscore_find_registry(char *devpath)
|
static struct smscore_registry_entry_t *smscore_find_registry(char *devpath)
|
||||||
{
|
{
|
||||||
smscore_registry_entry_t *entry;
|
struct smscore_registry_entry_t *entry;
|
||||||
struct list_head *next;
|
struct list_head *next;
|
||||||
|
|
||||||
kmutex_lock(&g_smscore_registrylock);
|
kmutex_lock(&g_smscore_registrylock);
|
||||||
for (next = g_smscore_registry.next;
|
for (next = g_smscore_registry.next;
|
||||||
next != &g_smscore_registry;
|
next != &g_smscore_registry;
|
||||||
next = next->next) {
|
next = next->next) {
|
||||||
entry = (smscore_registry_entry_t *) next;
|
entry = (struct smscore_registry_entry_t *) next;
|
||||||
if (!strcmp(entry->devpath, devpath)) {
|
if (!strcmp(entry->devpath, devpath)) {
|
||||||
kmutex_unlock(&g_smscore_registrylock);
|
kmutex_unlock(&g_smscore_registrylock);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
entry = (smscore_registry_entry_t *)
|
entry = (struct smscore_registry_entry_t *)
|
||||||
kmalloc(sizeof(smscore_registry_entry_t), GFP_KERNEL);
|
kmalloc(sizeof(struct smscore_registry_entry_t),
|
||||||
|
GFP_KERNEL);
|
||||||
if (entry) {
|
if (entry) {
|
||||||
entry->mode = default_mode;
|
entry->mode = default_mode;
|
||||||
strcpy(entry->devpath, devpath);
|
strcpy(entry->devpath, devpath);
|
||||||
@@ -159,7 +153,7 @@ static smscore_registry_entry_t *smscore_find_registry(char *devpath)
|
|||||||
|
|
||||||
int smscore_registry_getmode(char *devpath)
|
int smscore_registry_getmode(char *devpath)
|
||||||
{
|
{
|
||||||
smscore_registry_entry_t *entry;
|
struct smscore_registry_entry_t *entry;
|
||||||
|
|
||||||
entry = smscore_find_registry(devpath);
|
entry = smscore_find_registry(devpath);
|
||||||
if (entry)
|
if (entry)
|
||||||
@@ -170,9 +164,9 @@ int smscore_registry_getmode(char *devpath)
|
|||||||
return default_mode;
|
return default_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
sms_device_type_st smscore_registry_gettype(char *devpath)
|
enum sms_device_type_st smscore_registry_gettype(char *devpath)
|
||||||
{
|
{
|
||||||
smscore_registry_entry_t *entry;
|
struct smscore_registry_entry_t *entry;
|
||||||
|
|
||||||
entry = smscore_find_registry(devpath);
|
entry = smscore_find_registry(devpath);
|
||||||
if (entry)
|
if (entry)
|
||||||
@@ -185,7 +179,7 @@ sms_device_type_st smscore_registry_gettype(char *devpath)
|
|||||||
|
|
||||||
void smscore_registry_setmode(char *devpath, int mode)
|
void smscore_registry_setmode(char *devpath, int mode)
|
||||||
{
|
{
|
||||||
smscore_registry_entry_t *entry;
|
struct smscore_registry_entry_t *entry;
|
||||||
|
|
||||||
entry = smscore_find_registry(devpath);
|
entry = smscore_find_registry(devpath);
|
||||||
if (entry)
|
if (entry)
|
||||||
@@ -194,9 +188,9 @@ void smscore_registry_setmode(char *devpath, int mode)
|
|||||||
printk(KERN_ERR "%s No registry found.\n", __func__);
|
printk(KERN_ERR "%s No registry found.\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
void smscore_registry_settype(char *devpath, sms_device_type_st type)
|
void smscore_registry_settype(char *devpath, enum sms_device_type_st type)
|
||||||
{
|
{
|
||||||
smscore_registry_entry_t *entry;
|
struct smscore_registry_entry_t *entry;
|
||||||
|
|
||||||
entry = smscore_find_registry(devpath);
|
entry = smscore_find_registry(devpath);
|
||||||
if (entry)
|
if (entry)
|
||||||
@@ -229,20 +223,22 @@ void list_add_locked(struct list_head *new, struct list_head *head,
|
|||||||
*/
|
*/
|
||||||
int smscore_register_hotplug(hotplug_t hotplug)
|
int smscore_register_hotplug(hotplug_t hotplug)
|
||||||
{
|
{
|
||||||
smscore_device_notifyee_t *notifyee;
|
struct smscore_device_notifyee_t *notifyee;
|
||||||
struct list_head *next, *first;
|
struct list_head *next, *first;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
kmutex_lock(&g_smscore_deviceslock);
|
kmutex_lock(&g_smscore_deviceslock);
|
||||||
|
|
||||||
notifyee = kmalloc(sizeof(smscore_device_notifyee_t), GFP_KERNEL);
|
notifyee = kmalloc(sizeof(struct smscore_device_notifyee_t),
|
||||||
|
GFP_KERNEL);
|
||||||
if (notifyee) {
|
if (notifyee) {
|
||||||
/* now notify callback about existing devices */
|
/* now notify callback about existing devices */
|
||||||
first = &g_smscore_devices;
|
first = &g_smscore_devices;
|
||||||
for (next = first->next;
|
for (next = first->next;
|
||||||
next != first && !rc;
|
next != first && !rc;
|
||||||
next = next->next) {
|
next = next->next) {
|
||||||
smscore_device_t *coredev = (smscore_device_t *) next;
|
struct smscore_device_t *coredev =
|
||||||
|
(struct smscore_device_t *) next;
|
||||||
rc = hotplug(coredev, coredev->device, 1);
|
rc = hotplug(coredev, coredev->device, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,8 +270,8 @@ void smscore_unregister_hotplug(hotplug_t hotplug)
|
|||||||
first = &g_smscore_notifyees;
|
first = &g_smscore_notifyees;
|
||||||
|
|
||||||
for (next = first->next; next != first;) {
|
for (next = first->next; next != first;) {
|
||||||
smscore_device_notifyee_t *notifyee =
|
struct smscore_device_notifyee_t *notifyee =
|
||||||
(smscore_device_notifyee_t *) next;
|
(struct smscore_device_notifyee_t *) next;
|
||||||
next = next->next;
|
next = next->next;
|
||||||
|
|
||||||
if (notifyee->hotplug == hotplug) {
|
if (notifyee->hotplug == hotplug) {
|
||||||
@@ -287,19 +283,19 @@ void smscore_unregister_hotplug(hotplug_t hotplug)
|
|||||||
kmutex_unlock(&g_smscore_deviceslock);
|
kmutex_unlock(&g_smscore_deviceslock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void smscore_notify_clients(smscore_device_t *coredev)
|
void smscore_notify_clients(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
smscore_client_t *client;
|
struct smscore_client_t *client;
|
||||||
|
|
||||||
/* the client must call smscore_unregister_client from remove handler */
|
/* the client must call smscore_unregister_client from remove handler */
|
||||||
while (!list_empty(&coredev->clients)) {
|
while (!list_empty(&coredev->clients)) {
|
||||||
client = (smscore_client_t *) coredev->clients.next;
|
client = (struct smscore_client_t *) coredev->clients.next;
|
||||||
client->onremove_handler(client->context);
|
client->onremove_handler(client->context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int smscore_notify_callbacks(smscore_device_t *coredev, struct device *device,
|
int smscore_notify_callbacks(struct smscore_device_t *coredev,
|
||||||
int arrival)
|
struct device *device, int arrival)
|
||||||
{
|
{
|
||||||
struct list_head *next, *first;
|
struct list_head *next, *first;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@@ -309,7 +305,7 @@ int smscore_notify_callbacks(smscore_device_t *coredev, struct device *device,
|
|||||||
first = &g_smscore_notifyees;
|
first = &g_smscore_notifyees;
|
||||||
|
|
||||||
for (next = first->next; next != first; next = next->next) {
|
for (next = first->next; next != first; next = next->next) {
|
||||||
rc = ((smscore_device_notifyee_t *) next)->
|
rc = ((struct smscore_device_notifyee_t *) next)->
|
||||||
hotplug(coredev, device, arrival);
|
hotplug(coredev, device, arrival);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
break;
|
break;
|
||||||
@@ -318,10 +314,11 @@ int smscore_notify_callbacks(smscore_device_t *coredev, struct device *device,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
smscore_buffer_t *smscore_createbuffer(u8 *buffer, void *common_buffer,
|
struct smscore_buffer_t *smscore_createbuffer(u8 *buffer, void *common_buffer,
|
||||||
dma_addr_t common_buffer_phys)
|
dma_addr_t common_buffer_phys)
|
||||||
{
|
{
|
||||||
smscore_buffer_t *cb = kmalloc(sizeof(smscore_buffer_t), GFP_KERNEL);
|
struct smscore_buffer_t *cb =
|
||||||
|
kmalloc(sizeof(struct smscore_buffer_t), GFP_KERNEL);
|
||||||
if (!cb) {
|
if (!cb) {
|
||||||
printk(KERN_INFO "%s kmalloc(...) failed\n", __func__);
|
printk(KERN_INFO "%s kmalloc(...) failed\n", __func__);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -344,13 +341,13 @@ smscore_buffer_t *smscore_createbuffer(u8 *buffer, void *common_buffer,
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smscore_register_device(smsdevice_params_t *params,
|
int smscore_register_device(struct smsdevice_params_t *params,
|
||||||
smscore_device_t **coredev)
|
struct smscore_device_t **coredev)
|
||||||
{
|
{
|
||||||
smscore_device_t *dev;
|
struct smscore_device_t *dev;
|
||||||
u8 *buffer;
|
u8 *buffer;
|
||||||
|
|
||||||
dev = kzalloc(sizeof(smscore_device_t), GFP_KERNEL);
|
dev = kzalloc(sizeof(struct smscore_device_t), GFP_KERNEL);
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
printk(KERN_INFO "%s kzalloc(...) failed\n", __func__);
|
printk(KERN_INFO "%s kzalloc(...) failed\n", __func__);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -389,7 +386,7 @@ int smscore_register_device(smsdevice_params_t *params,
|
|||||||
for (buffer = dev->common_buffer;
|
for (buffer = dev->common_buffer;
|
||||||
dev->num_buffers < params->num_buffers;
|
dev->num_buffers < params->num_buffers;
|
||||||
dev->num_buffers++, buffer += params->buffer_size) {
|
dev->num_buffers++, buffer += params->buffer_size) {
|
||||||
smscore_buffer_t *cb =
|
struct smscore_buffer_t *cb =
|
||||||
smscore_createbuffer(buffer, dev->common_buffer,
|
smscore_createbuffer(buffer, dev->common_buffer,
|
||||||
dev->common_buffer_phys);
|
dev->common_buffer_phys);
|
||||||
if (!cb) {
|
if (!cb) {
|
||||||
@@ -437,7 +434,7 @@ int smscore_register_device(smsdevice_params_t *params,
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smscore_start_device(smscore_device_t *coredev)
|
int smscore_start_device(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
int rc = smscore_set_device_mode(
|
int rc = smscore_set_device_mode(
|
||||||
coredev, smscore_registry_getmode(coredev->devpath));
|
coredev, smscore_registry_getmode(coredev->devpath));
|
||||||
@@ -459,7 +456,7 @@ int smscore_start_device(smscore_device_t *coredev)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smscore_sendrequest_and_wait(smscore_device_t *coredev, void *buffer,
|
int smscore_sendrequest_and_wait(struct smscore_device_t *coredev, void *buffer,
|
||||||
size_t size, struct completion *completion)
|
size_t size, struct completion *completion)
|
||||||
{
|
{
|
||||||
int rc = coredev->sendrequest_handler(coredev->context, buffer, size);
|
int rc = coredev->sendrequest_handler(coredev->context, buffer, size);
|
||||||
@@ -474,11 +471,11 @@ int smscore_sendrequest_and_wait(smscore_device_t *coredev, void *buffer,
|
|||||||
0 : -ETIME;
|
0 : -ETIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smscore_load_firmware_family2(smscore_device_t *coredev, void *buffer,
|
int smscore_load_firmware_family2(struct smscore_device_t *coredev,
|
||||||
size_t size)
|
void *buffer, size_t size)
|
||||||
{
|
{
|
||||||
SmsFirmware_ST *firmware = (SmsFirmware_ST *) buffer;
|
struct SmsFirmware_ST *firmware = (struct SmsFirmware_ST *) buffer;
|
||||||
SmsMsgHdr_ST *msg;
|
struct SmsMsgHdr_ST *msg;
|
||||||
u32 mem_address = firmware->StartAddress;
|
u32 mem_address = firmware->StartAddress;
|
||||||
u8 *payload = firmware->Payload;
|
u8 *payload = firmware->Payload;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@@ -492,14 +489,14 @@ int smscore_load_firmware_family2(smscore_device_t *coredev, void *buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* PAGE_SIZE buffer shall be enough and dma aligned */
|
/* PAGE_SIZE buffer shall be enough and dma aligned */
|
||||||
msg = (SmsMsgHdr_ST *) kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
|
msg = (struct SmsMsgHdr_ST *) kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (coredev->mode != DEVICE_MODE_NONE) {
|
if (coredev->mode != DEVICE_MODE_NONE) {
|
||||||
PDEBUG("Sending reload command\n");
|
PDEBUG("Sending reload command\n");
|
||||||
SMS_INIT_MSG(msg, MSG_SW_RELOAD_START_REQ,
|
SMS_INIT_MSG(msg, MSG_SW_RELOAD_START_REQ,
|
||||||
sizeof(SmsMsgHdr_ST));
|
sizeof(struct SmsMsgHdr_ST));
|
||||||
rc = smscore_sendrequest_and_wait(coredev, msg,
|
rc = smscore_sendrequest_and_wait(coredev, msg,
|
||||||
msg->msgLength,
|
msg->msgLength,
|
||||||
&coredev->reload_start_done);
|
&coredev->reload_start_done);
|
||||||
@@ -507,11 +504,12 @@ int smscore_load_firmware_family2(smscore_device_t *coredev, void *buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (size && rc >= 0) {
|
while (size && rc >= 0) {
|
||||||
SmsDataDownload_ST *DataMsg = (SmsDataDownload_ST *) msg;
|
struct SmsDataDownload_ST *DataMsg =
|
||||||
|
(struct SmsDataDownload_ST *) msg;
|
||||||
int payload_size = min((int) size, SMS_MAX_PAYLOAD_SIZE);
|
int payload_size = min((int) size, SMS_MAX_PAYLOAD_SIZE);
|
||||||
|
|
||||||
SMS_INIT_MSG(msg, MSG_SMS_DATA_DOWNLOAD_REQ,
|
SMS_INIT_MSG(msg, MSG_SMS_DATA_DOWNLOAD_REQ,
|
||||||
(u16)(sizeof(SmsMsgHdr_ST) +
|
(u16)(sizeof(struct SmsMsgHdr_ST) +
|
||||||
sizeof(u32) + payload_size));
|
sizeof(u32) + payload_size));
|
||||||
|
|
||||||
DataMsg->MemAddr = mem_address;
|
DataMsg->MemAddr = mem_address;
|
||||||
@@ -535,10 +533,11 @@ int smscore_load_firmware_family2(smscore_device_t *coredev, void *buffer,
|
|||||||
|
|
||||||
if (rc >= 0) {
|
if (rc >= 0) {
|
||||||
if (coredev->mode == DEVICE_MODE_NONE) {
|
if (coredev->mode == DEVICE_MODE_NONE) {
|
||||||
SmsMsgData_ST *TriggerMsg = (SmsMsgData_ST *) msg;
|
struct SmsMsgData_ST *TriggerMsg =
|
||||||
|
(struct SmsMsgData_ST *) msg;
|
||||||
|
|
||||||
SMS_INIT_MSG(msg, MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
|
SMS_INIT_MSG(msg, MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
|
||||||
sizeof(SmsMsgHdr_ST) +
|
sizeof(struct SmsMsgHdr_ST) +
|
||||||
sizeof(u32) * 5);
|
sizeof(u32) * 5);
|
||||||
|
|
||||||
TriggerMsg->msgData[0] = firmware->StartAddress;
|
TriggerMsg->msgData[0] = firmware->StartAddress;
|
||||||
@@ -560,7 +559,7 @@ int smscore_load_firmware_family2(smscore_device_t *coredev, void *buffer,
|
|||||||
&coredev->trigger_done);
|
&coredev->trigger_done);
|
||||||
} else {
|
} else {
|
||||||
SMS_INIT_MSG(msg, MSG_SW_RELOAD_EXEC_REQ,
|
SMS_INIT_MSG(msg, MSG_SW_RELOAD_EXEC_REQ,
|
||||||
sizeof(SmsMsgHdr_ST));
|
sizeof(struct SmsMsgHdr_ST));
|
||||||
|
|
||||||
rc = coredev->sendrequest_handler(coredev->context,
|
rc = coredev->sendrequest_handler(coredev->context,
|
||||||
msg, msg->msgLength);
|
msg, msg->msgLength);
|
||||||
@@ -588,7 +587,8 @@ int smscore_load_firmware_family2(smscore_device_t *coredev, void *buffer,
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smscore_load_firmware_from_file(smscore_device_t *coredev, char *filename,
|
int smscore_load_firmware_from_file(struct smscore_device_t *coredev,
|
||||||
|
char *filename,
|
||||||
loadfirmware_t loadfirmware_handler)
|
loadfirmware_t loadfirmware_handler)
|
||||||
{
|
{
|
||||||
int rc = -ENOENT;
|
int rc = -ENOENT;
|
||||||
@@ -632,8 +632,8 @@ int smscore_load_firmware_from_file(smscore_device_t *coredev, char *filename,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smscore_load_firmware_from_buffer(smscore_device_t *coredev, u8 *buffer,
|
int smscore_load_firmware_from_buffer(struct smscore_device_t *coredev,
|
||||||
int size, int new_mode)
|
u8 *buffer, int size, int new_mode)
|
||||||
{
|
{
|
||||||
PERROR("Feature not implemented yet\n");
|
PERROR("Feature not implemented yet\n");
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
@@ -648,9 +648,9 @@ int smscore_load_firmware_from_buffer(smscore_device_t *coredev, u8 *buffer,
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
void smscore_unregister_device(smscore_device_t *coredev)
|
void smscore_unregister_device(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
smscore_buffer_t *cb;
|
struct smscore_buffer_t *cb;
|
||||||
int num_buffers = 0;
|
int num_buffers = 0;
|
||||||
int retry = 0;
|
int retry = 0;
|
||||||
|
|
||||||
@@ -695,17 +695,19 @@ void smscore_unregister_device(smscore_device_t *coredev)
|
|||||||
printk(KERN_INFO "%s device %p destroyed\n", __func__, coredev);
|
printk(KERN_INFO "%s device %p destroyed\n", __func__, coredev);
|
||||||
}
|
}
|
||||||
|
|
||||||
int smscore_detect_mode(smscore_device_t *coredev)
|
int smscore_detect_mode(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
void *buffer = kmalloc(sizeof(SmsMsgHdr_ST) + SMS_DMA_ALIGNMENT,
|
void *buffer = kmalloc(sizeof(struct SmsMsgHdr_ST) + SMS_DMA_ALIGNMENT,
|
||||||
GFP_KERNEL | GFP_DMA);
|
GFP_KERNEL | GFP_DMA);
|
||||||
SmsMsgHdr_ST *msg = (SmsMsgHdr_ST *) SMS_ALIGN_ADDRESS(buffer);
|
struct SmsMsgHdr_ST *msg =
|
||||||
|
(struct SmsMsgHdr_ST *) SMS_ALIGN_ADDRESS(buffer);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
SMS_INIT_MSG(msg, MSG_SMS_GET_VERSION_EX_REQ, sizeof(SmsMsgHdr_ST));
|
SMS_INIT_MSG(msg, MSG_SMS_GET_VERSION_EX_REQ,
|
||||||
|
sizeof(struct SmsMsgHdr_ST));
|
||||||
|
|
||||||
rc = smscore_sendrequest_and_wait(coredev, msg, msg->msgLength,
|
rc = smscore_sendrequest_and_wait(coredev, msg, msg->msgLength,
|
||||||
&coredev->version_ex_done);
|
&coredev->version_ex_done);
|
||||||
@@ -754,11 +756,11 @@ char *smscore_fw_lkup[][SMS_NUM_OF_DEVICE_TYPES] = {
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smscore_set_device_mode(smscore_device_t *coredev, int mode)
|
int smscore_set_device_mode(struct smscore_device_t *coredev, int mode)
|
||||||
{
|
{
|
||||||
void *buffer;
|
void *buffer;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
sms_device_type_st type;
|
enum sms_device_type_st type;
|
||||||
|
|
||||||
PDEBUG("set device mode to %d\n", mode);
|
PDEBUG("set device mode to %d\n", mode);
|
||||||
if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
|
if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
|
||||||
@@ -798,14 +800,15 @@ int smscore_set_device_mode(smscore_device_t *coredev, int mode)
|
|||||||
printk(KERN_INFO "%s mode %d supported by running "
|
printk(KERN_INFO "%s mode %d supported by running "
|
||||||
"firmware\n", __func__, mode);
|
"firmware\n", __func__, mode);
|
||||||
|
|
||||||
buffer = kmalloc(sizeof(SmsMsgData_ST) + SMS_DMA_ALIGNMENT,
|
buffer = kmalloc(sizeof(struct SmsMsgData_ST) +
|
||||||
GFP_KERNEL | GFP_DMA);
|
SMS_DMA_ALIGNMENT, GFP_KERNEL | GFP_DMA);
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
SmsMsgData_ST *msg =
|
struct SmsMsgData_ST *msg =
|
||||||
(SmsMsgData_ST *) SMS_ALIGN_ADDRESS(buffer);
|
(struct SmsMsgData_ST *)
|
||||||
|
SMS_ALIGN_ADDRESS(buffer);
|
||||||
|
|
||||||
SMS_INIT_MSG(&msg->xMsgHeader, MSG_SMS_INIT_DEVICE_REQ,
|
SMS_INIT_MSG(&msg->xMsgHeader, MSG_SMS_INIT_DEVICE_REQ,
|
||||||
sizeof(SmsMsgData_ST));
|
sizeof(struct SmsMsgData_ST));
|
||||||
msg->msgData[0] = mode;
|
msg->msgData[0] = mode;
|
||||||
|
|
||||||
rc = smscore_sendrequest_and_wait(
|
rc = smscore_sendrequest_and_wait(
|
||||||
@@ -853,7 +856,7 @@ int smscore_set_device_mode(smscore_device_t *coredev, int mode)
|
|||||||
*
|
*
|
||||||
* @return current mode
|
* @return current mode
|
||||||
*/
|
*/
|
||||||
int smscore_get_device_mode(smscore_device_t *coredev)
|
int smscore_get_device_mode(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
return coredev->mode;
|
return coredev->mode;
|
||||||
}
|
}
|
||||||
@@ -868,10 +871,10 @@ int smscore_get_device_mode(smscore_device_t *coredev)
|
|||||||
* @param id client id (SMS_DONT_CARE for all id)
|
* @param id client id (SMS_DONT_CARE for all id)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
smscore_client_t *smscore_find_client(smscore_device_t *coredev,
|
struct smscore_client_t *smscore_find_client(struct smscore_device_t *coredev,
|
||||||
int data_type, int id)
|
int data_type, int id)
|
||||||
{
|
{
|
||||||
smscore_client_t *client = NULL;
|
struct smscore_client_t *client = NULL;
|
||||||
struct list_head *next, *first;
|
struct list_head *next, *first;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct list_head *firstid, *nextid;
|
struct list_head *firstid, *nextid;
|
||||||
@@ -882,14 +885,14 @@ smscore_client_t *smscore_find_client(smscore_device_t *coredev,
|
|||||||
for (next = first->next;
|
for (next = first->next;
|
||||||
(next != first) && !client;
|
(next != first) && !client;
|
||||||
next = next->next) {
|
next = next->next) {
|
||||||
firstid = &((smscore_client_t *)next)->idlist;
|
firstid = &((struct smscore_client_t *)next)->idlist;
|
||||||
for (nextid = firstid->next;
|
for (nextid = firstid->next;
|
||||||
nextid != firstid;
|
nextid != firstid;
|
||||||
nextid = nextid->next) {
|
nextid = nextid->next) {
|
||||||
if ((((smscore_idlist_t *)nextid)->id == id) &&
|
if ((((struct smscore_idlist_t *)nextid)->id == id) &&
|
||||||
(((smscore_idlist_t *)nextid)->data_type == data_type ||
|
(((struct smscore_idlist_t *)nextid)->data_type == data_type ||
|
||||||
(((smscore_idlist_t *)nextid)->data_type == 0))) {
|
(((struct smscore_idlist_t *)nextid)->data_type == 0))) {
|
||||||
client = (smscore_client_t *) next;
|
client = (struct smscore_client_t *) next;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -907,10 +910,12 @@ smscore_client_t *smscore_find_client(smscore_device_t *coredev,
|
|||||||
* @param cb pointer to response buffer descriptor
|
* @param cb pointer to response buffer descriptor
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void smscore_onresponse(smscore_device_t *coredev, smscore_buffer_t *cb)
|
void smscore_onresponse(struct smscore_device_t *coredev,
|
||||||
|
struct smscore_buffer_t *cb)
|
||||||
{
|
{
|
||||||
SmsMsgHdr_ST *phdr = (SmsMsgHdr_ST *)((u8 *) cb->p + cb->offset);
|
struct SmsMsgHdr_ST *phdr =
|
||||||
smscore_client_t *client =
|
(struct SmsMsgHdr_ST *)((u8 *) cb->p + cb->offset);
|
||||||
|
struct smscore_client_t *client =
|
||||||
smscore_find_client(coredev, phdr->msgType, phdr->msgDstId);
|
smscore_find_client(coredev, phdr->msgType, phdr->msgDstId);
|
||||||
int rc = -EBUSY;
|
int rc = -EBUSY;
|
||||||
|
|
||||||
@@ -940,7 +945,8 @@ void smscore_onresponse(smscore_device_t *coredev, smscore_buffer_t *cb)
|
|||||||
switch (phdr->msgType) {
|
switch (phdr->msgType) {
|
||||||
case MSG_SMS_GET_VERSION_EX_RES:
|
case MSG_SMS_GET_VERSION_EX_RES:
|
||||||
{
|
{
|
||||||
SmsVersionRes_ST *ver = (SmsVersionRes_ST *) phdr;
|
struct SmsVersionRes_ST *ver =
|
||||||
|
(struct SmsVersionRes_ST *) phdr;
|
||||||
printk(KERN_DEBUG "%s: MSG_SMS_GET_VERSION_EX_RES "
|
printk(KERN_DEBUG "%s: MSG_SMS_GET_VERSION_EX_RES "
|
||||||
"id %d prots 0x%x ver %d.%d\n", __func__,
|
"id %d prots 0x%x ver %d.%d\n", __func__,
|
||||||
ver->FirmwareId, ver->SupportedProtocols,
|
ver->FirmwareId, ver->SupportedProtocols,
|
||||||
@@ -994,15 +1000,15 @@ void smscore_onresponse(smscore_device_t *coredev, smscore_buffer_t *cb)
|
|||||||
*
|
*
|
||||||
* @return pointer to descriptor on success, NULL on error.
|
* @return pointer to descriptor on success, NULL on error.
|
||||||
*/
|
*/
|
||||||
smscore_buffer_t *smscore_getbuffer(smscore_device_t *coredev)
|
struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
smscore_buffer_t *cb = NULL;
|
struct smscore_buffer_t *cb = NULL;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&coredev->bufferslock, flags);
|
spin_lock_irqsave(&coredev->bufferslock, flags);
|
||||||
|
|
||||||
if (!list_empty(&coredev->buffers)) {
|
if (!list_empty(&coredev->buffers)) {
|
||||||
cb = (smscore_buffer_t *) coredev->buffers.next;
|
cb = (struct smscore_buffer_t *) coredev->buffers.next;
|
||||||
list_del(&cb->entry);
|
list_del(&cb->entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1019,16 +1025,18 @@ smscore_buffer_t *smscore_getbuffer(smscore_device_t *coredev)
|
|||||||
* @param cb pointer buffer descriptor
|
* @param cb pointer buffer descriptor
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void smscore_putbuffer(smscore_device_t *coredev, smscore_buffer_t *cb)
|
void smscore_putbuffer(struct smscore_device_t *coredev,
|
||||||
|
struct smscore_buffer_t *cb)
|
||||||
{
|
{
|
||||||
list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock);
|
list_add_locked(&cb->entry, &coredev->buffers, &coredev->bufferslock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int smscore_validate_client(smscore_device_t *coredev,
|
int smscore_validate_client(struct smscore_device_t *coredev,
|
||||||
smscore_client_t *client, int data_type, int id)
|
struct smscore_client_t *client,
|
||||||
|
int data_type, int id)
|
||||||
{
|
{
|
||||||
smscore_idlist_t *listentry;
|
struct smscore_idlist_t *listentry;
|
||||||
smscore_client_t *registered_client;
|
struct smscore_client_t *registered_client;
|
||||||
|
|
||||||
if (!client) {
|
if (!client) {
|
||||||
PERROR("bad parameter.\n");
|
PERROR("bad parameter.\n");
|
||||||
@@ -1042,7 +1050,7 @@ int smscore_validate_client(smscore_device_t *coredev,
|
|||||||
PERROR("The msg ID already registered to another client.\n");
|
PERROR("The msg ID already registered to another client.\n");
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
listentry = kzalloc(sizeof(smscore_idlist_t), GFP_KERNEL);
|
listentry = kzalloc(sizeof(struct smscore_idlist_t), GFP_KERNEL);
|
||||||
if (!listentry) {
|
if (!listentry) {
|
||||||
PERROR("Can't allocate memory for client id.\n");
|
PERROR("Can't allocate memory for client id.\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -1068,11 +1076,11 @@ int smscore_validate_client(smscore_device_t *coredev,
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smscore_register_client(smscore_device_t *coredev,
|
int smscore_register_client(struct smscore_device_t *coredev,
|
||||||
smsclient_params_t *params,
|
struct smsclient_params_t *params,
|
||||||
smscore_client_t **client)
|
struct smscore_client_t **client)
|
||||||
{
|
{
|
||||||
smscore_client_t *newclient;
|
struct smscore_client_t *newclient;
|
||||||
/* check that no other channel with same parameters exists */
|
/* check that no other channel with same parameters exists */
|
||||||
if (smscore_find_client(coredev, params->data_type,
|
if (smscore_find_client(coredev, params->data_type,
|
||||||
params->initial_id)) {
|
params->initial_id)) {
|
||||||
@@ -1080,7 +1088,7 @@ int smscore_register_client(smscore_device_t *coredev,
|
|||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
newclient = kzalloc(sizeof(smscore_client_t), GFP_KERNEL);
|
newclient = kzalloc(sizeof(struct smscore_client_t), GFP_KERNEL);
|
||||||
if (!newclient) {
|
if (!newclient) {
|
||||||
PERROR("Failed to allocate memory for client.\n");
|
PERROR("Failed to allocate memory for client.\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -1109,17 +1117,17 @@ int smscore_register_client(smscore_device_t *coredev,
|
|||||||
* smscore_register_client
|
* smscore_register_client
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void smscore_unregister_client(smscore_client_t *client)
|
void smscore_unregister_client(struct smscore_client_t *client)
|
||||||
{
|
{
|
||||||
smscore_device_t *coredev = client->coredev;
|
struct smscore_device_t *coredev = client->coredev;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&coredev->clientslock, flags);
|
spin_lock_irqsave(&coredev->clientslock, flags);
|
||||||
|
|
||||||
|
|
||||||
while (!list_empty(&client->idlist)) {
|
while (!list_empty(&client->idlist)) {
|
||||||
smscore_idlist_t *identry =
|
struct smscore_idlist_t *identry =
|
||||||
(smscore_idlist_t *) client->idlist.next;
|
(struct smscore_idlist_t *) client->idlist.next;
|
||||||
list_del(&identry->entry);
|
list_del(&identry->entry);
|
||||||
kfree(identry);
|
kfree(identry);
|
||||||
}
|
}
|
||||||
@@ -1143,10 +1151,11 @@ void smscore_unregister_client(smscore_client_t *client)
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smsclient_sendrequest(smscore_client_t *client, void *buffer, size_t size)
|
int smsclient_sendrequest(struct smscore_client_t *client,
|
||||||
|
void *buffer, size_t size)
|
||||||
{
|
{
|
||||||
smscore_device_t *coredev;
|
struct smscore_device_t *coredev;
|
||||||
SmsMsgHdr_ST *phdr = (SmsMsgHdr_ST *) buffer;
|
struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) buffer;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (client == NULL) {
|
if (client == NULL) {
|
||||||
@@ -1177,7 +1186,7 @@ int smsclient_sendrequest(smscore_client_t *client, void *buffer, size_t size)
|
|||||||
*
|
*
|
||||||
* @return size (in bytes) of the buffer
|
* @return size (in bytes) of the buffer
|
||||||
*/
|
*/
|
||||||
int smscore_get_common_buffer_size(smscore_device_t *coredev)
|
int smscore_get_common_buffer_size(struct smscore_device_t *coredev)
|
||||||
{
|
{
|
||||||
return coredev->common_buffer_size;
|
return coredev->common_buffer_size;
|
||||||
}
|
}
|
||||||
@@ -1190,7 +1199,7 @@ int smscore_get_common_buffer_size(smscore_device_t *coredev)
|
|||||||
*
|
*
|
||||||
* @return 0 on success, <0 on error.
|
* @return 0 on success, <0 on error.
|
||||||
*/
|
*/
|
||||||
int smscore_map_common_buffer(smscore_device_t *coredev,
|
int smscore_map_common_buffer(struct smscore_device_t *coredev,
|
||||||
struct vm_area_struct *vma)
|
struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
unsigned long end = vma->vm_end,
|
unsigned long end = vma->vm_end,
|
||||||
@@ -1247,8 +1256,9 @@ void smscore_module_exit(void)
|
|||||||
|
|
||||||
kmutex_lock(&g_smscore_deviceslock);
|
kmutex_lock(&g_smscore_deviceslock);
|
||||||
while (!list_empty(&g_smscore_notifyees)) {
|
while (!list_empty(&g_smscore_notifyees)) {
|
||||||
smscore_device_notifyee_t *notifyee =
|
struct smscore_device_notifyee_t *notifyee =
|
||||||
(smscore_device_notifyee_t *) g_smscore_notifyees.next;
|
(struct smscore_device_notifyee_t *)
|
||||||
|
g_smscore_notifyees.next;
|
||||||
|
|
||||||
list_del(¬ifyee->entry);
|
list_del(¬ifyee->entry);
|
||||||
kfree(notifyee);
|
kfree(notifyee);
|
||||||
@@ -1257,8 +1267,9 @@ void smscore_module_exit(void)
|
|||||||
|
|
||||||
kmutex_lock(&g_smscore_registrylock);
|
kmutex_lock(&g_smscore_registrylock);
|
||||||
while (!list_empty(&g_smscore_registry)) {
|
while (!list_empty(&g_smscore_registry)) {
|
||||||
smscore_registry_entry_t *entry =
|
struct smscore_registry_entry_t *entry =
|
||||||
(smscore_registry_entry_t *) g_smscore_registry.next;
|
(struct smscore_registry_entry_t *)
|
||||||
|
g_smscore_registry.next;
|
||||||
|
|
||||||
list_del(&entry->entry);
|
list_del(&entry->entry);
|
||||||
kfree(entry);
|
kfree(entry);
|
||||||
|
@@ -57,19 +57,19 @@ typedef struct mutex kmutex_t;
|
|||||||
#define SMS_ROM_NO_RESPONSE 2
|
#define SMS_ROM_NO_RESPONSE 2
|
||||||
#define SMS_DEVICE_NOT_READY 0x8000000
|
#define SMS_DEVICE_NOT_READY 0x8000000
|
||||||
|
|
||||||
typedef enum {
|
enum sms_device_type_st {
|
||||||
SMS_STELLAR = 0,
|
SMS_STELLAR = 0,
|
||||||
SMS_NOVA_A0,
|
SMS_NOVA_A0,
|
||||||
SMS_NOVA_B0,
|
SMS_NOVA_B0,
|
||||||
SMS_VEGA,
|
SMS_VEGA,
|
||||||
SMS_NUM_OF_DEVICE_TYPES
|
SMS_NUM_OF_DEVICE_TYPES
|
||||||
} sms_device_type_st;
|
};
|
||||||
|
|
||||||
typedef struct _smscore_device smscore_device_t;
|
struct smscore_device_t;
|
||||||
typedef struct _smscore_client smscore_client_t;
|
struct smscore_client_t;
|
||||||
typedef struct _smscore_buffer smscore_buffer_t;
|
struct smscore_buffer_t;
|
||||||
|
|
||||||
typedef int (*hotplug_t)(smscore_device_t *coredev,
|
typedef int (*hotplug_t)(struct smscore_device_t *coredev,
|
||||||
struct device *device, int arrival);
|
struct device *device, int arrival);
|
||||||
|
|
||||||
typedef int (*setmode_t)(void *context, int mode);
|
typedef int (*setmode_t)(void *context, int mode);
|
||||||
@@ -79,11 +79,10 @@ typedef int (*loadfirmware_t)(void *context, void *buffer, size_t size);
|
|||||||
typedef int (*preload_t)(void *context);
|
typedef int (*preload_t)(void *context);
|
||||||
typedef int (*postload_t)(void *context);
|
typedef int (*postload_t)(void *context);
|
||||||
|
|
||||||
typedef int (*onresponse_t)(void *context, smscore_buffer_t *cb);
|
typedef int (*onresponse_t)(void *context, struct smscore_buffer_t *cb);
|
||||||
typedef void (*onremove_t)(void *context);
|
typedef void (*onremove_t)(void *context);
|
||||||
|
|
||||||
typedef struct _smscore_buffer
|
struct smscore_buffer_t {
|
||||||
{
|
|
||||||
/* public members, once passed to clients can be changed freely */
|
/* public members, once passed to clients can be changed freely */
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
int size;
|
int size;
|
||||||
@@ -93,10 +92,9 @@ typedef struct _smscore_buffer
|
|||||||
void *p;
|
void *p;
|
||||||
dma_addr_t phys;
|
dma_addr_t phys;
|
||||||
unsigned long offset_in_common;
|
unsigned long offset_in_common;
|
||||||
} *psmscore_buffer_t;
|
};
|
||||||
|
|
||||||
typedef struct _smsdevice_params
|
struct smsdevice_params_t {
|
||||||
{
|
|
||||||
struct device *device;
|
struct device *device;
|
||||||
|
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
@@ -112,18 +110,17 @@ typedef struct _smsdevice_params
|
|||||||
postload_t postload_handler;
|
postload_t postload_handler;
|
||||||
|
|
||||||
void *context;
|
void *context;
|
||||||
sms_device_type_st device_type;
|
enum sms_device_type_st device_type;
|
||||||
} smsdevice_params_t;
|
};
|
||||||
|
|
||||||
typedef struct _smsclient_params
|
struct smsclient_params_t {
|
||||||
{
|
|
||||||
int initial_id;
|
int initial_id;
|
||||||
int data_type;
|
int data_type;
|
||||||
onresponse_t onresponse_handler;
|
onresponse_t onresponse_handler;
|
||||||
onremove_t onremove_handler;
|
onremove_t onremove_handler;
|
||||||
|
|
||||||
void *context;
|
void *context;
|
||||||
} smsclient_params_t;
|
};
|
||||||
|
|
||||||
/* GPIO definitions for antenna frequency domain control (SMS8021) */
|
/* GPIO definitions for antenna frequency domain control (SMS8021) */
|
||||||
#define SMS_ANTENNA_GPIO_0 1
|
#define SMS_ANTENNA_GPIO_0 1
|
||||||
@@ -201,8 +198,7 @@ typedef struct _smsclient_params
|
|||||||
#define SMS_INIT_MSG(ptr, type, len) \
|
#define SMS_INIT_MSG(ptr, type, len) \
|
||||||
SMS_INIT_MSG_EX(ptr, type, 0, HIF_TASK, len)
|
SMS_INIT_MSG_EX(ptr, type, 0, HIF_TASK, len)
|
||||||
|
|
||||||
typedef enum
|
enum SMS_DEVICE_MODE {
|
||||||
{
|
|
||||||
DEVICE_MODE_NONE = -1,
|
DEVICE_MODE_NONE = -1,
|
||||||
DEVICE_MODE_DVBT = 0,
|
DEVICE_MODE_DVBT = 0,
|
||||||
DEVICE_MODE_DVBH,
|
DEVICE_MODE_DVBH,
|
||||||
@@ -214,33 +210,29 @@ typedef enum
|
|||||||
DEVICE_MODE_CMMB,
|
DEVICE_MODE_CMMB,
|
||||||
DEVICE_MODE_RAW_TUNER,
|
DEVICE_MODE_RAW_TUNER,
|
||||||
DEVICE_MODE_MAX,
|
DEVICE_MODE_MAX,
|
||||||
} SMS_DEVICE_MODE;
|
};
|
||||||
|
|
||||||
typedef struct SmsMsgHdr_S
|
struct SmsMsgHdr_ST {
|
||||||
{
|
|
||||||
u16 msgType;
|
u16 msgType;
|
||||||
u8 msgSrcId;
|
u8 msgSrcId;
|
||||||
u8 msgDstId;
|
u8 msgDstId;
|
||||||
u16 msgLength; /* Length of entire message, including header */
|
u16 msgLength; /* Length of entire message, including header */
|
||||||
u16 msgFlags;
|
u16 msgFlags;
|
||||||
} SmsMsgHdr_ST;
|
};
|
||||||
|
|
||||||
typedef struct SmsMsgData_S
|
struct SmsMsgData_ST {
|
||||||
{
|
struct SmsMsgHdr_ST xMsgHeader;
|
||||||
SmsMsgHdr_ST xMsgHeader;
|
|
||||||
u32 msgData[1];
|
u32 msgData[1];
|
||||||
} SmsMsgData_ST;
|
};
|
||||||
|
|
||||||
typedef struct SmsDataDownload_S
|
struct SmsDataDownload_ST {
|
||||||
{
|
struct SmsMsgHdr_ST xMsgHeader;
|
||||||
SmsMsgHdr_ST xMsgHeader;
|
|
||||||
u32 MemAddr;
|
u32 MemAddr;
|
||||||
u8 Payload[SMS_MAX_PAYLOAD_SIZE];
|
u8 Payload[SMS_MAX_PAYLOAD_SIZE];
|
||||||
} SmsDataDownload_ST;
|
};
|
||||||
|
|
||||||
typedef struct SmsVersionRes_S
|
struct SmsVersionRes_ST {
|
||||||
{
|
struct SmsMsgHdr_ST xMsgHeader;
|
||||||
SmsMsgHdr_ST xMsgHeader;
|
|
||||||
|
|
||||||
u16 ChipModel; /* e.g. 0x1102 for SMS-1102 "Nova" */
|
u16 ChipModel; /* e.g. 0x1102 for SMS-1102 "Nova" */
|
||||||
u8 Step; /* 0 - Step A */
|
u8 Step; /* 0 - Step A */
|
||||||
@@ -263,18 +255,16 @@ typedef struct SmsVersionRes_S
|
|||||||
u8 RomVersionFieldPatch;
|
u8 RomVersionFieldPatch;
|
||||||
|
|
||||||
u8 TextLabel[34];
|
u8 TextLabel[34];
|
||||||
} SmsVersionRes_ST;
|
};
|
||||||
|
|
||||||
typedef struct SmsFirmware_S
|
struct SmsFirmware_ST {
|
||||||
{
|
|
||||||
u32 CheckSum;
|
u32 CheckSum;
|
||||||
u32 Length;
|
u32 Length;
|
||||||
u32 StartAddress;
|
u32 StartAddress;
|
||||||
u8 Payload[1];
|
u8 Payload[1];
|
||||||
} SmsFirmware_ST;
|
};
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_STATISTICS_S
|
struct SMSHOSTLIB_STATISTICS_ST {
|
||||||
{
|
|
||||||
u32 Reserved; /* Reserved */
|
u32 Reserved; /* Reserved */
|
||||||
|
|
||||||
/* Common parameters */
|
/* Common parameters */
|
||||||
@@ -339,196 +329,25 @@ typedef struct SMSHOSTLIB_STATISTICS_S
|
|||||||
u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero;
|
u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero;
|
||||||
* if set to 0xFFFFFFFF cell_id not yet recovered */
|
* if set to 0xFFFFFFFF cell_id not yet recovered */
|
||||||
|
|
||||||
} SMSHOSTLIB_STATISTICS_ST;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct SmsMsgStatisticsInfo_ST {
|
||||||
{
|
|
||||||
u32 RequestResult;
|
u32 RequestResult;
|
||||||
|
|
||||||
SMSHOSTLIB_STATISTICS_ST Stat;
|
struct SMSHOSTLIB_STATISTICS_ST Stat;
|
||||||
|
|
||||||
/* Split the calc of the SNR in DAB */
|
/* Split the calc of the SNR in DAB */
|
||||||
u32 Signal; /* dB */
|
u32 Signal; /* dB */
|
||||||
u32 Noise; /* dB */
|
u32 Noise; /* dB */
|
||||||
|
|
||||||
} SmsMsgStatisticsInfo_ST;
|
};
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_ISDBT_LAYER_STAT_S
|
|
||||||
{
|
|
||||||
/* Per-layer information */
|
|
||||||
u32 CodeRate; /* Code Rate from SMSHOSTLIB_CODE_RATE_ET,
|
|
||||||
* 255 means layer does not exist */
|
|
||||||
u32 Constellation; /* Constellation from SMSHOSTLIB_CONSTELLATION_ET,
|
|
||||||
* 255 means layer does not exist */
|
|
||||||
u32 BER; /* Post Viterbi BER [1E-5], 0xFFFFFFFF indicate N/A */
|
|
||||||
u32 BERErrorCount; /* Post Viterbi Error Bits Count */
|
|
||||||
u32 BERBitCount; /* Post Viterbi Total Bits Count */
|
|
||||||
u32 PreBER; /* Pre Viterbi BER [1E-5], 0xFFFFFFFF indicate N/A */
|
|
||||||
u32 TS_PER; /* Transport stream PER [%], 0xFFFFFFFF indicate N/A */
|
|
||||||
u32 ErrorTSPackets; /* Number of erroneous transport-stream packets */
|
|
||||||
u32 TotalTSPackets; /* Total number of transport-stream packets */
|
|
||||||
u32 TILdepthI; /* Time interleaver depth I parameter,
|
|
||||||
* 255 means layer does not exist */
|
|
||||||
u32 NumberOfSegments; /* Number of segments in layer A,
|
|
||||||
* 255 means layer does not exist */
|
|
||||||
u32 TMCCErrors; /* TMCC errors */
|
|
||||||
} SMSHOSTLIB_ISDBT_LAYER_STAT_ST;
|
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_STATISTICS_ISDBT_S
|
struct smsdvb_client_t {
|
||||||
{
|
|
||||||
u32 StatisticsType; /* Enumerator identifying the type of the
|
|
||||||
* structure. Values are the same as
|
|
||||||
* SMSHOSTLIB_DEVICE_MODES_E
|
|
||||||
*
|
|
||||||
* This field MUST always be first in any
|
|
||||||
* statistics structure */
|
|
||||||
|
|
||||||
u32 FullSize; /* Total size of the structure returned by the modem.
|
|
||||||
* If the size requested by the host is smaller than
|
|
||||||
* FullSize, the struct will be truncated */
|
|
||||||
|
|
||||||
/* Common parameters */
|
|
||||||
u32 IsRfLocked; /* 0 - not locked, 1 - locked */
|
|
||||||
u32 IsDemodLocked; /* 0 - not locked, 1 - locked */
|
|
||||||
u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */
|
|
||||||
|
|
||||||
/* Reception quality */
|
|
||||||
s32 SNR; /* dB */
|
|
||||||
s32 RSSI; /* dBm */
|
|
||||||
s32 InBandPwr; /* In band power in dBM */
|
|
||||||
s32 CarrierOffset; /* Carrier Offset in Hz */
|
|
||||||
|
|
||||||
/* Transmission parameters */
|
|
||||||
u32 Frequency; /* Frequency in Hz */
|
|
||||||
u32 Bandwidth; /* Bandwidth in MHz */
|
|
||||||
u32 TransmissionMode; /* ISDB-T transmission mode */
|
|
||||||
u32 ModemState; /* 0 - Acquisition, 1 - Locked */
|
|
||||||
u32 GuardInterval; /* Guard Interval, 1 divided by value */
|
|
||||||
u32 SystemType; /* ISDB-T system type (ISDB-T / ISDB-Tsb) */
|
|
||||||
u32 PartialReception; /* TRUE - partial reception, FALSE otherwise */
|
|
||||||
u32 NumOfLayers; /* Number of ISDB-T layers in the network */
|
|
||||||
|
|
||||||
/* Per-layer information */
|
|
||||||
/* Layers A, B and C */
|
|
||||||
SMSHOSTLIB_ISDBT_LAYER_STAT_ST LayerInfo[3]; /* Per-layer statistics,
|
|
||||||
see SMSHOSTLIB_ISDBT_LAYER_STAT_ST */
|
|
||||||
|
|
||||||
/* Interface information */
|
|
||||||
u32 SmsToHostTxErrors; /* Total number of transmission errors. */
|
|
||||||
|
|
||||||
} SMSHOSTLIB_STATISTICS_ISDBT_ST;
|
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_STATISTICS_DVB_S
|
|
||||||
{
|
|
||||||
u32 StatisticsType; /* Enumerator identifying the type of the
|
|
||||||
* structure. Values are the same as
|
|
||||||
* SMSHOSTLIB_DEVICE_MODES_E
|
|
||||||
* This field MUST always first in any
|
|
||||||
* statistics structure */
|
|
||||||
|
|
||||||
u32 FullSize; /* Total size of the structure returned by the modem.
|
|
||||||
* If the size requested by the host is smaller than
|
|
||||||
* FullSize, the struct will be truncated */
|
|
||||||
/* Common parameters */
|
|
||||||
u32 IsRfLocked; /* 0 - not locked, 1 - locked */
|
|
||||||
u32 IsDemodLocked; /* 0 - not locked, 1 - locked */
|
|
||||||
u32 IsExternalLNAOn; /* 0 - external LNA off, 1 - external LNA on */
|
|
||||||
|
|
||||||
/* Reception quality */
|
|
||||||
s32 SNR; /* dB */
|
|
||||||
u32 BER; /* Post Viterbi BER [1E-5] */
|
|
||||||
u32 BERErrorCount; /* Number of errornous SYNC bits. */
|
|
||||||
u32 BERBitCount; /* Total number of SYNC bits. */
|
|
||||||
u32 TS_PER; /* Transport stream PER, 0xFFFFFFFF indicate N/A */
|
|
||||||
u32 MFER; /* DVB-H frame error rate in percentage,
|
|
||||||
* 0xFFFFFFFF indicate N/A, valid only for DVB-H */
|
|
||||||
s32 RSSI; /* dBm */
|
|
||||||
s32 InBandPwr; /* In band power in dBM */
|
|
||||||
s32 CarrierOffset; /* Carrier Offset in bin/1024 */
|
|
||||||
|
|
||||||
/* Transmission parameters */
|
|
||||||
u32 Frequency; /* Frequency in Hz */
|
|
||||||
u32 Bandwidth; /* Bandwidth in MHz */
|
|
||||||
u32 ModemState; /* from SMSHOSTLIB_DVB_MODEM_STATE_ET */
|
|
||||||
u32 TransmissionMode; /* FFT mode carriers in Kilos */
|
|
||||||
u32 GuardInterval; /* Guard Interval, 1 divided by value */
|
|
||||||
u32 CodeRate; /* Code Rate from SMSHOSTLIB_CODE_RATE_ET */
|
|
||||||
u32 LPCodeRate; /* Low Priority Code Rate from
|
|
||||||
* SMSHOSTLIB_CODE_RATE_ET */
|
|
||||||
u32 Hierarchy; /* Hierarchy from SMSHOSTLIB_HIERARCHY_ET */
|
|
||||||
u32 Constellation; /* Constellation from SMSHOSTLIB_CONSTELLATION_ET */
|
|
||||||
|
|
||||||
/* Burst parameters, valid only for DVB-H */
|
|
||||||
u32 BurstSize; /* Current burst size in bytes */
|
|
||||||
u32 BurstDuration; /* Current burst duration in mSec */
|
|
||||||
u32 BurstCycleTime; /* Current burst cycle time in mSec */
|
|
||||||
u32 CalculatedBurstCycleTime; /* Current burst cycle time in mSec,
|
|
||||||
* as calculated by demodulator */
|
|
||||||
u32 NumOfRows; /* Number of rows in MPE table */
|
|
||||||
u32 NumOfPaddCols; /* Number of padding columns in MPE table */
|
|
||||||
u32 NumOfPunctCols; /* Number of puncturing columns in MPE table */
|
|
||||||
|
|
||||||
u32 ErrorTSPackets; /* Number of erroneous transport-stream packets */
|
|
||||||
u32 TotalTSPackets; /* Total number of transport-stream packets */
|
|
||||||
|
|
||||||
u32 NumOfValidMpeTlbs; /* Number of MPE tables which do not include
|
|
||||||
* errors after MPE RS decoding */
|
|
||||||
u32 NumOfInvalidMpeTlbs; /* Number of MPE tables which include
|
|
||||||
* errors after MPE RS decoding */
|
|
||||||
u32 NumOfCorrectedMpeTlbs; /* Number of MPE tables which were
|
|
||||||
* corrected by MPE RS decoding */
|
|
||||||
|
|
||||||
u32 NumMPEReceived; /* DVB-H, Num MPE section received */
|
|
||||||
|
|
||||||
/* DVB-H TPS parameters */
|
|
||||||
u32 CellId; /* TPS Cell ID in bits 15..0, bits 31..16 zero;
|
|
||||||
* if set to 0xFFFFFFFF cell_id not yet recovered */
|
|
||||||
u32 DvbhSrvIndHP; /* DVB-H service indication info,
|
|
||||||
* bit 1 - Time Slicing indicator,
|
|
||||||
* bit 0 - MPE-FEC indicator */
|
|
||||||
u32 DvbhSrvIndLP; /* DVB-H service indication info,
|
|
||||||
* bit 1 - Time Slicing indicator,
|
|
||||||
* bit 0 - MPE-FEC indicator */
|
|
||||||
|
|
||||||
/* Interface information */
|
|
||||||
u32 SmsToHostTxErrors; /* Total number of transmission errors. */
|
|
||||||
|
|
||||||
} SMSHOSTLIB_STATISTICS_DVB_ST;
|
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_GPIO_CONFIG_S
|
|
||||||
{
|
|
||||||
u8 Direction; /* GPIO direction: Input - 0, Output - 1 */
|
|
||||||
u8 PullUpDown; /* PullUp/PullDown: None - 0,
|
|
||||||
* PullDown - 1, PullUp - 2, Keeper - 3 */
|
|
||||||
u8 InputCharacteristics; /* Input Characteristics: Normal - 0,
|
|
||||||
* Schmitt trigger - 1 */
|
|
||||||
u8 OutputSlewRate; /* Output Slew Rate:
|
|
||||||
* Fast slew rate - 0, Slow slew rate - 1 */
|
|
||||||
u8 OutputDriving; /* Output driving capability:
|
|
||||||
* 4mA - 0, 8mA - 1, 12mA - 2, 16mA - 3 */
|
|
||||||
} SMSHOSTLIB_GPIO_CONFIG_ST;
|
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_I2C_REQ_S
|
|
||||||
{
|
|
||||||
u32 DeviceAddress; /* I2c device address */
|
|
||||||
u32 WriteCount; /* number of bytes to write */
|
|
||||||
u32 ReadCount; /* number of bytes to read */
|
|
||||||
u8 Data[1];
|
|
||||||
} SMSHOSTLIB_I2C_REQ_ST;
|
|
||||||
|
|
||||||
typedef struct SMSHOSTLIB_I2C_RES_S
|
|
||||||
{
|
|
||||||
u32 Status; /* non-zero value in case of failure */
|
|
||||||
u32 ReadCount; /* number of bytes read */
|
|
||||||
u8 Data[1];
|
|
||||||
} SMSHOSTLIB_I2C_RES_ST;
|
|
||||||
|
|
||||||
typedef struct _smsdvb_client
|
|
||||||
{
|
|
||||||
struct list_head entry;
|
struct list_head entry;
|
||||||
|
|
||||||
smscore_device_t *coredev;
|
struct smscore_device_t *coredev;
|
||||||
smscore_client_t *smsclient;
|
struct smscore_client_t *smsclient;
|
||||||
|
|
||||||
struct dvb_adapter adapter;
|
struct dvb_adapter adapter;
|
||||||
struct dvb_demux demux;
|
struct dvb_demux demux;
|
||||||
@@ -543,7 +362,7 @@ typedef struct _smsdvb_client
|
|||||||
/* todo: save freq/band instead whole struct */
|
/* todo: save freq/band instead whole struct */
|
||||||
struct dvb_frontend_parameters fe_params;
|
struct dvb_frontend_parameters fe_params;
|
||||||
|
|
||||||
} smsdvb_client_t;
|
};
|
||||||
|
|
||||||
extern void smscore_registry_setmode(char *devpath, int mode);
|
extern void smscore_registry_setmode(char *devpath, int mode);
|
||||||
extern int smscore_registry_getmode(char *devpath);
|
extern int smscore_registry_getmode(char *devpath);
|
||||||
@@ -551,37 +370,39 @@ extern int smscore_registry_getmode(char *devpath);
|
|||||||
extern int smscore_register_hotplug(hotplug_t hotplug);
|
extern int smscore_register_hotplug(hotplug_t hotplug);
|
||||||
extern void smscore_unregister_hotplug(hotplug_t hotplug);
|
extern void smscore_unregister_hotplug(hotplug_t hotplug);
|
||||||
|
|
||||||
extern int smscore_register_device(smsdevice_params_t *params,
|
extern int smscore_register_device(struct smsdevice_params_t *params,
|
||||||
smscore_device_t **coredev);
|
struct smscore_device_t **coredev);
|
||||||
extern void smscore_unregister_device(smscore_device_t *coredev);
|
extern void smscore_unregister_device(struct smscore_device_t *coredev);
|
||||||
|
|
||||||
extern int smscore_start_device(smscore_device_t *coredev);
|
extern int smscore_start_device(struct smscore_device_t *coredev);
|
||||||
extern int smscore_load_firmware(smscore_device_t *coredev, char *filename,
|
extern int smscore_load_firmware(struct smscore_device_t *coredev,
|
||||||
loadfirmware_t loadfirmware_handler);
|
char *filename,
|
||||||
|
loadfirmware_t loadfirmware_handler);
|
||||||
|
|
||||||
extern int smscore_load_firmware_from_buffer(smscore_device_t *coredev,
|
extern int smscore_load_firmware_from_buffer(struct smscore_device_t *coredev,
|
||||||
u8 *buffer, int size,
|
u8 *buffer, int size,
|
||||||
int new_mode);
|
int new_mode);
|
||||||
|
|
||||||
extern int smscore_set_device_mode(smscore_device_t *coredev, int mode);
|
extern int smscore_set_device_mode(struct smscore_device_t *coredev, int mode);
|
||||||
extern int smscore_get_device_mode(smscore_device_t *coredev);
|
extern int smscore_get_device_mode(struct smscore_device_t *coredev);
|
||||||
|
|
||||||
extern int smscore_register_client(smscore_device_t *coredev,
|
extern int smscore_register_client(struct smscore_device_t *coredev,
|
||||||
smsclient_params_t *params,
|
struct smsclient_params_t *params,
|
||||||
smscore_client_t **client);
|
struct smscore_client_t **client);
|
||||||
extern void smscore_unregister_client(smscore_client_t *client);
|
extern void smscore_unregister_client(struct smscore_client_t *client);
|
||||||
|
|
||||||
extern int smsclient_sendrequest(smscore_client_t *client,
|
extern int smsclient_sendrequest(struct smscore_client_t *client,
|
||||||
void *buffer, size_t size);
|
void *buffer, size_t size);
|
||||||
extern void smscore_onresponse(smscore_device_t *coredev,
|
extern void smscore_onresponse(struct smscore_device_t *coredev,
|
||||||
smscore_buffer_t *cb);
|
struct smscore_buffer_t *cb);
|
||||||
|
|
||||||
extern int smscore_get_common_buffer_size(smscore_device_t *coredev);
|
extern int smscore_get_common_buffer_size(struct smscore_device_t *coredev);
|
||||||
extern int smscore_map_common_buffer(smscore_device_t *coredev,
|
extern int smscore_map_common_buffer(struct smscore_device_t *coredev,
|
||||||
struct vm_area_struct *vma);
|
struct vm_area_struct *vma);
|
||||||
|
|
||||||
extern smscore_buffer_t *smscore_getbuffer(smscore_device_t *coredev);
|
extern struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev);
|
||||||
extern void smscore_putbuffer(smscore_device_t *coredev, smscore_buffer_t *cb);
|
extern void smscore_putbuffer(struct smscore_device_t *coredev,
|
||||||
|
struct smscore_buffer_t *cb);
|
||||||
|
|
||||||
/* smsdvb.c */
|
/* smsdvb.c */
|
||||||
int smsdvb_register(void);
|
int smsdvb_register(void);
|
||||||
|
@@ -29,15 +29,16 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
|||||||
struct list_head g_smsdvb_clients;
|
struct list_head g_smsdvb_clients;
|
||||||
kmutex_t g_smsdvb_clientslock;
|
kmutex_t g_smsdvb_clientslock;
|
||||||
|
|
||||||
int smsdvb_onresponse(void *context, smscore_buffer_t *cb)
|
int smsdvb_onresponse(void *context, struct smscore_buffer_t *cb)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = (smsdvb_client_t *) context;
|
struct smsdvb_client_t *client = (struct smsdvb_client_t *) context;
|
||||||
SmsMsgHdr_ST *phdr = (SmsMsgHdr_ST *)(((u8 *) cb->p) + cb->offset);
|
struct SmsMsgHdr_ST *phdr =
|
||||||
|
(struct SmsMsgHdr_ST *)(((u8 *) cb->p) + cb->offset);
|
||||||
|
|
||||||
switch (phdr->msgType) {
|
switch (phdr->msgType) {
|
||||||
case MSG_SMS_DVBT_BDA_DATA:
|
case MSG_SMS_DVBT_BDA_DATA:
|
||||||
dvb_dmx_swfilter(&client->demux, (u8 *)(phdr + 1),
|
dvb_dmx_swfilter(&client->demux, (u8 *)(phdr + 1),
|
||||||
cb->size - sizeof(SmsMsgHdr_ST));
|
cb->size - sizeof(struct SmsMsgHdr_ST));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_SMS_RF_TUNE_RES:
|
case MSG_SMS_RF_TUNE_RES:
|
||||||
@@ -46,8 +47,8 @@ int smsdvb_onresponse(void *context, smscore_buffer_t *cb)
|
|||||||
|
|
||||||
case MSG_SMS_GET_STATISTICS_RES:
|
case MSG_SMS_GET_STATISTICS_RES:
|
||||||
{
|
{
|
||||||
SmsMsgStatisticsInfo_ST *p =
|
struct SmsMsgStatisticsInfo_ST *p =
|
||||||
(SmsMsgStatisticsInfo_ST *)(phdr + 1);
|
(struct SmsMsgStatisticsInfo_ST *)(phdr + 1);
|
||||||
|
|
||||||
if (p->Stat.IsDemodLocked) {
|
if (p->Stat.IsDemodLocked) {
|
||||||
client->fe_status = FE_HAS_SIGNAL |
|
client->fe_status = FE_HAS_SIGNAL |
|
||||||
@@ -82,7 +83,7 @@ int smsdvb_onresponse(void *context, smscore_buffer_t *cb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smsdvb_unregister_client(smsdvb_client_t *client)
|
void smsdvb_unregister_client(struct smsdvb_client_t *client)
|
||||||
{
|
{
|
||||||
/* must be called under clientslock */
|
/* must be called under clientslock */
|
||||||
|
|
||||||
@@ -100,16 +101,16 @@ void smsdvb_onremove(void *context)
|
|||||||
{
|
{
|
||||||
kmutex_lock(&g_smsdvb_clientslock);
|
kmutex_lock(&g_smsdvb_clientslock);
|
||||||
|
|
||||||
smsdvb_unregister_client((smsdvb_client_t *) context);
|
smsdvb_unregister_client((struct smsdvb_client_t *) context);
|
||||||
|
|
||||||
kmutex_unlock(&g_smsdvb_clientslock);
|
kmutex_unlock(&g_smsdvb_clientslock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smsdvb_start_feed(struct dvb_demux_feed *feed)
|
static int smsdvb_start_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client =
|
struct smsdvb_client_t *client =
|
||||||
container_of(feed->demux, smsdvb_client_t, demux);
|
container_of(feed->demux, struct smsdvb_client_t, demux);
|
||||||
SmsMsgData_ST PidMsg;
|
struct SmsMsgData_ST PidMsg;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s add pid %d(%x)\n", __func__,
|
printk(KERN_DEBUG "%s add pid %d(%x)\n", __func__,
|
||||||
feed->pid, feed->pid);
|
feed->pid, feed->pid);
|
||||||
@@ -127,9 +128,9 @@ static int smsdvb_start_feed(struct dvb_demux_feed *feed)
|
|||||||
|
|
||||||
static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
|
static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client =
|
struct smsdvb_client_t *client =
|
||||||
container_of(feed->demux, smsdvb_client_t, demux);
|
container_of(feed->demux, struct smsdvb_client_t, demux);
|
||||||
SmsMsgData_ST PidMsg;
|
struct SmsMsgData_ST PidMsg;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s remove pid %d(%x)\n", __func__,
|
printk(KERN_DEBUG "%s remove pid %d(%x)\n", __func__,
|
||||||
feed->pid, feed->pid);
|
feed->pid, feed->pid);
|
||||||
@@ -145,7 +146,7 @@ static int smsdvb_stop_feed(struct dvb_demux_feed *feed)
|
|||||||
&PidMsg, sizeof(PidMsg));
|
&PidMsg, sizeof(PidMsg));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smsdvb_sendrequest_and_wait(smsdvb_client_t *client,
|
static int smsdvb_sendrequest_and_wait(struct smsdvb_client_t *client,
|
||||||
void *buffer, size_t size,
|
void *buffer, size_t size,
|
||||||
struct completion *completion)
|
struct completion *completion)
|
||||||
{
|
{
|
||||||
@@ -158,18 +159,19 @@ static int smsdvb_sendrequest_and_wait(smsdvb_client_t *client,
|
|||||||
0 : -ETIME;
|
0 : -ETIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smsdvb_send_statistics_request(smsdvb_client_t *client)
|
static int smsdvb_send_statistics_request(struct smsdvb_client_t *client)
|
||||||
{
|
{
|
||||||
SmsMsgHdr_ST Msg = { MSG_SMS_GET_STATISTICS_REQ,
|
struct SmsMsgHdr_ST Msg = { MSG_SMS_GET_STATISTICS_REQ,
|
||||||
DVBT_BDA_CONTROL_MSG_ID,
|
DVBT_BDA_CONTROL_MSG_ID,
|
||||||
HIF_TASK, sizeof(SmsMsgHdr_ST), 0 };
|
HIF_TASK, sizeof(struct SmsMsgHdr_ST), 0 };
|
||||||
return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
|
return smsdvb_sendrequest_and_wait(client, &Msg, sizeof(Msg),
|
||||||
&client->stat_done);
|
&client->stat_done);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat)
|
static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = container_of(fe, smsdvb_client_t, frontend);
|
struct smsdvb_client_t *client =
|
||||||
|
container_of(fe, struct smsdvb_client_t, frontend);
|
||||||
int rc = smsdvb_send_statistics_request(client);
|
int rc = smsdvb_send_statistics_request(client);
|
||||||
|
|
||||||
if (!rc)
|
if (!rc)
|
||||||
@@ -180,7 +182,8 @@ static int smsdvb_read_status(struct dvb_frontend *fe, fe_status_t *stat)
|
|||||||
|
|
||||||
static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber)
|
static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = container_of(fe, smsdvb_client_t, frontend);
|
struct smsdvb_client_t *client =
|
||||||
|
container_of(fe, struct smsdvb_client_t, frontend);
|
||||||
int rc = smsdvb_send_statistics_request(client);
|
int rc = smsdvb_send_statistics_request(client);
|
||||||
|
|
||||||
if (!rc)
|
if (!rc)
|
||||||
@@ -191,7 +194,8 @@ static int smsdvb_read_ber(struct dvb_frontend *fe, u32 *ber)
|
|||||||
|
|
||||||
static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = container_of(fe, smsdvb_client_t, frontend);
|
struct smsdvb_client_t *client =
|
||||||
|
container_of(fe, struct smsdvb_client_t, frontend);
|
||||||
int rc = smsdvb_send_statistics_request(client);
|
int rc = smsdvb_send_statistics_request(client);
|
||||||
|
|
||||||
if (!rc)
|
if (!rc)
|
||||||
@@ -202,7 +206,8 @@ static int smsdvb_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
|
|||||||
|
|
||||||
static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr)
|
static int smsdvb_read_snr(struct dvb_frontend *fe, u16 *snr)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = container_of(fe, smsdvb_client_t, frontend);
|
struct smsdvb_client_t *client =
|
||||||
|
container_of(fe, struct smsdvb_client_t, frontend);
|
||||||
int rc = smsdvb_send_statistics_request(client);
|
int rc = smsdvb_send_statistics_request(client);
|
||||||
|
|
||||||
if (!rc)
|
if (!rc)
|
||||||
@@ -225,11 +230,11 @@ static int smsdvb_get_tune_settings(struct dvb_frontend *fe,
|
|||||||
static int smsdvb_set_frontend(struct dvb_frontend *fe,
|
static int smsdvb_set_frontend(struct dvb_frontend *fe,
|
||||||
struct dvb_frontend_parameters *fep)
|
struct dvb_frontend_parameters *fep)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = container_of(fe, smsdvb_client_t, frontend);
|
struct smsdvb_client_t *client =
|
||||||
|
container_of(fe, struct smsdvb_client_t, frontend);
|
||||||
|
|
||||||
struct
|
struct {
|
||||||
{
|
struct SmsMsgHdr_ST Msg;
|
||||||
SmsMsgHdr_ST Msg;
|
|
||||||
u32 Data[3];
|
u32 Data[3];
|
||||||
} Msg;
|
} Msg;
|
||||||
|
|
||||||
@@ -259,7 +264,8 @@ static int smsdvb_set_frontend(struct dvb_frontend *fe,
|
|||||||
static int smsdvb_get_frontend(struct dvb_frontend *fe,
|
static int smsdvb_get_frontend(struct dvb_frontend *fe,
|
||||||
struct dvb_frontend_parameters *fep)
|
struct dvb_frontend_parameters *fep)
|
||||||
{
|
{
|
||||||
smsdvb_client_t *client = container_of(fe, smsdvb_client_t, frontend);
|
struct smsdvb_client_t *client =
|
||||||
|
container_of(fe, struct smsdvb_client_t, frontend);
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s\n", __func__);
|
printk(KERN_DEBUG "%s\n", __func__);
|
||||||
|
|
||||||
@@ -303,11 +309,11 @@ static struct dvb_frontend_ops smsdvb_fe_ops = {
|
|||||||
.read_snr = smsdvb_read_snr,
|
.read_snr = smsdvb_read_snr,
|
||||||
};
|
};
|
||||||
|
|
||||||
int smsdvb_hotplug(smscore_device_t *coredev,
|
int smsdvb_hotplug(struct smscore_device_t *coredev,
|
||||||
struct device *device, int arrival)
|
struct device *device, int arrival)
|
||||||
{
|
{
|
||||||
smsclient_params_t params;
|
struct smsclient_params_t params;
|
||||||
smsdvb_client_t *client;
|
struct smsdvb_client_t *client;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* device removal handled by onremove callback */
|
/* device removal handled by onremove callback */
|
||||||
@@ -320,7 +326,7 @@ int smsdvb_hotplug(smscore_device_t *coredev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
client = kzalloc(sizeof(smsdvb_client_t), GFP_KERNEL);
|
client = kzalloc(sizeof(struct smsdvb_client_t), GFP_KERNEL);
|
||||||
if (!client) {
|
if (!client) {
|
||||||
printk(KERN_INFO "%s kmalloc() failed\n", __func__);
|
printk(KERN_INFO "%s kmalloc() failed\n", __func__);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@@ -439,7 +445,7 @@ void smsdvb_unregister(void)
|
|||||||
|
|
||||||
while (!list_empty(&g_smsdvb_clients))
|
while (!list_empty(&g_smsdvb_clients))
|
||||||
smsdvb_unregister_client(
|
smsdvb_unregister_client(
|
||||||
(smsdvb_client_t *) g_smsdvb_clients.next);
|
(struct smsdvb_client_t *) g_smsdvb_clients.next);
|
||||||
|
|
||||||
kmutex_unlock(&g_smsdvb_clientslock);
|
kmutex_unlock(&g_smsdvb_clientslock);
|
||||||
}
|
}
|
||||||
|
@@ -40,33 +40,31 @@
|
|||||||
#define USB_PID_NOVA_B 0x0201
|
#define USB_PID_NOVA_B 0x0201
|
||||||
#define USB_PID_VEGA 0x0300
|
#define USB_PID_VEGA 0x0300
|
||||||
|
|
||||||
typedef struct _smsusb_device smsusb_device_t;
|
struct smsusb_device_t;
|
||||||
|
|
||||||
typedef struct _smsusb_urb
|
struct smsusb_urb_t {
|
||||||
{
|
struct smscore_buffer_t *cb;
|
||||||
smscore_buffer_t *cb;
|
struct smsusb_device_t *dev;
|
||||||
smsusb_device_t *dev;
|
|
||||||
|
|
||||||
struct urb urb;
|
struct urb urb;
|
||||||
} smsusb_urb_t;
|
};
|
||||||
|
|
||||||
typedef struct _smsusb_device
|
struct smsusb_device_t {
|
||||||
{
|
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
smscore_device_t *coredev;
|
struct smscore_device_t *coredev;
|
||||||
|
|
||||||
smsusb_urb_t surbs[MAX_URBS];
|
struct smsusb_urb_t surbs[MAX_URBS];
|
||||||
|
|
||||||
int response_alignment;
|
int response_alignment;
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
} *psmsusb_device_t;
|
};
|
||||||
|
|
||||||
int smsusb_submit_urb(smsusb_device_t *dev, smsusb_urb_t *surb);
|
int smsusb_submit_urb(struct smsusb_device_t *dev, struct smsusb_urb_t *surb);
|
||||||
|
|
||||||
void smsusb_onresponse(struct urb *urb)
|
void smsusb_onresponse(struct urb *urb)
|
||||||
{
|
{
|
||||||
smsusb_urb_t *surb = (smsusb_urb_t *) urb->context;
|
struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context;
|
||||||
smsusb_device_t *dev = surb->dev;
|
struct smsusb_device_t *dev = surb->dev;
|
||||||
|
|
||||||
if (urb->status < 0) {
|
if (urb->status < 0) {
|
||||||
printk(KERN_INFO "%s error, urb status %d, %d bytes\n",
|
printk(KERN_INFO "%s error, urb status %d, %d bytes\n",
|
||||||
@@ -75,7 +73,7 @@ void smsusb_onresponse(struct urb *urb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (urb->actual_length > 0) {
|
if (urb->actual_length > 0) {
|
||||||
SmsMsgHdr_ST *phdr = (SmsMsgHdr_ST *) surb->cb->p;
|
struct SmsMsgHdr_ST *phdr = (struct SmsMsgHdr_ST *) surb->cb->p;
|
||||||
|
|
||||||
if (urb->actual_length >= phdr->msgLength) {
|
if (urb->actual_length >= phdr->msgLength) {
|
||||||
surb->cb->size = phdr->msgLength;
|
surb->cb->size = phdr->msgLength;
|
||||||
@@ -102,7 +100,7 @@ void smsusb_onresponse(struct urb *urb)
|
|||||||
/* move buffer pointer and
|
/* move buffer pointer and
|
||||||
* copy header to its new location */
|
* copy header to its new location */
|
||||||
memcpy((char *) phdr + surb->cb->offset,
|
memcpy((char *) phdr + surb->cb->offset,
|
||||||
phdr, sizeof(SmsMsgHdr_ST));
|
phdr, sizeof(struct SmsMsgHdr_ST));
|
||||||
} else
|
} else
|
||||||
surb->cb->offset = 0;
|
surb->cb->offset = 0;
|
||||||
|
|
||||||
@@ -119,7 +117,7 @@ exit_and_resubmit:
|
|||||||
smsusb_submit_urb(dev, surb);
|
smsusb_submit_urb(dev, surb);
|
||||||
}
|
}
|
||||||
|
|
||||||
int smsusb_submit_urb(smsusb_device_t *dev, smsusb_urb_t *surb)
|
int smsusb_submit_urb(struct smsusb_device_t *dev, struct smsusb_urb_t *surb)
|
||||||
{
|
{
|
||||||
if (!surb->cb) {
|
if (!surb->cb) {
|
||||||
surb->cb = smscore_getbuffer(dev->coredev);
|
surb->cb = smscore_getbuffer(dev->coredev);
|
||||||
@@ -145,7 +143,7 @@ int smsusb_submit_urb(smsusb_device_t *dev, smsusb_urb_t *surb)
|
|||||||
return usb_submit_urb(&surb->urb, GFP_ATOMIC);
|
return usb_submit_urb(&surb->urb, GFP_ATOMIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void smsusb_stop_streaming(smsusb_device_t *dev)
|
void smsusb_stop_streaming(struct smsusb_device_t *dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -159,7 +157,7 @@ void smsusb_stop_streaming(smsusb_device_t *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int smsusb_start_streaming(smsusb_device_t *dev)
|
int smsusb_start_streaming(struct smsusb_device_t *dev)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
@@ -178,7 +176,7 @@ int smsusb_start_streaming(smsusb_device_t *dev)
|
|||||||
|
|
||||||
int smsusb_sendrequest(void *context, void *buffer, size_t size)
|
int smsusb_sendrequest(void *context, void *buffer, size_t size)
|
||||||
{
|
{
|
||||||
smsusb_device_t *dev = (smsusb_device_t *) context;
|
struct smsusb_device_t *dev = (struct smsusb_device_t *) context;
|
||||||
int dummy;
|
int dummy;
|
||||||
|
|
||||||
return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
|
return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
|
||||||
@@ -235,7 +233,8 @@ int smsusb1_load_firmware(struct usb_device *udev, int id)
|
|||||||
|
|
||||||
void smsusb1_detectmode(void *context, int *mode)
|
void smsusb1_detectmode(void *context, int *mode)
|
||||||
{
|
{
|
||||||
char *product_string = ((smsusb_device_t *) context)->udev->product;
|
char *product_string =
|
||||||
|
((struct smsusb_device_t *) context)->udev->product;
|
||||||
|
|
||||||
*mode = DEVICE_MODE_NONE;
|
*mode = DEVICE_MODE_NONE;
|
||||||
|
|
||||||
@@ -256,8 +255,8 @@ void smsusb1_detectmode(void *context, int *mode)
|
|||||||
|
|
||||||
int smsusb1_setmode(void *context, int mode)
|
int smsusb1_setmode(void *context, int mode)
|
||||||
{
|
{
|
||||||
SmsMsgHdr_ST Msg = { MSG_SW_RELOAD_REQ, 0, HIF_TASK,
|
struct SmsMsgHdr_ST Msg = { MSG_SW_RELOAD_REQ, 0, HIF_TASK,
|
||||||
sizeof(SmsMsgHdr_ST), 0 };
|
sizeof(struct SmsMsgHdr_ST), 0 };
|
||||||
|
|
||||||
if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) {
|
if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) {
|
||||||
printk(KERN_INFO "%s invalid firmware id specified %d\n",
|
printk(KERN_INFO "%s invalid firmware id specified %d\n",
|
||||||
@@ -270,7 +269,8 @@ int smsusb1_setmode(void *context, int mode)
|
|||||||
|
|
||||||
void smsusb_term_device(struct usb_interface *intf)
|
void smsusb_term_device(struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
smsusb_device_t *dev = (smsusb_device_t *) usb_get_intfdata(intf);
|
struct smsusb_device_t *dev =
|
||||||
|
(struct smsusb_device_t *) usb_get_intfdata(intf);
|
||||||
|
|
||||||
if (dev) {
|
if (dev) {
|
||||||
smsusb_stop_streaming(dev);
|
smsusb_stop_streaming(dev);
|
||||||
@@ -289,15 +289,15 @@ void smsusb_term_device(struct usb_interface *intf)
|
|||||||
|
|
||||||
int smsusb_init_device(struct usb_interface *intf)
|
int smsusb_init_device(struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
smsdevice_params_t params;
|
struct smsdevice_params_t params;
|
||||||
smsusb_device_t *dev;
|
struct smsusb_device_t *dev;
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
/* create device object */
|
/* create device object */
|
||||||
dev = kzalloc(sizeof(smsusb_device_t), GFP_KERNEL);
|
dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
printk(KERN_INFO "%s kzalloc(sizeof(smsusb_device_t) failed\n",
|
printk(KERN_INFO "%s kzalloc(sizeof(struct smsusb_device_t) "
|
||||||
__func__);
|
"failed\n", __func__);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,7 +334,7 @@ int smsusb_init_device(struct usb_interface *intf)
|
|||||||
dev->buffer_size = USB2_BUFFER_SIZE;
|
dev->buffer_size = USB2_BUFFER_SIZE;
|
||||||
dev->response_alignment =
|
dev->response_alignment =
|
||||||
dev->udev->ep_in[1]->desc.wMaxPacketSize -
|
dev->udev->ep_in[1]->desc.wMaxPacketSize -
|
||||||
sizeof(SmsMsgHdr_ST);
|
sizeof(struct SmsMsgHdr_ST);
|
||||||
|
|
||||||
params.flags |= SMS_DEVICE_FAMILY2;
|
params.flags |= SMS_DEVICE_FAMILY2;
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user