Skip to content
Snippets Groups Projects
Commit ca37ba54 authored by Ezekiel Dohmen's avatar Ezekiel Dohmen
Browse files

Fixing segfault by using new proc interface

parent 663afbb1
No related branches found
No related tags found
2 merge requests!439RCG 5.0 release fro deb 10,!415Cdsrfm to use new dolphin interface
......@@ -49,15 +49,32 @@
#define DAEMON_RESP_TIMEOUT_MS 2000
#define DAEMON_RESP_CHECK_RATE_MS 30
int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file);
ssize_t cdsrfm_proc_read(struct file *sp_file, char __user *buf,size_t size,loff_t *offset);
int cdsrfm_proc_release(struct inode *sp_inode,struct file *sp_file);
// struct for using /proc files
static struct file_operations fops;
static struct file_operations proc_fops;
static const struct proc_ops proc_fops = {
.proc_open = cdsrfm_proc_open,
.proc_read = cdsrfm_proc_read,
//.proc_lseek = seq_lseek,
.proc_release = cdsrfm_proc_release,
};
//fops.owner = THIS_MODULE;
//fops.open = cdsrfm_proc_open;
//fops.read = cdsrfm_proc_read;
//fops.release = cdsrfm_proc_release;
//These define what dolphin adapters are connected
//to the three dolphin networks
#define CORNER_ADAPTER_NUM 0
#define CORNER_ADAPTER_NUM 2
#define RFM0_EX_ADAPTER_NUM 1
#define RFM1_EY_ADAPTER_NUM 2
#define RFM1_EY_ADAPTER_NUM 0
//These map you into the g_dolphin_(read/write)_addrs
#define RFM0_EX_ADDR_INDEX 0
......@@ -438,28 +455,27 @@ static void netlink_recv_resp(struct sk_buff *skb)
read_addr_tmp = (char*)any_msg.as_alloc_resp->addrs[ i ].read_addr;
write_addr_tmp = (char*)any_msg.as_alloc_resp->addrs[ i ].write_addr;
if(i == CORNER_ADAPTER_NUM)
{
g_dolphin_read_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_write_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_read_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
g_dolphin_write_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
}
else if (i == RFM0_EX_ADAPTER_NUM)
{
g_dolphin_read_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_write_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
}
else if (i == RFM1_EY_ADAPTER_NUM)
{
g_dolphin_read_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
g_dolphin_write_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
}
else
{
//No matter the adapter numbers, g_adapter_map orders them as expected below
if(i == g_adapter_map[0])
{
g_dolphin_read_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_write_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_read_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
g_dolphin_write_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
}
else if (i == g_adapter_map[1])
{
g_dolphin_read_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_write_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
}
else if (i == g_adapter_map[2])
{
g_dolphin_read_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
g_dolphin_write_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
}
else
RTSLOG_WARN("netlink_test_recv_msg() - Unsupported index %d in response\n", i);
}
}
break;
......@@ -596,13 +612,17 @@ void finish_dolphin( void )
// ************************************************************************
int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file) {
// ************************************************************************
unsigned max_msg_sz = 128;
read_p = 1;
message = kmalloc(sizeof(char)*128,__GFP_RECLAIM|__GFP_IO|__GFP_FS);
message = kmalloc(sizeof(char)*max_msg_sz,__GFP_RECLAIM|__GFP_IO|__GFP_FS);
if(message == NULL) {
RTSLOG_ERROR("counter proc open\n");
return -ENOMEM;
}
sprintf(message,"%ld %ld %ld %ld %ld %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
RTSLOG_INFO("message: %p\n", message);
snprintf(message, max_msg_sz,
"%ld %ld %ld %ld %ld %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
mycounter[0],mycounter[1],mycounter[2],mycounter[3],mycounter[9],
myactive[0][0],myactive[0][1],myactive[0][2],
myactive[1][0],myactive[1][1],myactive[1][2],
......@@ -616,10 +636,18 @@ int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file) {
ssize_t cdsrfm_proc_read(struct file *sp_file, char __user *buf,size_t size,loff_t *offset) {
// ************************************************************************
int ret;
if(message == NULL)
{
RTSLOG_INFO("message was NULL!\n");
return 0;
}
int len = strlen(message);
RTSLOG_INFO("strlen(message): %d\n", len);
read_p = !read_p;
if(read_p) return 0;
ret = copy_to_user(buf,message,len);
RTSLOG_INFO("ret: %d\n", ret);
return len;
}
......@@ -668,8 +696,8 @@ static int __init lr_switch_init(void)
RTSLOG_ERROR("ERROR! kthread_run\n");
return PTR_ERR(g_monitor_thread);
}
// Bind thread to CPU 2
kthread_bind(g_monitor_thread, 2);
// Bind thread to CPU 8
kthread_bind(g_monitor_thread, 8);
// Start thread
wake_up_process(g_monitor_thread);
......@@ -699,12 +727,13 @@ static int __init lr_switch_init(void)
rts_isolator_exec(6);
// Setup /proc file to move diag info out to user space for EPICS
fops.open = cdsrfm_proc_open;
fops.read = cdsrfm_proc_read;
fops.release = cdsrfm_proc_release;
//fops.owner = THIS_MODULE;
//fops.open = cdsrfm_proc_open;
//fops.read = cdsrfm_proc_read;
//fops.release = cdsrfm_proc_release;
// Create the /proc file
if(!proc_create(ENTRY_NAME,PERM,NULL,(void *)&fops)) {
if(!proc_create(ENTRY_NAME, PERM, NULL, &proc_fops)) {
RTSLOG_ERROR("ERROR! proc_create\n");
remove_proc_entry(ENTRY_NAME,NULL);
return -ENOMEM;
......@@ -720,12 +749,12 @@ static void __exit lr_switch_exit(void)
// ************************************************************************
{
int ret;
RTSLOG_ERROR("Goodbye, cdsrfmswitch is shutting down\n");
RTSLOG_INFO("Goodbye, cdsrfmswitch is shutting down\n");
// Stop the Active Channel monitor thread
ret = kthread_stop(g_monitor_thread);
if (ret != -EINTR)
RTSLOG_ERROR("RFM thread has stopped %ld\n", mycounter[1]);
RTSLOG_INFO("RFM thread has stopped %ld\n", mycounter[1]);
ssleep(2);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment