devices/generic.c
changeset 1558 55213fcc93a6
parent 1557 daf92232d9c5
child 1559 1b3a89f6dc29
equal deleted inserted replaced
1557:daf92232d9c5 1558:55213fcc93a6
    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);