devices/generic.c
changeset 1799 f228415225b7
parent 1612 c6779ebcda88
child 1833 5adbf2bc48d9
equal deleted inserted replaced
1798:e7733f825982 1799:f228415225b7
    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);