diff --git a/devices/generic.c b/devices/generic.c index 65462495c9fbc55ad1806982f0420e01ac5c6efc..4e266b8b32e9d71cee3827c6df707f724415eeec 100644 --- a/devices/generic.c +++ b/devices/generic.c @@ -47,6 +47,8 @@ #define ETH_P_ETHERCAT 0x88A4 +#define EC_GEN_RX_BUF_SIZE 1600 + /*****************************************************************************/ int __init ec_gen_init_module(void); @@ -70,6 +72,7 @@ typedef struct { struct net_device *netdev; struct socket *socket; ec_device_t *ecdev; + uint8_t *rx_buf; } ec_gen_device_t; typedef struct { @@ -142,6 +145,7 @@ int ec_gen_device_init( dev->ecdev = NULL; dev->socket = NULL; + dev->rx_buf = NULL; dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup); if (!dev->netdev) { @@ -178,6 +182,10 @@ void ec_gen_device_clear( sock_release(dev->socket); } free_netdev(dev->netdev); + + if (dev->rx_buf) { + kfree(dev->rx_buf); + } } /*****************************************************************************/ @@ -192,6 +200,11 @@ int ec_gen_device_create_socket( int ret; struct sockaddr_ll sa; + dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL); + if (!dev->rx_buf) { + return -ENOMEM; + } + ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket); if (ret) { printk(KERN_ERR PFX "Failed to create socket.\n"); @@ -299,18 +312,17 @@ void ec_gen_device_poll( { struct msghdr msg; struct kvec iov; - char buf[2000]; // FIXME int ret, budget = 10; // FIXME - iov.iov_base = buf; - iov.iov_len = 2000; + iov.iov_base = dev->rx_buf; + iov.iov_len = EC_GEN_RX_BUF_SIZE; memset(&msg, 0, sizeof(msg)); do { ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len, MSG_DONTWAIT); if (ret > 0) { - ecdev_receive(dev->ecdev, buf, ret); + ecdev_receive(dev->ecdev, dev->rx_buf, ret); } else if (ret < 0) { break; }