mirror of
https://github.com/openharmony/kernel_common_modules_newip.git
synced 2026-07-19 16:43:31 -04:00
@@ -1 +1,3 @@
|
||||
# enable btdev:
|
||||
# kernel/linux/linux-5.10/drivers/net/Makefile add obj-y += bt/
|
||||
obj-y += btdev.o
|
||||
|
||||
+114
-141
@@ -11,7 +11,7 @@ static int bt_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct bt_virnet *vnet = NULL;
|
||||
|
||||
pr_devel("bt seq_show\n");
|
||||
pr_devel("bt seq_show");
|
||||
seq_printf(m, "Total device: %d (bitmap: 0x%X) Ring size: %d\n",
|
||||
bt_get_total_device(bt_drv), bt_drv->bitmap,
|
||||
BT_RING_BUFFER_SIZE);
|
||||
@@ -25,12 +25,12 @@ static int bt_seq_show(struct seq_file *m, void *v)
|
||||
bt_virnet_get_ring_packets(vnet));
|
||||
}
|
||||
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
pr_devel("bt proc_open\n");
|
||||
pr_devel("bt proc_open");
|
||||
return single_open(file, bt_seq_show, PDE_DATA(inode));
|
||||
}
|
||||
|
||||
@@ -43,17 +43,19 @@ static struct proc_ops bt_proc_fops = {
|
||||
static int bt_io_file_open(struct inode *node, struct file *filp)
|
||||
{
|
||||
struct bt_virnet *vnet = NULL;
|
||||
int ret = 0;
|
||||
int ret = OK;
|
||||
|
||||
pr_devel("bt io file open called...\n");
|
||||
pr_devel("bt io file open called");
|
||||
|
||||
list_for_each_entry(vnet, &bt_drv->devices_table->head, virnet_entry) {
|
||||
if (bt_virnet_get_cdev(vnet) == node->i_cdev) {
|
||||
struct net_device *ndev;
|
||||
|
||||
if ((filp->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
if (unlikely(!atomic_dec_and_test(&vnet->io_file
|
||||
->read_open_limit))) {
|
||||
atomic_inc(&vnet->io_file->read_open_limit);
|
||||
pr_err("file %s has been opened for read twice already\n",
|
||||
pr_err("file %s has been opened for read twice already",
|
||||
bt_virnet_get_cdev_name(vnet));
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -61,7 +63,7 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
|
||||
if (unlikely(!atomic_dec_and_test(&vnet->io_file
|
||||
->write_open_limit))) {
|
||||
atomic_inc(&vnet->io_file->write_open_limit);
|
||||
pr_err("file %s has been opened for write twice already\n",
|
||||
pr_err("file %s has been opened for write twice already",
|
||||
bt_virnet_get_cdev_name(vnet));
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -69,7 +71,7 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
|
||||
if (unlikely(!atomic_dec_and_test(&vnet->io_file
|
||||
->read_open_limit))) {
|
||||
atomic_inc(&vnet->io_file->read_open_limit);
|
||||
pr_err("file %s has been opened for read twice already\n",
|
||||
pr_err("file %s has been opened for read twice already",
|
||||
bt_virnet_get_cdev_name(vnet));
|
||||
return -EBUSY;
|
||||
}
|
||||
@@ -77,19 +79,19 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
|
||||
if (unlikely(!atomic_dec_and_test(&vnet->io_file
|
||||
->write_open_limit))) {
|
||||
atomic_inc(&vnet->io_file->write_open_limit);
|
||||
pr_err("file %s has been opened for write twice already\n",
|
||||
pr_err("file %s has been opened for write twice already",
|
||||
bt_virnet_get_cdev_name(vnet));
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
if (unlikely(!(vnet->ndev->flags & IFF_UP))) {
|
||||
ret = dev_change_flags(vnet->ndev, vnet->ndev
|
||||
->flags | IFF_UP, NULL);
|
||||
ndev = vnet->ndev;
|
||||
if (unlikely(!(ndev->flags & IFF_UP))) {
|
||||
ret = dev_change_flags(ndev, ndev->flags | IFF_UP, NULL);
|
||||
if (unlikely(ret < 0)) {
|
||||
rtnl_unlock();
|
||||
pr_err("bt dev_change_flags error: ret=%d\n", ret);
|
||||
pr_err("bt dev_change_flags error: ret=%d", ret);
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
@@ -97,18 +99,18 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_CONNECTED);
|
||||
filp->private_data = vnet;
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
|
||||
return -EFAULT;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int bt_io_file_release(struct inode *node, struct file *filp)
|
||||
{
|
||||
struct bt_virnet *vnet = filp->private_data;
|
||||
|
||||
pr_devel("bt io file release called...\n");
|
||||
pr_devel("bt io file release called");
|
||||
|
||||
if ((filp->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
atomic_inc(&vnet->io_file->read_open_limit);
|
||||
@@ -121,7 +123,7 @@ static int bt_io_file_release(struct inode *node, struct file *filp)
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_DISCONNECTED);
|
||||
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static ssize_t bt_io_file_read(struct file *filp,
|
||||
@@ -132,7 +134,7 @@ static ssize_t bt_io_file_read(struct file *filp,
|
||||
ssize_t out_sz;
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
pr_devel("bt io file read called...\n");
|
||||
pr_devel("bt io file read called");
|
||||
|
||||
while (unlikely(bt_ring_is_empty(vnet->tx_ring))) {
|
||||
if (filp->f_flags & O_NONBLOCK)
|
||||
@@ -144,24 +146,24 @@ static ssize_t bt_io_file_read(struct file *filp,
|
||||
}
|
||||
|
||||
skb = bt_ring_current(vnet->tx_ring);
|
||||
out_sz = skb->len - 2 * ETH_ALEN;
|
||||
out_sz = skb->len - MACADDR_LEN;
|
||||
if (unlikely(out_sz > size)) {
|
||||
pr_err("io file read: buffer too small: skb's len=%ld buffer's len=%ld\n",
|
||||
pr_err("io file read: buffer too small: skb's len=%ld buffer's len=%ld",
|
||||
(long)out_sz, (long)size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bt_ring_consume(vnet->tx_ring);
|
||||
if (copy_to_user(buffer, skb->data + 2 * ETH_ALEN, out_sz)) {
|
||||
pr_err("io file read: copy_to_user failed\n");
|
||||
return -EFAULT;
|
||||
if (copy_to_user(buffer, skb->data + MACADDR_LEN, out_sz)) {
|
||||
pr_err("io file read: copy_to_user failed");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
dev_kfree_skb(skb);
|
||||
skb = NULL;
|
||||
|
||||
if (unlikely(netif_queue_stopped(vnet->ndev))) {
|
||||
pr_info("consume data: wake the queue\n");
|
||||
pr_devel("consume data: wake the queue");
|
||||
netif_wake_queue(vnet->ndev);
|
||||
}
|
||||
|
||||
@@ -178,11 +180,8 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
int len;
|
||||
ssize_t in_sz;
|
||||
|
||||
pr_devel("bt io file write called...\n");
|
||||
|
||||
pr_info("bt io file write called: %lu bytes\n", size);
|
||||
|
||||
in_sz = size + 2 * ETH_ALEN;
|
||||
pr_devel("bt io file write called: %lu bytes", size);
|
||||
in_sz = size + MACADDR_LEN;
|
||||
|
||||
skb = netdev_alloc_skb(bt_virnet_get_ndev(vnet), in_sz + 2);
|
||||
if (unlikely(!skb))
|
||||
@@ -191,9 +190,9 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
skb_reserve(skb, 2);
|
||||
skb_put(skb, in_sz);
|
||||
|
||||
memset(skb->data, 0, 2 * ETH_ALEN);
|
||||
if (copy_from_user(skb->data + 2 * ETH_ALEN, buffer, size))
|
||||
return -EFAULT;
|
||||
memset(skb->data, 0, MACADDR_LEN);
|
||||
if (copy_from_user(skb->data + MACADDR_LEN, buffer, size))
|
||||
return -EIO;
|
||||
|
||||
len = skb->len;
|
||||
skb->dev = bt_virnet_get_ndev(vnet);
|
||||
@@ -213,16 +212,16 @@ static ssize_t bt_io_file_write(struct file *filp,
|
||||
|
||||
static int bt_virnet_change_mtu(struct net_device *dev, int mtu)
|
||||
{
|
||||
pr_devel("bt virnet change mtu called...\n");
|
||||
pr_devel("bt virnet change mtu called");
|
||||
dev->mtu = mtu;
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_set_mtu(struct net_device *dev, int mtu)
|
||||
{
|
||||
int err = 0;
|
||||
int err = OK;
|
||||
|
||||
pr_info("bt set_mtu called...\n");
|
||||
pr_devel("bt set_mtu called");
|
||||
rtnl_lock();
|
||||
err = dev_set_mtu(dev, mtu);
|
||||
if (err < 0)
|
||||
@@ -240,21 +239,21 @@ static int bt_cmd_enable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
WARN_ON(!vnet);
|
||||
|
||||
if (unlikely(vnet->state != BT_VIRNET_STATE_DISABLED)) {
|
||||
pr_err("bt enable can only be set at DISABLED state\n");
|
||||
return -1; // enable failed
|
||||
pr_err("bt enable can only be set at DISABLED state");
|
||||
return -EINVAL; // enable failed
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
ret = dev_change_flags(vnet->ndev, vnet->ndev->flags | IFF_UP, NULL);
|
||||
if (unlikely(ret < 0)) {
|
||||
rtnl_unlock();
|
||||
pr_err("bt cmd enable virnet: dev_change_flags error: ret=%d\n", ret);
|
||||
return -2;
|
||||
pr_err("bt cmd enable virnet: dev_change_flags error: ret=%d", ret);
|
||||
return -EIO;
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_CONNECTED);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_disable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
@@ -263,21 +262,21 @@ static int bt_cmd_disable_virnet(struct bt_virnet *vnet, unsigned long arg)
|
||||
|
||||
WARN_ON(!vnet);
|
||||
if (unlikely(vnet->state != BT_VIRNET_STATE_CONNECTED)) {
|
||||
pr_err("bt disable can only be set at CONNECTED state\n");
|
||||
return -1;
|
||||
pr_err("bt disable can only be set at CONNECTED state");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
ret = dev_change_flags(vnet->ndev, vnet->ndev->flags & ~IFF_UP, NULL);
|
||||
if (unlikely(ret < 0)) {
|
||||
rtnl_unlock();
|
||||
pr_err("bt cmd disable virnet: dev_change_flags error: ret=%d\n", ret);
|
||||
return -2;
|
||||
pr_err("bt cmd disable virnet: dev_change_flags error: ret=%d", ret);
|
||||
return -EIO;
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
SET_STATE(vnet, BT_VIRNET_STATE_DISABLED);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_change_mtu(struct bt_virnet *vnet, unsigned long arg)
|
||||
@@ -288,37 +287,37 @@ static int bt_cmd_change_mtu(struct bt_virnet *vnet, unsigned long arg)
|
||||
WARN_ON(!vnet);
|
||||
|
||||
if (unlikely(get_user(mtu, (int __user *)arg))) {
|
||||
pr_err("get_user failed!!\n");
|
||||
return -1;
|
||||
pr_err("get_user failed");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = bt_set_mtu(vnet->ndev, mtu);
|
||||
|
||||
if (unlikely(ret < 0)) {
|
||||
pr_err("bt_dev_ioctl: changed mtu failed\n");
|
||||
return -1;
|
||||
pr_err("bt_dev_ioctl: changed mtu failed");
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_peek_packet(struct bt_virnet *vnet, unsigned long arg)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
pr_devel("bt peek packet called...\n");
|
||||
pr_devel("bt peek packet called");
|
||||
|
||||
if (unlikely(bt_ring_is_empty(vnet->tx_ring))) {
|
||||
pr_err("bt peek packet ring is empty...\n");
|
||||
pr_err("bt peek packet ring is empty");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
skb = bt_ring_current(vnet->tx_ring);
|
||||
if (unlikely(put_user(skb->len - 2 * ETH_ALEN, (int __user *)arg))) {
|
||||
pr_err("put_user failed!!\n");
|
||||
return -1;
|
||||
if (unlikely(put_user(skb->len - MACADDR_LEN, (int __user *)arg))) {
|
||||
pr_err("put_user failed");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static long bt_io_file_ioctl(struct file *filep,
|
||||
@@ -329,33 +328,23 @@ static long bt_io_file_ioctl(struct file *filep,
|
||||
|
||||
struct bt_virnet *vnet = filep->private_data;
|
||||
|
||||
pr_devel("bt io file ioctl called...\n");
|
||||
pr_devel("bt io file ioctl called");
|
||||
switch (cmd) {
|
||||
case BT_IOC_CHANGE_MTU:
|
||||
{
|
||||
ret = bt_cmd_change_mtu(vnet, arg);
|
||||
break;
|
||||
}
|
||||
case BT_IOC_ENABLE:
|
||||
{
|
||||
ret = bt_cmd_enable_virnet(vnet, arg);
|
||||
break;
|
||||
}
|
||||
case BT_IOC_DISABLE:
|
||||
{
|
||||
ret = bt_cmd_disable_virnet(vnet, arg);
|
||||
break;
|
||||
}
|
||||
case BT_IOC_PEEK_PACKET:
|
||||
{
|
||||
ret = bt_cmd_peek_packet(vnet, arg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
pr_err("not a valid cmd\n");
|
||||
return -1;
|
||||
}
|
||||
pr_err("not a valid cmd");
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -390,26 +379,26 @@ static const struct file_operations bt_io_file_ops = {
|
||||
|
||||
static int bt_mng_file_open(struct inode *node, struct file *filp)
|
||||
{
|
||||
pr_devel("bt mng file open called...\n");
|
||||
pr_devel("bt mng file open called");
|
||||
|
||||
if (unlikely(!atomic_dec_and_test(&bt_drv->mng_file->open_limit))) {
|
||||
atomic_inc(&bt_drv->mng_file->open_limit);
|
||||
pr_err("file %s has been opened already\n",
|
||||
pr_err("file %s has been opened already",
|
||||
bt_drv->mng_file->bt_cdev->dev_filename);
|
||||
return -EBUSY;
|
||||
}
|
||||
filp->private_data = bt_drv;
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_mng_file_release(struct inode *node, struct file *filp)
|
||||
{
|
||||
struct bt_drv *bt_drv = filp->private_data;
|
||||
|
||||
pr_devel("bt mng file release called...\n");
|
||||
pr_devel("bt mng file release called");
|
||||
|
||||
atomic_inc(&bt_drv->mng_file->open_limit);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
@@ -424,18 +413,18 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
|
||||
mutex_lock(&bt_mng->bitmap_lock);
|
||||
id = bt_get_unused_id(&bt_mng->bitmap);
|
||||
pr_info("create io_file: get unused bit: %d\n", id);
|
||||
pr_devel("create io_file: get unused bit: %d", id);
|
||||
|
||||
if (unlikely(bt_mng->devices_table->num == BT_VIRNET_MAX_NUM)) {
|
||||
pr_err("reach the limit of max virnets\n");
|
||||
pr_err("reach the limit of max virnets");
|
||||
mutex_unlock(&bt_mng->bitmap_lock);
|
||||
return -1;
|
||||
return -EIO;
|
||||
}
|
||||
vnet = bt_virnet_create(bt_mng, id);
|
||||
if (unlikely(!vnet)) {
|
||||
pr_err("bt virnet create failed\n");
|
||||
pr_err("bt virnet create failed");
|
||||
mutex_unlock(&bt_mng->bitmap_lock);
|
||||
return -1;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
vnet->bt_table_head = bt_mng->devices_table;
|
||||
@@ -444,7 +433,7 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
pr_err("bt table add device failed: ret=%d", ret);
|
||||
bt_virnet_destroy(vnet);
|
||||
mutex_unlock(&bt_mng->bitmap_lock);
|
||||
return -1; // failed to create
|
||||
return -EIO; // failed to create
|
||||
}
|
||||
|
||||
bt_set_bit(&bt_mng->bitmap, id);
|
||||
@@ -455,14 +444,14 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
memcpy(vp.cfile_name, bt_virnet_get_cdev_name(vnet),
|
||||
sizeof(vp.cfile_name));
|
||||
|
||||
mdelay(100);
|
||||
mdelay(DELAY_100_MS);
|
||||
|
||||
size = copy_to_user((void __user *)arg, &vp, sizeof(struct bt_uioc_args));
|
||||
if (unlikely(size)) {
|
||||
pr_err("copy_to_user failed: left size=%lu", size);
|
||||
return -1;
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
@@ -478,13 +467,13 @@ static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
sizeof(struct bt_uioc_args));
|
||||
if (unlikely(size)) {
|
||||
pr_err("copy_from_user failed: left size=%lu", size);
|
||||
return -1;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
vnet = bt_table_find(bt_mng->devices_table, vp.ifa_name);
|
||||
if (unlikely(!vnet)) {
|
||||
pr_err("virnet: %s cannot be found in bt table", vp.ifa_name);
|
||||
return -2; // not found
|
||||
return -EIO; // not found
|
||||
}
|
||||
|
||||
mutex_lock(&bt_mng->bitmap_lock);
|
||||
@@ -493,24 +482,24 @@ static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
|
||||
bt_virnet_destroy(vnet);
|
||||
bt_clear_bit(&bt_mng->bitmap, id);
|
||||
mutex_unlock(&bt_mng->bitmap_lock);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_query_all_virnets(struct bt_drv *bt_mng, unsigned long arg)
|
||||
{
|
||||
WARN_ON(!bt_mng);
|
||||
if (unlikely(put_user(bt_mng->bitmap, (u32 *)arg))) {
|
||||
pr_err("put_user failed!!\n");
|
||||
return -1;
|
||||
pr_err("put_user failed");
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int bt_cmd_delete_all_virnets(struct bt_drv *bt_mng, unsigned long arg)
|
||||
{
|
||||
WARN_ON(!bt_mng);
|
||||
bt_table_delete_all(bt_mng);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static long bt_mng_file_ioctl(struct file *filep,
|
||||
@@ -521,37 +510,23 @@ static long bt_mng_file_ioctl(struct file *filep,
|
||||
|
||||
struct bt_drv *bt_mng = filep->private_data;
|
||||
|
||||
pr_devel("bt mng file ioctl called...\n");
|
||||
pr_devel("bt mng file ioctl called");
|
||||
switch (cmd) {
|
||||
case BT_IOC_CREATE:
|
||||
{
|
||||
ret = bt_cmd_create_virnet(bt_mng, arg);
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_IOC_DELETE:
|
||||
{
|
||||
ret = bt_cmd_delete_virnet(bt_mng, arg);
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_IOC_QUERY_ALL:
|
||||
{
|
||||
ret = bt_cmd_query_all_virnets(bt_mng, arg);
|
||||
break;
|
||||
}
|
||||
|
||||
case BT_IOC_DELETE_ALL:
|
||||
{
|
||||
ret = bt_cmd_delete_all_virnets(bt_mng, arg);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
pr_err("not a valid command\n");
|
||||
return -1;
|
||||
}
|
||||
pr_err("not a valid command");
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -570,16 +545,14 @@ static netdev_tx_t bt_virnet_xmit(struct sk_buff *skb,
|
||||
struct bt_virnet *vnet = NULL;
|
||||
int len = skb->len;
|
||||
|
||||
pr_alert("alert: bt virnet_xmit: called...\n");
|
||||
|
||||
pr_alert("alert: bt virnet_xmit: called");
|
||||
vnet = bt_table_find(bt_drv->devices_table, dev->name);
|
||||
WARN_ON(!vnet);
|
||||
|
||||
ret = bt_virnet_produce_data(vnet, (void *)skb);
|
||||
|
||||
if (unlikely(ret < 0)) {
|
||||
pr_info("virnet xmit: produce data failed: ring is full\n"
|
||||
"need to stop queue\n");
|
||||
pr_devel("virnet xmit: produce data failed: ring is full, need to stop queue");
|
||||
netif_stop_queue(vnet->ndev);
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
@@ -619,7 +592,7 @@ static int bt_table_add_device(struct bt_table *tbl, struct bt_virnet *vn)
|
||||
vnet = bt_table_find(tbl, bt_virnet_get_ndev_name(vn));
|
||||
if (unlikely(vnet)) {
|
||||
pr_err("found duplicated device");
|
||||
return -1; // duplicated
|
||||
return -ENOIOCTLCMD; // duplicated
|
||||
}
|
||||
|
||||
mutex_lock(&tbl->tbl_lock);
|
||||
@@ -627,7 +600,7 @@ static int bt_table_add_device(struct bt_table *tbl, struct bt_virnet *vn)
|
||||
++tbl->num;
|
||||
mutex_unlock(&tbl->tbl_lock);
|
||||
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static void bt_table_remove_device(struct bt_table *tbl, struct bt_virnet *vn)
|
||||
@@ -699,7 +672,7 @@ static struct bt_ring *__bt_ring_create(int size)
|
||||
struct bt_ring *ring = kmalloc(sizeof(*ring), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!ring)) {
|
||||
pr_err("ring create alloc failed: oom\n");
|
||||
pr_err("ring create alloc failed: oom");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -710,7 +683,7 @@ static struct bt_ring *__bt_ring_create(int size)
|
||||
ring->tail = 0;
|
||||
ring->data = kmalloc_array(size, sizeof(void *), GFP_KERNEL);
|
||||
if (unlikely(!ring->data)) {
|
||||
pr_err("ring create alloc data failed: oom\n");
|
||||
pr_err("ring create alloc data failed: oom");
|
||||
kfree(ring);
|
||||
return NULL;
|
||||
}
|
||||
@@ -777,8 +750,8 @@ static int bt_virnet_produce_data(struct bt_virnet *dev, void *data)
|
||||
WARN_ON(!dev);
|
||||
WARN_ON(!data);
|
||||
if (unlikely(bt_ring_is_full(dev->tx_ring))) {
|
||||
pr_info("ring is full");
|
||||
return -1;
|
||||
pr_devel("ring is full");
|
||||
return -ENFILE;
|
||||
}
|
||||
|
||||
smp_wmb(); // Make sure the write order is correct
|
||||
@@ -786,7 +759,7 @@ static int bt_virnet_produce_data(struct bt_virnet *dev, void *data)
|
||||
smp_wmb(); // Make sure twrite order is correct
|
||||
|
||||
wake_up(&dev->rx_queue);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -824,17 +797,17 @@ static int bt_cdev_device_create(struct bt_cdev *dev,
|
||||
WARN_ON(!dev);
|
||||
WARN_ON(!cls);
|
||||
|
||||
pr_devel("bt cdev_device_create: id=%d\n", id);
|
||||
pr_devel("bt cdev_device_create: id=%d", id);
|
||||
|
||||
dev->bt_class = cls;
|
||||
|
||||
device = device_create(cls, NULL, devno, NULL, "%s%u", BT_DEV_NAME_PREFIX, id);
|
||||
if (IS_ERR(device)) {
|
||||
pr_err("create device failed");
|
||||
return -1;
|
||||
return -EIO;
|
||||
}
|
||||
snprintf(dev->dev_filename, sizeof(dev->dev_filename), "%s%u", BT_DEV_PATH_PREFIX, id);
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
static void bt_cdev_device_destroy(struct bt_cdev *dev)
|
||||
@@ -853,17 +826,17 @@ static struct bt_cdev *bt_cdev_create(const struct file_operations *ops,
|
||||
|
||||
WARN_ON(!ops);
|
||||
|
||||
pr_devel("bt cdev create called...\n");
|
||||
pr_devel("bt cdev create called");
|
||||
|
||||
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (unlikely(!dev)) {
|
||||
pr_err("bt cdev_create alloc failed: oom\n");
|
||||
pr_err("bt cdev_create alloc failed: oom");
|
||||
goto err1;
|
||||
}
|
||||
|
||||
chrdev = cdev_alloc();
|
||||
if (unlikely(!chrdev)) {
|
||||
pr_err("bt cdev_create: cdev_alloc() failed: oom\n");
|
||||
pr_err("bt cdev_create: cdev_alloc() failed: oom");
|
||||
goto err2;
|
||||
}
|
||||
|
||||
@@ -872,12 +845,12 @@ static struct bt_cdev *bt_cdev_create(const struct file_operations *ops,
|
||||
|
||||
ret = cdev_add(chrdev, MKDEV(BT_DEV_MAJOR, minor), 1);
|
||||
if (unlikely(ret < 0)) {
|
||||
pr_err("cdev add failed\n");
|
||||
pr_err("cdev add failed");
|
||||
goto err3;
|
||||
}
|
||||
|
||||
if (unlikely(bt_cdev_device_create(dev, bt_drv->bt_class, minor) < 0)) {
|
||||
pr_err("bt cdev_device_create failed\n");
|
||||
pr_err("bt cdev_device_create failed");
|
||||
goto err3;
|
||||
}
|
||||
return dev;
|
||||
@@ -921,12 +894,12 @@ static struct bt_io_file *bt_create_io_file(u32 id)
|
||||
struct bt_io_file *file = kmalloc(sizeof(*file), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!file)) {
|
||||
pr_err("bt create_io_file alloc failed: oom\n");
|
||||
pr_err("bt create_io_file alloc failed: oom");
|
||||
return NULL;
|
||||
}
|
||||
file->bt_cdev = bt_cdev_create(&bt_io_file_ops, id);
|
||||
if (unlikely(!file->bt_cdev)) {
|
||||
pr_err("bt create_io_file: create cdev failed\n");
|
||||
pr_err("bt create_io_file: create cdev failed");
|
||||
kfree(file);
|
||||
return NULL;
|
||||
}
|
||||
@@ -937,12 +910,12 @@ static struct bt_io_file *bt_create_io_file(u32 id)
|
||||
|
||||
static struct bt_io_file **bt_create_io_files(void)
|
||||
{
|
||||
int i = 0;
|
||||
int i;
|
||||
struct bt_io_file **all_files = kmalloc(BT_VIRNET_MAX_NUM * sizeof(struct bt_io_file *),
|
||||
GFP_KERNEL);
|
||||
GFP_KERNEL);
|
||||
|
||||
if (unlikely(!all_files)) {
|
||||
pr_err("bt create_io_files alloc failed: oom\n");
|
||||
pr_err("bt create_io_files alloc failed: oom");
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < BT_VIRNET_MAX_NUM; ++i)
|
||||
@@ -979,13 +952,13 @@ static struct bt_mng_file *bt_create_mng_file(int id)
|
||||
struct bt_mng_file *file = kmalloc(sizeof(*file), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!file)) {
|
||||
pr_err("bt create_mng_file: oom\n");
|
||||
pr_err("bt create_mng_file: oom");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
file->bt_cdev = bt_cdev_create(&bt_mng_file_ops, id);
|
||||
if (unlikely(!file->bt_cdev)) {
|
||||
pr_err("bt create_mng_file: create cdev failed\n");
|
||||
pr_err("bt create_mng_file: create cdev failed");
|
||||
kfree(file);
|
||||
return NULL;
|
||||
}
|
||||
@@ -1024,7 +997,7 @@ static struct net_device *bt_net_device_create(u32 id)
|
||||
snprintf(ifa_name, sizeof(ifa_name), "%s%d", BT_VIRNET_NAME_PREFIX, id);
|
||||
ndev = alloc_netdev(0, ifa_name, NET_NAME_UNKNOWN, ether_setup);
|
||||
if (unlikely(!ndev)) {
|
||||
pr_err("alloc_netdev failed\n");
|
||||
pr_err("alloc_netdev failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1069,7 +1042,7 @@ static struct bt_virnet *bt_virnet_create(struct bt_drv *bt_mng, u32 id)
|
||||
struct bt_virnet *vnet = kmalloc(sizeof(*vnet), GFP_KERNEL);
|
||||
|
||||
if (unlikely(!vnet)) {
|
||||
pr_err("error: bt_virnet init failed\n");
|
||||
pr_err("error: bt_virnet init failed");
|
||||
goto failure1;
|
||||
}
|
||||
|
||||
@@ -1142,7 +1115,7 @@ static int __init bt_module_init(void)
|
||||
int mid;
|
||||
struct proc_dir_entry *entry = NULL;
|
||||
|
||||
pr_devel("bt module_init called...\n");
|
||||
pr_devel("bt module_init called");
|
||||
bt_drv = kmalloc(sizeof(*bt_drv), GFP_KERNEL);
|
||||
if (unlikely(!bt_drv)) {
|
||||
pr_err("module init: alloc struct bt_drv failed: oom");
|
||||
@@ -1173,11 +1146,11 @@ static int __init bt_module_init(void)
|
||||
|
||||
mutex_lock(&bt_drv->bitmap_lock);
|
||||
mid = bt_get_unused_id(&bt_drv->bitmap);
|
||||
pr_info("create mng_file: get unused bit: %d\n", mid);
|
||||
pr_devel("create mng_file: get unused bit: %d", mid);
|
||||
|
||||
bt_drv->mng_file = bt_create_mng_file(mid);
|
||||
if (unlikely(!bt_drv->mng_file)) {
|
||||
pr_err("bt_ctrl_cdev_init(): failed");
|
||||
pr_err("bt_ctrl_cdev_init failed");
|
||||
mutex_unlock(&bt_drv->bitmap_lock);
|
||||
goto failure4;
|
||||
}
|
||||
@@ -1190,7 +1163,7 @@ static int __init bt_module_init(void)
|
||||
goto failure5;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return OK;
|
||||
|
||||
failure5:
|
||||
bt_delete_mng_file(bt_drv->mng_file);
|
||||
@@ -1210,4 +1183,4 @@ failure1:
|
||||
|
||||
module_init(bt_module_init);
|
||||
module_exit(bt_module_release);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -36,6 +36,10 @@
|
||||
/* must include btdev_user.h first before any macro definition */
|
||||
#include "btdev_user.h"
|
||||
|
||||
#define OK 0
|
||||
#define DELAY_100_MS 100
|
||||
#define MACADDR_LEN (2 * ETH_ALEN)
|
||||
|
||||
#define BT_DEV_MAJOR 125
|
||||
#define BT_DEV_MINOR 0
|
||||
#define BT_RING_BUFFER_SIZE 4096
|
||||
|
||||
Reference in New Issue
Block a user