equal
deleted
inserted
replaced
45 |
45 |
46 #define PFX "ec_generic: " |
46 #define PFX "ec_generic: " |
47 |
47 |
48 #define ETH_P_ETHERCAT 0x88A4 |
48 #define ETH_P_ETHERCAT 0x88A4 |
49 |
49 |
|
50 #define EC_GEN_RX_BUF_SIZE 1600 |
|
51 |
50 /*****************************************************************************/ |
52 /*****************************************************************************/ |
51 |
53 |
52 int __init ec_gen_init_module(void); |
54 int __init ec_gen_init_module(void); |
53 void __exit ec_gen_cleanup_module(void); |
55 void __exit ec_gen_cleanup_module(void); |
54 |
56 |
68 typedef struct { |
70 typedef struct { |
69 struct list_head list; |
71 struct list_head list; |
70 struct net_device *netdev; |
72 struct net_device *netdev; |
71 struct socket *socket; |
73 struct socket *socket; |
72 ec_device_t *ecdev; |
74 ec_device_t *ecdev; |
|
75 uint8_t *rx_buf; |
73 } ec_gen_device_t; |
76 } ec_gen_device_t; |
74 |
77 |
75 typedef struct { |
78 typedef struct { |
76 struct list_head list; |
79 struct list_head list; |
77 char name[IFNAMSIZ]; |
80 char name[IFNAMSIZ]; |
140 ec_gen_device_t **priv; |
143 ec_gen_device_t **priv; |
141 char null = 0x00; |
144 char null = 0x00; |
142 |
145 |
143 dev->ecdev = NULL; |
146 dev->ecdev = NULL; |
144 dev->socket = NULL; |
147 dev->socket = NULL; |
|
148 dev->rx_buf = NULL; |
145 |
149 |
146 dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup); |
150 dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup); |
147 if (!dev->netdev) { |
151 if (!dev->netdev) { |
148 return -ENOMEM; |
152 return -ENOMEM; |
149 } |
153 } |
176 } |
180 } |
177 if (dev->socket) { |
181 if (dev->socket) { |
178 sock_release(dev->socket); |
182 sock_release(dev->socket); |
179 } |
183 } |
180 free_netdev(dev->netdev); |
184 free_netdev(dev->netdev); |
|
185 |
|
186 if (dev->rx_buf) { |
|
187 kfree(dev->rx_buf); |
|
188 } |
181 } |
189 } |
182 |
190 |
183 /*****************************************************************************/ |
191 /*****************************************************************************/ |
184 |
192 |
185 /** Creates a network socket. |
193 /** Creates a network socket. |
189 ec_gen_interface_desc_t *desc |
197 ec_gen_interface_desc_t *desc |
190 ) |
198 ) |
191 { |
199 { |
192 int ret; |
200 int ret; |
193 struct sockaddr_ll sa; |
201 struct sockaddr_ll sa; |
|
202 |
|
203 dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL); |
|
204 if (!dev->rx_buf) { |
|
205 return -ENOMEM; |
|
206 } |
194 |
207 |
195 ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket); |
208 ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket); |
196 if (ret) { |
209 if (ret) { |
197 printk(KERN_ERR PFX "Failed to create socket.\n"); |
210 printk(KERN_ERR PFX "Failed to create socket.\n"); |
198 return ret; |
211 return ret; |
297 ec_gen_device_t *dev |
310 ec_gen_device_t *dev |
298 ) |
311 ) |
299 { |
312 { |
300 struct msghdr msg; |
313 struct msghdr msg; |
301 struct kvec iov; |
314 struct kvec iov; |
302 char buf[2000]; // FIXME |
|
303 int ret, budget = 10; // FIXME |
315 int ret, budget = 10; // FIXME |
304 |
316 |
305 iov.iov_base = buf; |
317 iov.iov_base = dev->rx_buf; |
306 iov.iov_len = 2000; |
318 iov.iov_len = EC_GEN_RX_BUF_SIZE; |
307 memset(&msg, 0, sizeof(msg)); |
319 memset(&msg, 0, sizeof(msg)); |
308 |
320 |
309 do { |
321 do { |
310 ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len, |
322 ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len, |
311 MSG_DONTWAIT); |
323 MSG_DONTWAIT); |
312 if (ret > 0) { |
324 if (ret > 0) { |
313 ecdev_receive(dev->ecdev, buf, ret); |
325 ecdev_receive(dev->ecdev, dev->rx_buf, ret); |
314 } else if (ret < 0) { |
326 } else if (ret < 0) { |
315 break; |
327 break; |
316 } |
328 } |
317 budget--; |
329 budget--; |
318 } while (budget); |
330 } while (budget); |