static int multipdp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int ret, adjust; pdp_arg_t pdp_arg; //DPRINTK("multipdp_ioctl cmd=%d\n", cmd); switch (cmd) { case HN_PDP_ACTIVATE: if (copy_from_user(&pdp_arg, (void *)arg, sizeof(pdp_arg))) return -EFAULT; ret = pdp_activate(&pdp_arg, DEV_TYPE_NET, 0); if (ret < 0) { return ret; } return copy_to_user((void *)arg, &pdp_arg, sizeof(pdp_arg)); case HN_PDP_DEACTIVATE: if (copy_from_user(&pdp_arg, (void *)arg, sizeof(pdp_arg))) return -EFAULT; return pdp_deactivate(&pdp_arg, 0); case HN_PDP_ADJUST: if (copy_from_user(&adjust, (void *)arg, sizeof (int))) return -EFAULT; return pdp_adjust(adjust); case HN_PDP_TXSTART: pdp_tx_flag = 0; return 0; case HN_PDP_TXSTOP: pdp_tx_flag = 1; return 0; case HN_PDP_CSDSTART: pdp_csd_flag = 0; return 0; case HN_PDP_CSDSTOP: pdp_csd_flag = 1; return 0; } return -EINVAL; }
static int __init multipdp_init(void) { int ret; pdp_arg_t pdp_arg = { .id = 1, .ifname = "ttyCSD", }; pdp_arg_t efs_arg = { .id = 8, .ifname = "ttyEFS", }; pdp_arg_t gps_arg = { .id = 5, .ifname = "ttyGPS", }; pdp_arg_t xtra_arg = { .id = 6, .ifname = "ttyXTRA", }; pdp_arg_t smd_arg = { .id = 25, .ifname = "ttySMD", }; pdp_arg_t pcm_arg = { .id = 30, .ifname = "ttyPCM", } ; #ifdef LOOP_BACK_TEST pdp_arg_t loopback_arg = { .id = 31, .ifname = "ttyLOBK", }; #endif /* run DPRAM I/O thread */ ret = kernel_thread(dpram_thread, NULL, CLONE_FS | CLONE_FILES); if (ret < 0) { EPRINTK("kernel_thread() failed\n"); return ret; } wait_for_completion(&dpram_complete); if (!dpram_task) { EPRINTK("DPRAM I/O thread error\n"); return -EIO; } /* create serial device for Circuit Switched Data */ ret = pdp_activate(&pdp_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for CSD\n"); goto err0; } ret = pdp_activate(&efs_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for EFS\n"); goto err1; } ret = pdp_activate(&gps_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for GPS\n"); goto err2; } ret = pdp_activate(&xtra_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for XTRA\n"); goto err3; } ret = pdp_activate(&smd_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for SMD\n"); goto err4; } ret = pdp_activate(&pcm_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for SMD\n"); goto err5; } #ifdef LOOP_BACK_TEST ret = pdp_activate(&loopback_arg, DEV_TYPE_SERIAL, DEV_FLAG_STICKY); if (ret < 0) { EPRINTK("failed to create a serial device for LoopBack\n"); goto err6; } #endif /* create app. interface device */ ret = misc_register(&multipdp_dev); if (ret < 0) { EPRINTK("misc_register() failed\n"); goto err1; } #ifdef LOOP_BACK_TEST ret = device_create_file(multipdp_dev.this_device, &dev_attr_loopback); #endif #ifdef CONFIG_PROC_FS create_proc_read_entry(APP_DEVNAME, 0, 0, multipdp_proc_read, NULL); #endif #ifdef NO_TTY_DPRAM printk("multipdp_init:multipdp_rx_noti_regi calling"); multipdp_rx_noti_regi(multipdp_rx_cback ); #endif // printk(KERN_INFO // "$Id: multipdp.c,v 1.10 2008/01/11 05:40:56 melonzz Exp $\n"); return 0; #ifdef LOOP_BACK_TEST err6: pdp_deactivate(&loopback_arg, 1); #endif err5: /* undo serial device for Circuit Switched Data */ pdp_deactivate(&pcm_arg, 1); err4: /* undo serial device for Circuit Switched Data */ pdp_deactivate(&smd_arg, 1); err3: /* undo serial device for Circuit Switched Data */ pdp_deactivate(&xtra_arg, 1); err2: /* undo serial device for Circuit Switched Data */ pdp_deactivate(&gps_arg, 1); err1: /* undo serial device for Circuit Switched Data */ pdp_deactivate(&pdp_arg, 1); err0: /* kill DPRAM I/O thread */ if (dpram_task) { send_sig(SIGUSR1, dpram_task, 1); wait_for_completion(&dpram_complete); } return ret; } static void __exit multipdp_exit(void) { #ifdef CONFIG_PROC_FS remove_proc_entry(APP_DEVNAME, 0); #endif /* remove app. interface device */ misc_deregister(&multipdp_dev); /* clean up PDP context table */ pdp_cleanup(); /* kill DPRAM I/O thread */ if (dpram_task) { send_sig(SIGUSR1, dpram_task, 1); wait_for_completion(&dpram_complete); } } //module_init(multipdp_init); late_initcall(multipdp_init); module_exit(multipdp_exit); MODULE_AUTHOR("SAMSUNG ELECTRONICS CO., LTD"); MODULE_DESCRIPTION("Multiple PDP Muxer / Demuxer"); MODULE_LICENSE("GPL");