60 int ec_rtdm_ioctl(struct rtdm_dev_context *, rtdm_user_info_t *, |
60 int ec_rtdm_ioctl(struct rtdm_dev_context *, rtdm_user_info_t *, |
61 unsigned int, void __user *); |
61 unsigned int, void __user *); |
62 |
62 |
63 /****************************************************************************/ |
63 /****************************************************************************/ |
64 |
64 |
|
65 static struct rtdm_driver ec_rtdm_driver = { |
|
66 .profile_info = RTDM_PROFILE_INFO(foo, |
|
67 RTDM_CLASS_EXPERIMENTAL, |
|
68 222, |
|
69 1), |
|
70 .device_flags = RTDM_NAMED_DEVICE, |
|
71 .device_count = 1, |
|
72 .context_size = sizeof(ec_rtdm_context_t). |
|
73 .ops = { |
|
74 .open = ec_rtdm_open; |
|
75 .close_nrt = ec_rtdm_close, |
|
76 .ioctl_rt = ec_rtdm_ioctl, |
|
77 .ioctl_nrt = ec_rtdm_ioctl |
|
78 }, |
|
79 }; |
|
80 |
65 /** Initialize an RTDM device. |
81 /** Initialize an RTDM device. |
66 * |
82 * |
67 * \return Zero on success, otherwise a negative error code. |
83 * \return Zero on success, otherwise a negative error code. |
68 */ |
84 */ |
69 int ec_rtdm_dev_init( |
85 int ec_rtdm_dev_init( |
70 ec_rtdm_dev_t *rtdm_dev, /**< EtherCAT RTDM device. */ |
86 ec_rtdm_dev_t *rtdm_dev, /**< EtherCAT RTDM device. */ |
71 ec_master_t *master /**< EtherCAT master. */ |
87 ec_master_t *master /**< EtherCAT master. */ |
72 ) |
88 ) |
73 { |
89 { |
74 int ret; |
90 int ret; |
|
91 |
|
92 MODULE_VERSION |
75 |
93 |
76 rtdm_dev->master = master; |
94 rtdm_dev->master = master; |
77 |
95 |
78 rtdm_dev->dev = kzalloc(sizeof(struct rtdm_device), GFP_KERNEL); |
96 rtdm_dev->dev = kzalloc(sizeof(struct rtdm_device), GFP_KERNEL); |
79 if (!rtdm_dev->dev) { |
97 if (!rtdm_dev->dev) { |
80 EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device.\n"); |
98 EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device.\n"); |
81 return -ENOMEM; |
99 return -ENOMEM; |
82 } |
100 } |
83 |
101 |
84 rtdm_dev->dev->struct_version = RTDM_DEVICE_STRUCT_VER; |
102 rtdm_dev->dev->label = kzalloc(RTDM_MAX_DEVNAME_LEN+1, GFP_KERNEL); |
85 rtdm_dev->dev->device_flags = RTDM_NAMED_DEVICE; |
103 if (!rtdm_dev->dev->label) { |
86 rtdm_dev->dev->context_size = sizeof(ec_rtdm_context_t); |
104 EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device name.\n"); |
87 snprintf(rtdm_dev->dev->device_name, RTDM_MAX_DEVNAME_LEN, |
105 return -ENOMEM; |
|
106 kfree(rtdm_dev->dev); |
|
107 } |
|
108 |
|
109 |
|
110 rtdm_dev->dev->driver = &ec_rtdm_driver; |
|
111 snprintf(rtdm_dev->dev->label, RTDM_MAX_DEVNAME_LEN, |
88 "EtherCAT%u", master->index); |
112 "EtherCAT%u", master->index); |
89 rtdm_dev->dev->open_nrt = ec_rtdm_open; |
|
90 rtdm_dev->dev->ops.close_nrt = ec_rtdm_close; |
|
91 rtdm_dev->dev->ops.ioctl_rt = ec_rtdm_ioctl; |
|
92 rtdm_dev->dev->ops.ioctl_nrt = ec_rtdm_ioctl; |
|
93 rtdm_dev->dev->device_class = RTDM_CLASS_EXPERIMENTAL; |
|
94 rtdm_dev->dev->device_sub_class = 222; |
|
95 rtdm_dev->dev->driver_name = "EtherCAT"; |
|
96 rtdm_dev->dev->driver_version = RTDM_DRIVER_VER(1, 0, 2); |
|
97 rtdm_dev->dev->peripheral_name = rtdm_dev->dev->device_name; |
|
98 rtdm_dev->dev->provider_name = "EtherLab Community"; |
|
99 rtdm_dev->dev->proc_name = rtdm_dev->dev->device_name; |
|
100 rtdm_dev->dev->device_data = rtdm_dev; /* pointer to parent */ |
113 rtdm_dev->dev->device_data = rtdm_dev; /* pointer to parent */ |
|
114 |
101 |
115 |
102 EC_MASTER_INFO(master, "Registering RTDM device %s.\n", |
116 EC_MASTER_INFO(master, "Registering RTDM device %s.\n", |
103 rtdm_dev->dev->driver_name); |
117 rtdm_dev->dev->driver_name); |
104 ret = rtdm_dev_register(rtdm_dev->dev); |
118 ret = rtdm_dev_register(rtdm_dev->dev); |
105 if (ret) { |
119 if (ret) { |
106 EC_MASTER_ERR(master, "Initialization of RTDM interface failed" |
120 EC_MASTER_ERR(master, "Initialization of RTDM interface failed" |
107 " (return value %i).\n", ret); |
121 " (return value %i).\n", ret); |
|
122 kfree(rtdm_dev->dev->label); |
108 kfree(rtdm_dev->dev); |
123 kfree(rtdm_dev->dev); |
109 } |
124 } |
110 |
125 |
111 return ret; |
126 return ret; |
112 } |
127 } |
120 ) |
135 ) |
121 { |
136 { |
122 int ret; |
137 int ret; |
123 |
138 |
124 EC_MASTER_INFO(rtdm_dev->master, "Unregistering RTDM device %s.\n", |
139 EC_MASTER_INFO(rtdm_dev->master, "Unregistering RTDM device %s.\n", |
125 rtdm_dev->dev->driver_name); |
140 rtdm_dev->dev->label); |
126 ret = rtdm_dev_unregister(rtdm_dev->dev, 1000 /* poll delay [ms] */); |
141 ret = rtdm_dev_unregister(rtdm_dev->dev, 1000 /* poll delay [ms] */); |
127 if (ret < 0) { |
142 if (ret < 0) { |
128 EC_MASTER_WARN(rtdm_dev->master, |
143 EC_MASTER_WARN(rtdm_dev->master, |
129 "Failed to unregister RTDM device (code %i).\n", ret); |
144 "Failed to unregister RTDM device (code %i).\n", ret); |
130 } |
145 } |
131 |
146 |
|
147 kfree(rtdm_dev->dev->label); |
132 kfree(rtdm_dev->dev); |
148 kfree(rtdm_dev->dev); |
133 } |
149 } |
134 |
150 |
135 /****************************************************************************/ |
151 /****************************************************************************/ |
136 |
152 |