equal
deleted
inserted
replaced
68 struct list_head generic_devices; |
68 struct list_head generic_devices; |
69 |
69 |
70 typedef struct { |
70 typedef struct { |
71 struct list_head list; |
71 struct list_head list; |
72 struct net_device *netdev; |
72 struct net_device *netdev; |
73 struct socket *socket; |
73 struct net_device *used_netdev; |
|
74 struct socket *socket; |
74 ec_device_t *ecdev; |
75 ec_device_t *ecdev; |
75 uint8_t *rx_buf; |
76 uint8_t *rx_buf; |
76 } ec_gen_device_t; |
77 } ec_gen_device_t; |
77 |
78 |
78 typedef struct { |
79 typedef struct { |
79 struct list_head list; |
80 struct list_head list; |
80 char name[IFNAMSIZ]; |
81 struct net_device *netdev; |
|
82 char name[IFNAMSIZ]; |
81 int ifindex; |
83 int ifindex; |
82 uint8_t dev_addr[ETH_ALEN]; |
84 uint8_t dev_addr[ETH_ALEN]; |
83 } ec_gen_interface_desc_t; |
85 } ec_gen_interface_desc_t; |
84 |
86 |
85 int ec_gen_device_open(ec_gen_device_t *); |
87 int ec_gen_device_open(ec_gen_device_t *); |
198 ) |
200 ) |
199 { |
201 { |
200 int ret; |
202 int ret; |
201 struct sockaddr_ll sa; |
203 struct sockaddr_ll sa; |
202 |
204 |
203 dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL); |
205 dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL); |
204 if (!dev->rx_buf) { |
206 if (!dev->rx_buf) { |
205 return -ENOMEM; |
207 return -ENOMEM; |
206 } |
208 } |
207 |
209 |
208 ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket); |
210 ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket); |
238 ec_gen_interface_desc_t *desc |
240 ec_gen_interface_desc_t *desc |
239 ) |
241 ) |
240 { |
242 { |
241 int ret = 0; |
243 int ret = 0; |
242 |
244 |
243 memcpy(dev->netdev->dev_addr, desc->dev_addr, ETH_ALEN); |
245 dev->used_netdev = desc->netdev; |
|
246 memcpy(dev->netdev->dev_addr, desc->dev_addr, ETH_ALEN); |
244 |
247 |
245 dev->ecdev = ecdev_offer(dev->netdev, ec_gen_poll, THIS_MODULE); |
248 dev->ecdev = ecdev_offer(dev->netdev, ec_gen_poll, THIS_MODULE); |
246 if (dev->ecdev) { |
249 if (dev->ecdev) { |
247 if (ec_gen_device_create_socket(dev, desc)) { |
250 if (ec_gen_device_create_socket(dev, desc)) { |
248 ecdev_withdraw(dev->ecdev); |
251 ecdev_withdraw(dev->ecdev); |
249 dev->ecdev = NULL; |
252 dev->ecdev = NULL; |
250 } else if (ecdev_open(dev->ecdev)) { |
253 } else if (ecdev_open(dev->ecdev)) { |
251 ecdev_withdraw(dev->ecdev); |
254 ecdev_withdraw(dev->ecdev); |
252 dev->ecdev = NULL; |
255 dev->ecdev = NULL; |
253 } else { |
256 } else { |
254 ecdev_set_link(dev->ecdev, 1); // FIXME |
257 ecdev_set_link(dev->ecdev, netif_carrier_ok(dev->used_netdev)); // FIXME |
255 ret = 1; |
258 ret = 1; |
256 } |
259 } |
257 } |
260 } |
258 |
261 |
259 return ret; |
262 return ret; |
291 struct msghdr msg; |
294 struct msghdr msg; |
292 struct kvec iov; |
295 struct kvec iov; |
293 size_t len = skb->len; |
296 size_t len = skb->len; |
294 int ret; |
297 int ret; |
295 |
298 |
|
299 ecdev_set_link(dev->ecdev,netif_carrier_ok(dev->used_netdev)); |
|
300 |
296 iov.iov_base = skb->data; |
301 iov.iov_base = skb->data; |
297 iov.iov_len = len; |
302 iov.iov_len = len; |
298 memset(&msg, 0, sizeof(msg)); |
303 memset(&msg, 0, sizeof(msg)); |
299 |
304 |
300 ret = kernel_sendmsg(dev->socket, &msg, &iov, 1, len); |
305 ret = kernel_sendmsg(dev->socket, &msg, &iov, 1, len); |
312 { |
317 { |
313 struct msghdr msg; |
318 struct msghdr msg; |
314 struct kvec iov; |
319 struct kvec iov; |
315 int ret, budget = 10; // FIXME |
320 int ret, budget = 10; // FIXME |
316 |
321 |
317 do { |
322 ecdev_set_link(dev->ecdev,netif_carrier_ok(dev->used_netdev)); |
|
323 do { |
318 iov.iov_base = dev->rx_buf; |
324 iov.iov_base = dev->rx_buf; |
319 iov.iov_len = EC_GEN_RX_BUF_SIZE; |
325 iov.iov_len = EC_GEN_RX_BUF_SIZE; |
320 memset(&msg, 0, sizeof(msg)); |
326 memset(&msg, 0, sizeof(msg)); |
321 |
327 |
322 ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len, |
328 ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len, |
406 ret = -ENOMEM; |
412 ret = -ENOMEM; |
407 read_unlock(&dev_base_lock); |
413 read_unlock(&dev_base_lock); |
408 goto out_err; |
414 goto out_err; |
409 } |
415 } |
410 strncpy(desc->name, netdev->name, IFNAMSIZ); |
416 strncpy(desc->name, netdev->name, IFNAMSIZ); |
|
417 desc->netdev = netdev; |
411 desc->ifindex = netdev->ifindex; |
418 desc->ifindex = netdev->ifindex; |
412 memcpy(desc->dev_addr, netdev->dev_addr, ETH_ALEN); |
419 memcpy(desc->dev_addr, netdev->dev_addr, ETH_ALEN); |
413 list_add_tail(&desc->list, &descs); |
420 list_add_tail(&desc->list, &descs); |
414 } |
421 } |
415 read_unlock(&dev_base_lock); |
422 read_unlock(&dev_base_lock); |