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