devices/generic.c
changeset 1607 be4dd9c80f42
parent 1559 1b3a89f6dc29
child 1612 c6779ebcda88
equal deleted inserted replaced
1606:6c5849669900 1607:be4dd9c80f42
    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);